@@ -163,6 +163,16 @@ static long h_reg_sub_crq(unsigned long unit_address, unsigned long token,
163
163
return rc ;
164
164
}
165
165
166
+ static void reset_long_term_buff (struct ibmvnic_adapter * adapter ,
167
+ struct ibmvnic_long_term_buff * ltb )
168
+ {
169
+ memset (ltb -> buff , 0 , ltb -> size );
170
+
171
+ init_completion (& adapter -> fw_done );
172
+ send_request_map (adapter , ltb -> addr , ltb -> size , ltb -> map_id );
173
+ wait_for_completion (& adapter -> fw_done );
174
+ }
175
+
166
176
static int alloc_long_term_buff (struct ibmvnic_adapter * adapter ,
167
177
struct ibmvnic_long_term_buff * ltb , int size )
168
178
{
@@ -352,6 +362,32 @@ static int init_stats_token(struct ibmvnic_adapter *adapter)
352
362
return 0 ;
353
363
}
354
364
365
+ static int reset_rx_pools (struct ibmvnic_adapter * adapter )
366
+ {
367
+ struct ibmvnic_rx_pool * rx_pool ;
368
+ int rx_scrqs ;
369
+ int i , j ;
370
+
371
+ rx_scrqs = be32_to_cpu (adapter -> login_rsp_buf -> num_rxadd_subcrqs );
372
+ for (i = 0 ; i < rx_scrqs ; i ++ ) {
373
+ rx_pool = & adapter -> rx_pool [i ];
374
+
375
+ reset_long_term_buff (adapter , & rx_pool -> long_term_buff );
376
+
377
+ for (j = 0 ; j < rx_pool -> size ; j ++ )
378
+ rx_pool -> free_map [j ] = j ;
379
+
380
+ memset (rx_pool -> rx_buff , 0 ,
381
+ rx_pool -> size * sizeof (struct ibmvnic_rx_buff ));
382
+
383
+ atomic_set (& rx_pool -> available , 0 );
384
+ rx_pool -> next_alloc = 0 ;
385
+ rx_pool -> next_free = 0 ;
386
+ }
387
+
388
+ return 0 ;
389
+ }
390
+
355
391
static void release_rx_pools (struct ibmvnic_adapter * adapter )
356
392
{
357
393
struct ibmvnic_rx_pool * rx_pool ;
@@ -453,6 +489,32 @@ static int init_rx_pools(struct net_device *netdev)
453
489
return 0 ;
454
490
}
455
491
492
+ static int reset_tx_pools (struct ibmvnic_adapter * adapter )
493
+ {
494
+ struct ibmvnic_tx_pool * tx_pool ;
495
+ int tx_scrqs ;
496
+ int i , j ;
497
+
498
+ tx_scrqs = be32_to_cpu (adapter -> login_rsp_buf -> num_txsubm_subcrqs );
499
+ for (i = 0 ; i < tx_scrqs ; i ++ ) {
500
+ tx_pool = & adapter -> tx_pool [i ];
501
+
502
+ reset_long_term_buff (adapter , & tx_pool -> long_term_buff );
503
+
504
+ memset (tx_pool -> tx_buff , 0 ,
505
+ adapter -> req_tx_entries_per_subcrq *
506
+ sizeof (struct ibmvnic_tx_buff ));
507
+
508
+ for (j = 0 ; j < adapter -> req_tx_entries_per_subcrq ; j ++ )
509
+ tx_pool -> free_map [j ] = j ;
510
+
511
+ tx_pool -> consumer_index = 0 ;
512
+ tx_pool -> producer_index = 0 ;
513
+ }
514
+
515
+ return 0 ;
516
+ }
517
+
456
518
static void release_tx_pools (struct ibmvnic_adapter * adapter )
457
519
{
458
520
struct ibmvnic_tx_pool * tx_pool ;
@@ -1258,7 +1320,6 @@ static int do_reset(struct ibmvnic_adapter *adapter,
1258
1320
*/
1259
1321
adapter -> state = VNIC_PROBED ;
1260
1322
1261
- release_resources (adapter );
1262
1323
release_sub_crqs (adapter );
1263
1324
1264
1325
rc = ibmvnic_init (adapter );
@@ -1277,9 +1338,11 @@ static int do_reset(struct ibmvnic_adapter *adapter,
1277
1338
return 0 ;
1278
1339
}
1279
1340
1280
- rtnl_lock ();
1281
- rc = init_resources (adapter );
1282
- rtnl_unlock ();
1341
+ rc = reset_tx_pools (adapter );
1342
+ if (rc )
1343
+ return rc ;
1344
+
1345
+ rc = reset_rx_pools (adapter );
1283
1346
if (rc )
1284
1347
return rc ;
1285
1348
0 commit comments