Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5076a1a9 authored by Dan Williams's avatar Dan Williams
Browse files

isci: unify isci_request and scic_sds_request



They are one in the same object so remove the distinction.  The near
duplicate fields (owning_controller, and isci_host) will be cleaned up
after the scic_sds_contoller isci_host unification.

Reported-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
parent ba7cb223
Loading
Loading
Loading
Loading
+41 −57
Original line number Diff line number Diff line
@@ -258,21 +258,20 @@ static void scic_sds_controller_task_completion(struct scic_sds_controller *scic
	u32 index = SCU_GET_COMPLETION_INDEX(completion_entry);
	struct isci_host *ihost = scic_to_ihost(scic);
	struct isci_request *ireq = ihost->reqs[index];
	struct scic_sds_request *sci_req = &ireq->sci;

	/* Make sure that we really want to process this IO request */
	if (test_bit(IREQ_ACTIVE, &ireq->flags) &&
	    sci_req->io_tag != SCI_CONTROLLER_INVALID_IO_TAG &&
	    ISCI_TAG_SEQ(sci_req->io_tag) == scic->io_request_sequence[index])
	    ireq->io_tag != SCI_CONTROLLER_INVALID_IO_TAG &&
	    ISCI_TAG_SEQ(ireq->io_tag) == scic->io_request_sequence[index])
		/* Yep this is a valid io request pass it along to the io request handler */
		scic_sds_io_request_tc_completion(sci_req, completion_entry);
		scic_sds_io_request_tc_completion(ireq, completion_entry);
}

static void scic_sds_controller_sdma_completion(struct scic_sds_controller *scic,
						u32 completion_entry)
{
	u32 index;
	struct scic_sds_request *io_request;
	struct isci_request *ireq;
	struct scic_sds_remote_device *device;

	index = SCU_GET_COMPLETION_INDEX(completion_entry);
@@ -280,41 +279,27 @@ static void scic_sds_controller_sdma_completion(struct scic_sds_controller *scic
	switch (scu_get_command_request_type(completion_entry)) {
	case SCU_CONTEXT_COMMAND_REQUEST_TYPE_POST_TC:
	case SCU_CONTEXT_COMMAND_REQUEST_TYPE_DUMP_TC:
		io_request = &scic_to_ihost(scic)->reqs[index]->sci;
		dev_warn(scic_to_dev(scic),
			 "%s: SCIC SDS Completion type SDMA %x for io request "
			 "%p\n",
			 __func__,
			 completion_entry,
			 io_request);
		ireq = scic_to_ihost(scic)->reqs[index];
		dev_warn(scic_to_dev(scic), "%s: %x for io request %p\n",
			 __func__, completion_entry, ireq);
		/* @todo For a post TC operation we need to fail the IO
		 * request
		 */
		break;

	case SCU_CONTEXT_COMMAND_REQUEST_TYPE_DUMP_RNC:
	case SCU_CONTEXT_COMMAND_REQUEST_TYPE_OTHER_RNC:
	case SCU_CONTEXT_COMMAND_REQUEST_TYPE_POST_RNC:
		device = scic->device_table[index];
		dev_warn(scic_to_dev(scic),
			 "%s: SCIC SDS Completion type SDMA %x for remote "
			 "device %p\n",
			 __func__,
			 completion_entry,
			 device);
		dev_warn(scic_to_dev(scic), "%s: %x for device %p\n",
			 __func__, completion_entry, device);
		/* @todo For a port RNC operation we need to fail the
		 * device
		 */
		break;

	default:
		dev_warn(scic_to_dev(scic),
			 "%s: SCIC SDS Completion unknown SDMA completion "
			 "type %x\n",
			 __func__,
			 completion_entry);
		dev_warn(scic_to_dev(scic), "%s: unknown completion type %x\n",
			 __func__, completion_entry);
		break;

	}
}

@@ -385,8 +370,8 @@ static void scic_sds_controller_event_completion(struct scic_sds_controller *sci
						 u32 completion_entry)
{
	struct isci_host *ihost = scic_to_ihost(scic);
	struct scic_sds_request *io_request;
	struct scic_sds_remote_device *device;
	struct isci_request *ireq;
	struct scic_sds_phy *phy;
	u32 index;

@@ -418,17 +403,17 @@ static void scic_sds_controller_event_completion(struct scic_sds_controller *sci
		break;

	case SCU_EVENT_TYPE_TRANSPORT_ERROR:
		io_request = &ihost->reqs[index]->sci;
		scic_sds_io_request_event_handler(io_request, completion_entry);
		ireq = ihost->reqs[index];
		scic_sds_io_request_event_handler(ireq, completion_entry);
		break;

	case SCU_EVENT_TYPE_PTX_SCHEDULE_EVENT:
		switch (scu_get_event_specifier(completion_entry)) {
		case SCU_EVENT_SPECIFIC_SMP_RESPONSE_NO_PE:
		case SCU_EVENT_SPECIFIC_TASK_TIMEOUT:
			io_request = &ihost->reqs[index]->sci;
			if (io_request != NULL)
				scic_sds_io_request_event_handler(io_request, completion_entry);
			ireq = ihost->reqs[index];
			if (ireq != NULL)
				scic_sds_io_request_event_handler(ireq, completion_entry);
			else
				dev_warn(scic_to_dev(scic),
					 "%s: SCIC Controller 0x%p received "
@@ -1185,7 +1170,7 @@ static void isci_host_completion_routine(unsigned long data)
		}

		spin_lock_irq(&isci_host->scic_lock);
		isci_free_tag(isci_host, request->sci.io_tag);
		isci_free_tag(isci_host, request->io_tag);
		spin_unlock_irq(&isci_host->scic_lock);
	}
	list_for_each_entry_safe(request, next_request, &errored_request_list,
@@ -1222,7 +1207,7 @@ static void isci_host_completion_routine(unsigned long data)
			* of pending requests.
			*/
			list_del_init(&request->dev_node);
			isci_free_tag(isci_host, request->sci.io_tag);
			isci_free_tag(isci_host, request->io_tag);
			spin_unlock_irq(&isci_host->scic_lock);
		}
	}
@@ -2486,8 +2471,8 @@ int isci_host_init(struct isci_host *isci_host)
		if (!ireq)
			return -ENOMEM;

		ireq->sci.tc = &isci_host->sci.task_context_table[i];
		ireq->sci.owning_controller = &isci_host->sci;
		ireq->tc = &isci_host->sci.task_context_table[i];
		ireq->owning_controller = &isci_host->sci;
		spin_lock_init(&ireq->state_lock);
		ireq->request_daddr = dma;
		ireq->isci_host = isci_host;
@@ -2600,7 +2585,7 @@ void scic_sds_controller_post_request(
	writel(request, &scic->smu_registers->post_context_port);
}

struct scic_sds_request *scic_request_by_tag(struct scic_sds_controller *scic, u16 io_tag)
struct isci_request *scic_request_by_tag(struct scic_sds_controller *scic, u16 io_tag)
{
	u16 task_index;
	u16 task_sequence;
@@ -2614,7 +2599,7 @@ struct scic_sds_request *scic_request_by_tag(struct scic_sds_controller *scic, u
			task_sequence = ISCI_TAG_SEQ(io_tag);

			if (task_sequence == scic->io_request_sequence[task_index])
				return &ireq->sci;
				return ireq;
		}
	}

@@ -2814,7 +2799,7 @@ enum sci_status isci_free_tag(struct isci_host *ihost, u16 io_tag)
 */
enum sci_status scic_controller_start_io(struct scic_sds_controller *scic,
					 struct scic_sds_remote_device *rdev,
					 struct scic_sds_request *req)
					 struct isci_request *ireq)
{
	enum sci_status status;

@@ -2823,12 +2808,12 @@ enum sci_status scic_controller_start_io(struct scic_sds_controller *scic,
		return SCI_FAILURE_INVALID_STATE;
	}

	status = scic_sds_remote_device_start_io(scic, rdev, req);
	status = scic_sds_remote_device_start_io(scic, rdev, ireq);
	if (status != SCI_SUCCESS)
		return status;

	set_bit(IREQ_ACTIVE, &sci_req_to_ireq(req)->flags);
	scic_sds_controller_post_request(scic, scic_sds_request_get_post_context(req));
	set_bit(IREQ_ACTIVE, &ireq->flags);
	scic_sds_controller_post_request(scic, scic_sds_request_get_post_context(ireq));
	return SCI_SUCCESS;
}

@@ -2851,7 +2836,7 @@ enum sci_status scic_controller_start_io(struct scic_sds_controller *scic,
enum sci_status scic_controller_terminate_request(
	struct scic_sds_controller *scic,
	struct scic_sds_remote_device *rdev,
	struct scic_sds_request *req)
	struct isci_request *ireq)
{
	enum sci_status status;

@@ -2861,7 +2846,7 @@ enum sci_status scic_controller_terminate_request(
		return SCI_FAILURE_INVALID_STATE;
	}

	status = scic_sds_io_request_terminate(req);
	status = scic_sds_io_request_terminate(ireq);
	if (status != SCI_SUCCESS)
		return status;

@@ -2870,7 +2855,7 @@ enum sci_status scic_controller_terminate_request(
	 * request sub-type.
	 */
	scic_sds_controller_post_request(scic,
		scic_sds_request_get_post_context(req) |
		scic_sds_request_get_post_context(ireq) |
		SCU_CONTEXT_COMMAND_REQUEST_POST_TC_ABORT);
	return SCI_SUCCESS;
}
@@ -2889,7 +2874,7 @@ enum sci_status scic_controller_terminate_request(
enum sci_status scic_controller_complete_io(
	struct scic_sds_controller *scic,
	struct scic_sds_remote_device *rdev,
	struct scic_sds_request *request)
	struct isci_request *ireq)
{
	enum sci_status status;
	u16 index;
@@ -2899,12 +2884,12 @@ enum sci_status scic_controller_complete_io(
		/* XXX: Implement this function */
		return SCI_FAILURE;
	case SCIC_READY:
		status = scic_sds_remote_device_complete_io(scic, rdev, request);
		status = scic_sds_remote_device_complete_io(scic, rdev, ireq);
		if (status != SCI_SUCCESS)
			return status;

		index = ISCI_TAG_TCI(request->io_tag);
		clear_bit(IREQ_ACTIVE, &sci_req_to_ireq(request)->flags);
		index = ISCI_TAG_TCI(ireq->io_tag);
		clear_bit(IREQ_ACTIVE, &ireq->flags);
		return SCI_SUCCESS;
	default:
		dev_warn(scic_to_dev(scic), "invalid state to complete I/O");
@@ -2913,17 +2898,17 @@ enum sci_status scic_controller_complete_io(

}

enum sci_status scic_controller_continue_io(struct scic_sds_request *sci_req)
enum sci_status scic_controller_continue_io(struct isci_request *ireq)
{
	struct scic_sds_controller *scic = sci_req->owning_controller;
	struct scic_sds_controller *scic = ireq->owning_controller;

	if (scic->sm.current_state_id != SCIC_READY) {
		dev_warn(scic_to_dev(scic), "invalid state to continue I/O");
		return SCI_FAILURE_INVALID_STATE;
	}

	set_bit(IREQ_ACTIVE, &sci_req_to_ireq(sci_req)->flags);
	scic_sds_controller_post_request(scic, scic_sds_request_get_post_context(sci_req));
	set_bit(IREQ_ACTIVE, &ireq->flags);
	scic_sds_controller_post_request(scic, scic_sds_request_get_post_context(ireq));
	return SCI_SUCCESS;
}

@@ -2939,9 +2924,8 @@ enum sci_status scic_controller_continue_io(struct scic_sds_request *sci_req)
enum sci_task_status scic_controller_start_task(
	struct scic_sds_controller *scic,
	struct scic_sds_remote_device *rdev,
	struct scic_sds_request *req)
	struct isci_request *ireq)
{
	struct isci_request *ireq = sci_req_to_ireq(req);
	enum sci_status status;

	if (scic->sm.current_state_id != SCIC_READY) {
@@ -2952,7 +2936,7 @@ enum sci_task_status scic_controller_start_task(
		return SCI_TASK_FAILURE_INVALID_STATE;
	}

	status = scic_sds_remote_device_start_task(scic, rdev, req);
	status = scic_sds_remote_device_start_task(scic, rdev, ireq);
	switch (status) {
	case SCI_FAILURE_RESET_DEVICE_PARTIAL_SUCCESS:
		set_bit(IREQ_ACTIVE, &ireq->flags);
@@ -2967,7 +2951,7 @@ enum sci_task_status scic_controller_start_task(
		set_bit(IREQ_ACTIVE, &ireq->flags);

		scic_sds_controller_post_request(scic,
			scic_sds_request_get_post_context(req));
			scic_sds_request_get_post_context(ireq));
		break;
	default:
		break;
+8 −8
Original line number Diff line number Diff line
@@ -64,7 +64,7 @@
#include "unsolicited_frame_control.h"
#include "probe_roms.h"

struct scic_sds_request;
struct isci_request;
struct scu_task_context;


@@ -601,7 +601,7 @@ union scu_remote_node_context *scic_sds_controller_get_remote_node_context_buffe
	struct scic_sds_controller *scic,
	u16 node_id);

struct scic_sds_request *scic_request_by_tag(struct scic_sds_controller *scic,
struct isci_request *scic_request_by_tag(struct scic_sds_controller *scic,
					     u16 io_tag);

void scic_sds_controller_power_control_queue_insert(
@@ -628,11 +628,11 @@ void scic_sds_controller_remote_device_stopped(

void scic_sds_controller_copy_task_context(
	struct scic_sds_controller *scic,
	struct scic_sds_request *this_request);
	struct isci_request *ireq);

void scic_sds_controller_register_setup(struct scic_sds_controller *scic);

enum sci_status scic_controller_continue_io(struct scic_sds_request *sci_req);
enum sci_status scic_controller_continue_io(struct isci_request *ireq);
int isci_host_scan_finished(struct Scsi_Host *, unsigned long);
void isci_host_scan_start(struct Scsi_Host *);
u16 isci_alloc_tag(struct isci_host *ihost);
@@ -665,22 +665,22 @@ void scic_controller_disable_interrupts(
enum sci_status scic_controller_start_io(
	struct scic_sds_controller *scic,
	struct scic_sds_remote_device *remote_device,
	struct scic_sds_request *io_request);
	struct isci_request *ireq);

enum sci_task_status scic_controller_start_task(
	struct scic_sds_controller *scic,
	struct scic_sds_remote_device *remote_device,
	struct scic_sds_request *task_request);
	struct isci_request *ireq);

enum sci_status scic_controller_terminate_request(
	struct scic_sds_controller *scic,
	struct scic_sds_remote_device *remote_device,
	struct scic_sds_request *request);
	struct isci_request *ireq);

enum sci_status scic_controller_complete_io(
	struct scic_sds_controller *scic,
	struct scic_sds_remote_device *remote_device,
	struct scic_sds_request *io_request);
	struct isci_request *ireq);

void scic_sds_port_configuration_agent_construct(
	struct scic_sds_port_configuration_agent *port_agent);
+2 −2
Original line number Diff line number Diff line
@@ -1611,7 +1611,7 @@ enum sci_status scic_sds_port_link_down(struct scic_sds_port *sci_port,

enum sci_status scic_sds_port_start_io(struct scic_sds_port *sci_port,
				       struct scic_sds_remote_device *sci_dev,
				       struct scic_sds_request *sci_req)
				       struct isci_request *ireq)
{
	enum scic_sds_port_states state;

@@ -1631,7 +1631,7 @@ enum sci_status scic_sds_port_start_io(struct scic_sds_port *sci_port,

enum sci_status scic_sds_port_complete_io(struct scic_sds_port *sci_port,
					  struct scic_sds_remote_device *sci_dev,
					  struct scic_sds_request *sci_req)
					  struct isci_request *ireq)
{
	enum scic_sds_port_states state;

+3 −3
Original line number Diff line number Diff line
@@ -354,17 +354,17 @@ enum sci_status scic_sds_port_link_up(struct scic_sds_port *sci_port,
enum sci_status scic_sds_port_link_down(struct scic_sds_port *sci_port,
					struct scic_sds_phy *sci_phy);

struct scic_sds_request;
struct isci_request;
struct scic_sds_remote_device;
enum sci_status scic_sds_port_start_io(
	struct scic_sds_port *sci_port,
	struct scic_sds_remote_device *sci_dev,
	struct scic_sds_request *sci_req);
	struct isci_request *ireq);

enum sci_status scic_sds_port_complete_io(
	struct scic_sds_port *sci_port,
	struct scic_sds_remote_device *sci_dev,
	struct scic_sds_request *sci_req);
	struct isci_request *ireq);

enum sas_linkrate scic_sds_port_get_max_allowed_speed(
	struct scic_sds_port *sci_port);
+45 −47
Original line number Diff line number Diff line
@@ -94,7 +94,7 @@ static void isci_remote_device_not_ready(struct isci_host *ihost,

			scic_controller_terminate_request(&ihost->sci,
							  &idev->sci,
							  &ireq->sci);
							  ireq);
		}
		/* Fall through into the default case... */
	default:
@@ -142,14 +142,13 @@ static enum sci_status scic_sds_remote_device_terminate_requests(struct scic_sds

	for (i = 0; i < SCI_MAX_IO_REQUESTS && i < request_count; i++) {
		struct isci_request *ireq = ihost->reqs[i];
		struct scic_sds_request *sci_req = &ireq->sci;
		enum sci_status s;

		if (!test_bit(IREQ_ACTIVE, &ireq->flags) ||
		    sci_req->target_device != sci_dev)
		    ireq->target_device != sci_dev)
			continue;

		s = scic_controller_terminate_request(scic, sci_dev, sci_req);
		s = scic_controller_terminate_request(scic, sci_dev, ireq);
		if (s != SCI_SUCCESS)
			status = s;
	}
@@ -299,7 +298,7 @@ enum sci_status scic_sds_remote_device_frame_handler(struct scic_sds_remote_devi
	case SCI_DEV_STOPPING:
	case SCI_DEV_FAILED:
	case SCI_DEV_RESETTING: {
		struct scic_sds_request *sci_req;
		struct isci_request *ireq;
		struct ssp_frame_hdr hdr;
		void *frame_header;
		ssize_t word_cnt;
@@ -313,10 +312,10 @@ enum sci_status scic_sds_remote_device_frame_handler(struct scic_sds_remote_devi
		word_cnt = sizeof(hdr) / sizeof(u32);
		sci_swab32_cpy(&hdr, frame_header, word_cnt);

		sci_req = scic_request_by_tag(scic, be16_to_cpu(hdr.tag));
		if (sci_req && sci_req->target_device == sci_dev) {
		ireq = scic_request_by_tag(scic, be16_to_cpu(hdr.tag));
		if (ireq && ireq->target_device == sci_dev) {
			/* The IO request is now in charge of releasing the frame */
			status = scic_sds_io_request_frame_handler(sci_req, frame_index);
			status = scic_sds_io_request_frame_handler(ireq, frame_index);
		} else {
			/* We could not map this tag to a valid IO
			 * request Just toss the frame and continue
@@ -448,14 +447,14 @@ enum sci_status scic_sds_remote_device_event_handler(struct scic_sds_remote_devi
}

static void scic_sds_remote_device_start_request(struct scic_sds_remote_device *sci_dev,
						 struct scic_sds_request *sci_req,
						 struct isci_request *ireq,
						 enum sci_status status)
{
	struct scic_sds_port *sci_port = sci_dev->owning_port;

	/* cleanup requests that failed after starting on the port */
	if (status != SCI_SUCCESS)
		scic_sds_port_complete_io(sci_port, sci_dev, sci_req);
		scic_sds_port_complete_io(sci_port, sci_dev, ireq);
	else {
		kref_get(&sci_dev_to_idev(sci_dev)->kref);
		scic_sds_remote_device_increment_request_count(sci_dev);
@@ -464,12 +463,11 @@ static void scic_sds_remote_device_start_request(struct scic_sds_remote_device *

enum sci_status scic_sds_remote_device_start_io(struct scic_sds_controller *scic,
						struct scic_sds_remote_device *sci_dev,
						struct scic_sds_request *sci_req)
						struct isci_request *ireq)
{
	struct sci_base_state_machine *sm = &sci_dev->sm;
	enum scic_sds_remote_device_states state = sm->current_state_id;
	struct scic_sds_port *sci_port = sci_dev->owning_port;
	struct isci_request *ireq = sci_req_to_ireq(sci_req);
	enum sci_status status;

	switch (state) {
@@ -491,15 +489,15 @@ enum sci_status scic_sds_remote_device_start_io(struct scic_sds_controller *scic
		 * successful it will start the request for the port object then
		 * increment its own request count.
		 */
		status = scic_sds_port_start_io(sci_port, sci_dev, sci_req);
		status = scic_sds_port_start_io(sci_port, sci_dev, ireq);
		if (status != SCI_SUCCESS)
			return status;

		status = scic_sds_remote_node_context_start_io(&sci_dev->rnc, sci_req);
		status = scic_sds_remote_node_context_start_io(&sci_dev->rnc, ireq);
		if (status != SCI_SUCCESS)
			break;

		status = scic_sds_request_start(sci_req);
		status = scic_sds_request_start(ireq);
		break;
	case SCI_STP_DEV_IDLE: {
		/* handle the start io operation for a sata device that is in
@@ -513,22 +511,22 @@ enum sci_status scic_sds_remote_device_start_io(struct scic_sds_controller *scic
		enum scic_sds_remote_device_states new_state;
		struct sas_task *task = isci_request_access_task(ireq);

		status = scic_sds_port_start_io(sci_port, sci_dev, sci_req);
		status = scic_sds_port_start_io(sci_port, sci_dev, ireq);
		if (status != SCI_SUCCESS)
			return status;

		status = scic_sds_remote_node_context_start_io(&sci_dev->rnc, sci_req);
		status = scic_sds_remote_node_context_start_io(&sci_dev->rnc, ireq);
		if (status != SCI_SUCCESS)
			break;

		status = scic_sds_request_start(sci_req);
		status = scic_sds_request_start(ireq);
		if (status != SCI_SUCCESS)
			break;

		if (task->ata_task.use_ncq)
			new_state = SCI_STP_DEV_NCQ;
		else {
			sci_dev->working_request = sci_req;
			sci_dev->working_request = ireq;
			new_state = SCI_STP_DEV_CMD;
		}
		sci_change_state(sm, new_state);
@@ -538,15 +536,15 @@ enum sci_status scic_sds_remote_device_start_io(struct scic_sds_controller *scic
		struct sas_task *task = isci_request_access_task(ireq);

		if (task->ata_task.use_ncq) {
			status = scic_sds_port_start_io(sci_port, sci_dev, sci_req);
			status = scic_sds_port_start_io(sci_port, sci_dev, ireq);
			if (status != SCI_SUCCESS)
				return status;

			status = scic_sds_remote_node_context_start_io(&sci_dev->rnc, sci_req);
			status = scic_sds_remote_node_context_start_io(&sci_dev->rnc, ireq);
			if (status != SCI_SUCCESS)
				break;

			status = scic_sds_request_start(sci_req);
			status = scic_sds_request_start(ireq);
		} else
			return SCI_FAILURE_INVALID_STATE;
		break;
@@ -554,19 +552,19 @@ enum sci_status scic_sds_remote_device_start_io(struct scic_sds_controller *scic
	case SCI_STP_DEV_AWAIT_RESET:
		return SCI_FAILURE_REMOTE_DEVICE_RESET_REQUIRED;
	case SCI_SMP_DEV_IDLE:
		status = scic_sds_port_start_io(sci_port, sci_dev, sci_req);
		status = scic_sds_port_start_io(sci_port, sci_dev, ireq);
		if (status != SCI_SUCCESS)
			return status;

		status = scic_sds_remote_node_context_start_io(&sci_dev->rnc, sci_req);
		status = scic_sds_remote_node_context_start_io(&sci_dev->rnc, ireq);
		if (status != SCI_SUCCESS)
			break;

		status = scic_sds_request_start(sci_req);
		status = scic_sds_request_start(ireq);
		if (status != SCI_SUCCESS)
			break;

		sci_dev->working_request = sci_req;
		sci_dev->working_request = ireq;
		sci_change_state(&sci_dev->sm, SCI_SMP_DEV_CMD);
		break;
	case SCI_STP_DEV_CMD:
@@ -577,21 +575,21 @@ enum sci_status scic_sds_remote_device_start_io(struct scic_sds_controller *scic
		return SCI_FAILURE_INVALID_STATE;
	}

	scic_sds_remote_device_start_request(sci_dev, sci_req, status);
	scic_sds_remote_device_start_request(sci_dev, ireq, status);
	return status;
}

static enum sci_status common_complete_io(struct scic_sds_port *sci_port,
					  struct scic_sds_remote_device *sci_dev,
					  struct scic_sds_request *sci_req)
					  struct isci_request *ireq)
{
	enum sci_status status;

	status = scic_sds_request_complete(sci_req);
	status = scic_sds_request_complete(ireq);
	if (status != SCI_SUCCESS)
		return status;

	status = scic_sds_port_complete_io(sci_port, sci_dev, sci_req);
	status = scic_sds_port_complete_io(sci_port, sci_dev, ireq);
	if (status != SCI_SUCCESS)
		return status;

@@ -601,7 +599,7 @@ static enum sci_status common_complete_io(struct scic_sds_port *sci_port,

enum sci_status scic_sds_remote_device_complete_io(struct scic_sds_controller *scic,
						   struct scic_sds_remote_device *sci_dev,
						   struct scic_sds_request *sci_req)
						   struct isci_request *ireq)
{
	struct sci_base_state_machine *sm = &sci_dev->sm;
	enum scic_sds_remote_device_states state = sm->current_state_id;
@@ -623,16 +621,16 @@ enum sci_status scic_sds_remote_device_complete_io(struct scic_sds_controller *s
	case SCI_DEV_READY:
	case SCI_STP_DEV_AWAIT_RESET:
	case SCI_DEV_RESETTING:
		status = common_complete_io(sci_port, sci_dev, sci_req);
		status = common_complete_io(sci_port, sci_dev, ireq);
		break;
	case SCI_STP_DEV_CMD:
	case SCI_STP_DEV_NCQ:
	case SCI_STP_DEV_NCQ_ERROR:
		status = common_complete_io(sci_port, sci_dev, sci_req);
		status = common_complete_io(sci_port, sci_dev, ireq);
		if (status != SCI_SUCCESS)
			break;

		if (sci_req->sci_status == SCI_FAILURE_REMOTE_DEVICE_RESET_REQUIRED) {
		if (ireq->sci_status == SCI_FAILURE_REMOTE_DEVICE_RESET_REQUIRED) {
			/* This request causes hardware error, device needs to be Lun Reset.
			 * So here we force the state machine to IDLE state so the rest IOs
			 * can reach RNC state handler, these IOs will be completed by RNC with
@@ -643,13 +641,13 @@ enum sci_status scic_sds_remote_device_complete_io(struct scic_sds_controller *s
			sci_change_state(sm, SCI_STP_DEV_IDLE);
		break;
	case SCI_SMP_DEV_CMD:
		status = common_complete_io(sci_port, sci_dev, sci_req);
		status = common_complete_io(sci_port, sci_dev, ireq);
		if (status != SCI_SUCCESS)
			break;
		sci_change_state(sm, SCI_SMP_DEV_IDLE);
		break;
	case SCI_DEV_STOPPING:
		status = common_complete_io(sci_port, sci_dev, sci_req);
		status = common_complete_io(sci_port, sci_dev, ireq);
		if (status != SCI_SUCCESS)
			break;

@@ -664,7 +662,7 @@ enum sci_status scic_sds_remote_device_complete_io(struct scic_sds_controller *s
		dev_err(scirdev_to_dev(sci_dev),
			"%s: Port:0x%p Device:0x%p Request:0x%p Status:0x%x "
			"could not complete\n", __func__, sci_port,
			sci_dev, sci_req, status);
			sci_dev, ireq, status);
	else
		isci_put_device(sci_dev_to_idev(sci_dev));

@@ -682,7 +680,7 @@ static void scic_sds_remote_device_continue_request(void *dev)

enum sci_status scic_sds_remote_device_start_task(struct scic_sds_controller *scic,
						  struct scic_sds_remote_device *sci_dev,
						  struct scic_sds_request *sci_req)
						  struct isci_request *ireq)
{
	struct sci_base_state_machine *sm = &sci_dev->sm;
	enum scic_sds_remote_device_states state = sm->current_state_id;
@@ -708,15 +706,15 @@ enum sci_status scic_sds_remote_device_start_task(struct scic_sds_controller *sc
	case SCI_STP_DEV_NCQ:
	case SCI_STP_DEV_NCQ_ERROR:
	case SCI_STP_DEV_AWAIT_RESET:
		status = scic_sds_port_start_io(sci_port, sci_dev, sci_req);
		status = scic_sds_port_start_io(sci_port, sci_dev, ireq);
		if (status != SCI_SUCCESS)
			return status;

		status = scic_sds_remote_node_context_start_task(&sci_dev->rnc, sci_req);
		status = scic_sds_remote_node_context_start_task(&sci_dev->rnc, ireq);
		if (status != SCI_SUCCESS)
			goto out;

		status = scic_sds_request_start(sci_req);
		status = scic_sds_request_start(ireq);
		if (status != SCI_SUCCESS)
			goto out;

@@ -724,7 +722,7 @@ enum sci_status scic_sds_remote_device_start_task(struct scic_sds_controller *sc
		 * replace the request that probably resulted in the task
		 * management request.
		 */
		sci_dev->working_request = sci_req;
		sci_dev->working_request = ireq;
		sci_change_state(sm, SCI_STP_DEV_CMD);

		/* The remote node context must cleanup the TCi to NCQ mapping
@@ -741,25 +739,25 @@ enum sci_status scic_sds_remote_device_start_task(struct scic_sds_controller *sc
						    sci_dev);

	out:
		scic_sds_remote_device_start_request(sci_dev, sci_req, status);
		scic_sds_remote_device_start_request(sci_dev, ireq, status);
		/* We need to let the controller start request handler know that
		 * it can't post TC yet. We will provide a callback function to
		 * post TC when RNC gets resumed.
		 */
		return SCI_FAILURE_RESET_DEVICE_PARTIAL_SUCCESS;
	case SCI_DEV_READY:
		status = scic_sds_port_start_io(sci_port, sci_dev, sci_req);
		status = scic_sds_port_start_io(sci_port, sci_dev, ireq);
		if (status != SCI_SUCCESS)
			return status;

		status = scic_sds_remote_node_context_start_task(&sci_dev->rnc, sci_req);
		status = scic_sds_remote_node_context_start_task(&sci_dev->rnc, ireq);
		if (status != SCI_SUCCESS)
			break;

		status = scic_sds_request_start(sci_req);
		status = scic_sds_request_start(ireq);
		break;
	}
	scic_sds_remote_device_start_request(sci_dev, sci_req, status);
	scic_sds_remote_device_start_request(sci_dev, ireq, status);

	return status;
}
Loading