@@ -324,6 +324,18 @@ static int pm8001_task_prep_ata(struct pm8001_hba_info *pm8001_ha,
324
324
return PM8001_CHIP_DISP -> sata_req (pm8001_ha , ccb );
325
325
}
326
326
327
+ /**
328
+ * pm8001_task_prep_internal_abort - the dispatcher function, prepare data
329
+ * for internal abort task
330
+ * @pm8001_ha: our hba card information
331
+ * @ccb: the ccb which attached to sata task
332
+ */
333
+ static int pm8001_task_prep_internal_abort (struct pm8001_hba_info * pm8001_ha ,
334
+ struct pm8001_ccb_info * ccb )
335
+ {
336
+ return PM8001_CHIP_DISP -> task_abort (pm8001_ha , ccb );
337
+ }
338
+
327
339
/**
328
340
* pm8001_task_prep_ssp_tm - the dispatcher function, prepare task management data
329
341
* @pm8001_ha: our hba card information
@@ -367,6 +379,35 @@ static int sas_find_local_port_id(struct domain_device *dev)
367
379
#define DEV_IS_GONE (pm8001_dev ) \
368
380
((!pm8001_dev || (pm8001_dev->dev_type == SAS_PHY_UNUSED)))
369
381
382
+
383
+ static int pm8001_deliver_command (struct pm8001_hba_info * pm8001_ha ,
384
+ struct pm8001_ccb_info * ccb )
385
+ {
386
+ struct sas_task * task = ccb -> task ;
387
+ enum sas_protocol task_proto = task -> task_proto ;
388
+ struct sas_tmf_task * tmf = task -> tmf ;
389
+ int is_tmf = !!tmf ;
390
+
391
+ switch (task_proto ) {
392
+ case SAS_PROTOCOL_SMP :
393
+ return pm8001_task_prep_smp (pm8001_ha , ccb );
394
+ case SAS_PROTOCOL_SSP :
395
+ if (is_tmf )
396
+ return pm8001_task_prep_ssp_tm (pm8001_ha , ccb , tmf );
397
+ return pm8001_task_prep_ssp (pm8001_ha , ccb );
398
+ case SAS_PROTOCOL_SATA :
399
+ case SAS_PROTOCOL_STP :
400
+ return pm8001_task_prep_ata (pm8001_ha , ccb );
401
+ case SAS_PROTOCOL_INTERNAL_ABORT :
402
+ return pm8001_task_prep_internal_abort (pm8001_ha , ccb );
403
+ default :
404
+ dev_err (pm8001_ha -> dev , "unknown sas_task proto: 0x%x\n" ,
405
+ task_proto );
406
+ }
407
+
408
+ return - EINVAL ;
409
+ }
410
+
370
411
/**
371
412
* pm8001_queue_command - register for upper layer used, all IO commands sent
372
413
* to HBA are from this interface.
@@ -379,16 +420,15 @@ int pm8001_queue_command(struct sas_task *task, gfp_t gfp_flags)
379
420
enum sas_protocol task_proto = task -> task_proto ;
380
421
struct domain_device * dev = task -> dev ;
381
422
struct pm8001_device * pm8001_dev = dev -> lldd_dev ;
423
+ bool internal_abort = sas_is_internal_abort (task );
382
424
struct pm8001_hba_info * pm8001_ha ;
383
425
struct pm8001_port * port = NULL ;
384
426
struct pm8001_ccb_info * ccb ;
385
- struct sas_tmf_task * tmf = task -> tmf ;
386
- int is_tmf = !!task -> tmf ;
387
427
unsigned long flags ;
388
428
u32 n_elem = 0 ;
389
429
int rc = 0 ;
390
430
391
- if (!dev -> port ) {
431
+ if (!internal_abort && ! dev -> port ) {
392
432
ts -> resp = SAS_TASK_UNDELIVERED ;
393
433
ts -> stat = SAS_PHY_DOWN ;
394
434
if (dev -> dev_type != SAS_SATA_DEV )
@@ -410,7 +450,8 @@ int pm8001_queue_command(struct sas_task *task, gfp_t gfp_flags)
410
450
pm8001_dev = dev -> lldd_dev ;
411
451
port = & pm8001_ha -> port [sas_find_local_port_id (dev )];
412
452
413
- if (DEV_IS_GONE (pm8001_dev ) || !port -> port_attached ) {
453
+ if (!internal_abort &&
454
+ (DEV_IS_GONE (pm8001_dev ) || !port -> port_attached )) {
414
455
ts -> resp = SAS_TASK_UNDELIVERED ;
415
456
ts -> stat = SAS_PHY_DOWN ;
416
457
if (sas_protocol_ata (task_proto )) {
@@ -448,27 +489,7 @@ int pm8001_queue_command(struct sas_task *task, gfp_t gfp_flags)
448
489
449
490
atomic_inc (& pm8001_dev -> running_req );
450
491
451
- switch (task_proto ) {
452
- case SAS_PROTOCOL_SMP :
453
- rc = pm8001_task_prep_smp (pm8001_ha , ccb );
454
- break ;
455
- case SAS_PROTOCOL_SSP :
456
- if (is_tmf )
457
- rc = pm8001_task_prep_ssp_tm (pm8001_ha , ccb , tmf );
458
- else
459
- rc = pm8001_task_prep_ssp (pm8001_ha , ccb );
460
- break ;
461
- case SAS_PROTOCOL_SATA :
462
- case SAS_PROTOCOL_STP :
463
- rc = pm8001_task_prep_ata (pm8001_ha , ccb );
464
- break ;
465
- default :
466
- dev_printk (KERN_ERR , pm8001_ha -> dev ,
467
- "unknown sas_task proto: 0x%x\n" , task_proto );
468
- rc = - EINVAL ;
469
- break ;
470
- }
471
-
492
+ rc = pm8001_deliver_command (pm8001_ha , ccb );
472
493
if (rc ) {
473
494
atomic_dec (& pm8001_dev -> running_req );
474
495
if (!sas_protocol_ata (task_proto ) && n_elem )
@@ -668,87 +689,7 @@ void pm8001_task_done(struct sas_task *task)
668
689
complete (& task -> slow_task -> completion );
669
690
}
670
691
671
- static void pm8001_tmf_timedout (struct timer_list * t )
672
- {
673
- struct sas_task_slow * slow = from_timer (slow , t , timer );
674
- struct sas_task * task = slow -> task ;
675
- unsigned long flags ;
676
-
677
- spin_lock_irqsave (& task -> task_state_lock , flags );
678
- if (!(task -> task_state_flags & SAS_TASK_STATE_DONE )) {
679
- task -> task_state_flags |= SAS_TASK_STATE_ABORTED ;
680
- complete (& task -> slow_task -> completion );
681
- }
682
- spin_unlock_irqrestore (& task -> task_state_lock , flags );
683
- }
684
-
685
692
#define PM8001_TASK_TIMEOUT 20
686
- static int
687
- pm8001_exec_internal_task_abort (struct pm8001_hba_info * pm8001_ha ,
688
- struct pm8001_device * pm8001_dev , struct domain_device * dev , u32 flag ,
689
- u32 task_tag )
690
- {
691
- int res , retry ;
692
- struct pm8001_ccb_info * ccb ;
693
- struct sas_task * task = NULL ;
694
-
695
- for (retry = 0 ; retry < 3 ; retry ++ ) {
696
- task = sas_alloc_slow_task (GFP_KERNEL );
697
- if (!task )
698
- return - ENOMEM ;
699
-
700
- task -> dev = dev ;
701
- task -> task_proto = dev -> tproto ;
702
- task -> task_done = pm8001_task_done ;
703
- task -> slow_task -> timer .function = pm8001_tmf_timedout ;
704
- task -> slow_task -> timer .expires =
705
- jiffies + PM8001_TASK_TIMEOUT * HZ ;
706
- add_timer (& task -> slow_task -> timer );
707
-
708
- ccb = pm8001_ccb_alloc (pm8001_ha , pm8001_dev , task );
709
- if (!ccb ) {
710
- res = - SAS_QUEUE_FULL ;
711
- break ;
712
- }
713
-
714
- res = PM8001_CHIP_DISP -> task_abort (pm8001_ha , pm8001_dev , flag ,
715
- task_tag , ccb -> ccb_tag );
716
- if (res ) {
717
- del_timer (& task -> slow_task -> timer );
718
- pm8001_dbg (pm8001_ha , FAIL ,
719
- "Executing internal task failed\n" );
720
- pm8001_ccb_free (pm8001_ha , ccb );
721
- break ;
722
- }
723
-
724
- wait_for_completion (& task -> slow_task -> completion );
725
- res = TMF_RESP_FUNC_FAILED ;
726
-
727
- /* Even TMF timed out, return direct. */
728
- if (task -> task_state_flags & SAS_TASK_STATE_ABORTED ) {
729
- pm8001_dbg (pm8001_ha , FAIL , "TMF task timeout.\n" );
730
- break ;
731
- }
732
-
733
- if (task -> task_status .resp == SAS_TASK_COMPLETE &&
734
- task -> task_status .stat == SAS_SAM_STAT_GOOD ) {
735
- res = TMF_RESP_FUNC_COMPLETE ;
736
- break ;
737
- }
738
-
739
- pm8001_dbg (pm8001_ha , EH ,
740
- " Task to dev %016llx response: 0x%x status 0x%x\n" ,
741
- SAS_ADDR (dev -> sas_addr ),
742
- task -> task_status .resp ,
743
- task -> task_status .stat );
744
- sas_free_task (task );
745
- task = NULL ;
746
- }
747
-
748
- BUG_ON (retry == 3 && task != NULL );
749
- sas_free_task (task );
750
- return res ;
751
- }
752
693
753
694
/**
754
695
* pm8001_dev_gone_notify - see the comments for "pm8001_dev_found_notify"
@@ -769,8 +710,7 @@ static void pm8001_dev_gone_notify(struct domain_device *dev)
769
710
pm8001_dev -> device_id , pm8001_dev -> dev_type );
770
711
if (atomic_read (& pm8001_dev -> running_req )) {
771
712
spin_unlock_irqrestore (& pm8001_ha -> lock , flags );
772
- pm8001_exec_internal_task_abort (pm8001_ha , pm8001_dev ,
773
- dev , 1 , 0 );
713
+ sas_execute_internal_abort_dev (dev , 0 , NULL );
774
714
while (atomic_read (& pm8001_dev -> running_req ))
775
715
msleep (20 );
776
716
spin_lock_irqsave (& pm8001_ha -> lock , flags );
@@ -893,8 +833,7 @@ int pm8001_I_T_nexus_reset(struct domain_device *dev)
893
833
goto out ;
894
834
}
895
835
msleep (2000 );
896
- rc = pm8001_exec_internal_task_abort (pm8001_ha , pm8001_dev ,
897
- dev , 1 , 0 );
836
+ rc = sas_execute_internal_abort_dev (dev , 0 , NULL );
898
837
if (rc ) {
899
838
pm8001_dbg (pm8001_ha , EH , "task abort failed %x\n"
900
839
"with rc %d\n" , pm8001_dev -> device_id , rc );
@@ -939,8 +878,7 @@ int pm8001_I_T_nexus_event_handler(struct domain_device *dev)
939
878
goto out ;
940
879
}
941
880
/* send internal ssp/sata/smp abort command to FW */
942
- rc = pm8001_exec_internal_task_abort (pm8001_ha , pm8001_dev ,
943
- dev , 1 , 0 );
881
+ sas_execute_internal_abort_dev (dev , 0 , NULL );
944
882
msleep (100 );
945
883
946
884
/* deregister the target device */
@@ -955,8 +893,7 @@ int pm8001_I_T_nexus_event_handler(struct domain_device *dev)
955
893
wait_for_completion (& completion_setstate );
956
894
} else {
957
895
/* send internal ssp/sata/smp abort command to FW */
958
- rc = pm8001_exec_internal_task_abort (pm8001_ha , pm8001_dev ,
959
- dev , 1 , 0 );
896
+ sas_execute_internal_abort_dev (dev , 0 , NULL );
960
897
msleep (100 );
961
898
962
899
/* deregister the target device */
@@ -983,8 +920,7 @@ int pm8001_lu_reset(struct domain_device *dev, u8 *lun)
983
920
DECLARE_COMPLETION_ONSTACK (completion_setstate );
984
921
if (dev_is_sata (dev )) {
985
922
struct sas_phy * phy = sas_get_local_phy (dev );
986
- rc = pm8001_exec_internal_task_abort (pm8001_ha , pm8001_dev ,
987
- dev , 1 , 0 );
923
+ sas_execute_internal_abort_dev (dev , 0 , NULL );
988
924
rc = sas_phy_reset (phy , 1 );
989
925
sas_put_local_phy (phy );
990
926
pm8001_dev -> setds_completion = & completion_setstate ;
@@ -1084,8 +1020,7 @@ int pm8001_abort_task(struct sas_task *task)
1084
1020
spin_unlock_irqrestore (& task -> task_state_lock , flags );
1085
1021
if (task -> task_proto & SAS_PROTOCOL_SSP ) {
1086
1022
rc = sas_abort_task (task , tag );
1087
- pm8001_exec_internal_task_abort (pm8001_ha , pm8001_dev ,
1088
- pm8001_dev -> sas_device , 0 , tag );
1023
+ sas_execute_internal_abort_single (dev , tag , 0 , NULL );
1089
1024
} else if (task -> task_proto & SAS_PROTOCOL_SATA ||
1090
1025
task -> task_proto & SAS_PROTOCOL_STP ) {
1091
1026
if (pm8001_ha -> chip_id == chip_8006 ) {
@@ -1158,8 +1093,7 @@ int pm8001_abort_task(struct sas_task *task)
1158
1093
* is removed from the ccb. on success the caller is
1159
1094
* going to free the task.
1160
1095
*/
1161
- ret = pm8001_exec_internal_task_abort (pm8001_ha ,
1162
- pm8001_dev , pm8001_dev -> sas_device , 1 , tag );
1096
+ ret = sas_execute_internal_abort_dev (dev , 0 , NULL );
1163
1097
if (ret )
1164
1098
goto out ;
1165
1099
ret = wait_for_completion_timeout (
@@ -1175,14 +1109,12 @@ int pm8001_abort_task(struct sas_task *task)
1175
1109
pm8001_dev , DS_OPERATIONAL );
1176
1110
wait_for_completion (& completion );
1177
1111
} else {
1178
- rc = pm8001_exec_internal_task_abort (pm8001_ha ,
1179
- pm8001_dev , pm8001_dev -> sas_device , 0 , tag );
1112
+ ret = sas_execute_internal_abort_single (dev , tag , 0 , NULL );
1180
1113
}
1181
1114
rc = TMF_RESP_FUNC_COMPLETE ;
1182
1115
} else if (task -> task_proto & SAS_PROTOCOL_SMP ) {
1183
1116
/* SMP */
1184
- rc = pm8001_exec_internal_task_abort (pm8001_ha , pm8001_dev ,
1185
- pm8001_dev -> sas_device , 0 , tag );
1117
+ rc = sas_execute_internal_abort_single (dev , tag , 0 , NULL );
1186
1118
1187
1119
}
1188
1120
out :
0 commit comments