Commit 0593f8df authored by Marc Kleine-Budde's avatar Marc Kleine-Budde Committed by Jakub Kicinski
Browse files

net: fec: fec_enet_rx_queue(): factor out VLAN handling into separate function fec_enet_rx_vlan()



In order to clean up of the VLAN handling, factor out the VLAN
handling into separate function fec_enet_rx_vlan().

Reviewed-by: default avatarFrank Li <Frank.Li@nxp.com>
Signed-off-by: default avatarMarc Kleine-Budde <mkl@pengutronix.de>
Link: https://patch.msgid.link/20250618-fec-cleanups-v4-11-c16f9a1af124@pengutronix.de


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 4dffaf37
Loading
Loading
Loading
Loading
+19 −13
Original line number Diff line number Diff line
@@ -1706,6 +1706,22 @@ fec_enet_run_xdp(struct fec_enet_private *fep, struct bpf_prog *prog,
	return ret;
}

static void fec_enet_rx_vlan(const struct net_device *ndev, struct sk_buff *skb)
{
	if (ndev->features & NETIF_F_HW_VLAN_CTAG_RX) {
		const struct vlan_ethhdr *vlan_header = skb_vlan_eth_hdr(skb);
		const u16 vlan_tag = ntohs(vlan_header->h_vlan_TCI);

		/* Push and remove the vlan tag */

		memmove(skb->data + VLAN_HLEN, skb->data, ETH_ALEN * 2);
		skb_pull(skb, VLAN_HLEN);
		__vlan_hwaccel_put_tag(skb,
				       htons(ETH_P_8021Q),
				       vlan_tag);
	}
}

/* During a receive, the bd_rx.cur points to the current incoming buffer.
 * When we update through the ring, if the next incoming buffer has
 * not been given to the system, we just set the empty indicator,
@@ -1852,19 +1868,9 @@ fec_enet_rx_queue(struct net_device *ndev, u16 queue_id, int budget)
			ebdp = (struct bufdesc_ex *)bdp;

		/* If this is a VLAN packet remove the VLAN Tag */
		if ((ndev->features & NETIF_F_HW_VLAN_CTAG_RX) &&
		    fep->bufdesc_ex &&
		    (ebdp->cbd_esc & cpu_to_fec32(BD_ENET_RX_VLAN))) {
			/* Push and remove the vlan tag */
			struct vlan_ethhdr *vlan_header = skb_vlan_eth_hdr(skb);
			u16 vlan_tag = ntohs(vlan_header->h_vlan_TCI);

			memmove(skb->data + VLAN_HLEN, skb->data, ETH_ALEN * 2);
			skb_pull(skb, VLAN_HLEN);
			__vlan_hwaccel_put_tag(skb,
					       htons(ETH_P_8021Q),
					       vlan_tag);
		}
		if (fep->bufdesc_ex &&
		    (ebdp->cbd_esc & cpu_to_fec32(BD_ENET_RX_VLAN)))
			fec_enet_rx_vlan(ndev, skb);

		skb->protocol = eth_type_trans(skb, ndev);