From owner-freebsd-wireless@FreeBSD.ORG Sun May 1 09:39:25 2011 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 3FC07106564A; Sun, 1 May 2011 09:39:25 +0000 (UTC) (envelope-from adrian.chadd@gmail.com) Received: from mail-vw0-f54.google.com (mail-vw0-f54.google.com [209.85.212.54]) by mx1.freebsd.org (Postfix) with ESMTP id D01968FC18; Sun, 1 May 2011 09:39:24 +0000 (UTC) Received: by vws18 with SMTP id 18so4861721vws.13 for ; Sun, 01 May 2011 02:39:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:date:message-id:subject:from:to:cc :content-type; bh=B9VTnHk5KTOEmmJwLRYYFb1z9RoAujfyIF7CT6WcH2E=; b=JFjpz7FeLWPaZCmvfNEGMTw3ndobxuncBlF6t16wrlYgBF+RnPBx+6Mci2pE5n4fTE X2LzIgbfOeHBtgpGg2UFODuP8POE+XXN4Vy540a2Racn03OqZoe8G+oAWA5Go+nll6mU crJqREjS68+ahzEEEUw0GbZ9B33D9Vkim8L5w= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:date:message-id:subject:from:to:cc:content-type; b=xqFlD4yYglIPDlbuaRJ2vbrdwgTubPFOLocfLBTFVFPfhFDQXJVRTPCPZCI4xMfiRg iEwnN3Cfb6AYWUNPoOAMg3nl/xkyBQu5Op8iQuzInH7Ci1QqFuxSLY+YAeuGM11bixl+ sKQon0TClESWi5mqyXzsEY9/AWDH4kgPsYMRM= MIME-Version: 1.0 Received: by 10.52.180.104 with SMTP id dn8mr7761159vdc.302.1304242763939; Sun, 01 May 2011 02:39:23 -0700 (PDT) Received: by 10.52.157.202 with HTTP; Sun, 1 May 2011 02:39:23 -0700 (PDT) Date: Sun, 1 May 2011 17:39:23 +0800 Message-ID: From: Adrian Chadd To: freebsd-wireless@freebsd.org Content-Type: text/plain; charset=ISO-8859-1 Cc: freebsd-mobile@freebsd.org Subject: [wireless] Request for help - iperf TCP tests and out of order packets X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Discussions of 802.11 stack, tools device driver development." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 01 May 2011 09:39:25 -0000 Hi all, I'm just trying to trace down some out of order TCP packet issues that I'm seeing with my ath wireless development. I'm currently lacking non-atheros hardware (I know, it's quite silly :-) so I'm after testing from both ath and other wifi device users. What I'd like done is this: On the FreeBSD station: * clear the statistics # netstat -sp tcp -z * run iperf in the background # iperf -s & On some device connected via ethernet: $ iperf -c -t 120 * then on the station # netstat -sp tcp | grep order If you can then repeat the same tests with the freebsd station instead connected directly via ethernet (via a switch is fine), that'd be great. Then please email me (privately) the results, so we don't spam up the lists. I'll post a summary. Thanks, Adrian From owner-freebsd-wireless@FreeBSD.ORG Sun May 1 11:18:17 2011 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 464C3106564A; Sun, 1 May 2011 11:18:17 +0000 (UTC) (envelope-from adrian.chadd@gmail.com) Received: from mail-vw0-f54.google.com (mail-vw0-f54.google.com [209.85.212.54]) by mx1.freebsd.org (Postfix) with ESMTP id DBD1D8FC17; Sun, 1 May 2011 11:18:16 +0000 (UTC) Received: by vws18 with SMTP id 18so4892357vws.13 for ; Sun, 01 May 2011 04:18:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:sender:in-reply-to:references:date :x-google-sender-auth:message-id:subject:from:to:cc:content-type :content-transfer-encoding; bh=paPAoaP3H39gAWxELukfhOj3mn/OcZ9C6WFo3yklJ+g=; b=B3OVn3h+tnCliNmbeOnJadDxRG9h5Ds99xLSjECsvu0cXV6NQ72Dl8lgi69geIxHL9 69rn045hD4xvCya7DDPGNBf8148WslAWInzNXS4e2DbQN+0F87g8IKX9v7GqoybU0Z9Z wYLn97huTRcyO9QqpmxH/xa7yEnelClNJ1Tn4= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:sender:in-reply-to:references:date :x-google-sender-auth:message-id:subject:from:to:cc:content-type :content-transfer-encoding; b=Z8r5hqPdXReV3CQACpFxwrmx2gQCJtpzKCvf8aKMh7DlVXH76NXXzO0a++XKLkO+9Z rU/1u4j6kDDwLv+xdYz+0KOpa5K7o+f85F55Y2MYbUmuSMTyT2WJmo8QH7iF/zIB5+U+ QWTC2Px8zywMM0AekDbwiKmhcdmF2T7bEa1E0= MIME-Version: 1.0 Received: by 10.52.175.165 with SMTP id cb5mr2971838vdc.62.1304248696128; Sun, 01 May 2011 04:18:16 -0700 (PDT) Sender: adrian.chadd@gmail.com Received: by 10.52.157.202 with HTTP; Sun, 1 May 2011 04:18:16 -0700 (PDT) In-Reply-To: <20110501111327.GL1664@albert.catwhisker.org> References: <20110501111327.GL1664@albert.catwhisker.org> Date: Sun, 1 May 2011 19:18:16 +0800 X-Google-Sender-Auth: ylyiQ70qelJdz-7xKLfvVGOVGYw Message-ID: From: Adrian Chadd To: David Wolfskill Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Cc: freebsd-wireless@freebsd.org, freebsd-mobile@freebsd.org Subject: Re: [wireless] Request for help - iperf TCP tests and out of order packets X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Discussions of 802.11 stack, tools device driver development." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 01 May 2011 11:18:17 -0000 (Replying with useful info to the MLs.) Any/all versions of FreeBSD are appreciated. :) Please report the FreeBSD version on the client/server, the wifi hardware type, the dmesg describing said wifi hardware, and the details of the access point. Thanks, Adrian On 1 May 2011 19:13, David Wolfskill wrote: > On Sun, May 01, 2011 at 05:39:23PM +0800, Adrian Chadd wrote: >> ... >> What I'd like done is this: >> >> On the FreeBSD station: >> >> * clear the statistics >> >> =A0 # netstat -sp tcp -z >> >> * run iperf in the background >> >> =A0 # iperf -s & >> >> On some device connected via ethernet: >> >> =A0 $ iperf -c -t 120 >> >> * then on the station >> >> # netstat -sp tcp | grep order >> >> If you can then repeat the same tests with the freebsd station instead >> connected directly via ethernet (via a switch is fine), that'd be >> great. >> .... > > Running any particular version of FreeBSD? > > Peace, > david > -- > David H. Wolfskill =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0david@catwhisker.org > Depriving a girl or boy of an opportunity for education is evil. > > See http://www.catwhisker.org/~david/publickey.gpg for my public key. > From owner-freebsd-wireless@FreeBSD.ORG Sun May 1 11:19:27 2011 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 7B42C1065673; Sun, 1 May 2011 11:19:27 +0000 (UTC) (envelope-from bschmidt@techwires.net) Received: from mail-fx0-f54.google.com (mail-fx0-f54.google.com [209.85.161.54]) by mx1.freebsd.org (Postfix) with ESMTP id 856B18FC0A; Sun, 1 May 2011 11:19:26 +0000 (UTC) Received: by fxm11 with SMTP id 11so4742791fxm.13 for ; Sun, 01 May 2011 04:19:25 -0700 (PDT) Received: by 10.223.6.11 with SMTP id 11mr740153fax.103.1304248765416; Sun, 01 May 2011 04:19:25 -0700 (PDT) Received: from amy.lab.techwires.net (dslb-088-067-204-093.pools.arcor-ip.net [88.67.204.93]) by mx.google.com with ESMTPS id n7sm1439819fam.11.2011.05.01.04.19.20 (version=SSLv3 cipher=OTHER); Sun, 01 May 2011 04:19:24 -0700 (PDT) Sender: Bernhard Schmidt From: Bernhard Schmidt To: freebsd-wireless@freebsd.org Date: Sun, 1 May 2011 13:19:30 +0200 User-Agent: KMail/1.13.7 (FreeBSD/8.2-STABLE; KDE/4.6.2; amd64; ; ) MIME-Version: 1.0 Content-Type: Multipart/Mixed; boundary="Boundary-00=_CHUvNNJ7ZQlWu6H" Message-Id: <201105011319.30649.bschmidt@freebsd.org> Cc: freebsd-net@freebsd.org Subject: CFT: 11n support for iwn(4) X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Discussions of 802.11 stack, tools device driver development." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 01 May 2011 11:19:27 -0000 --Boundary-00=_CHUvNNJ7ZQlWu6H Content-Type: Text/Plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Hi, I finally managed to get the 11n bits for iwn(4) sorted out. Well, there is still an issue somewhere with HT40 frame protection or TX chain setup on 5000 adapters, resulting in throughput not being that stable. But overall it seems to work pretty decently This is for HEAD only right now, net80211 in stable/8 does not yet contain the latest 11n related fixes. So, if you run HEAD and have some iwn(4) hardware, I'd appreciate feedback. Some statistically irrelevant numbers on a 4965 adapter: UDP RX on 5GHz/HT40: [ 3] 0.0-30.0 sec 866 MBytes 242 Mbits/sec 0.130 ms UDP TX on 5GHz/HT40: [ 3] 0.0-30.3 sec 846 MBytes 235 Mbits/sec 15.081 ms TCP RX on 5GHz/HT40: [ 3] 0.0-30.0 sec 554 MBytes 155 Mbits/sec TCP TX on 5GHz/HT40: [ 4] 0.0-30.0 sec 585 MBytes 164 Mbits/sec UDP RX on 2GHz/HT20 (4965 has no HT40 support on 2GHz): [ 3] 0.0-30.1 sec 383 MBytes 107 Mbits/sec 0.201 ms UDP TX on 2GHz/HT20: [ 3] 0.0-30.3 sec 350 MBytes 97.0 Mbits/sec 11.965 ms -- Bernhard --Boundary-00=_CHUvNNJ7ZQlWu6H Content-Type: text/x-patch; charset="ISO-8859-1"; name="iwn_ht.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="iwn_ht.diff" diff --git a/sys/dev/iwn/if_iwn.c b/sys/dev/iwn/if_iwn.c index 7d6ec68..e2cf4be 100644 --- a/sys/dev/iwn/if_iwn.c +++ b/sys/dev/iwn/if_iwn.c @@ -152,9 +152,7 @@ static void iwn4965_print_power_group(struct iwn_softc *, int); static void iwn5000_read_eeprom(struct iwn_softc *); static uint32_t iwn_eeprom_channel_flags(struct iwn_eeprom_chan *); static void iwn_read_eeprom_band(struct iwn_softc *, int); -#if 0 /* HT */ static void iwn_read_eeprom_ht40(struct iwn_softc *, int); -#endif static void iwn_read_eeprom_channels(struct iwn_softc *, int, uint32_t); static struct iwn_eeprom_chan *iwn_find_eeprom_channel(struct iwn_softc *, struct ieee80211_channel *); @@ -172,10 +170,8 @@ static void iwn_rx_phy(struct iwn_softc *, struct iwn_rx_desc *, struct iwn_rx_data *); static void iwn_rx_done(struct iwn_softc *, struct iwn_rx_desc *, struct iwn_rx_data *); -#if 0 /* HT */ 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 *, @@ -186,6 +182,7 @@ static void iwn5000_tx_done(struct iwn_softc *, struct iwn_rx_desc *, struct iwn_rx_data *); static void iwn_tx_done(struct iwn_softc *, struct iwn_rx_desc *, int, uint8_t); +static void iwn_ampdu_tx_done(struct iwn_softc *, int, int, int, void *); static void iwn_cmd_done(struct iwn_softc *, struct iwn_rx_desc *); static void iwn_notif_intr(struct iwn_softc *); static void iwn_wakeup_intr(struct iwn_softc *); @@ -199,7 +196,6 @@ static void iwn5000_update_sched(struct iwn_softc *, int, int, uint8_t, #ifdef notyet static void iwn5000_reset_sched(struct iwn_softc *, int, int); #endif -static uint8_t iwn_plcp_signal(int); static int iwn_tx_data(struct iwn_softc *, struct mbuf *, struct ieee80211_node *); static int iwn_tx_data_raw(struct iwn_softc *, struct mbuf *, @@ -252,24 +248,26 @@ static uint8_t *ieee80211_add_ssid(uint8_t *, const uint8_t *, u_int); static int iwn_scan(struct iwn_softc *); static int iwn_auth(struct iwn_softc *, struct ieee80211vap *vap); static int iwn_run(struct iwn_softc *, struct ieee80211vap *vap); -#if 0 /* HT */ -static int iwn_ampdu_rx_start(struct ieee80211com *, - struct ieee80211_node *, uint8_t); -static void iwn_ampdu_rx_stop(struct ieee80211com *, - struct ieee80211_node *, uint8_t); +static int iwn_ampdu_rx_start(struct ieee80211_node *, + struct ieee80211_rx_ampdu *, int, int, int); +static void iwn_ampdu_rx_stop(struct ieee80211_node *, + struct ieee80211_rx_ampdu *); +static int iwn_addba_request(struct ieee80211_node *, + struct ieee80211_tx_ampdu *, int, int, int); +static int iwn_addba_response(struct ieee80211_node *, + struct ieee80211_tx_ampdu *, int, int, int); static int iwn_ampdu_tx_start(struct ieee80211com *, struct ieee80211_node *, uint8_t); -static void iwn_ampdu_tx_stop(struct ieee80211com *, - struct ieee80211_node *, uint8_t); +static void iwn_ampdu_tx_stop(struct ieee80211_node *, + struct ieee80211_tx_ampdu *); static void iwn4965_ampdu_tx_start(struct iwn_softc *, - struct ieee80211_node *, uint8_t, uint16_t); -static void iwn4965_ampdu_tx_stop(struct iwn_softc *, + struct ieee80211_node *, int, uint8_t, uint16_t); +static void iwn4965_ampdu_tx_stop(struct iwn_softc *, int, uint8_t, uint16_t); static void iwn5000_ampdu_tx_start(struct iwn_softc *, - struct ieee80211_node *, uint8_t, uint16_t); -static void iwn5000_ampdu_tx_stop(struct iwn_softc *, + struct ieee80211_node *, int, uint8_t, uint16_t); +static void iwn5000_ampdu_tx_stop(struct iwn_softc *, int, 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_wimax_coex(struct iwn_softc *); @@ -550,21 +548,6 @@ iwn_attach(device_t dev) /* Clear pending interrupts. */ IWN_WRITE(sc, IWN_INT, 0xffffffff); - /* Count the number of available chains. */ - sc->ntxchains = - ((sc->txchainmask >> 2) & 1) + - ((sc->txchainmask >> 1) & 1) + - ((sc->txchainmask >> 0) & 1); - sc->nrxchains = - ((sc->rxchainmask >> 2) & 1) + - ((sc->rxchainmask >> 1) & 1) + - ((sc->rxchainmask >> 0) & 1); - if (bootverbose) { - device_printf(dev, "MIMO %dT%dR, %.4s, address %6D\n", - sc->ntxchains, sc->nrxchains, sc->eeprom_domain, - macaddr, ":"); - } - ifp = sc->sc_ifp = if_alloc(IFT_IEEE80211); if (ifp == NULL) { device_printf(dev, "can not allocate ifnet structure\n"); @@ -584,42 +567,13 @@ iwn_attach(device_t dev) | IEEE80211_C_SHSLOT /* short slot time supported */ | IEEE80211_C_WPA | IEEE80211_C_SHPREAMBLE /* short preamble supported */ - | IEEE80211_C_BGSCAN /* background scanning */ #if 0 | IEEE80211_C_IBSS /* ibss/adhoc mode */ #endif | IEEE80211_C_WME /* WME */ ; -#if 0 /* HT */ - /* XXX disable until HT channel setup works */ - ic->ic_htcaps = - IEEE80211_HTCAP_SMPS_ENA /* SM PS mode enabled */ - | IEEE80211_HTCAP_CHWIDTH40 /* 40MHz channel width */ - | IEEE80211_HTCAP_SHORTGI20 /* short GI in 20MHz */ - | IEEE80211_HTCAP_SHORTGI40 /* short GI in 40MHz */ - | IEEE80211_HTCAP_RXSTBC_2STREAM/* 1-2 spatial streams */ - | IEEE80211_HTCAP_MAXAMSDU_3839 /* max A-MSDU length */ - /* s/w capabilities */ - | IEEE80211_HTC_HT /* HT operation */ - | IEEE80211_HTC_AMPDU /* tx A-MPDU */ - | IEEE80211_HTC_AMSDU /* tx A-MSDU */ - ; - - /* Set HT capabilities. */ - ic->ic_htcaps = -#if IWN_RBUF_SIZE == 8192 - IEEE80211_HTCAP_AMSDU7935 | -#endif - IEEE80211_HTCAP_CBW20_40 | - IEEE80211_HTCAP_SGI20 | - IEEE80211_HTCAP_SGI40; if (sc->hw_type != IWN_HW_REV_TYPE_4965) - ic->ic_htcaps |= IEEE80211_HTCAP_GF; - if (sc->hw_type == IWN_HW_REV_TYPE_6050) - ic->ic_htcaps |= IEEE80211_HTCAP_SMPS_DYN; - else - ic->ic_htcaps |= IEEE80211_HTCAP_SMPS_DIS; -#endif + ic->ic_caps |= IEEE80211_C_BGSCAN; /* background scanning */ /* Read MAC address, channels, etc from EEPROM. */ if ((error = iwn_read_eeprom(sc, macaddr)) != 0) { @@ -628,14 +582,49 @@ iwn_attach(device_t dev) goto fail; } -#if 0 /* HT */ - /* Set supported HT rates. */ - ic->ic_sup_mcs[0] = 0xff; - if (sc->nrxchains > 1) - ic->ic_sup_mcs[1] = 0xff; - if (sc->nrxchains > 2) - ic->ic_sup_mcs[2] = 0xff; + /* Count the number of available chains. */ + sc->ntxchains = + ((sc->txchainmask >> 2) & 1) + + ((sc->txchainmask >> 1) & 1) + + ((sc->txchainmask >> 0) & 1); + sc->nrxchains = + ((sc->rxchainmask >> 2) & 1) + + ((sc->rxchainmask >> 1) & 1) + + ((sc->rxchainmask >> 0) & 1); + if (bootverbose) { + device_printf(dev, "MIMO %dT%dR, %.4s, address %6D\n", + sc->ntxchains, sc->nrxchains, sc->eeprom_domain, + macaddr, ":"); + } + + if (sc->sc_flags & IWN_FLAG_HAS_11N) { + ic->ic_rxstream = sc->nrxchains; + ic->ic_txstream = sc->ntxchains; + ic->ic_htcaps = + IEEE80211_HTCAP_SMPS_ENA /* SM PS mode enabled */ + | IEEE80211_HTCAP_CHWIDTH40 /* 40MHz channel width*/ + | IEEE80211_HTCAP_SHORTGI20 /* short GI in 20MHz */ + | IEEE80211_HTCAP_SHORTGI40 /* short GI in 40MHz */ +#if IWN_RBUF_SIZE == 8192 + | IEEE80211_HTCAP_MAXAMSDU_7935 /* max A-MSDU length */ +#else + | IEEE80211_HTCAP_MAXAMSDU_3839 /* max A-MSDU length */ +#endif +#ifdef notyet + | IEEE80211_HTCAP_GREENFIELD +#endif + /* s/w capabilities */ + | IEEE80211_HTC_HT /* HT operation */ + | IEEE80211_HTC_AMPDU /* tx A-MPDU */ +#ifdef notyet + | IEEE80211_HTC_AMSDU /* tx A-MSDU */ #endif + ; + if (sc->hw_type == IWN_HW_REV_TYPE_6050) + ic->ic_htcaps |= IEEE80211_HTCAP_SMPS_DYNAMIC; + else + ic->ic_htcaps |= IEEE80211_HTCAP_SMPS_OFF; + } if_initname(ifp, device_get_name(dev), device_get_unit(dev)); ifp->if_softc = sc; @@ -652,12 +641,16 @@ iwn_attach(device_t dev) ic->ic_vap_delete = iwn_vap_delete; ic->ic_raw_xmit = iwn_raw_xmit; ic->ic_node_alloc = iwn_node_alloc; -#if 0 /* HT */ + sc->sc_ampdu_rx_start = ic->ic_ampdu_rx_start; ic->ic_ampdu_rx_start = iwn_ampdu_rx_start; + sc->sc_ampdu_rx_stop = ic->ic_ampdu_rx_stop; ic->ic_ampdu_rx_stop = iwn_ampdu_rx_stop; - ic->ic_ampdu_tx_start = iwn_ampdu_tx_start; - ic->ic_ampdu_tx_stop = iwn_ampdu_tx_stop; -#endif + sc->sc_addba_request = ic->ic_addba_request; + ic->ic_addba_request = iwn_addba_request; + sc->sc_addba_response = ic->ic_addba_response; + ic->ic_addba_response = iwn_addba_response; + sc->sc_addba_stop = ic->ic_addba_stop; + ic->ic_addba_stop = iwn_ampdu_tx_stop; ic->ic_newassoc = iwn_newassoc; ic->ic_wme.wme_update = iwn_updateedca; ic->ic_update_mcast = iwn_update_mcast; @@ -714,11 +707,10 @@ iwn4965_attach(struct iwn_softc *sc, uint16_t pid) ops->set_gains = iwn4965_set_gains; ops->add_node = iwn4965_add_node; ops->tx_done = iwn4965_tx_done; -#if 0 /* HT */ ops->ampdu_tx_start = iwn4965_ampdu_tx_start; ops->ampdu_tx_stop = iwn4965_ampdu_tx_stop; -#endif sc->ntxqs = IWN4965_NTXQUEUES; + sc->firstaggqueue = IWN4965_FIRSTAGGQUEUE; sc->ndmachnls = IWN4965_NDMACHNLS; sc->broadcast_id = IWN4965_ID_BROADCAST; sc->rxonsz = IWN4965_RXONSZ; @@ -753,11 +745,10 @@ iwn5000_attach(struct iwn_softc *sc, uint16_t pid) ops->set_gains = iwn5000_set_gains; ops->add_node = iwn5000_add_node; ops->tx_done = iwn5000_tx_done; -#if 0 /* HT */ ops->ampdu_tx_start = iwn5000_ampdu_tx_start; ops->ampdu_tx_stop = iwn5000_ampdu_tx_stop; -#endif sc->ntxqs = IWN5000_NTXQUEUES; + sc->firstaggqueue = IWN5000_FIRSTAGGQUEUE; sc->ndmachnls = IWN5000_NDMACHNLS; sc->broadcast_id = IWN5000_ID_BROADCAST; sc->rxonsz = IWN5000_RXONSZ; @@ -1489,13 +1480,6 @@ iwn_alloc_tx_ring(struct iwn_softc *sc, struct iwn_tx_ring *ring, int qid) __func__, error); goto fail; } - /* - * We only use rings 0 through 4 (4 EDCA + cmd) so there is no need - * to allocate commands space for other rings. - * XXX Do we really need to allocate descriptors for other rings? - */ - if (qid > 4) - return 0; size = IWN_TX_RING_COUNT * sizeof (struct iwn_tx_cmd); error = iwn_dma_contig_alloc(sc, &ring->cmd_dma, (void **)&ring->cmd, @@ -1694,7 +1678,7 @@ iwn4965_read_eeprom(struct iwn_softc *sc) iwn_read_prom_data(sc, IWN4965_EEPROM_DOMAIN, sc->eeprom_domain, 4); /* Read the list of authorized channels (20MHz ones only). */ - for (i = 0; i < 5; i++) { + for (i = 0; i < 7; i++) { addr = iwn4965_regulatory_bands[i]; iwn_read_eeprom_channels(sc, i, addr); } @@ -1781,8 +1765,11 @@ iwn5000_read_eeprom(struct iwn_softc *sc) sc->eeprom_domain, 4); /* Read the list of authorized channels (20MHz ones only). */ - for (i = 0; i < 5; i++) { - addr = base + iwn5000_regulatory_bands[i]; + for (i = 0; i < 7; i++) { + if (sc->hw_type >= IWN_HW_REV_TYPE_6000) + addr = base + iwn6000_regulatory_bands[i]; + else + addr = base + iwn5000_regulatory_bands[i]; iwn_read_eeprom_channels(sc, i, addr); } @@ -1884,18 +1871,15 @@ iwn_read_eeprom_band(struct iwn_softc *sc, int n) "add chan %d flags 0x%x maxpwr %d\n", chan, channels[i].flags, channels[i].maxpwr); -#if 0 /* HT */ - /* XXX no constraints on using HT20 */ - /* add HT20, HT40 added separately */ - c = &ic->ic_channels[ic->ic_nchans++]; - c[0] = c[-1]; - c->ic_flags |= IEEE80211_CHAN_HT20; - /* XXX NARROW =>'s 1/2 and 1/4 width? */ -#endif + if (sc->sc_flags & IWN_FLAG_HAS_11N) { + /* add HT20, HT40 added separately */ + c = &ic->ic_channels[ic->ic_nchans++]; + c[0] = c[-1]; + c->ic_flags |= IEEE80211_CHAN_HT20; + } } } -#if 0 /* HT */ static void iwn_read_eeprom_ht40(struct iwn_softc *sc, int n) { @@ -1904,55 +1888,59 @@ iwn_read_eeprom_ht40(struct iwn_softc *sc, int n) struct iwn_eeprom_chan *channels = sc->eeprom_channels[n]; const struct iwn_chan_band *band = &iwn_bands[n]; struct ieee80211_channel *c, *cent, *extc; - int i; + uint8_t chan; + int i, nflags; + + if (!(sc->sc_flags & IWN_FLAG_HAS_11N)) + return; for (i = 0; i < band->nchan; i++) { - if (!(channels[i].flags & IWN_EEPROM_CHAN_VALID) || - !(channels[i].flags & IWN_EEPROM_CHAN_WIDE)) { + if (!(channels[i].flags & IWN_EEPROM_CHAN_VALID)) { DPRINTF(sc, IWN_DEBUG_RESET, "skip chan %d flags 0x%x maxpwr %d\n", band->chan[i], channels[i].flags, channels[i].maxpwr); continue; } + chan = band->chan[i]; + nflags = iwn_eeprom_channel_flags(&channels[i]); + /* * Each entry defines an HT40 channel pair; find the * center channel, then the extension channel above. */ - cent = ieee80211_find_channel_byieee(ic, band->chan[i], - band->flags & ~IEEE80211_CHAN_HT); + cent = ieee80211_find_channel_byieee(ic, chan, + (n == 5 ? IEEE80211_CHAN_G : IEEE80211_CHAN_A)); if (cent == NULL) { /* XXX shouldn't happen */ device_printf(sc->sc_dev, - "%s: no entry for channel %d\n", - __func__, band->chan[i]); + "%s: no entry for channel %d\n", __func__, chan); continue; } extc = ieee80211_find_channel(ic, cent->ic_freq+20, - band->flags & ~IEEE80211_CHAN_HT); + (n == 5 ? IEEE80211_CHAN_G : IEEE80211_CHAN_A)); if (extc == NULL) { DPRINTF(sc, IWN_DEBUG_RESET, - "skip chan %d, extension channel not found\n", - band->chan[i]); + "%s: skip chan %d, extension channel not found\n", + __func__, chan); continue; } DPRINTF(sc, IWN_DEBUG_RESET, "add ht40 chan %d flags 0x%x maxpwr %d\n", - band->chan[i], channels[i].flags, channels[i].maxpwr); + chan, channels[i].flags, channels[i].maxpwr); c = &ic->ic_channels[ic->ic_nchans++]; c[0] = cent[0]; c->ic_extieee = extc->ic_ieee; c->ic_flags &= ~IEEE80211_CHAN_HT; - c->ic_flags |= IEEE80211_CHAN_HT40U; + c->ic_flags |= IEEE80211_CHAN_HT40U | nflags; c = &ic->ic_channels[ic->ic_nchans++]; c[0] = extc[0]; c->ic_extieee = cent->ic_ieee; - c->ic_flags &= ~IEEE80211_CHAN_HT; + c->ic_flags &= ~IEEE80211_CHAN_HT | nflags; c->ic_flags |= IEEE80211_CHAN_HT40D; } } -#endif static void iwn_read_eeprom_channels(struct iwn_softc *sc, int n, uint32_t addr) @@ -1965,25 +1953,34 @@ iwn_read_eeprom_channels(struct iwn_softc *sc, int n, uint32_t addr) if (n < 5) iwn_read_eeprom_band(sc, n); -#if 0 /* HT */ else iwn_read_eeprom_ht40(sc, n); -#endif ieee80211_sort_channels(ic->ic_channels, ic->ic_nchans); } static struct iwn_eeprom_chan * iwn_find_eeprom_channel(struct iwn_softc *sc, struct ieee80211_channel *c) { - int i, j; + int band, chan, i, j; - for (j = 0; j < 7; j++) { - for (i = 0; i < iwn_bands[j].nchan; i++) { - if (iwn_bands[j].chan[i] == c->ic_ieee) - return &sc->eeprom_channels[j][i]; + if (IEEE80211_IS_CHAN_HT40(c)) { + band = IEEE80211_IS_CHAN_5GHZ(c) ? 6 : 5; + if (IEEE80211_IS_CHAN_HT40D(c)) + chan = c->ic_extieee; + else + chan = c->ic_ieee; + for (i = 0; i < iwn_bands[band].nchan; i++) { + if (iwn_bands[band].chan[i] == chan) + return &sc->eeprom_channels[band][i]; + } + } else { + for (j = 0; j < 5; j++) { + for (i = 0; i < iwn_bands[j].nchan; i++) { + if (iwn_bands[j].chan[i] == c->ic_ieee) + return &sc->eeprom_channels[j][i]; + } } } - return NULL; } @@ -2020,18 +2017,22 @@ static void iwn_read_eeprom_enhinfo(struct iwn_softc *sc) { struct iwn_eeprom_enhinfo enhinfo[35]; + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + struct ieee80211_channel *c; uint16_t val, base; int8_t maxpwr; - int i; + uint8_t flags; + int i, j; iwn_read_prom_data(sc, IWN5000_EEPROM_REG, &val, 2); base = le16toh(val); iwn_read_prom_data(sc, base + IWN6000_EEPROM_ENHINFO, enhinfo, sizeof enhinfo); - memset(sc->enh_maxpwr, 0, sizeof sc->enh_maxpwr); for (i = 0; i < nitems(enhinfo); i++) { - if (enhinfo[i].chan == 0 || enhinfo[i].reserved != 0) + flags = enhinfo[i].flags; + if (!(flags & IWN_ENHINFO_VALID)) continue; /* Skip invalid entries. */ maxpwr = 0; @@ -2045,11 +2046,34 @@ iwn_read_eeprom_enhinfo(struct iwn_softc *sc) maxpwr = MAX(maxpwr, enhinfo[i].mimo2); else if (sc->ntxchains == 3) maxpwr = MAX(maxpwr, enhinfo[i].mimo3); - maxpwr /= 2; /* Convert half-dBm to dBm. */ - DPRINTF(sc, IWN_DEBUG_RESET, "enhinfo %d, maxpwr=%d\n", i, - maxpwr); - sc->enh_maxpwr[i] = maxpwr; + for (j = 0; j < ic->ic_nchans; j++) { + c = &ic->ic_channels[j]; + if ((flags & IWN_ENHINFO_5GHZ)) { + if (!IEEE80211_IS_CHAN_A(c)) + continue; + } else if ((flags & IWN_ENHINFO_OFDM)) { + if (!IEEE80211_IS_CHAN_G(c)) + continue; + } else if (!IEEE80211_IS_CHAN_B(c)) + continue; + if ((flags & IWN_ENHINFO_HT40)) { + if (!IEEE80211_IS_CHAN_HT40(c)) + continue; + } else { + if (IEEE80211_IS_CHAN_HT40(c)) + continue; + } + if (enhinfo[i].chan != 0 && + enhinfo[i].chan != c->ic_ieee) + continue; + + DPRINTF(sc, IWN_DEBUG_RESET, + "channel %d(%x), maxpwr %d\n", c->ic_ieee, + c->ic_flags, maxpwr / 2); + c->ic_maxregpower = maxpwr / 2; + c->ic_maxpower = maxpwr; + } } } @@ -2059,15 +2083,73 @@ iwn_node_alloc(struct ieee80211vap *vap, const uint8_t mac[IEEE80211_ADDR_LEN]) return malloc(sizeof (struct iwn_node), M_80211_NODE,M_NOWAIT | M_ZERO); } +static __inline int +rate2plcp(int rate) +{ + switch (rate & 0xff) { + case 12: return 0xd; + case 18: return 0xf; + case 24: return 0x5; + case 36: return 0x7; + case 48: return 0x9; + case 72: return 0xb; + case 96: return 0x1; + case 108: return 0x3; + case 2: return 10; + case 4: return 20; + case 11: return 55; + case 22: return 110; + } + return 0; +} + static void iwn_newassoc(struct ieee80211_node *ni, int isnew) { + struct ieee80211com *ic = ni->ni_ic; + struct iwn_softc *sc = ic->ic_ifp->if_softc; struct iwn_node *wn = (void *)ni; - int ridx, i; + uint8_t txant1, txant2; + int i, plcp, rate, ridx; + + /* Use the first valid TX antenna. */ + txant1 = IWN_LSB(sc->txchainmask); + txant2 = IWN_LSB(sc->txchainmask & ~txant1); - for (i = 0; i < ni->ni_rates.rs_nrates; i++) { - ridx = iwn_plcp_signal(ni->ni_rates.rs_rates[i]); - wn->ridx[i] = ridx; + if (IEEE80211_IS_CHAN_HT(ni->ni_chan)) { + ridx = ni->ni_rates.rs_nrates - 1; + for (i = ni->ni_htrates.rs_nrates - 1; i >= 0; i--) { + plcp = ni->ni_htrates.rs_rates[i] | IWN_RFLAG_MCS; + if (IEEE80211_IS_CHAN_HT40(ni->ni_chan)) { + plcp |= IWN_RFLAG_HT40; + if (ni->ni_htcap & IEEE80211_HTCAP_SHORTGI40) + plcp |= IWN_RFLAG_SGI; + } else if (ni->ni_htcap & IEEE80211_HTCAP_SHORTGI20) + plcp |= IWN_RFLAG_SGI; + if (i > 7) + plcp |= IWN_RFLAG_ANT(txant1 | txant2); + else + plcp |= IWN_RFLAG_ANT(txant1); + if (ridx >= 0) { + rate = ni->ni_rates.rs_rates[ridx]; + rate &= IEEE80211_RATE_VAL; + wn->ridx[rate] = plcp; + } + wn->ridx[0x80 | i] = plcp; + ridx--; + } + } else { + for (i = 0; i < ni->ni_rates.rs_nrates; i++) { + rate = ni->ni_rates.rs_rates[i] & IEEE80211_RATE_VAL; + + plcp = rate2plcp(rate); + ridx = ic->ic_rt->rateCodeToIndex[rate]; + if (ridx < IWN_RIDX_OFDM6 && + IEEE80211_IS_CHAN_2GHZ(ni->ni_chan)) + plcp |= IWN_RFLAG_CCK; + plcp |= IWN_RFLAG_ANT(txant1); + wn->ridx[rate] = htole32(plcp); + } } } @@ -2220,7 +2302,6 @@ iwn_rx_done(struct iwn_softc *sc, struct iwn_rx_desc *desc, "%s: missing RX_PHY\n", __func__); return; } - sc->last_rx_valid = 0; stat = &sc->last_rx_stat; } else stat = (struct iwn_rx_stat *)(desc + 1); @@ -2343,6 +2424,8 @@ iwn_rx_done(struct iwn_softc *sc, struct iwn_rx_desc *desc, /* Send the frame to the 802.11 layer. */ if (ni != NULL) { + if (ni->ni_flags & IEEE80211_NODE_HT) + m->m_flags |= M_AMPDU; (void)ieee80211_input(ni, m, rssi - nf, nf); /* Node is no longer needed. */ ieee80211_free_node(ni); @@ -2352,21 +2435,53 @@ iwn_rx_done(struct iwn_softc *sc, struct iwn_rx_desc *desc, IWN_LOCK(sc); } -#if 0 /* HT */ /* Process an incoming Compressed BlockAck. */ static void iwn_rx_compressed_ba(struct iwn_softc *sc, struct iwn_rx_desc *desc, struct iwn_rx_data *data) { + struct ifnet *ifp = sc->sc_ifp; + struct iwn_node *wn; + struct ieee80211_node *ni; struct iwn_compressed_ba *ba = (struct iwn_compressed_ba *)(desc + 1); struct iwn_tx_ring *txq; + struct ieee80211_tx_ampdu *tap; + uint64_t bitmap; + uint8_t tid; + int ackfailcnt = 0, i, shift; bus_dmamap_sync(sc->rxq.data_dmat, data->map, BUS_DMASYNC_POSTREAD); - txq = &sc->txq[letoh16(ba->qid)]; - /* XXX TBD */ + txq = &sc->txq[le16toh(ba->qid)]; + tap = sc->qid2tap[le16toh(ba->qid)]; + tid = WME_AC_TO_TID(tap->txa_ac); + ni = tap->txa_ni; + wn = (void *)ni; + + if (wn->agg[tid].bitmap == 0) + return; + + shift = wn->agg[tid].startidx - ((le16toh(ba->seq) >> 4) & 0xff); + if (shift < 0) + shift += 0x100; + + if (wn->agg[tid].nframes > (64 - shift)) + return; + + bitmap = (le64toh(ba->bitmap) >> shift) & wn->agg[tid].bitmap; + for (i = 0; bitmap; i++) { + if ((bitmap & 1) == 0) { + ifp->if_oerrors++; + ieee80211_ratectl_tx_complete(ni->ni_vap, ni, + IEEE80211_RATECTL_TX_FAILURE, &ackfailcnt, NULL); + } else { + ifp->if_opackets++; + ieee80211_ratectl_tx_complete(ni->ni_vap, ni, + IEEE80211_RATECTL_TX_SUCCESS, &ackfailcnt, NULL); + } + bitmap >>= 1; + } } -#endif /* * Process a CALIBRATION_RESULT notification sent by the initialization @@ -2495,7 +2610,11 @@ iwn4965_tx_done(struct iwn_softc *sc, struct iwn_rx_desc *desc, struct iwn_rx_data *data) { struct iwn4965_tx_stat *stat = (struct iwn4965_tx_stat *)(desc + 1); - struct iwn_tx_ring *ring = &sc->txq[desc->qid & 0xf]; + struct iwn_tx_ring *ring; + int qid; + + qid = desc->qid & 0xf; + ring = &sc->txq[qid]; DPRINTF(sc, IWN_DEBUG_XMIT, "%s: " "qid %d idx %d retries %d nkill %d rate %x duration %d status %x\n", @@ -2504,7 +2623,13 @@ iwn4965_tx_done(struct iwn_softc *sc, struct iwn_rx_desc *desc, le32toh(stat->status)); bus_dmamap_sync(ring->data_dmat, data->map, BUS_DMASYNC_POSTREAD); - iwn_tx_done(sc, desc, stat->ackfailcnt, le32toh(stat->status) & 0xff); + if (qid >= sc->firstaggqueue) { + iwn_ampdu_tx_done(sc, qid, desc->idx, stat->nframes, + &stat->status); + } else { + iwn_tx_done(sc, desc, stat->ackfailcnt, + le32toh(stat->status) & 0xff); + } } static void @@ -2512,7 +2637,11 @@ iwn5000_tx_done(struct iwn_softc *sc, struct iwn_rx_desc *desc, struct iwn_rx_data *data) { struct iwn5000_tx_stat *stat = (struct iwn5000_tx_stat *)(desc + 1); - struct iwn_tx_ring *ring = &sc->txq[desc->qid & 0xf]; + struct iwn_tx_ring *ring; + int qid; + + qid = desc->qid & 0xf; + ring = &sc->txq[qid]; DPRINTF(sc, IWN_DEBUG_XMIT, "%s: " "qid %d idx %d retries %d nkill %d rate %x duration %d status %x\n", @@ -2526,7 +2655,13 @@ iwn5000_tx_done(struct iwn_softc *sc, struct iwn_rx_desc *desc, #endif bus_dmamap_sync(ring->data_dmat, data->map, BUS_DMASYNC_POSTREAD); - iwn_tx_done(sc, desc, stat->ackfailcnt, le16toh(stat->status) & 0xff); + if (qid >= sc->firstaggqueue) { + iwn_ampdu_tx_done(sc, qid, desc->idx, stat->nframes, + &stat->status); + } else { + iwn_tx_done(sc, desc, stat->ackfailcnt, + le16toh(stat->status) & 0xff); + } } /* @@ -2627,6 +2762,96 @@ iwn_cmd_done(struct iwn_softc *sc, struct iwn_rx_desc *desc) wakeup(&ring->desc[desc->idx]); } +static void +iwn_ampdu_tx_done(struct iwn_softc *sc, int qid, int idx, int nframes, + void *stat) +{ + struct ifnet *ifp = sc->sc_ifp; + struct iwn_tx_ring *ring = &sc->txq[qid]; + struct iwn_tx_data *data; + struct mbuf *m; + struct iwn_node *wn; + struct ieee80211_node *ni; + struct ieee80211vap *vap; + struct ieee80211_tx_ampdu *tap; + uint64_t bitmap; + uint32_t *status = stat; + uint16_t *aggstatus = stat; + uint8_t tid; + int bit, i, lastidx, seqno, shift, start; + +#ifdef NOT_YET + if (nframes == 1) { + if ((*status & 0xff) != 1 && (*status & 0xff) != 2) + printf("ieee80211_send_bar()\n"); + } +#endif + + bitmap = 0; + start = idx; + for (i = 0; i < nframes; i++) { + if (le16toh(aggstatus[i * 2]) & 0xc) + continue; + + idx = le16toh(aggstatus[2*i + 1]) & 0xff; + bit = idx - start; + shift = 0; + if (bit >= 64) { + shift = 0x100 - idx + start; + bit = 0; + start = idx; + } else if (bit <= -64) + bit = 0x100 - start + idx; + else if (bit < 0) { + shift = start - idx; + start = idx; + bit = 0; + } + bitmap = bitmap << shift; + bitmap |= 1ULL << bit; + } + tap = sc->qid2tap[qid]; + tid = WME_AC_TO_TID(tap->txa_ac); + wn = (void *)tap->txa_ni; + wn->agg[tid].bitmap = bitmap; + wn->agg[tid].startidx = start; + wn->agg[tid].nframes = nframes; + + seqno = le32toh(*(status + nframes)) & 0xfff; + for (lastidx = (seqno & 0xff); ring->read != lastidx;) { + data = &ring->data[ring->read]; + + KASSERT(data->ni != NULL, ("no node")); + + /* Unmap and free mbuf. */ + bus_dmamap_sync(ring->data_dmat, data->map, + BUS_DMASYNC_POSTWRITE); + bus_dmamap_unload(ring->data_dmat, data->map); + m = data->m, data->m = NULL; + ni = data->ni, data->ni = NULL; + vap = ni->ni_vap; + + if (m->m_flags & M_TXCB) + ieee80211_process_callback(ni, m, 1); + + m_freem(m); + ieee80211_free_node(ni); + + ring->queued--; + ring->read = (ring->read + 1) % IWN_TX_RING_COUNT; + } + + sc->sc_tx_timer = 0; + if (ring->queued < IWN_TX_RING_LOMARK) { + sc->qfullmsk &= ~(1 << ring->qid); + if (sc->qfullmsk == 0 && + (ifp->if_drv_flags & IFF_DRV_OACTIVE)) { + ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; + iwn_start_locked(ifp); + } + } +} + /* * Process an INT_FH_RX or INT_SW_RX interrupt. */ @@ -2671,12 +2896,10 @@ iwn_notif_intr(struct iwn_softc *sc) iwn_rx_done(sc, desc, data); break; -#if 0 /* HT */ case IWN_RX_COMPRESSED_BA: /* A Compressed BlockAck has been received. */ iwn_rx_compressed_ba(sc, desc, data); break; -#endif case IWN_TX_DONE: /* An 802.11 frame has been transmitted. */ @@ -3053,21 +3276,10 @@ iwn5000_reset_sched(struct iwn_softc *sc, int qid, int idx) } #endif -static uint8_t -iwn_plcp_signal(int rate) { - int i; - - for (i = 0; i < IWN_RIDX_MAX + 1; i++) { - if ((rate & IEEE80211_RATE_VAL) == iwn_rates[i].rate) - return i; - } - - return 0; -} - static int iwn_tx_data(struct iwn_softc *sc, struct mbuf *m, struct ieee80211_node *ni) { + struct iwn_ops *ops = &sc->ops; const struct ieee80211_txparam *tp; struct ieee80211vap *vap = ni->ni_vap; struct ieee80211com *ic = ni->ni_ic; @@ -3077,7 +3289,6 @@ iwn_tx_data(struct iwn_softc *sc, struct mbuf *m, struct ieee80211_node *ni) struct iwn_tx_data *data; struct iwn_tx_cmd *cmd; struct iwn_cmd_data *tx; - const struct iwn_rate *rinfo; struct ieee80211_frame *wh; struct ieee80211_key *k = NULL; struct mbuf *m1; @@ -3104,7 +3315,16 @@ iwn_tx_data(struct iwn_softc *sc, struct mbuf *m, struct ieee80211_node *ni) } ac = M_WME_GETAC(m); - ring = &sc->txq[ac]; + if (IEEE80211_AMPDU_RUNNING(&ni->ni_tx_ampdu[ac])) { + struct ieee80211_tx_ampdu *tap = &ni->ni_tx_ampdu[ac]; + + ring = &sc->txq[*(int *)tap->txa_private]; + *(uint16_t *)wh->i_seq = + htole16(ni->ni_txseqs[tid] << IEEE80211_SEQ_SEQ_SHIFT); + ni->ni_txseqs[tid]++; + } else { + ring = &sc->txq[ac]; + } desc = &ring->desc[ring->cur]; data = &ring->data[ring->cur]; @@ -3121,8 +3341,7 @@ iwn_tx_data(struct iwn_softc *sc, struct mbuf *m, struct ieee80211_node *ni) (void) ieee80211_ratectl_rate(ni, NULL, 0); rate = ni->ni_txrate; } - ridx = iwn_plcp_signal(rate); - rinfo = &iwn_rates[ridx]; + ridx = ic->ic_rt->rateCodeToIndex[rate]; /* Encrypt the frame if need be. */ if (wh->i_fc[1] & IEEE80211_FC1_WEP) { @@ -3141,7 +3360,7 @@ iwn_tx_data(struct iwn_softc *sc, struct mbuf *m, struct ieee80211_node *ni) struct iwn_tx_radiotap_header *tap = &sc->sc_txtap; tap->wt_flags = 0; - tap->wt_rate = rinfo->rate; + tap->wt_rate = rate; if (k != NULL) tap->wt_flags |= IEEE80211_RADIOTAP_F_WEP; @@ -3228,14 +3447,13 @@ iwn_tx_data(struct iwn_softc *sc, struct mbuf *m, struct ieee80211_node *ni) tx->rts_ntries = 60; tx->data_ntries = 15; tx->lifetime = htole32(IWN_LIFETIME_INFINITE); - tx->plcp = rinfo->plcp; - tx->rflags = rinfo->flags; + tx->rate = wn->ridx[rate]; if (tx->id == sc->broadcast_id) { /* Group or management frame. */ tx->linkq = 0; /* XXX Alternate between antenna A and B? */ txant = IWN_LSB(sc->txchainmask); - tx->rflags |= IWN_RFLAG_ANT(txant); + tx->rate |= htole32(IWN_RFLAG_ANT(txant)); } else { tx->linkq = ni->ni_rates.rs_nrates - ridx - 1; flags |= IWN_TX_LINKQ; /* enable MRR */ @@ -3310,10 +3528,8 @@ iwn_tx_data(struct iwn_softc *sc, struct mbuf *m, struct ieee80211_node *ni) bus_dmamap_sync(ring->desc_dma.tag, ring->desc_dma.map, BUS_DMASYNC_PREWRITE); -#ifdef notyet /* Update TX scheduler. */ ops->update_sched(sc, ring->qid, ring->cur, tx->id, totlen); -#endif /* Kick TX ring. */ ring->cur = (ring->cur + 1) % IWN_TX_RING_COUNT; @@ -3330,7 +3546,7 @@ static int iwn_tx_data_raw(struct iwn_softc *sc, struct mbuf *m, struct ieee80211_node *ni, const struct ieee80211_bpf_params *params) { - const struct iwn_rate *rinfo; + struct iwn_ops *ops = &sc->ops; struct ifnet *ifp = sc->sc_ifp; struct ieee80211vap *vap = ni->ni_vap; struct ieee80211com *ic = ifp->if_l2com; @@ -3361,13 +3577,12 @@ iwn_tx_data_raw(struct iwn_softc *sc, struct mbuf *m, /* Choose a TX rate index. */ rate = params->ibp_rate0; - if (!ieee80211_isratevalid(ic->ic_rt, rate)) { + ridx = ic->ic_rt->rateCodeToIndex[rate]; + if (ridx == (uint8_t)-1) { /* XXX fall back to mcast/mgmt rate? */ m_freem(m); return EINVAL; } - ridx = iwn_plcp_signal(rate); - rinfo = &iwn_rates[ridx]; totlen = m->m_pkthdr.len; @@ -3438,12 +3653,14 @@ iwn_tx_data_raw(struct iwn_softc *sc, struct mbuf *m, tx->rts_ntries = params->ibp_try1; tx->data_ntries = params->ibp_try0; tx->lifetime = htole32(IWN_LIFETIME_INFINITE); - tx->plcp = rinfo->plcp; - tx->rflags = rinfo->flags; + tx->rate = htole32(rate2plcp(rate)); + if (ridx < IWN_RIDX_OFDM6 && + IEEE80211_IS_CHAN_2GHZ(ni->ni_chan)) + tx->rate |= htole32(IWN_RFLAG_CCK); /* Group or management frame. */ tx->linkq = 0; txant = IWN_LSB(sc->txchainmask); - tx->rflags |= IWN_RFLAG_ANT(txant); + tx->rate |= htole32(IWN_RFLAG_ANT(txant)); /* Set physical address of "scratch area". */ tx->loaddr = htole32(IWN_LOADDR(data->scratch_paddr)); tx->hiaddr = IWN_HIADDR(data->scratch_paddr); @@ -3514,10 +3731,8 @@ iwn_tx_data_raw(struct iwn_softc *sc, struct mbuf *m, bus_dmamap_sync(ring->desc_dma.tag, ring->desc_dma.map, BUS_DMASYNC_PREWRITE); -#ifdef notyet /* Update TX scheduler. */ ops->update_sched(sc, ring->qid, ring->cur, tx->id, totlen); -#endif /* Kick TX ring. */ ring->cur = (ring->cur + 1) % IWN_TX_RING_COUNT; @@ -3681,6 +3896,7 @@ iwn_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) static int iwn_cmd(struct iwn_softc *sc, int code, const void *buf, int size, int async) { + struct iwn_ops *ops = &sc->ops; struct iwn_tx_ring *ring = &sc->txq[4]; struct iwn_tx_desc *desc; struct iwn_tx_data *data; @@ -3739,10 +3955,8 @@ iwn_cmd(struct iwn_softc *sc, int code, const void *buf, int size, int async) bus_dmamap_sync(ring->desc_dma.tag, ring->desc_dma.map, BUS_DMASYNC_PREWRITE); -#ifdef notyet /* Update TX scheduler. */ ops->update_sched(sc, ring->qid, ring->cur, 0, 0); -#endif /* Kick command ring. */ ring->cur = (ring->cur + 1) % IWN_TX_RING_COUNT; @@ -3783,9 +3997,8 @@ iwn_set_link_quality(struct iwn_softc *sc, struct ieee80211_node *ni) struct iwn_node *wn = (void *)ni; struct ieee80211_rateset *rs = &ni->ni_rates; struct iwn_cmd_link_quality linkq; - const struct iwn_rate *rinfo; uint8_t txant; - int i, txrate; + int i, rate, txrate; /* Use the first valid TX antenna. */ txant = IWN_LSB(sc->txchainmask); @@ -3794,17 +4007,26 @@ iwn_set_link_quality(struct iwn_softc *sc, struct ieee80211_node *ni) linkq.id = wn->id; linkq.antmsk_1stream = txant; linkq.antmsk_2stream = IWN_ANT_AB; - linkq.ampdu_max = 31; + linkq.ampdu_max = 64; linkq.ampdu_threshold = 3; linkq.ampdu_limit = htole16(4000); /* 4ms */ /* Start at highest available bit-rate. */ - txrate = rs->rs_nrates - 1; + if (IEEE80211_IS_CHAN_HT(ni->ni_chan)) + txrate = ni->ni_htrates.rs_nrates - 1; + else + txrate = rs->rs_nrates - 1; for (i = 0; i < IWN_MAX_TX_RETRIES; i++) { - rinfo = &iwn_rates[wn->ridx[txrate]]; - linkq.retry[i].plcp = rinfo->plcp; - linkq.retry[i].rflags = rinfo->flags; - linkq.retry[i].rflags |= IWN_RFLAG_ANT(txant); + if (IEEE80211_IS_CHAN_HT(ni->ni_chan)) + rate = 0x80 | txrate; + else + rate = rs->rs_rates[txrate] & IEEE80211_RATE_VAL; + linkq.retry[i] = wn->ridx[rate]; + + if ((le32toh(wn->ridx[rate]) & IWN_RFLAG_MCS) && + (le32toh(wn->ridx[rate]) & 0xff) > 7) + linkq.mimo = i + 1; + /* Next retry at immediate lower bit-rate. */ if (txrate > 0) txrate--; @@ -3823,7 +4045,6 @@ iwn_add_broadcast_node(struct iwn_softc *sc, int async) struct ieee80211com *ic = ifp->if_l2com; struct iwn_node_info node; struct iwn_cmd_link_quality linkq; - const struct iwn_rate *rinfo; uint8_t txant; int i, error; @@ -3847,16 +4068,13 @@ iwn_add_broadcast_node(struct iwn_softc *sc, int async) /* Use lowest mandatory bit-rate. */ if (IEEE80211_IS_CHAN_5GHZ(ic->ic_curchan)) - rinfo = &iwn_rates[IWN_RIDX_OFDM6]; + linkq.retry[0] = htole32(0xd); else - rinfo = &iwn_rates[IWN_RIDX_CCK1]; - linkq.retry[0].plcp = rinfo->plcp; - linkq.retry[0].rflags = rinfo->flags; - linkq.retry[0].rflags |= IWN_RFLAG_ANT(txant); + linkq.retry[0] = htole32(10 | IWN_RFLAG_CCK); + linkq.retry[0] |= htole32(IWN_RFLAG_ANT(txant)); /* Use same bit-rate for all TX retries. */ for (i = 1; i < IWN_MAX_TX_RETRIES; i++) { - linkq.retry[i].plcp = linkq.retry[0].plcp; - linkq.retry[i].rflags = linkq.retry[0].rflags; + linkq.retry[i] = linkq.retry[0]; } return iwn_cmd(sc, IWN_CMD_LINK_QUALITY, &linkq, sizeof linkq, async); } @@ -4908,6 +5126,7 @@ iwn_scan(struct iwn_softc *sc) struct ifnet *ifp = sc->sc_ifp; struct ieee80211com *ic = ifp->if_l2com; struct ieee80211_scan_state *ss = ic->ic_scan; /*XXX*/ + struct ieee80211_node *ni = ss->ss_vap->iv_bss; struct iwn_scan_hdr *hdr; struct iwn_cmd_data *tx; struct iwn_scan_essid *essid; @@ -4956,18 +5175,17 @@ iwn_scan(struct iwn_softc *sc) if (IEEE80211_IS_CHAN_A(ic->ic_curchan)) { /* Send probe requests at 6Mbps. */ - tx->plcp = iwn_rates[IWN_RIDX_OFDM6].plcp; + tx->rate = htole32(0xd); rs = &ic->ic_sup_rates[IEEE80211_MODE_11A]; } else { hdr->flags = htole32(IWN_RXON_24GHZ | IWN_RXON_AUTO); /* Send probe requests at 1Mbps. */ - tx->plcp = iwn_rates[IWN_RIDX_CCK1].plcp; - tx->rflags = IWN_RFLAG_CCK; + tx->rate = htole32(10 | IWN_RFLAG_CCK); rs = &ic->ic_sup_rates[IEEE80211_MODE_11G]; } /* Use the first valid TX antenna. */ txant = IWN_LSB(sc->txchainmask); - tx->rflags |= IWN_RFLAG_ANT(txant); + tx->rate |= htole32(IWN_RFLAG_ANT(txant)); essid = (struct iwn_scan_essid *)(tx + 1); if (ss->ss_ssid[0].len != 0) { @@ -4994,10 +5212,8 @@ iwn_scan(struct iwn_softc *sc) frm = ieee80211_add_rates(frm, rs); if (rs->rs_nrates > IEEE80211_RATE_SIZE) frm = ieee80211_add_xrates(frm, rs); -#if 0 /* HT */ - if (ic->ic_flags & IEEE80211_F_HTON) - frm = ieee80211_add_htcaps(frm, ic); -#endif + if (ic->ic_htcaps & IEEE80211_HTC_HT) + frm = ieee80211_add_htcap(frm, ni); /* Set length of probe request. */ tx->len = htole16(frm - (uint8_t *)wh); @@ -5124,6 +5340,7 @@ iwn_run(struct iwn_softc *sc, struct ieee80211vap *vap) struct ieee80211com *ic = ifp->if_l2com; struct ieee80211_node *ni = vap->iv_bss; struct iwn_node_info node; + uint32_t htflags = 0; int error; if (ic->ic_opmode == IEEE80211_M_MONITOR) { @@ -5159,26 +5376,22 @@ iwn_run(struct iwn_softc *sc, struct ieee80211vap *vap) sc->rxon.cck_mask = 0x0f; sc->rxon.ofdm_mask = 0x15; } -#if 0 /* HT */ if (IEEE80211_IS_CHAN_HT(ni->ni_chan)) { - sc->rxon.flags &= ~htole32(IWN_RXON_HT); - if (IEEE80211_IS_CHAN_HT40U(ni->ni_chan)) - sc->rxon.flags |= htole32(IWN_RXON_HT40U); - else if (IEEE80211_IS_CHAN_HT40D(ni->ni_chan)) - sc->rxon.flags |= htole32(IWN_RXON_HT40D); - else - sc->rxon.flags |= htole32(IWN_RXON_HT20); - sc->rxon.rxchain = htole16( - IWN_RXCHAIN_VALID(3) - | IWN_RXCHAIN_MIMO_COUNT(3) - | IWN_RXCHAIN_IDLE_COUNT(1) - | IWN_RXCHAIN_MIMO_FORCE); - - maxrxampdu = MS(ni->ni_htparam, IEEE80211_HTCAP_MAXRXAMPDU); - ampdudensity = MS(ni->ni_htparam, IEEE80211_HTCAP_MPDUDENSITY); - } else - maxrxampdu = ampdudensity = 0; -#endif + htflags |= IWN_RXON_HT_PROTMODE(ic->ic_curhtprotmode); + if (IEEE80211_IS_CHAN_HT40(ni->ni_chan)) { + switch (ic->ic_curhtprotmode) { + case IEEE80211_HTINFO_OPMODE_HT20PR: + htflags |= IWN_RXON_HT_MODEPURE40; + break; + default: + htflags |= IWN_RXON_HT_MODEMIXED; + break; + } + } + if (IEEE80211_IS_CHAN_HT40D(ni->ni_chan)) + htflags |= IWN_RXON_HT_HT40MINUS; + } + sc->rxon.flags |= htole32(htflags); sc->rxon.filter |= htole32(IWN_FILTER_BSS); DPRINTF(sc, IWN_DEBUG_STATE, "rxon chan %d flags %x\n", sc->rxon.chan, sc->rxon.flags); @@ -5205,10 +5418,20 @@ iwn_run(struct iwn_softc *sc, struct ieee80211vap *vap) memset(&node, 0, sizeof node); IEEE80211_ADDR_COPY(node.macaddr, ni->ni_macaddr); node.id = IWN_ID_BSS; -#ifdef notyet - node.htflags = htole32(IWN_AMDPU_SIZE_FACTOR(3) | - IWN_AMDPU_DENSITY(5)); /* 2us */ -#endif + if (IEEE80211_IS_CHAN_HT(ni->ni_chan)) { + switch (ni->ni_htcap & IEEE80211_HTCAP_SMPS) { + case IEEE80211_HTCAP_SMPS_ENA: + node.htflags |= htole32(IWN_SMPS_MIMO_DIS); + break; + case IEEE80211_HTCAP_SMPS_DYNAMIC: + node.htflags |= htole32(IWN_SMPS_MIMO_PROT); + break; + } + node.htflags |= htole32(IWN_AMDPU_SIZE_FACTOR(3) | + IWN_AMDPU_DENSITY(5)); /* 4us */ + if (IEEE80211_IS_CHAN_HT40(ni->ni_chan)) + node.htflags |= htole32(IWN_NODE_HT40); + } DPRINTF(sc, IWN_DEBUG_STATE, "%s: adding BSS node\n", __func__); error = ops->add_node(sc, &node, 1); if (error != 0) { @@ -5243,30 +5466,36 @@ iwn_run(struct iwn_softc *sc, struct ieee80211vap *vap) #undef MS } -#if 0 /* HT */ /* * This function is called by upper layer when an ADDBA request is received * from another STA and before the ADDBA response is sent. */ static int -iwn_ampdu_rx_start(struct ieee80211com *ic, struct ieee80211_node *ni, - uint8_t tid) +iwn_ampdu_rx_start(struct ieee80211_node *ni, struct ieee80211_rx_ampdu *rap, + int baparamset, int batimeout, int baseqctl) { - struct ieee80211_rx_ba *ba = &ni->ni_rx_ba[tid]; - struct iwn_softc *sc = ic->ic_softc; +#define MS(_v, _f) (((_v) & _f) >> _f##_S) + struct iwn_softc *sc = ni->ni_ic->ic_ifp->if_softc; struct iwn_ops *ops = &sc->ops; struct iwn_node *wn = (void *)ni; struct iwn_node_info node; + uint8_t tid; + int error; + tid = MS(baparamset, IEEE80211_BAPS_TID); memset(&node, 0, sizeof node); node.id = wn->id; node.control = IWN_NODE_UPDATE; node.flags = IWN_FLAG_SET_ADDBA; node.addba_tid = tid; - node.addba_ssn = htole16(ba->ba_winstart); + node.addba_ssn = htole16(MS(baseqctl, IEEE80211_BASEQ_START)); DPRINTF(sc, IWN_DEBUG_RECV, "ADDBA RA=%d TID=%d SSN=%d\n", - wn->id, tid, ba->ba_winstart); - return ops->add_node(sc, &node, 1); + wn->id, tid, MS(baseqctl, IEEE80211_BASEQ_START)); + error = ops->add_node(sc, &node, 1); + if (error != 0) + return error; + return sc->sc_ampdu_rx_start(ni, rap, baparamset, batimeout, baseqctl); +#undef MS } /* @@ -5274,13 +5503,20 @@ iwn_ampdu_rx_start(struct ieee80211com *ic, struct ieee80211_node *ni, * Block Ack agreement (eg. uppon receipt of a DELBA frame). */ static void -iwn_ampdu_rx_stop(struct ieee80211com *ic, struct ieee80211_node *ni, - uint8_t tid) +iwn_ampdu_rx_stop(struct ieee80211_node *ni, struct ieee80211_rx_ampdu *rap) { - struct iwn_softc *sc = ic->ic_softc; + struct ieee80211com *ic = ni->ni_ic; + struct iwn_softc *sc = ic->ic_ifp->if_softc; struct iwn_ops *ops = &sc->ops; struct iwn_node *wn = (void *)ni; struct iwn_node_info node; + uint8_t tid; + + /* XXX: tid as an argument */ + for (tid = 0; tid < WME_NUM_TID; tid++) { + if (&ni->ni_rx_ampdu[tid] == rap) + break; + } memset(&node, 0, sizeof node); node.id = wn->id; @@ -5289,6 +5525,57 @@ iwn_ampdu_rx_stop(struct ieee80211com *ic, struct ieee80211_node *ni, node.delba_tid = tid; DPRINTF(sc, IWN_DEBUG_RECV, "DELBA RA=%d TID=%d\n", wn->id, tid); (void)ops->add_node(sc, &node, 1); + sc->sc_ampdu_rx_stop(ni, rap); +} + +static int +iwn_addba_request(struct ieee80211_node *ni, struct ieee80211_tx_ampdu *tap, + int dialogtoken, int baparamset, int batimeout) +{ + struct iwn_softc *sc = ni->ni_ic->ic_ifp->if_softc; + int qid; + + for (qid = sc->firstaggqueue; qid < sc->ntxqs; qid++) { + if (sc->qid2tap[qid] == NULL) + break; + } + if (qid == sc->ntxqs) { + DPRINTF(sc, IWN_DEBUG_XMIT, "%s: not free aggregation queue\n", + __func__); + return 0; + } + tap->txa_private = malloc(sizeof(int), M_DEVBUF, M_NOWAIT); + if (tap->txa_private == NULL) { + device_printf(sc->sc_dev, + "%s: failed to alloc TX aggregation structure\n", __func__); + return 0; + } + sc->qid2tap[qid] = tap; + *(int *)tap->txa_private = qid; + return sc->sc_addba_request(ni, tap, dialogtoken, baparamset, + batimeout); +} + +static int +iwn_addba_response(struct ieee80211_node *ni, struct ieee80211_tx_ampdu *tap, + int code, int baparamset, int batimeout) +{ + struct iwn_softc *sc = ni->ni_ic->ic_ifp->if_softc; + int qid = *(int *)tap->txa_private; + uint8_t tid = WME_AC_TO_TID(tap->txa_ac); + int ret; + + if (code == IEEE80211_STATUS_SUCCESS) { + ni->ni_txseqs[tid] = tap->txa_start & 0xfff; + ret = iwn_ampdu_tx_start(ni->ni_ic, ni, tid); + if (ret != 1) + return ret; + } else { + sc->qid2tap[qid] = NULL; + free(tap->txa_private, M_DEVBUF); + tap->txa_private = NULL; + } + return sc->sc_addba_response(ni, tap, code, baparamset, batimeout); } /* @@ -5299,12 +5586,12 @@ static int iwn_ampdu_tx_start(struct ieee80211com *ic, struct ieee80211_node *ni, uint8_t tid) { - struct ieee80211_tx_ba *ba = &ni->ni_tx_ba[tid]; - struct iwn_softc *sc = ic->ic_softc; + struct ieee80211_tx_ampdu *tap = &ni->ni_tx_ampdu[TID_TO_WME_AC(tid)]; + struct iwn_softc *sc = ni->ni_ic->ic_ifp->if_softc; struct iwn_ops *ops = &sc->ops; struct iwn_node *wn = (void *)ni; struct iwn_node_info node; - int error; + int error, qid; /* Enable TX for the specified RA/TID. */ wn->disable_tid &= ~(1 << tid); @@ -5315,35 +5602,40 @@ iwn_ampdu_tx_start(struct ieee80211com *ic, struct ieee80211_node *ni, node.disable_tid = htole16(wn->disable_tid); error = ops->add_node(sc, &node, 1); if (error != 0) - return error; + return 0; if ((error = iwn_nic_lock(sc)) != 0) - return error; - ops->ampdu_tx_start(sc, ni, tid, ba->ba_winstart); + return 0; + qid = *(int *)tap->txa_private; + ops->ampdu_tx_start(sc, ni, qid, tid, tap->txa_start & 0xfff); iwn_nic_unlock(sc); - return 0; + + iwn_set_link_quality(sc, ni); + return 1; } static void -iwn_ampdu_tx_stop(struct ieee80211com *ic, struct ieee80211_node *ni, - uint8_t tid) +iwn_ampdu_tx_stop(struct ieee80211_node *ni, struct ieee80211_tx_ampdu *tap) { - struct ieee80211_tx_ba *ba = &ni->ni_tx_ba[tid]; - struct iwn_softc *sc = ic->ic_softc; + struct iwn_softc *sc = ni->ni_ic->ic_ifp->if_softc; struct iwn_ops *ops = &sc->ops; + uint8_t tid = WME_AC_TO_TID(tap->txa_ac); + int qid = *(int *)tap->txa_private; if (iwn_nic_lock(sc) != 0) return; - ops->ampdu_tx_stop(sc, tid, ba->ba_winstart); + ops->ampdu_tx_stop(sc, qid, tid, tap->txa_start & 0xfff); iwn_nic_unlock(sc); + sc->qid2tap[qid] = NULL; + free(tap->txa_private, M_DEVBUF); + tap->txa_private = NULL; } static void iwn4965_ampdu_tx_start(struct iwn_softc *sc, struct ieee80211_node *ni, - uint8_t tid, uint16_t ssn) + int qid, uint8_t tid, uint16_t ssn) { struct iwn_node *wn = (void *)ni; - int qid = 7 + tid; /* Stop TX scheduler while we're changing its configuration. */ iwn_prph_write(sc, IWN4965_SCHED_QUEUE_STATUS(qid), @@ -5357,6 +5649,7 @@ iwn4965_ampdu_tx_start(struct iwn_softc *sc, struct ieee80211_node *ni, iwn_prph_setbits(sc, IWN4965_SCHED_QCHAIN_SEL, 1 << qid); /* Set starting sequence number from the ADDBA request. */ + sc->txq[qid].cur = sc->txq[qid].read = (ssn & 0xff); IWN_WRITE(sc, IWN_HBUS_TARG_WRPTR, qid << 8 | (ssn & 0xff)); iwn_prph_write(sc, IWN4965_SCHED_QUEUE_RDPTR(qid), ssn); @@ -5377,10 +5670,8 @@ iwn4965_ampdu_tx_start(struct iwn_softc *sc, struct ieee80211_node *ni, } static void -iwn4965_ampdu_tx_stop(struct iwn_softc *sc, uint8_t tid, uint16_t ssn) +iwn4965_ampdu_tx_stop(struct iwn_softc *sc, int qid, uint8_t tid, uint16_t ssn) { - int qid = 7 + tid; - /* Stop TX scheduler while we're changing its configuration. */ iwn_prph_write(sc, IWN4965_SCHED_QUEUE_STATUS(qid), IWN4965_TXQ_STATUS_CHGACT); @@ -5399,10 +5690,9 @@ iwn4965_ampdu_tx_stop(struct iwn_softc *sc, uint8_t tid, uint16_t ssn) static void iwn5000_ampdu_tx_start(struct iwn_softc *sc, struct ieee80211_node *ni, - uint8_t tid, uint16_t ssn) + int qid, uint8_t tid, uint16_t ssn) { struct iwn_node *wn = (void *)ni; - int qid = 10 + tid; /* Stop TX scheduler while we're changing its configuration. */ iwn_prph_write(sc, IWN5000_SCHED_QUEUE_STATUS(qid), @@ -5419,6 +5709,7 @@ iwn5000_ampdu_tx_start(struct iwn_softc *sc, struct ieee80211_node *ni, iwn_prph_setbits(sc, IWN5000_SCHED_AGGR_SEL, 1 << qid); /* Set starting sequence number from the ADDBA request. */ + sc->txq[qid].cur = sc->txq[qid].read = (ssn & 0xff); IWN_WRITE(sc, IWN_HBUS_TARG_WRPTR, qid << 8 | (ssn & 0xff)); iwn_prph_write(sc, IWN5000_SCHED_QUEUE_RDPTR(qid), ssn); @@ -5435,10 +5726,8 @@ iwn5000_ampdu_tx_start(struct iwn_softc *sc, struct ieee80211_node *ni, } static void -iwn5000_ampdu_tx_stop(struct iwn_softc *sc, uint8_t tid, uint16_t ssn) +iwn5000_ampdu_tx_stop(struct iwn_softc *sc, int qid, uint8_t tid, uint16_t ssn) { - int qid = 10 + tid; - /* Stop TX scheduler while we're changing its configuration. */ iwn_prph_write(sc, IWN5000_SCHED_QUEUE_STATUS(qid), IWN5000_TXQ_STATUS_CHGACT); @@ -5457,7 +5746,6 @@ iwn5000_ampdu_tx_stop(struct iwn_softc *sc, uint8_t tid, uint16_t ssn) iwn_prph_write(sc, IWN5000_SCHED_QUEUE_STATUS(qid), IWN5000_TXQ_STATUS_INACTIVE | iwn_tid2fifo[tid]); } -#endif /* * Query calibration tables from the initialization firmware. We do this diff --git a/sys/dev/iwn/if_iwnreg.h b/sys/dev/iwn/if_iwnreg.h index be70b49..4cbf652 100644 --- a/sys/dev/iwn/if_iwnreg.h +++ b/sys/dev/iwn/if_iwnreg.h @@ -27,6 +27,9 @@ #define IWN4965_NTXQUEUES 16 #define IWN5000_NTXQUEUES 20 +#define IWN4965_FIRSTAGGQUEUE 7 +#define IWN5000_FIRSTAGGQUEUE 10 + #define IWN4965_NDMACHNLS 7 #define IWN5000_NDMACHNLS 8 @@ -489,6 +492,10 @@ struct iwn_rxon { #define IWN_RXON_ANTENNA_A (1 << 8) #define IWN_RXON_ANTENNA_B (1 << 9) #define IWN_RXON_TSF (1 << 15) +#define IWN_RXON_HT_HT40MINUS (1 << 22) +#define IWN_RXON_HT_PROTMODE(x) (x << 23) +#define IWN_RXON_HT_MODEPURE40 (1 << 25) +#define IWN_RXON_HT_MODEMIXED (2 << 25) #define IWN_RXON_CTS_TO_SELF (1 << 30) uint32_t filter; @@ -588,7 +595,10 @@ struct iwn_node_info { uint8_t txmic[8]; uint32_t htflags; +#define IWN_SMPS_MIMO_PROT (1 << 17) #define IWN_AMDPU_SIZE_FACTOR(x) ((x) << 19) +#define IWN_NODE_HT40 (1 << 21) +#define IWN_SMPS_MIMO_DIS (1 << 22) #define IWN_AMDPU_DENSITY(x) ((x) << 23) uint32_t mask; @@ -625,8 +635,13 @@ struct iwn4965_node_info { uint32_t reserved7; } __packed; -#define IWN_RFLAG_CCK (1 << 1) -#define IWN_RFLAG_ANT(x) ((x) << 6) +#define IWN_RFLAG_MCS (1 << 8) +#define IWN_RFLAG_CCK (1 << 9) +#define IWN_RFLAG_GREENFIELD (1 << 10) +#define IWN_RFLAG_HT40 (1 << 11) +#define IWN_RFLAG_DUPLICATE (1 << 12) +#define IWN_RFLAG_SGI (1 << 13) +#define IWN_RFLAG_ANT(x) ((x) << 14) /* Structure for command IWN_CMD_TX_DATA. */ struct iwn_cmd_data { @@ -647,9 +662,7 @@ struct iwn_cmd_data { #define IWN_TX_NEED_PADDING (1 << 20) uint32_t scratch; - uint8_t plcp; - uint8_t rflags; - uint16_t xrflags; + uint32_t rate; uint8_t id; uint8_t security; @@ -690,11 +703,7 @@ struct iwn_cmd_link_quality { uint8_t ampdu_threshold; uint8_t ampdu_max; uint32_t reserved2; - struct { - uint8_t plcp; - uint8_t rflags; - uint16_t xrflags; - } __packed retry[IWN_MAX_TX_RETRIES]; + uint32_t retry[IWN_MAX_TX_RETRIES]; uint32_t reserved3; } __packed; @@ -1065,9 +1074,7 @@ struct iwn4965_tx_stat { uint8_t btkillcnt; uint8_t rtsfailcnt; uint8_t ackfailcnt; - uint8_t rate; - uint8_t rflags; - uint16_t xrflags; + uint32_t rate; uint16_t duration; uint16_t reserved; uint32_t power[2]; @@ -1079,9 +1086,7 @@ struct iwn5000_tx_stat { uint8_t btkillcnt; uint8_t rtsfailcnt; uint8_t ackfailcnt; - uint8_t rate; - uint8_t rflags; - uint16_t xrflags; + uint32_t rate; uint16_t duration; uint16_t reserved; uint32_t power[2]; @@ -1136,9 +1141,7 @@ struct iwn_rx_stat { uint16_t chan; uint8_t phybuf[32]; - uint8_t rate; - uint8_t rflags; - uint16_t xrflags; + uint32_t rate; uint16_t len; uint16_t reserve3; } __packed; @@ -1403,6 +1406,7 @@ struct iwn_fw_tlv { #define IWN5000_EEPROM_BAND4 0x02e #define IWN5000_EEPROM_BAND5 0x03a #define IWN5000_EEPROM_BAND6 0x041 +#define IWN6000_EEPROM_BAND6 0x040 #define IWN5000_EEPROM_BAND7 0x049 #define IWN6000_EEPROM_ENHINFO 0x054 #define IWN5000_EEPROM_CRYSTAL 0x128 @@ -1432,7 +1436,17 @@ struct iwn_eeprom_chan { } __packed; struct iwn_eeprom_enhinfo { - uint16_t chan; + uint8_t flags; +#define IWN_ENHINFO_VALID 0x01 +#define IWN_ENHINFO_5GHZ 0x02 +#define IWN_ENHINFO_OFDM 0x04 +#define IWN_ENHINFO_HT40 0x08 +#define IWN_ENHINFO_HTAP 0x10 +#define IWN_ENHINFO_RES1 0x20 +#define IWN_ENHINFO_RES2 0x40 +#define IWN_ENHINFO_COMMON 0x80 + + uint8_t chan; int8_t chain[3]; /* max power in half-dBm */ uint8_t reserved; int8_t mimo2; /* max power in half-dBm */ @@ -1486,6 +1500,16 @@ static const uint32_t iwn5000_regulatory_bands[IWN_NBANDS] = { IWN5000_EEPROM_BAND7 }; +static const uint32_t iwn6000_regulatory_bands[IWN_NBANDS] = { + IWN5000_EEPROM_BAND1, + IWN5000_EEPROM_BAND2, + IWN5000_EEPROM_BAND3, + IWN5000_EEPROM_BAND4, + IWN5000_EEPROM_BAND5, + IWN6000_EEPROM_BAND6, + IWN5000_EEPROM_BAND7 +}; + #define IWN_CHAN_BANDS_COUNT 7 #define IWN_MAX_CHAN_PER_BAND 14 static const struct iwn_chan_band { @@ -1513,26 +1537,6 @@ static const struct iwn_chan_band { #define IWN_RIDX_CCK1 0 #define IWN_RIDX_OFDM6 4 -static const struct iwn_rate { - uint8_t rate; - uint8_t plcp; - uint8_t flags; -} iwn_rates[IWN_RIDX_MAX + 1] = { - { 2, 10, IWN_RFLAG_CCK }, - { 4, 20, IWN_RFLAG_CCK }, - { 11, 55, IWN_RFLAG_CCK }, - { 22, 110, IWN_RFLAG_CCK }, - { 12, 0xd, 0 }, - { 18, 0xf, 0 }, - { 24, 0x5, 0 }, - { 36, 0x7, 0 }, - { 48, 0x9, 0 }, - { 72, 0xb, 0 }, - { 96, 0x1, 0 }, - { 108, 0x3, 0 }, - { 120, 0x3, 0 } -}; - #define IWN4965_MAX_PWR_INDEX 107 /* diff --git a/sys/dev/iwn/if_iwnvar.h b/sys/dev/iwn/if_iwnvar.h index a61b3b5..5f46a36 100644 --- a/sys/dev/iwn/if_iwnvar.h +++ b/sys/dev/iwn/if_iwnvar.h @@ -78,6 +78,7 @@ struct iwn_tx_ring { int qid; int queued; int cur; + int read; }; struct iwn_softc; @@ -101,7 +102,12 @@ struct iwn_node { struct ieee80211_node ni; /* must be the first */ uint16_t disable_tid; uint8_t id; - uint8_t ridx[IEEE80211_RATE_MAXSIZE]; + uint32_t ridx[256]; + struct { + uint64_t bitmap; + int startidx; + int nframes; + } agg[IEEE80211_TID_SIZE]; }; struct iwn_calib_state { @@ -174,12 +180,10 @@ struct iwn_ops { int); void (*tx_done)(struct iwn_softc *, struct iwn_rx_desc *, struct iwn_rx_data *); -#if 0 /* HT */ void (*ampdu_tx_start)(struct iwn_softc *, - struct ieee80211_node *, uint8_t, uint16_t); - void (*ampdu_tx_stop)(struct iwn_softc *, uint8_t, + struct ieee80211_node *, int, uint8_t, uint16_t); + void (*ampdu_tx_stop)(struct iwn_softc *, int, uint8_t, uint16_t); -#endif }; struct iwn_vap { @@ -215,6 +219,7 @@ struct iwn_softc { const struct iwn_sensitivity_limits *limits; int ntxqs; + int firstaggqueue; int ndmachnls; uint8_t broadcast_id; int rxonsz; @@ -295,7 +300,6 @@ struct iwn_softc { int8_t maxpwr2GHz; int8_t maxpwr5GHz; int8_t maxpwr[IEEE80211_CHAN_MAX]; - int8_t enh_maxpwr[35]; int32_t temp_off; uint32_t int_mask; @@ -307,6 +311,20 @@ struct iwn_softc { int sc_tx_timer; + struct ieee80211_tx_ampdu *qid2tap[IWN5000_NTXQUEUES]; + + int (*sc_ampdu_rx_start)(struct ieee80211_node *, + struct ieee80211_rx_ampdu *, int, int, int); + void (*sc_ampdu_rx_stop)(struct ieee80211_node *, + struct ieee80211_rx_ampdu *); + int (*sc_addba_request)(struct ieee80211_node *, + struct ieee80211_tx_ampdu *, int, int, int); + int (*sc_addba_response)(struct ieee80211_node *, + struct ieee80211_tx_ampdu *, int, int, int); + void (*sc_addba_stop)(struct ieee80211_node *, + struct ieee80211_tx_ampdu *); + + struct iwn_rx_radiotap_header sc_rxtap; struct iwn_tx_radiotap_header sc_txtap; }; --Boundary-00=_CHUvNNJ7ZQlWu6H-- From owner-freebsd-wireless@FreeBSD.ORG Sun May 1 13:24:22 2011 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id C76A5106566B; Sun, 1 May 2011 13:24:22 +0000 (UTC) (envelope-from bschmidt@techwires.net) Received: from mail-fx0-f54.google.com (mail-fx0-f54.google.com [209.85.161.54]) by mx1.freebsd.org (Postfix) with ESMTP id D5A7E8FC0A; Sun, 1 May 2011 13:24:21 +0000 (UTC) Received: by fxm11 with SMTP id 11so4786903fxm.13 for ; Sun, 01 May 2011 06:24:20 -0700 (PDT) Received: by 10.223.58.72 with SMTP id f8mr1506947fah.137.1304256260817; Sun, 01 May 2011 06:24:20 -0700 (PDT) Received: from amy.lab.techwires.net (dslb-088-067-204-093.pools.arcor-ip.net [88.67.204.93]) by mx.google.com with ESMTPS id j12sm1464517fax.33.2011.05.01.06.24.04 (version=SSLv3 cipher=OTHER); Sun, 01 May 2011 06:24:19 -0700 (PDT) Sender: Bernhard Schmidt From: Bernhard Schmidt To: freebsd-wireless@freebsd.org Date: Sun, 1 May 2011 15:24:09 +0200 User-Agent: KMail/1.13.7 (FreeBSD/8.2-STABLE; KDE/4.6.2; amd64; ; ) References: <201105011319.30649.bschmidt@freebsd.org> In-Reply-To: <201105011319.30649.bschmidt@freebsd.org> MIME-Version: 1.0 Content-Type: Multipart/Mixed; boundary="Boundary-00=_57VvNvUbwvnkjXW" Message-Id: <201105011524.09613.bschmidt@freebsd.org> Cc: freebsd-net@freebsd.org Subject: Re: CFT: 11n support for iwn(4) X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Discussions of 802.11 stack, tools device driver development." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 01 May 2011 13:24:22 -0000 --Boundary-00=_57VvNvUbwvnkjXW Content-Type: Text/Plain; charset="iso-8859-15" Content-Transfer-Encoding: 7bit On Sunday 01 May 2011 13:19:30 Bernhard Schmidt wrote: > Hi, > > I finally managed to get the 11n bits for iwn(4) sorted out. Well, > there is still an issue somewhere with HT40 frame protection or > TX chain setup on 5000 adapters, resulting in throughput not being > that stable. But overall it seems to work pretty decently > > This is for HEAD only right now, net80211 in stable/8 does not yet > contain the latest 11n related fixes. So, if you run HEAD and have > some iwn(4) hardware, I'd appreciate feedback. > .. Updated version, I've missed a locking issue. -- Bernhard --Boundary-00=_57VvNvUbwvnkjXW Content-Type: text/x-patch; charset="ISO-8859-1"; name="iwn_ht2.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="iwn_ht2.diff" diff --git a/sys/dev/iwn/if_iwn.c b/sys/dev/iwn/if_iwn.c index 7d6ec68..e2cf4be 100644 --- a/sys/dev/iwn/if_iwn.c +++ b/sys/dev/iwn/if_iwn.c @@ -152,9 +152,7 @@ static void iwn4965_print_power_group(struct iwn_softc *, int); static void iwn5000_read_eeprom(struct iwn_softc *); static uint32_t iwn_eeprom_channel_flags(struct iwn_eeprom_chan *); static void iwn_read_eeprom_band(struct iwn_softc *, int); -#if 0 /* HT */ static void iwn_read_eeprom_ht40(struct iwn_softc *, int); -#endif static void iwn_read_eeprom_channels(struct iwn_softc *, int, uint32_t); static struct iwn_eeprom_chan *iwn_find_eeprom_channel(struct iwn_softc *, struct ieee80211_channel *); @@ -172,10 +170,8 @@ static void iwn_rx_phy(struct iwn_softc *, struct iwn_rx_desc *, struct iwn_rx_data *); static void iwn_rx_done(struct iwn_softc *, struct iwn_rx_desc *, struct iwn_rx_data *); -#if 0 /* HT */ 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 *, @@ -186,6 +182,7 @@ static void iwn5000_tx_done(struct iwn_softc *, struct iwn_rx_desc *, struct iwn_rx_data *); static void iwn_tx_done(struct iwn_softc *, struct iwn_rx_desc *, int, uint8_t); +static void iwn_ampdu_tx_done(struct iwn_softc *, int, int, int, void *); static void iwn_cmd_done(struct iwn_softc *, struct iwn_rx_desc *); static void iwn_notif_intr(struct iwn_softc *); static void iwn_wakeup_intr(struct iwn_softc *); @@ -199,7 +196,6 @@ static void iwn5000_update_sched(struct iwn_softc *, int, int, uint8_t, #ifdef notyet static void iwn5000_reset_sched(struct iwn_softc *, int, int); #endif -static uint8_t iwn_plcp_signal(int); static int iwn_tx_data(struct iwn_softc *, struct mbuf *, struct ieee80211_node *); static int iwn_tx_data_raw(struct iwn_softc *, struct mbuf *, @@ -252,24 +248,26 @@ static uint8_t *ieee80211_add_ssid(uint8_t *, const uint8_t *, u_int); static int iwn_scan(struct iwn_softc *); static int iwn_auth(struct iwn_softc *, struct ieee80211vap *vap); static int iwn_run(struct iwn_softc *, struct ieee80211vap *vap); -#if 0 /* HT */ -static int iwn_ampdu_rx_start(struct ieee80211com *, - struct ieee80211_node *, uint8_t); -static void iwn_ampdu_rx_stop(struct ieee80211com *, - struct ieee80211_node *, uint8_t); +static int iwn_ampdu_rx_start(struct ieee80211_node *, + struct ieee80211_rx_ampdu *, int, int, int); +static void iwn_ampdu_rx_stop(struct ieee80211_node *, + struct ieee80211_rx_ampdu *); +static int iwn_addba_request(struct ieee80211_node *, + struct ieee80211_tx_ampdu *, int, int, int); +static int iwn_addba_response(struct ieee80211_node *, + struct ieee80211_tx_ampdu *, int, int, int); static int iwn_ampdu_tx_start(struct ieee80211com *, struct ieee80211_node *, uint8_t); -static void iwn_ampdu_tx_stop(struct ieee80211com *, - struct ieee80211_node *, uint8_t); +static void iwn_ampdu_tx_stop(struct ieee80211_node *, + struct ieee80211_tx_ampdu *); static void iwn4965_ampdu_tx_start(struct iwn_softc *, - struct ieee80211_node *, uint8_t, uint16_t); -static void iwn4965_ampdu_tx_stop(struct iwn_softc *, + struct ieee80211_node *, int, uint8_t, uint16_t); +static void iwn4965_ampdu_tx_stop(struct iwn_softc *, int, uint8_t, uint16_t); static void iwn5000_ampdu_tx_start(struct iwn_softc *, - struct ieee80211_node *, uint8_t, uint16_t); -static void iwn5000_ampdu_tx_stop(struct iwn_softc *, + struct ieee80211_node *, int, uint8_t, uint16_t); +static void iwn5000_ampdu_tx_stop(struct iwn_softc *, int, 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_wimax_coex(struct iwn_softc *); @@ -550,21 +548,6 @@ iwn_attach(device_t dev) /* Clear pending interrupts. */ IWN_WRITE(sc, IWN_INT, 0xffffffff); - /* Count the number of available chains. */ - sc->ntxchains = - ((sc->txchainmask >> 2) & 1) + - ((sc->txchainmask >> 1) & 1) + - ((sc->txchainmask >> 0) & 1); - sc->nrxchains = - ((sc->rxchainmask >> 2) & 1) + - ((sc->rxchainmask >> 1) & 1) + - ((sc->rxchainmask >> 0) & 1); - if (bootverbose) { - device_printf(dev, "MIMO %dT%dR, %.4s, address %6D\n", - sc->ntxchains, sc->nrxchains, sc->eeprom_domain, - macaddr, ":"); - } - ifp = sc->sc_ifp = if_alloc(IFT_IEEE80211); if (ifp == NULL) { device_printf(dev, "can not allocate ifnet structure\n"); @@ -584,42 +567,13 @@ iwn_attach(device_t dev) | IEEE80211_C_SHSLOT /* short slot time supported */ | IEEE80211_C_WPA | IEEE80211_C_SHPREAMBLE /* short preamble supported */ - | IEEE80211_C_BGSCAN /* background scanning */ #if 0 | IEEE80211_C_IBSS /* ibss/adhoc mode */ #endif | IEEE80211_C_WME /* WME */ ; -#if 0 /* HT */ - /* XXX disable until HT channel setup works */ - ic->ic_htcaps = - IEEE80211_HTCAP_SMPS_ENA /* SM PS mode enabled */ - | IEEE80211_HTCAP_CHWIDTH40 /* 40MHz channel width */ - | IEEE80211_HTCAP_SHORTGI20 /* short GI in 20MHz */ - | IEEE80211_HTCAP_SHORTGI40 /* short GI in 40MHz */ - | IEEE80211_HTCAP_RXSTBC_2STREAM/* 1-2 spatial streams */ - | IEEE80211_HTCAP_MAXAMSDU_3839 /* max A-MSDU length */ - /* s/w capabilities */ - | IEEE80211_HTC_HT /* HT operation */ - | IEEE80211_HTC_AMPDU /* tx A-MPDU */ - | IEEE80211_HTC_AMSDU /* tx A-MSDU */ - ; - - /* Set HT capabilities. */ - ic->ic_htcaps = -#if IWN_RBUF_SIZE == 8192 - IEEE80211_HTCAP_AMSDU7935 | -#endif - IEEE80211_HTCAP_CBW20_40 | - IEEE80211_HTCAP_SGI20 | - IEEE80211_HTCAP_SGI40; if (sc->hw_type != IWN_HW_REV_TYPE_4965) - ic->ic_htcaps |= IEEE80211_HTCAP_GF; - if (sc->hw_type == IWN_HW_REV_TYPE_6050) - ic->ic_htcaps |= IEEE80211_HTCAP_SMPS_DYN; - else - ic->ic_htcaps |= IEEE80211_HTCAP_SMPS_DIS; -#endif + ic->ic_caps |= IEEE80211_C_BGSCAN; /* background scanning */ /* Read MAC address, channels, etc from EEPROM. */ if ((error = iwn_read_eeprom(sc, macaddr)) != 0) { @@ -628,14 +582,49 @@ iwn_attach(device_t dev) goto fail; } -#if 0 /* HT */ - /* Set supported HT rates. */ - ic->ic_sup_mcs[0] = 0xff; - if (sc->nrxchains > 1) - ic->ic_sup_mcs[1] = 0xff; - if (sc->nrxchains > 2) - ic->ic_sup_mcs[2] = 0xff; + /* Count the number of available chains. */ + sc->ntxchains = + ((sc->txchainmask >> 2) & 1) + + ((sc->txchainmask >> 1) & 1) + + ((sc->txchainmask >> 0) & 1); + sc->nrxchains = + ((sc->rxchainmask >> 2) & 1) + + ((sc->rxchainmask >> 1) & 1) + + ((sc->rxchainmask >> 0) & 1); + if (bootverbose) { + device_printf(dev, "MIMO %dT%dR, %.4s, address %6D\n", + sc->ntxchains, sc->nrxchains, sc->eeprom_domain, + macaddr, ":"); + } + + if (sc->sc_flags & IWN_FLAG_HAS_11N) { + ic->ic_rxstream = sc->nrxchains; + ic->ic_txstream = sc->ntxchains; + ic->ic_htcaps = + IEEE80211_HTCAP_SMPS_ENA /* SM PS mode enabled */ + | IEEE80211_HTCAP_CHWIDTH40 /* 40MHz channel width*/ + | IEEE80211_HTCAP_SHORTGI20 /* short GI in 20MHz */ + | IEEE80211_HTCAP_SHORTGI40 /* short GI in 40MHz */ +#if IWN_RBUF_SIZE == 8192 + | IEEE80211_HTCAP_MAXAMSDU_7935 /* max A-MSDU length */ +#else + | IEEE80211_HTCAP_MAXAMSDU_3839 /* max A-MSDU length */ +#endif +#ifdef notyet + | IEEE80211_HTCAP_GREENFIELD +#endif + /* s/w capabilities */ + | IEEE80211_HTC_HT /* HT operation */ + | IEEE80211_HTC_AMPDU /* tx A-MPDU */ +#ifdef notyet + | IEEE80211_HTC_AMSDU /* tx A-MSDU */ #endif + ; + if (sc->hw_type == IWN_HW_REV_TYPE_6050) + ic->ic_htcaps |= IEEE80211_HTCAP_SMPS_DYNAMIC; + else + ic->ic_htcaps |= IEEE80211_HTCAP_SMPS_OFF; + } if_initname(ifp, device_get_name(dev), device_get_unit(dev)); ifp->if_softc = sc; @@ -652,12 +641,16 @@ iwn_attach(device_t dev) ic->ic_vap_delete = iwn_vap_delete; ic->ic_raw_xmit = iwn_raw_xmit; ic->ic_node_alloc = iwn_node_alloc; -#if 0 /* HT */ + sc->sc_ampdu_rx_start = ic->ic_ampdu_rx_start; ic->ic_ampdu_rx_start = iwn_ampdu_rx_start; + sc->sc_ampdu_rx_stop = ic->ic_ampdu_rx_stop; ic->ic_ampdu_rx_stop = iwn_ampdu_rx_stop; - ic->ic_ampdu_tx_start = iwn_ampdu_tx_start; - ic->ic_ampdu_tx_stop = iwn_ampdu_tx_stop; -#endif + sc->sc_addba_request = ic->ic_addba_request; + ic->ic_addba_request = iwn_addba_request; + sc->sc_addba_response = ic->ic_addba_response; + ic->ic_addba_response = iwn_addba_response; + sc->sc_addba_stop = ic->ic_addba_stop; + ic->ic_addba_stop = iwn_ampdu_tx_stop; ic->ic_newassoc = iwn_newassoc; ic->ic_wme.wme_update = iwn_updateedca; ic->ic_update_mcast = iwn_update_mcast; @@ -714,11 +707,10 @@ iwn4965_attach(struct iwn_softc *sc, uint16_t pid) ops->set_gains = iwn4965_set_gains; ops->add_node = iwn4965_add_node; ops->tx_done = iwn4965_tx_done; -#if 0 /* HT */ ops->ampdu_tx_start = iwn4965_ampdu_tx_start; ops->ampdu_tx_stop = iwn4965_ampdu_tx_stop; -#endif sc->ntxqs = IWN4965_NTXQUEUES; + sc->firstaggqueue = IWN4965_FIRSTAGGQUEUE; sc->ndmachnls = IWN4965_NDMACHNLS; sc->broadcast_id = IWN4965_ID_BROADCAST; sc->rxonsz = IWN4965_RXONSZ; @@ -753,11 +745,10 @@ iwn5000_attach(struct iwn_softc *sc, uint16_t pid) ops->set_gains = iwn5000_set_gains; ops->add_node = iwn5000_add_node; ops->tx_done = iwn5000_tx_done; -#if 0 /* HT */ ops->ampdu_tx_start = iwn5000_ampdu_tx_start; ops->ampdu_tx_stop = iwn5000_ampdu_tx_stop; -#endif sc->ntxqs = IWN5000_NTXQUEUES; + sc->firstaggqueue = IWN5000_FIRSTAGGQUEUE; sc->ndmachnls = IWN5000_NDMACHNLS; sc->broadcast_id = IWN5000_ID_BROADCAST; sc->rxonsz = IWN5000_RXONSZ; @@ -1489,13 +1480,6 @@ iwn_alloc_tx_ring(struct iwn_softc *sc, struct iwn_tx_ring *ring, int qid) __func__, error); goto fail; } - /* - * We only use rings 0 through 4 (4 EDCA + cmd) so there is no need - * to allocate commands space for other rings. - * XXX Do we really need to allocate descriptors for other rings? - */ - if (qid > 4) - return 0; size = IWN_TX_RING_COUNT * sizeof (struct iwn_tx_cmd); error = iwn_dma_contig_alloc(sc, &ring->cmd_dma, (void **)&ring->cmd, @@ -1694,7 +1678,7 @@ iwn4965_read_eeprom(struct iwn_softc *sc) iwn_read_prom_data(sc, IWN4965_EEPROM_DOMAIN, sc->eeprom_domain, 4); /* Read the list of authorized channels (20MHz ones only). */ - for (i = 0; i < 5; i++) { + for (i = 0; i < 7; i++) { addr = iwn4965_regulatory_bands[i]; iwn_read_eeprom_channels(sc, i, addr); } @@ -1781,8 +1765,11 @@ iwn5000_read_eeprom(struct iwn_softc *sc) sc->eeprom_domain, 4); /* Read the list of authorized channels (20MHz ones only). */ - for (i = 0; i < 5; i++) { - addr = base + iwn5000_regulatory_bands[i]; + for (i = 0; i < 7; i++) { + if (sc->hw_type >= IWN_HW_REV_TYPE_6000) + addr = base + iwn6000_regulatory_bands[i]; + else + addr = base + iwn5000_regulatory_bands[i]; iwn_read_eeprom_channels(sc, i, addr); } @@ -1884,18 +1871,15 @@ iwn_read_eeprom_band(struct iwn_softc *sc, int n) "add chan %d flags 0x%x maxpwr %d\n", chan, channels[i].flags, channels[i].maxpwr); -#if 0 /* HT */ - /* XXX no constraints on using HT20 */ - /* add HT20, HT40 added separately */ - c = &ic->ic_channels[ic->ic_nchans++]; - c[0] = c[-1]; - c->ic_flags |= IEEE80211_CHAN_HT20; - /* XXX NARROW =>'s 1/2 and 1/4 width? */ -#endif + if (sc->sc_flags & IWN_FLAG_HAS_11N) { + /* add HT20, HT40 added separately */ + c = &ic->ic_channels[ic->ic_nchans++]; + c[0] = c[-1]; + c->ic_flags |= IEEE80211_CHAN_HT20; + } } } -#if 0 /* HT */ static void iwn_read_eeprom_ht40(struct iwn_softc *sc, int n) { @@ -1904,55 +1888,59 @@ iwn_read_eeprom_ht40(struct iwn_softc *sc, int n) struct iwn_eeprom_chan *channels = sc->eeprom_channels[n]; const struct iwn_chan_band *band = &iwn_bands[n]; struct ieee80211_channel *c, *cent, *extc; - int i; + uint8_t chan; + int i, nflags; + + if (!(sc->sc_flags & IWN_FLAG_HAS_11N)) + return; for (i = 0; i < band->nchan; i++) { - if (!(channels[i].flags & IWN_EEPROM_CHAN_VALID) || - !(channels[i].flags & IWN_EEPROM_CHAN_WIDE)) { + if (!(channels[i].flags & IWN_EEPROM_CHAN_VALID)) { DPRINTF(sc, IWN_DEBUG_RESET, "skip chan %d flags 0x%x maxpwr %d\n", band->chan[i], channels[i].flags, channels[i].maxpwr); continue; } + chan = band->chan[i]; + nflags = iwn_eeprom_channel_flags(&channels[i]); + /* * Each entry defines an HT40 channel pair; find the * center channel, then the extension channel above. */ - cent = ieee80211_find_channel_byieee(ic, band->chan[i], - band->flags & ~IEEE80211_CHAN_HT); + cent = ieee80211_find_channel_byieee(ic, chan, + (n == 5 ? IEEE80211_CHAN_G : IEEE80211_CHAN_A)); if (cent == NULL) { /* XXX shouldn't happen */ device_printf(sc->sc_dev, - "%s: no entry for channel %d\n", - __func__, band->chan[i]); + "%s: no entry for channel %d\n", __func__, chan); continue; } extc = ieee80211_find_channel(ic, cent->ic_freq+20, - band->flags & ~IEEE80211_CHAN_HT); + (n == 5 ? IEEE80211_CHAN_G : IEEE80211_CHAN_A)); if (extc == NULL) { DPRINTF(sc, IWN_DEBUG_RESET, - "skip chan %d, extension channel not found\n", - band->chan[i]); + "%s: skip chan %d, extension channel not found\n", + __func__, chan); continue; } DPRINTF(sc, IWN_DEBUG_RESET, "add ht40 chan %d flags 0x%x maxpwr %d\n", - band->chan[i], channels[i].flags, channels[i].maxpwr); + chan, channels[i].flags, channels[i].maxpwr); c = &ic->ic_channels[ic->ic_nchans++]; c[0] = cent[0]; c->ic_extieee = extc->ic_ieee; c->ic_flags &= ~IEEE80211_CHAN_HT; - c->ic_flags |= IEEE80211_CHAN_HT40U; + c->ic_flags |= IEEE80211_CHAN_HT40U | nflags; c = &ic->ic_channels[ic->ic_nchans++]; c[0] = extc[0]; c->ic_extieee = cent->ic_ieee; - c->ic_flags &= ~IEEE80211_CHAN_HT; + c->ic_flags &= ~IEEE80211_CHAN_HT | nflags; c->ic_flags |= IEEE80211_CHAN_HT40D; } } -#endif static void iwn_read_eeprom_channels(struct iwn_softc *sc, int n, uint32_t addr) @@ -1965,25 +1953,34 @@ iwn_read_eeprom_channels(struct iwn_softc *sc, int n, uint32_t addr) if (n < 5) iwn_read_eeprom_band(sc, n); -#if 0 /* HT */ else iwn_read_eeprom_ht40(sc, n); -#endif ieee80211_sort_channels(ic->ic_channels, ic->ic_nchans); } static struct iwn_eeprom_chan * iwn_find_eeprom_channel(struct iwn_softc *sc, struct ieee80211_channel *c) { - int i, j; + int band, chan, i, j; - for (j = 0; j < 7; j++) { - for (i = 0; i < iwn_bands[j].nchan; i++) { - if (iwn_bands[j].chan[i] == c->ic_ieee) - return &sc->eeprom_channels[j][i]; + if (IEEE80211_IS_CHAN_HT40(c)) { + band = IEEE80211_IS_CHAN_5GHZ(c) ? 6 : 5; + if (IEEE80211_IS_CHAN_HT40D(c)) + chan = c->ic_extieee; + else + chan = c->ic_ieee; + for (i = 0; i < iwn_bands[band].nchan; i++) { + if (iwn_bands[band].chan[i] == chan) + return &sc->eeprom_channels[band][i]; + } + } else { + for (j = 0; j < 5; j++) { + for (i = 0; i < iwn_bands[j].nchan; i++) { + if (iwn_bands[j].chan[i] == c->ic_ieee) + return &sc->eeprom_channels[j][i]; + } } } - return NULL; } @@ -2020,18 +2017,22 @@ static void iwn_read_eeprom_enhinfo(struct iwn_softc *sc) { struct iwn_eeprom_enhinfo enhinfo[35]; + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + struct ieee80211_channel *c; uint16_t val, base; int8_t maxpwr; - int i; + uint8_t flags; + int i, j; iwn_read_prom_data(sc, IWN5000_EEPROM_REG, &val, 2); base = le16toh(val); iwn_read_prom_data(sc, base + IWN6000_EEPROM_ENHINFO, enhinfo, sizeof enhinfo); - memset(sc->enh_maxpwr, 0, sizeof sc->enh_maxpwr); for (i = 0; i < nitems(enhinfo); i++) { - if (enhinfo[i].chan == 0 || enhinfo[i].reserved != 0) + flags = enhinfo[i].flags; + if (!(flags & IWN_ENHINFO_VALID)) continue; /* Skip invalid entries. */ maxpwr = 0; @@ -2045,11 +2046,34 @@ iwn_read_eeprom_enhinfo(struct iwn_softc *sc) maxpwr = MAX(maxpwr, enhinfo[i].mimo2); else if (sc->ntxchains == 3) maxpwr = MAX(maxpwr, enhinfo[i].mimo3); - maxpwr /= 2; /* Convert half-dBm to dBm. */ - DPRINTF(sc, IWN_DEBUG_RESET, "enhinfo %d, maxpwr=%d\n", i, - maxpwr); - sc->enh_maxpwr[i] = maxpwr; + for (j = 0; j < ic->ic_nchans; j++) { + c = &ic->ic_channels[j]; + if ((flags & IWN_ENHINFO_5GHZ)) { + if (!IEEE80211_IS_CHAN_A(c)) + continue; + } else if ((flags & IWN_ENHINFO_OFDM)) { + if (!IEEE80211_IS_CHAN_G(c)) + continue; + } else if (!IEEE80211_IS_CHAN_B(c)) + continue; + if ((flags & IWN_ENHINFO_HT40)) { + if (!IEEE80211_IS_CHAN_HT40(c)) + continue; + } else { + if (IEEE80211_IS_CHAN_HT40(c)) + continue; + } + if (enhinfo[i].chan != 0 && + enhinfo[i].chan != c->ic_ieee) + continue; + + DPRINTF(sc, IWN_DEBUG_RESET, + "channel %d(%x), maxpwr %d\n", c->ic_ieee, + c->ic_flags, maxpwr / 2); + c->ic_maxregpower = maxpwr / 2; + c->ic_maxpower = maxpwr; + } } } @@ -2059,15 +2083,73 @@ iwn_node_alloc(struct ieee80211vap *vap, const uint8_t mac[IEEE80211_ADDR_LEN]) return malloc(sizeof (struct iwn_node), M_80211_NODE,M_NOWAIT | M_ZERO); } +static __inline int +rate2plcp(int rate) +{ + switch (rate & 0xff) { + case 12: return 0xd; + case 18: return 0xf; + case 24: return 0x5; + case 36: return 0x7; + case 48: return 0x9; + case 72: return 0xb; + case 96: return 0x1; + case 108: return 0x3; + case 2: return 10; + case 4: return 20; + case 11: return 55; + case 22: return 110; + } + return 0; +} + static void iwn_newassoc(struct ieee80211_node *ni, int isnew) { + struct ieee80211com *ic = ni->ni_ic; + struct iwn_softc *sc = ic->ic_ifp->if_softc; struct iwn_node *wn = (void *)ni; - int ridx, i; + uint8_t txant1, txant2; + int i, plcp, rate, ridx; - for (i = 0; i < ni->ni_rates.rs_nrates; i++) { - ridx = iwn_plcp_signal(ni->ni_rates.rs_rates[i]); - wn->ridx[i] = ridx; + /* Use the first valid TX antenna. */ + txant1 = IWN_LSB(sc->txchainmask); + txant2 = IWN_LSB(sc->txchainmask & ~txant1); + + if (IEEE80211_IS_CHAN_HT(ni->ni_chan)) { + ridx = ni->ni_rates.rs_nrates - 1; + for (i = ni->ni_htrates.rs_nrates - 1; i >= 0; i--) { + plcp = ni->ni_htrates.rs_rates[i] | IWN_RFLAG_MCS; + if (IEEE80211_IS_CHAN_HT40(ni->ni_chan)) { + plcp |= IWN_RFLAG_HT40; + if (ni->ni_htcap & IEEE80211_HTCAP_SHORTGI40) + plcp |= IWN_RFLAG_SGI; + } else if (ni->ni_htcap & IEEE80211_HTCAP_SHORTGI20) + plcp |= IWN_RFLAG_SGI; + if (i > 7) + plcp |= IWN_RFLAG_ANT(txant1 | txant2); + else + plcp |= IWN_RFLAG_ANT(txant1); + if (ridx >= 0) { + rate = ni->ni_rates.rs_rates[ridx]; + rate &= IEEE80211_RATE_VAL; + wn->ridx[rate] = plcp; + } + wn->ridx[0x80 | i] = plcp; + ridx--; + } + } else { + for (i = 0; i < ni->ni_rates.rs_nrates; i++) { + rate = ni->ni_rates.rs_rates[i] & IEEE80211_RATE_VAL; + + plcp = rate2plcp(rate); + ridx = ic->ic_rt->rateCodeToIndex[rate]; + if (ridx < IWN_RIDX_OFDM6 && + IEEE80211_IS_CHAN_2GHZ(ni->ni_chan)) + plcp |= IWN_RFLAG_CCK; + plcp |= IWN_RFLAG_ANT(txant1); + wn->ridx[rate] = htole32(plcp); + } } } @@ -2220,7 +2302,6 @@ iwn_rx_done(struct iwn_softc *sc, struct iwn_rx_desc *desc, "%s: missing RX_PHY\n", __func__); return; } - sc->last_rx_valid = 0; stat = &sc->last_rx_stat; } else stat = (struct iwn_rx_stat *)(desc + 1); @@ -2343,6 +2424,8 @@ iwn_rx_done(struct iwn_softc *sc, struct iwn_rx_desc *desc, /* Send the frame to the 802.11 layer. */ if (ni != NULL) { + if (ni->ni_flags & IEEE80211_NODE_HT) + m->m_flags |= M_AMPDU; (void)ieee80211_input(ni, m, rssi - nf, nf); /* Node is no longer needed. */ ieee80211_free_node(ni); @@ -2352,21 +2435,53 @@ iwn_rx_done(struct iwn_softc *sc, struct iwn_rx_desc *desc, IWN_LOCK(sc); } -#if 0 /* HT */ /* Process an incoming Compressed BlockAck. */ static void iwn_rx_compressed_ba(struct iwn_softc *sc, struct iwn_rx_desc *desc, struct iwn_rx_data *data) { + struct ifnet *ifp = sc->sc_ifp; + struct iwn_node *wn; + struct ieee80211_node *ni; struct iwn_compressed_ba *ba = (struct iwn_compressed_ba *)(desc + 1); struct iwn_tx_ring *txq; + struct ieee80211_tx_ampdu *tap; + uint64_t bitmap; + uint8_t tid; + int ackfailcnt = 0, i, shift; bus_dmamap_sync(sc->rxq.data_dmat, data->map, BUS_DMASYNC_POSTREAD); - txq = &sc->txq[letoh16(ba->qid)]; - /* XXX TBD */ + txq = &sc->txq[le16toh(ba->qid)]; + tap = sc->qid2tap[le16toh(ba->qid)]; + tid = WME_AC_TO_TID(tap->txa_ac); + ni = tap->txa_ni; + wn = (void *)ni; + + if (wn->agg[tid].bitmap == 0) + return; + + shift = wn->agg[tid].startidx - ((le16toh(ba->seq) >> 4) & 0xff); + if (shift < 0) + shift += 0x100; + + if (wn->agg[tid].nframes > (64 - shift)) + return; + + bitmap = (le64toh(ba->bitmap) >> shift) & wn->agg[tid].bitmap; + for (i = 0; bitmap; i++) { + if ((bitmap & 1) == 0) { + ifp->if_oerrors++; + ieee80211_ratectl_tx_complete(ni->ni_vap, ni, + IEEE80211_RATECTL_TX_FAILURE, &ackfailcnt, NULL); + } else { + ifp->if_opackets++; + ieee80211_ratectl_tx_complete(ni->ni_vap, ni, + IEEE80211_RATECTL_TX_SUCCESS, &ackfailcnt, NULL); + } + bitmap >>= 1; + } } -#endif /* * Process a CALIBRATION_RESULT notification sent by the initialization @@ -2495,7 +2610,11 @@ iwn4965_tx_done(struct iwn_softc *sc, struct iwn_rx_desc *desc, struct iwn_rx_data *data) { struct iwn4965_tx_stat *stat = (struct iwn4965_tx_stat *)(desc + 1); - struct iwn_tx_ring *ring = &sc->txq[desc->qid & 0xf]; + struct iwn_tx_ring *ring; + int qid; + + qid = desc->qid & 0xf; + ring = &sc->txq[qid]; DPRINTF(sc, IWN_DEBUG_XMIT, "%s: " "qid %d idx %d retries %d nkill %d rate %x duration %d status %x\n", @@ -2504,7 +2623,13 @@ iwn4965_tx_done(struct iwn_softc *sc, struct iwn_rx_desc *desc, le32toh(stat->status)); bus_dmamap_sync(ring->data_dmat, data->map, BUS_DMASYNC_POSTREAD); - iwn_tx_done(sc, desc, stat->ackfailcnt, le32toh(stat->status) & 0xff); + if (qid >= sc->firstaggqueue) { + iwn_ampdu_tx_done(sc, qid, desc->idx, stat->nframes, + &stat->status); + } else { + iwn_tx_done(sc, desc, stat->ackfailcnt, + le32toh(stat->status) & 0xff); + } } static void @@ -2512,7 +2637,11 @@ iwn5000_tx_done(struct iwn_softc *sc, struct iwn_rx_desc *desc, struct iwn_rx_data *data) { struct iwn5000_tx_stat *stat = (struct iwn5000_tx_stat *)(desc + 1); - struct iwn_tx_ring *ring = &sc->txq[desc->qid & 0xf]; + struct iwn_tx_ring *ring; + int qid; + + qid = desc->qid & 0xf; + ring = &sc->txq[qid]; DPRINTF(sc, IWN_DEBUG_XMIT, "%s: " "qid %d idx %d retries %d nkill %d rate %x duration %d status %x\n", @@ -2526,7 +2655,13 @@ iwn5000_tx_done(struct iwn_softc *sc, struct iwn_rx_desc *desc, #endif bus_dmamap_sync(ring->data_dmat, data->map, BUS_DMASYNC_POSTREAD); - iwn_tx_done(sc, desc, stat->ackfailcnt, le16toh(stat->status) & 0xff); + if (qid >= sc->firstaggqueue) { + iwn_ampdu_tx_done(sc, qid, desc->idx, stat->nframes, + &stat->status); + } else { + iwn_tx_done(sc, desc, stat->ackfailcnt, + le16toh(stat->status) & 0xff); + } } /* @@ -2627,6 +2762,96 @@ iwn_cmd_done(struct iwn_softc *sc, struct iwn_rx_desc *desc) wakeup(&ring->desc[desc->idx]); } +static void +iwn_ampdu_tx_done(struct iwn_softc *sc, int qid, int idx, int nframes, + void *stat) +{ + struct ifnet *ifp = sc->sc_ifp; + struct iwn_tx_ring *ring = &sc->txq[qid]; + struct iwn_tx_data *data; + struct mbuf *m; + struct iwn_node *wn; + struct ieee80211_node *ni; + struct ieee80211vap *vap; + struct ieee80211_tx_ampdu *tap; + uint64_t bitmap; + uint32_t *status = stat; + uint16_t *aggstatus = stat; + uint8_t tid; + int bit, i, lastidx, seqno, shift, start; + +#ifdef NOT_YET + if (nframes == 1) { + if ((*status & 0xff) != 1 && (*status & 0xff) != 2) + printf("ieee80211_send_bar()\n"); + } +#endif + + bitmap = 0; + start = idx; + for (i = 0; i < nframes; i++) { + if (le16toh(aggstatus[i * 2]) & 0xc) + continue; + + idx = le16toh(aggstatus[2*i + 1]) & 0xff; + bit = idx - start; + shift = 0; + if (bit >= 64) { + shift = 0x100 - idx + start; + bit = 0; + start = idx; + } else if (bit <= -64) + bit = 0x100 - start + idx; + else if (bit < 0) { + shift = start - idx; + start = idx; + bit = 0; + } + bitmap = bitmap << shift; + bitmap |= 1ULL << bit; + } + tap = sc->qid2tap[qid]; + tid = WME_AC_TO_TID(tap->txa_ac); + wn = (void *)tap->txa_ni; + wn->agg[tid].bitmap = bitmap; + wn->agg[tid].startidx = start; + wn->agg[tid].nframes = nframes; + + seqno = le32toh(*(status + nframes)) & 0xfff; + for (lastidx = (seqno & 0xff); ring->read != lastidx;) { + data = &ring->data[ring->read]; + + KASSERT(data->ni != NULL, ("no node")); + + /* Unmap and free mbuf. */ + bus_dmamap_sync(ring->data_dmat, data->map, + BUS_DMASYNC_POSTWRITE); + bus_dmamap_unload(ring->data_dmat, data->map); + m = data->m, data->m = NULL; + ni = data->ni, data->ni = NULL; + vap = ni->ni_vap; + + if (m->m_flags & M_TXCB) + ieee80211_process_callback(ni, m, 1); + + m_freem(m); + ieee80211_free_node(ni); + + ring->queued--; + ring->read = (ring->read + 1) % IWN_TX_RING_COUNT; + } + + sc->sc_tx_timer = 0; + if (ring->queued < IWN_TX_RING_LOMARK) { + sc->qfullmsk &= ~(1 << ring->qid); + if (sc->qfullmsk == 0 && + (ifp->if_drv_flags & IFF_DRV_OACTIVE)) { + ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; + iwn_start_locked(ifp); + } + } +} + /* * Process an INT_FH_RX or INT_SW_RX interrupt. */ @@ -2671,12 +2896,10 @@ iwn_notif_intr(struct iwn_softc *sc) iwn_rx_done(sc, desc, data); break; -#if 0 /* HT */ case IWN_RX_COMPRESSED_BA: /* A Compressed BlockAck has been received. */ iwn_rx_compressed_ba(sc, desc, data); break; -#endif case IWN_TX_DONE: /* An 802.11 frame has been transmitted. */ @@ -3053,21 +3276,10 @@ iwn5000_reset_sched(struct iwn_softc *sc, int qid, int idx) } #endif -static uint8_t -iwn_plcp_signal(int rate) { - int i; - - for (i = 0; i < IWN_RIDX_MAX + 1; i++) { - if ((rate & IEEE80211_RATE_VAL) == iwn_rates[i].rate) - return i; - } - - return 0; -} - static int iwn_tx_data(struct iwn_softc *sc, struct mbuf *m, struct ieee80211_node *ni) { + struct iwn_ops *ops = &sc->ops; const struct ieee80211_txparam *tp; struct ieee80211vap *vap = ni->ni_vap; struct ieee80211com *ic = ni->ni_ic; @@ -3077,7 +3289,6 @@ iwn_tx_data(struct iwn_softc *sc, struct mbuf *m, struct ieee80211_node *ni) struct iwn_tx_data *data; struct iwn_tx_cmd *cmd; struct iwn_cmd_data *tx; - const struct iwn_rate *rinfo; struct ieee80211_frame *wh; struct ieee80211_key *k = NULL; struct mbuf *m1; @@ -3104,7 +3315,16 @@ iwn_tx_data(struct iwn_softc *sc, struct mbuf *m, struct ieee80211_node *ni) } ac = M_WME_GETAC(m); - ring = &sc->txq[ac]; + if (IEEE80211_AMPDU_RUNNING(&ni->ni_tx_ampdu[ac])) { + struct ieee80211_tx_ampdu *tap = &ni->ni_tx_ampdu[ac]; + + ring = &sc->txq[*(int *)tap->txa_private]; + *(uint16_t *)wh->i_seq = + htole16(ni->ni_txseqs[tid] << IEEE80211_SEQ_SEQ_SHIFT); + ni->ni_txseqs[tid]++; + } else { + ring = &sc->txq[ac]; + } desc = &ring->desc[ring->cur]; data = &ring->data[ring->cur]; @@ -3121,8 +3341,7 @@ iwn_tx_data(struct iwn_softc *sc, struct mbuf *m, struct ieee80211_node *ni) (void) ieee80211_ratectl_rate(ni, NULL, 0); rate = ni->ni_txrate; } - ridx = iwn_plcp_signal(rate); - rinfo = &iwn_rates[ridx]; + ridx = ic->ic_rt->rateCodeToIndex[rate]; /* Encrypt the frame if need be. */ if (wh->i_fc[1] & IEEE80211_FC1_WEP) { @@ -3141,7 +3360,7 @@ iwn_tx_data(struct iwn_softc *sc, struct mbuf *m, struct ieee80211_node *ni) struct iwn_tx_radiotap_header *tap = &sc->sc_txtap; tap->wt_flags = 0; - tap->wt_rate = rinfo->rate; + tap->wt_rate = rate; if (k != NULL) tap->wt_flags |= IEEE80211_RADIOTAP_F_WEP; @@ -3228,14 +3447,13 @@ iwn_tx_data(struct iwn_softc *sc, struct mbuf *m, struct ieee80211_node *ni) tx->rts_ntries = 60; tx->data_ntries = 15; tx->lifetime = htole32(IWN_LIFETIME_INFINITE); - tx->plcp = rinfo->plcp; - tx->rflags = rinfo->flags; + tx->rate = wn->ridx[rate]; if (tx->id == sc->broadcast_id) { /* Group or management frame. */ tx->linkq = 0; /* XXX Alternate between antenna A and B? */ txant = IWN_LSB(sc->txchainmask); - tx->rflags |= IWN_RFLAG_ANT(txant); + tx->rate |= htole32(IWN_RFLAG_ANT(txant)); } else { tx->linkq = ni->ni_rates.rs_nrates - ridx - 1; flags |= IWN_TX_LINKQ; /* enable MRR */ @@ -3310,10 +3528,8 @@ iwn_tx_data(struct iwn_softc *sc, struct mbuf *m, struct ieee80211_node *ni) bus_dmamap_sync(ring->desc_dma.tag, ring->desc_dma.map, BUS_DMASYNC_PREWRITE); -#ifdef notyet /* Update TX scheduler. */ ops->update_sched(sc, ring->qid, ring->cur, tx->id, totlen); -#endif /* Kick TX ring. */ ring->cur = (ring->cur + 1) % IWN_TX_RING_COUNT; @@ -3330,7 +3546,7 @@ static int iwn_tx_data_raw(struct iwn_softc *sc, struct mbuf *m, struct ieee80211_node *ni, const struct ieee80211_bpf_params *params) { - const struct iwn_rate *rinfo; + struct iwn_ops *ops = &sc->ops; struct ifnet *ifp = sc->sc_ifp; struct ieee80211vap *vap = ni->ni_vap; struct ieee80211com *ic = ifp->if_l2com; @@ -3361,13 +3577,12 @@ iwn_tx_data_raw(struct iwn_softc *sc, struct mbuf *m, /* Choose a TX rate index. */ rate = params->ibp_rate0; - if (!ieee80211_isratevalid(ic->ic_rt, rate)) { + ridx = ic->ic_rt->rateCodeToIndex[rate]; + if (ridx == (uint8_t)-1) { /* XXX fall back to mcast/mgmt rate? */ m_freem(m); return EINVAL; } - ridx = iwn_plcp_signal(rate); - rinfo = &iwn_rates[ridx]; totlen = m->m_pkthdr.len; @@ -3438,12 +3653,14 @@ iwn_tx_data_raw(struct iwn_softc *sc, struct mbuf *m, tx->rts_ntries = params->ibp_try1; tx->data_ntries = params->ibp_try0; tx->lifetime = htole32(IWN_LIFETIME_INFINITE); - tx->plcp = rinfo->plcp; - tx->rflags = rinfo->flags; + tx->rate = htole32(rate2plcp(rate)); + if (ridx < IWN_RIDX_OFDM6 && + IEEE80211_IS_CHAN_2GHZ(ni->ni_chan)) + tx->rate |= htole32(IWN_RFLAG_CCK); /* Group or management frame. */ tx->linkq = 0; txant = IWN_LSB(sc->txchainmask); - tx->rflags |= IWN_RFLAG_ANT(txant); + tx->rate |= htole32(IWN_RFLAG_ANT(txant)); /* Set physical address of "scratch area". */ tx->loaddr = htole32(IWN_LOADDR(data->scratch_paddr)); tx->hiaddr = IWN_HIADDR(data->scratch_paddr); @@ -3514,10 +3731,8 @@ iwn_tx_data_raw(struct iwn_softc *sc, struct mbuf *m, bus_dmamap_sync(ring->desc_dma.tag, ring->desc_dma.map, BUS_DMASYNC_PREWRITE); -#ifdef notyet /* Update TX scheduler. */ ops->update_sched(sc, ring->qid, ring->cur, tx->id, totlen); -#endif /* Kick TX ring. */ ring->cur = (ring->cur + 1) % IWN_TX_RING_COUNT; @@ -3681,6 +3896,7 @@ iwn_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) static int iwn_cmd(struct iwn_softc *sc, int code, const void *buf, int size, int async) { + struct iwn_ops *ops = &sc->ops; struct iwn_tx_ring *ring = &sc->txq[4]; struct iwn_tx_desc *desc; struct iwn_tx_data *data; @@ -3689,7 +3905,8 @@ iwn_cmd(struct iwn_softc *sc, int code, const void *buf, int size, int async) bus_addr_t paddr; int totlen, error; - IWN_LOCK_ASSERT(sc); + if (async == 0) + IWN_LOCK_ASSERT(sc); desc = &ring->desc[ring->cur]; data = &ring->data[ring->cur]; @@ -3739,10 +3956,8 @@ iwn_cmd(struct iwn_softc *sc, int code, const void *buf, int size, int async) bus_dmamap_sync(ring->desc_dma.tag, ring->desc_dma.map, BUS_DMASYNC_PREWRITE); -#ifdef notyet /* Update TX scheduler. */ ops->update_sched(sc, ring->qid, ring->cur, 0, 0); -#endif /* Kick command ring. */ ring->cur = (ring->cur + 1) % IWN_TX_RING_COUNT; @@ -3783,9 +3998,8 @@ iwn_set_link_quality(struct iwn_softc *sc, struct ieee80211_node *ni) struct iwn_node *wn = (void *)ni; struct ieee80211_rateset *rs = &ni->ni_rates; struct iwn_cmd_link_quality linkq; - const struct iwn_rate *rinfo; uint8_t txant; - int i, txrate; + int i, rate, txrate; /* Use the first valid TX antenna. */ txant = IWN_LSB(sc->txchainmask); @@ -3794,17 +4008,26 @@ iwn_set_link_quality(struct iwn_softc *sc, struct ieee80211_node *ni) linkq.id = wn->id; linkq.antmsk_1stream = txant; linkq.antmsk_2stream = IWN_ANT_AB; - linkq.ampdu_max = 31; + linkq.ampdu_max = 64; linkq.ampdu_threshold = 3; linkq.ampdu_limit = htole16(4000); /* 4ms */ /* Start at highest available bit-rate. */ - txrate = rs->rs_nrates - 1; + if (IEEE80211_IS_CHAN_HT(ni->ni_chan)) + txrate = ni->ni_htrates.rs_nrates - 1; + else + txrate = rs->rs_nrates - 1; for (i = 0; i < IWN_MAX_TX_RETRIES; i++) { - rinfo = &iwn_rates[wn->ridx[txrate]]; - linkq.retry[i].plcp = rinfo->plcp; - linkq.retry[i].rflags = rinfo->flags; - linkq.retry[i].rflags |= IWN_RFLAG_ANT(txant); + if (IEEE80211_IS_CHAN_HT(ni->ni_chan)) + rate = 0x80 | txrate; + else + rate = rs->rs_rates[txrate] & IEEE80211_RATE_VAL; + linkq.retry[i] = wn->ridx[rate]; + + if ((le32toh(wn->ridx[rate]) & IWN_RFLAG_MCS) && + (le32toh(wn->ridx[rate]) & 0xff) > 7) + linkq.mimo = i + 1; + /* Next retry at immediate lower bit-rate. */ if (txrate > 0) txrate--; @@ -3823,7 +4046,6 @@ iwn_add_broadcast_node(struct iwn_softc *sc, int async) struct ieee80211com *ic = ifp->if_l2com; struct iwn_node_info node; struct iwn_cmd_link_quality linkq; - const struct iwn_rate *rinfo; uint8_t txant; int i, error; @@ -3847,16 +4069,13 @@ iwn_add_broadcast_node(struct iwn_softc *sc, int async) /* Use lowest mandatory bit-rate. */ if (IEEE80211_IS_CHAN_5GHZ(ic->ic_curchan)) - rinfo = &iwn_rates[IWN_RIDX_OFDM6]; + linkq.retry[0] = htole32(0xd); else - rinfo = &iwn_rates[IWN_RIDX_CCK1]; - linkq.retry[0].plcp = rinfo->plcp; - linkq.retry[0].rflags = rinfo->flags; - linkq.retry[0].rflags |= IWN_RFLAG_ANT(txant); + linkq.retry[0] = htole32(10 | IWN_RFLAG_CCK); + linkq.retry[0] |= htole32(IWN_RFLAG_ANT(txant)); /* Use same bit-rate for all TX retries. */ for (i = 1; i < IWN_MAX_TX_RETRIES; i++) { - linkq.retry[i].plcp = linkq.retry[0].plcp; - linkq.retry[i].rflags = linkq.retry[0].rflags; + linkq.retry[i] = linkq.retry[0]; } return iwn_cmd(sc, IWN_CMD_LINK_QUALITY, &linkq, sizeof linkq, async); } @@ -4908,6 +5127,7 @@ iwn_scan(struct iwn_softc *sc) struct ifnet *ifp = sc->sc_ifp; struct ieee80211com *ic = ifp->if_l2com; struct ieee80211_scan_state *ss = ic->ic_scan; /*XXX*/ + struct ieee80211_node *ni = ss->ss_vap->iv_bss; struct iwn_scan_hdr *hdr; struct iwn_cmd_data *tx; struct iwn_scan_essid *essid; @@ -4956,18 +5176,17 @@ iwn_scan(struct iwn_softc *sc) if (IEEE80211_IS_CHAN_A(ic->ic_curchan)) { /* Send probe requests at 6Mbps. */ - tx->plcp = iwn_rates[IWN_RIDX_OFDM6].plcp; + tx->rate = htole32(0xd); rs = &ic->ic_sup_rates[IEEE80211_MODE_11A]; } else { hdr->flags = htole32(IWN_RXON_24GHZ | IWN_RXON_AUTO); /* Send probe requests at 1Mbps. */ - tx->plcp = iwn_rates[IWN_RIDX_CCK1].plcp; - tx->rflags = IWN_RFLAG_CCK; + tx->rate = htole32(10 | IWN_RFLAG_CCK); rs = &ic->ic_sup_rates[IEEE80211_MODE_11G]; } /* Use the first valid TX antenna. */ txant = IWN_LSB(sc->txchainmask); - tx->rflags |= IWN_RFLAG_ANT(txant); + tx->rate |= htole32(IWN_RFLAG_ANT(txant)); essid = (struct iwn_scan_essid *)(tx + 1); if (ss->ss_ssid[0].len != 0) { @@ -4994,10 +5213,8 @@ iwn_scan(struct iwn_softc *sc) frm = ieee80211_add_rates(frm, rs); if (rs->rs_nrates > IEEE80211_RATE_SIZE) frm = ieee80211_add_xrates(frm, rs); -#if 0 /* HT */ - if (ic->ic_flags & IEEE80211_F_HTON) - frm = ieee80211_add_htcaps(frm, ic); -#endif + if (ic->ic_htcaps & IEEE80211_HTC_HT) + frm = ieee80211_add_htcap(frm, ni); /* Set length of probe request. */ tx->len = htole16(frm - (uint8_t *)wh); @@ -5124,6 +5341,7 @@ iwn_run(struct iwn_softc *sc, struct ieee80211vap *vap) struct ieee80211com *ic = ifp->if_l2com; struct ieee80211_node *ni = vap->iv_bss; struct iwn_node_info node; + uint32_t htflags = 0; int error; if (ic->ic_opmode == IEEE80211_M_MONITOR) { @@ -5159,26 +5377,22 @@ iwn_run(struct iwn_softc *sc, struct ieee80211vap *vap) sc->rxon.cck_mask = 0x0f; sc->rxon.ofdm_mask = 0x15; } -#if 0 /* HT */ if (IEEE80211_IS_CHAN_HT(ni->ni_chan)) { - sc->rxon.flags &= ~htole32(IWN_RXON_HT); - if (IEEE80211_IS_CHAN_HT40U(ni->ni_chan)) - sc->rxon.flags |= htole32(IWN_RXON_HT40U); - else if (IEEE80211_IS_CHAN_HT40D(ni->ni_chan)) - sc->rxon.flags |= htole32(IWN_RXON_HT40D); - else - sc->rxon.flags |= htole32(IWN_RXON_HT20); - sc->rxon.rxchain = htole16( - IWN_RXCHAIN_VALID(3) - | IWN_RXCHAIN_MIMO_COUNT(3) - | IWN_RXCHAIN_IDLE_COUNT(1) - | IWN_RXCHAIN_MIMO_FORCE); - - maxrxampdu = MS(ni->ni_htparam, IEEE80211_HTCAP_MAXRXAMPDU); - ampdudensity = MS(ni->ni_htparam, IEEE80211_HTCAP_MPDUDENSITY); - } else - maxrxampdu = ampdudensity = 0; -#endif + htflags |= IWN_RXON_HT_PROTMODE(ic->ic_curhtprotmode); + if (IEEE80211_IS_CHAN_HT40(ni->ni_chan)) { + switch (ic->ic_curhtprotmode) { + case IEEE80211_HTINFO_OPMODE_HT20PR: + htflags |= IWN_RXON_HT_MODEPURE40; + break; + default: + htflags |= IWN_RXON_HT_MODEMIXED; + break; + } + } + if (IEEE80211_IS_CHAN_HT40D(ni->ni_chan)) + htflags |= IWN_RXON_HT_HT40MINUS; + } + sc->rxon.flags |= htole32(htflags); sc->rxon.filter |= htole32(IWN_FILTER_BSS); DPRINTF(sc, IWN_DEBUG_STATE, "rxon chan %d flags %x\n", sc->rxon.chan, sc->rxon.flags); @@ -5205,10 +5419,20 @@ iwn_run(struct iwn_softc *sc, struct ieee80211vap *vap) memset(&node, 0, sizeof node); IEEE80211_ADDR_COPY(node.macaddr, ni->ni_macaddr); node.id = IWN_ID_BSS; -#ifdef notyet - node.htflags = htole32(IWN_AMDPU_SIZE_FACTOR(3) | - IWN_AMDPU_DENSITY(5)); /* 2us */ -#endif + if (IEEE80211_IS_CHAN_HT(ni->ni_chan)) { + switch (ni->ni_htcap & IEEE80211_HTCAP_SMPS) { + case IEEE80211_HTCAP_SMPS_ENA: + node.htflags |= htole32(IWN_SMPS_MIMO_DIS); + break; + case IEEE80211_HTCAP_SMPS_DYNAMIC: + node.htflags |= htole32(IWN_SMPS_MIMO_PROT); + break; + } + node.htflags |= htole32(IWN_AMDPU_SIZE_FACTOR(3) | + IWN_AMDPU_DENSITY(5)); /* 4us */ + if (IEEE80211_IS_CHAN_HT40(ni->ni_chan)) + node.htflags |= htole32(IWN_NODE_HT40); + } DPRINTF(sc, IWN_DEBUG_STATE, "%s: adding BSS node\n", __func__); error = ops->add_node(sc, &node, 1); if (error != 0) { @@ -5243,30 +5467,36 @@ iwn_run(struct iwn_softc *sc, struct ieee80211vap *vap) #undef MS } -#if 0 /* HT */ /* * This function is called by upper layer when an ADDBA request is received * from another STA and before the ADDBA response is sent. */ static int -iwn_ampdu_rx_start(struct ieee80211com *ic, struct ieee80211_node *ni, - uint8_t tid) +iwn_ampdu_rx_start(struct ieee80211_node *ni, struct ieee80211_rx_ampdu *rap, + int baparamset, int batimeout, int baseqctl) { - struct ieee80211_rx_ba *ba = &ni->ni_rx_ba[tid]; - struct iwn_softc *sc = ic->ic_softc; +#define MS(_v, _f) (((_v) & _f) >> _f##_S) + struct iwn_softc *sc = ni->ni_ic->ic_ifp->if_softc; struct iwn_ops *ops = &sc->ops; struct iwn_node *wn = (void *)ni; struct iwn_node_info node; + uint8_t tid; + int error; + tid = MS(baparamset, IEEE80211_BAPS_TID); memset(&node, 0, sizeof node); node.id = wn->id; node.control = IWN_NODE_UPDATE; node.flags = IWN_FLAG_SET_ADDBA; node.addba_tid = tid; - node.addba_ssn = htole16(ba->ba_winstart); + node.addba_ssn = htole16(MS(baseqctl, IEEE80211_BASEQ_START)); DPRINTF(sc, IWN_DEBUG_RECV, "ADDBA RA=%d TID=%d SSN=%d\n", - wn->id, tid, ba->ba_winstart); - return ops->add_node(sc, &node, 1); + wn->id, tid, MS(baseqctl, IEEE80211_BASEQ_START)); + error = ops->add_node(sc, &node, 1); + if (error != 0) + return error; + return sc->sc_ampdu_rx_start(ni, rap, baparamset, batimeout, baseqctl); +#undef MS } /* @@ -5274,13 +5504,20 @@ iwn_ampdu_rx_start(struct ieee80211com *ic, struct ieee80211_node *ni, * Block Ack agreement (eg. uppon receipt of a DELBA frame). */ static void -iwn_ampdu_rx_stop(struct ieee80211com *ic, struct ieee80211_node *ni, - uint8_t tid) +iwn_ampdu_rx_stop(struct ieee80211_node *ni, struct ieee80211_rx_ampdu *rap) { - struct iwn_softc *sc = ic->ic_softc; + struct ieee80211com *ic = ni->ni_ic; + struct iwn_softc *sc = ic->ic_ifp->if_softc; struct iwn_ops *ops = &sc->ops; struct iwn_node *wn = (void *)ni; struct iwn_node_info node; + uint8_t tid; + + /* XXX: tid as an argument */ + for (tid = 0; tid < WME_NUM_TID; tid++) { + if (&ni->ni_rx_ampdu[tid] == rap) + break; + } memset(&node, 0, sizeof node); node.id = wn->id; @@ -5289,6 +5526,57 @@ iwn_ampdu_rx_stop(struct ieee80211com *ic, struct ieee80211_node *ni, node.delba_tid = tid; DPRINTF(sc, IWN_DEBUG_RECV, "DELBA RA=%d TID=%d\n", wn->id, tid); (void)ops->add_node(sc, &node, 1); + sc->sc_ampdu_rx_stop(ni, rap); +} + +static int +iwn_addba_request(struct ieee80211_node *ni, struct ieee80211_tx_ampdu *tap, + int dialogtoken, int baparamset, int batimeout) +{ + struct iwn_softc *sc = ni->ni_ic->ic_ifp->if_softc; + int qid; + + for (qid = sc->firstaggqueue; qid < sc->ntxqs; qid++) { + if (sc->qid2tap[qid] == NULL) + break; + } + if (qid == sc->ntxqs) { + DPRINTF(sc, IWN_DEBUG_XMIT, "%s: not free aggregation queue\n", + __func__); + return 0; + } + tap->txa_private = malloc(sizeof(int), M_DEVBUF, M_NOWAIT); + if (tap->txa_private == NULL) { + device_printf(sc->sc_dev, + "%s: failed to alloc TX aggregation structure\n", __func__); + return 0; + } + sc->qid2tap[qid] = tap; + *(int *)tap->txa_private = qid; + return sc->sc_addba_request(ni, tap, dialogtoken, baparamset, + batimeout); +} + +static int +iwn_addba_response(struct ieee80211_node *ni, struct ieee80211_tx_ampdu *tap, + int code, int baparamset, int batimeout) +{ + struct iwn_softc *sc = ni->ni_ic->ic_ifp->if_softc; + int qid = *(int *)tap->txa_private; + uint8_t tid = WME_AC_TO_TID(tap->txa_ac); + int ret; + + if (code == IEEE80211_STATUS_SUCCESS) { + ni->ni_txseqs[tid] = tap->txa_start & 0xfff; + ret = iwn_ampdu_tx_start(ni->ni_ic, ni, tid); + if (ret != 1) + return ret; + } else { + sc->qid2tap[qid] = NULL; + free(tap->txa_private, M_DEVBUF); + tap->txa_private = NULL; + } + return sc->sc_addba_response(ni, tap, code, baparamset, batimeout); } /* @@ -5299,12 +5587,12 @@ static int iwn_ampdu_tx_start(struct ieee80211com *ic, struct ieee80211_node *ni, uint8_t tid) { - struct ieee80211_tx_ba *ba = &ni->ni_tx_ba[tid]; - struct iwn_softc *sc = ic->ic_softc; + struct ieee80211_tx_ampdu *tap = &ni->ni_tx_ampdu[TID_TO_WME_AC(tid)]; + struct iwn_softc *sc = ni->ni_ic->ic_ifp->if_softc; struct iwn_ops *ops = &sc->ops; struct iwn_node *wn = (void *)ni; struct iwn_node_info node; - int error; + int error, qid; /* Enable TX for the specified RA/TID. */ wn->disable_tid &= ~(1 << tid); @@ -5315,35 +5603,40 @@ iwn_ampdu_tx_start(struct ieee80211com *ic, struct ieee80211_node *ni, node.disable_tid = htole16(wn->disable_tid); error = ops->add_node(sc, &node, 1); if (error != 0) - return error; + return 0; if ((error = iwn_nic_lock(sc)) != 0) - return error; - ops->ampdu_tx_start(sc, ni, tid, ba->ba_winstart); + return 0; + qid = *(int *)tap->txa_private; + ops->ampdu_tx_start(sc, ni, qid, tid, tap->txa_start & 0xfff); iwn_nic_unlock(sc); - return 0; + + iwn_set_link_quality(sc, ni); + return 1; } static void -iwn_ampdu_tx_stop(struct ieee80211com *ic, struct ieee80211_node *ni, - uint8_t tid) +iwn_ampdu_tx_stop(struct ieee80211_node *ni, struct ieee80211_tx_ampdu *tap) { - struct ieee80211_tx_ba *ba = &ni->ni_tx_ba[tid]; - struct iwn_softc *sc = ic->ic_softc; + struct iwn_softc *sc = ni->ni_ic->ic_ifp->if_softc; struct iwn_ops *ops = &sc->ops; + uint8_t tid = WME_AC_TO_TID(tap->txa_ac); + int qid = *(int *)tap->txa_private; if (iwn_nic_lock(sc) != 0) return; - ops->ampdu_tx_stop(sc, tid, ba->ba_winstart); + ops->ampdu_tx_stop(sc, qid, tid, tap->txa_start & 0xfff); iwn_nic_unlock(sc); + sc->qid2tap[qid] = NULL; + free(tap->txa_private, M_DEVBUF); + tap->txa_private = NULL; } static void iwn4965_ampdu_tx_start(struct iwn_softc *sc, struct ieee80211_node *ni, - uint8_t tid, uint16_t ssn) + int qid, uint8_t tid, uint16_t ssn) { struct iwn_node *wn = (void *)ni; - int qid = 7 + tid; /* Stop TX scheduler while we're changing its configuration. */ iwn_prph_write(sc, IWN4965_SCHED_QUEUE_STATUS(qid), @@ -5357,6 +5650,7 @@ iwn4965_ampdu_tx_start(struct iwn_softc *sc, struct ieee80211_node *ni, iwn_prph_setbits(sc, IWN4965_SCHED_QCHAIN_SEL, 1 << qid); /* Set starting sequence number from the ADDBA request. */ + sc->txq[qid].cur = sc->txq[qid].read = (ssn & 0xff); IWN_WRITE(sc, IWN_HBUS_TARG_WRPTR, qid << 8 | (ssn & 0xff)); iwn_prph_write(sc, IWN4965_SCHED_QUEUE_RDPTR(qid), ssn); @@ -5377,10 +5671,8 @@ iwn4965_ampdu_tx_start(struct iwn_softc *sc, struct ieee80211_node *ni, } static void -iwn4965_ampdu_tx_stop(struct iwn_softc *sc, uint8_t tid, uint16_t ssn) +iwn4965_ampdu_tx_stop(struct iwn_softc *sc, int qid, uint8_t tid, uint16_t ssn) { - int qid = 7 + tid; - /* Stop TX scheduler while we're changing its configuration. */ iwn_prph_write(sc, IWN4965_SCHED_QUEUE_STATUS(qid), IWN4965_TXQ_STATUS_CHGACT); @@ -5399,10 +5691,9 @@ iwn4965_ampdu_tx_stop(struct iwn_softc *sc, uint8_t tid, uint16_t ssn) static void iwn5000_ampdu_tx_start(struct iwn_softc *sc, struct ieee80211_node *ni, - uint8_t tid, uint16_t ssn) + int qid, uint8_t tid, uint16_t ssn) { struct iwn_node *wn = (void *)ni; - int qid = 10 + tid; /* Stop TX scheduler while we're changing its configuration. */ iwn_prph_write(sc, IWN5000_SCHED_QUEUE_STATUS(qid), @@ -5419,6 +5710,7 @@ iwn5000_ampdu_tx_start(struct iwn_softc *sc, struct ieee80211_node *ni, iwn_prph_setbits(sc, IWN5000_SCHED_AGGR_SEL, 1 << qid); /* Set starting sequence number from the ADDBA request. */ + sc->txq[qid].cur = sc->txq[qid].read = (ssn & 0xff); IWN_WRITE(sc, IWN_HBUS_TARG_WRPTR, qid << 8 | (ssn & 0xff)); iwn_prph_write(sc, IWN5000_SCHED_QUEUE_RDPTR(qid), ssn); @@ -5435,10 +5727,8 @@ iwn5000_ampdu_tx_start(struct iwn_softc *sc, struct ieee80211_node *ni, } static void -iwn5000_ampdu_tx_stop(struct iwn_softc *sc, uint8_t tid, uint16_t ssn) +iwn5000_ampdu_tx_stop(struct iwn_softc *sc, int qid, uint8_t tid, uint16_t ssn) { - int qid = 10 + tid; - /* Stop TX scheduler while we're changing its configuration. */ iwn_prph_write(sc, IWN5000_SCHED_QUEUE_STATUS(qid), IWN5000_TXQ_STATUS_CHGACT); @@ -5457,7 +5747,6 @@ iwn5000_ampdu_tx_stop(struct iwn_softc *sc, uint8_t tid, uint16_t ssn) iwn_prph_write(sc, IWN5000_SCHED_QUEUE_STATUS(qid), IWN5000_TXQ_STATUS_INACTIVE | iwn_tid2fifo[tid]); } -#endif /* * Query calibration tables from the initialization firmware. We do this diff --git a/sys/dev/iwn/if_iwnreg.h b/sys/dev/iwn/if_iwnreg.h index be70b49..4cbf652 100644 --- a/sys/dev/iwn/if_iwnreg.h +++ b/sys/dev/iwn/if_iwnreg.h @@ -27,6 +27,9 @@ #define IWN4965_NTXQUEUES 16 #define IWN5000_NTXQUEUES 20 +#define IWN4965_FIRSTAGGQUEUE 7 +#define IWN5000_FIRSTAGGQUEUE 10 + #define IWN4965_NDMACHNLS 7 #define IWN5000_NDMACHNLS 8 @@ -489,6 +492,10 @@ struct iwn_rxon { #define IWN_RXON_ANTENNA_A (1 << 8) #define IWN_RXON_ANTENNA_B (1 << 9) #define IWN_RXON_TSF (1 << 15) +#define IWN_RXON_HT_HT40MINUS (1 << 22) +#define IWN_RXON_HT_PROTMODE(x) (x << 23) +#define IWN_RXON_HT_MODEPURE40 (1 << 25) +#define IWN_RXON_HT_MODEMIXED (2 << 25) #define IWN_RXON_CTS_TO_SELF (1 << 30) uint32_t filter; @@ -588,7 +595,10 @@ struct iwn_node_info { uint8_t txmic[8]; uint32_t htflags; +#define IWN_SMPS_MIMO_PROT (1 << 17) #define IWN_AMDPU_SIZE_FACTOR(x) ((x) << 19) +#define IWN_NODE_HT40 (1 << 21) +#define IWN_SMPS_MIMO_DIS (1 << 22) #define IWN_AMDPU_DENSITY(x) ((x) << 23) uint32_t mask; @@ -625,8 +635,13 @@ struct iwn4965_node_info { uint32_t reserved7; } __packed; -#define IWN_RFLAG_CCK (1 << 1) -#define IWN_RFLAG_ANT(x) ((x) << 6) +#define IWN_RFLAG_MCS (1 << 8) +#define IWN_RFLAG_CCK (1 << 9) +#define IWN_RFLAG_GREENFIELD (1 << 10) +#define IWN_RFLAG_HT40 (1 << 11) +#define IWN_RFLAG_DUPLICATE (1 << 12) +#define IWN_RFLAG_SGI (1 << 13) +#define IWN_RFLAG_ANT(x) ((x) << 14) /* Structure for command IWN_CMD_TX_DATA. */ struct iwn_cmd_data { @@ -647,9 +662,7 @@ struct iwn_cmd_data { #define IWN_TX_NEED_PADDING (1 << 20) uint32_t scratch; - uint8_t plcp; - uint8_t rflags; - uint16_t xrflags; + uint32_t rate; uint8_t id; uint8_t security; @@ -690,11 +703,7 @@ struct iwn_cmd_link_quality { uint8_t ampdu_threshold; uint8_t ampdu_max; uint32_t reserved2; - struct { - uint8_t plcp; - uint8_t rflags; - uint16_t xrflags; - } __packed retry[IWN_MAX_TX_RETRIES]; + uint32_t retry[IWN_MAX_TX_RETRIES]; uint32_t reserved3; } __packed; @@ -1065,9 +1074,7 @@ struct iwn4965_tx_stat { uint8_t btkillcnt; uint8_t rtsfailcnt; uint8_t ackfailcnt; - uint8_t rate; - uint8_t rflags; - uint16_t xrflags; + uint32_t rate; uint16_t duration; uint16_t reserved; uint32_t power[2]; @@ -1079,9 +1086,7 @@ struct iwn5000_tx_stat { uint8_t btkillcnt; uint8_t rtsfailcnt; uint8_t ackfailcnt; - uint8_t rate; - uint8_t rflags; - uint16_t xrflags; + uint32_t rate; uint16_t duration; uint16_t reserved; uint32_t power[2]; @@ -1136,9 +1141,7 @@ struct iwn_rx_stat { uint16_t chan; uint8_t phybuf[32]; - uint8_t rate; - uint8_t rflags; - uint16_t xrflags; + uint32_t rate; uint16_t len; uint16_t reserve3; } __packed; @@ -1403,6 +1406,7 @@ struct iwn_fw_tlv { #define IWN5000_EEPROM_BAND4 0x02e #define IWN5000_EEPROM_BAND5 0x03a #define IWN5000_EEPROM_BAND6 0x041 +#define IWN6000_EEPROM_BAND6 0x040 #define IWN5000_EEPROM_BAND7 0x049 #define IWN6000_EEPROM_ENHINFO 0x054 #define IWN5000_EEPROM_CRYSTAL 0x128 @@ -1432,7 +1436,17 @@ struct iwn_eeprom_chan { } __packed; struct iwn_eeprom_enhinfo { - uint16_t chan; + uint8_t flags; +#define IWN_ENHINFO_VALID 0x01 +#define IWN_ENHINFO_5GHZ 0x02 +#define IWN_ENHINFO_OFDM 0x04 +#define IWN_ENHINFO_HT40 0x08 +#define IWN_ENHINFO_HTAP 0x10 +#define IWN_ENHINFO_RES1 0x20 +#define IWN_ENHINFO_RES2 0x40 +#define IWN_ENHINFO_COMMON 0x80 + + uint8_t chan; int8_t chain[3]; /* max power in half-dBm */ uint8_t reserved; int8_t mimo2; /* max power in half-dBm */ @@ -1486,6 +1500,16 @@ static const uint32_t iwn5000_regulatory_bands[IWN_NBANDS] = { IWN5000_EEPROM_BAND7 }; +static const uint32_t iwn6000_regulatory_bands[IWN_NBANDS] = { + IWN5000_EEPROM_BAND1, + IWN5000_EEPROM_BAND2, + IWN5000_EEPROM_BAND3, + IWN5000_EEPROM_BAND4, + IWN5000_EEPROM_BAND5, + IWN6000_EEPROM_BAND6, + IWN5000_EEPROM_BAND7 +}; + #define IWN_CHAN_BANDS_COUNT 7 #define IWN_MAX_CHAN_PER_BAND 14 static const struct iwn_chan_band { @@ -1513,26 +1537,6 @@ static const struct iwn_chan_band { #define IWN_RIDX_CCK1 0 #define IWN_RIDX_OFDM6 4 -static const struct iwn_rate { - uint8_t rate; - uint8_t plcp; - uint8_t flags; -} iwn_rates[IWN_RIDX_MAX + 1] = { - { 2, 10, IWN_RFLAG_CCK }, - { 4, 20, IWN_RFLAG_CCK }, - { 11, 55, IWN_RFLAG_CCK }, - { 22, 110, IWN_RFLAG_CCK }, - { 12, 0xd, 0 }, - { 18, 0xf, 0 }, - { 24, 0x5, 0 }, - { 36, 0x7, 0 }, - { 48, 0x9, 0 }, - { 72, 0xb, 0 }, - { 96, 0x1, 0 }, - { 108, 0x3, 0 }, - { 120, 0x3, 0 } -}; - #define IWN4965_MAX_PWR_INDEX 107 /* diff --git a/sys/dev/iwn/if_iwnvar.h b/sys/dev/iwn/if_iwnvar.h index a61b3b5..5f46a36 100644 --- a/sys/dev/iwn/if_iwnvar.h +++ b/sys/dev/iwn/if_iwnvar.h @@ -78,6 +78,7 @@ struct iwn_tx_ring { int qid; int queued; int cur; + int read; }; struct iwn_softc; @@ -101,7 +102,12 @@ struct iwn_node { struct ieee80211_node ni; /* must be the first */ uint16_t disable_tid; uint8_t id; - uint8_t ridx[IEEE80211_RATE_MAXSIZE]; + uint32_t ridx[256]; + struct { + uint64_t bitmap; + int startidx; + int nframes; + } agg[IEEE80211_TID_SIZE]; }; struct iwn_calib_state { @@ -174,12 +180,10 @@ struct iwn_ops { int); void (*tx_done)(struct iwn_softc *, struct iwn_rx_desc *, struct iwn_rx_data *); -#if 0 /* HT */ void (*ampdu_tx_start)(struct iwn_softc *, - struct ieee80211_node *, uint8_t, uint16_t); - void (*ampdu_tx_stop)(struct iwn_softc *, uint8_t, + struct ieee80211_node *, int, uint8_t, uint16_t); + void (*ampdu_tx_stop)(struct iwn_softc *, int, uint8_t, uint16_t); -#endif }; struct iwn_vap { @@ -215,6 +219,7 @@ struct iwn_softc { const struct iwn_sensitivity_limits *limits; int ntxqs; + int firstaggqueue; int ndmachnls; uint8_t broadcast_id; int rxonsz; @@ -295,7 +300,6 @@ struct iwn_softc { int8_t maxpwr2GHz; int8_t maxpwr5GHz; int8_t maxpwr[IEEE80211_CHAN_MAX]; - int8_t enh_maxpwr[35]; int32_t temp_off; uint32_t int_mask; @@ -307,6 +311,20 @@ struct iwn_softc { int sc_tx_timer; + struct ieee80211_tx_ampdu *qid2tap[IWN5000_NTXQUEUES]; + + int (*sc_ampdu_rx_start)(struct ieee80211_node *, + struct ieee80211_rx_ampdu *, int, int, int); + void (*sc_ampdu_rx_stop)(struct ieee80211_node *, + struct ieee80211_rx_ampdu *); + int (*sc_addba_request)(struct ieee80211_node *, + struct ieee80211_tx_ampdu *, int, int, int); + int (*sc_addba_response)(struct ieee80211_node *, + struct ieee80211_tx_ampdu *, int, int, int); + void (*sc_addba_stop)(struct ieee80211_node *, + struct ieee80211_tx_ampdu *); + + struct iwn_rx_radiotap_header sc_rxtap; struct iwn_tx_radiotap_header sc_txtap; }; --Boundary-00=_57VvNvUbwvnkjXW-- From owner-freebsd-wireless@FreeBSD.ORG Sun May 1 19:49:34 2011 Return-Path: Delivered-To: freebsd-wireless@hub.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 485EE1065673; Sun, 1 May 2011 19:49:34 +0000 (UTC) (envelope-from eadler@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [IPv6:2001:4f8:fff6::28]) by mx1.freebsd.org (Postfix) with ESMTP id 219128FC1D; Sun, 1 May 2011 19:49:34 +0000 (UTC) Received: from freefall.freebsd.org (localhost [127.0.0.1]) by freefall.freebsd.org (8.14.4/8.14.4) with ESMTP id p41JnXd8094660; Sun, 1 May 2011 19:49:34 GMT (envelope-from eadler@freefall.freebsd.org) Received: (from eadler@localhost) by freefall.freebsd.org (8.14.4/8.14.4/Submit) id p41JnXH9094656; Sun, 1 May 2011 19:49:33 GMT (envelope-from eadler) Date: Sun, 1 May 2011 19:49:33 GMT Message-Id: <201105011949.p41JnXH9094656@freefall.freebsd.org> To: eadler@FreeBSD.org, freebsd-net@FreeBSD.org, freebsd-wireless@FreeBSD.org From: eadler@FreeBSD.org Cc: Subject: Re: bin/137484: [patch] Integer overflow in wpa_supplicant(8) base64 encoder X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Discussions of 802.11 stack, tools device driver development." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 01 May 2011 19:49:34 -0000 Synopsis: [patch] Integer overflow in wpa_supplicant(8) base64 encoder Responsible-Changed-From-To: freebsd-net->freebsd-wireless Responsible-Changed-By: eadler Responsible-Changed-When: Sun May 1 19:49:12 UTC 2011 Responsible-Changed-Why: New mailing list owns this one http://www.freebsd.org/cgi/query-pr.cgi?pr=137484 From owner-freebsd-wireless@FreeBSD.ORG Sun May 1 19:51:55 2011 Return-Path: Delivered-To: freebsd-wireless@hub.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 2B5A7106564A; Sun, 1 May 2011 19:51:55 +0000 (UTC) (envelope-from eadler@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [IPv6:2001:4f8:fff6::28]) by mx1.freebsd.org (Postfix) with ESMTP id 029928FC12; Sun, 1 May 2011 19:51:55 +0000 (UTC) Received: from freefall.freebsd.org (localhost [127.0.0.1]) by freefall.freebsd.org (8.14.4/8.14.4) with ESMTP id p41Jpscl000592; Sun, 1 May 2011 19:51:54 GMT (envelope-from eadler@freefall.freebsd.org) Received: (from eadler@localhost) by freefall.freebsd.org (8.14.4/8.14.4/Submit) id p41Jpsns000583; Sun, 1 May 2011 19:51:54 GMT (envelope-from eadler) Date: Sun, 1 May 2011 19:51:54 GMT Message-Id: <201105011951.p41Jpsns000583@freefall.freebsd.org> To: eadler@FreeBSD.org, freebsd-net@FreeBSD.org, freebsd-wireless@FreeBSD.org From: eadler@FreeBSD.org Cc: Subject: Re: kern/154284: [ath] Modern ath wifi cards (such as AR9285) have missed LED indication X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Discussions of 802.11 stack, tools device driver development." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 01 May 2011 19:51:55 -0000 Synopsis: [ath] Modern ath wifi cards (such as AR9285) have missed LED indication Responsible-Changed-From-To: freebsd-net->freebsd-wireless Responsible-Changed-By: eadler Responsible-Changed-When: Sun May 1 19:51:54 UTC 2011 Responsible-Changed-Why: new mailing list owns this one http://www.freebsd.org/cgi/query-pr.cgi?pr=154284 From owner-freebsd-wireless@FreeBSD.ORG Sun May 1 19:52:16 2011 Return-Path: Delivered-To: freebsd-wireless@hub.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 63EA11065674; Sun, 1 May 2011 19:52:16 +0000 (UTC) (envelope-from eadler@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [IPv6:2001:4f8:fff6::28]) by mx1.freebsd.org (Postfix) with ESMTP id 3B8E58FC08; Sun, 1 May 2011 19:52:16 +0000 (UTC) Received: from freefall.freebsd.org (localhost [127.0.0.1]) by freefall.freebsd.org (8.14.4/8.14.4) with ESMTP id p41JqGax002393; Sun, 1 May 2011 19:52:16 GMT (envelope-from eadler@freefall.freebsd.org) Received: (from eadler@localhost) by freefall.freebsd.org (8.14.4/8.14.4/Submit) id p41JqGik002383; Sun, 1 May 2011 19:52:16 GMT (envelope-from eadler) Date: Sun, 1 May 2011 19:52:16 GMT Message-Id: <201105011952.p41JqGik002383@freefall.freebsd.org> To: eadler@FreeBSD.org, freebsd-net@FreeBSD.org, freebsd-wireless@FreeBSD.org From: eadler@FreeBSD.org Cc: Subject: Re: kern/154567: [ath] ath(4) lot of bad series(0) X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Discussions of 802.11 stack, tools device driver development." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 01 May 2011 19:52:16 -0000 Synopsis: [ath] ath(4) lot of bad series(0) Responsible-Changed-From-To: freebsd-net->freebsd-wireless Responsible-Changed-By: eadler Responsible-Changed-When: Sun May 1 19:52:15 UTC 2011 Responsible-Changed-Why: new mailing list owns this one http://www.freebsd.org/cgi/query-pr.cgi?pr=154567 From owner-freebsd-wireless@FreeBSD.ORG Sun May 1 19:54:14 2011 Return-Path: Delivered-To: freebsd-wireless@hub.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 537431065673; Sun, 1 May 2011 19:54:14 +0000 (UTC) (envelope-from eadler@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [IPv6:2001:4f8:fff6::28]) by mx1.freebsd.org (Postfix) with ESMTP id 2B0A08FC16; Sun, 1 May 2011 19:54:14 +0000 (UTC) Received: from freefall.freebsd.org (localhost [127.0.0.1]) by freefall.freebsd.org (8.14.4/8.14.4) with ESMTP id p41JsEfK003483; Sun, 1 May 2011 19:54:14 GMT (envelope-from eadler@freefall.freebsd.org) Received: (from eadler@localhost) by freefall.freebsd.org (8.14.4/8.14.4/Submit) id p41JsE4q003479; Sun, 1 May 2011 19:54:14 GMT (envelope-from eadler) Date: Sun, 1 May 2011 19:54:14 GMT Message-Id: <201105011954.p41JsE4q003479@freefall.freebsd.org> To: eadler@FreeBSD.org, freebsd-net@FreeBSD.org, freebsd-wireless@FreeBSD.org From: eadler@FreeBSD.org Cc: Subject: Re: kern/145826: [panic] [ath] Unable to configure adhoc mode on ath0/wlan0 X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Discussions of 802.11 stack, tools device driver development." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 01 May 2011 19:54:14 -0000 Old Synopsis: [ath] Unable to configure adhoc mode on ath0/wlan0 New Synopsis: [panic] [ath] Unable to configure adhoc mode on ath0/wlan0 Responsible-Changed-From-To: freebsd-net->freebsd-wireless Responsible-Changed-By: eadler Responsible-Changed-When: Sun May 1 19:53:47 UTC 2011 Responsible-Changed-Why: add panic tag & move to new mailing list http://www.freebsd.org/cgi/query-pr.cgi?pr=145826 From owner-freebsd-wireless@FreeBSD.ORG Sun May 1 19:55:53 2011 Return-Path: Delivered-To: freebsd-wireless@hub.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 6AC4A1065674; Sun, 1 May 2011 19:55:53 +0000 (UTC) (envelope-from eadler@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [IPv6:2001:4f8:fff6::28]) by mx1.freebsd.org (Postfix) with ESMTP id 428328FC20; Sun, 1 May 2011 19:55:53 +0000 (UTC) Received: from freefall.freebsd.org (localhost [127.0.0.1]) by freefall.freebsd.org (8.14.4/8.14.4) with ESMTP id p41Jtr6T003676; Sun, 1 May 2011 19:55:53 GMT (envelope-from eadler@freefall.freebsd.org) Received: (from eadler@localhost) by freefall.freebsd.org (8.14.4/8.14.4/Submit) id p41JtqTc003672; Sun, 1 May 2011 19:55:52 GMT (envelope-from eadler) Date: Sun, 1 May 2011 19:55:52 GMT Message-Id: <201105011955.p41JtqTc003672@freefall.freebsd.org> To: onatan@gmail.com, eadler@FreeBSD.org, freebsd-wireless@FreeBSD.org From: eadler@FreeBSD.org Cc: Subject: Re: bin/137484: [patch] Integer overflow in wpa_supplicant(8) base64 encoder X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Discussions of 802.11 stack, tools device driver development." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 01 May 2011 19:55:53 -0000 Synopsis: [patch] Integer overflow in wpa_supplicant(8) base64 encoder State-Changed-From-To: open->patched State-Changed-By: eadler State-Changed-When: Sun May 1 19:55:52 UTC 2011 State-Changed-Why: the file referenced does not exist on head and the issue appears to be fixed in both head and 8-stable. The problem still exists on 7.x http://www.freebsd.org/cgi/query-pr.cgi?pr=137484 From owner-freebsd-wireless@FreeBSD.ORG Sun May 1 22:07:47 2011 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id E70021065670; Sun, 1 May 2011 22:07:47 +0000 (UTC) (envelope-from jamesbrandongooch@gmail.com) Received: from mail-wy0-f182.google.com (mail-wy0-f182.google.com [74.125.82.182]) by mx1.freebsd.org (Postfix) with ESMTP id 792918FC08; Sun, 1 May 2011 22:07:46 +0000 (UTC) Received: by wyf23 with SMTP id 23so5077910wyf.13 for ; Sun, 01 May 2011 15:07:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc:content-type; bh=/HET1IgllqbtSlFrnWZab7rgx0Q668SPWDuHCKfznr8=; b=JQOO8NQor9/uzj8Uy+87vO75s+THDBudPpu6em1w3oNo6g9x4o4RHxxhFVyn9qgX2L bnGj2xaX0+OTxqlM+aV6gDRB/eYboPqCkUCM4IWhkTyOooUXsISLOJjk3JJ4xKxcEwao Yx5CWqpNqf5hELD3/yBhZTJrW0EM0E5PZjI1I= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; b=I/mQKORXb6NW5vsWC2M2B/pzyimn3T6BQQkXmeuizYUWx5LSfUNAZPctnpwP3F9b3j 9SjK7kxMcTQTpCUA1nnHOmXWE17PkvjLkZayRMV3RpJLP4FD1wjbkhIXETuKYaUb5L+M 9VqFgEf4EgJikXkZlK/pDpjZKGN4ayR3TbPek= MIME-Version: 1.0 Received: by 10.216.242.134 with SMTP id i6mr1861173wer.81.1304285816824; Sun, 01 May 2011 14:36:56 -0700 (PDT) Received: by 10.216.17.213 with HTTP; Sun, 1 May 2011 14:36:56 -0700 (PDT) In-Reply-To: <201105011524.09613.bschmidt@freebsd.org> References: <201105011319.30649.bschmidt@freebsd.org> <201105011524.09613.bschmidt@freebsd.org> Date: Sun, 1 May 2011 16:36:56 -0500 Message-ID: From: Brandon Gooch To: Bernhard Schmidt Content-Type: multipart/mixed; boundary=e0cb4e43d2abcc258304a23db4e6 X-Content-Filtered-By: Mailman/MimeDel 2.1.5 Cc: freebsd-net@freebsd.org, freebsd-wireless@freebsd.org Subject: Re: CFT: 11n support for iwn(4) X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Discussions of 802.11 stack, tools device driver development." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 01 May 2011 22:07:48 -0000 --e0cb4e43d2abcc258304a23db4e6 Content-Type: text/plain; charset=ISO-8859-1 On Sun, May 1, 2011 at 8:24 AM, Bernhard Schmidt wrote: > On Sunday 01 May 2011 13:19:30 Bernhard Schmidt wrote: >> Hi, >> >> I finally managed to get the 11n bits for iwn(4) sorted out. Well, >> there is still an issue somewhere with HT40 frame protection or >> TX chain setup on 5000 adapters, resulting in throughput not being >> that stable. But overall it seems to work pretty decently >> >> This is for HEAD only right now, net80211 in stable/8 does not yet >> contain the latest 11n related fixes. So, if you run HEAD and have >> some iwn(4) hardware, I'd appreciate feedback. >> .. > > Updated version, I've missed a locking issue. > > -- > Bernhard Thanks for working on this Bernhard! Unfortunately, I'm having trouble achieving HT rates. After 'wlandebug 0xffffffff', lots of: ... May 1 14:38:15 x300 kernel: wlan0: received beacon from 00:1d:0f:d3:fb:cc rssi 47 May 1 14:38:15 x300 kernel: wlan0: [00:1d:0f:d3:fb:cc] discard beacon frame, ie too short, got 26, expected 30 ... I've attached relevant debugging information, but let me know if there may be anything else that could help. I need to work on DTracing net80211, any tips on relevant function traces? -Brandon --e0cb4e43d2abcc258304a23db4e6-- From owner-freebsd-wireless@FreeBSD.ORG Mon May 2 05:44:07 2011 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 0BEB3106566C for ; Mon, 2 May 2011 05:44:07 +0000 (UTC) (envelope-from adrian.chadd@gmail.com) Received: from mail-vw0-f54.google.com (mail-vw0-f54.google.com [209.85.212.54]) by mx1.freebsd.org (Postfix) with ESMTP id BD4FD8FC08 for ; Mon, 2 May 2011 05:44:06 +0000 (UTC) Received: by vws18 with SMTP id 18so5327974vws.13 for ; Sun, 01 May 2011 22:44:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:sender:date:x-google-sender-auth :message-id:subject:from:to:content-type; bh=T56hnTkeD/83ha4YjIFLcu7WsRkua15G40m2LDa+3Po=; b=FWFWgomI/DWdDsyamf4e+0/Qi5Bo1Ulq7IhlW2p9QSHxN/AkLVcSHttr7bg1VYHT7F dYL5k18/bSdz04O229V1zSXUSZLf1RwVObzMHpl/xTk7i9Slyu3DffTkP1cLHOcC6o8/ Ckrqo3p5hPRkaT7rXQQ87FQuxP08rN2SDLHQc= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:sender:date:x-google-sender-auth:message-id:subject :from:to:content-type; b=MijhlM7qY0xlSSzERnD5DG09Q6bnzW2cIJiXw0UhkGteyq4TgAJEMUOqLbqryhBbcQ Sj01mbsQhePdxv4pnBy7F51t9ctzDG5XLLhGxsNljlJSvZyzs/9krT0RhiB+R3L3dJe8 nqb7luH8gQENDQIshG4XboAy0jjuDOLHzaleI= MIME-Version: 1.0 Received: by 10.52.96.8 with SMTP id do8mr4222503vdb.142.1304315045769; Sun, 01 May 2011 22:44:05 -0700 (PDT) Sender: adrian.chadd@gmail.com Received: by 10.52.157.202 with HTTP; Sun, 1 May 2011 22:44:05 -0700 (PDT) Date: Mon, 2 May 2011 13:44:05 +0800 X-Google-Sender-Auth: TGfk2YlVClA_IbVu_4MJFiCzH7w Message-ID: From: Adrian Chadd To: freebsd-wireless@freebsd.org Content-Type: multipart/mixed; boundary=20cf307d064cfa710004a24482fa Subject: [net80211] patch: make aggressive mode a compile time option X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Discussions of 802.11 stack, tools device driver development." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 02 May 2011 05:44:07 -0000 --20cf307d064cfa710004a24482fa Content-Type: text/plain; charset=ISO-8859-1 Right now aggressive mode is enabled by default. This twiddles the WME parameters for the bulk data queue to allow bursting if there's no data on the higher priority queues. This patch disables it by default and adds a new compile time option that restores the previous behaviour. I'd like to suggest this be disabled by default as it differs from the "specification" 802.11e behaviour and I'm not yet entirely convinced it's working correctly. Specifically, I've seen hostap setups set the wme beacon field to the aggressive mode parameters but not update the wlan interface with them; making the AP wlan interface nconsistent with th erest of the stations. I'm open to making it on by default but still make it easy to disable as a build-time option. Thanks, Adrian --20cf307d064cfa710004a24482fa Content-Type: application/octet-stream; name="aggrmode-optional.diff" Content-Disposition: attachment; filename="aggrmode-optional.diff" Content-Transfer-Encoding: base64 X-Attachment-Id: f_gn6zhpi10 SW5kZXg6IHN5cy9jb25mL29wdGlvbnMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gc3lzL2NvbmYvb3B0aW9ucwko cmV2aXNpb24gMjIxMzEyKQorKysgc3lzL2NvbmYvb3B0aW9ucwkod29ya2luZyBjb3B5KQpAQCAt ODM5LDYgKzgzOSw3IEBACiBJRUVFODAyMTFfU1VQUE9SVF9TVVBFUkcJb3B0X3dsYW4uaAogSUVF RTgwMjExX1NVUFBPUlRfVERNQQlvcHRfd2xhbi5oCiBJRUVFODAyMTFfQUxRCQlvcHRfd2xhbi5o CitJRUVFODAyMTFfU1VQUE9SVF9BR0dSTU9ERQlvcHRfd2xhbi5oCiAKICMgODAyLjExIFRETUEg c3VwcG9ydAogVERNQV9TTE9UTEVOX0RFRkFVTFQJb3B0X3RkbWEuaApJbmRleDogc3lzL25ldDgw MjExL2llZWU4MDIxMV9vdXRwdXQuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBzeXMvbmV0ODAyMTEvaWVlZTgw MjExX291dHB1dC5jCShyZXZpc2lvbiAyMjA5MTEpCisrKyBzeXMvbmV0ODAyMTEvaWVlZTgwMjEx X291dHB1dC5jCSh3b3JraW5nIGNvcHkpCkBAIC0yODIwLDYgKzI4MjAsNyBAQAogCWlmICh2YXAt Pml2X2ZsYWdzICYgSUVFRTgwMjExX0ZfV01FKSB7CiAJCXN0cnVjdCBpZWVlODAyMTFfd21lX3N0 YXRlICp3bWUgPSAmaWMtPmljX3dtZTsKIAorI2lmZGVmCUlFRUU4MDIxMV9TVVBQT1JUX0FHR1JN T0RFCiAJCS8qCiAJCSAqIENoZWNrIGZvciBhZ3Jlc3NpdmUgbW9kZSBjaGFuZ2UuICBXaGVuIHRo ZXJlIGlzCiAJCSAqIHNpZ25pZmljYW50IGhpZ2ggcHJpb3JpdHkgdHJhZmZpYyBpbiB0aGUgQlNT CkBAIC0yODUyLDYgKzI4NTMsOCBAQAogCQkJCXdtZS0+d21lX2hpcHJpX3RyYWZmaWMgPQogCQkJ CQl3bWUtPndtZV9oaXByaV9zd2l0Y2hfaHlzdGVyZXNpczsKIAkJfQorI2VuZGlmCS8qIElFRUU4 MDIxMV9TVVBQT1JUX0FHR1JNT0RFICovCisKIAkJaWYgKGlzc2V0KGJvLT5ib19mbGFncywgSUVF RTgwMjExX0JFQUNPTl9XTUUpKSB7CiAJCQkodm9pZCkgaWVlZTgwMjExX2FkZF93bWVfcGFyYW0o Ym8tPmJvX3dtZSwgd21lKTsKIAkJCWNscmJpdChiby0+Ym9fZmxhZ3MsIElFRUU4MDIxMV9CRUFD T05fV01FKTsKSW5kZXg6IHN5cy9uZXQ4MDIxMS9pZWVlODAyMTFfcHJvdG8uYwo9PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 Ci0tLSBzeXMvbmV0ODAyMTEvaWVlZTgwMjExX3Byb3RvLmMJKHJldmlzaW9uIDIyMDkxMSkKKysr IHN5cy9uZXQ4MDIxMS9pZWVlODAyMTFfcHJvdG8uYwkod29ya2luZyBjb3B5KQpAQCAtOTc0LDYg Kzk3NCw3IEBACiB2b2lkCiBpZWVlODAyMTFfd21lX3VwZGF0ZXBhcmFtc19sb2NrZWQoc3RydWN0 IGllZWU4MDIxMXZhcCAqdmFwKQogeworI2lmZGVmCUlFRUU4MDIxMV9TVVBQT1JUX0FHR1JNT0RF CiAJc3RhdGljIGNvbnN0IHBhcmFtVHlwZSBhZ2dyUGFyYW1bSUVFRTgwMjExX01PREVfTUFYXSA9 IHsKIAkgICAgW0lFRUU4MDIxMV9NT0RFX0FVVE9dCT0geyAyLCA0LCAxMCwgNjQsIDAgfSwKIAkg ICAgW0lFRUU4MDIxMV9NT0RFXzExQV0JPSB7IDIsIDQsIDEwLCA2NCwgMCB9LApAQCAtOTg4LDEw ICs5ODksMTQgQEAKIAkgICAgW0lFRUU4MDIxMV9NT0RFXzExTkFdCT0geyAyLCA0LCAxMCwgNjQs IDAgfSwJLyogWFhYY2hlY2sqLwogCSAgICBbSUVFRTgwMjExX01PREVfMTFOR10JPSB7IDIsIDQs IDEwLCA2NCwgMCB9LAkvKiBYWFhjaGVjayovCiAJfTsKKwlzdHJ1Y3Qgd21lUGFyYW1zICpic3Nw OworCisjZW5kaWYJLyogSUVFRTgwMjExX1NVUFBPUlRfQUdHUk1PREUgKi8KKwogCXN0cnVjdCBp ZWVlODAyMTFjb20gKmljID0gdmFwLT5pdl9pYzsKIAlzdHJ1Y3QgaWVlZTgwMjExX3dtZV9zdGF0 ZSAqd21lID0gJmljLT5pY193bWU7CiAJY29uc3Qgc3RydWN0IHdtZVBhcmFtcyAqd21lcDsKLQlz dHJ1Y3Qgd21lUGFyYW1zICpjaGFucCwgKmJzc3A7CisJc3RydWN0IHdtZVBhcmFtcyAqY2hhbnA7 CiAJZW51bSBpZWVlODAyMTFfcGh5bW9kZSBtb2RlOwogCWludCBpOwogCkBAIC0xMDI2LDYgKzEw MzEsNyBAQAogCWVsc2UKIAkJbW9kZSA9IElFRUU4MDIxMV9NT0RFX0FVVE87CiAKKyNpZmRlZglJ RUVFODAyMTFfU1VQUE9SVF9BR0dSTU9ERQogCS8qCiAJICogVGhpcyBpbXBsZW1lbnRzIGFncmVz c2l2ZSBtb2RlIGFzIGZvdW5kIGluIGNlcnRhaW4KIAkgKiB2ZW5kb3JzJyBBUCdzLiAgV2hlbiB0 aGVyZSBpcyBzaWduaWZpY2FudCBoaWdoCkBAIC0xMDgxLDYgKzEwODcsOCBAQAogCQkgICAgInVw ZGF0ZSAlcyAoY2hhbitic3MpIGxvZ2N3bWluICV1XG4iLAogCQkgICAgaWVlZTgwMjExX3dtZV9h Y25hbWVzW1dNRV9BQ19CRV0sIGNoYW5wLT53bWVwX2xvZ2N3bWluKTsKICAgICAJfQkKKyNlbmRp ZgkvKiBJRUVFODAyMTFfU1VQUE9SVF9BR0dSTU9ERSAqLworCiAJaWYgKHZhcC0+aXZfb3Btb2Rl ID09IElFRUU4MDIxMV9NX0hPU1RBUCkgewkvKiBYWFggaWJzcz8gKi8KIAkJLyoKIAkJICogQXJy YW5nZSBmb3IgYSBiZWFjb24gdXBkYXRlIGFuZCBidW1wIHRoZSBwYXJhbWV0ZXIK --20cf307d064cfa710004a24482fa-- From owner-freebsd-wireless@FreeBSD.ORG Mon May 2 06:43:28 2011 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 431C5106566C for ; Mon, 2 May 2011 06:43:28 +0000 (UTC) (envelope-from adrian.chadd@gmail.com) Received: from mail-vw0-f54.google.com (mail-vw0-f54.google.com [209.85.212.54]) by mx1.freebsd.org (Postfix) with ESMTP id EE2B48FC19 for ; Mon, 2 May 2011 06:43:27 +0000 (UTC) Received: by vws18 with SMTP id 18so5350148vws.13 for ; Sun, 01 May 2011 23:43:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:sender:date:x-google-sender-auth :message-id:subject:from:to:content-type; bh=lMX9hxGkihTOsIHphGOSwiREeJVsSt4nMbVCzQyH90c=; b=GhoSSrXC7k4s1p8dG6HoUufdFG4mXawDKuBR8+qXbTeM7cLWyyn3OQlSSD7KkPrHi6 2fK2LSmiYW5SkhTR7x/AXGoZKVDwSjDeJQowP/vfyudqaoUdjWkABP1/Grf+8Au5Fn5J ardyfc5SeQ9EvRNpQvogiR3hF0DTM8+w4eWO4= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:sender:date:x-google-sender-auth:message-id:subject :from:to:content-type; b=l5k0l59bHOdE9ifSMAZamiKQ2xkgXrcZyNef9XsdNZDWSk7lS699fg07orCu5a8GkT l4zAdKiu3vAHp/Jk2dMYSkZlTnLNZow5QJLUFDWFc+EtpkaJvkeDf3dVvls7XgFjzSra bSGV2EhGjkWyAie+wEQdMLB5uj5dXPu+j+UNo= MIME-Version: 1.0 Received: by 10.52.183.136 with SMTP id em8mr6814777vdc.262.1304318607270; Sun, 01 May 2011 23:43:27 -0700 (PDT) Sender: adrian.chadd@gmail.com Received: by 10.52.157.202 with HTTP; Sun, 1 May 2011 23:43:27 -0700 (PDT) Date: Mon, 2 May 2011 14:43:27 +0800 X-Google-Sender-Auth: hRm10ZwYsG7jSw8AkgIWNumvthM Message-ID: From: Adrian Chadd To: freebsd-wireless@freebsd.org Content-Type: multipart/mixed; boundary=bcaec5489e4342a47904a24557cf Subject: [net80211] patch: properly handle sequence checking for HT non-aggregation; refactor out shared code X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Discussions of 802.11 stack, tools device driver development." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 02 May 2011 06:43:28 -0000 --bcaec5489e4342a47904a24557cf Content-Type: text/plain; charset=ISO-8859-1 Hi, The attached patch does two things: Firstly, it abstracts out the sequence number checks in {sta,hostap,mesh,adhoc,wds} into a new function, ieee80211_check_rxseq(). A lot of the input path code is shared; I'm not going to try and refactor all of it. Secondly, it attempts to do the HT mode checking correctly. The existing code assumes HT == AMPDU, so don't worry about re-ordering. Instead, my replacement code checks whether QOS/WME is enabled and if so, checks whether AMPDU-RX is running. If it is, it ignores the sequence number check. If it isn't running AMPDU-RX, it enforces the same sequence number check for non-HT modes. This gets rid of the duplicate packet issues I've seen when doing 11n (non AMPDU-RX) but it doesn't fix the out of order TCP packet behaviour plaguing performance. Adrian --bcaec5489e4342a47904a24557cf Content-Type: application/octet-stream; name="net80211-rxseq-ht.diff" Content-Disposition: attachment; filename="net80211-rxseq-ht.diff" Content-Transfer-Encoding: base64 X-Attachment-Id: f_gn71g7qe0 SW5kZXg6IHN5cy9uZXQ4MDIxMS9pZWVlODAyMTFfc3RhLmMKPT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gc3lzL25l dDgwMjExL2llZWU4MDIxMV9zdGEuYwkocmV2aXNpb24gMjIwOTExKQorKysgc3lzL25ldDgwMjEx L2llZWU4MDIxMV9zdGEuYwkod29ya2luZyBjb3B5KQpAQCAtNTEyLDcgKzUxMiw2IEBACiBzdGF0 aWMgaW50CiBzdGFfaW5wdXQoc3RydWN0IGllZWU4MDIxMV9ub2RlICpuaSwgc3RydWN0IG1idWYg Km0sIGludCByc3NpLCBpbnQgbmYpCiB7Ci0jZGVmaW5lCVNFUV9MRVEoYSxiKQkoKGludCkoKGEp LShiKSkgPD0gMCkKICNkZWZpbmUJSEFTX1NFUSh0eXBlKQkoKHR5cGUgJiAweDQpID09IDApCiAJ c3RydWN0IGllZWU4MDIxMXZhcCAqdmFwID0gbmktPm5pX3ZhcDsKIAlzdHJ1Y3QgaWVlZTgwMjEx Y29tICppYyA9IG5pLT5uaV9pYzsKQEAgLTU5MSw5ICs1OTAsNyBAQAogCQkJICAgIFRJRF9UT19X TUVfQUModGlkKSA+PSBXTUVfQUNfVkkpCiAJCQkJaWMtPmljX3dtZS53bWVfaGlwcmlfdHJhZmZp YysrOwogCQkJcnhzZXEgPSBsZTE2dG9oKCoodWludDE2X3QgKil3aC0+aV9zZXEpOwotCQkJaWYg KChuaS0+bmlfZmxhZ3MgJiBJRUVFODAyMTFfTk9ERV9IVCkgPT0gMCAmJgotCQkJICAgICh3aC0+ aV9mY1sxXSAmIElFRUU4MDIxMV9GQzFfUkVUUlkpICYmCi0JCQkgICAgU0VRX0xFUShyeHNlcSwg bmktPm5pX3J4c2Vxc1t0aWRdKSkgeworCQkJaWYgKCEgaWVlZTgwMjExX2NoZWNrX3J4c2VxKG5p LCB3aCkpIHsKIAkJCQkvKiBkdXBsaWNhdGUsIGRpc2NhcmQgKi8KIAkJCQlJRUVFODAyMTFfRElT Q0FSRF9NQUModmFwLCBJRUVFODAyMTFfTVNHX0lOUFVULAogCQkJCSAgICBic3NpZCwgImR1cGxp Y2F0ZSIsCkBAIC05MTAsNyArOTA3LDYgQEAKIAkJbV9mcmVlbShtKTsKIAl9CiAJcmV0dXJuIHR5 cGU7Ci0jdW5kZWYgU0VRX0xFUQogfQogCiBzdGF0aWMgdm9pZApJbmRleDogc3lzL25ldDgwMjEx L2llZWU4MDIxMV93ZHMuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBzeXMvbmV0ODAyMTEvaWVlZTgwMjExX3dk cy5jCShyZXZpc2lvbiAyMjA5MTEpCisrKyBzeXMvbmV0ODAyMTEvaWVlZTgwMjExX3dkcy5jCSh3 b3JraW5nIGNvcHkpCkBAIC00MDYsNyArNDA2LDYgQEAKIHN0YXRpYyBpbnQKIHdkc19pbnB1dChz dHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pLCBzdHJ1Y3QgbWJ1ZiAqbSwgaW50IHJzc2ksIGludCBu ZikKIHsKLSNkZWZpbmUJU0VRX0xFUShhLGIpCSgoaW50KSgoYSktKGIpKSA8PSAwKQogI2RlZmlu ZQlIQVNfU0VRKHR5cGUpCSgodHlwZSAmIDB4NCkgPT0gMCkKIAlzdHJ1Y3QgaWVlZTgwMjExdmFw ICp2YXAgPSBuaS0+bmlfdmFwOwogCXN0cnVjdCBpZWVlODAyMTFjb20gKmljID0gbmktPm5pX2lj OwpAQCAtNDk1LDkgKzQ5NCw3IEBACiAJCSAgICBUSURfVE9fV01FX0FDKHRpZCkgPj0gV01FX0FD X1ZJKQogCQkJaWMtPmljX3dtZS53bWVfaGlwcmlfdHJhZmZpYysrOwogCQlyeHNlcSA9IGxlMTZ0 b2goKih1aW50MTZfdCAqKXdoLT5pX3NlcSk7Ci0JCWlmICgobmktPm5pX2ZsYWdzICYgSUVFRTgw MjExX05PREVfSFQpID09IDAgJiYKLQkJICAgICh3aC0+aV9mY1sxXSAmIElFRUU4MDIxMV9GQzFf UkVUUlkpICYmCi0JCSAgICBTRVFfTEVRKHJ4c2VxLCBuaS0+bmlfcnhzZXFzW3RpZF0pKSB7CisJ CWlmICghIGllZWU4MDIxMV9jaGVja19yeHNlcShuaSwgd2gpKSB7CiAJCQkvKiBkdXBsaWNhdGUs IGRpc2NhcmQgKi8KIAkJCUlFRUU4MDIxMV9ESVNDQVJEX01BQyh2YXAsIElFRUU4MDIxMV9NU0df SU5QVVQsCiAJCQkgICAgd2gtPmlfYWRkcjEsICJkdXBsaWNhdGUiLApAQCAtNzQxLDcgKzczOCw2 IEBACiAJCW1fZnJlZW0obSk7CiAJfQogCXJldHVybiB0eXBlOwotI3VuZGVmIFNFUV9MRVEKIH0K IAogc3RhdGljIHZvaWQKSW5kZXg6IHN5cy9uZXQ4MDIxMS9pZWVlODAyMTFfaG9zdGFwLmMKPT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PQotLS0gc3lzL25ldDgwMjExL2llZWU4MDIxMV9ob3N0YXAuYwkocmV2aXNpb24gMjIw OTExKQorKysgc3lzL25ldDgwMjExL2llZWU4MDIxMV9ob3N0YXAuYwkod29ya2luZyBjb3B5KQpA QCAtNDcyLDcgKzQ3Miw2IEBACiBzdGF0aWMgaW50CiBob3N0YXBfaW5wdXQoc3RydWN0IGllZWU4 MDIxMV9ub2RlICpuaSwgc3RydWN0IG1idWYgKm0sIGludCByc3NpLCBpbnQgbmYpCiB7Ci0jZGVm aW5lCVNFUV9MRVEoYSxiKQkoKGludCkoKGEpLShiKSkgPD0gMCkKICNkZWZpbmUJSEFTX1NFUSh0 eXBlKQkoKHR5cGUgJiAweDQpID09IDApCiAJc3RydWN0IGllZWU4MDIxMXZhcCAqdmFwID0gbmkt Pm5pX3ZhcDsKIAlzdHJ1Y3QgaWVlZTgwMjExY29tICppYyA9IG5pLT5uaV9pYzsKQEAgLTU3Miw5 ICs1NzEsNyBAQAogCQkJICAgIFRJRF9UT19XTUVfQUModGlkKSA+PSBXTUVfQUNfVkkpCiAJCQkJ aWMtPmljX3dtZS53bWVfaGlwcmlfdHJhZmZpYysrOwogCQkJcnhzZXEgPSBsZTE2dG9oKCoodWlu dDE2X3QgKil3aC0+aV9zZXEpOwotCQkJaWYgKChuaS0+bmlfZmxhZ3MgJiBJRUVFODAyMTFfTk9E RV9IVCkgPT0gMCAmJgotCQkJICAgICh3aC0+aV9mY1sxXSAmIElFRUU4MDIxMV9GQzFfUkVUUlkp ICYmCi0JCQkgICAgU0VRX0xFUShyeHNlcSwgbmktPm5pX3J4c2Vxc1t0aWRdKSkgeworCQkJaWYg KCEgaWVlZTgwMjExX2NoZWNrX3J4c2VxKG5pLCB3aCkpIHsKIAkJCQkvKiBkdXBsaWNhdGUsIGRp c2NhcmQgKi8KIAkJCQlJRUVFODAyMTFfRElTQ0FSRF9NQUModmFwLCBJRUVFODAyMTFfTVNHX0lO UFVULAogCQkJCSAgICBic3NpZCwgImR1cGxpY2F0ZSIsCkBAIC05MTQsNyArOTExLDYgQEAKIAkJ bV9mcmVlbShtKTsKIAl9CiAJcmV0dXJuIHR5cGU7Ci0jdW5kZWYgU0VRX0xFUQogfQogCiBzdGF0 aWMgdm9pZApJbmRleDogc3lzL25ldDgwMjExL2llZWU4MDIxMV9tZXNoLmMKPT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot LS0gc3lzL25ldDgwMjExL2llZWU4MDIxMV9tZXNoLmMJKHJldmlzaW9uIDIyMDkxMSkKKysrIHN5 cy9uZXQ4MDIxMS9pZWVlODAyMTFfbWVzaC5jCSh3b3JraW5nIGNvcHkpCkBAIC0xMDQwLDcgKzEw NDAsNiBAQAogc3RhdGljIGludAogbWVzaF9pbnB1dChzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5p LCBzdHJ1Y3QgbWJ1ZiAqbSwgaW50IHJzc2ksIGludCBuZikKIHsKLSNkZWZpbmUJU0VRX0xFUShh LGIpCSgoaW50KSgoYSktKGIpKSA8PSAwKQogI2RlZmluZQlIQVNfU0VRKHR5cGUpCSgodHlwZSAm IDB4NCkgPT0gMCkKIAlzdHJ1Y3QgaWVlZTgwMjExdmFwICp2YXAgPSBuaS0+bmlfdmFwOwogCXN0 cnVjdCBpZWVlODAyMTFjb20gKmljID0gbmktPm5pX2ljOwpAQCAtMTA5NCw5ICsxMDkzLDcgQEAK IAkJCSAgICBUSURfVE9fV01FX0FDKHRpZCkgPj0gV01FX0FDX1ZJKQogCQkJCWljLT5pY193bWUu d21lX2hpcHJpX3RyYWZmaWMrKzsKIAkJCXJ4c2VxID0gbGUxNnRvaCgqKHVpbnQxNl90ICopd2gt Pmlfc2VxKTsKLQkJCWlmICgobmktPm5pX2ZsYWdzICYgSUVFRTgwMjExX05PREVfSFQpID09IDAg JiYKLQkJCSAgICAod2gtPmlfZmNbMV0gJiBJRUVFODAyMTFfRkMxX1JFVFJZKSAmJgotCQkJICAg IFNFUV9MRVEocnhzZXEsIG5pLT5uaV9yeHNlcXNbdGlkXSkpIHsKKwkJCWlmICghIGllZWU4MDIx MV9jaGVja19yeHNlcShuaSwgd2gpKSB7CiAJCQkJLyogZHVwbGljYXRlLCBkaXNjYXJkICovCiAJ CQkJSUVFRTgwMjExX0RJU0NBUkRfTUFDKHZhcCwgSUVFRTgwMjExX01TR19JTlBVVCwKIAkJCQkg ICAgd2gtPmlfYWRkcjEsICJkdXBsaWNhdGUiLApJbmRleDogc3lzL25ldDgwMjExL2llZWU4MDIx MV9pbnB1dC5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT0KLS0tIHN5cy9uZXQ4MDIxMS9pZWVlODAyMTFfaW5wdXQuYwko cmV2aXNpb24gMjIwOTExKQorKysgc3lzL25ldDgwMjExL2llZWU4MDIxMV9pbnB1dC5jCSh3b3Jr aW5nIGNvcHkpCkBAIC03NjAsNiArNzYwLDU3IEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qCisgKiBD aGVjayB0aGUgY3VycmVudCBmcmFtZSBzZXF1ZW5jZSBudW1iZXIgYWdhaW5zdCB0aGUgY3VycmVu dCBUSUQKKyAqIHN0YXRlIGFuZCByZXR1cm4gd2hldGhlciBpdCdzIGluIHNlcXVlbmNlIG9yIHNo b3VsZCBiZSBkcm9wcGVkLgorICovCitpbnQKK2llZWU4MDIxMV9jaGVja19yeHNlcShzdHJ1Y3Qg aWVlZTgwMjExX25vZGUgKm5pLCBzdHJ1Y3QgaWVlZTgwMjExX2ZyYW1lICp3aCkKK3sKKyNkZWZp bmUJU0VRX0xFUShhLGIpCSgoaW50KSgoYSktKGIpKSA8PSAwKQorI2RlZmluZQlIQVNfU0VRKHR5 cGUpCSgodHlwZSAmIDB4NCkgPT0gMCkKKwl1aW50MTZfdCByeHNlcTsKKwl1aW50OF90IHR5cGU7 CisJdWludDhfdCB0aWQ7CisJc3RydWN0IGllZWU4MDIxMV9yeF9hbXBkdSAqcmFwOworCisJcnhz ZXEgPSBsZTE2dG9oKCoodWludDE2X3QgKil3aC0+aV9zZXEpOworCXR5cGUgPSB3aC0+aV9mY1sw XSAmIElFRUU4MDIxMV9GQzBfVFlQRV9NQVNLOworCisJLyogVHlwZXMgd2l0aCBubyBzZXF1ZW5j ZSBudW1iZXIgYXJlIGFsd2F5cyB0cmVhdGVkIHZhbGlkICovCisJaWYgKCEgSEFTX1NFUSh0eXBl KSkKKwkJcmV0dXJuIDE7CisKKwl0aWQgPSBpZWVlODAyMTFfZ2V0dGlkKHdoKTsKKworCS8qCisJ ICogT25seSBkbyB0aGUgSFQgQU1QRFUgY2hlY2sgZm9yIFdNRSBzdGF0aW9uczsgbm9uLVdNRSBI VCBzdGF0aW9ucworCSAqIHNob3VsZG4ndCBleGlzdCBvdXRzaWRlIG9mIGRlYnVnZ2luZy4gV2Ug c2hvdWxkIGF0IGxlYXN0CisJICogaGFuZGxlIHRoYXQuCisJICovCisJaWYgKHRpZCA8IFdNRV9O VU1fVElEKSB7CisJCXJhcCA9ICZuaS0+bmlfcnhfYW1wZHVbdGlkXTsKKwkJLyogSFQgbm9kZXMg Y3VycmVudGx5IGRvaW5nIFJYIEFNUERVIGFyZSBhbHdheXMgdmFsaWQgKi8KKwkJaWYgKChuaS0+ bmlfZmxhZ3MgJiBJRUVFODAyMTFfTk9ERV9IVCkgJiYKKwkJICAgIChyYXAtPnJ4YV9mbGFncyAm IElFRUU4MDIxMV9BR0dSX1JVTk5JTkcpKQorCQkJcmV0dXJuIDE7CisJfQorCisJLyoJCisJICog T3RoZXJ3aXNlLCByZXRyaWVzIGZvciBwYWNrZXRzIGJlbG93IG9yIGVxdWFsIHRvIHRoZSBsYXN0 CisJICogc2VlbiBzZXF1ZW5jZSBudW1iZXIgc2hvdWxkIGJlIGRyb3BwZWQuCisJICoKKwkgKiBY WFggVGhpcyBzaG91bGQgYmUgcmV2aXNpdGVkIHRvIHRydWVseSBpZGVudGlmeS9sb2cgdmVyeQor CSAqIFhYWCBvdXQgb2Ygb3JkZXIgcGFja2V0cyAoZHVlIHRvIHZlbmRvciBidWdzKSwgcmF0aGVy IHRoYW4KKwkgKiBYWFggc2ltcGx5IHJldHJhbnNtaXRzLgorCSAqLworCWlmICgod2gtPmlfZmNb MV0gJiBJRUVFODAyMTFfRkMxX1JFVFJZKSAmJgorCSAgICBTRVFfTEVRKHJ4c2VxLCBuaS0+bmlf cnhzZXFzW3RpZF0pKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCiAjaWZkZWYgSUVF RTgwMjExX0RFQlVHCiAvKgogICogRGVidWdnaW5nIHN1cHBvcnQuCkluZGV4OiBzeXMvbmV0ODAy MTEvaWVlZTgwMjExX2lucHV0LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gc3lzL25ldDgwMjExL2llZWU4MDIx MV9pbnB1dC5oCShyZXZpc2lvbiAyMjA5MTEpCisrKyBzeXMvbmV0ODAyMTEvaWVlZTgwMjExX2lu cHV0LmgJKHdvcmtpbmcgY29weSkKQEAgLTE1Nyw0ICsxNTcsNiBAQAogaW50CWllZWU4MDIxMV9w YXJzZV9iZWFjb24oc3RydWN0IGllZWU4MDIxMV9ub2RlICosIHN0cnVjdCBtYnVmICosCiAJCXN0 cnVjdCBpZWVlODAyMTFfc2NhbnBhcmFtcyAqKTsKIGludAlpZWVlODAyMTFfcGFyc2VfYWN0aW9u KHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqLCBzdHJ1Y3QgbWJ1ZiAqKTsKK2ludAlpZWVlODAyMTFf Y2hlY2tfcnhzZXEoc3RydWN0IGllZWU4MDIxMV9ub2RlICpuaSwKKwkJc3RydWN0IGllZWU4MDIx MV9mcmFtZSAqd2gpOwogI2VuZGlmIC8qIF9ORVQ4MDIxMV9JRUVFODAyMTFfSU5QVVRfSF8gKi8K SW5kZXg6IHN5cy9uZXQ4MDIxMS9pZWVlODAyMTFfYWRob2MuYwo9PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBzeXMv bmV0ODAyMTEvaWVlZTgwMjExX2FkaG9jLmMJKHJldmlzaW9uIDIyMDkxMSkKKysrIHN5cy9uZXQ4 MDIxMS9pZWVlODAyMTFfYWRob2MuYwkod29ya2luZyBjb3B5KQpAQCAtMjg1LDcgKzI4NSw2IEBA CiBzdGF0aWMgaW50CiBhZGhvY19pbnB1dChzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pLCBzdHJ1 Y3QgbWJ1ZiAqbSwgaW50IHJzc2ksIGludCBuZikKIHsKLSNkZWZpbmUJU0VRX0xFUShhLGIpCSgo aW50KSgoYSktKGIpKSA8PSAwKQogI2RlZmluZQlIQVNfU0VRKHR5cGUpCSgodHlwZSAmIDB4NCkg PT0gMCkKIAlzdHJ1Y3QgaWVlZTgwMjExdmFwICp2YXAgPSBuaS0+bmlfdmFwOwogCXN0cnVjdCBp ZWVlODAyMTFjb20gKmljID0gbmktPm5pX2ljOwpAQCAtNDEyLDkgKzQxMSw3IEBACiAJCQkgICAg VElEX1RPX1dNRV9BQyh0aWQpID49IFdNRV9BQ19WSSkKIAkJCQlpYy0+aWNfd21lLndtZV9oaXBy aV90cmFmZmljKys7CiAJCQlyeHNlcSA9IGxlMTZ0b2goKih1aW50MTZfdCAqKXdoLT5pX3NlcSk7 Ci0JCQlpZiAoKG5pLT5uaV9mbGFncyAmIElFRUU4MDIxMV9OT0RFX0hUKSA9PSAwICYmCi0JCQkg ICAgKHdoLT5pX2ZjWzFdICYgSUVFRTgwMjExX0ZDMV9SRVRSWSkgJiYKLQkJCSAgICBTRVFfTEVR KHJ4c2VxLCBuaS0+bmlfcnhzZXFzW3RpZF0pKSB7CisJCQlpZiAoISBpZWVlODAyMTFfY2hlY2tf cnhzZXEobmksIHdoKSkgewogCQkJCS8qIGR1cGxpY2F0ZSwgZGlzY2FyZCAqLwogCQkJCUlFRUU4 MDIxMV9ESVNDQVJEX01BQyh2YXAsIElFRUU4MDIxMV9NU0dfSU5QVVQsCiAJCQkJICAgIGJzc2lk LCAiZHVwbGljYXRlIiwKQEAgLTY2MCw3ICs2NTcsNiBAQAogCQltX2ZyZWVtKG0pOwogCX0KIAly ZXR1cm4gdHlwZTsKLSN1bmRlZiBTRVFfTEVRCiB9CiAKIHN0YXRpYyBpbnQK --bcaec5489e4342a47904a24557cf-- From owner-freebsd-wireless@FreeBSD.ORG Mon May 2 07:09:26 2011 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id E696F106564A; Mon, 2 May 2011 07:09:26 +0000 (UTC) (envelope-from bschmidt@techwires.net) Received: from mail-bw0-f54.google.com (mail-bw0-f54.google.com [209.85.214.54]) by mx1.freebsd.org (Postfix) with ESMTP id 4F9358FC14; Mon, 2 May 2011 07:09:25 +0000 (UTC) Received: by bwz12 with SMTP id 12so6311829bwz.13 for ; Mon, 02 May 2011 00:09:25 -0700 (PDT) Received: by 10.204.57.135 with SMTP id c7mr6842095bkh.88.1304320164785; Mon, 02 May 2011 00:09:24 -0700 (PDT) Received: from jessie.localnet (p5B2ED3B8.dip0.t-ipconnect.de [91.46.211.184]) by mx.google.com with ESMTPS id d11sm3089998bka.19.2011.05.02.00.09.22 (version=SSLv3 cipher=OTHER); Mon, 02 May 2011 00:09:23 -0700 (PDT) Sender: Bernhard Schmidt From: Bernhard Schmidt To: Brandon Gooch Date: Mon, 2 May 2011 09:08:27 +0200 User-Agent: KMail/1.13.5 (Linux/2.6.32-31-generic; KDE/4.4.5; i686; ; ) References: <201105011319.30649.bschmidt@freebsd.org> <201105011524.09613.bschmidt@freebsd.org> In-Reply-To: MIME-Version: 1.0 Content-Type: Text/Plain; charset="iso-8859-6" Content-Transfer-Encoding: 7bit Message-Id: <201105020908.27740.bschmidt@freebsd.org> Cc: freebsd-net@freebsd.org, freebsd-wireless@freebsd.org Subject: Re: CFT: 11n support for iwn(4) X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: bschmidt@freebsd.org List-Id: "Discussions of 802.11 stack, tools device driver development." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 02 May 2011 07:09:27 -0000 On Sunday, May 01, 2011 23:36:56 Brandon Gooch wrote: > On Sun, May 1, 2011 at 8:24 AM, Bernhard Schmidt wrote: > > On Sunday 01 May 2011 13:19:30 Bernhard Schmidt wrote: > >> Hi, > >> > >> I finally managed to get the 11n bits for iwn(4) sorted out. Well, > >> there is still an issue somewhere with HT40 frame protection or > >> TX chain setup on 5000 adapters, resulting in throughput not being > >> that stable. But overall it seems to work pretty decently > >> > >> This is for HEAD only right now, net80211 in stable/8 does not yet > >> contain the latest 11n related fixes. So, if you run HEAD and have > >> some iwn(4) hardware, I'd appreciate feedback. > >> .. > > > > Updated version, I've missed a locking issue. > > > > -- > > Bernhard > > Thanks for working on this Bernhard! > > Unfortunately, I'm having trouble achieving HT rates. > > After 'wlandebug 0xffffffff', lots of: > ... > May 1 14:38:15 x300 kernel: wlan0: received beacon from > 00:1d:0f:d3:fb:cc rssi 47 > May 1 14:38:15 x300 kernel: wlan0: [00:1d:0f:d3:fb:cc] discard beacon > frame, ie too short, got 26, expected 30 > ... > > I've attached relevant debugging information, but let me know if there > may be anything else that could help. I need to work on DTracing > net80211, any tips on relevant function traces? Attachment seems to be missing? I'd start of with enabling bootverbose to figure out if your adapter supports 11n at all. There are some where the 11n bits have been disabled. Next thing would be to check with % ifconfig -v wlan0 list chan if the HT channel setup works, if so it should list several HT20/HT40 channels. With % wlanconfig +11n you should at least see something like "Switching channel to HT20" right before moving into RUN state. Also, does % ifconfig wlan0 list scan show HTCAP for the AP you're associating too? -- Bernhard From owner-freebsd-wireless@FreeBSD.ORG Mon May 2 07:34:33 2011 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id AD0A2106566B; Mon, 2 May 2011 07:34:33 +0000 (UTC) (envelope-from jamesbrandongooch@gmail.com) Received: from mail-ww0-f42.google.com (mail-ww0-f42.google.com [74.125.82.42]) by mx1.freebsd.org (Postfix) with ESMTP id E011D8FC0A; Mon, 2 May 2011 07:34:32 +0000 (UTC) Received: by wwk4 with SMTP id 4so2082713wwk.1 for ; Mon, 02 May 2011 00:34:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc:content-type :content-transfer-encoding; bh=U7V1XKwxuyRW4EJiHLzpnceFZnNj3MU9m09Ian1SsdQ=; b=JzuIycjlxKZFc6E8qWrqsc4caMNTKKroOeMsNrEmNwqZDhR6PX3q21UPy9btBrkzrB 7uqJh5Piw5tzkAnrY/LgiBHLJvC6Bdo6NZhVcCGhAlW8bG8tHhzMPIakz2vF92wBn5Dw gFaaNvzkSGs15bBli/7qFO9wKxleA/09+CrVU= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type:content-transfer-encoding; b=BmD13G+bd8FE9ix3u+SNXiI9J/TbBAr/FJ3rsyeOvyqRNdVvgaUCuWWulcxiHV5kIV XLfuFcigtRvqItjT+mE72WCAIobwn3mdLSrC5Yq1H2LcwMkVQlBBLc74Qnbim0XoAx83 nhCoD+vd/A4z7vbSvNZHZxX6DE8+El1u6k8/I= MIME-Version: 1.0 Received: by 10.216.242.134 with SMTP id i6mr2244207wer.81.1304321671656; Mon, 02 May 2011 00:34:31 -0700 (PDT) Received: by 10.216.17.213 with HTTP; Mon, 2 May 2011 00:34:31 -0700 (PDT) In-Reply-To: <201105020908.27740.bschmidt@freebsd.org> References: <201105011319.30649.bschmidt@freebsd.org> <201105011524.09613.bschmidt@freebsd.org> <201105020908.27740.bschmidt@freebsd.org> Date: Mon, 2 May 2011 02:34:31 -0500 Message-ID: From: Brandon Gooch To: bschmidt@freebsd.org Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Cc: freebsd-net@freebsd.org, freebsd-wireless@freebsd.org Subject: Re: CFT: 11n support for iwn(4) X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Discussions of 802.11 stack, tools device driver development." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 02 May 2011 07:34:33 -0000 2011/5/2 Bernhard Schmidt : > On Sunday, May 01, 2011 23:36:56 Brandon Gooch wrote: >> On Sun, May 1, 2011 at 8:24 AM, Bernhard Schmidt = wrote: >> > On Sunday 01 May 2011 13:19:30 Bernhard Schmidt wrote: >> >> Hi, >> >> >> >> I finally managed to get the 11n bits for iwn(4) sorted out. Well, >> >> there is still an issue somewhere with HT40 frame protection or >> >> TX chain setup on 5000 adapters, resulting in throughput not being >> >> that stable. But overall it seems to work pretty decently >> >> >> >> This is for HEAD only right now, net80211 in stable/8 does not yet >> >> contain the latest 11n related fixes. So, if you run HEAD and have >> >> some iwn(4) hardware, I'd appreciate feedback. >> >> .. >> > >> > Updated version, I've missed a locking issue. >> > >> > -- >> > Bernhard >> >> Thanks for working on this Bernhard! >> >> Unfortunately, I'm having trouble achieving HT rates. >> >> After 'wlandebug 0xffffffff', lots of: >> ... >> May =A01 14:38:15 x300 kernel: wlan0: received beacon from >> 00:1d:0f:d3:fb:cc rssi 47 >> May =A01 14:38:15 x300 kernel: wlan0: [00:1d:0f:d3:fb:cc] discard beacon >> frame, ie too short, got 26, expected 30 >> ... >> >> I've attached relevant debugging information, but let me know if there >> may be anything else that could help. I need to work on DTracing >> net80211, any tips on relevant function traces? > > Attachment seems to be missing? I'll send the attachment again, directly to you, bypassing the list... > I'd start of with enabling bootverbose to figure out if your adapter > supports 11n at all. iwn0: mem 0xf9f00000-0xf9f01fff irq 17 at device 0.0 on pci3 iwn0: attempting to allocate 1 MSI vectors (1 supported) msi: routing MSI IRQ 259 to local APIC 0 vector 55 iwn0: using IRQ 259 for MSI iwn0: MIMO 2T3R, MoW1, address 00:1f:3b:28:30:c5 iwn0: 11a rates: 6Mbps 9Mbps 12Mbps 18Mbps 24Mbps 36Mbps 48Mbps 54Mbps iwn0: 11b rates: 1Mbps 2Mbps 5.5Mbps 11Mbps iwn0: 11g rates: 1Mbps 2Mbps 5.5Mbps 11Mbps 6Mbps 9Mbps 12Mbps 18Mbps 24Mbps 36Mbps 48Mbps 54Mbps iwn0: 2T3R iwn0: 11na MCS 20MHz iwn0: MCS 0-7: 6.5Mbps - 65Mbps iwn0: MCS 8-15: 13Mbps - 130Mbps iwn0: 11na MCS 20MHz SGI iwn0: MCS 0-7: 7Mbps - 72Mbps iwn0: MCS 8-15: 14.5Mbps - 144.5Mbps iwn0: 11na MCS 40MHz: iwn0: MCS 0-7: 13.5Mbps - 135Mbps iwn0: MCS 8-15: 27Mbps - 270Mbps iwn0: 11na MCS 40MHz SGI: iwn0: MCS 0-7: 15Mbps - 150Mbps iwn0: MCS 8-15: 30Mbps - 300Mbps iwn0: 11ng MCS 20MHz iwn0: MCS 0-7: 6.5Mbps - 65Mbps iwn0: MCS 8-15: 13Mbps - 130Mbps iwn0: 11ng MCS 20MHz SGI iwn0: MCS 0-7: 7Mbps - 72Mbps iwn0: MCS 8-15: 14.5Mbps - 144.5Mbps iwn0: 11ng MCS 40MHz: iwn0: MCS 0-7: 13.5Mbps - 135Mbps iwn0: MCS 8-15: 27Mbps - 270Mbps iwn0: 11ng MCS 40MHz SGI: iwn0: MCS 0-7: 15Mbps - 150Mbps iwn0: MCS 8-15: 30Mbps - 300Mbps >There are some where the 11n bits have been > disabled. Next thing would be to check with > % ifconfig -v wlan0 list chan I think you may be right about this, despite the dmesg output, as I see no 11n listed in the output: # ifconfig -v wlan0 list chan Channel 1 : 2412 MHz 11b Channel 40 : 5200* MHz 11a Channel 1 : 2412 MHz 11g Channel 40 : 5200* MHz 11a ht/20 Channel 1 : 2412 MHz 11g ht/20 Channel 40 : 5200* MHz 11a ht/40- Channel 2 : 2417 MHz 11b Channel 44 : 5220* MHz 11a Channel 2 : 2417 MHz 11g Channel 44 : 5220* MHz 11a ht/20 Channel 2 : 2417 MHz 11g ht/20 Channel 44 : 5220* MHz 11a ht/40+ Channel 3 : 2422 MHz 11b Channel 48 : 5240* MHz 11a Channel 3 : 2422 MHz 11g Channel 48 : 5240* MHz 11a ht/20 Channel 3 : 2422 MHz 11g ht/20 Channel 48 : 5240* MHz 11a ht/40- Channel 4 : 2427 MHz 11b Channel 52 : 5260* MHz 11a Channel 4 : 2427 MHz 11g Channel 52 : 5260* MHz 11a ht/20 Channel 4 : 2427 MHz 11g ht/20 Channel 52 : 5260* MHz 11a ht/40+ Channel 5 : 2432 MHz 11b Channel 56 : 5280* MHz 11a Channel 5 : 2432 MHz 11g Channel 56 : 5280* MHz 11a ht/20 Channel 5 : 2432 MHz 11g ht/20 Channel 56 : 5280* MHz 11a ht/40- Channel 6 : 2437 MHz 11b Channel 60 : 5300* MHz 11a Channel 6 : 2437 MHz 11g Channel 60 : 5300* MHz 11a ht/20 Channel 6 : 2437 MHz 11g ht/20 Channel 60 : 5300* MHz 11a ht/40+ Channel 7 : 2442 MHz 11b Channel 64 : 5320* MHz 11a Channel 7 : 2442 MHz 11g Channel 64 : 5320* MHz 11a ht/20 Channel 7 : 2442 MHz 11g ht/20 Channel 64 : 5320* MHz 11a ht/40- Channel 8 : 2447 MHz 11b Channel 149 : 5745* MHz 11a Channel 8 : 2447 MHz 11g Channel 149 : 5745* MHz 11a ht/20 Channel 8 : 2447 MHz 11g ht/20 Channel 149 : 5745* MHz 11a ht/40+ Channel 9 : 2452 MHz 11b Channel 153 : 5765* MHz 11a Channel 9 : 2452 MHz 11g Channel 153 : 5765* MHz 11a ht/20 Channel 9 : 2452 MHz 11g ht/20 Channel 153 : 5765* MHz 11a ht/40- Channel 10 : 2457 MHz 11b Channel 157 : 5785* MHz 11a Channel 10 : 2457 MHz 11g Channel 157 : 5785* MHz 11a ht/20 Channel 10 : 2457 MHz 11g ht/20 Channel 157 : 5785* MHz 11a ht/40+ Channel 11 : 2462 MHz 11b Channel 161 : 5805* MHz 11a Channel 11 : 2462 MHz 11g Channel 161 : 5805* MHz 11a ht/20 Channel 11 : 2462 MHz 11g ht/20 Channel 161 : 5805* MHz 11a ht/40- Channel 36 : 5180* MHz 11a Channel 165 : 5825* MHz 11a Channel 36 : 5180* MHz 11a ht/20 Channel 165 : 5825* MHz 11a ht/20 Channel 36 : 5180* MHz 11a ht/40+ > if the HT channel setup works, if so it should list several HT20/HT40 > channels. With > % wlanconfig +11n # wlandebug +11n May 2 02:22:24 x300 kernel: wlan0: [00:1d:0f:d3:fb:cc] discard MPDU frame, BA win <268:331> (0 frames) rxseq 267 tid 0 (retransmit) May 2 02:22:28 x300 kernel: wlan0: [00:1d:0f:d3:fb:cc] discard MPDU frame, BA win <336:399> (0 frames) rxseq 335 tid 0 (retransmit) May 2 02:22:28 x300 kernel: wlan0: [00:1d:0f:d3:fb:cc] discard MPDU frame, BA win <393:456> (0 frames) rxseq 392 tid 0 (retransmit) May 2 02:22:28 x300 kernel: wlan0: [00:1d:0f:d3:fb:cc] discard MPDU frame, BA win <406:469> (0 frames) rxseq 405 tid 0 (retransmit) > you should at least see something like "Switching channel to HT20" > right before moving into RUN state. Also, does > % ifconfig wlan0 list scan > show HTCAP for the AP you're associating too? # ifconfig -v wlan0 list scan bingo 00:1d:0f:d3:fb:cc 11 54M -71:-95 100 EPS SSID RATES DSPARMS<11> RSN WPA ERP<0x0> XRATES<48,72,96,108> WME VEN HTCAP VEN HTINFO ATH<0x7fff> VEN -Brandon From owner-freebsd-wireless@FreeBSD.ORG Mon May 2 07:54:17 2011 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 9734C106566C; Mon, 2 May 2011 07:54:17 +0000 (UTC) (envelope-from bschmidt@techwires.net) Received: from mail-bw0-f54.google.com (mail-bw0-f54.google.com [209.85.214.54]) by mx1.freebsd.org (Postfix) with ESMTP id F3E1E8FC1F; Mon, 2 May 2011 07:54:16 +0000 (UTC) Received: by bwz12 with SMTP id 12so6338240bwz.13 for ; Mon, 02 May 2011 00:54:15 -0700 (PDT) Received: by 10.204.18.193 with SMTP id x1mr2297234bka.79.1304322855231; Mon, 02 May 2011 00:54:15 -0700 (PDT) Received: from jessie.localnet (p5B2ED3B8.dip0.t-ipconnect.de [91.46.211.184]) by mx.google.com with ESMTPS id q24sm3112977bks.21.2011.05.02.00.54.13 (version=SSLv3 cipher=OTHER); Mon, 02 May 2011 00:54:14 -0700 (PDT) Sender: Bernhard Schmidt From: Bernhard Schmidt To: Brandon Gooch Date: Mon, 2 May 2011 09:53:18 +0200 User-Agent: KMail/1.13.5 (Linux/2.6.32-31-generic; KDE/4.4.5; i686; ; ) References: <201105011319.30649.bschmidt@freebsd.org> <201105020908.27740.bschmidt@freebsd.org> In-Reply-To: MIME-Version: 1.0 Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Message-Id: <201105020953.19003.bschmidt@freebsd.org> Cc: freebsd-net@freebsd.org, freebsd-wireless@freebsd.org Subject: Re: CFT: 11n support for iwn(4) X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: bschmidt@freebsd.org List-Id: "Discussions of 802.11 stack, tools device driver development." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 02 May 2011 07:54:17 -0000 On Monday, May 02, 2011 09:34:31 Brandon Gooch wrote: > 2011/5/2 Bernhard Schmidt : > > On Sunday, May 01, 2011 23:36:56 Brandon Gooch wrote: > >> On Sun, May 1, 2011 at 8:24 AM, Bernhard Schmidt wrote: > >> > On Sunday 01 May 2011 13:19:30 Bernhard Schmidt wrote: > >> >> Hi, > >> >> > >> >> I finally managed to get the 11n bits for iwn(4) sorted out. Well, > >> >> there is still an issue somewhere with HT40 frame protection or > >> >> TX chain setup on 5000 adapters, resulting in throughput not being > >> >> that stable. But overall it seems to work pretty decently > >> >> > >> >> This is for HEAD only right now, net80211 in stable/8 does not yet > >> >> contain the latest 11n related fixes. So, if you run HEAD and have > >> >> some iwn(4) hardware, I'd appreciate feedback. > >> >> .. > >> > > >> > Updated version, I've missed a locking issue. > >> > > >> > -- > >> > Bernhard > >> > >> Thanks for working on this Bernhard! > >> > >> Unfortunately, I'm having trouble achieving HT rates. > >> > >> After 'wlandebug 0xffffffff', lots of: > >> ... > >> May 1 14:38:15 x300 kernel: wlan0: received beacon from > >> 00:1d:0f:d3:fb:cc rssi 47 > >> May 1 14:38:15 x300 kernel: wlan0: [00:1d:0f:d3:fb:cc] discard beacon > >> frame, ie too short, got 26, expected 30 > >> ... > >> > >> I've attached relevant debugging information, but let me know if there > >> may be anything else that could help. I need to work on DTracing > >> net80211, any tips on relevant function traces? > > > > Attachment seems to be missing? > > I'll send the attachment again, directly to you, bypassing the list... > > > I'd start of with enabling bootverbose to figure out if your adapter > > supports 11n at all. > > .. > iwn0: 11na MCS 20MHz > iwn0: MCS 0-7: 6.5Mbps - 65Mbps > iwn0: MCS 8-15: 13Mbps - 130Mbps > .. That indicates 11n support. > >There are some where the 11n bits have been > > disabled. Next thing would be to check with > > % ifconfig -v wlan0 list chan > > I think you may be right about this, despite the dmesg output, as I > see no 11n listed in the output: > > # ifconfig -v wlan0 list chan > > Channel 1 : 2412 MHz 11g ht/20 Channel 40 : 5200* MHz 11a ht/40- HT channels are available. > > if the HT channel setup works, if so it should list several HT20/HT40 > > channels. With > > % wlanconfig +11n > > # wlandebug +11n > > May 2 02:22:24 x300 kernel: wlan0: [00:1d:0f:d3:fb:cc] discard MPDU > frame, BA win <268:331> (0 frames) rxseq 267 tid 0 (retransmit) > May 2 02:22:28 x300 kernel: wlan0: [00:1d:0f:d3:fb:cc] discard MPDU > frame, BA win <336:399> (0 frames) rxseq 335 tid 0 (retransmit) > May 2 02:22:28 x300 kernel: wlan0: [00:1d:0f:d3:fb:cc] discard MPDU > frame, BA win <393:456> (0 frames) rxseq 392 tid 0 (retransmit) > May 2 02:22:28 x300 kernel: wlan0: [00:1d:0f:d3:fb:cc] discard MPDU > frame, BA win <406:469> (0 frames) rxseq 405 tid 0 (retransmit) That is probably the reason why you're seeing low performance. I remember seeing this with ath9k but didn't dig any deeper. Well, time to do so now. > > you should at least see something like "Switching channel to HT20" > > right before moving into RUN state. Also, does > > % ifconfig wlan0 list scan > > show HTCAP for the AP you're associating too? > > # ifconfig -v wlan0 list scan > > bingo 00:1d:0f:d3:fb:cc 11 54M -71:-95 > .. > txop 47]> VEN HTCAP Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 8E772106566C for ; Mon, 2 May 2011 09:01:12 +0000 (UTC) (envelope-from adrian.chadd@gmail.com) Received: from mail-vw0-f54.google.com (mail-vw0-f54.google.com [209.85.212.54]) by mx1.freebsd.org (Postfix) with ESMTP id 427458FC12 for ; Mon, 2 May 2011 09:01:11 +0000 (UTC) Received: by vws18 with SMTP id 18so5410720vws.13 for ; Mon, 02 May 2011 02:01:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:sender:in-reply-to:references:date :x-google-sender-auth:message-id:subject:from:to:content-type; bh=QUm4nnprC5MSrIzpc4SOG6Fyg9E23WBJdUBncCeTJy4=; b=BuxXtCNVm4Pta1eLMkUR8hWRIJGtDoYtehJUFIpE2cdTf7F6CaLD0DhXuNyN2Vk3HQ duNaTcSqcYkfzbylK2b68RPSzpmTcUt/n0Nc8L0ju7Af+EUmGc1zgr+uTm3x91o0sQ6s VEVz74IIgB8j3l4yQSQqz8JncziGQuPi87Qzs= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:sender:in-reply-to:references:date :x-google-sender-auth:message-id:subject:from:to:content-type; b=CrjE1zyu8/2AIxtyFLqmtBmIPh+gXurG0zoSQMfIZjvJ6w5Iob9Zdkmpg8dtSb502q zzJjVDCVwXlgMdZFDgBXmWk8f1/0kouMqJ0L6KwrSkexlsAPkh4gphu24d7ESGj0oN6Y uFctQbG0uQ5ugP/JxO2QSs/JUWHgKMWnjaGMk= MIME-Version: 1.0 Received: by 10.52.96.8 with SMTP id do8mr4440580vdb.142.1304326871336; Mon, 02 May 2011 02:01:11 -0700 (PDT) Sender: adrian.chadd@gmail.com Received: by 10.52.157.202 with HTTP; Mon, 2 May 2011 02:01:11 -0700 (PDT) In-Reply-To: References: Date: Mon, 2 May 2011 17:01:11 +0800 X-Google-Sender-Auth: teTy8Kph_vkBRqWMznx-0v60iF8 Message-ID: From: Adrian Chadd To: freebsd-wireless@freebsd.org Content-Type: multipart/mixed; boundary=20cf307d064cd6489e04a247433f Subject: Re: [net80211] patch: properly handle sequence checking for HT non-aggregation; refactor out shared code X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Discussions of 802.11 stack, tools device driver development." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 02 May 2011 09:01:12 -0000 --20cf307d064cd6489e04a247433f Content-Type: text/plain; charset=ISO-8859-1 Hi, Here's an updated diff. I noticed that with this diff, the number of TCP out of order complaints dropped dramatically but I was seeing them when the following occured: wlan0: [00:23:6c:bf:38:3e] discard duplicate frame, seqno <0,4095> fragno <0,0> tid 0 This is likely also occuring with non-HT (11a/11bg) QoS operation chips in -HEAD and -8. Whenever I saw that above being logged (among lots of other logged duplicate discards, so I know it wasn't just "serial IO" related) I saw a burst of out-of-order packets/bytes in the receiving side TCP stack and a drop in throughput. The current patch adds the following checks: * if the last seen seqnum is 4095, then retransmissions of the last seen fragment is eliminated (like the normal codepath intended to do but didn't); * else if the last seen seqnum is 4095, allow any subsequent packet. This may be wrong for fragments (and I may add a check for rxseq != 4095)) but any subsequent sequence will have a seqnum of < 4095 because of the 12 bit seqnum wrap. * else (ie, the last seen seqnum isn't 4095), eliminate retransmits for seq+frag <= last seen. This almost entirely eliminates the speed drops I've seen in 11n non-aggregation mode and almost entirely eliminates the burst of out-of-order packets/bytes. The only time I'm seeing them now is when the baseband hangs and the interface is reset. Adrian --20cf307d064cd6489e04a247433f Content-Type: application/octet-stream; name="net80211-rxseq-ht-2.diff" Content-Disposition: attachment; filename="net80211-rxseq-ht-2.diff" Content-Transfer-Encoding: base64 X-Attachment-Id: f_gn76j6jz1 SW5kZXg6IHN5cy9uZXQ4MDIxMS9pZWVlODAyMTFfc3RhLmMKPT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gc3lzL25l dDgwMjExL2llZWU4MDIxMV9zdGEuYwkocmV2aXNpb24gMjIwOTExKQorKysgc3lzL25ldDgwMjEx L2llZWU4MDIxMV9zdGEuYwkod29ya2luZyBjb3B5KQpAQCAtNTEyLDcgKzUxMiw2IEBACiBzdGF0 aWMgaW50CiBzdGFfaW5wdXQoc3RydWN0IGllZWU4MDIxMV9ub2RlICpuaSwgc3RydWN0IG1idWYg Km0sIGludCByc3NpLCBpbnQgbmYpCiB7Ci0jZGVmaW5lCVNFUV9MRVEoYSxiKQkoKGludCkoKGEp LShiKSkgPD0gMCkKICNkZWZpbmUJSEFTX1NFUSh0eXBlKQkoKHR5cGUgJiAweDQpID09IDApCiAJ c3RydWN0IGllZWU4MDIxMXZhcCAqdmFwID0gbmktPm5pX3ZhcDsKIAlzdHJ1Y3QgaWVlZTgwMjEx Y29tICppYyA9IG5pLT5uaV9pYzsKQEAgLTU5MSw5ICs1OTAsNyBAQAogCQkJICAgIFRJRF9UT19X TUVfQUModGlkKSA+PSBXTUVfQUNfVkkpCiAJCQkJaWMtPmljX3dtZS53bWVfaGlwcmlfdHJhZmZp YysrOwogCQkJcnhzZXEgPSBsZTE2dG9oKCoodWludDE2X3QgKil3aC0+aV9zZXEpOwotCQkJaWYg KChuaS0+bmlfZmxhZ3MgJiBJRUVFODAyMTFfTk9ERV9IVCkgPT0gMCAmJgotCQkJICAgICh3aC0+ aV9mY1sxXSAmIElFRUU4MDIxMV9GQzFfUkVUUlkpICYmCi0JCQkgICAgU0VRX0xFUShyeHNlcSwg bmktPm5pX3J4c2Vxc1t0aWRdKSkgeworCQkJaWYgKCEgaWVlZTgwMjExX2NoZWNrX3J4c2VxKG5p LCB3aCkpIHsKIAkJCQkvKiBkdXBsaWNhdGUsIGRpc2NhcmQgKi8KIAkJCQlJRUVFODAyMTFfRElT Q0FSRF9NQUModmFwLCBJRUVFODAyMTFfTVNHX0lOUFVULAogCQkJCSAgICBic3NpZCwgImR1cGxp Y2F0ZSIsCkBAIC05MTAsNyArOTA3LDYgQEAKIAkJbV9mcmVlbShtKTsKIAl9CiAJcmV0dXJuIHR5 cGU7Ci0jdW5kZWYgU0VRX0xFUQogfQogCiBzdGF0aWMgdm9pZApJbmRleDogc3lzL25ldDgwMjEx L2llZWU4MDIxMV93ZHMuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBzeXMvbmV0ODAyMTEvaWVlZTgwMjExX3dk cy5jCShyZXZpc2lvbiAyMjA5MTEpCisrKyBzeXMvbmV0ODAyMTEvaWVlZTgwMjExX3dkcy5jCSh3 b3JraW5nIGNvcHkpCkBAIC00MDYsNyArNDA2LDYgQEAKIHN0YXRpYyBpbnQKIHdkc19pbnB1dChz dHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pLCBzdHJ1Y3QgbWJ1ZiAqbSwgaW50IHJzc2ksIGludCBu ZikKIHsKLSNkZWZpbmUJU0VRX0xFUShhLGIpCSgoaW50KSgoYSktKGIpKSA8PSAwKQogI2RlZmlu ZQlIQVNfU0VRKHR5cGUpCSgodHlwZSAmIDB4NCkgPT0gMCkKIAlzdHJ1Y3QgaWVlZTgwMjExdmFw ICp2YXAgPSBuaS0+bmlfdmFwOwogCXN0cnVjdCBpZWVlODAyMTFjb20gKmljID0gbmktPm5pX2lj OwpAQCAtNDk1LDkgKzQ5NCw3IEBACiAJCSAgICBUSURfVE9fV01FX0FDKHRpZCkgPj0gV01FX0FD X1ZJKQogCQkJaWMtPmljX3dtZS53bWVfaGlwcmlfdHJhZmZpYysrOwogCQlyeHNlcSA9IGxlMTZ0 b2goKih1aW50MTZfdCAqKXdoLT5pX3NlcSk7Ci0JCWlmICgobmktPm5pX2ZsYWdzICYgSUVFRTgw MjExX05PREVfSFQpID09IDAgJiYKLQkJICAgICh3aC0+aV9mY1sxXSAmIElFRUU4MDIxMV9GQzFf UkVUUlkpICYmCi0JCSAgICBTRVFfTEVRKHJ4c2VxLCBuaS0+bmlfcnhzZXFzW3RpZF0pKSB7CisJ CWlmICghIGllZWU4MDIxMV9jaGVja19yeHNlcShuaSwgd2gpKSB7CiAJCQkvKiBkdXBsaWNhdGUs IGRpc2NhcmQgKi8KIAkJCUlFRUU4MDIxMV9ESVNDQVJEX01BQyh2YXAsIElFRUU4MDIxMV9NU0df SU5QVVQsCiAJCQkgICAgd2gtPmlfYWRkcjEsICJkdXBsaWNhdGUiLApAQCAtNzQxLDcgKzczOCw2 IEBACiAJCW1fZnJlZW0obSk7CiAJfQogCXJldHVybiB0eXBlOwotI3VuZGVmIFNFUV9MRVEKIH0K IAogc3RhdGljIHZvaWQKSW5kZXg6IHN5cy9uZXQ4MDIxMS9pZWVlODAyMTFfaG9zdGFwLmMKPT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PQotLS0gc3lzL25ldDgwMjExL2llZWU4MDIxMV9ob3N0YXAuYwkocmV2aXNpb24gMjIw OTExKQorKysgc3lzL25ldDgwMjExL2llZWU4MDIxMV9ob3N0YXAuYwkod29ya2luZyBjb3B5KQpA QCAtNDcyLDcgKzQ3Miw2IEBACiBzdGF0aWMgaW50CiBob3N0YXBfaW5wdXQoc3RydWN0IGllZWU4 MDIxMV9ub2RlICpuaSwgc3RydWN0IG1idWYgKm0sIGludCByc3NpLCBpbnQgbmYpCiB7Ci0jZGVm aW5lCVNFUV9MRVEoYSxiKQkoKGludCkoKGEpLShiKSkgPD0gMCkKICNkZWZpbmUJSEFTX1NFUSh0 eXBlKQkoKHR5cGUgJiAweDQpID09IDApCiAJc3RydWN0IGllZWU4MDIxMXZhcCAqdmFwID0gbmkt Pm5pX3ZhcDsKIAlzdHJ1Y3QgaWVlZTgwMjExY29tICppYyA9IG5pLT5uaV9pYzsKQEAgLTU3Miw5 ICs1NzEsNyBAQAogCQkJICAgIFRJRF9UT19XTUVfQUModGlkKSA+PSBXTUVfQUNfVkkpCiAJCQkJ aWMtPmljX3dtZS53bWVfaGlwcmlfdHJhZmZpYysrOwogCQkJcnhzZXEgPSBsZTE2dG9oKCoodWlu dDE2X3QgKil3aC0+aV9zZXEpOwotCQkJaWYgKChuaS0+bmlfZmxhZ3MgJiBJRUVFODAyMTFfTk9E RV9IVCkgPT0gMCAmJgotCQkJICAgICh3aC0+aV9mY1sxXSAmIElFRUU4MDIxMV9GQzFfUkVUUlkp ICYmCi0JCQkgICAgU0VRX0xFUShyeHNlcSwgbmktPm5pX3J4c2Vxc1t0aWRdKSkgeworCQkJaWYg KCEgaWVlZTgwMjExX2NoZWNrX3J4c2VxKG5pLCB3aCkpIHsKIAkJCQkvKiBkdXBsaWNhdGUsIGRp c2NhcmQgKi8KIAkJCQlJRUVFODAyMTFfRElTQ0FSRF9NQUModmFwLCBJRUVFODAyMTFfTVNHX0lO UFVULAogCQkJCSAgICBic3NpZCwgImR1cGxpY2F0ZSIsCkBAIC05MTQsNyArOTExLDYgQEAKIAkJ bV9mcmVlbShtKTsKIAl9CiAJcmV0dXJuIHR5cGU7Ci0jdW5kZWYgU0VRX0xFUQogfQogCiBzdGF0 aWMgdm9pZApJbmRleDogc3lzL25ldDgwMjExL2llZWU4MDIxMV9tZXNoLmMKPT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot LS0gc3lzL25ldDgwMjExL2llZWU4MDIxMV9tZXNoLmMJKHJldmlzaW9uIDIyMDkxMSkKKysrIHN5 cy9uZXQ4MDIxMS9pZWVlODAyMTFfbWVzaC5jCSh3b3JraW5nIGNvcHkpCkBAIC0xMDQwLDcgKzEw NDAsNiBAQAogc3RhdGljIGludAogbWVzaF9pbnB1dChzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5p LCBzdHJ1Y3QgbWJ1ZiAqbSwgaW50IHJzc2ksIGludCBuZikKIHsKLSNkZWZpbmUJU0VRX0xFUShh LGIpCSgoaW50KSgoYSktKGIpKSA8PSAwKQogI2RlZmluZQlIQVNfU0VRKHR5cGUpCSgodHlwZSAm IDB4NCkgPT0gMCkKIAlzdHJ1Y3QgaWVlZTgwMjExdmFwICp2YXAgPSBuaS0+bmlfdmFwOwogCXN0 cnVjdCBpZWVlODAyMTFjb20gKmljID0gbmktPm5pX2ljOwpAQCAtMTA5NCw5ICsxMDkzLDcgQEAK IAkJCSAgICBUSURfVE9fV01FX0FDKHRpZCkgPj0gV01FX0FDX1ZJKQogCQkJCWljLT5pY193bWUu d21lX2hpcHJpX3RyYWZmaWMrKzsKIAkJCXJ4c2VxID0gbGUxNnRvaCgqKHVpbnQxNl90ICopd2gt Pmlfc2VxKTsKLQkJCWlmICgobmktPm5pX2ZsYWdzICYgSUVFRTgwMjExX05PREVfSFQpID09IDAg JiYKLQkJCSAgICAod2gtPmlfZmNbMV0gJiBJRUVFODAyMTFfRkMxX1JFVFJZKSAmJgotCQkJICAg IFNFUV9MRVEocnhzZXEsIG5pLT5uaV9yeHNlcXNbdGlkXSkpIHsKKwkJCWlmICghIGllZWU4MDIx MV9jaGVja19yeHNlcShuaSwgd2gpKSB7CiAJCQkJLyogZHVwbGljYXRlLCBkaXNjYXJkICovCiAJ CQkJSUVFRTgwMjExX0RJU0NBUkRfTUFDKHZhcCwgSUVFRTgwMjExX01TR19JTlBVVCwKIAkJCQkg ICAgd2gtPmlfYWRkcjEsICJkdXBsaWNhdGUiLApJbmRleDogc3lzL25ldDgwMjExL2llZWU4MDIx MV9pbnB1dC5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT0KLS0tIHN5cy9uZXQ4MDIxMS9pZWVlODAyMTFfaW5wdXQuYwko cmV2aXNpb24gMjIwOTExKQorKysgc3lzL25ldDgwMjExL2llZWU4MDIxMV9pbnB1dC5jCSh3b3Jr aW5nIGNvcHkpCkBAIC03NjAsNiArNzYwLDkwIEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qCisgKiBD aGVjayB0aGUgY3VycmVudCBmcmFtZSBzZXF1ZW5jZSBudW1iZXIgYWdhaW5zdCB0aGUgY3VycmVu dCBUSUQKKyAqIHN0YXRlIGFuZCByZXR1cm4gd2hldGhlciBpdCdzIGluIHNlcXVlbmNlIG9yIHNo b3VsZCBiZSBkcm9wcGVkLgorICovCitpbnQKK2llZWU4MDIxMV9jaGVja19yeHNlcShzdHJ1Y3Qg aWVlZTgwMjExX25vZGUgKm5pLCBzdHJ1Y3QgaWVlZTgwMjExX2ZyYW1lICp3aCkKK3sKKyNkZWZp bmUJU0VRX0xFUShhLGIpCSgoaW50KSgoYSktKGIpKSA8PSAwKQorI2RlZmluZQlTRVFfRVEoYSxi KQkoKGludCkoKGEpLShiKSkgPT0gMCkKKyNkZWZpbmUJSEFTX1NFUSh0eXBlKQkoKHR5cGUgJiAw eDQpID09IDApCisjZGVmaW5lCVNFUU5PKGEpCSgoYSkgPj4gSUVFRTgwMjExX1NFUV9TRVFfU0hJ RlQpCisjZGVmaW5lCUZSQUdOTyhhKQkoKGEpICYgSUVFRTgwMjExX1NFUV9GUkFHX01BU0spCisJ dWludDE2X3QgcnhzZXE7CisJdWludDhfdCB0eXBlOworCXVpbnQ4X3QgdGlkOworCXN0cnVjdCBp ZWVlODAyMTFfcnhfYW1wZHUgKnJhcDsKKworCXJ4c2VxID0gbGUxNnRvaCgqKHVpbnQxNl90ICop d2gtPmlfc2VxKTsKKwl0eXBlID0gd2gtPmlfZmNbMF0gJiBJRUVFODAyMTFfRkMwX1RZUEVfTUFT SzsKKworCS8qIFR5cGVzIHdpdGggbm8gc2VxdWVuY2UgbnVtYmVyIGFyZSBhbHdheXMgdHJlYXRl ZCB2YWxpZCAqLworCWlmICghIEhBU19TRVEodHlwZSkpCisJCXJldHVybiAxOworCisJdGlkID0g aWVlZTgwMjExX2dldHRpZCh3aCk7CisKKwkvKgorCSAqIE9ubHkgZG8gdGhlIEhUIEFNUERVIGNo ZWNrIGZvciBXTUUgc3RhdGlvbnM7IG5vbi1XTUUgSFQgc3RhdGlvbnMKKwkgKiBzaG91bGRuJ3Qg ZXhpc3Qgb3V0c2lkZSBvZiBkZWJ1Z2dpbmcuIFdlIHNob3VsZCBhdCBsZWFzdAorCSAqIGhhbmRs ZSB0aGF0LgorCSAqLworCWlmICh0aWQgPCBXTUVfTlVNX1RJRCkgeworCQlyYXAgPSAmbmktPm5p X3J4X2FtcGR1W3RpZF07CisJCS8qIEhUIG5vZGVzIGN1cnJlbnRseSBkb2luZyBSWCBBTVBEVSBh cmUgYWx3YXlzIHZhbGlkICovCisJCWlmICgobmktPm5pX2ZsYWdzICYgSUVFRTgwMjExX05PREVf SFQpICYmCisJCSAgICAocmFwLT5yeGFfZmxhZ3MgJiBJRUVFODAyMTFfQUdHUl9SVU5OSU5HKSkK KwkJCXJldHVybiAxOworCX0KKworCS8qCQorCSAqIE90aGVyd2lzZSwgcmV0cmllcyBmb3IgcGFj a2V0cyBiZWxvdyBvciBlcXVhbCB0byB0aGUgbGFzdAorCSAqIHNlZW4gc2VxdWVuY2UgbnVtYmVy IHNob3VsZCBiZSBkcm9wcGVkLgorCSAqCisJICogWFhYIFRoaXMgc2hvdWxkIGJlIHJldmlzaXRl ZCB0byB0cnVlbHkgaWRlbnRpZnkvbG9nIHZlcnkKKwkgKiBYWFggb3V0IG9mIG9yZGVyIHBhY2tl dHMgKGR1ZSB0byB2ZW5kb3IgYnVncyksIHJhdGhlciB0aGFuCisJICogWFhYIHNpbXBseSByZXRy YW5zbWl0cy4KKwkgKi8KKworCS8qIEZvciBub3csIHRyZWF0IGZyYW1lIHNlcW51bSA0MDk1IGFz IHNwZWNpYWwuICovCisKKwkvKgorCSAqIERyb3AgcmV0cmFuc21pdHMgb24gc2VxbnVtIDQwOTUg Zm9yIGl0c2VsZi4KKwkgKi8KKwlpZiAoKFNFUU5PKG5pLT5uaV9yeHNlcXNbdGlkXSkgPT0gNDA5 NSkgJiYKKwkgICAgU0VRX0VRKHJ4c2VxLCBuaS0+bmlfcnhzZXFzW3RpZF0pICYmCisJICAgICh3 aC0+aV9mY1sxXSAmIElFRUU4MDIxMV9GQzFfUkVUUlkpKQorCQlyZXR1cm4gMDsKKworCS8qCisJ ICogVHJlYXQgYW55IHN1YnNlcXVlbnQgZnJhbWUgYXMgZmluZSBpZiB0aGUgbGFzdCBzZWVuIGZy YW1lCisJICogaXMgNDA5NSBhbmQgaXQncyBub3QgYSByZXRyYW5zbWl0IGZvciB0aGUgc2FtZSBz ZXF1ZW5jZQorCSAqIG51bWJlci4KKwkgKi8KKwlpZiAoU0VRTk8obmktPm5pX3J4c2Vxc1t0aWRd KSA9PSA0MDk1KQorCQlyZXR1cm4gMTsKKworCS8qCisJICogQXQgdGhpcyBwb2ludCB3ZSBhc3N1 bWUgdGhhdCBzZXFudW1zIGJlbG93CisJICogdGhlIGN1cnJlbnQgYXJlIHJldHJhbnNtaXRzL291 dCBvZiBvcmRlciBwYWNrZXRzLgorCSAqIEVsaW1pbmF0ZSByZXRyYW5zbWl0cyBmb3IgdGhvc2Uu CisJICovCisJaWYgKCh3aC0+aV9mY1sxXSAmIElFRUU4MDIxMV9GQzFfUkVUUlkpICYmCisJICAg IFNFUV9MRVEocnhzZXEsIG5pLT5uaV9yeHNlcXNbdGlkXSkpCisJCXJldHVybiAwOworCisJcmV0 dXJuIDE7CisjdW5kZWYJU0VRX0xFUQorI3VuZGVmCVNFUV9FUQorI3VuZGVmCUhBU19TRVEKKyN1 bmRlZglTRVFOTworI3VuZGVmCUZSQUdOTworCit9CisKICNpZmRlZiBJRUVFODAyMTFfREVCVUcK IC8qCiAgKiBEZWJ1Z2dpbmcgc3VwcG9ydC4KSW5kZXg6IHN5cy9uZXQ4MDIxMS9pZWVlODAyMTFf aW5wdXQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09Ci0tLSBzeXMvbmV0ODAyMTEvaWVlZTgwMjExX2lucHV0LmgJKHJl dmlzaW9uIDIyMDkxMSkKKysrIHN5cy9uZXQ4MDIxMS9pZWVlODAyMTFfaW5wdXQuaAkod29ya2lu ZyBjb3B5KQpAQCAtMTU3LDQgKzE1Nyw2IEBACiBpbnQJaWVlZTgwMjExX3BhcnNlX2JlYWNvbihz dHJ1Y3QgaWVlZTgwMjExX25vZGUgKiwgc3RydWN0IG1idWYgKiwKIAkJc3RydWN0IGllZWU4MDIx MV9zY2FucGFyYW1zICopOwogaW50CWllZWU4MDIxMV9wYXJzZV9hY3Rpb24oc3RydWN0IGllZWU4 MDIxMV9ub2RlICosIHN0cnVjdCBtYnVmICopOworaW50CWllZWU4MDIxMV9jaGVja19yeHNlcShz dHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pLAorCQlzdHJ1Y3QgaWVlZTgwMjExX2ZyYW1lICp3aCk7 CiAjZW5kaWYgLyogX05FVDgwMjExX0lFRUU4MDIxMV9JTlBVVF9IXyAqLwpJbmRleDogc3lzL25l dDgwMjExL2llZWU4MDIxMV9hZGhvYy5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHN5cy9uZXQ4MDIxMS9pZWVl ODAyMTFfYWRob2MuYwkocmV2aXNpb24gMjIwOTExKQorKysgc3lzL25ldDgwMjExL2llZWU4MDIx MV9hZGhvYy5jCSh3b3JraW5nIGNvcHkpCkBAIC0yODUsNyArMjg1LDYgQEAKIHN0YXRpYyBpbnQK IGFkaG9jX2lucHV0KHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqbmksIHN0cnVjdCBtYnVmICptLCBp bnQgcnNzaSwgaW50IG5mKQogewotI2RlZmluZQlTRVFfTEVRKGEsYikJKChpbnQpKChhKS0oYikp IDw9IDApCiAjZGVmaW5lCUhBU19TRVEodHlwZSkJKCh0eXBlICYgMHg0KSA9PSAwKQogCXN0cnVj dCBpZWVlODAyMTF2YXAgKnZhcCA9IG5pLT5uaV92YXA7CiAJc3RydWN0IGllZWU4MDIxMWNvbSAq aWMgPSBuaS0+bmlfaWM7CkBAIC00MTIsOSArNDExLDcgQEAKIAkJCSAgICBUSURfVE9fV01FX0FD KHRpZCkgPj0gV01FX0FDX1ZJKQogCQkJCWljLT5pY193bWUud21lX2hpcHJpX3RyYWZmaWMrKzsK IAkJCXJ4c2VxID0gbGUxNnRvaCgqKHVpbnQxNl90ICopd2gtPmlfc2VxKTsKLQkJCWlmICgobmkt Pm5pX2ZsYWdzICYgSUVFRTgwMjExX05PREVfSFQpID09IDAgJiYKLQkJCSAgICAod2gtPmlfZmNb MV0gJiBJRUVFODAyMTFfRkMxX1JFVFJZKSAmJgotCQkJICAgIFNFUV9MRVEocnhzZXEsIG5pLT5u aV9yeHNlcXNbdGlkXSkpIHsKKwkJCWlmICghIGllZWU4MDIxMV9jaGVja19yeHNlcShuaSwgd2gp KSB7CiAJCQkJLyogZHVwbGljYXRlLCBkaXNjYXJkICovCiAJCQkJSUVFRTgwMjExX0RJU0NBUkRf TUFDKHZhcCwgSUVFRTgwMjExX01TR19JTlBVVCwKIAkJCQkgICAgYnNzaWQsICJkdXBsaWNhdGUi LApAQCAtNjYwLDcgKzY1Nyw2IEBACiAJCW1fZnJlZW0obSk7CiAJfQogCXJldHVybiB0eXBlOwot I3VuZGVmIFNFUV9MRVEKIH0KIAogc3RhdGljIGludAo= --20cf307d064cd6489e04a247433f-- From owner-freebsd-wireless@FreeBSD.ORG Mon May 2 11:07:11 2011 Return-Path: Delivered-To: freebsd-wireless@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 841631065678 for ; Mon, 2 May 2011 11:07:11 +0000 (UTC) (envelope-from owner-bugmaster@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [IPv6:2001:4f8:fff6::28]) by mx1.freebsd.org (Postfix) with ESMTP id 685238FC17 for ; Mon, 2 May 2011 11:07:11 +0000 (UTC) Received: from freefall.freebsd.org (localhost [127.0.0.1]) by freefall.freebsd.org (8.14.4/8.14.4) with ESMTP id p42B7B9j064267 for ; Mon, 2 May 2011 11:07:11 GMT (envelope-from owner-bugmaster@FreeBSD.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.14.4/8.14.4/Submit) id p42B7AY6064265 for freebsd-wireless@FreeBSD.org; Mon, 2 May 2011 11:07:10 GMT (envelope-from owner-bugmaster@FreeBSD.org) Date: Mon, 2 May 2011 11:07:10 GMT Message-Id: <201105021107.p42B7AY6064265@freefall.freebsd.org> X-Authentication-Warning: freefall.freebsd.org: gnats set sender to owner-bugmaster@FreeBSD.org using -f From: FreeBSD bugmaster To: freebsd-wireless@FreeBSD.org Cc: Subject: Current problem reports assigned to freebsd-wireless@FreeBSD.org X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Discussions of 802.11 stack, tools device driver development." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 02 May 2011 11:07:11 -0000 Note: to view an individual PR, use: http://www.freebsd.org/cgi/query-pr.cgi?pr=(number). The following is a listing of current problems submitted by FreeBSD users. These represent problem reports covering all versions including experimental development code and obsolete releases. S Tracker Resp. Description -------------------------------------------------------------------------------- o kern/156327 wireless [bwn] bwn driver causes 20%-50% packet loss o kern/156322 wireless [wpi] no ahdemo support for if_wpi o kern/156321 wireless [ath] ahdemo doesn't work with if_ath o kern/155100 wireless [ath] ath driver on busy channel: "stuck beacon" p kern/154598 wireless [ath] Atheros 5424/2424 can't connect to WPA network o kern/154567 wireless [ath] ath(4) lot of bad series(0) o kern/154327 wireless [ath] AR5416 in station mode hangs when transmitting f o kern/154284 wireless [ath] Modern ath wifi cards (such as AR9285) have miss o kern/154153 wireless [ath] AR5213 + MIPS + WPA group key packet corruption o kern/154007 wireless [ath] Atheros ar9287 card does not get recognized. o kern/153448 wireless [ath] ath networking device loses association after a o kern/152750 wireless [ath] ath0 lot of bad series hwrate o kern/151198 wireless [ath] ath/5416 fails bgscan with "ath0: ath_chan_set: o kern/149786 wireless [bwn] bwn on Dell Inspiron 1150: connections stall o kern/149539 wireless [ath] atheros ar9287 is not supported by ath_hal o kern/149516 wireless [ath] ath(4) hostap with fake MAC/BSSID results in sta o kern/149373 wireless [realtek/atheros]: None of my network card working o kern/149307 wireless [ath] Doesn't work Atheros 9285 o kern/148322 wireless [ath] Triggering atheros wifi beacon misses in hostap o kern/148317 wireless [ath] FreeBSD 7.x hostap memory leak in net80211 or At o kern/148112 wireless [ath] Atheros 9285 cannot register with wifi AP (timeo o kern/148078 wireless [ath] wireless networking stops functioning o kern/145826 wireless [panic] [ath] Unable to configure adhoc mode on ath0/w o kern/144987 wireless [wpi] [panic] injecting packets with wlaninject using o bin/144109 wireless hostapd(8) uses the MAC of the wireless interface, but o kern/143868 wireless [ath] [patch] [request] allow Atheros watchdog timeout o conf/143079 wireless hostapd(8) startup missing multi wlan functionality p kern/140567 wireless [ath] [patch] ath is not worked on my notebook PC o kern/140245 wireless [ath] [panic] Kernel panic during network activity on o kern/137592 wireless [ath] panic - 7-STABLE (Aug 7, 2009 UTC) crashes on ne p bin/137484 wireless [patch] Integer overflow in wpa_supplicant(8) base64 e o kern/136943 wireless [wpi] [lor] wpi0_com_lock / wpi0 o kern/136836 wireless [ath] atheros card stops functioning after about 12 ho o kern/132722 wireless [ath] Wifi ath0 associates fine with AP, but DHCP or I o bin/131549 wireless ifconfig(8) can't clear 'monitor' mode on the wireless o kern/126475 wireless [ath] [panic] ath pcmcia card inevitably panics under o kern/125721 wireless [ath] Terrible throughput/high ping latency with Ubiqu o kern/125332 wireless [ath] [panic] crash under any non-tiny networking unde o kern/124767 wireless [iwi] Wireless connection using iwi0 driver (Intel 220 o kern/124753 wireless [ieee80211] net80211 discards power-save queue packets o docs/120456 wireless ath(4) needs to specify requirement on wlan_scan_sta o kern/119513 wireless [ath] [irq] inserting dlink dwl-g630 wireless card res o kern/116747 wireless [ndis] FreeBSD 7.0-CURRENT crash with Dell TrueMobile f kern/105348 wireless [ath] ath device stopps TX 44 problems total. From owner-freebsd-wireless@FreeBSD.ORG Tue May 3 04:03:21 2011 Return-Path: Delivered-To: freebsd-wireless@hub.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id E8D4B1065674; Tue, 3 May 2011 04:03:21 +0000 (UTC) (envelope-from adrian@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [IPv6:2001:4f8:fff6::28]) by mx1.freebsd.org (Postfix) with ESMTP id BF58B8FC15; Tue, 3 May 2011 04:03:21 +0000 (UTC) Received: from freefall.freebsd.org (localhost [127.0.0.1]) by freefall.freebsd.org (8.14.4/8.14.4) with ESMTP id p4343LZ2062372; Tue, 3 May 2011 04:03:21 GMT (envelope-from adrian@freefall.freebsd.org) Received: (from adrian@localhost) by freefall.freebsd.org (8.14.4/8.14.4/Submit) id p4343LrO062368; Tue, 3 May 2011 04:03:21 GMT (envelope-from adrian) Date: Tue, 3 May 2011 04:03:21 GMT Message-Id: <201105030403.p4343LrO062368@freefall.freebsd.org> To: adrian@FreeBSD.org, freebsd-bugs@FreeBSD.org, freebsd-wireless@FreeBSD.org From: adrian@FreeBSD.org Cc: Subject: Re: kern/156765: [ath] Merlin fast-clock check isn't correct X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Discussions of 802.11 stack, tools device driver development." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 03 May 2011 04:03:22 -0000 Synopsis: [ath] Merlin fast-clock check isn't correct Responsible-Changed-From-To: freebsd-bugs->freebsd-wireless Responsible-Changed-By: adrian Responsible-Changed-When: Tue May 3 04:03:10 UTC 2011 Responsible-Changed-Why: Punt to wireless list http://www.freebsd.org/cgi/query-pr.cgi?pr=156765 From owner-freebsd-wireless@FreeBSD.ORG Tue May 3 08:21:39 2011 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 08261106566B for ; Tue, 3 May 2011 08:21:39 +0000 (UTC) (envelope-from vetalyi@gmail.com) Received: from mail-bw0-f54.google.com (mail-bw0-f54.google.com [209.85.214.54]) by mx1.freebsd.org (Postfix) with ESMTP id 8059C8FC14 for ; Tue, 3 May 2011 08:21:38 +0000 (UTC) Received: by bwz12 with SMTP id 12so7589084bwz.13 for ; Tue, 03 May 2011 01:21:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:message-id:date:from:user-agent:mime-version:to :subject:references:in-reply-to:content-type :content-transfer-encoding; bh=3MxauyThqdczHbvu5hx+BaUqp0u06nB3LzKOBevTEVI=; b=t7YPyBL7KvuQwozl1kW4QpM8I7EiRaN0Wiz6wS07U+nT/UA3FPWZ7DLvZ/y+9/9kIA ltwJcPZHpQtVzFNt0sUsg0jCxECBP7FPgZFfq/EzcG7K1sm5uCvaFNPj5uAxJtECJIyd tzoL1MsWM1Vtfm82WULw6B7MDs9mRmnXiWMb8= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=message-id:date:from:user-agent:mime-version:to:subject:references :in-reply-to:content-type:content-transfer-encoding; b=oCKjEdrSpRTDI1VzMAA+8kirH2kAHgcn/xZBe9wXG7P+e58t/p/42dEf0c2/LBPL6x bV1+VlrOkatD51B0g+3g/kTXUkElCBghByC3Xl0RAGGkAp24ygaS7Z0SfBFzhWswTucL B/HsLIUnYWD+pwpsHneaRgYc30+bcqK0GwnG8= Received: by 10.204.84.142 with SMTP id j14mr673291bkl.20.1304409010293; Tue, 03 May 2011 00:50:10 -0700 (PDT) Received: from [10.100.1.20] (office.onix.ua [195.62.14.236]) by mx.google.com with ESMTPS id q24sm2876885bks.9.2011.05.03.00.50.07 (version=TLSv1/SSLv3 cipher=OTHER); Tue, 03 May 2011 00:50:08 -0700 (PDT) Message-ID: <4DBFB3AD.4080705@gmail.com> Date: Tue, 03 May 2011 10:50:05 +0300 From: "vetalyi@gmail.com" User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.17) Gecko/20110414 Thunderbird/3.1.10 MIME-Version: 1.0 To: freebsd-wireless@FreeBSD.org References: <201105011951.p41Jpsns000583@freefall.freebsd.org> In-Reply-To: <201105011951.p41Jpsns000583@freefall.freebsd.org> Content-Type: text/plain; charset=windows-1251; format=flowed Content-Transfer-Encoding: 8bit Cc: Subject: Re: kern/154284: [ath] Modern ath wifi cards (such as AR9285) have missed LED indication X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Discussions of 802.11 stack, tools device driver development." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 03 May 2011 08:21:39 -0000 01.05.2011 22:51, eadler@FreeBSD.org пишет: > Synopsis: [ath] Modern ath wifi cards (such as AR9285) have missed LED indication > > Responsible-Changed-From-To: freebsd-net->freebsd-wireless > Responsible-Changed-By: eadler > Responsible-Changed-When: Sun May 1 19:51:54 UTC 2011 > Responsible-Changed-Why: > new mailing list owns this one > > http://www.freebsd.org/cgi/query-pr.cgi?pr=154284 > _______________________________________________ > freebsd-net@freebsd.org mailing list > http://lists.freebsd.org/mailman/listinfo/freebsd-net > To unsubscribe, send any mail to "freebsd-net-unsubscribe@freebsd.org" Hi. I have laptop with AR9285 wifi onboard, and this /etc/sysctl.conf configure works fine for me: dev.ath.0.ledpin=1 dev.ath.0.softled=1 dev.ath.0.ledon=1 From owner-freebsd-wireless@FreeBSD.ORG Tue May 3 14:46:34 2011 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id F0DE6106566B; Tue, 3 May 2011 14:46:34 +0000 (UTC) (envelope-from lists@eitanadler.com) Received: from mail-vx0-f182.google.com (mail-vx0-f182.google.com [209.85.220.182]) by mx1.freebsd.org (Postfix) with ESMTP id 90FE88FC13; Tue, 3 May 2011 14:46:34 +0000 (UTC) Received: by vxc34 with SMTP id 34so156766vxc.13 for ; Tue, 03 May 2011 07:46:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=eitanadler.com; s=0xdeadbeef; h=domainkey-signature:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc:content-type; bh=mkN7pBJ+c36WkpHItlhQAa7nYXy/bi2lr2wFR/GgA4M=; b=Rp14+anGa0Rr4UQL9j33frcmmpch6MVBkNVGFYkIqoV4N+sIHIzfJuHlddKBpGUogS aGEcikD+RaJCWAd0vaJg7WS1ouHH8OIRhyEBi9MjQDo/1r/LNWKw29mgOsQ6YOfh6KAp nSI3e7YtQJMqEroRPk5lR3J+7TDEV3hZxL/hU= DomainKey-Signature: a=rsa-sha1; c=nofws; d=eitanadler.com; s=0xdeadbeef; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc:content-type; b=FBt+cIAw4xQxctecLff3p2Qouv0YUJUVJ700boJz9aZOK7VjYOKzLgHxWMG3BRipN5 0OVuT4qB5tszXOYVDYLPNaPJ1pZ/ZKmr9Y0N7s/T8gZFo8bgTcHbeAwRcXoYzGCTlWd0 FfJ0aqcVOYXLrpQtPXaPIALbl4KenDLTanb3U= Received: by 10.52.107.195 with SMTP id he3mr1514803vdb.12.1304432271090; Tue, 03 May 2011 07:17:51 -0700 (PDT) MIME-Version: 1.0 Received: by 10.52.182.232 with HTTP; Tue, 3 May 2011 07:17:21 -0700 (PDT) In-Reply-To: <201104261737.15553.bschmidt@freebsd.org> References: <201104261737.15553.bschmidt@freebsd.org> From: Eitan Adler Date: Tue, 3 May 2011 10:17:21 -0400 Message-ID: To: bschmidt@freebsd.org Content-Type: text/plain; charset=UTF-8 Cc: freebsd-wireless@freebsd.org Subject: Re: Issues with bwn wireless X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Discussions of 802.11 stack, tools device driver development." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 03 May 2011 14:46:35 -0000 Sorry about the delay - I only had free time now. > Can you post debug output of wpa_supplicant/bwn? > % sysctl dev.bwn.0.debug=-1 #sysctl dev.bwn.0 dev.bwn.0.%driver: bwn dev.bwn.0.%parent: siba_bwn0 dev.bwn.0.linknoise: 0 dev.bwn.0.rts: 0 dev.bwn.0.rtsfail: 0 > % wpa_supplicant -Dbsd -iwlan0 -c/etc/wpa_supplicant.conf -ddt #wpa_supplicant -Dbsd -iwlan0 -c/etc/wpa_supplicant.conf -ddt 1304432141.061742: Initializing interface 'wlan0' conf '/etc/wpa_supplicant.conf' driver 'bsd' ctrl_interface 'N/A' bridge 'N/A' 1304432141.061824: Configuration file '/etc/wpa_supplicant.conf' -> '/etc/wpa_supplicant.conf' 1304432141.061837: Reading configuration file '/etc/wpa_supplicant.conf' 1304432141.095508: ctrl_interface='/var/run/wpa_supplicant' 1304432141.095534: ctrl_interface_group='wheel' 1304432141.095541: Line: 16 - start of a new network block 1304432141.095585: ssid - hexdump_ascii(len=10): 62 75 77 69 72 65 6c 65 73 73 buwireless 1304432141.095600: key_mgmt: 0x4 1304432141.095646: Priority group 0 1304432141.095655: id=0 ssid='buwireless' 1304432141.095661: Initializing interface (2) 'wlan0' 1304432141.130677: Own MAC address: 00:21:00:e7:75:20 1304432141.130697: wpa_driver_bsd_set_wpa: enabled=1 1304432141.130703: wpa_driver_bsd_set_wpa_internal: wpa=3 privacy=1 1304432141.130715: wpa_driver_bsd_del_key: keyidx=0 1304432141.130725: wpa_driver_bsd_del_key: keyidx=1 1304432141.130732: wpa_driver_bsd_del_key: keyidx=2 1304432141.130739: wpa_driver_bsd_del_key: keyidx=3 1304432141.130745: wpa_driver_bsd_set_countermeasures: enabled=0 1304432141.130752: wpa_driver_bsd_set_drop_unencrypted: enabled=1 1304432141.130758: RSN: flushing PMKID list in the driver 1304432141.130776: Setting scan request: 0 sec 100000 usec 1304432141.135198: EAPOL: SUPP_PAE entering state DISCONNECTED 1304432141.135215: EAPOL: KEY_RX entering state NO_KEY_RECEIVE 1304432141.135220: EAPOL: SUPP_BE entering state INITIALIZE 1304432141.135226: EAP: EAP entering state DISABLED 1304432141.135254: Using existing control interface directory. 1304432141.136063: ctrl_interface_group=0 (from group name 'wheel') 1304432141.136167: Added interface wlan0 1304432141.231289: State: DISCONNECTED -> SCANNING 1304432141.231310: Starting AP scan (broadcast SSID) 1304432141.231315: Trying to get current scan results first without requesting a new scan to speed up initial association 1304432141.231380: Received 0 bytes of scan results (0 BSSes) 1304432141.231389: Scan results: 0 1304432141.231399: Cached scan results are empty - not posting 1304432141.231405: Selecting BSS from priority group 0 1304432141.231410: Try to find WPA-enabled AP 1304432141.231415: Try to find non-WPA AP 1304432141.231420: No suitable AP found. 1304432141.231426: Setting scan request: 0 sec 0 usec 1304432141.231444: Starting AP scan (broadcast SSID) 1304432142.197193: EAPOL: disable timer tick 1304432144.434911: Received 0 bytes of scan results (19 BSSes) 1304432144.434934: Scan results: 19 1304432144.434957: CTRL-EVENT-SCAN-RESULTS 1304432144.434964: Selecting BSS from priority group 0 1304432144.434969: Try to find WPA-enabled AP 1304432144.434974: 0: 00:23:eb:3a:67:a3 ssid='busecure' wpa_ie_len=28 rsn_ie_len=24 caps=0x11 1304432144.434982: skip - SSID mismatch 1304432144.434987: 1: 00:23:eb:3a:67:a4 ssid='' wpa_ie_len=28 rsn_ie_len=24 caps=0x11 1304432144.434994: skip - SSID mismatch 1304432144.434999: 2: 00:23:eb:0c:4f:33 ssid='busecure' wpa_ie_len=28 rsn_ie_len=24 caps=0x11 1304432144.435006: skip - SSID mismatch 1304432144.435011: 3: 58:bc:27:5c:32:04 ssid='' wpa_ie_len=28 rsn_ie_len=24 caps=0x11 1304432144.435018: skip - SSID mismatch 1304432144.435023: 4: 00:23:eb:0c:4f:34 ssid='' wpa_ie_len=28 rsn_ie_len=24 caps=0x11 1304432144.435030: skip - SSID mismatch 1304432144.435034: 5: 00:23:eb:3a:f4:a4 ssid='' wpa_ie_len=28 rsn_ie_len=24 caps=0x11 1304432144.435041: skip - SSID mismatch 1304432144.435046: 6: 58:bc:27:0f:e4:63 ssid='busecure' wpa_ie_len=28 rsn_ie_len=24 caps=0x11 1304432144.435053: skip - SSID mismatch 1304432144.435058: 7: 00:23:eb:3a:67:a2 ssid='buwireless' wpa_ie_len=0 rsn_ie_len=0 caps=0x1 1304432144.435065: skip - no WPA/RSN IE 1304432144.435070: 8: 00:23:eb:3a:67:a0 ssid='buguests' wpa_ie_len=0 rsn_ie_len=0 caps=0x1 1304432144.435077: skip - no WPA/RSN IE 1304432144.435082: 9: 00:23:eb:0c:4f:30 ssid='buguests' wpa_ie_len=0 rsn_ie_len=0 caps=0x1 1304432144.435089: skip - no WPA/RSN IE 1304432144.435094: 10: 00:23:eb:0c:4f:32 ssid='buwireless' wpa_ie_len=0 rsn_ie_len=0 caps=0x1 1304432144.435101: skip - no WPA/RSN IE 1304432144.435106: 11: 00:23:eb:3a:f4:a2 ssid='buwireless' wpa_ie_len=0 rsn_ie_len=0 caps=0x1 1304432144.435113: skip - no WPA/RSN IE 1304432144.435118: 12: 02:29:19:d6:67:d1 ssid='HP440F1C' wpa_ie_len=0 rsn_ie_len=0 caps=0x2 1304432144.435125: skip - no WPA/RSN IE 1304432144.435129: 13: 58:bc:27:0f:e4:61 ssid='' wpa_ie_len=0 rsn_ie_len=0 caps=0x1 1304432144.435203: skip - no WPA/RSN IE 1304432144.435209: 14: 58:bc:27:0f:e4:62 ssid='buwireless' wpa_ie_len=0 rsn_ie_len=0 caps=0x1 1304432144.435217: skip - no WPA/RSN IE 1304432144.435222: 15: 58:bc:27:0f:e4:60 ssid='buguests' wpa_ie_len=0 rsn_ie_len=0 caps=0x1 1304432144.435229: skip - no WPA/RSN IE 1304432144.435233: 16: 2e:24:81:ba:a8:b6 ssid='hpsetup' wpa_ie_len=0 rsn_ie_len=0 caps=0x22 1304432144.435241: skip - no WPA/RSN IE 1304432144.435246: 17: 02:98:8b:a3:0e:69 ssid='print server 0C2F98' wpa_ie_len=0 rsn_ie_len=0 caps=0x2 1304432144.435254: skip - no WPA/RSN IE 1304432144.435258: 18: da:29:05:26:52:6b ssid='Notorious' wpa_ie_len=0 rsn_ie_len=0 caps=0x2 1304432144.435266: skip - no WPA/RSN IE 1304432144.435270: Try to find non-WPA AP 1304432144.435275: 0: 00:23:eb:3a:67:a3 ssid='busecure' wpa_ie_len=28 rsn_ie_len=24 caps=0x11 1304432144.435282: skip - SSID mismatch 1304432144.435287: 1: 00:23:eb:3a:67:a4 ssid='' wpa_ie_len=28 rsn_ie_len=24 caps=0x11 1304432144.435294: skip - SSID mismatch 1304432144.435299: 2: 00:23:eb:0c:4f:33 ssid='busecure' wpa_ie_len=28 rsn_ie_len=24 caps=0x11 1304432144.435306: skip - SSID mismatch 1304432144.435310: 3: 58:bc:27:5c:32:04 ssid='' wpa_ie_len=28 rsn_ie_len=24 caps=0x11 1304432144.435317: skip - SSID mismatch 1304432144.435322: 4: 00:23:eb:0c:4f:34 ssid='' wpa_ie_len=28 rsn_ie_len=24 caps=0x11 1304432144.435329: skip - SSID mismatch 1304432144.435334: 5: 00:23:eb:3a:f4:a4 ssid='' wpa_ie_len=28 rsn_ie_len=24 caps=0x11 1304432144.435341: skip - SSID mismatch 1304432144.435346: 6: 58:bc:27:0f:e4:63 ssid='busecure' wpa_ie_len=28 rsn_ie_len=24 caps=0x11 1304432144.435353: skip - SSID mismatch 1304432144.435358: 7: 00:23:eb:3a:67:a2 ssid='buwireless' wpa_ie_len=0 rsn_ie_len=0 caps=0x1 1304432144.435366: selected non-WPA AP 00:23:eb:3a:67:a2 ssid='buwireless' 1304432144.435376: Trying to associate with 00:23:eb:3a:67:a2 (SSID='buwireless' freq=2412 MHz) 1304432144.435414: Cancelling scan request 1304432144.435420: WPA: clearing own WPA/RSN IE 1304432144.435425: Automatic auth_alg selection: 0x1 1304432144.435430: wpa_driver_bsd_set_auth_alg alg 0x1 authmode 1 1304432144.435441: WPA: clearing AP WPA IE 1304432144.435447: WPA: clearing AP RSN IE 1304432144.435451: WPA: clearing own WPA/RSN IE 1304432144.435457: No keys have been configured - skip key clearing 1304432144.435462: wpa_driver_bsd_set_drop_unencrypted: enabled=0 1304432144.435470: State: SCANNING -> ASSOCIATING 1304432144.435476: wpa_driver_bsd_associate: ssid 'buwireless' wpa ie len 0 pairwise 0 group 0 key mgmt 2 1304432144.435493: wpa_driver_bsd_associate: set PRIVACY 0 1304432144.444234: Setting authentication timeout: 10 sec 0 usec 1304432144.444249: EAPOL: External notification - EAP success=0 1304432144.444258: EAPOL: External notification - EAP fail=0 1304432144.444263: EAPOL: External notification - portControl=ForceAuthorized 1304432146.113912: State: ASSOCIATING -> ASSOCIATED 1304432146.113945: Associated to a new BSS: BSSID=00:23:eb:3a:67:a2 1304432146.113954: Associated with 00:23:eb:3a:67:a2 1304432146.113961: WPA: Association event - clear replay counter 1304432146.113966: WPA: Clear old PTK 1304432146.113971: EAPOL: External notification - portEnabled=0 1304432146.113979: EAPOL: External notification - portValid=0 1304432146.113985: EAPOL: External notification - portEnabled=1 1304432146.113989: EAPOL: SUPP_PAE entering state S_FORCE_AUTH 1304432146.113995: EAPOL: SUPP_BE entering state IDLE 1304432146.114001: Cancelling authentication timeout 1304432146.114007: State: ASSOCIATED -> COMPLETED 1304432146.114017: CTRL-EVENT-CONNECTED - Connection to 00:23:eb:3a:67:a2 completed (auth) [id=0 id_str=] 1304432146.114023: Cancelling scan request >> 3) Sometimes I see the channel cycling somewhat randomly during the >> "associated but not working" time. > > Sounds like a background scan issue, try with > % ifconfig wlan0 -bgscan I will try this soon and post here if it still works. > >> 4) ifconfig wlan0 scan never shows anything but ifconfig wlan0 list scan does. > > This should be fixed in HEAD. Woot! thanks. -- Eitan Adler From owner-freebsd-wireless@FreeBSD.ORG Tue May 3 18:11:29 2011 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 9D6C2106564A for ; Tue, 3 May 2011 18:11:29 +0000 (UTC) (envelope-from onyx@z-up.ru) Received: from mx.z-up.ru (mx.z-up.ru [92.50.244.44]) by mx1.freebsd.org (Postfix) with ESMTP id 509768FC23 for ; Tue, 3 May 2011 18:11:28 +0000 (UTC) Received: from onyx_y550p.loc (unknown [92.50.244.235]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx.z-up.ru (Postfix) with ESMTPSA id 2045011431 for ; Tue, 3 May 2011 22:11:07 +0400 (MSD) From: Dmitry Kolosov To: freebsd-wireless@freebsd.org Date: Tue, 3 May 2011 22:11:26 +0400 User-Agent: KMail/1.13.6 (FreeBSD/8.2-STABLE; KDE/4.6.2; i386; ; ) References: <201105011951.p41Jpsns000583@freefall.freebsd.org> <4DBFB3AD.4080705@gmail.com> In-Reply-To: <4DBFB3AD.4080705@gmail.com> MIME-Version: 1.0 Content-Type: Text/Plain; charset="windows-1251" Content-Transfer-Encoding: 7bit Message-Id: <201105032211.26749.onyx@z-up.ru> Subject: Re: kern/154284: [ath] Modern ath wifi cards (such as AR9285) have missed LED indication X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: onyx@z-up.ru List-Id: "Discussions of 802.11 stack, tools device driver development." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 03 May 2011 18:11:29 -0000 On Tuesday 03 May 2011 11:50:05 vetalyi@gmail.com wrote: > Hi. > I have laptop with AR9285 wifi onboard, Me too, it's lenovo ideapad y550p > and this /etc/sysctl.conf > configure works fine for me: > dev.ath.0.ledpin=1 > dev.ath.0.softled=1 > dev.ath.0.ledon=1 but not for me. No effect at all. I tried ledpin=1..10 - nothing. 8-Stable onboard. From owner-freebsd-wireless@FreeBSD.ORG Wed May 4 02:26:17 2011 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 1CD67106566B; Wed, 4 May 2011 02:26:17 +0000 (UTC) (envelope-from adrian.chadd@gmail.com) Received: from mail-vx0-f182.google.com (mail-vx0-f182.google.com [209.85.220.182]) by mx1.freebsd.org (Postfix) with ESMTP id 8F4DB8FC17; Wed, 4 May 2011 02:26:16 +0000 (UTC) Received: by vxc34 with SMTP id 34so934127vxc.13 for ; Tue, 03 May 2011 19:26:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:sender:in-reply-to:references:date :x-google-sender-auth:message-id:subject:from:to:cc:content-type :content-transfer-encoding; bh=l1ElypN4UVXqEbOCEGRgjRPit5eBeuNjK45qJVILIW8=; b=g5f6zjm4gWdkJyIwbHCx4P4L8za6NbPOvJx3W+TBVE7sHUtpPg3rwg0L82VQEg8FWN k9l6eosXrH+ovA4dX9tbdPP0oyVvCdjg7U/T3YhHjm/dPZLXV5VIxm0RNSDHttNNW8G3 XKycF6eMzDm3H8BIgabzPjtxgIxpU/glzKQ2g= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:sender:in-reply-to:references:date :x-google-sender-auth:message-id:subject:from:to:cc:content-type :content-transfer-encoding; b=ctFAxGTbAhoDqsRJ41XUxu2SoJWOM2SYqz4hduE41P8FaKKIBddQNBNE3eWzhMg0TX YSy5eMVedCji0Pq86Sa8qtek351SLzy0lqBRaN4g8XDRHjLBQgWJ7EBpfkiHNvuutgeH IIlRF0MhdKVHC6Ct/FPRAnxk8lqOr38Q9jZMk= MIME-Version: 1.0 Received: by 10.52.183.136 with SMTP id em8mr656979vdc.262.1304475975528; Tue, 03 May 2011 19:26:15 -0700 (PDT) Sender: adrian.chadd@gmail.com Received: by 10.52.157.202 with HTTP; Tue, 3 May 2011 19:26:15 -0700 (PDT) In-Reply-To: <201105040223.p442Nx1r026636@svn.freebsd.org> References: <201105040223.p442Nx1r026636@svn.freebsd.org> Date: Wed, 4 May 2011 10:26:15 +0800 X-Google-Sender-Auth: HnTPwcFqwYEXKnfHNOSAGZhKlHY Message-ID: From: Adrian Chadd To: freebsd-wireless@freebsd.org Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Cc: freebsd-current , freebsd-mobile@freebsd.org Subject: Fwd: svn commit: r221418 - head/sys/net80211 X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Discussions of 802.11 stack, tools device driver development." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 04 May 2011 02:26:17 -0000 This has the potential to subtly break things, so I'd appreciate it if users of wireless devices would please test this out and let me know if it breaks anything. Thanks, Adrian ---------- Forwarded message ---------- From: Adrian Chadd Date: 4 May 2011 10:23 Subject: svn commit: r221418 - head/sys/net80211 To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Author: adrian Date: Wed May =A04 02:23:59 2011 New Revision: 221418 URL: http://svn.freebsd.org/changeset/base/221418 Log: =A0Fix some corner cases in the net80211 sequence number retransmission =A0handling. =A0The current sequence number code does a few things incorrectly: =A0* It didn't try eliminating duplications from HT nodes. I guess it's ass= umed =A0 =A0that out of order / retransmission handling would be handled by the = AMPDU RX =A0 =A0routines. If a HT node isn't doing AMPDU RX, then retransmissions ne= ed to =A0 =A0be eliminated. Since most of my debugging is based on this (as AMPDU= TX =A0 =A0software packet aggregation isn't yet handled), handle this corner c= ase. =A0* When a sequence number of 4095 was received, any subsequent sequence n= umber =A0 =A0is going to be (by definition) less than 4095. So if the following s= equence =A0 =A0number (0) doesn't initially occur and the retransmit is received, i= t's =A0 =A0incorrectly eliminated by the IEEE80211_FC1_RETRY && SEQ_LEQ() check= . =A0 =A0Try to handle this better. =A0This almost completely eliminates out of order TCP statistics showing up= during =A0iperf testing for the 11a, 11g and non-aggregate 11n AMPDU RX case. The = only =A0other packet loss conditions leading to this are due to baseband resets = or =A0heavy interference. Modified: =A0head/sys/net80211/ieee80211_adhoc.c =A0head/sys/net80211/ieee80211_hostap.c =A0head/sys/net80211/ieee80211_input.h =A0head/sys/net80211/ieee80211_mesh.c =A0head/sys/net80211/ieee80211_sta.c =A0head/sys/net80211/ieee80211_wds.c Modified: head/sys/net80211/ieee80211_adhoc.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- head/sys/net80211/ieee80211_adhoc.c Wed May =A04 01:39:44 2011 =A0(r221417) +++ head/sys/net80211/ieee80211_adhoc.c Wed May =A04 02:23:59 2011 =A0(r221418) @@ -285,7 +285,6 @@ doprint(struct ieee80211vap *vap, int su =A0static int =A0adhoc_input(struct ieee80211_node *ni, struct mbuf *m, int rssi, int nf) =A0{ -#define =A0 =A0 =A0 =A0SEQ_LEQ(a,b) =A0 =A0((int)((a)-(b)) <=3D 0) =A0#define =A0 =A0 =A0 =A0HAS_SEQ(type) =A0 ((type & 0x4) =3D=3D 0) =A0 =A0 =A0 =A0struct ieee80211vap *vap =3D ni->ni_vap; =A0 =A0 =A0 =A0struct ieee80211com *ic =3D ni->ni_ic; @@ -412,9 +411,7 @@ adhoc_input(struct ieee80211_node *ni, s =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0TID_TO_WME_AC(tid) >= =3D WME_AC_VI) =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0ic->ic_wme.w= me_hipri_traffic++; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0rxseq =3D le16toh(*(uint16_t= *)wh->i_seq); - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if ((ni->ni_flags & IEEE80211= _NODE_HT) =3D=3D 0 && - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 (wh->i_fc[1] & IEEE80= 211_FC1_RETRY) && - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 SEQ_LEQ(rxseq, ni->ni= _rxseqs[tid])) { + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (! ieee80211_check_rxseq(n= i, wh)) { =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0/* duplicate= , discard */ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0IEEE80211_DI= SCARD_MAC(vap, IEEE80211_MSG_INPUT, =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0bssi= d, "duplicate", @@ -660,7 +657,6 @@ out: =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0m_freem(m); =A0 =A0 =A0 =A0} =A0 =A0 =A0 =A0return type; -#undef SEQ_LEQ =A0} =A0static int Modified: head/sys/net80211/ieee80211_hostap.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- head/sys/net80211/ieee80211_hostap.c =A0 =A0 =A0 =A0Wed May =A04 01:39:= 44 2011 =A0 =A0 =A0 =A0(r221417) +++ head/sys/net80211/ieee80211_hostap.c =A0 =A0 =A0 =A0Wed May =A04 02:23:= 59 2011 =A0 =A0 =A0 =A0(r221418) @@ -472,7 +472,6 @@ doprint(struct ieee80211vap *vap, int su =A0static int =A0hostap_input(struct ieee80211_node *ni, struct mbuf *m, int rssi, int nf= ) =A0{ -#define =A0 =A0 =A0 =A0SEQ_LEQ(a,b) =A0 =A0((int)((a)-(b)) <=3D 0) =A0#define =A0 =A0 =A0 =A0HAS_SEQ(type) =A0 ((type & 0x4) =3D=3D 0) =A0 =A0 =A0 =A0struct ieee80211vap *vap =3D ni->ni_vap; =A0 =A0 =A0 =A0struct ieee80211com *ic =3D ni->ni_ic; @@ -572,9 +571,7 @@ hostap_input(struct ieee80211_node *ni, =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0TID_TO_WME_AC(tid) >= =3D WME_AC_VI) =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0ic->ic_wme.w= me_hipri_traffic++; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0rxseq =3D le16toh(*(uint16_t= *)wh->i_seq); - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if ((ni->ni_flags & IEEE80211= _NODE_HT) =3D=3D 0 && - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 (wh->i_fc[1] & IEEE80= 211_FC1_RETRY) && - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 SEQ_LEQ(rxseq, ni->ni= _rxseqs[tid])) { + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (! ieee80211_check_rxseq(n= i, wh)) { =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0/* duplicate= , discard */ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0IEEE80211_DI= SCARD_MAC(vap, IEEE80211_MSG_INPUT, =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0bssi= d, "duplicate", @@ -914,7 +911,6 @@ out: =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0m_freem(m); =A0 =A0 =A0 =A0} =A0 =A0 =A0 =A0return type; -#undef SEQ_LEQ =A0} =A0static void Modified: head/sys/net80211/ieee80211_input.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- head/sys/net80211/ieee80211_input.h Wed May =A04 01:39:44 2011 =A0(r221417) +++ head/sys/net80211/ieee80211_input.h Wed May =A04 02:23:59 2011 =A0(r221418) @@ -142,6 +142,104 @@ ishtinfooui(const uint8_t *frm) =A0 =A0 =A0 =A0return frm[1] > 3 && LE_READ_4(frm+2) =3D=3D ((BCM_OUI_HTINF= O<<24)|BCM_OUI); =A0} +#include =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0/* For le16toh() */ + +/* + * Check the current frame sequence number against the current TID + * state and return whether it's in sequence or should be dropped. + * + * Since out of order packet and duplicate packet eliminations should + * be done by the AMPDU RX code, this routine blindly accepts all + * frames from a HT station w/ a TID that is currently doing AMPDU-RX. + * HT stations without WME or where the TID is not doing AMPDU-RX + * are checked like non-HT stations. + * + * The routine only eliminates packets whose sequence/fragment + * match or are less than the last seen sequence/fragment number + * AND are retransmits It doesn't try to eliminate out of order packets. + * + * Since all frames after sequence number 4095 will be less than 4095 + * (as the seqnum wraps), handle that special case so packets aren't + * incorrectly dropped - ie, if the next packet is sequence number 0 + * but a retransmit since the initial packet didn't make it. + */ +static __inline int +ieee80211_check_rxseq(struct ieee80211_node *ni, struct ieee80211_frame *w= h) +{ +#define =A0 =A0 =A0 =A0SEQ_LEQ(a,b) =A0 =A0((int)((a)-(b)) <=3D 0) +#define =A0 =A0 =A0 =A0SEQ_EQ(a,b) =A0 =A0 ((int)((a)-(b)) =3D=3D 0) +#define =A0 =A0 =A0 =A0HAS_SEQ(type) =A0 ((type & 0x4) =3D=3D 0) +#define =A0 =A0 =A0 =A0SEQNO(a) =A0 =A0 =A0 =A0((a) >> IEEE80211_SEQ_SEQ_S= HIFT) +#define =A0 =A0 =A0 =A0FRAGNO(a) =A0 =A0 =A0 ((a) & IEEE80211_SEQ_FRAG_MAS= K) + =A0 =A0 =A0 uint16_t rxseq; + =A0 =A0 =A0 uint8_t type; + =A0 =A0 =A0 uint8_t tid; + =A0 =A0 =A0 struct ieee80211_rx_ampdu *rap; + + =A0 =A0 =A0 rxseq =3D le16toh(*(uint16_t *)wh->i_seq); + =A0 =A0 =A0 type =3D wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK; + + =A0 =A0 =A0 /* Types with no sequence number are always treated valid */ + =A0 =A0 =A0 if (! HAS_SEQ(type)) + =A0 =A0 =A0 =A0 =A0 =A0 =A0 return 1; + + =A0 =A0 =A0 tid =3D ieee80211_gettid(wh); + + =A0 =A0 =A0 /* + =A0 =A0 =A0 =A0* Only do the HT AMPDU check for WME stations; non-WME HT = stations + =A0 =A0 =A0 =A0* shouldn't exist outside of debugging. We should at least + =A0 =A0 =A0 =A0* handle that. + =A0 =A0 =A0 =A0*/ + =A0 =A0 =A0 if (tid < WME_NUM_TID) { + =A0 =A0 =A0 =A0 =A0 =A0 =A0 rap =3D &ni->ni_rx_ampdu[tid]; + =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* HT nodes currently doing RX AMPDU are alwa= ys valid */ + =A0 =A0 =A0 =A0 =A0 =A0 =A0 if ((ni->ni_flags & IEEE80211_NODE_HT) && + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 (rap->rxa_flags & IEEE80211_AGGR_RUNN= ING)) + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 return 1; + =A0 =A0 =A0 } + + =A0 =A0 =A0 /* + =A0 =A0 =A0 =A0* Otherwise, retries for packets below or equal to the las= t + =A0 =A0 =A0 =A0* seen sequence number should be dropped. + =A0 =A0 =A0 =A0*/ + + =A0 =A0 =A0 /* + =A0 =A0 =A0 =A0* Treat frame seqnum 4095 as special due to boundary + =A0 =A0 =A0 =A0* wrapping conditions. + =A0 =A0 =A0 =A0*/ + =A0 =A0 =A0 if (SEQNO(ni->ni_rxseqs[tid]) =3D=3D 4095) { + =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* Drop retransmits on seqnum 4095/current = fragment for itself. + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0*/ + =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (SEQ_EQ(rxseq, ni->ni_rxseqs[tid]) && + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 (wh->i_fc[1] & IEEE80211_FC1_RETRY)) + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 return 0; + =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* Treat any subsequent frame as fine if th= e last seen frame + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* is 4095 and it's not a retransmit for th= e same sequence + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* number. However, this doesn't capture in= correctly ordered + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* fragments w/ sequence number 4095. It sh= ouldn't be seen + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* in practice, but see the comment above f= or further info. + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0*/ + =A0 =A0 =A0 =A0 =A0 =A0 =A0 return 1; + =A0 =A0 =A0 } + + =A0 =A0 =A0 /* + =A0 =A0 =A0 =A0* At this point we assume that retransmitted seq/frag numb= ers below + =A0 =A0 =A0 =A0* the current can simply be eliminated. + =A0 =A0 =A0 =A0*/ + =A0 =A0 =A0 if ((wh->i_fc[1] & IEEE80211_FC1_RETRY) && + =A0 =A0 =A0 =A0 =A0 SEQ_LEQ(rxseq, ni->ni_rxseqs[tid])) + =A0 =A0 =A0 =A0 =A0 =A0 =A0 return 0; + + =A0 =A0 =A0 return 1; +#undef SEQ_LEQ +#undef SEQ_EQ +#undef HAS_SEQ +#undef SEQNO +#undef FRAGNO +} + =A0void =A0 ieee80211_deliver_data(struct ieee80211vap *, =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0struct ieee80211_node *, struct mbuf *); =A0struct mbuf *ieee80211_defrag(struct ieee80211_node *, Modified: head/sys/net80211/ieee80211_mesh.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- head/sys/net80211/ieee80211_mesh.c =A0Wed May =A04 01:39:44 2011 =A0(r221417) +++ head/sys/net80211/ieee80211_mesh.c =A0Wed May =A04 02:23:59 2011 =A0(r221418) @@ -1040,7 +1040,6 @@ mesh_isucastforme(struct ieee80211vap *v =A0static int =A0mesh_input(struct ieee80211_node *ni, struct mbuf *m, int rssi, int nf) =A0{ -#define =A0 =A0 =A0 =A0SEQ_LEQ(a,b) =A0 =A0((int)((a)-(b)) <=3D 0) =A0#define =A0 =A0 =A0 =A0HAS_SEQ(type) =A0 ((type & 0x4) =3D=3D 0) =A0 =A0 =A0 =A0struct ieee80211vap *vap =3D ni->ni_vap; =A0 =A0 =A0 =A0struct ieee80211com *ic =3D ni->ni_ic; @@ -1094,9 +1093,7 @@ mesh_input(struct ieee80211_node *ni, st =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0TID_TO_WME_AC(tid) >= =3D WME_AC_VI) =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0ic->ic_wme.w= me_hipri_traffic++; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0rxseq =3D le16toh(*(uint16_t= *)wh->i_seq); - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if ((ni->ni_flags & IEEE80211= _NODE_HT) =3D=3D 0 && - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 (wh->i_fc[1] & IEEE80= 211_FC1_RETRY) && - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 SEQ_LEQ(rxseq, ni->ni= _rxseqs[tid])) { + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (! ieee80211_check_rxseq(n= i, wh)) { =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0/* duplicate= , discard */ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0IEEE80211_DI= SCARD_MAC(vap, IEEE80211_MSG_INPUT, =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0wh->= i_addr1, "duplicate", Modified: head/sys/net80211/ieee80211_sta.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- head/sys/net80211/ieee80211_sta.c =A0 Wed May =A04 01:39:44 2011 =A0(r221417) +++ head/sys/net80211/ieee80211_sta.c =A0 Wed May =A04 02:23:59 2011 =A0(r221418) @@ -512,7 +512,6 @@ doprint(struct ieee80211vap *vap, int su =A0static int =A0sta_input(struct ieee80211_node *ni, struct mbuf *m, int rssi, int nf) =A0{ -#define =A0 =A0 =A0 =A0SEQ_LEQ(a,b) =A0 =A0((int)((a)-(b)) <=3D 0) =A0#define =A0 =A0 =A0 =A0HAS_SEQ(type) =A0 ((type & 0x4) =3D=3D 0) =A0 =A0 =A0 =A0struct ieee80211vap *vap =3D ni->ni_vap; =A0 =A0 =A0 =A0struct ieee80211com *ic =3D ni->ni_ic; @@ -591,9 +590,7 @@ sta_input(struct ieee80211_node *ni, str =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0TID_TO_WME_AC(tid) >= =3D WME_AC_VI) =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0ic->ic_wme.w= me_hipri_traffic++; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0rxseq =3D le16toh(*(uint16_t= *)wh->i_seq); - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if ((ni->ni_flags & IEEE80211= _NODE_HT) =3D=3D 0 && - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 (wh->i_fc[1] & IEEE80= 211_FC1_RETRY) && - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 SEQ_LEQ(rxseq, ni->ni= _rxseqs[tid])) { + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (! ieee80211_check_rxseq(n= i, wh)) { =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0/* duplicate= , discard */ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0IEEE80211_DI= SCARD_MAC(vap, IEEE80211_MSG_INPUT, =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0bssi= d, "duplicate", @@ -910,7 +907,6 @@ out: =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0m_freem(m); =A0 =A0 =A0 =A0} =A0 =A0 =A0 =A0return type; -#undef SEQ_LEQ =A0} =A0static void Modified: head/sys/net80211/ieee80211_wds.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- head/sys/net80211/ieee80211_wds.c =A0 Wed May =A04 01:39:44 2011 =A0(r221417) +++ head/sys/net80211/ieee80211_wds.c =A0 Wed May =A04 02:23:59 2011 =A0(r221418) @@ -406,7 +406,6 @@ wds_newstate(struct ieee80211vap *vap, e =A0static int =A0wds_input(struct ieee80211_node *ni, struct mbuf *m, int rssi, int nf) =A0{ -#define =A0 =A0 =A0 =A0SEQ_LEQ(a,b) =A0 =A0((int)((a)-(b)) <=3D 0) =A0#define =A0 =A0 =A0 =A0HAS_SEQ(type) =A0 ((type & 0x4) =3D=3D 0) =A0 =A0 =A0 =A0struct ieee80211vap *vap =3D ni->ni_vap; =A0 =A0 =A0 =A0struct ieee80211com *ic =3D ni->ni_ic; @@ -495,9 +494,7 @@ wds_input(struct ieee80211_node *ni, str =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0TID_TO_WME_AC(tid) >=3D WME_AC_VI) =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0ic->ic_wme.wme_hipri_traffic= ++; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0rxseq =3D le16toh(*(uint16_t *)wh->i_seq); - =A0 =A0 =A0 =A0 =A0 =A0 =A0 if ((ni->ni_flags & IEEE80211_NODE_HT) =3D=3D= 0 && - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 (wh->i_fc[1] & IEEE80211_FC1_RETRY) &= & - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 SEQ_LEQ(rxseq, ni->ni_rxseqs[tid])) { + =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (! ieee80211_check_rxseq(ni, wh)) { =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0/* duplicate, discard */ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0IEEE80211_DISCARD_MAC(vap, I= EEE80211_MSG_INPUT, =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0wh->i_addr1, "duplic= ate", @@ -741,7 +738,6 @@ out: =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0m_freem(m); =A0 =A0 =A0 =A0} =A0 =A0 =A0 =A0return type; -#undef SEQ_LEQ =A0} =A0static void From owner-freebsd-wireless@FreeBSD.ORG Thu May 5 13:43:34 2011 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 93FA31065675 for ; Thu, 5 May 2011 13:43:34 +0000 (UTC) (envelope-from adrian.chadd@gmail.com) Received: from mail-vx0-f182.google.com (mail-vx0-f182.google.com [209.85.220.182]) by mx1.freebsd.org (Postfix) with ESMTP id 4DDF98FC0A for ; Thu, 5 May 2011 13:43:33 +0000 (UTC) Received: by vxc34 with SMTP id 34so3126538vxc.13 for ; Thu, 05 May 2011 06:43:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:sender:date:x-google-sender-auth :message-id:subject:from:to:content-type; bh=kP9+j0zHQOo/CTrRE01/b5MECPcTx6DSsj27bSmK3jU=; b=rIXCOrY3oxu3x/oLIIhTIcNNnwLhQtfrtAIcqNxLtxtetvsBB1igdWknKGWyKe9CXB gYJlUPnlJp6cHFyepLmYhh9Rx/G9/IdLI7KLxg+LRoMkJGvllAZUTs/W4Wnfe/BIP8MN HoIedmRCLasvv+G8936Zxu53GUPRZwVrqOLqw= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:sender:date:x-google-sender-auth:message-id:subject :from:to:content-type; b=St3IGuUMLFYjb+uXvVG4TqgIfQPJHuU8/C+A6meVjlIygY7eZ7JSpycnNDiWlGgpiT ZqLbW4EBwQqtOLiXxr7ZQVguV5JmadMXcThoT5t5NLZ3lh/skoLEpeIo4X3jz9uhV9IO h+0Mk5vItdx1PC+d4/g2PyO4Wt1BZiUpl1QTw= MIME-Version: 1.0 Received: by 10.52.74.37 with SMTP id q5mr3018878vdv.182.1304603013419; Thu, 05 May 2011 06:43:33 -0700 (PDT) Sender: adrian.chadd@gmail.com Received: by 10.52.157.202 with HTTP; Thu, 5 May 2011 06:43:33 -0700 (PDT) Date: Thu, 5 May 2011 21:43:33 +0800 X-Google-Sender-Auth: z5L2Uba7IZc3YH-_-kF7hZNpmfU Message-ID: From: Adrian Chadd To: freebsd-wireless@freebsd.org Content-Type: text/plain; charset=ISO-8859-1 Subject: ath 11n update X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Discussions of 802.11 stack, tools device driver development." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 05 May 2011 13:43:34 -0000 Hi! I thought I'd post a brief update before I put this stuff on (somewhat) hold so I can focus on studies. Here's my current summary from AR9160 tests in HostAP mode. I'm currently seeing around 80-90mbit of TCP RX in ht/40 mode, and around 50-60mbit of TCP RX in ht/20 mode (both 2 stream.) There's an alarmingly high number of missed aggregate frames being missed, so the stream is more out of order than I'd like it to be. I'm able to get around 160-170mbit of UDP RX in HT/40 mode. Again, there's lots of strange missed aggregate packet stuff going on there too which could do with some debugging. The ath driver is still missing TX aggregation and rate control support, so I still can't throw the "enable 11n" switch by default. Unless someone else steps up to the plate and implements it, it won't be done in time for 9.0-RELEASE. I'll look to do it post exams (so July timeframe.) Other than that, I'm just concentrating on diagnostic and debugging at the moment so I can try to identify and fix any other strange radio behaviour. Thanks, Adrian From owner-freebsd-wireless@FreeBSD.ORG Sat May 7 10:52:10 2011 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 35BA8106564A; Sat, 7 May 2011 10:52:10 +0000 (UTC) (envelope-from adrian.chadd@gmail.com) Received: from mail-yi0-f54.google.com (mail-yi0-f54.google.com [209.85.218.54]) by mx1.freebsd.org (Postfix) with ESMTP id D7CA18FC12; Sat, 7 May 2011 10:52:09 +0000 (UTC) Received: by yie12 with SMTP id 12so1793093yie.13 for ; Sat, 07 May 2011 03:52:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:sender:date:x-google-sender-auth :message-id:subject:from:to:cc:content-type; bh=vpVLvJdbcisy47Vx6GQefaW5m4AEFxB+4gFXv4+lE1I=; b=Vw+R9YFTwmtjE3B0/LQmxttoG9fBPlkHtRZR4zQmrQbii5M8oFxzkzbfxX4BjjHQuB R6rzmW6UeFZhh9f4V0AXEI2/R7g0fovkjLrOY5AoEez1qwrJ7wOayn5KRQngz55M6dfw Vk/NRD6HywSfK1jM5C+Hw352VenS2M/50n8zs= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:sender:date:x-google-sender-auth:message-id:subject :from:to:cc:content-type; b=UyawjB8z32/Sq7FzlR1B/HAG0LLBEjEEx0aTai6WcNlaJhCZq2gmbL8dAJ0kV7fmwQ A+c0qJo6pcpVJOXUMrqzf7gNvhOxY7Qy5ApnZD8EAXxoM4/uSZaS5DIcIklcRyU2cD1U wj5l7uXuhk0aUxNZDbQXwaUP/a1rXblVQFdjU= MIME-Version: 1.0 Received: by 10.150.66.14 with SMTP id o14mr265842yba.353.1304765529089; Sat, 07 May 2011 03:52:09 -0700 (PDT) Sender: adrian.chadd@gmail.com Received: by 10.150.136.8 with HTTP; Sat, 7 May 2011 03:52:09 -0700 (PDT) Date: Sat, 7 May 2011 18:52:09 +0800 X-Google-Sender-Auth: fVHaZwxfoDOtI02n2a42Fwrpni0 Message-ID: From: Adrian Chadd To: freebsd-wireless@freebsd.org Content-Type: text/plain; charset=ISO-8859-1 Cc: freebsd-mobile@freebsd.org Subject: Does anyone have a laptop with an AR9280/AR9285 and Bluetooth in it? X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Discussions of 802.11 stack, tools device driver development." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 07 May 2011 10:52:10 -0000 Hi all, Does anyone have a laptop with an AR9280/AR9285 in it, along with Bluetooth? I'm looking for someone who's interested in getting bluetooth coexistence support working in the atheros driver and has the hardware. I'd like to stay focused on 11n and general radio/chipset support. Please let me know if you've got something with this and know a little bit about C. It's likely a good project to get down and dirty with the atheros wireless codebase. Thanks! Adrian