@@ -163,6 +163,16 @@ static long h_reg_sub_crq(unsigned long unit_address, unsigned long token,
163163 return rc ;
164164}
165165
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+
166176static int alloc_long_term_buff (struct ibmvnic_adapter * adapter ,
167177 struct ibmvnic_long_term_buff * ltb , int size )
168178{
@@ -352,6 +362,32 @@ static int init_stats_token(struct ibmvnic_adapter *adapter)
352362 return 0 ;
353363}
354364
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+
355391static void release_rx_pools (struct ibmvnic_adapter * adapter )
356392{
357393 struct ibmvnic_rx_pool * rx_pool ;
@@ -453,6 +489,32 @@ static int init_rx_pools(struct net_device *netdev)
453489 return 0 ;
454490}
455491
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+
456518static void release_tx_pools (struct ibmvnic_adapter * adapter )
457519{
458520 struct ibmvnic_tx_pool * tx_pool ;
@@ -1258,7 +1320,6 @@ static int do_reset(struct ibmvnic_adapter *adapter,
12581320 */
12591321 adapter -> state = VNIC_PROBED ;
12601322
1261- release_resources (adapter );
12621323 release_sub_crqs (adapter );
12631324
12641325 rc = ibmvnic_init (adapter );
@@ -1277,9 +1338,11 @@ static int do_reset(struct ibmvnic_adapter *adapter,
12771338 return 0 ;
12781339 }
12791340
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 );
12831346 if (rc )
12841347 return rc ;
12851348
0 commit comments