diff options
author | Barak Witkowski <barak@broadcom.com> | 2011-12-05 17:41:50 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-12-06 13:06:05 -0500 |
commit | 1d187b34daaecbb87aa523ba46b92930a388cb21 (patch) | |
tree | 651f9ee19867afe241109549aca3abe24101d9fd /drivers/net/ethernet/broadcom/cnic.c | |
parent | ed5162a04f929f6298b6a3b6d7644ecae1933085 (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.c | 47 |
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 | ||
253 | static 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 | |||
253 | static int cnic_in_use(struct cnic_sock *csk) | 268 | static 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 | } |
607 | EXPORT_SYMBOL(cnic_unregister_driver); | 626 | EXPORT_SYMBOL(cnic_unregister_driver); |
@@ -3052,9 +3071,26 @@ static void cnic_ulp_start(struct cnic_dev *dev) | |||
3052 | } | 3071 | } |
3053 | } | 3072 | } |
3054 | 3073 | ||
3074 | static 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 | |||
3055 | static int cnic_ctl(void *data, struct cnic_ctl_info *info) | 3090 | static 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) && |