|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1992 NeXT Computer, Inc. ! 3: * ! 4: * Adaptec AHA-1542 SCSI controller inline functions. ! 5: * ! 6: * HISTORY ! 7: * ! 8: * 12 July 1992 David E. Bohman at NeXT ! 9: * Created. ! 10: */ ! 11: ! 12: #import <driverkit/i386/ioPorts.h> ! 13: ! 14: /* ! 15: * Primitives to access the ! 16: * board registers. ! 17: */ ! 18: ! 19: static inline ! 20: void ! 21: aha_put_ctrl( ! 22: unsigned short base, ! 23: aha_ctrl_reg_t reg ! 24: ) ! 25: { ! 26: union { ! 27: aha_ctrl_reg_t reg; ! 28: unsigned char data; ! 29: } tconv; ! 30: ! 31: tconv.reg = reg; ! 32: ! 33: outb(base + AHA_CTRL_REG_OFF, tconv.data); ! 34: } ! 35: ! 36: static inline ! 37: aha_stat_reg_t ! 38: aha_get_stat( ! 39: unsigned short base ! 40: ) ! 41: { ! 42: union { ! 43: aha_stat_reg_t reg; ! 44: unsigned char data; ! 45: } tconv; ! 46: ! 47: tconv.data = inb(base + AHA_STAT_REG_OFF); ! 48: ! 49: return (tconv.reg); ! 50: } ! 51: ! 52: static inline ! 53: aha_intr_reg_t ! 54: aha_get_intr( ! 55: unsigned short base ! 56: ) ! 57: { ! 58: union { ! 59: aha_intr_reg_t reg; ! 60: unsigned char data; ! 61: } tconv; ! 62: ! 63: tconv.data = inb(base + AHA_INTR_REG_OFF); ! 64: ! 65: return (tconv.reg); ! 66: } ! 67: ! 68: static inline ! 69: void ! 70: aha_put_cmd( ! 71: unsigned short base, ! 72: aha_cmd_reg_t reg ! 73: ) ! 74: { ! 75: outb(base + AHA_CMD_REG_OFF, reg); ! 76: } ! 77: ! 78: static inline ! 79: aha_cmd_reg_t ! 80: aha_get_cmd( ! 81: unsigned short base ! 82: ) ! 83: { ! 84: return (inb(base + AHA_CMD_REG_OFF)); ! 85: } ! 86: ! 87: /* ! 88: * Functions built on top ! 89: * of the primatives above. ! 90: */ ! 91: ! 92: static inline ! 93: void ! 94: aha_clr_intr( ! 95: unsigned short base ! 96: ) ! 97: { ! 98: aha_ctrl_reg_t ctrl = { 0 }; ! 99: ! 100: ctrl.intr_clr = 1; ! 101: ! 102: aha_put_ctrl(base, ctrl); ! 103: } ! 104: ! 105: ! 106: static inline ! 107: boolean_t ! 108: aha_await_datain( ! 109: IOEISAPortAddress base, ! 110: unsigned int how_long ! 111: ) ! 112: { ! 113: aha_stat_reg_t stat; ! 114: ! 115: do { ! 116: stat = aha_get_stat(base); ! 117: } while (!stat.datain_full && how_long--); ! 118: return how_long; ! 119: } ! 120: ! 121: ! 122: static inline ! 123: boolean_t ! 124: aha_get_bytes( ! 125: IOEISAPortAddress base, ! 126: unsigned char *addr, ! 127: unsigned int length ! 128: ) ! 129: { ! 130: while (length--) { ! 131: if (!aha_await_datain(base, 1000)) ! 132: return FALSE; ! 133: *addr++ = inb(base); ! 134: } ! 135: return TRUE; ! 136: } ! 137: ! 138: ! 139: /* ! 140: * 24-bit accessor functions (with byte swapping) ! 141: */ ! 142: static inline void ! 143: aha_put_24(unsigned int source, volatile unsigned char *dest) ! 144: { ! 145: dest[2] = source & 0xff; ! 146: dest[1] = (source >> 8) & 0xff; ! 147: dest[0] = (source >> 16) & 0xff; ! 148: } ! 149: ! 150: ! 151: static inline unsigned int ! 152: aha_get_24(volatile unsigned char *source) ! 153: { ! 154: return (source[0] << 16) | (source[1] << 8) | source[2]; ! 155: } ! 156: ! 157:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.