diff options
author | Weongyo Jeong <weongyo@FreeBSD.org> | 2010-03-09 19:58:00 +0000 |
---|---|---|
committer | Weongyo Jeong <weongyo@FreeBSD.org> | 2010-03-09 19:58:00 +0000 |
commit | b9b64aa5b20a550853674c21425bb82b1fcec88e (patch) | |
tree | a502e295ed9eaeac6bd949c782bf8e2f662aa001 | |
parent | cd5c70b2ba747f219af79d77705b84e2416bc991 (diff) | |
download | src-b9b64aa5b20a550853674c21425bb82b1fcec88e.tar.gz src-b9b64aa5b20a550853674c21425bb82b1fcec88e.zip |
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]
Notes
Notes:
svn path=/head/; revision=204922
-rw-r--r-- | sys/dev/bwn/if_bwn.c | 731 | ||||
-rw-r--r-- | sys/dev/bwn/if_bwnvar.h | 18 | ||||
-rw-r--r-- | sys/dev/siba/siba_bwn.c | 67 | ||||
-rw-r--r-- | sys/dev/siba/siba_core.c | 653 | ||||
-rw-r--r-- | sys/dev/siba/sibavar.h | 246 |
5 files changed, 1196 insertions, 519 deletions
diff --git a/sys/dev/bwn/if_bwn.c b/sys/dev/bwn/if_bwn.c index 0a86c65fd22c..943a46a06601 100644 --- a/sys/dev/bwn/if_bwn.c +++ b/sys/dev/bwn/if_bwn.c @@ -134,7 +134,7 @@ SYSCTL_INT(_hw_bwn, OID_AUTO, wme, CTLFLAG_RW, &bwn_wme, 0, static int bwn_attach_pre(struct bwn_softc *); static int bwn_attach_post(struct bwn_softc *); -static void bwn_sprom_bugfixes(struct siba_softc *); +static void bwn_sprom_bugfixes(device_t); static void bwn_init(void *); static int bwn_init_locked(struct bwn_softc *); static int bwn_ioctl(struct ifnet *, u_long, caddr_t); @@ -205,7 +205,6 @@ static void bwn_stop_locked(struct bwn_softc *, int); static int bwn_core_init(struct bwn_mac *); static void bwn_core_start(struct bwn_mac *); static void bwn_core_exit(struct bwn_mac *); -static void bwn_fix_imcfglobug(struct bwn_mac *); static void bwn_bt_disable(struct bwn_mac *); static int bwn_chip_init(struct bwn_mac *); static uint64_t bwn_hf_read(struct bwn_mac *); @@ -225,7 +224,6 @@ static int bwn_fw_loadinitvals(struct bwn_mac *); static int bwn_phy_init(struct bwn_mac *); static void bwn_set_txantenna(struct bwn_mac *, int); static void bwn_set_opmode(struct bwn_mac *); -static void bwn_gpio_cleanup(struct bwn_mac *); static void bwn_rate_write(struct bwn_mac *, uint16_t, int); static uint8_t bwn_plcp_getcck(const uint8_t); static uint8_t bwn_plcp_getofdm(const uint8_t); @@ -910,13 +908,12 @@ static const struct siba_devid bwn_devs[] = { static int bwn_probe(device_t dev) { - struct siba_dev_softc *sd = device_get_ivars(dev); int i; for (i = 0; i < sizeof(bwn_devs) / sizeof(bwn_devs[0]); i++) { - if (sd->sd_id.sd_vendor == bwn_devs[i].sd_vendor && - sd->sd_id.sd_device == bwn_devs[i].sd_device && - sd->sd_id.sd_rev == bwn_devs[i].sd_rev) + if (siba_get_vendor(dev) == bwn_devs[i].sd_vendor && + siba_get_device(dev) == bwn_devs[i].sd_device && + siba_get_revid(dev) == bwn_devs[i].sd_rev) return (BUS_PROBE_DEFAULT); } @@ -928,12 +925,9 @@ bwn_attach(device_t dev) { struct bwn_mac *mac; struct bwn_softc *sc = device_get_softc(dev); - struct siba_dev_softc *sd = device_get_ivars(dev); - struct siba_softc *siba = sd->sd_bus; int error, i, msic, reg; sc->sc_dev = dev; - sc->sc_sd = sd; #ifdef BWN_DEBUG sc->sc_debug = bwn_debug; #endif @@ -942,14 +936,14 @@ bwn_attach(device_t dev) error = bwn_attach_pre(sc); if (error != 0) return (error); - bwn_sprom_bugfixes(sd->sd_bus); + bwn_sprom_bugfixes(dev); sc->sc_flags |= BWN_FLAG_ATTACHED; } if (!TAILQ_EMPTY(&sc->sc_maclist)) { - if (siba->siba_pci_did != 0x4313 && - siba->siba_pci_did != 0x431a && - siba->siba_pci_did != 0x4321) { + if (siba_get_pci_device(dev) != 0x4313 && + siba_get_pci_device(dev) != 0x431a && + siba_get_pci_device(dev) != 0x4321) { device_printf(sc->sc_dev, "skip 802.11 cores\n"); return (ENODEV); @@ -961,7 +955,6 @@ bwn_attach(device_t dev) if (mac == NULL) return (ENOMEM); mac->mac_sc = sc; - mac->mac_sd = sd; mac->mac_status = BWN_MAC_STATUS_UNINIT; if (bwn_bfp != 0) mac->mac_flags |= BWN_MAC_FLAG_BADFRAME_PREEMP; @@ -977,7 +970,7 @@ bwn_attach(device_t dev) device_printf(sc->sc_dev, "WLAN (chipid %#x rev %u) " "PHY (analog %d type %d rev %d) RADIO (manuf %#x ver %#x rev %d)\n", - sd->sd_bus->siba_chipid, sd->sd_id.sd_rev, + siba_get_chipid(sc->sc_dev), siba_get_revid(sc->sc_dev), mac->mac_phy.analog, mac->mac_phy.type, mac->mac_phy.rev, mac->mac_phy.rf_manuf, mac->mac_phy.rf_ver, mac->mac_phy.rf_rev); @@ -1065,8 +1058,6 @@ bwn_attach_post(struct bwn_softc *sc) { struct ieee80211com *ic; struct ifnet *ifp = sc->sc_ifp; - struct siba_dev_softc *sd = sc->sc_sd; - struct siba_sprom *sprom = &sd->sd_bus->siba_sprom; ic = ifp->if_l2com; ic->ic_ifp = ifp; @@ -1087,8 +1078,9 @@ bwn_attach_post(struct bwn_softc *sc) /* call MI attach routine. */ ieee80211_ifattach(ic, - bwn_is_valid_ether_addr(sprom->mac_80211a) ? sprom->mac_80211a : - sprom->mac_80211bg); + bwn_is_valid_ether_addr(siba_sprom_get_mac_80211a(sc->sc_dev)) ? + siba_sprom_get_mac_80211a(sc->sc_dev) : + siba_sprom_get_mac_80211bg(sc->sc_dev)); ic->ic_headroom = sizeof(struct bwn_txhdr); @@ -1219,21 +1211,24 @@ fail: BWN_LOCK_DESTROY(sc); } static void -bwn_sprom_bugfixes(struct siba_softc *siba) +bwn_sprom_bugfixes(device_t dev) { #define BWN_ISDEV(_vendor, _device, _subvendor, _subdevice) \ - ((siba->siba_pci_vid == PCI_VENDOR_##_vendor) && \ - (siba->siba_pci_did == _device) && \ - (siba->siba_pci_subvid == PCI_VENDOR_##_subvendor) && \ - (siba->siba_pci_subdid == _subdevice)) - - if (siba->siba_board_vendor == PCI_VENDOR_APPLE && - siba->siba_board_type == 0x4e && siba->siba_board_rev > 0x40) - siba->siba_sprom.bf_lo |= BWN_BFL_PACTRL; - if (siba->siba_board_vendor == SIBA_BOARDVENDOR_DELL && - siba->siba_chipid == 0x4301 && siba->siba_board_rev == 0x74) - siba->siba_sprom.bf_lo |= BWN_BFL_BTCOEXIST; - if (siba->siba_type == SIBA_TYPE_PCI) { + ((siba_get_pci_vendor(dev) == PCI_VENDOR_##_vendor) && \ + (siba_get_pci_device(dev) == _device) && \ + (siba_get_pci_subvendor(dev) == PCI_VENDOR_##_subvendor) && \ + (siba_get_pci_subdevice(dev) == _subdevice)) + + if (siba_get_pci_subvendor(dev) == PCI_VENDOR_APPLE && + siba_get_pci_subdevice(dev) == 0x4e && + siba_get_pci_revid(dev) > 0x40) + siba_sprom_set_bf_lo(dev, + siba_sprom_get_bf_lo(dev) | BWN_BFL_PACTRL); + if (siba_get_pci_subvendor(dev) == SIBA_BOARDVENDOR_DELL && + siba_get_chipid(dev) == 0x4301 && siba_get_pci_revid(dev) == 0x74) + siba_sprom_set_bf_lo(dev, + siba_sprom_get_bf_lo(dev) | BWN_BFL_BTCOEXIST); + if (siba_get_type(dev) == SIBA_TYPE_PCI) { if (BWN_ISDEV(BROADCOM, 0x4318, ASUSTEK, 0x100f) || BWN_ISDEV(BROADCOM, 0x4320, DELL, 0x0003) || BWN_ISDEV(BROADCOM, 0x4320, HP, 0x12f8) || @@ -1241,7 +1236,8 @@ bwn_sprom_bugfixes(struct siba_softc *siba) BWN_ISDEV(BROADCOM, 0x4320, LINKSYS, 0x0014) || BWN_ISDEV(BROADCOM, 0x4320, LINKSYS, 0x0015) || BWN_ISDEV(BROADCOM, 0x4320, MOTOROLA, 0x7010)) - siba->siba_sprom.bf_lo &= ~BWN_BFL_BTCOEXIST; + siba_sprom_set_bf_lo(dev, + siba_sprom_get_bf_lo(dev) & ~BWN_BFL_BTCOEXIST); } #undef BWN_ISDEV } @@ -1434,7 +1430,7 @@ bwn_pio_tx_start(struct bwn_mac *mac, struct ieee80211_node *ni, struct mbuf *m) tq->tq_used += roundup(m->m_pkthdr.len + BWN_HDRSIZE(mac), 4); tq->tq_free--; - if (mac->mac_sd->sd_id.sd_rev >= 8) { + if (siba_get_revid(sc->sc_dev) >= 8) { /* * XXX please removes m_defrag(9) */ @@ -1606,17 +1602,15 @@ static int bwn_attach_core(struct bwn_mac *mac) { struct bwn_softc *sc = mac->mac_sc; - struct siba_dev_softc *sd = mac->mac_sd; - struct siba_softc *siba = sd->sd_bus; int error, have_bg = 0, have_a = 0; uint32_t high; - KASSERT(sd->sd_id.sd_rev >= 5, - ("unsupported revision %d", sd->sd_id.sd_rev)); + KASSERT(siba_get_revid(sc->sc_dev) >= 5, + ("unsupported revision %d", siba_get_revid(sc->sc_dev))); - siba_powerup(siba, 0); + siba_powerup(sc->sc_dev, 0); - high = siba_read_4(sd, SIBA_TGSHIGH); + high = siba_read_4(sc->sc_dev, SIBA_TGSHIGH); bwn_reset_core(mac, (high & BWN_TGSHIGH_HAVE_2GHZ) ? BWN_TGSLOW_SUPPORT_G : 0); error = bwn_phy_getinfo(mac, high); @@ -1625,8 +1619,9 @@ bwn_attach_core(struct bwn_mac *mac) have_a = (high & BWN_TGSHIGH_HAVE_5GHZ) ? 1 : 0; have_bg = (high & BWN_TGSHIGH_HAVE_2GHZ) ? 1 : 0; - if (siba->siba_pci_did != 0x4312 && siba->siba_pci_did != 0x4319 && - siba->siba_pci_did != 0x4324) { + if (siba_get_pci_device(sc->sc_dev) != 0x4312 && + siba_get_pci_device(sc->sc_dev) != 0x4319 && + siba_get_pci_device(sc->sc_dev) != 0x4324) { have_a = have_bg = 0; if (mac->mac_phy.type == BWN_PHYTYPE_A) have_a = 1; @@ -1719,30 +1714,30 @@ bwn_attach_core(struct bwn_mac *mac) mac->mac_phy.switch_analog(mac, 0); - siba_dev_down(sd, 0); + siba_dev_down(sc->sc_dev, 0); fail: - siba_powerdown(siba); + siba_powerdown(sc->sc_dev); return (error); } static void bwn_reset_core(struct bwn_mac *mac, uint32_t flags) { - struct siba_dev_softc *sd = mac->mac_sd; + struct bwn_softc *sc = mac->mac_sc; uint32_t low, ctl; flags |= (BWN_TGSLOW_PHYCLOCK_ENABLE | BWN_TGSLOW_PHYRESET); - siba_dev_up(sd, flags); + siba_dev_up(sc->sc_dev, flags); DELAY(2000); - low = (siba_read_4(sd, SIBA_TGSLOW) | SIBA_TGSLOW_FGC) & + low = (siba_read_4(sc->sc_dev, SIBA_TGSLOW) | SIBA_TGSLOW_FGC) & ~BWN_TGSLOW_PHYRESET; - siba_write_4(sd, SIBA_TGSLOW, low); - siba_read_4(sd, SIBA_TGSLOW); + siba_write_4(sc->sc_dev, SIBA_TGSLOW, low); + siba_read_4(sc->sc_dev, SIBA_TGSLOW); DELAY(1000); - siba_write_4(sd, SIBA_TGSLOW, low & ~SIBA_TGSLOW_FGC); - siba_read_4(sd, SIBA_TGSLOW); + siba_write_4(sc->sc_dev, SIBA_TGSLOW, low & ~SIBA_TGSLOW_FGC); + siba_read_4(sc->sc_dev, SIBA_TGSLOW); DELAY(1000); if (mac->mac_phy.switch_analog != NULL) @@ -1759,8 +1754,6 @@ bwn_phy_getinfo(struct bwn_mac *mac, int tgshigh) { struct bwn_phy *phy = &mac->mac_phy; struct bwn_softc *sc = mac->mac_sc; - struct siba_dev_softc *sd = mac->mac_sd; - struct siba_softc *siba = sd->sd_bus; uint32_t tmp; /* PHY */ @@ -1779,10 +1772,10 @@ bwn_phy_getinfo(struct bwn_mac *mac, int tgshigh) goto unsupphy; /* RADIO */ - if (siba->siba_chipid == 0x4317) { - if (siba->siba_chiprev == 0) + if (siba_get_chipid(sc->sc_dev) == 0x4317) { + if (siba_get_chiprev(sc->sc_dev) == 0) tmp = 0x3205017f; - else if (siba->siba_chiprev == 1) + else if (siba_get_chiprev(sc->sc_dev) == 1) tmp = 0x4205017f; else tmp = 0x5205017f; @@ -1826,7 +1819,6 @@ bwn_chiptest(struct bwn_mac *mac) #define TESTVAL0 0x55aaaa55 #define TESTVAL1 0xaa5555aa struct bwn_softc *sc = mac->mac_sc; - struct siba_dev_softc *sd = mac->mac_sd; uint32_t v, backup; BWN_LOCK(sc); @@ -1842,7 +1834,8 @@ bwn_chiptest(struct bwn_mac *mac) bwn_shm_write_4(mac, BWN_SHARED, 0, backup); - if ((sd->sd_id.sd_rev >= 3) && (sd->sd_id.sd_rev <= 10)) { + if ((siba_get_revid(sc->sc_dev) >= 3) && + (siba_get_revid(sc->sc_dev) <= 10)) { BWN_WRITE_2(mac, BWN_TSF_CFP_START, 0xaaaa); BWN_WRITE_4(mac, BWN_TSF_CFP_START, 0xccccbbbb); if (BWN_READ_2(mac, BWN_TSF_CFP_START_LOW) != 0xbbbb) @@ -2070,15 +2063,17 @@ bwn_phy_g_attach(struct bwn_mac *mac) struct bwn_softc *sc = mac->mac_sc; struct bwn_phy *phy = &mac->mac_phy; struct bwn_phy_g *pg = &phy->phy_g; - struct siba_dev_softc *sd = mac->mac_sd; - struct siba_sprom *sprom = &sd->sd_bus->siba_sprom; unsigned int i; - int16_t pab0 = (int16_t)(sprom->pa0b0), pab1 = (int16_t)(sprom->pa0b1), - pab2 = (int16_t)(sprom->pa0b2); + int16_t pab0, pab1, pab2; static int8_t bwn_phy_g_tssi2dbm_table[] = BWN_PHY_G_TSSI2DBM_TABLE; - int8_t bg = (int8_t)sprom->tssi_bg; + int8_t bg; + + bg = (int8_t)siba_sprom_get_tssi_bg(sc->sc_dev); + pab0 = (int16_t)siba_sprom_get_pa0b0(sc->sc_dev); + pab1 = (int16_t)siba_sprom_get_pa0b1(sc->sc_dev); + pab2 = (int16_t)siba_sprom_get_pa0b2(sc->sc_dev); - if ((sd->sd_bus->siba_chipid == 0x4301) && (phy->rf_ver != 0x2050)) + if ((siba_get_chipid(sc->sc_dev) == 0x4301) && (phy->rf_ver != 0x2050)) device_printf(sc->sc_dev, "not supported anymore\n"); pg->pg_flags = 0; @@ -2175,8 +2170,8 @@ bwn_phy_g_prepare_hw(struct bwn_mac *mac) { struct bwn_phy *phy = &mac->mac_phy; struct bwn_phy_g *pg = &phy->phy_g; + struct bwn_softc *sc = mac->mac_sc; struct bwn_txpwr_loctl *lo = &pg->pg_loctl; - struct siba_softc *bus = mac->mac_sd->sd_bus; static const struct bwn_rfatt rfatt0[] = { { 3, 0 }, { 1, 0 }, { 5, 0 }, { 7, 0 }, { 9, 0 }, { 2, 0 }, { 0, 0 }, { 4, 0 }, { 6, 0 }, { 8, 0 }, { 1, 1 }, { 2, 1 }, @@ -2204,12 +2199,12 @@ bwn_phy_g_prepare_hw(struct bwn_mac *mac) /* prepare Radio Attenuation */ pg->pg_rfatt.padmix = 0; - if (bus->siba_board_vendor == SIBA_BOARDVENDOR_BCM && - bus->siba_board_type == SIBA_BOARD_BCM4309G) { - if (bus->siba_board_rev < 0x43) { + if (siba_get_pci_subvendor(sc->sc_dev) == SIBA_BOARDVENDOR_BCM && + siba_get_pci_subdevice(sc->sc_dev) == SIBA_BOARD_BCM4309G) { + if (siba_get_pci_revid(sc->sc_dev) < 0x43) { pg->pg_rfatt.att = 2; goto done; - } else if (bus->siba_board_rev < 0x51) { + } else if (siba_get_pci_revid(sc->sc_dev) < 0x51) { pg->pg_rfatt.att = 3; goto done; } @@ -2228,24 +2223,25 @@ bwn_phy_g_prepare_hw(struct bwn_mac *mac) goto done; case 1: if (phy->type == BWN_PHYTYPE_G) { - if (bus->siba_board_vendor == + if (siba_get_pci_subvendor(sc->sc_dev) == SIBA_BOARDVENDOR_BCM && - bus->siba_board_type == + siba_get_pci_subdevice(sc->sc_dev) == SIBA_BOARD_BCM4309G && - bus->siba_board_rev >= 30) + siba_get_pci_revid(sc->sc_dev) >= 30) pg->pg_rfatt.att = 3; - else if (bus->siba_board_vendor == + else if (siba_get_pci_subvendor(sc->sc_dev) == SIBA_BOARDVENDOR_BCM && - bus->siba_board_type == SIBA_BOARD_BU4306) + siba_get_pci_subdevice(sc->sc_dev) == + SIBA_BOARD_BU4306) pg->pg_rfatt.att = 3; else pg->pg_rfatt.att = 1; } else { - if (bus->siba_board_vendor == + if (siba_get_pci_subvendor(sc->sc_dev) == SIBA_BOARDVENDOR_BCM && - bus->siba_board_type == + siba_get_pci_subdevice(sc->sc_dev) == SIBA_BOARD_BCM4309G && - bus->siba_board_rev >= 30) + siba_get_pci_revid(sc->sc_dev) >= 30) pg->pg_rfatt.att = 7; else pg->pg_rfatt.att = 6; @@ -2253,17 +2249,18 @@ bwn_phy_g_prepare_hw(struct bwn_mac *mac) goto done; case 2: if (phy->type == BWN_PHYTYPE_G) { - if (bus->siba_board_vendor == + if (siba_get_pci_subvendor(sc->sc_dev) == SIBA_BOARDVENDOR_BCM && - bus->siba_board_type == + siba_get_pci_subdevice(sc->sc_dev) == SIBA_BOARD_BCM4309G && - bus->siba_board_rev >= 30) + siba_get_pci_revid(sc->sc_dev) >= 30) pg->pg_rfatt.att = 3; - else if (bus->siba_board_vendor == + else if (siba_get_pci_subvendor(sc->sc_dev) == SIBA_BOARDVENDOR_BCM && - bus->siba_board_type == SIBA_BOARD_BU4306) + siba_get_pci_subdevice(sc->sc_dev) == + SIBA_BOARD_BU4306) pg->pg_rfatt.att = 5; - else if (bus->siba_chipid == 0x4320) + else if (siba_get_chipid(sc->sc_dev) == 0x4320) pg->pg_rfatt.att = 4; else pg->pg_rfatt.att = 3; @@ -2547,7 +2544,6 @@ bwn_phy_g_recalc_txpwr(struct bwn_mac *mac, int ignore_tssi) struct bwn_phy *phy = &mac->mac_phy; struct bwn_phy_g *pg = &phy->phy_g; struct bwn_softc *sc = mac->mac_sc; - struct siba_softc *siba = mac->mac_sd->sd_bus; unsigned int tssi; int cck, ofdm; int power; @@ -2570,12 +2566,13 @@ bwn_phy_g_recalc_txpwr(struct bwn_mac *mac, int ignore_tssi) pg->pg_avgtssi = tssi; KASSERT(tssi < BWN_TSSI_MAX, ("%s:%d: fail", __func__, __LINE__)); - max = siba->siba_sprom.maxpwr_bg; - if (siba->siba_sprom.bf_lo & BWN_BFL_PACTRL) + max = siba_sprom_get_maxpwr_bg(sc->sc_dev); + if (siba_sprom_get_bf_lo(sc->sc_dev) & BWN_BFL_PACTRL) max -= 3; if (max >= 120) { device_printf(sc->sc_dev, "invalid max TX-power value\n"); - siba->siba_sprom.maxpwr_bg = max = 80; + max = 80; + siba_sprom_set_maxpwr_bg(sc->sc_dev, max); } power = MIN(MAX((phy->txpower < 0) ? 0 : (phy->txpower << 2), 0), max) - @@ -2619,9 +2616,8 @@ bwn_phy_g_set_txpwr(struct bwn_mac *mac) txctl = BWN_TXCTL_PA2DB | BWN_TXCTL_TXMIX; rfatt += 2; bbatt += 2; - } else if (mac->mac_sd->sd_bus->siba_sprom. - bf_lo & - BWN_BFL_PACTRL) { + } else if (siba_sprom_get_bf_lo(sc->sc_dev) & + BWN_BFL_PACTRL) { bbatt += 4 * (rfatt - 2); rfatt = 2; } @@ -2716,9 +2712,10 @@ static void bwn_phy_g_task_60s(struct bwn_mac *mac) { struct bwn_phy *phy = &mac->mac_phy; + struct bwn_softc *sc = mac->mac_sc; uint8_t old = phy->chan; - if (!(mac->mac_sd->sd_bus->siba_sprom.bf_lo & BWN_BFL_RSSI)) + if (!(siba_sprom_get_bf_lo(sc->sc_dev) & BWN_BFL_RSSI)) return; bwn_mac_suspend(mac); @@ -3182,20 +3179,15 @@ bwn_wme_clear(struct bwn_softc *sc) static int bwn_core_init(struct bwn_mac *mac) { -#ifdef BWN_DEBUG struct bwn_softc *sc = mac->mac_sc; -#endif - struct siba_dev_softc *sd = mac->mac_sd; - struct siba_softc *siba = sd->sd_bus; - struct siba_sprom *sprom = &siba->siba_sprom; uint64_t hf; int error; KASSERT(mac->mac_status == BWN_MAC_STATUS_UNINIT, ("%s:%d: fail", __func__, __LINE__)); - siba_powerup(siba, 0); - if (!siba_dev_isup(sd)) + siba_powerup(sc->sc_dev, 0); + if (!siba_dev_isup(sc->sc_dev)) bwn_reset_core(mac, mac->mac_phy.gmode ? BWN_TGSLOW_SUPPORT_G : 0); @@ -3219,9 +3211,9 @@ bwn_core_init(struct bwn_mac *mac) mac->mac_phy.init_pre(mac); - siba_pcicore_intr(&siba->siba_pci, sd); + siba_pcicore_intr(sc->sc_dev); - bwn_fix_imcfglobug(mac); + siba_fix_imcfglobug(sc->sc_dev); bwn_bt_disable(mac); if (mac->mac_phy.prepare_hw) { error = mac->mac_phy.prepare_hw(mac); @@ -3232,11 +3224,11 @@ bwn_core_init(struct bwn_mac *mac) if (error) goto fail0; bwn_shm_write_2(mac, BWN_SHARED, BWN_SHARED_COREREV, - mac->mac_sd->sd_id.sd_rev); + siba_get_revid(sc->sc_dev)); hf = bwn_hf_read(mac); if (mac->mac_phy.type == BWN_PHYTYPE_G) { hf |= BWN_HF_GPHY_SYM_WORKAROUND; - if (sprom->bf_lo & BWN_BFL_PACTRL) + if (siba_sprom_get_bf_lo(sc->sc_dev) & BWN_BFL_PACTRL) hf |= BWN_HF_PAGAINBOOST_OFDM_ON; if (mac->mac_phy.rev == 1) hf |= BWN_HF_GPHY_DC_CANCELFILTER; @@ -3247,10 +3239,10 @@ bwn_core_init(struct bwn_mac *mac) if (mac->mac_phy.rf_rev == 6) hf |= BWN_HF_4318_TSSI; } - if (sprom->bf_lo & BWN_BFL_CRYSTAL_NOSLOW) + if (siba_sprom_get_bf_lo(sc->sc_dev) & BWN_BFL_CRYSTAL_NOSLOW) hf |= BWN_HF_SLOWCLOCK_REQ_OFF; - if ((siba->siba_type == SIBA_TYPE_PCI) && - (siba->siba_pci.spc_dev->sd_id.sd_rev <= 10)) + if ((siba_get_type(sc->sc_dev) == SIBA_TYPE_PCI) && + (siba_get_pcicore_revid(sc->sc_dev) <= 10)) hf |= BWN_HF_PCI_SLOWCLOCK_WORKAROUND; hf &= ~BWN_HF_SKIP_CFP_UPDATE; bwn_hf_write(mac, hf); @@ -3267,7 +3259,7 @@ bwn_core_init(struct bwn_mac *mac) (mac->mac_phy.type == BWN_PHYTYPE_B) ? 0x1f : 0xf); bwn_shm_write_2(mac, BWN_SCRATCH, BWN_SCRATCH_CONT_MAX, 0x3ff); - if (siba->siba_type == SIBA_TYPE_PCMCIA || bwn_usedma == 0) + if (siba_get_type(sc->sc_dev) == SIBA_TYPE_PCMCIA || bwn_usedma == 0) bwn_pio_init(mac); else bwn_dma_init(mac); @@ -3277,7 +3269,8 @@ bwn_core_init(struct bwn_mac *mac) bwn_spu_setdelay(mac, 1); bwn_bt_enable(mac); - siba_powerup(siba, !(sprom->bf_lo & BWN_BFL_CRYSTAL_NOSLOW)); + siba_powerup(sc->sc_dev, + !(siba_sprom_get_bf_lo(sc->sc_dev) & BWN_BFL_CRYSTAL_NOSLOW)); bwn_set_macaddr(mac); bwn_crypt_init(mac); @@ -3290,7 +3283,7 @@ bwn_core_init(struct bwn_mac *mac) fail1: bwn_chip_exit(mac); fail0: - siba_powerdown(siba); + siba_powerdown(sc->sc_dev); KASSERT(mac->mac_status == BWN_MAC_STATUS_UNINIT, ("%s:%d: fail", __func__, __LINE__)); return (error); @@ -3305,7 +3298,7 @@ bwn_core_start(struct bwn_mac *mac) KASSERT(mac->mac_status == BWN_MAC_STATUS_INITED, ("%s:%d: fail", __func__, __LINE__)); - if (mac->mac_sd->sd_id.sd_rev < 5) + if (siba_get_revid(sc->sc_dev) < 5) return; while (1) { @@ -3325,6 +3318,7 @@ bwn_core_start(struct bwn_mac *mac) static void bwn_core_exit(struct bwn_mac *mac) { + struct bwn_softc *sc = mac->mac_sc; uint32_t macctl; BWN_ASSERT_LOCKED(mac->mac_sc); @@ -3345,35 +3339,8 @@ bwn_core_exit(struct bwn_mac *mac) bwn_pio_stop(mac); bwn_chip_exit(mac); mac->mac_phy.switch_analog(mac, 0); - siba_dev_down(mac->mac_sd, 0); - siba_powerdown(mac->mac_sd->sd_bus); -} - -static void -bwn_fix_imcfglobug(struct bwn_mac *mac) -{ - struct siba_dev_softc *sd = mac->mac_sd; - 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(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(sd, SIBA_IMCFGLO, tmp); + siba_dev_down(sc->sc_dev, 0); + siba_powerdown(sc->sc_dev); } static void @@ -3388,6 +3355,7 @@ bwn_bt_disable(struct bwn_mac *mac) static int bwn_chip_init(struct bwn_mac *mac) { + struct bwn_softc *sc = mac->mac_sc; struct bwn_phy *phy = &mac->mac_phy; uint32_t macctl; int error; @@ -3410,13 +3378,13 @@ bwn_chip_init(struct bwn_mac *mac) error = bwn_fw_loadinitvals(mac); if (error) { - bwn_gpio_cleanup(mac); + siba_gpio_set(sc->sc_dev, 0); return (error); } phy->switch_analog(mac, 1); error = bwn_phy_init(mac); if (error) { - bwn_gpio_cleanup(mac); + siba_gpio_set(sc->sc_dev, 0); return (error); } if (phy->set_im) @@ -3428,7 +3396,7 @@ bwn_chip_init(struct bwn_mac *mac) if (phy->type == BWN_PHYTYPE_B) BWN_WRITE_2(mac, 0x005e, BWN_READ_2(mac, 0x005e) | 0x0004); BWN_WRITE_4(mac, 0x0100, 0x01000000); - if (mac->mac_sd->sd_id.sd_rev < 5) + if (siba_get_revid(sc->sc_dev) < 5) BWN_WRITE_4(mac, 0x010c, 0x01000000); BWN_WRITE_4(mac, BWN_MACCTL, @@ -3438,7 +3406,7 @@ bwn_chip_init(struct bwn_mac *mac) bwn_shm_write_2(mac, BWN_SHARED, 0x0074, 0x0000); bwn_set_opmode(mac); - if (mac->mac_sd->sd_id.sd_rev < 3) { + if (siba_get_revid(sc->sc_dev) < 3) { BWN_WRITE_2(mac, 0x060e, 0x0000); BWN_WRITE_2(mac, 0x0610, 0x8000); BWN_WRITE_2(mac, 0x0604, 0x0000); @@ -3454,10 +3422,9 @@ bwn_chip_init(struct bwn_mac *mac) BWN_WRITE_4(mac, BWN_DMA3_INTR_MASK, 0x0001dc00); BWN_WRITE_4(mac, BWN_DMA4_INTR_MASK, 0x0000dc00); BWN_WRITE_4(mac, BWN_DMA5_INTR_MASK, 0x0000dc00); - siba_write_4(mac->mac_sd, SIBA_TGSLOW, - siba_read_4(mac->mac_sd, SIBA_TGSLOW) | 0x00100000); - BWN_WRITE_2(mac, BWN_POWERUP_DELAY, - mac->mac_sd->sd_bus->siba_cc.scc_powerup_delay); + siba_write_4(sc->sc_dev, SIBA_TGSLOW, + siba_read_4(sc->sc_dev, SIBA_TGSLOW) | 0x00100000); + BWN_WRITE_2(mac, BWN_POWERUP_DELAY, siba_get_cc_powerdelay(sc->sc_dev)); return (error); } @@ -3619,13 +3586,14 @@ bwn_pio_set_txqueue(struct bwn_mac *mac, struct bwn_pio_txqueue *tq, int index) { struct bwn_pio_txpkt *tp; + struct bwn_softc *sc = mac->mac_sc; unsigned int i; tq->tq_base = bwn_pio_idx2base(mac, index) + BWN_PIO_TXQOFFSET(mac); tq->tq_index = index; tq->tq_free = BWN_PIO_MAX_TXPACKETS; - if (mac->mac_sd->sd_id.sd_rev >= 8) + if (siba_get_revid(sc->sc_dev) >= 8) tq->tq_size = 1920; else { tq->tq_size = bwn_pio_read_2(mac, tq, BWN_PIO_TXQBUFSIZE); @@ -3664,7 +3632,7 @@ bwn_pio_idx2base(struct bwn_mac *mac, int index) BWN_PIO11_BASE5, }; - if (mac->mac_sd->sd_id.sd_rev >= 11) { + if (siba_get_revid(sc->sc_dev) >= 11) { if (index >= N(bases_rev11)) device_printf(sc->sc_dev, "%s: warning\n", __func__); return (bases_rev11[index]); @@ -3678,9 +3646,10 @@ static void bwn_pio_setupqueue_rx(struct bwn_mac *mac, struct bwn_pio_rxqueue *prq, int index) { + struct bwn_softc *sc = mac->mac_sc; prq->prq_mac = mac; - prq->prq_rev = mac->mac_sd->sd_id.sd_rev; + prq->prq_rev = siba_get_revid(sc->sc_dev); prq->prq_base = bwn_pio_idx2base(mac, index) + BWN_PIO_RXQOFFSET(mac); bwn_dma_rxdirectfifo(mac, index, 1); } @@ -4027,6 +3996,7 @@ bwn_dma_32_setdesc(struct bwn_dma_ring *dr, int start, int end, int irq) { struct bwn_dmadesc32 *descbase = dr->dr_ring_descbase; + struct bwn_softc *sc = dr->dr_mac->mac_sc; uint32_t addr, addrext, ctl; int slot; @@ -4036,7 +4006,7 @@ bwn_dma_32_setdesc(struct bwn_dma_ring *dr, addr = (uint32_t) (dmaaddr & ~SIBA_DMA_TRANSLATION_MASK); addrext = (uint32_t) (dmaaddr & SIBA_DMA_TRANSLATION_MASK) >> 30; - addr |= siba_dma_translation(dr->dr_mac->mac_sd); + addr |= siba_dma_translation(sc->sc_dev); ctl = bufsize & BWN_DMA32_DCTL_BYTECNT; if (slot == dr->dr_numslots - 1) ctl |= BWN_DMA32_DCTL_DTABLEEND; @@ -4115,6 +4085,7 @@ bwn_dma_64_setdesc(struct bwn_dma_ring *dr, int start, int end, int irq) { struct bwn_dmadesc64 *descbase = dr->dr_ring_descbase; + struct bwn_softc *sc = dr->dr_mac->mac_sc; int slot; uint32_t ctl0 = 0, ctl1 = 0; uint32_t addrlo, addrhi; @@ -4128,7 +4099,7 @@ bwn_dma_64_setdesc(struct bwn_dma_ring *dr, addrhi = (((uint64_t) dmaaddr >> 32) & ~SIBA_DMA_TRANSLATION_MASK); addrext = (((uint64_t) dmaaddr >> 32) & SIBA_DMA_TRANSLATION_MASK) >> 30; - addrhi |= (siba_dma_translation(dr->dr_mac->mac_sd) << 1); + addrhi |= (siba_dma_translation(sc->sc_dev) << 1); if (slot == dr->dr_numslots - 1) ctl0 |= BWN_DMA64_DCTL0_DTABLEEND; if (start) @@ -4238,9 +4209,10 @@ bwn_dma_allocringmemory(struct bwn_dma_ring *dr) static void bwn_dma_setup(struct bwn_dma_ring *dr) { + struct bwn_softc *sc = dr->dr_mac->mac_sc; uint64_t ring64; uint32_t addrext, ring32, value; - uint32_t trans = siba_dma_translation(dr->dr_mac->mac_sd); + uint32_t trans = siba_dma_translation(sc->sc_dev); if (dr->dr_tx) { dr->dr_curslot = -1; @@ -4536,18 +4508,18 @@ bwn_spu_setdelay(struct bwn_mac *mac, int idle) static void bwn_bt_enable(struct bwn_mac *mac) { - struct siba_sprom *sprom = &mac->mac_sd->sd_bus->siba_sprom; + struct bwn_softc *sc = mac->mac_sc; uint64_t hf; if (bwn_bluetooth == 0) return; - if ((sprom->bf_lo & BWN_BFL_BTCOEXIST) == 0) + if ((siba_sprom_get_bf_lo(sc->sc_dev) & BWN_BFL_BTCOEXIST) == 0) return; if (mac->mac_phy.type != BWN_PHYTYPE_B && !mac->mac_phy.gmode) return; hf = bwn_hf_read(mac); - if (sprom->bf_lo & BWN_BFL_BTCMOD) + if (siba_sprom_get_bf_lo(sc->sc_dev) & BWN_BFL_BTCMOD) hf |= BWN_HF_BT_COEXISTALT; else hf |= BWN_HF_BT_COEXIST; @@ -4584,25 +4556,25 @@ bwn_clear_keys(struct bwn_mac *mac) static void bwn_crypt_init(struct bwn_mac *mac) { + struct bwn_softc *sc = mac->mac_sc; - mac->mac_max_nr_keys = (mac->mac_sd->sd_id.sd_rev >= 5) ? 58 : 20; + mac->mac_max_nr_keys = (siba_get_revid(sc->sc_dev) >= 5) ? 58 : 20; KASSERT(mac->mac_max_nr_keys <= N(mac->mac_key), ("%s:%d: fail", __func__, __LINE__)); mac->mac_ktp = bwn_shm_read_2(mac, BWN_SHARED, BWN_SHARED_KEY_TABLEP); mac->mac_ktp *= 2; - if (mac->mac_sd->sd_id.sd_rev >= 5) { - BWN_WRITE_2(mac, BWN_RCMTA_COUNT, - mac->mac_max_nr_keys - 8); - } + if (siba_get_revid(sc->sc_dev) >= 5) + BWN_WRITE_2(mac, BWN_RCMTA_COUNT, mac->mac_max_nr_keys - 8); bwn_clear_keys(mac); } static void bwn_chip_exit(struct bwn_mac *mac) { + struct bwn_softc *sc = mac->mac_sc; bwn_phy_exit(mac); - bwn_gpio_cleanup(mac); + siba_gpio_set(sc->sc_dev, 0); } static int @@ -4622,33 +4594,31 @@ bwn_fw_fillinfo(struct bwn_mac *mac) static int bwn_gpio_init(struct bwn_mac *mac) { - struct siba_softc *bus = mac->mac_sd->sd_bus; - struct siba_dev_softc *sd; - uint32_t mask = 0x0000001f, set = 0x0000000f; + struct bwn_softc *sc = mac->mac_sc; + uint32_t mask = 0x1f, set = 0xf, value; BWN_WRITE_4(mac, BWN_MACCTL, BWN_READ_4(mac, BWN_MACCTL) & ~BWN_MACCTL_GPOUT_MASK); BWN_WRITE_2(mac, BWN_GPIO_MASK, BWN_READ_2(mac, BWN_GPIO_MASK) | 0x000f); - if (bus->siba_chipid == 0x4301) { + if (siba_get_chipid(sc->sc_dev) == 0x4301) { mask |= 0x0060; set |= 0x0060; } - if (bus->siba_sprom.bf_lo & BWN_BFL_PACTRL) { + if (siba_sprom_get_bf_lo(sc->sc_dev) & BWN_BFL_PACTRL) { BWN_WRITE_2(mac, BWN_GPIO_MASK, BWN_READ_2(mac, BWN_GPIO_MASK) | 0x0200); mask |= 0x0200; set |= 0x0200; } - if (mac->mac_sd->sd_id.sd_rev >= 2) + if (siba_get_revid(sc->sc_dev) >= 2) mask |= 0x0010; - sd = (bus->siba_cc.scc_dev != NULL) ? bus->siba_cc.scc_dev : - bus->siba_pci.spc_dev; - if (sd == NULL) + + value = siba_gpio_get(sc->sc_dev); + if (value == -1) return (0); - siba_write_4(sd, BWN_GPIOCTL, - (siba_read_4(sd, BWN_GPIOCTL) & mask) | set); + siba_gpio_set(sc->sc_dev, (value & mask) | set); return (0); } @@ -4749,15 +4719,15 @@ bwn_set_opmode(struct bwn_mac *mac) ctl &= ~BWN_MACCTL_STA; ctl |= sc->sc_filters; - if (mac->mac_sd->sd_id.sd_rev <= 4) + if (siba_get_revid(sc->sc_dev) <= 4) ctl |= BWN_MACCTL_PROMISC; BWN_WRITE_4(mac, BWN_MACCTL, ctl); cfp_pretbtt = 2; if ((ctl & BWN_MACCTL_STA) && !(ctl & BWN_MACCTL_HOSTAP)) { - if (mac->mac_sd->sd_bus->siba_chipid == 0x4306 && - mac->mac_sd->sd_bus->siba_chiprev == 3) + if (siba_get_chipid(sc->sc_dev) == 0x4306 && + siba_get_chiprev(sc->sc_dev) == 3) cfp_pretbtt = 100; else cfp_pretbtt = 50; @@ -4765,19 +4735,6 @@ bwn_set_opmode(struct bwn_mac *mac) BWN_WRITE_2(mac, 0x612, cfp_pretbtt); } -static void -bwn_gpio_cleanup(struct bwn_mac *mac) -{ - struct siba_softc *bus = mac->mac_sd->sd_bus; - struct siba_dev_softc *gpiodev, *pcidev = NULL; - - pcidev = bus->siba_pci.spc_dev; - gpiodev = bus->siba_cc.scc_dev ? bus->siba_cc.scc_dev : pcidev; - if (!gpiodev) - return; - siba_write_4(gpiodev, BWN_GPIOCTL, 0); -} - static int bwn_dma_gettype(struct bwn_mac *mac) { @@ -4810,6 +4767,7 @@ bwn_phy_g_init_sub(struct bwn_mac *mac) { struct bwn_phy *phy = &mac->mac_phy; struct bwn_phy_g *pg = &phy->phy_g; + struct bwn_softc *sc = mac->mac_sc; uint16_t i, tmp; if (phy->rev == 1) @@ -4872,7 +4830,7 @@ bwn_phy_g_init_sub(struct bwn_mac *mac) BWN_PHY_SETMASK(mac, BWN_PHY_CCK(0x36), 0x0fff, (pg->pg_loctl.tx_bias << 12)); } - if (mac->mac_sd->sd_bus->siba_sprom.bf_lo & BWN_BFL_PACTRL) + if (siba_sprom_get_bf_lo(sc->sc_dev) & BWN_BFL_PACTRL) BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x2e), 0x8075); else BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x2e), 0x807f); @@ -4885,7 +4843,7 @@ bwn_phy_g_init_sub(struct bwn_mac *mac) BWN_PHY_WRITE(mac, BWN_PHY_LO_MASK, 0x8078); } - if (!(mac->mac_sd->sd_bus->siba_sprom.bf_lo & BWN_BFL_RSSI)) { + if (!(siba_sprom_get_bf_lo(sc->sc_dev) & BWN_BFL_RSSI)) { for (i = 0; i < 64; i++) { BWN_PHY_WRITE(mac, BWN_PHY_NRSSI_CTRL, i); BWN_PHY_WRITE(mac, BWN_PHY_NRSSI_DATA, @@ -4904,8 +4862,8 @@ bwn_phy_g_init_sub(struct bwn_mac *mac) if (phy->rf_rev == 8) BWN_PHY_WRITE(mac, BWN_PHY_EXTG(0x05), 0x3230); bwn_phy_hwpctl_init(mac); - if ((mac->mac_sd->sd_bus->siba_chipid == 0x4306 - && mac->mac_sd->sd_bus->siba_chippkg == 2) || 0) { + if ((siba_get_chipid(sc->sc_dev) == 0x4306 + && siba_get_chippkg(sc->sc_dev) == 2) || 0) { BWN_PHY_MASK(mac, BWN_PHY_CRS0, 0xbfff); BWN_PHY_MASK(mac, BWN_PHY_OFDM(0xc3), 0x7fff); } @@ -4923,16 +4881,16 @@ bwn_has_hwpctl(struct bwn_mac *mac) static void bwn_phy_init_b5(struct bwn_mac *mac) { - struct siba_softc *bus = mac->mac_sd->sd_bus; struct bwn_phy *phy = &mac->mac_phy; struct bwn_phy_g *pg = &phy->phy_g; + struct bwn_softc *sc = mac->mac_sc; uint16_t offset, value; uint8_t old_channel; if (phy->analog == 1) BWN_RF_SET(mac, 0x007a, 0x0050); - if ((bus->siba_board_vendor != SIBA_BOARDVENDOR_BCM) && - (bus->siba_board_type != SIBA_BOARD_BU4306)) { + if ((siba_get_pci_subvendor(sc->sc_dev) != SIBA_BOARDVENDOR_BCM) && + (siba_get_pci_subdevice(sc->sc_dev) != SIBA_BOARD_BU4306)) { value = 0x2120; for (offset = 0x00a8; offset < 0x00c7; offset++) { BWN_PHY_WRITE(mac, offset, value); @@ -5021,6 +4979,7 @@ bwn_loopback_calcgain(struct bwn_mac *mac) { struct bwn_phy *phy = &mac->mac_phy; struct bwn_phy_g *pg = &phy->phy_g; + struct bwn_softc *sc = mac->mac_sc; uint16_t backup_phy[16] = { 0 }; uint16_t backup_radio[3]; uint16_t backup_bband; @@ -5099,7 +5058,7 @@ bwn_loopback_calcgain(struct bwn_mac *mac) BWN_PHY_SET(mac, BWN_PHY_RFOVER, 0x0100); BWN_PHY_MASK(mac, BWN_PHY_RFOVERVAL, 0xcfff); - if (mac->mac_sd->sd_bus->siba_sprom.bf_lo & BWN_BFL_EXTLNA) { + if (siba_sprom_get_bf_lo(sc->sc_dev) & BWN_BFL_EXTLNA) { if (phy->rev >= 7) { BWN_PHY_SET(mac, BWN_PHY_RFOVER, 0x0800); BWN_PHY_SET(mac, BWN_PHY_RFOVERVAL, 0x8000); @@ -5399,6 +5358,7 @@ bwn_phy_init_b6(struct bwn_mac *mac) { struct bwn_phy *phy = &mac->mac_phy; struct bwn_phy_g *pg = &phy->phy_g; + struct bwn_softc *sc = mac->mac_sc; uint16_t offset, val; uint8_t old_channel; @@ -5428,7 +5388,7 @@ bwn_phy_init_b6(struct bwn_mac *mac) BWN_RF_WRITE(mac, 0x5a, 0x88); BWN_RF_WRITE(mac, 0x5b, 0x6b); BWN_RF_WRITE(mac, 0x5c, 0x0f); - if (mac->mac_sd->sd_bus->siba_sprom.bf_lo & BWN_BFL_ALTIQ) { + if (siba_sprom_get_bf_lo(sc->sc_dev) & BWN_BFL_ALTIQ) { BWN_RF_WRITE(mac, 0x5d, 0xfa); BWN_RF_WRITE(mac, 0x5e, 0xd8); } else { @@ -5509,6 +5469,7 @@ static void bwn_phy_init_a(struct bwn_mac *mac) { struct bwn_phy *phy = &mac->mac_phy; + struct bwn_softc *sc = mac->mac_sc; KASSERT(phy->type == BWN_PHYTYPE_A || phy->type == BWN_PHYTYPE_G, ("%s:%d: fail", __func__, __LINE__)); @@ -5525,7 +5486,7 @@ bwn_phy_init_a(struct bwn_mac *mac) bwn_wa_init(mac); if (phy->type == BWN_PHYTYPE_G && - (mac->mac_sd->sd_bus->siba_sprom.bf_lo & BWN_BFL_PACTRL)) + (siba_sprom_get_bf_lo(sc->sc_dev) & BWN_BFL_PACTRL)) BWN_PHY_SETMASK(mac, BWN_PHY_OFDM(0x6e), 0xe000, 0x3cf); } @@ -5776,7 +5737,7 @@ static void bwn_wa_init(struct bwn_mac *mac) { struct bwn_phy *phy = &mac->mac_phy; - struct siba_softc *bus = mac->mac_sd->sd_bus; + struct bwn_softc *sc = mac->mac_sc; KASSERT(phy->type == BWN_PHYTYPE_G, ("%s fail", __func__)); @@ -5795,9 +5756,9 @@ bwn_wa_init(struct bwn_mac *mac) KASSERT(0 == 1, ("%s:%d: fail", __func__, __LINE__)); } - if (bus->siba_board_vendor != SIBA_BOARDVENDOR_BCM || - bus->siba_board_type != SIBA_BOARD_BU4306 || - bus->siba_board_rev != 0x17) { + if (siba_get_pci_subvendor(sc->sc_dev) != SIBA_BOARDVENDOR_BCM || + siba_get_pci_subdevice(sc->sc_dev) != SIBA_BOARD_BU4306 || + siba_get_pci_revid(sc->sc_dev) != 0x17) { if (phy->rev < 2) { bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_GAINX_R1, 1, 0x0002); @@ -5806,7 +5767,8 @@ bwn_wa_init(struct bwn_mac *mac) } else { bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_GAINX, 1, 0x0002); bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_GAINX, 2, 0x0001); - if ((bus->siba_sprom.bf_lo & BWN_BFL_EXTLNA) && + if ((siba_sprom_get_bf_lo(sc->sc_dev) & + BWN_BFL_EXTLNA) && (phy->rev >= 7)) { BWN_PHY_MASK(mac, BWN_PHY_EXTG(0x11), 0xf7ff); bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_GAINX, @@ -5824,7 +5786,7 @@ bwn_wa_init(struct bwn_mac *mac) } } } - if (bus->siba_sprom.bf_lo & BWN_BFL_FEM) { + if (siba_sprom_get_bf_lo(sc->sc_dev) & BWN_BFL_FEM) { BWN_PHY_WRITE(mac, BWN_PHY_GTABCTL, 0x3120); BWN_PHY_WRITE(mac, BWN_PHY_GTABDATA, 0xc480); } @@ -5882,6 +5844,7 @@ static void bwn_dummy_transmission(struct bwn_mac *mac, int ofdm, int paon) { struct bwn_phy *phy = &mac->mac_phy; + struct bwn_softc *sc = mac->mac_sc; unsigned int i, max_loop; uint16_t value; uint32_t buffer[5] = { @@ -5903,7 +5866,7 @@ bwn_dummy_transmission(struct bwn_mac *mac, int ofdm, int paon) BWN_WRITE_2(mac, 0x0568, 0x0000); BWN_WRITE_2(mac, 0x07c0, - (mac->mac_sd->sd_id.sd_rev < 11) ? 0x0000 : 0x0100); + (siba_get_revid(sc->sc_dev) < 11) ? 0x0000 : 0x0100); value = ((phy->type == BWN_PHYTYPE_A) ? 0x41 : 0x40); BWN_WRITE_2(mac, 0x050c, value); if (phy->type == BWN_PHYTYPE_LP) @@ -5977,6 +5940,7 @@ bwn_lo_calcfeed(struct bwn_mac *mac, uint16_t lna, uint16_t pga, uint16_t trsw_rx) { struct bwn_phy *phy = &mac->mac_phy; + struct bwn_softc *sc = mac->mac_sc; uint16_t rfover; uint16_t feedthrough; @@ -5992,8 +5956,8 @@ bwn_lo_calcfeed(struct bwn_mac *mac, trsw_rx &= (BWN_PHY_RFOVERVAL_TRSWRX | BWN_PHY_RFOVERVAL_BW); rfover = BWN_PHY_RFOVERVAL_UNK | pga | lna | trsw_rx; - if ((mac->mac_sd->sd_bus->siba_sprom.bf_lo & BWN_BFL_EXTLNA) - && phy->rev > 6) + if ((siba_sprom_get_bf_lo(sc->sc_dev) & BWN_BFL_EXTLNA) && + phy->rev > 6) rfover |= BWN_PHY_RFOVERVAL_EXTLNA; BWN_PHY_WRITE(mac, BWN_PHY_PGACTL, 0xe300); @@ -6241,9 +6205,9 @@ bwn_lo_measure_gain_values(struct bwn_mac *mac, int16_t max_rx_gain, static void bwn_lo_save(struct bwn_mac *mac, struct bwn_lo_g_value *sav) { - struct siba_sprom *sprom = &mac->mac_sd->sd_bus->siba_sprom; struct bwn_phy *phy = &mac->mac_phy; struct bwn_phy_g *pg = &phy->phy_g; + struct bwn_softc *sc = mac->mac_sc; struct bwn_txpwr_loctl *lo = &pg->pg_loctl; struct timespec ts; uint16_t tmp; @@ -6281,7 +6245,8 @@ bwn_lo_save(struct bwn_mac *mac, struct bwn_lo_g_value *sav) BWN_PHY_MASK(mac, BWN_PHY_ANALOGOVERVAL, 0xfffc); if (phy->type == BWN_PHYTYPE_G) { if ((phy->rev >= 7) && - (sprom->bf_lo & BWN_BFL_EXTLNA)) { + (siba_sprom_get_bf_lo(sc->sc_dev) & + BWN_BFL_EXTLNA)) { BWN_PHY_WRITE(mac, BWN_PHY_RFOVER, 0x933); } else { BWN_PHY_WRITE(mac, BWN_PHY_RFOVER, 0x133); @@ -6781,6 +6746,7 @@ bwn_mac_enable(struct bwn_mac *mac) static void bwn_psctl(struct bwn_mac *mac, uint32_t flags) { + struct bwn_softc *sc = mac->mac_sc; int i; uint16_t ucstat; @@ -6795,7 +6761,7 @@ bwn_psctl(struct bwn_mac *mac, uint32_t flags) (BWN_READ_4(mac, BWN_MACCTL) | BWN_MACCTL_AWAKE) & ~BWN_MACCTL_HWPS); BWN_READ_4(mac, BWN_MACCTL); - if (mac->mac_sd->sd_id.sd_rev >= 5) { + if (siba_get_revid(sc->sc_dev) >= 5) { for (i = 0; i < 100; i++) { ucstat = bwn_shm_read_2(mac, BWN_SHARED, BWN_SHARED_UCODESTAT); @@ -6819,14 +6785,14 @@ bwn_nrssi_threshold(struct bwn_mac *mac) { struct bwn_phy *phy = &mac->mac_phy; struct bwn_phy_g *pg = &phy->phy_g; - struct siba_softc *siba = mac->mac_sd->sd_bus; + struct bwn_softc *sc = mac->mac_sc; int32_t a, b; int16_t tmp16; uint16_t tmpu16; KASSERT(phy->type == BWN_PHYTYPE_G, ("%s: fail", __func__)); - if (phy->gmode && (siba->siba_sprom.bf_lo & BWN_BFL_RSSI)) { + if (phy->gmode && (siba_sprom_get_bf_lo(sc->sc_dev) & BWN_BFL_RSSI)) { if (!pg->pg_aci_wlan_automatic && pg->pg_aci_enable) { a = 0x13; b = 0x12; @@ -7259,18 +7225,18 @@ bwn_set_original_gains(struct bwn_mac *mac) static void bwn_phy_hwpctl_init(struct bwn_mac *mac) { - struct siba_softc *bus = mac->mac_sd->sd_bus; struct bwn_phy *phy = &mac->mac_phy; struct bwn_phy_g *pg = &phy->phy_g; struct bwn_rfatt old_rfatt, rfatt; struct bwn_bbatt old_bbatt, bbatt; + struct bwn_softc *sc = mac->mac_sc; uint8_t old_txctl = 0; KASSERT(phy->type == BWN_PHYTYPE_G, ("%s:%d: fail", __func__, __LINE__)); - if ((bus->siba_board_vendor == SIBA_BOARDVENDOR_BCM) && - (bus->siba_board_type == SIBA_BOARD_BU4306)) + if ((siba_get_pci_subvendor(sc->sc_dev) == SIBA_BOARDVENDOR_BCM) && + (siba_get_pci_subdevice(sc->sc_dev) == SIBA_BOARD_BU4306)) return; BWN_PHY_WRITE(mac, 0x0028, 0x8018); @@ -7407,7 +7373,7 @@ bwn_hwpctl_init_gphy(struct bwn_mac *mac) static void bwn_phy_g_switch_chan(struct bwn_mac *mac, int channel, uint8_t spu) { - struct siba_softc *siba = mac->mac_sd->sd_bus; + struct bwn_softc *sc = mac->mac_sc; if (spu != 0) bwn_spu_workaround(mac, channel); @@ -7415,7 +7381,7 @@ bwn_phy_g_switch_chan(struct bwn_mac *mac, int channel, uint8_t spu) BWN_WRITE_2(mac, BWN_CHANNEL, bwn_phy_g_chan2freq(channel)); if (channel == 14) { - if (siba->siba_sprom.ccode == SIBA_CCODE_JAPAN) + if (siba_sprom_get_ccode(sc->sc_dev) == SIBA_CCODE_JAPAN) bwn_hf_write(mac, bwn_hf_read(mac) & ~BWN_HF_JAPAN_CHAN14_OFF); else @@ -7500,7 +7466,7 @@ bwn_rf_2050_rfoverval(struct bwn_mac *mac, uint16_t reg, uint32_t lpd) { struct bwn_phy *phy = &mac->mac_phy; struct bwn_phy_g *pg = &phy->phy_g; - struct siba_sprom *sprom = &(mac->mac_sd->sd_bus->siba_sprom); + struct bwn_softc *sc = mac->mac_sc; int max_lb_gain; uint16_t extlna; uint16_t i; @@ -7531,7 +7497,8 @@ bwn_rf_2050_rfoverval(struct bwn_mac *mac, uint16_t reg, uint32_t lpd) break; } - if ((phy->rev < 7) || !(sprom->bf_lo & BWN_BFL_EXTLNA)) { + if ((phy->rev < 7) || + !(siba_sprom_get_bf_lo(sc->sc_dev) & BWN_BFL_EXTLNA)) { if (reg == BWN_PHY_RFOVER) { return (0x1b3); } else if (reg == BWN_PHY_RFOVERVAL) { @@ -7575,7 +7542,7 @@ bwn_rf_2050_rfoverval(struct bwn_mac *mac, uint16_t reg, uint32_t lpd) } if ((phy->rev < 7) || - !(sprom->bf_lo & BWN_BFL_EXTLNA)) { + !(siba_sprom_get_bf_lo(sc->sc_dev) & BWN_BFL_EXTLNA)) { if (reg == BWN_PHY_RFOVER) { return (0x1b3); } else if (reg == BWN_PHY_RFOVERVAL) { @@ -7632,7 +7599,7 @@ bwn_fw_gets(struct bwn_mac *mac, enum bwn_fwtype type) { struct bwn_softc *sc = mac->mac_sc; struct bwn_fw *fw = &mac->mac_fw; - const uint8_t rev = mac->mac_sd->sd_id.sd_rev; + const uint8_t rev = siba_get_revid(sc->sc_dev); const char *filename; uint32_t high; int error; @@ -7675,7 +7642,7 @@ bwn_fw_gets(struct bwn_mac *mac, enum bwn_fwtype type) } /* initvals */ - high = siba_read_4(mac->mac_sd, SIBA_TGSHIGH); + high = siba_read_4(sc->sc_dev, SIBA_TGSHIGH); switch (mac->mac_phy.type) { case BWN_PHYTYPE_A: if (rev < 5 || rev > 10) @@ -8206,6 +8173,7 @@ bwn_key_dowrite(struct bwn_mac *mac, uint8_t index, uint8_t algorithm, static void bwn_key_macwrite(struct bwn_mac *mac, uint8_t index, const uint8_t *addr) { + struct bwn_softc *sc = mac->mac_sc; uint32_t addrtmp[2] = { 0, 0 }; uint8_t start = 8; @@ -8225,7 +8193,7 @@ bwn_key_macwrite(struct bwn_mac *mac, uint8_t index, const uint8_t *addr) addrtmp[1] |= ((uint32_t) (addr[5]) << 8); } - if (mac->mac_sd->sd_id.sd_rev >= 5) { + if (siba_get_revid(sc->sc_dev) >= 5) { bwn_shm_write_4(mac, BWN_RCMTA, (index * 2) + 0, addrtmp[0]); bwn_shm_write_2(mac, BWN_RCMTA, (index * 2) + 1, addrtmp[1]); } else { @@ -8396,14 +8364,14 @@ bwn_rf_turnoff(struct bwn_mac *mac) static void bwn_phy_reset(struct bwn_mac *mac) { - struct siba_dev_softc *sd = mac->mac_sd; + struct bwn_softc *sc = mac->mac_sc; - siba_write_4(sd, SIBA_TGSLOW, - ((siba_read_4(sd, SIBA_TGSLOW) & ~BWN_TGSLOW_SUPPORT_G) | + siba_write_4(sc->sc_dev, SIBA_TGSLOW, + ((siba_read_4(sc->sc_dev, SIBA_TGSLOW) & ~BWN_TGSLOW_SUPPORT_G) | BWN_TGSLOW_PHYRESET) | SIBA_TGSLOW_FGC); DELAY(1000); - siba_write_4(sd, SIBA_TGSLOW, - (siba_read_4(sd, SIBA_TGSLOW) & ~SIBA_TGSLOW_FGC) | + siba_write_4(sc->sc_dev, SIBA_TGSLOW, + (siba_read_4(sc->sc_dev, SIBA_TGSLOW) & ~SIBA_TGSLOW_FGC) | BWN_TGSLOW_PHYRESET); DELAY(1000); } @@ -8486,10 +8454,10 @@ bwn_intr(void *arg) { struct bwn_mac *mac = arg; struct bwn_softc *sc = mac->mac_sc; - struct siba_softc *siba = mac->mac_sd->sd_bus; uint32_t reason; - if (mac->mac_status < BWN_MAC_STATUS_STARTED || siba->siba_invalid) + if (mac->mac_status < BWN_MAC_STATUS_STARTED || + (sc->sc_flags & BWN_FLAG_INVALID)) return (FILTER_STRAY); reason = BWN_READ_4(mac, BWN_INTR_REASON); @@ -8529,12 +8497,12 @@ bwn_intrtask(void *arg, int npending) struct bwn_mac *mac = arg; struct bwn_softc *sc = mac->mac_sc; struct ifnet *ifp = sc->sc_ifp; - struct siba_softc *siba = mac->mac_sd->sd_bus; uint32_t merged = 0; int i, tx = 0, rx = 0; BWN_LOCK(sc); - if (mac->mac_status < BWN_MAC_STATUS_STARTED || siba->siba_invalid) { + if (mac->mac_status < BWN_MAC_STATUS_STARTED || + (sc->sc_flags & BWN_FLAG_INVALID)) { BWN_UNLOCK(sc); return; } @@ -9176,10 +9144,10 @@ bwn_pio_rxeof(struct bwn_pio_rxqueue *prq) return (1); ready: if (prq->prq_rev >= 8) - siba_read_multi_4(mac->mac_sd, &rxhdr, sizeof(rxhdr), + siba_read_multi_4(sc->sc_dev, &rxhdr, sizeof(rxhdr), prq->prq_base + BWN_PIO8_RXDATA); else - siba_read_multi_2(mac->mac_sd, &rxhdr, sizeof(rxhdr), + siba_read_multi_2(sc->sc_dev, &rxhdr, sizeof(rxhdr), prq->prq_base + BWN_PIO_RXDATA); len = le16toh(rxhdr.frame_len); if (len > 0x700) { @@ -9208,7 +9176,7 @@ ready: } mp = mtod(m, unsigned char *); if (prq->prq_rev >= 8) { - siba_read_multi_4(mac->mac_sd, mp + padding, (len & ~3), + siba_read_multi_4(sc->sc_dev, mp + padding, (len & ~3), prq->prq_base + BWN_PIO8_RXDATA); if (len & 3) { v32 = bwn_pio_rx_read_4(prq, BWN_PIO8_RXDATA); @@ -9225,7 +9193,7 @@ ready: } } } else { - siba_read_multi_2(mac->mac_sd, mp + padding, (len & ~1), + siba_read_multi_2(sc->sc_dev, mp + padding, (len & ~1), prq->prq_base + BWN_PIO_RXDATA); if (len & 1) { v16 = bwn_pio_rx_read_2(prq, BWN_PIO_RXDATA); @@ -9578,7 +9546,6 @@ bwn_phy_txpower_check(struct bwn_mac *mac, uint32_t flags) struct bwn_phy *phy = &mac->mac_phy; struct ifnet *ifp = sc->sc_ifp; struct ieee80211com *ic = ifp->if_l2com; - struct siba_softc *siba = mac->mac_sd->sd_bus; unsigned long now; int result; @@ -9588,8 +9555,8 @@ bwn_phy_txpower_check(struct bwn_mac *mac, uint32_t flags) return; phy->nexttime = now + 2 * 1000; - if (siba->siba_board_vendor == SIBA_BOARDVENDOR_BCM && - siba->siba_board_type == SIBA_BOARD_BU4306) + if (siba_get_pci_subvendor(sc->sc_dev) == SIBA_BOARDVENDOR_BCM && + siba_get_pci_subdevice(sc->sc_dev) == SIBA_BOARD_BU4306) return; if (phy->recalc_txpwr != NULL) { @@ -9902,14 +9869,15 @@ bwn_plcp_genhdr(struct bwn_plcp4 *plcp, const uint16_t octets, static uint8_t bwn_antenna_sanitize(struct bwn_mac *mac, uint8_t n) { + struct bwn_softc *sc = mac->mac_sc; uint8_t mask; if (n == 0) return (0); if (mac->mac_phy.gmode) - mask = mac->mac_sd->sd_bus->siba_sprom.ant_bg; + mask = siba_sprom_get_ant_bg(sc->sc_dev); else - mask = mac->mac_sd->sd_bus->siba_sprom.ant_a; + mask = siba_sprom_get_ant_a(sc->sc_dev); if (!(mask & (1 << (n - 1)))) return (0); return (n); @@ -9952,6 +9920,7 @@ static uint32_t bwn_pio_write_multi_4(struct bwn_mac *mac, struct bwn_pio_txqueue *tq, uint32_t ctl, const void *_data, int len) { + struct bwn_softc *sc = mac->mac_sc; uint32_t value = 0; const uint8_t *data = _data; @@ -9959,7 +9928,7 @@ bwn_pio_write_multi_4(struct bwn_mac *mac, struct bwn_pio_txqueue *tq, BWN_PIO8_TXCTL_16_23 | BWN_PIO8_TXCTL_24_31; bwn_pio_write_4(mac, tq, BWN_PIO8_TXCTL, ctl); - siba_write_multi_4(mac->mac_sd, data, (len & ~3), + siba_write_multi_4(sc->sc_dev, data, (len & ~3), tq->tq_base + BWN_PIO8_TXDATA); if (len & 3) { ctl &= ~(BWN_PIO8_TXCTL_8_15 | BWN_PIO8_TXCTL_16_23 | @@ -9996,12 +9965,13 @@ static uint16_t bwn_pio_write_multi_2(struct bwn_mac *mac, struct bwn_pio_txqueue *tq, uint16_t ctl, const void *_data, int len) { + struct bwn_softc *sc = mac->mac_sc; const uint8_t *data = _data; ctl |= BWN_PIO_TXCTL_WRITELO | BWN_PIO_TXCTL_WRITEHI; BWN_PIO_WRITE_2(mac, tq, BWN_PIO_TXCTL, ctl); - siba_write_multi_2(mac->mac_sd, data, (len & ~1), + siba_write_multi_2(sc->sc_dev, data, (len & ~1), tq->tq_base + BWN_PIO_TXDATA); if (len & 1) { ctl &= ~BWN_PIO_TXCTL_WRITEHI; @@ -10180,8 +10150,8 @@ bwn_phy_lock(struct bwn_mac *mac) struct bwn_softc *sc = mac->mac_sc; struct ieee80211com *ic = sc->sc_ifp->if_l2com; - KASSERT(mac->mac_sd->sd_id.sd_rev >= 3, - ("%s: unsupported rev %d", __func__, mac->mac_sd->sd_id.sd_rev)); + KASSERT(siba_get_revid(sc->sc_dev) >= 3, + ("%s: unsupported rev %d", __func__, siba_get_revid(sc->sc_dev))); if (ic->ic_opmode != IEEE80211_M_HOSTAP) bwn_psctl(mac, BWN_PS_AWAKE); @@ -10193,8 +10163,8 @@ bwn_phy_unlock(struct bwn_mac *mac) struct bwn_softc *sc = mac->mac_sc; struct ieee80211com *ic = sc->sc_ifp->if_l2com; - KASSERT(mac->mac_sd->sd_id.sd_rev >= 3, - ("%s: unsupported rev %d", __func__, mac->mac_sd->sd_id.sd_rev)); + KASSERT(siba_get_revid(sc->sc_dev) >= 3, + ("%s: unsupported rev %d", __func__, siba_get_revid(sc->sc_dev))); if (ic->ic_opmode != IEEE80211_M_HOSTAP) bwn_psctl(mac, 0); @@ -10411,9 +10381,10 @@ bwn_rx_radiotap(struct bwn_mac *mac, struct mbuf *m, static void bwn_tsf_read(struct bwn_mac *mac, uint64_t *tsf) { + struct bwn_softc *sc = mac->mac_sc; uint32_t low, high; - KASSERT(mac->mac_sd->sd_id.sd_rev >= 3, + KASSERT(siba_get_revid(sc->sc_dev) >= 3, ("%s:%d: fail", __func__, __LINE__)); low = BWN_READ_4(mac, BWN_REV3PLUS_TSF_LOW); @@ -10428,15 +10399,13 @@ bwn_dma_attach(struct bwn_mac *mac) { struct bwn_dma *dma = &mac->mac_method.dma; struct bwn_softc *sc = mac->mac_sc; - struct siba_dev_softc *sd = mac->mac_sd; - struct siba_softc *siba = sd->sd_bus; bus_addr_t lowaddr = 0; int error; - if (siba->siba_type == SIBA_TYPE_PCMCIA || bwn_usedma == 0) + if (siba_get_type(sc->sc_dev) == SIBA_TYPE_PCMCIA || bwn_usedma == 0) return (0); - KASSERT(mac->mac_sd->sd_id.sd_rev >= 5, ("%s: fail", __func__)); + KASSERT(siba_get_revid(sc->sc_dev) >= 5, ("%s: fail", __func__)); mac->mac_flags |= BWN_MAC_FLAG_DMA; @@ -10635,7 +10604,6 @@ static void bwn_led_attach(struct bwn_mac *mac) { struct bwn_softc *sc = mac->mac_sc; - struct siba_softc *siba = mac->mac_sd->sd_bus; const uint8_t *led_act = NULL; uint16_t val[BWN_LED_MAX]; int i; @@ -10644,7 +10612,8 @@ bwn_led_attach(struct bwn_mac *mac) sc->sc_led_blink = 1; for (i = 0; i < N(bwn_vendor_led_act); ++i) { - if (siba->siba_pci_subvid == bwn_vendor_led_act[i].vid) { + if (siba_get_pci_subvendor(sc->sc_dev) == + bwn_vendor_led_act[i].vid) { led_act = bwn_vendor_led_act[i].led_act; break; } @@ -10652,10 +10621,10 @@ bwn_led_attach(struct bwn_mac *mac) if (led_act == NULL) led_act = bwn_default_led_act; - val[0] = siba->siba_sprom.gpio0; - val[1] = siba->siba_sprom.gpio1; - val[2] = siba->siba_sprom.gpio2; - val[3] = siba->siba_sprom.gpio3; + val[0] = siba_sprom_get_gpio0(sc->sc_dev); + val[1] = siba_sprom_get_gpio1(sc->sc_dev); + val[2] = siba_sprom_get_gpio2(sc->sc_dev); + val[3] = siba_sprom_get_gpio3(sc->sc_dev); for (i = 0; i < BWN_LED_MAX; ++i) { struct bwn_led *led = &sc->sc_leds[i]; @@ -10771,82 +10740,82 @@ static void bwn_led_event(struct bwn_mac *mac, int event) { struct bwn_softc *sc = mac->mac_sc; - struct bwn_led *led = sc->sc_blink_led; - int rate; - - if (event == BWN_LED_EVENT_POLL) { - if ((led->led_flags & BWN_LED_F_POLLABLE) == 0) - return; - if (ticks - sc->sc_led_ticks < sc->sc_led_idle) - return; - } - - sc->sc_led_ticks = ticks; - if (sc->sc_led_blinking) - return; - - switch (event) { - case BWN_LED_EVENT_RX: - rate = sc->sc_rx_rate; - break; - case BWN_LED_EVENT_TX: - rate = sc->sc_tx_rate; - break; - case BWN_LED_EVENT_POLL: - rate = 0; - break; - default: - panic("unknown LED event %d\n", event); - break; - } - bwn_led_blink_start(mac, bwn_led_duration[rate].on_dur, - bwn_led_duration[rate].off_dur); + struct bwn_led *led = sc->sc_blink_led; + int rate; + + if (event == BWN_LED_EVENT_POLL) { + if ((led->led_flags & BWN_LED_F_POLLABLE) == 0) + return; + if (ticks - sc->sc_led_ticks < sc->sc_led_idle) + return; + } + + sc->sc_led_ticks = ticks; + if (sc->sc_led_blinking) + return; + + switch (event) { + case BWN_LED_EVENT_RX: + rate = sc->sc_rx_rate; + break; + case BWN_LED_EVENT_TX: + rate = sc->sc_tx_rate; + break; + case BWN_LED_EVENT_POLL: + rate = 0; + break; + default: + panic("unknown LED event %d\n", event); + break; + } + bwn_led_blink_start(mac, bwn_led_duration[rate].on_dur, + bwn_led_duration[rate].off_dur); } static void bwn_led_blink_start(struct bwn_mac *mac, int on_dur, int off_dur) { struct bwn_softc *sc = mac->mac_sc; - struct bwn_led *led = sc->sc_blink_led; - uint16_t val; + struct bwn_led *led = sc->sc_blink_led; + uint16_t val; - val = BWN_READ_2(mac, BWN_GPIO_CONTROL); - val = bwn_led_onoff(led, val, 1); - BWN_WRITE_2(mac, BWN_GPIO_CONTROL, val); + val = BWN_READ_2(mac, BWN_GPIO_CONTROL); + val = bwn_led_onoff(led, val, 1); + BWN_WRITE_2(mac, BWN_GPIO_CONTROL, val); - if (led->led_flags & BWN_LED_F_SLOW) { - BWN_LED_SLOWDOWN(on_dur); - BWN_LED_SLOWDOWN(off_dur); - } + if (led->led_flags & BWN_LED_F_SLOW) { + BWN_LED_SLOWDOWN(on_dur); + BWN_LED_SLOWDOWN(off_dur); + } - sc->sc_led_blinking = 1; - sc->sc_led_blink_offdur = off_dur; + sc->sc_led_blinking = 1; + sc->sc_led_blink_offdur = off_dur; - callout_reset(&sc->sc_led_blink_ch, on_dur, bwn_led_blink_next, mac); + callout_reset(&sc->sc_led_blink_ch, on_dur, bwn_led_blink_next, mac); } static void bwn_led_blink_next(void *arg) { struct bwn_mac *mac = arg; - struct bwn_softc *sc = mac->mac_sc; - uint16_t val; + struct bwn_softc *sc = mac->mac_sc; + uint16_t val; - val = BWN_READ_2(mac, BWN_GPIO_CONTROL); - val = bwn_led_onoff(sc->sc_blink_led, val, 0); - BWN_WRITE_2(mac, BWN_GPIO_CONTROL, val); + val = BWN_READ_2(mac, BWN_GPIO_CONTROL); + val = bwn_led_onoff(sc->sc_blink_led, val, 0); + BWN_WRITE_2(mac, BWN_GPIO_CONTROL, val); - callout_reset(&sc->sc_led_blink_ch, sc->sc_led_blink_offdur, - bwn_led_blink_end, mac); + callout_reset(&sc->sc_led_blink_ch, sc->sc_led_blink_offdur, + bwn_led_blink_end, mac); } static void bwn_led_blink_end(void *arg) { struct bwn_mac *mac = arg; - struct bwn_softc *sc = mac->mac_sc; + struct bwn_softc *sc = mac->mac_sc; - sc->sc_led_blinking = 0; + sc->sc_led_blinking = 0; } static int @@ -11101,8 +11070,6 @@ bwn_phy_lp_get_default_chan(struct bwn_mac *mac) struct ifnet *ifp = sc->sc_ifp; struct ieee80211com *ic = ifp->if_l2com; - device_printf(sc->sc_dev, "correct?\n"); - return (IEEE80211_IS_CHAN_2GHZ(ic->ic_curchan) ? 1 : 36); } @@ -11136,31 +11103,25 @@ bwn_phy_lp_readsprom(struct bwn_mac *mac) struct bwn_softc *sc = mac->mac_sc; struct ifnet *ifp = sc->sc_ifp; struct ieee80211com *ic = ifp->if_l2com; - struct siba_dev_softc *sd = mac->mac_sd; - struct siba_softc *siba = sd->sd_bus; - struct siba_sprom *sprom = &siba->siba_sprom; - - device_printf(sc->sc_dev, "XXX using %dghz\n", - IEEE80211_IS_CHAN_2GHZ(ic->ic_curchan) ? 2 : 5); if (IEEE80211_IS_CHAN_2GHZ(ic->ic_curchan)) { - plp->plp_txisoband_m = sprom->tri2g; - plp->plp_bxarch = sprom->bxa2g; - plp->plp_rxpwroffset = sprom->rxpo2g; - plp->plp_rssivf = sprom->rssismf2g; - plp->plp_rssivc = sprom->rssismc2g; - plp->plp_rssigs = sprom->rssisav2g; + plp->plp_txisoband_m = siba_sprom_get_tri2g(sc->sc_dev); + plp->plp_bxarch = siba_sprom_get_bxa2g(sc->sc_dev); + plp->plp_rxpwroffset = siba_sprom_get_rxpo2g(sc->sc_dev); + plp->plp_rssivf = siba_sprom_get_rssismf2g(sc->sc_dev); + plp->plp_rssivc = siba_sprom_get_rssismc2g(sc->sc_dev); + plp->plp_rssigs = siba_sprom_get_rssisav2g(sc->sc_dev); return; } - plp->plp_txisoband_l = sprom->tri5gl; - plp->plp_txisoband_m = sprom->tri5g; - plp->plp_txisoband_h = sprom->tri5gh; - plp->plp_bxarch = sprom->bxa5g; - plp->plp_rxpwroffset = sprom->rxpo5g; - plp->plp_rssivf = sprom->rssismf5g; - plp->plp_rssivc = sprom->rssismc5g; - plp->plp_rssigs = sprom->rssisav5g; + plp->plp_txisoband_l = siba_sprom_get_tri5gl(sc->sc_dev); + plp->plp_txisoband_m = siba_sprom_get_tri5g(sc->sc_dev); + plp->plp_txisoband_h = siba_sprom_get_tri5gh(sc->sc_dev); + plp->plp_bxarch = siba_sprom_get_bxa5g(sc->sc_dev); + plp->plp_rxpwroffset = siba_sprom_get_rxpo5g(sc->sc_dev); + plp->plp_rssivf = siba_sprom_get_rssismf5g(sc->sc_dev); + plp->plp_rssivc = siba_sprom_get_rssismc5g(sc->sc_dev); + plp->plp_rssigs = siba_sprom_get_rssisav5g(sc->sc_dev); } static void @@ -11192,8 +11153,6 @@ static void bwn_phy_lp_calib(struct bwn_mac *mac) { struct bwn_phy_lp *plp = &mac->mac_phy.phy_lp; - struct siba_dev_softc *sd = mac->mac_sd; - struct siba_softc *siba = sd->sd_bus; struct bwn_softc *sc = mac->mac_sc; struct ifnet *ifp = sc->sc_ifp; struct ieee80211com *ic = ifp->if_l2com; @@ -11240,7 +11199,7 @@ bwn_phy_lp_calib(struct bwn_mac *mac) bwn_phy_lp_digflt_restore(mac); /* do RX IQ Calculation; assumes that noise is true. */ - if (siba->siba_chipid == 0x5354) { + if (siba_get_chipid(sc->sc_dev) == 0x5354) { for (i = 0; i < N(bwn_rxcompco_5354); i++) { if (bwn_rxcompco_5354[i].rc_chan == plp->plp_chan) rc = &bwn_rxcompco_5354[i]; @@ -11306,21 +11265,20 @@ static void bwn_phy_lp_switch_analog(struct bwn_mac *mac, int on) { - if (on) { - BWN_PHY_MASK(mac, BWN_PHY_AFE_CTL_OVR, 0xfff8); - return; - } + if (on) { + BWN_PHY_MASK(mac, BWN_PHY_AFE_CTL_OVR, 0xfff8); + return; + } - BWN_PHY_SET(mac, BWN_PHY_AFE_CTL_OVRVAL, 0x0007); - BWN_PHY_SET(mac, BWN_PHY_AFE_CTL_OVR, 0x0007); + BWN_PHY_SET(mac, BWN_PHY_AFE_CTL_OVRVAL, 0x0007); + BWN_PHY_SET(mac, BWN_PHY_AFE_CTL_OVR, 0x0007); } static int bwn_phy_lp_b2063_switch_channel(struct bwn_mac *mac, uint8_t chan) { - struct siba_dev_softc *sd = mac->mac_sd; - struct siba_softc *siba = sd->sd_bus; static const struct bwn_b206x_chan *bc = NULL; + struct bwn_softc *sc = mac->mac_sc; uint32_t count, freqref, freqvco, freqxtal, val[3], timeout, timeoutref, tmp[6]; uint16_t old, scale, tmp16; @@ -11351,7 +11309,7 @@ bwn_phy_lp_b2063_switch_channel(struct bwn_mac *mac, uint8_t chan) old = BWN_RF_READ(mac, BWN_B2063_COM15); BWN_RF_SET(mac, BWN_B2063_COM15, 0x1e); - freqxtal = siba->siba_cc.scc_pmu.freq * 1000; + freqxtal = siba_get_cc_pmufreq(sc->sc_dev) * 1000; freqvco = bc->bc_freq << ((bc->bc_freq > 4000) ? 1 : 2); freqref = freqxtal * 3; div = (freqxtal <= 26000000 ? 1 : 2); @@ -11449,11 +11407,10 @@ bwn_phy_lp_b2063_switch_channel(struct bwn_mac *mac, uint8_t chan) static int bwn_phy_lp_b2062_switch_channel(struct bwn_mac *mac, uint8_t chan) { + struct bwn_softc *sc = mac->mac_sc; struct bwn_phy_lp *plp = &mac->mac_phy.phy_lp; - struct siba_dev_softc *sd = mac->mac_sd; - struct siba_softc *siba = sd->sd_bus; const struct bwn_b206x_chan *bc = NULL; - uint32_t freqxtal = siba->siba_cc.scc_pmu.freq * 1000; + uint32_t freqxtal = siba_get_cc_pmufreq(sc->sc_dev) * 1000; uint32_t tmp[9]; int i; @@ -11815,8 +11772,6 @@ static void bwn_phy_lp_bbinit_r2(struct bwn_mac *mac) { struct bwn_phy_lp *plp = &mac->mac_phy.phy_lp; - struct siba_dev_softc *sd = mac->mac_sd; - struct siba_softc *siba = sd->sd_bus; struct bwn_softc *sc = mac->mac_sc; struct ifnet *ifp = sc->sc_ifp; struct ieee80211com *ic = ifp->if_l2com; @@ -11848,7 +11803,7 @@ bwn_phy_lp_bbinit_r2(struct bwn_mac *mac) { BWN_PHY_CLIPCTRTHRESH, 0x83ff, 0x5800 }, { BWN_PHY_CLIPCTRTHRESH, 0xffe0, 0x12 }, { BWN_PHY_GAINMISMATCH, 0x0fff, 0x9000 }, - + }; int i; @@ -11861,7 +11816,7 @@ bwn_phy_lp_bbinit_r2(struct bwn_mac *mac) BWN_PHY_MASK(mac, BWN_PHY_CRSGAIN_CTL, ~0x4000); BWN_PHY_MASK(mac, BWN_PHY_CRSGAIN_CTL, ~0x2000); BWN_PHY_SET(mac, BWN_PHY_OFDM(0x10a), 0x1); - if (siba->siba_board_rev >= 0x18) { + if (siba_get_pci_revid(sc->sc_dev) >= 0x18) { bwn_tab_write(mac, BWN_TAB_4(17, 65), 0xec); BWN_PHY_SETMASK(mac, BWN_PHY_OFDM(0x10a), 0xff01, 0x14); } else { @@ -11878,7 +11833,8 @@ bwn_phy_lp_bbinit_r2(struct bwn_mac *mac) BWN_PHY_SETMASK(mac, BWN_PHY_CLIPCTRTHRESH, 0xfc1f, 0xa0); BWN_PHY_SETMASK(mac, BWN_PHY_GAINDIRECTMISMATCH, 0xe0ff, 0x300); BWN_PHY_SETMASK(mac, BWN_PHY_HIGAINDB, 0x00ff, 0x2a00); - if ((siba->siba_chipid == 0x4325) && (siba->siba_chiprev == 0)) { + if ((siba_get_chipid(sc->sc_dev) == 0x4325) && + (siba_get_chiprev(sc->sc_dev) == 0)) { BWN_PHY_SETMASK(mac, BWN_PHY_LOWGAINDB, 0x00ff, 0x2100); BWN_PHY_SETMASK(mac, BWN_PHY_VERYLOWGAINDB, 0xff00, 0xa); } else { @@ -11887,7 +11843,8 @@ bwn_phy_lp_bbinit_r2(struct bwn_mac *mac) } for (i = 0; i < N(v3); i++) BWN_PHY_SETMASK(mac, v3[i].offset, v3[i].mask, v3[i].set); - if ((siba->siba_chipid == 0x4325) && (siba->siba_chiprev == 0)) { + if ((siba_get_chipid(sc->sc_dev) == 0x4325) && + (siba_get_chiprev(sc->sc_dev) == 0)) { bwn_tab_write(mac, BWN_TAB_2(0x08, 0x14), 0); bwn_tab_write(mac, BWN_TAB_2(0x08, 0x12), 0x40); } @@ -11912,7 +11869,8 @@ bwn_phy_lp_bbinit_r2(struct bwn_mac *mac) 0x2000 | ((uint16_t)plp->plp_rssigs << 10) | ((uint16_t)plp->plp_rssivc << 4) | plp->plp_rssivf); - if ((siba->siba_chipid == 0x4325) && (siba->siba_chiprev == 0)) { + if ((siba_get_chipid(sc->sc_dev) == 0x4325) && + (siba_get_chiprev(sc->sc_dev) == 0)) { BWN_PHY_SET(mac, BWN_PHY_AFE_ADC_CTL_0, 0x1c); BWN_PHY_SETMASK(mac, BWN_PHY_AFE_CTL, 0x00ff, 0x8800); BWN_PHY_SETMASK(mac, BWN_PHY_AFE_ADC_CTL_1, 0xfc3c, 0x0400); @@ -11925,8 +11883,6 @@ static void bwn_phy_lp_bbinit_r01(struct bwn_mac *mac) { struct bwn_phy_lp *plp = &mac->mac_phy.phy_lp; - struct siba_dev_softc *sd = mac->mac_sd; - struct siba_softc *siba = sd->sd_bus; struct bwn_softc *sc = mac->mac_sc; struct ifnet *ifp = sc->sc_ifp; struct ieee80211com *ic = ifp->if_l2com; @@ -12009,23 +11965,23 @@ bwn_phy_lp_bbinit_r01(struct bwn_mac *mac) BWN_PHY_SETMASK(mac, v1[i].offset, v1[i].mask, v1[i].set); BWN_PHY_SETMASK(mac, BWN_PHY_INPUT_PWRDB, 0xff00, plp->plp_rxpwroffset); - if ((siba->siba_sprom.bf_lo & BWN_BFL_FEM) && + if ((siba_sprom_get_bf_lo(sc->sc_dev) & BWN_BFL_FEM) && ((IEEE80211_IS_CHAN_5GHZ(ic->ic_curchan)) || - (siba->siba_sprom.bf_hi & BWN_BFH_LDO_PAREF))) { - siba_cc_pmu_set_ldovolt(&siba->siba_cc, SIBA_LDO_PAREF, 0x28); - siba_cc_pmu_set_ldoparef(&siba->siba_cc, 1); + (siba_sprom_get_bf_hi(sc->sc_dev) & BWN_BFH_LDO_PAREF))) { + siba_cc_pmu_set_ldovolt(sc->sc_dev, SIBA_LDO_PAREF, 0x28); + siba_cc_pmu_set_ldoparef(sc->sc_dev, 1); if (mac->mac_phy.rev == 0) BWN_PHY_SETMASK(mac, BWN_PHY_LP_RF_SIGNAL_LUT, 0xffcf, 0x0010); bwn_tab_write(mac, BWN_TAB_2(11, 7), 60); } else { - siba_cc_pmu_set_ldoparef(&siba->siba_cc, 0); + siba_cc_pmu_set_ldoparef(sc->sc_dev, 0); BWN_PHY_SETMASK(mac, BWN_PHY_LP_RF_SIGNAL_LUT, 0xffcf, 0x0020); bwn_tab_write(mac, BWN_TAB_2(11, 7), 100); } tmp = plp->plp_rssivf | plp->plp_rssivc << 4 | 0xa000; BWN_PHY_WRITE(mac, BWN_PHY_AFE_RSSI_CTL_0, tmp); - if (siba->siba_sprom.bf_hi & BWN_BFH_RSSIINV) + if (siba_sprom_get_bf_hi(sc->sc_dev) & BWN_BFH_RSSIINV) BWN_PHY_SETMASK(mac, BWN_PHY_AFE_RSSI_CTL_1, 0xf000, 0x0aaa); else BWN_PHY_SETMASK(mac, BWN_PHY_AFE_RSSI_CTL_1, 0xf000, 0x02aa); @@ -12033,18 +11989,19 @@ bwn_phy_lp_bbinit_r01(struct bwn_mac *mac) BWN_PHY_SETMASK(mac, BWN_PHY_RX_RADIO_CTL, 0xfff9, (plp->plp_bxarch << 1)); if (mac->mac_phy.rev == 1 && - (siba->siba_sprom.bf_hi & BWN_BFH_FEM_BT)) { + (siba_sprom_get_bf_hi(sc->sc_dev) & BWN_BFH_FEM_BT)) { for (i = 0; i < N(v2); i++) BWN_PHY_SETMASK(mac, v2[i].offset, v2[i].mask, v2[i].set); } else if (IEEE80211_IS_CHAN_5GHZ(ic->ic_curchan) || - (siba->siba_board_type == 0x048a) || ((mac->mac_phy.rev == 0) && - (siba->siba_sprom.bf_lo & BWN_BFL_FEM))) { + (siba_get_pci_subdevice(sc->sc_dev) == 0x048a) || + ((mac->mac_phy.rev == 0) && + (siba_sprom_get_bf_lo(sc->sc_dev) & BWN_BFL_FEM))) { for (i = 0; i < N(v3); i++) BWN_PHY_SETMASK(mac, v3[i].offset, v3[i].mask, v3[i].set); } else if (mac->mac_phy.rev == 1 || - (siba->siba_sprom.bf_lo & BWN_BFL_FEM)) { + (siba_sprom_get_bf_lo(sc->sc_dev) & BWN_BFL_FEM)) { for (i = 0; i < N(v4); i++) BWN_PHY_SETMASK(mac, v4[i].offset, v4[i].mask, v4[i].set); @@ -12054,15 +12011,15 @@ bwn_phy_lp_bbinit_r01(struct bwn_mac *mac) v5[i].set); } if (mac->mac_phy.rev == 1 && - (siba->siba_sprom.bf_hi & BWN_BFH_LDO_PAREF)) { + (siba_sprom_get_bf_hi(sc->sc_dev) & BWN_BFH_LDO_PAREF)) { BWN_PHY_COPY(mac, BWN_PHY_TR_LOOKUP_5, BWN_PHY_TR_LOOKUP_1); BWN_PHY_COPY(mac, BWN_PHY_TR_LOOKUP_6, BWN_PHY_TR_LOOKUP_2); BWN_PHY_COPY(mac, BWN_PHY_TR_LOOKUP_7, BWN_PHY_TR_LOOKUP_3); BWN_PHY_COPY(mac, BWN_PHY_TR_LOOKUP_8, BWN_PHY_TR_LOOKUP_4); } - if ((siba->siba_sprom.bf_hi & BWN_BFH_FEM_BT) && - (siba->siba_chipid == 0x5354) && - (siba->siba_chippkg == SIBA_CHIPPACK_BCM4712S)) { + if ((siba_sprom_get_bf_hi(sc->sc_dev) & BWN_BFH_FEM_BT) && + (siba_get_chipid(sc->sc_dev) == 0x5354) && + (siba_get_chippkg(sc->sc_dev) == SIBA_CHIPPACK_BCM4712S)) { BWN_PHY_SET(mac, BWN_PHY_CRSGAIN_CTL, 0x0006); BWN_PHY_WRITE(mac, BWN_PHY_GPIO_SELECT, 0x0005); BWN_PHY_WRITE(mac, BWN_PHY_GPIO_OUTEN, 0xffff); @@ -12112,8 +12069,6 @@ bwn_phy_lp_b2062_init(struct bwn_mac *mac) #define CALC_CTL19(freq, div) \ ((((2 * (freq) + 1000000 * (div)) / (2000000 * (div))) - 1) & 0xff) struct bwn_phy_lp *plp = &mac->mac_phy.phy_lp; - struct siba_dev_softc *sd = mac->mac_sd; - struct siba_softc *siba = sd->sd_bus; struct bwn_softc *sc = mac->mac_sc; struct ifnet *ifp = sc->sc_ifp; struct ieee80211com *ic = ifp->if_l2com; @@ -12151,9 +12106,9 @@ bwn_phy_lp_b2062_init(struct bwn_mac *mac) else BWN_RF_MASK(mac, BWN_B2062_N_TSSI_CTL0, ~0x1); - KASSERT(siba->siba_cc.scc_caps & SIBA_CC_CAPS_PMU, + KASSERT(siba_get_cc_caps(sc->sc_dev) & SIBA_CC_CAPS_PMU, ("%s:%d: fail", __func__, __LINE__)); - xtalfreq = siba->siba_cc.scc_pmu.freq * 1000; + xtalfreq = siba_get_cc_pmufreq(sc->sc_dev) * 1000; KASSERT(xtalfreq != 0, ("%s:%d: fail", __func__, __LINE__)); if (xtalfreq <= 30000000) { @@ -12217,8 +12172,7 @@ bwn_phy_lp_b2063_init(struct bwn_mac *mac) static void bwn_phy_lp_rxcal_r2(struct bwn_mac *mac) { - struct siba_dev_softc *sd = mac->mac_sd; - struct siba_softc *siba = sd->sd_bus; + struct bwn_softc *sc = mac->mac_sc; static const struct bwn_wpair v1[] = { { BWN_B2063_RX_BB_SP8, 0x0 }, { BWN_B2063_RC_CALIB_CTL1, 0x7e }, @@ -12236,7 +12190,7 @@ bwn_phy_lp_rxcal_r2(struct bwn_mac *mac) { BWN_B2063_RC_CALIB_CTL2, 0x55 }, { BWN_B2063_RC_CALIB_CTL3, 0x76 } }; - uint32_t freqxtal = siba->siba_cc.scc_pmu.freq * 1000; + uint32_t freqxtal = siba_get_cc_pmufreq(sc->sc_dev) * 1000; int i; uint8_t tmp; @@ -12435,12 +12389,11 @@ bwn_phy_lp_roundup(uint32_t value, uint32_t div, uint8_t pre) static void bwn_phy_lp_b2062_reset_pllbias(struct bwn_mac *mac) { - struct siba_dev_softc *sd = mac->mac_sd; - struct siba_softc *siba = sd->sd_bus; + struct bwn_softc *sc = mac->mac_sc; BWN_RF_WRITE(mac, BWN_B2062_S_RFPLLCTL2, 0xff); DELAY(20); - if (siba->siba_chipid == 0x5354) { + if (siba_get_chipid(sc->sc_dev) == 0x5354) { BWN_RF_WRITE(mac, BWN_B2062_N_COM1, 4); BWN_RF_WRITE(mac, BWN_B2062_S_RFPLLCTL2, 4); } else { @@ -13146,8 +13099,7 @@ bwn_phy_lp_tblinit_r01(struct bwn_mac *mac) static void bwn_phy_lp_tblinit_r2(struct bwn_mac *mac) { - struct siba_dev_softc *sd = mac->mac_sd; - struct siba_softc *siba = sd->sd_bus; + struct bwn_softc *sc = mac->mac_sc; int i; static const uint16_t noisescale[] = { 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00a4, @@ -13355,7 +13307,8 @@ bwn_phy_lp_tblinit_r2(struct bwn_mac *mac) bwn_tab_write_multi(mac, BWN_TAB_4(9, 0), N(papdeps), papdeps); bwn_tab_write_multi(mac, BWN_TAB_4(10, 0), N(papdmult), papdmult); - if ((siba->siba_chipid == 0x4325) && (siba->siba_chiprev == 0)) { + if ((siba_get_chipid(sc->sc_dev) == 0x4325) && + (siba_get_chiprev(sc->sc_dev) == 0)) { bwn_tab_write_multi(mac, BWN_TAB_4(13, 0), N(gainidx_a0), gainidx_a0); bwn_tab_write_multi(mac, BWN_TAB_2(14, 0), N(auxgainidx_a0), @@ -13369,8 +13322,6 @@ bwn_phy_lp_tblinit_r2(struct bwn_mac *mac) static void bwn_phy_lp_tblinit_txgain(struct bwn_mac *mac) { - struct siba_dev_softc *sd = mac->mac_sd; - struct siba_softc *siba = sd->sd_bus; struct bwn_softc *sc = mac->mac_sc; struct ifnet *ifp = sc->sc_ifp; struct ieee80211com *ic = ifp->if_l2com; @@ -13975,7 +13926,7 @@ bwn_phy_lp_tblinit_txgain(struct bwn_mac *mac) }; if (mac->mac_phy.rev != 0 && mac->mac_phy.rev != 1) { - if (siba->siba_sprom.bf_hi & BWN_BFH_NOPA) + if (siba_sprom_get_bf_hi(sc->sc_dev) & BWN_BFH_NOPA) bwn_phy_lp_gaintbl_write_multi(mac, 0, 128, txgain_r2); else if (IEEE80211_IS_CHAN_2GHZ(ic->ic_curchan)) bwn_phy_lp_gaintbl_write_multi(mac, 0, 128, @@ -13987,8 +13938,8 @@ bwn_phy_lp_tblinit_txgain(struct bwn_mac *mac) } if (mac->mac_phy.rev == 0) { - if ((siba->siba_sprom.bf_hi & BWN_BFH_NOPA) || - (siba->siba_sprom.bf_lo & BWN_BFL_HGPA)) + if ((siba_sprom_get_bf_hi(sc->sc_dev) & BWN_BFH_NOPA) || + (siba_sprom_get_bf_lo(sc->sc_dev) & BWN_BFL_HGPA)) bwn_phy_lp_gaintbl_write_multi(mac, 0, 128, txgain_r0); else if (IEEE80211_IS_CHAN_2GHZ(ic->ic_curchan)) bwn_phy_lp_gaintbl_write_multi(mac, 0, 128, @@ -13999,8 +13950,8 @@ bwn_phy_lp_tblinit_txgain(struct bwn_mac *mac) return; } - if ((siba->siba_sprom.bf_hi & BWN_BFH_NOPA) || - (siba->siba_sprom.bf_lo & BWN_BFL_HGPA)) + if ((siba_sprom_get_bf_hi(sc->sc_dev) & BWN_BFH_NOPA) || + (siba_sprom_get_bf_lo(sc->sc_dev) & BWN_BFL_HGPA)) bwn_phy_lp_gaintbl_write_multi(mac, 0, 128, txgain_r1); else if (IEEE80211_IS_CHAN_2GHZ(ic->ic_curchan)) bwn_phy_lp_gaintbl_write_multi(mac, 0, 128, txgain_2ghz_r1); diff --git a/sys/dev/bwn/if_bwnvar.h b/sys/dev/bwn/if_bwnvar.h index 61598c2f390d..16934c3e39ea 100644 --- a/sys/dev/bwn/if_bwnvar.h +++ b/sys/dev/bwn/if_bwnvar.h @@ -65,14 +65,16 @@ struct bwn_mac; ((uint16_t)((((uint16_t)tq->tq_index + 1) << 12) | tp->tp_index)) #define BWN_DMA_COOKIE(dr, slot) \ ((uint16_t)(((uint16_t)dr->dr_index + 1) << 12) | (uint16_t)slot) -#define BWN_READ_2(mac, o) (siba_read_2(mac->mac_sd, o)) -#define BWN_READ_4(mac, o) (siba_read_4(mac->mac_sd, o)) -#define BWN_WRITE_2(mac, o, v) (siba_write_2(mac->mac_sd, o, v)) -#define BWN_WRITE_4(mac, o, v) (siba_write_4(mac->mac_sd, o, v)) +#define BWN_READ_2(mac, o) (siba_read_2(mac->mac_sc->sc_dev, o)) +#define BWN_READ_4(mac, o) (siba_read_4(mac->mac_sc->sc_dev, o)) +#define BWN_WRITE_2(mac, o, v) \ + (siba_write_2(mac->mac_sc->sc_dev, o, v)) +#define BWN_WRITE_4(mac, o, v) \ + (siba_write_4(mac->mac_sc->sc_dev, o, v)) #define BWN_PIO_TXQOFFSET(mac) \ - ((mac->mac_sd->sd_id.sd_rev >= 11) ? 0x18 : 0) + ((siba_get_revid(mac->mac_sc->sc_dev) >= 11) ? 0x18 : 0) #define BWN_PIO_RXQOFFSET(mac) \ - ((mac->mac_sd->sd_id.sd_rev >= 11) ? 0x38 : 8) + ((siba_get_revid(mac->mac_sc->sc_dev) >= 11) ? 0x38 : 8) #define BWN_SEC_NEWAPI(mac) (mac->mac_fw.rev >= 351) #define BWN_SEC_KEY2FW(mac, idx) \ (BWN_SEC_NEWAPI(mac) ? idx : ((idx >= 4) ? idx - 4 : idx)) @@ -141,7 +143,7 @@ struct bwn_mac; (rate == BWN_CCK_RATE_1MB || rate == BWN_CCK_RATE_2MB || \ rate == BWN_CCK_RATE_5MB || rate == BWN_CCK_RATE_11MB) #define BWN_ISOFDMRATE(rate) (!BWN_ISCCKRATE(rate)) -#define BWN_BARRIER(mac, flags) siba_barrier(mac->mac_sd, flags) +#define BWN_BARRIER(mac, flags) siba_barrier(mac->mac_sc->sc_dev, flags) #define BWN_DMA_READ(dr, offset) \ (BWN_READ_4(dr->dr_mac, dr->dr_base + offset)) #define BWN_DMA_WRITE(dr, offset, value) \ @@ -835,7 +837,6 @@ struct bwn_led { struct bwn_mac { struct bwn_softc *mac_sc; - struct siba_dev_softc *mac_sd; unsigned mac_status; #define BWN_MAC_STATUS_UNINIT 0 #define BWN_MAC_STATUS_INITED 1 @@ -902,7 +903,6 @@ struct bwn_vap { struct bwn_softc { device_t sc_dev; - struct siba_dev_softc *sc_sd; struct mtx sc_mtx; struct ifnet *sc_ifp; unsigned sc_flags; diff --git a/sys/dev/siba/siba_bwn.c b/sys/dev/siba/siba_bwn.c index f33f9b3c52cf..56e16fd1bfd6 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 748b426b7a99..44eaef5241a3 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 307903b9920e..9b82310b3385 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_ */ |