void ide_irq_bh_handler(void *arg) {
int channel = (int)arg;
- // printk("channel %08x\n", channel);
assert(channel <= 1);
assert(channel >= 0);
ide_pci_controller_t *ide_ctrl = ide_pci_controller + channel;
- // printlxy(MPL_IDE, MPO_IDE, "disk irq %u req %u consumed %u ", disk_inter_cnt, disk_request_cnt,
- // disk_handled_cnt);
- printlxy(MPL_IDE0 + channel, MPO_IDE, "IDE%d req %u irq %u consumed %u", channel,
- atomic_read(&(ide_ctrl->request_cnt)), ide_ctrl->irq_cnt, ide_ctrl->consumed_cnt);
+ int r = atomic_read(&(ide_ctrl->request_cnt));
+ int i = atomic_read(&(ide_ctrl->irq_cnt));
+ int c = atomic_read(&(ide_ctrl->consumed_cnt));
- // 之前这里是用up()来唤醒磁盘任务
- // 但在中断的底半处理,不应该切换任务,因为会引起irq里的reenter问题,导致不能再进底半处理,也无法切换任务
- // 所以就移除了up()里的 schedule()
- // 后来就改用完成量来通知磁盘任务,就不存在这个问题了
-
- // complete会唤醒进程,但不会立即重新调度进程
- complete(&ide_ctrl->intr_complete);
+ printlxy(MPL_IDE0 + channel, MPO_IDE, "IDE%d req %u irq %u consumed %u", channel, r, i, c);
}
void ide_irq_handler(unsigned int irq, pt_regs_t *regs, void *devid) {
// printk("ide irq %d handler pci status: 0x%02x\n", irq, ata_pci_bus_status());
int channel = irq == ide_pci_controller[0].irq_line ? 0 : 1;
-#if 0
- // printk("ide[%d] irq %d handler\n", channel, irq);
-
+ const int drvid = (channel << 1); // 虚拟一个
ide_pci_controller_t *ide_ctrl = ide_pci_controller + channel;
+ ide_ctrl->status = inb(REG_STATUS(drvid));
+ ide_ctrl->pci_status = inb(ide_ctrl->bus_status);
atomic_inc(&ide_ctrl->irq_cnt);
ata_dma_stop(channel);
- add_irq_bh_handler(ide_irq_bh_handler, (void *)channel);
-#endif
-
- const int drvid = (channel << 1); // 虚拟一个
- ide_pci_controller_t *ide_ctrl = ide_pci_controller + channel;
- ide_ctrl->status = inb(REG_STATUS(drvid));
- ide_ctrl->pci_status = inb(ide_ctrl->bus_status);
-
// 之前这里是用up()来唤醒磁盘任务
// 但在中断的底半处理,不应该切换任务,因为会引起irq里的reenter问题,导致不能再进底半处理,也无法切换任务
// 所以就移除了up()里的 schedule()
// complete会唤醒进程,但不会立即重新调度进程
complete(&ide_ctrl->intr_complete);
+
+ // 纯debug打印
+ add_irq_bh_handler(ide_irq_bh_handler, (void *)channel);
}
unsigned int IDE_CHL0_CMD_BASE = 0x1F0;