Commit | Line | Data |
---|---|---|
03db1d51 C |
1 | /* hp.c 4.6 81/05/10 */ |
2 | ||
3 | /* | |
4 | * RP??/RM?? disk driver | |
5 | */ | |
6 | ||
7 | #include "../h/param.h" | |
8 | #include "../h/inode.h" | |
9 | #include "../h/hpreg.h" | |
10 | #include "../h/pte.h" | |
11 | #include "../h/mbareg.h" | |
12 | #include "saio.h" | |
13 | #include "savax.h" | |
14 | ||
15 | #define MASKREG(reg) ((reg)&0xffff) | |
16 | ||
17 | char hp_type[MAXNMBA*8] = { 0 }; | |
18 | ||
19 | /* THIS SHOULD BE READ IN OFF THE PACK, PER DRIVE */ | |
20 | short hp6_off[8] = { 0, 38, 0, -1, -1, -1, 118, -1 }; | |
21 | short rm3_off[8] = { 0, 100, 0, -1, -1, -1, 310, -1 }; | |
22 | short rm5_off[8] = { 0, 27, 0, 562, 589, 681, 562, 82 }; | |
23 | short rm80_off[8] = { 0, 37, 0, -1, -1, -1, 115, 305 }; | |
24 | short hp7_off[8] = { 0, 10, 0, 330, 340, 500, 330, 50 }; | |
25 | /* END SHOULD BE READ IN */ | |
26 | ||
27 | short hptypes[] = | |
28 | { MBDT_RM03, MBDT_RM05, MBDT_RP06, MBDT_RM80, MBDT_RP05, MBDT_RP07, 0 }; | |
29 | ||
30 | struct hpst { | |
31 | short nsect; | |
32 | short ntrak; | |
33 | short nspc; | |
34 | short ncyl; | |
35 | short *off; | |
36 | } hpst[] = { | |
37 | 32, 5, 32*5, 823, rm3_off, /* RM03 */ | |
38 | 32, 19, 32*19, 823, rm5_off, /* RM05 */ | |
39 | 22, 19, 22*19, 815, hp6_off, /* RP06 */ | |
40 | 31, 14, 31*14, 559, rm80_off, /* RM80 */ | |
41 | 22, 19, 22*19, 411, hp6_off, /* RP06 */ | |
42 | 50, 32, 50*32, 630, hp7_off, /* RP07 */ | |
43 | }; | |
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 hpst *st; | |
51 | ||
52 | mbainit(UNITTOMBA(io->i_unit)); | |
53 | if (hp_type[unit] == 0) { | |
54 | register type = hpaddr->hpdt & MBDT_TYPE; | |
55 | register int i; | |
56 | ||
57 | for (i = 0; hptypes[i]; i++) | |
58 | if (hptypes[i] == type) | |
59 | goto found; | |
60 | _stop("unknown drive type"); | |
61 | found: | |
62 | hp_type[unit] = i; | |
63 | } | |
64 | st = &hpst[hp_type[unit]]; | |
65 | if (io->i_boff < 0 || io->i_boff > 7 || | |
66 | st->off[io->i_boff]== -1) | |
67 | _stop("hp bad minor"); | |
68 | io->i_boff = st->off[io->i_boff] * st->nspc; | |
69 | } | |
70 | ||
71 | hpstrategy(io, func) | |
72 | register struct iob *io; | |
73 | { | |
74 | int unit = io->i_unit; | |
75 | daddr_t bn = io->i_bn; | |
76 | struct hpdevice *hpaddr = (struct hpdevice *)mbadrv(unit); | |
77 | struct hpst *st = &hpst[hp_type[unit]]; | |
78 | int cn, tn, sn; | |
79 | ||
80 | if ((hpaddr->hpds & HPDS_VV) == 0) { | |
81 | hpaddr->hpcs1 = HP_DCLR|HP_GO; | |
82 | hpaddr->hpcs1 = HP_PRESET|HP_GO; | |
83 | hpaddr->hpof = HPOF_FMT22; | |
84 | } | |
85 | cn = bn/st->nspc; | |
86 | sn = bn%st->nspc; | |
87 | tn = sn/st->nsect; | |
88 | sn = sn%st->nsect; | |
89 | hpaddr->hpdc = cn; | |
90 | hpaddr->hpda = (tn << 8) + sn; | |
91 | mbastart(io, func); | |
92 | while ((hpaddr->hpds & HPDS_DRY) == 0) | |
93 | ; | |
94 | if (hpaddr->hpds&HPDS_ERR) { | |
95 | printf("hp error: (cyl,trk,sec)=(%d,%d,%d) ds=%b er1=%b\n", | |
96 | cn, tn, sn, MASKREG(hpaddr->hpds), HPDS_BITS, | |
97 | MASKREG(hpaddr->hper1), HPER1_BITS); | |
98 | return (-1); | |
99 | } | |
100 | return (io->i_cc); | |
101 | } |