Module Name: src Committed By: phx Date: Mon Jan 10 20:13:47 UTC 2011
Modified Files: src/sys/arch/sandpoint/stand/netboot: globals.h siisata.c Log Message: Make disk-booting work on Synology by using a PIO ATA-read command (0x20) instead of the DMA read command (0xc8). This should work for all platforms. Included the soft-reset in the siisata driver. To generate a diff of this commit: cvs rdiff -u -r1.18 -r1.19 src/sys/arch/sandpoint/stand/netboot/globals.h cvs rdiff -u -r1.13 -r1.14 src/sys/arch/sandpoint/stand/netboot/siisata.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/sandpoint/stand/netboot/globals.h diff -u src/sys/arch/sandpoint/stand/netboot/globals.h:1.18 src/sys/arch/sandpoint/stand/netboot/globals.h:1.19 --- src/sys/arch/sandpoint/stand/netboot/globals.h:1.18 Sat Jun 26 21:45:49 2010 +++ src/sys/arch/sandpoint/stand/netboot/globals.h Mon Jan 10 20:13:47 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: globals.h,v 1.18 2010/06/26 21:45:49 phx Exp $ */ +/* $NetBSD: globals.h,v 1.19 2011/01/10 20:13:47 phx Exp $ */ /* clock feed */ #ifndef EXT_CLK_FREQ @@ -135,24 +135,24 @@ struct fs_ops *dsk_fsops(struct open_file *); /* status */ -#define ATA_STS_BUSY 0x80 -#define ATA_STS_DRDY 0x40 -#define ATA_STS_ERR 0x01 +#define ATA_STS_BUSY 0x80 +#define ATA_STS_DRDY 0x40 +#define ATA_STS_ERR 0x01 /* command */ -#define ATA_CMD_IDENT 0xec -#define ATA_CMD_READ 0xc8 -#define ATA_CMD_READ_EXT 0x24 -#define ATA_CMD_SETF 0xef +#define ATA_CMD_IDENT 0xec +#define ATA_CMD_READ 0x20 +#define ATA_CMD_READ_EXT 0x24 +#define ATA_CMD_SETF 0xef /* device */ -#define ATA_DEV_LBA 0xe0 -#define ATA_DEV_OBS 0x90 +#define ATA_DEV_LBA 0xe0 +#define ATA_DEV_OBS 0x90 /* control */ -#define ATA_DREQ 0x08 -#define ATA_SRST 0x04 +#define ATA_DREQ 0x08 +#define ATA_SRST 0x04 -#define ATA_XFER 0x03 -#define XFER_PIO4 0x0c -#define XFER_PIO0 0x08 +#define ATA_XFER 0x03 +#define XFER_PIO4 0x0c +#define XFER_PIO0 0x08 struct dvata_chan { uint32_t cmd, ctl, alt, dma; Index: src/sys/arch/sandpoint/stand/netboot/siisata.c diff -u src/sys/arch/sandpoint/stand/netboot/siisata.c:1.13 src/sys/arch/sandpoint/stand/netboot/siisata.c:1.14 --- src/sys/arch/sandpoint/stand/netboot/siisata.c:1.13 Sun Aug 8 11:58:26 2010 +++ src/sys/arch/sandpoint/stand/netboot/siisata.c Mon Jan 10 20:13:47 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: siisata.c,v 1.13 2010/08/08 11:58:26 phx Exp $ */ +/* $NetBSD: siisata.c,v 1.14 2011/01/10 20:13:47 phx Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -83,11 +83,10 @@ 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 */ nchan = 2; } else { - /* 3114 */ + /* 3114 - assume BA5 access is possible XXX */ 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; @@ -98,10 +97,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); + if (satapresense(l, n)) { + /* drive present, now check whether soft reset works */ + if (perform_atareset(l, n)) { + printf("port %d device present\n", n); + l->presense[n] = 1; + } + } else + l->presense[n] = 0; } return l; }