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