1021 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2#ifndef __MEGARAID_H__3#define __MEGARAID_H__4 5#include <linux/spinlock.h>6#include <linux/mutex.h>7#include <scsi/scsi_cmnd.h>8 9#define MEGARAID_VERSION \10 "v2.00.4 (Release Date: Thu Feb 9 08:51:30 EST 2006)\n"11 12/*13 * Driver features - change the values to enable or disable features in the14 * driver.15 */16 17/*18 * Command coalescing - This feature allows the driver to be able to combine19 * two or more commands and issue as one command in order to boost I/O20 * performance. Useful if the nature of the I/O is sequential. It is not very21 * useful for random natured I/Os.22 */23#define MEGA_HAVE_COALESCING 024 25/*26 * Clustering support - Set this flag if you are planning to use the27 * clustering services provided by the megaraid controllers and planning to28 * setup a cluster29 */30#define MEGA_HAVE_CLUSTERING 131 32/*33 * Driver statistics - Set this flag if you are interested in statics about34 * number of I/O completed on each logical drive and how many interrupts35 * generated. If enabled, this information is available through /proc36 * interface and through the private ioctl. Setting this flag has a37 * performance penalty.38 */39#define MEGA_HAVE_STATS 040 41/*42 * Enhanced /proc interface - This feature will allow you to have a more43 * detailed /proc interface for megaraid driver. E.g., a real time update of44 * the status of the logical drives, battery status, physical drives etc.45 */46#define MEGA_HAVE_ENH_PROC 147 48#define MAX_DEV_TYPE 3249 50#define PCI_DEVICE_ID_DISCOVERY 0x000E51#define PCI_DEVICE_ID_PERC4_DI 0x000F52#define PCI_DEVICE_ID_PERC4_QC_VERDE 0x040753 54#define HBA_SIGNATURE 0x334455#define HBA_SIGNATURE_471 0xCCCC56#define HBA_SIGNATURE_64BIT 0x029957 58#define MBOX_BUSY_WAIT 10 /* wait for up to 10 usec for59 mailbox to be free */60#define DEFAULT_INITIATOR_ID 761 62#define MAX_SGLIST 64 /* max supported in f/w */63#define MIN_SGLIST 26 /* guaranteed to support these many */64#define MAX_COMMANDS 12665#define CMDID_INT_CMDS MAX_COMMANDS+1 /* make sure CMDID_INT_CMDS66 is less than max commands67 supported by any f/w */68 69#define MAX_CDB_LEN 1070#define MAX_EXT_CDB_LEN 16 /* we support cdb length up to 16 */71 72#define DEF_CMD_PER_LUN 6373#define MAX_CMD_PER_LUN MAX_COMMANDS74#define MAX_FIRMWARE_STATUS 4675#define MAX_XFER_PER_CMD (64*1024)76#define MAX_SECTORS_PER_IO 12877 78#define MAX_LOGICAL_DRIVES_40LD 4079#define FC_MAX_PHYSICAL_DEVICES 25680#define MAX_LOGICAL_DRIVES_8LD 881#define MAX_CHANNELS 582#define MAX_TARGET 1583#define MAX_PHYSICAL_DRIVES MAX_CHANNELS*MAX_TARGET84#define MAX_ROW_SIZE_40LD 3285#define MAX_ROW_SIZE_8LD 886#define MAX_SPAN_DEPTH 887 88#define NVIRT_CHAN 4 /* # of virtual channels to represent89 up to 60 logical drives */90struct mbox_out {91 /* 0x0 */ u8 cmd;92 /* 0x1 */ u8 cmdid;93 /* 0x2 */ u16 numsectors;94 /* 0x4 */ u32 lba;95 /* 0x8 */ u32 xferaddr;96 /* 0xC */ u8 logdrv;97 /* 0xD */ u8 numsgelements;98 /* 0xE */ u8 resvd;99} __attribute__ ((packed));100 101struct mbox_in {102 /* 0xF */ volatile u8 busy;103 /* 0x10 */ volatile u8 numstatus;104 /* 0x11 */ volatile u8 status;105 /* 0x12 */ volatile u8 completed[MAX_FIRMWARE_STATUS];106 volatile u8 poll;107 volatile u8 ack;108} __attribute__ ((packed));109 110typedef struct {111 struct mbox_out m_out;112 struct mbox_in m_in;113} __attribute__ ((packed)) mbox_t;114 115typedef struct {116 u32 xfer_segment_lo;117 u32 xfer_segment_hi;118 mbox_t mbox;119} __attribute__ ((packed)) mbox64_t;120 121 122/*123 * Passthru definitions124 */125#define MAX_REQ_SENSE_LEN 0x20126 127typedef struct {128 u8 timeout:3; /* 0=6sec/1=60sec/2=10min/3=3hrs */129 u8 ars:1;130 u8 reserved:3;131 u8 islogical:1;132 u8 logdrv; /* if islogical == 1 */133 u8 channel; /* if islogical == 0 */134 u8 target; /* if islogical == 0 */135 u8 queuetag; /* unused */136 u8 queueaction; /* unused */137 u8 cdb[MAX_CDB_LEN];138 u8 cdblen;139 u8 reqsenselen;140 u8 reqsensearea[MAX_REQ_SENSE_LEN];141 u8 numsgelements;142 u8 scsistatus;143 u32 dataxferaddr;144 u32 dataxferlen;145} __attribute__ ((packed)) mega_passthru;146 147 148/*149 * Extended passthru: support CDB > 10 bytes150 */151typedef struct {152 u8 timeout:3; /* 0=6sec/1=60sec/2=10min/3=3hrs */153 u8 ars:1;154 u8 rsvd1:1;155 u8 cd_rom:1;156 u8 rsvd2:1;157 u8 islogical:1;158 u8 logdrv; /* if islogical == 1 */159 u8 channel; /* if islogical == 0 */160 u8 target; /* if islogical == 0 */161 u8 queuetag; /* unused */162 u8 queueaction; /* unused */163 u8 cdblen;164 u8 rsvd3;165 u8 cdb[MAX_EXT_CDB_LEN];166 u8 numsgelements;167 u8 status;168 u8 reqsenselen;169 u8 reqsensearea[MAX_REQ_SENSE_LEN];170 u8 rsvd4;171 u32 dataxferaddr;172 u32 dataxferlen;173} __attribute__ ((packed)) mega_ext_passthru;174 175typedef struct {176 u64 address;177 u32 length;178} __attribute__ ((packed)) mega_sgl64;179 180typedef struct {181 u32 address;182 u32 length;183} __attribute__ ((packed)) mega_sglist;184 185 186/* Queued command data */187typedef struct {188 int idx;189 u32 state;190 struct list_head list;191 u8 raw_mbox[66];192 u32 dma_type;193 u32 dma_direction;194 195 struct scsi_cmnd *cmd;196 dma_addr_t dma_h_bulkdata;197 dma_addr_t dma_h_sgdata;198 199 mega_sglist *sgl;200 mega_sgl64 *sgl64;201 dma_addr_t sgl_dma_addr;202 203 mega_passthru *pthru;204 dma_addr_t pthru_dma_addr;205 mega_ext_passthru *epthru;206 dma_addr_t epthru_dma_addr;207} scb_t;208 209/*210 * Flags to follow the scb as it transitions between various stages211 */212#define SCB_FREE 0x0000 /* on the free list */213#define SCB_ACTIVE 0x0001 /* off the free list */214#define SCB_PENDQ 0x0002 /* on the pending queue */215#define SCB_ISSUED 0x0004 /* issued - owner f/w */216#define SCB_ABORT 0x0008 /* Got an abort for this one */217#define SCB_RESET 0x0010 /* Got a reset for this one */218 219/*220 * Utilities declare this strcture size as 1024 bytes. So more fields can221 * be added in future.222 */223typedef struct {224 u32 data_size; /* current size in bytes (not including resvd) */225 226 u32 config_signature;227 /* Current value is 0x00282008228 * 0x28=MAX_LOGICAL_DRIVES,229 * 0x20=Number of stripes and230 * 0x08=Number of spans */231 232 u8 fw_version[16]; /* printable ASCI string */233 u8 bios_version[16]; /* printable ASCI string */234 u8 product_name[80]; /* printable ASCI string */235 236 u8 max_commands; /* Max. concurrent commands supported */237 u8 nchannels; /* Number of SCSI Channels detected */238 u8 fc_loop_present; /* Number of Fibre Loops detected */239 u8 mem_type; /* EDO, FPM, SDRAM etc */240 241 u32 signature;242 u16 dram_size; /* In terms of MB */243 u16 subsysid;244 245 u16 subsysvid;246 u8 notify_counters;247 u8 pad1k[889]; /* 135 + 889 resvd = 1024 total size */248} __attribute__ ((packed)) mega_product_info;249 250struct notify {251 u32 global_counter; /* Any change increments this counter */252 253 u8 param_counter; /* Indicates any params changed */254 u8 param_id; /* Param modified - defined below */255 u16 param_val; /* New val of last param modified */256 257 u8 write_config_counter; /* write config occurred */258 u8 write_config_rsvd[3];259 260 u8 ldrv_op_counter; /* Indicates ldrv op started/completed */261 u8 ldrv_opid; /* ldrv num */262 u8 ldrv_opcmd; /* ldrv operation - defined below */263 u8 ldrv_opstatus; /* status of the operation */264 265 u8 ldrv_state_counter; /* Indicates change of ldrv state */266 u8 ldrv_state_id; /* ldrv num */267 u8 ldrv_state_new; /* New state */268 u8 ldrv_state_old; /* old state */269 270 u8 pdrv_state_counter; /* Indicates change of ldrv state */271 u8 pdrv_state_id; /* pdrv id */272 u8 pdrv_state_new; /* New state */273 u8 pdrv_state_old; /* old state */274 275 u8 pdrv_fmt_counter; /* Indicates pdrv format started/over */276 u8 pdrv_fmt_id; /* pdrv id */277 u8 pdrv_fmt_val; /* format started/over */278 u8 pdrv_fmt_rsvd;279 280 u8 targ_xfer_counter; /* Indicates SCSI-2 Xfer rate change */281 u8 targ_xfer_id; /* pdrv Id */282 u8 targ_xfer_val; /* new Xfer params of last pdrv */283 u8 targ_xfer_rsvd;284 285 u8 fcloop_id_chg_counter; /* Indicates loopid changed */286 u8 fcloopid_pdrvid; /* pdrv id */287 u8 fcloop_id0; /* loopid on fc loop 0 */288 u8 fcloop_id1; /* loopid on fc loop 1 */289 290 u8 fcloop_state_counter; /* Indicates loop state changed */291 u8 fcloop_state0; /* state of fc loop 0 */292 u8 fcloop_state1; /* state of fc loop 1 */293 u8 fcloop_state_rsvd;294} __attribute__ ((packed));295 296#define MAX_NOTIFY_SIZE 0x80297#define CUR_NOTIFY_SIZE sizeof(struct notify)298 299typedef struct {300 u32 data_size; /* current size in bytes (not including resvd) */301 302 struct notify notify;303 304 u8 notify_rsvd[MAX_NOTIFY_SIZE - CUR_NOTIFY_SIZE];305 306 u8 rebuild_rate; /* Rebuild rate (0% - 100%) */307 u8 cache_flush_interval; /* In terms of Seconds */308 u8 sense_alert;309 u8 drive_insert_count; /* drive insertion count */310 311 u8 battery_status;312 u8 num_ldrv; /* No. of Log Drives configured */313 u8 recon_state[MAX_LOGICAL_DRIVES_40LD / 8]; /* State of314 reconstruct */315 u16 ldrv_op_status[MAX_LOGICAL_DRIVES_40LD / 8]; /* logdrv316 Status */317 318 u32 ldrv_size[MAX_LOGICAL_DRIVES_40LD];/* Size of each log drv */319 u8 ldrv_prop[MAX_LOGICAL_DRIVES_40LD];320 u8 ldrv_state[MAX_LOGICAL_DRIVES_40LD];/* State of log drives */321 u8 pdrv_state[FC_MAX_PHYSICAL_DEVICES];/* State of phys drvs. */322 u16 pdrv_format[FC_MAX_PHYSICAL_DEVICES / 16];323 324 u8 targ_xfer[80]; /* phys device transfer rate */325 u8 pad1k[263]; /* 761 + 263reserved = 1024 bytes total size */326} __attribute__ ((packed)) mega_inquiry3;327 328 329/* Structures */330typedef struct {331 u8 max_commands; /* Max concurrent commands supported */332 u8 rebuild_rate; /* Rebuild rate - 0% thru 100% */333 u8 max_targ_per_chan; /* Max targ per channel */334 u8 nchannels; /* Number of channels on HBA */335 u8 fw_version[4]; /* Firmware version */336 u16 age_of_flash; /* Number of times FW has been flashed */337 u8 chip_set_value; /* Contents of 0xC0000832 */338 u8 dram_size; /* In MB */339 u8 cache_flush_interval; /* in seconds */340 u8 bios_version[4];341 u8 board_type;342 u8 sense_alert;343 u8 write_config_count; /* Increase with every configuration344 change */345 u8 drive_inserted_count; /* Increase with every drive inserted346 */347 u8 inserted_drive; /* Channel:Id of inserted drive */348 u8 battery_status; /*349 * BIT 0: battery module missing350 * BIT 1: VBAD351 * BIT 2: temperature high352 * BIT 3: battery pack missing353 * BIT 4,5:354 * 00 - charge complete355 * 01 - fast charge in progress356 * 10 - fast charge fail357 * 11 - undefined358 * Bit 6: counter > 1000359 * Bit 7: Undefined360 */361 u8 dec_fault_bus_info;362} __attribute__ ((packed)) mega_adp_info;363 364 365typedef struct {366 u8 num_ldrv; /* Number of logical drives configured */367 u8 rsvd[3];368 u32 ldrv_size[MAX_LOGICAL_DRIVES_8LD];369 u8 ldrv_prop[MAX_LOGICAL_DRIVES_8LD];370 u8 ldrv_state[MAX_LOGICAL_DRIVES_8LD];371} __attribute__ ((packed)) mega_ldrv_info;372 373typedef struct {374 u8 pdrv_state[MAX_PHYSICAL_DRIVES];375 u8 rsvd;376} __attribute__ ((packed)) mega_pdrv_info;377 378/* RAID inquiry: Mailbox command 0x05*/379typedef struct {380 mega_adp_info adapter_info;381 mega_ldrv_info logdrv_info;382 mega_pdrv_info pdrv_info;383} __attribute__ ((packed)) mraid_inquiry;384 385 386/* RAID extended inquiry: Mailbox command 0x04*/387typedef struct {388 mraid_inquiry raid_inq;389 u16 phys_drv_format[MAX_CHANNELS];390 u8 stack_attn;391 u8 modem_status;392 u8 rsvd[2];393} __attribute__ ((packed)) mraid_ext_inquiry;394 395 396typedef struct {397 u8 channel;398 u8 target;399}__attribute__ ((packed)) adp_device;400 401typedef struct {402 u32 start_blk; /* starting block */403 u32 num_blks; /* # of blocks */404 adp_device device[MAX_ROW_SIZE_40LD];405}__attribute__ ((packed)) adp_span_40ld;406 407typedef struct {408 u32 start_blk; /* starting block */409 u32 num_blks; /* # of blocks */410 adp_device device[MAX_ROW_SIZE_8LD];411}__attribute__ ((packed)) adp_span_8ld;412 413typedef struct {414 u8 span_depth; /* Total # of spans */415 u8 level; /* RAID level */416 u8 read_ahead; /* read ahead, no read ahead, adaptive read417 ahead */418 u8 stripe_sz; /* Encoded stripe size */419 u8 status; /* Status of the logical drive */420 u8 write_mode; /* write mode, write_through/write_back */421 u8 direct_io; /* direct io or through cache */422 u8 row_size; /* Number of stripes in a row */423} __attribute__ ((packed)) logdrv_param;424 425typedef struct {426 logdrv_param lparam;427 adp_span_40ld span[MAX_SPAN_DEPTH];428}__attribute__ ((packed)) logdrv_40ld;429 430typedef struct {431 logdrv_param lparam;432 adp_span_8ld span[MAX_SPAN_DEPTH];433}__attribute__ ((packed)) logdrv_8ld;434 435typedef struct {436 u8 type; /* Type of the device */437 u8 cur_status; /* current status of the device */438 u8 tag_depth; /* Level of tagging */439 u8 sync_neg; /* sync negotiation - ENABLE or DISABLE */440 u32 size; /* configurable size in terms of 512 byte441 blocks */442}__attribute__ ((packed)) phys_drv;443 444typedef struct {445 u8 nlog_drives; /* number of logical drives */446 u8 resvd[3];447 logdrv_40ld ldrv[MAX_LOGICAL_DRIVES_40LD];448 phys_drv pdrv[MAX_PHYSICAL_DRIVES];449}__attribute__ ((packed)) disk_array_40ld;450 451typedef struct {452 u8 nlog_drives; /* number of logical drives */453 u8 resvd[3];454 logdrv_8ld ldrv[MAX_LOGICAL_DRIVES_8LD];455 phys_drv pdrv[MAX_PHYSICAL_DRIVES];456}__attribute__ ((packed)) disk_array_8ld;457 458 459/*460 * User ioctl structure.461 * This structure will be used for Traditional Method ioctl interface462 * commands (0x80),Alternate Buffer Method (0x81) ioctl commands and the463 * Driver ioctls.464 * The Driver ioctl interface handles the commands at the driver level,465 * without being sent to the card.466 */467/* system call imposed limit. Change accordingly */468#define IOCTL_MAX_DATALEN 4096469 470struct uioctl_t {471 u32 inlen;472 u32 outlen;473 union {474 u8 fca[16];475 struct {476 u8 opcode;477 u8 subopcode;478 u16 adapno;479#if BITS_PER_LONG == 32480 u8 *buffer;481 u8 pad[4];482#endif483#if BITS_PER_LONG == 64484 u8 *buffer;485#endif486 u32 length;487 } __attribute__ ((packed)) fcs;488 } __attribute__ ((packed)) ui;489 u8 mbox[18]; /* 16 bytes + 2 status bytes */490 mega_passthru pthru;491#if BITS_PER_LONG == 32492 char __user *data; /* buffer <= 4096 for 0x80 commands */493 char pad[4];494#endif495#if BITS_PER_LONG == 64496 char __user *data;497#endif498} __attribute__ ((packed));499 500/*501 * struct mcontroller is used to pass information about the controllers in the502 * system. Its up to the application how to use the information. We are passing503 * as much info about the cards as possible and useful. Before issuing the504 * call to find information about the cards, the application needs to issue a505 * ioctl first to find out the number of controllers in the system.506 */507#define MAX_CONTROLLERS 32508 509struct mcontroller {510 u64 base;511 u8 irq;512 u8 numldrv;513 u8 pcibus;514 u16 pcidev;515 u8 pcifun;516 u16 pciid;517 u16 pcivendor;518 u8 pcislot;519 u32 uid;520};521 522/*523 * mailbox structure used for internal commands524 */525typedef struct {526 u8 cmd;527 u8 cmdid;528 u8 opcode;529 u8 subopcode;530 u32 lba;531 u32 xferaddr;532 u8 logdrv;533 u8 rsvd[3];534 u8 numstatus;535 u8 status;536} __attribute__ ((packed)) megacmd_t;537 538/*539 * Defines for Driver IOCTL interface540 */541#define MEGAIOC_MAGIC 'm'542 543#define MEGAIOC_QNADAP 'm' /* Query # of adapters */544#define MEGAIOC_QDRVRVER 'e' /* Query driver version */545#define MEGAIOC_QADAPINFO 'g' /* Query adapter information */546#define MKADAP(adapno) (MEGAIOC_MAGIC << 8 | (adapno) )547#define GETADAP(mkadap) ( (mkadap) ^ MEGAIOC_MAGIC << 8 )548 549/*550 * Definition for the new ioctl interface (NIT)551 */552 553/*554 * Vendor specific Group-7 commands555 */556#define VENDOR_SPECIFIC_COMMANDS 0xE0557#define MEGA_INTERNAL_CMD VENDOR_SPECIFIC_COMMANDS + 0x01558 559/*560 * The ioctl command. No other command shall be used for this interface561 */562#define USCSICMD VENDOR_SPECIFIC_COMMANDS563 564/*565 * Data direction flags566 */567#define UIOC_RD 0x00001568#define UIOC_WR 0x00002569 570/*571 * ioctl opcodes572 */573#define MBOX_CMD 0x00000 /* DCMD or passthru command */574#define GET_DRIVER_VER 0x10000 /* Get driver version */575#define GET_N_ADAP 0x20000 /* Get number of adapters */576#define GET_ADAP_INFO 0x30000 /* Get information about a adapter */577#define GET_CAP 0x40000 /* Get ioctl capabilities */578#define GET_STATS 0x50000 /* Get statistics, including error info */579 580 581/*582 * The ioctl structure.583 * MBOX macro converts a nitioctl_t structure to megacmd_t pointer and584 * MBOX_P macro converts a nitioctl_t pointer to megacmd_t pointer.585 */586typedef struct {587 char signature[8]; /* Must contain "MEGANIT" */588 u32 opcode; /* opcode for the command */589 u32 adapno; /* adapter number */590 union {591 u8 __raw_mbox[18];592 void __user *__uaddr; /* xferaddr for non-mbox cmds */593 }__ua;594 595#define uioc_rmbox __ua.__raw_mbox596#define MBOX(uioc) ((megacmd_t *)&((uioc).__ua.__raw_mbox[0]))597#define MBOX_P(uioc) ((megacmd_t __user *)&((uioc)->__ua.__raw_mbox[0]))598#define uioc_uaddr __ua.__uaddr599 600 u32 xferlen; /* xferlen for DCMD and non-mbox601 commands */602 u32 flags; /* data direction flags */603}nitioctl_t;604 605 606/*607 * I/O statistics for some applications like SNMP agent. The caller must608 * provide the number of logical drives for which status should be reported.609 */610typedef struct {611 int num_ldrv; /* Number for logical drives for which the612 status should be reported. */613 u32 nreads[MAX_LOGICAL_DRIVES_40LD]; /* number of reads for614 each logical drive */615 u32 nreadblocks[MAX_LOGICAL_DRIVES_40LD]; /* number of blocks616 read for each logical617 drive */618 u32 nwrites[MAX_LOGICAL_DRIVES_40LD]; /* number of writes619 for each logical620 drive */621 u32 nwriteblocks[MAX_LOGICAL_DRIVES_40LD]; /* number of blocks622 writes for each623 logical drive */624 u32 rd_errors[MAX_LOGICAL_DRIVES_40LD]; /* number of read625 errors for each626 logical drive */627 u32 wr_errors[MAX_LOGICAL_DRIVES_40LD]; /* number of write628 errors for each629 logical drive */630}megastat_t;631 632 633struct private_bios_data {634 u8 geometry:4; /*635 * bits 0-3 - BIOS geometry636 * 0x0001 - 1GB637 * 0x0010 - 2GB638 * 0x1000 - 8GB639 * Others values are invalid640 */641 u8 unused:4; /* bits 4-7 are unused */642 u8 boot_drv; /*643 * logical drive set as boot drive644 * 0..7 - for 8LD cards645 * 0..39 - for 40LD cards646 */647 u8 rsvd[12];648 u16 cksum; /* 0-(sum of first 13 bytes of this structure) */649} __attribute__ ((packed));650 651 652 653 654/*655 * Mailbox and firmware commands and subopcodes used in this driver.656 */657 658#define MEGA_MBOXCMD_LREAD 0x01659#define MEGA_MBOXCMD_LWRITE 0x02660#define MEGA_MBOXCMD_PASSTHRU 0x03661#define MEGA_MBOXCMD_ADPEXTINQ 0x04662#define MEGA_MBOXCMD_ADAPTERINQ 0x05663#define MEGA_MBOXCMD_LREAD64 0xA7664#define MEGA_MBOXCMD_LWRITE64 0xA8665#define MEGA_MBOXCMD_PASSTHRU64 0xC3666#define MEGA_MBOXCMD_EXTPTHRU 0xE3667 668#define MAIN_MISC_OPCODE 0xA4 /* f/w misc opcode */669#define GET_MAX_SG_SUPPORT 0x01 /* get max sg len supported by f/w */670 671#define FC_NEW_CONFIG 0xA1672#define NC_SUBOP_PRODUCT_INFO 0x0E673#define NC_SUBOP_ENQUIRY3 0x0F674#define ENQ3_GET_SOLICITED_FULL 0x02675#define OP_DCMD_READ_CONFIG 0x04676#define NEW_READ_CONFIG_8LD 0x67677#define READ_CONFIG_8LD 0x07678#define FLUSH_ADAPTER 0x0A679#define FLUSH_SYSTEM 0xFE680 681/*682 * Command for random deletion of logical drives683 */684#define FC_DEL_LOGDRV 0xA4 /* f/w command */685#define OP_SUP_DEL_LOGDRV 0x2A /* is feature supported */686#define OP_GET_LDID_MAP 0x18 /* get ldid and logdrv number map */687#define OP_DEL_LOGDRV 0x1C /* delete logical drive */688 689/*690 * BIOS commands691 */692#define IS_BIOS_ENABLED 0x62693#define GET_BIOS 0x01694#define CHNL_CLASS 0xA9695#define GET_CHNL_CLASS 0x00696#define SET_CHNL_CLASS 0x01697#define CH_RAID 0x01698#define CH_SCSI 0x00699#define BIOS_PVT_DATA 0x40700#define GET_BIOS_PVT_DATA 0x00701 702 703/*704 * Commands to support clustering705 */706#define MEGA_GET_TARGET_ID 0x7D707#define MEGA_CLUSTER_OP 0x70708#define MEGA_GET_CLUSTER_MODE 0x02709#define MEGA_CLUSTER_CMD 0x6E710#define MEGA_RESERVE_LD 0x01711#define MEGA_RELEASE_LD 0x02712#define MEGA_RESET_RESERVATIONS 0x03713#define MEGA_RESERVATION_STATUS 0x04714#define MEGA_RESERVE_PD 0x05715#define MEGA_RELEASE_PD 0x06716 717 718/*719 * Module battery status720 */721#define MEGA_BATT_MODULE_MISSING 0x01722#define MEGA_BATT_LOW_VOLTAGE 0x02723#define MEGA_BATT_TEMP_HIGH 0x04724#define MEGA_BATT_PACK_MISSING 0x08725#define MEGA_BATT_CHARGE_MASK 0x30726#define MEGA_BATT_CHARGE_DONE 0x00727#define MEGA_BATT_CHARGE_INPROG 0x10728#define MEGA_BATT_CHARGE_FAIL 0x20729#define MEGA_BATT_CYCLES_EXCEEDED 0x40730 731/*732 * Physical drive states.733 */734#define PDRV_UNCNF 0735#define PDRV_ONLINE 3736#define PDRV_FAILED 4737#define PDRV_RBLD 5738#define PDRV_HOTSPARE 6739 740 741/*742 * Raid logical drive states.743 */744#define RDRV_OFFLINE 0745#define RDRV_DEGRADED 1746#define RDRV_OPTIMAL 2747#define RDRV_DELETED 3748 749/*750 * Read, write and cache policies751 */752#define NO_READ_AHEAD 0753#define READ_AHEAD 1754#define ADAP_READ_AHEAD 2755#define WRMODE_WRITE_THRU 0756#define WRMODE_WRITE_BACK 1757#define CACHED_IO 0758#define DIRECT_IO 1759 760struct megaraid_cmd_priv {761 struct list_head entry;762};763 764#define SCSI_LIST(scp) \765 (&((struct megaraid_cmd_priv *)scsi_cmd_priv(scp))->entry)766 767struct scsi_cmd_and_priv {768 struct scsi_cmnd cmd;769 struct megaraid_cmd_priv priv;770};771 772static inline struct scsi_cmnd *773megaraid_to_scsi_cmd(struct megaraid_cmd_priv *cmd_priv)774{775 /* See also scsi_mq_setup_tags() */776 BUILD_BUG_ON(sizeof(struct scsi_cmd_and_priv) !=777 sizeof(struct scsi_cmnd) +778 sizeof(struct megaraid_cmd_priv));779 780 return &container_of(cmd_priv, struct scsi_cmd_and_priv, priv)->cmd;781}782 783/*784 * Each controller's soft state785 */786typedef struct {787 int this_id; /* our id, may set to different than 7 if788 clustering is available */789 u32 flag;790 791 unsigned long base;792 void __iomem *mmio_base;793 794 /* mbox64 with mbox not aligned on 16-byte boundary */795 mbox64_t *una_mbox64;796 dma_addr_t una_mbox64_dma;797 798 volatile mbox64_t *mbox64;/* ptr to 64-bit mailbox */799 volatile mbox_t *mbox; /* ptr to standard mailbox */800 dma_addr_t mbox_dma;801 802 struct pci_dev *dev;803 804 struct list_head free_list;805 struct list_head pending_list;806 struct list_head completed_list;807 808 struct Scsi_Host *host;809 810#define MEGA_BUFFER_SIZE (2*1024)811 u8 *mega_buffer;812 dma_addr_t buf_dma_handle;813 814 mega_product_info product_info;815 816 u8 max_cmds;817 scb_t *scb_list;818 819 atomic_t pend_cmds; /* maintain a counter for pending820 commands in firmware */821 822#if MEGA_HAVE_STATS823 u32 nreads[MAX_LOGICAL_DRIVES_40LD];824 u32 nreadblocks[MAX_LOGICAL_DRIVES_40LD];825 u32 nwrites[MAX_LOGICAL_DRIVES_40LD];826 u32 nwriteblocks[MAX_LOGICAL_DRIVES_40LD];827 u32 rd_errors[MAX_LOGICAL_DRIVES_40LD];828 u32 wr_errors[MAX_LOGICAL_DRIVES_40LD];829#endif830 831 /* Host adapter parameters */832 u8 numldrv;833 u8 fw_version[7];834 u8 bios_version[7];835 836#ifdef CONFIG_PROC_FS837 struct proc_dir_entry *controller_proc_dir_entry;838#endif839 840 int has_64bit_addr; /* are we using 64-bit addressing */841 int support_ext_cdb;842 int boot_ldrv_enabled;843 int boot_ldrv;844 int boot_pdrv_enabled; /* boot from physical drive */845 int boot_pdrv_ch; /* boot physical drive channel */846 int boot_pdrv_tgt; /* boot physical drive target */847 848 849 int support_random_del; /* Do we support random deletion of850 logdrvs */851 int read_ldidmap; /* set after logical drive deltion. The852 logical drive number must be read from the853 map */854 atomic_t quiescent; /* a stage reached when delete logical855 drive needs to be done. Stop856 sending requests to the hba till857 delete operation is completed */858 spinlock_t lock;859 860 u8 logdrv_chan[MAX_CHANNELS+NVIRT_CHAN]; /* logical drive are on861 what channels. */862 int mega_ch_class;863 864 u8 sglen; /* f/w supported scatter-gather list length */865 866 scb_t int_scb;867 struct mutex int_mtx; /* To synchronize the internal868 commands */869 int int_status; /* status of internal cmd */870 struct completion int_waitq; /* wait queue for internal871 cmds */872 873 int has_cluster; /* cluster support on this HBA */874}adapter_t;875 876 877struct mega_hbas {878 int is_bios_enabled;879 adapter_t *hostdata_addr;880};881 882 883/*884 * For state flag. Do not use LSB(8 bits) which are885 * reserved for storing info about channels.886 */887#define IN_ABORT 0x80000000L888#define IN_RESET 0x40000000L889#define BOARD_MEMMAP 0x20000000L890#define BOARD_IOMAP 0x10000000L891#define BOARD_40LD 0x08000000L892#define BOARD_64BIT 0x04000000L893 894#define INTR_VALID 0x40895 896#define PCI_CONF_AMISIG 0xa0897#define PCI_CONF_AMISIG64 0xa4898 899 900#define MEGA_DMA_TYPE_NONE 0xFFFF901#define MEGA_BULK_DATA 0x0001902#define MEGA_SGLIST 0x0002903 904/*905 * Parameters for the io-mapped controllers906 */907 908/* I/O Port offsets */909#define CMD_PORT 0x00910#define ACK_PORT 0x00911#define TOGGLE_PORT 0x01912#define INTR_PORT 0x0a913 914#define MBOX_BUSY_PORT 0x00915#define MBOX_PORT0 0x04916#define MBOX_PORT1 0x05917#define MBOX_PORT2 0x06918#define MBOX_PORT3 0x07919#define ENABLE_MBOX_REGION 0x0B920 921/* I/O Port Values */922#define ISSUE_BYTE 0x10923#define ACK_BYTE 0x08924#define ENABLE_INTR_BYTE 0xc0925#define DISABLE_INTR_BYTE 0x00926#define VALID_INTR_BYTE 0x40927#define MBOX_BUSY_BYTE 0x10928#define ENABLE_MBOX_BYTE 0x00929 930 931/* Setup some port macros here */932#define issue_command(adapter) \933 outb_p(ISSUE_BYTE, (adapter)->base + CMD_PORT)934 935#define irq_state(adapter) inb_p((adapter)->base + INTR_PORT)936 937#define set_irq_state(adapter, value) \938 outb_p((value), (adapter)->base + INTR_PORT)939 940#define irq_ack(adapter) \941 outb_p(ACK_BYTE, (adapter)->base + ACK_PORT)942 943#define irq_enable(adapter) \944 outb_p(ENABLE_INTR_BYTE, (adapter)->base + TOGGLE_PORT)945 946#define irq_disable(adapter) \947 outb_p(DISABLE_INTR_BYTE, (adapter)->base + TOGGLE_PORT)948 949 950/*951 * This is our SYSDEP area. All kernel specific detail should be placed here -952 * as much as possible953 */954 955/*956 * End of SYSDEP area957 */958 959const char *megaraid_info (struct Scsi_Host *);960 961static int mega_query_adapter(adapter_t *);962static int issue_scb(adapter_t *, scb_t *);963static int mega_setup_mailbox(adapter_t *);964 965static int megaraid_queue (struct Scsi_Host *, struct scsi_cmnd *);966static scb_t * mega_build_cmd(adapter_t *, struct scsi_cmnd *, int *);967static void __mega_runpendq(adapter_t *);968static int issue_scb_block(adapter_t *, u_char *);969 970static irqreturn_t megaraid_isr_memmapped(int, void *);971static irqreturn_t megaraid_isr_iomapped(int, void *);972 973static void mega_free_scb(adapter_t *, scb_t *);974 975static int megaraid_abort(struct scsi_cmnd *);976static int megaraid_reset(struct scsi_cmnd *);977static int megaraid_abort_and_reset(adapter_t *, struct scsi_cmnd *, int);978static int megaraid_biosparam(struct scsi_device *, struct block_device *,979 sector_t, int []);980 981static int mega_build_sglist (adapter_t *adapter, scb_t *scb,982 u32 *buffer, u32 *length);983static int __mega_busywait_mbox (adapter_t *);984static void mega_rundoneq (adapter_t *);985static void mega_cmd_done(adapter_t *, u8 [], int, int);986static inline void mega_free_sgl (adapter_t *adapter);987static void mega_8_to_40ld (mraid_inquiry *inquiry,988 mega_inquiry3 *enquiry3, mega_product_info *);989 990static int megadev_open (struct inode *, struct file *);991static int megadev_ioctl (struct file *, unsigned int, unsigned long);992static int mega_m_to_n(void __user *, nitioctl_t *);993static int mega_n_to_m(void __user *, megacmd_t *);994 995static int mega_init_scb (adapter_t *);996 997static int mega_is_bios_enabled (adapter_t *);998 999#ifdef CONFIG_PROC_FS1000static void mega_create_proc_entry(int, struct proc_dir_entry *);1001static int mega_adapinq(adapter_t *, dma_addr_t);1002static int mega_internal_dev_inquiry(adapter_t *, u8, u8, dma_addr_t);1003#endif1004 1005static int mega_support_ext_cdb(adapter_t *);1006static mega_passthru* mega_prepare_passthru(adapter_t *, scb_t *,1007 struct scsi_cmnd *, int, int);1008static mega_ext_passthru* mega_prepare_extpassthru(adapter_t *,1009 scb_t *, struct scsi_cmnd *, int, int);1010static void mega_enum_raid_scsi(adapter_t *);1011static void mega_get_boot_drv(adapter_t *);1012static int mega_support_random_del(adapter_t *);1013static int mega_del_logdrv(adapter_t *, int);1014static int mega_do_del_logdrv(adapter_t *, int);1015static void mega_get_max_sgl(adapter_t *);1016static int mega_internal_command(adapter_t *, megacmd_t *, mega_passthru *);1017static int mega_support_cluster(adapter_t *);1018#endif1019 1020/* vi: set ts=8 sw=8 tw=78: */1021