diff options
author | Ben Greear <greearb@candelatech.com> | 2012-03-06 04:41:58 -0500 |
---|---|---|
committer | Jeff Kirsher <jeffrey.t.kirsher@intel.com> | 2012-03-17 04:02:26 -0400 |
commit | 89eaefb61dc9170237d95b844dd357338fc7225d (patch) | |
tree | 6c921a7344a7bcf7dd26975c978ff4626ebd8e01 | |
parent | 6b8f092284672c6504ed215052bfee6b7171411e (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.h | 2 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/igb/igb_main.c | 33 |
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 | } |