Logo Search packages:      
Sourcecode: dmraid version File versions  Download package

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