Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/sandpoint/stand/netboot Fixed error in loop counter...
details: https://anonhg.NetBSD.org/src/rev/f332ae75f633
branches: trunk
changeset: 756561:f332ae75f633
user: phx <phx%NetBSD.org@localhost>
date: Fri Jul 23 20:01:27 2010 +0000
description:
Fixed error in loop counter variable for lba_read().
Patch by Toru Nishimura.
diffstat:
sys/arch/sandpoint/stand/netboot/dsk.c | 23 +++++++++----------
sys/arch/sandpoint/stand/netboot/siisata.c | 34 ++++++++++++++++++++++-------
2 files changed, 37 insertions(+), 20 deletions(-)
diffs (136 lines):
diff -r fa7e301dad5a -r f332ae75f633 sys/arch/sandpoint/stand/netboot/dsk.c
--- a/sys/arch/sandpoint/stand/netboot/dsk.c Fri Jul 23 19:25:23 2010 +0000
+++ b/sys/arch/sandpoint/stand/netboot/dsk.c Fri Jul 23 20:01:27 2010 +0000
@@ -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 @@
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 @@
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 @@
}
return ENXIO;
found:
+#if 0
printf("dsk_open found %s\n", fsmod);
+#endif
d->fsops = fs;
f->f_devdata = d;
@@ -520,4 +520,3 @@
return d->fsops;
}
-
diff -r fa7e301dad5a -r f332ae75f633 sys/arch/sandpoint/stand/netboot/siisata.c
--- a/sys/arch/sandpoint/stand/netboot/siisata.c Fri Jul 23 19:25:23 2010 +0000
+++ b/sys/arch/sandpoint/stand/netboot/siisata.c Fri Jul 23 20:01:27 2010 +0000
@@ -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 @@
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 @@
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;
}
Home |
Main Index |
Thread Index |
Old Index