|
|
1.1 ! root 1: /*********************************************************************** ! 2: * Module: haiscsi.h ! 3: * ! 4: * Constants and structures used to access SCSI devices through the ! 5: * SCSI Driver in a Host Adapter inspecific manner. ! 6: * ! 7: * Copyright (c) 1993, Christopher Sean Hilton, All rights reserved. ! 8: * ! 9: * Last Modified: Fri Jul 23 15:38:08 1993 by [chris] ! 10: * ! 11: */ ! 12: ! 13: #ifndef __SYS_HAISCSI_H__ ! 14: #define __SYS_HAISCSI_H__ ! 15: ! 16: #define SCSIMAJOR 13 ! 17: ! 18: #define MAXTID 7 ! 19: #define MAXDEVS (MAXTID + 1) ! 20: #define MAXLUN 7 ! 21: #define MAXUNITS (MAXLUN + 1) ! 22: ! 23: #define ST_GOOD 0x00 /* Status Good. */ ! 24: #define ST_CHKCOND 0x02 /* Check Condition */ ! 25: #define ST_CONDMET 0x04 /* Condition Met */ ! 26: #define ST_BUSY 0x08 /* Busy */ ! 27: #define ST_INTERM 0x10 /* Intermediate */ ! 28: #define ST_INTCDMET 0x14 /* Intermediate Condtion Met */ ! 29: #define ST_RESCONF 0x18 /* Reservation Conflict */ ! 30: #define ST_COMTERM 0x22 /* Command Terminated */ ! 31: #define ST_QFULL 0x28 /* Queue Full */ ! 32: ! 33: #define ST_TIMEOUT 0x0101 /* Command Timed out */ ! 34: #define ST_USRABRT 0x0102 /* User pressed ^C */ ! 35: #define ST_DRVABRT 0x0103 /* Command Aborted by driver */ ! 36: #define ST_HATMOUT 0x0201 /* Host adapter Timed out command */ ! 37: #define ST_PENDING 0xffff /* Command Pending */ ! 38: ! 39: #define DMAREAD 0x0001 /* Command Reads from SCSI device */ ! 40: #define DMAWRITE 0x0002 /* Command Writes to SCSI device */ ! 41: ! 42: #define SENSELEN 18 ! 43: ! 44: #define PHYS_ADDR 0x0000 /* Physical Address - (who knows) */ ! 45: #define KRNL_ADDR 0x0001 /* Kernal Address */ ! 46: #define USER_ADDR 0x0002 /* User Address (Anything goes) */ ! 47: #define SYSGLBL_ADDR 0x0003 /* System Global address (yeah) */ ! 48: ! 49: /***** Minor Device Number Bits *****/ ! 50: ! 51: #define SPECIAL 0x80 /* Special Bit to flag boot block / Tape */ ! 52: #define TIDMASK 0x70 ! 53: #define LUNMASK 0x0c ! 54: #define PARTMASK 0x03 ! 55: #define TAPE 0x01 ! 56: #define REWIND 0x02 ! 57: ! 58: #pragma align 1 ! 59: ! 60: typedef struct g0cmd_s *g0cmd_p; ! 61: ! 62: typedef struct g0cmd_s { ! 63: unsigned char opcode; /* From opcode Table */ ! 64: unsigned char lun_lba; /* LUN and high part of LBA */ ! 65: unsigned char lba_mid; /* LBA Middle. */ ! 66: unsigned char lba_low; /* LBA Low. */ ! 67: unsigned char xfr_len; /* Transfer Length */ ! 68: unsigned char control; /* Control byte. */ ! 69: } g0cmd_t; ! 70: ! 71: typedef struct g1cmd_s *g1cmd_p; ! 72: ! 73: typedef struct g1cmd_s { ! 74: unsigned char opcode; /* From opcode Table */ ! 75: unsigned char lun; /* LUN */ ! 76: unsigned long lba; /* LBA */ ! 77: unsigned char pad1; /* Reserved */ ! 78: unsigned short xfr_len; /* Transfer Length's MSB. */ ! 79: unsigned char control; /* Control byte. */ ! 80: } g1cmd_t; ! 81: ! 82: #define g2cmd_t g1cmd_t /* SCSI-2 Added Group 2 commands */ ! 83: #define g2cmd_s g1cmd_s /* with the same size and layout as */ ! 84: #define g2cmd_p g1cmd_p /* g1 commands. */ ! 85: ! 86: typedef struct g5cmd_s *g5cmd_p; ! 87: ! 88: typedef struct g5cmd_s { ! 89: unsigned char opcode; /* From opcode Table */ ! 90: unsigned char lun; /* LUN */ ! 91: unsigned long lba; /* LBA's MSB */ ! 92: unsigned char pad1[3]; /* Reserved */ ! 93: unsigned short xfr_len; /* Transfer Length */ ! 94: unsigned char control; /* Control byte. */ ! 95: } g5cmd_t; ! 96: ! 97: typedef union cdb_u *cdb_p; ! 98: ! 99: typedef union cdb_u { ! 100: g0cmd_t g0; ! 101: g1cmd_t g1; ! 102: g5cmd_t g5; ! 103: } cdb_t; ! 104: ! 105: typedef struct sense_s *sense_p; ! 106: ! 107: typedef struct sense_s { ! 108: unsigned char errorcode; /* Error Code: 0x0? */ ! 109: unsigned char lba_msb; /* LSB's MS 5 Bits */ ! 110: unsigned char lba_mid; /* Middle 8 bits */ ! 111: unsigned char lba_lsb; /* LS 8 Bits */ ! 112: } sense_t; ! 113: ! 114: typedef struct extsense_s *extsense_p; ! 115: ! 116: typedef struct extsense_s { ! 117: unsigned char errorcode; /* Error Code (70H) */ ! 118: unsigned char segmentnum; /* Number of current segment descriptor */ ! 119: unsigned char sensekey; /* Sense Key(See bit definitions too) */ ! 120: long info; /* Information MSB */ ! 121: unsigned char addlen; /* Additional Sense Length */ ! 122: unsigned char addbytes[1]; /* Additional Sense unsigned chars */ ! 123: } extsense_t; ! 124: ! 125: #ifdef __KERNEL__ ! 126: /***** Device Control Array *****/ ! 127: ! 128: typedef struct dca_s *dca_p; ! 129: ! 130: typedef struct dca_s { ! 131: int (*d_open)(); /* open routine for device */ ! 132: int (*d_close)(); /* close routine */ ! 133: int (*d_block)(); /* Block request routine (Strategy) */ ! 134: int (*d_read)(); /* Character Read routine */ ! 135: int (*d_write)(); /* Character Write routine */ ! 136: int (*d_ioctl)(); /* I/O Control routine */ ! 137: int (*d_load)(); /* Load or Init routine */ ! 138: int (*d_unload)(); /* Unload routine */ ! 139: int (*d_poll)(); /* Poll routine */ ! 140: } dca_t; ! 141: ! 142: typedef struct bufaddr_s *bufaddr_p; ! 143: ! 144: typedef struct bufaddr_s { ! 145: int space; /* Address space */ ! 146: union { ! 147: paddr_t paddr; /* Physical Address */ ! 148: caddr_t caddr; /* Virtual Address */ ! 149: } addr; ! 150: size_t size; /* Size of buffer */ ! 151: } bufaddr_t; ! 152: ! 153: typedef struct srb_s *srb_p; /* SCSI Request Block */ ! 154: ! 155: typedef struct srb_s { ! 156: unsigned short status; /* SCSI Status Byte */ ! 157: unsigned short hastat; /* Host Adapter Status Byte */ ! 158: dev_t dev; /* Device number (major/minor) */ ! 159: unsigned char target; /* Target ID */ ! 160: unsigned char lun; /* Logical Unit Number */ ! 161: unsigned short tries; /* Current tries */ ! 162: unsigned short timeout; /* Seconds til timeout */ ! 163: bufaddr_t buf; /* Buffer to use */ ! 164: unsigned short xferdir; /* Transfer Direction */ ! 165: int (*cleanup)(); /* Cleanup Function. */ ! 166: cdb_t cdb; /* Command to execute */ ! 167: char sensebuf[SENSELEN]; ! 168: } srb_t; ! 169: ! 170: #pragma align ! 171: ! 172: #ifdef HA_MODULE ! 173: extern dca_p mdca[MAXDEVS]; ! 174: #else ! 175: extern int hapresent; ! 176: #endif ! 177: ! 178: /*********************************************************************** ! 179: * Host Adapter routines. ! 180: * ! 181: * These must be defined by the host adapter module. For each individual ! 182: * routine's functionality see the host adapter module aha154x.c. ! 183: */ ! 184: ! 185: extern void hatimer(); ! 186: extern void haintr(); ! 187: extern int hainit(); ! 188: extern int startscsi(); ! 189: extern void abortscsi(); ! 190: extern void resetdevice(); ! 191: extern void haihdgeta(); ! 192: extern void haihdseta(); ! 193: ! 194: extern char iofailmsg[]; ! 195: extern int HAI_HAID; ! 196: ! 197: #define bit(n) (1 << (n)) ! 198: #define tid(d) (((d) & TIDMASK) >> 4) ! 199: #define lun(d) (((d) & LUNMASK) >> 2) ! 200: #define partn(d) (((d) & SPECIAL) ? 4 : ((d) & PARTMASK)) ! 201: ! 202: char *swapbytes(); ! 203: #define flip(o) swapbytes(&(o), sizeof(o)) ! 204: int cpycdb(); ! 205: void reqsense(); ! 206: void doscsi(); ! 207: void printsense(); ! 208: int printerror(); ! 209: void haiioctl(); ! 210: void hainonblk(); ! 211: #endif /* KERNEL */ ! 212: ! 213: #endif /* !defined( __SYS_HAISCSI_H__ ) */ ! 214: ! 215: /* End of file */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.