@@ -159,6 +159,40 @@ static long h_reg_sub_crq(unsigned long unit_address, unsigned long token,
159
159
return rc ;
160
160
}
161
161
162
+ /**
163
+ * ibmvnic_wait_for_completion - Check device state and wait for completion
164
+ * @adapter: private device data
165
+ * @comp_done: completion structure to wait for
166
+ * @timeout: time to wait in milliseconds
167
+ *
168
+ * Wait for a completion signal or until the timeout limit is reached
169
+ * while checking that the device is still active.
170
+ */
171
+ static int ibmvnic_wait_for_completion (struct ibmvnic_adapter * adapter ,
172
+ struct completion * comp_done ,
173
+ unsigned long timeout )
174
+ {
175
+ struct net_device * netdev ;
176
+ unsigned long div_timeout ;
177
+ u8 retry ;
178
+
179
+ netdev = adapter -> netdev ;
180
+ retry = 5 ;
181
+ div_timeout = msecs_to_jiffies (timeout / retry );
182
+ while (true) {
183
+ if (!adapter -> crq .active ) {
184
+ netdev_err (netdev , "Device down!\n" );
185
+ return - ENODEV ;
186
+ }
187
+ if (retry -- )
188
+ break ;
189
+ if (wait_for_completion_timeout (comp_done , div_timeout ))
190
+ return 0 ;
191
+ }
192
+ netdev_err (netdev , "Operation timed out.\n" );
193
+ return - ETIMEDOUT ;
194
+ }
195
+
162
196
static int alloc_long_term_buff (struct ibmvnic_adapter * adapter ,
163
197
struct ibmvnic_long_term_buff * ltb , int size )
164
198
{
@@ -176,21 +210,35 @@ static int alloc_long_term_buff(struct ibmvnic_adapter *adapter,
176
210
ltb -> map_id = adapter -> map_id ;
177
211
adapter -> map_id ++ ;
178
212
179
- init_completion (& adapter -> fw_done );
213
+ mutex_lock (& adapter -> fw_lock );
214
+ adapter -> fw_done_rc = 0 ;
215
+ reinit_completion (& adapter -> fw_done );
180
216
rc = send_request_map (adapter , ltb -> addr ,
181
217
ltb -> size , ltb -> map_id );
182
218
if (rc ) {
183
219
dma_free_coherent (dev , ltb -> size , ltb -> buff , ltb -> addr );
220
+ mutex_unlock (& adapter -> fw_lock );
221
+ return rc ;
222
+ }
223
+
224
+ rc = ibmvnic_wait_for_completion (adapter , & adapter -> fw_done , 10000 );
225
+ if (rc ) {
226
+ dev_err (dev ,
227
+ "Long term map request aborted or timed out,rc = %d\n" ,
228
+ rc );
229
+ dma_free_coherent (dev , ltb -> size , ltb -> buff , ltb -> addr );
230
+ mutex_unlock (& adapter -> fw_lock );
184
231
return rc ;
185
232
}
186
- wait_for_completion (& adapter -> fw_done );
187
233
188
234
if (adapter -> fw_done_rc ) {
189
235
dev_err (dev , "Couldn't map long term buffer,rc = %d\n" ,
190
236
adapter -> fw_done_rc );
191
237
dma_free_coherent (dev , ltb -> size , ltb -> buff , ltb -> addr );
238
+ mutex_unlock (& adapter -> fw_lock );
192
239
return -1 ;
193
240
}
241
+ mutex_unlock (& adapter -> fw_lock );
194
242
return 0 ;
195
243
}
196
244
@@ -211,22 +259,37 @@ static void free_long_term_buff(struct ibmvnic_adapter *adapter,
211
259
static int reset_long_term_buff (struct ibmvnic_adapter * adapter ,
212
260
struct ibmvnic_long_term_buff * ltb )
213
261
{
262
+ struct device * dev = & adapter -> vdev -> dev ;
214
263
int rc ;
215
264
216
265
memset (ltb -> buff , 0 , ltb -> size );
217
266
218
- init_completion (& adapter -> fw_done );
267
+ mutex_lock (& adapter -> fw_lock );
268
+ adapter -> fw_done_rc = 0 ;
269
+
270
+ reinit_completion (& adapter -> fw_done );
219
271
rc = send_request_map (adapter , ltb -> addr , ltb -> size , ltb -> map_id );
220
- if (rc )
272
+ if (rc ) {
273
+ mutex_unlock (& adapter -> fw_lock );
274
+ return rc ;
275
+ }
276
+
277
+ rc = ibmvnic_wait_for_completion (adapter , & adapter -> fw_done , 10000 );
278
+ if (rc ) {
279
+ dev_info (dev ,
280
+ "Reset failed, long term map request timed out or aborted\n" );
281
+ mutex_unlock (& adapter -> fw_lock );
221
282
return rc ;
222
- wait_for_completion ( & adapter -> fw_done );
283
+ }
223
284
224
285
if (adapter -> fw_done_rc ) {
225
- dev_info (& adapter -> vdev -> dev ,
286
+ dev_info (dev ,
226
287
"Reset failed, attempting to free and reallocate buffer\n" );
227
288
free_long_term_buff (adapter , ltb );
289
+ mutex_unlock (& adapter -> fw_lock );
228
290
return alloc_long_term_buff (adapter , ltb , ltb -> size );
229
291
}
292
+ mutex_unlock (& adapter -> fw_lock );
230
293
return 0 ;
231
294
}
232
295
@@ -943,13 +1006,25 @@ static int ibmvnic_get_vpd(struct ibmvnic_adapter *adapter)
943
1006
if (adapter -> vpd -> buff )
944
1007
len = adapter -> vpd -> len ;
945
1008
946
- init_completion (& adapter -> fw_done );
1009
+ mutex_lock (& adapter -> fw_lock );
1010
+ adapter -> fw_done_rc = 0 ;
1011
+ reinit_completion (& adapter -> fw_done );
1012
+
947
1013
crq .get_vpd_size .first = IBMVNIC_CRQ_CMD ;
948
1014
crq .get_vpd_size .cmd = GET_VPD_SIZE ;
949
1015
rc = ibmvnic_send_crq (adapter , & crq );
950
- if (rc )
1016
+ if (rc ) {
1017
+ mutex_unlock (& adapter -> fw_lock );
951
1018
return rc ;
952
- wait_for_completion (& adapter -> fw_done );
1019
+ }
1020
+
1021
+ rc = ibmvnic_wait_for_completion (adapter , & adapter -> fw_done , 10000 );
1022
+ if (rc ) {
1023
+ dev_err (dev , "Could not retrieve VPD size, rc = %d\n" , rc );
1024
+ mutex_unlock (& adapter -> fw_lock );
1025
+ return rc ;
1026
+ }
1027
+ mutex_unlock (& adapter -> fw_lock );
953
1028
954
1029
if (!adapter -> vpd -> len )
955
1030
return - ENODATA ;
@@ -976,7 +1051,10 @@ static int ibmvnic_get_vpd(struct ibmvnic_adapter *adapter)
976
1051
return - ENOMEM ;
977
1052
}
978
1053
1054
+ mutex_lock (& adapter -> fw_lock );
1055
+ adapter -> fw_done_rc = 0 ;
979
1056
reinit_completion (& adapter -> fw_done );
1057
+
980
1058
crq .get_vpd .first = IBMVNIC_CRQ_CMD ;
981
1059
crq .get_vpd .cmd = GET_VPD ;
982
1060
crq .get_vpd .ioba = cpu_to_be32 (adapter -> vpd -> dma_addr );
@@ -985,10 +1063,20 @@ static int ibmvnic_get_vpd(struct ibmvnic_adapter *adapter)
985
1063
if (rc ) {
986
1064
kfree (adapter -> vpd -> buff );
987
1065
adapter -> vpd -> buff = NULL ;
1066
+ mutex_unlock (& adapter -> fw_lock );
1067
+ return rc ;
1068
+ }
1069
+
1070
+ rc = ibmvnic_wait_for_completion (adapter , & adapter -> fw_done , 10000 );
1071
+ if (rc ) {
1072
+ dev_err (dev , "Unable to retrieve VPD, rc = %d\n" , rc );
1073
+ kfree (adapter -> vpd -> buff );
1074
+ adapter -> vpd -> buff = NULL ;
1075
+ mutex_unlock (& adapter -> fw_lock );
988
1076
return rc ;
989
1077
}
990
- wait_for_completion (& adapter -> fw_done );
991
1078
1079
+ mutex_unlock (& adapter -> fw_lock );
992
1080
return 0 ;
993
1081
}
994
1082
@@ -1689,20 +1777,25 @@ static int __ibmvnic_set_mac(struct net_device *netdev, u8 *dev_addr)
1689
1777
crq .change_mac_addr .cmd = CHANGE_MAC_ADDR ;
1690
1778
ether_addr_copy (& crq .change_mac_addr .mac_addr [0 ], dev_addr );
1691
1779
1692
- init_completion (& adapter -> fw_done );
1780
+ mutex_lock (& adapter -> fw_lock );
1781
+ adapter -> fw_done_rc = 0 ;
1782
+ reinit_completion (& adapter -> fw_done );
1783
+
1693
1784
rc = ibmvnic_send_crq (adapter , & crq );
1694
1785
if (rc ) {
1695
1786
rc = - EIO ;
1787
+ mutex_unlock (& adapter -> fw_lock );
1696
1788
goto err ;
1697
1789
}
1698
1790
1699
- wait_for_completion ( & adapter -> fw_done );
1791
+ rc = ibmvnic_wait_for_completion ( adapter , & adapter -> fw_done , 10000 );
1700
1792
/* netdev->dev_addr is changed in handle_change_mac_rsp function */
1701
- if (adapter -> fw_done_rc ) {
1793
+ if (rc || adapter -> fw_done_rc ) {
1702
1794
rc = - EIO ;
1795
+ mutex_unlock (& adapter -> fw_lock );
1703
1796
goto err ;
1704
1797
}
1705
-
1798
+ mutex_unlock ( & adapter -> fw_lock );
1706
1799
return 0 ;
1707
1800
err :
1708
1801
ether_addr_copy (adapter -> mac_addr , netdev -> dev_addr );
@@ -2316,12 +2409,19 @@ static int wait_for_reset(struct ibmvnic_adapter *adapter)
2316
2409
adapter -> fallback .rx_entries = adapter -> req_rx_add_entries_per_subcrq ;
2317
2410
adapter -> fallback .tx_entries = adapter -> req_tx_entries_per_subcrq ;
2318
2411
2319
- init_completion (& adapter -> reset_done );
2412
+ reinit_completion (& adapter -> reset_done );
2320
2413
adapter -> wait_for_reset = true;
2321
2414
rc = ibmvnic_reset (adapter , VNIC_RESET_CHANGE_PARAM );
2322
- if (rc )
2323
- return rc ;
2324
- wait_for_completion (& adapter -> reset_done );
2415
+
2416
+ if (rc ) {
2417
+ ret = rc ;
2418
+ goto out ;
2419
+ }
2420
+ rc = ibmvnic_wait_for_completion (adapter , & adapter -> reset_done , 60000 );
2421
+ if (rc ) {
2422
+ ret = - ENODEV ;
2423
+ goto out ;
2424
+ }
2325
2425
2326
2426
ret = 0 ;
2327
2427
if (adapter -> reset_done_rc ) {
@@ -2332,13 +2432,21 @@ static int wait_for_reset(struct ibmvnic_adapter *adapter)
2332
2432
adapter -> desired .rx_entries = adapter -> fallback .rx_entries ;
2333
2433
adapter -> desired .tx_entries = adapter -> fallback .tx_entries ;
2334
2434
2335
- init_completion (& adapter -> reset_done );
2435
+ reinit_completion (& adapter -> reset_done );
2336
2436
adapter -> wait_for_reset = true;
2337
2437
rc = ibmvnic_reset (adapter , VNIC_RESET_CHANGE_PARAM );
2338
- if (rc )
2339
- return ret ;
2340
- wait_for_completion (& adapter -> reset_done );
2438
+ if (rc ) {
2439
+ ret = rc ;
2440
+ goto out ;
2441
+ }
2442
+ rc = ibmvnic_wait_for_completion (adapter , & adapter -> reset_done ,
2443
+ 60000 );
2444
+ if (rc ) {
2445
+ ret = - ENODEV ;
2446
+ goto out ;
2447
+ }
2341
2448
}
2449
+ out :
2342
2450
adapter -> wait_for_reset = false;
2343
2451
2344
2452
return ret ;
@@ -2603,11 +2711,13 @@ static void ibmvnic_get_ethtool_stats(struct net_device *dev,
2603
2711
cpu_to_be32 (sizeof (struct ibmvnic_statistics ));
2604
2712
2605
2713
/* Wait for data to be written */
2606
- init_completion (& adapter -> stats_done );
2714
+ reinit_completion (& adapter -> stats_done );
2607
2715
rc = ibmvnic_send_crq (adapter , & crq );
2608
2716
if (rc )
2609
2717
return ;
2610
- wait_for_completion (& adapter -> stats_done );
2718
+ rc = ibmvnic_wait_for_completion (adapter , & adapter -> stats_done , 10000 );
2719
+ if (rc )
2720
+ return ;
2611
2721
2612
2722
for (i = 0 ; i < ARRAY_SIZE (ibmvnic_stats ); i ++ )
2613
2723
data [i ] = be64_to_cpu (IBMVNIC_GET_STAT (adapter ,
@@ -4408,11 +4518,24 @@ static int send_query_phys_parms(struct ibmvnic_adapter *adapter)
4408
4518
memset (& crq , 0 , sizeof (crq ));
4409
4519
crq .query_phys_parms .first = IBMVNIC_CRQ_CMD ;
4410
4520
crq .query_phys_parms .cmd = QUERY_PHYS_PARMS ;
4411
- init_completion (& adapter -> fw_done );
4521
+
4522
+ mutex_lock (& adapter -> fw_lock );
4523
+ adapter -> fw_done_rc = 0 ;
4524
+ reinit_completion (& adapter -> fw_done );
4525
+
4412
4526
rc = ibmvnic_send_crq (adapter , & crq );
4413
- if (rc )
4527
+ if (rc ) {
4528
+ mutex_unlock (& adapter -> fw_lock );
4414
4529
return rc ;
4415
- wait_for_completion (& adapter -> fw_done );
4530
+ }
4531
+
4532
+ rc = ibmvnic_wait_for_completion (adapter , & adapter -> fw_done , 10000 );
4533
+ if (rc ) {
4534
+ mutex_unlock (& adapter -> fw_lock );
4535
+ return rc ;
4536
+ }
4537
+
4538
+ mutex_unlock (& adapter -> fw_lock );
4416
4539
return adapter -> fw_done_rc ? - EIO : 0 ;
4417
4540
}
4418
4541
@@ -4505,6 +4628,15 @@ static void ibmvnic_handle_crq(union ibmvnic_crq *crq,
4505
4628
case IBMVNIC_CRQ_XPORT_EVENT :
4506
4629
netif_carrier_off (netdev );
4507
4630
adapter -> crq .active = false;
4631
+ /* terminate any thread waiting for a response
4632
+ * from the device
4633
+ */
4634
+ if (!completion_done (& adapter -> fw_done )) {
4635
+ adapter -> fw_done_rc = - EIO ;
4636
+ complete (& adapter -> fw_done );
4637
+ }
4638
+ if (!completion_done (& adapter -> stats_done ))
4639
+ complete (& adapter -> stats_done );
4508
4640
if (test_bit (0 , & adapter -> resetting ))
4509
4641
adapter -> force_reset_recovery = true;
4510
4642
if (gen_crq -> cmd == IBMVNIC_PARTITION_MIGRATED ) {
@@ -4959,7 +5091,11 @@ static int ibmvnic_probe(struct vio_dev *dev, const struct vio_device_id *id)
4959
5091
__ibmvnic_delayed_reset );
4960
5092
INIT_LIST_HEAD (& adapter -> rwi_list );
4961
5093
spin_lock_init (& adapter -> rwi_lock );
5094
+ mutex_init (& adapter -> fw_lock );
4962
5095
init_completion (& adapter -> init_done );
5096
+ init_completion (& adapter -> fw_done );
5097
+ init_completion (& adapter -> reset_done );
5098
+ init_completion (& adapter -> stats_done );
4963
5099
clear_bit (0 , & adapter -> resetting );
4964
5100
4965
5101
do {
@@ -5017,6 +5153,7 @@ static int ibmvnic_probe(struct vio_dev *dev, const struct vio_device_id *id)
5017
5153
ibmvnic_init_fail :
5018
5154
release_sub_crqs (adapter , 1 );
5019
5155
release_crq_queue (adapter );
5156
+ mutex_destroy (& adapter -> fw_lock );
5020
5157
free_netdev (netdev );
5021
5158
5022
5159
return rc ;
@@ -5041,6 +5178,7 @@ static int ibmvnic_remove(struct vio_dev *dev)
5041
5178
adapter -> state = VNIC_REMOVED ;
5042
5179
5043
5180
rtnl_unlock ();
5181
+ mutex_destroy (& adapter -> fw_lock );
5044
5182
device_remove_file (& dev -> dev , & dev_attr_failover );
5045
5183
free_netdev (netdev );
5046
5184
dev_set_drvdata (& dev -> dev , NULL );
0 commit comments