16f231dda68080759f1aed3769896e94c73099f0fDan Williams/*
26f231dda68080759f1aed3769896e94c73099f0fDan Williams * This file is provided under a dual BSD/GPLv2 license.  When using or
36f231dda68080759f1aed3769896e94c73099f0fDan Williams * redistributing this file, you may do so under either license.
46f231dda68080759f1aed3769896e94c73099f0fDan Williams *
56f231dda68080759f1aed3769896e94c73099f0fDan Williams * GPL LICENSE SUMMARY
66f231dda68080759f1aed3769896e94c73099f0fDan Williams *
76f231dda68080759f1aed3769896e94c73099f0fDan Williams * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
86f231dda68080759f1aed3769896e94c73099f0fDan Williams *
96f231dda68080759f1aed3769896e94c73099f0fDan Williams * This program is free software; you can redistribute it and/or modify
106f231dda68080759f1aed3769896e94c73099f0fDan Williams * it under the terms of version 2 of the GNU General Public License as
116f231dda68080759f1aed3769896e94c73099f0fDan Williams * published by the Free Software Foundation.
126f231dda68080759f1aed3769896e94c73099f0fDan Williams *
136f231dda68080759f1aed3769896e94c73099f0fDan Williams * This program is distributed in the hope that it will be useful, but
146f231dda68080759f1aed3769896e94c73099f0fDan Williams * WITHOUT ANY WARRANTY; without even the implied warranty of
156f231dda68080759f1aed3769896e94c73099f0fDan Williams * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
166f231dda68080759f1aed3769896e94c73099f0fDan Williams * General Public License for more details.
176f231dda68080759f1aed3769896e94c73099f0fDan Williams *
186f231dda68080759f1aed3769896e94c73099f0fDan Williams * You should have received a copy of the GNU General Public License
196f231dda68080759f1aed3769896e94c73099f0fDan Williams * along with this program; if not, write to the Free Software
206f231dda68080759f1aed3769896e94c73099f0fDan Williams * Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
216f231dda68080759f1aed3769896e94c73099f0fDan Williams * The full GNU General Public License is included in this distribution
226f231dda68080759f1aed3769896e94c73099f0fDan Williams * in the file called LICENSE.GPL.
236f231dda68080759f1aed3769896e94c73099f0fDan Williams *
246f231dda68080759f1aed3769896e94c73099f0fDan Williams * BSD LICENSE
256f231dda68080759f1aed3769896e94c73099f0fDan Williams *
266f231dda68080759f1aed3769896e94c73099f0fDan Williams * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
276f231dda68080759f1aed3769896e94c73099f0fDan Williams * All rights reserved.
286f231dda68080759f1aed3769896e94c73099f0fDan Williams *
296f231dda68080759f1aed3769896e94c73099f0fDan Williams * Redistribution and use in source and binary forms, with or without
306f231dda68080759f1aed3769896e94c73099f0fDan Williams * modification, are permitted provided that the following conditions
316f231dda68080759f1aed3769896e94c73099f0fDan Williams * are met:
326f231dda68080759f1aed3769896e94c73099f0fDan Williams *
336f231dda68080759f1aed3769896e94c73099f0fDan Williams *   * Redistributions of source code must retain the above copyright
346f231dda68080759f1aed3769896e94c73099f0fDan Williams *     notice, this list of conditions and the following disclaimer.
356f231dda68080759f1aed3769896e94c73099f0fDan Williams *   * Redistributions in binary form must reproduce the above copyright
366f231dda68080759f1aed3769896e94c73099f0fDan Williams *     notice, this list of conditions and the following disclaimer in
376f231dda68080759f1aed3769896e94c73099f0fDan Williams *     the documentation and/or other materials provided with the
386f231dda68080759f1aed3769896e94c73099f0fDan Williams *     distribution.
396f231dda68080759f1aed3769896e94c73099f0fDan Williams *   * Neither the name of Intel Corporation nor the names of its
406f231dda68080759f1aed3769896e94c73099f0fDan Williams *     contributors may be used to endorse or promote products derived
416f231dda68080759f1aed3769896e94c73099f0fDan Williams *     from this software without specific prior written permission.
426f231dda68080759f1aed3769896e94c73099f0fDan Williams *
436f231dda68080759f1aed3769896e94c73099f0fDan Williams * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
446f231dda68080759f1aed3769896e94c73099f0fDan Williams * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
456f231dda68080759f1aed3769896e94c73099f0fDan Williams * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
466f231dda68080759f1aed3769896e94c73099f0fDan Williams * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
476f231dda68080759f1aed3769896e94c73099f0fDan Williams * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
486f231dda68080759f1aed3769896e94c73099f0fDan Williams * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
496f231dda68080759f1aed3769896e94c73099f0fDan Williams * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
506f231dda68080759f1aed3769896e94c73099f0fDan Williams * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
516f231dda68080759f1aed3769896e94c73099f0fDan Williams * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
526f231dda68080759f1aed3769896e94c73099f0fDan Williams * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
536f231dda68080759f1aed3769896e94c73099f0fDan Williams * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
546f231dda68080759f1aed3769896e94c73099f0fDan Williams */
556f231dda68080759f1aed3769896e94c73099f0fDan Williams
560d84366fbef557f92ef82ac9a224c57ffb3318bcDan Williams#ifndef _ISCI_REQUEST_H_
576f231dda68080759f1aed3769896e94c73099f0fDan Williams#define _ISCI_REQUEST_H_
586f231dda68080759f1aed3769896e94c73099f0fDan Williams
596f231dda68080759f1aed3769896e94c73099f0fDan Williams#include "isci.h"
60ce2b3261b6765c3b80fda95426c73e8d3bb1b035Dan Williams#include "host.h"
61f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams#include "scu_task_context.h"
626f231dda68080759f1aed3769896e94c73099f0fDan Williams
636f231dda68080759f1aed3769896e94c73099f0fDan Williams/**
646f231dda68080759f1aed3769896e94c73099f0fDan Williams * struct isci_request_status - This enum defines the possible states of an I/O
656f231dda68080759f1aed3769896e94c73099f0fDan Williams *    request.
666f231dda68080759f1aed3769896e94c73099f0fDan Williams *
676f231dda68080759f1aed3769896e94c73099f0fDan Williams *
686f231dda68080759f1aed3769896e94c73099f0fDan Williams */
696f231dda68080759f1aed3769896e94c73099f0fDan Williamsenum isci_request_status {
706f231dda68080759f1aed3769896e94c73099f0fDan Williams	unallocated = 0x00,
716f231dda68080759f1aed3769896e94c73099f0fDan Williams	allocated   = 0x01,
726f231dda68080759f1aed3769896e94c73099f0fDan Williams	started     = 0x02,
736f231dda68080759f1aed3769896e94c73099f0fDan Williams	completed   = 0x03,
746f231dda68080759f1aed3769896e94c73099f0fDan Williams	aborting    = 0x04,
756f231dda68080759f1aed3769896e94c73099f0fDan Williams	aborted     = 0x05,
764dc043c41037fc6e369270daaa626465a8766565Jeff Skirvin	terminating = 0x06,
774dc043c41037fc6e369270daaa626465a8766565Jeff Skirvin	dead        = 0x07
786f231dda68080759f1aed3769896e94c73099f0fDan Williams};
796f231dda68080759f1aed3769896e94c73099f0fDan Williams
80f1f52e75939b56c40b3d153ae99faf2720250242Dan Williamsenum sci_request_protocol {
81f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams	SCIC_NO_PROTOCOL,
82f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams	SCIC_SMP_PROTOCOL,
83f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams	SCIC_SSP_PROTOCOL,
84f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams	SCIC_STP_PROTOCOL
85c72086e3c2897eaca5b99c005dd9844fdc784981Dan Williams}; /* XXX remove me, use sas_task.{dev|task_proto} instead */;
86f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams
87ba7cb22342a66505a831bb7e4541fef90e0193c9Dan Williams/**
88ba7cb22342a66505a831bb7e4541fef90e0193c9Dan Williams * isci_stp_request - extra request infrastructure to handle pio/atapi protocol
89ba7cb22342a66505a831bb7e4541fef90e0193c9Dan Williams * @pio_len - number of bytes requested at PIO setup
90ba7cb22342a66505a831bb7e4541fef90e0193c9Dan Williams * @status - pio setup ending status value to tell us if we need
915076a1a97e2fa61c847a5fdd4b1991faf7716da6Dan Williams *	     to wait for another fis or if the transfer is complete.  Upon
92ba7cb22342a66505a831bb7e4541fef90e0193c9Dan Williams *           receipt of a d2h fis this will be the status field of that fis.
93ba7cb22342a66505a831bb7e4541fef90e0193c9Dan Williams * @sgl - track pio transfer progress as we iterate through the sgl
94ba7cb22342a66505a831bb7e4541fef90e0193c9Dan Williams */
95ba7cb22342a66505a831bb7e4541fef90e0193c9Dan Williamsstruct isci_stp_request {
96ba7cb22342a66505a831bb7e4541fef90e0193c9Dan Williams	u32 pio_len;
97ba7cb22342a66505a831bb7e4541fef90e0193c9Dan Williams	u8 status;
98ba7cb22342a66505a831bb7e4541fef90e0193c9Dan Williams
99ba7cb22342a66505a831bb7e4541fef90e0193c9Dan Williams	struct isci_stp_pio_sgl {
100ba7cb22342a66505a831bb7e4541fef90e0193c9Dan Williams		int index;
101ba7cb22342a66505a831bb7e4541fef90e0193c9Dan Williams		u8 set;
102ba7cb22342a66505a831bb7e4541fef90e0193c9Dan Williams		u32 offset;
103ba7cb22342a66505a831bb7e4541fef90e0193c9Dan Williams	} sgl;
1045dec6f4e41340196d223caf922578c44dfe2295aDan Williams};
1055dec6f4e41340196d223caf922578c44dfe2295aDan Williams
1065076a1a97e2fa61c847a5fdd4b1991faf7716da6Dan Williamsstruct isci_request {
1075076a1a97e2fa61c847a5fdd4b1991faf7716da6Dan Williams	enum isci_request_status status;
1085076a1a97e2fa61c847a5fdd4b1991faf7716da6Dan Williams	#define IREQ_COMPLETE_IN_TARGET 0
1095076a1a97e2fa61c847a5fdd4b1991faf7716da6Dan Williams	#define IREQ_TERMINATED 1
1105076a1a97e2fa61c847a5fdd4b1991faf7716da6Dan Williams	#define IREQ_TMF 2
1115076a1a97e2fa61c847a5fdd4b1991faf7716da6Dan Williams	#define IREQ_ACTIVE 3
1125076a1a97e2fa61c847a5fdd4b1991faf7716da6Dan Williams	unsigned long flags;
1135076a1a97e2fa61c847a5fdd4b1991faf7716da6Dan Williams	/* XXX kill ttype and ttype_ptr, allocate full sas_task */
1145076a1a97e2fa61c847a5fdd4b1991faf7716da6Dan Williams	union ttype_ptr_union {
1155076a1a97e2fa61c847a5fdd4b1991faf7716da6Dan Williams		struct sas_task *io_task_ptr;   /* When ttype==io_task  */
1165076a1a97e2fa61c847a5fdd4b1991faf7716da6Dan Williams		struct isci_tmf *tmf_task_ptr;  /* When ttype==tmf_task */
1175076a1a97e2fa61c847a5fdd4b1991faf7716da6Dan Williams	} ttype_ptr;
1185076a1a97e2fa61c847a5fdd4b1991faf7716da6Dan Williams	struct isci_host *isci_host;
1195076a1a97e2fa61c847a5fdd4b1991faf7716da6Dan Williams	/* For use in the requests_to_{complete|abort} lists: */
1205076a1a97e2fa61c847a5fdd4b1991faf7716da6Dan Williams	struct list_head completed_node;
1215076a1a97e2fa61c847a5fdd4b1991faf7716da6Dan Williams	/* For use in the reqs_in_process list: */
1225076a1a97e2fa61c847a5fdd4b1991faf7716da6Dan Williams	struct list_head dev_node;
1235076a1a97e2fa61c847a5fdd4b1991faf7716da6Dan Williams	spinlock_t state_lock;
1245076a1a97e2fa61c847a5fdd4b1991faf7716da6Dan Williams	dma_addr_t request_daddr;
1255076a1a97e2fa61c847a5fdd4b1991faf7716da6Dan Williams	dma_addr_t zero_scatter_daddr;
1265076a1a97e2fa61c847a5fdd4b1991faf7716da6Dan Williams	unsigned int num_sg_entries;
1275076a1a97e2fa61c847a5fdd4b1991faf7716da6Dan Williams	/* Note: "io_request_completion" is completed in two different ways
1285076a1a97e2fa61c847a5fdd4b1991faf7716da6Dan Williams	 * depending on whether this is a TMF or regular request.
1295076a1a97e2fa61c847a5fdd4b1991faf7716da6Dan Williams	 * - TMF requests are completed in the thread that started them;
1305076a1a97e2fa61c847a5fdd4b1991faf7716da6Dan Williams	 * - regular requests are completed in the request completion callback
1315076a1a97e2fa61c847a5fdd4b1991faf7716da6Dan Williams	 *   function.
1325076a1a97e2fa61c847a5fdd4b1991faf7716da6Dan Williams	 * This difference in operation allows the aborter of a TMF request
1335076a1a97e2fa61c847a5fdd4b1991faf7716da6Dan Williams	 * to be sure that once the TMF request completes, the I/O that the
1345076a1a97e2fa61c847a5fdd4b1991faf7716da6Dan Williams	 * TMF was aborting is guaranteed to have completed.
1355076a1a97e2fa61c847a5fdd4b1991faf7716da6Dan Williams	 *
1365076a1a97e2fa61c847a5fdd4b1991faf7716da6Dan Williams	 * XXX kill io_request_completion
137f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams	 */
1385076a1a97e2fa61c847a5fdd4b1991faf7716da6Dan Williams	struct completion *io_request_completion;
139e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski	struct sci_base_state_machine sm;
140d9dcb4ba791de2a06b19ac47cd61601cf3d4e208Dan Williams	struct isci_host *owning_controller;
14178a6f06e0e82125787d7aa308fe28c2c8381540cDan Williams	struct isci_remote_device *target_device;
142f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams	u16 io_tag;
143f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams	enum sci_request_protocol protocol;
1445076a1a97e2fa61c847a5fdd4b1991faf7716da6Dan Williams	u32 scu_status; /* hardware result */
1455076a1a97e2fa61c847a5fdd4b1991faf7716da6Dan Williams	u32 sci_status; /* upper layer disposition */
146f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams	u32 post_context;
147312e0c2455c18716cf640d4336dcb1e9e5053818Dan Williams	struct scu_task_context *tc;
148f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams	/* could be larger with sg chaining */
1497c78da3175177c905a75c54b5830029c778494eaDan Williams	#define SCU_SGL_SIZE ((SCI_MAX_SCATTER_GATHER_ELEMENTS + 1) / 2)
150f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams	struct scu_sgl_element_pair sg_table[SCU_SGL_SIZE] __attribute__ ((aligned(32)));
1515076a1a97e2fa61c847a5fdd4b1991faf7716da6Dan Williams	/* This field is a pointer to the stored rx frame data.  It is used in
152e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski	 * STP internal requests and SMP response frames.  If this field is
153e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski	 * non-NULL the saved frame must be released on IO request completion.
154f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams	 */
155f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams	u32 saved_rx_frame_index;
156f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams
157f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams	union {
158f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams		struct {
159f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams			union {
160f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams				struct ssp_cmd_iu cmd;
161f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams				struct ssp_task_iu tmf;
162f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams			};
163f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams			union {
164f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams				struct ssp_response_iu rsp;
165f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams				u8 rsp_buf[SSP_RESP_IU_MAX_SIZE];
166f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams			};
167f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams		} ssp;
168f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams		struct {
169ba7cb22342a66505a831bb7e4541fef90e0193c9Dan Williams			struct isci_stp_request req;
170f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams			struct host_to_dev_fis cmd;
171f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams			struct dev_to_host_fis rsp;
172f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams		} stp;
173f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams	};
174f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams};
175f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams
1765076a1a97e2fa61c847a5fdd4b1991faf7716da6Dan Williamsstatic inline struct isci_request *to_ireq(struct isci_stp_request *stp_req)
17767ea838d17acdad3331aeae848683c768df96aaaDan Williams{
1785076a1a97e2fa61c847a5fdd4b1991faf7716da6Dan Williams	struct isci_request *ireq;
17967ea838d17acdad3331aeae848683c768df96aaaDan Williams
1805076a1a97e2fa61c847a5fdd4b1991faf7716da6Dan Williams	ireq = container_of(stp_req, typeof(*ireq), stp.req);
18167ea838d17acdad3331aeae848683c768df96aaaDan Williams	return ireq;
18267ea838d17acdad3331aeae848683c768df96aaaDan Williams}
18367ea838d17acdad3331aeae848683c768df96aaaDan Williams
1846f231dda68080759f1aed3769896e94c73099f0fDan Williams/**
185f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams * enum sci_base_request_states - This enumeration depicts all the states for
186f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams *    the common request state machine.
187f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams *
188f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams *
189f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams */
190f1f52e75939b56c40b3d153ae99faf2720250242Dan Williamsenum sci_base_request_states {
191e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski	/*
192f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams	 * Simply the initial state for the base request state machine.
193f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams	 */
194e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski	SCI_REQ_INIT,
195f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams
196e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski	/*
197e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski	 * This state indicates that the request has been constructed.
198e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski	 * This state is entered from the INITIAL state.
199f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams	 */
200e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski	SCI_REQ_CONSTRUCTED,
201f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams
202e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski	/*
203e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski	 * This state indicates that the request has been started. This state
204e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski	 * is entered from the CONSTRUCTED state.
205f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams	 */
206e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski	SCI_REQ_STARTED,
207f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams
208e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski	SCI_REQ_STP_UDMA_WAIT_TC_COMP,
209e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski	SCI_REQ_STP_UDMA_WAIT_D2H,
2105dec6f4e41340196d223caf922578c44dfe2295aDan Williams
211e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski	SCI_REQ_STP_NON_DATA_WAIT_H2D,
212e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski	SCI_REQ_STP_NON_DATA_WAIT_D2H,
2135dec6f4e41340196d223caf922578c44dfe2295aDan Williams
214e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski	SCI_REQ_STP_SOFT_RESET_WAIT_H2D_ASSERTED,
215e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski	SCI_REQ_STP_SOFT_RESET_WAIT_H2D_DIAG,
216e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski	SCI_REQ_STP_SOFT_RESET_WAIT_D2H,
2175dec6f4e41340196d223caf922578c44dfe2295aDan Williams
218e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski	/*
219e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski	 * While in this state the IO request object is waiting for the TC
220e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski	 * completion notification for the H2D Register FIS
2215dec6f4e41340196d223caf922578c44dfe2295aDan Williams	 */
222e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski	SCI_REQ_STP_PIO_WAIT_H2D,
2235dec6f4e41340196d223caf922578c44dfe2295aDan Williams
224e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski	/*
225e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski	 * While in this state the IO request object is waiting for either a
226e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski	 * PIO Setup FIS or a D2H register FIS.  The type of frame received is
227e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski	 * based on the result of the prior frame and line conditions.
2285dec6f4e41340196d223caf922578c44dfe2295aDan Williams	 */
229e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski	SCI_REQ_STP_PIO_WAIT_FRAME,
2305dec6f4e41340196d223caf922578c44dfe2295aDan Williams
231e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski	/*
232e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski	 * While in this state the IO request object is waiting for a DATA
233e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski	 * frame from the device.
2345dec6f4e41340196d223caf922578c44dfe2295aDan Williams	 */
235e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski	SCI_REQ_STP_PIO_DATA_IN,
2365dec6f4e41340196d223caf922578c44dfe2295aDan Williams
237e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski	/*
238e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski	 * While in this state the IO request object is waiting to transmit
239e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski	 * the next data frame to the device.
2405dec6f4e41340196d223caf922578c44dfe2295aDan Williams	 */
241e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski	SCI_REQ_STP_PIO_DATA_OUT,
2425dec6f4e41340196d223caf922578c44dfe2295aDan Williams
243e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski	/*
244b50102d3e9a43a75379407c2080f696f61cb286bDan Williams	 * While in this state the IO request object is waiting for the TC
245b50102d3e9a43a75379407c2080f696f61cb286bDan Williams	 * completion notification for the H2D Register FIS
246b50102d3e9a43a75379407c2080f696f61cb286bDan Williams	 */
247b50102d3e9a43a75379407c2080f696f61cb286bDan Williams	SCI_REQ_ATAPI_WAIT_H2D,
248b50102d3e9a43a75379407c2080f696f61cb286bDan Williams
249b50102d3e9a43a75379407c2080f696f61cb286bDan Williams	/*
250b50102d3e9a43a75379407c2080f696f61cb286bDan Williams	 * While in this state the IO request object is waiting for either a
251b50102d3e9a43a75379407c2080f696f61cb286bDan Williams	 * PIO Setup.
252b50102d3e9a43a75379407c2080f696f61cb286bDan Williams	 */
253b50102d3e9a43a75379407c2080f696f61cb286bDan Williams	SCI_REQ_ATAPI_WAIT_PIO_SETUP,
254b50102d3e9a43a75379407c2080f696f61cb286bDan Williams
255b50102d3e9a43a75379407c2080f696f61cb286bDan Williams	/*
256b50102d3e9a43a75379407c2080f696f61cb286bDan Williams	 * The non-data IO transit to this state in this state after receiving
257b50102d3e9a43a75379407c2080f696f61cb286bDan Williams	 * TC completion. While in this state IO request object is waiting for
258b50102d3e9a43a75379407c2080f696f61cb286bDan Williams	 * D2H status frame as UF.
259b50102d3e9a43a75379407c2080f696f61cb286bDan Williams	 */
260b50102d3e9a43a75379407c2080f696f61cb286bDan Williams	SCI_REQ_ATAPI_WAIT_D2H,
261b50102d3e9a43a75379407c2080f696f61cb286bDan Williams
262b50102d3e9a43a75379407c2080f696f61cb286bDan Williams	/*
263b50102d3e9a43a75379407c2080f696f61cb286bDan Williams	 * When transmitting raw frames hardware reports task context completion
264b50102d3e9a43a75379407c2080f696f61cb286bDan Williams	 * after every frame submission, so in the non-accelerated case we need
265b50102d3e9a43a75379407c2080f696f61cb286bDan Williams	 * to expect the completion for the "cdb" frame.
266b50102d3e9a43a75379407c2080f696f61cb286bDan Williams	 */
267b50102d3e9a43a75379407c2080f696f61cb286bDan Williams	SCI_REQ_ATAPI_WAIT_TC_COMP,
268b50102d3e9a43a75379407c2080f696f61cb286bDan Williams
269b50102d3e9a43a75379407c2080f696f61cb286bDan Williams	/*
270f139303d17c47eff4c5b5407dee0a6d43e8fd146Dan Williams	 * The AWAIT_TC_COMPLETION sub-state indicates that the started raw
271f139303d17c47eff4c5b5407dee0a6d43e8fd146Dan Williams	 * task management request is waiting for the transmission of the
272f139303d17c47eff4c5b5407dee0a6d43e8fd146Dan Williams	 * initial frame (i.e. command, task, etc.).
273f139303d17c47eff4c5b5407dee0a6d43e8fd146Dan Williams	 */
274e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski	SCI_REQ_TASK_WAIT_TC_COMP,
275f139303d17c47eff4c5b5407dee0a6d43e8fd146Dan Williams
276e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski	/*
277f139303d17c47eff4c5b5407dee0a6d43e8fd146Dan Williams	 * This sub-state indicates that the started task management request
278f139303d17c47eff4c5b5407dee0a6d43e8fd146Dan Williams	 * is waiting for the reception of an unsolicited frame
279f139303d17c47eff4c5b5407dee0a6d43e8fd146Dan Williams	 * (i.e. response IU).
280f139303d17c47eff4c5b5407dee0a6d43e8fd146Dan Williams	 */
281e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski	SCI_REQ_TASK_WAIT_TC_RESP,
282f139303d17c47eff4c5b5407dee0a6d43e8fd146Dan Williams
283e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski	/*
284c72086e3c2897eaca5b99c005dd9844fdc784981Dan Williams	 * This sub-state indicates that the started task management request
285c72086e3c2897eaca5b99c005dd9844fdc784981Dan Williams	 * is waiting for the reception of an unsolicited frame
286c72086e3c2897eaca5b99c005dd9844fdc784981Dan Williams	 * (i.e. response IU).
287c72086e3c2897eaca5b99c005dd9844fdc784981Dan Williams	 */
288e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski	SCI_REQ_SMP_WAIT_RESP,
289c72086e3c2897eaca5b99c005dd9844fdc784981Dan Williams
290e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski	/*
291e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski	 * The AWAIT_TC_COMPLETION sub-state indicates that the started SMP
292e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski	 * request is waiting for the transmission of the initial frame
293e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski	 * (i.e. command, task, etc.).
294c72086e3c2897eaca5b99c005dd9844fdc784981Dan Williams	 */
295e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski	SCI_REQ_SMP_WAIT_TC_COMP,
296c72086e3c2897eaca5b99c005dd9844fdc784981Dan Williams
297e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski	/*
298f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams	 * This state indicates that the request has completed.
299e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski	 * This state is entered from the STARTED state. This state is entered
300e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski	 * from the ABORTING state.
301f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams	 */
302e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski	SCI_REQ_COMPLETED,
303f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams
304e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski	/*
305f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams	 * This state indicates that the request is in the process of being
306f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams	 * terminated/aborted.
307f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams	 * This state is entered from the CONSTRUCTED state.
308f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams	 * This state is entered from the STARTED state.
309f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams	 */
310e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski	SCI_REQ_ABORTING,
311f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams
312e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski	/*
313f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams	 * Simply the final state for the base request state machine.
314f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams	 */
315e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski	SCI_REQ_FINAL,
316f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams};
317f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams
31889a7301f21fb00e753089671eb9e4132aab8ea08Dan Williamsenum sci_status sci_request_start(struct isci_request *ireq);
31989a7301f21fb00e753089671eb9e4132aab8ea08Dan Williamsenum sci_status sci_io_request_terminate(struct isci_request *ireq);
320e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolskienum sci_status
32189a7301f21fb00e753089671eb9e4132aab8ea08Dan Williamssci_io_request_event_handler(struct isci_request *ireq,
322e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski				  u32 event_code);
323e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolskienum sci_status
32489a7301f21fb00e753089671eb9e4132aab8ea08Dan Williamssci_io_request_frame_handler(struct isci_request *ireq,
325e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski				  u32 frame_index);
326e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolskienum sci_status
32789a7301f21fb00e753089671eb9e4132aab8ea08Dan Williamssci_task_request_terminate(struct isci_request *ireq);
328e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolskiextern enum sci_status
32989a7301f21fb00e753089671eb9e4132aab8ea08Dan Williamssci_request_complete(struct isci_request *ireq);
330e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolskiextern enum sci_status
33189a7301f21fb00e753089671eb9e4132aab8ea08Dan Williamssci_io_request_tc_completion(struct isci_request *ireq, u32 code);
332f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams
333f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams/* XXX open code in caller */
334e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolskistatic inline dma_addr_t
33589a7301f21fb00e753089671eb9e4132aab8ea08Dan Williamssci_io_request_get_dma_addr(struct isci_request *ireq, void *virt_addr)
336f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams{
337f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams
338f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams	char *requested_addr = (char *)virt_addr;
339f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams	char *base_addr = (char *)ireq;
340f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams
341f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams	BUG_ON(requested_addr < base_addr);
342f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams	BUG_ON((requested_addr - base_addr) >= sizeof(*ireq));
343f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams
344f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams	return ireq->request_daddr + (requested_addr - base_addr);
345f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams}
346f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams
347f1f52e75939b56c40b3d153ae99faf2720250242Dan Williams/**
3486f231dda68080759f1aed3769896e94c73099f0fDan Williams * isci_request_change_state() - This function sets the status of the request
3496f231dda68080759f1aed3769896e94c73099f0fDan Williams *    object.
3506f231dda68080759f1aed3769896e94c73099f0fDan Williams * @request: This parameter points to the isci_request object
3516f231dda68080759f1aed3769896e94c73099f0fDan Williams * @status: This Parameter is the new status of the object
3526f231dda68080759f1aed3769896e94c73099f0fDan Williams *
3536f231dda68080759f1aed3769896e94c73099f0fDan Williams */
354e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolskistatic inline enum isci_request_status
355e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolskiisci_request_change_state(struct isci_request *isci_request,
356e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski			  enum isci_request_status status)
3576f231dda68080759f1aed3769896e94c73099f0fDan Williams{
3586f231dda68080759f1aed3769896e94c73099f0fDan Williams	enum isci_request_status old_state;
3596f231dda68080759f1aed3769896e94c73099f0fDan Williams	unsigned long flags;
3606f231dda68080759f1aed3769896e94c73099f0fDan Williams
3616f231dda68080759f1aed3769896e94c73099f0fDan Williams	dev_dbg(&isci_request->isci_host->pdev->dev,
3626f231dda68080759f1aed3769896e94c73099f0fDan Williams		"%s: isci_request = %p, state = 0x%x\n",
3636f231dda68080759f1aed3769896e94c73099f0fDan Williams		__func__,
3646f231dda68080759f1aed3769896e94c73099f0fDan Williams		isci_request,
3656f231dda68080759f1aed3769896e94c73099f0fDan Williams		status);
3666f231dda68080759f1aed3769896e94c73099f0fDan Williams
3676f231dda68080759f1aed3769896e94c73099f0fDan Williams	BUG_ON(isci_request == NULL);
3686f231dda68080759f1aed3769896e94c73099f0fDan Williams
3696f231dda68080759f1aed3769896e94c73099f0fDan Williams	spin_lock_irqsave(&isci_request->state_lock, flags);
3706f231dda68080759f1aed3769896e94c73099f0fDan Williams	old_state = isci_request->status;
3716f231dda68080759f1aed3769896e94c73099f0fDan Williams	isci_request->status = status;
3726f231dda68080759f1aed3769896e94c73099f0fDan Williams	spin_unlock_irqrestore(&isci_request->state_lock, flags);
3736f231dda68080759f1aed3769896e94c73099f0fDan Williams
3746f231dda68080759f1aed3769896e94c73099f0fDan Williams	return old_state;
3756f231dda68080759f1aed3769896e94c73099f0fDan Williams}
3766f231dda68080759f1aed3769896e94c73099f0fDan Williams
3776f231dda68080759f1aed3769896e94c73099f0fDan Williams/**
3786f231dda68080759f1aed3769896e94c73099f0fDan Williams * isci_request_change_started_to_newstate() - This function sets the status of
3796f231dda68080759f1aed3769896e94c73099f0fDan Williams *    the request object.
3806f231dda68080759f1aed3769896e94c73099f0fDan Williams * @request: This parameter points to the isci_request object
3816f231dda68080759f1aed3769896e94c73099f0fDan Williams * @status: This Parameter is the new status of the object
3826f231dda68080759f1aed3769896e94c73099f0fDan Williams *
3836f231dda68080759f1aed3769896e94c73099f0fDan Williams * state previous to any change.
3846f231dda68080759f1aed3769896e94c73099f0fDan Williams */
385e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolskistatic inline enum isci_request_status
386e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolskiisci_request_change_started_to_newstate(struct isci_request *isci_request,
387e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski					struct completion *completion_ptr,
388e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski					enum isci_request_status newstate)
3896f231dda68080759f1aed3769896e94c73099f0fDan Williams{
3906f231dda68080759f1aed3769896e94c73099f0fDan Williams	enum isci_request_status old_state;
3916f231dda68080759f1aed3769896e94c73099f0fDan Williams	unsigned long flags;
3926f231dda68080759f1aed3769896e94c73099f0fDan Williams
3936f231dda68080759f1aed3769896e94c73099f0fDan Williams	spin_lock_irqsave(&isci_request->state_lock, flags);
3946f231dda68080759f1aed3769896e94c73099f0fDan Williams
3956f231dda68080759f1aed3769896e94c73099f0fDan Williams	old_state = isci_request->status;
3966f231dda68080759f1aed3769896e94c73099f0fDan Williams
397f219f010a355487638bf2fff4724a420e7158fd2Jeff Skirvin	if (old_state == started || old_state == aborting) {
3986f231dda68080759f1aed3769896e94c73099f0fDan Williams		BUG_ON(isci_request->io_request_completion != NULL);
3996f231dda68080759f1aed3769896e94c73099f0fDan Williams
4006f231dda68080759f1aed3769896e94c73099f0fDan Williams		isci_request->io_request_completion = completion_ptr;
4016f231dda68080759f1aed3769896e94c73099f0fDan Williams		isci_request->status = newstate;
4026f231dda68080759f1aed3769896e94c73099f0fDan Williams	}
403e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski
4046f231dda68080759f1aed3769896e94c73099f0fDan Williams	spin_unlock_irqrestore(&isci_request->state_lock, flags);
4056f231dda68080759f1aed3769896e94c73099f0fDan Williams
4066f231dda68080759f1aed3769896e94c73099f0fDan Williams	dev_dbg(&isci_request->isci_host->pdev->dev,
4076f231dda68080759f1aed3769896e94c73099f0fDan Williams		"%s: isci_request = %p, old_state = 0x%x\n",
4086f231dda68080759f1aed3769896e94c73099f0fDan Williams		__func__,
4096f231dda68080759f1aed3769896e94c73099f0fDan Williams		isci_request,
4106f231dda68080759f1aed3769896e94c73099f0fDan Williams		old_state);
4116f231dda68080759f1aed3769896e94c73099f0fDan Williams
4126f231dda68080759f1aed3769896e94c73099f0fDan Williams	return old_state;
4136f231dda68080759f1aed3769896e94c73099f0fDan Williams}
4146f231dda68080759f1aed3769896e94c73099f0fDan Williams
4156f231dda68080759f1aed3769896e94c73099f0fDan Williams/**
4166f231dda68080759f1aed3769896e94c73099f0fDan Williams * isci_request_change_started_to_aborted() - This function sets the status of
4176f231dda68080759f1aed3769896e94c73099f0fDan Williams *    the request object.
4186f231dda68080759f1aed3769896e94c73099f0fDan Williams * @request: This parameter points to the isci_request object
4196f231dda68080759f1aed3769896e94c73099f0fDan Williams * @completion_ptr: This parameter is saved as the kernel completion structure
4206f231dda68080759f1aed3769896e94c73099f0fDan Williams *    signalled when the old request completes.
4216f231dda68080759f1aed3769896e94c73099f0fDan Williams *
4226f231dda68080759f1aed3769896e94c73099f0fDan Williams * state previous to any change.
4236f231dda68080759f1aed3769896e94c73099f0fDan Williams */
424e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolskistatic inline enum isci_request_status
425e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolskiisci_request_change_started_to_aborted(struct isci_request *isci_request,
426e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski				       struct completion *completion_ptr)
4276f231dda68080759f1aed3769896e94c73099f0fDan Williams{
428e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski	return isci_request_change_started_to_newstate(isci_request,
429e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski						       completion_ptr,
430e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski						       aborted);
4316f231dda68080759f1aed3769896e94c73099f0fDan Williams}
4326f231dda68080759f1aed3769896e94c73099f0fDan Williams
433e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski#define isci_request_access_task(req) ((req)->ttype_ptr.io_task_ptr)
4346f231dda68080759f1aed3769896e94c73099f0fDan Williams
435e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski#define isci_request_access_tmf(req) ((req)->ttype_ptr.tmf_task_ptr)
4366f231dda68080759f1aed3769896e94c73099f0fDan Williams
437db0562509800a2d4cb5cb14a66413c30484f165cDan Williamsstruct isci_request *isci_tmf_request_from_tag(struct isci_host *ihost,
438db0562509800a2d4cb5cb14a66413c30484f165cDan Williams					       struct isci_tmf *isci_tmf,
439db0562509800a2d4cb5cb14a66413c30484f165cDan Williams					       u16 tag);
440209fae14fabfd48525e5630bebbbd4ca15090c60Dan Williamsint isci_request_execute(struct isci_host *ihost, struct isci_remote_device *idev,
441db0562509800a2d4cb5cb14a66413c30484f165cDan Williams			 struct sas_task *task, u16 tag);
442ddcc7e347a891937be65358b43f40b7f81185f8fDan Williamsvoid isci_terminate_pending_requests(struct isci_host *ihost,
443ddcc7e347a891937be65358b43f40b7f81185f8fDan Williams				     struct isci_remote_device *idev);
444e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolskienum sci_status
44589a7301f21fb00e753089671eb9e4132aab8ea08Dan Williamssci_task_request_construct(struct isci_host *ihost,
44678a6f06e0e82125787d7aa308fe28c2c8381540cDan Williams			    struct isci_remote_device *idev,
447e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolski			    u16 io_tag,
4485076a1a97e2fa61c847a5fdd4b1991faf7716da6Dan Williams			    struct isci_request *ireq);
449e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolskienum sci_status
45089a7301f21fb00e753089671eb9e4132aab8ea08Dan Williamssci_task_request_construct_ssp(struct isci_request *ireq);
451e301370ac553a9a0ac0d1d25e769b86cf60395b3Edmund Nadolskienum sci_status
45289a7301f21fb00e753089671eb9e4132aab8ea08Dan Williamssci_task_request_construct_sata(struct isci_request *ireq);
45389a7301f21fb00e753089671eb9e4132aab8ea08Dan Williamsvoid sci_smp_request_copy_response(struct isci_request *ireq);
4549274f45ea551421cd3bf329de9dd8d1e6208285aJeff Skirvin
4559274f45ea551421cd3bf329de9dd8d1e6208285aJeff Skirvinstatic inline int isci_task_is_ncq_recovery(struct sas_task *task)
4569274f45ea551421cd3bf329de9dd8d1e6208285aJeff Skirvin{
4579274f45ea551421cd3bf329de9dd8d1e6208285aJeff Skirvin	return (sas_protocol_ata(task->task_proto) &&
458a5ec7f86dc5432c44d8407a144e7617ec65da770James Bottomley		task->ata_task.fis.command == ATA_CMD_READ_LOG_EXT &&
459a5ec7f86dc5432c44d8407a144e7617ec65da770James Bottomley		task->ata_task.fis.lbal == ATA_LOG_SATA_NCQ);
4609274f45ea551421cd3bf329de9dd8d1e6208285aJeff Skirvin
4619274f45ea551421cd3bf329de9dd8d1e6208285aJeff Skirvin}
4629274f45ea551421cd3bf329de9dd8d1e6208285aJeff Skirvin
4636f231dda68080759f1aed3769896e94c73099f0fDan Williams#endif /* !defined(_ISCI_REQUEST_H_) */
464