aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorManish Chopra <manish.chopra@qlogic.com>2013-08-30 13:51:16 -0400
committerDavid S. Miller <davem@davemloft.net>2013-08-31 22:34:43 -0400
commit991ca269ed71b2b7aee27f5cb8bf64b689cc20bf (patch)
treeaa98ffd7e41853d8984f4579e01461c9d9a47054
parenteb3c0d83cc78361a28e52e514a7095fdbf771e7e (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.h8
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c15
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c9
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
2072static 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
2072static inline bool qlcnic_83xx_check(struct qlcnic_adapter *adapter) 2080static 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
400static int qlcnic_sriov_set_pvid_mode(struct qlcnic_adapter *adapter, 400static 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;