Logo Search packages:      
Sourcecode: dmraid version File versions

asr.h

/*
 * Copyright (c) 2005-2006 IBM (actual code changes by Darrick Wong)
 * 
 * Copyright (c) 2001, 2002, 2004 Adaptec Inc.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions, and the following disclaimer,
 *    without modification.
 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
 *    substantially similar to the "NO WARRANTY" disclaimer below
 *    ("Disclaimer") and any redistribution must be conditioned upon
 *    including a substantially similar Disclaimer requirement for further
 *    binary redistribution.
 * 3. Neither the names of the above-listed copyright holders nor the names
 *    of any contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 * Alternatively, this software may be distributed under the terms of the
 * GNU General Public License ("GPL") version 2 as published by the Free
 * Software Foundation.
 *
 * NO WARRANTY
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGES.
 */

#ifndef _ASR_H
#define _ASR_H

/* Beginning of stuff that Darrick Wong added */
#ifdef      FORMAT_HANDLER
#undef      FORMAT_HANDLER

/* ASR metadata offset in bytes */
#define     ASR_CONFIGOFFSET  ((di->sectors - 1) << 9)

/* Data offset in sectors */
#define     ASR_DATAOFFSET          0

/* Assume block size is 512.  So much for CD dmraid... */
#define ASR_DISK_BLOCK_SIZE   512

/* End of stuff that Darrick Wong added */

/* Begining of stuff copied verbatim from Adaptec's emd driver. */

/*
 * This is a metadata versioning mechanism, but rather a versioning
 * mechansim for Adaptec-sponsored changes to md.  (i.e. more of a driver
 * version)
 */
#define     MD_ADAPTEC_MAJOR_VERSION      0
#define     MD_ADAPTEC_MINOR_VERSION      0
#define     MD_ADAPTEC_PATCHLEVEL_VERSION 13

#define FW_RESERVED_BLOCKS  0x800

#define MAX_SLEEPRATE_ENTRIES 10

/* define lsu levels */
#define LSU_LEVEL_PHYSICAL    1     /* Firmware Physical */
#define LSU_LEVEL_LOGICAL     2     /* Firmware Logical */

/* define RAID drive substates */
#define FWP       0     /* Firmware Physical */
#define FWL       1     /* Firmware Logical */
#define OSI       2     /* Operating System Intermediate */
#define FWL_2           3     /* Dual Level */

#define ASR_RAID0       0
#define ASR_RAID1       1
#define ASR_RAID4       4
#define ASR_RAID5       5
#define ASR_RAIDRED           0xFF
#define ASR_RAIDSPR           0xFE

/*** RAID CONFIGURATION TABLE STRUCTURE ***/

#define RVALID2               0x900765C4   /* Version 2+ RAID table ID code
                                    signature */
#define RCTBL_MAX_ENTRIES     127
#define HBA_RCTBL_MAX_ENTRIES 255
#define RTBLBLOCKS            16         /* Size of drive's raid table
                                    in blocks */

/* flag bits */
#define RCTBLCHNG                         0x80  /* Set on comp OR log (NOT AND) if tbl updates needed */
#define     COPYDIR                                   0x40
#define     MIRCOPY                                   0x20
#define INITIAL_BUILD_COMPLETED                       0x10
#define SMART_DISABLED                          0x08
#define WRITEBACK                         0x04
#define PREDICTIVE_ENABLE                       0x02
#define RAID_ENTRY_FLAGS_ALARM_OFF_M                  0x01

struct asr_raid_configline
{
      uint16_t    raidcnt;    /* Component count of an OSL/FWL array */
      uint16_t    raidseq;    /* Sequence # of component to look for */
      uint32_t    raidmagic;  /* Magic # of component to look for */
      uint8_t           raidlevel;  /* Array level = OSL/FWL/OSI/FWP */
      uint8_t           raidtype;   /* Array type = RAID0/1/3/5, RAIDRED,
                               RAIDSPR */
      uint8_t           raidstate;  /* State of logical or physical drive */

      uint8_t           flags;      /* misc flags set bit positions above */

      uint8_t           refcnt;     /* Number of references to this log entry */
      uint8_t           raidhba;    /* -- not used -- Host bus adapter number
                               or RAIDID */
      uint8_t           raidchnl;   /* Channel number */
      uint8_t           raidlun;    /* SCSI LUN of log/phys drv */
      uint32_t    raidid;     /* SCSI ID of log/phys drv */
      uint32_t    loffset;    /* Offset of data for this comp in the
                               array */
      uint32_t    lcapcty;    /* Capacity of log drv or space used on
                               phys */
      uint16_t    strpsize;   /* Stripe size in blocks of this drive */
      uint16_t    biosInfo;   /* bios info - set by
                               I2O_EXEC_BIOS_INFO_SET */
      uint32_t    lsu;        /* Pointer to phys/log lun of this entry */
      uint8_t           addedDrives;
      uint8_t           appSleepRate;
      uint16_t    blockStorageTid;
      uint32_t    curAppBlock;
      uint32_t    appBurstCount;
#define     ASR_NAMELEN 16
      uint8_t           name[ASR_NAMELEN];   /* Full name of the array. */
} __attribute__ ((packed));

struct asr_raidtable
{
/* raid Flag defines 32 bits 0 - FFFFFFFF */
#define RAID_FLAGS_ALARM_OFF_M 0x00000001
      uint32_t    ridcode;    /* RAID table signature - 0x900765C4 */
      uint32_t    rversion;   /* Version of the RAID config table */
      uint16_t    maxelm;           /* Maximum number of elements */
      uint16_t    elmcnt;           /* Element Count (number used) */
#define     ASR_TBLELMCNT     7
      uint16_t    elmsize;    /* Size of an individual raidCLine */
      uint16_t    rchksum;    /* RAID table check sum
                                 (no rconfTblV2)*/
      uint32_t    res1;       /* Reserved */
      uint16_t    res2;       /* was bldRate - Time in 1/10s
                                 between idle build bursts */
      uint16_t    res3;       /* was bldAmount - Block to build
                                 during a build burst */
      uint32_t    raidFlags;
      uint32_t    timestamp;  /* used for iROC. A stamp to find
                                 which is latest */
      uint8_t           irocFlags;
#define     ASR_IF_VERIFY_WITH_AUTOFIX    0x01
#define ASR_IF_BOOTABLE             0x80
      uint8_t           dirty;            /* Records "open state" for array */
#define ARRAY_STATE_OK        0x00
#define ARRAY_STATE_DIRTY     0x03
      uint8_t           actionPriority;
      uint8_t           spareid;    /* Stored in member disk meta data
                                 to declare the ID of dedicated
                                 spare to show up. */
      uint32_t    sparedrivemagic;/* drivemagic (in RB) of the spare
                                 at above ID. */
      uint32_t    raidmagic;  /* used to identify spare drive with
                                 its mirror set. */
      uint32_t    verifyDate; /* used by iomgr */
      uint32_t    recreateDate;     /* used by iomgr */
      uint8_t           res4[12];   /* Reserved */
      struct asr_raid_configline ent[RCTBL_MAX_ENTRIES];
} __attribute__ ((packed));


#define RBLOCK_VER  8           /* Version of the reserved block */
#define B0RESRVD    0x37FC4D1E  /* Signature of the reserved block */
#define SVALID      0x4450544D  /* ASCII code for "DPTM" DPT Mirror */

struct asr_reservedblock
{
      uint32_t    b0idcode;   /* 0x00 - ID code signifying block 0
                                 reserved */
      uint8_t           lunsave[8]; /* 0x04 - NOT USED - LUN mappings for
                                 all drives */
      uint16_t    sdtype;           /* 0x0C - NOT USED - drive type in
                                 boot prom */
      uint16_t    ssavecyl;   /* 0x0E - NOT USED - Set Parameters
                                 cylinders */
      uint8_t           ssavehed;   /* 0x10 - NOT USED - Set Parameters
                                 heads */
      uint8_t           ssavesec;   /* 0x11 - NOT USED - Set Parameters
                                 sectors */
      uint8_t           sb0flags;   /* 0x12 - flags saved in reserved
                                 block */
      uint8_t           jbodEnable; /* 0x13 - jbod enable -- DEC drive
                                 hiding */
      uint8_t           lundsave;   /* 0x14 - NOT USED - LUNMAP disable
                                 flags */
      uint8_t           svpdirty;   /* 0x15 - NOT USED - saved percentage
                                 dirty */
      uint16_t    biosInfo;   /* 0x16 - bios info - set by
                                 I2O_EXEC_BIOS_INFO_SET */
      uint16_t    svwbskip;   /* 0x18 - NOT USED - saved write-back
                                 skip value */
      uint16_t    svwbcln;    /* 0x1A - NOT USED - saved maximum
                                 clean blocks in write-back */
      uint16_t    svwbmax;    /* 0x1C - NOT USED - saved maximum
                                 write-back length */
      uint16_t    res3;       /* 0x1E - unused (was write-back burst
                                 block count) */
      uint16_t    svwbmin;    /* 0x20 - NOT USED - saved minimum
                                 block count to write */
      uint16_t    res4;       /* 0x22 - unused (was minimum
                                 look-ahead length) */
      uint16_t    svrcacth;   /* 0x24 - NOT USED - saved read cache
                                 threshold */
      uint16_t    svwcacth;   /* 0x26 - NOT USED - saved write
                                  cache threshold */
      uint16_t    svwbdly;    /* 0x28 - NOT USED - saved write-back
                                 delay */
      uint8_t           svsdtime;   /* 0x2A - NOT USED - saved spin down
                                 time */
      uint8_t           res5;       /* 0x2B - unused */
      uint16_t    firmval;    /* 0x2C - NOT USED - firmware on
                                 drive  (dw) */
      uint16_t    firmbln;    /* 0x2E - NOT USED - length in blocks
                                 for firmware */
      uint32_t    firmblk;    /* 0x30 - NOT USED - starting block
                                 for firmware */
      uint32_t    fstrsvrb;   /* 0x34 - 1st block reserved by
                                 Storage Manager */
      uint16_t    svBlockStorageTid;      /* 0x38 - */
      uint16_t    svtid;            /* 0x3A - */
      uint8_t           svseccfl;   /* 0x3C - NOT USED - reserved block
                                 scsi bus ecc flags */
      uint8_t           res6;       /* 0x3D - unused */
      uint8_t           svhbanum;   /* 0x3E - NOT USED - HBA's unique
                                 RAID number */
      uint8_t           resver;           /* 0x3F - reserved block version
                                 number */
      uint32_t    drivemagic; /* 0x40 - Magic number of this drive -
                                 used w/ RCTBLs */
      uint8_t           reserved[20];     /* 0x44 - unused */
      uint8_t           testnum;    /* 0x58 - NOT USED - diagnostic test
                                 number */
      uint8_t           testflags;  /* 0x59 - NOT USED - diagnostic test
                                 flags */
      uint16_t    maxErrorCount;    /* 0x5A - NOT USED - diagnostic test
                                 maximum error count */
      uint32_t    count;            /* 0x5C - NOT USED - diagnostic test
                                 cycles - # of iterations */
      uint32_t    startTime;  /* 0x60 - NOT USED - diagnostic test
                                 absolute test start time in
                                 seconds */
      uint32_t    interval;   /* 0x64 - NOT USED - diagnostic test
                                 interval in seconds */
      uint8_t           tstxt0;           /* 0x68 - not used - originally
                                 diagnostic test exclusion period
                                 start hour */
      uint8_t           tstxt1;           /* 0x69 - not used - originally
                                 diagnostic test exclusion period
                                 end hour */
      uint8_t           serNum[32]; /* 0x6A - reserved */
      uint8_t           res8[102];  /* 0x8A - reserved */
      uint32_t    fwTestMagic;      /* 0xF0 - test magic number - used by
                                 FW Test for automated tests */
      uint32_t    fwTestSeqNum;     /* 0xF4 - test sequence number - used
                                 by FW Test for automated tests */
      uint8_t           fwTestRes[8];     /* 0xF6 - reserved by FW Test for
                                 automated tests */
      uint32_t    smagic;           /* 0x100 - magic value saying software
                                 half is valid */
      uint32_t    raidtbl;    /* 0x104 - pointer to first block of
                                 raid table */
      uint16_t    raidline;   /* 0x108 - line number of this raid
                                 table entry - only if version <7 */
      uint8_t           res9[0xF6]; /* 0x10A - reserved for software stuff*/
} __attribute__ ((packed));



#define ARRAY_NEW       0x00
#define ARRAY_EQUAL     0x01
#define ARRAY_SEQ_LESS  0x02
#define ARRAY_SEQ_GREAT 0x03

#define LOCK_PRIORITY      10 /* Uses 10, 11, 12 - For all three channels */


/* B0FLAGS flag bits: */

#define SMARTENA        7     /* SMART emulation enabled */
#define CLRERROR        4     /* Clear stage of Interpret Format
                                 not completed */
#define FMTERROR        3     /* Format stage of Interpret Format
                                 not completed */
#define WRTTHRU               2     /* write throughs */
#define CACHEDIS        0     /* cache disable bit */
#define PREDICTIVE_ENABLE     0x02

#define ID_MAP_PHYSICAL_M     1     /* Logical Map Physical */
#define ID_MAP_LOGICAL_M      2     /* Either Dual Level or Single Level
                                 Logical*/

#define MAX_LSU_COUNT               256

#define MAX_LSU_COMPONENTS          64
#define MAX_LSU_INQUIRY_DATA        64
#define MAX_LSU_SERIAL_NUMBER       8
#define STD_INQUIRY_SIZE            48

#define MAX_LSU_BAD_BLOCKS          8

/* lsuType definitions */
#define LT_UNCONFIGURED_M           0x00
#define LT_RAID0_M                  0x01
#define LT_RAID1_M                  0x02
#define LT_RAID3_M                  0x08
#define LT_RAID4_M                  0x10
#define LT_RAID5_M                  0x20
#define LT_REDIR_M                  0x40
#define LT_SPARE_M                  0x80

#define     LSU_RAID_LEVEL_0        LT_RAID0_M
#define     LSU_RAID_LEVEL_1        LT_RAID1_M
#define     LSU_RAID_LEVEL_3        LT_RAID3_M
#define     LSU_RAID_LEVEL_4        LT_RAID4_M
#define     LSU_RAID_LEVEL_5        LT_RAID5_M
#define LSU_RAID_REDIRECT           LT_REDIR_M
#define     LSU_RAID_SPARE                LT_SPARE_M

/* raidState definitions */
#define LS_OPTIMAL_M                0x00
#define LS_DEGRADED_M               0x01
#define LS_REBUILDING_M             0x02
#define LS_MORPHING_M               0x03
#define LS_DEAD_M             0x04
#define LS_WARNING_M                0x05

#define LS_VERIFYING_M              0x0A
#define LSU_ARRAY_SUBSTATE_WITH_FIX 0x10

#define LS_BUILDING_M               0x0B
#define LS_CREATED_M                0x54
#define LS_DIAGNOSING_M             0xFD


/* arrayState definitions */
#define LSU_ARRAY_STATE_OPTIMAL                 0x00
#define LSU_ARRAY_STATE_DEGRADED          0x01
/* etc. */

/* component raidState definitions */
#define MAIN_STATE                        0x0F
#define LSU_COMPONENT_STATE_OPTIMAL       0x00
#define LSU_COMPONENT_STATE_DEGRADED            0x01
#define LSU_COMPONENT_STATE_UNCONFIGURED  0x02
#define LSU_COMPONENT_STATE_FAILED        0x03
#define LSU_COMPONENT_STATE_REPLACED            0x04
#define LSU_COMPONENT_STATE_UNINITIALIZED 0x0A

#define LSU_COMPONENT_SUBSTATE_BUILDING         0x10  /* drive is being built
                                           for first time */
#define LSU_COMPONENT_SUBSTATE_REBUILDING 0x20  /* drive is being
                                           rebuilt */
#define LSU_ARRAY_SUBSTATE_AWAIT_FORMAT         0x50
/* etc. */

/* Beginning of other stuff that Darrick Wong added */

struct asr {
      struct asr_reservedblock rb;
      struct asr_raidtable *rt;
};

#endif /* FORMAT_HANDLER */

int register_asr(struct lib_context *lc);

#endif /* _ASR_H */

Generated by  Doxygen 1.6.0   Back to index