diff options
Diffstat (limited to 'drivers/scsi/isci/request.c')
-rw-r--r-- | drivers/scsi/isci/request.c | 195 |
1 files changed, 5 insertions, 190 deletions
diff --git a/drivers/scsi/isci/request.c b/drivers/scsi/isci/request.c index 788daeedc89f..1a39ce50529d 100644 --- a/drivers/scsi/isci/request.c +++ b/drivers/scsi/isci/request.c | |||
@@ -666,18 +666,12 @@ sci_io_request_construct_sata(struct isci_request *ireq, | |||
666 | if (test_bit(IREQ_TMF, &ireq->flags)) { | 666 | if (test_bit(IREQ_TMF, &ireq->flags)) { |
667 | struct isci_tmf *tmf = isci_request_access_tmf(ireq); | 667 | struct isci_tmf *tmf = isci_request_access_tmf(ireq); |
668 | 668 | ||
669 | if (tmf->tmf_code == isci_tmf_sata_srst_high || | 669 | dev_err(&ireq->owning_controller->pdev->dev, |
670 | tmf->tmf_code == isci_tmf_sata_srst_low) { | 670 | "%s: Request 0x%p received un-handled SAT " |
671 | scu_stp_raw_request_construct_task_context(ireq); | 671 | "management protocol 0x%x.\n", |
672 | return SCI_SUCCESS; | 672 | __func__, ireq, tmf->tmf_code); |
673 | } else { | ||
674 | dev_err(&ireq->owning_controller->pdev->dev, | ||
675 | "%s: Request 0x%p received un-handled SAT " | ||
676 | "management protocol 0x%x.\n", | ||
677 | __func__, ireq, tmf->tmf_code); | ||
678 | 673 | ||
679 | return SCI_FAILURE; | 674 | return SCI_FAILURE; |
680 | } | ||
681 | } | 675 | } |
682 | 676 | ||
683 | if (!sas_protocol_ata(task->task_proto)) { | 677 | if (!sas_protocol_ata(task->task_proto)) { |
@@ -774,34 +768,6 @@ static enum sci_status sci_io_request_construct_basic_sata(struct isci_request * | |||
774 | return status; | 768 | return status; |
775 | } | 769 | } |
776 | 770 | ||
777 | enum sci_status sci_task_request_construct_sata(struct isci_request *ireq) | ||
778 | { | ||
779 | enum sci_status status = SCI_SUCCESS; | ||
780 | |||
781 | /* check for management protocols */ | ||
782 | if (test_bit(IREQ_TMF, &ireq->flags)) { | ||
783 | struct isci_tmf *tmf = isci_request_access_tmf(ireq); | ||
784 | |||
785 | if (tmf->tmf_code == isci_tmf_sata_srst_high || | ||
786 | tmf->tmf_code == isci_tmf_sata_srst_low) { | ||
787 | scu_stp_raw_request_construct_task_context(ireq); | ||
788 | } else { | ||
789 | dev_err(&ireq->owning_controller->pdev->dev, | ||
790 | "%s: Request 0x%p received un-handled SAT " | ||
791 | "Protocol 0x%x.\n", | ||
792 | __func__, ireq, tmf->tmf_code); | ||
793 | |||
794 | return SCI_FAILURE; | ||
795 | } | ||
796 | } | ||
797 | |||
798 | if (status != SCI_SUCCESS) | ||
799 | return status; | ||
800 | sci_change_state(&ireq->sm, SCI_REQ_CONSTRUCTED); | ||
801 | |||
802 | return status; | ||
803 | } | ||
804 | |||
805 | /** | 771 | /** |
806 | * sci_req_tx_bytes - bytes transferred when reply underruns request | 772 | * sci_req_tx_bytes - bytes transferred when reply underruns request |
807 | * @ireq: request that was terminated early | 773 | * @ireq: request that was terminated early |
@@ -903,9 +869,6 @@ sci_io_request_terminate(struct isci_request *ireq) | |||
903 | case SCI_REQ_STP_PIO_WAIT_FRAME: | 869 | case SCI_REQ_STP_PIO_WAIT_FRAME: |
904 | case SCI_REQ_STP_PIO_DATA_IN: | 870 | case SCI_REQ_STP_PIO_DATA_IN: |
905 | case SCI_REQ_STP_PIO_DATA_OUT: | 871 | case SCI_REQ_STP_PIO_DATA_OUT: |
906 | case SCI_REQ_STP_SOFT_RESET_WAIT_H2D_ASSERTED: | ||
907 | case SCI_REQ_STP_SOFT_RESET_WAIT_H2D_DIAG: | ||
908 | case SCI_REQ_STP_SOFT_RESET_WAIT_D2H: | ||
909 | case SCI_REQ_ATAPI_WAIT_H2D: | 872 | case SCI_REQ_ATAPI_WAIT_H2D: |
910 | case SCI_REQ_ATAPI_WAIT_PIO_SETUP: | 873 | case SCI_REQ_ATAPI_WAIT_PIO_SETUP: |
911 | case SCI_REQ_ATAPI_WAIT_D2H: | 874 | case SCI_REQ_ATAPI_WAIT_D2H: |
@@ -2085,59 +2048,6 @@ sci_io_request_frame_handler(struct isci_request *ireq, | |||
2085 | return status; | 2048 | return status; |
2086 | } | 2049 | } |
2087 | 2050 | ||
2088 | case SCI_REQ_STP_SOFT_RESET_WAIT_D2H: { | ||
2089 | struct dev_to_host_fis *frame_header; | ||
2090 | u32 *frame_buffer; | ||
2091 | |||
2092 | status = sci_unsolicited_frame_control_get_header(&ihost->uf_control, | ||
2093 | frame_index, | ||
2094 | (void **)&frame_header); | ||
2095 | if (status != SCI_SUCCESS) { | ||
2096 | dev_err(&ihost->pdev->dev, | ||
2097 | "%s: SCIC IO Request 0x%p could not get frame " | ||
2098 | "header for frame index %d, status %x\n", | ||
2099 | __func__, | ||
2100 | stp_req, | ||
2101 | frame_index, | ||
2102 | status); | ||
2103 | return status; | ||
2104 | } | ||
2105 | |||
2106 | switch (frame_header->fis_type) { | ||
2107 | case FIS_REGD2H: | ||
2108 | sci_unsolicited_frame_control_get_buffer(&ihost->uf_control, | ||
2109 | frame_index, | ||
2110 | (void **)&frame_buffer); | ||
2111 | |||
2112 | sci_controller_copy_sata_response(&ireq->stp.rsp, | ||
2113 | frame_header, | ||
2114 | frame_buffer); | ||
2115 | |||
2116 | /* The command has completed with error */ | ||
2117 | ireq->scu_status = SCU_TASK_DONE_CHECK_RESPONSE; | ||
2118 | ireq->sci_status = SCI_FAILURE_IO_RESPONSE_VALID; | ||
2119 | break; | ||
2120 | |||
2121 | default: | ||
2122 | dev_warn(&ihost->pdev->dev, | ||
2123 | "%s: IO Request:0x%p Frame Id:%d protocol " | ||
2124 | "violation occurred\n", | ||
2125 | __func__, | ||
2126 | stp_req, | ||
2127 | frame_index); | ||
2128 | |||
2129 | ireq->scu_status = SCU_TASK_DONE_UNEXP_FIS; | ||
2130 | ireq->sci_status = SCI_FAILURE_PROTOCOL_VIOLATION; | ||
2131 | break; | ||
2132 | } | ||
2133 | |||
2134 | sci_change_state(&ireq->sm, SCI_REQ_COMPLETED); | ||
2135 | |||
2136 | /* Frame has been decoded return it to the controller */ | ||
2137 | sci_controller_release_frame(ihost, frame_index); | ||
2138 | |||
2139 | return status; | ||
2140 | } | ||
2141 | case SCI_REQ_ATAPI_WAIT_PIO_SETUP: { | 2051 | case SCI_REQ_ATAPI_WAIT_PIO_SETUP: { |
2142 | struct sas_task *task = isci_request_access_task(ireq); | 2052 | struct sas_task *task = isci_request_access_task(ireq); |
2143 | 2053 | ||
@@ -2235,57 +2145,6 @@ static enum sci_status stp_request_udma_await_tc_event(struct isci_request *ireq | |||
2235 | return status; | 2145 | return status; |
2236 | } | 2146 | } |
2237 | 2147 | ||
2238 | static enum sci_status | ||
2239 | stp_request_soft_reset_await_h2d_asserted_tc_event(struct isci_request *ireq, | ||
2240 | u32 completion_code) | ||
2241 | { | ||
2242 | switch (SCU_GET_COMPLETION_TL_STATUS(completion_code)) { | ||
2243 | case SCU_MAKE_COMPLETION_STATUS(SCU_TASK_DONE_GOOD): | ||
2244 | ireq->scu_status = SCU_TASK_DONE_GOOD; | ||
2245 | ireq->sci_status = SCI_SUCCESS; | ||
2246 | sci_change_state(&ireq->sm, SCI_REQ_STP_SOFT_RESET_WAIT_H2D_DIAG); | ||
2247 | break; | ||
2248 | |||
2249 | default: | ||
2250 | /* | ||
2251 | * All other completion status cause the IO to be complete. | ||
2252 | * If a NAK was received, then it is up to the user to retry | ||
2253 | * the request. | ||
2254 | */ | ||
2255 | ireq->scu_status = SCU_NORMALIZE_COMPLETION_STATUS(completion_code); | ||
2256 | ireq->sci_status = SCI_FAILURE_CONTROLLER_SPECIFIC_IO_ERR; | ||
2257 | sci_change_state(&ireq->sm, SCI_REQ_COMPLETED); | ||
2258 | break; | ||
2259 | } | ||
2260 | |||
2261 | return SCI_SUCCESS; | ||
2262 | } | ||
2263 | |||
2264 | static enum sci_status | ||
2265 | stp_request_soft_reset_await_h2d_diagnostic_tc_event(struct isci_request *ireq, | ||
2266 | u32 completion_code) | ||
2267 | { | ||
2268 | switch (SCU_GET_COMPLETION_TL_STATUS(completion_code)) { | ||
2269 | case SCU_MAKE_COMPLETION_STATUS(SCU_TASK_DONE_GOOD): | ||
2270 | ireq->scu_status = SCU_TASK_DONE_GOOD; | ||
2271 | ireq->sci_status = SCI_SUCCESS; | ||
2272 | sci_change_state(&ireq->sm, SCI_REQ_STP_SOFT_RESET_WAIT_D2H); | ||
2273 | break; | ||
2274 | |||
2275 | default: | ||
2276 | /* All other completion status cause the IO to be complete. If | ||
2277 | * a NAK was received, then it is up to the user to retry the | ||
2278 | * request. | ||
2279 | */ | ||
2280 | ireq->scu_status = SCU_NORMALIZE_COMPLETION_STATUS(completion_code); | ||
2281 | ireq->sci_status = SCI_FAILURE_CONTROLLER_SPECIFIC_IO_ERR; | ||
2282 | sci_change_state(&ireq->sm, SCI_REQ_COMPLETED); | ||
2283 | break; | ||
2284 | } | ||
2285 | |||
2286 | return SCI_SUCCESS; | ||
2287 | } | ||
2288 | |||
2289 | static enum sci_status atapi_raw_completion(struct isci_request *ireq, u32 completion_code, | 2148 | static enum sci_status atapi_raw_completion(struct isci_request *ireq, u32 completion_code, |
2290 | enum sci_base_request_states next) | 2149 | enum sci_base_request_states next) |
2291 | { | 2150 | { |
@@ -2431,14 +2290,6 @@ sci_io_request_tc_completion(struct isci_request *ireq, | |||
2431 | case SCI_REQ_STP_PIO_DATA_OUT: | 2290 | case SCI_REQ_STP_PIO_DATA_OUT: |
2432 | return pio_data_out_tx_done_tc_event(ireq, completion_code); | 2291 | return pio_data_out_tx_done_tc_event(ireq, completion_code); |
2433 | 2292 | ||
2434 | case SCI_REQ_STP_SOFT_RESET_WAIT_H2D_ASSERTED: | ||
2435 | return stp_request_soft_reset_await_h2d_asserted_tc_event(ireq, | ||
2436 | completion_code); | ||
2437 | |||
2438 | case SCI_REQ_STP_SOFT_RESET_WAIT_H2D_DIAG: | ||
2439 | return stp_request_soft_reset_await_h2d_diagnostic_tc_event(ireq, | ||
2440 | completion_code); | ||
2441 | |||
2442 | case SCI_REQ_ABORTING: | 2293 | case SCI_REQ_ABORTING: |
2443 | return request_aborting_state_tc_event(ireq, | 2294 | return request_aborting_state_tc_event(ireq, |
2444 | completion_code); | 2295 | completion_code); |
@@ -3212,10 +3063,6 @@ static void sci_request_started_state_enter(struct sci_base_state_machine *sm) | |||
3212 | */ | 3063 | */ |
3213 | if (!task && dev->dev_type == SAS_END_DEV) { | 3064 | if (!task && dev->dev_type == SAS_END_DEV) { |
3214 | state = SCI_REQ_TASK_WAIT_TC_COMP; | 3065 | state = SCI_REQ_TASK_WAIT_TC_COMP; |
3215 | } else if (!task && | ||
3216 | (isci_request_access_tmf(ireq)->tmf_code == isci_tmf_sata_srst_high || | ||
3217 | isci_request_access_tmf(ireq)->tmf_code == isci_tmf_sata_srst_low)) { | ||
3218 | state = SCI_REQ_STP_SOFT_RESET_WAIT_H2D_ASSERTED; | ||
3219 | } else if (task && task->task_proto == SAS_PROTOCOL_SMP) { | 3066 | } else if (task && task->task_proto == SAS_PROTOCOL_SMP) { |
3220 | state = SCI_REQ_SMP_WAIT_RESP; | 3067 | state = SCI_REQ_SMP_WAIT_RESP; |
3221 | } else if (task && sas_protocol_ata(task->task_proto) && | 3068 | } else if (task && sas_protocol_ata(task->task_proto) && |
@@ -3272,31 +3119,6 @@ static void sci_stp_request_started_pio_await_h2d_completion_enter(struct sci_ba | |||
3272 | ireq->target_device->working_request = ireq; | 3119 | ireq->target_device->working_request = ireq; |
3273 | } | 3120 | } |
3274 | 3121 | ||
3275 | static void sci_stp_request_started_soft_reset_await_h2d_asserted_completion_enter(struct sci_base_state_machine *sm) | ||
3276 | { | ||
3277 | struct isci_request *ireq = container_of(sm, typeof(*ireq), sm); | ||
3278 | |||
3279 | ireq->target_device->working_request = ireq; | ||
3280 | } | ||
3281 | |||
3282 | static void sci_stp_request_started_soft_reset_await_h2d_diagnostic_completion_enter(struct sci_base_state_machine *sm) | ||
3283 | { | ||
3284 | struct isci_request *ireq = container_of(sm, typeof(*ireq), sm); | ||
3285 | struct scu_task_context *tc = ireq->tc; | ||
3286 | struct host_to_dev_fis *h2d_fis; | ||
3287 | enum sci_status status; | ||
3288 | |||
3289 | /* Clear the SRST bit */ | ||
3290 | h2d_fis = &ireq->stp.cmd; | ||
3291 | h2d_fis->control = 0; | ||
3292 | |||
3293 | /* Clear the TC control bit */ | ||
3294 | tc->control_frame = 0; | ||
3295 | |||
3296 | status = sci_controller_continue_io(ireq); | ||
3297 | WARN_ONCE(status != SCI_SUCCESS, "isci: continue io failure\n"); | ||
3298 | } | ||
3299 | |||
3300 | static const struct sci_base_state sci_request_state_table[] = { | 3122 | static const struct sci_base_state sci_request_state_table[] = { |
3301 | [SCI_REQ_INIT] = { }, | 3123 | [SCI_REQ_INIT] = { }, |
3302 | [SCI_REQ_CONSTRUCTED] = { }, | 3124 | [SCI_REQ_CONSTRUCTED] = { }, |
@@ -3315,13 +3137,6 @@ static const struct sci_base_state sci_request_state_table[] = { | |||
3315 | [SCI_REQ_STP_PIO_DATA_OUT] = { }, | 3137 | [SCI_REQ_STP_PIO_DATA_OUT] = { }, |
3316 | [SCI_REQ_STP_UDMA_WAIT_TC_COMP] = { }, | 3138 | [SCI_REQ_STP_UDMA_WAIT_TC_COMP] = { }, |
3317 | [SCI_REQ_STP_UDMA_WAIT_D2H] = { }, | 3139 | [SCI_REQ_STP_UDMA_WAIT_D2H] = { }, |
3318 | [SCI_REQ_STP_SOFT_RESET_WAIT_H2D_ASSERTED] = { | ||
3319 | .enter_state = sci_stp_request_started_soft_reset_await_h2d_asserted_completion_enter, | ||
3320 | }, | ||
3321 | [SCI_REQ_STP_SOFT_RESET_WAIT_H2D_DIAG] = { | ||
3322 | .enter_state = sci_stp_request_started_soft_reset_await_h2d_diagnostic_completion_enter, | ||
3323 | }, | ||
3324 | [SCI_REQ_STP_SOFT_RESET_WAIT_D2H] = { }, | ||
3325 | [SCI_REQ_TASK_WAIT_TC_COMP] = { }, | 3140 | [SCI_REQ_TASK_WAIT_TC_COMP] = { }, |
3326 | [SCI_REQ_TASK_WAIT_TC_RESP] = { }, | 3141 | [SCI_REQ_TASK_WAIT_TC_RESP] = { }, |
3327 | [SCI_REQ_SMP_WAIT_RESP] = { }, | 3142 | [SCI_REQ_SMP_WAIT_RESP] = { }, |