diff options
author | Rajesh Borundia <rajesh.borundia@qlogic.com> | 2010-08-31 13:17:50 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-09-01 13:41:56 -0400 |
commit | 7373373d100e5aebe751af0b2609a9a01dad5ac1 (patch) | |
tree | 3816ae48d6f3f33beeb20f2c66b2b4ab333dc1fa /drivers | |
parent | dcb50afff747d15fc2ffff762c08c325e4c229e5 (diff) |
qlcnic: fix mac override capability
o Rename mac_learning to mac_override
o Added check in set_mac to return error if mac override is disabled.
o Disabling mac_override only supported for Non priviledged functions.
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')
-rw-r--r-- | drivers/net/qlcnic/qlcnic.h | 5 | ||||
-rw-r--r-- | drivers/net/qlcnic/qlcnic_ctx.c | 13 | ||||
-rw-r--r-- | drivers/net/qlcnic/qlcnic_main.c | 23 |
3 files changed, 28 insertions, 13 deletions
diff --git a/drivers/net/qlcnic/qlcnic.h b/drivers/net/qlcnic/qlcnic.h index 220370fac726..cd1a2e6f59d2 100644 --- a/drivers/net/qlcnic/qlcnic.h +++ b/drivers/net/qlcnic/qlcnic.h | |||
@@ -905,6 +905,7 @@ struct qlcnic_mac_req { | |||
905 | #define QLCNIC_ADAPTER_INITIALIZED 0x80 | 905 | #define QLCNIC_ADAPTER_INITIALIZED 0x80 |
906 | #define QLCNIC_TAGGING_ENABLED 0x100 | 906 | #define QLCNIC_TAGGING_ENABLED 0x100 |
907 | #define QLCNIC_MACSPOOF 0x200 | 907 | #define QLCNIC_MACSPOOF 0x200 |
908 | #define QLCNIC_MAC_OVERRIDE_DISABLED 0x400 | ||
908 | #define QLCNIC_IS_MSI_FAMILY(adapter) \ | 909 | #define QLCNIC_IS_MSI_FAMILY(adapter) \ |
909 | ((adapter)->flags & (QLCNIC_MSI_ENABLED | QLCNIC_MSIX_ENABLED)) | 910 | ((adapter)->flags & (QLCNIC_MSI_ENABLED | QLCNIC_MSIX_ENABLED)) |
910 | 911 | ||
@@ -1060,7 +1061,7 @@ struct qlcnic_npar_info { | |||
1060 | u8 enable_pm; | 1061 | u8 enable_pm; |
1061 | u8 dest_npar; | 1062 | u8 dest_npar; |
1062 | u8 discard_tagged; | 1063 | u8 discard_tagged; |
1063 | u8 mac_learning; | 1064 | u8 mac_override; |
1064 | u8 mac_anti_spoof; | 1065 | u8 mac_anti_spoof; |
1065 | u8 promisc_mode; | 1066 | u8 promisc_mode; |
1066 | u8 offload_flags; | 1067 | u8 offload_flags; |
@@ -1134,7 +1135,7 @@ struct qlcnic_esw_func_cfg { | |||
1134 | u8 host_vlan_tag; | 1135 | u8 host_vlan_tag; |
1135 | u8 promisc_mode; | 1136 | u8 promisc_mode; |
1136 | u8 discard_tagged; | 1137 | u8 discard_tagged; |
1137 | u8 mac_learning; | 1138 | u8 mac_override; |
1138 | u8 mac_anti_spoof; | 1139 | u8 mac_anti_spoof; |
1139 | u8 offload_flags; | 1140 | u8 offload_flags; |
1140 | u8 reserved[5]; | 1141 | u8 reserved[5]; |
diff --git a/drivers/net/qlcnic/qlcnic_ctx.c b/drivers/net/qlcnic/qlcnic_ctx.c index bd4b06b2d86d..95a821e0b66f 100644 --- a/drivers/net/qlcnic/qlcnic_ctx.c +++ b/drivers/net/qlcnic/qlcnic_ctx.c | |||
@@ -1100,10 +1100,11 @@ __qlcnic_get_eswitch_port_config(struct qlcnic_adapter *adapter, | |||
1100 | *arg1 = QLCRD32(adapter, QLCNIC_ARG1_CRB_OFFSET); | 1100 | *arg1 = QLCRD32(adapter, QLCNIC_ARG1_CRB_OFFSET); |
1101 | *arg2 = QLCRD32(adapter, QLCNIC_ARG2_CRB_OFFSET); | 1101 | *arg2 = QLCRD32(adapter, QLCNIC_ARG2_CRB_OFFSET); |
1102 | dev_info(&adapter->pdev->dev, | 1102 | dev_info(&adapter->pdev->dev, |
1103 | "eSwitch port config for pci func%d\n", pci_func); | 1103 | "eSwitch port config for pci func %d\n", pci_func); |
1104 | } else { | 1104 | } else { |
1105 | dev_err(&adapter->pdev->dev, | 1105 | dev_err(&adapter->pdev->dev, |
1106 | "Failed to get eswitch port config%d\n", pci_func); | 1106 | "Failed to get eswitch port config for pci func %d\n", |
1107 | pci_func); | ||
1107 | } | 1108 | } |
1108 | return err; | 1109 | return err; |
1109 | } | 1110 | } |
@@ -1142,7 +1143,7 @@ int qlcnic_config_switch_port(struct qlcnic_adapter *adapter, | |||
1142 | arg1 &= ~BIT_4; | 1143 | arg1 &= ~BIT_4; |
1143 | if (!(esw_cfg->promisc_mode)) | 1144 | if (!(esw_cfg->promisc_mode)) |
1144 | arg1 &= ~BIT_6; | 1145 | arg1 &= ~BIT_6; |
1145 | if (!(esw_cfg->mac_learning)) | 1146 | if (!(esw_cfg->mac_override)) |
1146 | arg1 &= ~BIT_7; | 1147 | arg1 &= ~BIT_7; |
1147 | if (!(esw_cfg->mac_anti_spoof)) | 1148 | if (!(esw_cfg->mac_anti_spoof)) |
1148 | arg2 &= ~BIT_0; | 1149 | arg2 &= ~BIT_0; |
@@ -1175,10 +1176,10 @@ int qlcnic_config_switch_port(struct qlcnic_adapter *adapter, | |||
1175 | 1176 | ||
1176 | if (err != QLCNIC_RCODE_SUCCESS) { | 1177 | if (err != QLCNIC_RCODE_SUCCESS) { |
1177 | dev_err(&adapter->pdev->dev, | 1178 | dev_err(&adapter->pdev->dev, |
1178 | "Failed to configure eswitch port%d\n", pci_func); | 1179 | "Failed to configure eswitch pci func %d\n", pci_func); |
1179 | } else { | 1180 | } else { |
1180 | dev_info(&adapter->pdev->dev, | 1181 | dev_info(&adapter->pdev->dev, |
1181 | "Configured eSwitch for port %d\n", pci_func); | 1182 | "Configured eSwitch for pci func %d\n", pci_func); |
1182 | } | 1183 | } |
1183 | 1184 | ||
1184 | return err; | 1185 | return err; |
@@ -1202,7 +1203,7 @@ qlcnic_get_eswitch_port_config(struct qlcnic_adapter *adapter, | |||
1202 | esw_cfg->discard_tagged = !!(arg1 & BIT_4); | 1203 | esw_cfg->discard_tagged = !!(arg1 & BIT_4); |
1203 | esw_cfg->host_vlan_tag = !!(arg1 & BIT_5); | 1204 | esw_cfg->host_vlan_tag = !!(arg1 & BIT_5); |
1204 | esw_cfg->promisc_mode = !!(arg1 & BIT_6); | 1205 | esw_cfg->promisc_mode = !!(arg1 & BIT_6); |
1205 | esw_cfg->mac_learning = !!(arg1 & BIT_7); | 1206 | esw_cfg->mac_override = !!(arg1 & BIT_7); |
1206 | esw_cfg->vlan_id = LSW(arg1 >> 16); | 1207 | esw_cfg->vlan_id = LSW(arg1 >> 16); |
1207 | esw_cfg->mac_anti_spoof = (arg2 & 0x1); | 1208 | esw_cfg->mac_anti_spoof = (arg2 & 0x1); |
1208 | esw_cfg->offload_flags = ((arg2 >> 1) & 0x7); | 1209 | esw_cfg->offload_flags = ((arg2 >> 1) & 0x7); |
diff --git a/drivers/net/qlcnic/qlcnic_main.c b/drivers/net/qlcnic/qlcnic_main.c index 789fe817cfca..130f4dbe2f4b 100644 --- a/drivers/net/qlcnic/qlcnic_main.c +++ b/drivers/net/qlcnic/qlcnic_main.c | |||
@@ -343,6 +343,9 @@ static int qlcnic_set_mac(struct net_device *netdev, void *p) | |||
343 | struct qlcnic_adapter *adapter = netdev_priv(netdev); | 343 | struct qlcnic_adapter *adapter = netdev_priv(netdev); |
344 | struct sockaddr *addr = p; | 344 | struct sockaddr *addr = p; |
345 | 345 | ||
346 | if ((adapter->flags & QLCNIC_MAC_OVERRIDE_DISABLED)) | ||
347 | return -EOPNOTSUPP; | ||
348 | |||
346 | if (!is_valid_ether_addr(addr->sa_data)) | 349 | if (!is_valid_ether_addr(addr->sa_data)) |
347 | return -EINVAL; | 350 | return -EINVAL; |
348 | 351 | ||
@@ -741,10 +744,14 @@ qlcnic_set_eswitch_port_features(struct qlcnic_adapter *adapter, | |||
741 | struct qlcnic_esw_func_cfg *esw_cfg) | 744 | struct qlcnic_esw_func_cfg *esw_cfg) |
742 | { | 745 | { |
743 | adapter->flags &= ~QLCNIC_MACSPOOF; | 746 | adapter->flags &= ~QLCNIC_MACSPOOF; |
747 | adapter->flags &= ~QLCNIC_MAC_OVERRIDE_DISABLED; | ||
744 | 748 | ||
745 | if (esw_cfg->mac_anti_spoof) | 749 | if (esw_cfg->mac_anti_spoof) |
746 | adapter->flags |= QLCNIC_MACSPOOF; | 750 | adapter->flags |= QLCNIC_MACSPOOF; |
747 | 751 | ||
752 | if (!esw_cfg->mac_override) | ||
753 | adapter->flags |= QLCNIC_MAC_OVERRIDE_DISABLED; | ||
754 | |||
748 | qlcnic_set_netdev_features(adapter, esw_cfg); | 755 | qlcnic_set_netdev_features(adapter, esw_cfg); |
749 | } | 756 | } |
750 | 757 | ||
@@ -862,14 +869,14 @@ qlcnic_set_default_offload_settings(struct qlcnic_adapter *adapter) | |||
862 | memset(&esw_cfg, 0, sizeof(struct qlcnic_esw_func_cfg)); | 869 | memset(&esw_cfg, 0, sizeof(struct qlcnic_esw_func_cfg)); |
863 | esw_cfg.pci_func = i; | 870 | esw_cfg.pci_func = i; |
864 | esw_cfg.offload_flags = BIT_0; | 871 | esw_cfg.offload_flags = BIT_0; |
865 | esw_cfg.mac_learning = BIT_0; | 872 | esw_cfg.mac_override = BIT_0; |
866 | if (adapter->capabilities & QLCNIC_FW_CAPABILITY_TSO) | 873 | if (adapter->capabilities & QLCNIC_FW_CAPABILITY_TSO) |
867 | esw_cfg.offload_flags |= (BIT_1 | BIT_2); | 874 | esw_cfg.offload_flags |= (BIT_1 | BIT_2); |
868 | if (qlcnic_config_switch_port(adapter, &esw_cfg)) | 875 | if (qlcnic_config_switch_port(adapter, &esw_cfg)) |
869 | return -EIO; | 876 | return -EIO; |
870 | npar = &adapter->npars[i]; | 877 | npar = &adapter->npars[i]; |
871 | npar->pvid = esw_cfg.vlan_id; | 878 | npar->pvid = esw_cfg.vlan_id; |
872 | npar->mac_learning = esw_cfg.offload_flags; | 879 | npar->mac_override = esw_cfg.mac_override; |
873 | npar->mac_anti_spoof = esw_cfg.mac_anti_spoof; | 880 | npar->mac_anti_spoof = esw_cfg.mac_anti_spoof; |
874 | npar->discard_tagged = esw_cfg.discard_tagged; | 881 | npar->discard_tagged = esw_cfg.discard_tagged; |
875 | npar->promisc_mode = esw_cfg.promisc_mode; | 882 | npar->promisc_mode = esw_cfg.promisc_mode; |
@@ -887,7 +894,7 @@ qlcnic_reset_eswitch_config(struct qlcnic_adapter *adapter, | |||
887 | esw_cfg.op_mode = QLCNIC_PORT_DEFAULTS; | 894 | esw_cfg.op_mode = QLCNIC_PORT_DEFAULTS; |
888 | esw_cfg.pci_func = pci_func; | 895 | esw_cfg.pci_func = pci_func; |
889 | esw_cfg.vlan_id = npar->pvid; | 896 | esw_cfg.vlan_id = npar->pvid; |
890 | esw_cfg.mac_learning = npar->mac_learning; | 897 | esw_cfg.mac_override = npar->mac_override; |
891 | esw_cfg.discard_tagged = npar->discard_tagged; | 898 | esw_cfg.discard_tagged = npar->discard_tagged; |
892 | esw_cfg.mac_anti_spoof = npar->mac_anti_spoof; | 899 | esw_cfg.mac_anti_spoof = npar->mac_anti_spoof; |
893 | esw_cfg.offload_flags = npar->offload_flags; | 900 | esw_cfg.offload_flags = npar->offload_flags; |
@@ -3042,6 +3049,10 @@ qlcnicvf_start_firmware(struct qlcnic_adapter *adapter) | |||
3042 | 3049 | ||
3043 | qlcnic_check_options(adapter); | 3050 | qlcnic_check_options(adapter); |
3044 | 3051 | ||
3052 | err = qlcnic_set_eswitch_port_config(adapter); | ||
3053 | if (err) | ||
3054 | return err; | ||
3055 | |||
3045 | adapter->need_fw_reset = 0; | 3056 | adapter->need_fw_reset = 0; |
3046 | 3057 | ||
3047 | return err; | 3058 | return err; |
@@ -3397,8 +3408,10 @@ validate_esw_config(struct qlcnic_adapter *adapter, | |||
3397 | switch (esw_cfg[i].op_mode) { | 3408 | switch (esw_cfg[i].op_mode) { |
3398 | case QLCNIC_PORT_DEFAULTS: | 3409 | case QLCNIC_PORT_DEFAULTS: |
3399 | if (QLC_DEV_GET_DRV(op_mode, pci_func) != | 3410 | if (QLC_DEV_GET_DRV(op_mode, pci_func) != |
3400 | QLCNIC_NON_PRIV_FUNC) | 3411 | QLCNIC_NON_PRIV_FUNC) { |
3401 | esw_cfg[i].mac_anti_spoof = 0; | 3412 | esw_cfg[i].mac_anti_spoof = 0; |
3413 | esw_cfg[i].mac_override = 1; | ||
3414 | } | ||
3402 | break; | 3415 | break; |
3403 | case QLCNIC_ADD_VLAN: | 3416 | case QLCNIC_ADD_VLAN: |
3404 | if (!IS_VALID_VLAN(esw_cfg[i].vlan_id)) | 3417 | if (!IS_VALID_VLAN(esw_cfg[i].vlan_id)) |
@@ -3474,7 +3487,7 @@ qlcnic_sysfs_write_esw_config(struct file *file, struct kobject *kobj, | |||
3474 | switch (esw_cfg[i].op_mode) { | 3487 | switch (esw_cfg[i].op_mode) { |
3475 | case QLCNIC_PORT_DEFAULTS: | 3488 | case QLCNIC_PORT_DEFAULTS: |
3476 | npar->promisc_mode = esw_cfg[i].promisc_mode; | 3489 | npar->promisc_mode = esw_cfg[i].promisc_mode; |
3477 | npar->mac_learning = esw_cfg[i].mac_learning; | 3490 | npar->mac_override = esw_cfg[i].mac_override; |
3478 | npar->offload_flags = esw_cfg[i].offload_flags; | 3491 | npar->offload_flags = esw_cfg[i].offload_flags; |
3479 | npar->mac_anti_spoof = esw_cfg[i].mac_anti_spoof; | 3492 | npar->mac_anti_spoof = esw_cfg[i].mac_anti_spoof; |
3480 | npar->discard_tagged = esw_cfg[i].discard_tagged; | 3493 | npar->discard_tagged = esw_cfg[i].discard_tagged; |