06250 /* 06251 * RK disk driver 06252 */ 06253 06254 #include "../h/param.h" 06255 #include "../h/systm.h" 06256 #include "../h/buf.h" 06257 #include "../h/conf.h" 06258 #include "../h/dir.h" 06259 #include "../h/user.h" 06260 06261 #define RKADDR ((struct device *)0177400) 06262 #define NRK 4 06263 #define NRKBLK 4872 06264 06265 #define RESET 0 06266 #define WCOM 2 06267 #define RCOM 4 06268 #define GO 01 06269 #define DRESET 014 06270 #define IENABLE 0100 06271 #define DRY 0200 06272 #define ARDY 0100 06273 #define WLO 020000 06274 #define CTLRDY 0200 06275 06276 /* 06277 * Monitoring device bit 06278 */ 06279 #define DK_N 1 06280 06281 struct device 06282 { 06283 int rkds; 06284 int rker; 06285 int rkcs; 06286 int rkwc; 06287 caddr_t rkba; 06288 int rkda; 06289 }; 06290 06291 struct buf rktab; 06292 struct buf rrkbuf; 06293 06294 rkstrategy(bp) 06295 register struct buf *bp; 06296 { 06297 06298 if(bp->b_flags&B_PHYS) 06299 mapalloc(bp); 06300 if (bp->b_blkno >= NRKBLK) { 06301 bp->b_flags |= B_ERROR; 06302 iodone(bp); 06303 return; 06304 } 06305 bp->av_forw = (struct buf *)NULL; 06306 spl5(); 06307 if(rktab.b_actf == NULL) 06308 rktab.b_actf = bp; 06309 else 06310 rktab.b_actl->av_forw = bp; 06311 rktab.b_actl = bp; 06312 if(rktab.b_active == NULL) 06313 rkstart(); 06314 spl0(); 06315 } 06316 06317 rkstart() 06318 { 06319 register struct buf *bp; 06320 register com; 06321 daddr_t bn; 06322 int dn, cn, sn; 06323 06324 if ((bp = rktab.b_actf) == NULL) 06325 return; 06326 rktab.b_active++; 06327 bn = bp->b_blkno; 06328 dn = minor(bp->b_dev); 06329 cn = bn/12; 06330 sn = bn%12; 06331 RKADDR->rkda = (dn<<13) | (cn<<4) | sn; 06332 RKADDR->rkba = bp->b_un.b_addr; 06333 RKADDR->rkwc = -(bp->b_bcount>>1); 06334 com = ((bp->b_xmem&3) << 4) | IENABLE | GO; 06335 if(bp->b_flags & B_READ) 06336 com |= RCOM; else 06337 com |= WCOM; 06338 RKADDR->rkcs = com; 06339 dk_busy |= 1<06340 dk_numb[DK_N] += 1; 06341 com = bp->b_bcount>>6; 06342 dk_wds[DK_N] += com; 06343 } 06344 06345 rkintr() 06346 { 06347 register struct buf *bp; 06348 06349 if (rktab.b_active == NULL) 06350 return; 06351 dk_busy &= ~(1<06352 bp = rktab.b_actf; 06353 rktab.b_active = NULL; 06354 if (RKADDR->rkcs < 0) { /* error bit */ 06355 deverror(bp, RKADDR->rker, RKADDR->rkds); 06356 RKADDR->rkcs = RESET|GO; 06357 while((RKADDR->rkcs&CTLRDY) == 0) 06358 ; 06359 if (++rktab.b_errcnt <= 10) { 06360 rkstart(); 06361 return; 06362 } 06363 bp->b_flags |= B_ERROR; 06364 } 06365 rktab.b_errcnt = 0; 06366 rktab.b_actf = bp->av_forw; 06367 bp->b_resid = 0; 06368 iodone(bp); 06369 rkstart(); 06370 } 06371 06372 rkread(dev) 06373 dev_t dev; 06374 { 06375 06376 physio(rkstrategy, &rrkbuf, dev, B_READ); 06377 } 06378 06379 rkwrite(dev) 06380 dev_t dev; 06381 { 06382 06383 physio(rkstrategy, &rrkbuf, dev, B_WRITE); 06384 } 06385 06386 06387 06388 06389 06390 06391 06392 06393 06394 06395 06396 06397 06398 06399