diff options
-rw-r--r-- | drivers/scsi/isci/request.c | 52 | ||||
-rw-r--r-- | drivers/scsi/isci/task.c | 230 |
2 files changed, 129 insertions, 153 deletions
diff --git a/drivers/scsi/isci/request.c b/drivers/scsi/isci/request.c index 8039f1c72f72..c88e270b2b40 100644 --- a/drivers/scsi/isci/request.c +++ b/drivers/scsi/isci/request.c | |||
@@ -814,9 +814,8 @@ static void isci_task_save_for_upper_layer_completion( | |||
814 | break; | 814 | break; |
815 | 815 | ||
816 | case isci_perform_aborted_io_completion: | 816 | case isci_perform_aborted_io_completion: |
817 | /* | 817 | /* No notification to libsas because this request is |
818 | * No notification because this request is already | 818 | * already in the abort path. |
819 | * in the abort path. | ||
820 | */ | 819 | */ |
821 | dev_warn(&host->pdev->dev, | 820 | dev_warn(&host->pdev->dev, |
822 | "%s: Aborted - task = %p, response=%d, status=%d\n", | 821 | "%s: Aborted - task = %p, response=%d, status=%d\n", |
@@ -824,6 +823,19 @@ static void isci_task_save_for_upper_layer_completion( | |||
824 | task, | 823 | task, |
825 | response, | 824 | response, |
826 | status); | 825 | status); |
826 | |||
827 | /* Wake up whatever process was waiting for this | ||
828 | * request to complete. | ||
829 | */ | ||
830 | WARN_ON(request->io_request_completion == NULL); | ||
831 | |||
832 | if (request->io_request_completion != NULL) { | ||
833 | |||
834 | /* Signal whoever is waiting that this | ||
835 | * request is complete. | ||
836 | */ | ||
837 | complete(request->io_request_completion); | ||
838 | } | ||
827 | break; | 839 | break; |
828 | 840 | ||
829 | case isci_perform_error_io_completion: | 841 | case isci_perform_error_io_completion: |
@@ -847,7 +859,7 @@ static void isci_task_save_for_upper_layer_completion( | |||
847 | response, | 859 | response, |
848 | status); | 860 | status); |
849 | 861 | ||
850 | /* Add to the aborted list. */ | 862 | /* Add to the error to libsas list. */ |
851 | list_add(&request->completed_node, | 863 | list_add(&request->completed_node, |
852 | &host->requests_to_errorback); | 864 | &host->requests_to_errorback); |
853 | break; | 865 | break; |
@@ -873,8 +885,6 @@ void isci_request_io_request_complete( | |||
873 | struct ssp_response_iu *resp_iu; | 885 | struct ssp_response_iu *resp_iu; |
874 | void *resp_buf; | 886 | void *resp_buf; |
875 | unsigned long task_flags; | 887 | unsigned long task_flags; |
876 | unsigned long state_flags; | ||
877 | struct completion *io_request_completion; | ||
878 | struct isci_remote_device *isci_device = request->isci_device; | 888 | struct isci_remote_device *isci_device = request->isci_device; |
879 | enum service_response response = SAS_TASK_UNDELIVERED; | 889 | enum service_response response = SAS_TASK_UNDELIVERED; |
880 | enum exec_status status = SAS_ABORTED_TASK; | 890 | enum exec_status status = SAS_ABORTED_TASK; |
@@ -891,9 +901,8 @@ void isci_request_io_request_complete( | |||
891 | task->data_dir, | 901 | task->data_dir, |
892 | completion_status); | 902 | completion_status); |
893 | 903 | ||
894 | spin_lock_irqsave(&request->state_lock, state_flags); | 904 | spin_lock(&request->state_lock); |
895 | request_status = isci_request_get_state(request); | 905 | request_status = isci_request_get_state(request); |
896 | spin_unlock_irqrestore(&request->state_lock, state_flags); | ||
897 | 906 | ||
898 | /* Decode the request status. Note that if the request has been | 907 | /* Decode the request status. Note that if the request has been |
899 | * aborted by a task management function, we don't care | 908 | * aborted by a task management function, we don't care |
@@ -928,6 +937,8 @@ void isci_request_io_request_complete( | |||
928 | 937 | ||
929 | complete_to_host = isci_perform_aborted_io_completion; | 938 | complete_to_host = isci_perform_aborted_io_completion; |
930 | /* This was an aborted request. */ | 939 | /* This was an aborted request. */ |
940 | |||
941 | spin_unlock(&request->state_lock); | ||
931 | break; | 942 | break; |
932 | 943 | ||
933 | case aborting: | 944 | case aborting: |
@@ -955,6 +966,8 @@ void isci_request_io_request_complete( | |||
955 | complete_to_host = isci_perform_aborted_io_completion; | 966 | complete_to_host = isci_perform_aborted_io_completion; |
956 | 967 | ||
957 | /* This was an aborted request. */ | 968 | /* This was an aborted request. */ |
969 | |||
970 | spin_unlock(&request->state_lock); | ||
958 | break; | 971 | break; |
959 | 972 | ||
960 | case terminating: | 973 | case terminating: |
@@ -977,13 +990,20 @@ void isci_request_io_request_complete( | |||
977 | else | 990 | else |
978 | status = SAS_ABORTED_TASK; | 991 | status = SAS_ABORTED_TASK; |
979 | 992 | ||
980 | complete_to_host = isci_perform_normal_io_completion; | 993 | complete_to_host = isci_perform_aborted_io_completion; |
981 | 994 | ||
982 | /* This was a terminated request. */ | 995 | /* This was a terminated request. */ |
996 | |||
997 | spin_unlock(&request->state_lock); | ||
983 | break; | 998 | break; |
984 | 999 | ||
985 | default: | 1000 | default: |
986 | 1001 | ||
1002 | /* The request is done from an SCU HW perspective. */ | ||
1003 | request->status = completed; | ||
1004 | |||
1005 | spin_unlock(&request->state_lock); | ||
1006 | |||
987 | /* This is an active request being completed from the core. */ | 1007 | /* This is an active request being completed from the core. */ |
988 | switch (completion_status) { | 1008 | switch (completion_status) { |
989 | 1009 | ||
@@ -1185,20 +1205,6 @@ void isci_request_io_request_complete( | |||
1185 | */ | 1205 | */ |
1186 | request->sci_request_handle = NULL; | 1206 | request->sci_request_handle = NULL; |
1187 | 1207 | ||
1188 | /* Save possible completion ptr. */ | ||
1189 | io_request_completion = request->io_request_completion; | ||
1190 | |||
1191 | if (io_request_completion) { | ||
1192 | |||
1193 | /* This is inherantly a regular I/O request, | ||
1194 | * since we are currently in the regular | ||
1195 | * I/O completion callback function. | ||
1196 | * Signal whoever is waiting that this | ||
1197 | * request is complete. | ||
1198 | */ | ||
1199 | complete(io_request_completion); | ||
1200 | } | ||
1201 | |||
1202 | isci_host_can_dequeue(isci_host, 1); | 1208 | isci_host_can_dequeue(isci_host, 1); |
1203 | } | 1209 | } |
1204 | 1210 | ||
diff --git a/drivers/scsi/isci/task.c b/drivers/scsi/isci/task.c index 779f6cfba6be..02c40c00cb8b 100644 --- a/drivers/scsi/isci/task.c +++ b/drivers/scsi/isci/task.c | |||
@@ -618,9 +618,6 @@ static enum isci_request_status isci_task_validate_request_to_abort( | |||
618 | old_state = isci_request_change_started_to_aborted( | 618 | old_state = isci_request_change_started_to_aborted( |
619 | isci_request, aborted_io_completion); | 619 | isci_request, aborted_io_completion); |
620 | 620 | ||
621 | /* Only abort requests in the started state. */ | ||
622 | if (old_state != started) | ||
623 | old_state = unallocated; | ||
624 | } | 621 | } |
625 | 622 | ||
626 | return old_state; | 623 | return old_state; |
@@ -644,10 +641,23 @@ static void isci_request_cleanup_completed_loiterer( | |||
644 | 641 | ||
645 | spin_lock_irqsave(&isci_host->scic_lock, flags); | 642 | spin_lock_irqsave(&isci_host->scic_lock, flags); |
646 | list_del_init(&isci_request->dev_node); | 643 | list_del_init(&isci_request->dev_node); |
647 | if (task != NULL) | ||
648 | task->lldd_task = NULL; | ||
649 | spin_unlock_irqrestore(&isci_host->scic_lock, flags); | 644 | spin_unlock_irqrestore(&isci_host->scic_lock, flags); |
650 | 645 | ||
646 | if (task != NULL) { | ||
647 | |||
648 | spin_lock_irqsave(&task->task_state_lock, flags); | ||
649 | task->lldd_task = NULL; | ||
650 | |||
651 | isci_set_task_doneflags(task); | ||
652 | |||
653 | /* If this task is not in the abort path, call task_done. */ | ||
654 | if (!(task->task_state_flags & SAS_TASK_STATE_ABORTED)) { | ||
655 | |||
656 | spin_unlock_irqrestore(&task->task_state_lock, flags); | ||
657 | task->task_done(task); | ||
658 | } else | ||
659 | spin_unlock_irqrestore(&task->task_state_lock, flags); | ||
660 | } | ||
651 | isci_request_free(isci_host, isci_request); | 661 | isci_request_free(isci_host, isci_request); |
652 | } | 662 | } |
653 | /** | 663 | /** |
@@ -684,17 +694,20 @@ static void isci_terminate_request_core( | |||
684 | spin_lock_irqsave(&isci_request->state_lock, flags); | 694 | spin_lock_irqsave(&isci_request->state_lock, flags); |
685 | request_status = isci_request_get_state(isci_request); | 695 | request_status = isci_request_get_state(isci_request); |
686 | 696 | ||
687 | /* TMFs are in their own thread */ | 697 | if ((isci_request->ttype == io_task) /* TMFs are in their own thread */ |
688 | if ((isci_request->ttype == io_task) && | 698 | && ((request_status == aborted) |
689 | ((request_status == aborted) || | 699 | || (request_status == aborting) |
690 | (request_status == aborting) || | 700 | || (request_status == terminating) |
691 | (request_status == terminating))) | 701 | || (request_status == completed) |
702 | ) | ||
703 | ) { | ||
704 | |||
692 | /* The completion routine won't free a request in | 705 | /* The completion routine won't free a request in |
693 | * the aborted/aborting/terminating state, so we do | 706 | * the aborted/aborting/terminating state, so we do |
694 | * it here. | 707 | * it here. |
695 | */ | 708 | */ |
696 | needs_cleanup_handling = true; | 709 | needs_cleanup_handling = true; |
697 | 710 | } | |
698 | spin_unlock_irqrestore(&isci_request->state_lock, flags); | 711 | spin_unlock_irqrestore(&isci_request->state_lock, flags); |
699 | 712 | ||
700 | spin_lock_irqsave(&isci_host->scic_lock, flags); | 713 | spin_lock_irqsave(&isci_host->scic_lock, flags); |
@@ -765,10 +778,10 @@ static void isci_terminate_request( | |||
765 | new_request_state | 778 | new_request_state |
766 | ); | 779 | ); |
767 | 780 | ||
768 | spin_unlock_irqrestore(&isci_host->scic_lock, flags); | 781 | if ((old_state == started) || (old_state == completed)) { |
769 | 782 | ||
770 | if (old_state == started) | 783 | /* If the old_state is started: |
771 | /* This request was not already being aborted. If it had been, | 784 | * This request was not already being aborted. If it had been, |
772 | * then the aborting I/O (ie. the TMF request) would not be in | 785 | * then the aborting I/O (ie. the TMF request) would not be in |
773 | * the aborting state, and thus would be terminated here. Note | 786 | * the aborting state, and thus would be terminated here. Note |
774 | * that since the TMF completion's call to the kernel function | 787 | * that since the TMF completion's call to the kernel function |
@@ -777,9 +790,15 @@ static void isci_terminate_request( | |||
777 | * special wait here for already aborting requests - the | 790 | * special wait here for already aborting requests - the |
778 | * termination of the TMF request will force the request | 791 | * termination of the TMF request will force the request |
779 | * to finish it's already started terminate. | 792 | * to finish it's already started terminate. |
793 | * | ||
794 | * If old_state == completed: | ||
795 | * This request completed from the SCU hardware perspective | ||
796 | * and now just needs cleaning up in terms of freeing the | ||
797 | * request and potentially calling up to libsas. | ||
780 | */ | 798 | */ |
781 | isci_terminate_request_core(isci_host, isci_device, | 799 | isci_terminate_request_core(isci_host, isci_device, |
782 | isci_request, &request_completion); | 800 | isci_request, &request_completion); |
801 | } | ||
783 | } | 802 | } |
784 | 803 | ||
785 | /** | 804 | /** |
@@ -863,10 +882,6 @@ void isci_terminate_pending_requests( | |||
863 | isci_terminate_request(isci_host, isci_device, | 882 | isci_terminate_request(isci_host, isci_device, |
864 | isci_request, new_request_state | 883 | isci_request, new_request_state |
865 | ); | 884 | ); |
866 | |||
867 | /* Set the 'done' state on the task. */ | ||
868 | if (task) | ||
869 | isci_task_all_done(task); | ||
870 | } | 885 | } |
871 | } while (!done); | 886 | } while (!done); |
872 | } | 887 | } |
@@ -1067,13 +1082,15 @@ static void isci_abort_task_process_cb( | |||
1067 | int isci_task_abort_task(struct sas_task *task) | 1082 | int isci_task_abort_task(struct sas_task *task) |
1068 | { | 1083 | { |
1069 | DECLARE_COMPLETION_ONSTACK(aborted_io_completion); | 1084 | DECLARE_COMPLETION_ONSTACK(aborted_io_completion); |
1070 | struct isci_request *old_request = NULL; | 1085 | struct isci_request *old_request = NULL; |
1086 | enum isci_request_status old_state; | ||
1071 | struct isci_remote_device *isci_device = NULL; | 1087 | struct isci_remote_device *isci_device = NULL; |
1072 | struct isci_host *isci_host = NULL; | 1088 | struct isci_host *isci_host = NULL; |
1073 | struct isci_tmf tmf; | 1089 | struct isci_tmf tmf; |
1074 | int ret = TMF_RESP_FUNC_FAILED; | 1090 | int ret = TMF_RESP_FUNC_FAILED; |
1075 | unsigned long flags; | 1091 | unsigned long flags; |
1076 | bool any_dev_reset, device_stopping; | 1092 | bool any_dev_reset = false; |
1093 | bool device_stopping; | ||
1077 | 1094 | ||
1078 | /* Get the isci_request reference from the task. Note that | 1095 | /* Get the isci_request reference from the task. Note that |
1079 | * this check does not depend on the pending request list | 1096 | * this check does not depend on the pending request list |
@@ -1093,21 +1110,6 @@ int isci_task_abort_task(struct sas_task *task) | |||
1093 | device_stopping = (isci_device->status == isci_stopping) | 1110 | device_stopping = (isci_device->status == isci_stopping) |
1094 | || (isci_device->status == isci_stopped); | 1111 | || (isci_device->status == isci_stopped); |
1095 | 1112 | ||
1096 | #ifdef NOMORE | ||
1097 | /* This abort task function is the first stop of the libsas error | ||
1098 | * handler thread. Since libsas is executing in a thread with a | ||
1099 | * referernce to the "task" parameter, that task cannot be completed | ||
1100 | * directly back to the upper layers. In order to make sure that | ||
1101 | * the task is managed correctly if this abort task fails, set the | ||
1102 | * "SAS_TASK_STATE_ABORTED" bit now such that completions up the | ||
1103 | * stack will be intercepted and only allowed to happen in the | ||
1104 | * libsas SCSI error handler thread. | ||
1105 | */ | ||
1106 | spin_lock_irqsave(&task->task_state_lock, flags); | ||
1107 | task->task_state_flags |= SAS_TASK_STATE_ABORTED; | ||
1108 | spin_unlock_irqrestore(&task->task_state_lock, flags); | ||
1109 | #endif /* NOMORE */ | ||
1110 | |||
1111 | /* This version of the driver will fail abort requests for | 1113 | /* This version of the driver will fail abort requests for |
1112 | * SATA/STP. Failing the abort request this way will cause the | 1114 | * SATA/STP. Failing the abort request this way will cause the |
1113 | * SCSI error handler thread to escalate to LUN reset | 1115 | * SCSI error handler thread to escalate to LUN reset |
@@ -1123,35 +1125,27 @@ int isci_task_abort_task(struct sas_task *task) | |||
1123 | dev_dbg(&isci_host->pdev->dev, | 1125 | dev_dbg(&isci_host->pdev->dev, |
1124 | "%s: old_request == %p\n", __func__, old_request); | 1126 | "%s: old_request == %p\n", __func__, old_request); |
1125 | 1127 | ||
1128 | if (!device_stopping) | ||
1129 | any_dev_reset = isci_device_is_reset_pending(isci_host,isci_device); | ||
1130 | |||
1126 | spin_lock_irqsave(&task->task_state_lock, flags); | 1131 | spin_lock_irqsave(&task->task_state_lock, flags); |
1127 | 1132 | ||
1128 | /* Don't do resets to stopping devices. */ | 1133 | /* Don't do resets to stopping devices. */ |
1129 | if (device_stopping) | 1134 | if (device_stopping) { |
1130 | task->task_state_flags &= ~SAS_TASK_NEED_DEV_RESET; | ||
1131 | 1135 | ||
1132 | /* See if there is a pending device reset for this device. */ | 1136 | task->task_state_flags &= ~SAS_TASK_NEED_DEV_RESET; |
1133 | any_dev_reset = task->task_state_flags & SAS_TASK_NEED_DEV_RESET; | 1137 | any_dev_reset = false; |
1134 | |||
1135 | spin_unlock_irqrestore(&task->task_state_lock, flags); | ||
1136 | 1138 | ||
1137 | if ((isci_device != NULL) && !device_stopping) | 1139 | } else /* See if there is a pending device reset for this device. */ |
1138 | any_dev_reset = any_dev_reset | 1140 | any_dev_reset = any_dev_reset |
1139 | || isci_device_is_reset_pending(isci_host, | 1141 | || (task->task_state_flags & SAS_TASK_NEED_DEV_RESET); |
1140 | isci_device | ||
1141 | ); | ||
1142 | 1142 | ||
1143 | /* If the extraction of the request reference from the task | 1143 | /* If the extraction of the request reference from the task |
1144 | * failed, then the request has been completed (or if there is a | 1144 | * failed, then the request has been completed (or if there is a |
1145 | * pending reset then this abort request function must be failed | 1145 | * pending reset then this abort request function must be failed |
1146 | * in order to escalate to the target reset). | 1146 | * in order to escalate to the target reset). |
1147 | */ | 1147 | */ |
1148 | if ((old_request == NULL) || | 1148 | if ((old_request == NULL) || any_dev_reset) { |
1149 | ((old_request != NULL) && | ||
1150 | (old_request->sci_request_handle == NULL) && | ||
1151 | (old_request->complete_in_target)) || | ||
1152 | any_dev_reset) { | ||
1153 | |||
1154 | spin_lock_irqsave(&task->task_state_lock, flags); | ||
1155 | 1149 | ||
1156 | /* If the device reset task flag is set, fail the task | 1150 | /* If the device reset task flag is set, fail the task |
1157 | * management request. Otherwise, the original request | 1151 | * management request. Otherwise, the original request |
@@ -1164,6 +1158,11 @@ int isci_task_abort_task(struct sas_task *task) | |||
1164 | */ | 1158 | */ |
1165 | task->task_state_flags &= ~SAS_TASK_STATE_DONE; | 1159 | task->task_state_flags &= ~SAS_TASK_STATE_DONE; |
1166 | 1160 | ||
1161 | /* Make the reset happen as soon as possible. */ | ||
1162 | task->task_state_flags |= SAS_TASK_NEED_DEV_RESET; | ||
1163 | |||
1164 | spin_unlock_irqrestore(&task->task_state_lock, flags); | ||
1165 | |||
1167 | /* Fail the task management request in order to | 1166 | /* Fail the task management request in order to |
1168 | * escalate to the target reset. | 1167 | * escalate to the target reset. |
1169 | */ | 1168 | */ |
@@ -1176,13 +1175,8 @@ int isci_task_abort_task(struct sas_task *task) | |||
1176 | "task %p on dev %p\n", | 1175 | "task %p on dev %p\n", |
1177 | __func__, task, isci_device); | 1176 | __func__, task, isci_device); |
1178 | 1177 | ||
1179 | } else { | ||
1180 | ret = TMF_RESP_FUNC_COMPLETE; | ||
1181 | |||
1182 | dev_dbg(&isci_host->pdev->dev, | ||
1183 | "%s: abort task not needed for %p\n", | ||
1184 | __func__, task); | ||
1185 | 1178 | ||
1179 | } else { | ||
1186 | /* The request has already completed and there | 1180 | /* The request has already completed and there |
1187 | * is nothing to do here other than to set the task | 1181 | * is nothing to do here other than to set the task |
1188 | * done bit, and indicate that the task abort function | 1182 | * done bit, and indicate that the task abort function |
@@ -1190,89 +1184,65 @@ int isci_task_abort_task(struct sas_task *task) | |||
1190 | */ | 1184 | */ |
1191 | isci_set_task_doneflags(task); | 1185 | isci_set_task_doneflags(task); |
1192 | 1186 | ||
1193 | /* Set the abort bit to make sure that libsas sticks the | 1187 | spin_unlock_irqrestore(&task->task_state_lock, flags); |
1194 | * task in the completed task queue. | ||
1195 | */ | ||
1196 | /* task->task_state_flags |= SAS_TASK_STATE_ABORTED; */ | ||
1197 | 1188 | ||
1198 | /* Check for the situation where the request was | 1189 | ret = TMF_RESP_FUNC_COMPLETE; |
1199 | * left around on the device list but the | ||
1200 | * request already completed. | ||
1201 | */ | ||
1202 | if (old_request && !old_request->sci_request_handle) { | ||
1203 | 1190 | ||
1204 | isci_request_cleanup_completed_loiterer( | 1191 | dev_dbg(&isci_host->pdev->dev, |
1205 | isci_host, isci_device, old_request | 1192 | "%s: abort task not needed for %p\n", |
1206 | ); | 1193 | __func__, task); |
1207 | } | ||
1208 | } | 1194 | } |
1209 | spin_unlock_irqrestore(&task->task_state_lock, flags); | ||
1210 | 1195 | ||
1211 | return ret; | 1196 | return ret; |
1212 | } | 1197 | } |
1198 | else | ||
1199 | spin_unlock_irqrestore(&task->task_state_lock, flags); | ||
1213 | 1200 | ||
1214 | spin_lock_irqsave(&isci_host->scic_lock, flags); | 1201 | spin_lock_irqsave(&isci_host->scic_lock, flags); |
1215 | 1202 | ||
1216 | /* Sanity check the request status, and set the I/O kernel completion | 1203 | /* Check the request status and change to "aborting" if currently |
1204 | * "starting"; if true then set the I/O kernel completion | ||
1217 | * struct that will be triggered when the request completes. | 1205 | * struct that will be triggered when the request completes. |
1218 | */ | 1206 | */ |
1219 | if (isci_task_validate_request_to_abort( | 1207 | old_state = isci_task_validate_request_to_abort( |
1220 | old_request, | 1208 | old_request, isci_host, isci_device, |
1221 | isci_host, | 1209 | &aborted_io_completion); |
1222 | isci_device, | 1210 | if ((old_state != started) && (old_state != completed)) { |
1223 | &aborted_io_completion) | ||
1224 | == unallocated) { | ||
1225 | dev_dbg(&isci_host->pdev->dev, | ||
1226 | "%s: old_request not valid for device = %p\n", | ||
1227 | __func__, | ||
1228 | isci_device); | ||
1229 | old_request = NULL; | ||
1230 | } | ||
1231 | |||
1232 | if (!old_request) { | ||
1233 | |||
1234 | /* There is no isci_request attached to the sas_task. | ||
1235 | * It must have been completed and detached. | ||
1236 | */ | ||
1237 | dev_dbg(&isci_host->pdev->dev, | ||
1238 | "%s: old_request == NULL\n", | ||
1239 | __func__); | ||
1240 | 1211 | ||
1241 | spin_unlock_irqrestore(&isci_host->scic_lock, flags); | 1212 | spin_unlock_irqrestore(&isci_host->scic_lock, flags); |
1242 | 1213 | ||
1243 | /* Set the state on the task. */ | 1214 | /* The request was already being handled by someone else (because |
1244 | isci_task_all_done(task); | 1215 | * they got to set the state away from started). |
1216 | */ | ||
1217 | dev_dbg(&isci_host->pdev->dev, | ||
1218 | "%s: device = %p; old_request %p already being aborted\n", | ||
1219 | __func__, | ||
1220 | isci_device, old_request); | ||
1245 | 1221 | ||
1246 | return TMF_RESP_FUNC_COMPLETE; | 1222 | return TMF_RESP_FUNC_COMPLETE; |
1247 | } | 1223 | } |
1248 | if (task->task_proto == SAS_PROTOCOL_SMP || device_stopping) { | 1224 | if ((task->task_proto == SAS_PROTOCOL_SMP) |
1249 | 1225 | || device_stopping | |
1250 | if (device_stopping) | 1226 | || old_request->complete_in_target |
1251 | dev_dbg(&isci_host->pdev->dev, | 1227 | ) { |
1252 | "%s: device is stopping, thus no TMF\n", | ||
1253 | __func__); | ||
1254 | else | ||
1255 | dev_dbg(&isci_host->pdev->dev, | ||
1256 | "%s: request is SMP, thus no TMF\n", | ||
1257 | __func__); | ||
1258 | |||
1259 | old_request->complete_in_target = true; | ||
1260 | 1228 | ||
1261 | spin_unlock_irqrestore(&isci_host->scic_lock, flags); | 1229 | spin_unlock_irqrestore(&isci_host->scic_lock, flags); |
1262 | 1230 | ||
1231 | dev_dbg(&isci_host->pdev->dev, | ||
1232 | "%s: SMP request (%d)" | ||
1233 | " or device is stopping (%d)" | ||
1234 | " or complete_in_target (%d), thus no TMF\n", | ||
1235 | __func__, (task->task_proto == SAS_PROTOCOL_SMP), | ||
1236 | device_stopping, old_request->complete_in_target); | ||
1237 | |||
1263 | /* Set the state on the task. */ | 1238 | /* Set the state on the task. */ |
1264 | isci_task_all_done(task); | 1239 | isci_task_all_done(task); |
1265 | 1240 | ||
1266 | ret = TMF_RESP_FUNC_COMPLETE; | 1241 | ret = TMF_RESP_FUNC_COMPLETE; |
1267 | 1242 | ||
1268 | /* Stopping and SMP devices are not sent a TMF, and are not | 1243 | /* Stopping and SMP devices are not sent a TMF, and are not |
1269 | * reset, but the outstanding I/O request is terminated here. | 1244 | * reset, but the outstanding I/O request is terminated below. |
1270 | * | ||
1271 | * Clean up the request on our side, and wait for the aborted | ||
1272 | * I/O to complete. | ||
1273 | */ | 1245 | */ |
1274 | isci_terminate_request_core(isci_host, isci_device, old_request, | ||
1275 | &aborted_io_completion); | ||
1276 | } else { | 1246 | } else { |
1277 | /* Fill in the tmf stucture */ | 1247 | /* Fill in the tmf stucture */ |
1278 | isci_task_build_tmf(&tmf, isci_device, isci_tmf_ssp_task_abort, | 1248 | isci_task_build_tmf(&tmf, isci_device, isci_tmf_ssp_task_abort, |
@@ -1288,23 +1258,23 @@ int isci_task_abort_task(struct sas_task *task) | |||
1288 | ret = isci_task_execute_tmf(isci_host, &tmf, | 1258 | ret = isci_task_execute_tmf(isci_host, &tmf, |
1289 | ISCI_ABORT_TASK_TIMEOUT_MS); | 1259 | ISCI_ABORT_TASK_TIMEOUT_MS); |
1290 | 1260 | ||
1291 | if (ret == TMF_RESP_FUNC_COMPLETE) { | 1261 | if (ret != TMF_RESP_FUNC_COMPLETE) |
1292 | old_request->complete_in_target = true; | ||
1293 | |||
1294 | /* Clean up the request on our side, and wait for the aborted I/O to | ||
1295 | * complete. | ||
1296 | */ | ||
1297 | isci_terminate_request_core(isci_host, isci_device, old_request, | ||
1298 | &aborted_io_completion); | ||
1299 | |||
1300 | /* Set the state on the task. */ | ||
1301 | isci_task_all_done(task); | ||
1302 | } else | ||
1303 | dev_err(&isci_host->pdev->dev, | 1262 | dev_err(&isci_host->pdev->dev, |
1304 | "%s: isci_task_send_tmf failed\n", | 1263 | "%s: isci_task_send_tmf failed\n", |
1305 | __func__); | 1264 | __func__); |
1306 | } | 1265 | } |
1266 | if (ret == TMF_RESP_FUNC_COMPLETE) { | ||
1267 | old_request->complete_in_target = true; | ||
1268 | |||
1269 | /* Clean up the request on our side, and wait for the aborted I/O to | ||
1270 | * complete. | ||
1271 | */ | ||
1272 | isci_terminate_request_core(isci_host, isci_device, old_request, | ||
1273 | &aborted_io_completion); | ||
1274 | } | ||
1307 | 1275 | ||
1276 | /* Make sure we do not leave a reference to aborted_io_completion */ | ||
1277 | old_request->io_request_completion = NULL; | ||
1308 | return ret; | 1278 | return ret; |
1309 | } | 1279 | } |
1310 | 1280 | ||