|
|
1.1 ! root 1: /* uda.c 4.1 81/12/01 */ ! 2: ! 3: /* ! 4: * UDA50/RAxx disk device driver ! 5: */ ! 6: ! 7: #include <sys/param.h> ! 8: #include <sys/inode.h> ! 9: #include <sys/pte.h> ! 10: #include <sys/ubareg.h> ! 11: #include "saio.h" ! 12: #include "savax.h" ! 13: ! 14: /* ! 15: * Parameters for the communications area ! 16: */ ! 17: #define NRSPL2 0 ! 18: #define NCMDL2 0 ! 19: #define NRSP (1<<NRSPL2) ! 20: #define NCMD (1<<NCMDL2) ! 21: ! 22: #include <sys/udareg.h> ! 23: #include <sys/mscp.h> ! 24: ! 25: ! 26: u_short udastd[] = { 0772150 }; ! 27: ! 28: struct iob cudbuf; ! 29: ! 30: struct udadevice *udaddr = 0; ! 31: ! 32: struct uda { ! 33: struct udaca uda_ca; ! 34: struct mscp uda_rsp; ! 35: struct mscp uda_cmd; ! 36: } uda; ! 37: ! 38: struct uda *ud_ubaddr; /* Unibus address of uda structure */ ! 39: ! 40: int uda_off[] = { 0, 20480, 0, -1, -1, -1, 49324, 131404 }; ! 41: ! 42: int udaref = 0; ! 43: ! 44: struct mscp *udcmd(); ! 45: ! 46: udopen(io) ! 47: register struct iob *io; ! 48: { ! 49: register struct mscp *mp; ! 50: int i; ! 51: ! 52: if (udaddr == 0) ! 53: udaddr = (struct udadevice *)ubamem(io->i_unit, udastd[0]); ! 54: if (ud_ubaddr == 0) { ! 55: cudbuf.i_ma = (caddr_t)&uda; ! 56: cudbuf.i_cc = sizeof(uda); ! 57: ud_ubaddr = (struct uda *)ubasetup(&cudbuf, 2); ! 58: } ! 59: udaddr->udaip = 0; ! 60: while ((udaddr->udasa & UDA_STEP1) == 0) ! 61: ; ! 62: udaddr->udasa = UDA_ERR; ! 63: while ((udaddr->udasa & UDA_STEP2) == 0) ! 64: ; ! 65: udaddr->udasa = (short)&ud_ubaddr->uda_ca.ca_ringbase; ! 66: while ((udaddr->udasa & UDA_STEP3) == 0) ! 67: ; ! 68: udaddr->udasa = (short)(((int)&ud_ubaddr->uda_ca.ca_ringbase) >> 16); ! 69: while ((udaddr->udasa & UDA_STEP4) == 0) ! 70: ; ! 71: udaddr->udasa = UDA_GO; ! 72: uda.uda_ca.ca_rspdsc[0] = (long)&ud_ubaddr->uda_rsp.mscp_cmdref; ! 73: uda.uda_ca.ca_cmddsc[0] = (long)&ud_ubaddr->uda_cmd.mscp_cmdref; ! 74: uda.uda_cmd.mscp_cntflgs = 0; ! 75: if (udcmd(M_OP_STCON) == 0) { ! 76: _stop("ra: open error, STCON"); ! 77: return; ! 78: } ! 79: uda.uda_cmd.mscp_unit = io->i_unit&7; ! 80: if (udcmd(M_OP_ONLIN) == 0) { ! 81: _stop("ra: open error, ONLIN"); ! 82: return; ! 83: } ! 84: if (io->i_boff < 0 || io->i_boff > 7 || uda_off[io->i_boff] == -1) ! 85: _stop("ra: bad unit"); ! 86: io->i_boff = uda_off[io->i_boff]; ! 87: udaref++; ! 88: } ! 89: ! 90: struct mscp * ! 91: udcmd(op) ! 92: int op; ! 93: { ! 94: struct mscp *mp; ! 95: int i; ! 96: ! 97: uda.uda_cmd.mscp_opcode = op; ! 98: uda.uda_rsp.mscp_header.uda_msglen = sizeof (struct mscp); ! 99: uda.uda_cmd.mscp_header.uda_msglen = sizeof (struct mscp); ! 100: uda.uda_ca.ca_rspdsc[0] |= UDA_OWN|UDA_INT; ! 101: uda.uda_ca.ca_cmddsc[0] |= UDA_OWN|UDA_INT; ! 102: i = udaddr->udaip; ! 103: for (;;) { ! 104: if (uda.uda_ca.ca_cmdint) ! 105: uda.uda_ca.ca_cmdint = 0; ! 106: if (uda.uda_ca.ca_rspint) ! 107: break; ! 108: } ! 109: uda.uda_ca.ca_rspint = 0; ! 110: mp = &uda.uda_rsp; ! 111: if (mp->mscp_opcode != (op|M_OP_END) || ! 112: (mp->mscp_status&M_ST_MASK) != M_ST_SUCC) ! 113: return(0); ! 114: return(mp); ! 115: } ! 116: ! 117: udstrategy(io, func) ! 118: register struct iob *io; ! 119: { ! 120: register struct mscp *mp; ! 121: int ubinfo; ! 122: ! 123: ubinfo = ubasetup(io, 1); ! 124: mp = &uda.uda_cmd; ! 125: mp->mscp_lbn = io->i_bn; ! 126: mp->mscp_unit = io->i_unit&7; ! 127: mp->mscp_bytecnt = io->i_cc; ! 128: mp->mscp_buffer = (ubinfo & 0x3ffff) | (((ubinfo>>28)&0xf)<<24); ! 129: if ((mp = udcmd(func == READ ? M_OP_READ : M_OP_WRITE)) == 0) { ! 130: printf("ra: I/O error\n"); ! 131: ubafree(io, ubinfo); ! 132: return(-1); ! 133: } ! 134: ubafree(io, ubinfo); ! 135: return(io->i_cc); ! 136: } ! 137: ! 138: udclose(io) ! 139: register struct iob *io; ! 140: { ! 141: ! 142: if (--udaref <= 0) { ! 143: udaref = 0; ! 144: udaddr->udaip = 0; /* reset */ ! 145: } ! 146: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.