Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/sandpoint - add D-Link EPIC defition to pci_machdep.c
details: https://anonhg.NetBSD.org/src/rev/64ac57f472aa
branches: trunk
changeset: 761908:64ac57f472aa
user: nisimura <nisimura%NetBSD.org@localhost>
date: Thu Feb 10 13:54:45 2011 +0000
description:
- add D-Link EPIC defition to pci_machdep.c
- change the way to reboot/pwroff to make satmgr.c more flexible for
a multiple byte sat protocol.
diffstat:
sys/arch/sandpoint/README.NAS | 4 +-
sys/arch/sandpoint/pci/pci_machdep.c | 20 ++++++-
sys/arch/sandpoint/sandpoint/satmgr.c | 93 +++++++++++++++++++++++++++-------
3 files changed, 91 insertions(+), 26 deletions(-)
diffs (283 lines):
diff -r daed7dbad85e -r 64ac57f472aa sys/arch/sandpoint/README.NAS
--- a/sys/arch/sandpoint/README.NAS Thu Feb 10 13:52:36 2011 +0000
+++ b/sys/arch/sandpoint/README.NAS Thu Feb 10 13:54:45 2011 +0000
@@ -1,4 +1,4 @@
-$NetBSD: README.NAS,v 1.11 2011/02/08 12:21:26 phx Exp $
+$NetBSD: README.NAS,v 1.12 2011/02/10 13:54:45 nisimura Exp $
//// MPC8241/8245 NAS products ////
@@ -41,7 +41,7 @@
Synology 12, 13, 14, 15 -> 4, 0, 1, 2
QNAP 13, 14, 15, 16 -> 0, 1, 2, 3
StorCenter 12, 13, 14, 15 -> 0, 1, 2, 3
-DLink 13, 14, 15, 16 -> 0, 1, 2, 3
+DLink 13, 14, 15, 16 -> 0, 1, 3, 4
- USB EHCI is a multiple function PCI device which has
pin assignment A, B and C.
diff -r daed7dbad85e -r 64ac57f472aa sys/arch/sandpoint/pci/pci_machdep.c
--- a/sys/arch/sandpoint/pci/pci_machdep.c Thu Feb 10 13:52:36 2011 +0000
+++ b/sys/arch/sandpoint/pci/pci_machdep.c Thu Feb 10 13:54:45 2011 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: pci_machdep.c,v 1.21 2011/02/07 13:35:21 nisimura Exp $ */
+/* $NetBSD: pci_machdep.c,v 1.22 2011/02/10 13:54:45 nisimura Exp $ */
/*
* Copyright (c) 1996 Christopher G. Demetriou. All rights reserved.
@@ -43,7 +43,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pci_machdep.c,v 1.21 2011/02/07 13:35:21 nisimura Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pci_machdep.c,v 1.22 2011/02/10 13:54:45 nisimura Exp $");
#include "opt_pci.h"
@@ -95,6 +95,7 @@
#define BRD_QNAPTS101 101
#define BRD_SYNOLOGY 102
#define BRD_STORCENTER 103
+#define BRD_DLINKDSM 104
#define BRD_UNKNOWN -1
#define PCI_CONFIG_ENABLE 0x80000000UL
@@ -104,7 +105,7 @@
struct pcibus_attach_args *pba)
{
pcitag_t tag;
- pcireg_t dev11, dev22, dev15, dev13;
+ pcireg_t dev11, dev22, dev15, dev13, dev16;
tag = pci_make_tag(pba->pba_pc, pba->pba_bus, 11, 0);
dev11 = pci_conf_read(pba->pba_pc, tag, PCI_CLASS_REG);
@@ -150,7 +151,14 @@
brdtype = BRD_STORCENTER;
return;
}
-
+ tag = pci_make_tag(pba->pba_pc, pba->pba_bus, 16, 0);
+ dev16 = pci_conf_read(pba->pba_pc, tag, PCI_ID_REG);
+ if (PCI_VENDOR(dev16) == PCI_VENDOR_ACARD) {
+ /* ACARD ATP865 at dev 16 */
+ brdtype = BRD_DLINKDSM;
+ return;
+ }
+
brdtype = BRD_UNKNOWN;
}
@@ -336,6 +344,10 @@
/* map line 12,13-15 to EPIC IRQ4,0-2 */
*ihp = (line == 12) ? 4 : line - 13;
break;
+ case BRD_DLINKDSM:
+ /* map line 13,14,15,16 to EPIC IRQ0,1,3,4 */
+ *ihp = (line < 15) ? line - 13 : line - 12;
+ break;
case BRD_STORCENTER:
default:
/* map line 12-15 to EPIC IRQ0-3 */
diff -r daed7dbad85e -r 64ac57f472aa sys/arch/sandpoint/sandpoint/satmgr.c
--- a/sys/arch/sandpoint/sandpoint/satmgr.c Thu Feb 10 13:52:36 2011 +0000
+++ b/sys/arch/sandpoint/sandpoint/satmgr.c Thu Feb 10 13:54:45 2011 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: satmgr.c,v 1.2 2010/06/03 10:44:21 phx Exp $ */
+/* $NetBSD: satmgr.c,v 1.3 2011/02/10 13:54:45 nisimura Exp $ */
/*-
* Copyright (c) 2010 The NetBSD Foundation, Inc.
@@ -55,6 +55,9 @@
#include <sandpoint/sandpoint/eumbvar.h>
#include "locators.h"
+
+struct satops;
+
struct satmgr_softc {
device_t sc_dev;
bus_space_tag_t sc_iot;
@@ -71,6 +74,8 @@
char sc_rd_buf[16], *sc_rd_lim, *sc_rd_cur, *sc_rd_ptr;
char sc_wr_buf[16], *sc_wr_lim, *sc_wr_cur, *sc_wr_ptr;
int sc_rd_cnt, sc_wr_cnt;
+ int sc_btnstate;
+ struct satops *sc_ops;
};
static int satmgr_match(device_t, cfdata_t, void *);
@@ -104,24 +109,30 @@
static void txintr(struct satmgr_softc *);
static void startoutput(struct satmgr_softc *);
static void swintr(void *);
+static void kreboot(struct satmgr_softc *);
+static void sreboot(struct satmgr_softc *);
+static void qreboot(struct satmgr_softc *);
+static void kpwroff(struct satmgr_softc *);
+static void spwroff(struct satmgr_softc *);
+static void qpwroff(struct satmgr_softc *);
static void kbutton(struct satmgr_softc *, int);
static void sbutton(struct satmgr_softc *, int);
static void qbutton(struct satmgr_softc *, int);
static void guarded_pbutton(void *);
static void sched_sysmon_pbutton(void *);
-struct satmsg {
+struct satops {
const char *family;
- const char *reboot, *poweroff;
+ void (*reboot)(struct satmgr_softc *);
+ void (*pwroff)(struct satmgr_softc *);
void (*dispatch)(struct satmgr_softc *, int);
};
-static const struct satmsg satmodel[] = {
- { "kurobox", "CCGG", "EEGG", kbutton },
- { "synology", "C", "1", sbutton },
- { "qnap", "f", "A", qbutton }
+static struct satops satmodel[] = {
+ { "kurobox", kreboot, kpwroff, kbutton },
+ { "synology", sreboot, spwroff, sbutton },
+ { "qnap", qreboot, qpwroff, qbutton }
};
-static const struct satmsg *satmgr_msg;
/* single byte stride register layout */
#define RBR 0
@@ -156,23 +167,24 @@
struct eumb_attach_args *eaa = aux;
struct satmgr_softc *sc = device_private(self);
struct btinfo_prodfamily *pfam;
+ struct satops *ops;
int i, sataddr, epicirq;
found = 1;
if ((pfam = lookup_bootinfo(BTINFO_PRODFAMILY)) == NULL)
goto notavail;
- satmgr_msg = NULL;
+ ops = NULL;
for (i = 0; i < (int)(sizeof(satmodel)/sizeof(satmodel[0])); i++) {
if (strcmp(pfam->name, satmodel[i].family) == 0) {
- satmgr_msg = &satmodel[i];
+ ops = &satmodel[i];
break;
}
}
- if (satmgr_msg == NULL)
+ if (ops == NULL)
goto notavail;
-
- aprint_normal(": button manager (%s)\n", satmgr_msg->family);
+ aprint_normal(": button manager (%s)\n", ops->family);
+ sc->sc_ops = ops;
sc->sc_dev = self;
sataddr = (eaa->eumb_unit == 0) ? 0x4500 : 0x4600;
@@ -192,6 +204,7 @@
mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_HIGH);
cv_init(&sc->sc_rdcv, "satrd");
cv_init(&sc->sc_wrcv, "satwr");
+ sc->sc_btnstate = 0;
epicirq = (eaa->eumb_unit == 0) ? 24 : 25;
intr_establish(epicirq + 16, IST_LEVEL, IPL_SERIAL, hwintr, sc);
@@ -210,7 +223,7 @@
aprint_error_dev(sc->sc_dev,
"unable to register power button with sysmon\n");
- if (strcmp(satmgr_msg->family, "kurobox") == 0) {
+ if (strcmp(ops->family, "kurobox") == 0) {
const struct sysctlnode *rnode;
struct sysctllog *clog;
@@ -244,14 +257,12 @@
static void
satmgr_reboot(int howto)
{
- const char *msg;
struct satmgr_softc *sc = device_lookup_private(&satmgr_cd, 0);
-
+
if ((howto & RB_POWERDOWN) == RB_AUTOBOOT)
- msg = satmgr_msg->reboot; /* REBOOT */
+ (*sc->sc_ops->reboot)(sc); /* REBOOT */
else
- msg = satmgr_msg->poweroff; /* HALT or POWERDOWN */
- send_sat(sc, msg);
+ (*sc->sc_ops->pwroff)(sc); /* HALT or POWERDOWN */
tsleep(satmgr_reboot, PWAIT, "reboot", 0);
/*NOTREACHED*/
}
@@ -576,7 +587,7 @@
mutex_spin_enter(&sc->sc_lock);
ptr = sc->sc_rd_ptr;
for (n = 0; n < sc->sc_rd_cnt; n++) {
- (*satmgr_msg->dispatch)(sc, *ptr);
+ (*sc->sc_ops->dispatch)(sc, *ptr);
if (++ptr == sc->sc_rd_lim)
ptr = &sc->sc_rd_buf[0];
}
@@ -592,6 +603,20 @@
}
static void
+kreboot(struct satmgr_softc *sc)
+{
+
+ send_sat(sc, "CCGG");
+}
+
+static void
+kpwroff(struct satmgr_softc *sc)
+{
+
+ send_sat(sc, "EEGG");
+}
+
+static void
kbutton(struct satmgr_softc *sc, int ch)
{
@@ -616,6 +641,20 @@
}
static void
+sreboot(struct satmgr_softc *sc)
+{
+
+ send_sat(sc, "C");
+}
+
+static void
+spwroff(struct satmgr_softc *sc)
+{
+
+ send_sat(sc, "1");
+}
+
+static void
sbutton(struct satmgr_softc *sc, int ch)
{
@@ -631,6 +670,20 @@
}
static void
+qreboot(struct satmgr_softc *sc)
+{
+
+ send_sat(sc, "f");
+}
+
+static void
+qpwroff(struct satmgr_softc *sc)
+{
+
+ send_sat(sc, "A");
+}
+
+static void
qbutton(struct satmgr_softc *sc, int ch)
{
/* research in progress */
Home |
Main Index |
Thread Index |
Old Index