1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
3 *
4 * Copyright (c) 2019 Leandro Lupori
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 * SUCH DAMAGE.
26 */
27
28 #include <sys/param.h>
29 #include <sys/types.h>
30
31 #include <dev/aacraid/aacraid_reg.h>
32 #include <dev/aacraid/aacraid_endian.h>
33
34 #if _BYTE_ORDER != _LITTLE_ENDIAN
35
36 #define TOH2(field, bits) field = le##bits##toh(field)
37 #define TOH(field, bits) TOH2(field, bits)
38
39 #define TOLE2(field, bits) field = htole##bits(field)
40 #define TOLE(field, bits) TOLE2(field, bits)
41
42 /* Convert from Little-Endian to host order (TOH) */
43
44 void
aac_fib_header_toh(struct aac_fib_header * ptr)45 aac_fib_header_toh(struct aac_fib_header *ptr)
46 {
47 TOH(ptr->XferState, 32);
48 TOH(ptr->Command, 16);
49 TOH(ptr->Size, 16);
50 TOH(ptr->SenderSize, 16);
51 TOH(ptr->SenderFibAddress, 32);
52 TOH(ptr->u.ReceiverFibAddress, 32);
53 TOH(ptr->Handle, 32);
54 TOH(ptr->Previous, 32);
55 TOH(ptr->Next, 32);
56 }
57
58 void
aac_adapter_info_toh(struct aac_adapter_info * ptr)59 aac_adapter_info_toh(struct aac_adapter_info *ptr)
60 {
61 TOH(ptr->PlatformBase, 32);
62 TOH(ptr->CpuArchitecture, 32);
63 TOH(ptr->CpuVariant, 32);
64 TOH(ptr->ClockSpeed, 32);
65 TOH(ptr->ExecutionMem, 32);
66 TOH(ptr->BufferMem, 32);
67 TOH(ptr->TotalMem, 32);
68
69 TOH(ptr->KernelRevision.buildNumber, 32);
70 TOH(ptr->MonitorRevision.buildNumber, 32);
71 TOH(ptr->HardwareRevision.buildNumber, 32);
72 TOH(ptr->BIOSRevision.buildNumber, 32);
73
74 TOH(ptr->ClusteringEnabled, 32);
75 TOH(ptr->ClusterChannelMask, 32);
76 TOH(ptr->SerialNumber, 64);
77 TOH(ptr->batteryPlatform, 32);
78 TOH(ptr->SupportedOptions, 32);
79 TOH(ptr->OemVariant, 32);
80 }
81
82 void
aac_container_creation_toh(struct aac_container_creation * ptr)83 aac_container_creation_toh(struct aac_container_creation *ptr)
84 {
85 u_int32_t *date = (u_int32_t *)ptr + 1;
86
87 *date = le32toh(*date);
88 TOH(ptr->ViaAdapterSerialNumber, 64);
89 }
90
91 void
aac_mntobj_toh(struct aac_mntobj * ptr)92 aac_mntobj_toh(struct aac_mntobj *ptr)
93 {
94 TOH(ptr->ObjectId, 32);
95 aac_container_creation_toh(&ptr->CreateInfo);
96 TOH(ptr->Capacity, 32);
97 TOH(ptr->VolType, 32);
98 TOH(ptr->ObjType, 32);
99 TOH(ptr->ContentState, 32);
100 TOH(ptr->ObjExtension.BlockDevice.BlockSize, 32);
101 TOH(ptr->ObjExtension.BlockDevice.bdLgclPhysMap, 32);
102 TOH(ptr->AlterEgoId, 32);
103 TOH(ptr->CapacityHigh, 32);
104 }
105
106 void
aac_mntinforesp_toh(struct aac_mntinforesp * ptr)107 aac_mntinforesp_toh(struct aac_mntinforesp *ptr)
108 {
109 TOH(ptr->Status, 32);
110 TOH(ptr->MntType, 32);
111 TOH(ptr->MntRespCount, 32);
112 aac_mntobj_toh(&ptr->MntTable[0]);
113 }
114
115 void
aac_fsa_ctm_toh(struct aac_fsa_ctm * ptr)116 aac_fsa_ctm_toh(struct aac_fsa_ctm *ptr)
117 {
118 int i;
119
120 TOH(ptr->command, 32);
121 for (i = 0; i < CT_FIB_PARAMS; i++)
122 TOH(ptr->param[i], 32);
123 }
124
125 void
aac_cnt_config_toh(struct aac_cnt_config * ptr)126 aac_cnt_config_toh(struct aac_cnt_config *ptr)
127 {
128 TOH(ptr->Command, 32);
129 aac_fsa_ctm_toh(&ptr->CTCommand);
130 }
131
132 void
aac_ctcfg_resp_toh(struct aac_ctcfg_resp * ptr)133 aac_ctcfg_resp_toh(struct aac_ctcfg_resp *ptr)
134 {
135 TOH(ptr->Status, 32);
136 TOH(ptr->resp, 32);
137 TOH(ptr->param, 32);
138 }
139
140 void
aac_getbusinf_toh(struct aac_getbusinf * ptr)141 aac_getbusinf_toh(struct aac_getbusinf *ptr)
142 {
143 TOH(ptr->ProbeComplete, 32);
144 TOH(ptr->BusCount, 32);
145 TOH(ptr->TargetsPerBus, 32);
146 }
147
148 void
aac_vmi_businf_resp_toh(struct aac_vmi_businf_resp * ptr)149 aac_vmi_businf_resp_toh(struct aac_vmi_businf_resp *ptr)
150 {
151 TOH(ptr->Status, 32);
152 TOH(ptr->ObjType, 32);
153 TOH(ptr->MethId, 32);
154 TOH(ptr->ObjId, 32);
155 TOH(ptr->IoctlCmd, 32);
156 aac_getbusinf_toh(&ptr->BusInf);
157 }
158
159 void
aac_srb_response_toh(struct aac_srb_response * ptr)160 aac_srb_response_toh(struct aac_srb_response *ptr)
161 {
162 TOH(ptr->fib_status, 32);
163 TOH(ptr->srb_status, 32);
164 TOH(ptr->scsi_status, 32);
165 TOH(ptr->data_len, 32);
166 TOH(ptr->sense_len, 32);
167 }
168
169 /* Convert from host order to Little-Endian (TOLE) */
170
171 void
aac_adapter_init_tole(struct aac_adapter_init * ptr)172 aac_adapter_init_tole(struct aac_adapter_init *ptr)
173 {
174 TOLE(ptr->InitStructRevision, 32);
175 TOLE(ptr->NoOfMSIXVectors, 32);
176 TOLE(ptr->FilesystemRevision, 32);
177 TOLE(ptr->CommHeaderAddress, 32);
178 TOLE(ptr->FastIoCommAreaAddress, 32);
179 TOLE(ptr->AdapterFibsPhysicalAddress, 32);
180 TOLE(ptr->AdapterFibsVirtualAddress, 32);
181 TOLE(ptr->AdapterFibsSize, 32);
182 TOLE(ptr->AdapterFibAlign, 32);
183 TOLE(ptr->PrintfBufferAddress, 32);
184 TOLE(ptr->PrintfBufferSize, 32);
185 TOLE(ptr->HostPhysMemPages, 32);
186 TOLE(ptr->HostElapsedSeconds, 32);
187 TOLE(ptr->InitFlags, 32);
188 TOLE(ptr->MaxIoCommands, 32);
189 TOLE(ptr->MaxIoSize, 32);
190 TOLE(ptr->MaxFibSize, 32);
191 TOLE(ptr->MaxNumAif, 32);
192 TOLE(ptr->HostRRQ_AddrLow, 32);
193 TOLE(ptr->HostRRQ_AddrHigh, 32);
194 }
195
196 void
aac_fib_header_tole(struct aac_fib_header * ptr)197 aac_fib_header_tole(struct aac_fib_header *ptr)
198 {
199 TOLE(ptr->XferState, 32);
200 TOLE(ptr->Command, 16);
201 TOLE(ptr->Size, 16);
202 TOLE(ptr->SenderSize, 16);
203 TOLE(ptr->SenderFibAddress, 32);
204 TOLE(ptr->u.ReceiverFibAddress, 32);
205 TOLE(ptr->Handle, 32);
206 TOLE(ptr->Previous, 32);
207 TOLE(ptr->Next, 32);
208 }
209
210 void
aac_mntinfo_tole(struct aac_mntinfo * ptr)211 aac_mntinfo_tole(struct aac_mntinfo *ptr)
212 {
213 TOLE(ptr->Command, 32);
214 TOLE(ptr->MntType, 32);
215 TOLE(ptr->MntCount, 32);
216 }
217
218 void
aac_fsa_ctm_tole(struct aac_fsa_ctm * ptr)219 aac_fsa_ctm_tole(struct aac_fsa_ctm *ptr)
220 {
221 int i;
222
223 TOLE(ptr->command, 32);
224 for (i = 0; i < CT_FIB_PARAMS; i++)
225 TOLE(ptr->param[i], 32);
226 }
227
228 void
aac_cnt_config_tole(struct aac_cnt_config * ptr)229 aac_cnt_config_tole(struct aac_cnt_config *ptr)
230 {
231 TOLE(ptr->Command, 32);
232 aac_fsa_ctm_tole(&ptr->CTCommand);
233 }
234
235 void
aac_raw_io_tole(struct aac_raw_io * ptr)236 aac_raw_io_tole(struct aac_raw_io *ptr)
237 {
238 TOLE(ptr->BlockNumber, 64);
239 TOLE(ptr->ByteCount, 32);
240 TOLE(ptr->ContainerId, 16);
241 TOLE(ptr->Flags, 16);
242 TOLE(ptr->BpTotal, 16);
243 TOLE(ptr->BpComplete, 16);
244 }
245
246 void
aac_raw_io2_tole(struct aac_raw_io2 * ptr)247 aac_raw_io2_tole(struct aac_raw_io2 *ptr)
248 {
249 TOLE(ptr->strtBlkLow, 32);
250 TOLE(ptr->strtBlkHigh, 32);
251 TOLE(ptr->byteCnt, 32);
252 TOLE(ptr->ldNum, 16);
253 TOLE(ptr->flags, 16);
254 TOLE(ptr->sgeFirstSize, 32);
255 TOLE(ptr->sgeNominalSize, 32);
256 }
257
258 void
aac_fib_xporthdr_tole(struct aac_fib_xporthdr * ptr)259 aac_fib_xporthdr_tole(struct aac_fib_xporthdr *ptr)
260 {
261 TOLE(ptr->HostAddress, 64);
262 TOLE(ptr->Size, 32);
263 TOLE(ptr->Handle, 32);
264 }
265
266 void
aac_ctcfg_tole(struct aac_ctcfg * ptr)267 aac_ctcfg_tole(struct aac_ctcfg *ptr)
268 {
269 TOLE(ptr->Command, 32);
270 TOLE(ptr->cmd, 32);
271 TOLE(ptr->param, 32);
272 }
273
274 void
aac_vmioctl_tole(struct aac_vmioctl * ptr)275 aac_vmioctl_tole(struct aac_vmioctl *ptr)
276 {
277 TOLE(ptr->Command, 32);
278 TOLE(ptr->ObjType, 32);
279 TOLE(ptr->MethId, 32);
280 TOLE(ptr->ObjId, 32);
281 TOLE(ptr->IoctlCmd, 32);
282 TOLE(ptr->IoctlBuf[0], 32);
283 }
284
285 void
aac_pause_command_tole(struct aac_pause_command * ptr)286 aac_pause_command_tole(struct aac_pause_command *ptr)
287 {
288 TOLE(ptr->Command, 32);
289 TOLE(ptr->Type, 32);
290 TOLE(ptr->Timeout, 32);
291 TOLE(ptr->Min, 32);
292 TOLE(ptr->NoRescan, 32);
293 TOLE(ptr->Parm3, 32);
294 TOLE(ptr->Parm4, 32);
295 TOLE(ptr->Count, 32);
296 }
297
298 void
aac_srb_tole(struct aac_srb * ptr)299 aac_srb_tole(struct aac_srb *ptr)
300 {
301 TOLE(ptr->function, 32);
302 TOLE(ptr->bus, 32);
303 TOLE(ptr->target, 32);
304 TOLE(ptr->lun, 32);
305 TOLE(ptr->timeout, 32);
306 TOLE(ptr->flags, 32);
307 TOLE(ptr->data_len, 32);
308 TOLE(ptr->retry_limit, 32);
309 TOLE(ptr->cdb_len, 32);
310 }
311
312 void
aac_sge_ieee1212_tole(struct aac_sge_ieee1212 * ptr)313 aac_sge_ieee1212_tole(struct aac_sge_ieee1212 *ptr)
314 {
315 TOLE(ptr->addrLow, 32);
316 TOLE(ptr->addrHigh, 32);
317 TOLE(ptr->length, 32);
318 TOLE(ptr->flags, 32);
319 }
320
321 void
aac_sg_entryraw_tole(struct aac_sg_entryraw * ptr)322 aac_sg_entryraw_tole(struct aac_sg_entryraw *ptr)
323 {
324 TOLE(ptr->Next, 32);
325 TOLE(ptr->Prev, 32);
326 TOLE(ptr->SgAddress, 64);
327 TOLE(ptr->SgByteCount, 32);
328 TOLE(ptr->Flags, 32);
329 }
330
331 void
aac_sg_entry_tole(struct aac_sg_entry * ptr)332 aac_sg_entry_tole(struct aac_sg_entry *ptr)
333 {
334 TOLE(ptr->SgAddress, 32);
335 TOLE(ptr->SgByteCount, 32);
336 }
337
338 void
aac_sg_entry64_tole(struct aac_sg_entry64 * ptr)339 aac_sg_entry64_tole(struct aac_sg_entry64 *ptr)
340 {
341 TOLE(ptr->SgAddress, 64);
342 TOLE(ptr->SgByteCount, 32);
343 }
344
345 void
aac_blockread_tole(struct aac_blockread * ptr)346 aac_blockread_tole(struct aac_blockread *ptr)
347 {
348 TOLE(ptr->Command, 32);
349 TOLE(ptr->ContainerId, 32);
350 TOLE(ptr->BlockNumber, 32);
351 TOLE(ptr->ByteCount, 32);
352 }
353
354 void
aac_blockwrite_tole(struct aac_blockwrite * ptr)355 aac_blockwrite_tole(struct aac_blockwrite *ptr)
356 {
357 TOLE(ptr->Command, 32);
358 TOLE(ptr->ContainerId, 32);
359 TOLE(ptr->BlockNumber, 32);
360 TOLE(ptr->ByteCount, 32);
361 TOLE(ptr->Stable, 32);
362 }
363
364 void
aac_blockread64_tole(struct aac_blockread64 * ptr)365 aac_blockread64_tole(struct aac_blockread64 *ptr)
366 {
367 TOLE(ptr->Command, 32);
368 TOLE(ptr->ContainerId, 16);
369 TOLE(ptr->SectorCount, 16);
370 TOLE(ptr->BlockNumber, 32);
371 TOLE(ptr->Pad, 16);
372 TOLE(ptr->Flags, 16);
373 }
374
375 void
aac_blockwrite64_tole(struct aac_blockwrite64 * ptr)376 aac_blockwrite64_tole(struct aac_blockwrite64 *ptr)
377 {
378 TOLE(ptr->Command, 32);
379 TOLE(ptr->ContainerId, 16);
380 TOLE(ptr->SectorCount, 16);
381 TOLE(ptr->BlockNumber, 32);
382 TOLE(ptr->Pad, 16);
383 TOLE(ptr->Flags, 16);
384 }
385
386 #endif
387