diff options
author | Anirban Chakraborty <anirban.chakraborty@qlogic.com> | 2010-07-13 16:33:35 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-07-14 16:54:17 -0400 |
commit | cea8975e84409f01fc4cf92775d2d0028ccc1665 (patch) | |
tree | 583f5ef6be82b1d84f50c0e7fad49480c5e4d2e4 /drivers/net/qlcnic | |
parent | 451724c821c1fe5af076a0def72362f947e1b6a0 (diff) |
qlcnic: restore NPAR config data after recovery
o NPAR configuration which is programmed in fw, need to
restore after fw recovery.
o Update version to 5.0.7
Signed-off-by: Anirban Chakraborty <anirban.chakraborty@qlogic.com>
Signed-off-by: Rajesh Borundia <rajesh.borundia@qlogic.com>
Signed-off-by: Amit Kumar Salecha <amit.salecha@qlogic.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/qlcnic')
-rw-r--r-- | drivers/net/qlcnic/qlcnic.h | 7 | ||||
-rw-r--r-- | drivers/net/qlcnic/qlcnic_ctx.c | 2 | ||||
-rw-r--r-- | drivers/net/qlcnic/qlcnic_main.c | 86 |
3 files changed, 72 insertions, 23 deletions
diff --git a/drivers/net/qlcnic/qlcnic.h b/drivers/net/qlcnic/qlcnic.h index 064464201cbb..e1894775e5aa 100644 --- a/drivers/net/qlcnic/qlcnic.h +++ b/drivers/net/qlcnic/qlcnic.h | |||
@@ -51,8 +51,8 @@ | |||
51 | 51 | ||
52 | #define _QLCNIC_LINUX_MAJOR 5 | 52 | #define _QLCNIC_LINUX_MAJOR 5 |
53 | #define _QLCNIC_LINUX_MINOR 0 | 53 | #define _QLCNIC_LINUX_MINOR 0 |
54 | #define _QLCNIC_LINUX_SUBVERSION 6 | 54 | #define _QLCNIC_LINUX_SUBVERSION 7 |
55 | #define QLCNIC_LINUX_VERSIONID "5.0.6" | 55 | #define QLCNIC_LINUX_VERSIONID "5.0.7" |
56 | #define QLCNIC_DRV_IDC_VER 0x01 | 56 | #define QLCNIC_DRV_IDC_VER 0x01 |
57 | 57 | ||
58 | #define QLCNIC_VERSION_CODE(a, b, c) (((a) << 24) + ((b) << 16) + (c)) | 58 | #define QLCNIC_VERSION_CODE(a, b, c) (((a) << 24) + ((b) << 16) + (c)) |
@@ -949,7 +949,6 @@ struct qlcnic_adapter { | |||
949 | u8 has_link_events; | 949 | u8 has_link_events; |
950 | u8 fw_type; | 950 | u8 fw_type; |
951 | u16 tx_context_id; | 951 | u16 tx_context_id; |
952 | u16 mtu; | ||
953 | u16 is_up; | 952 | u16 is_up; |
954 | 953 | ||
955 | u16 link_speed; | 954 | u16 link_speed; |
@@ -1044,6 +1043,8 @@ struct qlcnic_pci_info { | |||
1044 | 1043 | ||
1045 | struct qlcnic_npar_info { | 1044 | struct qlcnic_npar_info { |
1046 | u16 vlan_id; | 1045 | u16 vlan_id; |
1046 | u16 min_bw; | ||
1047 | u16 max_bw; | ||
1047 | u8 phy_port; | 1048 | u8 phy_port; |
1048 | u8 type; | 1049 | u8 type; |
1049 | u8 active; | 1050 | u8 active; |
diff --git a/drivers/net/qlcnic/qlcnic_ctx.c b/drivers/net/qlcnic/qlcnic_ctx.c index cdd44b4136ae..cc5d861d9a12 100644 --- a/drivers/net/qlcnic/qlcnic_ctx.c +++ b/drivers/net/qlcnic/qlcnic_ctx.c | |||
@@ -636,6 +636,8 @@ int qlcnic_get_nic_info(struct qlcnic_adapter *adapter, | |||
636 | QLCNIC_CDRP_CMD_GET_NIC_INFO); | 636 | QLCNIC_CDRP_CMD_GET_NIC_INFO); |
637 | 637 | ||
638 | if (err == QLCNIC_RCODE_SUCCESS) { | 638 | if (err == QLCNIC_RCODE_SUCCESS) { |
639 | npar_info->pci_func = le16_to_cpu(nic_info->pci_func); | ||
640 | npar_info->op_mode = le16_to_cpu(nic_info->op_mode); | ||
639 | npar_info->phys_port = le16_to_cpu(nic_info->phys_port); | 641 | npar_info->phys_port = le16_to_cpu(nic_info->phys_port); |
640 | npar_info->switch_mode = le16_to_cpu(nic_info->switch_mode); | 642 | npar_info->switch_mode = le16_to_cpu(nic_info->switch_mode); |
641 | npar_info->max_tx_ques = le16_to_cpu(nic_info->max_tx_ques); | 643 | npar_info->max_tx_ques = le16_to_cpu(nic_info->max_tx_ques); |
diff --git a/drivers/net/qlcnic/qlcnic_main.c b/drivers/net/qlcnic/qlcnic_main.c index d5c94a3364f7..8d2d62ff1a37 100644 --- a/drivers/net/qlcnic/qlcnic_main.c +++ b/drivers/net/qlcnic/qlcnic_main.c | |||
@@ -507,6 +507,8 @@ qlcnic_init_pci_info(struct qlcnic_adapter *adapter) | |||
507 | adapter->npars[pfn].type = pci_info[i].type; | 507 | adapter->npars[pfn].type = pci_info[i].type; |
508 | adapter->npars[pfn].phy_port = pci_info[i].default_port; | 508 | adapter->npars[pfn].phy_port = pci_info[i].default_port; |
509 | adapter->npars[pfn].mac_learning = DEFAULT_MAC_LEARN; | 509 | adapter->npars[pfn].mac_learning = DEFAULT_MAC_LEARN; |
510 | adapter->npars[pfn].min_bw = pci_info[i].tx_min_bw; | ||
511 | adapter->npars[pfn].max_bw = pci_info[i].tx_max_bw; | ||
510 | } | 512 | } |
511 | 513 | ||
512 | for (i = 0; i < QLCNIC_NIU_MAX_XG_PORTS; i++) | 514 | for (i = 0; i < QLCNIC_NIU_MAX_XG_PORTS; i++) |
@@ -771,6 +773,50 @@ qlcnic_check_options(struct qlcnic_adapter *adapter) | |||
771 | } | 773 | } |
772 | 774 | ||
773 | static int | 775 | static int |
776 | qlcnic_reset_npar_config(struct qlcnic_adapter *adapter) | ||
777 | { | ||
778 | int i, err = 0; | ||
779 | struct qlcnic_npar_info *npar; | ||
780 | struct qlcnic_info nic_info; | ||
781 | |||
782 | if (!(adapter->flags & QLCNIC_ESWITCH_ENABLED) || | ||
783 | !adapter->need_fw_reset) | ||
784 | return 0; | ||
785 | |||
786 | if (adapter->op_mode == QLCNIC_MGMT_FUNC) { | ||
787 | /* Set the NPAR config data after FW reset */ | ||
788 | for (i = 0; i < QLCNIC_MAX_PCI_FUNC; i++) { | ||
789 | npar = &adapter->npars[i]; | ||
790 | if (npar->type != QLCNIC_TYPE_NIC) | ||
791 | continue; | ||
792 | err = qlcnic_get_nic_info(adapter, &nic_info, i); | ||
793 | if (err) | ||
794 | goto err_out; | ||
795 | nic_info.min_tx_bw = npar->min_bw; | ||
796 | nic_info.max_tx_bw = npar->max_bw; | ||
797 | err = qlcnic_set_nic_info(adapter, &nic_info); | ||
798 | if (err) | ||
799 | goto err_out; | ||
800 | |||
801 | if (npar->enable_pm) { | ||
802 | err = qlcnic_config_port_mirroring(adapter, | ||
803 | npar->dest_npar, 1, i); | ||
804 | if (err) | ||
805 | goto err_out; | ||
806 | |||
807 | } | ||
808 | npar->mac_learning = DEFAULT_MAC_LEARN; | ||
809 | npar->host_vlan_tag = 0; | ||
810 | npar->promisc_mode = 0; | ||
811 | npar->discard_tagged = 0; | ||
812 | npar->vlan_id = 0; | ||
813 | } | ||
814 | } | ||
815 | err_out: | ||
816 | return err; | ||
817 | } | ||
818 | |||
819 | static int | ||
774 | qlcnic_start_firmware(struct qlcnic_adapter *adapter) | 820 | qlcnic_start_firmware(struct qlcnic_adapter *adapter) |
775 | { | 821 | { |
776 | int val, err, first_boot; | 822 | int val, err, first_boot; |
@@ -834,10 +880,9 @@ wait_init: | |||
834 | qlcnic_idc_debug_info(adapter, 1); | 880 | qlcnic_idc_debug_info(adapter, 1); |
835 | 881 | ||
836 | qlcnic_check_options(adapter); | 882 | qlcnic_check_options(adapter); |
837 | 883 | if (qlcnic_reset_npar_config(adapter)) | |
838 | if (adapter->flags & QLCNIC_ESWITCH_ENABLED && | 884 | goto err_out; |
839 | adapter->op_mode != QLCNIC_NON_PRIV_FUNC) | 885 | qlcnic_dev_set_npar_ready(adapter); |
840 | qlcnic_dev_set_npar_ready(adapter); | ||
841 | 886 | ||
842 | adapter->need_fw_reset = 0; | 887 | adapter->need_fw_reset = 0; |
843 | 888 | ||
@@ -2486,6 +2531,7 @@ qlcnic_dev_request_reset(struct qlcnic_adapter *adapter) | |||
2486 | { | 2531 | { |
2487 | u32 state; | 2532 | u32 state; |
2488 | 2533 | ||
2534 | adapter->need_fw_reset = 1; | ||
2489 | if (qlcnic_api_lock(adapter)) | 2535 | if (qlcnic_api_lock(adapter)) |
2490 | return; | 2536 | return; |
2491 | 2537 | ||
@@ -2506,6 +2552,9 @@ qlcnic_dev_set_npar_ready(struct qlcnic_adapter *adapter) | |||
2506 | { | 2552 | { |
2507 | u32 state; | 2553 | u32 state; |
2508 | 2554 | ||
2555 | if (!(adapter->flags & QLCNIC_ESWITCH_ENABLED) || | ||
2556 | adapter->op_mode == QLCNIC_NON_PRIV_FUNC) | ||
2557 | return; | ||
2509 | if (qlcnic_api_lock(adapter)) | 2558 | if (qlcnic_api_lock(adapter)) |
2510 | return; | 2559 | return; |
2511 | 2560 | ||
@@ -3019,7 +3068,7 @@ static struct bin_attribute bin_attr_mem = { | |||
3019 | .write = qlcnic_sysfs_write_mem, | 3068 | .write = qlcnic_sysfs_write_mem, |
3020 | }; | 3069 | }; |
3021 | 3070 | ||
3022 | int | 3071 | static int |
3023 | validate_pm_config(struct qlcnic_adapter *adapter, | 3072 | validate_pm_config(struct qlcnic_adapter *adapter, |
3024 | struct qlcnic_pm_func_cfg *pm_cfg, int count) | 3073 | struct qlcnic_pm_func_cfg *pm_cfg, int count) |
3025 | { | 3074 | { |
@@ -3118,7 +3167,7 @@ qlcnic_sysfs_read_pm_config(struct file *filp, struct kobject *kobj, | |||
3118 | return size; | 3167 | return size; |
3119 | } | 3168 | } |
3120 | 3169 | ||
3121 | int | 3170 | static int |
3122 | validate_esw_config(struct qlcnic_adapter *adapter, | 3171 | validate_esw_config(struct qlcnic_adapter *adapter, |
3123 | struct qlcnic_esw_func_cfg *esw_cfg, int count) | 3172 | struct qlcnic_esw_func_cfg *esw_cfg, int count) |
3124 | { | 3173 | { |
@@ -3154,9 +3203,8 @@ qlcnic_sysfs_write_esw_config(struct file *file, struct kobject *kobj, | |||
3154 | struct device *dev = container_of(kobj, struct device, kobj); | 3203 | struct device *dev = container_of(kobj, struct device, kobj); |
3155 | struct qlcnic_adapter *adapter = dev_get_drvdata(dev); | 3204 | struct qlcnic_adapter *adapter = dev_get_drvdata(dev); |
3156 | struct qlcnic_esw_func_cfg *esw_cfg; | 3205 | struct qlcnic_esw_func_cfg *esw_cfg; |
3157 | u8 id, discard_tagged, promsc_mode, mac_learn; | ||
3158 | u8 vlan_tagging, pci_func, vlan_id; | ||
3159 | int count, rem, i, ret; | 3206 | int count, rem, i, ret; |
3207 | u8 id, pci_func; | ||
3160 | 3208 | ||
3161 | count = size / sizeof(struct qlcnic_esw_func_cfg); | 3209 | count = size / sizeof(struct qlcnic_esw_func_cfg); |
3162 | rem = size % sizeof(struct qlcnic_esw_func_cfg); | 3210 | rem = size % sizeof(struct qlcnic_esw_func_cfg); |
@@ -3171,17 +3219,13 @@ qlcnic_sysfs_write_esw_config(struct file *file, struct kobject *kobj, | |||
3171 | for (i = 0; i < count; i++) { | 3219 | for (i = 0; i < count; i++) { |
3172 | pci_func = esw_cfg[i].pci_func; | 3220 | pci_func = esw_cfg[i].pci_func; |
3173 | id = adapter->npars[pci_func].phy_port; | 3221 | id = adapter->npars[pci_func].phy_port; |
3174 | vlan_tagging = esw_cfg[i].host_vlan_tag; | 3222 | ret = qlcnic_config_switch_port(adapter, id, |
3175 | promsc_mode = esw_cfg[i].promisc_mode; | 3223 | esw_cfg[i].host_vlan_tag, |
3176 | mac_learn = esw_cfg[i].mac_learning; | 3224 | esw_cfg[i].discard_tagged, |
3177 | vlan_id = esw_cfg[i].vlan_id; | 3225 | esw_cfg[i].promisc_mode, |
3178 | discard_tagged = esw_cfg[i].discard_tagged; | 3226 | esw_cfg[i].mac_learning, |
3179 | ret = qlcnic_config_switch_port(adapter, id, vlan_tagging, | 3227 | esw_cfg[i].pci_func, |
3180 | discard_tagged, | 3228 | esw_cfg[i].vlan_id); |
3181 | promsc_mode, | ||
3182 | mac_learn, | ||
3183 | pci_func, | ||
3184 | vlan_id); | ||
3185 | if (ret) | 3229 | if (ret) |
3186 | return ret; | 3230 | return ret; |
3187 | } | 3231 | } |
@@ -3227,7 +3271,7 @@ qlcnic_sysfs_read_esw_config(struct file *file, struct kobject *kobj, | |||
3227 | return size; | 3271 | return size; |
3228 | } | 3272 | } |
3229 | 3273 | ||
3230 | int | 3274 | static int |
3231 | validate_npar_config(struct qlcnic_adapter *adapter, | 3275 | validate_npar_config(struct qlcnic_adapter *adapter, |
3232 | struct qlcnic_npar_func_cfg *np_cfg, int count) | 3276 | struct qlcnic_npar_func_cfg *np_cfg, int count) |
3233 | { | 3277 | { |
@@ -3282,6 +3326,8 @@ qlcnic_sysfs_write_npar_config(struct file *file, struct kobject *kobj, | |||
3282 | ret = qlcnic_set_nic_info(adapter, &nic_info); | 3326 | ret = qlcnic_set_nic_info(adapter, &nic_info); |
3283 | if (ret) | 3327 | if (ret) |
3284 | return ret; | 3328 | return ret; |
3329 | adapter->npars[i].min_bw = nic_info.min_tx_bw; | ||
3330 | adapter->npars[i].max_bw = nic_info.max_tx_bw; | ||
3285 | } | 3331 | } |
3286 | 3332 | ||
3287 | return size; | 3333 | return size; |