diff options
author | Dmitry Kravkov <dmitry@broadcom.com> | 2011-11-28 07:31:49 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-11-29 19:02:57 -0500 |
commit | 614c76df1d1224dc2eee8678fab6e0b95b49b7da (patch) | |
tree | fc69e019e8d5c833ddfe1188ea94fc774707411d /drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c | |
parent | 7e02e5433e004713a89f5f865a243133b55dcc88 (diff) |
bnx2x: handle iSCSI SD mode
in iSCSI SD mode to bnx2x device assigned single mac address
which is supposted to be iscsi mac. If this mode is recognized
bnx2x will disable LRO, decrease number of queues to 1 and rx ring
size to the minumum allowed by FW, this in order minimize memory use.
It will tranfer mac for iscsi usage and zero primary mac of the netdev.
Signed-off-by: Dmitry Kravkov <dmitry@broadcom.com>
Signed-off-by: Eilon Greenstein <eilong@broadcom.com>
Reviewed-by: Michael Chan <mchan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c')
-rw-r--r-- | drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c index 42ce56617042..79695bb034d6 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c | |||
@@ -1441,6 +1441,11 @@ void bnx2x_set_num_queues(struct bnx2x *bp) | |||
1441 | break; | 1441 | break; |
1442 | } | 1442 | } |
1443 | 1443 | ||
1444 | #ifdef BCM_CNIC | ||
1445 | /* override in ISCSI SD mod */ | ||
1446 | if (IS_MF_ISCSI_SD(bp)) | ||
1447 | bp->num_queues = 1; | ||
1448 | #endif | ||
1444 | /* Add special queues */ | 1449 | /* Add special queues */ |
1445 | bp->num_queues += NON_ETH_CONTEXT_USE; | 1450 | bp->num_queues += NON_ETH_CONTEXT_USE; |
1446 | } | 1451 | } |
@@ -2988,8 +2993,13 @@ int bnx2x_change_mac_addr(struct net_device *dev, void *p) | |||
2988 | struct bnx2x *bp = netdev_priv(dev); | 2993 | struct bnx2x *bp = netdev_priv(dev); |
2989 | int rc = 0; | 2994 | int rc = 0; |
2990 | 2995 | ||
2991 | if (!is_valid_ether_addr((u8 *)(addr->sa_data))) | 2996 | if (!bnx2x_is_valid_ether_addr(bp, addr->sa_data)) |
2997 | return -EINVAL; | ||
2998 | |||
2999 | #ifdef BCM_CNIC | ||
3000 | if (IS_MF_ISCSI_SD(bp) && !is_zero_ether_addr(addr->sa_data)) | ||
2992 | return -EINVAL; | 3001 | return -EINVAL; |
3002 | #endif | ||
2993 | 3003 | ||
2994 | if (netif_running(dev)) { | 3004 | if (netif_running(dev)) { |
2995 | rc = bnx2x_set_eth_mac(bp, false); | 3005 | rc = bnx2x_set_eth_mac(bp, false); |
@@ -3105,7 +3115,12 @@ static int bnx2x_alloc_fp_mem_at(struct bnx2x *bp, int index) | |||
3105 | u8 cos; | 3115 | u8 cos; |
3106 | int rx_ring_size = 0; | 3116 | int rx_ring_size = 0; |
3107 | 3117 | ||
3108 | /* if rx_ring_size specified - use it */ | 3118 | #ifdef BCM_CNIC |
3119 | if (IS_MF_ISCSI_SD(bp)) { | ||
3120 | rx_ring_size = MIN_RX_SIZE_NONTPA; | ||
3121 | bp->rx_ring_size = rx_ring_size; | ||
3122 | } else | ||
3123 | #endif | ||
3109 | if (!bp->rx_ring_size) { | 3124 | if (!bp->rx_ring_size) { |
3110 | 3125 | ||
3111 | rx_ring_size = MAX_RX_AVAIL/BNX2X_NUM_RX_QUEUES(bp); | 3126 | rx_ring_size = MAX_RX_AVAIL/BNX2X_NUM_RX_QUEUES(bp); |
@@ -3115,7 +3130,7 @@ static int bnx2x_alloc_fp_mem_at(struct bnx2x *bp, int index) | |||
3115 | MIN_RX_SIZE_TPA, rx_ring_size); | 3130 | MIN_RX_SIZE_TPA, rx_ring_size); |
3116 | 3131 | ||
3117 | bp->rx_ring_size = rx_ring_size; | 3132 | bp->rx_ring_size = rx_ring_size; |
3118 | } else | 3133 | } else /* if rx_ring_size specified - use it */ |
3119 | rx_ring_size = bp->rx_ring_size; | 3134 | rx_ring_size = bp->rx_ring_size; |
3120 | 3135 | ||
3121 | /* Common */ | 3136 | /* Common */ |