48
48
#define PQI_POST_RESET_DELAY_SECS 5
49
49
#define PQI_POST_OFA_RESET_DELAY_UPON_TIMEOUT_SECS 10
50
50
51
+ #define PQI_NO_COMPLETION ((void *)-1)
52
+
51
53
MODULE_AUTHOR ("Microchip" );
52
54
MODULE_DESCRIPTION ("Driver for Microchip Smart Family Controller version "
53
55
DRIVER_VERSION );
@@ -96,6 +98,7 @@ static int pqi_ofa_host_memory_update(struct pqi_ctrl_info *ctrl_info);
96
98
static int pqi_device_wait_for_pending_io (struct pqi_ctrl_info * ctrl_info ,
97
99
struct pqi_scsi_dev * device , u8 lun , unsigned long timeout_msecs );
98
100
static void pqi_fail_all_outstanding_requests (struct pqi_ctrl_info * ctrl_info );
101
+ static void pqi_tmf_worker (struct work_struct * work );
99
102
100
103
/* for flags argument to pqi_submit_raid_request_synchronous() */
101
104
#define PQI_SYNC_FLAGS_INTERRUPTABLE 0x1
@@ -455,6 +458,21 @@ static inline bool pqi_device_in_remove(struct pqi_scsi_dev *device)
455
458
return device -> in_remove ;
456
459
}
457
460
461
+ static inline void pqi_device_reset_start (struct pqi_scsi_dev * device , u8 lun )
462
+ {
463
+ device -> in_reset [lun ] = true;
464
+ }
465
+
466
+ static inline void pqi_device_reset_done (struct pqi_scsi_dev * device , u8 lun )
467
+ {
468
+ device -> in_reset [lun ] = false;
469
+ }
470
+
471
+ static inline bool pqi_device_in_reset (struct pqi_scsi_dev * device , u8 lun )
472
+ {
473
+ return device -> in_reset [lun ];
474
+ }
475
+
458
476
static inline int pqi_event_type_to_event_index (unsigned int event_type )
459
477
{
460
478
int index ;
@@ -2137,6 +2155,15 @@ static inline bool pqi_is_device_added(struct pqi_scsi_dev *device)
2137
2155
return device -> sdev != NULL ;
2138
2156
}
2139
2157
2158
+ static inline void pqi_init_device_tmf_work (struct pqi_scsi_dev * device )
2159
+ {
2160
+ unsigned int lun ;
2161
+ struct pqi_tmf_work * tmf_work ;
2162
+
2163
+ for (lun = 0 , tmf_work = device -> tmf_work ; lun < PQI_MAX_LUNS_PER_DEVICE ; lun ++ , tmf_work ++ )
2164
+ INIT_WORK (& tmf_work -> work_struct , pqi_tmf_worker );
2165
+ }
2166
+
2140
2167
static void pqi_update_device_list (struct pqi_ctrl_info * ctrl_info ,
2141
2168
struct pqi_scsi_dev * new_device_list [], unsigned int num_new_devices )
2142
2169
{
@@ -2217,6 +2244,7 @@ static void pqi_update_device_list(struct pqi_ctrl_info *ctrl_info,
2217
2244
list_add_tail (& device -> add_list_entry , & add_list );
2218
2245
/* To prevent this device structure from being freed later. */
2219
2246
device -> keep_device = true;
2247
+ pqi_init_device_tmf_work (device );
2220
2248
}
2221
2249
2222
2250
spin_unlock_irqrestore (& ctrl_info -> scsi_device_list_lock , flags );
@@ -5850,6 +5878,7 @@ static inline bool pqi_is_bypass_eligible_request(struct scsi_cmnd *scmd)
5850
5878
void pqi_prep_for_scsi_done (struct scsi_cmnd * scmd )
5851
5879
{
5852
5880
struct pqi_scsi_dev * device ;
5881
+ struct completion * wait ;
5853
5882
5854
5883
if (!scmd -> device ) {
5855
5884
set_host_byte (scmd , DID_NO_CONNECT );
@@ -5863,6 +5892,10 @@ void pqi_prep_for_scsi_done(struct scsi_cmnd *scmd)
5863
5892
}
5864
5893
5865
5894
atomic_dec (& device -> scsi_cmds_outstanding [scmd -> device -> lun ]);
5895
+
5896
+ wait = (struct completion * )xchg (& scmd -> host_scribble , NULL );
5897
+ if (wait != PQI_NO_COMPLETION )
5898
+ complete (wait );
5866
5899
}
5867
5900
5868
5901
static bool pqi_is_parity_write_stream (struct pqi_ctrl_info * ctrl_info ,
@@ -5948,6 +5981,9 @@ static int pqi_scsi_queue_command(struct Scsi_Host *shost, struct scsi_cmnd *scm
5948
5981
u16 hw_queue ;
5949
5982
struct pqi_queue_group * queue_group ;
5950
5983
bool raid_bypassed ;
5984
+ u8 lun ;
5985
+
5986
+ scmd -> host_scribble = PQI_NO_COMPLETION ;
5951
5987
5952
5988
device = scmd -> device -> hostdata ;
5953
5989
@@ -5957,7 +5993,9 @@ static int pqi_scsi_queue_command(struct Scsi_Host *shost, struct scsi_cmnd *scm
5957
5993
return 0 ;
5958
5994
}
5959
5995
5960
- atomic_inc (& device -> scsi_cmds_outstanding [scmd -> device -> lun ]);
5996
+ lun = (u8 )scmd -> device -> lun ;
5997
+
5998
+ atomic_inc (& device -> scsi_cmds_outstanding [lun ]);
5961
5999
5962
6000
ctrl_info = shost_to_hba (shost );
5963
6001
@@ -5967,7 +6005,7 @@ static int pqi_scsi_queue_command(struct Scsi_Host *shost, struct scsi_cmnd *scm
5967
6005
return 0 ;
5968
6006
}
5969
6007
5970
- if (pqi_ctrl_blocked (ctrl_info )) {
6008
+ if (pqi_ctrl_blocked (ctrl_info ) || pqi_device_in_reset ( device , lun ) ) {
5971
6009
rc = SCSI_MLQUEUE_HOST_BUSY ;
5972
6010
goto out ;
5973
6011
}
@@ -6002,8 +6040,10 @@ static int pqi_scsi_queue_command(struct Scsi_Host *shost, struct scsi_cmnd *scm
6002
6040
}
6003
6041
6004
6042
out :
6005
- if (rc )
6006
- atomic_dec (& device -> scsi_cmds_outstanding [scmd -> device -> lun ]);
6043
+ if (rc ) {
6044
+ scmd -> host_scribble = NULL ;
6045
+ atomic_dec (& device -> scsi_cmds_outstanding [lun ]);
6046
+ }
6007
6047
6008
6048
return rc ;
6009
6049
}
@@ -6097,7 +6137,7 @@ static int pqi_wait_until_inbound_queues_empty(struct pqi_ctrl_info *ctrl_info)
6097
6137
}
6098
6138
6099
6139
static void pqi_fail_io_queued_for_device (struct pqi_ctrl_info * ctrl_info ,
6100
- struct pqi_scsi_dev * device )
6140
+ struct pqi_scsi_dev * device , u8 lun )
6101
6141
{
6102
6142
unsigned int i ;
6103
6143
unsigned int path ;
@@ -6127,6 +6167,9 @@ static void pqi_fail_io_queued_for_device(struct pqi_ctrl_info *ctrl_info,
6127
6167
if (scsi_device != device )
6128
6168
continue ;
6129
6169
6170
+ if ((u8 )scmd -> device -> lun != lun )
6171
+ continue ;
6172
+
6130
6173
list_del (& io_request -> request_list_entry );
6131
6174
set_host_byte (scmd , DID_RESET );
6132
6175
pqi_free_io_request (io_request );
@@ -6224,15 +6267,13 @@ static int pqi_wait_for_lun_reset_completion(struct pqi_ctrl_info *ctrl_info,
6224
6267
6225
6268
#define PQI_LUN_RESET_FIRMWARE_TIMEOUT_SECS 30
6226
6269
6227
- static int pqi_lun_reset (struct pqi_ctrl_info * ctrl_info , struct scsi_cmnd * scmd )
6270
+ static int pqi_lun_reset (struct pqi_ctrl_info * ctrl_info , struct pqi_scsi_dev * device , u8 lun )
6228
6271
{
6229
6272
int rc ;
6230
6273
struct pqi_io_request * io_request ;
6231
6274
DECLARE_COMPLETION_ONSTACK (wait );
6232
6275
struct pqi_task_management_request * request ;
6233
- struct pqi_scsi_dev * device ;
6234
6276
6235
- device = scmd -> device -> hostdata ;
6236
6277
io_request = pqi_alloc_io_request (ctrl_info , NULL );
6237
6278
io_request -> io_complete_callback = pqi_lun_reset_complete ;
6238
6279
io_request -> context = & wait ;
@@ -6247,15 +6288,15 @@ static int pqi_lun_reset(struct pqi_ctrl_info *ctrl_info, struct scsi_cmnd *scmd
6247
6288
memcpy (request -> lun_number , device -> scsi3addr ,
6248
6289
sizeof (request -> lun_number ));
6249
6290
if (!pqi_is_logical_device (device ) && ctrl_info -> multi_lun_device_supported )
6250
- request -> ml_device_lun_number = ( u8 ) scmd -> device -> lun ;
6291
+ request -> ml_device_lun_number = lun ;
6251
6292
request -> task_management_function = SOP_TASK_MANAGEMENT_LUN_RESET ;
6252
6293
if (ctrl_info -> tmf_iu_timeout_supported )
6253
6294
put_unaligned_le16 (PQI_LUN_RESET_FIRMWARE_TIMEOUT_SECS , & request -> timeout );
6254
6295
6255
6296
pqi_start_io (ctrl_info , & ctrl_info -> queue_groups [PQI_DEFAULT_QUEUE_GROUP ], RAID_PATH ,
6256
6297
io_request );
6257
6298
6258
- rc = pqi_wait_for_lun_reset_completion (ctrl_info , device , ( u8 ) scmd -> device -> lun , & wait );
6299
+ rc = pqi_wait_for_lun_reset_completion (ctrl_info , device , lun , & wait );
6259
6300
if (rc == 0 )
6260
6301
rc = io_request -> status ;
6261
6302
@@ -6269,86 +6310,145 @@ static int pqi_lun_reset(struct pqi_ctrl_info *ctrl_info, struct scsi_cmnd *scmd
6269
6310
#define PQI_LUN_RESET_PENDING_IO_TIMEOUT_MSECS (10 * 60 * 1000)
6270
6311
#define PQI_LUN_RESET_FAILED_PENDING_IO_TIMEOUT_MSECS (2 * 60 * 1000)
6271
6312
6272
- static int pqi_lun_reset_with_retries (struct pqi_ctrl_info * ctrl_info , struct scsi_cmnd * scmd )
6313
+ static int pqi_lun_reset_with_retries (struct pqi_ctrl_info * ctrl_info , struct pqi_scsi_dev * device , u8 lun )
6273
6314
{
6274
6315
int reset_rc ;
6275
6316
int wait_rc ;
6276
6317
unsigned int retries ;
6277
6318
unsigned long timeout_msecs ;
6278
- struct pqi_scsi_dev * device ;
6279
6319
6280
- device = scmd -> device -> hostdata ;
6281
6320
for (retries = 0 ;;) {
6282
- reset_rc = pqi_lun_reset (ctrl_info , scmd );
6283
- if (reset_rc == 0 || reset_rc == - ENODEV || ++ retries > PQI_LUN_RESET_RETRIES )
6321
+ reset_rc = pqi_lun_reset (ctrl_info , device , lun );
6322
+ if (reset_rc == 0 || reset_rc == - ENODEV || reset_rc == - ENXIO || ++ retries > PQI_LUN_RESET_RETRIES )
6284
6323
break ;
6285
6324
msleep (PQI_LUN_RESET_RETRY_INTERVAL_MSECS );
6286
6325
}
6287
6326
6288
6327
timeout_msecs = reset_rc ? PQI_LUN_RESET_FAILED_PENDING_IO_TIMEOUT_MSECS :
6289
6328
PQI_LUN_RESET_PENDING_IO_TIMEOUT_MSECS ;
6290
6329
6291
- wait_rc = pqi_device_wait_for_pending_io (ctrl_info , device , scmd -> device -> lun , timeout_msecs );
6330
+ wait_rc = pqi_device_wait_for_pending_io (ctrl_info , device , lun , timeout_msecs );
6292
6331
if (wait_rc && reset_rc == 0 )
6293
6332
reset_rc = wait_rc ;
6294
6333
6295
6334
return reset_rc == 0 ? SUCCESS : FAILED ;
6296
6335
}
6297
6336
6298
- static int pqi_device_reset (struct pqi_ctrl_info * ctrl_info , struct scsi_cmnd * scmd )
6337
+ static int pqi_device_reset (struct pqi_ctrl_info * ctrl_info , struct pqi_scsi_dev * device , u8 lun )
6299
6338
{
6300
6339
int rc ;
6301
- struct pqi_scsi_dev * device ;
6302
6340
6303
- device = scmd -> device -> hostdata ;
6304
6341
pqi_ctrl_block_requests (ctrl_info );
6305
6342
pqi_ctrl_wait_until_quiesced (ctrl_info );
6306
- pqi_fail_io_queued_for_device (ctrl_info , device );
6343
+ pqi_fail_io_queued_for_device (ctrl_info , device , lun );
6307
6344
rc = pqi_wait_until_inbound_queues_empty (ctrl_info );
6345
+ pqi_device_reset_start (device , lun );
6346
+ pqi_ctrl_unblock_requests (ctrl_info );
6308
6347
if (rc )
6309
6348
rc = FAILED ;
6310
6349
else
6311
- rc = pqi_lun_reset_with_retries (ctrl_info , scmd );
6312
- pqi_ctrl_unblock_requests ( ctrl_info );
6350
+ rc = pqi_lun_reset_with_retries (ctrl_info , device , lun );
6351
+ pqi_device_reset_done ( device , lun );
6313
6352
6314
6353
return rc ;
6315
6354
}
6316
6355
6317
- static int pqi_eh_device_reset_handler (struct scsi_cmnd * scmd )
6356
+ static int pqi_device_reset_handler (struct pqi_ctrl_info * ctrl_info , struct pqi_scsi_dev * device , u8 lun , struct scsi_cmnd * scmd , u8 scsi_opcode )
6318
6357
{
6319
6358
int rc ;
6320
- struct Scsi_Host * shost ;
6321
- struct pqi_ctrl_info * ctrl_info ;
6322
- struct pqi_scsi_dev * device ;
6323
-
6324
- shost = scmd -> device -> host ;
6325
- ctrl_info = shost_to_hba (shost );
6326
- device = scmd -> device -> hostdata ;
6327
6359
6328
6360
mutex_lock (& ctrl_info -> lun_reset_mutex );
6329
6361
6330
6362
dev_err (& ctrl_info -> pci_dev -> dev ,
6331
6363
"resetting scsi %d:%d:%d:%d due to cmd 0x%02x\n" ,
6332
- shost -> host_no ,
6333
- device -> bus , device -> target , ( u32 ) scmd -> device -> lun ,
6364
+ ctrl_info -> scsi_host -> host_no ,
6365
+ device -> bus , device -> target , lun ,
6334
6366
scmd -> cmd_len > 0 ? scmd -> cmnd [0 ] : 0xff );
6335
6367
6336
6368
pqi_check_ctrl_health (ctrl_info );
6337
6369
if (pqi_ctrl_offline (ctrl_info ))
6338
6370
rc = FAILED ;
6339
6371
else
6340
- rc = pqi_device_reset (ctrl_info , scmd );
6372
+ rc = pqi_device_reset (ctrl_info , device , lun );
6341
6373
6342
6374
dev_err (& ctrl_info -> pci_dev -> dev ,
6343
- "reset of scsi %d:%d:%d:%d : %s\n" ,
6344
- shost -> host_no , device -> bus , device -> target , ( u32 ) scmd -> device -> lun ,
6375
+ "reset of scsi %d:%d:%d:%u : %s\n" ,
6376
+ ctrl_info -> scsi_host -> host_no , device -> bus , device -> target , lun ,
6345
6377
rc == SUCCESS ? "SUCCESS" : "FAILED" );
6346
6378
6347
6379
mutex_unlock (& ctrl_info -> lun_reset_mutex );
6348
6380
6349
6381
return rc ;
6350
6382
}
6351
6383
6384
+ static int pqi_eh_device_reset_handler (struct scsi_cmnd * scmd )
6385
+ {
6386
+ struct Scsi_Host * shost ;
6387
+ struct pqi_ctrl_info * ctrl_info ;
6388
+ struct pqi_scsi_dev * device ;
6389
+ u8 scsi_opcode ;
6390
+
6391
+ shost = scmd -> device -> host ;
6392
+ ctrl_info = shost_to_hba (shost );
6393
+ device = scmd -> device -> hostdata ;
6394
+ scsi_opcode = scmd -> cmd_len > 0 ? scmd -> cmnd [0 ] : 0xff ;
6395
+
6396
+ return pqi_device_reset_handler (ctrl_info , device , (u8 )scmd -> device -> lun , scmd , scsi_opcode );
6397
+ }
6398
+
6399
+ static void pqi_tmf_worker (struct work_struct * work )
6400
+ {
6401
+ struct pqi_tmf_work * tmf_work ;
6402
+ struct scsi_cmnd * scmd ;
6403
+
6404
+ tmf_work = container_of (work , struct pqi_tmf_work , work_struct );
6405
+ scmd = (struct scsi_cmnd * )xchg (& tmf_work -> scmd , NULL );
6406
+
6407
+ pqi_device_reset_handler (tmf_work -> ctrl_info , tmf_work -> device , tmf_work -> lun , scmd , tmf_work -> scsi_opcode );
6408
+ }
6409
+
6410
+ static int pqi_eh_abort_handler (struct scsi_cmnd * scmd )
6411
+ {
6412
+ struct Scsi_Host * shost ;
6413
+ struct pqi_ctrl_info * ctrl_info ;
6414
+ struct pqi_scsi_dev * device ;
6415
+ struct pqi_tmf_work * tmf_work ;
6416
+ DECLARE_COMPLETION_ONSTACK (wait );
6417
+
6418
+ shost = scmd -> device -> host ;
6419
+ ctrl_info = shost_to_hba (shost );
6420
+
6421
+ dev_err (& ctrl_info -> pci_dev -> dev ,
6422
+ "attempting TASK ABORT on SCSI cmd at %p\n" , scmd );
6423
+
6424
+ if (cmpxchg (& scmd -> host_scribble , PQI_NO_COMPLETION , (void * )& wait ) == NULL ) {
6425
+ dev_err (& ctrl_info -> pci_dev -> dev ,
6426
+ "SCSI cmd at %p already completed\n" , scmd );
6427
+ scmd -> result = DID_RESET << 16 ;
6428
+ goto out ;
6429
+ }
6430
+
6431
+ device = scmd -> device -> hostdata ;
6432
+ tmf_work = & device -> tmf_work [scmd -> device -> lun ];
6433
+
6434
+ if (cmpxchg (& tmf_work -> scmd , NULL , scmd ) == NULL ) {
6435
+ tmf_work -> ctrl_info = ctrl_info ;
6436
+ tmf_work -> device = device ;
6437
+ tmf_work -> lun = (u8 )scmd -> device -> lun ;
6438
+ tmf_work -> scsi_opcode = scmd -> cmd_len > 0 ? scmd -> cmnd [0 ] : 0xff ;
6439
+ schedule_work (& tmf_work -> work_struct );
6440
+ }
6441
+
6442
+ wait_for_completion (& wait );
6443
+
6444
+ dev_err (& ctrl_info -> pci_dev -> dev ,
6445
+ "TASK ABORT on SCSI cmd at %p: SUCCESS\n" , scmd );
6446
+
6447
+ out :
6448
+
6449
+ return SUCCESS ;
6450
+ }
6451
+
6352
6452
static int pqi_slave_alloc (struct scsi_device * sdev )
6353
6453
{
6354
6454
struct pqi_scsi_dev * device ;
@@ -7362,6 +7462,7 @@ static const struct scsi_host_template pqi_driver_template = {
7362
7462
.scan_finished = pqi_scan_finished ,
7363
7463
.this_id = -1 ,
7364
7464
.eh_device_reset_handler = pqi_eh_device_reset_handler ,
7465
+ .eh_abort_handler = pqi_eh_abort_handler ,
7365
7466
.ioctl = pqi_ioctl ,
7366
7467
.slave_alloc = pqi_slave_alloc ,
7367
7468
.slave_configure = pqi_slave_configure ,
0 commit comments