فهرست منبع

Staging: sxg: Add checksum control option through ethtool interface

* This patch adds support for controling checksum feature using the ethtool
  interface.

Signed-off-by: LinSysSoft Sahara Team <saharaproj@linsyssoft.com>
Signed-off-by: Mithlesh Thukral <mithlesh@linsyssoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Mithlesh Thukral 16 سال پیش
والد
کامیت
bbb18b97f6
2فایلهای تغییر یافته به همراه18 افزوده شده و 15 حذف شده
  1. 13 11
      drivers/staging/sxg/sxg.c
  2. 5 4
      drivers/staging/sxg/sxg_ethtool.c

+ 13 - 11
drivers/staging/sxg/sxg.c

@@ -1486,23 +1486,25 @@ static int sxg_process_isr(struct adapter_t *adapter, u32 MessageId)
  * sxg_rcv_checksum - Set the checksum for received packet
  *
  * Arguements:
+ * 		@adapter - Adapter structure on which packet is received
  * 		@skb - Packet which is receieved
  * 		@Event - Event read from hardware
  */
 
-void sxg_rcv_checksum(struct sk_buff *skb, struct sxg_event *Event)
+void sxg_rcv_checksum(struct adapter_t *adapter, struct sk_buff *skb,
+			 struct sxg_event *Event)
 {
 	skb->ip_summed = CHECKSUM_NONE;
-	if(Event->Status & EVENT_STATUS_TCPIP) {
-		if(!(Event->Status & EVENT_STATUS_TCPBAD)) {
-			skb->ip_summed = CHECKSUM_UNNECESSARY;
-		}
-		if(!(Event->Status & EVENT_STATUS_IPBAD)) {
-			skb->ip_summed = CHECKSUM_UNNECESSARY;
-		}
-	} else if(Event->Status & EVENT_STATUS_IPONLY) {
-		if(!(Event->Status & EVENT_STATUS_IPBAD)) {
+	if (likely(adapter->flags & SXG_RCV_IP_CSUM_ENABLED)) {
+		if (likely(adapter->flags & SXG_RCV_TCP_CSUM_ENABLED)
+			&& (Event->Status & EVENT_STATUS_TCPIP)) {
+			if(!(Event->Status & EVENT_STATUS_TCPBAD))
+				skb->ip_summed = CHECKSUM_UNNECESSARY;
+		if(!(Event->Status & EVENT_STATUS_IPBAD))
 			skb->ip_summed = CHECKSUM_UNNECESSARY;
+		} else if(Event->Status & EVENT_STATUS_IPONLY) {
+			if(!(Event->Status & EVENT_STATUS_IPBAD))
+				skb->ip_summed = CHECKSUM_UNNECESSARY;
 		}
 	}
 }
@@ -1581,7 +1583,7 @@ static u32 sxg_process_event_queue(struct adapter_t *adapter, u32 RssId,
 				rx_bytes = Event->Length;
 				adapter->stats.rx_packets++;
 				adapter->stats.rx_bytes += rx_bytes;
-				sxg_rcv_checksum(skb, Event);
+				sxg_rcv_checksum(adapter, skb, Event);
 				skb->dev = adapter->netdev;
 				netif_receive_skb(skb);
 #endif

+ 5 - 4
drivers/staging/sxg/sxg_ethtool.c

@@ -221,7 +221,7 @@ static int sxg_nic_get_settings(struct net_device *netdev,
 static u32 sxg_nic_get_rx_csum(struct net_device *netdev)
 {
 	struct adapter_t *adapter = netdev_priv(netdev);
-	return ((adapter->flags & SXG_RCV_IP_CSUM_ENABLED) ||
+	return ((adapter->flags & SXG_RCV_IP_CSUM_ENABLED) &&
 		 (adapter->flags & SXG_RCV_TCP_CSUM_ENABLED));
 }
 
@@ -232,9 +232,10 @@ static int sxg_nic_set_rx_csum(struct net_device *netdev, u32 data)
 		adapter->flags |= SXG_RCV_IP_CSUM_ENABLED;
 	else
 		adapter->flags &= ~SXG_RCV_IP_CSUM_ENABLED;
-
-	/* Reset the card here (call the reset functions .. currently unavailable)*/
-
+	/*
+	 * We dont need to write to the card to do checksums.
+	 * It does it anyways.
+	 */
 	return 0;
 }