aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorSathya Perla <sathya.perla@emulex.com>2012-11-06 12:48:56 -0500
committerDavid S. Miller <davem@davemloft.net>2012-11-07 16:59:52 -0500
commitca34fe38f06da0f508543539419ff5faa5d81e1c (patch)
tree049b17b282475c13e13c23f857ff6f96f2e9e3b1 /drivers
parent5727f841dcd8f7a06dd85d76c0aba4a0e30a70a8 (diff)
be2net: fix wrong usage of adapter->generation
adapter->generation was being incorrectly set as BE_GEN3 for Skyhawk-R. Replace generation usage with XXX_chip() macros to identify the chip. Signed-off-by: Sathya Perla <sathya.perla@emulex.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/ethernet/emulex/benet/be.h18
-rw-r--r--drivers/net/ethernet/emulex/benet/be_cmds.c6
-rw-r--r--drivers/net/ethernet/emulex/benet/be_cmds.h27
-rw-r--r--drivers/net/ethernet/emulex/benet/be_main.c134
4 files changed, 92 insertions, 93 deletions
diff --git a/drivers/net/ethernet/emulex/benet/be.h b/drivers/net/ethernet/emulex/benet/be.h
index f920a6521ce7..82f74f8594f5 100644
--- a/drivers/net/ethernet/emulex/benet/be.h
+++ b/drivers/net/ethernet/emulex/benet/be.h
@@ -410,7 +410,6 @@ struct be_adapter {
410 u32 rx_fc; /* Rx flow control */ 410 u32 rx_fc; /* Rx flow control */
411 u32 tx_fc; /* Tx flow control */ 411 u32 tx_fc; /* Tx flow control */
412 bool stats_cmd_sent; 412 bool stats_cmd_sent;
413 u8 generation; /* BladeEngine ASIC generation */
414 u32 if_type; 413 u32 if_type;
415 struct { 414 struct {
416 u8 __iomem *base; /* Door Bell */ 415 u8 __iomem *base; /* Door Bell */
@@ -458,19 +457,22 @@ struct be_adapter {
458 for (i = 0, vf_cfg = &adapter->vf_cfg[i]; i < adapter->num_vfs; \ 457 for (i = 0, vf_cfg = &adapter->vf_cfg[i]; i < adapter->num_vfs; \
459 i++, vf_cfg++) 458 i++, vf_cfg++)
460 459
461/* BladeEngine Generation numbers */
462#define BE_GEN2 2
463#define BE_GEN3 3
464#define SH_HW 4
465
466#define ON 1 460#define ON 1
467#define OFF 0 461#define OFF 0
468#define lancer_chip(adapter) ((adapter->pdev->device == OC_DEVICE_ID3) || \ 462
469 (adapter->pdev->device == OC_DEVICE_ID4)) 463#define lancer_chip(adapter) (adapter->pdev->device == OC_DEVICE_ID3 || \
464 adapter->pdev->device == OC_DEVICE_ID4)
470 465
471#define skyhawk_chip(adapter) (adapter->pdev->device == OC_DEVICE_ID5 || \ 466#define skyhawk_chip(adapter) (adapter->pdev->device == OC_DEVICE_ID5 || \
472 adapter->pdev->device == OC_DEVICE_ID6) 467 adapter->pdev->device == OC_DEVICE_ID6)
473 468
469#define BE3_chip(adapter) (adapter->pdev->device == BE_DEVICE_ID2 || \
470 adapter->pdev->device == OC_DEVICE_ID2)
471
472#define BE2_chip(adapter) (adapter->pdev->device == BE_DEVICE_ID1 || \
473 adapter->pdev->device == OC_DEVICE_ID1)
474
475#define BEx_chip(adapter) (BE3_chip(adapter) || BE2_chip(adapter))
474 476
475#define be_roce_supported(adapter) ((adapter->if_type == SLI_INTF_TYPE_3 || \ 477#define be_roce_supported(adapter) ((adapter->if_type == SLI_INTF_TYPE_3 || \
476 adapter->sli_family == SKYHAWK_SLI_FAMILY) && \ 478 adapter->sli_family == SKYHAWK_SLI_FAMILY) && \
diff --git a/drivers/net/ethernet/emulex/benet/be_cmds.c b/drivers/net/ethernet/emulex/benet/be_cmds.c
index 7ea1ea4ff242..1768cfa53208 100644
--- a/drivers/net/ethernet/emulex/benet/be_cmds.c
+++ b/drivers/net/ethernet/emulex/benet/be_cmds.c
@@ -1362,7 +1362,8 @@ int be_cmd_get_stats(struct be_adapter *adapter, struct be_dma_mem *nonemb_cmd)
1362 be_wrb_cmd_hdr_prepare(hdr, CMD_SUBSYSTEM_ETH, 1362 be_wrb_cmd_hdr_prepare(hdr, CMD_SUBSYSTEM_ETH,
1363 OPCODE_ETH_GET_STATISTICS, nonemb_cmd->size, wrb, nonemb_cmd); 1363 OPCODE_ETH_GET_STATISTICS, nonemb_cmd->size, wrb, nonemb_cmd);
1364 1364
1365 if (adapter->generation == BE_GEN3) 1365 /* version 1 of the cmd is not supported only by BE2 */
1366 if (!BE2_chip(adapter))
1366 hdr->version = 1; 1367 hdr->version = 1;
1367 1368
1368 be_mcc_notify(adapter); 1369 be_mcc_notify(adapter);
@@ -1452,7 +1453,8 @@ int be_cmd_link_status_query(struct be_adapter *adapter, u16 *link_speed,
1452 be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON, 1453 be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1453 OPCODE_COMMON_NTWK_LINK_STATUS_QUERY, sizeof(*req), wrb, NULL); 1454 OPCODE_COMMON_NTWK_LINK_STATUS_QUERY, sizeof(*req), wrb, NULL);
1454 1455
1455 if (adapter->generation == BE_GEN3 || lancer_chip(adapter)) 1456 /* version 1 of the cmd is not supported only by BE2 */
1457 if (!BE2_chip(adapter))
1456 req->hdr.version = 1; 1458 req->hdr.version = 1;
1457 1459
1458 req->hdr.domain = dom; 1460 req->hdr.domain = dom;
diff --git a/drivers/net/ethernet/emulex/benet/be_cmds.h b/drivers/net/ethernet/emulex/benet/be_cmds.h
index 06fc22738b9d..d6552e19ffee 100644
--- a/drivers/net/ethernet/emulex/benet/be_cmds.h
+++ b/drivers/net/ethernet/emulex/benet/be_cmds.h
@@ -1656,33 +1656,6 @@ struct be_cmd_resp_get_stats_v1 {
1656 struct be_hw_stats_v1 hw_stats; 1656 struct be_hw_stats_v1 hw_stats;
1657}; 1657};
1658 1658
1659static inline void *hw_stats_from_cmd(struct be_adapter *adapter)
1660{
1661 if (adapter->generation == BE_GEN3) {
1662 struct be_cmd_resp_get_stats_v1 *cmd = adapter->stats_cmd.va;
1663
1664 return &cmd->hw_stats;
1665 } else {
1666 struct be_cmd_resp_get_stats_v0 *cmd = adapter->stats_cmd.va;
1667
1668 return &cmd->hw_stats;
1669 }
1670}
1671
1672static inline void *be_erx_stats_from_cmd(struct be_adapter *adapter)
1673{
1674 if (adapter->generation == BE_GEN3) {
1675 struct be_hw_stats_v1 *hw_stats = hw_stats_from_cmd(adapter);
1676
1677 return &hw_stats->erx;
1678 } else {
1679 struct be_hw_stats_v0 *hw_stats = hw_stats_from_cmd(adapter);
1680
1681 return &hw_stats->erx;
1682 }
1683}
1684
1685
1686/************** get fat capabilites *******************/ 1659/************** get fat capabilites *******************/
1687#define MAX_MODULES 27 1660#define MAX_MODULES 27
1688#define MAX_MODES 4 1661#define MAX_MODES 4
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c
index d982cb09149b..e0e826a38b57 100644
--- a/drivers/net/ethernet/emulex/benet/be_main.c
+++ b/drivers/net/ethernet/emulex/benet/be_main.c
@@ -285,7 +285,35 @@ err:
285 return status; 285 return status;
286} 286}
287 287
288static void populate_be2_stats(struct be_adapter *adapter) 288/* BE2 supports only v0 cmd */
289static void *hw_stats_from_cmd(struct be_adapter *adapter)
290{
291 if (BE2_chip(adapter)) {
292 struct be_cmd_resp_get_stats_v0 *cmd = adapter->stats_cmd.va;
293
294 return &cmd->hw_stats;
295 } else {
296 struct be_cmd_resp_get_stats_v1 *cmd = adapter->stats_cmd.va;
297
298 return &cmd->hw_stats;
299 }
300}
301
302/* BE2 supports only v0 cmd */
303static void *be_erx_stats_from_cmd(struct be_adapter *adapter)
304{
305 if (BE2_chip(adapter)) {
306 struct be_hw_stats_v0 *hw_stats = hw_stats_from_cmd(adapter);
307
308 return &hw_stats->erx;
309 } else {
310 struct be_hw_stats_v1 *hw_stats = hw_stats_from_cmd(adapter);
311
312 return &hw_stats->erx;
313 }
314}
315
316static void populate_be_v0_stats(struct be_adapter *adapter)
289{ 317{
290 struct be_hw_stats_v0 *hw_stats = hw_stats_from_cmd(adapter); 318 struct be_hw_stats_v0 *hw_stats = hw_stats_from_cmd(adapter);
291 struct be_pmem_stats *pmem_sts = &hw_stats->pmem; 319 struct be_pmem_stats *pmem_sts = &hw_stats->pmem;
@@ -334,7 +362,7 @@ static void populate_be2_stats(struct be_adapter *adapter)
334 adapter->drv_stats.eth_red_drops = pmem_sts->eth_red_drops; 362 adapter->drv_stats.eth_red_drops = pmem_sts->eth_red_drops;
335} 363}
336 364
337static void populate_be3_stats(struct be_adapter *adapter) 365static void populate_be_v1_stats(struct be_adapter *adapter)
338{ 366{
339 struct be_hw_stats_v1 *hw_stats = hw_stats_from_cmd(adapter); 367 struct be_hw_stats_v1 *hw_stats = hw_stats_from_cmd(adapter);
340 struct be_pmem_stats *pmem_sts = &hw_stats->pmem; 368 struct be_pmem_stats *pmem_sts = &hw_stats->pmem;
@@ -436,28 +464,25 @@ void be_parse_stats(struct be_adapter *adapter)
436 struct be_rx_obj *rxo; 464 struct be_rx_obj *rxo;
437 int i; 465 int i;
438 466
439 if (adapter->generation == BE_GEN3) { 467 if (lancer_chip(adapter)) {
440 if (lancer_chip(adapter)) 468 populate_lancer_stats(adapter);
441 populate_lancer_stats(adapter);
442 else
443 populate_be3_stats(adapter);
444 } else { 469 } else {
445 populate_be2_stats(adapter); 470 if (BE2_chip(adapter))
446 } 471 populate_be_v0_stats(adapter);
447 472 else
448 if (lancer_chip(adapter)) 473 /* for BE3 and Skyhawk */
449 goto done; 474 populate_be_v1_stats(adapter);
450 475
451 /* as erx_v1 is longer than v0, ok to use v1 defn for v0 access */ 476 /* as erx_v1 is longer than v0, ok to use v1 for v0 access */
452 for_all_rx_queues(adapter, rxo, i) { 477 for_all_rx_queues(adapter, rxo, i) {
453 /* below erx HW counter can actually wrap around after 478 /* below erx HW counter can actually wrap around after
454 * 65535. Driver accumulates a 32-bit value 479 * 65535. Driver accumulates a 32-bit value
455 */ 480 */
456 accumulate_16bit_val(&rx_stats(rxo)->rx_drops_no_frags, 481 accumulate_16bit_val(&rx_stats(rxo)->rx_drops_no_frags,
457 (u16)erx->rx_drops_no_fragments[rxo->q.id]); 482 (u16)erx->rx_drops_no_fragments \
483 [rxo->q.id]);
484 }
458 } 485 }
459done:
460 return;
461} 486}
462 487
463static struct rtnl_link_stats64 *be_get_stats64(struct net_device *netdev, 488static struct rtnl_link_stats64 *be_get_stats64(struct net_device *netdev,
@@ -1874,7 +1899,7 @@ static int be_num_txqs_want(struct be_adapter *adapter)
1874 if ((!lancer_chip(adapter) && sriov_want(adapter)) || 1899 if ((!lancer_chip(adapter) && sriov_want(adapter)) ||
1875 be_is_mc(adapter) || 1900 be_is_mc(adapter) ||
1876 (!lancer_chip(adapter) && !be_physfn(adapter)) || 1901 (!lancer_chip(adapter) && !be_physfn(adapter)) ||
1877 adapter->generation == BE_GEN2) 1902 BE2_chip(adapter))
1878 return 1; 1903 return 1;
1879 else 1904 else
1880 return adapter->max_tx_queues; 1905 return adapter->max_tx_queues;
@@ -3046,7 +3071,7 @@ static bool is_comp_in_ufi(struct be_adapter *adapter,
3046 int i = 0, img_type = 0; 3071 int i = 0, img_type = 0;
3047 struct flash_section_info_g2 *fsec_g2 = NULL; 3072 struct flash_section_info_g2 *fsec_g2 = NULL;
3048 3073
3049 if (adapter->generation != BE_GEN3) 3074 if (BE2_chip(adapter))
3050 fsec_g2 = (struct flash_section_info_g2 *)fsec; 3075 fsec_g2 = (struct flash_section_info_g2 *)fsec;
3051 3076
3052 for (i = 0; i < MAX_FLASH_COMP; i++) { 3077 for (i = 0; i < MAX_FLASH_COMP; i++) {
@@ -3120,7 +3145,8 @@ static int be_flash(struct be_adapter *adapter, const u8 *img,
3120 return 0; 3145 return 0;
3121} 3146}
3122 3147
3123static int be_flash_data(struct be_adapter *adapter, 3148/* For BE2 and BE3 */
3149static int be_flash_BEx(struct be_adapter *adapter,
3124 const struct firmware *fw, 3150 const struct firmware *fw,
3125 struct be_dma_mem *flash_cmd, 3151 struct be_dma_mem *flash_cmd,
3126 int num_of_images) 3152 int num_of_images)
@@ -3175,7 +3201,7 @@ static int be_flash_data(struct be_adapter *adapter,
3175 FLASH_IMAGE_MAX_SIZE_g2, IMAGE_FIRMWARE_BACKUP_FCoE} 3201 FLASH_IMAGE_MAX_SIZE_g2, IMAGE_FIRMWARE_BACKUP_FCoE}
3176 }; 3202 };
3177 3203
3178 if (adapter->generation == BE_GEN3) { 3204 if (BE3_chip(adapter)) {
3179 pflashcomp = gen3_flash_types; 3205 pflashcomp = gen3_flash_types;
3180 filehdr_size = sizeof(struct flash_file_hdr_g3); 3206 filehdr_size = sizeof(struct flash_file_hdr_g3);
3181 num_comp = ARRAY_SIZE(gen3_flash_types); 3207 num_comp = ARRAY_SIZE(gen3_flash_types);
@@ -3184,6 +3210,7 @@ static int be_flash_data(struct be_adapter *adapter,
3184 filehdr_size = sizeof(struct flash_file_hdr_g2); 3210 filehdr_size = sizeof(struct flash_file_hdr_g2);
3185 num_comp = ARRAY_SIZE(gen2_flash_types); 3211 num_comp = ARRAY_SIZE(gen2_flash_types);
3186 } 3212 }
3213
3187 /* Get flash section info*/ 3214 /* Get flash section info*/
3188 fsec = get_fsec_info(adapter, filehdr_size + img_hdrs_size, fw); 3215 fsec = get_fsec_info(adapter, filehdr_size + img_hdrs_size, fw);
3189 if (!fsec) { 3216 if (!fsec) {
@@ -3431,20 +3458,21 @@ lancer_fw_exit:
3431 return status; 3458 return status;
3432} 3459}
3433 3460
3434static int be_get_ufi_gen(struct be_adapter *adapter, 3461#define UFI_TYPE2 2
3435 struct flash_file_hdr_g2 *fhdr) 3462#define UFI_TYPE3 3
3463#define UFI_TYPE4 4
3464static int be_get_ufi_type(struct be_adapter *adapter,
3465 struct flash_file_hdr_g2 *fhdr)
3436{ 3466{
3437 if (fhdr == NULL) 3467 if (fhdr == NULL)
3438 goto be_get_ufi_exit; 3468 goto be_get_ufi_exit;
3439 3469
3440 if (adapter->generation == BE_GEN3) { 3470 if (skyhawk_chip(adapter) && fhdr->build[0] == '4')
3441 if (skyhawk_chip(adapter) && fhdr->build[0] == '4') 3471 return UFI_TYPE4;
3442 return SH_HW; 3472 else if (BE3_chip(adapter) && fhdr->build[0] == '3')
3443 else if (!skyhawk_chip(adapter) && fhdr->build[0] == '3') 3473 return UFI_TYPE3;
3444 return BE_GEN3; 3474 else if (BE2_chip(adapter) && fhdr->build[0] == '2')
3445 } else if (adapter->generation == BE_GEN2 && fhdr->build[0] == '2') { 3475 return UFI_TYPE2;
3446 return BE_GEN2;
3447 }
3448 3476
3449be_get_ufi_exit: 3477be_get_ufi_exit:
3450 dev_err(&adapter->pdev->dev, 3478 dev_err(&adapter->pdev->dev,
@@ -3474,7 +3502,7 @@ static int be_fw_download(struct be_adapter *adapter, const struct firmware* fw)
3474 p = fw->data; 3502 p = fw->data;
3475 fhdr = (struct flash_file_hdr_g2 *)p; 3503 fhdr = (struct flash_file_hdr_g2 *)p;
3476 3504
3477 ufi_type = be_get_ufi_gen(adapter, fhdr); 3505 ufi_type = be_get_ufi_type(adapter, fhdr);
3478 3506
3479 fhdr3 = (struct flash_file_hdr_g3 *)fw->data; 3507 fhdr3 = (struct flash_file_hdr_g3 *)fw->data;
3480 num_imgs = le32_to_cpu(fhdr3->num_imgs); 3508 num_imgs = le32_to_cpu(fhdr3->num_imgs);
@@ -3483,17 +3511,17 @@ static int be_fw_download(struct be_adapter *adapter, const struct firmware* fw)
3483 (sizeof(struct flash_file_hdr_g3) + 3511 (sizeof(struct flash_file_hdr_g3) +
3484 i * sizeof(struct image_hdr))); 3512 i * sizeof(struct image_hdr)));
3485 if (le32_to_cpu(img_hdr_ptr->imageid) == 1) { 3513 if (le32_to_cpu(img_hdr_ptr->imageid) == 1) {
3486 if (ufi_type == SH_HW) 3514 if (ufi_type == UFI_TYPE4)
3487 status = be_flash_skyhawk(adapter, fw, 3515 status = be_flash_skyhawk(adapter, fw,
3488 &flash_cmd, num_imgs); 3516 &flash_cmd, num_imgs);
3489 else if (ufi_type == BE_GEN3) 3517 else if (ufi_type == UFI_TYPE3)
3490 status = be_flash_data(adapter, fw, 3518 status = be_flash_BEx(adapter, fw, &flash_cmd,
3491 &flash_cmd, num_imgs); 3519 num_imgs);
3492 } 3520 }
3493 } 3521 }
3494 3522
3495 if (ufi_type == BE_GEN2) 3523 if (ufi_type == UFI_TYPE2)
3496 status = be_flash_data(adapter, fw, &flash_cmd, 0); 3524 status = be_flash_BEx(adapter, fw, &flash_cmd, 0);
3497 else if (ufi_type == -1) 3525 else if (ufi_type == -1)
3498 status = -1; 3526 status = -1;
3499 3527
@@ -3644,7 +3672,7 @@ static int be_map_pci_bars(struct be_adapter *adapter)
3644 adapter->csr = addr; 3672 adapter->csr = addr;
3645 } 3673 }
3646 3674
3647 if (adapter->generation == BE_GEN2) { 3675 if (BE2_chip(adapter)) {
3648 db_reg = 4; 3676 db_reg = 4;
3649 } else { 3677 } else {
3650 if (be_physfn(adapter)) 3678 if (be_physfn(adapter))
@@ -3751,14 +3779,14 @@ static int be_stats_init(struct be_adapter *adapter)
3751{ 3779{
3752 struct be_dma_mem *cmd = &adapter->stats_cmd; 3780 struct be_dma_mem *cmd = &adapter->stats_cmd;
3753 3781
3754 if (adapter->generation == BE_GEN2) { 3782 if (lancer_chip(adapter))
3783 cmd->size = sizeof(struct lancer_cmd_req_pport_stats);
3784 else if (BE2_chip(adapter))
3755 cmd->size = sizeof(struct be_cmd_req_get_stats_v0); 3785 cmd->size = sizeof(struct be_cmd_req_get_stats_v0);
3756 } else { 3786 else
3757 if (lancer_chip(adapter)) 3787 /* BE3 and Skyhawk */
3758 cmd->size = sizeof(struct lancer_cmd_req_pport_stats); 3788 cmd->size = sizeof(struct be_cmd_req_get_stats_v1);
3759 else 3789
3760 cmd->size = sizeof(struct be_cmd_req_get_stats_v1);
3761 }
3762 cmd->va = dma_alloc_coherent(&adapter->pdev->dev, cmd->size, &cmd->dma, 3790 cmd->va = dma_alloc_coherent(&adapter->pdev->dev, cmd->size, &cmd->dma,
3763 GFP_KERNEL); 3791 GFP_KERNEL);
3764 if (cmd->va == NULL) 3792 if (cmd->va == NULL)
@@ -3878,11 +3906,9 @@ static int be_dev_type_check(struct be_adapter *adapter)
3878 switch (pdev->device) { 3906 switch (pdev->device) {
3879 case BE_DEVICE_ID1: 3907 case BE_DEVICE_ID1:
3880 case OC_DEVICE_ID1: 3908 case OC_DEVICE_ID1:
3881 adapter->generation = BE_GEN2;
3882 break; 3909 break;
3883 case BE_DEVICE_ID2: 3910 case BE_DEVICE_ID2:
3884 case OC_DEVICE_ID2: 3911 case OC_DEVICE_ID2:
3885 adapter->generation = BE_GEN3;
3886 break; 3912 break;
3887 case OC_DEVICE_ID3: 3913 case OC_DEVICE_ID3:
3888 case OC_DEVICE_ID4: 3914 case OC_DEVICE_ID4:
@@ -3898,7 +3924,6 @@ static int be_dev_type_check(struct be_adapter *adapter)
3898 } 3924 }
3899 adapter->sli_family = ((sli_intf & SLI_INTF_FAMILY_MASK) >> 3925 adapter->sli_family = ((sli_intf & SLI_INTF_FAMILY_MASK) >>
3900 SLI_INTF_FAMILY_SHIFT); 3926 SLI_INTF_FAMILY_SHIFT);
3901 adapter->generation = BE_GEN3;
3902 break; 3927 break;
3903 case OC_DEVICE_ID5: 3928 case OC_DEVICE_ID5:
3904 case OC_DEVICE_ID6: 3929 case OC_DEVICE_ID6:
@@ -3909,10 +3934,7 @@ static int be_dev_type_check(struct be_adapter *adapter)
3909 } 3934 }
3910 adapter->sli_family = ((sli_intf & SLI_INTF_FAMILY_MASK) >> 3935 adapter->sli_family = ((sli_intf & SLI_INTF_FAMILY_MASK) >>
3911 SLI_INTF_FAMILY_SHIFT); 3936 SLI_INTF_FAMILY_SHIFT);
3912 adapter->generation = BE_GEN3;
3913 break; 3937 break;
3914 default:
3915 adapter->generation = 0;
3916 } 3938 }
3917 3939
3918 pci_read_config_dword(adapter->pdev, SLI_INTF_REG_OFFSET, &sli_intf); 3940 pci_read_config_dword(adapter->pdev, SLI_INTF_REG_OFFSET, &sli_intf);