aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBen Greear <greearb@candelatech.com>2012-03-06 04:41:58 -0500
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>2012-03-17 04:02:26 -0400
commit89eaefb61dc9170237d95b844dd357338fc7225d (patch)
tree6c921a7344a7bcf7dd26975c978ff4626ebd8e01
parent6b8f092284672c6504ed215052bfee6b7171411e (diff)
igb: Support RX-ALL feature flag.
This allows the NIC to receive all frames available, including those with bad FCS, un-matched vlans, ethernet control frames, and more. Tested by sending frames with bad FCS. Signed-off-by: Ben Greear <greearb@candelatech.com> Tested-by: Jeff Pieper <jeffrey.e.pieper@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
-rw-r--r--drivers/net/ethernet/intel/igb/e1000_defines.h2
-rw-r--r--drivers/net/ethernet/intel/igb/igb_main.c33
2 files changed, 33 insertions, 2 deletions
diff --git a/drivers/net/ethernet/intel/igb/e1000_defines.h b/drivers/net/ethernet/intel/igb/e1000_defines.h
index aed217449f0d..89eb1f85b9fa 100644
--- a/drivers/net/ethernet/intel/igb/e1000_defines.h
+++ b/drivers/net/ethernet/intel/igb/e1000_defines.h
@@ -134,6 +134,8 @@
134#define E1000_RCTL_SZ_256 0x00030000 /* rx buffer size 256 */ 134#define E1000_RCTL_SZ_256 0x00030000 /* rx buffer size 256 */
135#define E1000_RCTL_VFE 0x00040000 /* vlan filter enable */ 135#define E1000_RCTL_VFE 0x00040000 /* vlan filter enable */
136#define E1000_RCTL_CFIEN 0x00080000 /* canonical form enable */ 136#define E1000_RCTL_CFIEN 0x00080000 /* canonical form enable */
137#define E1000_RCTL_DPF 0x00400000 /* Discard Pause Frames */
138#define E1000_RCTL_PMCF 0x00800000 /* pass MAC control frames */
137#define E1000_RCTL_SECRC 0x04000000 /* Strip Ethernet CRC */ 139#define E1000_RCTL_SECRC 0x04000000 /* Strip Ethernet CRC */
138 140
139/* 141/*
diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c
index 99364edf0314..c4902411d749 100644
--- a/drivers/net/ethernet/intel/igb/igb_main.c
+++ b/drivers/net/ethernet/intel/igb/igb_main.c
@@ -1769,10 +1769,21 @@ static int igb_set_features(struct net_device *netdev,
1769 netdev_features_t features) 1769 netdev_features_t features)
1770{ 1770{
1771 netdev_features_t changed = netdev->features ^ features; 1771 netdev_features_t changed = netdev->features ^ features;
1772 struct igb_adapter *adapter = netdev_priv(netdev);
1772 1773
1773 if (changed & NETIF_F_HW_VLAN_RX) 1774 if (changed & NETIF_F_HW_VLAN_RX)
1774 igb_vlan_mode(netdev, features); 1775 igb_vlan_mode(netdev, features);
1775 1776
1777 if (!(changed & NETIF_F_RXALL))
1778 return 0;
1779
1780 netdev->features = features;
1781
1782 if (netif_running(netdev))
1783 igb_reinit_locked(adapter);
1784 else
1785 igb_reset(adapter);
1786
1776 return 0; 1787 return 0;
1777} 1788}
1778 1789
@@ -1954,6 +1965,7 @@ static int __devinit igb_probe(struct pci_dev *pdev,
1954 1965
1955 /* copy netdev features into list of user selectable features */ 1966 /* copy netdev features into list of user selectable features */
1956 netdev->hw_features |= netdev->features; 1967 netdev->hw_features |= netdev->features;
1968 netdev->hw_features |= NETIF_F_RXALL;
1957 1969
1958 /* set this bit last since it cannot be part of hw_features */ 1970 /* set this bit last since it cannot be part of hw_features */
1959 netdev->features |= NETIF_F_HW_VLAN_FILTER; 1971 netdev->features |= NETIF_F_HW_VLAN_FILTER;
@@ -3005,6 +3017,22 @@ void igb_setup_rctl(struct igb_adapter *adapter)
3005 wr32(E1000_QDE, ALL_QUEUES); 3017 wr32(E1000_QDE, ALL_QUEUES);
3006 } 3018 }
3007 3019
3020 /* This is useful for sniffing bad packets. */
3021 if (adapter->netdev->features & NETIF_F_RXALL) {
3022 /* UPE and MPE will be handled by normal PROMISC logic
3023 * in e1000e_set_rx_mode */
3024 rctl |= (E1000_RCTL_SBP | /* Receive bad packets */
3025 E1000_RCTL_BAM | /* RX All Bcast Pkts */
3026 E1000_RCTL_PMCF); /* RX All MAC Ctrl Pkts */
3027
3028 rctl &= ~(E1000_RCTL_VFE | /* Disable VLAN filter */
3029 E1000_RCTL_DPF | /* Allow filtered pause */
3030 E1000_RCTL_CFIEN); /* Dis VLAN CFIEN Filter */
3031 /* Do not mess with E1000_CTRL_VME, it affects transmit as well,
3032 * and that breaks VLANs.
3033 */
3034 }
3035
3008 wr32(E1000_RCTL, rctl); 3036 wr32(E1000_RCTL, rctl);
3009} 3037}
3010 3038
@@ -6102,8 +6130,9 @@ static bool igb_clean_rx_irq(struct igb_q_vector *q_vector, int budget)
6102 goto next_desc; 6130 goto next_desc;
6103 } 6131 }
6104 6132
6105 if (igb_test_staterr(rx_desc, 6133 if (unlikely((igb_test_staterr(rx_desc,
6106 E1000_RXDEXT_ERR_FRAME_ERR_MASK)) { 6134 E1000_RXDEXT_ERR_FRAME_ERR_MASK))
6135 && !(rx_ring->netdev->features & NETIF_F_RXALL))) {
6107 dev_kfree_skb_any(skb); 6136 dev_kfree_skb_any(skb);
6108 goto next_desc; 6137 goto next_desc;
6109 } 6138 }