code:rkintr - ikarishinjieva/unixV6-code-analyze-chs GitHub Wiki
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 */
- 清设备启动标志(此时设备I/O已完成,可以清标志)
5460 deverror(bp, RKADDR->rker, RKADDR->rkds);
- RKCS最高位为错误位
- RKCS<0,最高位为1,即错误位为1
- 若 本次I/O出错,则执行以下操作
5461 RKADDR->rkcs = RESET|GO;
- 在控制台显示错误消息
5462 while((RKADDR->rkcs&CTLRDY) == 0) ;
5463 if (++rktab.d_errcnt <= 10) {
- 等待RK磁盘,直到RK磁盘准备接受指令
5464 rkstart();
5465 return;
5466 }
5467 bp->b_flags =| B_ERROR;
- 若RK磁盘积累错误次数<=10,则
- 再次启动磁盘执行设备I/O队列任务
- 函数返回
5468 }
- 若RK磁盘积累错误次数>10,则
- 缓存块 置 错误标志
5469 rktab.d_errcnt = 0;
5470 rktab.d_actf = bp->av_forw;
5471 iodone(bp);
5472 rkstart();
- RK磁盘积累错误次数 清零
- 设备I/O队列 当前完成任务移除队列
- 释放 已I/O完成的缓存块
5473 }
- 启动RK磁盘,执行下一个任务
5474 /* ------------------------- */