bnxt_en: Fix max_mtu setting for multi-buf XDP

[ Upstream commit 08450ea98a ]

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: 1dc4c557bf ("bnxt: adding bnxt_xdp_build_skb to build skb from multibuffer xdp_buff")
Reviewed-by: Somnath Kotur <somnath.kotur@broadcom.com>
Reviewed-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
Reviewed-by: Andy Gospodarek <andrew.gospodarek@broadcom.com>
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Link: https://lore.kernel.org/r/20230731142043.58855-3-michael.chan@broadcom.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
Michael Chan 2023-07-31 07:20:43 -07:00 committed by Greg Kroah-Hartman
parent e9f11bfc03
commit 421e02bda0
1 changed files with 10 additions and 7 deletions

View File

@ -4027,26 +4027,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;