Fixed error in loop counter variable for lba_read().
Patch by Toru Nishimura.
This commit is contained in:
parent
83c92bb41d
commit
11fbee9ae9
|
@ -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,23 +370,21 @@ 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) {
|
||||
for (i = 0; i < rdcnt * 512; i += 2) {
|
||||
/* arrives in native order */
|
||||
*p++ = *(uint16_t *)(chan->cmd + _DAT);
|
||||
}
|
||||
(void)CSR_READ_1(chan->cmd + _STS);
|
||||
}
|
||||
bno += rdcnt; bcnt -= rdcnt;
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue