summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/src/9/pc/sdiahci.c48
1 files changed, 30 insertions, 18 deletions
diff --git a/sys/src/9/pc/sdiahci.c b/sys/src/9/pc/sdiahci.c
index fdb8f3eb3..f1dafe20b 100644
--- a/sys/src/9/pc/sdiahci.c
+++ b/sys/src/9/pc/sdiahci.c
@@ -16,7 +16,7 @@
#include "../port/led.h"
#pragma varargck type "T" int
-#define dprint(...) if(debug) iprint(__VA_ARGS__); else USED(debug)
+#define dprint(...) if(debug) print(__VA_ARGS__); else USED(debug)
#define idprint(...) if(prid) print(__VA_ARGS__); else USED(prid)
#define aprint(...) if(datapi) print(__VA_ARGS__); else USED(datapi)
#define ledprint(...) if(dled) print(__VA_ARGS__); else USED(dled)
@@ -609,27 +609,32 @@ ahciconfigdrive(Ahba *h, Aportc *c, int mode)
p->fis = PCIWADDR(m->fis.base);
p->fishi = Pciwaddrh(m->fis.base);
+ dprint("ahci: configdrive cmd=%lux sstatus=%lux\n", p->cmd, p->sstatus);
p->cmd |= Afre;
- if((p->sstatus & Sbist) == 0 && (p->cmd & Apwr) != Apwr)
- if((p->sstatus & Sphylink) == 0 && h->cap & Hss){
- /* staggered spin-up? */
- dprint("ahci: spin up ... [%.3lux]\n", p->sstatus);
+ if((p->sstatus & Sbist) == 0 && (p->cmd & Apwr) != Apwr){
p->cmd |= Apwr;
+ dprint("ahci: power up ... [%.3lux]\n", p->sstatus);
+ }
+ if((p->sstatus & Sphylink) == 0){
+ if(h->cap & Hss)
+ p->cmd |= Asud;
+ dprint("ahci: spin up ... [%.3lux]\n", p->sstatus);
for(int i = 0; i < 1400; i += 50){
if(p->sstatus & (Sphylink | Sbist))
break;
asleep(50);
}
}
-
p->serror = SerrAll;
if((p->sstatus & SSmask) == (Isleepy | Spresent))
ahciwakeup(c, mode);
+
/* disable power managment sequence from book. */
p->sctl = 3*Aipm | mode*Aspd | 0*Adet;
- p->cmd &= ~Aalpe;
+ if(h->cap & Halp)
+ p->cmd &= ~Aalpe;
p->cmd |= Ast;
p->ie = IEM;
@@ -1418,6 +1423,7 @@ iaverify(SDunit *u)
iunlock(d);
iunlock(c);
checkdrive(d, d->driveno); /* c->d0 + d->driveno */
+ scsiverify(u);
return 1;
}
@@ -1465,19 +1471,19 @@ iadisable(SDev *s)
}
static int
-iaonline(SDunit *unit)
+iaonline(SDunit *u)
{
int r;
Ctlr *c;
Drive *d;
- c = unit->dev->ctlr;
- d = c->drive[unit->subno];
+ c = u->dev->ctlr;
+ d = c->drive[u->subno];
ilock(d);
if(d->portm.feat & Datapi){
d->drivechange = 0;
iunlock(d);
- return scsionline(unit);
+ return scsionline(u);
}
r = 0;
if(d->drivechange){
@@ -1486,8 +1492,8 @@ iaonline(SDunit *unit)
}else if(d->state == Dready)
r = 1;
if(r){
- unit->sectors = d->sectors;
- unit->secsize = d->secsize;
+ u->sectors = d->sectors;
+ u->secsize = d->secsize;
}
iunlock(d);
return r;
@@ -1767,11 +1773,11 @@ iario(SDreq *r)
uvlong lba;
Ctlr *c;
Drive *d;
- SDunit *unit;
+ SDunit *u;
- unit = r->unit;
- c = unit->dev->ctlr;
- d = c->drive[unit->subno];
+ u = r->unit;
+ c = u->dev->ctlr;
+ d = c->drive[u->subno];
if(d->portm.feat & Datapi)
return iariopkt(r, d);
cmd = r->cmd;
@@ -1789,7 +1795,7 @@ iario(SDreq *r)
if((i = sdfakescsirw(r, &lba, &count, &rw)) != SDnostatus)
return i;
- n = ahcibio(unit, r->lun, r->write, r->data, count, lba);
+ n = ahcibio(u, r->lun, r->write, r->data, count, lba);
if(n == -1)
return SDeio;
r->rlen = n;
@@ -2074,6 +2080,12 @@ iapnp(void)
if(done)
return nil;
done = 1;
+
+ if(getconf("*ahcidebug") != nil){
+ debug = 1;
+ datapi = 1;
+ }
+
memset(olds, 0xff, sizeof olds);
p = nil;
loop: