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