#ifndef _PCI_MLYREG_H_
#define _PCI_MLYREG_H_
struct mly_sg_entry {
u_int64_t physaddr;
u_int64_t length;
} __packed;
#define MLY_MAX_CHANNELS 6
#define MLY_MAX_TARGETS 16
#define MLY_MAX_LUNS 1
#define MLY_DEVICE_STATE_OFFLINE 0x08
#define MLY_DEVICE_STATE_UNCONFIGURED 0x00
#define MLY_DEVICE_STATE_ONLINE 0x01
#define MLY_DEVICE_STATE_CRITICAL 0x09
#define MLY_DEVICE_STATE_WRITEONLY 0x03
#define MLY_DEVICE_STATE_STANDBY 0x21
#define MLY_DEVICE_STATE_MISSING 0x04
#define MLY_DEVICE_TYPE_RAID0 0x0
#define MLY_DEVICE_TYPE_RAID1 0x1
#define MLY_DEVICE_TYPE_RAID3 0x3
#define MLY_DEVICE_TYPE_RAID5 0x5
#define MLY_DEVICE_TYPE_RAID6 0x6
#define MLY_DEVICE_TYPE_RAID7 0x7
#define MLY_DEVICE_TYPE_NEWSPAN 0x8
#define MLY_DEVICE_TYPE_RAID3F 0x9
#define MLY_DEVICE_TYPE_RAID3L 0xb
#define MLY_DEVICE_TYPE_SPAN 0xc
#define MLY_DEVICE_TYPE_RAID5L 0xd
#define MLY_DEVICE_TYPE_RAIDE 0xe
#define MLY_DEVICE_TYPE_PHYSICAL 0xf
#define MLY_STRIPE_ZERO 0x0
#define MLY_STRIPE_512b 0x1
#define MLY_STRIPE_1k 0x2
#define MLY_STRIPE_2k 0x3
#define MLY_STRIPE_4k 0x4
#define MLY_STRIPE_8k 0x5
#define MLY_STRIPE_16k 0x6
#define MLY_STRIPE_32k 0x7
#define MLY_STRIPE_64k 0x8
#define MLY_STRIPE_128k 0x9
#define MLY_STRIPE_256k 0xa
#define MLY_STRIPE_512k 0xb
#define MLY_STRIPE_1m 0xc
#define MLY_CACHELINE_ZERO 0x0
#define MLY_CACHELINE_512b 0x1
#define MLY_CACHELINE_1k 0x2
#define MLY_CACHELINE_2k 0x3
#define MLY_CACHELINE_4k 0x4
#define MLY_CACHELINE_8k 0x5
#define MLY_CACHELINE_16k 0x6
#define MLY_CACHELINE_32k 0x7
#define MLY_CACHELINE_64k 0x8
#define MLY_RWCtl_INITTED (1<<7)
#define MLY_RWCtl_WCD (0)
#define MLY_RWCtl_WDISABLE (1<<3)
#define MLY_RWCtl_WCE (2<<3)
#define MLY_RWCtl_IWCE (3<<3)
#define MLY_RWCtl_RCD (0)
#define MLY_RWCtl_RCE (1)
#define MLY_RWCtl_RAHEAD (2)
#define MLY_RWCtl_IRAHEAD (3)
struct mly_lun_map {
u_int8_t res1:4;
u_int8_t host_port_mapped:1;
u_int8_t tid_valid:1;
u_int8_t hid_valid:1;
u_int8_t lun_valid:1;
u_int8_t res2;
u_int8_t lun;
u_int8_t tid;
u_int8_t hid[32];
} __packed;
struct mly_param_controller {
u_int8_t rdahen:1;
u_int8_t bilodly:1;
u_int8_t fua_disable:1;
u_int8_t reass1s:1;
u_int8_t truvrfy:1;
u_int8_t dwtvrfy:1;
u_int8_t background_initialisation:1;
u_int8_t clustering:1;
u_int8_t bios_disable:1;
u_int8_t boot_from_cdrom:1;
u_int8_t drive_coercion:1;
u_int8_t write_same_disable:1;
u_int8_t hba_mode:1;
u_int8_t bios_geometry:2;
#define MLY_BIOSGEOM_2G 0x0
#define MLY_BIOSGEOM_8G 0x1
u_int8_t res1:1;
u_int8_t res2[2];
u_int8_t v_dec:1;
u_int8_t safte:1;
u_int8_t ses:1;
u_int8_t res3:2;
u_int8_t v_arm:1;
u_int8_t v_ofm:1;
u_int8_t res4:1;
u_int8_t rebuild_check_rate;
u_int8_t cache_line_size;
u_int8_t oem_code;
#define MLY_OEM_MYLEX 0x00
#define MLY_OEM_IBM 0x08
#define MLY_OEM_HP 0x0a
#define MLY_OEM_DEC 0x0c
#define MLY_OEM_SIEMENS 0x10
#define MLY_OEM_INTEL 0x12
u_int8_t spinup_mode;
#define MLY_SPIN_AUTO 0
#define MLY_SPIN_PWRSPIN 1
#define MLY_SPIN_WSSUSPIN 2
u_int8_t spinup_devices;
u_int8_t spinup_interval;
u_int8_t spinup_wait_time;
u_int8_t res5:3;
u_int8_t vutursns:1;
u_int8_t dccfil:1;
u_int8_t nopause:1;
u_int8_t disqfull:1;
u_int8_t disbusy:1;
u_int8_t res6:2;
u_int8_t failover_node_name;
u_int8_t res7:1;
u_int8_t ftopo:3;
u_int8_t disable_ups:1;
u_int8_t res8:1;
u_int8_t propagate_reset:1;
u_int8_t nonstd_mp_reset:1;
u_int8_t res9:5;
u_int8_t res10;
u_int8_t serial_port_baud_rate;
u_int8_t serial_port_control;
u_int8_t change_stripe_ok_developer_flag_only;
u_int8_t small_large_host_transfers:2;
u_int8_t frame_control:2;
u_int8_t pci_latency_control:2;
u_int8_t treat_lip_as_reset:1;
u_int8_t res11:1;
u_int8_t ms_autorest:1;
u_int8_t res12:7;
u_int8_t ms_aa_fsim:1;
u_int8_t ms_aa_ccach:1;
u_int8_t ms_aa_fault_signals:1;
u_int8_t ms_aa_c4_faults:1;
u_int8_t ms_aa_host_reset_delay_mask:4;
u_int8_t ms_flg_simplex_no_rstcom:1;
u_int8_t res13:7;
u_int8_t res14;
u_int8_t hardloopid[2][2];
u_int8_t ctrlname[2][16+1];
u_int8_t initiator_id;
u_int8_t startup_option;
#define MLY_STARTUP_IF_NO_CHANGE 0x0
#define MLY_STARTUP_IF_NO_LUN_CHANGE 0x1
#define MLY_STARTUP_IF_NO_LUN_OFFLINE 0x2
#define MLY_STARTUP_IF_LUN0_NO_CHANGE 0x3
#define MLY_STARTUP_IF_LUN0_NOT_OFFLINE 0x4
#define MLY_STARTUP_ALWAYS 0x5
u_int8_t res15[62];
} __packed;
struct mly_param_physical_device {
u_int16_t tags;
u_int16_t speed;
u_int8_t width;
u_int8_t combing:1;
u_int8_t res1:7;
u_int8_t res2[3];
} __packed;
struct mly_param_logical_device {
u_int8_t type;
u_int8_t state;
u_int16_t raid_device;
u_int8_t res1;
u_int8_t bios_geometry;
u_int8_t stripe_size;
u_int8_t read_write_control;
u_int8_t res2[8];
} __packed;
struct mly_health_status {
u_int32_t uptime_us;
u_int32_t uptime_ms;
u_int32_t realtime;
u_int32_t res1;
u_int32_t change_counter;
u_int32_t res2;
u_int32_t debug_message_index;
u_int32_t bios_message_index;
u_int32_t trace_page;
u_int32_t profiler_page;
u_int32_t next_event;
u_int8_t res3[4 + 16 + 64];
} __packed;
#define MLY_TIMEOUT_SECONDS 0x00
#define MLY_TIMEOUT_MINUTES 0x40
#define MLY_TIMEOUT_HOURS 0x80
#define MLY_OPDEVICE_PHYSICAL_DEVICE 0x0
#define MLY_OPDEVICE_RAID_DEVICE 0x1
#define MLY_OPDEVICE_PHYSICAL_CHANNEL 0x2
#define MLY_OPDEVICE_RAID_CHANNEL 0x3
#define MLY_OPDEVICE_PHYSICAL_CONTROLLER 0x4
#define MLY_OPDEVICE_RAID_CONTROLLER 0x5
#define MLY_OPDEVICE_CONFIGURATION_GROUP 0x10
struct mly_status {
u_int16_t command_id;
u_int8_t status;
u_int8_t sense_length;
int32_t residue;
} __packed;
#define MLY_CMDCTL_FORCE_UNIT_ACCESS 0x01
#define MLY_CMDCTL_DISABLE_PAGE_OUT 0x02
#define MLY_CMDCTL_EXTENDED_SG_TABLE 0x08
#define MLY_CMDCTL_DATA_DIRECTION 0x10
#define MLY_CMDCTL_NO_AUTO_SENSE 0x40
#define MLY_CMDCTL_DISABLE_DISCONNECT 0x80
#define MDACMD_MEMCOPY 0x1
#define MDACMD_SCSIPT 0x2
#define MDACMD_SCSILCPT 0x3
#define MDACMD_SCSI 0x4
#define MDACMD_SCSILC 0x5
#define MDACMD_IOCTL 0x20
#define MDACMD_IOCTLCHECK 0x23
#define MDACIOCTL_GETCONTROLLERINFO 0x1
#define MDACIOCTL_GETLOGDEVINFOVALID 0x3
#define MDACIOCTL_GETPHYSDEVINFOVALID 0x5
#define MDACIOCTL_GETCONTROLLERSTATISTICS 0xb
#define MDACIOCTL_GETLOGDEVSTATISTICS 0xd
#define MDACIOCTL_GETPHYSDEVSTATISTICS 0xf
#define MDACIOCTL_GETHEALTHSTATUS 0x11
#define MDACIOCTL_GETEVENT 0x15
#define MDACIOCTL_STOREIMAGE 0x2c
#define MDACIOCTL_READIMAGE 0x2d
#define MDACIOCTL_FLASHIMAGES 0x2e
#define MDACIOCTL_GET_SUBSYSTEM_DATA 0x70
#define MDACIOCTL_SET_SUBSYSTEM_DATA 0x71
#define MDACIOCTL_STARTDISOCVERY 0x81
#define MDACIOCTL_SETRAIDDEVSTATE 0x82
#define MDACIOCTL_INITPHYSDEVSTART 0x84
#define MDACIOCTL_INITPHYSDEVSTOP 0x85
#define MDACIOCTL_INITRAIDDEVSTART 0x86
#define MDACIOCTL_INITRAIDDEVSTOP 0x87
#define MDACIOCTL_REBUILDRAIDDEVSTART 0x88
#define MDACIOCTL_REBUILDRAIDDEVSTOP 0x89
#define MDACIOCTL_MAKECONSISTENTDATASTART 0x8a
#define MDACIOCTL_MAKECONSISTENTDATASTOP 0x8b
#define MDACIOCTL_CONSISTENCYCHECKSTART 0x8c
#define MDACIOCTL_CONSISTENCYCHECKSTOP 0x8d
#define MDACIOCTL_SETMEMORYMAILBOX 0x8e
#define MDACIOCTL_RESETDEVICE 0x90
#define MDACIOCTL_FLUSHDEVICEDATA 0x91
#define MDACIOCTL_PAUSEDEVICE 0x92
#define MDACIOCTL_UNPAUSEDEVICE 0x93
#define MDACIOCTL_LOCATEDEVICE 0x94
#define MDACIOCTL_SETMASTERSLAVEMODE 0x95
#define MDACIOCTL_SETREALTIMECLOCK 0xac
#define MDACIOCTL_CREATENEWCONF 0xc0
#define MDACIOCTL_DELETERAIDDEV 0xc1
#define MDACIOCTL_REPLACEINTERNALDEV 0xc2
#define MDACIOCTL_RENAMERAIDDEV 0xc3
#define MDACIOCTL_ADDNEWCONF 0xc4
#define MDACIOCTL_XLATEPHYSDEVTORAIDDEV 0xc5
#define MDACIOCTL_MORE 0xc6
#define MDACIOCTL_SETPHYSDEVPARAMETER 0xc8
#define MDACIOCTL_GETPHYSDEVPARAMETER 0xc9
#define MDACIOCTL_CLEARCONF 0xca
#define MDACIOCTL_GETDEVCONFINFO 0xcb
#define MDACIOCTL_GETGROUPCONFINFO 0xcc
#define MDACIOCTL_GETFREESPACELIST 0xcd
#define MDACIOCTL_GETLOGDEVPARAMETER 0xce
#define MDACIOCTL_SETLOGDEVPARAMETER 0xcf
#define MDACIOCTL_GETCONTROLLERPARAMETER 0xd0
#define MDACIOCTL_SETCONTRLLERPARAMETER 0xd1
#define MDACIOCTL_CLEARCONFSUSPMODE 0xd2
#define MDACIOCTL_GETBDT_FOR_SYSDRIVE 0xe0
struct mly_short_transfer {
struct mly_sg_entry sg[2];
} __packed;
struct mly_sg_transfer {
u_int16_t entries[3];
u_int16_t res1;
u_int64_t table_physaddr[3];
} __packed;
union mly_cmd_transfer {
struct mly_short_transfer direct;
struct mly_sg_transfer indirect;
};
struct mly_ioctl_param_data {
u_int8_t param[10];
union mly_cmd_transfer transfer;
} __packed;
struct mly_ioctl_param_setmemorymailbox {
u_int8_t health_buffer_size;
u_int8_t res1;
u_int64_t health_buffer_physaddr;
u_int64_t command_mailbox_physaddr;
u_int64_t status_mailbox_physaddr;
u_int64_t res2[2];
} __packed;
struct mly_ioctl_getcontrollerinfo {
u_int8_t res1;
u_int8_t interface_type;
u_int8_t controller_type;
u_int8_t res2;
u_int16_t interface_speed;
u_int8_t interface_width;
u_int8_t res3[9];
char interface_name[16];
char controller_name[16];
u_int8_t res4[16];
u_int8_t fw_major;
u_int8_t fw_minor;
u_int8_t fw_turn;
u_int8_t fw_build;
u_int8_t fw_day;
u_int8_t fw_month;
u_int8_t fw_century;
u_int8_t fw_year;
u_int8_t hw_revision;
u_int8_t res5[3];
u_int8_t hw_release_day;
u_int8_t hw_release_month;
u_int8_t hw_release_century;
u_int8_t hw_release_year;
u_int8_t batch_number;
u_int8_t res6;
u_int8_t plant_number;
u_int8_t res7;
u_int8_t hw_manuf_day;
u_int8_t hw_manuf_month;
u_int8_t hw_manuf_century;
u_int8_t hw_manuf_year;
u_int8_t max_pdd_per_xldd;
u_int8_t max_ildd_per_xldd;
u_int16_t nvram_size;
u_int8_t max_number_of_xld;
u_int8_t res8[3];
char serial_number[16];
u_int8_t res9[16];
u_int8_t res10[3];
u_int8_t oem_information;
char vendor_name[16];
u_int8_t bbu_present:1;
u_int8_t active_clustering:1;
u_int8_t res11:6;
u_int8_t res12[3];
u_int8_t physical_scan_active:1;
u_int8_t res13:7;
u_int8_t physical_scan_channel;
u_int8_t physical_scan_target;
u_int8_t physical_scan_lun;
u_int16_t maximum_block_count;
u_int16_t maximum_sg_entries;
u_int16_t logical_devices_present;
u_int16_t logical_devices_critical;
u_int16_t logical_devices_offline;
u_int16_t physical_devices_present;
u_int16_t physical_disks_present;
u_int16_t physical_disks_critical;
u_int16_t physical_disks_offline;
u_int16_t maximum_parallel_commands;
u_int8_t physical_channels_present;
u_int8_t virtual_channels_present;
u_int8_t physical_channels_possible;
u_int8_t virtual_channels_possible;
u_int8_t maximum_targets_possible[16];
u_int8_t res14[12];
u_int16_t memory_size;
u_int16_t cache_size;
u_int32_t valid_cache_size;
u_int32_t dirty_cache_size;
u_int16_t memory_speed;
u_int8_t memory_width;
u_int8_t memory_type:5;
u_int8_t res15:1;
u_int8_t memory_parity:1;
u_int8_t memory_ecc:1;
char memory_information[16];
u_int16_t exmemory_size;
u_int16_t l2cache_size;
u_int8_t res16[8];
u_int16_t exmemory_speed;
u_int8_t exmemory_width;
u_int8_t exmemory_type:5;
u_int8_t res17:1;
u_int8_t exmemory_parity:1;
u_int8_t exmemory_ecc:1;
char exmemory_name[16];
struct {
u_int16_t speed;
u_int8_t type;
u_int8_t number;
u_int8_t res1[12];
char name[16];
} cpu[2] __packed;
u_int16_t profiling_page;
u_int16_t profiling_programs;
u_int16_t time_trace_page;
u_int16_t time_trace_programs;
u_int8_t res18[8];
u_int16_t physical_device_bus_resets;
u_int16_t physical_device_parity_errors;
u_int16_t physical_device_soft_errors;
u_int16_t physical_device_commands_failed;
u_int16_t physical_device_miscellaneous_errors;
u_int16_t physical_device_command_timeouts;
u_int16_t physical_device_selection_timeouts;
u_int16_t physical_device_retries;
u_int16_t physical_device_aborts;
u_int16_t physical_device_host_command_aborts;
u_int16_t physical_device_PFAs_detected;
u_int16_t physical_device_host_commands_failed;
u_int8_t res19[8];
u_int16_t logical_device_soft_errors;
u_int16_t logical_device_commands_failed;
u_int16_t logical_device_host_command_aborts;
u_int16_t res20;
u_int16_t controller_parity_ecc_errors;
u_int16_t controller_host_command_aborts;
u_int8_t res21[4];
u_int16_t background_inits_active;
u_int16_t logical_inits_active;
u_int16_t physical_inits_active;
u_int16_t consistency_checks_active;
u_int16_t rebuilds_active;
u_int16_t MORE_active;
u_int16_t patrol_active;
u_int8_t long_operation_status;
u_int8_t res22;
u_int8_t flash_type;
u_int8_t res23;
u_int16_t flash_size;
u_int32_t flash_maximum_age;
u_int32_t flash_age;
u_int8_t res24[4];
char flash_name[16];
u_int8_t rebuild_rate;
u_int8_t background_init_rate;
u_int8_t init_rate;
u_int8_t consistency_check_rate;
u_int8_t res25[4];
u_int32_t maximum_dp;
u_int32_t free_dp;
u_int32_t maximum_iop;
u_int32_t free_iop;
u_int16_t maximum_comb_length;
u_int16_t maximum_configuration_groups;
u_int8_t installation_abort:1;
u_int8_t maintenance:1;
u_int8_t res26:6;
u_int8_t res27[3];
u_int8_t res28[32 + 512];
} __packed;
struct mly_ioctl_getlogdevinfovalid {
u_int8_t res1;
u_int8_t channel;
u_int8_t target;
u_int8_t lun;
u_int8_t state;
u_int8_t raid_level;
u_int8_t stripe_size;
u_int8_t cache_line_size;
u_int8_t read_write_control;
u_int8_t consistency_check:1;
u_int8_t rebuild:1;
u_int8_t make_consistent:1;
u_int8_t initialisation:1;
u_int8_t migration:1;
u_int8_t patrol:1;
u_int8_t res2:2;
u_int8_t ar5_limit;
u_int8_t ar5_algo;
u_int16_t logical_device_number;
u_int16_t bios_control;
u_int16_t soft_errors;
u_int16_t commands_failed;
u_int16_t host_command_aborts;
u_int16_t deferred_write_errors;
u_int8_t res3[8];
u_int8_t res4[2];
u_int16_t device_block_size;
u_int32_t original_device_size;
u_int32_t device_size;
u_int8_t res5[4];
char device_name[32];
u_int8_t inquiry[36];
u_int8_t res6[12];
u_int64_t last_read_block;
u_int64_t last_written_block;
u_int64_t consistency_check_block;
u_int64_t rebuild_block;
u_int64_t make_consistent_block;
u_int64_t initialisation_block;
u_int64_t migration_block;
u_int64_t patrol_block;
u_int8_t res7[64];
} __packed;
struct mly_ioctl_getphysdevinfovalid {
u_int8_t res1;
u_int8_t channel;
u_int8_t target;
u_int8_t lun;
u_int8_t raid_ft:1;
u_int8_t res2:1;
u_int8_t local:1;
u_int8_t res3:5;
u_int8_t host_dead:1;
u_int8_t host_connection_dead:1;
u_int8_t res4:6;
u_int8_t state;
u_int8_t width;
u_int16_t speed;
u_int8_t ports_available;
u_int8_t ports_inuse;
u_int8_t res5[4];
u_int8_t ether_address[16];
u_int16_t command_tags;
u_int8_t consistency_check:1;
u_int8_t rebuild:1;
u_int8_t make_consistent:1;
u_int8_t initialisation:1;
u_int8_t migration:1;
u_int8_t patrol:1;
u_int8_t res6:2;
u_int8_t long_operation_status;
u_int8_t parity_errors;
u_int8_t soft_errors;
u_int8_t hard_errors;
u_int8_t miscellaneous_errors;
u_int8_t command_timeouts;
u_int8_t retries;
u_int8_t aborts;
u_int8_t PFAs_detected;
u_int8_t res7[6];
u_int16_t block_size;
u_int32_t original_device_size;
u_int32_t device_size;
u_int8_t res8[4];
char name[16];
u_int8_t res9[16 + 32];
u_int8_t inquiry[36];
u_int8_t res10[12 + 16];
u_int64_t last_read_block;
u_int64_t last_written_block;
u_int64_t consistency_check_block;
u_int64_t rebuild_block;
u_int64_t make_consistent_block;
u_int64_t initialisation_block;
u_int64_t migration_block;
u_int64_t patrol_block;
u_int8_t res11[256];
} __packed;
union mly_devinfo {
struct mly_ioctl_getlogdevinfovalid logdev;
struct mly_ioctl_getphysdevinfovalid physdev;
};
struct mly_ioctl_getdevstatistics {
u_int32_t uptime_ms;
u_int8_t res1[5];
u_int8_t channel;
u_int8_t target;
u_int8_t lun;
u_int16_t raid_device;
u_int8_t res2[2];
u_int32_t total_reads;
u_int32_t total_writes;
u_int32_t total_read_size;
u_int32_t total_write_size;
u_int32_t cache_reads;
u_int32_t cache_writes;
u_int32_t cache_read_size;
u_int32_t cache_write_size;
u_int32_t command_waits_done;
u_int16_t active_commands;
u_int16_t waiting_commands;
u_int8_t res3[8];
} __packed;
struct mly_ioctl_getcontrollerstatistics {
u_int32_t uptime_ms;
u_int8_t res1[12];
u_int32_t target_physical_device_interrupts;
u_int32_t target_physical_device_stray_interrupts;
u_int8_t res2[8];
u_int32_t target_physical_device_reads;
u_int32_t target_physical_device_writes;
u_int32_t target_physical_device_read_size;
u_int32_t target_physical_device_write_size;
u_int32_t host_system_interrupts;
u_int32_t host_system_stray_interrupts;
u_int32_t host_system_sent_interrupts;
u_int8_t res3[4];
u_int32_t physical_device_reads;
u_int32_t physical_device_writes;
u_int32_t physical_device_read_size;
u_int32_t physical_device_write_size;
u_int32_t physical_device_cache_reads;
u_int32_t physical_device_cache_writes;
u_int32_t physical_device_cache_read_size;
u_int32_t physical_device_cache_write_size;
u_int32_t logical_device_reads;
u_int32_t logical_device_writes;
u_int32_t logical_device_read_size;
u_int32_t logical_device_write_size;
u_int32_t logical_device_cache_reads;
u_int32_t logical_device_cache_writes;
u_int32_t logical_device_cache_read_size;
u_int32_t logical_device_cache_write_size;
u_int16_t target_physical_device_commands_active;
u_int16_t target_physical_device_commands_waiting;
u_int16_t host_system_commands_active;
u_int16_t host_system_commands_waiting;
u_int8_t res4[48 + 64];
} __packed;
struct mly_ioctl_param_setraiddevstate {
u_int8_t state;
} __packed;
#define MLY_MAX_BDT_ENTRIES 1022
struct mly_ioctl_getbdt_for_sysdrive {
u_int32_t num_of_bdt_entries;
u_int32_t bad_data_block_address[MLY_MAX_BDT_ENTRIES];
} __packed;
struct mly_pdd {
u_int8_t type;
u_int8_t state;
u_int16_t raid_device;
u_int32_t device_size;
u_int8_t controller;
u_int8_t channel;
u_int8_t target;
u_int8_t lun;
u_int32_t start_address;
} __packed;
struct mly_udd {
u_int8_t res1;
u_int8_t state;
u_int16_t raid_device;
u_int32_t start_address;
} __packed;
struct mly_ldd {
u_int8_t type;
u_int8_t state;
u_int16_t raid_device;
u_int32_t device_size;
u_int8_t devices_used_count;
u_int8_t stripe_size;
u_int8_t cache_line_size;
u_int8_t read_write_control;
u_int32_t devices_used_size;
u_int16_t devices_used[32];
} __packed;
struct mly_devconf_hdr {
u_int8_t type;
u_int8_t state;
u_int16_t raid_device;
};
union mly_ioctl_devconfinfo {
struct mly_pdd pdd;
struct mly_udd udd;
struct mly_ldd ldd;
struct mly_devconf_hdr hdr;
};
struct mly_ioctl_param_renameraiddev {
u_int8_t new_raid_device;
} __packed;
struct mly_ioctl_param_xlatephysdevtoraiddev {
u_int16_t raid_device;
u_int8_t res1[2];
u_int8_t controller;
u_int8_t channel;
u_int8_t target;
u_int8_t lun;
} __packed;
struct mly_ioctl_param_getgroupconfinfo {
u_int16_t group;
u_int8_t res1[8];
union mly_cmd_transfer transfer;
} __packed;
struct mly_ioctl_getfreespacelist_entry {
u_int16_t raid_device;
u_int8_t res1[6];
u_int32_t address;
u_int32_t size;
} __packed;
struct mly_ioctl_getfrespacelist {
u_int16_t returned_entries;
u_int16_t total_entries;
u_int8_t res1[12];
struct mly_ioctl_getfreespacelist_entry space[];
} __packed;
struct mly_ioctl_param_subsystemdata {
u_int8_t operation:4;
#define MLY_BBU_GETSTATUS 0x00
#define MLY_BBU_SET_THRESHOLD 0x00
u_int8_t subsystem:4;
#define MLY_SUBSYSTEM_BBU 0x01
u_int parameter[3];
} __packed;
struct mly_ioctl_getsubsystemdata_bbustatus {
u_int16_t current_power;
u_int16_t maximum_power;
u_int16_t power_threshold;
u_int8_t charge_level;
u_int8_t hardware_version;
u_int8_t battery_type;
#define MLY_BBU_TYPE_UNKNOWN 0x00
#define MLY_BBU_TYPE_NICAD 0x01
#define MLY_BBU_TYPE_MISSING 0xfe
u_int8_t res1;
u_int8_t operation_status;
#define MLY_BBU_STATUS_NO_SYNC 0x01
#define MLY_BBU_STATUS_OUT_OF_SYNC 0x02
#define MLY_BBU_STATUS_FIRST_WARNING 0x04
#define MLY_BBU_STATUS_SECOND_WARNING 0x08
#define MLY_BBU_STATUS_RECONDITIONING 0x10
#define MLY_BBU_STATUS_DISCHARGING 0x20
#define MLY_BBU_STATUS_FASTCHARGING 0x40
u_int8_t res2;
} __packed;
struct mly_ioctl_param_deviceoperation {
u_int8_t operation_device;
} __packed;
struct mly_event {
u_int32_t sequence_number;
u_int32_t timestamp;
u_int32_t code;
u_int8_t controller;
u_int8_t channel;
u_int8_t target;
u_int8_t lun;
u_int8_t res1[4];
u_int32_t param;
u_int8_t sense[40];
} __packed;
struct mly_ioctl_param_getevent {
u_int16_t sequence_number_low;
u_int8_t res1[8];
union mly_cmd_transfer transfer;
} __packed;
union mly_ioctl_param {
struct mly_ioctl_param_data data;
struct mly_ioctl_param_setmemorymailbox setmemorymailbox;
struct mly_ioctl_param_setraiddevstate setraiddevstate;
struct mly_ioctl_param_renameraiddev renameraiddev;
struct mly_ioctl_param_xlatephysdevtoraiddev xlatephysdevtoraiddev;
struct mly_ioctl_param_getgroupconfinfo getgroupconfinfo;
struct mly_ioctl_param_subsystemdata subsystemdata;
struct mly_ioctl_param_deviceoperation deviceoperation;
struct mly_ioctl_param_getevent getevent;
};
#define MLY_PHYADDR(c, b, t, l) \
((l) | ((t) << 8) | ((b) << 16) | ((c) << 19))
#define MLY_LOGADDR(c, u) \
((u) | ((c) << 19))
#define MLY_LOGADDR_DEV(a) (a & 0xffff)
#define MLY_LOGADDR_CTLR(a) (a >> 19)
#define MLY_PHYADDR_LUN(a) (a & 0xff)
#define MLY_PHYADDR_TARGET(a) ((a >> 8) & 0xff)
#define MLY_PHYADDR_CHANNEL(a) ((a >> 16) & 0x07)
#define MLY_PHYADDR_CTLR(a) ((a >> 19) & 0x1f)
struct mly_cmd_generic {
u_int16_t command_id;
u_int8_t opcode;
u_int8_t command_control;
u_int32_t data_size;
u_int64_t sense_buffer_address;
u_int8_t addr[3];
u_int8_t timeout;
u_int8_t maximum_sense_size;
u_int8_t res1[11];
union mly_cmd_transfer transfer;
} __packed;
#define MLY_CMD_SCSI_SMALL_CDB 10
struct mly_cmd_scsi_small {
u_int16_t command_id;
u_int8_t opcode;
u_int8_t command_control;
u_int32_t data_size;
u_int64_t sense_buffer_address;
u_int8_t addr[3];
u_int8_t timeout;
u_int8_t maximum_sense_size;
u_int8_t cdb_length;
u_int8_t cdb[MLY_CMD_SCSI_SMALL_CDB];
union mly_cmd_transfer transfer;
} __packed;
struct mly_cmd_scsi_large {
u_int16_t command_id;
u_int8_t opcode;
u_int8_t command_control;
u_int32_t data_size;
u_int64_t sense_buffer_address;
u_int8_t addr[3];
u_int8_t timeout;
u_int8_t maximum_sense_size;
u_int8_t cdb_length;
u_int16_t res1;
u_int64_t cdb_physaddr;
union mly_cmd_transfer transfer;
} __packed;
struct mly_cmd_ioctl {
u_int16_t command_id;
u_int8_t opcode;
u_int8_t command_control;
u_int32_t data_size;
u_int64_t sense_buffer_address;
u_int8_t addr[3];
u_int8_t timeout;
u_int8_t maximum_sense_size;
u_int8_t sub_ioctl;
union mly_ioctl_param param;
} __packed;
struct mly_cmd_mmbox {
u_int32_t flag;
u_int8_t data[60];
} __packed;
union mly_cmd_packet {
struct mly_cmd_generic generic;
struct mly_cmd_scsi_small scsi_small;
struct mly_cmd_scsi_large scsi_large;
struct mly_cmd_ioctl ioctl;
struct mly_cmd_mmbox mmbox;
};
#define MLY_I960RX_COMMAND_MAILBOX 0x10
#define MLY_I960RX_STATUS_MAILBOX 0x18
#define MLY_I960RX_IDBR 0x20
#define MLY_I960RX_ODBR 0x2c
#define MLY_I960RX_ERROR_STATUS 0x2e
#define MLY_I960RX_INTERRUPT_STATUS 0x30
#define MLY_I960RX_INTERRUPT_MASK 0x34
#define MLY_STRONGARM_COMMAND_MAILBOX 0x50
#define MLY_STRONGARM_STATUS_MAILBOX 0x58
#define MLY_STRONGARM_IDBR 0x60
#define MLY_STRONGARM_ODBR 0x61
#define MLY_STRONGARM_ERROR_STATUS 0x63
#define MLY_STRONGARM_INTERRUPT_STATUS 0x30
#define MLY_STRONGARM_INTERRUPT_MASK 0x34
#define MLY_HM_CMDSENT (1<<0)
#define MLY_HM_STSACK (1<<1)
#define MLY_SOFT_RST (1<<3)
#define MLY_AM_CMDSENT (1<<4)
#define MLY_HM_STSREADY (1<<0)
#define MLY_AM_STSREADY (1<<1)
#define MLY_MSG_EMPTY (1<<3)
#define MLY_MSG_SPINUP 0x08
#define MLY_MSG_RACE_RECOVERY_FAIL 0x60
#define MLY_MSG_RACE_IN_PROGRESS 0x70
#define MLY_MSG_RACE_ON_CRITICAL 0xb0
#define MLY_MSG_PARITY_ERROR 0xf0
#define MLY_INTERRUPT_MASK_DISABLE 0xff
#define MLY_INTERRUPT_MASK_ENABLE (0xff & ~(1<<2))
union mly_status_packet {
struct mly_status status;
struct {
u_int32_t flag;
u_int8_t data[4];
} __packed mmbox;
};
union mly_health_region {
struct mly_health_status status;
u_int8_t pad[1024];
};
#define MLY_MMBOX_COMMANDS 64
#define MLY_MMBOX_STATUS 512
struct mly_mmbox {
union mly_cmd_packet mmm_command[MLY_MMBOX_COMMANDS];
union mly_status_packet mmm_status[MLY_MMBOX_STATUS];
union mly_health_region mmm_health;
} __packed;
#endif