Commit 08450ea9 authored by Michael Chan's avatar Michael Chan Committed by Jakub Kicinski
Browse files

bnxt_en: Fix max_mtu setting for multi-buf XDP



The existing code does not allow the MTU to be set to the maximum even
after an XDP program supporting multiple buffers is attached.  Fix it
to set the netdev->max_mtu to the maximum value if the attached XDP
program supports mutiple buffers, regardless of the current MTU value.

Also use a local variable dev instead of repeatedly using bp->dev.

Fixes: 1dc4c557 ("bnxt: adding bnxt_xdp_build_skb to build skb from multibuffer xdp_buff")
Reviewed-by: default avatarSomnath Kotur <somnath.kotur@broadcom.com>
Reviewed-by: default avatarAjit Khaparde <ajit.khaparde@broadcom.com>
Reviewed-by: default avatarAndy Gospodarek <andrew.gospodarek@broadcom.com>
Signed-off-by: default avatarMichael Chan <michael.chan@broadcom.com>
Link: https://lore.kernel.org/r/20230731142043.58855-3-michael.chan@broadcom.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent f6974b4c
Loading
Loading
Loading
Loading
+10 −7
Original line number Original line Diff line number Diff line
@@ -4001,26 +4001,29 @@ void bnxt_set_ring_params(struct bnxt *bp)
 */
 */
int bnxt_set_rx_skb_mode(struct bnxt *bp, bool page_mode)
int bnxt_set_rx_skb_mode(struct bnxt *bp, bool page_mode)
{
{
	struct net_device *dev = bp->dev;

	if (page_mode) {
	if (page_mode) {
		bp->flags &= ~BNXT_FLAG_AGG_RINGS;
		bp->flags &= ~BNXT_FLAG_AGG_RINGS;
		bp->flags |= BNXT_FLAG_RX_PAGE_MODE;
		bp->flags |= BNXT_FLAG_RX_PAGE_MODE;


		if (bp->dev->mtu > BNXT_MAX_PAGE_MODE_MTU) {
		if (bp->xdp_prog->aux->xdp_has_frags)
			dev->max_mtu = min_t(u16, bp->max_mtu, BNXT_MAX_MTU);
		else
			dev->max_mtu =
				min_t(u16, bp->max_mtu, BNXT_MAX_PAGE_MODE_MTU);
		if (dev->mtu > BNXT_MAX_PAGE_MODE_MTU) {
			bp->flags |= BNXT_FLAG_JUMBO;
			bp->flags |= BNXT_FLAG_JUMBO;
			bp->rx_skb_func = bnxt_rx_multi_page_skb;
			bp->rx_skb_func = bnxt_rx_multi_page_skb;
			bp->dev->max_mtu =
				min_t(u16, bp->max_mtu, BNXT_MAX_MTU);
		} else {
		} else {
			bp->flags |= BNXT_FLAG_NO_AGG_RINGS;
			bp->flags |= BNXT_FLAG_NO_AGG_RINGS;
			bp->rx_skb_func = bnxt_rx_page_skb;
			bp->rx_skb_func = bnxt_rx_page_skb;
			bp->dev->max_mtu =
				min_t(u16, bp->max_mtu, BNXT_MAX_PAGE_MODE_MTU);
		}
		}
		bp->rx_dir = DMA_BIDIRECTIONAL;
		bp->rx_dir = DMA_BIDIRECTIONAL;
		/* Disable LRO or GRO_HW */
		/* Disable LRO or GRO_HW */
		netdev_update_features(bp->dev);
		netdev_update_features(dev);
	} else {
	} else {
		bp->dev->max_mtu = bp->max_mtu;
		dev->max_mtu = bp->max_mtu;
		bp->flags &= ~BNXT_FLAG_RX_PAGE_MODE;
		bp->flags &= ~BNXT_FLAG_RX_PAGE_MODE;
		bp->rx_dir = DMA_FROM_DEVICE;
		bp->rx_dir = DMA_FROM_DEVICE;
		bp->rx_skb_func = bnxt_rx_skb;
		bp->rx_skb_func = bnxt_rx_skb;