1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23#include <asm/byteorder.h>
24
25struct lpfc_hba;
26#define LPFC_FCP_CDB_LEN 16
27
28#define list_remove_head(list, entry, type, member) \
29 do { \
30 entry = NULL; \
31 if (!list_empty(list)) { \
32 entry = list_entry((list)->next, type, member); \
33 list_del_init(&entry->member); \
34 } \
35 } while(0)
36
37#define list_get_first(list, type, member) \
38 (list_empty(list)) ? NULL : \
39 list_entry((list)->next, type, member)
40
41
42struct lpfc_rport_data {
43 struct lpfc_nodelist *pnode;
44};
45
46struct lpfc_device_id {
47 struct lpfc_name vport_wwpn;
48 struct lpfc_name target_wwpn;
49 uint64_t lun;
50};
51
52struct lpfc_device_data {
53 struct list_head listentry;
54 struct lpfc_rport_data *rport_data;
55 struct lpfc_device_id device_id;
56 uint8_t priority;
57 bool oas_enabled;
58 bool available;
59};
60
61struct fcp_rsp {
62 uint32_t rspRsvd1;
63 uint32_t rspRsvd2;
64
65 uint8_t rspStatus0;
66 uint8_t rspStatus1;
67 uint8_t rspStatus2;
68#define RSP_LEN_VALID 0x01
69#define SNS_LEN_VALID 0x02
70#define RESID_OVER 0x04
71#define RESID_UNDER 0x08
72 uint8_t rspStatus3;
73
74 uint32_t rspResId;
75
76
77 uint32_t rspSnsLen;
78
79 uint32_t rspRspLen;
80
81
82 uint8_t rspInfo0;
83 uint8_t rspInfo1;
84 uint8_t rspInfo2;
85 uint8_t rspInfo3;
86
87#define RSP_NO_FAILURE 0x00
88#define RSP_DATA_BURST_ERR 0x01
89#define RSP_CMD_FIELD_ERR 0x02
90#define RSP_RO_MISMATCH_ERR 0x03
91#define RSP_TM_NOT_SUPPORTED 0x04
92#define RSP_TM_NOT_COMPLETED 0x05
93#define RSP_TM_INVALID_LU 0x09
94
95 uint32_t rspInfoRsvd;
96
97 uint8_t rspSnsInfo[128];
98#define SNS_ILLEGAL_REQ 0x05
99#define SNSCOD_BADCMD 0x20
100};
101
102struct fcp_cmnd {
103 struct scsi_lun fcp_lun;
104
105 uint8_t fcpCntl0;
106 uint8_t fcpCntl1;
107#define SIMPLE_Q 0x00
108#define HEAD_OF_Q 0x01
109#define ORDERED_Q 0x02
110#define ACA_Q 0x04
111#define UNTAGGED 0x05
112 uint8_t fcpCntl2;
113#define FCP_ABORT_TASK_SET 0x02
114#define FCP_CLEAR_TASK_SET 0x04
115#define FCP_BUS_RESET 0x08
116#define FCP_LUN_RESET 0x10
117#define FCP_TARGET_RESET 0x20
118#define FCP_CLEAR_ACA 0x40
119#define FCP_TERMINATE_TASK 0x80
120 uint8_t fcpCntl3;
121#define WRITE_DATA 0x01
122#define READ_DATA 0x02
123
124 uint8_t fcpCdb[LPFC_FCP_CDB_LEN];
125 uint32_t fcpDl;
126
127};
128
129struct lpfc_scsicmd_bkt {
130 uint32_t cmd_count;
131};
132
133struct lpfc_scsi_buf {
134 struct list_head list;
135 struct scsi_cmnd *pCmd;
136 struct lpfc_rport_data *rdata;
137
138 uint32_t timeout;
139
140 uint16_t flags;
141#define LPFC_SBUF_XBUSY 0x1
142 uint16_t exch_busy;
143 uint16_t status;
144 uint32_t result;
145
146 uint32_t seg_cnt;
147
148
149 uint32_t prot_seg_cnt;
150
151 dma_addr_t nonsg_phys;
152
153
154
155
156
157
158 void *data;
159 dma_addr_t dma_handle;
160
161 struct fcp_cmnd *fcp_cmnd;
162 struct fcp_rsp *fcp_rsp;
163 struct ulp_bde64 *fcp_bpl;
164
165 dma_addr_t dma_phys_bpl;
166
167
168
169
170 struct lpfc_iocbq cur_iocbq;
171 uint16_t cpu;
172
173 wait_queue_head_t *waitq;
174 unsigned long start_time;
175
176#ifdef CONFIG_SCSI_LPFC_DEBUG_FS
177
178 void *prot_data_segment;
179 uint32_t prot_data;
180 uint32_t prot_data_type;
181#define LPFC_INJERR_REFTAG 1
182#define LPFC_INJERR_APPTAG 2
183#define LPFC_INJERR_GUARD 3
184#endif
185};
186
187#define LPFC_SCSI_DMA_EXT_SIZE 264
188#define LPFC_BPL_SIZE 1024
189#define MDAC_DIRECT_CMD 0x22
190
191#define FIND_FIRST_OAS_LUN 0
192#define NO_MORE_OAS_LUN -1
193#define NOT_OAS_ENABLED_LUN NO_MORE_OAS_LUN
194
195#define TXRDY_PAYLOAD_LEN 12
196
197int lpfc_sli4_scmd_to_wqidx_distr(struct lpfc_hba *phba,
198 struct lpfc_scsi_buf *lpfc_cmd);
199