Date: Mon, 11 Jan 1999 17:51:43 -0500 From: Lee Cremeans <lee@st-lcremean.tidalwave.net> To: current@FreeBSD.ORG Subject: Re: ide_pci.c question Message-ID: <19990111175143.C63501@tidalwave.net> In-Reply-To: <Pine.GSO.3.95q.990111163507.21129A-100000@rac8.wam.umd.edu>; from Kenneth Wayne Culver on Mon, Jan 11, 1999 at 04:37:01PM -0500 References: <19990111161557.B63501@tidalwave.net> <Pine.GSO.3.95q.990111163507.21129A-100000@rac8.wam.umd.edu>
next in thread | previous in thread | raw e-mail | index | archive | help
On Mon, Jan 11, 1999 at 04:37:01PM -0500, Kenneth Wayne Culver wrote: > Kenneth Culver > Computer Science Major at the University of Maryland, College Park. > > > On Mon, 11 Jan 1999, Lee Cremeans wrote: > > > On Mon, Jan 11, 1999 at 04:09:18PM -0500, Kenneth Wayne Culver wrote: > > > > > > try using 0xa0ffa0ff > > > > DMA's already on; that message is a (rather unnecessary) warning saying that > > ide_pci can't change the default timings by itself (since it obviously > > doesn't know how). I should change the wording on this, and hide it behind > > bootverbose...any objections? > > > No problem here, that would work for me, Have you submitted your changes > to the people that matter so that this fix can be incorporated into > -current? Well, if anyone with commit privs is listening, here's the patch: --- ide_pci.c Mon Dec 21 03:55:56 1998 +++ ide_pci.c.new Sun Jan 10 23:23:41 1999 @@ -120,6 +121,15 @@ void *wdinfo); static void +acer_status(struct ide_pci_cookie *cookie); + +static int +acer_dmainit(struct ide_pci_cookie *cookie, + struct wdparams *wp, + int (*wdcmd)(int, void *), + void *wdinfo); + +static void intel_piix_dump_drive(char *ctlr, int sitre, int is_piix4, @@ -267,8 +277,14 @@ printf("ide_pci: generic_dmainit %04x:%d: warning, IDE controller timing not set\n", cookie->iobase_wd, cookie->unit); + /* If we're here, then this controller is most likely not set + for UDMA, even if the drive may be. Make the drive wise + up. */ + + if(!wdcmd(WDDMA_MDMA2, wdinfo)) + printf("generic_dmainit: could not set multiword DMA mode!\n"); return 1; - } + } #ifdef IDE_PCI_DEBUG printf("pio_mode: %d, mwdma_mode(wp): %d, udma_mode(wp): %d\n", pio_mode(wp), mwdma_mode(wp), udma_mode(wp)); @@ -836,6 +852,68 @@ intel_piix_status }; + +static void +acer_status(struct ide_pci_cookie *cookie) { + /* XXX does not do anything right now */ +} + +static int +acer_dmainit(struct ide_pci_cookie *cookie, + struct wdparams *wp, + int(*wdcmd)(int, void *), + void *wdinfo) +{ + /* Acer Aladdin DMA setup code. UDMA looks to be sinfully easy to set + on this thing - just one register. */ + + u_long word54 = pci_conf_read(cookie->tag, 0x54); + + /* Set the default Acer FIFO settings (0x55 = 13-word depth and + slave operation mode 1) */ + + word54 |= 0x5555; + + /* Is this drive UDMA? Set it up if so... */ + if(udma_mode(wp) >= 2) { + /* This is really easy to do. Just write 0xa (enable + UDMA mode with 2T timing) into the word at the right + places. */ + word54 |= (0xA << (16 + (cookie->ctlr * 8) + (cookie->unit * 4))); + + /* Now set the drive for UDMA2. */ + if(!wdcmd(WDDMA_UDMA2, wdinfo)) { + printf("acer_dmainit: could not set UDMA2 mode on wdc%d:%d!\n", cookie->ctlr, cookie->unit); + return 0; + } + + /* Write the new config into the registers. I'm not + sure if I'm doing this in the right order. */ + + pci_conf_write(cookie->tag, 0x54, word54); + + } else if(mwdma_mode(wp) >= 2 && pio_mode(wp) >=4) { + + + /* Otherwise, we're already set for regular DMA. */ + + if(!wdcmd(WDDMA_MDMA2, wdinfo)) { + printf("acer_dmainit: could not set MWDMA2 mode on wdc%d:%d!\n", + cookie->ctlr, cookie->unit); + return 0; + } + return 1; + } +} + +static struct vendor_fns vs_acer = +{ + acer_dmainit, + acer_status +}; + + + /* Generic SFF-8038i code-- all code below here, except for PCI probes, * more or less conforms to the SFF-8038i spec as extended for PCI. * There should be no code that goes beyond that feature set below. @@ -918,6 +996,8 @@ return ("Promise Ultra/33 IDE controller"); if (type == 0x05711106) return ("VIA 82C586x (Apollo) Bus-master IDE controller"); + if (type == 0x522910b9) + return ("Acer Labs (ALi) Aladdin IV/V Bus-master IDE controller"); if (data & 0x8000) return ("PCI IDE controller (busmaster capable)"); #ifndef CMD640 @@ -980,7 +1060,10 @@ /* Promise controllers */ vp = &vs_promise; break; - + + case 0x522910b9: + vp = &vs_acer; + break; default: /* everybody else */ vp = &vs_generic; @@ -1138,9 +1221,7 @@ } } - if (bmista_1 & BMISTA_SIMPLEX || bmista_2 & BMISTA_SIMPLEX) { - printf("ide_pci: controller is simplex, no DMA on secondary channel\n"); - } else if (iobase_wd_2 != 0) { + if (iobase_wd_2 != 0) { cookie = mkcookie(iobase_wd_2, ctlridx + 1, 0, -- +--------------------------------------------------------------------+ | Lee Cremeans -- Manassas, VA, USA (WakkyMouse on DALnet and WTnet)| | lcremean@tidalwave.net| http://st-lcremean.tidalwave.net/~lee | To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-current" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?19990111175143.C63501>