if_bwn.c (299773) | if_bwn.c (299776) |
---|---|
1/*- 2 * Copyright (c) 2009-2010 Weongyo Jeong <weongyo@freebsd.org> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 14 unchanged lines hidden (view full) --- 23 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 24 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 25 * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 26 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 27 * THE POSSIBILITY OF SUCH DAMAGES. 28 */ 29 30#include <sys/cdefs.h> | 1/*- 2 * Copyright (c) 2009-2010 Weongyo Jeong <weongyo@freebsd.org> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 14 unchanged lines hidden (view full) --- 23 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 24 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 25 * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 26 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 27 * THE POSSIBILITY OF SUCH DAMAGES. 28 */ 29 30#include <sys/cdefs.h> |
31__FBSDID("$FreeBSD: head/sys/dev/bwn/if_bwn.c 299773 2016-05-14 23:10:47Z adrian $"); | 31__FBSDID("$FreeBSD: head/sys/dev/bwn/if_bwn.c 299776 2016-05-14 23:20:46Z adrian $"); |
32 33/* 34 * The Broadcom Wireless LAN controller driver. 35 */ 36 37#include <sys/param.h> 38#include <sys/systm.h> 39#include <sys/kernel.h> --- 32 unchanged lines hidden (view full) --- 72#include <net80211/ieee80211_phy.h> 73#include <net80211/ieee80211_ratectl.h> 74 75#include <dev/bwn/if_bwnreg.h> 76#include <dev/bwn/if_bwnvar.h> 77 78#include <dev/bwn/if_bwn_debug.h> 79#include <dev/bwn/if_bwn_misc.h> | 32 33/* 34 * The Broadcom Wireless LAN controller driver. 35 */ 36 37#include <sys/param.h> 38#include <sys/systm.h> 39#include <sys/kernel.h> --- 32 unchanged lines hidden (view full) --- 72#include <net80211/ieee80211_phy.h> 73#include <net80211/ieee80211_ratectl.h> 74 75#include <dev/bwn/if_bwnreg.h> 76#include <dev/bwn/if_bwnvar.h> 77 78#include <dev/bwn/if_bwn_debug.h> 79#include <dev/bwn/if_bwn_misc.h> |
80#include <dev/bwn/if_bwn_util.h> 81#include <dev/bwn/if_bwn_phy_common.h> |
|
80#include <dev/bwn/if_bwn_phy_g.h> 81#include <dev/bwn/if_bwn_phy_lp.h> 82 83static SYSCTL_NODE(_hw, OID_AUTO, bwn, CTLFLAG_RD, 0, 84 "Broadcom driver parameters"); 85 86/* 87 * Tunable & sysctl variables. --- 1049 unchanged lines hidden (view full) --- 1137 uint32_t high; 1138 1139 KASSERT(siba_get_revid(sc->sc_dev) >= 5, 1140 ("unsupported revision %d", siba_get_revid(sc->sc_dev))); 1141 1142 siba_powerup(sc->sc_dev, 0); 1143 1144 high = siba_read_4(sc->sc_dev, SIBA_TGSHIGH); | 82#include <dev/bwn/if_bwn_phy_g.h> 83#include <dev/bwn/if_bwn_phy_lp.h> 84 85static SYSCTL_NODE(_hw, OID_AUTO, bwn, CTLFLAG_RD, 0, 86 "Broadcom driver parameters"); 87 88/* 89 * Tunable & sysctl variables. --- 1049 unchanged lines hidden (view full) --- 1139 uint32_t high; 1140 1141 KASSERT(siba_get_revid(sc->sc_dev) >= 5, 1142 ("unsupported revision %d", siba_get_revid(sc->sc_dev))); 1143 1144 siba_powerup(sc->sc_dev, 0); 1145 1146 high = siba_read_4(sc->sc_dev, SIBA_TGSHIGH); |
1145 bwn_reset_core(mac, 1146 (high & BWN_TGSHIGH_HAVE_2GHZ) ? BWN_TGSLOW_SUPPORT_G : 0); | 1147 bwn_reset_core(mac, !!(high & BWN_TGSHIGH_HAVE_2GHZ)); |
1147 error = bwn_phy_getinfo(mac, high); 1148 if (error) 1149 goto fail; 1150 1151 have_a = (high & BWN_TGSHIGH_HAVE_5GHZ) ? 1 : 0; 1152 have_bg = (high & BWN_TGSHIGH_HAVE_2GHZ) ? 1 : 0; 1153 if (siba_get_pci_device(sc->sc_dev) != 0x4312 && 1154 siba_get_pci_device(sc->sc_dev) != 0x4319 && --- 63 unchanged lines hidden (view full) --- 1218 if (mac->mac_phy.attach != NULL) { 1219 error = mac->mac_phy.attach(mac); 1220 if (error) { 1221 device_printf(sc->sc_dev, "failed\n"); 1222 goto fail; 1223 } 1224 } 1225 | 1148 error = bwn_phy_getinfo(mac, high); 1149 if (error) 1150 goto fail; 1151 1152 have_a = (high & BWN_TGSHIGH_HAVE_5GHZ) ? 1 : 0; 1153 have_bg = (high & BWN_TGSHIGH_HAVE_2GHZ) ? 1 : 0; 1154 if (siba_get_pci_device(sc->sc_dev) != 0x4312 && 1155 siba_get_pci_device(sc->sc_dev) != 0x4319 && --- 63 unchanged lines hidden (view full) --- 1219 if (mac->mac_phy.attach != NULL) { 1220 error = mac->mac_phy.attach(mac); 1221 if (error) { 1222 device_printf(sc->sc_dev, "failed\n"); 1223 goto fail; 1224 } 1225 } 1226 |
1226 bwn_reset_core(mac, have_bg ? BWN_TGSLOW_SUPPORT_G : 0); | 1227 bwn_reset_core(mac, have_bg); |
1227 1228 error = bwn_chiptest(mac); 1229 if (error) 1230 goto fail; 1231 error = bwn_setup_channels(mac, have_bg, have_a); 1232 if (error) { 1233 device_printf(sc->sc_dev, "failed to setup channels\n"); 1234 goto fail; --- 11 unchanged lines hidden (view full) --- 1246 mac->mac_phy.switch_analog(mac, 0); 1247 1248 siba_dev_down(sc->sc_dev, 0); 1249fail: 1250 siba_powerdown(sc->sc_dev); 1251 return (error); 1252} 1253 | 1228 1229 error = bwn_chiptest(mac); 1230 if (error) 1231 goto fail; 1232 error = bwn_setup_channels(mac, have_bg, have_a); 1233 if (error) { 1234 device_printf(sc->sc_dev, "failed to setup channels\n"); 1235 goto fail; --- 11 unchanged lines hidden (view full) --- 1247 mac->mac_phy.switch_analog(mac, 0); 1248 1249 siba_dev_down(sc->sc_dev, 0); 1250fail: 1251 siba_powerdown(sc->sc_dev); 1252 return (error); 1253} 1254 |
1255/* 1256 * Reset - SIBA. 1257 * 1258 * XXX TODO: implement BCMA version! 1259 */ |
|
1254void | 1260void |
1255bwn_reset_core(struct bwn_mac *mac, uint32_t flags) | 1261bwn_reset_core(struct bwn_mac *mac, int g_mode) |
1256{ 1257 struct bwn_softc *sc = mac->mac_sc; 1258 uint32_t low, ctl; | 1262{ 1263 struct bwn_softc *sc = mac->mac_sc; 1264 uint32_t low, ctl; |
1265 uint32_t flags = 0; |
|
1259 | 1266 |
1267 DPRINTF(sc, BWN_DEBUG_RESET, "%s: g_mode=%d\n", __func__, g_mode); 1268 |
|
1260 flags |= (BWN_TGSLOW_PHYCLOCK_ENABLE | BWN_TGSLOW_PHYRESET); | 1269 flags |= (BWN_TGSLOW_PHYCLOCK_ENABLE | BWN_TGSLOW_PHYRESET); |
1270 if (g_mode) 1271 flags |= BWN_TGSLOW_SUPPORT_G; |
|
1261 | 1272 |
1273 /* XXX N-PHY only; and hard-code to 20MHz for now */ 1274 if (mac->mac_phy.type == BWN_PHYTYPE_N) 1275 flags |= BWN_TGSLOW_PHY_BANDWIDTH_20MHZ; 1276 |
|
1262 siba_dev_up(sc->sc_dev, flags); 1263 DELAY(2000); 1264 | 1277 siba_dev_up(sc->sc_dev, flags); 1278 DELAY(2000); 1279 |
1280 /* Take PHY out of reset */ |
|
1265 low = (siba_read_4(sc->sc_dev, SIBA_TGSLOW) | SIBA_TGSLOW_FGC) & 1266 ~BWN_TGSLOW_PHYRESET; 1267 siba_write_4(sc->sc_dev, SIBA_TGSLOW, low); 1268 siba_read_4(sc->sc_dev, SIBA_TGSLOW); 1269 DELAY(1000); 1270 siba_write_4(sc->sc_dev, SIBA_TGSLOW, low & ~SIBA_TGSLOW_FGC); 1271 siba_read_4(sc->sc_dev, SIBA_TGSLOW); 1272 DELAY(1000); 1273 1274 if (mac->mac_phy.switch_analog != NULL) 1275 mac->mac_phy.switch_analog(mac, 1); 1276 1277 ctl = BWN_READ_4(mac, BWN_MACCTL) & ~BWN_MACCTL_GMODE; | 1281 low = (siba_read_4(sc->sc_dev, SIBA_TGSLOW) | SIBA_TGSLOW_FGC) & 1282 ~BWN_TGSLOW_PHYRESET; 1283 siba_write_4(sc->sc_dev, SIBA_TGSLOW, low); 1284 siba_read_4(sc->sc_dev, SIBA_TGSLOW); 1285 DELAY(1000); 1286 siba_write_4(sc->sc_dev, SIBA_TGSLOW, low & ~SIBA_TGSLOW_FGC); 1287 siba_read_4(sc->sc_dev, SIBA_TGSLOW); 1288 DELAY(1000); 1289 1290 if (mac->mac_phy.switch_analog != NULL) 1291 mac->mac_phy.switch_analog(mac, 1); 1292 1293 ctl = BWN_READ_4(mac, BWN_MACCTL) & ~BWN_MACCTL_GMODE; |
1278 if (flags & BWN_TGSLOW_SUPPORT_G) | 1294 if (g_mode) |
1279 ctl |= BWN_MACCTL_GMODE; 1280 BWN_WRITE_4(mac, BWN_MACCTL, ctl | BWN_MACCTL_IHR_ON); 1281} 1282 1283static int 1284bwn_phy_getinfo(struct bwn_mac *mac, int tgshigh) 1285{ 1286 struct bwn_phy *phy = &mac->mac_phy; 1287 struct bwn_softc *sc = mac->mac_sc; 1288 uint32_t tmp; 1289 1290 /* PHY */ 1291 tmp = BWN_READ_2(mac, BWN_PHYVER); | 1295 ctl |= BWN_MACCTL_GMODE; 1296 BWN_WRITE_4(mac, BWN_MACCTL, ctl | BWN_MACCTL_IHR_ON); 1297} 1298 1299static int 1300bwn_phy_getinfo(struct bwn_mac *mac, int tgshigh) 1301{ 1302 struct bwn_phy *phy = &mac->mac_phy; 1303 struct bwn_softc *sc = mac->mac_sc; 1304 uint32_t tmp; 1305 1306 /* PHY */ 1307 tmp = BWN_READ_2(mac, BWN_PHYVER); |
1292 phy->gmode = (tgshigh & BWN_TGSHIGH_HAVE_2GHZ) ? 1 : 0; | 1308 phy->gmode = !! (tgshigh & BWN_TGSHIGH_HAVE_2GHZ); |
1293 phy->rf_on = 1; 1294 phy->analog = (tmp & BWN_PHYVER_ANALOG) >> 12; 1295 phy->type = (tmp & BWN_PHYVER_TYPE) >> 8; 1296 phy->rev = (tmp & BWN_PHYVER_VERSION); 1297 if ((phy->type == BWN_PHYTYPE_A && phy->rev >= 4) || 1298 (phy->type == BWN_PHYTYPE_B && phy->rev != 2 && 1299 phy->rev != 4 && phy->rev != 6 && phy->rev != 7) || 1300 (phy->type == BWN_PHYTYPE_G && phy->rev > 9) || --- 639 unchanged lines hidden (view full) --- 1940 uint64_t hf; 1941 int error; 1942 1943 KASSERT(mac->mac_status == BWN_MAC_STATUS_UNINIT, 1944 ("%s:%d: fail", __func__, __LINE__)); 1945 1946 siba_powerup(sc->sc_dev, 0); 1947 if (!siba_dev_isup(sc->sc_dev)) | 1309 phy->rf_on = 1; 1310 phy->analog = (tmp & BWN_PHYVER_ANALOG) >> 12; 1311 phy->type = (tmp & BWN_PHYVER_TYPE) >> 8; 1312 phy->rev = (tmp & BWN_PHYVER_VERSION); 1313 if ((phy->type == BWN_PHYTYPE_A && phy->rev >= 4) || 1314 (phy->type == BWN_PHYTYPE_B && phy->rev != 2 && 1315 phy->rev != 4 && phy->rev != 6 && phy->rev != 7) || 1316 (phy->type == BWN_PHYTYPE_G && phy->rev > 9) || --- 639 unchanged lines hidden (view full) --- 1956 uint64_t hf; 1957 int error; 1958 1959 KASSERT(mac->mac_status == BWN_MAC_STATUS_UNINIT, 1960 ("%s:%d: fail", __func__, __LINE__)); 1961 1962 siba_powerup(sc->sc_dev, 0); 1963 if (!siba_dev_isup(sc->sc_dev)) |
1948 bwn_reset_core(mac, 1949 mac->mac_phy.gmode ? BWN_TGSLOW_SUPPORT_G : 0); | 1964 bwn_reset_core(mac, mac->mac_phy.gmode); |
1950 1951 mac->mac_flags &= ~BWN_MAC_FLAG_DFQVALID; 1952 mac->mac_flags |= BWN_MAC_FLAG_RADIO_ON; 1953 mac->mac_phy.hwpctl = (bwn_hwpctl) ? 1 : 0; 1954 BWN_GETTIME(mac->mac_phy.nexttime); 1955 mac->mac_phy.txerrors = BWN_TXERROR_MAX; 1956 bzero(&mac->mac_stats, sizeof(mac->mac_stats)); 1957 mac->mac_stats.link_noise = -95; --- 212 unchanged lines hidden (view full) --- 2170 } 2171 BWN_WRITE_4(mac, BWN_INTR_REASON, 0x00004000); 2172 BWN_WRITE_4(mac, BWN_DMA0_INTR_MASK, 0x0001dc00); 2173 BWN_WRITE_4(mac, BWN_DMA1_INTR_MASK, 0x0000dc00); 2174 BWN_WRITE_4(mac, BWN_DMA2_INTR_MASK, 0x0000dc00); 2175 BWN_WRITE_4(mac, BWN_DMA3_INTR_MASK, 0x0001dc00); 2176 BWN_WRITE_4(mac, BWN_DMA4_INTR_MASK, 0x0000dc00); 2177 BWN_WRITE_4(mac, BWN_DMA5_INTR_MASK, 0x0000dc00); | 1965 1966 mac->mac_flags &= ~BWN_MAC_FLAG_DFQVALID; 1967 mac->mac_flags |= BWN_MAC_FLAG_RADIO_ON; 1968 mac->mac_phy.hwpctl = (bwn_hwpctl) ? 1 : 0; 1969 BWN_GETTIME(mac->mac_phy.nexttime); 1970 mac->mac_phy.txerrors = BWN_TXERROR_MAX; 1971 bzero(&mac->mac_stats, sizeof(mac->mac_stats)); 1972 mac->mac_stats.link_noise = -95; --- 212 unchanged lines hidden (view full) --- 2185 } 2186 BWN_WRITE_4(mac, BWN_INTR_REASON, 0x00004000); 2187 BWN_WRITE_4(mac, BWN_DMA0_INTR_MASK, 0x0001dc00); 2188 BWN_WRITE_4(mac, BWN_DMA1_INTR_MASK, 0x0000dc00); 2189 BWN_WRITE_4(mac, BWN_DMA2_INTR_MASK, 0x0000dc00); 2190 BWN_WRITE_4(mac, BWN_DMA3_INTR_MASK, 0x0001dc00); 2191 BWN_WRITE_4(mac, BWN_DMA4_INTR_MASK, 0x0000dc00); 2192 BWN_WRITE_4(mac, BWN_DMA5_INTR_MASK, 0x0000dc00); |
2178 siba_write_4(sc->sc_dev, SIBA_TGSLOW, 2179 siba_read_4(sc->sc_dev, SIBA_TGSLOW) | 0x00100000); | 2193 2194 bwn_mac_phy_clock_set(mac, true); 2195 2196 /* SIBA powerup */ 2197 /* XXX TODO: BCMA powerup */ |
2180 BWN_WRITE_2(mac, BWN_POWERUP_DELAY, siba_get_cc_powerdelay(sc->sc_dev)); 2181 return (error); 2182} 2183 2184/* read hostflags */ 2185uint64_t 2186bwn_hf_read(struct bwn_mac *mac) 2187{ --- 2302 unchanged lines hidden (view full) --- 4490{ 4491 4492 bwn_mac_suspend(mac); 4493 mac->mac_phy.rf_onoff(mac, 0); 4494 mac->mac_phy.rf_on = 0; 4495 bwn_mac_enable(mac); 4496} 4497 | 2198 BWN_WRITE_2(mac, BWN_POWERUP_DELAY, siba_get_cc_powerdelay(sc->sc_dev)); 2199 return (error); 2200} 2201 2202/* read hostflags */ 2203uint64_t 2204bwn_hf_read(struct bwn_mac *mac) 2205{ --- 2302 unchanged lines hidden (view full) --- 4508{ 4509 4510 bwn_mac_suspend(mac); 4511 mac->mac_phy.rf_onoff(mac, 0); 4512 mac->mac_phy.rf_on = 0; 4513 bwn_mac_enable(mac); 4514} 4515 |
4516/* 4517 * SSB PHY reset. 4518 * 4519 * XXX TODO: BCMA PHY reset. 4520 */ |
|
4498static void 4499bwn_phy_reset(struct bwn_mac *mac) 4500{ 4501 struct bwn_softc *sc = mac->mac_sc; 4502 4503 siba_write_4(sc->sc_dev, SIBA_TGSLOW, 4504 ((siba_read_4(sc->sc_dev, SIBA_TGSLOW) & ~BWN_TGSLOW_SUPPORT_G) | 4505 BWN_TGSLOW_PHYRESET) | SIBA_TGSLOW_FGC); 4506 DELAY(1000); 4507 siba_write_4(sc->sc_dev, SIBA_TGSLOW, | 4521static void 4522bwn_phy_reset(struct bwn_mac *mac) 4523{ 4524 struct bwn_softc *sc = mac->mac_sc; 4525 4526 siba_write_4(sc->sc_dev, SIBA_TGSLOW, 4527 ((siba_read_4(sc->sc_dev, SIBA_TGSLOW) & ~BWN_TGSLOW_SUPPORT_G) | 4528 BWN_TGSLOW_PHYRESET) | SIBA_TGSLOW_FGC); 4529 DELAY(1000); 4530 siba_write_4(sc->sc_dev, SIBA_TGSLOW, |
4508 (siba_read_4(sc->sc_dev, SIBA_TGSLOW) & ~SIBA_TGSLOW_FGC) | 4509 BWN_TGSLOW_PHYRESET); | 4531 (siba_read_4(sc->sc_dev, SIBA_TGSLOW) & ~SIBA_TGSLOW_FGC)); |
4510 DELAY(1000); 4511} 4512 4513static int 4514bwn_newstate(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg) 4515{ 4516 struct bwn_vap *bvp = BWN_VAP(vap); 4517 struct ieee80211com *ic= vap->iv_ic; --- 2467 unchanged lines hidden --- | 4532 DELAY(1000); 4533} 4534 4535static int 4536bwn_newstate(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg) 4537{ 4538 struct bwn_vap *bvp = BWN_VAP(vap); 4539 struct ieee80211com *ic= vap->iv_ic; --- 2467 unchanged lines hidden --- |