* kmc.c from 5.0 (on ihwld) hacked for 4.2
* KMC11 microprocessor driver
#include "../vaxuba/ubavar.h"
int kmcprobe(), kmcattach(), kmcxint();
struct uba_device
*kmcdinfo
[NKMC
];
u_short kmcstd
[] = { 0 };
struct uba_driver kmcdriver
=
{ kmcprobe
, 0, kmcattach
, 0, kmcstd
, "kmc", kmcdinfo
};
{ register int br
, cvec
; /* don't touch */
register struct kmcdevice
*kp
= (struct kmcdevice
*)reg
;
br
= 0; cvec
= br
; br
= cvec
;
kp
->sel4
= 0200; /* bus request */
kp
->sel6
= 0121111; /* mov csr4,obr */
register struct uba_device
*ui
;
switch(ui
->ui_flags
& 03) {
log(LOG_ERR
, "kmc%d: no protocol %d\n", ui
->ui_unit
,
register struct kmcdevice
*kp
;
if (dev
>=kmc_cnt
|| (tp
= &kmc
[dev
])->k_stat
&SOPEN
) {
kp
= ((struct kmcdevice
*)kmcdinfo
[dev
]->ui_addr
);
kmc
[dev
].k_stat
&= ~SOPEN
;
register struct kmcdevice
*kp
;
if (kmc
[dev
].k_stat
&SRUN
)
dsize
= (kmc
[dev
].k_type
==KMC11A
)?KASIZE
:KBSIZE
;
kp
= ((struct kmcdevice
*)kmcdinfo
[dev
]->ui_addr
);
if ((error
=ureadc(kp
->bsel6
, uio
)) < 0)
if ((error
=ureadc(kp
->bsel7
, uio
)) < 0)
} else if (ad
-= dsize
*2, ad
<dsize
) {
kp
->sel6
= 010000|(ad
&0377); /* mov ad,mar */
kp
->sel6
= 04000|((ad
>>8)&0377); /* mov %ad,%mar */
kp
->sel6
= 055222; /* mov mem,csr2|mar++ */
if ((error
=ureadc(kp
->bsel2
, uio
)) < 0)
} while (!error
&& uio
->uio_resid
);
register struct kmcdevice
*kp
;
if (kmc
[dev
].k_stat
&SRUN
)
dsize
= (kmc
[dev
].k_type
==KMC11A
)?KASIZE
:KBSIZE
;
kp
= ((struct kmcdevice
*)kmcdinfo
[dev
]->ui_addr
);
lobyte(ins
) = uwritec(uio
);
hibyte(ins
) = uwritec(uio
);
} else if (ad
-= dsize
*2, ad
<dsize
) {
kp
->sel6
= 010000|(ad
&0377); /* mov ad,mar */
kp
->sel6
= 04000|((ad
>>8)&0377); /* mov %ad,%mar */
kp
->bsel2
= uwritec(uio
);
kp
->sel6
= 0136440; /* mov csr2,mem|mar++ */
kmcioctl(dev
, cmd
, kk
, mode
)
register struct kmcdevice
*kp
;
if (rkmcdebug
) log(LOG_ERR
, "kmcioctl: cmd=%d, kk->kmd=%d, kk->kcsr=0x%x, kk->kval=%d\n",
cmd
, kk
->kmd
, kk
->kcsr
, kk
->kval
);
kp
= ((struct kmcdevice
*)kmcdinfo
[dev
]->ui_addr
);
while(getc(&tp
->k_inq
) >= 0) ;
if (copyout((caddr_t
)csr
, (caddr_t
)kk
->kcsr
, sizeof csr
))
tp
->k_stat
|= (kk
->kval
&STYPE
)|SRUN
;
kp
->bsel1
= kk
->kval
&(LUA
|LUB
);
if (rkmcdebug
) log(LOG_ERR
, "kmcioctl: EIO exit, tp->k_stat=0x%x\n", tp
->k_stat
);
register struct kmcdevice
*kp
;
kp
= ((struct kmcdevice
*)kmcdinfo
[dev
]->ui_addr
);
if ((tp
->k_stat
&SLOAD
) ||
q_to_b(&tp
->k_inq
, (char *)tp
->k_arg
, sizeof(tp
->k_arg
)) == sizeof(tp
->k_arg
)) {
kp
->sel2
= tp
->k_arg
[0]|RDYI
;
log(LOG_ERR
, "Bad kmc %d load\n", dev
);
if ((tp
->k_stat
&SLOAD
) || tp
->k_inq
.c_cc
)
register struct kmcdevice
*kp
;
kp
= ((struct kmcdevice
*)kmcdinfo
[dev
]->ui_addr
);
p1
= (dev
<<6)|(kp
->bsel3
&077);
(*tp
->k_rint
)(p1
, p2
, p3
, p4
);
register struct kmcdevice
*kp
;
kp
= ((struct kmcdevice
*)kmcdinfo
[unit
]->ui_addr
); /* RAV unit is suspect */
b_to_q((char *)tp
->k_arg
, sizeof(tp
->k_arg
), &tp
->k_inq
);
tp
->k_arg
[0] = (p1
&017)|((dev
&077)<<8);
b_to_q((char *)tp
->k_arg
, sizeof(tp
->k_arg
), &tp
->k_inq
);
register struct kmcdevice
*kp
;
kp
= ((struct kmcdevice
*)kmcdinfo
[unit
]->ui_addr
); /* RAV unit is suspect */
if ((tp
->k_stat
&(STYPE
|SRUN
|SOPEN
))!=((type
&STYPE
)|SRUN
))
register struct kmcdevice
*kp
;
if (dev
< 0 || dev
>= kmc_cnt
)
while (getc(&tp
->k_inq
) >= 0) ;
kp
= ((struct kmcdevice
*)kmcdinfo
[dev
]->ui_addr
);
register struct kmcdevice
*kp
;
kp
= ((struct kmcdevice
*)kmcdinfo
[dev
]->ui_addr
);
while(getc(&tp
->k_inq
)>=0);
if (unit
< 0 || unit
>= kmc_cnt
)
if (unit
< 0 || unit
>= kmc_cnt
)