Add original unix v6
This commit is contained in:
+103
@@ -0,0 +1,103 @@
|
||||
#
|
||||
/*
|
||||
*/
|
||||
|
||||
/*
|
||||
* RF disk driver
|
||||
*/
|
||||
|
||||
#include "../param.h"
|
||||
#include "../buf.h"
|
||||
#include "../conf.h"
|
||||
#include "../user.h"
|
||||
|
||||
struct {
|
||||
int rfcs;
|
||||
int rfwc;
|
||||
int rfba;
|
||||
int rfda;
|
||||
int rfdae;
|
||||
};
|
||||
|
||||
struct devtab rftab;
|
||||
struct buf rrfbuf;
|
||||
|
||||
#define NRFBLK 1024
|
||||
#define RFADDR 0177460
|
||||
|
||||
#define GO 01
|
||||
#define RCOM 02
|
||||
#define WCOM 04
|
||||
#define CTLCLR 0400
|
||||
#define IENABLE 0100
|
||||
|
||||
rfstrategy(abp)
|
||||
struct buf *abp;
|
||||
{
|
||||
register struct buf *bp;
|
||||
|
||||
bp = abp;
|
||||
if(bp->b_flags&B_PHYS)
|
||||
mapalloc(bp);
|
||||
if (bp->b_blkno >= NRFBLK*(bp->b_dev.d_minor+1)) {
|
||||
bp->b_flags =| B_ERROR;
|
||||
iodone(bp);
|
||||
return;
|
||||
}
|
||||
bp->av_forw = 0;
|
||||
spl5();
|
||||
if (rftab.d_actf==0)
|
||||
rftab.d_actf = bp;
|
||||
else
|
||||
rftab.d_actl->av_forw = bp;
|
||||
rftab.d_actl = bp;
|
||||
if (rftab.d_active==0)
|
||||
rfstart();
|
||||
spl0();
|
||||
}
|
||||
|
||||
rfstart()
|
||||
{
|
||||
register struct buf *bp;
|
||||
|
||||
if ((bp = rftab.d_actf) == 0)
|
||||
return;
|
||||
rftab.d_active++;
|
||||
RFADDR->rfdae = bp->b_blkno.hibyte;
|
||||
devstart(bp, &RFADDR->rfda, bp->b_blkno<<8, 0);
|
||||
}
|
||||
|
||||
rfintr()
|
||||
{
|
||||
register struct buf *bp;
|
||||
|
||||
if (rftab.d_active == 0)
|
||||
return;
|
||||
bp = rftab.d_actf;
|
||||
rftab.d_active = 0;
|
||||
if (RFADDR->rfcs < 0) { /* error bit */
|
||||
deverror(bp, RFADDR->rfcs, RFADDR->rfdae);
|
||||
RFADDR->rfcs = CTLCLR;
|
||||
if (++rftab.d_errcnt <= 10) {
|
||||
rfstart();
|
||||
return;
|
||||
}
|
||||
bp->b_flags =| B_ERROR;
|
||||
}
|
||||
rftab.d_errcnt = 0;
|
||||
rftab.d_actf = bp->av_forw;
|
||||
iodone(bp);
|
||||
rfstart();
|
||||
}
|
||||
|
||||
rfread(dev)
|
||||
{
|
||||
|
||||
physio(rfstrategy, &rrfbuf, dev, B_READ);
|
||||
}
|
||||
|
||||
rfwrite(dev)
|
||||
{
|
||||
|
||||
physio(rfstrategy, &rrfbuf, dev, B_WRITE);
|
||||
}
|
||||
Reference in New Issue
Block a user