|
@@ -563,9 +563,6 @@ int mlx4_en_process_rx_cq(struct net_device *dev, struct mlx4_en_cq *cq, int bud
|
|
|
unsigned int length;
|
|
|
int polled = 0;
|
|
|
int ip_summed;
|
|
|
- struct ethhdr *ethh;
|
|
|
- dma_addr_t dma;
|
|
|
- u64 s_mac;
|
|
|
int factor = priv->cqe_factor;
|
|
|
|
|
|
if (!priv->port_up)
|
|
@@ -603,21 +600,27 @@ int mlx4_en_process_rx_cq(struct net_device *dev, struct mlx4_en_cq *cq, int bud
|
|
|
goto next;
|
|
|
}
|
|
|
|
|
|
- /* Get pointer to first fragment since we haven't skb yet and
|
|
|
- * cast it to ethhdr struct */
|
|
|
- dma = be64_to_cpu(rx_desc->data[0].addr);
|
|
|
- dma_sync_single_for_cpu(priv->ddev, dma, sizeof(*ethh),
|
|
|
- DMA_FROM_DEVICE);
|
|
|
- ethh = (struct ethhdr *)(page_address(frags[0].page) +
|
|
|
- frags[0].offset);
|
|
|
- s_mac = mlx4_en_mac_to_u64(ethh->h_source);
|
|
|
-
|
|
|
- /* If source MAC is equal to our own MAC and not performing
|
|
|
- * the selftest or flb disabled - drop the packet */
|
|
|
- if (s_mac == priv->mac &&
|
|
|
- !((dev->features & NETIF_F_LOOPBACK) ||
|
|
|
- priv->validate_loopback))
|
|
|
- goto next;
|
|
|
+ /* Check if we need to drop the packet if SRIOV is not enabled
|
|
|
+ * and not performing the selftest or flb disabled
|
|
|
+ */
|
|
|
+ if (priv->flags & MLX4_EN_FLAG_RX_FILTER_NEEDED) {
|
|
|
+ struct ethhdr *ethh;
|
|
|
+ dma_addr_t dma;
|
|
|
+ u64 s_mac;
|
|
|
+ /* Get pointer to first fragment since we haven't
|
|
|
+ * skb yet and cast it to ethhdr struct
|
|
|
+ */
|
|
|
+ dma = be64_to_cpu(rx_desc->data[0].addr);
|
|
|
+ dma_sync_single_for_cpu(priv->ddev, dma, sizeof(*ethh),
|
|
|
+ DMA_FROM_DEVICE);
|
|
|
+ ethh = (struct ethhdr *)(page_address(frags[0].page) +
|
|
|
+ frags[0].offset);
|
|
|
+
|
|
|
+ /* Drop the packet, since HW loopback-ed it */
|
|
|
+ s_mac = mlx4_en_mac_to_u64(ethh->h_source);
|
|
|
+ if (s_mac == priv->mac)
|
|
|
+ goto next;
|
|
|
+ }
|
|
|
|
|
|
/*
|
|
|
* Packet is OK - process it.
|