@@ -410,14 +410,28 @@ static int reset_rx_pools(struct ibmvnic_adapter *adapter)
410
410
struct ibmvnic_rx_pool * rx_pool ;
411
411
int rx_scrqs ;
412
412
int i , j , rc ;
413
+ u64 * size_array ;
414
+
415
+ size_array = (u64 * )((u8 * )(adapter -> login_rsp_buf ) +
416
+ be32_to_cpu (adapter -> login_rsp_buf -> off_rxadd_buff_size ));
413
417
414
418
rx_scrqs = be32_to_cpu (adapter -> login_rsp_buf -> num_rxadd_subcrqs );
415
419
for (i = 0 ; i < rx_scrqs ; i ++ ) {
416
420
rx_pool = & adapter -> rx_pool [i ];
417
421
418
422
netdev_dbg (adapter -> netdev , "Re-setting rx_pool[%d]\n" , i );
419
423
420
- rc = reset_long_term_buff (adapter , & rx_pool -> long_term_buff );
424
+ if (rx_pool -> buff_size != be64_to_cpu (size_array [i ])) {
425
+ free_long_term_buff (adapter , & rx_pool -> long_term_buff );
426
+ rx_pool -> buff_size = be64_to_cpu (size_array [i ]);
427
+ alloc_long_term_buff (adapter , & rx_pool -> long_term_buff ,
428
+ rx_pool -> size *
429
+ rx_pool -> buff_size );
430
+ } else {
431
+ rc = reset_long_term_buff (adapter ,
432
+ & rx_pool -> long_term_buff );
433
+ }
434
+
421
435
if (rc )
422
436
return rc ;
423
437
@@ -439,14 +453,12 @@ static int reset_rx_pools(struct ibmvnic_adapter *adapter)
439
453
static void release_rx_pools (struct ibmvnic_adapter * adapter )
440
454
{
441
455
struct ibmvnic_rx_pool * rx_pool ;
442
- int rx_scrqs ;
443
456
int i , j ;
444
457
445
458
if (!adapter -> rx_pool )
446
459
return ;
447
460
448
- rx_scrqs = be32_to_cpu (adapter -> login_rsp_buf -> num_rxadd_subcrqs );
449
- for (i = 0 ; i < rx_scrqs ; i ++ ) {
461
+ for (i = 0 ; i < adapter -> num_active_rx_pools ; i ++ ) {
450
462
rx_pool = & adapter -> rx_pool [i ];
451
463
452
464
netdev_dbg (adapter -> netdev , "Releasing rx_pool[%d]\n" , i );
@@ -469,6 +481,7 @@ static void release_rx_pools(struct ibmvnic_adapter *adapter)
469
481
470
482
kfree (adapter -> rx_pool );
471
483
adapter -> rx_pool = NULL ;
484
+ adapter -> num_active_rx_pools = 0 ;
472
485
}
473
486
474
487
static int init_rx_pools (struct net_device * netdev )
@@ -493,6 +506,8 @@ static int init_rx_pools(struct net_device *netdev)
493
506
return -1 ;
494
507
}
495
508
509
+ adapter -> num_active_rx_pools = 0 ;
510
+
496
511
for (i = 0 ; i < rxadd_subcrqs ; i ++ ) {
497
512
rx_pool = & adapter -> rx_pool [i ];
498
513
@@ -536,6 +551,8 @@ static int init_rx_pools(struct net_device *netdev)
536
551
rx_pool -> next_free = 0 ;
537
552
}
538
553
554
+ adapter -> num_active_rx_pools = rxadd_subcrqs ;
555
+
539
556
return 0 ;
540
557
}
541
558
@@ -586,13 +603,12 @@ static void release_vpd_data(struct ibmvnic_adapter *adapter)
586
603
static void release_tx_pools (struct ibmvnic_adapter * adapter )
587
604
{
588
605
struct ibmvnic_tx_pool * tx_pool ;
589
- int i , tx_scrqs ;
606
+ int i ;
590
607
591
608
if (!adapter -> tx_pool )
592
609
return ;
593
610
594
- tx_scrqs = be32_to_cpu (adapter -> login_rsp_buf -> num_txsubm_subcrqs );
595
- for (i = 0 ; i < tx_scrqs ; i ++ ) {
611
+ for (i = 0 ; i < adapter -> num_active_tx_pools ; i ++ ) {
596
612
netdev_dbg (adapter -> netdev , "Releasing tx_pool[%d]\n" , i );
597
613
tx_pool = & adapter -> tx_pool [i ];
598
614
kfree (tx_pool -> tx_buff );
@@ -603,6 +619,7 @@ static void release_tx_pools(struct ibmvnic_adapter *adapter)
603
619
604
620
kfree (adapter -> tx_pool );
605
621
adapter -> tx_pool = NULL ;
622
+ adapter -> num_active_tx_pools = 0 ;
606
623
}
607
624
608
625
static int init_tx_pools (struct net_device * netdev )
@@ -619,6 +636,8 @@ static int init_tx_pools(struct net_device *netdev)
619
636
if (!adapter -> tx_pool )
620
637
return -1 ;
621
638
639
+ adapter -> num_active_tx_pools = 0 ;
640
+
622
641
for (i = 0 ; i < tx_subcrqs ; i ++ ) {
623
642
tx_pool = & adapter -> tx_pool [i ];
624
643
@@ -666,6 +685,8 @@ static int init_tx_pools(struct net_device *netdev)
666
685
tx_pool -> producer_index = 0 ;
667
686
}
668
687
688
+ adapter -> num_active_tx_pools = tx_subcrqs ;
689
+
669
690
return 0 ;
670
691
}
671
692
@@ -1548,6 +1569,7 @@ static int ibmvnic_set_mac(struct net_device *netdev, void *p)
1548
1569
static int do_reset (struct ibmvnic_adapter * adapter ,
1549
1570
struct ibmvnic_rwi * rwi , u32 reset_state )
1550
1571
{
1572
+ u64 old_num_rx_queues , old_num_tx_queues ;
1551
1573
struct net_device * netdev = adapter -> netdev ;
1552
1574
int i , rc ;
1553
1575
@@ -1557,6 +1579,9 @@ static int do_reset(struct ibmvnic_adapter *adapter,
1557
1579
netif_carrier_off (netdev );
1558
1580
adapter -> reset_reason = rwi -> reset_reason ;
1559
1581
1582
+ old_num_rx_queues = adapter -> req_rx_queues ;
1583
+ old_num_tx_queues = adapter -> req_tx_queues ;
1584
+
1560
1585
if (rwi -> reset_reason == VNIC_RESET_MOBILITY ) {
1561
1586
rc = ibmvnic_reenable_crq_queue (adapter );
1562
1587
if (rc )
@@ -1601,6 +1626,12 @@ static int do_reset(struct ibmvnic_adapter *adapter,
1601
1626
rc = init_resources (adapter );
1602
1627
if (rc )
1603
1628
return rc ;
1629
+ } else if (adapter -> req_rx_queues != old_num_rx_queues ||
1630
+ adapter -> req_tx_queues != old_num_tx_queues ) {
1631
+ release_rx_pools (adapter );
1632
+ release_tx_pools (adapter );
1633
+ init_rx_pools (netdev );
1634
+ init_tx_pools (netdev );
1604
1635
} else {
1605
1636
rc = reset_tx_pools (adapter );
1606
1637
if (rc )
0 commit comments