From mithlesh@linsyssoft.com Tue Feb 24 22:05:54 2009 From: Mithlesh Thukral Date: Tue, 24 Feb 2009 18:07:59 +0530 (IST) Subject: Staging: sxg: Add checksum control option through ethtool interface To: Greg Kroah-Hartman Cc: Sahara Project , Christopher Harrer Message-ID: From: Mithlesh Thukral * This patch adds support for controling checksum feature using the ethtool interface. Signed-off-by: LinSysSoft Sahara Team Signed-off-by: Mithlesh Thukral Signed-off-by: Greg Kroah-Hartman --- drivers/staging/sxg/sxg.c | 24 +++++++++++++----------- drivers/staging/sxg/sxg_ethtool.c | 9 +++++---- 2 files changed, 18 insertions(+), 15 deletions(-) --- a/drivers/staging/sxg/sxg.c +++ b/drivers/staging/sxg/sxg.c @@ -1486,23 +1486,25 @@ static int sxg_process_isr(struct adapte * 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(struc 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 --- a/drivers/staging/sxg/sxg_ethtool.c +++ b/drivers/staging/sxg/sxg_ethtool.c @@ -221,7 +221,7 @@ static int sxg_nic_get_settings(struct n 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 ne 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; }