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