162306a36Sopenharmony_ci/*
262306a36Sopenharmony_ci * This file is part of the Chelsio FCoE driver for Linux.
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci * Copyright (c) 2008-2012 Chelsio Communications, Inc. All rights reserved.
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci * This software is available to you under a choice of one of two
762306a36Sopenharmony_ci * licenses.  You may choose to be licensed under the terms of the GNU
862306a36Sopenharmony_ci * General Public License (GPL) Version 2, available from the file
962306a36Sopenharmony_ci * COPYING in the main directory of this source tree, or the
1062306a36Sopenharmony_ci * OpenIB.org BSD license below:
1162306a36Sopenharmony_ci *
1262306a36Sopenharmony_ci *     Redistribution and use in source and binary forms, with or
1362306a36Sopenharmony_ci *     without modification, are permitted provided that the following
1462306a36Sopenharmony_ci *     conditions are met:
1562306a36Sopenharmony_ci *
1662306a36Sopenharmony_ci *      - Redistributions of source code must retain the above
1762306a36Sopenharmony_ci *        copyright notice, this list of conditions and the following
1862306a36Sopenharmony_ci *        disclaimer.
1962306a36Sopenharmony_ci *
2062306a36Sopenharmony_ci *      - Redistributions in binary form must reproduce the above
2162306a36Sopenharmony_ci *        copyright notice, this list of conditions and the following
2262306a36Sopenharmony_ci *        disclaimer in the documentation and/or other materials
2362306a36Sopenharmony_ci *        provided with the distribution.
2462306a36Sopenharmony_ci *
2562306a36Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
2662306a36Sopenharmony_ci * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
2762306a36Sopenharmony_ci * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
2862306a36Sopenharmony_ci * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
2962306a36Sopenharmony_ci * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
3062306a36Sopenharmony_ci * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
3162306a36Sopenharmony_ci * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
3262306a36Sopenharmony_ci * SOFTWARE.
3362306a36Sopenharmony_ci */
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci#ifndef __CSIO_SCSI_H__
3662306a36Sopenharmony_ci#define __CSIO_SCSI_H__
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci#include <linux/spinlock_types.h>
3962306a36Sopenharmony_ci#include <linux/completion.h>
4062306a36Sopenharmony_ci#include <scsi/scsi.h>
4162306a36Sopenharmony_ci#include <scsi/scsi_cmnd.h>
4262306a36Sopenharmony_ci#include <scsi/scsi_device.h>
4362306a36Sopenharmony_ci#include <scsi/scsi_host.h>
4462306a36Sopenharmony_ci#include <scsi/scsi_eh.h>
4562306a36Sopenharmony_ci#include <scsi/scsi_tcq.h>
4662306a36Sopenharmony_ci#include <scsi/fc/fc_fcp.h>
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci#include "csio_defs.h"
4962306a36Sopenharmony_ci#include "csio_wr.h"
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ciextern struct scsi_host_template csio_fcoe_shost_template;
5262306a36Sopenharmony_ciextern struct scsi_host_template csio_fcoe_shost_vport_template;
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ciextern int csio_scsi_eqsize;
5562306a36Sopenharmony_ciextern int csio_scsi_iqlen;
5662306a36Sopenharmony_ciextern int csio_scsi_ioreqs;
5762306a36Sopenharmony_ciextern uint32_t csio_max_scan_tmo;
5862306a36Sopenharmony_ciextern uint32_t csio_delta_scan_tmo;
5962306a36Sopenharmony_ciextern int csio_lun_qdepth;
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci/*
6262306a36Sopenharmony_ci **************************** NOTE *******************************
6362306a36Sopenharmony_ci * How do we calculate MAX FCoE SCSI SGEs? Here is the math:
6462306a36Sopenharmony_ci * Max Egress WR size = 512 bytes
6562306a36Sopenharmony_ci * One SCSI egress WR has the following fixed no of bytes:
6662306a36Sopenharmony_ci *      48 (sizeof(struct fw_scsi_write[read]_wr)) - FW WR
6762306a36Sopenharmony_ci *    + 32 (sizeof(struct fc_fcp_cmnd)) - Immediate FCP_CMD
6862306a36Sopenharmony_ci *    ------
6962306a36Sopenharmony_ci *      80
7062306a36Sopenharmony_ci *    ------
7162306a36Sopenharmony_ci * That leaves us with 512 - 96 = 432 bytes for data SGE. Using
7262306a36Sopenharmony_ci * struct ulptx_sgl header for the SGE consumes:
7362306a36Sopenharmony_ci *	- 4 bytes for cmnd_sge.
7462306a36Sopenharmony_ci *	- 12 bytes for the first SGL.
7562306a36Sopenharmony_ci * That leaves us with 416 bytes for the remaining SGE pairs. Which is
7662306a36Sopenharmony_ci * is 416 / 24 (size(struct ulptx_sge_pair)) = 17 SGE pairs,
7762306a36Sopenharmony_ci * or 34 SGEs. Adding the first SGE fetches us 35 SGEs.
7862306a36Sopenharmony_ci */
7962306a36Sopenharmony_ci#define CSIO_SCSI_MAX_SGE		35
8062306a36Sopenharmony_ci#define CSIO_SCSI_ABRT_TMO_MS		60000
8162306a36Sopenharmony_ci#define CSIO_SCSI_LUNRST_TMO_MS		60000
8262306a36Sopenharmony_ci#define CSIO_SCSI_TM_POLL_MS		2000	/* should be less than
8362306a36Sopenharmony_ci						 * all TM timeouts.
8462306a36Sopenharmony_ci						 */
8562306a36Sopenharmony_ci#define CSIO_SCSI_IQ_WRSZ		128
8662306a36Sopenharmony_ci#define CSIO_SCSI_IQSIZE		(csio_scsi_iqlen * CSIO_SCSI_IQ_WRSZ)
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_ci#define	CSIO_MAX_SNS_LEN		128
8962306a36Sopenharmony_ci#define	CSIO_SCSI_RSP_LEN	(FCP_RESP_WITH_EXT + 4 + CSIO_MAX_SNS_LEN)
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_ci/* Reference to scsi_cmnd */
9262306a36Sopenharmony_ci#define csio_scsi_cmnd(req)		((req)->scratch1)
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_cistruct csio_scsi_stats {
9562306a36Sopenharmony_ci	uint64_t		n_tot_success;	/* Total number of good I/Os */
9662306a36Sopenharmony_ci	uint32_t		n_rn_nr_error;	/* No. of remote-node-not-
9762306a36Sopenharmony_ci						 * ready errors
9862306a36Sopenharmony_ci						 */
9962306a36Sopenharmony_ci	uint32_t		n_hw_nr_error;	/* No. of hw-module-not-
10062306a36Sopenharmony_ci						 * ready errors
10162306a36Sopenharmony_ci						 */
10262306a36Sopenharmony_ci	uint32_t		n_dmamap_error;	/* No. of DMA map erros */
10362306a36Sopenharmony_ci	uint32_t		n_unsupp_sge_error; /* No. of too-many-SGes
10462306a36Sopenharmony_ci						     * errors.
10562306a36Sopenharmony_ci						     */
10662306a36Sopenharmony_ci	uint32_t		n_no_req_error;	/* No. of Out-of-ioreqs error */
10762306a36Sopenharmony_ci	uint32_t		n_busy_error;	/* No. of -EBUSY errors */
10862306a36Sopenharmony_ci	uint32_t		n_hosterror;	/* No. of FW_HOSTERROR I/O */
10962306a36Sopenharmony_ci	uint32_t		n_rsperror;	/* No. of response errors */
11062306a36Sopenharmony_ci	uint32_t		n_autosense;	/* No. of auto sense replies */
11162306a36Sopenharmony_ci	uint32_t		n_ovflerror;	/* No. of overflow errors */
11262306a36Sopenharmony_ci	uint32_t		n_unflerror;	/* No. of underflow errors */
11362306a36Sopenharmony_ci	uint32_t		n_rdev_nr_error;/* No. of rdev not
11462306a36Sopenharmony_ci						 * ready errors
11562306a36Sopenharmony_ci						 */
11662306a36Sopenharmony_ci	uint32_t		n_rdev_lost_error;/* No. of rdev lost errors */
11762306a36Sopenharmony_ci	uint32_t		n_rdev_logo_error;/* No. of rdev logo errors */
11862306a36Sopenharmony_ci	uint32_t		n_link_down_error;/* No. of link down errors */
11962306a36Sopenharmony_ci	uint32_t		n_no_xchg_error; /* No. no exchange error */
12062306a36Sopenharmony_ci	uint32_t		n_unknown_error;/* No. of unhandled errors */
12162306a36Sopenharmony_ci	uint32_t		n_aborted;	/* No. of aborted I/Os */
12262306a36Sopenharmony_ci	uint32_t		n_abrt_timedout; /* No. of abort timedouts */
12362306a36Sopenharmony_ci	uint32_t		n_abrt_fail;	/* No. of abort failures */
12462306a36Sopenharmony_ci	uint32_t		n_abrt_dups;	/* No. of duplicate aborts */
12562306a36Sopenharmony_ci	uint32_t		n_abrt_race_comp; /* No. of aborts that raced
12662306a36Sopenharmony_ci						   * with completions.
12762306a36Sopenharmony_ci						   */
12862306a36Sopenharmony_ci	uint32_t		n_abrt_busy_error;/* No. of abort failures
12962306a36Sopenharmony_ci						   * due to -EBUSY.
13062306a36Sopenharmony_ci						   */
13162306a36Sopenharmony_ci	uint32_t		n_closed;	/* No. of closed I/Os */
13262306a36Sopenharmony_ci	uint32_t		n_cls_busy_error; /* No. of close failures
13362306a36Sopenharmony_ci						   * due to -EBUSY.
13462306a36Sopenharmony_ci						   */
13562306a36Sopenharmony_ci	uint32_t		n_active;	/* No. of IOs in active_q */
13662306a36Sopenharmony_ci	uint32_t		n_tm_active;	/* No. of TMs in active_q */
13762306a36Sopenharmony_ci	uint32_t		n_wcbfn;	/* No. of I/Os in worker
13862306a36Sopenharmony_ci						 * cbfn q
13962306a36Sopenharmony_ci						 */
14062306a36Sopenharmony_ci	uint32_t		n_free_ioreq;	/* No. of freelist entries */
14162306a36Sopenharmony_ci	uint32_t		n_free_ddp;	/* No. of DDP freelist */
14262306a36Sopenharmony_ci	uint32_t		n_unaligned;	/* No. of Unaligned SGls */
14362306a36Sopenharmony_ci	uint32_t		n_inval_cplop;	/* No. invalid CPL op's in IQ */
14462306a36Sopenharmony_ci	uint32_t		n_inval_scsiop;	/* No. invalid scsi op's in IQ*/
14562306a36Sopenharmony_ci};
14662306a36Sopenharmony_ci
14762306a36Sopenharmony_cistruct csio_scsim {
14862306a36Sopenharmony_ci	struct csio_hw		*hw;		/* Pointer to HW moduel */
14962306a36Sopenharmony_ci	uint8_t			max_sge;	/* Max SGE */
15062306a36Sopenharmony_ci	uint8_t			proto_cmd_len;	/* Proto specific SCSI
15162306a36Sopenharmony_ci						 * cmd length
15262306a36Sopenharmony_ci						 */
15362306a36Sopenharmony_ci	uint16_t		proto_rsp_len;	/* Proto specific SCSI
15462306a36Sopenharmony_ci						 * response length
15562306a36Sopenharmony_ci						 */
15662306a36Sopenharmony_ci	spinlock_t		freelist_lock;	/* Lock for ioreq freelist */
15762306a36Sopenharmony_ci	struct list_head	active_q;	/* Outstanding SCSI I/Os */
15862306a36Sopenharmony_ci	struct list_head	ioreq_freelist;	/* Free list of ioreq's */
15962306a36Sopenharmony_ci	struct list_head	ddp_freelist;	/* DDP descriptor freelist */
16062306a36Sopenharmony_ci	struct csio_scsi_stats	stats;		/* This module's statistics */
16162306a36Sopenharmony_ci};
16262306a36Sopenharmony_ci
16362306a36Sopenharmony_ci/* State machine defines */
16462306a36Sopenharmony_cienum csio_scsi_ev {
16562306a36Sopenharmony_ci	CSIO_SCSIE_START_IO = 1,		/* Start a regular SCSI IO */
16662306a36Sopenharmony_ci	CSIO_SCSIE_START_TM,			/* Start a TM IO */
16762306a36Sopenharmony_ci	CSIO_SCSIE_COMPLETED,			/* IO Completed */
16862306a36Sopenharmony_ci	CSIO_SCSIE_ABORT,			/* Abort IO */
16962306a36Sopenharmony_ci	CSIO_SCSIE_ABORTED,			/* IO Aborted */
17062306a36Sopenharmony_ci	CSIO_SCSIE_CLOSE,			/* Close exchange */
17162306a36Sopenharmony_ci	CSIO_SCSIE_CLOSED,			/* Exchange closed */
17262306a36Sopenharmony_ci	CSIO_SCSIE_DRVCLEANUP,			/* Driver wants to manually
17362306a36Sopenharmony_ci						 * cleanup this I/O.
17462306a36Sopenharmony_ci						 */
17562306a36Sopenharmony_ci};
17662306a36Sopenharmony_ci
17762306a36Sopenharmony_cienum csio_scsi_lev {
17862306a36Sopenharmony_ci	CSIO_LEV_ALL = 1,
17962306a36Sopenharmony_ci	CSIO_LEV_LNODE,
18062306a36Sopenharmony_ci	CSIO_LEV_RNODE,
18162306a36Sopenharmony_ci	CSIO_LEV_LUN,
18262306a36Sopenharmony_ci};
18362306a36Sopenharmony_ci
18462306a36Sopenharmony_cistruct csio_scsi_level_data {
18562306a36Sopenharmony_ci	enum csio_scsi_lev	level;
18662306a36Sopenharmony_ci	struct csio_rnode	*rnode;
18762306a36Sopenharmony_ci	struct csio_lnode	*lnode;
18862306a36Sopenharmony_ci	uint64_t		oslun;
18962306a36Sopenharmony_ci};
19062306a36Sopenharmony_ci
19162306a36Sopenharmony_cistruct csio_cmd_priv {
19262306a36Sopenharmony_ci	uint8_t fc_tm_flags;	/* task management flags */
19362306a36Sopenharmony_ci	uint16_t wr_status;
19462306a36Sopenharmony_ci};
19562306a36Sopenharmony_ci
19662306a36Sopenharmony_cistatic inline struct csio_cmd_priv *csio_priv(struct scsi_cmnd *cmd)
19762306a36Sopenharmony_ci{
19862306a36Sopenharmony_ci	return scsi_cmd_priv(cmd);
19962306a36Sopenharmony_ci}
20062306a36Sopenharmony_ci
20162306a36Sopenharmony_cistatic inline struct csio_ioreq *
20262306a36Sopenharmony_cicsio_get_scsi_ioreq(struct csio_scsim *scm)
20362306a36Sopenharmony_ci{
20462306a36Sopenharmony_ci	struct csio_sm *req;
20562306a36Sopenharmony_ci
20662306a36Sopenharmony_ci	if (likely(!list_empty(&scm->ioreq_freelist))) {
20762306a36Sopenharmony_ci		req = list_first_entry(&scm->ioreq_freelist,
20862306a36Sopenharmony_ci				       struct csio_sm, sm_list);
20962306a36Sopenharmony_ci		list_del_init(&req->sm_list);
21062306a36Sopenharmony_ci		CSIO_DEC_STATS(scm, n_free_ioreq);
21162306a36Sopenharmony_ci		return (struct csio_ioreq *)req;
21262306a36Sopenharmony_ci	} else
21362306a36Sopenharmony_ci		return NULL;
21462306a36Sopenharmony_ci}
21562306a36Sopenharmony_ci
21662306a36Sopenharmony_cistatic inline void
21762306a36Sopenharmony_cicsio_put_scsi_ioreq(struct csio_scsim *scm, struct csio_ioreq *ioreq)
21862306a36Sopenharmony_ci{
21962306a36Sopenharmony_ci	list_add_tail(&ioreq->sm.sm_list, &scm->ioreq_freelist);
22062306a36Sopenharmony_ci	CSIO_INC_STATS(scm, n_free_ioreq);
22162306a36Sopenharmony_ci}
22262306a36Sopenharmony_ci
22362306a36Sopenharmony_cistatic inline void
22462306a36Sopenharmony_cicsio_put_scsi_ioreq_list(struct csio_scsim *scm, struct list_head *reqlist,
22562306a36Sopenharmony_ci			 int n)
22662306a36Sopenharmony_ci{
22762306a36Sopenharmony_ci	list_splice_init(reqlist, &scm->ioreq_freelist);
22862306a36Sopenharmony_ci	scm->stats.n_free_ioreq += n;
22962306a36Sopenharmony_ci}
23062306a36Sopenharmony_ci
23162306a36Sopenharmony_cistatic inline struct csio_dma_buf *
23262306a36Sopenharmony_cicsio_get_scsi_ddp(struct csio_scsim *scm)
23362306a36Sopenharmony_ci{
23462306a36Sopenharmony_ci	struct csio_dma_buf *ddp;
23562306a36Sopenharmony_ci
23662306a36Sopenharmony_ci	if (likely(!list_empty(&scm->ddp_freelist))) {
23762306a36Sopenharmony_ci		ddp = list_first_entry(&scm->ddp_freelist,
23862306a36Sopenharmony_ci				       struct csio_dma_buf, list);
23962306a36Sopenharmony_ci		list_del_init(&ddp->list);
24062306a36Sopenharmony_ci		CSIO_DEC_STATS(scm, n_free_ddp);
24162306a36Sopenharmony_ci		return ddp;
24262306a36Sopenharmony_ci	} else
24362306a36Sopenharmony_ci		return NULL;
24462306a36Sopenharmony_ci}
24562306a36Sopenharmony_ci
24662306a36Sopenharmony_cistatic inline void
24762306a36Sopenharmony_cicsio_put_scsi_ddp(struct csio_scsim *scm, struct csio_dma_buf *ddp)
24862306a36Sopenharmony_ci{
24962306a36Sopenharmony_ci	list_add_tail(&ddp->list, &scm->ddp_freelist);
25062306a36Sopenharmony_ci	CSIO_INC_STATS(scm, n_free_ddp);
25162306a36Sopenharmony_ci}
25262306a36Sopenharmony_ci
25362306a36Sopenharmony_cistatic inline void
25462306a36Sopenharmony_cicsio_put_scsi_ddp_list(struct csio_scsim *scm, struct list_head *reqlist,
25562306a36Sopenharmony_ci			 int n)
25662306a36Sopenharmony_ci{
25762306a36Sopenharmony_ci	list_splice_tail_init(reqlist, &scm->ddp_freelist);
25862306a36Sopenharmony_ci	scm->stats.n_free_ddp += n;
25962306a36Sopenharmony_ci}
26062306a36Sopenharmony_ci
26162306a36Sopenharmony_cistatic inline void
26262306a36Sopenharmony_cicsio_scsi_completed(struct csio_ioreq *ioreq, struct list_head *cbfn_q)
26362306a36Sopenharmony_ci{
26462306a36Sopenharmony_ci	csio_post_event(&ioreq->sm, CSIO_SCSIE_COMPLETED);
26562306a36Sopenharmony_ci	if (csio_list_deleted(&ioreq->sm.sm_list))
26662306a36Sopenharmony_ci		list_add_tail(&ioreq->sm.sm_list, cbfn_q);
26762306a36Sopenharmony_ci}
26862306a36Sopenharmony_ci
26962306a36Sopenharmony_cistatic inline void
27062306a36Sopenharmony_cicsio_scsi_aborted(struct csio_ioreq *ioreq, struct list_head *cbfn_q)
27162306a36Sopenharmony_ci{
27262306a36Sopenharmony_ci	csio_post_event(&ioreq->sm, CSIO_SCSIE_ABORTED);
27362306a36Sopenharmony_ci	list_add_tail(&ioreq->sm.sm_list, cbfn_q);
27462306a36Sopenharmony_ci}
27562306a36Sopenharmony_ci
27662306a36Sopenharmony_cistatic inline void
27762306a36Sopenharmony_cicsio_scsi_closed(struct csio_ioreq *ioreq, struct list_head *cbfn_q)
27862306a36Sopenharmony_ci{
27962306a36Sopenharmony_ci	csio_post_event(&ioreq->sm, CSIO_SCSIE_CLOSED);
28062306a36Sopenharmony_ci	list_add_tail(&ioreq->sm.sm_list, cbfn_q);
28162306a36Sopenharmony_ci}
28262306a36Sopenharmony_ci
28362306a36Sopenharmony_cistatic inline void
28462306a36Sopenharmony_cicsio_scsi_drvcleanup(struct csio_ioreq *ioreq)
28562306a36Sopenharmony_ci{
28662306a36Sopenharmony_ci	csio_post_event(&ioreq->sm, CSIO_SCSIE_DRVCLEANUP);
28762306a36Sopenharmony_ci}
28862306a36Sopenharmony_ci
28962306a36Sopenharmony_ci/*
29062306a36Sopenharmony_ci * csio_scsi_start_io - Kick starts the IO SM.
29162306a36Sopenharmony_ci * @req: io request SM.
29262306a36Sopenharmony_ci *
29362306a36Sopenharmony_ci * needs to be called with lock held.
29462306a36Sopenharmony_ci */
29562306a36Sopenharmony_cistatic inline int
29662306a36Sopenharmony_cicsio_scsi_start_io(struct csio_ioreq *ioreq)
29762306a36Sopenharmony_ci{
29862306a36Sopenharmony_ci	csio_post_event(&ioreq->sm, CSIO_SCSIE_START_IO);
29962306a36Sopenharmony_ci	return ioreq->drv_status;
30062306a36Sopenharmony_ci}
30162306a36Sopenharmony_ci
30262306a36Sopenharmony_ci/*
30362306a36Sopenharmony_ci * csio_scsi_start_tm - Kicks off the Task management IO SM.
30462306a36Sopenharmony_ci * @req: io request SM.
30562306a36Sopenharmony_ci *
30662306a36Sopenharmony_ci * needs to be called with lock held.
30762306a36Sopenharmony_ci */
30862306a36Sopenharmony_cistatic inline int
30962306a36Sopenharmony_cicsio_scsi_start_tm(struct csio_ioreq *ioreq)
31062306a36Sopenharmony_ci{
31162306a36Sopenharmony_ci	csio_post_event(&ioreq->sm, CSIO_SCSIE_START_TM);
31262306a36Sopenharmony_ci	return ioreq->drv_status;
31362306a36Sopenharmony_ci}
31462306a36Sopenharmony_ci
31562306a36Sopenharmony_ci/*
31662306a36Sopenharmony_ci * csio_scsi_abort - Abort an IO request
31762306a36Sopenharmony_ci * @req: io request SM.
31862306a36Sopenharmony_ci *
31962306a36Sopenharmony_ci * needs to be called with lock held.
32062306a36Sopenharmony_ci */
32162306a36Sopenharmony_cistatic inline int
32262306a36Sopenharmony_cicsio_scsi_abort(struct csio_ioreq *ioreq)
32362306a36Sopenharmony_ci{
32462306a36Sopenharmony_ci	csio_post_event(&ioreq->sm, CSIO_SCSIE_ABORT);
32562306a36Sopenharmony_ci	return ioreq->drv_status;
32662306a36Sopenharmony_ci}
32762306a36Sopenharmony_ci
32862306a36Sopenharmony_ci/*
32962306a36Sopenharmony_ci * csio_scsi_close - Close an IO request
33062306a36Sopenharmony_ci * @req: io request SM.
33162306a36Sopenharmony_ci *
33262306a36Sopenharmony_ci * needs to be called with lock held.
33362306a36Sopenharmony_ci */
33462306a36Sopenharmony_cistatic inline int
33562306a36Sopenharmony_cicsio_scsi_close(struct csio_ioreq *ioreq)
33662306a36Sopenharmony_ci{
33762306a36Sopenharmony_ci	csio_post_event(&ioreq->sm, CSIO_SCSIE_CLOSE);
33862306a36Sopenharmony_ci	return ioreq->drv_status;
33962306a36Sopenharmony_ci}
34062306a36Sopenharmony_ci
34162306a36Sopenharmony_civoid csio_scsi_cleanup_io_q(struct csio_scsim *, struct list_head *);
34262306a36Sopenharmony_ciint csio_scsim_cleanup_io(struct csio_scsim *, bool abort);
34362306a36Sopenharmony_ciint csio_scsim_cleanup_io_lnode(struct csio_scsim *,
34462306a36Sopenharmony_ci					  struct csio_lnode *);
34562306a36Sopenharmony_cistruct csio_ioreq *csio_scsi_cmpl_handler(struct csio_hw *, void *, uint32_t,
34662306a36Sopenharmony_ci					  struct csio_fl_dma_buf *,
34762306a36Sopenharmony_ci					  void *, uint8_t **);
34862306a36Sopenharmony_ciint csio_scsi_qconfig(struct csio_hw *);
34962306a36Sopenharmony_ciint csio_scsim_init(struct csio_scsim *, struct csio_hw *);
35062306a36Sopenharmony_civoid csio_scsim_exit(struct csio_scsim *);
35162306a36Sopenharmony_ci
35262306a36Sopenharmony_ci#endif /* __CSIO_SCSI_H__ */
353