|
@@ -666,18 +666,12 @@ sci_io_request_construct_sata(struct isci_request *ireq,
|
|
|
if (test_bit(IREQ_TMF, &ireq->flags)) {
|
|
|
struct isci_tmf *tmf = isci_request_access_tmf(ireq);
|
|
|
|
|
|
- if (tmf->tmf_code == isci_tmf_sata_srst_high ||
|
|
|
- tmf->tmf_code == isci_tmf_sata_srst_low) {
|
|
|
- scu_stp_raw_request_construct_task_context(ireq);
|
|
|
- return SCI_SUCCESS;
|
|
|
- } else {
|
|
|
- dev_err(&ireq->owning_controller->pdev->dev,
|
|
|
- "%s: Request 0x%p received un-handled SAT "
|
|
|
- "management protocol 0x%x.\n",
|
|
|
- __func__, ireq, tmf->tmf_code);
|
|
|
+ dev_err(&ireq->owning_controller->pdev->dev,
|
|
|
+ "%s: Request 0x%p received un-handled SAT "
|
|
|
+ "management protocol 0x%x.\n",
|
|
|
+ __func__, ireq, tmf->tmf_code);
|
|
|
|
|
|
- return SCI_FAILURE;
|
|
|
- }
|
|
|
+ return SCI_FAILURE;
|
|
|
}
|
|
|
|
|
|
if (!sas_protocol_ata(task->task_proto)) {
|
|
@@ -774,34 +768,6 @@ static enum sci_status sci_io_request_construct_basic_sata(struct isci_request *
|
|
|
return status;
|
|
|
}
|
|
|
|
|
|
-enum sci_status sci_task_request_construct_sata(struct isci_request *ireq)
|
|
|
-{
|
|
|
- enum sci_status status = SCI_SUCCESS;
|
|
|
-
|
|
|
- /* check for management protocols */
|
|
|
- if (test_bit(IREQ_TMF, &ireq->flags)) {
|
|
|
- struct isci_tmf *tmf = isci_request_access_tmf(ireq);
|
|
|
-
|
|
|
- if (tmf->tmf_code == isci_tmf_sata_srst_high ||
|
|
|
- tmf->tmf_code == isci_tmf_sata_srst_low) {
|
|
|
- scu_stp_raw_request_construct_task_context(ireq);
|
|
|
- } else {
|
|
|
- dev_err(&ireq->owning_controller->pdev->dev,
|
|
|
- "%s: Request 0x%p received un-handled SAT "
|
|
|
- "Protocol 0x%x.\n",
|
|
|
- __func__, ireq, tmf->tmf_code);
|
|
|
-
|
|
|
- return SCI_FAILURE;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if (status != SCI_SUCCESS)
|
|
|
- return status;
|
|
|
- sci_change_state(&ireq->sm, SCI_REQ_CONSTRUCTED);
|
|
|
-
|
|
|
- return status;
|
|
|
-}
|
|
|
-
|
|
|
/**
|
|
|
* sci_req_tx_bytes - bytes transferred when reply underruns request
|
|
|
* @ireq: request that was terminated early
|
|
@@ -903,9 +869,6 @@ sci_io_request_terminate(struct isci_request *ireq)
|
|
|
case SCI_REQ_STP_PIO_WAIT_FRAME:
|
|
|
case SCI_REQ_STP_PIO_DATA_IN:
|
|
|
case SCI_REQ_STP_PIO_DATA_OUT:
|
|
|
- case SCI_REQ_STP_SOFT_RESET_WAIT_H2D_ASSERTED:
|
|
|
- case SCI_REQ_STP_SOFT_RESET_WAIT_H2D_DIAG:
|
|
|
- case SCI_REQ_STP_SOFT_RESET_WAIT_D2H:
|
|
|
case SCI_REQ_ATAPI_WAIT_H2D:
|
|
|
case SCI_REQ_ATAPI_WAIT_PIO_SETUP:
|
|
|
case SCI_REQ_ATAPI_WAIT_D2H:
|
|
@@ -2085,59 +2048,6 @@ sci_io_request_frame_handler(struct isci_request *ireq,
|
|
|
return status;
|
|
|
}
|
|
|
|
|
|
- case SCI_REQ_STP_SOFT_RESET_WAIT_D2H: {
|
|
|
- struct dev_to_host_fis *frame_header;
|
|
|
- u32 *frame_buffer;
|
|
|
-
|
|
|
- status = sci_unsolicited_frame_control_get_header(&ihost->uf_control,
|
|
|
- frame_index,
|
|
|
- (void **)&frame_header);
|
|
|
- if (status != SCI_SUCCESS) {
|
|
|
- dev_err(&ihost->pdev->dev,
|
|
|
- "%s: SCIC IO Request 0x%p could not get frame "
|
|
|
- "header for frame index %d, status %x\n",
|
|
|
- __func__,
|
|
|
- stp_req,
|
|
|
- frame_index,
|
|
|
- status);
|
|
|
- return status;
|
|
|
- }
|
|
|
-
|
|
|
- switch (frame_header->fis_type) {
|
|
|
- case FIS_REGD2H:
|
|
|
- sci_unsolicited_frame_control_get_buffer(&ihost->uf_control,
|
|
|
- frame_index,
|
|
|
- (void **)&frame_buffer);
|
|
|
-
|
|
|
- sci_controller_copy_sata_response(&ireq->stp.rsp,
|
|
|
- frame_header,
|
|
|
- frame_buffer);
|
|
|
-
|
|
|
- /* The command has completed with error */
|
|
|
- ireq->scu_status = SCU_TASK_DONE_CHECK_RESPONSE;
|
|
|
- ireq->sci_status = SCI_FAILURE_IO_RESPONSE_VALID;
|
|
|
- break;
|
|
|
-
|
|
|
- default:
|
|
|
- dev_warn(&ihost->pdev->dev,
|
|
|
- "%s: IO Request:0x%p Frame Id:%d protocol "
|
|
|
- "violation occurred\n",
|
|
|
- __func__,
|
|
|
- stp_req,
|
|
|
- frame_index);
|
|
|
-
|
|
|
- ireq->scu_status = SCU_TASK_DONE_UNEXP_FIS;
|
|
|
- ireq->sci_status = SCI_FAILURE_PROTOCOL_VIOLATION;
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- sci_change_state(&ireq->sm, SCI_REQ_COMPLETED);
|
|
|
-
|
|
|
- /* Frame has been decoded return it to the controller */
|
|
|
- sci_controller_release_frame(ihost, frame_index);
|
|
|
-
|
|
|
- return status;
|
|
|
- }
|
|
|
case SCI_REQ_ATAPI_WAIT_PIO_SETUP: {
|
|
|
struct sas_task *task = isci_request_access_task(ireq);
|
|
|
|
|
@@ -2235,57 +2145,6 @@ static enum sci_status stp_request_udma_await_tc_event(struct isci_request *ireq
|
|
|
return status;
|
|
|
}
|
|
|
|
|
|
-static enum sci_status
|
|
|
-stp_request_soft_reset_await_h2d_asserted_tc_event(struct isci_request *ireq,
|
|
|
- u32 completion_code)
|
|
|
-{
|
|
|
- switch (SCU_GET_COMPLETION_TL_STATUS(completion_code)) {
|
|
|
- case SCU_MAKE_COMPLETION_STATUS(SCU_TASK_DONE_GOOD):
|
|
|
- ireq->scu_status = SCU_TASK_DONE_GOOD;
|
|
|
- ireq->sci_status = SCI_SUCCESS;
|
|
|
- sci_change_state(&ireq->sm, SCI_REQ_STP_SOFT_RESET_WAIT_H2D_DIAG);
|
|
|
- break;
|
|
|
-
|
|
|
- default:
|
|
|
- /*
|
|
|
- * All other completion status cause the IO to be complete.
|
|
|
- * If a NAK was received, then it is up to the user to retry
|
|
|
- * the request.
|
|
|
- */
|
|
|
- ireq->scu_status = SCU_NORMALIZE_COMPLETION_STATUS(completion_code);
|
|
|
- ireq->sci_status = SCI_FAILURE_CONTROLLER_SPECIFIC_IO_ERR;
|
|
|
- sci_change_state(&ireq->sm, SCI_REQ_COMPLETED);
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- return SCI_SUCCESS;
|
|
|
-}
|
|
|
-
|
|
|
-static enum sci_status
|
|
|
-stp_request_soft_reset_await_h2d_diagnostic_tc_event(struct isci_request *ireq,
|
|
|
- u32 completion_code)
|
|
|
-{
|
|
|
- switch (SCU_GET_COMPLETION_TL_STATUS(completion_code)) {
|
|
|
- case SCU_MAKE_COMPLETION_STATUS(SCU_TASK_DONE_GOOD):
|
|
|
- ireq->scu_status = SCU_TASK_DONE_GOOD;
|
|
|
- ireq->sci_status = SCI_SUCCESS;
|
|
|
- sci_change_state(&ireq->sm, SCI_REQ_STP_SOFT_RESET_WAIT_D2H);
|
|
|
- break;
|
|
|
-
|
|
|
- default:
|
|
|
- /* All other completion status cause the IO to be complete. If
|
|
|
- * a NAK was received, then it is up to the user to retry the
|
|
|
- * request.
|
|
|
- */
|
|
|
- ireq->scu_status = SCU_NORMALIZE_COMPLETION_STATUS(completion_code);
|
|
|
- ireq->sci_status = SCI_FAILURE_CONTROLLER_SPECIFIC_IO_ERR;
|
|
|
- sci_change_state(&ireq->sm, SCI_REQ_COMPLETED);
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- return SCI_SUCCESS;
|
|
|
-}
|
|
|
-
|
|
|
static enum sci_status atapi_raw_completion(struct isci_request *ireq, u32 completion_code,
|
|
|
enum sci_base_request_states next)
|
|
|
{
|
|
@@ -2431,14 +2290,6 @@ sci_io_request_tc_completion(struct isci_request *ireq,
|
|
|
case SCI_REQ_STP_PIO_DATA_OUT:
|
|
|
return pio_data_out_tx_done_tc_event(ireq, completion_code);
|
|
|
|
|
|
- case SCI_REQ_STP_SOFT_RESET_WAIT_H2D_ASSERTED:
|
|
|
- return stp_request_soft_reset_await_h2d_asserted_tc_event(ireq,
|
|
|
- completion_code);
|
|
|
-
|
|
|
- case SCI_REQ_STP_SOFT_RESET_WAIT_H2D_DIAG:
|
|
|
- return stp_request_soft_reset_await_h2d_diagnostic_tc_event(ireq,
|
|
|
- completion_code);
|
|
|
-
|
|
|
case SCI_REQ_ABORTING:
|
|
|
return request_aborting_state_tc_event(ireq,
|
|
|
completion_code);
|
|
@@ -3212,10 +3063,6 @@ static void sci_request_started_state_enter(struct sci_base_state_machine *sm)
|
|
|
*/
|
|
|
if (!task && dev->dev_type == SAS_END_DEV) {
|
|
|
state = SCI_REQ_TASK_WAIT_TC_COMP;
|
|
|
- } else if (!task &&
|
|
|
- (isci_request_access_tmf(ireq)->tmf_code == isci_tmf_sata_srst_high ||
|
|
|
- isci_request_access_tmf(ireq)->tmf_code == isci_tmf_sata_srst_low)) {
|
|
|
- state = SCI_REQ_STP_SOFT_RESET_WAIT_H2D_ASSERTED;
|
|
|
} else if (task && task->task_proto == SAS_PROTOCOL_SMP) {
|
|
|
state = SCI_REQ_SMP_WAIT_RESP;
|
|
|
} 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
|
|
|
ireq->target_device->working_request = ireq;
|
|
|
}
|
|
|
|
|
|
-static void sci_stp_request_started_soft_reset_await_h2d_asserted_completion_enter(struct sci_base_state_machine *sm)
|
|
|
-{
|
|
|
- struct isci_request *ireq = container_of(sm, typeof(*ireq), sm);
|
|
|
-
|
|
|
- ireq->target_device->working_request = ireq;
|
|
|
-}
|
|
|
-
|
|
|
-static void sci_stp_request_started_soft_reset_await_h2d_diagnostic_completion_enter(struct sci_base_state_machine *sm)
|
|
|
-{
|
|
|
- struct isci_request *ireq = container_of(sm, typeof(*ireq), sm);
|
|
|
- struct scu_task_context *tc = ireq->tc;
|
|
|
- struct host_to_dev_fis *h2d_fis;
|
|
|
- enum sci_status status;
|
|
|
-
|
|
|
- /* Clear the SRST bit */
|
|
|
- h2d_fis = &ireq->stp.cmd;
|
|
|
- h2d_fis->control = 0;
|
|
|
-
|
|
|
- /* Clear the TC control bit */
|
|
|
- tc->control_frame = 0;
|
|
|
-
|
|
|
- status = sci_controller_continue_io(ireq);
|
|
|
- WARN_ONCE(status != SCI_SUCCESS, "isci: continue io failure\n");
|
|
|
-}
|
|
|
-
|
|
|
static const struct sci_base_state sci_request_state_table[] = {
|
|
|
[SCI_REQ_INIT] = { },
|
|
|
[SCI_REQ_CONSTRUCTED] = { },
|
|
@@ -3315,13 +3137,6 @@ static const struct sci_base_state sci_request_state_table[] = {
|
|
|
[SCI_REQ_STP_PIO_DATA_OUT] = { },
|
|
|
[SCI_REQ_STP_UDMA_WAIT_TC_COMP] = { },
|
|
|
[SCI_REQ_STP_UDMA_WAIT_D2H] = { },
|
|
|
- [SCI_REQ_STP_SOFT_RESET_WAIT_H2D_ASSERTED] = {
|
|
|
- .enter_state = sci_stp_request_started_soft_reset_await_h2d_asserted_completion_enter,
|
|
|
- },
|
|
|
- [SCI_REQ_STP_SOFT_RESET_WAIT_H2D_DIAG] = {
|
|
|
- .enter_state = sci_stp_request_started_soft_reset_await_h2d_diagnostic_completion_enter,
|
|
|
- },
|
|
|
- [SCI_REQ_STP_SOFT_RESET_WAIT_D2H] = { },
|
|
|
[SCI_REQ_TASK_WAIT_TC_COMP] = { },
|
|
|
[SCI_REQ_TASK_WAIT_TC_RESP] = { },
|
|
|
[SCI_REQ_SMP_WAIT_RESP] = { },
|