-
- port->regs[HBA_RPxCI] = bitmask;
-
- wait_until(!(port->regs[HBA_RPxCI] & bitmask));
-
- if ((port->regs[HBA_RPxTFD] & HBA_PxTFD_ERR)) {
- // 有错误
- sata_read_error(port);
- goto fail;
+ /*
+ 确保我们使用的是LBA寻址模式
+ 注意:在ACS-3中(甚至在ACS-4),只有在(READ/WRITE)_DMA_EXT指令中明确注明了需要将这一位置位
+ 而并没有在(READ/WRITE)_DMA注明。
+ 但是这在ACS-2中是有的!于是这也就导致了先前的测试中,LBA=0根本无法访问,因为此时
+ 的访问模式是在CHS下,也就是说LBA=0 => Sector=0,是非法的。
+ 所以,我猜测,这要么是QEMU/VirtualBox根据ACS-2来编写的AHCI模拟,
+ 要么是标准出错了(毕竟是working draft)
+ */
+ fis->dev = (1 << 6);
+
+ int retries = 0;
+
+ while (retries < MAX_RETRY) {
+ port->regs[HBA_RPxCI] = bitmask;
+
+ wait_until(!(port->regs[HBA_RPxCI] & bitmask));
+
+ if ((port->regs[HBA_RPxTFD] & HBA_PxTFD_ERR)) {
+ // 有错误
+ sata_read_error(port);
+ retries++;
+ } else {
+ vfree_dma(table);
+ return 1;
+ }