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