@@ -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
@@ -860,7 +881,7 @@ static int ibmvnic_get_vpd(struct ibmvnic_adapter *adapter)
860
881
if (adapter -> vpd -> buff )
861
882
len = adapter -> vpd -> len ;
862
883
863
- reinit_completion (& adapter -> fw_done );
884
+ init_completion (& adapter -> fw_done );
864
885
crq .get_vpd_size .first = IBMVNIC_CRQ_CMD ;
865
886
crq .get_vpd_size .cmd = GET_VPD_SIZE ;
866
887
ibmvnic_send_crq (adapter , & crq );
@@ -922,6 +943,13 @@ static int init_resources(struct ibmvnic_adapter *adapter)
922
943
if (!adapter -> vpd )
923
944
return - ENOMEM ;
924
945
946
+ /* Vital Product Data (VPD) */
947
+ rc = ibmvnic_get_vpd (adapter );
948
+ if (rc ) {
949
+ netdev_err (netdev , "failed to initialize Vital Product Data (VPD)\n" );
950
+ return rc ;
951
+ }
952
+
925
953
adapter -> map_id = 1 ;
926
954
adapter -> napi = kcalloc (adapter -> req_rx_queues ,
927
955
sizeof (struct napi_struct ), GFP_KERNEL );
@@ -995,7 +1023,7 @@ static int __ibmvnic_open(struct net_device *netdev)
995
1023
static int ibmvnic_open (struct net_device * netdev )
996
1024
{
997
1025
struct ibmvnic_adapter * adapter = netdev_priv (netdev );
998
- int rc , vpd ;
1026
+ int rc ;
999
1027
1000
1028
mutex_lock (& adapter -> reset_lock );
1001
1029
@@ -1018,11 +1046,6 @@ static int ibmvnic_open(struct net_device *netdev)
1018
1046
rc = __ibmvnic_open (netdev );
1019
1047
netif_carrier_on (netdev );
1020
1048
1021
- /* Vital Product Data (VPD) */
1022
- vpd = ibmvnic_get_vpd (adapter );
1023
- if (vpd )
1024
- netdev_err (netdev , "failed to initialize Vital Product Data (VPD)\n" );
1025
-
1026
1049
mutex_unlock (& adapter -> reset_lock );
1027
1050
1028
1051
return rc ;
@@ -1548,6 +1571,7 @@ static int ibmvnic_set_mac(struct net_device *netdev, void *p)
1548
1571
static int do_reset (struct ibmvnic_adapter * adapter ,
1549
1572
struct ibmvnic_rwi * rwi , u32 reset_state )
1550
1573
{
1574
+ u64 old_num_rx_queues , old_num_tx_queues ;
1551
1575
struct net_device * netdev = adapter -> netdev ;
1552
1576
int i , rc ;
1553
1577
@@ -1557,6 +1581,9 @@ static int do_reset(struct ibmvnic_adapter *adapter,
1557
1581
netif_carrier_off (netdev );
1558
1582
adapter -> reset_reason = rwi -> reset_reason ;
1559
1583
1584
+ old_num_rx_queues = adapter -> req_rx_queues ;
1585
+ old_num_tx_queues = adapter -> req_tx_queues ;
1586
+
1560
1587
if (rwi -> reset_reason == VNIC_RESET_MOBILITY ) {
1561
1588
rc = ibmvnic_reenable_crq_queue (adapter );
1562
1589
if (rc )
@@ -1601,6 +1628,12 @@ static int do_reset(struct ibmvnic_adapter *adapter,
1601
1628
rc = init_resources (adapter );
1602
1629
if (rc )
1603
1630
return rc ;
1631
+ } else if (adapter -> req_rx_queues != old_num_rx_queues ||
1632
+ adapter -> req_tx_queues != old_num_tx_queues ) {
1633
+ release_rx_pools (adapter );
1634
+ release_tx_pools (adapter );
1635
+ init_rx_pools (netdev );
1636
+ init_tx_pools (netdev );
1604
1637
} else {
1605
1638
rc = reset_tx_pools (adapter );
1606
1639
if (rc )
@@ -3592,7 +3625,17 @@ static void handle_request_cap_rsp(union ibmvnic_crq *crq,
3592
3625
* req_value ,
3593
3626
(long int )be64_to_cpu (crq -> request_capability_rsp .
3594
3627
number ), name );
3595
- * req_value = be64_to_cpu (crq -> request_capability_rsp .number );
3628
+
3629
+ if (be16_to_cpu (crq -> request_capability_rsp .capability ) ==
3630
+ REQ_MTU ) {
3631
+ pr_err ("mtu of %llu is not supported. Reverting.\n" ,
3632
+ * req_value );
3633
+ * req_value = adapter -> fallback .mtu ;
3634
+ } else {
3635
+ * req_value =
3636
+ be64_to_cpu (crq -> request_capability_rsp .number );
3637
+ }
3638
+
3596
3639
ibmvnic_send_req_caps (adapter , 1 );
3597
3640
return ;
3598
3641
default :
0 commit comments