diff options
author | Manish Chopra <manish.chopra@qlogic.com> | 2013-08-30 13:51:16 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-08-31 22:34:43 -0400 |
commit | 991ca269ed71b2b7aee27f5cb8bf64b689cc20bf (patch) | |
tree | aa98ffd7e41853d8984f4579e01461c9d9a47054 | |
parent | eb3c0d83cc78361a28e52e514a7095fdbf771e7e (diff) |
qlcnic: Enhance PVID handling for 84xx adapters
o PF driver should not indicate PVID configuration to VF driver.
As adapter supports VLAN stripping, VF driver should stay agnostic
to any PVID configuration.
o Return "QLC_NO_VLAN_MODE(= 0)" to VFD when PVID is configured.
VF driver should be in no VLAN configuration mode.
Signed-off-by: Manish Chopra <manish.chopra@qlogic.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/ethernet/qlogic/qlcnic/qlcnic.h | 8 | ||||
-rw-r--r-- | drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c | 15 | ||||
-rw-r--r-- | drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c | 9 |
3 files changed, 22 insertions, 10 deletions
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h b/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h index 22bd425cfd84..16df5fec0333 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h | |||
@@ -2069,6 +2069,14 @@ static inline bool qlcnic_82xx_check(struct qlcnic_adapter *adapter) | |||
2069 | return (device == PCI_DEVICE_ID_QLOGIC_QLE824X) ? true : false; | 2069 | return (device == PCI_DEVICE_ID_QLOGIC_QLE824X) ? true : false; |
2070 | } | 2070 | } |
2071 | 2071 | ||
2072 | static inline bool qlcnic_84xx_check(struct qlcnic_adapter *adapter) | ||
2073 | { | ||
2074 | unsigned short device = adapter->pdev->device; | ||
2075 | |||
2076 | return ((device == PCI_DEVICE_ID_QLOGIC_QLE844X) || | ||
2077 | (device == PCI_DEVICE_ID_QLOGIC_VF_QLE844X)) ? true : false; | ||
2078 | } | ||
2079 | |||
2072 | static inline bool qlcnic_83xx_check(struct qlcnic_adapter *adapter) | 2080 | static inline bool qlcnic_83xx_check(struct qlcnic_adapter *adapter) |
2073 | { | 2081 | { |
2074 | unsigned short device = adapter->pdev->device; | 2082 | unsigned short device = adapter->pdev->device; |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c index 26f9aa66403d..652cc13c5023 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c | |||
@@ -398,14 +398,10 @@ int qlcnic_sriov_get_vf_vport_info(struct qlcnic_adapter *adapter, | |||
398 | } | 398 | } |
399 | 399 | ||
400 | static int qlcnic_sriov_set_pvid_mode(struct qlcnic_adapter *adapter, | 400 | static int qlcnic_sriov_set_pvid_mode(struct qlcnic_adapter *adapter, |
401 | struct qlcnic_cmd_args *cmd, u32 cap) | 401 | struct qlcnic_cmd_args *cmd) |
402 | { | 402 | { |
403 | if (cap & QLC_83XX_PVID_STRIP_CAPABILITY) { | 403 | adapter->rx_pvid = MSW(cmd->rsp.arg[1]) & 0xffff; |
404 | adapter->rx_pvid = 0; | 404 | adapter->flags &= ~QLCNIC_TAGGING_ENABLED; |
405 | } else { | ||
406 | adapter->rx_pvid = (cmd->rsp.arg[1] >> 16) & 0xffff; | ||
407 | adapter->flags &= ~QLCNIC_TAGGING_ENABLED; | ||
408 | } | ||
409 | return 0; | 405 | return 0; |
410 | } | 406 | } |
411 | 407 | ||
@@ -441,9 +437,8 @@ static int qlcnic_sriov_get_vf_acl(struct qlcnic_adapter *adapter, | |||
441 | { | 437 | { |
442 | struct qlcnic_sriov *sriov = adapter->ahw->sriov; | 438 | struct qlcnic_sriov *sriov = adapter->ahw->sriov; |
443 | struct qlcnic_cmd_args cmd; | 439 | struct qlcnic_cmd_args cmd; |
444 | int ret, cap; | 440 | int ret = 0; |
445 | 441 | ||
446 | cap = info->capabilities; | ||
447 | ret = qlcnic_sriov_alloc_bc_mbx_args(&cmd, QLCNIC_BC_CMD_GET_ACL); | 442 | ret = qlcnic_sriov_alloc_bc_mbx_args(&cmd, QLCNIC_BC_CMD_GET_ACL); |
448 | if (ret) | 443 | if (ret) |
449 | return ret; | 444 | return ret; |
@@ -459,7 +454,7 @@ static int qlcnic_sriov_get_vf_acl(struct qlcnic_adapter *adapter, | |||
459 | ret = qlcnic_sriov_set_guest_vlan_mode(adapter, &cmd); | 454 | ret = qlcnic_sriov_set_guest_vlan_mode(adapter, &cmd); |
460 | break; | 455 | break; |
461 | case QLC_PVID_MODE: | 456 | case QLC_PVID_MODE: |
462 | ret = qlcnic_sriov_set_pvid_mode(adapter, &cmd, cap); | 457 | ret = qlcnic_sriov_set_pvid_mode(adapter, &cmd); |
463 | break; | 458 | break; |
464 | } | 459 | } |
465 | } | 460 | } |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c index 2d6faf0fcc10..95b7710ecfa5 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c | |||
@@ -1183,10 +1183,19 @@ static int qlcnic_sriov_pf_get_acl_cmd(struct qlcnic_bc_trans *trans, | |||
1183 | struct qlcnic_vf_info *vf = trans->vf; | 1183 | struct qlcnic_vf_info *vf = trans->vf; |
1184 | struct qlcnic_vport *vp = vf->vp; | 1184 | struct qlcnic_vport *vp = vf->vp; |
1185 | u8 cmd_op, mode = vp->vlan_mode; | 1185 | u8 cmd_op, mode = vp->vlan_mode; |
1186 | struct qlcnic_adapter *adapter; | ||
1187 | |||
1188 | adapter = vf->adapter; | ||
1186 | 1189 | ||
1187 | cmd_op = trans->req_hdr->cmd_op; | 1190 | cmd_op = trans->req_hdr->cmd_op; |
1188 | cmd->rsp.arg[0] |= 1 << 25; | 1191 | cmd->rsp.arg[0] |= 1 << 25; |
1189 | 1192 | ||
1193 | /* For 84xx adapter in case of PVID , PFD should send vlan mode as | ||
1194 | * QLC_NO_VLAN_MODE to VFD which is zero in mailbox response | ||
1195 | */ | ||
1196 | if (qlcnic_84xx_check(adapter) && mode == QLC_PVID_MODE) | ||
1197 | return 0; | ||
1198 | |||
1190 | switch (mode) { | 1199 | switch (mode) { |
1191 | case QLC_GUEST_VLAN_MODE: | 1200 | case QLC_GUEST_VLAN_MODE: |
1192 | cmd->rsp.arg[1] = mode | 1 << 8; | 1201 | cmd->rsp.arg[1] = mode | 1 << 8; |