diff options
author | Anirban Chakraborty <anirban.chakraborty@qlogic.com> | 2010-06-16 05:07:27 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-06-16 17:45:51 -0400 |
commit | 0e33c6649eea99f03d6b444d93fe67d856f1b10d (patch) | |
tree | 91343e3b02d66ad62f9e469ceaee60642c4656b1 /drivers/net/qlcnic/qlcnic_main.c | |
parent | 8c76368174ed2359739f1b7b8a9c042b1ef839c4 (diff) |
qlcnic: Fix a bug in setting up NIC partitioning mode
The driver was not detecting the presence of NIC partitioning capability of the
firmware properly. Now, it checks the eswitch set bit in the FW capabilities
register and accordingly sets the driver mode as NPAR capable or not.
Signed-off-by: Anirban Chakraborty <anirban.chakraborty@qlogic.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/qlcnic/qlcnic_main.c')
-rw-r--r-- | drivers/net/qlcnic/qlcnic_main.c | 82 |
1 files changed, 31 insertions, 51 deletions
diff --git a/drivers/net/qlcnic/qlcnic_main.c b/drivers/net/qlcnic/qlcnic_main.c index 99371bcaa547..128a0a72a234 100644 --- a/drivers/net/qlcnic/qlcnic_main.c +++ b/drivers/net/qlcnic/qlcnic_main.c | |||
@@ -502,39 +502,28 @@ qlcnic_set_function_modes(struct qlcnic_adapter *adapter) | |||
502 | if (QLC_DEV_CLR_REF_CNT(ref_count, adapter->ahw.pci_func)) | 502 | if (QLC_DEV_CLR_REF_CNT(ref_count, adapter->ahw.pci_func)) |
503 | goto err_npar; | 503 | goto err_npar; |
504 | 504 | ||
505 | for (i = 0; i < QLCNIC_MAX_PCI_FUNC; i++) { | 505 | if (qlcnic_config_npars) { |
506 | id = adapter->npars[i].id; | 506 | for (i = 0; i < QLCNIC_MAX_PCI_FUNC; i++) { |
507 | if (adapter->npars[i].type != QLCNIC_TYPE_NIC || | 507 | id = adapter->npars[i].id; |
508 | id == adapter->ahw.pci_func) | 508 | if (adapter->npars[i].type != QLCNIC_TYPE_NIC || |
509 | continue; | 509 | id == adapter->ahw.pci_func) |
510 | data |= (qlcnic_config_npars & QLC_DEV_SET_DRV(0xf, id)); | 510 | continue; |
511 | data |= (qlcnic_config_npars & | ||
512 | QLC_DEV_SET_DRV(0xf, id)); | ||
513 | } | ||
514 | } else { | ||
515 | data = readl(priv_op); | ||
516 | data = (data & ~QLC_DEV_SET_DRV(0xf, adapter->ahw.pci_func)) | | ||
517 | (QLC_DEV_SET_DRV(QLCNIC_MGMT_FUNC, | ||
518 | adapter->ahw.pci_func)); | ||
511 | } | 519 | } |
512 | writel(data, priv_op); | 520 | writel(data, priv_op); |
513 | |||
514 | err_npar: | 521 | err_npar: |
515 | qlcnic_api_unlock(adapter); | 522 | qlcnic_api_unlock(adapter); |
516 | err_lock: | 523 | err_lock: |
517 | return ret; | 524 | return ret; |
518 | } | 525 | } |
519 | 526 | ||
520 | static u8 | ||
521 | qlcnic_set_mgmt_driver(struct qlcnic_adapter *adapter) | ||
522 | { | ||
523 | u8 i, ret = 0; | ||
524 | |||
525 | if (qlcnic_get_pci_info(adapter)) | ||
526 | return ret; | ||
527 | /* Set the eswitch */ | ||
528 | for (i = 0; i < QLCNIC_NIU_MAX_XG_PORTS; i++) { | ||
529 | if (!qlcnic_get_eswitch_capabilities(adapter, i, | ||
530 | &adapter->eswitch[i])) { | ||
531 | ret++; | ||
532 | qlcnic_toggle_eswitch(adapter, i, ret); | ||
533 | } | ||
534 | } | ||
535 | return ret; | ||
536 | } | ||
537 | |||
538 | static u32 | 527 | static u32 |
539 | qlcnic_get_driver_mode(struct qlcnic_adapter *adapter) | 528 | qlcnic_get_driver_mode(struct qlcnic_adapter *adapter) |
540 | { | 529 | { |
@@ -550,6 +539,7 @@ qlcnic_get_driver_mode(struct qlcnic_adapter *adapter) | |||
550 | adapter->nic_ops = &qlcnic_ops; | 539 | adapter->nic_ops = &qlcnic_ops; |
551 | adapter->fw_hal_version = QLCNIC_FW_BASE; | 540 | adapter->fw_hal_version = QLCNIC_FW_BASE; |
552 | adapter->ahw.pci_func = PCI_FUNC(adapter->pdev->devfn); | 541 | adapter->ahw.pci_func = PCI_FUNC(adapter->pdev->devfn); |
542 | adapter->capabilities = QLCRD32(adapter, CRB_FW_CAPABILITIES_1); | ||
553 | dev_info(&adapter->pdev->dev, | 543 | dev_info(&adapter->pdev->dev, |
554 | "FW does not support nic partion\n"); | 544 | "FW does not support nic partion\n"); |
555 | return adapter->fw_hal_version; | 545 | return adapter->fw_hal_version; |
@@ -562,29 +552,28 @@ qlcnic_get_driver_mode(struct qlcnic_adapter *adapter) | |||
562 | func = (func - msix_base)/QLCNIC_MSIX_TBL_PGSIZE; | 552 | func = (func - msix_base)/QLCNIC_MSIX_TBL_PGSIZE; |
563 | adapter->ahw.pci_func = func; | 553 | adapter->ahw.pci_func = func; |
564 | 554 | ||
555 | qlcnic_get_nic_info(adapter, adapter->ahw.pci_func); | ||
556 | |||
557 | if (!(adapter->flags & QLCNIC_ESWITCH_ENABLED)) { | ||
558 | adapter->nic_ops = &qlcnic_ops; | ||
559 | return adapter->fw_hal_version; | ||
560 | } | ||
561 | |||
565 | /* Determine function privilege level */ | 562 | /* Determine function privilege level */ |
566 | priv_op = adapter->ahw.pci_base0 + QLCNIC_DRV_OP_MODE; | 563 | priv_op = adapter->ahw.pci_base0 + QLCNIC_DRV_OP_MODE; |
567 | op_mode = readl(priv_op); | 564 | op_mode = readl(priv_op); |
568 | if (op_mode == QLC_DEV_DRV_DEFAULT) { | 565 | if (op_mode == QLC_DEV_DRV_DEFAULT) |
569 | priv_level = QLCNIC_MGMT_FUNC; | 566 | priv_level = QLCNIC_MGMT_FUNC; |
570 | if (qlcnic_api_lock(adapter)) | 567 | else |
571 | return 0; | ||
572 | op_mode = (op_mode & ~QLC_DEV_SET_DRV(0xf, func)) | | ||
573 | (QLC_DEV_SET_DRV(QLCNIC_MGMT_FUNC, func)); | ||
574 | writel(op_mode, priv_op); | ||
575 | qlcnic_api_unlock(adapter); | ||
576 | |||
577 | } else | ||
578 | priv_level = QLC_DEV_GET_DRV(op_mode, adapter->ahw.pci_func); | 568 | priv_level = QLC_DEV_GET_DRV(op_mode, adapter->ahw.pci_func); |
579 | 569 | ||
580 | switch (priv_level) { | 570 | switch (priv_level) { |
581 | case QLCNIC_MGMT_FUNC: | 571 | case QLCNIC_MGMT_FUNC: |
582 | adapter->op_mode = QLCNIC_MGMT_FUNC; | 572 | adapter->op_mode = QLCNIC_MGMT_FUNC; |
583 | adapter->nic_ops = &qlcnic_pf_ops; | 573 | adapter->nic_ops = &qlcnic_pf_ops; |
574 | qlcnic_get_pci_info(adapter); | ||
584 | /* Set privilege level for other functions */ | 575 | /* Set privilege level for other functions */ |
585 | if (qlcnic_config_npars) | 576 | qlcnic_set_function_modes(adapter); |
586 | qlcnic_set_function_modes(adapter); | ||
587 | qlcnic_dev_set_npar_ready(adapter); | ||
588 | dev_info(&adapter->pdev->dev, | 577 | dev_info(&adapter->pdev->dev, |
589 | "HAL Version: %d, Management function\n", | 578 | "HAL Version: %d, Management function\n", |
590 | adapter->fw_hal_version); | 579 | adapter->fw_hal_version); |
@@ -716,11 +705,6 @@ qlcnic_check_options(struct qlcnic_adapter *adapter) | |||
716 | dev_info(&pdev->dev, "firmware v%d.%d.%d\n", | 705 | dev_info(&pdev->dev, "firmware v%d.%d.%d\n", |
717 | fw_major, fw_minor, fw_build); | 706 | fw_major, fw_minor, fw_build); |
718 | 707 | ||
719 | if (adapter->fw_hal_version == QLCNIC_FW_NPAR) | ||
720 | qlcnic_get_nic_info(adapter, adapter->ahw.pci_func); | ||
721 | else | ||
722 | adapter->capabilities = QLCRD32(adapter, CRB_FW_CAPABILITIES_1); | ||
723 | |||
724 | adapter->flags &= ~QLCNIC_LRO_ENABLED; | 708 | adapter->flags &= ~QLCNIC_LRO_ENABLED; |
725 | 709 | ||
726 | if (adapter->ahw.port_type == QLCNIC_XGBE) { | 710 | if (adapter->ahw.port_type == QLCNIC_XGBE) { |
@@ -731,6 +715,8 @@ qlcnic_check_options(struct qlcnic_adapter *adapter) | |||
731 | adapter->num_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_1G; | 715 | adapter->num_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_1G; |
732 | } | 716 | } |
733 | 717 | ||
718 | qlcnic_get_nic_info(adapter, adapter->ahw.pci_func); | ||
719 | |||
734 | adapter->msix_supported = !!use_msi_x; | 720 | adapter->msix_supported = !!use_msi_x; |
735 | adapter->rss_supported = !!use_msi_x; | 721 | adapter->rss_supported = !!use_msi_x; |
736 | 722 | ||
@@ -797,13 +783,11 @@ wait_init: | |||
797 | QLCWR32(adapter, QLCNIC_CRB_DEV_STATE, QLCNIC_DEV_READY); | 783 | QLCWR32(adapter, QLCNIC_CRB_DEV_STATE, QLCNIC_DEV_READY); |
798 | qlcnic_idc_debug_info(adapter, 1); | 784 | qlcnic_idc_debug_info(adapter, 1); |
799 | 785 | ||
800 | qlcnic_dev_set_npar_ready(adapter); | ||
801 | |||
802 | qlcnic_check_options(adapter); | 786 | qlcnic_check_options(adapter); |
803 | 787 | ||
804 | if (adapter->fw_hal_version != QLCNIC_FW_BASE && | 788 | if (adapter->flags & QLCNIC_ESWITCH_ENABLED && |
805 | adapter->op_mode == QLCNIC_MGMT_FUNC) | 789 | adapter->op_mode != QLCNIC_NON_PRIV_FUNC) |
806 | qlcnic_set_mgmt_driver(adapter); | 790 | qlcnic_dev_set_npar_ready(adapter); |
807 | 791 | ||
808 | adapter->need_fw_reset = 0; | 792 | adapter->need_fw_reset = 0; |
809 | 793 | ||
@@ -2449,10 +2433,6 @@ qlcnic_dev_set_npar_ready(struct qlcnic_adapter *adapter) | |||
2449 | { | 2433 | { |
2450 | u32 state; | 2434 | u32 state; |
2451 | 2435 | ||
2452 | if (adapter->op_mode == QLCNIC_NON_PRIV_FUNC || | ||
2453 | adapter->fw_hal_version == QLCNIC_FW_BASE) | ||
2454 | return; | ||
2455 | |||
2456 | if (qlcnic_api_lock(adapter)) | 2436 | if (qlcnic_api_lock(adapter)) |
2457 | return; | 2437 | return; |
2458 | 2438 | ||