diff options
author | cinap_lenrek <cinap_lenrek@centraldogma> | 2011-11-09 15:17:00 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@centraldogma> | 2011-11-09 15:17:00 +0100 |
commit | 29c9eb1c211b7eb9f75488aace487976297499f4 (patch) | |
tree | 19834da7835abfad5bedde12b98a27416c26f8c8 /sys/src | |
parent | d8b1af77d0c98289669918d87884ff9974cb39d4 (diff) |
sdide: Marvell PATA, sdiahci: 82801 SATA RAID
Diffstat (limited to 'sys/src')
-rw-r--r-- | sys/src/9/pc/sdiahci.c | 2 | ||||
-rw-r--r-- | sys/src/9/pc/sdide.c | 44 |
2 files changed, 32 insertions, 14 deletions
diff --git a/sys/src/9/pc/sdiahci.c b/sys/src/9/pc/sdiahci.c index 98e8d7fc8..192bc8893 100644 --- a/sys/src/9/pc/sdiahci.c +++ b/sys/src/9/pc/sdiahci.c @@ -2010,6 +2010,8 @@ didtype(Pcidev *p) return Tesb; if((p->did & 0xfffb) == 0x27c1) return Tich; /* 82801g[bh]m */ + if((p->did & 0xffff) == 0x2822) + return Tich; /* 82801 SATA RAID */ if((p->did & 0xffff) == 0x2821) return Tich; /* 82801h[roh] */ if((p->did & 0xfffe) == 0x2824) diff --git a/sys/src/9/pc/sdide.c b/sys/src/9/pc/sdide.c index dfe6ef763..e5c094433 100644 --- a/sys/src/9/pc/sdide.c +++ b/sys/src/9/pc/sdide.c @@ -1215,17 +1215,15 @@ atapktio0(Drive *drive, SDreq *r) ctlr->command = Cpkt; /* debugging */ outb(cmdport+Command, Cpkt); - if((drive->info[Iconfig] & Mdrq) != 0x0020){ - microdelay(1); - as = ataready(cmdport, ctlport, 0, Bsy, Drq|Chk, 4*1000); - if(as < 0 || (as & (Bsy|Chk))){ - drive->status = as<0 ? 0 : as; - ctlr->curdrive = nil; - ctlr->done = 1; - rv = SDtimeout; - }else - atapktinterrupt(drive); - } + microdelay(1); + as = ataready(cmdport, ctlport, 0, Bsy, Drq|Chk, 4*1000); + if(as < 0 || (as & (Bsy|Chk))){ + drive->status = as<0 ? 0 : as; + ctlr->curdrive = nil; + ctlr->done = 1; + rv = SDtimeout; + }else + atapktinterrupt(drive); if(drive->pktdma) atadmastart(ctlr, drive->write); iunlock(ctlr); @@ -1243,8 +1241,17 @@ atapktio0(Drive *drive, SDreq *r) } iunlock(ctlr); - if(drive->status & Chk) - rv = SDcheck; + if(drive->status & Chk){ + if(DEBUG & DbgDEBUG) + print("atapktio: dev=%X status=%X error=%X pktcmd[0]=%.2X\n", + drive->dev, drive->status, drive->error, cmd[0]); + if(drive->pktdma){ + print("atapktio: disabling dma\n"); + drive->dmactl=0; + rv = SDretry; + } else + rv = SDcheck; + } return rv; } @@ -2151,6 +2158,15 @@ atapnp(void) case (0x438c<<16)|0x1002: /* ATI SB600 PATA */ case (0x439c<<16)|0x1002: /* SB7xx pata */ break; + + case (0x6101<<16)|0x11ab: /* Marvell PATA */ + case (0x6121<<16)|0x11ab: /* Marvell PATA */ + case (0x6123<<16)|0x11ab: /* Marvell PATA */ + case (0x6145<<16)|0x11ab: /* Marvell PATA */ + case (0x1b4b<<16)|0x91a0: /* Marvell PATA */ + case (0x1b4b<<16)|0x91a4: /* Marvell PATA */ + break; + case (0x0211<<16)|0x1166: /* ServerWorks IB6566 */ { Pcidev *sb; @@ -2514,7 +2530,7 @@ SDifc sdideifc = { "ide", /* name */ atapnp, /* pnp */ - nil, /* legacy */ + nil, /* legacy */ ataenable, /* enable */ atadisable, /* disable */ |