@@ -971,6 +971,39 @@ static void bnxt_reuse_rx_agg_bufs(struct bnxt_cp_ring_info *cpr, u16 idx,
971
971
rxr -> rx_sw_agg_prod = sw_prod ;
972
972
}
973
973
974
+ static struct sk_buff * bnxt_rx_multi_page_skb (struct bnxt * bp ,
975
+ struct bnxt_rx_ring_info * rxr ,
976
+ u16 cons , void * data , u8 * data_ptr ,
977
+ dma_addr_t dma_addr ,
978
+ unsigned int offset_and_len )
979
+ {
980
+ unsigned int len = offset_and_len & 0xffff ;
981
+ struct page * page = data ;
982
+ u16 prod = rxr -> rx_prod ;
983
+ struct sk_buff * skb ;
984
+ int err ;
985
+
986
+ err = bnxt_alloc_rx_data (bp , rxr , prod , GFP_ATOMIC );
987
+ if (unlikely (err )) {
988
+ bnxt_reuse_rx_data (rxr , cons , data );
989
+ return NULL ;
990
+ }
991
+ dma_addr -= bp -> rx_dma_offset ;
992
+ dma_unmap_page_attrs (& bp -> pdev -> dev , dma_addr , PAGE_SIZE , bp -> rx_dir ,
993
+ DMA_ATTR_WEAK_ORDERING );
994
+ skb = build_skb (page_address (page ), BNXT_PAGE_MODE_BUF_SIZE +
995
+ bp -> rx_dma_offset );
996
+ if (!skb ) {
997
+ __free_page (page );
998
+ return NULL ;
999
+ }
1000
+ skb_mark_for_recycle (skb );
1001
+ skb_reserve (skb , bp -> rx_dma_offset );
1002
+ __skb_put (skb , len );
1003
+
1004
+ return skb ;
1005
+ }
1006
+
974
1007
static struct sk_buff * bnxt_rx_page_skb (struct bnxt * bp ,
975
1008
struct bnxt_rx_ring_info * rxr ,
976
1009
u16 cons , void * data , u8 * data_ptr ,
@@ -993,7 +1026,6 @@ static struct sk_buff *bnxt_rx_page_skb(struct bnxt *bp,
993
1026
dma_addr -= bp -> rx_dma_offset ;
994
1027
dma_unmap_page_attrs (& bp -> pdev -> dev , dma_addr , PAGE_SIZE , bp -> rx_dir ,
995
1028
DMA_ATTR_WEAK_ORDERING );
996
- page_pool_release_page (rxr -> page_pool , page );
997
1029
998
1030
if (unlikely (!payload ))
999
1031
payload = eth_get_headlen (bp -> dev , data_ptr , len );
@@ -1004,6 +1036,7 @@ static struct sk_buff *bnxt_rx_page_skb(struct bnxt *bp,
1004
1036
return NULL ;
1005
1037
}
1006
1038
1039
+ skb_mark_for_recycle (skb );
1007
1040
off = (void * )data_ptr - page_address (page );
1008
1041
skb_add_rx_frag (skb , 0 , page , off , len , PAGE_SIZE );
1009
1042
memcpy (skb -> data - NET_IP_ALIGN , data_ptr - NET_IP_ALIGN ,
@@ -1949,6 +1982,14 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,
1949
1982
rc = - ENOMEM ;
1950
1983
goto next_rx ;
1951
1984
}
1985
+ } else {
1986
+ skb = bnxt_xdp_build_skb (bp , skb , agg_bufs , rxr -> page_pool , & xdp , rxcmp1 );
1987
+ if (!skb ) {
1988
+ /* we should be able to free the old skb here */
1989
+ cpr -> sw_stats .rx .rx_oom_discards += 1 ;
1990
+ rc = - ENOMEM ;
1991
+ goto next_rx ;
1992
+ }
1952
1993
}
1953
1994
}
1954
1995
@@ -3964,14 +4005,21 @@ void bnxt_set_ring_params(struct bnxt *bp)
3964
4005
int bnxt_set_rx_skb_mode (struct bnxt * bp , bool page_mode )
3965
4006
{
3966
4007
if (page_mode ) {
3967
- if (bp -> dev -> mtu > BNXT_MAX_PAGE_MODE_MTU )
3968
- return - EOPNOTSUPP ;
3969
- bp -> dev -> max_mtu =
3970
- min_t (u16 , bp -> max_mtu , BNXT_MAX_PAGE_MODE_MTU );
3971
4008
bp -> flags &= ~BNXT_FLAG_AGG_RINGS ;
3972
- bp -> flags |= BNXT_FLAG_NO_AGG_RINGS | BNXT_FLAG_RX_PAGE_MODE ;
4009
+ bp -> flags |= BNXT_FLAG_RX_PAGE_MODE ;
4010
+
4011
+ if (bp -> dev -> mtu > BNXT_MAX_PAGE_MODE_MTU ) {
4012
+ bp -> flags |= BNXT_FLAG_JUMBO ;
4013
+ bp -> rx_skb_func = bnxt_rx_multi_page_skb ;
4014
+ bp -> dev -> max_mtu =
4015
+ min_t (u16 , bp -> max_mtu , BNXT_MAX_MTU );
4016
+ } else {
4017
+ bp -> flags |= BNXT_FLAG_NO_AGG_RINGS ;
4018
+ bp -> rx_skb_func = bnxt_rx_page_skb ;
4019
+ bp -> dev -> max_mtu =
4020
+ min_t (u16 , bp -> max_mtu , BNXT_MAX_PAGE_MODE_MTU );
4021
+ }
3973
4022
bp -> rx_dir = DMA_BIDIRECTIONAL ;
3974
- bp -> rx_skb_func = bnxt_rx_page_skb ;
3975
4023
/* Disable LRO or GRO_HW */
3976
4024
netdev_update_features (bp -> dev );
3977
4025
} else {
@@ -11121,6 +11169,9 @@ static netdev_features_t bnxt_fix_features(struct net_device *dev,
11121
11169
if (bp -> flags & BNXT_FLAG_NO_AGG_RINGS )
11122
11170
features &= ~(NETIF_F_LRO | NETIF_F_GRO_HW );
11123
11171
11172
+ if (!(bp -> flags & BNXT_FLAG_TPA ))
11173
+ features &= ~(NETIF_F_LRO | NETIF_F_GRO_HW );
11174
+
11124
11175
if (!(features & NETIF_F_GRO ))
11125
11176
features &= ~NETIF_F_GRO_HW ;
11126
11177
0 commit comments