- 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.
This commit is contained in:
parent
61ba7ebc8c
commit
336f46057f
|
@ -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 @@ Kurobox 11, 12, 13, 14 -> 0, 1, 4, 3
|
|||
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.
|
||||
|
|
|
@ -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 @@ static int brdtype;
|
|||
#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 @@ pci_attach_hook(struct device *parent, struct device *self,
|
|||
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 @@ pci_attach_hook(struct device *parent, struct device *self,
|
|||
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 @@ pci_intr_map(struct pci_attach_args *pa, pci_intr_handle_t *ihp)
|
|||
/* 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 */
|
||||
|
|
|
@ -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 @@ struct satmgr_softc {
|
|||
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 rxintr(struct satmgr_softc *);
|
|||
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 @@ satmgr_attach(device_t parent, device_t self, void *aux)
|
|||
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 @@ satmgr_attach(device_t parent, device_t self, void *aux)
|
|||
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 @@ satmgr_attach(device_t parent, device_t self, void *aux)
|
|||
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 @@ satmgr_attach(device_t parent, device_t self, void *aux)
|
|||
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 @@ swintr(void *arg)
|
|||
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];
|
||||
}
|
||||
|
@ -591,6 +602,20 @@ swintr(void *arg)
|
|||
mutex_spin_exit(&sc->sc_lock);
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
|
@ -615,6 +640,20 @@ kbutton(struct satmgr_softc *sc, int ch)
|
|||
}
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
|
@ -630,6 +669,20 @@ sbutton(struct satmgr_softc *sc, int ch)
|
|||
}
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue