Module Name: src Committed By: phx Date: Mon Apr 16 16:55:29 UTC 2012
Modified Files: src/sys/arch/sandpoint/stand/altboot: brdsetup.c globals.h main.c Log Message: Improved Synology CS/RS support: watch power-state of all SATA drives before initializing them, configure drive LEDs to reflect SATA activity. Configure drives on all ATA PCI devices, not only on the first one. To generate a diff of this commit: cvs rdiff -u -r1.30 -r1.31 src/sys/arch/sandpoint/stand/altboot/brdsetup.c cvs rdiff -u -r1.17 -r1.18 src/sys/arch/sandpoint/stand/altboot/globals.h \ src/sys/arch/sandpoint/stand/altboot/main.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/altboot/brdsetup.c diff -u src/sys/arch/sandpoint/stand/altboot/brdsetup.c:1.30 src/sys/arch/sandpoint/stand/altboot/brdsetup.c:1.31 --- src/sys/arch/sandpoint/stand/altboot/brdsetup.c:1.30 Mon Apr 9 14:02:04 2012 +++ src/sys/arch/sandpoint/stand/altboot/brdsetup.c Mon Apr 16 16:55:29 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: brdsetup.c,v 1.30 2012/04/09 14:02:04 nisimura Exp $ */ +/* $NetBSD: brdsetup.c,v 1.31 2012/04/16 16:55:29 phx Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -46,6 +46,7 @@ void xxx ## setup(struct brdprop *); \ void xxx ## brdfix(struct brdprop *); \ void xxx ## pcifix(struct brdprop *); \ + void xxx ## launch(struct brdprop *); \ void xxx ## reset(void) BRD_DECL(mot); @@ -119,28 +120,28 @@ static struct brdprop brdlist[] = { BRD_SANDPOINTX3, 0, "com", 0x3f8, 115200, - motsetup, motbrdfix, motpcifix, NULL }, + motsetup, motbrdfix, motpcifix, NULL, NULL }, { "encpp1", "EnCore PP1", BRD_ENCOREPP1, 0, "com", 0x3f8, 115200, - encsetup, encbrdfix, encpcifix, NULL }, + encsetup, encbrdfix, encpcifix, NULL, NULL }, { "kurobox", "KuroBox", BRD_KUROBOX, 0, "eumb", 0x4600, 57600, - kurosetup, kurobrdfix, NULL, kuroreset }, + kurosetup, kurobrdfix, NULL, NULL, kuroreset }, { "synology", - "Synology DS", + "Synology CS/DS/RS", BRD_SYNOLOGY, 0, "eumb", 0x4500, 115200, - synosetup, synobrdfix, NULL, synoreset }, + synosetup, synobrdfix, synopcifix, synolaunch, synoreset }, { "qnap", "QNAP TS", @@ -148,42 +149,42 @@ static struct brdprop brdlist[] = { 33164691, /* Linux source says 33000000, but the Synology */ /* clock value delivers a much better precision. */ "eumb", 0x4500, 115200, - NULL, qnapbrdfix, NULL, qnapreset }, + NULL, qnapbrdfix, NULL, NULL, qnapreset }, { "iomega", "IOMEGA StorCenter G2", BRD_STORCENTER, 0, "eumb", 0x4500, 115200, - NULL, iomegabrdfix, NULL, iomegareset }, + NULL, iomegabrdfix, NULL, NULL, iomegareset }, { "dlink", "D-Link DSM-G600", BRD_DLINKDSM, 33000000, "eumb", 0x4500, 9600, - NULL, dlinkbrdfix, NULL, NULL }, + NULL, dlinkbrdfix, NULL, NULL, NULL }, { "nhnas", "Netronix NH-230/231", BRD_NH230NAS, 33000000, "eumb", 0x4500, 9600, - NULL, nhnasbrdfix, NULL, nhnasreset }, + NULL, nhnasbrdfix, NULL, NULL, nhnasreset }, { "kurot4", "KuroBox/T4", BRD_KUROBOXT4, 32768000, "eumb", 0x4600, 57600, - NULL, kurot4brdfix, NULL, NULL }, + NULL, kurot4brdfix, NULL, NULL, NULL }, { "unknown", "Unknown board", BRD_UNKNOWN, 0, "eumb", 0x4500, 115200, - NULL, NULL, NULL, NULL }, /* must be the last */ + NULL, NULL, NULL, NULL, NULL }, /* must be the last */ }; static struct brdprop *brdprop; @@ -365,6 +366,15 @@ pcifixup() } void +launchfixup() +{ + + if (brdprop->launch == NULL) + return; + (*brdprop->launch)(brdprop); +} + +void encsetup(struct brdprop *brd) { @@ -707,6 +717,50 @@ synobrdfix(struct brdprop *brd) } void +synopcifix(struct brdprop *brd) +{ + static const char csmodel[4][7] = { + "CS406e", "CS406", "RS406", "CS407e" + }; + volatile uint8_t *cpld = (volatile uint8_t *)0xff000000; + uint8_t pwrstate; + + if (nata > 1) { + /* + * CS/RS stations power-up their disks one after another. + * We have to watch over the current power state in a CPLD + * register, until all disks become available. + */ + printf("CPLD V1.%d for model %s\n", cpld[2] & 3, + csmodel[(cpld[2] & 0x0c) >> 2]); + cpld[0] = 0x00; /* all drive LEDs blinking yellow */ + do { + delay(1000 * 1000); + pwrstate = cpld[1]; + printf("Power state: %02x\r", pwrstate); + } while (pwrstate != 0xff); + putchar('\n'); + } +} + +void +synolaunch(struct brdprop *brd) +{ + volatile uint8_t *cpld = (volatile uint8_t *)0xff000000; + struct dkdev_ata *sata1, *sata2; + + if (nata > 1) { + /* enable drive LEDs for active disk drives on CS/RS models */ + sata1 = lata[0].drv; + sata2 = lata[1].drv; + cpld[0] = (sata1->presense[0] ? 0x80 : 0xc0) | + (sata1->presense[1] ? 0x20 : 0x30) | + (sata2->presense[0] ? 0x08 : 0x0c) | + (sata2->presense[1] ? 0x02 : 0x03); + } +} + +void synoreset() { Index: src/sys/arch/sandpoint/stand/altboot/globals.h diff -u src/sys/arch/sandpoint/stand/altboot/globals.h:1.17 src/sys/arch/sandpoint/stand/altboot/globals.h:1.18 --- src/sys/arch/sandpoint/stand/altboot/globals.h:1.17 Sun Apr 8 10:38:34 2012 +++ src/sys/arch/sandpoint/stand/altboot/globals.h Mon Apr 16 16:55:29 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: globals.h,v 1.17 2012/04/08 10:38:34 nisimura Exp $ */ +/* $NetBSD: globals.h,v 1.18 2012/04/16 16:55:29 phx Exp $ */ #ifdef DEBUG #define DPRINTF(x) printf x @@ -36,6 +36,7 @@ struct brdprop { void (*setup)(struct brdprop *); void (*brdfix)(struct brdprop *); void (*pcifix)(struct brdprop *); + void (*launch)(struct brdprop *); void (*reset)(void); }; @@ -79,8 +80,14 @@ struct pcidev { unsigned pvd; /* device ID */ void *drv; /* driver */ }; +extern struct pcidev lata[2]; +extern struct pcidev lnif[2]; +extern struct pcidev lusb[3]; +extern int nata, nnif, nusb; + void pcisetup(void); void pcifixup(void); +void launchfixup(void); unsigned pcimaketag(int, int, int); void pcidecomposetag(unsigned, int *, int *, int *); int pcifinddev(unsigned, unsigned, unsigned *); Index: src/sys/arch/sandpoint/stand/altboot/main.c diff -u src/sys/arch/sandpoint/stand/altboot/main.c:1.17 src/sys/arch/sandpoint/stand/altboot/main.c:1.18 --- src/sys/arch/sandpoint/stand/altboot/main.c:1.17 Sun Jan 22 13:08:16 2012 +++ src/sys/arch/sandpoint/stand/altboot/main.c Mon Apr 16 16:55:29 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: main.c,v 1.17 2012/01/22 13:08:16 phx Exp $ */ +/* $NetBSD: main.c,v 1.18 2012/04/16 16:55:29 phx Exp $ */ /*- * Copyright (c) 2007 The NetBSD Foundation, Inc. @@ -218,10 +218,9 @@ main(int argc, char *argv[], char *boota } /* intialize a disk driver */ - for (n = 0; n < nata; n++) - if (dskdv_init(&lata[n]) != 0) - break; - if (n >= nata) + for (i = 0, n = 0; i < nata; i++) + n += dskdv_init(&lata[i]); + if (n == 0) printf("IDE/SATA device driver was not found\n"); /* initialize a network interface */ @@ -339,6 +338,7 @@ main(int argc, char *argv[], char *boota btinfo_modulelist_size); } + launchfixup(); netif_shutdown_all(); __syncicache((void *)marks[MARK_ENTRY],