Merge tag 'asm-generic-5.15' of git://git.kernel.org/pub/scm/linux/kernel/git/arnd...
[linux-2.6-microblaze.git] / drivers / scsi / megaraid / mbox_defs.h
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /*
3  *
4  *                      Linux MegaRAID Unified device driver
5  *
6  * Copyright (c) 2003-2004  LSI Logic Corporation.
7  *
8  * FILE         : mbox_defs.h
9  */
10 #ifndef _MRAID_MBOX_DEFS_H_
11 #define _MRAID_MBOX_DEFS_H_
12
13 #include <linux/types.h>
14
15 /*
16  * Commands and states for mailbox based controllers
17  */
18
19 #define MBOXCMD_LREAD           0x01
20 #define MBOXCMD_LWRITE          0x02
21 #define MBOXCMD_PASSTHRU        0x03
22 #define MBOXCMD_ADPEXTINQ       0x04
23 #define MBOXCMD_ADAPTERINQ      0x05
24 #define MBOXCMD_LREAD64         0xA7
25 #define MBOXCMD_LWRITE64        0xA8
26 #define MBOXCMD_PASSTHRU64      0xC3
27 #define MBOXCMD_EXTPTHRU        0xE3
28
29 #define MAIN_MISC_OPCODE        0xA4
30 #define GET_MAX_SG_SUPPORT      0x01
31 #define SUPPORT_EXT_CDB         0x16
32
33 #define FC_NEW_CONFIG           0xA1
34 #define NC_SUBOP_PRODUCT_INFO   0x0E
35 #define NC_SUBOP_ENQUIRY3       0x0F
36 #define ENQ3_GET_SOLICITED_FULL 0x02
37 #define OP_DCMD_READ_CONFIG     0x04
38 #define NEW_READ_CONFIG_8LD     0x67
39 #define READ_CONFIG_8LD         0x07
40 #define FLUSH_ADAPTER           0x0A
41 #define FLUSH_SYSTEM            0xFE
42
43 /*
44  * Command for random deletion of logical drives
45  */
46 #define FC_DEL_LOGDRV           0xA4
47 #define OP_SUP_DEL_LOGDRV       0x2A
48 #define OP_GET_LDID_MAP         0x18
49 #define OP_DEL_LOGDRV           0x1C
50
51 /*
52  * BIOS commands
53  */
54 #define IS_BIOS_ENABLED         0x62
55 #define GET_BIOS                0x01
56 #define CHNL_CLASS              0xA9
57 #define GET_CHNL_CLASS          0x00
58 #define SET_CHNL_CLASS          0x01
59 #define CH_RAID                 0x01
60 #define CH_SCSI                 0x00
61 #define BIOS_PVT_DATA           0x40
62 #define GET_BIOS_PVT_DATA       0x00
63
64
65 /*
66  * Commands to support clustering
67  */
68 #define GET_TARGET_ID           0x7D
69 #define CLUSTER_OP              0x70
70 #define GET_CLUSTER_MODE        0x02
71 #define CLUSTER_CMD             0x6E
72 #define RESERVE_LD              0x01
73 #define RELEASE_LD              0x02
74 #define RESET_RESERVATIONS      0x03
75 #define RESERVATION_STATUS      0x04
76 #define RESERVE_PD              0x05
77 #define RELEASE_PD              0x06
78
79
80 /*
81  * Module battery status
82  */
83 #define BATTERY_MODULE_MISSING          0x01
84 #define BATTERY_LOW_VOLTAGE             0x02
85 #define BATTERY_TEMP_HIGH               0x04
86 #define BATTERY_PACK_MISSING            0x08
87 #define BATTERY_CHARGE_MASK             0x30
88 #define BATTERY_CHARGE_DONE             0x00
89 #define BATTERY_CHARGE_INPROG           0x10
90 #define BATTERY_CHARGE_FAIL             0x20
91 #define BATTERY_CYCLES_EXCEEDED         0x40
92
93 /*
94  * Physical drive states.
95  */
96 #define PDRV_UNCNF      0
97 #define PDRV_ONLINE     3
98 #define PDRV_FAILED     4
99 #define PDRV_RBLD       5
100 #define PDRV_HOTSPARE   6
101
102
103 /*
104  * Raid logical drive states.
105  */
106 #define RDRV_OFFLINE    0
107 #define RDRV_DEGRADED   1
108 #define RDRV_OPTIMAL    2
109 #define RDRV_DELETED    3
110
111 /*
112  * Read, write and cache policies
113  */
114 #define NO_READ_AHEAD           0
115 #define READ_AHEAD              1
116 #define ADAP_READ_AHEAD         2
117 #define WRMODE_WRITE_THRU       0
118 #define WRMODE_WRITE_BACK       1
119 #define CACHED_IO               0
120 #define DIRECT_IO               1
121
122 #define MAX_LOGICAL_DRIVES_8LD          8
123 #define MAX_LOGICAL_DRIVES_40LD         40
124 #define FC_MAX_PHYSICAL_DEVICES         256
125 #define MAX_MBOX_CHANNELS               5
126 #define MAX_MBOX_TARGET                 15
127 #define MBOX_MAX_PHYSICAL_DRIVES        MAX_MBOX_CHANNELS*MAX_MBOX_TARGET
128 #define MAX_ROW_SIZE_40LD               32
129 #define MAX_ROW_SIZE_8LD                8
130 #define SPAN_DEPTH_8_SPANS              8
131 #define SPAN_DEPTH_4_SPANS              4
132 #define MAX_REQ_SENSE_LEN               0x20
133
134
135
136 /**
137  * struct mbox_t - Driver and f/w handshake structure.
138  * @cmd         : firmware command
139  * @cmdid       : command id
140  * @numsectors  : number of sectors to be transferred
141  * @lba         : Logical Block Address on LD
142  * @xferaddr    : DMA address for data transfer
143  * @logdrv      : logical drive number
144  * @numsge      : number of scatter gather elements in sg list
145  * @resvd       : reserved
146  * @busy        : f/w busy, must wait to issue more commands.
147  * @numstatus   : number of commands completed.
148  * @status      : status of the commands completed
149  * @completed   : array of completed command ids.
150  * @poll        : poll and ack sequence
151  * @ack         : poll and ack sequence
152  *
153  * The central handshake structure between the driver and the firmware. This
154  * structure must be allocated by the driver and aligned at 8-byte boundary.
155  */
156 #define MBOX_MAX_FIRMWARE_STATUS        46
157 typedef struct {
158         uint8_t         cmd;
159         uint8_t         cmdid;
160         uint16_t        numsectors;
161         uint32_t        lba;
162         uint32_t        xferaddr;
163         uint8_t         logdrv;
164         uint8_t         numsge;
165         uint8_t         resvd;
166         uint8_t         busy;
167         uint8_t         numstatus;
168         uint8_t         status;
169         uint8_t         completed[MBOX_MAX_FIRMWARE_STATUS];
170         uint8_t         poll;
171         uint8_t         ack;
172 } __attribute__ ((packed)) mbox_t;
173
174
175 /**
176  * mbox64_t - 64-bit extension for the mailbox
177  * @segment_lo  : the low 32-bits of the address of the scatter-gather list
178  * @segment_hi  : the upper 32-bits of the address of the scatter-gather list
179  * @mbox        : 32-bit mailbox, whose xferadder field must be set to
180  *              0xFFFFFFFF
181  *
182  * This is the extension of the 32-bit mailbox to be able to perform DMA
183  * beyond 4GB address range.
184  */
185 typedef struct {
186         uint32_t        xferaddr_lo;
187         uint32_t        xferaddr_hi;
188         mbox_t          mbox32;
189 } __attribute__ ((packed)) mbox64_t;
190
191 /*
192  * mailbox structure used for internal commands
193  */
194 typedef struct {
195         u8      cmd;
196         u8      cmdid;
197         u8      opcode;
198         u8      subopcode;
199         u32     lba;
200         u32     xferaddr;
201         u8      logdrv;
202         u8      rsvd[3];
203         u8      numstatus;
204         u8      status;
205 } __attribute__ ((packed)) int_mbox_t;
206
207 /**
208  * mraid_passthru_t - passthru structure to issue commands to physical devices
209  * @timeout             : command timeout, 0=6sec, 1=60sec, 2=10min, 3=3hr
210  * @ars                 : set if ARS required after check condition
211  * @islogical           : set if command meant for logical devices
212  * @logdrv              : logical drive number if command for LD
213  * @channel             : Channel on which physical device is located
214  * @target              : SCSI target of the device
215  * @queuetag            : unused
216  * @queueaction         : unused
217  * @cdb                 : SCSI CDB
218  * @cdblen              : length of the CDB
219  * @reqsenselen         : amount of request sense data to be returned
220  * @reqsensearea        : Sense information buffer
221  * @numsge              : number of scatter-gather elements in the sg list
222  * @scsistatus          : SCSI status of the command completed.
223  * @dataxferaddr        : DMA data transfer address
224  * @dataxferlen         : amount of the data to be transferred.
225  */
226 typedef struct {
227         uint8_t         timeout         :3;
228         uint8_t         ars             :1;
229         uint8_t         reserved        :3;
230         uint8_t         islogical       :1;
231         uint8_t         logdrv;
232         uint8_t         channel;
233         uint8_t         target;
234         uint8_t         queuetag;
235         uint8_t         queueaction;
236         uint8_t         cdb[10];
237         uint8_t         cdblen;
238         uint8_t         reqsenselen;
239         uint8_t         reqsensearea[MAX_REQ_SENSE_LEN];
240         uint8_t         numsge;
241         uint8_t         scsistatus;
242         uint32_t        dataxferaddr;
243         uint32_t        dataxferlen;
244 } __attribute__ ((packed)) mraid_passthru_t;
245
246 typedef struct {
247
248         uint32_t                dataxferaddr_lo;
249         uint32_t                dataxferaddr_hi;
250         mraid_passthru_t        pthru32;
251
252 } __attribute__ ((packed)) mega_passthru64_t;
253
254 /**
255  * mraid_epassthru_t - passthru structure to issue commands to physical devices
256  * @timeout             : command timeout, 0=6sec, 1=60sec, 2=10min, 3=3hr
257  * @ars                 : set if ARS required after check condition
258  * @rsvd1               : reserved field
259  * @cd_rom              : (?)
260  * @rsvd2               : reserved field
261  * @islogical           : set if command meant for logical devices
262  * @logdrv              : logical drive number if command for LD
263  * @channel             : Channel on which physical device is located
264  * @target              : SCSI target of the device
265  * @queuetag            : unused
266  * @queueaction         : unused
267  * @cdblen              : length of the CDB
268  * @rsvd3               : reserved field
269  * @cdb                 : SCSI CDB
270  * @numsge              : number of scatter-gather elements in the sg list
271  * @status              : SCSI status of the command completed.
272  * @reqsenselen         : amount of request sense data to be returned
273  * @reqsensearea        : Sense information buffer
274  * @rsvd4               : reserved field
275  * @dataxferaddr        : DMA data transfer address
276  * @dataxferlen         : amount of the data to be transferred.
277  */
278 typedef struct {
279         uint8_t         timeout         :3;
280         uint8_t         ars             :1;
281         uint8_t         rsvd1           :1;
282         uint8_t         cd_rom          :1;
283         uint8_t         rsvd2           :1;
284         uint8_t         islogical       :1;
285         uint8_t         logdrv;
286         uint8_t         channel;
287         uint8_t         target;
288         uint8_t         queuetag;
289         uint8_t         queueaction;
290         uint8_t         cdblen;
291         uint8_t         rsvd3;
292         uint8_t         cdb[16];
293         uint8_t         numsge;
294         uint8_t         status;
295         uint8_t         reqsenselen;
296         uint8_t         reqsensearea[MAX_REQ_SENSE_LEN];
297         uint8_t         rsvd4;
298         uint32_t        dataxferaddr;
299         uint32_t        dataxferlen;
300 } __attribute__ ((packed)) mraid_epassthru_t;
301
302
303 /**
304  * mraid_pinfo_t - product info, static information about the controller
305  * @data_size           : current size in bytes (not including resvd)
306  * @config_signature    : Current value is 0x00282008
307  * @fw_version          : Firmware version
308  * @bios_version        : version of the BIOS
309  * @product_name        : Name given to the controller
310  * @max_commands        : Maximum concurrent commands supported
311  * @nchannels           : Number of SCSI Channels detected
312  * @fc_loop_present     : Number of Fibre Loops detected
313  * @mem_type            : EDO, FPM, SDRAM etc
314  * @signature           :
315  * @dram_size           : In terms of MB
316  * @subsysid            : device PCI subsystem ID
317  * @subsysvid           : device PCI subsystem vendor ID
318  * @notify_counters     :
319  * @pad1k               : 135 + 889 resvd = 1024 total size
320  *
321  * This structures holds the information about the controller which is not
322  * expected to change dynamically.
323  *
324  * The current value of config signature is 0x00282008:
325  * 0x28 = MAX_LOGICAL_DRIVES,
326  * 0x20 = Number of stripes and
327  * 0x08 = Number of spans
328  */
329 typedef struct {
330         uint32_t        data_size;
331         uint32_t        config_signature;
332         uint8_t         fw_version[16];
333         uint8_t         bios_version[16];
334         uint8_t         product_name[80];
335         uint8_t         max_commands;
336         uint8_t         nchannels;
337         uint8_t         fc_loop_present;
338         uint8_t         mem_type;
339         uint32_t        signature;
340         uint16_t        dram_size;
341         uint16_t        subsysid;
342         uint16_t        subsysvid;
343         uint8_t         notify_counters;
344         uint8_t         pad1k[889];
345 } __attribute__ ((packed)) mraid_pinfo_t;
346
347
348 /**
349  * mraid_notify_t - the notification structure
350  * @global_counter              : Any change increments this counter
351  * @param_counter               : Indicates any params changed
352  * @param_id                    : Param modified - defined below
353  * @param_val                   : New val of last param modified
354  * @write_config_counter        : write config occurred
355  * @write_config_rsvd           :
356  * @ldrv_op_counter             : Indicates ldrv op started/completed
357  * @ldrv_opid                   : ldrv num
358  * @ldrv_opcmd                  : ldrv operation - defined below
359  * @ldrv_opstatus               : status of the operation
360  * @ldrv_state_counter          : Indicates change of ldrv state
361  * @ldrv_state_id               : ldrv num
362  * @ldrv_state_new              : New state
363  * @ldrv_state_old              : old state
364  * @pdrv_state_counter          : Indicates change of ldrv state
365  * @pdrv_state_id               : pdrv id
366  * @pdrv_state_new              : New state
367  * @pdrv_state_old              : old state
368  * @pdrv_fmt_counter            : Indicates pdrv format started/over
369  * @pdrv_fmt_id                 : pdrv id
370  * @pdrv_fmt_val                : format started/over
371  * @pdrv_fmt_rsvd               :
372  * @targ_xfer_counter           : Indicates SCSI-2 Xfer rate change
373  * @targ_xfer_id                : pdrv Id
374  * @targ_xfer_val               : new Xfer params of last pdrv
375  * @targ_xfer_rsvd              :
376  * @fcloop_id_chg_counter       : Indicates loopid changed
377  * @fcloopid_pdrvid             : pdrv id
378  * @fcloop_id0                  : loopid on fc loop 0
379  * @fcloop_id1                  : loopid on fc loop 1
380  * @fcloop_state_counter        : Indicates loop state changed
381  * @fcloop_state0               : state of fc loop 0
382  * @fcloop_state1               : state of fc loop 1
383  * @fcloop_state_rsvd           :
384  */
385 typedef struct {
386         uint32_t        global_counter;
387         uint8_t         param_counter;
388         uint8_t         param_id;
389         uint16_t        param_val;
390         uint8_t         write_config_counter;
391         uint8_t         write_config_rsvd[3];
392         uint8_t         ldrv_op_counter;
393         uint8_t         ldrv_opid;
394         uint8_t         ldrv_opcmd;
395         uint8_t         ldrv_opstatus;
396         uint8_t         ldrv_state_counter;
397         uint8_t         ldrv_state_id;
398         uint8_t         ldrv_state_new;
399         uint8_t         ldrv_state_old;
400         uint8_t         pdrv_state_counter;
401         uint8_t         pdrv_state_id;
402         uint8_t         pdrv_state_new;
403         uint8_t         pdrv_state_old;
404         uint8_t         pdrv_fmt_counter;
405         uint8_t         pdrv_fmt_id;
406         uint8_t         pdrv_fmt_val;
407         uint8_t         pdrv_fmt_rsvd;
408         uint8_t         targ_xfer_counter;
409         uint8_t         targ_xfer_id;
410         uint8_t         targ_xfer_val;
411         uint8_t         targ_xfer_rsvd;
412         uint8_t         fcloop_id_chg_counter;
413         uint8_t         fcloopid_pdrvid;
414         uint8_t         fcloop_id0;
415         uint8_t         fcloop_id1;
416         uint8_t         fcloop_state_counter;
417         uint8_t         fcloop_state0;
418         uint8_t         fcloop_state1;
419         uint8_t         fcloop_state_rsvd;
420 } __attribute__ ((packed)) mraid_notify_t;
421
422
423 /**
424  * mraid_inquiry3_t - enquiry for device information
425  *
426  * @data_size           : current size in bytes (not including resvd)
427  * @notify              :
428  * @notify_rsvd         :
429  * @rebuild_rate        : rebuild rate (0% - 100%)
430  * @cache_flush_int     : cache flush interval in seconds
431  * @sense_alert         :
432  * @drive_insert_count  : drive insertion count
433  * @battery_status      :
434  * @num_ldrv            : no. of Log Drives configured
435  * @recon_state         : state of reconstruct
436  * @ldrv_op_status      : logdrv Status
437  * @ldrv_size           : size of each log drv
438  * @ldrv_prop           :
439  * @ldrv_state          : state of log drives
440  * @pdrv_state          : state of phys drvs.
441  * @pdrv_format         :
442  * @targ_xfer           : phys device transfer rate
443  * @pad1k               : 761 + 263reserved = 1024 bytes total size
444  */
445 #define MAX_NOTIFY_SIZE         0x80
446 #define CUR_NOTIFY_SIZE         sizeof(mraid_notify_t)
447
448 typedef struct {
449         uint32_t        data_size;
450
451         mraid_notify_t  notify;
452
453         uint8_t         notify_rsvd[MAX_NOTIFY_SIZE - CUR_NOTIFY_SIZE];
454
455         uint8_t         rebuild_rate;
456         uint8_t         cache_flush_int;
457         uint8_t         sense_alert;
458         uint8_t         drive_insert_count;
459
460         uint8_t         battery_status;
461         uint8_t         num_ldrv;
462         uint8_t         recon_state[MAX_LOGICAL_DRIVES_40LD / 8];
463         uint16_t        ldrv_op_status[MAX_LOGICAL_DRIVES_40LD / 8];
464
465         uint32_t        ldrv_size[MAX_LOGICAL_DRIVES_40LD];
466         uint8_t         ldrv_prop[MAX_LOGICAL_DRIVES_40LD];
467         uint8_t         ldrv_state[MAX_LOGICAL_DRIVES_40LD];
468         uint8_t         pdrv_state[FC_MAX_PHYSICAL_DEVICES];
469         uint16_t        pdrv_format[FC_MAX_PHYSICAL_DEVICES / 16];
470
471         uint8_t         targ_xfer[80];
472         uint8_t         pad1k[263];
473 } __attribute__ ((packed)) mraid_inquiry3_t;
474
475
476 /**
477  * mraid_adapinfo_t - information about the adapter
478  * @max_commands                : max concurrent commands supported
479  * @rebuild_rate                : rebuild rate - 0% thru 100%
480  * @max_targ_per_chan           : max targ per channel
481  * @nchannels                   : number of channels on HBA
482  * @fw_version                  : firmware version
483  * @age_of_flash                : number of times FW has been flashed
484  * @chip_set_value              : contents of 0xC0000832
485  * @dram_size                   : in MB
486  * @cache_flush_interval        : in seconds
487  * @bios_version                :
488  * @board_type                  :
489  * @sense_alert                 :
490  * @write_config_count          : increase with every configuration change
491  * @drive_inserted_count        : increase with every drive inserted
492  * @inserted_drive              : channel:Id of inserted drive
493  * @battery_status              : bit 0: battery module missing
494  *                              bit 1: VBAD
495  *                              bit 2: temperature high
496  *                              bit 3: battery pack missing
497  *                              bit 4,5:
498  *                                      00 - charge complete
499  *                                      01 - fast charge in progress
500  *                                      10 - fast charge fail
501  *                                      11 - undefined
502  *                              bit 6: counter > 1000
503  *                              bit 7: Undefined
504  * @dec_fault_bus_info          :
505  */
506 typedef struct {
507         uint8_t         max_commands;
508         uint8_t         rebuild_rate;
509         uint8_t         max_targ_per_chan;
510         uint8_t         nchannels;
511         uint8_t         fw_version[4];
512         uint16_t        age_of_flash;
513         uint8_t         chip_set_value;
514         uint8_t         dram_size;
515         uint8_t         cache_flush_interval;
516         uint8_t         bios_version[4];
517         uint8_t         board_type;
518         uint8_t         sense_alert;
519         uint8_t         write_config_count;
520         uint8_t         battery_status;
521         uint8_t         dec_fault_bus_info;
522 } __attribute__ ((packed)) mraid_adapinfo_t;
523
524
525 /**
526  * mraid_ldrv_info_t - information about the logical drives
527  * @nldrv       : Number of logical drives configured
528  * @rsvd        :
529  * @size        : size of each logical drive
530  * @prop        :
531  * @state       : state of each logical drive
532  */
533 typedef struct {
534         uint8_t         nldrv;
535         uint8_t         rsvd[3];
536         uint32_t        size[MAX_LOGICAL_DRIVES_8LD];
537         uint8_t         prop[MAX_LOGICAL_DRIVES_8LD];
538         uint8_t         state[MAX_LOGICAL_DRIVES_8LD];
539 } __attribute__ ((packed)) mraid_ldrv_info_t;
540
541
542 /**
543  * mraid_pdrv_info_t - information about the physical drives
544  * @pdrv_state  : state of each physical drive
545  */
546 typedef struct {
547         uint8_t         pdrv_state[MBOX_MAX_PHYSICAL_DRIVES];
548         uint8_t         rsvd;
549 } __attribute__ ((packed)) mraid_pdrv_info_t;
550
551
552 /**
553  * mraid_inquiry_t - RAID inquiry, mailbox command 0x05
554  * @mraid_adapinfo_t    : adapter information
555  * @mraid_ldrv_info_t   : logical drives information
556  * @mraid_pdrv_info_t   : physical drives information
557  */
558 typedef struct {
559         mraid_adapinfo_t        adapter_info;
560         mraid_ldrv_info_t       logdrv_info;
561         mraid_pdrv_info_t       pdrv_info;
562 } __attribute__ ((packed)) mraid_inquiry_t;
563
564
565 /**
566  * mraid_extinq_t - RAID extended inquiry, mailbox command 0x04
567  *
568  * @raid_inq            : raid inquiry
569  * @phys_drv_format     :
570  * @stack_attn          :
571  * @modem_status        :
572  * @rsvd                :
573  */
574 typedef struct {
575         mraid_inquiry_t raid_inq;
576         uint16_t        phys_drv_format[MAX_MBOX_CHANNELS];
577         uint8_t         stack_attn;
578         uint8_t         modem_status;
579         uint8_t         rsvd[2];
580 } __attribute__ ((packed)) mraid_extinq_t;
581
582
583 /**
584  * adap_device_t - device information
585  * @channel     : channel fpor the device
586  * @target      : target ID of the device
587  */
588 typedef struct {
589         uint8_t         channel;
590         uint8_t         target;
591 }__attribute__ ((packed)) adap_device_t;
592
593
594 /**
595  * adap_span_40ld_t - 40LD span
596  * @start_blk   : starting block
597  * @num_blks    : number of blocks
598  */
599 typedef struct {
600         uint32_t        start_blk;
601         uint32_t        num_blks;
602         adap_device_t   device[MAX_ROW_SIZE_40LD];
603 }__attribute__ ((packed)) adap_span_40ld_t;
604
605
606 /**
607  * adap_span_8ld_t - 8LD span
608  * @start_blk   : starting block
609  * @num_blks    : number of blocks
610  */
611 typedef struct {
612         uint32_t        start_blk;
613         uint32_t        num_blks;
614         adap_device_t   device[MAX_ROW_SIZE_8LD];
615 }__attribute__ ((packed)) adap_span_8ld_t;
616
617
618 /**
619  * logdrv_param_t - logical drives parameters
620  *
621  * @span_depth  : total number of spans
622  * @level       : RAID level
623  * @read_ahead  : read ahead, no read ahead, adaptive read ahead
624  * @stripe_sz   : encoded stripe size
625  * @status      : status of the logical drive
626  * @write_mode  : write mode, write_through/write_back
627  * @direct_io   : direct io or through cache
628  * @row_size    : number of stripes in a row
629  */
630 typedef struct {
631         uint8_t         span_depth;
632         uint8_t         level;
633         uint8_t         read_ahead;
634         uint8_t         stripe_sz;
635         uint8_t         status;
636         uint8_t         write_mode;
637         uint8_t         direct_io;
638         uint8_t         row_size;
639 } __attribute__ ((packed)) logdrv_param_t;
640
641
642 /**
643  * logdrv_40ld_t - logical drive definition for 40LD controllers
644  * @lparam      : logical drives parameters
645  * @span        : span
646  */
647 typedef struct {
648         logdrv_param_t          lparam;
649         adap_span_40ld_t        span[SPAN_DEPTH_8_SPANS];
650 }__attribute__ ((packed)) logdrv_40ld_t;
651
652
653 /**
654  * logdrv_8ld_span8_t - logical drive definition for 8LD controllers
655  * @lparam      : logical drives parameters
656  * @span        : span
657  *
658  * 8-LD logical drive with up to 8 spans
659  */
660 typedef struct {
661         logdrv_param_t  lparam;
662         adap_span_8ld_t span[SPAN_DEPTH_8_SPANS];
663 }__attribute__ ((packed)) logdrv_8ld_span8_t;
664
665
666 /**
667  * logdrv_8ld_span4_t - logical drive definition for 8LD controllers
668  * @lparam      : logical drives parameters
669  * @span        : span
670  *
671  * 8-LD logical drive with up to 4 spans
672  */
673 typedef struct {
674         logdrv_param_t  lparam;
675         adap_span_8ld_t span[SPAN_DEPTH_4_SPANS];
676 }__attribute__ ((packed)) logdrv_8ld_span4_t;
677
678
679 /**
680  * phys_drive_t - physical device information
681  * @type        : Type of the device
682  * @cur_status  : current status of the device
683  * @tag_depth   : Level of tagging
684  * @sync_neg    : sync negotiation - ENABLE or DISABLE
685  * @size        : configurable size in terms of 512 byte
686  */
687 typedef struct {
688         uint8_t         type;
689         uint8_t         cur_status;
690         uint8_t         tag_depth;
691         uint8_t         sync_neg;
692         uint32_t        size;
693 }__attribute__ ((packed)) phys_drive_t;
694
695
696 /**
697  * disk_array_40ld_t - disk array for 40LD controllers
698  * @numldrv     : number of logical drives
699  * @resvd       :
700  * @ldrv        : logical drives information
701  * @pdrv        : physical drives information
702  */
703 typedef struct {
704         uint8_t         numldrv;
705         uint8_t         resvd[3];
706         logdrv_40ld_t   ldrv[MAX_LOGICAL_DRIVES_40LD];
707         phys_drive_t    pdrv[MBOX_MAX_PHYSICAL_DRIVES];
708 }__attribute__ ((packed)) disk_array_40ld_t;
709
710
711 /**
712  * disk_array_8ld_span8_t - disk array for 8LD controllers
713  * @numldrv     : number of logical drives
714  * @resvd       :
715  * @ldrv        : logical drives information
716  * @pdrv        : physical drives information
717  *
718  * Disk array for 8LD logical drives with up to 8 spans
719  */
720 typedef struct {
721         uint8_t                 numldrv;
722         uint8_t                 resvd[3];
723         logdrv_8ld_span8_t      ldrv[MAX_LOGICAL_DRIVES_8LD];
724         phys_drive_t            pdrv[MBOX_MAX_PHYSICAL_DRIVES];
725 }__attribute__ ((packed)) disk_array_8ld_span8_t;
726
727
728 /**
729  * disk_array_8ld_span4_t - disk array for 8LD controllers
730  * @numldrv     : number of logical drives
731  * @resvd       :
732  * @ldrv        : logical drives information
733  * @pdrv        : physical drives information
734  *
735  * Disk array for 8LD logical drives with up to 4 spans
736  */
737 typedef struct {
738         uint8_t                 numldrv;
739         uint8_t                 resvd[3];
740         logdrv_8ld_span4_t      ldrv[MAX_LOGICAL_DRIVES_8LD];
741         phys_drive_t            pdrv[MBOX_MAX_PHYSICAL_DRIVES];
742 }__attribute__ ((packed)) disk_array_8ld_span4_t;
743
744
745 /**
746  * struct private_bios_data - bios private data for boot devices
747  * @geometry    : bits 0-3 - BIOS geometry, 0x0001 - 1GB, 0x0010 - 2GB,
748  *              0x1000 - 8GB, Others values are invalid
749  * @unused      : bits 4-7 are unused
750  * @boot_drv    : logical drive set as boot drive, 0..7 - for 8LD cards,
751  *              0..39 - for 40LD cards
752  * @cksum       : 0-(sum of first 13 bytes of this structure)
753  */
754 struct private_bios_data {
755         uint8_t         geometry        :4;
756         uint8_t         unused          :4;
757         uint8_t         boot_drv;
758         uint8_t         rsvd[12];
759         uint16_t        cksum;
760 } __attribute__ ((packed));
761
762
763 /**
764  * mbox_sgl64 - 64-bit scatter list for mailbox based controllers
765  * @address     : address of the buffer
766  * @length      : data transfer length
767  */
768 typedef struct {
769         uint64_t        address;
770         uint32_t        length;
771 } __attribute__ ((packed)) mbox_sgl64;
772
773 /**
774  * mbox_sgl32 - 32-bit scatter list for mailbox based controllers
775  * @address     : address of the buffer
776  * @length      : data transfer length
777  */
778 typedef struct {
779         uint32_t        address;
780         uint32_t        length;
781 } __attribute__ ((packed)) mbox_sgl32;
782
783 #endif          // _MRAID_MBOX_DEFS_H_