linux/drivers/scsi/lpfc/lpfc_scsi.h
<<
>>
Prefs
   1/*******************************************************************
   2 * This file is part of the Emulex Linux Device Driver for         *
   3 * Fibre Channel Host Bus Adapters.                                *
   4 * Copyright (C) 2004-2012 Emulex.  All rights reserved.           *
   5 * EMULEX and SLI are trademarks of Emulex.                        *
   6 * www.emulex.com                                                  *
   7 *                                                                 *
   8 * This program is free software; you can redistribute it and/or   *
   9 * modify it under the terms of version 2 of the GNU General       *
  10 * Public License as published by the Free Software Foundation.    *
  11 * This program is distributed in the hope that it will be useful. *
  12 * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND          *
  13 * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,  *
  14 * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT, ARE      *
  15 * DISCLAIMED, EXCEPT TO THE EXTENT THAT SUCH DISCLAIMERS ARE HELD *
  16 * TO BE LEGALLY INVALID.  See the GNU General Public License for  *
  17 * more details, a copy of which can be found in the file COPYING  *
  18 * included with this package.                                     *
  19 *******************************************************************/
  20
  21#include <asm/byteorder.h>
  22
  23struct lpfc_hba;
  24#define LPFC_FCP_CDB_LEN 16
  25
  26#define list_remove_head(list, entry, type, member)             \
  27        do {                                                    \
  28        entry = NULL;                                           \
  29        if (!list_empty(list)) {                                \
  30                entry = list_entry((list)->next, type, member); \
  31                list_del_init(&entry->member);                  \
  32        }                                                       \
  33        } while(0)
  34
  35#define list_get_first(list, type, member)                      \
  36        (list_empty(list)) ? NULL :                             \
  37        list_entry((list)->next, type, member)
  38
  39/* per-port data that is allocated in the FC transport for us */
  40struct lpfc_rport_data {
  41        struct lpfc_nodelist *pnode;    /* Pointer to the node structure. */
  42};
  43
  44struct fcp_rsp {
  45        uint32_t rspRsvd1;      /* FC Word 0, byte 0:3 */
  46        uint32_t rspRsvd2;      /* FC Word 1, byte 0:3 */
  47
  48        uint8_t rspStatus0;     /* FCP_STATUS byte 0 (reserved) */
  49        uint8_t rspStatus1;     /* FCP_STATUS byte 1 (reserved) */
  50        uint8_t rspStatus2;     /* FCP_STATUS byte 2 field validity */
  51#define RSP_LEN_VALID  0x01     /* bit 0 */
  52#define SNS_LEN_VALID  0x02     /* bit 1 */
  53#define RESID_OVER     0x04     /* bit 2 */
  54#define RESID_UNDER    0x08     /* bit 3 */
  55        uint8_t rspStatus3;     /* FCP_STATUS byte 3 SCSI status byte */
  56
  57        uint32_t rspResId;      /* Residual xfer if residual count field set in
  58                                   fcpStatus2 */
  59        /* Received in Big Endian format */
  60        uint32_t rspSnsLen;     /* Length of sense data in fcpSnsInfo */
  61        /* Received in Big Endian format */
  62        uint32_t rspRspLen;     /* Length of FCP response data in fcpRspInfo */
  63        /* Received in Big Endian format */
  64
  65        uint8_t rspInfo0;       /* FCP_RSP_INFO byte 0 (reserved) */
  66        uint8_t rspInfo1;       /* FCP_RSP_INFO byte 1 (reserved) */
  67        uint8_t rspInfo2;       /* FCP_RSP_INFO byte 2 (reserved) */
  68        uint8_t rspInfo3;       /* FCP_RSP_INFO RSP_CODE byte 3 */
  69
  70#define RSP_NO_FAILURE       0x00
  71#define RSP_DATA_BURST_ERR   0x01
  72#define RSP_CMD_FIELD_ERR    0x02
  73#define RSP_RO_MISMATCH_ERR  0x03
  74#define RSP_TM_NOT_SUPPORTED 0x04       /* Task mgmt function not supported */
  75#define RSP_TM_NOT_COMPLETED 0x05       /* Task mgmt function not performed */
  76
  77        uint32_t rspInfoRsvd;   /* FCP_RSP_INFO bytes 4-7 (reserved) */
  78
  79        uint8_t rspSnsInfo[128];
  80#define SNS_ILLEGAL_REQ 0x05    /* sense key is byte 3 ([2]) */
  81#define SNSCOD_BADCMD 0x20      /* sense code is byte 13 ([12]) */
  82};
  83
  84struct fcp_cmnd {
  85        struct scsi_lun  fcp_lun;
  86
  87        uint8_t fcpCntl0;       /* FCP_CNTL byte 0 (reserved) */
  88        uint8_t fcpCntl1;       /* FCP_CNTL byte 1 task codes */
  89#define  SIMPLE_Q        0x00
  90#define  HEAD_OF_Q       0x01
  91#define  ORDERED_Q       0x02
  92#define  ACA_Q           0x04
  93#define  UNTAGGED        0x05
  94        uint8_t fcpCntl2;       /* FCP_CTL byte 2 task management codes */
  95#define  FCP_ABORT_TASK_SET  0x02       /* Bit 1 */
  96#define  FCP_CLEAR_TASK_SET  0x04       /* bit 2 */
  97#define  FCP_BUS_RESET       0x08       /* bit 3 */
  98#define  FCP_LUN_RESET       0x10       /* bit 4 */
  99#define  FCP_TARGET_RESET    0x20       /* bit 5 */
 100#define  FCP_CLEAR_ACA       0x40       /* bit 6 */
 101#define  FCP_TERMINATE_TASK  0x80       /* bit 7 */
 102        uint8_t fcpCntl3;
 103#define  WRITE_DATA      0x01   /* Bit 0 */
 104#define  READ_DATA       0x02   /* Bit 1 */
 105
 106        uint8_t fcpCdb[LPFC_FCP_CDB_LEN]; /* SRB cdb field is copied here */
 107        uint32_t fcpDl;         /* Total transfer length */
 108
 109};
 110
 111struct lpfc_scsicmd_bkt {
 112        uint32_t cmd_count;
 113};
 114
 115struct lpfc_scsi_buf {
 116        struct list_head list;
 117        struct scsi_cmnd *pCmd;
 118        struct lpfc_rport_data *rdata;
 119
 120        uint32_t timeout;
 121
 122        uint16_t exch_busy;     /* SLI4 hba reported XB on complete WCQE */
 123        uint16_t status;        /* From IOCB Word 7- ulpStatus */
 124        uint32_t result;        /* From IOCB Word 4. */
 125
 126        uint32_t   seg_cnt;     /* Number of scatter-gather segments returned by
 127                                 * dma_map_sg.  The driver needs this for calls
 128                                 * to dma_unmap_sg. */
 129        uint32_t prot_seg_cnt;  /* seg_cnt's counterpart for protection data */
 130
 131        dma_addr_t nonsg_phys;  /* Non scatter-gather physical address. */
 132
 133        /*
 134         * data and dma_handle are the kernel virtual and bus address of the
 135         * dma-able buffer containing the fcp_cmd, fcp_rsp and a scatter
 136         * gather bde list that supports the sg_tablesize value.
 137         */
 138        void *data;
 139        dma_addr_t dma_handle;
 140
 141        struct fcp_cmnd *fcp_cmnd;
 142        struct fcp_rsp *fcp_rsp;
 143        struct ulp_bde64 *fcp_bpl;
 144
 145        dma_addr_t dma_phys_bpl;
 146
 147        /* cur_iocbq has phys of the dma-able buffer.
 148         * Iotag is in here
 149         */
 150        struct lpfc_iocbq cur_iocbq;
 151        wait_queue_head_t *waitq;
 152        unsigned long start_time;
 153
 154#ifdef CONFIG_SCSI_LPFC_DEBUG_FS
 155        /* Used to restore any changes to protection data for error injection */
 156        void *prot_data_segment;
 157        uint32_t prot_data;
 158        uint32_t prot_data_type;
 159#define LPFC_INJERR_REFTAG      1
 160#define LPFC_INJERR_APPTAG      2
 161#define LPFC_INJERR_GUARD       3
 162#endif
 163};
 164
 165#define LPFC_SCSI_DMA_EXT_SIZE 264
 166#define LPFC_BPL_SIZE          1024
 167#define MDAC_DIRECT_CMD                  0x22
 168