aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Chan <mchan@broadcom.com>2011-07-13 13:24:19 -0400
committerDavid S. Miller <davem@davemloft.net>2011-07-14 11:46:07 -0400
commite1dd883cb15310dc2ded9995a1f1d8b1cb1e88f3 (patch)
tree9c8580a6ea022f9a3e4ef58d4424cab6e6000439
parentb7d40315c9643034ac4b5c9dda480d0124416f89 (diff)
cnic: Fix ring setup/shutdown code
Latest bnx2x driver uses different CID for the iSCSI rings, so we need to pass it in the ring init data. The rx ring is also zeroed out to prevent stale DMA addresses from being used after shutdown. The same cp local variable redefined inside the else branch is also eliminated. Signed-off-by: Michael Chan <mchan@broadcom.com> Signed-off-by: Matt Carlson <mcarlson@broadcom.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/cnic.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/drivers/net/cnic.c b/drivers/net/cnic.c
index a881e42c0add..bdfe15566ce4 100644
--- a/drivers/net/cnic.c
+++ b/drivers/net/cnic.c
@@ -4923,7 +4923,7 @@ static void cnic_init_rings(struct cnic_dev *dev)
4923 struct client_init_ramrod_data *data; 4923 struct client_init_ramrod_data *data;
4924 union l5cm_specific_data l5_data; 4924 union l5cm_specific_data l5_data;
4925 struct ustorm_eth_rx_producers rx_prods = {0}; 4925 struct ustorm_eth_rx_producers rx_prods = {0};
4926 u32 off, i; 4926 u32 off, i, *cid_ptr;
4927 4927
4928 rx_prods.bd_prod = 0; 4928 rx_prods.bd_prod = 0;
4929 rx_prods.cqe_prod = BNX2X_MAX_RCQ_DESC_CNT; 4929 rx_prods.cqe_prod = BNX2X_MAX_RCQ_DESC_CNT;
@@ -4942,6 +4942,7 @@ static void cnic_init_rings(struct cnic_dev *dev)
4942 set_bit(CNIC_LCL_FL_L2_WAIT, &cp->cnic_local_flags); 4942 set_bit(CNIC_LCL_FL_L2_WAIT, &cp->cnic_local_flags);
4943 4943
4944 data = udev->l2_buf; 4944 data = udev->l2_buf;
4945 cid_ptr = udev->l2_buf + 12;
4945 4946
4946 memset(data, 0, sizeof(*data)); 4947 memset(data, 0, sizeof(*data));
4947 4948
@@ -4966,12 +4967,15 @@ static void cnic_init_rings(struct cnic_dev *dev)
4966 "iSCSI CLIENT_SETUP did not complete\n"); 4967 "iSCSI CLIENT_SETUP did not complete\n");
4967 cnic_spq_completion(dev, DRV_CTL_RET_L2_SPQ_CREDIT_CMD, 1); 4968 cnic_spq_completion(dev, DRV_CTL_RET_L2_SPQ_CREDIT_CMD, 1);
4968 cnic_ring_ctl(dev, cid, cli, 1); 4969 cnic_ring_ctl(dev, cid, cli, 1);
4970 *cid_ptr = cid;
4969 } 4971 }
4970} 4972}
4971 4973
4972static void cnic_shutdown_rings(struct cnic_dev *dev) 4974static void cnic_shutdown_rings(struct cnic_dev *dev)
4973{ 4975{
4974 struct cnic_local *cp = dev->cnic_priv; 4976 struct cnic_local *cp = dev->cnic_priv;
4977 struct cnic_uio_dev *udev = cp->udev;
4978 void *rx_ring;
4975 4979
4976 if (!test_bit(CNIC_LCL_FL_RINGS_INITED, &cp->cnic_local_flags)) 4980 if (!test_bit(CNIC_LCL_FL_RINGS_INITED, &cp->cnic_local_flags))
4977 return; 4981 return;
@@ -4979,7 +4983,6 @@ static void cnic_shutdown_rings(struct cnic_dev *dev)
4979 if (test_bit(CNIC_F_BNX2_CLASS, &dev->flags)) { 4983 if (test_bit(CNIC_F_BNX2_CLASS, &dev->flags)) {
4980 cnic_shutdown_bnx2_rx_ring(dev); 4984 cnic_shutdown_bnx2_rx_ring(dev);
4981 } else if (test_bit(CNIC_F_BNX2X_CLASS, &dev->flags)) { 4985 } else if (test_bit(CNIC_F_BNX2X_CLASS, &dev->flags)) {
4982 struct cnic_local *cp = dev->cnic_priv;
4983 u32 cli = cp->ethdev->iscsi_l2_client_id; 4986 u32 cli = cp->ethdev->iscsi_l2_client_id;
4984 u32 cid = cp->ethdev->iscsi_l2_cid; 4987 u32 cid = cp->ethdev->iscsi_l2_cid;
4985 union l5cm_specific_data l5_data; 4988 union l5cm_specific_data l5_data;
@@ -5009,6 +5012,8 @@ static void cnic_shutdown_rings(struct cnic_dev *dev)
5009 msleep(10); 5012 msleep(10);
5010 } 5013 }
5011 clear_bit(CNIC_LCL_FL_RINGS_INITED, &cp->cnic_local_flags); 5014 clear_bit(CNIC_LCL_FL_RINGS_INITED, &cp->cnic_local_flags);
5015 rx_ring = udev->l2_ring + BCM_PAGE_SIZE;
5016 memset(rx_ring, 0, BCM_PAGE_SIZE);
5012} 5017}
5013 5018
5014static int cnic_register_netdev(struct cnic_dev *dev) 5019static int cnic_register_netdev(struct cnic_dev *dev)