|
|
1.1 root 1: /* hp.old.c 6.1 83/07/29 */
2:
3: /*
4: * RP??/RM?? disk 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 "../vaxmba/hpreg.h"
13: #include "../vaxmba/mbareg.h"
14:
15: #include "saio.h"
16: #include "savax.h"
17:
18: #define MASKREG(reg) ((reg)&0xffff)
19:
20: short hptypes[] = {
21: MBDT_RM03,
22: MBDT_RM05,
23: MBDT_RP06,
24: MBDT_RM80,
25: MBDT_RP05,
26: MBDT_RP07,
27: MBDT_ML11A,
28: MBDT_ML11B,
29: -1, /* 9755 */
30: -1, /* 9730 */
31: -1, /* Capricorn */
32: -1, /* Eagle */
33: MBDT_RM02, /* actually something else */
34: -1, /* 9300 */
35: 0
36: };
37:
38: #define RP06 (hptypes[hp_type[unit]] <= MBDT_RP06)
39: #define ML11 (hptypes[hp_type[unit]] == MBDT_ML11A)
40: #define RM80 (hptypes[hp_type[unit]] == MBDT_RM80)
41:
42: char hp_type[MAXNMBA*8] = { 0 };
43: extern struct st hpst[];
44:
45: hpopen(io)
46: register struct iob *io;
47: {
48: register unit = io->i_unit;
49: struct hpdevice *hpaddr = (struct hpdevice *)mbadrv(unit);
50: register struct st *st;
51:
52: mbainit(UNITTOMBA(io->i_unit));
53: if (hp_type[unit] == 0) {
54: register i, type = hpaddr->hpdt & MBDT_TYPE;
55:
56: for (i = 0; hptypes[i]; i++)
57: if (hptypes[i] == type)
58: goto found;
59: _stop("unknown drive type");
60: found:
61: hpaddr->hpcs1 = HP_DCLR|HP_GO; /* init drive */
62: hpaddr->hpcs1 = HP_PRESET|HP_GO;
63: if (type != MBDT_ML11A && type != MBDT_ML11B)
64: hpaddr->hpof = HPOF_FMT22;
65: hp_type[unit] = hpmaptype(hpaddr, i, unit);
66: }
67: st = &hpst[hp_type[unit]];
68: if (io->i_boff < 0 || io->i_boff > 7 ||
69: st->off[io->i_boff]== -1)
70: _stop("hp bad minor");
71: io->i_boff = st->off[io->i_boff] * st->nspc;
72: }
73:
74: hpstrategy(io, func)
75: register struct iob *io;
76: {
77: int unit = io->i_unit;
78: daddr_t bn = io->i_bn;
79: struct hpdevice *hpaddr = (struct hpdevice *)mbadrv(unit);
80: struct st *st = &hpst[hp_type[unit]];
81: int cn, tn, sn;
82:
83: if ((hpaddr->hpds & HPDS_VV) == 0) {
84: hpaddr->hpcs1 = HP_DCLR|HP_GO;
85: hpaddr->hpcs1 = HP_PRESET|HP_GO;
86: if (!ML11)
87: hpaddr->hpof = HPOF_FMT22;
88: }
89: cn = bn/st->nspc;
90: sn = bn%st->nspc;
91: tn = sn/st->nsect;
92: sn = sn%st->nsect;
93: if (ML11)
94: hpaddr->hpda = bn;
95: else {
96: hpaddr->hpdc = cn;
97: hpaddr->hpda = (tn << 8) + sn;
98: }
99: mbastart(io, func);
100: while ((hpaddr->hpds & HPDS_DRY) == 0)
101: ;
102: if (hpaddr->hpds&HPDS_ERR) {
103: printf("hp error: (cyl,trk,sec)=(%d,%d,%d) ds=%b er1=%b\n",
104: cn, tn, sn, MASKREG(hpaddr->hpds), HPDS_BITS,
105: MASKREG(hpaddr->hper1), HPER1_BITS);
106: return (-1);
107: }
108: return (io->i_cc);
109: }
110:
111: /*ARGSUSED*/
112: hpioctl(io, cmd, arg)
113: struct iob *io;
114: int cmd;
115: caddr_t arg;
116: {
117:
118: return (ECMD);
119: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.