From 40dcddfcca710cac48b1825b8cb7b0d1979fe452 Mon Sep 17 00:00:00 2001 From: Adrian Chadd Date: Tue, 24 May 2016 04:58:58 +0000 Subject: [PATCH] [bwn] begin separating out the attach path from the SIBA specific bits. * convert phy_getinfo() to take a "gmode" flag, rather than the siba TGSHIGH flags and then check for 2GHz. This should ensure that gmode is set correctly even on DUALPHY NICs. * move the siba_powerup() call and the TGSHIGH decoding into a call to bwn_is_bus_siba(), and return an error if it's called on anything else. We don't yet do anything else, but when we do.. Tested: * BCM4322, 11a STA --- sys/dev/bwn/if_bwn.c | 45 ++++++++++++++++++++------------------------ 1 file changed, 20 insertions(+), 25 deletions(-) diff --git a/sys/dev/bwn/if_bwn.c b/sys/dev/bwn/if_bwn.c index 4874347d27e9..fcf799648225 100644 --- a/sys/dev/bwn/if_bwn.c +++ b/sys/dev/bwn/if_bwn.c @@ -1148,34 +1148,15 @@ bwn_attach_core(struct bwn_mac *mac) { struct bwn_softc *sc = mac->mac_sc; int error, have_bg = 0, have_a = 0; - uint32_t high; KASSERT(siba_get_revid(sc->sc_dev) >= 5, ("unsupported revision %d", siba_get_revid(sc->sc_dev))); - siba_powerup(sc->sc_dev, 0); - - high = siba_read_4(sc->sc_dev, SIBA_TGSHIGH); - - /* - * Guess at whether it has A-PHY or G-PHY. - * This is just used for resetting the core to probe things; - * we will re-guess once it's all up and working. - * - * XXX TODO: there's the TGSHIGH DUALPHY flag based on - * the PHY revision. - */ - bwn_reset_core(mac, !!(high & BWN_TGSHIGH_HAVE_2GHZ)); - - /* - * Get the PHY version. - */ - error = bwn_phy_getinfo(mac, high); - if (error) - goto fail; - - /* XXX TODO need bhnd */ if (bwn_is_bus_siba(mac)) { + uint32_t high; + + siba_powerup(sc->sc_dev, 0); + high = siba_read_4(sc->sc_dev, SIBA_TGSHIGH); have_a = (high & BWN_TGSHIGH_HAVE_5GHZ) ? 1 : 0; have_bg = (high & BWN_TGSHIGH_HAVE_2GHZ) ? 1 : 0; if (high & BWN_TGSHIGH_DUALPHY) { @@ -1188,6 +1169,20 @@ bwn_attach_core(struct bwn_mac *mac) goto fail; } + /* + * Guess at whether it has A-PHY or G-PHY. + * This is just used for resetting the core to probe things; + * we will re-guess once it's all up and working. + */ + bwn_reset_core(mac, have_bg); + + /* + * Get the PHY version. + */ + error = bwn_phy_getinfo(mac, have_bg); + if (error) + goto fail; + #if 0 device_printf(sc->sc_dev, "%s: high=0x%08x, have_a=%d, have_bg=%d," " deviceid=0x%04x, siba_deviceid=0x%04x\n", @@ -1379,7 +1374,7 @@ bwn_reset_core(struct bwn_mac *mac, int g_mode) } static int -bwn_phy_getinfo(struct bwn_mac *mac, int tgshigh) +bwn_phy_getinfo(struct bwn_mac *mac, int gmode) { struct bwn_phy *phy = &mac->mac_phy; struct bwn_softc *sc = mac->mac_sc; @@ -1387,7 +1382,7 @@ bwn_phy_getinfo(struct bwn_mac *mac, int tgshigh) /* PHY */ tmp = BWN_READ_2(mac, BWN_PHYVER); - phy->gmode = !! (tgshigh & BWN_TGSHIGH_HAVE_2GHZ); + phy->gmode = gmode; phy->rf_on = 1; phy->analog = (tmp & BWN_PHYVER_ANALOG) >> 12; phy->type = (tmp & BWN_PHYVER_TYPE) >> 8;