1a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna/*
2a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna * This file is part of the Chelsio FCoE driver for Linux.
3a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna *
4a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna * Copyright (c) 2008-2012 Chelsio Communications, Inc. All rights reserved.
5a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna *
6a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna * This software is available to you under a choice of one of two
7a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna * licenses.  You may choose to be licensed under the terms of the GNU
8a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna * General Public License (GPL) Version 2, available from the file
9a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna * COPYING in the main directory of this source tree, or the
10a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna * OpenIB.org BSD license below:
11a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna *
12a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna *     Redistribution and use in source and binary forms, with or
13a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna *     without modification, are permitted provided that the following
14a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna *     conditions are met:
15a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna *
16a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna *      - Redistributions of source code must retain the above
17a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna *        copyright notice, this list of conditions and the following
18a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna *        disclaimer.
19a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna *
20a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna *      - Redistributions in binary form must reproduce the above
21a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna *        copyright notice, this list of conditions and the following
22a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna *        disclaimer in the documentation and/or other materials
23a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna *        provided with the distribution.
24a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna *
25a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
26a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
27a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
28a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
29a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
30a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
31a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
32a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna * SOFTWARE.
33a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna */
34a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna
35a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna#ifndef __CSIO_SCSI_H__
36a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna#define __CSIO_SCSI_H__
37a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna
38a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna#include <linux/spinlock_types.h>
39a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna#include <linux/completion.h>
40a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna#include <scsi/scsi.h>
41a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna#include <scsi/scsi_cmnd.h>
42a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna#include <scsi/scsi_device.h>
43a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna#include <scsi/scsi_host.h>
44a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna#include <scsi/scsi_eh.h>
45a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna#include <scsi/scsi_tcq.h>
46a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna#include <scsi/fc/fc_fcp.h>
47a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna
48a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna#include "csio_defs.h"
49a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna#include "csio_wr.h"
50a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna
51a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Innaextern struct scsi_host_template csio_fcoe_shost_template;
52a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Innaextern struct scsi_host_template csio_fcoe_shost_vport_template;
53a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna
54a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Innaextern int csio_scsi_eqsize;
55a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Innaextern int csio_scsi_iqlen;
56a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Innaextern int csio_scsi_ioreqs;
57a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Innaextern uint32_t csio_max_scan_tmo;
58a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Innaextern uint32_t csio_delta_scan_tmo;
59a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Innaextern int csio_lun_qdepth;
60a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna
61a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna/*
62a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna **************************** NOTE *******************************
63a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna * How do we calculate MAX FCoE SCSI SGEs? Here is the math:
64a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna * Max Egress WR size = 512 bytes
65a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna * One SCSI egress WR has the following fixed no of bytes:
66a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna *      48 (sizeof(struct fw_scsi_write[read]_wr)) - FW WR
67a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna *    + 32 (sizeof(struct fc_fcp_cmnd)) - Immediate FCP_CMD
68a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna *    ------
69a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna *      80
70a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna *    ------
71a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna * That leaves us with 512 - 96 = 432 bytes for data SGE. Using
72a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna * struct ulptx_sgl header for the SGE consumes:
73a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna *	- 4 bytes for cmnd_sge.
74a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna *	- 12 bytes for the first SGL.
75a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna * That leaves us with 416 bytes for the remaining SGE pairs. Which is
76a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna * is 416 / 24 (size(struct ulptx_sge_pair)) = 17 SGE pairs,
77a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna * or 34 SGEs. Adding the first SGE fetches us 35 SGEs.
78a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna */
79a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna#define CSIO_SCSI_MAX_SGE		35
80a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna#define CSIO_SCSI_ABRT_TMO_MS		60000
81a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna#define CSIO_SCSI_LUNRST_TMO_MS		60000
82a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna#define CSIO_SCSI_TM_POLL_MS		2000	/* should be less than
83a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna						 * all TM timeouts.
84a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna						 */
85a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna#define CSIO_SCSI_IQ_WRSZ		128
86a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna#define CSIO_SCSI_IQSIZE		(csio_scsi_iqlen * CSIO_SCSI_IQ_WRSZ)
87a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna
88a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna#define	CSIO_MAX_SNS_LEN		128
89a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna#define	CSIO_SCSI_RSP_LEN	(FCP_RESP_WITH_EXT + 4 + CSIO_MAX_SNS_LEN)
90a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna
91a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna/* Reference to scsi_cmnd */
92a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna#define csio_scsi_cmnd(req)		((req)->scratch1)
93a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna
94a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Innastruct csio_scsi_stats {
95a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	uint64_t		n_tot_success;	/* Total number of good I/Os */
96a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	uint32_t		n_rn_nr_error;	/* No. of remote-node-not-
97a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna						 * ready errors
98a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna						 */
99a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	uint32_t		n_hw_nr_error;	/* No. of hw-module-not-
100a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna						 * ready errors
101a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna						 */
102a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	uint32_t		n_dmamap_error;	/* No. of DMA map erros */
103a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	uint32_t		n_unsupp_sge_error; /* No. of too-many-SGes
104a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna						     * errors.
105a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna						     */
106a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	uint32_t		n_no_req_error;	/* No. of Out-of-ioreqs error */
107a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	uint32_t		n_busy_error;	/* No. of -EBUSY errors */
108a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	uint32_t		n_hosterror;	/* No. of FW_HOSTERROR I/O */
109a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	uint32_t		n_rsperror;	/* No. of response errors */
110a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	uint32_t		n_autosense;	/* No. of auto sense replies */
111a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	uint32_t		n_ovflerror;	/* No. of overflow errors */
112a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	uint32_t		n_unflerror;	/* No. of underflow errors */
113a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	uint32_t		n_rdev_nr_error;/* No. of rdev not
114a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna						 * ready errors
115a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna						 */
116a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	uint32_t		n_rdev_lost_error;/* No. of rdev lost errors */
117a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	uint32_t		n_rdev_logo_error;/* No. of rdev logo errors */
118a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	uint32_t		n_link_down_error;/* No. of link down errors */
119a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	uint32_t		n_no_xchg_error; /* No. no exchange error */
120a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	uint32_t		n_unknown_error;/* No. of unhandled errors */
121a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	uint32_t		n_aborted;	/* No. of aborted I/Os */
122a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	uint32_t		n_abrt_timedout; /* No. of abort timedouts */
123a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	uint32_t		n_abrt_fail;	/* No. of abort failures */
124a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	uint32_t		n_abrt_dups;	/* No. of duplicate aborts */
125a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	uint32_t		n_abrt_race_comp; /* No. of aborts that raced
126a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna						   * with completions.
127a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna						   */
128a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	uint32_t		n_abrt_busy_error;/* No. of abort failures
129a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna						   * due to -EBUSY.
130a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna						   */
131a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	uint32_t		n_closed;	/* No. of closed I/Os */
132a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	uint32_t		n_cls_busy_error; /* No. of close failures
133a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna						   * due to -EBUSY.
134a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna						   */
135a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	uint32_t		n_active;	/* No. of IOs in active_q */
136a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	uint32_t		n_tm_active;	/* No. of TMs in active_q */
137a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	uint32_t		n_wcbfn;	/* No. of I/Os in worker
138a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna						 * cbfn q
139a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna						 */
140a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	uint32_t		n_free_ioreq;	/* No. of freelist entries */
141a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	uint32_t		n_free_ddp;	/* No. of DDP freelist */
142a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	uint32_t		n_unaligned;	/* No. of Unaligned SGls */
143a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	uint32_t		n_inval_cplop;	/* No. invalid CPL op's in IQ */
144a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	uint32_t		n_inval_scsiop;	/* No. invalid scsi op's in IQ*/
145a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna};
146a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna
147a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Innastruct csio_scsim {
148a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	struct csio_hw		*hw;		/* Pointer to HW moduel */
149a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	uint8_t			max_sge;	/* Max SGE */
150a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	uint8_t			proto_cmd_len;	/* Proto specific SCSI
151a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna						 * cmd length
152a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna						 */
153a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	uint16_t		proto_rsp_len;	/* Proto specific SCSI
154a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna						 * response length
155a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna						 */
156a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	spinlock_t		freelist_lock;	/* Lock for ioreq freelist */
157a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	struct list_head	active_q;	/* Outstanding SCSI I/Os */
158a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	struct list_head	ioreq_freelist;	/* Free list of ioreq's */
159a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	struct list_head	ddp_freelist;	/* DDP descriptor freelist */
160a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	struct csio_scsi_stats	stats;		/* This module's statistics */
161a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna};
162a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna
163a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna/* State machine defines */
164a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Innaenum csio_scsi_ev {
165a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	CSIO_SCSIE_START_IO = 1,		/* Start a regular SCSI IO */
166a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	CSIO_SCSIE_START_TM,			/* Start a TM IO */
167a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	CSIO_SCSIE_COMPLETED,			/* IO Completed */
168a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	CSIO_SCSIE_ABORT,			/* Abort IO */
169a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	CSIO_SCSIE_ABORTED,			/* IO Aborted */
170a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	CSIO_SCSIE_CLOSE,			/* Close exchange */
171a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	CSIO_SCSIE_CLOSED,			/* Exchange closed */
172a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	CSIO_SCSIE_DRVCLEANUP,			/* Driver wants to manually
173a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna						 * cleanup this I/O.
174a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna						 */
175a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna};
176a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna
177a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Innaenum csio_scsi_lev {
178a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	CSIO_LEV_ALL = 1,
179a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	CSIO_LEV_LNODE,
180a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	CSIO_LEV_RNODE,
181a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	CSIO_LEV_LUN,
182a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna};
183a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna
184a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Innastruct csio_scsi_level_data {
185a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	enum csio_scsi_lev	level;
186a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	struct csio_rnode	*rnode;
187a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	struct csio_lnode	*lnode;
188a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	uint64_t		oslun;
189a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna};
190a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna
191a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Innastatic inline struct csio_ioreq *
192a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Innacsio_get_scsi_ioreq(struct csio_scsim *scm)
193a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna{
194a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	struct csio_sm *req;
195a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna
196a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	if (likely(!list_empty(&scm->ioreq_freelist))) {
197a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna		req = list_first_entry(&scm->ioreq_freelist,
198a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna				       struct csio_sm, sm_list);
199a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna		list_del_init(&req->sm_list);
200a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna		CSIO_DEC_STATS(scm, n_free_ioreq);
201a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna		return (struct csio_ioreq *)req;
202a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	} else
203a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna		return NULL;
204a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna}
205a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna
206a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Innastatic inline void
207a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Innacsio_put_scsi_ioreq(struct csio_scsim *scm, struct csio_ioreq *ioreq)
208a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna{
209a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	list_add_tail(&ioreq->sm.sm_list, &scm->ioreq_freelist);
210a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	CSIO_INC_STATS(scm, n_free_ioreq);
211a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna}
212a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna
213a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Innastatic inline void
214a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Innacsio_put_scsi_ioreq_list(struct csio_scsim *scm, struct list_head *reqlist,
215a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna			 int n)
216a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna{
217a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	list_splice_init(reqlist, &scm->ioreq_freelist);
218a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	scm->stats.n_free_ioreq += n;
219a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna}
220a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna
221a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Innastatic inline struct csio_dma_buf *
222a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Innacsio_get_scsi_ddp(struct csio_scsim *scm)
223a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna{
224a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	struct csio_dma_buf *ddp;
225a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna
226a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	if (likely(!list_empty(&scm->ddp_freelist))) {
227a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna		ddp = list_first_entry(&scm->ddp_freelist,
228a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna				       struct csio_dma_buf, list);
229a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna		list_del_init(&ddp->list);
230a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna		CSIO_DEC_STATS(scm, n_free_ddp);
231a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna		return ddp;
232a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	} else
233a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna		return NULL;
234a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna}
235a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna
236a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Innastatic inline void
237a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Innacsio_put_scsi_ddp(struct csio_scsim *scm, struct csio_dma_buf *ddp)
238a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna{
239a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	list_add_tail(&ddp->list, &scm->ddp_freelist);
240a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	CSIO_INC_STATS(scm, n_free_ddp);
241a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna}
242a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna
243a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Innastatic inline void
244a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Innacsio_put_scsi_ddp_list(struct csio_scsim *scm, struct list_head *reqlist,
245a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna			 int n)
246a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna{
247a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	list_splice_tail_init(reqlist, &scm->ddp_freelist);
248a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	scm->stats.n_free_ddp += n;
249a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna}
250a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna
251a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Innastatic inline void
252a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Innacsio_scsi_completed(struct csio_ioreq *ioreq, struct list_head *cbfn_q)
253a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna{
254a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	csio_post_event(&ioreq->sm, CSIO_SCSIE_COMPLETED);
255a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	if (csio_list_deleted(&ioreq->sm.sm_list))
256a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna		list_add_tail(&ioreq->sm.sm_list, cbfn_q);
257a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna}
258a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna
259a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Innastatic inline void
260a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Innacsio_scsi_aborted(struct csio_ioreq *ioreq, struct list_head *cbfn_q)
261a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna{
262a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	csio_post_event(&ioreq->sm, CSIO_SCSIE_ABORTED);
263a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	list_add_tail(&ioreq->sm.sm_list, cbfn_q);
264a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna}
265a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna
266a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Innastatic inline void
267a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Innacsio_scsi_closed(struct csio_ioreq *ioreq, struct list_head *cbfn_q)
268a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna{
269a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	csio_post_event(&ioreq->sm, CSIO_SCSIE_CLOSED);
270a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	list_add_tail(&ioreq->sm.sm_list, cbfn_q);
271a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna}
272a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna
273a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Innastatic inline void
274a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Innacsio_scsi_drvcleanup(struct csio_ioreq *ioreq)
275a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna{
276a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	csio_post_event(&ioreq->sm, CSIO_SCSIE_DRVCLEANUP);
277a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna}
278a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna
279a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna/*
280a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna * csio_scsi_start_io - Kick starts the IO SM.
281a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna * @req: io request SM.
282a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna *
283a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna * needs to be called with lock held.
284a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna */
285a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Innastatic inline int
286a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Innacsio_scsi_start_io(struct csio_ioreq *ioreq)
287a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna{
288a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	csio_post_event(&ioreq->sm, CSIO_SCSIE_START_IO);
289a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	return ioreq->drv_status;
290a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna}
291a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna
292a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna/*
293a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna * csio_scsi_start_tm - Kicks off the Task management IO SM.
294a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna * @req: io request SM.
295a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna *
296a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna * needs to be called with lock held.
297a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna */
298a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Innastatic inline int
299a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Innacsio_scsi_start_tm(struct csio_ioreq *ioreq)
300a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna{
301a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	csio_post_event(&ioreq->sm, CSIO_SCSIE_START_TM);
302a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	return ioreq->drv_status;
303a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna}
304a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna
305a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna/*
306a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna * csio_scsi_abort - Abort an IO request
307a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna * @req: io request SM.
308a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna *
309a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna * needs to be called with lock held.
310a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna */
311a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Innastatic inline int
312a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Innacsio_scsi_abort(struct csio_ioreq *ioreq)
313a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna{
314a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	csio_post_event(&ioreq->sm, CSIO_SCSIE_ABORT);
315a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	return ioreq->drv_status;
316a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna}
317a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna
318a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna/*
319a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna * csio_scsi_close - Close an IO request
320a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna * @req: io request SM.
321a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna *
322a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna * needs to be called with lock held.
323a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna */
324a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Innastatic inline int
325a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Innacsio_scsi_close(struct csio_ioreq *ioreq)
326a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna{
327a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	csio_post_event(&ioreq->sm, CSIO_SCSIE_CLOSE);
328a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna	return ioreq->drv_status;
329a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna}
330a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna
331a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Innavoid csio_scsi_cleanup_io_q(struct csio_scsim *, struct list_head *);
332a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Innaint csio_scsim_cleanup_io(struct csio_scsim *, bool abort);
333a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Innaint csio_scsim_cleanup_io_lnode(struct csio_scsim *,
334a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna					  struct csio_lnode *);
335a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Innastruct csio_ioreq *csio_scsi_cmpl_handler(struct csio_hw *, void *, uint32_t,
336a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna					  struct csio_fl_dma_buf *,
337a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna					  void *, uint8_t **);
338a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Innaint csio_scsi_qconfig(struct csio_hw *);
339a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Innaint csio_scsim_init(struct csio_scsim *, struct csio_hw *);
340a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Innavoid csio_scsim_exit(struct csio_scsim *);
341a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna
342a3667aaed5698b84bad2f1b3f71adc86499f4bc6Naresh Kumar Inna#endif /* __CSIO_SCSI_H__ */
343