Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 89eaefb6 authored by Ben Greear's avatar Ben Greear Committed by Jeff Kirsher
Browse files

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: default avatarBen Greear <greearb@candelatech.com>
Tested-by: default avatarJeff Pieper <jeffrey.e.pieper@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
parent 6b8f0922
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -134,6 +134,8 @@
#define E1000_RCTL_SZ_256         0x00030000    /* rx buffer size 256 */
#define E1000_RCTL_SZ_256         0x00030000    /* rx buffer size 256 */
#define E1000_RCTL_VFE            0x00040000    /* vlan filter enable */
#define E1000_RCTL_VFE            0x00040000    /* vlan filter enable */
#define E1000_RCTL_CFIEN          0x00080000    /* canonical form enable */
#define E1000_RCTL_CFIEN          0x00080000    /* canonical form enable */
#define E1000_RCTL_DPF            0x00400000    /* Discard Pause Frames */
#define E1000_RCTL_PMCF           0x00800000    /* pass MAC control frames */
#define E1000_RCTL_SECRC          0x04000000    /* Strip Ethernet CRC */
#define E1000_RCTL_SECRC          0x04000000    /* Strip Ethernet CRC */


/*
/*
+31 −2
Original line number Original line Diff line number Diff line
@@ -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,
		if (unlikely((igb_test_staterr(rx_desc,
				     E1000_RXDEXT_ERR_FRAME_ERR_MASK)) {
					       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;
		}
		}