|
@@ -1769,10 +1769,21 @@ static int igb_set_features(struct net_device *netdev,
|
|
netdev_features_t features)
|
|
netdev_features_t features)
|
|
{
|
|
{
|
|
netdev_features_t changed = netdev->features ^ features;
|
|
netdev_features_t changed = netdev->features ^ features;
|
|
|
|
+ struct igb_adapter *adapter = netdev_priv(netdev);
|
|
|
|
|
|
if (changed & NETIF_F_HW_VLAN_RX)
|
|
if (changed & NETIF_F_HW_VLAN_RX)
|
|
igb_vlan_mode(netdev, features);
|
|
igb_vlan_mode(netdev, features);
|
|
|
|
|
|
|
|
+ if (!(changed & NETIF_F_RXALL))
|
|
|
|
+ return 0;
|
|
|
|
+
|
|
|
|
+ netdev->features = features;
|
|
|
|
+
|
|
|
|
+ if (netif_running(netdev))
|
|
|
|
+ igb_reinit_locked(adapter);
|
|
|
|
+ else
|
|
|
|
+ igb_reset(adapter);
|
|
|
|
+
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1954,6 +1965,7 @@ static int __devinit igb_probe(struct pci_dev *pdev,
|
|
|
|
|
|
/* copy netdev features into list of user selectable features */
|
|
/* copy netdev features into list of user selectable features */
|
|
netdev->hw_features |= netdev->features;
|
|
netdev->hw_features |= netdev->features;
|
|
|
|
+ netdev->hw_features |= NETIF_F_RXALL;
|
|
|
|
|
|
/* set this bit last since it cannot be part of hw_features */
|
|
/* set this bit last since it cannot be part of hw_features */
|
|
netdev->features |= NETIF_F_HW_VLAN_FILTER;
|
|
netdev->features |= NETIF_F_HW_VLAN_FILTER;
|
|
@@ -3005,6 +3017,22 @@ void igb_setup_rctl(struct igb_adapter *adapter)
|
|
wr32(E1000_QDE, ALL_QUEUES);
|
|
wr32(E1000_QDE, ALL_QUEUES);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /* This is useful for sniffing bad packets. */
|
|
|
|
+ if (adapter->netdev->features & NETIF_F_RXALL) {
|
|
|
|
+ /* UPE and MPE will be handled by normal PROMISC logic
|
|
|
|
+ * in e1000e_set_rx_mode */
|
|
|
|
+ rctl |= (E1000_RCTL_SBP | /* Receive bad packets */
|
|
|
|
+ E1000_RCTL_BAM | /* RX All Bcast Pkts */
|
|
|
|
+ E1000_RCTL_PMCF); /* RX All MAC Ctrl Pkts */
|
|
|
|
+
|
|
|
|
+ rctl &= ~(E1000_RCTL_VFE | /* Disable VLAN filter */
|
|
|
|
+ E1000_RCTL_DPF | /* Allow filtered pause */
|
|
|
|
+ E1000_RCTL_CFIEN); /* Dis VLAN CFIEN Filter */
|
|
|
|
+ /* Do not mess with E1000_CTRL_VME, it affects transmit as well,
|
|
|
|
+ * and that breaks VLANs.
|
|
|
|
+ */
|
|
|
|
+ }
|
|
|
|
+
|
|
wr32(E1000_RCTL, rctl);
|
|
wr32(E1000_RCTL, rctl);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -6102,8 +6130,9 @@ static bool igb_clean_rx_irq(struct igb_q_vector *q_vector, int budget)
|
|
goto next_desc;
|
|
goto next_desc;
|
|
}
|
|
}
|
|
|
|
|
|
- if (igb_test_staterr(rx_desc,
|
|
|
|
- E1000_RXDEXT_ERR_FRAME_ERR_MASK)) {
|
|
|
|
|
|
+ if (unlikely((igb_test_staterr(rx_desc,
|
|
|
|
+ E1000_RXDEXT_ERR_FRAME_ERR_MASK))
|
|
|
|
+ && !(rx_ring->netdev->features & NETIF_F_RXALL))) {
|
|
dev_kfree_skb_any(skb);
|
|
dev_kfree_skb_any(skb);
|
|
goto next_desc;
|
|
goto next_desc;
|
|
}
|
|
}
|