5350: #
5351: /*
5352: */
5353:
5354: /*
5355: * RK disk driver
5356: */
5357:
5358: #include "../param.h"
5359: #include "../buf.h"
5360: #include "../conf.h"
5361: #include "../user.h"
5362:
5363: #define RKADDR 0177400
5364: #define NRK 4
5365: #define NRKBLK 4872
5366:
5367: #define RESET 0
5368: #define GO 01
5369: #define DRESET 014
5370: #define IENABLE 0100
5371: #define DRY 0200
5372: #define ARDY 0100
5373: #define WLO 020000
5374: #define CTLRDY 0200
5375:
5376: struct {
5377: int rkds;
5378: int rker;
5379: int rkcs;
5380: int rkwc;
5381: int rkba;
5382: int rkda;
5383: };
5384: /* --------------------------- */
5385:
5386: struct devtab rktab;
5387: struct buf rrkbuf;
5388:
5389: rkstrategy(abp)
5390: struct buf *abp;
5391: {
5392: register struct buf *bp;
5393: register *qc, *ql;
5394: int d;
5395:
5396: bp = abp;
5397: if(bp->b_flags&B_PHYS)
5398: mapalloc(bp);
5399: d = bp->b_dev.d_minor-7;
5400: if(d <= 0)
5401: d = 1;
5402: if (bp->b_blkno >= NRKBLK*d) {
5403: bp->b_flags =| B_ERROR;
5404: iodone(bp);
5405: return;
5406: }
5407: bp->av_forw = 0;
5408: spl5();
5409: if (rktab.d_actf==0)
5410: rktab.d_actf = bp;
5411: else
5412: rktab.d_actl->av_forw = bp;
5413: rktab.d_actl = bp;
5414: if (rktab.d_active==0)
5415: rkstart();
5416: spl0();
5417: }
5418: /* --------------------------- */
5419:
5420: rkaddr(bp)
5421: struct buf *bp;
5422: {
5423: register struct buf *p;
5424: register int b;
5425: int d, m;
5426:
5427: p = bp;
5428: b = p->b_blkno;
5429: m = p->b_dev.d_minor - 7;
5430: if(m <= 0)
5431: d = p->b_dev.d_minor;
5432: else {
5433: d = lrem(b, m);
5434: b = ldiv(b, m);
5435: }
5436: return(d<<13 | (b/12)<<4 | b%12);
5437: }
5438: /* --------------------------- */
5439:
5440: rkstart()
5441: {
5442: register struct buf *bp;
5443:
5444: if ((bp = rktab.d_actf) == 0)
5445: return;
5446: rktab.d_active++;
5447: devstart(bp, &RKADDR->rkda, rkaddr(bp), 0);
5448: }
5449: /* --------------------------- */
5450:
5451: rkintr()
5452: {
5453: register struct buf *bp;
5454:
5455: if (rktab.d_active == 0)
5456: return;
5457: bp = rktab.d_actf;
5458: rktab.d_active = 0;
5459: if (RKADDR->rkcs < 0) { /* error bit */
5460: deverror(bp, RKADDR->rker, RKADDR->rkds);
5461: RKADDR->rkcs = RESET|GO;
5462: while((RKADDR->rkcs&CTLRDY) == 0) ;
5463: if (++rktab.d_errcnt <= 10) {
5464: rkstart();
5465: return;
5466: }
5467: bp->b_flags =| B_ERROR;
5468: }
5469: rktab.d_errcnt = 0;
5470: rktab.d_actf = bp->av_forw;
5471: iodone(bp);
5472: rkstart();
5473: }
5474: /* --------------------------- */
5475:
5476: rkread(dev)
5477: {
5478:
5479: physio(rkstrategy, &rrkbuf, dev, B_READ);
5480: }
5481: /* --------------------------- */
5482:
5483: rkwrite(dev)
5484: {
5485:
5486: physio(rkstrategy, &rrkbuf, dev, B_WRITE);
5487: }
5488: /* --------------------------- */