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