Annotation of Gnu-Mach/i386/i386at/gpl/linux/scsi/eata_generic.h, revision 1.1.1.1

1.1       root        1: /********************************************************
                      2: * Header file for eata_dma.c and eata_pio.c            *
                      3: * Linux EATA SCSI drivers                              *
                      4: * (c) 1993,94,95 Michael Neuffer                       *
                      5: *********************************************************
                      6: * last change: 95/11/07                                        *
                      7: ********************************************************/
                      8: 
                      9: 
                     10: #ifndef _EATA_GENERIC_H
                     11: #define _EATA_GENERIC_H
                     12: 
                     13: 
                     14: 
                     15: /*********************************************
                     16:  * Misc. definitions                        *
                     17:  *********************************************/
                     18: 
                     19: #ifndef TRUE
                     20: #define TRUE 1
                     21: #endif
                     22: #ifndef FALSE
                     23: #define FALSE 0
                     24: #endif
                     25: 
                     26: #define min(a,b) ((a<b)?(a):(b))
                     27: 
                     28: #define R_LIMIT 0x20000
                     29: 
                     30: #define MAXISA    4
                     31: #define MAXEISA          16  
                     32: #define MAXPCI   16
                     33: #define MAXIRQ   16 
                     34: #define MAXTARGET 16
                     35: #define MAXCHANNEL 3
                     36: 
                     37: #define IS_ISA    'I'
                     38: #define IS_EISA           'E'
                     39: #define IS_PCI    'P'
                     40: 
                     41: #define BROKEN_INQUIRY 1
                     42: 
                     43: #define BUSMASTER       0xff
                     44: #define PIO             0xfe
                     45: 
                     46: #define EATA_SIGNATURE 0x45415441     /* BIG ENDIAN coded "EATA" sig.   */
                     47: 
                     48: #define DPT_ID1         0x12
                     49: #define DPT_ID2         0x14
                     50: 
                     51: #define ATT_ID1         0x06
                     52: #define ATT_ID2         0x94
                     53: #define ATT_ID3         0x0
                     54: 
                     55: #define NEC_ID1         0x38
                     56: #define NEC_ID2         0xa3
                     57: #define NEC_ID3         0x82
                     58: 
                     59: 
                     60: #define EATA_CP_SIZE   44
                     61: 
                     62: #define MAX_PCI_DEVICES 32            /* Maximum # Of Devices Per Bus   */
                     63: #define MAX_METHOD_2   16             /* Max Devices For Method 2       */
                     64: #define MAX_PCI_BUS    16             /* Maximum # Of Busses Allowed    */
                     65: 
                     66: #define SG_SIZE                64 
                     67: #define SG_SIZE_BIG    509            /* max. 509 elements, one 4k page */
                     68: 
                     69: #define C_P_L_DIV      2 /* 1 <= C_P_L_DIV <= 8            
                     70:                           * You can use this parameter to fine-tune
                     71:                           * the driver. Depending on the number of 
                     72:                           * devices and their speed and ability to queue 
                     73:                           * commands, you will get the best results with a
                     74:                           * value
                     75:                           * ~= numdevices-(devices_unable_to_queue_commands/2)
                     76:                           * The reason for this is that the disk driver 
                     77:                           * tends to flood the queue, so that other 
                     78:                           * drivers have problems to queue commands 
                     79:                           * themselves. This can for example result in 
                     80:                           * the effect that the tape stops during disk 
                     81:                           * accesses. 
                     82:                           */
                     83: 
                     84: #define FREE      0
                     85: #define OK        0
                     86: #define NO_TIMEOUT 0
                     87: #define USED      1
                     88: #define TIMEOUT           2
                     89: #define RESET     4
                     90: #define LOCKED    8
                     91: 
                     92: #define HD(cmd)         ((hostdata *)&(cmd->host->hostdata))
                     93: #define CD(cmd)         ((struct eata_ccb *)(cmd->host_scribble))
                     94: #define SD(host) ((hostdata *)&(host->hostdata))
                     95: 
                     96: #define DELAY(x) { __u32 i; i = jiffies + (x * HZ); while (jiffies < i) barrier(); }
                     97: #define DEL2(x)         { __u32 i; for (i = 0; i < 0xffff * x; i++); }
                     98: 
                     99: /***********************************************
                    100:  *    EATA Command & Register definitions      *
                    101:  ***********************************************/
                    102: #define PCI_REG_DPTconfig       0x40    
                    103: #define PCI_REG_PumpModeAddress         0x44    
                    104: #define PCI_REG_PumpModeData    0x48    
                    105: #define PCI_REG_ConfigParam1    0x50    
                    106: #define PCI_REG_ConfigParam2    0x54    
                    107: 
                    108: 
                    109: #define EATA_CMD_PIO_SETUPTEST  0xc6
                    110: #define EATA_CMD_PIO_READ_CONFIG 0xf0
                    111: #define EATA_CMD_PIO_SET_CONFIG         0xf1
                    112: #define EATA_CMD_PIO_SEND_CP    0xf2
                    113: #define EATA_CMD_PIO_RECEIVE_SP         0xf3
                    114: #define EATA_CMD_PIO_TRUNC      0xf4
                    115: 
                    116: #define EATA_CMD_RESET          0xf9
                    117: #define EATA_CMD_IMMEDIATE      0xfa
                    118: 
                    119: #define EATA_CMD_DMA_READ_CONFIG 0xfd
                    120: #define EATA_CMD_DMA_SET_CONFIG         0xfe
                    121: #define EATA_CMD_DMA_SEND_CP    0xff
                    122: 
                    123: #define ECS_EMULATE_SENSE       0xd4
                    124: 
                    125: #define EATA_GENERIC_ABORT       0x00 
                    126: #define EATA_SPECIFIC_RESET      0x01
                    127: #define EATA_BUS_RESET           0x02
                    128: #define EATA_SPECIFIC_ABORT      0x03
                    129: #define EATA_QUIET_INTR          0x04
                    130: #define EATA_COLD_BOOT_HBA       0x06     /* Only as a last resort     */
                    131: #define EATA_FORCE_IO            0x07
                    132: 
                    133: 
                    134: #define HA_WCOMMAND    0x07       /* command register offset   */
                    135: #define HA_WCOMMAND2   0x06       /* immediate command offset  */
                    136: #define HA_WSUBCODE    0x05 
                    137: #define HA_WSUBLUN     0x04 
                    138: #define HA_WDMAADDR    0x02       /* DMA address LSB offset    */  
                    139: #define HA_RAUXSTAT    0x08       /* aux status register offset*/
                    140: #define HA_RSTATUS     0x07       /* status register offset    */
                    141: #define HA_RDATA       0x00       /* data register (16bit)     */
                    142: 
                    143: #define HA_ABUSY       0x01       /* aux busy bit              */
                    144: #define HA_AIRQ               0x02        /* aux IRQ pending bit       */
                    145: #define HA_SERROR      0x01       /* pr. command ended in error*/
                    146: #define HA_SMORE       0x02       /* more data soon to come    */
                    147: #define HA_SCORR       0x04       /* data corrected            */
                    148: #define HA_SDRQ               0x08        /* data request active       */
                    149: #define HA_SSC        0x10        /* seek complete             */
                    150: #define HA_SFAULT      0x20       /* write fault               */
                    151: #define HA_SREADY      0x40       /* drive ready               */
                    152: #define HA_SBUSY       0x80       /* drive busy                */
                    153: #define HA_SDRDY       HA_SSC+HA_SREADY+HA_SDRQ 
                    154: 
                    155: /**********************************************
                    156:  * Message definitions                       *
                    157:  **********************************************/
                    158: 
                    159: #define HA_NO_ERROR     0x00   /* No Error                             */
                    160: #define HA_ERR_SEL_TO   0x01   /* Selection Timeout                    */
                    161: #define HA_ERR_CMD_TO   0x02   /* Command Timeout                      */
                    162: #define HA_ERR_RESET    0x03   /* SCSI Bus Reset Received              */
                    163: #define HA_INIT_POWERUP         0x04   /* Initial Controller Power-up          */
                    164: #define HA_UNX_BUSPHASE         0x05   /* Unexpected Bus Phase                 */
                    165: #define HA_UNX_BUS_FREE         0x06   /* Unexpected Bus Free                  */
                    166: #define HA_BUS_PARITY   0x07   /* Bus Parity Error                     */
                    167: #define HA_SCSI_HUNG    0x08   /* SCSI Hung                            */
                    168: #define HA_UNX_MSGRJCT  0x09   /* Unexpected Message Rejected          */
                    169: #define HA_RESET_STUCK  0x0a   /* SCSI Bus Reset Stuck                 */
                    170: #define HA_RSENSE_FAIL  0x0b   /* Auto Request-Sense Failed            */
                    171: #define HA_PARITY_ERR   0x0c   /* Controller Ram Parity Error          */
                    172: #define HA_CP_ABORT_NA  0x0d   /* Abort Message sent to non-active cmd */
                    173: #define HA_CP_ABORTED   0x0e   /* Abort Message sent to active cmd     */
                    174: #define HA_CP_RESET_NA  0x0f   /* Reset Message sent to non-active cmd */
                    175: #define HA_CP_RESET     0x10   /* Reset Message sent to active cmd     */
                    176: #define HA_ECC_ERR      0x11   /* Controller Ram ECC Error             */
                    177: #define HA_PCI_PARITY   0x12   /* PCI Parity Error                     */
                    178: #define HA_PCI_MABORT   0x13   /* PCI Master Abort                     */
                    179: #define HA_PCI_TABORT   0x14   /* PCI Target Abort                     */
                    180: #define HA_PCI_STABORT  0x15   /* PCI Signaled Target Abort            */
                    181: 
                    182: /**********************************************
                    183:  *  Other  definitions                       *
                    184:  **********************************************/
                    185: 
                    186: struct reg_bit {      /* reading this one will clear the interrupt    */
                    187:     __u8 error:1;     /* previous command ended in an error          */
                    188:     __u8 more:1;      /* more DATA coming soon, poll BSY & DRQ (PIO)  */
                    189:     __u8 corr:1;      /* data read was successfully corrected with ECC*/
                    190:     __u8 drq:1;              /* data request active  */     
                    191:     __u8 sc:1;       /* seek complete        */
                    192:     __u8 fault:1;     /* write fault         */
                    193:     __u8 ready:1;     /* drive ready         */
                    194:     __u8 busy:1;      /* controller busy      */
                    195: };
                    196: 
                    197: struct reg_abit {     /* reading this won't clear the interrupt */
                    198:     __u8 abusy:1;     /* auxiliary busy                                */
                    199:     __u8 irq:1;              /* set when drive interrupt is asserted   */
                    200:     __u8 dummy:6;
                    201: };
                    202: 
                    203: struct eata_register {     /* EATA register set */
                    204:     __u8 data_reg[2];      /* R, couldn't figure this one out          */
                    205:     __u8 cp_addr[4];       /* W, CP address register                   */
                    206:     union { 
                    207:        __u8 command;       /* W, command code: [read|set] conf, send CP*/
                    208:        struct reg_bit status;  /* R, see register_bit1                 */
                    209:        __u8 statusbyte;
                    210:     } ovr;   
                    211:     struct reg_abit aux_stat; /* R, see register_bit2                  */
                    212: };
                    213: 
                    214: struct get_conf {            /* Read Configuration Array               */
                    215:     __u32  len;                      /* Should return 0x22, 0x24, etc          */
                    216:     __u32 signature;         /* Signature MUST be "EATA"               */
                    217:     __u8    version2:4,
                    218:             version:4;       /* EATA Version level                     */
                    219:     __u8 OCS_enabled:1,              /* Overlap Command Support enabled        */
                    220:         TAR_support:1,       /* SCSI Target Mode supported             */
                    221:              TRNXFR:1,       /* Truncate Transfer Cmd not necessary    *
                    222:                               * Only used in PIO Mode                  */
                    223:        MORE_support:1,       /* MORE supported (only PIO Mode)         */
                    224:         DMA_support:1,       /* DMA supported Driver uses only         *
                    225:                               * this mode                              */
                    226:           DMA_valid:1,       /* DRQ value in Byte 30 is valid          */
                    227:                 ATA:1,       /* ATA device connected (not supported)   */
                    228:           HAA_valid:1;       /* Hostadapter Address is valid           */
                    229: 
                    230:     __u16 cppadlen;          /* Number of pad bytes send after CD data *
                    231:                               * set to zero for DMA commands           */
                    232:     __u8 scsi_id[4];         /* SCSI ID of controller 2-0 Byte 0 res.  *
                    233:                               * if not, zero is returned               */
                    234:     __u32  cplen;            /* CP length: number of valid cp bytes    */
                    235:     __u32  splen;            /* Number of bytes returned after         * 
                    236:                               * Receive SP command                     */
                    237:     __u16 queuesiz;          /* max number of queueable CPs            */
                    238:     __u16 dummy;
                    239:     __u16 SGsiz;             /* max number of SG table entries         */
                    240:     __u8    IRQ:4,           /* IRQ used this HA                       */
                    241:         IRQ_TR:1,            /* IRQ Trigger: 0=edge, 1=level           */
                    242:         SECOND:1,            /* This is a secondary controller         */
                    243:     DMA_channel:2;           /* DRQ index, DRQ is 2comp of DRQX        */
                    244:     __u8 sync;               /* device at ID 7 tru 0 is running in     *
                    245:                               * synchronous mode, this will disappear  */
                    246:     __u8   DSBLE:1,          /* ISA i/o addressing is disabled         */
                    247:         FORCADR:1,           /* i/o address has been forced            */
                    248:          SG_64K:1,
                    249:          SG_UAE:1,
                    250:                :4;
                    251:     __u8  MAX_ID:5,          /* Max number of SCSI target IDs          */
                    252:        MAX_CHAN:3;           /* Number of SCSI busses on HBA           */
                    253:     __u8 MAX_LUN;            /* Max number of LUNs                     */
                    254:     __u8       :3,
                    255:         AUTOTRM:1,
                    256:         M1_inst:1,
                    257:         ID_qest:1,           /* Raidnum ID is questionable             */
                    258:          is_PCI:1,           /* HBA is PCI                             */
                    259:         is_EISA:1;           /* HBA is EISA                            */
                    260:     __u8 unused[478]; 
                    261: };
                    262: 
                    263: struct eata_sg_list
                    264: {
                    265:     __u32 data;
                    266:     __u32 len;
                    267: };
                    268: 
                    269: struct eata_ccb {            /* Send Command Packet structure      */
                    270:  
                    271:     __u8 SCSI_Reset:1,       /* Cause a SCSI Bus reset on the cmd      */
                    272:           HBA_Init:1,        /* Cause Controller to reinitialize       */
                    273:        Auto_Req_Sen:1,       /* Do Auto Request Sense on errors        */
                    274:            scatter:1,        /* Data Ptr points to a SG Packet         */
                    275:             Resrvd:1,        /* RFU                                    */
                    276:          Interpret:1,        /* Interpret the SCSI cdb of own use      */
                    277:            DataOut:1,        /* Data Out phase with command            */
                    278:             DataIn:1;        /* Data In phase with command             */
                    279:     __u8 reqlen;             /* Request Sense Length                   * 
                    280:                               * Valid if Auto_Req_Sen=1                */
                    281:     __u8 unused[3];
                    282:     __u8  FWNEST:1,          /* send cmd to phys RAID component        */
                    283:         unused2:7;
                    284:     __u8 Phsunit:1,          /* physical unit on mirrored pair         */
                    285:            I_AT:1,           /* inhibit address translation            */
                    286:         I_HBA_C:1,           /* HBA inhibit caching                    */
                    287:         unused3:5;
                    288: 
                    289:     __u8     cp_id:5,        /* SCSI Device ID of target               */ 
                    290:        cp_channel:3;         /* SCSI Channel # of HBA                  */
                    291:     __u8    cp_lun:3,
                    292:                  :2,
                    293:         cp_luntar:1,         /* CP is for target ROUTINE               */
                    294:         cp_dispri:1,         /* Grant disconnect privilege             */
                    295:        cp_identify:1;        /* Always TRUE                            */
                    296:     __u8 cp_msg1;            /* Message bytes 0-3                      */
                    297:     __u8 cp_msg2;
                    298:     __u8 cp_msg3;
                    299:     __u8 cp_cdb[12];         /* Command Descriptor Block               */
                    300:     __u32 cp_datalen;        /* Data Transfer Length                   *
                    301:                               * If scatter=1 len of sg package         */
                    302:     void *cp_viraddr;        /* address of this ccb                    */
                    303:     __u32 cp_dataDMA;        /* Data Address, if scatter=1             *
                    304:                               * address of scatter packet              */
                    305:     __u32 cp_statDMA;        /* address for Status Packet              */ 
                    306:     __u32 cp_reqDMA;         /* Request Sense Address, used if         *
                    307:                               * CP command ends with error             */
                    308:     /* Additional CP info begins here */
                    309:     __u32 timestamp;         /* Needed to measure command latency      */
                    310:     __u32 timeout;
                    311:     __u8 sizeindex;
                    312:     __u8 rw_latency;
                    313:     __u8 retries;
                    314:     __u8 status;             /* status of this queueslot               */
                    315:     Scsi_Cmnd *cmd;          /* address of cmd                         */
                    316:     struct eata_sg_list *sg_list;
                    317: };
                    318: 
                    319: 
                    320: struct eata_sp {
                    321:     __u8 hba_stat:7,         /* HBA status                             */
                    322:              EOC:1;          /* True if command finished               */
                    323:     __u8 scsi_stat;          /* Target SCSI status                     */
                    324:     __u8 reserved[2];
                    325:     __u32  residue_len;              /* Number of bytes not transferred        */
                    326:     struct eata_ccb *ccb;     /* Address set in COMMAND PACKET         */
                    327:     __u8 msg[12];
                    328: };
                    329: 
                    330: typedef struct hstd {
                    331:     __u8   vendor[9];
                    332:     __u8   name[18];
                    333:     __u8   revision[6];
                    334:     __u8   EATA_revision;
                    335:     __u8   bustype;             /* bustype of HBA             */
                    336:     __u8   channel;             /* # of avail. scsi channels  */
                    337:     __u8   state;               /* state of HBA               */
                    338:     __u8   primary;             /* true if primary            */
                    339:     __u8   broken_INQUIRY:1;    /* This is an EISA HBA with   *
                    340:                                  * broken INQUIRY             */
                    341:     __u8   do_latency;          /* Latency measurement flag   */
                    342:     __u32  reads[13];
                    343:     __u32  writes[13];
                    344:     __u32  reads_lat[12][4];
                    345:     __u32  writes_lat[12][4];
                    346:                                 /* state of Target (RESET,..) */
                    347:     __u8   t_state[MAXCHANNEL][MAXTARGET];   
                    348:                                 /* timeouts on target         */
                    349:     __u32  t_timeout[MAXCHANNEL][MAXTARGET]; 
                    350:     __u32  last_ccb;            /* Last used ccb              */
                    351:     __u32  cplen;               /* size of CP in words        */
                    352:     __u16  cppadlen;            /* pad length of cp in words  */
                    353:     __u8   hostid;              /* SCSI ID of HBA             */
                    354:     __u8   devflags;            /* bits set for detected devices */
                    355:     __u8   moresupport;                 /* HBA supports MORE flag     */
                    356:     struct Scsi_Host *next;        
                    357:     struct Scsi_Host *prev;
                    358:     struct eata_sp sp;          /* status packet              */ 
                    359:     struct eata_ccb ccb[0];     /* ccb array begins here      */
                    360: }hostdata;
                    361: 
                    362: /* structure for max. 2 emulated drives */
                    363: struct drive_geom_emul {
                    364:     __u8  trans;                /* translation flag 1=transl */
                    365:     __u8  channel;              /* SCSI channel number       */
                    366:     __u8  HBA;                  /* HBA number (prim/sec)     */
                    367:     __u8  id;                   /* drive id                  */
                    368:     __u8  lun;                  /* drive lun                 */
                    369:     __u32 heads;                /* number of heads           */
                    370:     __u32 sectors;              /* number of sectors         */
                    371:     __u32 cylinder;             /* number of cylinders       */
                    372: };
                    373: 
                    374: struct geom_emul {
                    375:     __u8 bios_drives;           /* number of emulated drives */
                    376:     struct drive_geom_emul drv[2]; /* drive structures       */
                    377: };
                    378: 
                    379: #endif /* _EATA_GENERIC_H */
                    380: 
                    381: /*
                    382:  * Overrides for Emacs so that we almost follow Linus's tabbing style.
                    383:  * Emacs will notice this stuff at the end of the file and automatically
                    384:  * adjust the settings for this buffer only.  This must remain at the end
                    385:  * of the file.
                    386:  * ---------------------------------------------------------------------------
                    387:  * Local variables:
                    388:  * c-indent-level: 4
                    389:  * c-brace-imaginary-offset: 0
                    390:  * c-brace-offset: -4
                    391:  * c-argdecl-indent: 4
                    392:  * c-label-offset: -4
                    393:  * c-continued-statement-offset: 4
                    394:  * c-continued-brace-offset: 0
                    395:  * tab-width: 8
                    396:  * End:
                    397:  */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.