Deleted Added
full compact
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 ---