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>
This commit is contained in:
parent
7876ce07c8
commit
bbb18b97f6
2 changed files with 18 additions and 15 deletions
|
@ -1486,23 +1486,25 @@ static int sxg_process_isr(struct adapter_t *adapter, u32 MessageId)
|
||||||
* sxg_rcv_checksum - Set the checksum for received packet
|
* sxg_rcv_checksum - Set the checksum for received packet
|
||||||
*
|
*
|
||||||
* Arguements:
|
* Arguements:
|
||||||
|
* @adapter - Adapter structure on which packet is received
|
||||||
* @skb - Packet which is receieved
|
* @skb - Packet which is receieved
|
||||||
* @Event - Event read from hardware
|
* @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;
|
skb->ip_summed = CHECKSUM_NONE;
|
||||||
if(Event->Status & EVENT_STATUS_TCPIP) {
|
if (likely(adapter->flags & SXG_RCV_IP_CSUM_ENABLED)) {
|
||||||
if(!(Event->Status & EVENT_STATUS_TCPBAD)) {
|
if (likely(adapter->flags & SXG_RCV_TCP_CSUM_ENABLED)
|
||||||
skb->ip_summed = CHECKSUM_UNNECESSARY;
|
&& (Event->Status & EVENT_STATUS_TCPIP)) {
|
||||||
}
|
if(!(Event->Status & EVENT_STATUS_TCPBAD))
|
||||||
if(!(Event->Status & EVENT_STATUS_IPBAD)) {
|
skb->ip_summed = CHECKSUM_UNNECESSARY;
|
||||||
skb->ip_summed = CHECKSUM_UNNECESSARY;
|
if(!(Event->Status & EVENT_STATUS_IPBAD))
|
||||||
}
|
|
||||||
} else if(Event->Status & EVENT_STATUS_IPONLY) {
|
|
||||||
if(!(Event->Status & EVENT_STATUS_IPBAD)) {
|
|
||||||
skb->ip_summed = CHECKSUM_UNNECESSARY;
|
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;
|
rx_bytes = Event->Length;
|
||||||
adapter->stats.rx_packets++;
|
adapter->stats.rx_packets++;
|
||||||
adapter->stats.rx_bytes += rx_bytes;
|
adapter->stats.rx_bytes += rx_bytes;
|
||||||
sxg_rcv_checksum(skb, Event);
|
sxg_rcv_checksum(adapter, skb, Event);
|
||||||
skb->dev = adapter->netdev;
|
skb->dev = adapter->netdev;
|
||||||
netif_receive_skb(skb);
|
netif_receive_skb(skb);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -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)
|
static u32 sxg_nic_get_rx_csum(struct net_device *netdev)
|
||||||
{
|
{
|
||||||
struct adapter_t *adapter = netdev_priv(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));
|
(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;
|
adapter->flags |= SXG_RCV_IP_CSUM_ENABLED;
|
||||||
else
|
else
|
||||||
adapter->flags &= ~SXG_RCV_IP_CSUM_ENABLED;
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue