summaryrefslogtreecommitdiffstats
path: root/sys/dev/siba
diff options
context:
space:
mode:
authorweongyo <weongyo@FreeBSD.org>2010-03-09 19:58:00 +0000
committerweongyo <weongyo@FreeBSD.org>2010-03-09 19:58:00 +0000
commitd5d8396eed0f898e14db6166db71f79a776e35f6 (patch)
treea502e295ed9eaeac6bd949c782bf8e2f662aa001 /sys/dev/siba
parent0e0df8873f4a49fc9be37190d3767dd4dafdb40b (diff)
downloadFreeBSD-src-d5d8396eed0f898e14db6166db71f79a776e35f6.zip
FreeBSD-src-d5d8396eed0f898e14db6166db71f79a776e35f6.tar.gz
o uses bus accessor macros to read values from ivar so no more values
are referenced directly from ivar pointer. It's to do like what other buses do. [1] o changes exported prototypes. It doesn't use struct siba_* structures anymore that instead of it it uses only device_t. o removes duplicate code and debug messages. o style(9) Pointed out by: imp [1]
Diffstat (limited to 'sys/dev/siba')
-rw-r--r--sys/dev/siba/siba_bwn.c67
-rw-r--r--sys/dev/siba/siba_core.c653
-rw-r--r--sys/dev/siba/sibavar.h246
3 files changed, 846 insertions, 120 deletions
diff --git a/sys/dev/siba/siba_bwn.c b/sys/dev/siba/siba_bwn.c
index f33f9b3..56e16fd 100644
--- a/sys/dev/siba/siba_bwn.c
+++ b/sys/dev/siba/siba_bwn.c
@@ -152,6 +152,7 @@ siba_bwn_attach(device_t dev)
siba->siba_pci_vid = pci_get_vendor(dev);
siba->siba_pci_subvid = pci_get_subvendor(dev);
siba->siba_pci_subdid = pci_get_subdevice(dev);
+ siba->siba_pci_revid = pci_get_revid(dev);
return (siba_core_attach(siba));
}
@@ -321,6 +322,71 @@ siba_bwn_msi_count(device_t dev, device_t child)
return (pci_msi_count(dev));
}
+static int
+siba_bwn_read_ivar(device_t dev, device_t child, int which, uintptr_t *result)
+{
+ struct siba_dev_softc *sd;
+ struct siba_softc *siba;;
+
+ sd = device_get_ivars(child);
+ siba = sd->sd_bus;
+
+ switch (which) {
+ case SIBA_IVAR_VENDOR:
+ *result = sd->sd_id.sd_vendor;
+ break;
+ case SIBA_IVAR_DEVICE:
+ *result = sd->sd_id.sd_device;
+ break;
+ case SIBA_IVAR_REVID:
+ *result = sd->sd_id.sd_rev;
+ break;
+ case SIBA_IVAR_PCI_VENDOR:
+ *result = siba->siba_pci_vid;
+ break;
+ case SIBA_IVAR_PCI_DEVICE:
+ *result = siba->siba_pci_did;
+ break;
+ case SIBA_IVAR_PCI_SUBVENDOR:
+ *result = siba->siba_pci_subvid;
+ break;
+ case SIBA_IVAR_PCI_SUBDEVICE:
+ *result = siba->siba_pci_subdid;
+ break;
+ case SIBA_IVAR_PCI_REVID:
+ *result = siba->siba_pci_revid;
+ break;
+ case SIBA_IVAR_CHIPID:
+ *result = siba->siba_chipid;
+ break;
+ case SIBA_IVAR_CHIPREV:
+ *result = siba->siba_chiprev;
+ break;
+ case SIBA_IVAR_CHIPPKG:
+ *result = siba->siba_chippkg;
+ break;
+ case SIBA_IVAR_TYPE:
+ *result = siba->siba_type;
+ break;
+ case SIBA_IVAR_CC_PMUFREQ:
+ *result = siba->siba_cc.scc_pmu.freq;
+ break;
+ case SIBA_IVAR_CC_CAPS:
+ *result = siba->siba_cc.scc_caps;
+ break;
+ case SIBA_IVAR_CC_POWERDELAY:
+ *result = siba->siba_cc.scc_powerup_delay;
+ break;
+ case SIBA_IVAR_PCICORE_REVID:
+ *result = siba->siba_pci.spc_dev->sd_id.sd_rev;
+ break;
+ default:
+ return (ENOENT);
+ }
+
+ return (0);
+}
+
static device_method_t siba_bwn_methods[] = {
/* Device interface */
DEVMETHOD(device_probe, siba_bwn_probe),
@@ -333,6 +399,7 @@ static device_method_t siba_bwn_methods[] = {
/* Bus interface */
DEVMETHOD(bus_alloc_resource, siba_bwn_alloc_resource),
DEVMETHOD(bus_release_resource, siba_bwn_release_resource),
+ DEVMETHOD(bus_read_ivar, siba_bwn_read_ivar),
DEVMETHOD(bus_setup_intr, siba_bwn_setup_intr),
DEVMETHOD(bus_teardown_intr, siba_bwn_teardown_intr),
diff --git a/sys/dev/siba/siba_core.c b/sys/dev/siba/siba_core.c
index 748b426..44eaef5 100644
--- a/sys/dev/siba/siba_core.c
+++ b/sys/dev/siba/siba_core.c
@@ -133,6 +133,13 @@ static void siba_pci_write_multi_4(struct siba_dev_softc *, const void *,
size_t, uint16_t);
static const char *siba_core_name(uint16_t);
static void siba_pcicore_init(struct siba_pci *);
+static uint32_t siba_read_4_sub(struct siba_dev_softc *, uint16_t);
+static void siba_write_4_sub(struct siba_dev_softc *, uint16_t, uint32_t);
+static void siba_powerup_sub(struct siba_softc *, int);
+static int siba_powerdown_sub(struct siba_softc *);
+static int siba_dev_isup_sub(struct siba_dev_softc *);
+static void siba_dev_up_sub(struct siba_dev_softc *, uint32_t);
+static void siba_dev_down_sub(struct siba_dev_softc *, uint32_t);
int siba_core_attach(struct siba_softc *);
int siba_core_detach(struct siba_softc *);
int siba_core_suspend(struct siba_softc *);
@@ -181,7 +188,7 @@ siba_core_attach(struct siba_softc *siba)
/* XXX init PCI or PCMCIA host devices */
- siba_powerup(siba, 0);
+ siba_powerup_sub(siba, 0);
/* init ChipCommon */
scc = &siba->siba_cc;
@@ -192,21 +199,15 @@ siba_core_attach(struct siba_softc *siba)
siba_cc_powerup_delay(scc);
}
- /* fetch various internal informations for PCI */
- siba->siba_board_vendor = pci_read_config(siba->siba_dev,
- PCIR_SUBVEND_0, 2);
- siba->siba_board_type = pci_read_config(siba->siba_dev, PCIR_SUBDEV_0,
- 2);
- siba->siba_board_rev = pci_read_config(siba->siba_dev, PCIR_REVID, 2);
error = siba_pci_sprom(siba, &siba->siba_sprom);
if (error) {
- siba_powerdown(siba);
+ siba_powerdown_sub(siba);
return (error);
}
siba_pcicore_init(&siba->siba_pci);
- siba_powerdown(siba);
-
+ siba_powerdown_sub(siba);
+
return (bus_generic_attach(siba->siba_dev));
}
@@ -746,7 +747,16 @@ siba_pci_write_multi_4(struct siba_dev_softc *sd, const void *buffer,
}
void
-siba_powerup(struct siba_softc *siba, int dynamic)
+siba_powerup(device_t dev, int dynamic)
+{
+ struct siba_dev_softc *sd = device_get_ivars(dev);
+ struct siba_softc *siba = sd->sd_bus;
+
+ siba_powerup_sub(siba, dynamic);
+}
+
+static void
+siba_powerup_sub(struct siba_softc *siba, int dynamic)
{
siba_pci_gpio(siba, SIBA_GPIO_CRYSTAL | SIBA_GPIO_PLL, 1);
@@ -802,77 +812,101 @@ siba_cc_clock(struct siba_cc *scc, enum siba_clock clock)
}
uint16_t
-siba_read_2(struct siba_dev_softc *sd, uint16_t offset)
+siba_read_2(device_t dev, uint16_t offset)
{
+ struct siba_dev_softc *sd = device_get_ivars(dev);
return (sd->sd_ops->read_2(sd, offset));
}
uint32_t
-siba_read_4(struct siba_dev_softc *sd, uint16_t offset)
+siba_read_4(device_t dev, uint16_t offset)
+{
+ struct siba_dev_softc *sd = device_get_ivars(dev);
+
+ return (siba_read_4_sub(sd, offset));
+}
+
+static uint32_t
+siba_read_4_sub(struct siba_dev_softc *sd, uint16_t offset)
{
return (sd->sd_ops->read_4(sd, offset));
}
void
-siba_write_2(struct siba_dev_softc *sd, uint16_t offset, uint16_t value)
+siba_write_2(device_t dev, uint16_t offset, uint16_t value)
{
+ struct siba_dev_softc *sd = device_get_ivars(dev);
sd->sd_ops->write_2(sd, offset, value);
}
void
-siba_write_4(struct siba_dev_softc *sd, uint16_t offset, uint32_t value)
+siba_write_4(device_t dev, uint16_t offset, uint32_t value)
+{
+ struct siba_dev_softc *sd = device_get_ivars(dev);
+
+ return (siba_write_4_sub(sd, offset, value));
+}
+
+static void
+siba_write_4_sub(struct siba_dev_softc *sd, uint16_t offset, uint32_t value)
{
sd->sd_ops->write_4(sd, offset, value);
}
void
-siba_read_multi_1(struct siba_dev_softc *sd, void *buffer, size_t count,
+siba_read_multi_1(device_t dev, void *buffer, size_t count,
uint16_t offset)
{
+ struct siba_dev_softc *sd = device_get_ivars(dev);
sd->sd_ops->read_multi_1(sd, buffer, count, offset);
}
void
-siba_read_multi_2(struct siba_dev_softc *sd, void *buffer, size_t count,
+siba_read_multi_2(device_t dev, void *buffer, size_t count,
uint16_t offset)
{
+ struct siba_dev_softc *sd = device_get_ivars(dev);
sd->sd_ops->read_multi_2(sd, buffer, count, offset);
}
void
-siba_read_multi_4(struct siba_dev_softc *sd, void *buffer, size_t count,
+siba_read_multi_4(device_t dev, void *buffer, size_t count,
uint16_t offset)
{
+ struct siba_dev_softc *sd = device_get_ivars(dev);
sd->sd_ops->read_multi_4(sd, buffer, count, offset);
}
void
-siba_write_multi_1(struct siba_dev_softc *sd, const void *buffer,
- size_t count, uint16_t offset)
+siba_write_multi_1(device_t dev, const void *buffer, size_t count,
+ uint16_t offset)
{
+ struct siba_dev_softc *sd = device_get_ivars(dev);
sd->sd_ops->write_multi_1(sd, buffer, count, offset);
}
void
-siba_write_multi_2(struct siba_dev_softc *sd, const void *buffer,
- size_t count, uint16_t offset)
+siba_write_multi_2(device_t dev, const void *buffer, size_t count,
+ uint16_t offset)
{
+ struct siba_dev_softc *sd = device_get_ivars(dev);
sd->sd_ops->write_multi_2(sd, buffer, count, offset);
}
void
-siba_write_multi_4(struct siba_dev_softc *sd, const void *buffer,
- size_t count, uint16_t offset)
+siba_write_multi_4(device_t dev, const void *buffer, size_t count,
+ uint16_t offset)
{
+ struct siba_dev_softc *sd = device_get_ivars(dev);
sd->sd_ops->write_multi_4(sd, buffer, count, offset);
}
@@ -1685,7 +1719,16 @@ siba_sprom_r123_antgain(uint8_t sprom_revision, const uint16_t *in,
#undef SIBA_SHIFTOUT
int
-siba_powerdown(struct siba_softc *siba)
+siba_powerdown(device_t dev)
+{
+ struct siba_dev_softc *sd = device_get_ivars(dev);
+ struct siba_softc *siba = sd->sd_bus;
+
+ return (siba_powerdown_sub(siba));
+}
+
+static int
+siba_powerdown_sub(struct siba_softc *siba)
{
struct siba_cc *scc;
@@ -1710,61 +1753,77 @@ siba_pcicore_init(struct siba_pci *spc)
return;
siba = sd->sd_bus;
- if (!siba_dev_isup(sd))
- siba_dev_up(sd, 0);
+ if (!siba_dev_isup_sub(sd))
+ siba_dev_up_sub(sd, 0);
KASSERT(spc->spc_hostmode == 0,
("%s:%d: hostmode", __func__, __LINE__));
/* disable PCI interrupt */
- siba_write_4(spc->spc_dev, SIBA_INTR_MASK, 0);
+ siba_write_4_sub(spc->spc_dev, SIBA_INTR_MASK, 0);
}
int
-siba_dev_isup(struct siba_dev_softc *sd)
+siba_dev_isup(device_t dev)
+{
+ struct siba_dev_softc *sd = device_get_ivars(dev);
+
+ return (siba_dev_isup_sub(sd));
+}
+
+static int
+siba_dev_isup_sub(struct siba_dev_softc *sd)
{
uint32_t reject, val;
reject = siba_tmslow_reject_bitmask(sd);
- val = siba_read_4(sd, SIBA_TGSLOW);
+ val = siba_read_4_sub(sd, SIBA_TGSLOW);
val &= SIBA_TGSLOW_CLOCK | SIBA_TGSLOW_RESET | reject;
return (val == SIBA_TGSLOW_CLOCK);
}
void
-siba_dev_up(struct siba_dev_softc *sd, uint32_t flags)
+siba_dev_up(device_t dev, uint32_t flags)
+{
+ struct siba_dev_softc *sd = device_get_ivars(dev);
+
+ siba_dev_up_sub(sd, flags);
+}
+
+static void
+siba_dev_up_sub(struct siba_dev_softc *sd, uint32_t flags)
{
uint32_t val;
- siba_dev_down(sd, flags);
- siba_write_4(sd, SIBA_TGSLOW, SIBA_TGSLOW_RESET | SIBA_TGSLOW_CLOCK |
- SIBA_TGSLOW_FGC | flags);
- siba_read_4(sd, SIBA_TGSLOW);
+ siba_dev_down_sub(sd, flags);
+ siba_write_4_sub(sd, SIBA_TGSLOW,
+ SIBA_TGSLOW_RESET | SIBA_TGSLOW_CLOCK | SIBA_TGSLOW_FGC | flags);
+ siba_read_4_sub(sd, SIBA_TGSLOW);
DELAY(1);
- if (siba_read_4(sd, SIBA_TGSHIGH) & SIBA_TGSHIGH_SERR)
- siba_write_4(sd, SIBA_TGSHIGH, 0);
+ if (siba_read_4_sub(sd, SIBA_TGSHIGH) & SIBA_TGSHIGH_SERR)
+ siba_write_4_sub(sd, SIBA_TGSHIGH, 0);
- val = siba_read_4(sd, SIBA_IAS);
+ val = siba_read_4_sub(sd, SIBA_IAS);
if (val & (SIBA_IAS_INBAND_ERR | SIBA_IAS_TIMEOUT)) {
val &= ~(SIBA_IAS_INBAND_ERR | SIBA_IAS_TIMEOUT);
- siba_write_4(sd, SIBA_IAS, val);
+ siba_write_4_sub(sd, SIBA_IAS, val);
}
- siba_write_4(sd, SIBA_TGSLOW,
+ siba_write_4_sub(sd, SIBA_TGSLOW,
SIBA_TGSLOW_CLOCK | SIBA_TGSLOW_FGC | flags);
- siba_read_4(sd, SIBA_TGSLOW);
+ siba_read_4_sub(sd, SIBA_TGSLOW);
DELAY(1);
- siba_write_4(sd, SIBA_TGSLOW, SIBA_TGSLOW_CLOCK | flags);
- siba_read_4(sd, SIBA_TGSLOW);
+ siba_write_4_sub(sd, SIBA_TGSLOW, SIBA_TGSLOW_CLOCK | flags);
+ siba_read_4_sub(sd, SIBA_TGSLOW);
DELAY(1);
}
static uint32_t
siba_tmslow_reject_bitmask(struct siba_dev_softc *sd)
{
- uint32_t rev = siba_read_4(sd, SIBA_IDLOW) & SIBA_IDLOW_SSBREV;
+ uint32_t rev = siba_read_4_sub(sd, SIBA_IDLOW) & SIBA_IDLOW_SSBREV;
switch (rev) {
case SIBA_IDLOW_SSBREV_22:
@@ -1785,20 +1844,28 @@ siba_tmslow_reject_bitmask(struct siba_dev_softc *sd)
}
void
-siba_dev_down(struct siba_dev_softc *sd, uint32_t flags)
+siba_dev_down(device_t dev, uint32_t flags)
+{
+ struct siba_dev_softc *sd = device_get_ivars(dev);
+
+ siba_dev_down_sub(sd, flags);
+}
+
+static void
+siba_dev_down_sub(struct siba_dev_softc *sd, uint32_t flags)
{
struct siba_softc *siba = sd->sd_bus;
uint32_t reject, val;
int i;
- if (siba_read_4(sd, SIBA_TGSLOW) & SIBA_TGSLOW_RESET)
+ if (siba_read_4_sub(sd, SIBA_TGSLOW) & SIBA_TGSLOW_RESET)
return;
reject = siba_tmslow_reject_bitmask(sd);
- siba_write_4(sd, SIBA_TGSLOW, reject | SIBA_TGSLOW_CLOCK);
+ siba_write_4_sub(sd, SIBA_TGSLOW, reject | SIBA_TGSLOW_CLOCK);
for (i = 0; i < 1000; i++) {
- val = siba_read_4(sd, SIBA_TGSLOW);
+ val = siba_read_4_sub(sd, SIBA_TGSLOW);
if (val & reject)
break;
DELAY(10);
@@ -1808,7 +1875,7 @@ siba_dev_down(struct siba_dev_softc *sd, uint32_t flags)
reject, SIBA_TGSLOW);
}
for (i = 0; i < 1000; i++) {
- val = siba_read_4(sd, SIBA_TGSHIGH);
+ val = siba_read_4_sub(sd, SIBA_TGSHIGH);
if (!(val & SIBA_TGSHIGH_BUSY))
break;
DELAY(10);
@@ -1818,12 +1885,12 @@ siba_dev_down(struct siba_dev_softc *sd, uint32_t flags)
SIBA_TGSHIGH_BUSY, SIBA_TGSHIGH);
}
- siba_write_4(sd, SIBA_TGSLOW, SIBA_TGSLOW_FGC | SIBA_TGSLOW_CLOCK |
+ siba_write_4_sub(sd, SIBA_TGSLOW, SIBA_TGSLOW_FGC | SIBA_TGSLOW_CLOCK |
reject | SIBA_TGSLOW_RESET | flags);
- siba_read_4(sd, SIBA_TGSLOW);
+ siba_read_4_sub(sd, SIBA_TGSLOW);
DELAY(1);
- siba_write_4(sd, SIBA_TGSLOW, reject | SIBA_TGSLOW_RESET | flags);
- siba_read_4(sd, SIBA_TGSLOW);
+ siba_write_4_sub(sd, SIBA_TGSLOW, reject | SIBA_TGSLOW_RESET | flags);
+ siba_read_4_sub(sd, SIBA_TGSLOW);
DELAY(1);
}
@@ -1840,21 +1907,22 @@ siba_pcicore_setup(struct siba_pci *spc, struct siba_dev_softc *sd)
SIBA_PCICORE_SBTOPCI_PREF | SIBA_PCICORE_SBTOPCI_BURST);
if (psd->sd_id.sd_rev < 5) {
- tmp = siba_read_4(psd, SIBA_IMCFGLO);
+ tmp = siba_read_4_sub(psd, SIBA_IMCFGLO);
tmp &= ~SIBA_IMCFGLO_SERTO;
tmp = (tmp | 2) & ~SIBA_IMCFGLO_REQTO;
tmp |= 3 << 4 /* SIBA_IMCFGLO_REQTO_SHIFT */;
- siba_write_4(psd, SIBA_IMCFGLO, tmp);
+ siba_write_4_sub(psd, SIBA_IMCFGLO, tmp);
/* broadcast value */
sd = (siba->siba_cc.scc_dev != NULL) ?
siba->siba_cc.scc_dev : siba->siba_pci.spc_dev;
if (sd != NULL) {
- siba_write_4(sd, SIBA_PCICORE_BCAST_ADDR,
+ siba_write_4_sub(sd, SIBA_PCICORE_BCAST_ADDR,
0xfd8);
- siba_read_4(sd, SIBA_PCICORE_BCAST_ADDR);
- siba_write_4(sd, SIBA_PCICORE_BCAST_DATA, 0);
- siba_read_4(sd, SIBA_PCICORE_BCAST_DATA);
+ siba_read_4_sub(sd, SIBA_PCICORE_BCAST_ADDR);
+ siba_write_4_sub(sd,
+ SIBA_PCICORE_BCAST_DATA, 0);
+ siba_read_4_sub(sd, SIBA_PCICORE_BCAST_DATA);
}
} else if (psd->sd_id.sd_rev >= 11) {
tmp = siba_pcicore_read_4(spc, SIBA_PCICORE_SBTOPCI2);
@@ -1878,27 +1946,31 @@ siba_pcicore_setup(struct siba_pci *spc, struct siba_dev_softc *sd)
}
void
-siba_pcicore_intr(struct siba_pci *spc, struct siba_dev_softc *sd)
+siba_pcicore_intr(device_t dev)
{
+ struct siba_dev_softc *sd = device_get_ivars(dev);
+ struct siba_softc *siba = sd->sd_bus;
+ struct siba_pci *spc = &siba->siba_pci;
struct siba_dev_softc *psd = spc->spc_dev;
- struct siba_softc *siba;
uint32_t tmp;
- if (sd->sd_bus->siba_type != SIBA_TYPE_PCI || !psd)
+ if (siba->siba_type != SIBA_TYPE_PCI || !psd)
return;
- siba = psd->sd_bus;
+ KASSERT(siba == psd->sd_bus, ("different pointers"));
+
/* enable interrupts */
if (siba->siba_dev != NULL &&
- (psd->sd_id.sd_rev >= 6 || psd->sd_id.sd_device == SIBA_DEVID_PCIE)) {
+ (psd->sd_id.sd_rev >= 6 ||
+ psd->sd_id.sd_device == SIBA_DEVID_PCIE)) {
tmp = pci_read_config(siba->siba_dev, SIBA_IRQMASK, 4);
tmp |= (1 << sd->sd_coreidx) << 8;
pci_write_config(siba->siba_dev, SIBA_IRQMASK, tmp, 4);
} else {
- tmp = siba_read_4(sd, SIBA_TPS);
+ tmp = siba_read_4_sub(sd, SIBA_TPS);
tmp &= SIBA_TPS_BPFLAG;
- siba_write_4(psd, SIBA_INTR_MASK,
- siba_read_4(psd, SIBA_INTR_MASK) | (1 << tmp));
+ siba_write_4_sub(psd, SIBA_INTR_MASK,
+ siba_read_4_sub(psd, SIBA_INTR_MASK) | (1 << tmp));
}
/* setup PCIcore */
@@ -1910,14 +1982,14 @@ static uint32_t
siba_pcicore_read_4(struct siba_pci *spc, uint16_t offset)
{
- return (siba_read_4(spc->spc_dev, offset));
+ return (siba_read_4_sub(spc->spc_dev, offset));
}
static void
siba_pcicore_write_4(struct siba_pci *spc, uint16_t offset, uint32_t value)
{
- siba_write_4(spc->spc_dev, offset, value);
+ siba_write_4_sub(spc->spc_dev, offset, value);
}
static uint32_t
@@ -1957,17 +2029,20 @@ siba_pcie_mdio_write(struct siba_pci *spc, uint8_t device, uint8_t address,
}
uint32_t
-siba_dma_translation(struct siba_dev_softc *sd)
+siba_dma_translation(device_t dev)
{
+ struct siba_dev_softc *sd = device_get_ivars(dev);
+ struct siba_softc *siba = sd->sd_bus;
- KASSERT(sd->sd_bus->siba_type == SIBA_TYPE_PCI,
- ("unsupported bustype %d\n", sd->sd_bus->siba_type));
+ KASSERT(siba->siba_type == SIBA_TYPE_PCI,
+ ("unsupported bustype %d\n", siba->siba_type));
return (SIBA_PCI_DMA);
}
void
-siba_barrier(struct siba_dev_softc *sd, int flags)
+siba_barrier(device_t dev, int flags)
{
+ struct siba_dev_softc *sd = device_get_ivars(dev);
struct siba_softc *siba = sd->sd_bus;
SIBA_BARRIER(siba, flags);
@@ -2004,10 +2079,10 @@ siba_core_resume(struct siba_softc *siba)
siba->siba_pci.spc_inited = 0;
siba->siba_curdev = NULL;
- siba_powerup(siba, 0);
+ siba_powerup_sub(siba, 0);
/* XXX setup H/W for PCMCIA??? */
siba_cc_resume(&siba->siba_cc);
- siba_powerdown(siba);
+ siba_powerdown_sub(siba);
return (0);
}
@@ -2026,9 +2101,11 @@ siba_cc_regctl_setmask(struct siba_cc *cc, uint32_t offset, uint32_t mask,
}
void
-siba_cc_pmu_set_ldovolt(struct siba_cc *scc, int id, uint32_t volt)
+siba_cc_pmu_set_ldovolt(device_t dev, int id, uint32_t volt)
{
- struct siba_softc *siba = scc->scc_dev->sd_bus;
+ struct siba_dev_softc *sd = device_get_ivars(dev);
+ struct siba_softc *siba = sd->sd_bus;
+ struct siba_cc *scc = &siba->siba_cc;
uint32_t *p = NULL, info[5][3] = {
{ 2, 25, 0xf },
{ 3, 1, 0xf },
@@ -2070,9 +2147,11 @@ siba_cc_pmu_set_ldovolt(struct siba_cc *scc, int id, uint32_t volt)
}
void
-siba_cc_pmu_set_ldoparef(struct siba_cc *scc, uint8_t on)
+siba_cc_pmu_set_ldoparef(device_t dev, uint8_t on)
{
- struct siba_softc *siba = scc->scc_dev->sd_bus;
+ struct siba_dev_softc *sd = device_get_ivars(dev);
+ struct siba_softc *siba = sd->sd_bus;
+ struct siba_cc *scc = &siba->siba_cc;
int ldo;
ldo = ((siba->siba_chipid == 0x4312) ? SIBA_CC_PMU_4312_PA_REF :
@@ -2087,3 +2166,419 @@ siba_cc_pmu_set_ldoparef(struct siba_cc *scc, uint8_t on)
SIBA_CC_MASK32(scc, SIBA_CC_PMU_MINRES, ~(1 << ldo));
SIBA_CC_READ32(scc, SIBA_CC_PMU_MINRES);
}
+
+int
+siba_read_sprom(device_t dev, device_t child, int which, uintptr_t *result)
+{
+ struct siba_dev_softc *sd = device_get_ivars(child);
+ struct siba_softc *siba = sd->sd_bus;
+
+ switch (which) {
+ case SIBA_SPROMVAR_REV:
+ *result = siba->siba_sprom.rev;
+ break;
+ case SIBA_SPROMVAR_MAC_80211BG:
+ *((uint8_t **) result) = siba->siba_sprom.mac_80211bg;
+ break;
+ case SIBA_SPROMVAR_MAC_ETH:
+ *((uint8_t **) result) = siba->siba_sprom.mac_eth;
+ break;
+ case SIBA_SPROMVAR_MAC_80211A:
+ *((uint8_t **) result) = siba->siba_sprom.mac_80211a;
+ break;
+ case SIBA_SPROMVAR_MII_ETH0:
+ *result = siba->siba_sprom.mii_eth0;
+ break;
+ case SIBA_SPROMVAR_MII_ETH1:
+ *result = siba->siba_sprom.mii_eth1;
+ break;
+ case SIBA_SPROMVAR_MDIO_ETH0:
+ *result = siba->siba_sprom.mdio_eth0;
+ break;
+ case SIBA_SPROMVAR_MDIO_ETH1:
+ *result = siba->siba_sprom.mdio_eth1;
+ break;
+ case SIBA_SPROMVAR_BREV:
+ *result = siba->siba_sprom.brev;
+ break;
+ case SIBA_SPROMVAR_CCODE:
+ *result = siba->siba_sprom.ccode;
+ break;
+ case SIBA_SPROMVAR_ANT_A:
+ *result = siba->siba_sprom.ant_a;
+ break;
+ case SIBA_SPROMVAR_ANT_BG:
+ *result = siba->siba_sprom.ant_bg;
+ break;
+ case SIBA_SPROMVAR_PA0B0:
+ *result = siba->siba_sprom.pa0b0;
+ break;
+ case SIBA_SPROMVAR_PA0B1:
+ *result = siba->siba_sprom.pa0b1;
+ break;
+ case SIBA_SPROMVAR_PA0B2:
+ *result = siba->siba_sprom.pa0b2;
+ break;
+ case SIBA_SPROMVAR_PA1B0:
+ *result = siba->siba_sprom.pa1b0;
+ break;
+ case SIBA_SPROMVAR_PA1B1:
+ *result = siba->siba_sprom.pa1b1;
+ break;
+ case SIBA_SPROMVAR_PA1B2:
+ *result = siba->siba_sprom.pa1b2;
+ break;
+ case SIBA_SPROMVAR_PA1LOB0:
+ *result = siba->siba_sprom.pa1lob0;
+ break;
+ case SIBA_SPROMVAR_PA1LOB1:
+ *result = siba->siba_sprom.pa1lob1;
+ break;
+ case SIBA_SPROMVAR_PA1LOB2:
+ *result = siba->siba_sprom.pa1lob2;
+ break;
+ case SIBA_SPROMVAR_PA1HIB0:
+ *result = siba->siba_sprom.pa1hib0;
+ break;
+ case SIBA_SPROMVAR_PA1HIB1:
+ *result = siba->siba_sprom.pa1hib1;
+ break;
+ case SIBA_SPROMVAR_PA1HIB2:
+ *result = siba->siba_sprom.pa1hib2;
+ break;
+ case SIBA_SPROMVAR_GPIO0:
+ *result = siba->siba_sprom.gpio0;
+ break;
+ case SIBA_SPROMVAR_GPIO1:
+ *result = siba->siba_sprom.gpio1;
+ break;
+ case SIBA_SPROMVAR_GPIO2:
+ *result = siba->siba_sprom.gpio2;
+ break;
+ case SIBA_SPROMVAR_GPIO3:
+ *result = siba->siba_sprom.gpio3;
+ break;
+ case SIBA_SPROMVAR_MAXPWR_AL:
+ *result = siba->siba_sprom.maxpwr_al;
+ break;
+ case SIBA_SPROMVAR_MAXPWR_A:
+ *result = siba->siba_sprom.maxpwr_a;
+ break;
+ case SIBA_SPROMVAR_MAXPWR_AH:
+ *result = siba->siba_sprom.maxpwr_ah;
+ break;
+ case SIBA_SPROMVAR_MAXPWR_BG:
+ *result = siba->siba_sprom.maxpwr_bg;
+ break;
+ case SIBA_SPROMVAR_RXPO2G:
+ *result = siba->siba_sprom.rxpo2g;
+ break;
+ case SIBA_SPROMVAR_RXPO5G:
+ *result = siba->siba_sprom.rxpo5g;
+ break;
+ case SIBA_SPROMVAR_TSSI_A:
+ *result = siba->siba_sprom.tssi_a;
+ break;
+ case SIBA_SPROMVAR_TSSI_BG:
+ *result = siba->siba_sprom.tssi_bg;
+ break;
+ case SIBA_SPROMVAR_TRI2G:
+ *result = siba->siba_sprom.tri2g;
+ break;
+ case SIBA_SPROMVAR_TRI5GL:
+ *result = siba->siba_sprom.tri5gl;
+ break;
+ case SIBA_SPROMVAR_TRI5G:
+ *result = siba->siba_sprom.tri5g;
+ break;
+ case SIBA_SPROMVAR_TRI5GH:
+ *result = siba->siba_sprom.tri5gh;
+ break;
+ case SIBA_SPROMVAR_RSSISAV2G:
+ *result = siba->siba_sprom.rssisav2g;
+ break;
+ case SIBA_SPROMVAR_RSSISMC2G:
+ *result = siba->siba_sprom.rssismc2g;
+ break;
+ case SIBA_SPROMVAR_RSSISMF2G:
+ *result = siba->siba_sprom.rssismf2g;
+ break;
+ case SIBA_SPROMVAR_BXA2G:
+ *result = siba->siba_sprom.bxa2g;
+ break;
+ case SIBA_SPROMVAR_RSSISAV5G:
+ *result = siba->siba_sprom.rssisav5g;
+ break;
+ case SIBA_SPROMVAR_RSSISMC5G:
+ *result = siba->siba_sprom.rssismc5g;
+ break;
+ case SIBA_SPROMVAR_RSSISMF5G:
+ *result = siba->siba_sprom.rssismf5g;
+ break;
+ case SIBA_SPROMVAR_BXA5G:
+ *result = siba->siba_sprom.bxa5g;
+ break;
+ case SIBA_SPROMVAR_CCK2GPO:
+ *result = siba->siba_sprom.cck2gpo;
+ break;
+ case SIBA_SPROMVAR_OFDM2GPO:
+ *result = siba->siba_sprom.ofdm2gpo;
+ break;
+ case SIBA_SPROMVAR_OFDM5GLPO:
+ *result = siba->siba_sprom.ofdm5glpo;
+ break;
+ case SIBA_SPROMVAR_OFDM5GPO:
+ *result = siba->siba_sprom.ofdm5gpo;
+ break;
+ case SIBA_SPROMVAR_OFDM5GHPO:
+ *result = siba->siba_sprom.ofdm5ghpo;
+ break;
+ case SIBA_SPROMVAR_BF_LO:
+ *result = siba->siba_sprom.bf_lo;
+ break;
+ case SIBA_SPROMVAR_BF_HI:
+ *result = siba->siba_sprom.bf_hi;
+ break;
+ case SIBA_SPROMVAR_BF2_LO:
+ *result = siba->siba_sprom.bf2_lo;
+ break;
+ case SIBA_SPROMVAR_BF2_HI:
+ *result = siba->siba_sprom.bf2_hi;
+ break;
+ default:
+ return (ENOENT);
+ }
+ return (0);
+}
+
+int
+siba_write_sprom(device_t dev, device_t child, int which, uintptr_t value)
+{
+ struct siba_dev_softc *sd = device_get_ivars(child);
+ struct siba_softc *siba = sd->sd_bus;
+
+ switch (which) {
+ case SIBA_SPROMVAR_REV:
+ siba->siba_sprom.rev = value;
+ break;
+ case SIBA_SPROMVAR_MII_ETH0:
+ siba->siba_sprom.mii_eth0 = value;
+ break;
+ case SIBA_SPROMVAR_MII_ETH1:
+ siba->siba_sprom.mii_eth1 = value;
+ break;
+ case SIBA_SPROMVAR_MDIO_ETH0:
+ siba->siba_sprom.mdio_eth0 = value;
+ break;
+ case SIBA_SPROMVAR_MDIO_ETH1:
+ siba->siba_sprom.mdio_eth1 = value;
+ break;
+ case SIBA_SPROMVAR_BREV:
+ siba->siba_sprom.brev = value;
+ break;
+ case SIBA_SPROMVAR_CCODE:
+ siba->siba_sprom.ccode = value;
+ break;
+ case SIBA_SPROMVAR_ANT_A:
+ siba->siba_sprom.ant_a = value;
+ break;
+ case SIBA_SPROMVAR_ANT_BG:
+ siba->siba_sprom.ant_bg = value;
+ break;
+ case SIBA_SPROMVAR_PA0B0:
+ siba->siba_sprom.pa0b0 = value;
+ break;
+ case SIBA_SPROMVAR_PA0B1:
+ siba->siba_sprom.pa0b1 = value;
+ break;
+ case SIBA_SPROMVAR_PA0B2:
+ siba->siba_sprom.pa0b2 = value;
+ break;
+ case SIBA_SPROMVAR_PA1B0:
+ siba->siba_sprom.pa1b0 = value;
+ break;
+ case SIBA_SPROMVAR_PA1B1:
+ siba->siba_sprom.pa1b1 = value;
+ break;
+ case SIBA_SPROMVAR_PA1B2:
+ siba->siba_sprom.pa1b2 = value;
+ break;
+ case SIBA_SPROMVAR_PA1LOB0:
+ siba->siba_sprom.pa1lob0 = value;
+ break;
+ case SIBA_SPROMVAR_PA1LOB1:
+ siba->siba_sprom.pa1lob1 = value;
+ break;
+ case SIBA_SPROMVAR_PA1LOB2:
+ siba->siba_sprom.pa1lob2 = value;
+ break;
+ case SIBA_SPROMVAR_PA1HIB0:
+ siba->siba_sprom.pa1hib0 = value;
+ break;
+ case SIBA_SPROMVAR_PA1HIB1:
+ siba->siba_sprom.pa1hib1 = value;
+ break;
+ case SIBA_SPROMVAR_PA1HIB2:
+ siba->siba_sprom.pa1hib2 = value;
+ break;
+ case SIBA_SPROMVAR_GPIO0:
+ siba->siba_sprom.gpio0 = value;
+ break;
+ case SIBA_SPROMVAR_GPIO1:
+ siba->siba_sprom.gpio1 = value;
+ break;
+ case SIBA_SPROMVAR_GPIO2:
+ siba->siba_sprom.gpio2 = value;
+ break;
+ case SIBA_SPROMVAR_GPIO3:
+ siba->siba_sprom.gpio3 = value;
+ break;
+ case SIBA_SPROMVAR_MAXPWR_AL:
+ siba->siba_sprom.maxpwr_al = value;
+ break;
+ case SIBA_SPROMVAR_MAXPWR_A:
+ siba->siba_sprom.maxpwr_a = value;
+ break;
+ case SIBA_SPROMVAR_MAXPWR_AH:
+ siba->siba_sprom.maxpwr_ah = value;
+ break;
+ case SIBA_SPROMVAR_MAXPWR_BG:
+ siba->siba_sprom.maxpwr_bg = value;
+ break;
+ case SIBA_SPROMVAR_RXPO2G:
+ siba->siba_sprom.rxpo2g = value;
+ break;
+ case SIBA_SPROMVAR_RXPO5G:
+ siba->siba_sprom.rxpo5g = value;
+ break;
+ case SIBA_SPROMVAR_TSSI_A:
+ siba->siba_sprom.tssi_a = value;
+ break;
+ case SIBA_SPROMVAR_TSSI_BG:
+ siba->siba_sprom.tssi_bg = value;
+ break;
+ case SIBA_SPROMVAR_TRI2G:
+ siba->siba_sprom.tri2g = value;
+ break;
+ case SIBA_SPROMVAR_TRI5GL:
+ siba->siba_sprom.tri5gl = value;
+ break;
+ case SIBA_SPROMVAR_TRI5G:
+ siba->siba_sprom.tri5g = value;
+ break;
+ case SIBA_SPROMVAR_TRI5GH:
+ siba->siba_sprom.tri5gh = value;
+ break;
+ case SIBA_SPROMVAR_RSSISAV2G:
+ siba->siba_sprom.rssisav2g = value;
+ break;
+ case SIBA_SPROMVAR_RSSISMC2G:
+ siba->siba_sprom.rssismc2g = value;
+ break;
+ case SIBA_SPROMVAR_RSSISMF2G:
+ siba->siba_sprom.rssismf2g = value;
+ break;
+ case SIBA_SPROMVAR_BXA2G:
+ siba->siba_sprom.bxa2g = value;
+ break;
+ case SIBA_SPROMVAR_RSSISAV5G:
+ siba->siba_sprom.rssisav5g = value;
+ break;
+ case SIBA_SPROMVAR_RSSISMC5G:
+ siba->siba_sprom.rssismc5g = value;
+ break;
+ case SIBA_SPROMVAR_RSSISMF5G:
+ siba->siba_sprom.rssismf5g = value;
+ break;
+ case SIBA_SPROMVAR_BXA5G:
+ siba->siba_sprom.bxa5g = value;
+ break;
+ case SIBA_SPROMVAR_CCK2GPO:
+ siba->siba_sprom.cck2gpo = value;
+ break;
+ case SIBA_SPROMVAR_OFDM2GPO:
+ siba->siba_sprom.ofdm2gpo = value;
+ break;
+ case SIBA_SPROMVAR_OFDM5GLPO:
+ siba->siba_sprom.ofdm5glpo = value;
+ break;
+ case SIBA_SPROMVAR_OFDM5GPO:
+ siba->siba_sprom.ofdm5gpo = value;
+ break;
+ case SIBA_SPROMVAR_OFDM5GHPO:
+ siba->siba_sprom.ofdm5ghpo = value;
+ break;
+ case SIBA_SPROMVAR_BF_LO:
+ siba->siba_sprom.bf_lo = value;
+ break;
+ case SIBA_SPROMVAR_BF_HI:
+ siba->siba_sprom.bf_hi = value;
+ break;
+ case SIBA_SPROMVAR_BF2_LO:
+ siba->siba_sprom.bf2_lo = value;
+ break;
+ case SIBA_SPROMVAR_BF2_HI:
+ siba->siba_sprom.bf2_hi = value;
+ break;
+ default:
+ return (ENOENT);
+ }
+ return (0);
+}
+
+#define SIBA_GPIOCTL 0x06c
+
+uint32_t
+siba_gpio_get(device_t dev)
+{
+ struct siba_dev_softc *sd = device_get_ivars(dev);
+ struct siba_softc *siba = sd->sd_bus;
+ struct siba_dev_softc *gpiodev, *pcidev = NULL;
+
+ pcidev = siba->siba_pci.spc_dev;
+ gpiodev = siba->siba_cc.scc_dev ? siba->siba_cc.scc_dev : pcidev;
+ if (!gpiodev)
+ return (-1);
+ return (siba_read_4_sub(gpiodev, SIBA_GPIOCTL));
+}
+
+void
+siba_gpio_set(device_t dev, uint32_t value)
+{
+ struct siba_dev_softc *sd = device_get_ivars(dev);
+ struct siba_softc *siba = sd->sd_bus;
+ struct siba_dev_softc *gpiodev, *pcidev = NULL;
+
+ pcidev = siba->siba_pci.spc_dev;
+ gpiodev = siba->siba_cc.scc_dev ? siba->siba_cc.scc_dev : pcidev;
+ if (!gpiodev)
+ return;
+ siba_write_4_sub(gpiodev, SIBA_GPIOCTL, value);
+}
+
+void
+siba_fix_imcfglobug(device_t dev)
+{
+ struct siba_dev_softc *sd = device_get_ivars(dev);
+ struct siba_softc *siba = sd->sd_bus;
+ uint32_t tmp;
+
+ if (siba->siba_pci.spc_dev == NULL)
+ return;
+ if (siba->siba_pci.spc_dev->sd_id.sd_device != SIBA_DEVID_PCI ||
+ siba->siba_pci.spc_dev->sd_id.sd_rev > 5)
+ return;
+
+ tmp = siba_read_4_sub(sd, SIBA_IMCFGLO) &
+ ~(SIBA_IMCFGLO_REQTO | SIBA_IMCFGLO_SERTO);
+ switch (siba->siba_type) {
+ case SIBA_TYPE_PCI:
+ case SIBA_TYPE_PCMCIA:
+ tmp |= 0x32;
+ break;
+ case SIBA_TYPE_SSB:
+ tmp |= 0x53;
+ break;
+ }
+ siba_write_4_sub(sd, SIBA_IMCFGLO, tmp);
+}
diff --git a/sys/dev/siba/sibavar.h b/sys/dev/siba/sibavar.h
index 307903b..9b82310 100644
--- a/sys/dev/siba/sibavar.h
+++ b/sys/dev/siba/sibavar.h
@@ -34,11 +34,30 @@
struct siba_softc;
struct siba_dev_softc;
+enum siba_type {
+ SIBA_TYPE_SSB,
+ SIBA_TYPE_PCI,
+ SIBA_TYPE_PCMCIA,
+};
+
enum siba_device_ivars {
SIBA_IVAR_VENDOR,
SIBA_IVAR_DEVICE,
SIBA_IVAR_REVID,
- SIBA_IVAR_CORE_INDEX
+ SIBA_IVAR_CORE_INDEX,
+ SIBA_IVAR_PCI_VENDOR,
+ SIBA_IVAR_PCI_DEVICE,
+ SIBA_IVAR_PCI_SUBVENDOR,
+ SIBA_IVAR_PCI_SUBDEVICE,
+ SIBA_IVAR_PCI_REVID,
+ SIBA_IVAR_CHIPID,
+ SIBA_IVAR_CHIPREV,
+ SIBA_IVAR_CHIPPKG,
+ SIBA_IVAR_TYPE,
+ SIBA_IVAR_CC_PMUFREQ,
+ SIBA_IVAR_CC_CAPS,
+ SIBA_IVAR_CC_POWERDELAY,
+ SIBA_IVAR_PCICORE_REVID
};
#define SIBA_ACCESSOR(var, ivar, type) \
@@ -48,6 +67,19 @@ SIBA_ACCESSOR(vendor, VENDOR, uint16_t)
SIBA_ACCESSOR(device, DEVICE, uint16_t)
SIBA_ACCESSOR(revid, REVID, uint8_t)
SIBA_ACCESSOR(core_index, CORE_INDEX, uint8_t)
+SIBA_ACCESSOR(pci_vendor, PCI_VENDOR, uint16_t)
+SIBA_ACCESSOR(pci_device, PCI_DEVICE, uint16_t)
+SIBA_ACCESSOR(pci_subvendor, PCI_SUBVENDOR, uint16_t)
+SIBA_ACCESSOR(pci_subdevice, PCI_SUBDEVICE, uint16_t)
+SIBA_ACCESSOR(pci_revid, PCI_REVID, uint8_t)
+SIBA_ACCESSOR(chipid, CHIPID, uint16_t)
+SIBA_ACCESSOR(chiprev, CHIPREV, uint16_t)
+SIBA_ACCESSOR(chippkg, CHIPPKG, uint8_t)
+SIBA_ACCESSOR(type, TYPE, enum siba_type)
+SIBA_ACCESSOR(cc_pmufreq, CC_PMUFREQ, uint32_t)
+SIBA_ACCESSOR(cc_caps, CC_CAPS, uint32_t)
+SIBA_ACCESSOR(cc_powerdelay, CC_POWERDELAY, uint16_t)
+SIBA_ACCESSOR(pcicore_revid, PCICORE_REVID, uint8_t)
#undef SIBA_ACCESSOR
@@ -135,9 +167,9 @@ enum {
SIBA_WRITE_2((siba), (reg), SIBA_READ_2((siba), (reg)) & ~(bits))
#define SIBA_CC_READ32(scc, offset) \
- siba_read_4((scc)->scc_dev, offset)
+ siba_read_4_sub((scc)->scc_dev, offset)
#define SIBA_CC_WRITE32(scc, offset, val) \
- siba_write_4((scc)->scc_dev, offset, val)
+ siba_write_4_sub((scc)->scc_dev, offset, val)
#define SIBA_CC_MASK32(scc, offset, mask) \
SIBA_CC_WRITE32(scc, offset, SIBA_CC_READ32(scc, offset) & (mask))
#define SIBA_CC_SET32(scc, offset, set) \
@@ -146,12 +178,6 @@ enum {
SIBA_CC_WRITE32(scc, offset, \
(SIBA_CC_READ32(scc, offset) & (mask)) | (set))
-enum siba_type {
- SIBA_TYPE_SSB,
- SIBA_TYPE_PCI,
- SIBA_TYPE_PCMCIA,
-};
-
enum siba_clock {
SIBA_CLOCK_DYNAMIC,
SIBA_CLOCK_SLOW,
@@ -195,6 +221,152 @@ struct siba_cc_pmu_res_depend {
uint32_t depend;
};
+enum siba_sprom_vars {
+ SIBA_SPROMVAR_REV,
+ SIBA_SPROMVAR_MAC_80211BG,
+ SIBA_SPROMVAR_MAC_ETH,
+ SIBA_SPROMVAR_MAC_80211A,
+ SIBA_SPROMVAR_MII_ETH0,
+ SIBA_SPROMVAR_MII_ETH1,
+ SIBA_SPROMVAR_MDIO_ETH0,
+ SIBA_SPROMVAR_MDIO_ETH1,
+ SIBA_SPROMVAR_BREV,
+ SIBA_SPROMVAR_CCODE,
+ SIBA_SPROMVAR_ANT_A,
+ SIBA_SPROMVAR_ANT_BG,
+ SIBA_SPROMVAR_PA0B0,
+ SIBA_SPROMVAR_PA0B1,
+ SIBA_SPROMVAR_PA0B2,
+ SIBA_SPROMVAR_PA1B0,
+ SIBA_SPROMVAR_PA1B1,
+ SIBA_SPROMVAR_PA1B2,
+ SIBA_SPROMVAR_PA1LOB0,
+ SIBA_SPROMVAR_PA1LOB1,
+ SIBA_SPROMVAR_PA1LOB2,
+ SIBA_SPROMVAR_PA1HIB0,
+ SIBA_SPROMVAR_PA1HIB1,
+ SIBA_SPROMVAR_PA1HIB2,
+ SIBA_SPROMVAR_GPIO0,
+ SIBA_SPROMVAR_GPIO1,
+ SIBA_SPROMVAR_GPIO2,
+ SIBA_SPROMVAR_GPIO3,
+ SIBA_SPROMVAR_MAXPWR_AL,
+ SIBA_SPROMVAR_MAXPWR_A,
+ SIBA_SPROMVAR_MAXPWR_AH,
+ SIBA_SPROMVAR_MAXPWR_BG,
+ SIBA_SPROMVAR_RXPO2G,
+ SIBA_SPROMVAR_RXPO5G,
+ SIBA_SPROMVAR_TSSI_A,
+ SIBA_SPROMVAR_TSSI_BG,
+ SIBA_SPROMVAR_TRI2G,
+ SIBA_SPROMVAR_TRI5GL,
+ SIBA_SPROMVAR_TRI5G,
+ SIBA_SPROMVAR_TRI5GH,
+ SIBA_SPROMVAR_RSSISAV2G,
+ SIBA_SPROMVAR_RSSISMC2G,
+ SIBA_SPROMVAR_RSSISMF2G,
+ SIBA_SPROMVAR_BXA2G,
+ SIBA_SPROMVAR_RSSISAV5G,
+ SIBA_SPROMVAR_RSSISMC5G,
+ SIBA_SPROMVAR_RSSISMF5G,
+ SIBA_SPROMVAR_BXA5G,
+ SIBA_SPROMVAR_CCK2GPO,
+ SIBA_SPROMVAR_OFDM2GPO,
+ SIBA_SPROMVAR_OFDM5GLPO,
+ SIBA_SPROMVAR_OFDM5GPO,
+ SIBA_SPROMVAR_OFDM5GHPO,
+ SIBA_SPROMVAR_BF_LO,
+ SIBA_SPROMVAR_BF_HI,
+ SIBA_SPROMVAR_BF2_LO,
+ SIBA_SPROMVAR_BF2_HI
+};
+
+int siba_read_sprom(device_t, device_t, int, uintptr_t *);
+int siba_write_sprom(device_t, device_t, int, uintptr_t);
+
+/**
+ * Generic sprom accessor generation macros for siba(4) drivers
+ */
+#define __SPROM_ACCESSOR(varp, var, ivarp, ivar, type) \
+ \
+static __inline type varp ## _get_ ## var(device_t dev) \
+{ \
+ uintptr_t v; \
+ siba_read_sprom(device_get_parent(dev), dev, \
+ ivarp ## _SPROMVAR_ ## ivar, &v); \
+ return ((type) v); \
+} \
+ \
+static __inline void varp ## _set_ ## var(device_t dev, type t) \
+{ \
+ uintptr_t v = (uintptr_t) t; \
+ siba_write_sprom(device_get_parent(dev), dev, \
+ ivarp ## _SPROMVAR_ ## ivar, v); \
+}
+
+#define SIBA_SPROM_ACCESSOR(var, ivar, type) \
+ __SPROM_ACCESSOR(siba_sprom, var, SIBA, ivar, type)
+
+SIBA_SPROM_ACCESSOR(rev, REV, uint8_t);
+SIBA_SPROM_ACCESSOR(mac_80211bg, MAC_80211BG, uint8_t *);
+SIBA_SPROM_ACCESSOR(mac_eth, MAC_ETH, uint8_t *);
+SIBA_SPROM_ACCESSOR(mac_80211a, MAC_80211A, uint8_t *);
+SIBA_SPROM_ACCESSOR(mii_eth0, MII_ETH0, uint8_t);
+SIBA_SPROM_ACCESSOR(mii_eth1, MII_ETH1, uint8_t);
+SIBA_SPROM_ACCESSOR(mdio_eth0, MDIO_ETH0, uint8_t);
+SIBA_SPROM_ACCESSOR(mdio_eth1, MDIO_ETH1, uint8_t);
+SIBA_SPROM_ACCESSOR(brev, BREV, uint8_t);
+SIBA_SPROM_ACCESSOR(ccode, CCODE, uint8_t);
+SIBA_SPROM_ACCESSOR(ant_a, ANT_A, uint8_t);
+SIBA_SPROM_ACCESSOR(ant_bg, ANT_BG, uint8_t);
+SIBA_SPROM_ACCESSOR(pa0b0, PA0B0, uint16_t);
+SIBA_SPROM_ACCESSOR(pa0b1, PA0B1, uint16_t);
+SIBA_SPROM_ACCESSOR(pa0b2, PA0B2, uint16_t);
+SIBA_SPROM_ACCESSOR(pa1b0, PA1B0, uint16_t);
+SIBA_SPROM_ACCESSOR(pa1b1, PA1B1, uint16_t);
+SIBA_SPROM_ACCESSOR(pa1b2, PA1B2, uint16_t);
+SIBA_SPROM_ACCESSOR(pa1lob0, PA1LOB0, uint16_t);
+SIBA_SPROM_ACCESSOR(pa1lob1, PA1LOB1, uint16_t);
+SIBA_SPROM_ACCESSOR(pa1lob2, PA1LOB2, uint16_t);
+SIBA_SPROM_ACCESSOR(pa1hib0, PA1HIB0, uint16_t);
+SIBA_SPROM_ACCESSOR(pa1hib1, PA1HIB1, uint16_t);
+SIBA_SPROM_ACCESSOR(pa1hib2, PA1HIB2, uint16_t);
+SIBA_SPROM_ACCESSOR(gpio0, GPIO0, uint8_t);
+SIBA_SPROM_ACCESSOR(gpio1, GPIO1, uint8_t);
+SIBA_SPROM_ACCESSOR(gpio2, GPIO2, uint8_t);
+SIBA_SPROM_ACCESSOR(gpio3, GPIO3, uint8_t);
+SIBA_SPROM_ACCESSOR(maxpwr_al, MAXPWR_AL, uint16_t);
+SIBA_SPROM_ACCESSOR(maxpwr_a, MAXPWR_A, uint16_t);
+SIBA_SPROM_ACCESSOR(maxpwr_ah, MAXPWR_AH, uint16_t);
+SIBA_SPROM_ACCESSOR(maxpwr_bg, MAXPWR_BG, uint16_t);
+SIBA_SPROM_ACCESSOR(rxpo2g, RXPO2G, uint8_t);
+SIBA_SPROM_ACCESSOR(rxpo5g, RXPO5G, uint8_t);
+SIBA_SPROM_ACCESSOR(tssi_a, TSSI_A, uint8_t);
+SIBA_SPROM_ACCESSOR(tssi_bg, TSSI_BG, uint8_t);
+SIBA_SPROM_ACCESSOR(tri2g, TRI2G, uint8_t);
+SIBA_SPROM_ACCESSOR(tri5gl, TRI5GL, uint8_t);
+SIBA_SPROM_ACCESSOR(tri5g, TRI5G, uint8_t);
+SIBA_SPROM_ACCESSOR(tri5gh, TRI5GH, uint8_t);
+SIBA_SPROM_ACCESSOR(rssisav2g, RSSISAV2G, uint8_t);
+SIBA_SPROM_ACCESSOR(rssismc2g, RSSISMC2G, uint8_t);
+SIBA_SPROM_ACCESSOR(rssismf2g, RSSISMF2G, uint8_t);
+SIBA_SPROM_ACCESSOR(bxa2g, BXA2G, uint8_t);
+SIBA_SPROM_ACCESSOR(rssisav5g, RSSISAV5G, uint8_t);
+SIBA_SPROM_ACCESSOR(rssismc5g, RSSISMC5G, uint8_t);
+SIBA_SPROM_ACCESSOR(rssismf5g, RSSISMF5G, uint8_t);
+SIBA_SPROM_ACCESSOR(bxa5g, BXA5G, uint8_t);
+SIBA_SPROM_ACCESSOR(cck2gpo, CCK2GPO, uint16_t);
+SIBA_SPROM_ACCESSOR(ofdm2gpo, OFDM2GPO, uint32_t);
+SIBA_SPROM_ACCESSOR(ofdm5glpo, OFDM5GLPO, uint32_t);
+SIBA_SPROM_ACCESSOR(ofdm5gpo, OFDM5GPO, uint32_t);
+SIBA_SPROM_ACCESSOR(ofdm5ghpo, OFDM5GHPO, uint32_t);
+SIBA_SPROM_ACCESSOR(bf_lo, BF_LO, uint16_t);
+SIBA_SPROM_ACCESSOR(bf_hi, BF_HI, uint16_t);
+SIBA_SPROM_ACCESSOR(bf2_lo, BF2_LO, uint16_t);
+SIBA_SPROM_ACCESSOR(bf2_hi, BF2_HI, uint16_t);
+
+#undef SIBA_SPROM_ACCESSOR
+
struct siba_sprom {
uint8_t rev; /* revision */
uint8_t mac_80211bg[6]; /* address for 802.11b/g */
@@ -358,6 +530,7 @@ struct siba_softc {
uint16_t siba_pci_did;
uint16_t siba_pci_subvid;
uint16_t siba_pci_subdid;
+ uint8_t siba_pci_revid;
int siba_mem_rid;
uint16_t siba_chipid; /* for CORE 0 */
@@ -368,41 +541,32 @@ struct siba_softc {
struct siba_pci siba_pci; /* PCI-core */
const struct siba_bus_ops *siba_ops;
- /* board informations */
- uint16_t siba_board_vendor;
- uint16_t siba_board_type;
- uint16_t siba_board_rev;
struct siba_sprom siba_sprom; /* SPROM */
uint16_t siba_spromsize; /* in word size */
};
-void siba_powerup(struct siba_softc *, int);
-uint16_t siba_read_2(struct siba_dev_softc *, uint16_t);
-void siba_write_2(struct siba_dev_softc *, uint16_t, uint16_t);
-uint32_t siba_read_4(struct siba_dev_softc *, uint16_t);
-void siba_write_4(struct siba_dev_softc *, uint16_t, uint32_t);
-void siba_dev_up(struct siba_dev_softc *, uint32_t);
-void siba_dev_down(struct siba_dev_softc *, uint32_t);
-int siba_powerdown(struct siba_softc *);
-int siba_dev_isup(struct siba_dev_softc *);
-void siba_pcicore_intr(struct siba_pci *, struct siba_dev_softc *);
-uint32_t siba_dma_translation(struct siba_dev_softc *);
-void *siba_dma_alloc_consistent(struct siba_dev_softc *, size_t,
- bus_addr_t *);
-void siba_read_multi_1(struct siba_dev_softc *, void *, size_t,
- uint16_t);
-void siba_read_multi_2(struct siba_dev_softc *, void *, size_t,
- uint16_t);
-void siba_read_multi_4(struct siba_dev_softc *, void *, size_t,
- uint16_t);
-void siba_write_multi_1(struct siba_dev_softc *, const void *,
- size_t, uint16_t);
-void siba_write_multi_2(struct siba_dev_softc *, const void *,
- size_t, uint16_t);
-void siba_write_multi_4(struct siba_dev_softc *, const void *,
- size_t, uint16_t);
-void siba_barrier(struct siba_dev_softc *, int);
-void siba_cc_pmu_set_ldovolt(struct siba_cc *, int, uint32_t);
-void siba_cc_pmu_set_ldoparef(struct siba_cc *, uint8_t);
+void siba_powerup(device_t, int);
+int siba_powerdown(device_t);
+uint16_t siba_read_2(device_t, uint16_t);
+void siba_write_2(device_t, uint16_t, uint16_t);
+uint32_t siba_read_4(device_t, uint16_t);
+void siba_write_4(device_t, uint16_t, uint32_t);
+void siba_dev_up(device_t, uint32_t);
+void siba_dev_down(device_t, uint32_t);
+int siba_dev_isup(device_t);
+void siba_pcicore_intr(device_t);
+uint32_t siba_dma_translation(device_t);
+void siba_read_multi_1(device_t, void *, size_t, uint16_t);
+void siba_read_multi_2(device_t, void *, size_t, uint16_t);
+void siba_read_multi_4(device_t, void *, size_t, uint16_t);
+void siba_write_multi_1(device_t, const void *, size_t, uint16_t);
+void siba_write_multi_2(device_t, const void *, size_t, uint16_t);
+void siba_write_multi_4(device_t, const void *, size_t, uint16_t);
+void siba_barrier(device_t, int);
+void siba_cc_pmu_set_ldovolt(device_t, int, uint32_t);
+void siba_cc_pmu_set_ldoparef(device_t, uint8_t);
+void siba_gpio_set(device_t, uint32_t);
+uint32_t siba_gpio_get(device_t);
+void siba_fix_imcfglobug(device_t);
#endif /* _SIBA_SIBAVAR_H_ */
OpenPOWER on IntegriCloud