- device/softc split

This commit is contained in:
joerg 2008-07-09 14:46:15 +00:00
parent b5d2f044e1
commit 18f2c24945
2 changed files with 45 additions and 50 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: puc.c,v 1.30 2008/04/10 19:13:37 cegger Exp $ */ /* $NetBSD: puc.c,v 1.31 2008/07/09 14:46:15 joerg Exp $ */
/* /*
* Copyright (c) 1996, 1998, 1999 * Copyright (c) 1996, 1998, 1999
@ -53,7 +53,7 @@
*/ */
#include <sys/cdefs.h> #include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: puc.c,v 1.30 2008/04/10 19:13:37 cegger Exp $"); __KERNEL_RCSID(0, "$NetBSD: puc.c,v 1.31 2008/07/09 14:46:15 joerg Exp $");
#include <sys/param.h> #include <sys/param.h>
#include <sys/systm.h> #include <sys/systm.h>
@ -70,8 +70,6 @@ __KERNEL_RCSID(0, "$NetBSD: puc.c,v 1.30 2008/04/10 19:13:37 cegger Exp $");
#include "opt_puccn.h" #include "opt_puccn.h"
struct puc_softc { struct puc_softc {
struct device sc_dev;
/* static configuration data */ /* static configuration data */
const struct puc_device_description *sc_desc; const struct puc_device_description *sc_desc;
@ -87,7 +85,7 @@ struct puc_softc {
/* per-port dynamic data */ /* per-port dynamic data */
struct { struct {
struct device *dev; device_t dev;
/* filled in by port attachments */ /* filled in by port attachments */
int (*ihand)(void *); int (*ihand)(void *);
@ -100,8 +98,7 @@ static int puc_print(void *, const char *);
static const char *puc_port_type_name(int); static const char *puc_port_type_name(int);
static int static int
puc_match(struct device *parent, struct cfdata *match, puc_match(device_t parent, cfdata_t match, void *aux)
void *aux)
{ {
struct pci_attach_args *pa = aux; struct pci_attach_args *pa = aux;
const struct puc_device_description *desc; const struct puc_device_description *desc;
@ -141,9 +138,9 @@ puc_match(struct device *parent, struct cfdata *match,
} }
static void static void
puc_attach(struct device *parent, struct device *self, void *aux) puc_attach(device_t parent, device_t self, void *aux)
{ {
struct puc_softc *sc = (struct puc_softc *)self; struct puc_softc *sc = device_private(self);
struct pci_attach_args *pa = aux; struct pci_attach_args *pa = aux;
struct puc_attach_args paa; struct puc_attach_args paa;
pci_intr_handle_t intrhandle; pci_intr_handle_t intrhandle;
@ -170,11 +167,11 @@ puc_attach(struct device *parent, struct device *self, void *aux)
#else #else
printf(": unknown PCI communications device\n"); printf(": unknown PCI communications device\n");
printf("%s: compile kernel with PUC_PRINT_REGS and larger\n", printf("%s: compile kernel with PUC_PRINT_REGS and larger\n",
device_xname(&sc->sc_dev)); device_xname(self));
printf("%s: mesage buffer (via 'options MSGBUFSIZE=...'),\n", printf("%s: mesage buffer (via 'options MSGBUFSIZE=...'),\n",
device_xname(&sc->sc_dev)); device_xname(self));
printf("%s: and report the result with send-pr\n", printf("%s: and report the result with send-pr\n",
device_xname(&sc->sc_dev)); device_xname(self));
#endif #endif
return; return;
} }
@ -223,13 +220,13 @@ puc_attach(struct device *parent, struct device *self, void *aux)
if (sc->sc_bar_mappings[i].mapped) if (sc->sc_bar_mappings[i].mapped)
continue; continue;
aprint_error_dev(&sc->sc_dev, "couldn't map BAR at offset 0x%lx\n", aprint_error_dev(self, "couldn't map BAR at offset 0x%lx\n",
(long)(PCI_MAPREG_START + 4 * i)); (long)(PCI_MAPREG_START + 4 * i));
} }
/* Map interrupt. */ /* Map interrupt. */
if (pci_intr_map(pa, &intrhandle)) { if (pci_intr_map(pa, &intrhandle)) {
aprint_error_dev(&sc->sc_dev, "couldn't map interrupt\n"); aprint_error_dev(self, "couldn't map interrupt\n");
return; return;
} }
/* /*
@ -256,7 +253,7 @@ puc_attach(struct device *parent, struct device *self, void *aux)
barindex = PUC_PORT_BAR_INDEX(sc->sc_desc->ports[i].bar); barindex = PUC_PORT_BAR_INDEX(sc->sc_desc->ports[i].bar);
if (!sc->sc_bar_mappings[barindex].mapped) { if (!sc->sc_bar_mappings[barindex].mapped) {
printf("%s: %s port uses unmapped BAR (0x%x)\n", printf("%s: %s port uses unmapped BAR (0x%x)\n",
device_xname(&sc->sc_dev), device_xname(self),
puc_port_type_name(sc->sc_desc->ports[i].type), puc_port_type_name(sc->sc_desc->ports[i].type),
sc->sc_desc->ports[i].bar); sc->sc_desc->ports[i].bar);
continue; continue;
@ -286,14 +283,14 @@ puc_attach(struct device *parent, struct device *self, void *aux)
sc->sc_bar_mappings[barindex].s - sc->sc_bar_mappings[barindex].s -
sc->sc_desc->ports[i].offset, sc->sc_desc->ports[i].offset,
&subregion_handle) != 0) { &subregion_handle) != 0) {
aprint_error_dev(&sc->sc_dev, "couldn't get subregion for port %d\n", i); aprint_error_dev(self, "couldn't get subregion for port %d\n", i);
continue; continue;
} }
paa.h = subregion_handle; paa.h = subregion_handle;
#if 0 #if 0
printf("%s: port %d: %s @ (index %d) 0x%x (0x%lx, 0x%lx)\n", printf("%s: port %d: %s @ (index %d) 0x%x (0x%lx, 0x%lx)\n",
device_xname(&sc->sc_dev), paa.port, device_xname(self), paa.port,
puc_port_type_name(paa.type), barindex, (int)paa.a, puc_port_type_name(paa.type), barindex, (int)paa.a,
(long)paa.t, (long)paa.h); (long)paa.t, (long)paa.h);
#endif #endif
@ -306,7 +303,7 @@ puc_attach(struct device *parent, struct device *self, void *aux)
} }
} }
CFATTACH_DECL(puc, sizeof(struct puc_softc), CFATTACH_DECL_NEW(puc, sizeof(struct puc_softc),
puc_match, puc_attach, NULL, NULL); puc_match, puc_attach, NULL, NULL);
static int static int

View File

@ -1,4 +1,4 @@
/* $NetBSD: weasel_pci.c,v 1.12 2008/04/28 20:23:55 martin Exp $ */ /* $NetBSD: weasel_pci.c,v 1.13 2008/07/09 14:51:11 joerg Exp $ */
/*- /*-
* Copyright (c) 2001 The NetBSD Foundation, Inc. * Copyright (c) 2001 The NetBSD Foundation, Inc.
@ -39,7 +39,7 @@
*/ */
#include <sys/cdefs.h> #include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: weasel_pci.c,v 1.12 2008/04/28 20:23:55 martin Exp $"); __KERNEL_RCSID(0, "$NetBSD: weasel_pci.c,v 1.13 2008/07/09 14:51:11 joerg Exp $");
#include <sys/param.h> #include <sys/param.h>
#include <sys/systm.h> #include <sys/systm.h>
@ -58,8 +58,7 @@ __KERNEL_RCSID(0, "$NetBSD: weasel_pci.c,v 1.12 2008/04/28 20:23:55 martin Exp $
#include <dev/sysmon/sysmonvar.h> #include <dev/sysmon/sysmonvar.h>
struct weasel_softc { struct weasel_softc {
struct device sc_dev; /* generic device glue */ device_t sc_dev;
bus_space_tag_t sc_st; bus_space_tag_t sc_st;
bus_space_handle_t sc_sh; bus_space_handle_t sc_sh;
@ -84,8 +83,7 @@ static int weasel_pci_wdog_disarm(struct weasel_softc *);
static int weasel_pci_wdog_query_state(struct weasel_softc *); static int weasel_pci_wdog_query_state(struct weasel_softc *);
static int static int
weasel_pci_match(struct device *parent, struct cfdata *cf, weasel_pci_match(device_t parent, cfdata_t cf, void *aux)
void *aux)
{ {
struct pci_attach_args *pa = aux; struct pci_attach_args *pa = aux;
@ -97,10 +95,9 @@ weasel_pci_match(struct device *parent, struct cfdata *cf,
} }
static void static void
weasel_pci_attach(struct device *parent, struct device *self, weasel_pci_attach(device_t parent, device_t self, void *aux)
void *aux)
{ {
struct weasel_softc *sc = (void *) self; struct weasel_softc *sc = device_private(self);
struct pci_attach_args *pa = aux; struct pci_attach_args *pa = aux;
struct weasel_config_block cfg; struct weasel_config_block cfg;
const char *vers, *mode; const char *vers, *mode;
@ -108,43 +105,45 @@ weasel_pci_attach(struct device *parent, struct device *self,
uint16_t cfg_size; uint16_t cfg_size;
uint8_t buf[8]; uint8_t buf[8];
sc->sc_dev = self;
printf(": PCI-Weasel watchdog timer\n"); printf(": PCI-Weasel watchdog timer\n");
if (pci_mapreg_map(pa, PCI_MAPREG_START, if (pci_mapreg_map(pa, PCI_MAPREG_START,
PCI_MAPREG_TYPE_MEM|PCI_MAPREG_MEM_TYPE_32BIT, 0, PCI_MAPREG_TYPE_MEM|PCI_MAPREG_MEM_TYPE_32BIT, 0,
&sc->sc_st, &sc->sc_sh, NULL, NULL) != 0) { &sc->sc_st, &sc->sc_sh, NULL, NULL) != 0) {
aprint_error_dev(&sc->sc_dev, "unable to map device registers\n"); aprint_error_dev(self, "unable to map device registers\n");
return; return;
} }
/* Ping the Weasel to see if it's alive. */ /* Ping the Weasel to see if it's alive. */
if (weasel_issue_command(sc, OS_CMD_PING)) { if (weasel_issue_command(sc, OS_CMD_PING)) {
aprint_error_dev(&sc->sc_dev, "Weasel didn't respond to PING\n"); aprint_error_dev(self, "Weasel didn't respond to PING\n");
return; return;
} }
bus_space_write_1(sc->sc_st, sc->sc_sh, WEASEL_STATUS, 0); bus_space_write_1(sc->sc_st, sc->sc_sh, WEASEL_STATUS, 0);
if ((v = bus_space_read_1(sc->sc_st, sc->sc_sh, WEASEL_DATA_RD)) != if ((v = bus_space_read_1(sc->sc_st, sc->sc_sh, WEASEL_DATA_RD)) !=
OS_RET_PONG) { OS_RET_PONG) {
aprint_error_dev(&sc->sc_dev, "unexpected PING response from Weasel: 0x%02x\n", v); aprint_error_dev(self, "unexpected PING response from Weasel: 0x%02x\n", v);
return; return;
} }
/* Read the config block. */ /* Read the config block. */
if (weasel_issue_command(sc, OS_CMD_SHOW_CONFIG)) { if (weasel_issue_command(sc, OS_CMD_SHOW_CONFIG)) {
aprint_error_dev(&sc->sc_dev, "Weasel didn't respond to SHOW_CONFIG\n"); aprint_error_dev(self, "Weasel didn't respond to SHOW_CONFIG\n");
return; return;
} }
cfg_size = bus_space_read_1(sc->sc_st, sc->sc_sh, WEASEL_DATA_RD); cfg_size = bus_space_read_1(sc->sc_st, sc->sc_sh, WEASEL_DATA_RD);
bus_space_write_1(sc->sc_st, sc->sc_sh, WEASEL_STATUS, 0); bus_space_write_1(sc->sc_st, sc->sc_sh, WEASEL_STATUS, 0);
if (++cfg_size != sizeof(cfg)) { if (++cfg_size != sizeof(cfg)) {
aprint_error_dev(&sc->sc_dev, "weird config block size from Weasel: 0x%03x\n", cfg_size); aprint_error_dev(self, "weird config block size from Weasel: 0x%03x\n", cfg_size);
return; return;
} }
for (cp = (uint8_t *) &cfg; cfg_size != 0; cfg_size--) { for (cp = (uint8_t *) &cfg; cfg_size != 0; cfg_size--) {
if (weasel_wait_response(sc)) { if (weasel_wait_response(sc)) {
aprint_error_dev(&sc->sc_dev, "Weasel stopped providing config block(%d)\n", cfg_size); aprint_error_dev(self, "Weasel stopped providing config block(%d)\n", cfg_size);
return; return;
} }
*cp++ = bus_space_read_1(sc->sc_st, sc->sc_sh, WEASEL_DATA_RD); *cp++ = bus_space_read_1(sc->sc_st, sc->sc_sh, WEASEL_DATA_RD);
@ -174,41 +173,40 @@ weasel_pci_attach(struct device *parent, struct device *self,
} }
if (vers != NULL) if (vers != NULL)
printf("%s: %s mode\n", device_xname(&sc->sc_dev), printf("%s: %s mode\n", device_xname(self), mode);
mode);
else else
printf("%s: unknown config version 0x%02x\n", device_xname(&sc->sc_dev), printf("%s: unknown config version 0x%02x\n", device_xname(self),
cfg.cfg_version); cfg.cfg_version);
/* /*
* Fetch sw version. * Fetch sw version.
*/ */
if (weasel_issue_command(sc, OS_CMD_QUERY_SW_VER)) { if (weasel_issue_command(sc, OS_CMD_QUERY_SW_VER)) {
aprint_error_dev(&sc->sc_dev, "didn't reply to software version query.\n"); aprint_error_dev(self, "didn't reply to software version query.\n");
} }
else { else {
v = bus_space_read_1(sc->sc_st, sc->sc_sh, WEASEL_DATA_RD); v = bus_space_read_1(sc->sc_st, sc->sc_sh, WEASEL_DATA_RD);
bus_space_write_1(sc->sc_st, sc->sc_sh, WEASEL_STATUS, 0); bus_space_write_1(sc->sc_st, sc->sc_sh, WEASEL_STATUS, 0);
if (v>7) if (v>7)
printf("%s: weird length for version string(%d).\n", printf("%s: weird length for version string(%d).\n",
device_xname(&sc->sc_dev), v); device_xname(self), v);
bzero(buf, sizeof(buf)); bzero(buf, sizeof(buf));
for (cp = buf; v != 0; v--) { for (cp = buf; v != 0; v--) {
if (weasel_wait_response(sc)) { if (weasel_wait_response(sc)) {
printf("%s: Weasel stopped providing version\n", printf("%s: Weasel stopped providing version\n",
device_xname(&sc->sc_dev)); device_xname(self));
} }
*cp++ = bus_space_read_1(sc->sc_st, sc->sc_sh, WEASEL_DATA_RD); *cp++ = bus_space_read_1(sc->sc_st, sc->sc_sh, WEASEL_DATA_RD);
bus_space_write_1(sc->sc_st, sc->sc_sh, WEASEL_STATUS, 0); bus_space_write_1(sc->sc_st, sc->sc_sh, WEASEL_STATUS, 0);
} }
printf("%s: sw: %s", device_xname(&sc->sc_dev), buf); printf("%s: sw: %s", device_xname(self), buf);
} }
/* /*
* Fetch logic version. * Fetch logic version.
*/ */
if (weasel_issue_command(sc, OS_CMD_QUERY_L_VER)) { if (weasel_issue_command(sc, OS_CMD_QUERY_L_VER)) {
aprint_normal("\n"); aprint_normal("\n");
aprint_error_dev(&sc->sc_dev, "didn't reply to logic version query.\n"); aprint_error_dev(self, "didn't reply to logic version query.\n");
} }
bus_space_write_1(sc->sc_st, sc->sc_sh, WEASEL_STATUS, 0); bus_space_write_1(sc->sc_st, sc->sc_sh, WEASEL_STATUS, 0);
v = bus_space_read_1(sc->sc_st, sc->sc_sh, WEASEL_DATA_RD); v = bus_space_read_1(sc->sc_st, sc->sc_sh, WEASEL_DATA_RD);
@ -218,7 +216,7 @@ weasel_pci_attach(struct device *parent, struct device *self,
*/ */
if (weasel_issue_command(sc, OS_CMD_QUERY_VB_VER)) { if (weasel_issue_command(sc, OS_CMD_QUERY_VB_VER)) {
aprint_normal("\n"); aprint_normal("\n");
aprint_error_dev(&sc->sc_dev, "didn't reply to vga bios version query.\n"); aprint_error_dev(self, "didn't reply to vga bios version query.\n");
} }
v = bus_space_read_1(sc->sc_st, sc->sc_sh, WEASEL_DATA_RD); v = bus_space_read_1(sc->sc_st, sc->sc_sh, WEASEL_DATA_RD);
bus_space_write_1(sc->sc_st, sc->sc_sh, WEASEL_STATUS, 0); bus_space_write_1(sc->sc_st, sc->sc_sh, WEASEL_STATUS, 0);
@ -228,13 +226,13 @@ weasel_pci_attach(struct device *parent, struct device *self,
*/ */
if (weasel_issue_command(sc, OS_CMD_QUERY_HW_VER)) { if (weasel_issue_command(sc, OS_CMD_QUERY_HW_VER)) {
aprint_normal("\n"); aprint_normal("\n");
aprint_error_dev(&sc->sc_dev, "didn't reply to hardware version query.\n"); aprint_error_dev(self, "didn't reply to hardware version query.\n");
} }
v = bus_space_read_1(sc->sc_st, sc->sc_sh, WEASEL_DATA_RD); v = bus_space_read_1(sc->sc_st, sc->sc_sh, WEASEL_DATA_RD);
bus_space_write_1(sc->sc_st, sc->sc_sh, WEASEL_STATUS, 0); bus_space_write_1(sc->sc_st, sc->sc_sh, WEASEL_STATUS, 0);
printf(" hw: %d.%d", (v>>4), (v&0x0f)); printf(" hw: %d.%d", (v>>4), (v&0x0f));
printf("\n%s: break passthrough %s", device_xname(&sc->sc_dev), printf("\n%s: break passthrough %s", device_xname(self),
cfg.break_passthru ? "enabled" : "disabled"); cfg.break_passthru ? "enabled" : "disabled");
if ((sc->sc_wdog_armed = weasel_pci_wdog_query_state(sc)) == -1) if ((sc->sc_wdog_armed = weasel_pci_wdog_query_state(sc)) == -1)
@ -251,11 +249,11 @@ weasel_pci_attach(struct device *parent, struct device *self,
sc->sc_smw.smw_period = sc->sc_wdog_period; sc->sc_smw.smw_period = sc->sc_wdog_period;
if (sysmon_wdog_register(&sc->sc_smw) != 0) if (sysmon_wdog_register(&sc->sc_smw) != 0)
aprint_error_dev(&sc->sc_dev, "unable to register PC-Weasel watchdog " aprint_error_dev(self, "unable to register PC-Weasel watchdog "
"with sysmon\n"); "with sysmon\n");
} }
CFATTACH_DECL(weasel_pci, sizeof(struct weasel_softc), CFATTACH_DECL_NEW(weasel_pci, sizeof(struct weasel_softc),
weasel_pci_match, weasel_pci_attach, NULL, NULL); weasel_pci_match, weasel_pci_attach, NULL, NULL);
static int static int
@ -332,7 +330,7 @@ weasel_pci_wdog_tickle(struct sysmon_wdog *smw)
error = 0; error = 0;
} else { } else {
printf("%s: Watchdog timer disabled on PC/Weasel! Disarming wdog.\n", printf("%s: Watchdog timer disabled on PC/Weasel! Disarming wdog.\n",
device_xname(&sc->sc_dev)); device_xname(sc->sc_dev));
sc->sc_wdog_armed = 0; sc->sc_wdog_armed = 0;
sysmon_wdog_setmode(smw, WDOG_MODE_DISARMED, 0); sysmon_wdog_setmode(smw, WDOG_MODE_DISARMED, 0);
error = 1; error = 1;
@ -353,7 +351,7 @@ weasel_pci_wdog_arm(struct weasel_softc *sc)
s = splhigh(); s = splhigh();
if (weasel_issue_command(sc, OS_CMD_WDT_ENABLE)) { if (weasel_issue_command(sc, OS_CMD_WDT_ENABLE)) {
printf("%s: no reply to watchdog enable. Check Weasel \"Allow Watchdog\" setting.\n", printf("%s: no reply to watchdog enable. Check Weasel \"Allow Watchdog\" setting.\n",
device_xname(&sc->sc_dev)); device_xname(sc->sc_dev));
error = EIO; error = EIO;
} }
reg = bus_space_read_1(sc->sc_st, sc->sc_sh, WEASEL_DATA_RD); reg = bus_space_read_1(sc->sc_st, sc->sc_sh, WEASEL_DATA_RD);
@ -395,7 +393,7 @@ weasel_pci_wdog_disarm(struct weasel_softc *sc)
if (weasel_issue_command(sc, OS_CMD_WDT_DISABLE)) { if (weasel_issue_command(sc, OS_CMD_WDT_DISABLE)) {
printf("%s: didn't reply to watchdog disable.\n", printf("%s: didn't reply to watchdog disable.\n",
device_xname(&sc->sc_dev)); device_xname(sc->sc_dev));
error = EIO; error = EIO;
} }
reg = bus_space_read_1(sc->sc_st, sc->sc_sh, WEASEL_DATA_RD); reg = bus_space_read_1(sc->sc_st, sc->sc_sh, WEASEL_DATA_RD);
@ -432,7 +430,7 @@ weasel_pci_wdog_query_state(struct weasel_softc *sc)
if (weasel_issue_command(sc, OS_CMD_WDT_QUERY)) { if (weasel_issue_command(sc, OS_CMD_WDT_QUERY)) {
printf("%s: didn't reply to watchdog state query.\n", printf("%s: didn't reply to watchdog state query.\n",
device_xname(&sc->sc_dev)); device_xname(sc->sc_dev));
bus_space_write_1(sc->sc_st, sc->sc_sh, WEASEL_STATUS, 0); bus_space_write_1(sc->sc_st, sc->sc_sh, WEASEL_STATUS, 0);
return(-1); return(-1);
} }