|
@@ -60,9 +60,9 @@
|
|
|
#include <linux/i2c.h>
|
|
|
#include "igb.h"
|
|
|
|
|
|
-#define MAJ 4
|
|
|
-#define MIN 1
|
|
|
-#define BUILD 2
|
|
|
+#define MAJ 5
|
|
|
+#define MIN 0
|
|
|
+#define BUILD 3
|
|
|
#define DRV_VERSION __stringify(MAJ) "." __stringify(MIN) "." \
|
|
|
__stringify(BUILD) "-k"
|
|
|
char igb_driver_name[] = "igb";
|
|
@@ -180,7 +180,6 @@ static void igb_check_vf_rate_limit(struct igb_adapter *);
|
|
|
|
|
|
#ifdef CONFIG_PCI_IOV
|
|
|
static int igb_vf_configure(struct igb_adapter *adapter, int vf);
|
|
|
-static bool igb_vfs_are_assigned(struct igb_adapter *adapter);
|
|
|
#endif
|
|
|
|
|
|
#ifdef CONFIG_PM
|
|
@@ -2402,7 +2401,7 @@ static int igb_disable_sriov(struct pci_dev *pdev)
|
|
|
/* reclaim resources allocated to VFs */
|
|
|
if (adapter->vf_data) {
|
|
|
/* disable iov and allow time for transactions to clear */
|
|
|
- if (igb_vfs_are_assigned(adapter)) {
|
|
|
+ if (pci_vfs_assigned(pdev)) {
|
|
|
dev_warn(&pdev->dev,
|
|
|
"Cannot deallocate SR-IOV virtual functions while they are assigned - VFs will not be deallocated\n");
|
|
|
return -EPERM;
|
|
@@ -3737,6 +3736,10 @@ static void igb_set_rx_mode(struct net_device *netdev)
|
|
|
rctl &= ~(E1000_RCTL_UPE | E1000_RCTL_MPE | E1000_RCTL_VFE);
|
|
|
|
|
|
if (netdev->flags & IFF_PROMISC) {
|
|
|
+ u32 mrqc = rd32(E1000_MRQC);
|
|
|
+ /* retain VLAN HW filtering if in VT mode */
|
|
|
+ if (mrqc & E1000_MRQC_ENABLE_VMDQ)
|
|
|
+ rctl |= E1000_RCTL_VFE;
|
|
|
rctl |= (E1000_RCTL_UPE | E1000_RCTL_MPE);
|
|
|
vmolr |= (E1000_VMOLR_ROPE | E1000_VMOLR_MPME);
|
|
|
} else {
|
|
@@ -3902,6 +3905,7 @@ static void igb_watchdog_task(struct work_struct *work)
|
|
|
struct igb_adapter,
|
|
|
watchdog_task);
|
|
|
struct e1000_hw *hw = &adapter->hw;
|
|
|
+ struct e1000_phy_info *phy = &hw->phy;
|
|
|
struct net_device *netdev = adapter->netdev;
|
|
|
u32 link;
|
|
|
int i;
|
|
@@ -3930,6 +3934,11 @@ static void igb_watchdog_task(struct work_struct *work)
|
|
|
(ctrl & E1000_CTRL_RFCE) ? "RX" :
|
|
|
(ctrl & E1000_CTRL_TFCE) ? "TX" : "None");
|
|
|
|
|
|
+ /* check if SmartSpeed worked */
|
|
|
+ igb_check_downshift(hw);
|
|
|
+ if (phy->speed_downgraded)
|
|
|
+ netdev_warn(netdev, "Link Speed was downgraded by SmartSpeed\n");
|
|
|
+
|
|
|
/* check for thermal sensor event */
|
|
|
if (igb_thermal_sensor_event(hw,
|
|
|
E1000_THSTAT_LINK_THROTTLE)) {
|
|
@@ -5242,39 +5251,6 @@ static int igb_vf_configure(struct igb_adapter *adapter, int vf)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static bool igb_vfs_are_assigned(struct igb_adapter *adapter)
|
|
|
-{
|
|
|
- struct pci_dev *pdev = adapter->pdev;
|
|
|
- struct pci_dev *vfdev;
|
|
|
- int dev_id;
|
|
|
-
|
|
|
- switch (adapter->hw.mac.type) {
|
|
|
- case e1000_82576:
|
|
|
- dev_id = IGB_82576_VF_DEV_ID;
|
|
|
- break;
|
|
|
- case e1000_i350:
|
|
|
- dev_id = IGB_I350_VF_DEV_ID;
|
|
|
- break;
|
|
|
- default:
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- /* loop through all the VFs to see if we own any that are assigned */
|
|
|
- vfdev = pci_get_device(PCI_VENDOR_ID_INTEL, dev_id, NULL);
|
|
|
- while (vfdev) {
|
|
|
- /* if we don't own it we don't care */
|
|
|
- if (vfdev->is_virtfn && vfdev->physfn == pdev) {
|
|
|
- /* if it is assigned we cannot release it */
|
|
|
- if (vfdev->dev_flags & PCI_DEV_FLAGS_ASSIGNED)
|
|
|
- return true;
|
|
|
- }
|
|
|
-
|
|
|
- vfdev = pci_get_device(PCI_VENDOR_ID_INTEL, dev_id, vfdev);
|
|
|
- }
|
|
|
-
|
|
|
- return false;
|
|
|
-}
|
|
|
-
|
|
|
#endif
|
|
|
static void igb_ping_all_vfs(struct igb_adapter *adapter)
|
|
|
{
|
|
@@ -5548,12 +5524,75 @@ out:
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
+static int igb_find_vlvf_entry(struct igb_adapter *adapter, int vid)
|
|
|
+{
|
|
|
+ struct e1000_hw *hw = &adapter->hw;
|
|
|
+ int i;
|
|
|
+ u32 reg;
|
|
|
+
|
|
|
+ /* Find the vlan filter for this id */
|
|
|
+ for (i = 0; i < E1000_VLVF_ARRAY_SIZE; i++) {
|
|
|
+ reg = rd32(E1000_VLVF(i));
|
|
|
+ if ((reg & E1000_VLVF_VLANID_ENABLE) &&
|
|
|
+ vid == (reg & E1000_VLVF_VLANID_MASK))
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (i >= E1000_VLVF_ARRAY_SIZE)
|
|
|
+ i = -1;
|
|
|
+
|
|
|
+ return i;
|
|
|
+}
|
|
|
+
|
|
|
static int igb_set_vf_vlan(struct igb_adapter *adapter, u32 *msgbuf, u32 vf)
|
|
|
{
|
|
|
+ struct e1000_hw *hw = &adapter->hw;
|
|
|
int add = (msgbuf[0] & E1000_VT_MSGINFO_MASK) >> E1000_VT_MSGINFO_SHIFT;
|
|
|
int vid = (msgbuf[1] & E1000_VLVF_VLANID_MASK);
|
|
|
+ int err = 0;
|
|
|
+
|
|
|
+ /* If in promiscuous mode we need to make sure the PF also has
|
|
|
+ * the VLAN filter set.
|
|
|
+ */
|
|
|
+ if (add && (adapter->netdev->flags & IFF_PROMISC))
|
|
|
+ err = igb_vlvf_set(adapter, vid, add,
|
|
|
+ adapter->vfs_allocated_count);
|
|
|
+ if (err)
|
|
|
+ goto out;
|
|
|
|
|
|
- return igb_vlvf_set(adapter, vid, add, vf);
|
|
|
+ err = igb_vlvf_set(adapter, vid, add, vf);
|
|
|
+
|
|
|
+ if (err)
|
|
|
+ goto out;
|
|
|
+
|
|
|
+ /* Go through all the checks to see if the VLAN filter should
|
|
|
+ * be wiped completely.
|
|
|
+ */
|
|
|
+ if (!add && (adapter->netdev->flags & IFF_PROMISC)) {
|
|
|
+ u32 vlvf, bits;
|
|
|
+
|
|
|
+ int regndx = igb_find_vlvf_entry(adapter, vid);
|
|
|
+ if (regndx < 0)
|
|
|
+ goto out;
|
|
|
+ /* See if any other pools are set for this VLAN filter
|
|
|
+ * entry other than the PF.
|
|
|
+ */
|
|
|
+ vlvf = bits = rd32(E1000_VLVF(regndx));
|
|
|
+ bits &= 1 << (E1000_VLVF_POOLSEL_SHIFT +
|
|
|
+ adapter->vfs_allocated_count);
|
|
|
+ /* If the filter was removed then ensure PF pool bit
|
|
|
+ * is cleared if the PF only added itself to the pool
|
|
|
+ * because the PF is in promiscuous mode.
|
|
|
+ */
|
|
|
+ if ((vlvf & VLAN_VID_MASK) == vid &&
|
|
|
+ !test_bit(vid, adapter->active_vlans) &&
|
|
|
+ !bits)
|
|
|
+ igb_vlvf_set(adapter, vid, add,
|
|
|
+ adapter->vfs_allocated_count);
|
|
|
+ }
|
|
|
+
|
|
|
+out:
|
|
|
+ return err;
|
|
|
}
|
|
|
|
|
|
static inline void igb_vf_reset(struct igb_adapter *adapter, u32 vf)
|