From 4dd43903dbee2b1a843520bfcc87aea3392f62af Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Fri, 12 Jan 1996 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1996-01-12 --- pc/devata.c | 21 ++++++++++++++++++++- pc/pci.c | 13 ++++++++++++- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/pc/devata.c b/pc/devata.c index 2ddbf9d47710551ec493f3ed46889f85a7465824..6d69a32a3d200e39fdce83cdae0fa9e96afb422a 100644 --- a/pc/devata.c +++ b/pc/devata.c @@ -62,6 +62,8 @@ enum Cpktcmd= 0xA0, Cidentd= 0xA1, + Ctur= 0x00, + Creqsense= 0x03, Ccapacity= 0x25, Cread2= 0x28, @@ -1073,7 +1075,10 @@ ataident(Drive *dp) nexterror(); } - cmd = Cident; + if(dp->atapi) + cmd = Cidentd; + else + cmd = Cident; retryatapi: ILOCK(&cp->reglock); cp->nsecs = 1; @@ -1803,6 +1808,7 @@ atapipart(Drive *dp) retrycount = 2; retry: if(waserror()){ + DPRINT("atapipart: cmd %uX error %uX\n", cp->cmd, cp->error); if((cp->status & Serr) && (cp->error & 0xF0) == 0x60){ dp->vers++; if(retrycount){ @@ -1825,6 +1831,19 @@ retry: cp->buf = buf; cp->dp = dp; + cp->len = 18; + cp->count = 0; + memset(cp->cmdblk, 0, sizeof(cp->cmdblk)); + cp->cmdblk[0] = Creqsense; + cp->cmdblk[4] = 18; + atapiexec(dp); + if(cp->count != 18){ + print("cmd=%2.2uX, lastcmd=%2.2uX ", cp->cmd, cp->lastcmd); + print("cdsize count %d, status 0x%2.2uX, error 0x%2.2uX\n", + cp->count, cp->status, cp->error); + error(Eio); + } + cp->len = 8; cp->count = 0; memset(cp->cmdblk, 0, sizeof(cp->cmdblk)); diff --git a/pc/pci.c b/pc/pci.c index 4bf9ced7eaa84b350a9ad376ab59af815fd4b246..07e76348cd3259e3382e2364239e777c36e94f90 100644 --- a/pc/pci.c +++ b/pc/pci.c @@ -142,6 +142,7 @@ pcicfgw(int busno, int devno, int funcno, int regno, void* data, int nbytes) void pcicfgw8(int busno, int devno, int funcno, int regno, void* data, int nbytes) { + ulong addr; uchar *p; int base, len; @@ -152,7 +153,17 @@ pcicfgw8(int busno, int devno, int funcno, int regno, void* data, int nbytes) switch(pcicfgmode){ default: - panic("pcicfgw8: pcicfgmode %d\n", pcicfgmode); + addr = 0x80000000|((busno & 0xFF)<<16)|((devno & 0x1F)<<11)|((funcno & 0x03)<<8); + p = data; + for(len = nbytes/sizeof(*p); len > 0; len--){ + outl(PCIaddr, addr|(regno & 0xFF)); + outb(PCIdata, *p); + p++; + regno += sizeof(*p); + } + + outl(PCIaddr, 0); + break; break; case 2: