diff options
author | Vladislav Zolotarov <vladz@broadcom.com> | 2008-08-13 18:53:38 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-08-13 19:03:42 -0400 |
commit | df0f23439a69eb5ca30668612f1c4e20041b5341 (patch) | |
tree | 03c257eaca101c2386a3b72716b8a8bd2179b26c /drivers/net/bnx2x_main.c | |
parent | 353029896a5ed6cf42f4ce45729851b23c94d874 (diff) |
bnx2x: No LRO without Rx checksum
No LRO without Rx checksum
Disabling LRO when Rx checksum is disabled
Signed-off-by: Vladislav Zolotarov <vladz@broadcom.com>
Signed-off-by: Eilon Greenstein <eilong@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/bnx2x_main.c')
-rw-r--r-- | drivers/net/bnx2x_main.c | 67 |
1 files changed, 39 insertions, 28 deletions
diff --git a/drivers/net/bnx2x_main.c b/drivers/net/bnx2x_main.c index 6fe19726ae43..d29f22763fec 100644 --- a/drivers/net/bnx2x_main.c +++ b/drivers/net/bnx2x_main.c | |||
@@ -8272,33 +8272,6 @@ static int bnx2x_set_coalesce(struct net_device *dev, | |||
8272 | return 0; | 8272 | return 0; |
8273 | } | 8273 | } |
8274 | 8274 | ||
8275 | static int bnx2x_set_flags(struct net_device *dev, u32 data) | ||
8276 | { | ||
8277 | struct bnx2x *bp = netdev_priv(dev); | ||
8278 | int changed = 0; | ||
8279 | int rc = 0; | ||
8280 | |||
8281 | if (data & ETH_FLAG_LRO) { | ||
8282 | if (!(dev->features & NETIF_F_LRO)) { | ||
8283 | dev->features |= NETIF_F_LRO; | ||
8284 | bp->flags |= TPA_ENABLE_FLAG; | ||
8285 | changed = 1; | ||
8286 | } | ||
8287 | |||
8288 | } else if (dev->features & NETIF_F_LRO) { | ||
8289 | dev->features &= ~NETIF_F_LRO; | ||
8290 | bp->flags &= ~TPA_ENABLE_FLAG; | ||
8291 | changed = 1; | ||
8292 | } | ||
8293 | |||
8294 | if (changed && netif_running(dev)) { | ||
8295 | bnx2x_nic_unload(bp, UNLOAD_NORMAL); | ||
8296 | rc = bnx2x_nic_load(bp, LOAD_NORMAL); | ||
8297 | } | ||
8298 | |||
8299 | return rc; | ||
8300 | } | ||
8301 | |||
8302 | static void bnx2x_get_ringparam(struct net_device *dev, | 8275 | static void bnx2x_get_ringparam(struct net_device *dev, |
8303 | struct ethtool_ringparam *ering) | 8276 | struct ethtool_ringparam *ering) |
8304 | { | 8277 | { |
@@ -8400,6 +8373,34 @@ static int bnx2x_set_pauseparam(struct net_device *dev, | |||
8400 | return 0; | 8373 | return 0; |
8401 | } | 8374 | } |
8402 | 8375 | ||
8376 | static int bnx2x_set_flags(struct net_device *dev, u32 data) | ||
8377 | { | ||
8378 | struct bnx2x *bp = netdev_priv(dev); | ||
8379 | int changed = 0; | ||
8380 | int rc = 0; | ||
8381 | |||
8382 | /* TPA requires Rx CSUM offloading */ | ||
8383 | if ((data & ETH_FLAG_LRO) && bp->rx_csum) { | ||
8384 | if (!(dev->features & NETIF_F_LRO)) { | ||
8385 | dev->features |= NETIF_F_LRO; | ||
8386 | bp->flags |= TPA_ENABLE_FLAG; | ||
8387 | changed = 1; | ||
8388 | } | ||
8389 | |||
8390 | } else if (dev->features & NETIF_F_LRO) { | ||
8391 | dev->features &= ~NETIF_F_LRO; | ||
8392 | bp->flags &= ~TPA_ENABLE_FLAG; | ||
8393 | changed = 1; | ||
8394 | } | ||
8395 | |||
8396 | if (changed && netif_running(dev)) { | ||
8397 | bnx2x_nic_unload(bp, UNLOAD_NORMAL); | ||
8398 | rc = bnx2x_nic_load(bp, LOAD_NORMAL); | ||
8399 | } | ||
8400 | |||
8401 | return rc; | ||
8402 | } | ||
8403 | |||
8403 | static u32 bnx2x_get_rx_csum(struct net_device *dev) | 8404 | static u32 bnx2x_get_rx_csum(struct net_device *dev) |
8404 | { | 8405 | { |
8405 | struct bnx2x *bp = netdev_priv(dev); | 8406 | struct bnx2x *bp = netdev_priv(dev); |
@@ -8410,9 +8411,19 @@ static u32 bnx2x_get_rx_csum(struct net_device *dev) | |||
8410 | static int bnx2x_set_rx_csum(struct net_device *dev, u32 data) | 8411 | static int bnx2x_set_rx_csum(struct net_device *dev, u32 data) |
8411 | { | 8412 | { |
8412 | struct bnx2x *bp = netdev_priv(dev); | 8413 | struct bnx2x *bp = netdev_priv(dev); |
8414 | int rc = 0; | ||
8413 | 8415 | ||
8414 | bp->rx_csum = data; | 8416 | bp->rx_csum = data; |
8415 | return 0; | 8417 | |
8418 | /* Disable TPA, when Rx CSUM is disabled. Otherwise all | ||
8419 | TPA'ed packets will be discarded due to wrong TCP CSUM */ | ||
8420 | if (!data) { | ||
8421 | u32 flags = ethtool_op_get_flags(dev); | ||
8422 | |||
8423 | rc = bnx2x_set_flags(dev, (flags & ~ETH_FLAG_LRO)); | ||
8424 | } | ||
8425 | |||
8426 | return rc; | ||
8416 | } | 8427 | } |
8417 | 8428 | ||
8418 | static int bnx2x_set_tso(struct net_device *dev, u32 data) | 8429 | static int bnx2x_set_tso(struct net_device *dev, u32 data) |