[haiku-commits] r41240 - in haiku/trunk/src: add-ons/kernel/drivers/network/wlan/aironetwifi/dev/an add-ons/kernel/drivers/network/wlan/broadcom43xx/dev/bwi add-ons/kernel/drivers/network/wlan/iprowifi2200/dev/iwi add-ons/kernel/drivers/network/wlan/iprowifi3945 add-ons/kernel/drivers/network/wlan/iprowifi3945/dev/wpi ...

  • From: korli@xxxxxxxxxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Tue, 12 Apr 2011 00:48:47 +0200 (CEST)

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 ...]

Other related posts:

  • » [haiku-commits] r41240 - in haiku/trunk/src: add-ons/kernel/drivers/network/wlan/aironetwifi/dev/an add-ons/kernel/drivers/network/wlan/broadcom43xx/dev/bwi add-ons/kernel/drivers/network/wlan/iprowifi2200/dev/iwi add-ons/kernel/drivers/network/wlan/iprowifi3945 add-ons/kernel/drivers/network/wlan/iprowifi3945/dev/wpi ... - korli