@@ -3996,6 +3996,62 @@ static int bnxt_alloc_cp_rings(struct bnxt *bp)
3996
3996
return 0 ;
3997
3997
}
3998
3998
3999
+ static void bnxt_init_rx_ring_struct (struct bnxt * bp ,
4000
+ struct bnxt_rx_ring_info * rxr )
4001
+ {
4002
+ struct bnxt_ring_mem_info * rmem ;
4003
+ struct bnxt_ring_struct * ring ;
4004
+
4005
+ ring = & rxr -> rx_ring_struct ;
4006
+ rmem = & ring -> ring_mem ;
4007
+ rmem -> nr_pages = bp -> rx_nr_pages ;
4008
+ rmem -> page_size = HW_RXBD_RING_SIZE ;
4009
+ rmem -> pg_arr = (void * * )rxr -> rx_desc_ring ;
4010
+ rmem -> dma_arr = rxr -> rx_desc_mapping ;
4011
+ rmem -> vmem_size = SW_RXBD_RING_SIZE * bp -> rx_nr_pages ;
4012
+ rmem -> vmem = (void * * )& rxr -> rx_buf_ring ;
4013
+
4014
+ ring = & rxr -> rx_agg_ring_struct ;
4015
+ rmem = & ring -> ring_mem ;
4016
+ rmem -> nr_pages = bp -> rx_agg_nr_pages ;
4017
+ rmem -> page_size = HW_RXBD_RING_SIZE ;
4018
+ rmem -> pg_arr = (void * * )rxr -> rx_agg_desc_ring ;
4019
+ rmem -> dma_arr = rxr -> rx_agg_desc_mapping ;
4020
+ rmem -> vmem_size = SW_RXBD_AGG_RING_SIZE * bp -> rx_agg_nr_pages ;
4021
+ rmem -> vmem = (void * * )& rxr -> rx_agg_ring ;
4022
+ }
4023
+
4024
+ static void bnxt_reset_rx_ring_struct (struct bnxt * bp ,
4025
+ struct bnxt_rx_ring_info * rxr )
4026
+ {
4027
+ struct bnxt_ring_mem_info * rmem ;
4028
+ struct bnxt_ring_struct * ring ;
4029
+ int i ;
4030
+
4031
+ rxr -> page_pool -> p .napi = NULL ;
4032
+ rxr -> page_pool = NULL ;
4033
+
4034
+ ring = & rxr -> rx_ring_struct ;
4035
+ rmem = & ring -> ring_mem ;
4036
+ rmem -> pg_tbl = NULL ;
4037
+ rmem -> pg_tbl_map = 0 ;
4038
+ for (i = 0 ; i < rmem -> nr_pages ; i ++ ) {
4039
+ rmem -> pg_arr [i ] = NULL ;
4040
+ rmem -> dma_arr [i ] = 0 ;
4041
+ }
4042
+ * rmem -> vmem = NULL ;
4043
+
4044
+ ring = & rxr -> rx_agg_ring_struct ;
4045
+ rmem = & ring -> ring_mem ;
4046
+ rmem -> pg_tbl = NULL ;
4047
+ rmem -> pg_tbl_map = 0 ;
4048
+ for (i = 0 ; i < rmem -> nr_pages ; i ++ ) {
4049
+ rmem -> pg_arr [i ] = NULL ;
4050
+ rmem -> dma_arr [i ] = 0 ;
4051
+ }
4052
+ * rmem -> vmem = NULL ;
4053
+ }
4054
+
3999
4055
static void bnxt_init_ring_struct (struct bnxt * bp )
4000
4056
{
4001
4057
int i , j ;
@@ -14914,6 +14970,224 @@ static const struct netdev_stat_ops bnxt_stat_ops = {
14914
14970
.get_base_stats = bnxt_get_base_stats ,
14915
14971
};
14916
14972
14973
+ static int bnxt_alloc_rx_agg_bmap (struct bnxt * bp , struct bnxt_rx_ring_info * rxr )
14974
+ {
14975
+ u16 mem_size ;
14976
+
14977
+ rxr -> rx_agg_bmap_size = bp -> rx_agg_ring_mask + 1 ;
14978
+ mem_size = rxr -> rx_agg_bmap_size / 8 ;
14979
+ rxr -> rx_agg_bmap = kzalloc (mem_size , GFP_KERNEL );
14980
+ if (!rxr -> rx_agg_bmap )
14981
+ return - ENOMEM ;
14982
+
14983
+ return 0 ;
14984
+ }
14985
+
14986
+ static int bnxt_queue_mem_alloc (struct net_device * dev , void * qmem , int idx )
14987
+ {
14988
+ struct bnxt_rx_ring_info * rxr , * clone ;
14989
+ struct bnxt * bp = netdev_priv (dev );
14990
+ struct bnxt_ring_struct * ring ;
14991
+ int rc ;
14992
+
14993
+ rxr = & bp -> rx_ring [idx ];
14994
+ clone = qmem ;
14995
+ memcpy (clone , rxr , sizeof (* rxr ));
14996
+ bnxt_init_rx_ring_struct (bp , clone );
14997
+ bnxt_reset_rx_ring_struct (bp , clone );
14998
+
14999
+ clone -> rx_prod = 0 ;
15000
+ clone -> rx_agg_prod = 0 ;
15001
+ clone -> rx_sw_agg_prod = 0 ;
15002
+ clone -> rx_next_cons = 0 ;
15003
+
15004
+ rc = bnxt_alloc_rx_page_pool (bp , clone , rxr -> page_pool -> p .nid );
15005
+ if (rc )
15006
+ return rc ;
15007
+
15008
+ ring = & clone -> rx_ring_struct ;
15009
+ rc = bnxt_alloc_ring (bp , & ring -> ring_mem );
15010
+ if (rc )
15011
+ goto err_free_rx_ring ;
15012
+
15013
+ if (bp -> flags & BNXT_FLAG_AGG_RINGS ) {
15014
+ ring = & clone -> rx_agg_ring_struct ;
15015
+ rc = bnxt_alloc_ring (bp , & ring -> ring_mem );
15016
+ if (rc )
15017
+ goto err_free_rx_agg_ring ;
15018
+
15019
+ rc = bnxt_alloc_rx_agg_bmap (bp , clone );
15020
+ if (rc )
15021
+ goto err_free_rx_agg_ring ;
15022
+ }
15023
+
15024
+ bnxt_init_one_rx_ring_rxbd (bp , clone );
15025
+ bnxt_init_one_rx_agg_ring_rxbd (bp , clone );
15026
+
15027
+ bnxt_alloc_one_rx_ring_skb (bp , clone , idx );
15028
+ if (bp -> flags & BNXT_FLAG_AGG_RINGS )
15029
+ bnxt_alloc_one_rx_ring_page (bp , clone , idx );
15030
+
15031
+ return 0 ;
15032
+
15033
+ err_free_rx_agg_ring :
15034
+ bnxt_free_ring (bp , & clone -> rx_agg_ring_struct .ring_mem );
15035
+ err_free_rx_ring :
15036
+ bnxt_free_ring (bp , & clone -> rx_ring_struct .ring_mem );
15037
+ clone -> page_pool -> p .napi = NULL ;
15038
+ page_pool_destroy (clone -> page_pool );
15039
+ clone -> page_pool = NULL ;
15040
+ return rc ;
15041
+ }
15042
+
15043
+ static void bnxt_queue_mem_free (struct net_device * dev , void * qmem )
15044
+ {
15045
+ struct bnxt_rx_ring_info * rxr = qmem ;
15046
+ struct bnxt * bp = netdev_priv (dev );
15047
+ struct bnxt_ring_struct * ring ;
15048
+
15049
+ bnxt_free_one_rx_ring (bp , rxr );
15050
+ bnxt_free_one_rx_agg_ring (bp , rxr );
15051
+
15052
+ /* At this point, this NAPI instance has another page pool associated
15053
+ * with it. Disconnect here before freeing the old page pool to avoid
15054
+ * warnings.
15055
+ */
15056
+ rxr -> page_pool -> p .napi = NULL ;
15057
+ page_pool_destroy (rxr -> page_pool );
15058
+ rxr -> page_pool = NULL ;
15059
+
15060
+ ring = & rxr -> rx_ring_struct ;
15061
+ bnxt_free_ring (bp , & ring -> ring_mem );
15062
+
15063
+ ring = & rxr -> rx_agg_ring_struct ;
15064
+ bnxt_free_ring (bp , & ring -> ring_mem );
15065
+
15066
+ kfree (rxr -> rx_agg_bmap );
15067
+ rxr -> rx_agg_bmap = NULL ;
15068
+ }
15069
+
15070
+ static void bnxt_copy_rx_ring (struct bnxt * bp ,
15071
+ struct bnxt_rx_ring_info * dst ,
15072
+ struct bnxt_rx_ring_info * src )
15073
+ {
15074
+ struct bnxt_ring_mem_info * dst_rmem , * src_rmem ;
15075
+ struct bnxt_ring_struct * dst_ring , * src_ring ;
15076
+ int i ;
15077
+
15078
+ dst_ring = & dst -> rx_ring_struct ;
15079
+ dst_rmem = & dst_ring -> ring_mem ;
15080
+ src_ring = & src -> rx_ring_struct ;
15081
+ src_rmem = & src_ring -> ring_mem ;
15082
+
15083
+ WARN_ON (dst_rmem -> nr_pages != src_rmem -> nr_pages );
15084
+ WARN_ON (dst_rmem -> page_size != src_rmem -> page_size );
15085
+ WARN_ON (dst_rmem -> flags != src_rmem -> flags );
15086
+ WARN_ON (dst_rmem -> depth != src_rmem -> depth );
15087
+ WARN_ON (dst_rmem -> vmem_size != src_rmem -> vmem_size );
15088
+ WARN_ON (dst_rmem -> ctx_mem != src_rmem -> ctx_mem );
15089
+
15090
+ dst_rmem -> pg_tbl = src_rmem -> pg_tbl ;
15091
+ dst_rmem -> pg_tbl_map = src_rmem -> pg_tbl_map ;
15092
+ * dst_rmem -> vmem = * src_rmem -> vmem ;
15093
+ for (i = 0 ; i < dst_rmem -> nr_pages ; i ++ ) {
15094
+ dst_rmem -> pg_arr [i ] = src_rmem -> pg_arr [i ];
15095
+ dst_rmem -> dma_arr [i ] = src_rmem -> dma_arr [i ];
15096
+ }
15097
+
15098
+ if (!(bp -> flags & BNXT_FLAG_AGG_RINGS ))
15099
+ return ;
15100
+
15101
+ dst_ring = & dst -> rx_agg_ring_struct ;
15102
+ dst_rmem = & dst_ring -> ring_mem ;
15103
+ src_ring = & src -> rx_agg_ring_struct ;
15104
+ src_rmem = & src_ring -> ring_mem ;
15105
+
15106
+ WARN_ON (dst_rmem -> nr_pages != src_rmem -> nr_pages );
15107
+ WARN_ON (dst_rmem -> page_size != src_rmem -> page_size );
15108
+ WARN_ON (dst_rmem -> flags != src_rmem -> flags );
15109
+ WARN_ON (dst_rmem -> depth != src_rmem -> depth );
15110
+ WARN_ON (dst_rmem -> vmem_size != src_rmem -> vmem_size );
15111
+ WARN_ON (dst_rmem -> ctx_mem != src_rmem -> ctx_mem );
15112
+ WARN_ON (dst -> rx_agg_bmap_size != src -> rx_agg_bmap_size );
15113
+
15114
+ dst_rmem -> pg_tbl = src_rmem -> pg_tbl ;
15115
+ dst_rmem -> pg_tbl_map = src_rmem -> pg_tbl_map ;
15116
+ * dst_rmem -> vmem = * src_rmem -> vmem ;
15117
+ for (i = 0 ; i < dst_rmem -> nr_pages ; i ++ ) {
15118
+ dst_rmem -> pg_arr [i ] = src_rmem -> pg_arr [i ];
15119
+ dst_rmem -> dma_arr [i ] = src_rmem -> dma_arr [i ];
15120
+ }
15121
+
15122
+ dst -> rx_agg_bmap = src -> rx_agg_bmap ;
15123
+ }
15124
+
15125
+ static int bnxt_queue_start (struct net_device * dev , void * qmem , int idx )
15126
+ {
15127
+ struct bnxt * bp = netdev_priv (dev );
15128
+ struct bnxt_rx_ring_info * rxr , * clone ;
15129
+ struct bnxt_cp_ring_info * cpr ;
15130
+ int rc ;
15131
+
15132
+ rxr = & bp -> rx_ring [idx ];
15133
+ clone = qmem ;
15134
+
15135
+ rxr -> rx_prod = clone -> rx_prod ;
15136
+ rxr -> rx_agg_prod = clone -> rx_agg_prod ;
15137
+ rxr -> rx_sw_agg_prod = clone -> rx_sw_agg_prod ;
15138
+ rxr -> rx_next_cons = clone -> rx_next_cons ;
15139
+ rxr -> page_pool = clone -> page_pool ;
15140
+
15141
+ bnxt_copy_rx_ring (bp , rxr , clone );
15142
+
15143
+ rc = bnxt_hwrm_rx_ring_alloc (bp , rxr );
15144
+ if (rc )
15145
+ return rc ;
15146
+ rc = bnxt_hwrm_rx_agg_ring_alloc (bp , rxr );
15147
+ if (rc )
15148
+ goto err_free_hwrm_rx_ring ;
15149
+
15150
+ bnxt_db_write (bp , & rxr -> rx_db , rxr -> rx_prod );
15151
+ if (bp -> flags & BNXT_FLAG_AGG_RINGS )
15152
+ bnxt_db_write (bp , & rxr -> rx_agg_db , rxr -> rx_agg_prod );
15153
+
15154
+ napi_enable (& rxr -> bnapi -> napi );
15155
+
15156
+ cpr = & rxr -> bnapi -> cp_ring ;
15157
+ cpr -> sw_stats -> rx .rx_resets ++ ;
15158
+
15159
+ return 0 ;
15160
+
15161
+ err_free_hwrm_rx_ring :
15162
+ bnxt_hwrm_rx_ring_free (bp , rxr , false);
15163
+ return rc ;
15164
+ }
15165
+
15166
+ static int bnxt_queue_stop (struct net_device * dev , void * qmem , int idx )
15167
+ {
15168
+ struct bnxt * bp = netdev_priv (dev );
15169
+ struct bnxt_rx_ring_info * rxr ;
15170
+
15171
+ rxr = & bp -> rx_ring [idx ];
15172
+ napi_disable (& rxr -> bnapi -> napi );
15173
+ bnxt_hwrm_rx_ring_free (bp , rxr , false);
15174
+ bnxt_hwrm_rx_agg_ring_free (bp , rxr , false);
15175
+ rxr -> rx_next_cons = 0 ;
15176
+
15177
+ memcpy (qmem , rxr , sizeof (* rxr ));
15178
+ bnxt_init_rx_ring_struct (bp , qmem );
15179
+
15180
+ return 0 ;
15181
+ }
15182
+
15183
+ static const struct netdev_queue_mgmt_ops bnxt_queue_mgmt_ops = {
15184
+ .ndo_queue_mem_size = sizeof (struct bnxt_rx_ring_info ),
15185
+ .ndo_queue_mem_alloc = bnxt_queue_mem_alloc ,
15186
+ .ndo_queue_mem_free = bnxt_queue_mem_free ,
15187
+ .ndo_queue_start = bnxt_queue_start ,
15188
+ .ndo_queue_stop = bnxt_queue_stop ,
15189
+ };
15190
+
14917
15191
static void bnxt_remove_one (struct pci_dev * pdev )
14918
15192
{
14919
15193
struct net_device * dev = pci_get_drvdata (pdev );
@@ -15379,6 +15653,7 @@ static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
15379
15653
dev -> stat_ops = & bnxt_stat_ops ;
15380
15654
dev -> watchdog_timeo = BNXT_TX_TIMEOUT ;
15381
15655
dev -> ethtool_ops = & bnxt_ethtool_ops ;
15656
+ dev -> queue_mgmt_ops = & bnxt_queue_mgmt_ops ;
15382
15657
pci_set_drvdata (pdev , dev );
15383
15658
15384
15659
rc = bnxt_alloc_hwrm_resources (bp );
0 commit comments