summaryrefslogtreecommitdiff
path: root/sys/src/9/pc/sdide.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@gmx.de>2012-04-18 16:49:27 +0200
committercinap_lenrek <cinap_lenrek@gmx.de>2012-04-18 16:49:27 +0200
commite294bcae532ee21ab2f2709d20a9741fc8b59ff9 (patch)
tree7662151038e927b20acd78e409c8085b217cb08f /sys/src/9/pc/sdide.c
parent1d96a8256eece7b5ac290c732e009af8f68a702a (diff)
sdide: make ataidentify wait longer if theres no floating bus
Diffstat (limited to 'sys/src/9/pc/sdide.c')
-rw-r--r--sys/src/9/pc/sdide.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/sys/src/9/pc/sdide.c b/sys/src/9/pc/sdide.c
index 24ff84015..1ab4fe8e5 100644
--- a/sys/src/9/pc/sdide.c
+++ b/sys/src/9/pc/sdide.c
@@ -549,7 +549,7 @@ atadmamode(SDunit *unit, Drive* drive)
static int
ataidentify(Ctlr*, int cmdport, int ctlport, int dev, int pkt, void* info)
{
- int as, command, drdy;
+ int as, command, drdy, rlo, rhi;
if(pkt){
command = Cidpkt;
@@ -561,8 +561,21 @@ ataidentify(Ctlr*, int cmdport, int ctlport, int dev, int pkt, void* info)
}
dev &= ~Lba;
as = ataready(cmdport, ctlport, dev, Bsy|Drq, drdy, 103*1000);
- if(as < 0)
- return as;
+ if(as < 0){
+ /* try to detect floating bus */
+ outb(cmdport+Cyllo, 0xAA);
+ outb(cmdport+Cylhi, 0x55);
+ outb(cmdport+Sector, 0xFF);
+ rlo = inb(cmdport+Cyllo);
+ rhi = inb(cmdport+Cylhi);
+ if(rlo != 0xAA && (rlo == 0xFF || rhi != 0x55))
+ return as;
+
+ /* theres a device, try waiting some more */
+ as = ataready(cmdport, ctlport, dev, Bsy|Drq, drdy, 6*1000*1000);
+ if(as < 0)
+ return as;
+ }
outb(cmdport+Command, command);
microdelay(1);