@@ -3857,11 +3857,25 @@ static void send_request_cap(struct ibmvnic_adapter *adapter, int retry)
3857
3857
struct device * dev = & adapter -> vdev -> dev ;
3858
3858
union ibmvnic_crq crq ;
3859
3859
int max_entries ;
3860
+ int cap_reqs ;
3861
+
3862
+ /* We send out 6 or 7 REQUEST_CAPABILITY CRQs below (depending on
3863
+ * the PROMISC flag). Initialize this count upfront. When the tasklet
3864
+ * receives a response to all of these, it will send the next protocol
3865
+ * message (QUERY_IP_OFFLOAD).
3866
+ */
3867
+ if (!(adapter -> netdev -> flags & IFF_PROMISC ) ||
3868
+ adapter -> promisc_supported )
3869
+ cap_reqs = 7 ;
3870
+ else
3871
+ cap_reqs = 6 ;
3860
3872
3861
3873
if (!retry ) {
3862
3874
/* Sub-CRQ entries are 32 byte long */
3863
3875
int entries_page = 4 * PAGE_SIZE / (sizeof (u64 ) * 4 );
3864
3876
3877
+ atomic_set (& adapter -> running_cap_crqs , cap_reqs );
3878
+
3865
3879
if (adapter -> min_tx_entries_per_subcrq > entries_page ||
3866
3880
adapter -> min_rx_add_entries_per_subcrq > entries_page ) {
3867
3881
dev_err (dev , "Fatal, invalid entries per sub-crq\n" );
@@ -3922,61 +3936,67 @@ static void send_request_cap(struct ibmvnic_adapter *adapter, int retry)
3922
3936
adapter -> opt_rx_comp_queues ;
3923
3937
3924
3938
adapter -> req_rx_add_queues = adapter -> max_rx_add_queues ;
3939
+ } else {
3940
+ atomic_add (cap_reqs , & adapter -> running_cap_crqs );
3925
3941
}
3926
-
3927
3942
memset (& crq , 0 , sizeof (crq ));
3928
3943
crq .request_capability .first = IBMVNIC_CRQ_CMD ;
3929
3944
crq .request_capability .cmd = REQUEST_CAPABILITY ;
3930
3945
3931
3946
crq .request_capability .capability = cpu_to_be16 (REQ_TX_QUEUES );
3932
3947
crq .request_capability .number = cpu_to_be64 (adapter -> req_tx_queues );
3933
- atomic_inc ( & adapter -> running_cap_crqs ) ;
3948
+ cap_reqs -- ;
3934
3949
ibmvnic_send_crq (adapter , & crq );
3935
3950
3936
3951
crq .request_capability .capability = cpu_to_be16 (REQ_RX_QUEUES );
3937
3952
crq .request_capability .number = cpu_to_be64 (adapter -> req_rx_queues );
3938
- atomic_inc ( & adapter -> running_cap_crqs ) ;
3953
+ cap_reqs -- ;
3939
3954
ibmvnic_send_crq (adapter , & crq );
3940
3955
3941
3956
crq .request_capability .capability = cpu_to_be16 (REQ_RX_ADD_QUEUES );
3942
3957
crq .request_capability .number = cpu_to_be64 (adapter -> req_rx_add_queues );
3943
- atomic_inc ( & adapter -> running_cap_crqs ) ;
3958
+ cap_reqs -- ;
3944
3959
ibmvnic_send_crq (adapter , & crq );
3945
3960
3946
3961
crq .request_capability .capability =
3947
3962
cpu_to_be16 (REQ_TX_ENTRIES_PER_SUBCRQ );
3948
3963
crq .request_capability .number =
3949
3964
cpu_to_be64 (adapter -> req_tx_entries_per_subcrq );
3950
- atomic_inc ( & adapter -> running_cap_crqs ) ;
3965
+ cap_reqs -- ;
3951
3966
ibmvnic_send_crq (adapter , & crq );
3952
3967
3953
3968
crq .request_capability .capability =
3954
3969
cpu_to_be16 (REQ_RX_ADD_ENTRIES_PER_SUBCRQ );
3955
3970
crq .request_capability .number =
3956
3971
cpu_to_be64 (adapter -> req_rx_add_entries_per_subcrq );
3957
- atomic_inc ( & adapter -> running_cap_crqs ) ;
3972
+ cap_reqs -- ;
3958
3973
ibmvnic_send_crq (adapter , & crq );
3959
3974
3960
3975
crq .request_capability .capability = cpu_to_be16 (REQ_MTU );
3961
3976
crq .request_capability .number = cpu_to_be64 (adapter -> req_mtu );
3962
- atomic_inc ( & adapter -> running_cap_crqs ) ;
3977
+ cap_reqs -- ;
3963
3978
ibmvnic_send_crq (adapter , & crq );
3964
3979
3965
3980
if (adapter -> netdev -> flags & IFF_PROMISC ) {
3966
3981
if (adapter -> promisc_supported ) {
3967
3982
crq .request_capability .capability =
3968
3983
cpu_to_be16 (PROMISC_REQUESTED );
3969
3984
crq .request_capability .number = cpu_to_be64 (1 );
3970
- atomic_inc ( & adapter -> running_cap_crqs ) ;
3985
+ cap_reqs -- ;
3971
3986
ibmvnic_send_crq (adapter , & crq );
3972
3987
}
3973
3988
} else {
3974
3989
crq .request_capability .capability =
3975
3990
cpu_to_be16 (PROMISC_REQUESTED );
3976
3991
crq .request_capability .number = cpu_to_be64 (0 );
3977
- atomic_inc ( & adapter -> running_cap_crqs ) ;
3992
+ cap_reqs -- ;
3978
3993
ibmvnic_send_crq (adapter , & crq );
3979
3994
}
3995
+
3996
+ /* Keep at end to catch any discrepancy between expected and actual
3997
+ * CRQs sent.
3998
+ */
3999
+ WARN_ON (cap_reqs != 0 );
3980
4000
}
3981
4001
3982
4002
static int pending_scrq (struct ibmvnic_adapter * adapter ,
@@ -4370,118 +4390,132 @@ static void send_query_map(struct ibmvnic_adapter *adapter)
4370
4390
static void send_query_cap (struct ibmvnic_adapter * adapter )
4371
4391
{
4372
4392
union ibmvnic_crq crq ;
4393
+ int cap_reqs ;
4394
+
4395
+ /* We send out 25 QUERY_CAPABILITY CRQs below. Initialize this count
4396
+ * upfront. When the tasklet receives a response to all of these, it
4397
+ * can send out the next protocol messaage (REQUEST_CAPABILITY).
4398
+ */
4399
+ cap_reqs = 25 ;
4400
+
4401
+ atomic_set (& adapter -> running_cap_crqs , cap_reqs );
4373
4402
4374
- atomic_set (& adapter -> running_cap_crqs , 0 );
4375
4403
memset (& crq , 0 , sizeof (crq ));
4376
4404
crq .query_capability .first = IBMVNIC_CRQ_CMD ;
4377
4405
crq .query_capability .cmd = QUERY_CAPABILITY ;
4378
4406
4379
4407
crq .query_capability .capability = cpu_to_be16 (MIN_TX_QUEUES );
4380
- atomic_inc (& adapter -> running_cap_crqs );
4381
4408
ibmvnic_send_crq (adapter , & crq );
4409
+ cap_reqs -- ;
4382
4410
4383
4411
crq .query_capability .capability = cpu_to_be16 (MIN_RX_QUEUES );
4384
- atomic_inc (& adapter -> running_cap_crqs );
4385
4412
ibmvnic_send_crq (adapter , & crq );
4413
+ cap_reqs -- ;
4386
4414
4387
4415
crq .query_capability .capability = cpu_to_be16 (MIN_RX_ADD_QUEUES );
4388
- atomic_inc (& adapter -> running_cap_crqs );
4389
4416
ibmvnic_send_crq (adapter , & crq );
4417
+ cap_reqs -- ;
4390
4418
4391
4419
crq .query_capability .capability = cpu_to_be16 (MAX_TX_QUEUES );
4392
- atomic_inc (& adapter -> running_cap_crqs );
4393
4420
ibmvnic_send_crq (adapter , & crq );
4421
+ cap_reqs -- ;
4394
4422
4395
4423
crq .query_capability .capability = cpu_to_be16 (MAX_RX_QUEUES );
4396
- atomic_inc (& adapter -> running_cap_crqs );
4397
4424
ibmvnic_send_crq (adapter , & crq );
4425
+ cap_reqs -- ;
4398
4426
4399
4427
crq .query_capability .capability = cpu_to_be16 (MAX_RX_ADD_QUEUES );
4400
- atomic_inc (& adapter -> running_cap_crqs );
4401
4428
ibmvnic_send_crq (adapter , & crq );
4429
+ cap_reqs -- ;
4402
4430
4403
4431
crq .query_capability .capability =
4404
4432
cpu_to_be16 (MIN_TX_ENTRIES_PER_SUBCRQ );
4405
- atomic_inc (& adapter -> running_cap_crqs );
4406
4433
ibmvnic_send_crq (adapter , & crq );
4434
+ cap_reqs -- ;
4407
4435
4408
4436
crq .query_capability .capability =
4409
4437
cpu_to_be16 (MIN_RX_ADD_ENTRIES_PER_SUBCRQ );
4410
- atomic_inc (& adapter -> running_cap_crqs );
4411
4438
ibmvnic_send_crq (adapter , & crq );
4439
+ cap_reqs -- ;
4412
4440
4413
4441
crq .query_capability .capability =
4414
4442
cpu_to_be16 (MAX_TX_ENTRIES_PER_SUBCRQ );
4415
- atomic_inc (& adapter -> running_cap_crqs );
4416
4443
ibmvnic_send_crq (adapter , & crq );
4444
+ cap_reqs -- ;
4417
4445
4418
4446
crq .query_capability .capability =
4419
4447
cpu_to_be16 (MAX_RX_ADD_ENTRIES_PER_SUBCRQ );
4420
- atomic_inc (& adapter -> running_cap_crqs );
4421
4448
ibmvnic_send_crq (adapter , & crq );
4449
+ cap_reqs -- ;
4422
4450
4423
4451
crq .query_capability .capability = cpu_to_be16 (TCP_IP_OFFLOAD );
4424
- atomic_inc (& adapter -> running_cap_crqs );
4425
4452
ibmvnic_send_crq (adapter , & crq );
4453
+ cap_reqs -- ;
4426
4454
4427
4455
crq .query_capability .capability = cpu_to_be16 (PROMISC_SUPPORTED );
4428
- atomic_inc (& adapter -> running_cap_crqs );
4429
4456
ibmvnic_send_crq (adapter , & crq );
4457
+ cap_reqs -- ;
4430
4458
4431
4459
crq .query_capability .capability = cpu_to_be16 (MIN_MTU );
4432
- atomic_inc (& adapter -> running_cap_crqs );
4433
4460
ibmvnic_send_crq (adapter , & crq );
4461
+ cap_reqs -- ;
4434
4462
4435
4463
crq .query_capability .capability = cpu_to_be16 (MAX_MTU );
4436
- atomic_inc (& adapter -> running_cap_crqs );
4437
4464
ibmvnic_send_crq (adapter , & crq );
4465
+ cap_reqs -- ;
4438
4466
4439
4467
crq .query_capability .capability = cpu_to_be16 (MAX_MULTICAST_FILTERS );
4440
- atomic_inc (& adapter -> running_cap_crqs );
4441
4468
ibmvnic_send_crq (adapter , & crq );
4469
+ cap_reqs -- ;
4442
4470
4443
4471
crq .query_capability .capability = cpu_to_be16 (VLAN_HEADER_INSERTION );
4444
- atomic_inc (& adapter -> running_cap_crqs );
4445
4472
ibmvnic_send_crq (adapter , & crq );
4473
+ cap_reqs -- ;
4446
4474
4447
4475
crq .query_capability .capability = cpu_to_be16 (RX_VLAN_HEADER_INSERTION );
4448
- atomic_inc (& adapter -> running_cap_crqs );
4449
4476
ibmvnic_send_crq (adapter , & crq );
4477
+ cap_reqs -- ;
4450
4478
4451
4479
crq .query_capability .capability = cpu_to_be16 (MAX_TX_SG_ENTRIES );
4452
- atomic_inc (& adapter -> running_cap_crqs );
4453
4480
ibmvnic_send_crq (adapter , & crq );
4481
+ cap_reqs -- ;
4454
4482
4455
4483
crq .query_capability .capability = cpu_to_be16 (RX_SG_SUPPORTED );
4456
- atomic_inc (& adapter -> running_cap_crqs );
4457
4484
ibmvnic_send_crq (adapter , & crq );
4485
+ cap_reqs -- ;
4458
4486
4459
4487
crq .query_capability .capability = cpu_to_be16 (OPT_TX_COMP_SUB_QUEUES );
4460
- atomic_inc (& adapter -> running_cap_crqs );
4461
4488
ibmvnic_send_crq (adapter , & crq );
4489
+ cap_reqs -- ;
4462
4490
4463
4491
crq .query_capability .capability = cpu_to_be16 (OPT_RX_COMP_QUEUES );
4464
- atomic_inc (& adapter -> running_cap_crqs );
4465
4492
ibmvnic_send_crq (adapter , & crq );
4493
+ cap_reqs -- ;
4466
4494
4467
4495
crq .query_capability .capability =
4468
4496
cpu_to_be16 (OPT_RX_BUFADD_Q_PER_RX_COMP_Q );
4469
- atomic_inc (& adapter -> running_cap_crqs );
4470
4497
ibmvnic_send_crq (adapter , & crq );
4498
+ cap_reqs -- ;
4471
4499
4472
4500
crq .query_capability .capability =
4473
4501
cpu_to_be16 (OPT_TX_ENTRIES_PER_SUBCRQ );
4474
- atomic_inc (& adapter -> running_cap_crqs );
4475
4502
ibmvnic_send_crq (adapter , & crq );
4503
+ cap_reqs -- ;
4476
4504
4477
4505
crq .query_capability .capability =
4478
4506
cpu_to_be16 (OPT_RXBA_ENTRIES_PER_SUBCRQ );
4479
- atomic_inc (& adapter -> running_cap_crqs );
4480
4507
ibmvnic_send_crq (adapter , & crq );
4508
+ cap_reqs -- ;
4481
4509
4482
4510
crq .query_capability .capability = cpu_to_be16 (TX_RX_DESC_REQ );
4483
- atomic_inc ( & adapter -> running_cap_crqs );
4511
+
4484
4512
ibmvnic_send_crq (adapter , & crq );
4513
+ cap_reqs -- ;
4514
+
4515
+ /* Keep at end to catch any discrepancy between expected and actual
4516
+ * CRQs sent.
4517
+ */
4518
+ WARN_ON (cap_reqs != 0 );
4485
4519
}
4486
4520
4487
4521
static void send_query_ip_offload (struct ibmvnic_adapter * adapter )
@@ -4785,6 +4819,8 @@ static void handle_request_cap_rsp(union ibmvnic_crq *crq,
4785
4819
char * name ;
4786
4820
4787
4821
atomic_dec (& adapter -> running_cap_crqs );
4822
+ netdev_dbg (adapter -> netdev , "Outstanding request-caps: %d\n" ,
4823
+ atomic_read (& adapter -> running_cap_crqs ));
4788
4824
switch (be16_to_cpu (crq -> request_capability_rsp .capability )) {
4789
4825
case REQ_TX_QUEUES :
4790
4826
req_value = & adapter -> req_tx_queues ;
0 commit comments