Author: korli Date: 2011-04-12 00:48:42 +0200 (Tue, 12 Apr 2011) New Revision: 41240 Changeset: https://dev.haiku-os.org/changeset/41240 Added: haiku/trunk/src/libs/compat/freebsd_wlan/net80211/ieee80211_ratectl.c haiku/trunk/src/libs/compat/freebsd_wlan/net80211/ieee80211_ratectl_none.c Modified: haiku/trunk/src/add-ons/kernel/drivers/network/wlan/aironetwifi/dev/an/ haiku/trunk/src/add-ons/kernel/drivers/network/wlan/aironetwifi/dev/an/if_an.c haiku/trunk/src/add-ons/kernel/drivers/network/wlan/broadcom43xx/dev/bwi/ haiku/trunk/src/add-ons/kernel/drivers/network/wlan/broadcom43xx/dev/bwi/if_bwi.c haiku/trunk/src/add-ons/kernel/drivers/network/wlan/broadcom43xx/dev/bwi/if_bwi_pci.c haiku/trunk/src/add-ons/kernel/drivers/network/wlan/broadcom43xx/dev/bwi/if_bwivar.h haiku/trunk/src/add-ons/kernel/drivers/network/wlan/iprowifi2200/dev/iwi/ haiku/trunk/src/add-ons/kernel/drivers/network/wlan/iprowifi2200/dev/iwi/if_iwi.c haiku/trunk/src/add-ons/kernel/drivers/network/wlan/iprowifi2200/dev/iwi/if_iwivar.h haiku/trunk/src/add-ons/kernel/drivers/network/wlan/iprowifi3945/Jamfile haiku/trunk/src/add-ons/kernel/drivers/network/wlan/iprowifi3945/dev/wpi/ haiku/trunk/src/add-ons/kernel/drivers/network/wlan/iprowifi3945/dev/wpi/if_wpi.c haiku/trunk/src/add-ons/kernel/drivers/network/wlan/iprowifi3945/dev/wpi/if_wpivar.h haiku/trunk/src/add-ons/kernel/drivers/network/wlan/iprowifi3945/glue.c haiku/trunk/src/add-ons/kernel/drivers/network/wlan/iprowifi4965/Jamfile haiku/trunk/src/add-ons/kernel/drivers/network/wlan/iprowifi4965/dev/iwn/ haiku/trunk/src/add-ons/kernel/drivers/network/wlan/iprowifi4965/dev/iwn/if_iwn.c haiku/trunk/src/add-ons/kernel/drivers/network/wlan/iprowifi4965/dev/iwn/if_iwnreg.h haiku/trunk/src/add-ons/kernel/drivers/network/wlan/iprowifi4965/dev/iwn/if_iwnvar.h haiku/trunk/src/add-ons/kernel/drivers/network/wlan/iprowifi4965/glue.c haiku/trunk/src/add-ons/kernel/drivers/network/wlan/marvell88w8335/dev/malo/ haiku/trunk/src/add-ons/kernel/drivers/network/wlan/marvell88w8335/dev/malo/if_malo.c haiku/trunk/src/add-ons/kernel/drivers/network/wlan/marvell88w8335/dev/malo/if_malo_pci.c haiku/trunk/src/add-ons/kernel/drivers/network/wlan/marvell88w8363/dev/mwl/ haiku/trunk/src/add-ons/kernel/drivers/network/wlan/marvell88w8363/dev/mwl/if_mwl.c haiku/trunk/src/add-ons/kernel/drivers/network/wlan/marvell88w8363/dev/mwl/if_mwl_pci.c haiku/trunk/src/add-ons/kernel/drivers/network/wlan/ralinkwifi/dev/ral/ haiku/trunk/src/add-ons/kernel/drivers/network/wlan/ralinkwifi/dev/ral/rt2560.c haiku/trunk/src/add-ons/kernel/drivers/network/wlan/ralinkwifi/dev/ral/rt2560var.h haiku/trunk/src/add-ons/kernel/drivers/network/wlan/ralinkwifi/dev/ral/rt2661.c haiku/trunk/src/add-ons/kernel/drivers/network/wlan/ralinkwifi/dev/ral/rt2661var.h haiku/trunk/src/add-ons/kernel/drivers/network/wlan/wavelanwifi/dev/wi/ haiku/trunk/src/add-ons/kernel/drivers/network/wlan/wavelanwifi/dev/wi/if_wi.c haiku/trunk/src/libs/compat/freebsd_network/compat/net/if_var.h haiku/trunk/src/libs/compat/freebsd_network/if.c haiku/trunk/src/libs/compat/freebsd_wlan/net80211/ haiku/trunk/src/libs/compat/freebsd_wlan/net80211/Jamfile haiku/trunk/src/libs/compat/freebsd_wlan/net80211/ieee80211.c haiku/trunk/src/libs/compat/freebsd_wlan/net80211/ieee80211_action.c haiku/trunk/src/libs/compat/freebsd_wlan/net80211/ieee80211_adhoc.c haiku/trunk/src/libs/compat/freebsd_wlan/net80211/ieee80211_amrr.c haiku/trunk/src/libs/compat/freebsd_wlan/net80211/ieee80211_amrr.h haiku/trunk/src/libs/compat/freebsd_wlan/net80211/ieee80211_crypto_tkip.c haiku/trunk/src/libs/compat/freebsd_wlan/net80211/ieee80211_haiku.h haiku/trunk/src/libs/compat/freebsd_wlan/net80211/ieee80211_hostap.c haiku/trunk/src/libs/compat/freebsd_wlan/net80211/ieee80211_hwmp.c haiku/trunk/src/libs/compat/freebsd_wlan/net80211/ieee80211_input.c haiku/trunk/src/libs/compat/freebsd_wlan/net80211/ieee80211_ioctl.c haiku/trunk/src/libs/compat/freebsd_wlan/net80211/ieee80211_mesh.c haiku/trunk/src/libs/compat/freebsd_wlan/net80211/ieee80211_mesh.h haiku/trunk/src/libs/compat/freebsd_wlan/net80211/ieee80211_node.h haiku/trunk/src/libs/compat/freebsd_wlan/net80211/ieee80211_output.c haiku/trunk/src/libs/compat/freebsd_wlan/net80211/ieee80211_proto.c haiku/trunk/src/libs/compat/freebsd_wlan/net80211/ieee80211_proto.h haiku/trunk/src/libs/compat/freebsd_wlan/net80211/ieee80211_ratectl.h haiku/trunk/src/libs/compat/freebsd_wlan/net80211/ieee80211_rssadapt.c haiku/trunk/src/libs/compat/freebsd_wlan/net80211/ieee80211_rssadapt.h haiku/trunk/src/libs/compat/freebsd_wlan/net80211/ieee80211_scan_sta.c haiku/trunk/src/libs/compat/freebsd_wlan/net80211/ieee80211_sta.c haiku/trunk/src/libs/compat/freebsd_wlan/net80211/ieee80211_tdma.c haiku/trunk/src/libs/compat/freebsd_wlan/net80211/ieee80211_var.h haiku/trunk/src/libs/compat/freebsd_wlan/net80211/ieee80211_wds.c Log: merged changes from 8.2 FreeBSD release for most wlan drivers and net80211. updated several firmwares for iprowifi4965 and iprowifi3945. Tested on iprowifi4965 only. Property changes on: haiku/trunk/src/add-ons/kernel/drivers/network/wlan/aironetwifi/dev/an ___________________________________________________________________ Added: svn:mergeinfo + /haiku/vendor/freebsd/RELEASE_8_2_0/dev/an:41235 /haiku/vendor/freebsd/current/dev/an:34496-41234 Modified: haiku/trunk/src/add-ons/kernel/drivers/network/wlan/aironetwifi/dev/an/if_an.c =================================================================== --- haiku/trunk/src/add-ons/kernel/drivers/network/wlan/aironetwifi/dev/an/if_an.c 2011-04-11 22:30:18 UTC (rev 41239) +++ haiku/trunk/src/add-ons/kernel/drivers/network/wlan/aironetwifi/dev/an/if_an.c 2011-04-11 22:48:42 UTC (rev 41240) @@ -773,8 +773,8 @@ ifp->if_watchdog = an_watchdog; ifp->if_init = an_init; ifp->if_baudrate = 10000000; - IFQ_SET_MAXLEN(&ifp->if_snd, IFQ_MAXLEN); - ifp->if_snd.ifq_drv_maxlen = IFQ_MAXLEN; + IFQ_SET_MAXLEN(&ifp->if_snd, ifqmaxlen); + ifp->if_snd.ifq_drv_maxlen = ifqmaxlen; IFQ_SET_READY(&ifp->if_snd); bzero(sc->an_config.an_nodename, sizeof(sc->an_config.an_nodename)); Property changes on: haiku/trunk/src/add-ons/kernel/drivers/network/wlan/broadcom43xx/dev/bwi ___________________________________________________________________ Added: svn:mergeinfo + /haiku/vendor/freebsd/RELEASE_8_2_0/dev/bwi:41230-41235 /haiku/vendor/freebsd/current/dev/bwi:34314-41229 Modified: haiku/trunk/src/add-ons/kernel/drivers/network/wlan/broadcom43xx/dev/bwi/if_bwi.c =================================================================== --- haiku/trunk/src/add-ons/kernel/drivers/network/wlan/broadcom43xx/dev/bwi/if_bwi.c 2011-04-11 22:30:18 UTC (rev 41239) +++ haiku/trunk/src/add-ons/kernel/drivers/network/wlan/broadcom43xx/dev/bwi/if_bwi.c 2011-04-11 22:48:42 UTC (rev 41240) @@ -64,8 +64,8 @@ #include <net80211/ieee80211_var.h> #include <net80211/ieee80211_radiotap.h> #include <net80211/ieee80211_regdomain.h> -#include <net80211/ieee80211_amrr.h> #include <net80211/ieee80211_phy.h> +#include <net80211/ieee80211_ratectl.h> #include <net/bpf.h> @@ -112,9 +112,6 @@ static void bwi_scan_end(struct ieee80211com *); static int bwi_newstate(struct ieee80211vap *, enum ieee80211_state, int); static void bwi_updateslot(struct ifnet *); -static struct ieee80211_node *bwi_node_alloc(struct ieee80211vap *, - const uint8_t [IEEE80211_ADDR_LEN]); -static void bwi_newassoc(struct ieee80211_node *, int); static int bwi_media_change(struct ifnet *); static void bwi_calibrate(void *); @@ -465,8 +462,8 @@ ifp->if_ioctl = bwi_ioctl; ifp->if_start = bwi_start; ifp->if_watchdog = bwi_watchdog; - IFQ_SET_MAXLEN(&ifp->if_snd, IFQ_MAXLEN); - ifp->if_snd.ifq_drv_maxlen = IFQ_MAXLEN; + IFQ_SET_MAXLEN(&ifp->if_snd, ifqmaxlen); + ifp->if_snd.ifq_drv_maxlen = ifqmaxlen; IFQ_SET_READY(&ifp->if_snd); /* @@ -525,7 +522,6 @@ ic->ic_vap_delete = bwi_vap_delete; ic->ic_raw_xmit = bwi_raw_xmit; ic->ic_updateslot = bwi_updateslot; - ic->ic_node_alloc = bwi_node_alloc; ic->ic_scan_start = bwi_scan_start; ic->ic_scan_end = bwi_scan_end; ic->ic_set_channel = bwi_set_channel; @@ -620,10 +616,7 @@ #if 0 vap->iv_update_beacon = bwi_beacon_update; #endif - ieee80211_amrr_init(&bvp->bv_amrr, vap, - IEEE80211_AMRR_MIN_SUCCESS_THRESHOLD, - IEEE80211_AMRR_MAX_SUCCESS_THRESHOLD, - 500 /*ms*/); + ieee80211_ratectl_init(vap); /* complete setup */ ieee80211_vap_attach(vap, bwi_media_change, ieee80211_media_status); @@ -636,7 +629,7 @@ { struct bwi_vap *bvp = BWI_VAP(vap); - ieee80211_amrr_cleanup(&bvp->bv_amrr); + ieee80211_ratectl_deinit(vap); ieee80211_vap_detach(vap); free(bvp, M_80211_VAP); } @@ -1782,7 +1775,6 @@ enum ieee80211_state ostate = vap->iv_state; struct bwi_softc *sc = ifp->if_softc; struct bwi_mac *mac; - struct ieee80211_node *ni = vap->iv_bss; int error; BWI_LOCK(sc); @@ -1830,10 +1822,6 @@ #else sc->sc_txpwrcb_type = BWI_TXPWR_CALIB; #endif - if (vap->iv_opmode == IEEE80211_M_STA) { - /* fake a join to init the tx rate */ - bwi_newassoc(ni, 1); - } callout_reset(&sc->sc_calib_ch, hz, bwi_calibrate, sc); } @@ -1843,25 +1831,6 @@ return error; } -/* ARGUSED */ -static struct ieee80211_node * -bwi_node_alloc(struct ieee80211vap *vap, const uint8_t mac[IEEE80211_ADDR_LEN]) -{ - struct bwi_node *bn; - - bn = malloc(sizeof(struct bwi_node), M_80211_NODE, M_NOWAIT | M_ZERO); - return bn != NULL ? &bn->ni : NULL; -} - -static void -bwi_newassoc(struct ieee80211_node *ni, int isnew) -{ - struct ieee80211vap *vap = ni->ni_vap; - - ieee80211_amrr_node_init(&BWI_VAP(vap)->bv_amrr, - &BWI_NODE(ni)->amn, ni); -} - static int bwi_media_change(struct ifnet *ifp) { @@ -3013,7 +2982,7 @@ } else if (tp->ucastrate != IEEE80211_FIXED_RATE_NONE) { rate = rate_fb = tp->ucastrate; } else { - rix = ieee80211_amrr_choose(ni, &BWI_NODE(ni)->amn); + rix = ieee80211_ratectl_rate(ni, NULL, pkt_len); rate = ni->ni_txrate; if (rix > 0) { @@ -3370,6 +3339,7 @@ struct bwi_txbuf *tb; int ring_idx, buf_idx; struct ieee80211_node *ni; + struct ieee80211vap *vap; if (tx_id == 0) { if_printf(ifp, "%s: zero tx id\n", __func__); @@ -3395,9 +3365,9 @@ ni = tb->tb_ni; if (tb->tb_ni != NULL) { - struct bwi_node *bn = (struct bwi_node *) tb->tb_ni; const struct bwi_txbuf_hdr *hdr = mtod(tb->tb_mbuf, const struct bwi_txbuf_hdr *); + vap = ni->ni_vap; /* NB: update rate control only for unicast frames */ if (hdr->txh_mac_ctrl & htole32(BWI_TXH_MAC_C_ACK)) { @@ -3408,8 +3378,9 @@ * well so to avoid over-aggressive downshifting we * treat any number of retries as "1". */ - ieee80211_amrr_tx_complete(&bn->amn, acked, - data_txcnt > 1); + ieee80211_ratectl_tx_complete(vap, ni, + (data_txcnt > 1) ? IEEE80211_RATECTL_TX_SUCCESS : + IEEE80211_RATECTL_TX_FAILURE, &acked, NULL); } /* Modified: haiku/trunk/src/add-ons/kernel/drivers/network/wlan/broadcom43xx/dev/bwi/if_bwi_pci.c =================================================================== --- haiku/trunk/src/add-ons/kernel/drivers/network/wlan/broadcom43xx/dev/bwi/if_bwi_pci.c 2011-04-11 22:30:18 UTC (rev 41239) +++ haiku/trunk/src/add-ons/kernel/drivers/network/wlan/broadcom43xx/dev/bwi/if_bwi_pci.c 2011-04-11 22:48:42 UTC (rev 41240) @@ -92,7 +92,7 @@ { PCI_VENDOR_BROADCOM, 0x4318,"Broadcom BCM4318 802.11b/g Wireless Lan" }, { PCI_VENDOR_BROADCOM, 0x4319,"Broadcom BCM4318 802.11a/b/g Wireless Lan" }, { PCI_VENDOR_BROADCOM, 0x431a,"Broadcom BCM4318 802.11a Wireless Lan" }, - { 0, 0, NULL} + { 0, 0, NULL } }; static int Modified: haiku/trunk/src/add-ons/kernel/drivers/network/wlan/broadcom43xx/dev/bwi/if_bwivar.h =================================================================== --- haiku/trunk/src/add-ons/kernel/drivers/network/wlan/broadcom43xx/dev/bwi/if_bwivar.h 2011-04-11 22:30:18 UTC (rev 41239) +++ haiku/trunk/src/add-ons/kernel/drivers/network/wlan/broadcom43xx/dev/bwi/if_bwivar.h 2011-04-11 22:48:42 UTC (rev 41240) @@ -533,15 +533,8 @@ /* TODO: sq */ }; -struct bwi_node { - struct ieee80211_node ni; /* must be the first */ - struct ieee80211_amrr_node amn; -}; -#define BWI_NODE(ni) ((struct bwi_node *)(ni)) - struct bwi_vap { struct ieee80211vap bv_vap; - struct ieee80211_amrr bv_amrr; int (*bv_newstate)(struct ieee80211vap *, enum ieee80211_state, int); }; Property changes on: haiku/trunk/src/add-ons/kernel/drivers/network/wlan/iprowifi2200/dev/iwi ___________________________________________________________________ Added: svn:mergeinfo + /haiku/vendor/freebsd/RELEASE_8_2_0/dev/iwi:41234-41235 /haiku/vendor/freebsd/current/dev/iwi:34314-41233 Modified: haiku/trunk/src/add-ons/kernel/drivers/network/wlan/iprowifi2200/dev/iwi/if_iwi.c =================================================================== --- haiku/trunk/src/add-ons/kernel/drivers/network/wlan/iprowifi2200/dev/iwi/if_iwi.c 2011-04-11 22:30:18 UTC (rev 41239) +++ haiku/trunk/src/add-ons/kernel/drivers/network/wlan/iprowifi2200/dev/iwi/if_iwi.c 2011-04-11 22:48:42 UTC (rev 41240) @@ -180,6 +180,7 @@ static int iwi_config(struct iwi_softc *); static int iwi_get_firmware(struct iwi_softc *, enum ieee80211_opmode); static void iwi_put_firmware(struct iwi_softc *); +static void iwi_monitor_scan(void *, int); static int iwi_scanchan(struct iwi_softc *, unsigned long, int); static void iwi_scan_start(struct ieee80211com *); static void iwi_scan_end(struct ieee80211com *); @@ -292,6 +293,7 @@ TASK_INIT(&sc->sc_restarttask, 0, iwi_restart, sc); TASK_INIT(&sc->sc_disassoctask, 0, iwi_disassoc, sc); TASK_INIT(&sc->sc_wmetask, 0, iwi_update_wme, sc); + TASK_INIT(&sc->sc_monitortask, 0, iwi_monitor_scan, sc); callout_init_mtx(&sc->sc_wdtimer, &sc->sc_mtx, 0); callout_init_mtx(&sc->sc_rftimer, &sc->sc_mtx, 0); @@ -363,8 +365,8 @@ ifp->if_init = iwi_init; ifp->if_ioctl = iwi_ioctl; ifp->if_start = iwi_start; - IFQ_SET_MAXLEN(&ifp->if_snd, IFQ_MAXLEN); - ifp->if_snd.ifq_drv_maxlen = IFQ_MAXLEN; + IFQ_SET_MAXLEN(&ifp->if_snd, ifqmaxlen); + ifp->if_snd.ifq_drv_maxlen = ifqmaxlen; IFQ_SET_READY(&ifp->if_snd); ic->ic_ifp = ifp; @@ -460,6 +462,7 @@ ieee80211_draintask(ic, &sc->sc_radiofftask); ieee80211_draintask(ic, &sc->sc_restarttask); ieee80211_draintask(ic, &sc->sc_disassoctask); + ieee80211_draintask(ic, &sc->sc_monitortask); iwi_stop(sc); @@ -988,7 +991,8 @@ * This is all totally bogus and needs to be redone. */ iwi_auth_and_assoc(sc, vap); - } + } else if (vap->iv_opmode == IEEE80211_M_MONITOR) + ieee80211_runtask(ic, &sc->sc_monitortask); break; case IEEE80211_S_ASSOC: /* @@ -1364,7 +1368,7 @@ ni = vap->iv_bss; ni->ni_capinfo = capinfo; - ni->ni_associd = associd; + ni->ni_associd = associd & 0x3fff; if (wme != NULL) ni->ni_flags |= IEEE80211_NODE_QOS; else @@ -1407,6 +1411,18 @@ IWI_STATE_END(sc, IWI_FW_SCANNING); + /* + * Monitor mode works by doing a passive scan to set + * the channel and enable rx. Because we don't want + * to abort a scan lest the firmware crash we scan + * for a short period of time and automatically restart + * the scan when notified the sweep has completed. + */ + if (vap->iv_opmode == IEEE80211_M_MONITOR) { + ieee80211_runtask(ic, &sc->sc_monitortask); + break; + } + if (scan->status == IWI_SCAN_COMPLETED) { /* NB: don't need to defer, net80211 does it for us */ ieee80211_scan_next(vap); @@ -1467,7 +1483,7 @@ IWI_STATE_END(sc, IWI_FW_ASSOCIATING); iwi_checkforqos(vap, (const struct ieee80211_frame *)(assoc+1), - le16toh(notif->len) - sizeof(*assoc)); + le16toh(notif->len) - sizeof(*assoc) - 1); ieee80211_new_state(vap, IEEE80211_S_RUN, -1); break; case IWI_ASSOC_INIT: @@ -2561,6 +2577,11 @@ config.answer_pbreq = (ic->ic_opmode == IEEE80211_M_IBSS) ? 1 : 0; config.disable_unicast_decryption = 1; config.disable_multicast_decryption = 1; + if (ic->ic_opmode == IEEE80211_M_MONITOR) { + config.allow_invalid_frames = 1; + config.allow_beacon_and_probe_resp = 1; + config.allow_mgt = 1; + } DPRINTF(("Configuring adapter\n")); error = iwi_cmd(sc, IWI_CMD_SET_CONFIG, &config, sizeof config); if (error != 0) @@ -2646,6 +2667,17 @@ return IEEE80211_IS_CHAN_5GHZ(c) ? IWI_CHAN_5GHZ : IWI_CHAN_2GHZ; } +static void +iwi_monitor_scan(void *arg, int npending) +{ + struct iwi_softc *sc = arg; + IWI_LOCK_DECL; + + IWI_LOCK(sc); + (void) iwi_scanchan(sc, 2000, 0); + IWI_UNLOCK(sc); +} + /* * Start a scan on the current channel or all channels. */ Modified: haiku/trunk/src/add-ons/kernel/drivers/network/wlan/iprowifi2200/dev/iwi/if_iwivar.h =================================================================== --- haiku/trunk/src/add-ons/kernel/drivers/network/wlan/iprowifi2200/dev/iwi/if_iwivar.h 2011-04-11 22:30:18 UTC (rev 41239) +++ haiku/trunk/src/add-ons/kernel/drivers/network/wlan/iprowifi2200/dev/iwi/if_iwivar.h 2011-04-11 22:48:42 UTC (rev 41240) @@ -193,6 +193,7 @@ struct task sc_restarttask; /* restart adapter processing */ struct task sc_disassoctask; struct task sc_wmetask; /* set wme parameters */ + struct task sc_monitortask; unsigned int sc_softled : 1, /* enable LED gpio status */ sc_ledstate: 1, /* LED on/off state */ Modified: haiku/trunk/src/add-ons/kernel/drivers/network/wlan/iprowifi3945/Jamfile =================================================================== --- haiku/trunk/src/add-ons/kernel/drivers/network/wlan/iprowifi3945/Jamfile 2011-04-11 22:30:18 UTC (rev 41239) +++ haiku/trunk/src/add-ons/kernel/drivers/network/wlan/iprowifi3945/Jamfile 2011-04-11 22:48:42 UTC (rev 41240) @@ -23,7 +23,7 @@ libfreebsd_network.a ; -HAIKU_WIFI_FIRMWARE_PACKAGE on iprowifi3945 = iwlwifi-3945-ucode-2.14.1.5 ; -HAIKU_WIFI_FIRMWARE_ARCHIVE on iprowifi3945 = iwlwifi-3945-ucode-2.14.1.5.tgz ; +HAIKU_WIFI_FIRMWARE_PACKAGE on iprowifi3945 = iwlwifi-3945-ucode-15.32.2.9 ; +HAIKU_WIFI_FIRMWARE_ARCHIVE on iprowifi3945 = iwlwifi-3945-ucode-15.32.2.9.tgz ; HAIKU_WIFI_FIRMWARE_DO_EXTRACT on iprowifi3945 = true ; Property changes on: haiku/trunk/src/add-ons/kernel/drivers/network/wlan/iprowifi3945/dev/wpi ___________________________________________________________________ Added: svn:mergeinfo + /haiku/vendor/freebsd/RELEASE_8_2_0/dev/wpi:41231-41235 /haiku/vendor/freebsd/current/dev/wpi:34314-41230 Modified: haiku/trunk/src/add-ons/kernel/drivers/network/wlan/iprowifi3945/dev/wpi/if_wpi.c =================================================================== --- haiku/trunk/src/add-ons/kernel/drivers/network/wlan/iprowifi3945/dev/wpi/if_wpi.c 2011-04-11 22:30:18 UTC (rev 41239) +++ haiku/trunk/src/add-ons/kernel/drivers/network/wlan/iprowifi3945/dev/wpi/if_wpi.c 2011-04-11 22:48:42 UTC (rev 41240) @@ -93,6 +93,7 @@ #include <net80211/ieee80211_var.h> #include <net80211/ieee80211_radiotap.h> #include <net80211/ieee80211_regdomain.h> +#include <net80211/ieee80211_ratectl.h> #include <netinet/in.h> #include <netinet/in_systm.h> @@ -126,7 +127,7 @@ WPI_DEBUG_ANY = 0xffffffff }; -static int wpi_debug = 1; +static int wpi_debug = 0; SYSCTL_INT(_debug, OID_AUTO, wpi, CTLFLAG_RW, &wpi_debug, 0, "wpi debug level"); TUNABLE_INT("debug.wpi", &wpi_debug); @@ -173,8 +174,6 @@ int, int); static void wpi_reset_tx_ring(struct wpi_softc *, struct wpi_tx_ring *); static void wpi_free_tx_ring(struct wpi_softc *, struct wpi_tx_ring *); -static struct ieee80211_node *wpi_node_alloc(struct ieee80211vap *, - const uint8_t mac[IEEE80211_ADDR_LEN]); static int wpi_newstate(struct ieee80211vap *, enum ieee80211_state, int); static void wpi_mem_lock(struct wpi_softc *); static void wpi_mem_unlock(struct wpi_softc *); @@ -235,7 +234,6 @@ static void wpi_stop(struct wpi_softc *); static void wpi_stop_locked(struct wpi_softc *); -static void wpi_newassoc(struct ieee80211_node *, int); static int wpi_set_txpower(struct wpi_softc *, struct ieee80211_channel *, int); static void wpi_calib_timeout(void *); @@ -665,14 +663,12 @@ ifp->if_init = wpi_init; ifp->if_ioctl = wpi_ioctl; ifp->if_start = wpi_start; - IFQ_SET_MAXLEN(&ifp->if_snd, IFQ_MAXLEN); - ifp->if_snd.ifq_drv_maxlen = IFQ_MAXLEN; + IFQ_SET_MAXLEN(&ifp->if_snd, ifqmaxlen); + ifp->if_snd.ifq_drv_maxlen = ifqmaxlen; IFQ_SET_READY(&ifp->if_snd); ieee80211_ifattach(ic, macaddr); /* override default methods */ - ic->ic_node_alloc = wpi_node_alloc; - ic->ic_newassoc = wpi_newassoc; ic->ic_raw_xmit = wpi_raw_xmit; ic->ic_wme.wme_update = wpi_wme_update; ic->ic_scan_start = wpi_scan_start; @@ -716,13 +712,14 @@ { struct wpi_softc *sc = device_get_softc(dev); struct ifnet *ifp = sc->sc_ifp; - struct ieee80211com *ic = ifp->if_l2com; + struct ieee80211com *ic; int ac; - ieee80211_draintask(ic, &sc->sc_restarttask); - ieee80211_draintask(ic, &sc->sc_radiotask); + if (ifp != NULL) { + ic = ifp->if_l2com; - if (ifp != NULL) { + ieee80211_draintask(ic, &sc->sc_restarttask); + ieee80211_draintask(ic, &sc->sc_radiotask); wpi_stop(sc); callout_drain(&sc->watchdog_to); callout_drain(&sc->calib_to); @@ -786,11 +783,7 @@ wvp->newstate = vap->iv_newstate; vap->iv_newstate = wpi_newstate; - ieee80211_amrr_init(&wvp->amrr, vap, - IEEE80211_AMRR_MIN_SUCCESS_THRESHOLD, - IEEE80211_AMRR_MAX_SUCCESS_THRESHOLD, - 500 /*ms*/); - + ieee80211_ratectl_init(vap); /* complete setup */ ieee80211_vap_attach(vap, ieee80211_media_change, ieee80211_media_status); ic->ic_opmode = opmode; @@ -802,7 +795,7 @@ { struct wpi_vap *wvp = WPI_VAP(vap); - ieee80211_amrr_cleanup(&wvp->amrr); + ieee80211_ratectl_deinit(vap); ieee80211_vap_detach(vap); free(wvp, M_80211_VAP); } @@ -1062,9 +1055,18 @@ wpi_dma_contig_free(&ring->desc_dma); - for (i = 0; i < WPI_RX_RING_COUNT; i++) - if (ring->data[i].m != NULL) - m_freem(ring->data[i].m); + for (i = 0; i < WPI_RX_RING_COUNT; i++) { + struct wpi_rx_data *data = &ring->data[i]; + + if (data->m != NULL) { + bus_dmamap_sync(ring->data_dmat, data->map, + BUS_DMASYNC_POSTREAD); + bus_dmamap_unload(ring->data_dmat, data->map); + m_freem(data->m); + } + if (data->map != NULL) + bus_dmamap_destroy(ring->data_dmat, data->map); + } } static int @@ -1240,18 +1242,6 @@ return 0; } -/* ARGSUSED */ -static struct ieee80211_node * -wpi_node_alloc(struct ieee80211vap *vap __unused, - const uint8_t mac[IEEE80211_ADDR_LEN] __unused) -{ - struct wpi_node *wn; - - wn = malloc(sizeof (struct wpi_node), M_80211_NODE, M_NOWAIT | M_ZERO); - - return &wn->ni; -} - /** * Called by net80211 when ever there is a change to 80211 state machine */ @@ -1270,8 +1260,25 @@ IEEE80211_UNLOCK(ic); WPI_LOCK(sc); - if (nstate == IEEE80211_S_AUTH) { - /* The node must be registered in the firmware before auth */ + if (nstate == IEEE80211_S_SCAN && vap->iv_state != IEEE80211_S_INIT) { + /* + * On !INIT -> SCAN transitions, we need to clear any possible + * knowledge about associations. + */ + error = wpi_config(sc); + if (error != 0) { + device_printf(sc->sc_dev, + "%s: device config failed, error %d\n", + __func__, error); + } + } + if (nstate == IEEE80211_S_AUTH || + (nstate == IEEE80211_S_ASSOC && vap->iv_state == IEEE80211_S_RUN)) { + /* + * The node must be registered in the firmware before auth. + * Also the associd must be cleared on RUN -> ASSOC + * transitions. + */ error = wpi_auth(sc, vap); if (error != 0) { device_printf(sc->sc_dev, @@ -1466,6 +1473,7 @@ return; } + bus_dmamap_sync(ring->data_dmat, data->map, BUS_DMASYNC_POSTREAD); head = (struct wpi_rx_head *)((caddr_t)(stat + 1) + stat->len); tail = (struct wpi_rx_tail *)((caddr_t)(head + 1) + le16toh(head->len)); @@ -1496,6 +1504,8 @@ ifp->if_ierrors++; return; } + bus_dmamap_unload(ring->data_dmat, data->map); + error = bus_dmamap_load(ring->data_dmat, data->map, mtod(mnew, caddr_t), MJUMPAGESIZE, wpi_dma_map_addr, &paddr, BUS_DMA_NOWAIT); @@ -1571,7 +1581,9 @@ struct wpi_tx_ring *ring = &sc->txq[desc->qid & 0x3]; struct wpi_tx_data *txdata = &ring->data[desc->idx]; struct wpi_tx_stat *stat = (struct wpi_tx_stat *)(desc + 1); - struct wpi_node *wn = (struct wpi_node *)txdata->ni; + struct ieee80211_node *ni = txdata->ni; + struct ieee80211vap *vap = ni->ni_vap; + int retrycnt = 0; DPRINTFN(WPI_DEBUG_TX, ("tx done: qid=%d idx=%d retries=%d nkill=%d " "rate=%x duration=%d status=%x\n", desc->qid, desc->idx, @@ -1584,11 +1596,12 @@ * the lowest available bit-rate. * XXX frames w/o ACK shouldn't be used either */ - wn->amn.amn_txcnt++; if (stat->ntries > 0) { DPRINTFN(WPI_DEBUG_TX, ("%d retries\n", stat->ntries)); - wn->amn.amn_retrycnt++; + retrycnt = 1; } + ieee80211_ratectl_tx_complete(vap, ni, IEEE80211_RATECTL_TX_SUCCESS, + &retrycnt, NULL); /* XXX oerrors should only count errors !maxtries */ if ((le32toh(stat->status) & 0xff) != 1) @@ -1647,9 +1660,15 @@ struct wpi_rx_data *data; uint32_t hw; + bus_dmamap_sync(sc->shared_dma.tag, sc->shared_dma.map, + BUS_DMASYNC_POSTREAD); + hw = le32toh(sc->shared->next); while (sc->rxq.cur != hw) { data = &sc->rxq.data[sc->rxq.cur]; + + bus_dmamap_sync(sc->rxq.data_dmat, data->map, + BUS_DMASYNC_POSTREAD); desc = (void *)data->m->m_ext.ext_buf; DPRINTFN(WPI_DEBUG_NOTIFY, @@ -1928,7 +1947,7 @@ } else if (tp->ucastrate != IEEE80211_FIXED_RATE_NONE) { rate = tp->ucastrate; } else { - (void) ieee80211_amrr_choose(ni, &WPI_NODE(ni)->amn); + (void) ieee80211_ratectl_rate(ni, NULL, 0); rate = ni->ni_txrate; } tx->rate = wpi_plcp_signal(rate); @@ -2436,6 +2455,9 @@ if (IEEE80211_IS_CHAN_2GHZ(ni->ni_chan)) { sc->config.flags |= htole32(WPI_CONFIG_AUTO | WPI_CONFIG_24GHZ); + } else { + sc->config.flags &= ~htole32(WPI_CONFIG_AUTO | + WPI_CONFIG_24GHZ); } if (IEEE80211_IS_CHAN_A(ni->ni_chan)) { sc->config.cck_mask = 0; @@ -3011,14 +3033,12 @@ if (ntries == 1000) { device_printf(sc->sc_dev, "timeout waiting for thermal calibration\n"); - WPI_UNLOCK(sc); return; } DPRINTFN(WPI_DEBUG_TEMP,("temperature %d\n", sc->temp)); if (wpi_config(sc) != 0) { device_printf(sc->sc_dev, "device config failed\n"); - WPI_UNLOCK(sc); return; } @@ -3221,15 +3241,6 @@ } static void -wpi_newassoc(struct ieee80211_node *ni, int isnew) -{ - struct ieee80211vap *vap = ni->ni_vap; - struct wpi_vap *wvp = WPI_VAP(vap); - - ieee80211_amrr_node_init(&wvp->amrr, &WPI_NODE(ni)->amn, ni); -} - -static void wpi_calib_timeout(void *arg) { struct wpi_softc *sc = arg; @@ -3562,7 +3573,9 @@ * are already taken care of by their respective firmware commands. */ if (ic->ic_opmode == IEEE80211_M_MONITOR) { + WPI_LOCK(sc); error = wpi_config(sc); + WPI_UNLOCK(sc); if (error != 0) device_printf(sc->sc_dev, "error %d settting channel\n", error); @@ -3715,4 +3728,3 @@ MODULE_DEPEND(wpi, pci, 1, 1, 1); MODULE_DEPEND(wpi, wlan, 1, 1, 1); MODULE_DEPEND(wpi, firmware, 1, 1, 1); -MODULE_DEPEND(wpi, wlan_amrr, 1, 1, 1); Modified: haiku/trunk/src/add-ons/kernel/drivers/network/wlan/iprowifi3945/dev/wpi/if_wpivar.h =================================================================== --- haiku/trunk/src/add-ons/kernel/drivers/network/wlan/iprowifi3945/dev/wpi/if_wpivar.h 2011-04-11 22:30:18 UTC (rev 41239) +++ haiku/trunk/src/add-ons/kernel/drivers/network/wlan/iprowifi3945/dev/wpi/if_wpivar.h 2011-04-11 22:48:42 UTC (rev 41240) @@ -106,12 +106,6 @@ int recovery; }; -struct wpi_node { - struct ieee80211_node ni; /* must be the first */ - struct ieee80211_amrr_node amn; -}; -#define WPI_NODE(ni) ((struct wpi_node *)(ni)) - struct wpi_power_sample { uint8_t index; int8_t power; @@ -127,7 +121,6 @@ struct wpi_vap { struct ieee80211vap vap; - struct ieee80211_amrr amrr; int (*newstate)(struct ieee80211vap *, enum ieee80211_state, int); Modified: haiku/trunk/src/add-ons/kernel/drivers/network/wlan/iprowifi3945/glue.c =================================================================== --- haiku/trunk/src/add-ons/kernel/drivers/network/wlan/iprowifi3945/glue.c 2011-04-11 22:30:18 UTC (rev 41239) +++ haiku/trunk/src/add-ons/kernel/drivers/network/wlan/iprowifi3945/glue.c 2011-04-11 22:48:42 UTC (rev 41240) @@ -23,7 +23,7 @@ NO_HAIKU_REENABLE_INTERRUPTS(); HAIKU_DRIVER_REQUIREMENTS(FBSD_TASKQUEUES | FBSD_WLAN); HAIKU_FIRMWARE_VERSION(2144); -HAIKU_FIRMWARE_NAME_MAP(1) = {{"wpifw", "iwlwifi-3945-1.ucode"}}; +HAIKU_FIRMWARE_NAME_MAP(1) = {{"wpifw", "iwlwifi-3945-2.ucode"}}; int Modified: haiku/trunk/src/add-ons/kernel/drivers/network/wlan/iprowifi4965/Jamfile =================================================================== --- haiku/trunk/src/add-ons/kernel/drivers/network/wlan/iprowifi4965/Jamfile 2011-04-11 22:30:18 UTC (rev 41239) +++ haiku/trunk/src/add-ons/kernel/drivers/network/wlan/iprowifi4965/Jamfile 2011-04-11 22:48:42 UTC (rev 41240) @@ -25,12 +25,14 @@ ; HAIKU_WIFI_FIRMWARE_PACKAGES on iprowifi4965 = - iwlwifi-1000-ucode-128.50.3.1 iwlwifi-4965-ucode-228.61.2.24 - iwlwifi-5000-ucode-8.24.2.12 iwlwifi-5150-ucode-8.24.2.2 - iwlwifi-6000-ucode-9.221.4.1 iwlwifi-6050-ucode-9.201.4.1 ; + iwlwifi-1000-ucode-39.31.5.1 iwlwifi-4965-ucode-228.61.2.24 + iwlwifi-5000-ucode-8.83.5.1 iwlwifi-5150-ucode-8.24.2.2 + iwlwifi-6000-ucode-9.221.4.1 iwlwifi-6000g2a-ucode-17.168.5.2 + iwlwifi-6050-ucode-41.28.5.1 ; HAIKU_WIFI_FIRMWARE_ARCHIVES on iprowifi4965 = - iwlwifi-1000-ucode-128.50.3.1.tgz iwlwifi-4965-ucode-228.61.2.24.tgz - iwlwifi-5000-ucode-8.24.2.12.tgz iwlwifi-5150-ucode-8.24.2.2.tgz - iwlwifi-6000-ucode-9.221.4.1.tgz iwlwifi-6050-ucode-9.201.4.1.tgz ; + iwlwifi-1000-ucode-39.31.5.1.tgz iwlwifi-4965-ucode-228.61.2.24.tgz + iwlwifi-5000-ucode-8.83.5.1.tgz iwlwifi-5150-ucode-8.24.2.2.tgz + iwlwifi-6000-ucode-9.221.4.1.tgz iwlwifi-6000g2a-ucode-17.168.5.2.tgz + iwlwifi-6050-ucode-41.28.5.1.tgz ; HAIKU_WIFI_FIRMWARE_DO_EXTRACT on iprowifi4965 = true ; Property changes on: haiku/trunk/src/add-ons/kernel/drivers/network/wlan/iprowifi4965/dev/iwn ___________________________________________________________________ Modified: svn:mergeinfo - /haiku/branches/developer/bonefish/signals/src/add-ons/kernel/drivers/network/wlan/iprowifi4965/dev/iwn:40148-40195 /haiku/branches/developer/bonefish/weak-symbols/src/add-ons/kernel/drivers/network/wlan/iprowifi4965/dev/iwn:39365-39568 /haiku/vendor/freebsd/RELEASE_8_1_0/dev/iwn:38717 /haiku/vendor/freebsd/current/dev/iwn:34314-38716 + /haiku/branches/developer/bonefish/signals/src/add-ons/kernel/drivers/network/wlan/iprowifi4965/dev/iwn:40148-40195 /haiku/branches/developer/bonefish/weak-symbols/src/add-ons/kernel/drivers/network/wlan/iprowifi4965/dev/iwn:39365-39568 /haiku/vendor/freebsd/RELEASE_8_2_0/dev/iwn:41229-41235 /haiku/vendor/freebsd/current/dev/iwn:34314-41228 Modified: haiku/trunk/src/add-ons/kernel/drivers/network/wlan/iprowifi4965/dev/iwn/if_iwn.c =================================================================== --- haiku/trunk/src/add-ons/kernel/drivers/network/wlan/iprowifi4965/dev/iwn/if_iwn.c 2011-04-11 22:30:18 UTC (rev 41239) +++ haiku/trunk/src/add-ons/kernel/drivers/network/wlan/iprowifi4965/dev/iwn/if_iwn.c 2011-04-11 22:48:42 UTC (rev 41240) @@ -122,7 +122,6 @@ static void iwn_read_eeprom_enhinfo(struct iwn_softc *); static struct ieee80211_node *iwn_node_alloc(struct ieee80211vap *, const uint8_t mac[IEEE80211_ADDR_LEN]); -static void iwn_newassoc(struct ieee80211_node *, int); static int iwn_media_change(struct ifnet *); static int iwn_newstate(struct ieee80211vap *, enum ieee80211_state, int); static void iwn_rx_phy(struct iwn_softc *, struct iwn_rx_desc *, @@ -135,8 +134,6 @@ static void iwn_rx_compressed_ba(struct iwn_softc *, struct iwn_rx_desc *, struct iwn_rx_data *); #endif -static void iwn5000_rx_calib_results(struct iwn_softc *, - struct iwn_rx_desc *, struct iwn_rx_data *); static void iwn_rx_statistics(struct iwn_softc *, struct iwn_rx_desc *, struct iwn_rx_data *); static void iwn4965_tx_done(struct iwn_softc *, struct iwn_rx_desc *, @@ -220,8 +217,14 @@ struct ieee80211_node *, uint8_t, uint16_t); static void iwn5000_ampdu_tx_stop(struct iwn_softc *, uint8_t, uint16_t); #endif -static int iwn5000_query_calibration(struct iwn_softc *); -static int iwn5000_send_calibration(struct iwn_softc *); +static int iwn5000_send_calib_results(struct iwn_softc *); +static int iwn5000_save_calib_result(struct iwn_softc *, + struct iwn_phy_calib *, int, int); +static void iwn5000_free_calib_results(struct iwn_softc *); +static int iwn5000_chrystal_calib(struct iwn_softc *); +static int iwn5000_send_calib_query(struct iwn_softc *, uint32_t); +static int iwn5000_rx_calib_result(struct iwn_softc *, + struct iwn_rx_desc *, struct iwn_rx_data *); static int iwn5000_send_wimax_coex(struct iwn_softc *); static int iwn4965_post_alive(struct iwn_softc *); static int iwn5000_post_alive(struct iwn_softc *); @@ -231,6 +234,10 @@ static int iwn5000_load_firmware_section(struct iwn_softc *, uint32_t, const uint8_t *, int); static int iwn5000_load_firmware(struct iwn_softc *); +static int iwn_read_firmware_leg(struct iwn_softc *, + struct iwn_fw_info *); +static int iwn_read_firmware_tlv(struct iwn_softc *, + struct iwn_fw_info *, uint16_t); static int iwn_read_firmware(struct iwn_softc *); static int iwn_clock_wait(struct iwn_softc *); static int iwn_apm_init(struct iwn_softc *); @@ -310,7 +317,6 @@ { 0x8086, 0x423D, "Intel(R) PRO/Wireless 5150" }, { 0x8086, 0x4235, "Intel(R) PRO/Wireless 5300" }, { 0x8086, 0x4236, "Intel(R) PRO/Wireless 5300" }, - { 0x8086, 0x4236, "Intel(R) PRO/Wireless 5350" }, { 0x8086, 0x423A, "Intel(R) PRO/Wireless 5350" }, { 0x8086, 0x423B, "Intel(R) PRO/Wireless 5350" }, { 0x8086, 0x0083, "Intel(R) PRO/Wireless 1000" }, @@ -321,8 +327,17 @@ { 0x8086, 0x4239, "Intel(R) PRO/Wireless 6000" }, { 0x8086, 0x422B, "Intel(R) PRO/Wireless 6000" }, { 0x8086, 0x422C, "Intel(R) PRO/Wireless 6000" }, - { 0x8086, 0x0086, "Intel(R) PRO/Wireless 6050" }, - { 0x8086, 0x0087, "Intel(R) PRO/Wireless 6050" }, + { 0x8086, 0x0087, "Intel(R) PRO/Wireless 6250" }, + { 0x8086, 0x0089, "Intel(R) PRO/Wireless 6250" }, + { 0x8086, 0x0082, "Intel(R) PRO/Wireless 6205a" }, + { 0x8086, 0x0085, "Intel(R) PRO/Wireless 6205a" }, +#ifdef notyet + { 0x8086, 0x008a, "Intel(R) PRO/Wireless 6205b" }, + { 0x8086, 0x008b, "Intel(R) PRO/Wireless 6205b" }, + { 0x8086, 0x008f, "Intel(R) PRO/Wireless 6205b" }, + { 0x8086, 0x0090, "Intel(R) PRO/Wireless 6205b" }, + { 0x8086, 0x0091, "Intel(R) PRO/Wireless 6205b" }, +#endif { 0, 0, NULL } }; @@ -627,8 +642,8 @@ ifp->if_init = iwn_init; ifp->if_ioctl = iwn_ioctl; ifp->if_start = iwn_start; - IFQ_SET_MAXLEN(&ifp->if_snd, IFQ_MAXLEN); - ifp->if_snd.ifq_drv_maxlen = IFQ_MAXLEN; + IFQ_SET_MAXLEN(&ifp->if_snd, ifqmaxlen); + ifp->if_snd.ifq_drv_maxlen = ifqmaxlen; IFQ_SET_READY(&ifp->if_snd); ieee80211_ifattach(ic, macaddr); @@ -636,7 +651,6 @@ ic->ic_vap_delete = iwn_vap_delete; ic->ic_raw_xmit = iwn_raw_xmit; ic->ic_node_alloc = iwn_node_alloc; - ic->ic_newassoc = iwn_newassoc; ic->ic_wme.wme_update = iwn_wme_update; ic->ic_update_mcast = iwn_update_mcast; ic->ic_scan_start = iwn_scan_start; @@ -692,6 +706,9 @@ sc->fwname = "iwn5000fw"; sc->txchainmask = IWN_ANT_B; sc->rxchainmask = IWN_ANT_AB; + sc->calib_init = IWN_CALIB_XTAL | IWN_CALIB_LO | + IWN_CALIB_TX_IQ | IWN_CALIB_TX_IQ_PERIODIC | + IWN_CALIB_BASE_BAND; break; case IWN_HW_REV_TYPE_5150: sc->sc_hal = &iwn5000_hal; @@ -699,6 +716,8 @@ sc->fwname = "iwn5150fw"; sc->txchainmask = IWN_ANT_A; sc->rxchainmask = IWN_ANT_AB; + sc->calib_init = IWN_CALIB_DC | IWN_CALIB_LO | + IWN_CALIB_TX_IQ | IWN_CALIB_BASE_BAND; break; case IWN_HW_REV_TYPE_5300: case IWN_HW_REV_TYPE_5350: @@ -707,6 +726,9 @@ sc->fwname = "iwn5000fw"; sc->txchainmask = IWN_ANT_ABC; sc->rxchainmask = IWN_ANT_ABC; + sc->calib_init = IWN_CALIB_XTAL | IWN_CALIB_LO | + IWN_CALIB_TX_IQ | IWN_CALIB_TX_IQ_PERIODIC | + IWN_CALIB_BASE_BAND; break; case IWN_HW_REV_TYPE_1000: sc->sc_hal = &iwn5000_hal; @@ -714,6 +736,9 @@ sc->fwname = "iwn1000fw"; sc->txchainmask = IWN_ANT_A; sc->rxchainmask = IWN_ANT_AB; + sc->calib_init = IWN_CALIB_XTAL | IWN_CALIB_LO | + IWN_CALIB_TX_IQ | IWN_CALIB_TX_IQ_PERIODIC | + IWN_CALIB_BASE_BAND; break; case IWN_HW_REV_TYPE_6000: sc->sc_hal = &iwn5000_hal; @@ -729,16 +754,32 @@ default: sc->txchainmask = IWN_ANT_ABC; sc->rxchainmask = IWN_ANT_ABC; + sc->calib_runtime = IWN_CALIB_DC; break; } + sc->calib_init = IWN_CALIB_XTAL | IWN_CALIB_LO | + IWN_CALIB_TX_IQ | IWN_CALIB_BASE_BAND; break; case IWN_HW_REV_TYPE_6050: sc->sc_hal = &iwn5000_hal; sc->limits = &iwn6000_sensitivity_limits; - sc->fwname = "iwn6000fw"; + sc->fwname = "iwn6050fw"; sc->txchainmask = IWN_ANT_AB; sc->rxchainmask = IWN_ANT_AB; + sc->calib_init = IWN_CALIB_XTAL | IWN_CALIB_LO | + IWN_CALIB_TX_IQ | IWN_CALIB_BASE_BAND; + sc->calib_runtime = IWN_CALIB_DC; break; + case IWN_HW_REV_TYPE_6005: + sc->sc_hal = &iwn5000_hal; + sc->limits = &iwn6000_sensitivity_limits; + sc->fwname = "iwn6005fw"; + sc->txchainmask = IWN_ANT_AB; + sc->rxchainmask = IWN_ANT_AB; + sc->calib_init = IWN_CALIB_XTAL | IWN_CALIB_LO | + IWN_CALIB_TX_IQ | IWN_CALIB_BASE_BAND; + sc->calib_runtime = IWN_CALIB_DC; + break; default: device_printf(sc->sc_dev, "adapter type %d not supported\n", sc->hw_type); @@ -826,6 +867,8 @@ ieee80211_ifdetach(ic); } + iwn5000_free_calib_results(sc); + /* Free DMA resources. */ iwn_free_rx_ring(sc, &sc->rxq); if (sc->sc_hal != NULL) @@ -1670,7 +1713,7 @@ DPRINTF(sc, IWN_DEBUG_CALIBRATE, "%s: calib version=%u pa type=%u voltage=%u\n", __func__, hdr.version, hdr.pa_type, le16toh(hdr.volt)); - sc->calib_ver = hdr.version; + sc->calib_ver = hdr.version; if (sc->hw_type == IWN_HW_REV_TYPE_5150) { /* Compute temperature offset. */ @@ -1681,12 +1724,6 @@ sc->temp_off = temp - (volt / -5); DPRINTF(sc, IWN_DEBUG_CALIBRATE, "temp=%d volt=%d offset=%dK\n", temp, volt, sc->temp_off); - } else { - /* Read crystal calibration. */ - iwn_read_prom_data(sc, base + IWN5000_EEPROM_CRYSTAL, - &sc->eeprom_crystal, sizeof (uint32_t)); - DPRINTF(sc, IWN_DEBUG_CALIBRATE, "crystal calibration 0x%08x\n", - le32toh(sc->eeprom_crystal)); } } @@ -1894,15 +1931,6 @@ return malloc(sizeof (struct iwn_node), M_80211_NODE,M_NOWAIT | M_ZERO); } -static void -iwn_newassoc(struct ieee80211_node *ni, int isnew) -{ - /* XXX move */ -#if 0 - ieee80211_ratectl_node_init(ni); -#endif -} - static int iwn_media_change(struct ifnet *ifp) { @@ -1927,28 +1955,46 @@ IWN_LOCK(sc); callout_stop(&sc->sc_timer_to); - if (nstate == IEEE80211_S_AUTH && vap->iv_state != IEEE80211_S_AUTH) { - /* !AUTH -> AUTH requires adapter config */ - /* Reset state to handle reassociations correctly. */ + switch (nstate) { + case IEEE80211_S_ASSOC: + if (vap->iv_state != IEEE80211_S_RUN) + break; + /* FALLTHROUGH */ + case IEEE80211_S_AUTH: + if (vap->iv_state == IEEE80211_S_AUTH) + break; + + /* + * !AUTH -> AUTH transition requires state reset to handle + * reassociations correctly. + */ sc->rxon.associd = 0; sc->rxon.filter &= ~htole32(IWN_FILTER_BSS); iwn_calib_reset(sc); error = iwn_auth(sc, vap); - } - if (nstate == IEEE80211_S_RUN && vap->iv_state != IEEE80211_S_RUN) { + break; + + case IEEE80211_S_RUN: /* + * RUN -> RUN transition; Just restart the timers. + */ + if (vap->iv_state == IEEE80211_S_RUN && + vap->iv_opmode != IEEE80211_M_MONITOR) { + iwn_calib_reset(sc); + break; + } + + /* * !RUN -> RUN requires setting the association id * which is done with a firmware cmd. We also defer [... truncated: 3661 lines follow ...]