]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
ixgbe: SR-IOV: dynamic IEEE DCBx default priority changes
authorJohn Fastabend <john.r.fastabend@intel.com>
Fri, 19 Oct 2012 02:34:34 +0000 (02:34 +0000)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Sat, 19 Jan 2013 11:35:15 +0000 (03:35 -0800)
IEEE DCBx has a mechanism to change the default user priority. In
the normal case the OS can handle this via cgroups, iptables, socket,
options etc.

With SR-IOV and direct assigned VF devices the default priority
needs to be set by the PF device so the inserted VLAN tag is
correct.

Signed-off-by: John Fastabend <john.r.fastabend@intel.com>
Tested-by: Phil Schmitt <phillip.j.schmitt@intel.com>
Tested-by: Marcus Dennis <marcusx.e.dennis@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/ixgbe/ixgbe_dcb_nl.c
drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c
drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.h

index f1e002d5fa8f5dfb53c9d865dab1fd558bf7ea7b..6718fb42ce1a60e8f59dcd1bcd5e69753d7edc9e 100644 (file)
@@ -30,6 +30,7 @@
 #include <linux/dcbnl.h>
 #include "ixgbe_dcb_82598.h"
 #include "ixgbe_dcb_82599.h"
+#include "ixgbe_sriov.h"
 
 /* Callbacks for DCB netlink in the kernel */
 #define BIT_DCB_MODE   0x01
@@ -643,9 +644,11 @@ static int ixgbe_dcbnl_ieee_setapp(struct net_device *dev,
                return err;
 
        err = dcb_ieee_setapp(dev, app);
+       if (err)
+               return err;
 
 #ifdef IXGBE_FCOE
-       if (!err && app->selector == IEEE_8021QAZ_APP_SEL_ETHERTYPE &&
+       if (app->selector == IEEE_8021QAZ_APP_SEL_ETHERTYPE &&
            app->protocol == ETH_P_FCOE) {
                u8 app_mask = dcb_ieee_getapp_mask(dev, app);
 
@@ -656,6 +659,23 @@ static int ixgbe_dcbnl_ieee_setapp(struct net_device *dev,
                ixgbe_dcbnl_devreset(dev);
        }
 #endif
+
+       /* VF devices should use default UP when available */
+       if (app->selector == IEEE_8021QAZ_APP_SEL_ETHERTYPE &&
+           app->protocol == 0) {
+               int vf;
+
+               adapter->default_up = app->priority;
+
+               for (vf = 0; vf < adapter->num_vfs; vf++) {
+                       struct vf_data_storage *vfinfo = &adapter->vfinfo[vf];
+
+                       if (!vfinfo->pf_qos)
+                               ixgbe_set_vmvir(adapter, vfinfo->pf_vlan,
+                                               app->priority, vf);
+               }
+       }
+
        return 0;
 }
 
@@ -683,6 +703,24 @@ static int ixgbe_dcbnl_ieee_delapp(struct net_device *dev,
                ixgbe_dcbnl_devreset(dev);
        }
 #endif
+       /* IF default priority is being removed clear VF default UP */
+       if (app->selector == IEEE_8021QAZ_APP_SEL_ETHERTYPE &&
+           app->protocol == 0 && adapter->default_up == app->priority) {
+               int vf;
+               long unsigned int app_mask = dcb_ieee_getapp_mask(dev, app);
+               int qos = app_mask ? find_first_bit(&app_mask, 8) : 0;
+
+               adapter->default_up = qos;
+
+               for (vf = 0; vf < adapter->num_vfs; vf++) {
+                       struct vf_data_storage *vfinfo = &adapter->vfinfo[vf];
+
+                       if (!vfinfo->pf_qos)
+                               ixgbe_set_vmvir(adapter, vfinfo->pf_vlan,
+                                               qos, vf);
+               }
+       }
+
        return err;
 }
 
index 85cddac673ef41716d9a34f027b1bcbb0cfb903d..647734b73202af5c1acf9c19df8e11856e9f5888 100644 (file)
@@ -447,15 +447,6 @@ static void ixgbe_set_vmolr(struct ixgbe_hw *hw, u32 vf, bool aupe)
        IXGBE_WRITE_REG(hw, IXGBE_VMOLR(vf), vmolr);
 }
 
-static void ixgbe_set_vmvir(struct ixgbe_adapter *adapter,
-                           u16 vid, u16 qos, u32 vf)
-{
-       struct ixgbe_hw *hw = &adapter->hw;
-       u32 vmvir = vid | (qos << VLAN_PRIO_SHIFT) | IXGBE_VMVIR_VLANA_DEFAULT;
-
-       IXGBE_WRITE_REG(hw, IXGBE_VMVIR(vf), vmvir);
-}
-
 static void ixgbe_clear_vmvir(struct ixgbe_adapter *adapter, u32 vf)
 {
        struct ixgbe_hw *hw = &adapter->hw;
index 1be1d30e4e78e15aef20d281aa9a2ca7066ca301..21bc1dd1d33e0b0d564e3922de07d5e2f405c102 100644 (file)
@@ -47,6 +47,14 @@ void ixgbe_enable_sriov(struct ixgbe_adapter *adapter,
                        const struct ixgbe_info *ii);
 #endif
 
+static inline void ixgbe_set_vmvir(struct ixgbe_adapter *adapter,
+                                  u16 vid, u16 qos, u32 vf)
+{
+       struct ixgbe_hw *hw = &adapter->hw;
+       u32 vmvir = vid | (qos << VLAN_PRIO_SHIFT) | IXGBE_VMVIR_VLANA_DEFAULT;
+
+       IXGBE_WRITE_REG(hw, IXGBE_VMVIR(vf), vmvir);
+}
 
 #endif /* _IXGBE_SRIOV_H_ */