diff options
author | James Smart <james.smart@emulex.com> | 2011-04-16 11:03:43 -0400 |
---|---|---|
committer | James Bottomley <James.Bottomley@suse.de> | 2011-05-01 12:10:41 -0400 |
commit | b6e3b9c606f271824bdeb6a40a080452eb086598 (patch) | |
tree | 9180f8036f9a729b40b2c8243e241c600d6afa12 /drivers/scsi/lpfc/lpfc_bsg.h | |
parent | c31098cef5e091e22a02ff255f911e0ad71cc393 (diff) |
[SCSI] lpfc 8.3.23: BSG additions and fixes
- Fixed the mixed declarations and codes which violate ISO C90
(declarations in subsections that assign at declaration)
- Add BSG data transfer size protection in mailbox command pass-through path
- Invoke BSG job_done while holding spinlock to fix deadlock
- Added support for checking SLI_CONFIG subcommands
- Fixed bug in BSG mailbox size check to non-embedded external buffer
Signed-off-by: Alex Iannicelli <alex.iannicelli@emulex.com>
Signed-off-by: James Smart <james.smart@emulex.com>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>
Diffstat (limited to 'drivers/scsi/lpfc/lpfc_bsg.h')
-rw-r--r-- | drivers/scsi/lpfc/lpfc_bsg.h | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/drivers/scsi/lpfc/lpfc_bsg.h b/drivers/scsi/lpfc/lpfc_bsg.h index a2c33e7c9152..b542aca6f5ae 100644 --- a/drivers/scsi/lpfc/lpfc_bsg.h +++ b/drivers/scsi/lpfc/lpfc_bsg.h | |||
@@ -109,3 +109,133 @@ struct menlo_response { | |||
109 | uint32_t xri; /* return the xri of the iocb exchange */ | 109 | uint32_t xri; /* return the xri of the iocb exchange */ |
110 | }; | 110 | }; |
111 | 111 | ||
112 | /* | ||
113 | * macros and data structures for handling sli-config mailbox command | ||
114 | * pass-through support, this header file is shared between user and | ||
115 | * kernel spaces, note the set of macros are duplicates from lpfc_hw4.h, | ||
116 | * with macro names prefixed with bsg_, as the macros defined in | ||
117 | * lpfc_hw4.h are not accessible from user space. | ||
118 | */ | ||
119 | |||
120 | /* Macros to deal with bit fields. Each bit field must have 3 #defines | ||
121 | * associated with it (_SHIFT, _MASK, and _WORD). | ||
122 | * EG. For a bit field that is in the 7th bit of the "field4" field of a | ||
123 | * structure and is 2 bits in size the following #defines must exist: | ||
124 | * struct temp { | ||
125 | * uint32_t field1; | ||
126 | * uint32_t field2; | ||
127 | * uint32_t field3; | ||
128 | * uint32_t field4; | ||
129 | * #define example_bit_field_SHIFT 7 | ||
130 | * #define example_bit_field_MASK 0x03 | ||
131 | * #define example_bit_field_WORD field4 | ||
132 | * uint32_t field5; | ||
133 | * }; | ||
134 | * Then the macros below may be used to get or set the value of that field. | ||
135 | * EG. To get the value of the bit field from the above example: | ||
136 | * struct temp t1; | ||
137 | * value = bsg_bf_get(example_bit_field, &t1); | ||
138 | * And then to set that bit field: | ||
139 | * bsg_bf_set(example_bit_field, &t1, 2); | ||
140 | * Or clear that bit field: | ||
141 | * bsg_bf_set(example_bit_field, &t1, 0); | ||
142 | */ | ||
143 | #define bsg_bf_get_le32(name, ptr) \ | ||
144 | ((le32_to_cpu((ptr)->name##_WORD) >> name##_SHIFT) & name##_MASK) | ||
145 | #define bsg_bf_get(name, ptr) \ | ||
146 | (((ptr)->name##_WORD >> name##_SHIFT) & name##_MASK) | ||
147 | #define bsg_bf_set_le32(name, ptr, value) \ | ||
148 | ((ptr)->name##_WORD = cpu_to_le32(((((value) & \ | ||
149 | name##_MASK) << name##_SHIFT) | (le32_to_cpu((ptr)->name##_WORD) & \ | ||
150 | ~(name##_MASK << name##_SHIFT))))) | ||
151 | #define bsg_bf_set(name, ptr, value) \ | ||
152 | ((ptr)->name##_WORD = ((((value) & name##_MASK) << name##_SHIFT) | \ | ||
153 | ((ptr)->name##_WORD & ~(name##_MASK << name##_SHIFT)))) | ||
154 | |||
155 | /* | ||
156 | * The sli_config structure specified here is based on the following | ||
157 | * restriction: | ||
158 | * | ||
159 | * -- SLI_CONFIG EMB=0, carrying MSEs, will carry subcommands without | ||
160 | * carrying HBD. | ||
161 | * -- SLI_CONFIG EMB=1, not carrying MSE, will carry subcommands with or | ||
162 | * without carrying HBDs. | ||
163 | */ | ||
164 | |||
165 | struct lpfc_sli_config_mse { | ||
166 | uint32_t pa_lo; | ||
167 | uint32_t pa_hi; | ||
168 | uint32_t buf_len; | ||
169 | #define lpfc_mbox_sli_config_mse_len_SHIFT 0 | ||
170 | #define lpfc_mbox_sli_config_mse_len_MASK 0xffffff | ||
171 | #define lpfc_mbox_sli_config_mse_len_WORD buf_len | ||
172 | }; | ||
173 | |||
174 | struct lpfc_sli_config_subcmd_hbd { | ||
175 | uint32_t buf_len; | ||
176 | #define lpfc_mbox_sli_config_ecmn_hbd_len_SHIFT 0 | ||
177 | #define lpfc_mbox_sli_config_ecmn_hbd_len_MASK 0xffffff | ||
178 | #define lpfc_mbox_sli_config_ecmn_hbd_len_WORD buf_len | ||
179 | uint32_t pa_lo; | ||
180 | uint32_t pa_hi; | ||
181 | }; | ||
182 | |||
183 | struct lpfc_sli_config_hdr { | ||
184 | uint32_t word1; | ||
185 | #define lpfc_mbox_hdr_emb_SHIFT 0 | ||
186 | #define lpfc_mbox_hdr_emb_MASK 0x00000001 | ||
187 | #define lpfc_mbox_hdr_emb_WORD word1 | ||
188 | #define lpfc_mbox_hdr_mse_cnt_SHIFT 3 | ||
189 | #define lpfc_mbox_hdr_mse_cnt_MASK 0x0000001f | ||
190 | #define lpfc_mbox_hdr_mse_cnt_WORD word1 | ||
191 | uint32_t payload_length; | ||
192 | uint32_t tag_lo; | ||
193 | uint32_t tag_hi; | ||
194 | uint32_t reserved5; | ||
195 | }; | ||
196 | |||
197 | struct lpfc_sli_config_generic { | ||
198 | struct lpfc_sli_config_hdr sli_config_hdr; | ||
199 | #define LPFC_MBX_SLI_CONFIG_MAX_MSE 19 | ||
200 | struct lpfc_sli_config_mse mse[LPFC_MBX_SLI_CONFIG_MAX_MSE]; | ||
201 | }; | ||
202 | |||
203 | struct lpfc_sli_config_subcmnd { | ||
204 | struct lpfc_sli_config_hdr sli_config_hdr; | ||
205 | uint32_t word6; | ||
206 | #define lpfc_subcmnd_opcode_SHIFT 0 | ||
207 | #define lpfc_subcmnd_opcode_MASK 0xff | ||
208 | #define lpfc_subcmnd_opcode_WORD word6 | ||
209 | #define lpfc_subcmnd_subsys_SHIFT 8 | ||
210 | #define lpfc_subcmnd_subsys_MASK 0xff | ||
211 | #define lpfc_subcmnd_subsys_WORD word6 | ||
212 | uint32_t timeout; | ||
213 | uint32_t request_length; | ||
214 | uint32_t word9; | ||
215 | #define lpfc_subcmnd_version_SHIFT 0 | ||
216 | #define lpfc_subcmnd_version_MASK 0xff | ||
217 | #define lpfc_subcmnd_version_WORD word9 | ||
218 | uint32_t word10; | ||
219 | #define lpfc_subcmnd_ask_rd_len_SHIFT 0 | ||
220 | #define lpfc_subcmnd_ask_rd_len_MASK 0xffffff | ||
221 | #define lpfc_subcmnd_ask_rd_len_WORD word10 | ||
222 | uint32_t rd_offset; | ||
223 | uint32_t obj_name[26]; | ||
224 | uint32_t hbd_count; | ||
225 | #define LPFC_MBX_SLI_CONFIG_MAX_HBD 10 | ||
226 | struct lpfc_sli_config_subcmd_hbd hbd[LPFC_MBX_SLI_CONFIG_MAX_HBD]; | ||
227 | }; | ||
228 | |||
229 | struct lpfc_sli_config_mbox { | ||
230 | uint32_t word0; | ||
231 | #define lpfc_mqe_status_SHIFT 16 | ||
232 | #define lpfc_mqe_status_MASK 0x0000FFFF | ||
233 | #define lpfc_mqe_status_WORD word0 | ||
234 | #define lpfc_mqe_command_SHIFT 8 | ||
235 | #define lpfc_mqe_command_MASK 0x000000FF | ||
236 | #define lpfc_mqe_command_WORD word0 | ||
237 | union { | ||
238 | struct lpfc_sli_config_generic sli_config_generic; | ||
239 | struct lpfc_sli_config_subcmnd sli_config_subcmnd; | ||
240 | } un; | ||
241 | }; | ||