BSD 4_1_snap development
[unix-history] / sys / stand / hp.c
CommitLineData
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
17char hp_type[MAXNMBA*8] = { 0 };
18
19/* THIS SHOULD BE READ IN OFF THE PACK, PER DRIVE */
20short hp6_off[8] = { 0, 38, 0, -1, -1, -1, 118, -1 };
21short rm3_off[8] = { 0, 100, 0, -1, -1, -1, 310, -1 };
22short rm5_off[8] = { 0, 27, 0, 562, 589, 681, 562, 82 };
23short rm80_off[8] = { 0, 37, 0, -1, -1, -1, 115, 305 };
24short hp7_off[8] = { 0, 10, 0, 330, 340, 500, 330, 50 };
25/* END SHOULD BE READ IN */
26
27short hptypes[] =
28 { MBDT_RM03, MBDT_RM05, MBDT_RP06, MBDT_RM80, MBDT_RP05, MBDT_RP07, 0 };
29
30struct 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
45hpopen(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");
61found:
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
71hpstrategy(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}