@@ -3675,11 +3675,25 @@ static void send_request_cap(struct ibmvnic_adapter *adapter, int retry)
3675
3675
struct device * dev = & adapter -> vdev -> dev ;
3676
3676
union ibmvnic_crq crq ;
3677
3677
int max_entries ;
3678
+ int cap_reqs ;
3679
+
3680
+ /* We send out 6 or 7 REQUEST_CAPABILITY CRQs below (depending on
3681
+ * the PROMISC flag). Initialize this count upfront. When the tasklet
3682
+ * receives a response to all of these, it will send the next protocol
3683
+ * message (QUERY_IP_OFFLOAD).
3684
+ */
3685
+ if (!(adapter -> netdev -> flags & IFF_PROMISC ) ||
3686
+ adapter -> promisc_supported )
3687
+ cap_reqs = 7 ;
3688
+ else
3689
+ cap_reqs = 6 ;
3678
3690
3679
3691
if (!retry ) {
3680
3692
/* Sub-CRQ entries are 32 byte long */
3681
3693
int entries_page = 4 * PAGE_SIZE / (sizeof (u64 ) * 4 );
3682
3694
3695
+ atomic_set (& adapter -> running_cap_crqs , cap_reqs );
3696
+
3683
3697
if (adapter -> min_tx_entries_per_subcrq > entries_page ||
3684
3698
adapter -> min_rx_add_entries_per_subcrq > entries_page ) {
3685
3699
dev_err (dev , "Fatal, invalid entries per sub-crq\n" );
@@ -3740,61 +3754,67 @@ static void send_request_cap(struct ibmvnic_adapter *adapter, int retry)
3740
3754
adapter -> opt_rx_comp_queues ;
3741
3755
3742
3756
adapter -> req_rx_add_queues = adapter -> max_rx_add_queues ;
3757
+ } else {
3758
+ atomic_add (cap_reqs , & adapter -> running_cap_crqs );
3743
3759
}
3744
-
3745
3760
memset (& crq , 0 , sizeof (crq ));
3746
3761
crq .request_capability .first = IBMVNIC_CRQ_CMD ;
3747
3762
crq .request_capability .cmd = REQUEST_CAPABILITY ;
3748
3763
3749
3764
crq .request_capability .capability = cpu_to_be16 (REQ_TX_QUEUES );
3750
3765
crq .request_capability .number = cpu_to_be64 (adapter -> req_tx_queues );
3751
- atomic_inc ( & adapter -> running_cap_crqs ) ;
3766
+ cap_reqs -- ;
3752
3767
ibmvnic_send_crq (adapter , & crq );
3753
3768
3754
3769
crq .request_capability .capability = cpu_to_be16 (REQ_RX_QUEUES );
3755
3770
crq .request_capability .number = cpu_to_be64 (adapter -> req_rx_queues );
3756
- atomic_inc ( & adapter -> running_cap_crqs ) ;
3771
+ cap_reqs -- ;
3757
3772
ibmvnic_send_crq (adapter , & crq );
3758
3773
3759
3774
crq .request_capability .capability = cpu_to_be16 (REQ_RX_ADD_QUEUES );
3760
3775
crq .request_capability .number = cpu_to_be64 (adapter -> req_rx_add_queues );
3761
- atomic_inc ( & adapter -> running_cap_crqs ) ;
3776
+ cap_reqs -- ;
3762
3777
ibmvnic_send_crq (adapter , & crq );
3763
3778
3764
3779
crq .request_capability .capability =
3765
3780
cpu_to_be16 (REQ_TX_ENTRIES_PER_SUBCRQ );
3766
3781
crq .request_capability .number =
3767
3782
cpu_to_be64 (adapter -> req_tx_entries_per_subcrq );
3768
- atomic_inc ( & adapter -> running_cap_crqs ) ;
3783
+ cap_reqs -- ;
3769
3784
ibmvnic_send_crq (adapter , & crq );
3770
3785
3771
3786
crq .request_capability .capability =
3772
3787
cpu_to_be16 (REQ_RX_ADD_ENTRIES_PER_SUBCRQ );
3773
3788
crq .request_capability .number =
3774
3789
cpu_to_be64 (adapter -> req_rx_add_entries_per_subcrq );
3775
- atomic_inc ( & adapter -> running_cap_crqs ) ;
3790
+ cap_reqs -- ;
3776
3791
ibmvnic_send_crq (adapter , & crq );
3777
3792
3778
3793
crq .request_capability .capability = cpu_to_be16 (REQ_MTU );
3779
3794
crq .request_capability .number = cpu_to_be64 (adapter -> req_mtu );
3780
- atomic_inc ( & adapter -> running_cap_crqs ) ;
3795
+ cap_reqs -- ;
3781
3796
ibmvnic_send_crq (adapter , & crq );
3782
3797
3783
3798
if (adapter -> netdev -> flags & IFF_PROMISC ) {
3784
3799
if (adapter -> promisc_supported ) {
3785
3800
crq .request_capability .capability =
3786
3801
cpu_to_be16 (PROMISC_REQUESTED );
3787
3802
crq .request_capability .number = cpu_to_be64 (1 );
3788
- atomic_inc ( & adapter -> running_cap_crqs ) ;
3803
+ cap_reqs -- ;
3789
3804
ibmvnic_send_crq (adapter , & crq );
3790
3805
}
3791
3806
} else {
3792
3807
crq .request_capability .capability =
3793
3808
cpu_to_be16 (PROMISC_REQUESTED );
3794
3809
crq .request_capability .number = cpu_to_be64 (0 );
3795
- atomic_inc ( & adapter -> running_cap_crqs ) ;
3810
+ cap_reqs -- ;
3796
3811
ibmvnic_send_crq (adapter , & crq );
3797
3812
}
3813
+
3814
+ /* Keep at end to catch any discrepancy between expected and actual
3815
+ * CRQs sent.
3816
+ */
3817
+ WARN_ON (cap_reqs != 0 );
3798
3818
}
3799
3819
3800
3820
static int pending_scrq (struct ibmvnic_adapter * adapter ,
@@ -4188,118 +4208,132 @@ static void send_query_map(struct ibmvnic_adapter *adapter)
4188
4208
static void send_query_cap (struct ibmvnic_adapter * adapter )
4189
4209
{
4190
4210
union ibmvnic_crq crq ;
4211
+ int cap_reqs ;
4212
+
4213
+ /* We send out 25 QUERY_CAPABILITY CRQs below. Initialize this count
4214
+ * upfront. When the tasklet receives a response to all of these, it
4215
+ * can send out the next protocol messaage (REQUEST_CAPABILITY).
4216
+ */
4217
+ cap_reqs = 25 ;
4218
+
4219
+ atomic_set (& adapter -> running_cap_crqs , cap_reqs );
4191
4220
4192
- atomic_set (& adapter -> running_cap_crqs , 0 );
4193
4221
memset (& crq , 0 , sizeof (crq ));
4194
4222
crq .query_capability .first = IBMVNIC_CRQ_CMD ;
4195
4223
crq .query_capability .cmd = QUERY_CAPABILITY ;
4196
4224
4197
4225
crq .query_capability .capability = cpu_to_be16 (MIN_TX_QUEUES );
4198
- atomic_inc (& adapter -> running_cap_crqs );
4199
4226
ibmvnic_send_crq (adapter , & crq );
4227
+ cap_reqs -- ;
4200
4228
4201
4229
crq .query_capability .capability = cpu_to_be16 (MIN_RX_QUEUES );
4202
- atomic_inc (& adapter -> running_cap_crqs );
4203
4230
ibmvnic_send_crq (adapter , & crq );
4231
+ cap_reqs -- ;
4204
4232
4205
4233
crq .query_capability .capability = cpu_to_be16 (MIN_RX_ADD_QUEUES );
4206
- atomic_inc (& adapter -> running_cap_crqs );
4207
4234
ibmvnic_send_crq (adapter , & crq );
4235
+ cap_reqs -- ;
4208
4236
4209
4237
crq .query_capability .capability = cpu_to_be16 (MAX_TX_QUEUES );
4210
- atomic_inc (& adapter -> running_cap_crqs );
4211
4238
ibmvnic_send_crq (adapter , & crq );
4239
+ cap_reqs -- ;
4212
4240
4213
4241
crq .query_capability .capability = cpu_to_be16 (MAX_RX_QUEUES );
4214
- atomic_inc (& adapter -> running_cap_crqs );
4215
4242
ibmvnic_send_crq (adapter , & crq );
4243
+ cap_reqs -- ;
4216
4244
4217
4245
crq .query_capability .capability = cpu_to_be16 (MAX_RX_ADD_QUEUES );
4218
- atomic_inc (& adapter -> running_cap_crqs );
4219
4246
ibmvnic_send_crq (adapter , & crq );
4247
+ cap_reqs -- ;
4220
4248
4221
4249
crq .query_capability .capability =
4222
4250
cpu_to_be16 (MIN_TX_ENTRIES_PER_SUBCRQ );
4223
- atomic_inc (& adapter -> running_cap_crqs );
4224
4251
ibmvnic_send_crq (adapter , & crq );
4252
+ cap_reqs -- ;
4225
4253
4226
4254
crq .query_capability .capability =
4227
4255
cpu_to_be16 (MIN_RX_ADD_ENTRIES_PER_SUBCRQ );
4228
- atomic_inc (& adapter -> running_cap_crqs );
4229
4256
ibmvnic_send_crq (adapter , & crq );
4257
+ cap_reqs -- ;
4230
4258
4231
4259
crq .query_capability .capability =
4232
4260
cpu_to_be16 (MAX_TX_ENTRIES_PER_SUBCRQ );
4233
- atomic_inc (& adapter -> running_cap_crqs );
4234
4261
ibmvnic_send_crq (adapter , & crq );
4262
+ cap_reqs -- ;
4235
4263
4236
4264
crq .query_capability .capability =
4237
4265
cpu_to_be16 (MAX_RX_ADD_ENTRIES_PER_SUBCRQ );
4238
- atomic_inc (& adapter -> running_cap_crqs );
4239
4266
ibmvnic_send_crq (adapter , & crq );
4267
+ cap_reqs -- ;
4240
4268
4241
4269
crq .query_capability .capability = cpu_to_be16 (TCP_IP_OFFLOAD );
4242
- atomic_inc (& adapter -> running_cap_crqs );
4243
4270
ibmvnic_send_crq (adapter , & crq );
4271
+ cap_reqs -- ;
4244
4272
4245
4273
crq .query_capability .capability = cpu_to_be16 (PROMISC_SUPPORTED );
4246
- atomic_inc (& adapter -> running_cap_crqs );
4247
4274
ibmvnic_send_crq (adapter , & crq );
4275
+ cap_reqs -- ;
4248
4276
4249
4277
crq .query_capability .capability = cpu_to_be16 (MIN_MTU );
4250
- atomic_inc (& adapter -> running_cap_crqs );
4251
4278
ibmvnic_send_crq (adapter , & crq );
4279
+ cap_reqs -- ;
4252
4280
4253
4281
crq .query_capability .capability = cpu_to_be16 (MAX_MTU );
4254
- atomic_inc (& adapter -> running_cap_crqs );
4255
4282
ibmvnic_send_crq (adapter , & crq );
4283
+ cap_reqs -- ;
4256
4284
4257
4285
crq .query_capability .capability = cpu_to_be16 (MAX_MULTICAST_FILTERS );
4258
- atomic_inc (& adapter -> running_cap_crqs );
4259
4286
ibmvnic_send_crq (adapter , & crq );
4287
+ cap_reqs -- ;
4260
4288
4261
4289
crq .query_capability .capability = cpu_to_be16 (VLAN_HEADER_INSERTION );
4262
- atomic_inc (& adapter -> running_cap_crqs );
4263
4290
ibmvnic_send_crq (adapter , & crq );
4291
+ cap_reqs -- ;
4264
4292
4265
4293
crq .query_capability .capability = cpu_to_be16 (RX_VLAN_HEADER_INSERTION );
4266
- atomic_inc (& adapter -> running_cap_crqs );
4267
4294
ibmvnic_send_crq (adapter , & crq );
4295
+ cap_reqs -- ;
4268
4296
4269
4297
crq .query_capability .capability = cpu_to_be16 (MAX_TX_SG_ENTRIES );
4270
- atomic_inc (& adapter -> running_cap_crqs );
4271
4298
ibmvnic_send_crq (adapter , & crq );
4299
+ cap_reqs -- ;
4272
4300
4273
4301
crq .query_capability .capability = cpu_to_be16 (RX_SG_SUPPORTED );
4274
- atomic_inc (& adapter -> running_cap_crqs );
4275
4302
ibmvnic_send_crq (adapter , & crq );
4303
+ cap_reqs -- ;
4276
4304
4277
4305
crq .query_capability .capability = cpu_to_be16 (OPT_TX_COMP_SUB_QUEUES );
4278
- atomic_inc (& adapter -> running_cap_crqs );
4279
4306
ibmvnic_send_crq (adapter , & crq );
4307
+ cap_reqs -- ;
4280
4308
4281
4309
crq .query_capability .capability = cpu_to_be16 (OPT_RX_COMP_QUEUES );
4282
- atomic_inc (& adapter -> running_cap_crqs );
4283
4310
ibmvnic_send_crq (adapter , & crq );
4311
+ cap_reqs -- ;
4284
4312
4285
4313
crq .query_capability .capability =
4286
4314
cpu_to_be16 (OPT_RX_BUFADD_Q_PER_RX_COMP_Q );
4287
- atomic_inc (& adapter -> running_cap_crqs );
4288
4315
ibmvnic_send_crq (adapter , & crq );
4316
+ cap_reqs -- ;
4289
4317
4290
4318
crq .query_capability .capability =
4291
4319
cpu_to_be16 (OPT_TX_ENTRIES_PER_SUBCRQ );
4292
- atomic_inc (& adapter -> running_cap_crqs );
4293
4320
ibmvnic_send_crq (adapter , & crq );
4321
+ cap_reqs -- ;
4294
4322
4295
4323
crq .query_capability .capability =
4296
4324
cpu_to_be16 (OPT_RXBA_ENTRIES_PER_SUBCRQ );
4297
- atomic_inc (& adapter -> running_cap_crqs );
4298
4325
ibmvnic_send_crq (adapter , & crq );
4326
+ cap_reqs -- ;
4299
4327
4300
4328
crq .query_capability .capability = cpu_to_be16 (TX_RX_DESC_REQ );
4301
- atomic_inc ( & adapter -> running_cap_crqs );
4329
+
4302
4330
ibmvnic_send_crq (adapter , & crq );
4331
+ cap_reqs -- ;
4332
+
4333
+ /* Keep at end to catch any discrepancy between expected and actual
4334
+ * CRQs sent.
4335
+ */
4336
+ WARN_ON (cap_reqs != 0 );
4303
4337
}
4304
4338
4305
4339
static void send_query_ip_offload (struct ibmvnic_adapter * adapter )
@@ -4604,6 +4638,8 @@ static void handle_request_cap_rsp(union ibmvnic_crq *crq,
4604
4638
char * name ;
4605
4639
4606
4640
atomic_dec (& adapter -> running_cap_crqs );
4641
+ netdev_dbg (adapter -> netdev , "Outstanding request-caps: %d\n" ,
4642
+ atomic_read (& adapter -> running_cap_crqs ));
4607
4643
switch (be16_to_cpu (crq -> request_capability_rsp .capability )) {
4608
4644
case REQ_TX_QUEUES :
4609
4645
req_value = & adapter -> req_tx_queues ;
0 commit comments