|
|
1.1 root 1: /*
2: * Copyright (c) 1988 Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution is only permitted until one year after the first shipment
6: * of 4.4BSD by the Regents. Otherwise, redistribution and use in source and
7: * binary forms are permitted provided that: (1) source distributions retain
8: * this entire copyright notice and comment, and (2) distributions including
9: * binaries display the following acknowledgement: This product includes
10: * software developed by the University of California, Berkeley and its
11: * contributors'' in the documentation or other materials provided with the
12: * distribution and in all advertising materials mentioning features or use
13: * of this software. Neither the name of the University nor the names of
14: * its contributors may be used to endorse or promote products derived from
15: * this software without specific prior written permission.
16: * THIS SOFTWARE IS PROVIDED AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
17: * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
18: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
19: *
20: * @(#)kdb.c 7.7 (Berkeley) 6/28/90
21: */
22:
23: /*
24: * KDB50/RAxx disk device driver
25: */
26: #include "machine/pte.h"
27:
28: #include "param.h"
29: #include "disklabel.h"
30:
31: #include "saio.h"
32: #include "savax.h"
33:
34: /*
35: * N.B.: on KDB50, controller == adapter
36: * here we just use the controller number
37: */
38:
39: #define NKRA 8 /* max drive number */
40: #define SECTSIZ 512 /* sector size in bytes */
41:
42: /*
43: * Parameters for the communications area:
44: * command and response rings both one entry.
45: */
46: #define NRSP 1
47: #define NCMD 1
48:
49: #include "../vaxbi/bireg.h"
50: #include "../vaxbi/kdbreg.h"
51: #include "../vax/mscp.h"
52:
53: struct kdb {
54: struct kdbca kdb_ca;
55: struct mscp kdb_rsp;
56: struct mscp kdb_cmd;
57: } kdb;
58:
59: int kdbinit[MAXNKDB];
60: struct disklabel kralabel[MAXNKDB][NKRA];
61: u_long kramedia[MAXNKDB][NKRA];
62: char lbuf[SECTSIZ];
63:
64: kraopen(io)
65: register struct iob *io;
66: {
67: register struct kdb_regs *kr;
68: register struct disklabel *lp;
69: register int ctlr, unit;
70: struct iob tio;
71:
72: if ((u_int)(ctlr = io->i_ctlr) >= nkdb)
73: return (EADAPT);
74: if ((u_int)(unit = io->i_unit) >= NKRA)
75: return (EUNIT);
76: kr = (struct kdb_regs *)kdbaddr[ctlr];
77: if (kdbinit[ctlr] == 0) {
78: kr->kdb_bi.bi_csr |= BICSR_NRST;
79: DELAY(10000); /* ??? */
80: /* clear any bus errors */
81: kr->kdb_bi.bi_ber = ~(BIBER_MBZ|BIBER_NMR|BIBER_UPEN);
82: while ((kr->kdb_sa & KDB_STEP1) == 0)
83: /* void */;
84: kr->kdb_bi.bi_bcicsr |= BCI_STOPEN | BCI_IDENTEN;
85: kr->kdb_sw = KDB_ERR;
86: while ((kr->kdb_sa & KDB_STEP2) == 0)
87: /* void */;
88: kr->kdb_sw = (int)&kdb.kdb_ca.ca_rspdsc[0];
89: while ((kr->kdb_sa & KDB_STEP3) == 0)
90: /* void */;
91: kr->kdb_sw = (int)&kdb.kdb_ca.ca_rspdsc[0] >> 16;
92: while ((kr->kdb_sa & KDB_STEP4) == 0)
93: /* void */;
94: kr->kdb_sw = KDB_GO;
95: kdb.kdb_ca.ca_rspdsc[0] = (long)&kdb.kdb_rsp.mscp_cmdref;
96: kdb.kdb_ca.ca_cmddsc[0] = (long)&kdb.kdb_cmd.mscp_cmdref;
97: if (kdbcmd(M_OP_SETCTLRC, io)) {
98: printf("kra: open error, SETCTLRC\n");
99: return (ENXIO);
100: }
101: kdbinit[ctlr] = 1;
102: }
103: lp = &kralabel[ctlr][unit];
104: if (kramedia[ctlr][unit] == 0) {
105: kdb.kdb_cmd.mscp_unit = unit;
106: if (kdbcmd(M_OP_ONLINE, io)) {
107: printf("kra: open error, ONLINE\n");
108: return (ENXIO);
109: }
110: kramedia[ctlr][unit] = kdb.kdb_rsp.mscp_onle.onle_mediaid;
111: tio = *io;
112: tio.i_bn = LABELSECTOR;
113: tio.i_ma = lbuf;
114: tio.i_cc = SECTSIZ;
115: tio.i_flgs |= F_RDDATA;
116: if (krastrategy(&tio, READ) != SECTSIZ)
117: return (ERDLAB);
118: *lp = *(struct disklabel *)(lbuf + LABELOFFSET);
119: if (lp->d_magic != DISKMAGIC || lp->d_magic2 != DISKMAGIC) {
120: #ifdef COMPAT_42
121: printf("kra%d: unlabeled\n", unit);
122: kramaptype(io, lp);
123: #else
124: return (EUNLAB);
125: #endif
126: }
127: }
128: if ((u_int)io->i_part >= lp->d_npartitions ||
129: (io->i_boff = lp->d_partitions[io->i_part].p_offset) == -1)
130: return (EPART);
131: return (0);
132: }
133:
134: kdbcmd(op, io)
135: int op;
136: struct iob *io;
137: {
138: register struct kdb *k = &kdb;
139: register struct mscp *mp;
140: register int i;
141:
142: k->kdb_cmd.mscp_opcode = op;
143: k->kdb_rsp.mscp_msglen = MSCP_MSGLEN;
144: k->kdb_cmd.mscp_msglen = MSCP_MSGLEN;
145: k->kdb_ca.ca_rspdsc[0] |= MSCP_OWN | MSCP_INT;
146: k->kdb_ca.ca_cmddsc[0] |= MSCP_OWN | MSCP_INT;
147: i = ((struct kdb_regs *)kdbaddr[io->i_ctlr])->kdb_ip;
148: #ifdef lint
149: i = i;
150: #endif
151: mp = &k->kdb_rsp;
152: for (;;) {
153: if (k->kdb_ca.ca_cmdint)
154: k->kdb_ca.ca_cmdint = 0;
155: if (k->kdb_ca.ca_rspint == 0)
156: continue;
157: k->kdb_ca.ca_rspint = 0;
158: if (mp->mscp_opcode == (op | M_OP_END))
159: break;
160: printf("unexpected rsp type %x op %x ignored\n",
161: MSCP_MSGTYPE(mp->mscp_msgtc), mp->mscp_opcode);
162: k->kdb_ca.ca_rspdsc[0] |= MSCP_OWN | MSCP_INT;
163: }
164: if ((mp->mscp_status & M_ST_MASK) != M_ST_SUCCESS)
165: return (-1);
166: return (0);
167: }
168:
169: krastrategy(io, func)
170: register struct iob *io;
171: int func;
172: {
173: register struct mscp *mp;
174:
175: mp = &kdb.kdb_cmd;
176: mp->mscp_unit = io->i_unit;
177: mp->mscp_seq.seq_lbn = io->i_bn;
178: mp->mscp_seq.seq_bytecount = io->i_cc;
179: mp->mscp_seq.seq_buffer = (long)io->i_ma | KDB_PHYS;
180: if (kdbcmd(func == READ ? M_OP_READ : M_OP_WRITE, io)) {
181: printf("kra: I/O error\n");
182: return (-1);
183: }
184: return (io->i_cc);
185: }
186:
187: #ifdef COMPAT_42
188: u_long kra60_off[] = { 0, 15884, 0, 49324, 131404, 49324, 242606, 49324 };
189: #define kra70_off kra60_off
190: u_long kra80_off[] = { 0, 15884, 0, -1, 49324, 49324, 49910, 131404 };
191: u_long kra81_off[] = { 0, 15884, 0, 131404, 49324, 498790, 563050, 131404 };
192: u_long kra82_off[] = { 0, 15884, 0, 375345, 391590, 699390, 375345, 83790 };
193:
194: struct mediamap {
195: u_long id; /* media ID */
196: u_long *off; /* offsets */
197: } kra_map[] = {
198: { MSCP_MKDRIVE2('R', 'A', 60), kra60_off },
199: { MSCP_MKDRIVE2('R', 'A', 70), kra70_off },
200: { MSCP_MKDRIVE2('R', 'A', 80), kra80_off },
201: { MSCP_MKDRIVE2('R', 'A', 81), kra81_off },
202: { MSCP_MKDRIVE2('R', 'A', 82), kra82_off },
203: 0
204: };
205:
206: kramaptype(io, lp)
207: register struct iob *io;
208: register struct disklabel *lp;
209: {
210: register struct partition *pp;
211: register u_long i;
212: register struct mediamap *map;
213:
214: i = MSCP_MEDIA_DRIVE(kramedia[io->i_ctlr][io->i_unit]);
215: for (map = kra_map; map->id != 0; map++) {
216: if (map->id == i) {
217: lp->d_npartitions = 8;
218: for (pp = lp->d_partitions, i = 0; i < 8; pp++, i++)
219: pp->p_offset = map->off[i];
220: return;
221: }
222: }
223: printf("kra%d: media type 0x%x unsupported\n", io->i_unit, i);
224: lp->d_npartitions = 0;
225: }
226: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.