]> Zhao Yanbai Git Server - kernel.git/commitdiff
ata用中断读IENTIFY时不再用sleep_on
authoracevest <zhaoyanbai@126.com>
Tue, 16 Nov 2021 04:09:37 +0000 (12:09 +0800)
committeracevest <zhaoyanbai@126.com>
Tue, 16 Nov 2021 04:09:37 +0000 (12:09 +0800)
drivers/ata.c
drivers/ide.c

index e6e2bb6124d67784d3cc2f966662170d17049d79..d2dc346114fd132ebd7882634e4c6ac4aa51d10e 100644 (file)
@@ -9,10 +9,10 @@
 #include <ata.h>
 #include <ide.h>
 #include <io.h>
+#include <irq.h>
 #include <string.h>
 #include <system.h>
 #include <types.h>
-
 extern ide_pci_controller_t ide_pci_controller;
 
 #define ATA_TIMEOUT 10  // 10次时钟中断
@@ -41,14 +41,26 @@ void ata_test(uint64_t nr) {
 //  2. 等到status的BSY位清除
 //  3. 等到status的DRQ位或ERR位设置
 u16 identify[256];
-void ata_send_read_identify_cmd(int dev) {
+void ata_send_read_identify_cmd(int dev) {}
+void ata_read_identify(int dev) {  // 这里所用的dev是逻辑编号 ATA0、ATA1下的Master、Salve的dev分别为0,1,2,3
     outb(0x00, REG_CTL(dev));
     outb(0x00 | ((dev & 0x01) << 4), REG_DEVICE(dev));  // 根据文档P113,这里不用指定bit5, bit7,直接指示DRIVE就行
+
+    unsigned long flags;
+    irq_save(flags);
+
+    void add_to_ide_wait_queue();
+    add_to_ide_wait_queue();
+
     outb(ATA_CMD_IDENTIFY, REG_CMD(dev));
-}
-void ata_read_identify(int dev) {  // 这里所用的dev是逻辑编号 ATA0、ATA1下的Master、Salve的dev分别为0,1,2,3
 
-    sleep_on_ide();
+    irq_restore(flags);
+
+    schedule();
+
+    printk("asfdasdfasd----\n");
+
+    // sleep_on_ide();
 
     insw(REG_DATA(dev), identify, SECT_SIZE / sizeof(u16));
 
index 2c51213571a93098cc5b16f75c22a9a545b1bb84..b399fc2bcf32e5bf8c99e170b4ef8130d1bad7c5 100644 (file)
@@ -538,6 +538,15 @@ DECLARE_WAIT_QUEUE_HEAD(ide_wait_queue_head);
 
 void sleep_on_ide() { sleep_on(&ide_wait_queue_head); }
 
+wait_queue_t iwait;
+// DECLARE_WAIT_QUEUE(wait, current);
+void add_to_ide_wait_queue() {
+    iwait.task = current;
+    iwait.task_list.prev = &iwait.task_list;
+    iwait.task_list.next = &iwait.task_list;
+    list_add_tail(&iwait.task_list, &ide_wait_queue_head.task_list);
+}
+
 extern void *mbr_buf;
 uint8_t ata_pci_bus_status();
 extern ide_pci_controller_t ide_pci_controller;