snic_io.h (3542B)
1/* 2 * Copyright 2014 Cisco Systems, Inc. All rights reserved. 3 * 4 * This program is free software; you may redistribute it and/or modify 5 * it under the terms of the GNU General Public License as published by 6 * the Free Software Foundation; version 2 of the License. 7 * 8 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 9 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 10 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 11 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 12 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 13 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 14 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 15 * SOFTWARE. 16 */ 17 18#ifndef _SNIC_IO_H 19#define _SNIC_IO_H 20 21#define SNIC_DFLT_SG_DESC_CNT 32 /* Default descriptors for sgl */ 22#define SNIC_MAX_SG_DESC_CNT 60 /* Max descriptor for sgl */ 23#define SNIC_SG_DESC_ALIGN 16 /* Descriptor address alignment */ 24 25/* SG descriptor for snic */ 26struct snic_sg_desc { 27 __le64 addr; 28 __le32 len; 29 u32 _resvd; 30}; 31 32struct snic_dflt_sgl { 33 struct snic_sg_desc sg_desc[SNIC_DFLT_SG_DESC_CNT]; 34}; 35 36struct snic_max_sgl { 37 struct snic_sg_desc sg_desc[SNIC_MAX_SG_DESC_CNT]; 38}; 39 40enum snic_req_cache_type { 41 SNIC_REQ_CACHE_DFLT_SGL = 0, /* cache with default size sgl */ 42 SNIC_REQ_CACHE_MAX_SGL, /* cache with max size sgl */ 43 SNIC_REQ_TM_CACHE, /* cache for task mgmt reqs contains 44 snic_host_req objects only*/ 45 SNIC_REQ_MAX_CACHES /* number of sgl caches */ 46}; 47 48/* Per IO internal state */ 49struct snic_internal_io_state { 50 char *rqi; 51 u64 flags; 52 u32 state; 53 u32 abts_status; /* Abort completion status */ 54 u32 lr_status; /* device reset completion status */ 55}; 56 57/* IO state machine */ 58enum snic_ioreq_state { 59 SNIC_IOREQ_NOT_INITED = 0, 60 SNIC_IOREQ_PENDING, 61 SNIC_IOREQ_ABTS_PENDING, 62 SNIC_IOREQ_ABTS_COMPLETE, 63 SNIC_IOREQ_LR_PENDING, 64 SNIC_IOREQ_LR_COMPLETE, 65 SNIC_IOREQ_COMPLETE, 66}; 67 68struct snic; 69struct snic_host_req; 70 71/* 72 * snic_req_info : Contains info about IO, one per scsi command. 73 * Notes: Make sure that the structure is aligned to 16 B 74 * this helps in easy access to snic_req_info from snic_host_req 75 */ 76struct snic_req_info { 77 struct list_head list; 78 struct snic_host_req *req; 79 u64 start_time; /* start time in jiffies */ 80 u16 rq_pool_type; /* noticion of request pool type */ 81 u16 req_len; /* buf len passing to fw (req + sgl)*/ 82 u32 tgt_id; 83 84 u32 tm_tag; 85 u8 io_cmpl:1; /* sets to 1 when fw completes IO */ 86 u8 resvd[3]; 87 struct scsi_cmnd *sc; /* Associated scsi cmd */ 88 struct snic *snic; /* Associated snic */ 89 ulong sge_va; /* Pointer to Resp Buffer */ 90 u64 snsbuf_va; 91 92 struct snic_host_req *abort_req; 93 struct completion *abts_done; 94 95 struct snic_host_req *dr_req; 96 struct completion *dr_done; 97}; 98 99 100#define rqi_to_req(rqi) \ 101 ((struct snic_host_req *) (((struct snic_req_info *)rqi)->req)) 102 103#define req_to_rqi(req) \ 104 ((struct snic_req_info *) (((struct snic_host_req *)req)->hdr.init_ctx)) 105 106#define req_to_sgl(req) \ 107 ((struct snic_sg_desc *) (((struct snic_host_req *)req)+1)) 108 109struct snic_req_info * 110snic_req_init(struct snic *, int sg_cnt); 111void snic_req_free(struct snic *, struct snic_req_info *); 112void snic_calc_io_process_time(struct snic *, struct snic_req_info *); 113void snic_pci_unmap_rsp_buf(struct snic *, struct snic_req_info *); 114struct snic_host_req * 115snic_abort_req_init(struct snic *, struct snic_req_info *); 116struct snic_host_req * 117snic_dr_req_init(struct snic *, struct snic_req_info *); 118#endif /* _SNIC_IO_H */