aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/isci/request.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/scsi/isci/request.c')
-rw-r--r--drivers/scsi/isci/request.c52
1 files changed, 29 insertions, 23 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