#define NRSP 0
#define NCMD 0
#include <sys/param.h>
#include <sys/disklabel.h>
#include <lib/libsa/stand.h>
#include "../include/pte.h"
#include <dev/mscp/mscp.h>
#include <dev/mscp/mscpreg.h>
#include "vaxstand.h"
static command(int,int);
struct ra_softc {
int udaddr;
int ubaddr;
int unit;
};
static volatile struct uda {
struct mscp_1ca uda_ca;
struct mscp uda_rsp;
struct mscp uda_cmd;
} uda;
struct udadevice {
short udaip;
short udasa;
};
static volatile struct uda *ubauda;
static volatile struct udadevice *udacsr;
static struct ra_softc ra_softc;
static int curblock;
tmscpopen(struct open_file *f, int adapt, int ctlr, int unit, int part)
{
char *msg;
extern u_int tmsaddr;
volatile struct ra_softc *ra=&ra_softc;
volatile u_int *nisse;
unsigned short johan;
int i,err;
curblock = 0;
if(adapt>nuba) return(EADAPT);
if(ctlr>nuda) return(ECTLR);
ra->udaddr=uioaddr[adapt]+tmsaddr;
ra->ubaddr=(int)ubaaddr[adapt];
ra->unit=unit;
udacsr=(void*)ra->udaddr;
nisse=((u_int *)ubaaddr[adapt]) + 512;
nisse[494]=PG_V|(((u_int)&uda)>>9);
nisse[495]=nisse[494]+1;
ubauda=(void*)0x3dc00+(((u_int)(&uda))&0x1ff);
udacsr->udaip=0;
while((udacsr->udasa&MP_STEP1) == 0);
udacsr->udasa=0x8000;
while((udacsr->udasa&MP_STEP2) == 0);
johan=(((u_int)ubauda)&0xffff)+8;
udacsr->udasa=johan;
while((udacsr->udasa&MP_STEP3) == 0);
udacsr->udasa=3;
while((udacsr->udasa&MP_STEP4) == 0);
udacsr->udasa=0x0001;
uda.uda_ca.ca_rspdsc=(int)&ubauda->uda_rsp.mscp_cmdref;
uda.uda_ca.ca_cmddsc=(int)&ubauda->uda_cmd.mscp_cmdref;
uda.uda_cmd.mscp_un.un_seq.seq_addr = (long *)&uda.uda_ca.ca_cmddsc;
uda.uda_rsp.mscp_un.un_seq.seq_addr = (long *)&uda.uda_ca.ca_rspdsc;
uda.uda_cmd.mscp_vcid = 1;
uda.uda_cmd.mscp_un.un_sccc.sccc_ctlrflags = 0;
command(M_OP_SETCTLRC, 0);
uda.uda_cmd.mscp_unit=ra->unit;
command(M_OP_ONLINE, 0);
if (part) {
uda.uda_cmd.mscp_un.un_seq.seq_buffer = part;
command(M_OP_POS, 0);
uda.uda_cmd.mscp_un.un_seq.seq_buffer = 0;
}
f->f_devdata=(void *)ra;
return(0);
}
static
command(cmd, arg)
{
volatile int hej;
uda.uda_cmd.mscp_opcode = cmd;
uda.uda_cmd.mscp_modifier = arg;
uda.uda_cmd.mscp_msglen = MSCP_MSGLEN;
uda.uda_rsp.mscp_msglen = MSCP_MSGLEN;
uda.uda_ca.ca_rspdsc |= MSCP_OWN|MSCP_INT;
uda.uda_ca.ca_cmddsc |= MSCP_OWN|MSCP_INT;
hej = udacsr->udaip;
while (uda.uda_ca.ca_rspdsc < 0) {
if (uda.uda_ca.ca_cmdint)
uda.uda_ca.ca_cmdint = 0;
}
}
tmscpstrategy(struct ra_softc *ra, int func, daddr_t dblk, u_int size, char *buf, u_int *rsize)
{
u_int i,j,pfnum, mapnr, nsize, bn, cn, sn, tn;
volatile struct udadevice *udadev=(void*)ra->udaddr;
volatile u_int *ptmapp = (u_int *)ra->ubaddr + 512;
volatile int hej;
pfnum=(u_int)buf>>VAX_PGSHIFT;
for(mapnr=0, nsize=size;(nsize+VAX_NBPG)>0;nsize-=VAX_NBPG)
ptmapp[mapnr++]=PG_V|pfnum++;
if (dblk < curblock) {
uda.uda_cmd.mscp_seq.seq_bytecount = curblock - dblk;
command(M_OP_POS, 12);
} else {
uda.uda_cmd.mscp_seq.seq_bytecount = dblk - curblock;
command(M_OP_POS, 4);
}
curblock = size/512 + dblk;
for (i = 0 ; i < size/512 ; i++) {
uda.uda_cmd.mscp_seq.seq_lbn = 1;
uda.uda_cmd.mscp_seq.seq_bytecount = 512;
uda.uda_cmd.mscp_seq.seq_buffer =
(((u_int)buf) & 0x1ff) + i * 512;
uda.uda_cmd.mscp_unit = ra->unit;
command(M_OP_READ, 0);
}
*rsize=size;
return 0;
}