From 11fbee9ae975e33982f695a55f4468bed2cd140a Mon Sep 17 00:00:00 2001 From: phx Date: Fri, 23 Jul 2010 20:01:27 +0000 Subject: [PATCH] Fixed error in loop counter variable for lba_read(). Patch by Toru Nishimura. --- sys/arch/sandpoint/stand/netboot/dsk.c | 23 +++++++-------- sys/arch/sandpoint/stand/netboot/siisata.c | 34 +++++++++++++++++----- 2 files changed, 37 insertions(+), 20 deletions(-) diff --git a/sys/arch/sandpoint/stand/netboot/dsk.c b/sys/arch/sandpoint/stand/netboot/dsk.c index 2eef63e03a1a..ca10470c5552 100644 --- a/sys/arch/sandpoint/stand/netboot/dsk.c +++ b/sys/arch/sandpoint/stand/netboot/dsk.c @@ -1,4 +1,4 @@ -/* $NetBSD: dsk.c,v 1.2 2010/06/27 12:09:17 phx Exp $ */ +/* $NetBSD: dsk.c,v 1.3 2010/07/23 20:01:27 phx Exp $ */ /*- * Copyright (c) 2010 The NetBSD Foundation, Inc. @@ -357,10 +357,10 @@ set_xfermode(struct dkdev_ata *l, int n) static int lba_read(struct disk *d, uint64_t bno, uint32_t bcnt, void *buf) { - struct dkdev_ata *l = d->dvops; + struct dkdev_ata *l; struct dvata_chan *chan; void (*issue)(struct dvata_chan *, uint64_t, uint32_t); - uint32_t n, rdcnt; + int n, rdcnt, i; uint16_t *p; const char *err; int error; @@ -370,22 +370,20 @@ lba_read(struct disk *d, uint64_t bno, uint32_t bcnt, void *buf) p = (uint16_t *)buf; chan = &l->chan[n]; error = 0; - while (bcnt > 0) { + for ( ; bcnt > 0; bno += rdcnt, bcnt -= rdcnt) { issue = (bno < (1ULL<<28)) ? issue28 : issue48; rdcnt = (bcnt > 255) ? 255 : bcnt; (*issue)(chan, bno, rdcnt); if (spinwait_unbusy(l, n, 1000, &err) == 0) { printf("%s blk %d %s\n", d->xname, (int)bno, err); error = EIO; + continue; } - else { - for (n = 0; n < rdcnt * 512; n += 2) { - /* arrives in native order */ - *p++ = *(uint16_t *)(chan->cmd + _DAT); - } - (void)CSR_READ_1(chan->cmd + _STS); + for (i = 0; i < rdcnt * 512; i += 2) { + /* arrives in native order */ + *p++ = *(uint16_t *)(chan->cmd + _DAT); } - bno += rdcnt; bcnt -= rdcnt; + (void)CSR_READ_1(chan->cmd + _STS); } return error; } @@ -466,7 +464,9 @@ dsk_open(struct open_file *f, ...) } return ENXIO; found: +#if 0 printf("dsk_open found %s\n", fsmod); +#endif d->fsops = fs; f->f_devdata = d; @@ -520,4 +520,3 @@ dsk_fsops(struct open_file *f) return d->fsops; } - diff --git a/sys/arch/sandpoint/stand/netboot/siisata.c b/sys/arch/sandpoint/stand/netboot/siisata.c index 193cfde4c981..c9b700a84cee 100644 --- a/sys/arch/sandpoint/stand/netboot/siisata.c +++ b/sys/arch/sandpoint/stand/netboot/siisata.c @@ -1,4 +1,4 @@ -/* $NetBSD: siisata.c,v 1.9 2010/06/26 21:45:49 phx Exp $ */ +/* $NetBSD: siisata.c,v 1.10 2010/07/23 20:01:27 phx Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -35,6 +35,11 @@ #include "globals.h" +//#define CSR_READ_4(r) in32rb(r) +//#define CSR_WRITE_4(r,v) out32rb(r,v) +//#define CSR_READ_1(r) *(volatile uint8_t *)(r) +//#define CSR_WRITE_1(r,v) *(volatile uint8_t *)(r)=(v) + static uint32_t pciiobase = PCI_XIOBASE; int siisata_match(unsigned, void *); @@ -73,17 +78,24 @@ siisata_init(unsigned tag, void *data) l->bar[3] = pciiobase + (pcicfgread(tag, 0x1c) &~ 01); l->bar[4] = pciiobase + (pcicfgread(tag, 0x20) &~ 01); l->bar[5] = pcicfgread(tag, 0x24) &~ 0x3ff; +for (n=0; n<6; n++) printf("bar[%d]=0x%08x\n",n,(unsigned)l->bar[n]); + val = pcicfgread(tag, 0x88); +// pcicfgwrite(tag, 0x88, val | 0xc000f3); + pcicfgwrite(tag, 0x88, val | 0x0000f3); + delay(50 * 1000); +// pcicfgwrite(tag, 0x88, val & 0xc00000); + pcicfgwrite(tag, 0x88, val & 0x000000); + delay(50 * 1000); val = pcicfgread(tag, PCI_ID_REG); + /* assume BA5 access is possible */ if ((PCI_PRODUCT(val) & 0xf) == 0x2) { /* 3112/3512 */ - l->chan[0].cmd = l->bar[0]; - l->chan[0].ctl = l->chan[0].alt = l->bar[1] | 02; - l->chan[0].dma = l->bar[4] + 0x0; - l->chan[1].cmd = l->bar[2]; - l->chan[1].ctl = l->chan[1].alt = l->bar[3] | 02; - l->chan[1].dma = l->bar[4] + 0x8; - /* assume BA5 access is possible */ + l->chan[0].cmd = l->bar[5] + 0x080; + l->chan[0].ctl = l->chan[0].alt = (l->bar[5] + 0x088) | 02; + l->chan[1].cmd = l->bar[5] + 0x0c0; + l->chan[1].ctl = l->chan[1].alt = (l->bar[5] + 0x0c8) | 02; +printf("3512! cmd=0x%08x ctl/alt=0x%08x\n",l->chan[0].cmd,l->chan[0].ctl); nchan = 2; } else { @@ -98,10 +110,16 @@ siisata_init(unsigned tag, void *data) l->chan[3].ctl = l->chan[3].alt = (l->bar[5] + 0x2c8) | 02; nchan = 4; } + for (n = 0; n < nchan; n++) { l->presense[n] = satapresense(l, n); if (l->presense[n]) printf("port %d device present\n", n); } + + out32rb(l->bar[5] + 0xb4, 01); + out32rb(l->bar[5] + 0xf4, 01); + out32rb(l->bar[5] + 0xa4, 0x328a); + out32rb(l->bar[5] + 0xe4, 0x328a); return l; }