diff options
author | Barak Witkowski <barak@broadcom.com> | 2012-06-25 21:31:19 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-06-27 04:20:13 -0400 |
commit | 2e499d3cc13365a87815266dda59904dcb8c8d6c (patch) | |
tree | b9f0e8b8a4356d8beb112cf76b0b97789eb335c3 /drivers/scsi/bnx2fc | |
parent | 747cf6ed3dbf6200af761f5384893c3b621a484c (diff) |
bnx2x, bnx2fc, bnx2i, cnic: Add statistics support and FCoE capabilities advertisement
1. When FCoE offload driver is registered, copy its capabilities to the chip
scratchpad.
2. Copy FCoE/iSCSI MAC addresses in aligned manner to chip scratchpad.
3. Add FCoE/iSCSI statistics collection support
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: Bhanu Prakash Gollapudi <bprakash@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/scsi/bnx2fc')
-rw-r--r-- | drivers/scsi/bnx2fc/bnx2fc.h | 4 | ||||
-rw-r--r-- | drivers/scsi/bnx2fc/bnx2fc_fcoe.c | 44 |
2 files changed, 48 insertions, 0 deletions
diff --git a/drivers/scsi/bnx2fc/bnx2fc.h b/drivers/scsi/bnx2fc/bnx2fc.h index 0578fa0dc14b..42969e8a45bd 100644 --- a/drivers/scsi/bnx2fc/bnx2fc.h +++ b/drivers/scsi/bnx2fc/bnx2fc.h | |||
@@ -59,6 +59,7 @@ | |||
59 | #include "57xx_hsi_bnx2fc.h" | 59 | #include "57xx_hsi_bnx2fc.h" |
60 | #include "bnx2fc_debug.h" | 60 | #include "bnx2fc_debug.h" |
61 | #include "../../net/ethernet/broadcom/cnic_if.h" | 61 | #include "../../net/ethernet/broadcom/cnic_if.h" |
62 | #include "../../net/ethernet/broadcom/bnx2x/bnx2x_mfw_req.h" | ||
62 | #include "bnx2fc_constants.h" | 63 | #include "bnx2fc_constants.h" |
63 | 64 | ||
64 | #define BNX2FC_NAME "bnx2fc" | 65 | #define BNX2FC_NAME "bnx2fc" |
@@ -84,6 +85,8 @@ | |||
84 | #define BNX2FC_NUM_MAX_SESS 1024 | 85 | #define BNX2FC_NUM_MAX_SESS 1024 |
85 | #define BNX2FC_NUM_MAX_SESS_LOG (ilog2(BNX2FC_NUM_MAX_SESS)) | 86 | #define BNX2FC_NUM_MAX_SESS_LOG (ilog2(BNX2FC_NUM_MAX_SESS)) |
86 | 87 | ||
88 | #define BNX2FC_MAX_NPIV 256 | ||
89 | |||
87 | #define BNX2FC_MAX_OUTSTANDING_CMNDS 2048 | 90 | #define BNX2FC_MAX_OUTSTANDING_CMNDS 2048 |
88 | #define BNX2FC_CAN_QUEUE BNX2FC_MAX_OUTSTANDING_CMNDS | 91 | #define BNX2FC_CAN_QUEUE BNX2FC_MAX_OUTSTANDING_CMNDS |
89 | #define BNX2FC_ELSTM_XIDS BNX2FC_CAN_QUEUE | 92 | #define BNX2FC_ELSTM_XIDS BNX2FC_CAN_QUEUE |
@@ -206,6 +209,7 @@ struct bnx2fc_hba { | |||
206 | struct fcoe_statistics_params *stats_buffer; | 209 | struct fcoe_statistics_params *stats_buffer; |
207 | dma_addr_t stats_buf_dma; | 210 | dma_addr_t stats_buf_dma; |
208 | struct completion stat_req_done; | 211 | struct completion stat_req_done; |
212 | struct fcoe_capabilities fcoe_cap; | ||
209 | 213 | ||
210 | /*destroy handling */ | 214 | /*destroy handling */ |
211 | struct timer_list destroy_timer; | 215 | struct timer_list destroy_timer; |
diff --git a/drivers/scsi/bnx2fc/bnx2fc_fcoe.c b/drivers/scsi/bnx2fc/bnx2fc_fcoe.c index f52f668fd247..05fe6620b3f0 100644 --- a/drivers/scsi/bnx2fc/bnx2fc_fcoe.c +++ b/drivers/scsi/bnx2fc/bnx2fc_fcoe.c | |||
@@ -1326,6 +1326,7 @@ static void bnx2fc_hba_destroy(struct bnx2fc_hba *hba) | |||
1326 | static struct bnx2fc_hba *bnx2fc_hba_create(struct cnic_dev *cnic) | 1326 | static struct bnx2fc_hba *bnx2fc_hba_create(struct cnic_dev *cnic) |
1327 | { | 1327 | { |
1328 | struct bnx2fc_hba *hba; | 1328 | struct bnx2fc_hba *hba; |
1329 | struct fcoe_capabilities *fcoe_cap; | ||
1329 | int rc; | 1330 | int rc; |
1330 | 1331 | ||
1331 | hba = kzalloc(sizeof(*hba), GFP_KERNEL); | 1332 | hba = kzalloc(sizeof(*hba), GFP_KERNEL); |
@@ -1361,6 +1362,21 @@ static struct bnx2fc_hba *bnx2fc_hba_create(struct cnic_dev *cnic) | |||
1361 | printk(KERN_ERR PFX "em_config:bnx2fc_cmd_mgr_alloc failed\n"); | 1362 | printk(KERN_ERR PFX "em_config:bnx2fc_cmd_mgr_alloc failed\n"); |
1362 | goto cmgr_err; | 1363 | goto cmgr_err; |
1363 | } | 1364 | } |
1365 | fcoe_cap = &hba->fcoe_cap; | ||
1366 | |||
1367 | fcoe_cap->capability1 = BNX2FC_TM_MAX_SQES << | ||
1368 | FCOE_IOS_PER_CONNECTION_SHIFT; | ||
1369 | fcoe_cap->capability1 |= BNX2FC_NUM_MAX_SESS << | ||
1370 | FCOE_LOGINS_PER_PORT_SHIFT; | ||
1371 | fcoe_cap->capability2 = BNX2FC_MAX_OUTSTANDING_CMNDS << | ||
1372 | FCOE_NUMBER_OF_EXCHANGES_SHIFT; | ||
1373 | fcoe_cap->capability2 |= BNX2FC_MAX_NPIV << | ||
1374 | FCOE_NPIV_WWN_PER_PORT_SHIFT; | ||
1375 | fcoe_cap->capability3 = BNX2FC_NUM_MAX_SESS << | ||
1376 | FCOE_TARGETS_SUPPORTED_SHIFT; | ||
1377 | fcoe_cap->capability3 |= BNX2FC_MAX_OUTSTANDING_CMNDS << | ||
1378 | FCOE_OUTSTANDING_COMMANDS_SHIFT; | ||
1379 | fcoe_cap->capability4 = FCOE_CAPABILITY4_STATEFUL; | ||
1364 | 1380 | ||
1365 | init_waitqueue_head(&hba->shutdown_wait); | 1381 | init_waitqueue_head(&hba->shutdown_wait); |
1366 | init_waitqueue_head(&hba->destroy_wait); | 1382 | init_waitqueue_head(&hba->destroy_wait); |
@@ -1691,6 +1707,32 @@ static void bnx2fc_unbind_pcidev(struct bnx2fc_hba *hba) | |||
1691 | hba->pcidev = NULL; | 1707 | hba->pcidev = NULL; |
1692 | } | 1708 | } |
1693 | 1709 | ||
1710 | /** | ||
1711 | * bnx2fc_ulp_get_stats - cnic callback to populate FCoE stats | ||
1712 | * | ||
1713 | * @handle: transport handle pointing to adapter struture | ||
1714 | */ | ||
1715 | static int bnx2fc_ulp_get_stats(void *handle) | ||
1716 | { | ||
1717 | struct bnx2fc_hba *hba = handle; | ||
1718 | struct cnic_dev *cnic; | ||
1719 | struct fcoe_stats_info *stats_addr; | ||
1720 | |||
1721 | if (!hba) | ||
1722 | return -EINVAL; | ||
1723 | |||
1724 | cnic = hba->cnic; | ||
1725 | stats_addr = &cnic->stats_addr->fcoe_stat; | ||
1726 | if (!stats_addr) | ||
1727 | return -EINVAL; | ||
1728 | |||
1729 | strncpy(stats_addr->version, BNX2FC_VERSION, | ||
1730 | sizeof(stats_addr->version)); | ||
1731 | stats_addr->txq_size = BNX2FC_SQ_WQES_MAX; | ||
1732 | stats_addr->rxq_size = BNX2FC_CQ_WQES_MAX; | ||
1733 | |||
1734 | return 0; | ||
1735 | } | ||
1694 | 1736 | ||
1695 | 1737 | ||
1696 | /** | 1738 | /** |
@@ -1944,6 +1986,7 @@ static void bnx2fc_ulp_init(struct cnic_dev *dev) | |||
1944 | adapter_count++; | 1986 | adapter_count++; |
1945 | mutex_unlock(&bnx2fc_dev_lock); | 1987 | mutex_unlock(&bnx2fc_dev_lock); |
1946 | 1988 | ||
1989 | dev->fcoe_cap = &hba->fcoe_cap; | ||
1947 | clear_bit(BNX2FC_CNIC_REGISTERED, &hba->reg_with_cnic); | 1990 | clear_bit(BNX2FC_CNIC_REGISTERED, &hba->reg_with_cnic); |
1948 | rc = dev->register_device(dev, CNIC_ULP_FCOE, | 1991 | rc = dev->register_device(dev, CNIC_ULP_FCOE, |
1949 | (void *) hba); | 1992 | (void *) hba); |
@@ -2643,4 +2686,5 @@ static struct cnic_ulp_ops bnx2fc_cnic_cb = { | |||
2643 | .cnic_stop = bnx2fc_ulp_stop, | 2686 | .cnic_stop = bnx2fc_ulp_stop, |
2644 | .indicate_kcqes = bnx2fc_indicate_kcqe, | 2687 | .indicate_kcqes = bnx2fc_indicate_kcqe, |
2645 | .indicate_netevent = bnx2fc_indicate_netevent, | 2688 | .indicate_netevent = bnx2fc_indicate_netevent, |
2689 | .cnic_get_stats = bnx2fc_ulp_get_stats, | ||
2646 | }; | 2690 | }; |