aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/broadcom/cnic.c
diff options
context:
space:
mode:
authorBarak Witkowski <barak@broadcom.com>2011-12-05 17:41:50 -0500
committerDavid S. Miller <davem@davemloft.net>2011-12-06 13:06:05 -0500
commit1d187b34daaecbb87aa523ba46b92930a388cb21 (patch)
tree651f9ee19867afe241109549aca3abe24101d9fd /drivers/net/ethernet/broadcom/cnic.c
parented5162a04f929f6298b6a3b6d7644ecae1933085 (diff)
bnx2x, cnic: support DRV_INFO upon FW request
Add support to send driver capabilities, settings and statistics to management firmware. [ Redone using many local variables, removed many unnecessary inlines, and put #defines at the left margin suggested by Joe Perches ] Signed-off-by: Barak Witkowski <barak@broadcom.com> Signed-off-by: Eilon Greenstein <eilong@broadcom.com> Signed-off-by: Eddie Wai <eddie.wai@broadcom.com> Signed-off-by: Michael Chan <mchan@broadcom.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/broadcom/cnic.c')
-rw-r--r--drivers/net/ethernet/broadcom/cnic.c47
1 files changed, 47 insertions, 0 deletions
diff --git a/drivers/net/ethernet/broadcom/cnic.c b/drivers/net/ethernet/broadcom/cnic.c
index b336e55e0d80..4bcb67eedf1e 100644
--- a/drivers/net/ethernet/broadcom/cnic.c
+++ b/drivers/net/ethernet/broadcom/cnic.c
@@ -250,6 +250,21 @@ static u32 cnic_reg_rd_ind(struct cnic_dev *dev, u32 off)
250 return io->data; 250 return io->data;
251} 251}
252 252
253static void cnic_ulp_ctl(struct cnic_dev *dev, int ulp_type, bool reg)
254{
255 struct cnic_local *cp = dev->cnic_priv;
256 struct cnic_eth_dev *ethdev = cp->ethdev;
257 struct drv_ctl_info info;
258
259 if (reg)
260 info.cmd = DRV_CTL_ULP_REGISTER_CMD;
261 else
262 info.cmd = DRV_CTL_ULP_UNREGISTER_CMD;
263
264 info.data.ulp_type = ulp_type;
265 ethdev->drv_ctl(dev->netdev, &info);
266}
267
253static int cnic_in_use(struct cnic_sock *csk) 268static int cnic_in_use(struct cnic_sock *csk)
254{ 269{
255 return test_bit(SK_F_INUSE, &csk->flags); 270 return test_bit(SK_F_INUSE, &csk->flags);
@@ -563,6 +578,8 @@ static int cnic_register_device(struct cnic_dev *dev, int ulp_type,
563 578
564 mutex_unlock(&cnic_lock); 579 mutex_unlock(&cnic_lock);
565 580
581 cnic_ulp_ctl(dev, ulp_type, true);
582
566 return 0; 583 return 0;
567 584
568} 585}
@@ -602,6 +619,8 @@ static int cnic_unregister_device(struct cnic_dev *dev, int ulp_type)
602 if (test_bit(ULP_F_CALL_PENDING, &cp->ulp_flags[ulp_type])) 619 if (test_bit(ULP_F_CALL_PENDING, &cp->ulp_flags[ulp_type]))
603 netdev_warn(dev->netdev, "Failed waiting for ULP up call to complete\n"); 620 netdev_warn(dev->netdev, "Failed waiting for ULP up call to complete\n");
604 621
622 cnic_ulp_ctl(dev, ulp_type, false);
623
605 return 0; 624 return 0;
606} 625}
607EXPORT_SYMBOL(cnic_unregister_driver); 626EXPORT_SYMBOL(cnic_unregister_driver);
@@ -3052,9 +3071,26 @@ static void cnic_ulp_start(struct cnic_dev *dev)
3052 } 3071 }
3053} 3072}
3054 3073
3074static int cnic_copy_ulp_stats(struct cnic_dev *dev, int ulp_type)
3075{
3076 struct cnic_local *cp = dev->cnic_priv;
3077 struct cnic_ulp_ops *ulp_ops;
3078 int rc;
3079
3080 mutex_lock(&cnic_lock);
3081 ulp_ops = cnic_ulp_tbl_prot(ulp_type);
3082 if (ulp_ops && ulp_ops->cnic_get_stats)
3083 rc = ulp_ops->cnic_get_stats(cp->ulp_handle[ulp_type]);
3084 else
3085 rc = -ENODEV;
3086 mutex_unlock(&cnic_lock);
3087 return rc;
3088}
3089
3055static int cnic_ctl(void *data, struct cnic_ctl_info *info) 3090static int cnic_ctl(void *data, struct cnic_ctl_info *info)
3056{ 3091{
3057 struct cnic_dev *dev = data; 3092 struct cnic_dev *dev = data;
3093 int ulp_type = CNIC_ULP_ISCSI;
3058 3094
3059 switch (info->cmd) { 3095 switch (info->cmd) {
3060 case CNIC_CTL_STOP_CMD: 3096 case CNIC_CTL_STOP_CMD:
@@ -3100,6 +3136,15 @@ static int cnic_ctl(void *data, struct cnic_ctl_info *info)
3100 } 3136 }
3101 break; 3137 break;
3102 } 3138 }
3139 case CNIC_CTL_FCOE_STATS_GET_CMD:
3140 ulp_type = CNIC_ULP_FCOE;
3141 /* fall through */
3142 case CNIC_CTL_ISCSI_STATS_GET_CMD:
3143 cnic_hold(dev);
3144 cnic_copy_ulp_stats(dev, ulp_type);
3145 cnic_put(dev);
3146 break;
3147
3103 default: 3148 default:
3104 return -EINVAL; 3149 return -EINVAL;
3105 } 3150 }
@@ -5288,6 +5333,8 @@ static struct cnic_dev *init_bnx2x_cnic(struct net_device *dev)
5288 cdev->pcidev = pdev; 5333 cdev->pcidev = pdev;
5289 cp->chip_id = ethdev->chip_id; 5334 cp->chip_id = ethdev->chip_id;
5290 5335
5336 cdev->stats_addr = ethdev->addr_drv_info_to_mcp;
5337
5291 if (!(ethdev->drv_state & CNIC_DRV_STATE_NO_ISCSI)) 5338 if (!(ethdev->drv_state & CNIC_DRV_STATE_NO_ISCSI))
5292 cdev->max_iscsi_conn = ethdev->max_iscsi_conn; 5339 cdev->max_iscsi_conn = ethdev->max_iscsi_conn;
5293 if (BNX2X_CHIP_IS_E2_PLUS(cp->chip_id) && 5340 if (BNX2X_CHIP_IS_E2_PLUS(cp->chip_id) &&