3 * Linux MegaRAID Unified device driver
5 * Copyright (c) 2003-2004 LSI Logic Corporation.
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.
15 #ifndef _MRAID_MBOX_DEFS_H_
16 #define _MRAID_MBOX_DEFS_H_
18 #include <linux/types.h>
21 * Commands and states for mailbox based controllers
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
34 #define MAIN_MISC_OPCODE 0xA4
35 #define GET_MAX_SG_SUPPORT 0x01
36 #define SUPPORT_EXT_CDB 0x16
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
49 * Command for random deletion of logical drives
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
59 #define IS_BIOS_ENABLED 0x62
61 #define CHNL_CLASS 0xA9
62 #define GET_CHNL_CLASS 0x00
63 #define SET_CHNL_CLASS 0x01
66 #define BIOS_PVT_DATA 0x40
67 #define GET_BIOS_PVT_DATA 0x00
71 * Commands to support clustering
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
86 * Module battery status
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
99 * Physical drive states.
102 #define PDRV_ONLINE 3
103 #define PDRV_FAILED 4
105 #define PDRV_HOTSPARE 6
109 * Raid logical drive states.
111 #define RDRV_OFFLINE 0
112 #define RDRV_DEGRADED 1
113 #define RDRV_OPTIMAL 2
114 #define RDRV_DELETED 3
117 * Read, write and cache policies
119 #define NO_READ_AHEAD 0
121 #define ADAP_READ_AHEAD 2
122 #define WRMODE_WRITE_THRU 0
123 #define WRMODE_WRITE_BACK 1
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
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
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
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.
161 #define MBOX_MAX_FIRMWARE_STATUS 46
174 uint8_t completed
[MBOX_MAX_FIRMWARE_STATUS
];
177 } __attribute__ ((packed
)) mbox_t
;
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
187 * This is the extension of the 32-bit mailbox to be able to perform DMA
188 * beyond 4GB address range.
191 uint32_t xferaddr_lo
;
192 uint32_t xferaddr_hi
;
194 } __attribute__ ((packed
)) mbox64_t
;
197 * mailbox structure used for internal commands
210 } __attribute__ ((packed
)) int_mbox_t
;
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
221 * @queueaction : unused
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.
235 uint8_t islogical
:1;
244 uint8_t reqsensearea
[MAX_REQ_SENSE_LEN
];
247 uint32_t dataxferaddr
;
248 uint32_t dataxferlen
;
249 } __attribute__ ((packed
)) mraid_passthru_t
;
253 uint32_t dataxferaddr_lo
;
254 uint32_t dataxferaddr_hi
;
255 mraid_passthru_t pthru32
;
257 } __attribute__ ((packed
)) mega_passthru64_t
;
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
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
271 * @queueaction : unused
272 * @cdblen : length of the CDB
273 * @rsvd3 : reserved field
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.
289 uint8_t islogical
:1;
301 uint8_t reqsensearea
[MAX_REQ_SENSE_LEN
];
303 uint32_t dataxferaddr
;
304 uint32_t dataxferlen
;
305 } __attribute__ ((packed
)) mraid_epassthru_t
;
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
320 * @dram_size : In terms of MB
321 * @subsysid : device PCI subsystem ID
322 * @subsysvid : device PCI subsystem vendor ID
324 * @pad1k : 135 + 889 resvd = 1024 total size
326 * This structures holds the information about the controller which is not
327 * expected to change dynamically.
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
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
;
342 uint8_t fc_loop_present
;
348 uint8_t notify_counters
;
350 } __attribute__ ((packed
)) mraid_pinfo_t
;
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
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
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 :
391 uint32_t global_counter
;
392 uint8_t param_counter
;
395 uint8_t write_config_counter
;
396 uint8_t write_config_rsvd
[3];
397 uint8_t ldrv_op_counter
;
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
;
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
;
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
;
429 * mraid_inquiry3_t - enquiry for device information
431 * @data_size : current size in bytes (not including resvd)
434 * @rebuild_rate : rebuild rate (0% - 100%)
435 * @cache_flush_int : cache flush interval in seconds
437 * @drive_insert_count : drive insertion count
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
444 * @ldrv_state : state of log drives
445 * @pdrv_state : state of phys drvs.
447 * @targ_xfer : phys device transfer rate
448 * @pad1k : 761 + 263reserved = 1024 bytes total size
450 #define MAX_NOTIFY_SIZE 0x80
451 #define CUR_NOTIFY_SIZE sizeof(mraid_notify_t)
456 mraid_notify_t notify
;
458 uint8_t notify_rsvd
[MAX_NOTIFY_SIZE
- CUR_NOTIFY_SIZE
];
460 uint8_t rebuild_rate
;
461 uint8_t cache_flush_int
;
463 uint8_t drive_insert_count
;
465 uint8_t battery_status
;
467 uint8_t recon_state
[MAX_LOGICAL_DRIVES_40LD
/ 8];
468 uint16_t ldrv_op_status
[MAX_LOGICAL_DRIVES_40LD
/ 8];
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];
476 uint8_t targ_xfer
[80];
478 } __attribute__ ((packed
)) mraid_inquiry3_t
;
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
491 * @cache_flush_interval : in seconds
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
500 * bit 2: temprature high
501 * bit 3: battery pack missing
503 * 00 - charge complete
504 * 01 - fast charge in progress
505 * 10 - fast charge fail
507 * bit 6: counter > 1000
509 * @dec_fault_bus_info :
512 uint8_t max_commands
;
513 uint8_t rebuild_rate
;
514 uint8_t max_targ_per_chan
;
516 uint8_t fw_version
[4];
517 uint16_t age_of_flash
;
518 uint8_t chip_set_value
;
520 uint8_t cache_flush_interval
;
521 uint8_t bios_version
[4];
524 uint8_t write_config_count
;
525 uint8_t battery_status
;
526 uint8_t dec_fault_bus_info
;
527 } __attribute__ ((packed
)) mraid_adapinfo_t
;
531 * mraid_ldrv_info_t - information about the logical drives
532 * @nldrv : Number of logical drives configured
534 * @size : size of each logical drive
536 * @state : state of each logical drive
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
;
548 * mraid_pdrv_info_t - information about the physical drives
549 * @pdrv_state : state of each physical drive
552 uint8_t pdrv_state
[MBOX_MAX_PHYSICAL_DRIVES
];
554 } __attribute__ ((packed
)) mraid_pdrv_info_t
;
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
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
;
571 * mraid_extinq_t - RAID extended inquiry, mailbox command 0x04
573 * @raid_inq : raid inquiry
580 mraid_inquiry_t raid_inq
;
581 uint16_t phys_drv_format
[MAX_MBOX_CHANNELS
];
583 uint8_t modem_status
;
585 } __attribute__ ((packed
)) mraid_extinq_t
;
589 * adap_device_t - device information
590 * @channel : channel fpor the device
591 * @target : target ID of the device
596 }__attribute__ ((packed
)) adap_device_t
;
600 * adap_span_40ld_t - 40LD span
601 * @start_blk : starting block
602 * @num_blks : number of blocks
607 adap_device_t device
[MAX_ROW_SIZE_40LD
];
608 }__attribute__ ((packed
)) adap_span_40ld_t
;
612 * adap_span_8ld_t - 8LD span
613 * @start_blk : starting block
614 * @num_blks : number of blocks
619 adap_device_t device
[MAX_ROW_SIZE_8LD
];
620 }__attribute__ ((packed
)) adap_span_8ld_t
;
624 * logdrv_param_t - logical drives parameters
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
644 } __attribute__ ((packed
)) logdrv_param_t
;
648 * logdrv_40ld_t - logical drive definition for 40LD controllers
649 * @lparam : logical drives parameters
653 logdrv_param_t lparam
;
654 adap_span_40ld_t span
[SPAN_DEPTH_8_SPANS
];
655 }__attribute__ ((packed
)) logdrv_40ld_t
;
659 * logdrv_8ld_span8_t - logical drive definition for 8LD controllers
660 * @lparam : logical drives parameters
663 * 8-LD logical drive with upto 8 spans
666 logdrv_param_t lparam
;
667 adap_span_8ld_t span
[SPAN_DEPTH_8_SPANS
];
668 }__attribute__ ((packed
)) logdrv_8ld_span8_t
;
672 * logdrv_8ld_span4_t - logical drive definition for 8LD controllers
673 * @lparam : logical drives parameters
676 * 8-LD logical drive with upto 4 spans
679 logdrv_param_t lparam
;
680 adap_span_8ld_t span
[SPAN_DEPTH_4_SPANS
];
681 }__attribute__ ((packed
)) logdrv_8ld_span4_t
;
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
698 }__attribute__ ((packed
)) phys_drive_t
;
702 * disk_array_40ld_t - disk array for 40LD controllers
703 * @numldrv : number of logical drives
705 * @ldrv : logical drives information
706 * @pdrv : physical drives information
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
;
717 * disk_array_8ld_span8_t - disk array for 8LD controllers
718 * @numldrv : number of logical drives
720 * @ldrv : logical drives information
721 * @pdrv : physical drives information
723 * Disk array for 8LD logical drives with upto 8 spans
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
;
734 * disk_array_8ld_span4_t - disk array for 8LD controllers
735 * @numldrv : number of logical drives
737 * @ldrv : logical drives information
738 * @pdrv : physical drives information
740 * Disk array for 8LD logical drives with upto 4 spans
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
;
751 * 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)
759 struct private_bios_data
{
765 } __attribute__ ((packed
));
769 * mbox_sgl64 - 64-bit scatter list for mailbox based controllers
770 * @address : address of the buffer
771 * @length : data transfer length
776 } __attribute__ ((packed
)) mbox_sgl64
;
779 * mbox_sgl32 - 32-bit scatter list for mailbox based controllers
780 * @address : address of the buffer
781 * @length : data transfer length
786 } __attribute__ ((packed
)) mbox_sgl32
;
788 #endif // _MRAID_MBOX_DEFS_H_
790 /* vim: set ts=8 sw=8 tw=78: */