aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorAyaz Abdulla <aabdulla@nvidia.com>2006-08-24 17:35:41 -0400
committerJeff Garzik <jeff@garzik.org>2006-09-06 10:57:37 -0400
commitf2ad2d9b65963322186a8af2bd2965c734a7badb (patch)
tree3bac0275d80a590b0254650b6a36e018dcf73b0a /drivers
parentedf7e5ec99c2e24cea3951f7961958fc7edbfdd1 (diff)
[PATCH] forcedeth: decouple vlan and rx checksum dependency
This patch decouples the dependency between the rx checksum feature and vlan feature. This is done by ignoring the checksum information if the user has disabled rx checksum when vlan is enabled. Signed-Off-By: Ayaz Abdulla <aabdulla@nvidia.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/forcedeth.c23
1 files changed, 9 insertions, 14 deletions
diff --git a/drivers/net/forcedeth.c b/drivers/net/forcedeth.c
index 74ed8bb266ec..e90d27b78121 100644
--- a/drivers/net/forcedeth.c
+++ b/drivers/net/forcedeth.c
@@ -718,6 +718,7 @@ struct fe_priv {
718 u32 vlanctl_bits; 718 u32 vlanctl_bits;
719 u32 driver_data; 719 u32 driver_data;
720 u32 register_size; 720 u32 register_size;
721 int rx_csum;
721 722
722 void __iomem *base; 723 void __iomem *base;
723 724
@@ -1897,7 +1898,7 @@ static int nv_rx_process(struct net_device *dev, int limit)
1897 } 1898 }
1898 } 1899 }
1899 } 1900 }
1900 if (np->txrxctl_bits & NVREG_TXRXCTL_RXCHECK) { 1901 if (np->rx_csum) {
1901 flags &= NV_RX2_CHECKSUMMASK; 1902 flags &= NV_RX2_CHECKSUMMASK;
1902 if (flags == NV_RX2_CHECKSUMOK1 || 1903 if (flags == NV_RX2_CHECKSUMOK1 ||
1903 flags == NV_RX2_CHECKSUMOK2 || 1904 flags == NV_RX2_CHECKSUMOK2 ||
@@ -3557,7 +3558,7 @@ static int nv_set_pauseparam(struct net_device *dev, struct ethtool_pauseparam*
3557static u32 nv_get_rx_csum(struct net_device *dev) 3558static u32 nv_get_rx_csum(struct net_device *dev)
3558{ 3559{
3559 struct fe_priv *np = netdev_priv(dev); 3560 struct fe_priv *np = netdev_priv(dev);
3560 return (np->txrxctl_bits & NVREG_TXRXCTL_RXCHECK) != 0; 3561 return (np->rx_csum) != 0;
3561} 3562}
3562 3563
3563static int nv_set_rx_csum(struct net_device *dev, u32 data) 3564static int nv_set_rx_csum(struct net_device *dev, u32 data)
@@ -3567,22 +3568,15 @@ static int nv_set_rx_csum(struct net_device *dev, u32 data)
3567 int retcode = 0; 3568 int retcode = 0;
3568 3569
3569 if (np->driver_data & DEV_HAS_CHECKSUM) { 3570 if (np->driver_data & DEV_HAS_CHECKSUM) {
3570
3571 if (((np->txrxctl_bits & NVREG_TXRXCTL_RXCHECK) && data) ||
3572 (!(np->txrxctl_bits & NVREG_TXRXCTL_RXCHECK) && !data)) {
3573 /* already set or unset */
3574 return 0;
3575 }
3576
3577 if (data) { 3571 if (data) {
3572 np->rx_csum = 1;
3578 np->txrxctl_bits |= NVREG_TXRXCTL_RXCHECK; 3573 np->txrxctl_bits |= NVREG_TXRXCTL_RXCHECK;
3579 } else if (!(np->vlanctl_bits & NVREG_VLANCONTROL_ENABLE)) {
3580 np->txrxctl_bits &= ~NVREG_TXRXCTL_RXCHECK;
3581 } else { 3574 } else {
3582 printk(KERN_INFO "Can not disable rx checksum if vlan is enabled\n"); 3575 np->rx_csum = 0;
3583 return -EINVAL; 3576 /* vlan is dependent on rx checksum offload */
3577 if (!(np->vlanctl_bits & NVREG_VLANCONTROL_ENABLE))
3578 np->txrxctl_bits &= ~NVREG_TXRXCTL_RXCHECK;
3584 } 3579 }
3585
3586 if (netif_running(dev)) { 3580 if (netif_running(dev)) {
3587 spin_lock_irq(&np->lock); 3581 spin_lock_irq(&np->lock);
3588 writel(np->txrxctl_bits, base + NvRegTxRxControl); 3582 writel(np->txrxctl_bits, base + NvRegTxRxControl);
@@ -4322,6 +4316,7 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i
4322 np->pkt_limit = NV_PKTLIMIT_2; 4316 np->pkt_limit = NV_PKTLIMIT_2;
4323 4317
4324 if (id->driver_data & DEV_HAS_CHECKSUM) { 4318 if (id->driver_data & DEV_HAS_CHECKSUM) {
4319 np->rx_csum = 1;
4325 np->txrxctl_bits |= NVREG_TXRXCTL_RXCHECK; 4320 np->txrxctl_bits |= NVREG_TXRXCTL_RXCHECK;
4326 dev->features |= NETIF_F_HW_CSUM | NETIF_F_SG; 4321 dev->features |= NETIF_F_HW_CSUM | NETIF_F_SG;
4327#ifdef NETIF_F_TSO 4322#ifdef NETIF_F_TSO