qlcnic: Enhance PVID handling for 84xx adapters
authorManish Chopra <manish.chopra@qlogic.com>
Fri, 30 Aug 2013 17:51:16 +0000 (13:51 -0400)
committerDavid S. Miller <davem@davemloft.net>
Sun, 1 Sep 2013 02:34:43 +0000 (22:34 -0400)
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>
drivers/net/ethernet/qlogic/qlcnic/qlcnic.h
drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c
drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c

index 22bd425cfd84ebef33d7222ed8583de2b6598923..16df5fec0333380783a5513fce5944b23eae96bd 100644 (file)
@@ -2069,6 +2069,14 @@ static inline bool qlcnic_82xx_check(struct qlcnic_adapter *adapter)
        return (device == PCI_DEVICE_ID_QLOGIC_QLE824X) ? true : false;
 }
 
+static inline bool qlcnic_84xx_check(struct qlcnic_adapter *adapter)
+{
+       unsigned short device = adapter->pdev->device;
+
+       return ((device == PCI_DEVICE_ID_QLOGIC_QLE844X) ||
+               (device == PCI_DEVICE_ID_QLOGIC_VF_QLE844X)) ? true : false;
+}
+
 static inline bool qlcnic_83xx_check(struct qlcnic_adapter *adapter)
 {
        unsigned short device = adapter->pdev->device;
index 26f9aa66403d7ebb36fc58b6e052cc01a45e5890..652cc13c5023ccfca09bed0978b166914e97a9a8 100644 (file)
@@ -398,14 +398,10 @@ int qlcnic_sriov_get_vf_vport_info(struct qlcnic_adapter *adapter,
 }
 
 static int qlcnic_sriov_set_pvid_mode(struct qlcnic_adapter *adapter,
-                                     struct qlcnic_cmd_args *cmd, u32 cap)
+                                     struct qlcnic_cmd_args *cmd)
 {
-       if (cap & QLC_83XX_PVID_STRIP_CAPABILITY) {
-               adapter->rx_pvid = 0;
-       } else {
-               adapter->rx_pvid = (cmd->rsp.arg[1] >> 16) & 0xffff;
-               adapter->flags &= ~QLCNIC_TAGGING_ENABLED;
-       }
+       adapter->rx_pvid = MSW(cmd->rsp.arg[1]) & 0xffff;
+       adapter->flags &= ~QLCNIC_TAGGING_ENABLED;
        return 0;
 }
 
@@ -441,9 +437,8 @@ static int qlcnic_sriov_get_vf_acl(struct qlcnic_adapter *adapter,
 {
        struct qlcnic_sriov *sriov = adapter->ahw->sriov;
        struct qlcnic_cmd_args cmd;
-       int ret, cap;
+       int ret = 0;
 
-       cap = info->capabilities;
        ret = qlcnic_sriov_alloc_bc_mbx_args(&cmd, QLCNIC_BC_CMD_GET_ACL);
        if (ret)
                return ret;
@@ -459,7 +454,7 @@ static int qlcnic_sriov_get_vf_acl(struct qlcnic_adapter *adapter,
                        ret = qlcnic_sriov_set_guest_vlan_mode(adapter, &cmd);
                        break;
                case QLC_PVID_MODE:
-                       ret = qlcnic_sriov_set_pvid_mode(adapter, &cmd, cap);
+                       ret = qlcnic_sriov_set_pvid_mode(adapter, &cmd);
                        break;
                }
        }
index 2d6faf0fcc10764091df908562be65da82994200..95b7710ecfa54442dd264d3e9f9ecb8749fecdbd 100644 (file)
@@ -1183,10 +1183,19 @@ static int qlcnic_sriov_pf_get_acl_cmd(struct qlcnic_bc_trans *trans,
        struct qlcnic_vf_info *vf = trans->vf;
        struct qlcnic_vport *vp = vf->vp;
        u8 cmd_op, mode = vp->vlan_mode;
+       struct qlcnic_adapter *adapter;
+
+       adapter = vf->adapter;
 
        cmd_op = trans->req_hdr->cmd_op;
        cmd->rsp.arg[0] |= 1 << 25;
 
+       /* For 84xx adapter in case of PVID , PFD should send vlan mode as
+        * QLC_NO_VLAN_MODE to VFD which is zero in mailbox response
+        */
+       if (qlcnic_84xx_check(adapter) && mode == QLC_PVID_MODE)
+               return 0;
+
        switch (mode) {
        case QLC_GUEST_VLAN_MODE:
                cmd->rsp.arg[1] = mode | 1 << 8;