From owner-freebsd-wireless@FreeBSD.ORG Sun Aug 11 01:58:54 2013 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 04F0A35F for ; Sun, 11 Aug 2013 01:58:54 +0000 (UTC) (envelope-from adrian.chadd@gmail.com) Received: from mail-wi0-x22b.google.com (mail-wi0-x22b.google.com [IPv6:2a00:1450:400c:c05::22b]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 8F5F62AA6 for ; Sun, 11 Aug 2013 01:58:53 +0000 (UTC) Received: by mail-wi0-f171.google.com with SMTP id hr7so707094wib.10 for ; Sat, 10 Aug 2013 18:58:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:in-reply-to:references:date:message-id:subject :from:to:cc:content-type; bh=Ph1j49k0PflGNcLvbphbH33119e9LHMsKvlojxQj62g=; b=0eWq6B6AbIf6xnDrfDrFliodXfTp4yHBlmsRPOlNHkUzS+Vfg9ccW+rSC2oE5jC7T8 5QK8Kn6bcc7Jd/20ita/Ua37fAC2Wb4TQ+KUvMa9hxYFn3hzCTglxm3URLKEhWvaqLy6 I3K01gCjVmQZx6P3a0q8yrCARmM5vuIfnMUL/fTFoCe6uxW++2UxVOjTtfljJ5nLaHTM ikG8BPyS3xzp3Zpwzyly4AzLsyqFXXW/Hc/AEmhRv7h3Ic4SXUFX6iBj4Vb8ny6W3mty quBkhTpBm28l5oFp0Y/NgAZ7X7GKv0JUaLhOGOZvuqNSUZ9Mhsl08Iq8uI4e2zN3DlsA Sh9A== MIME-Version: 1.0 X-Received: by 10.180.185.148 with SMTP id fc20mr3537565wic.0.1376186331940; Sat, 10 Aug 2013 18:58:51 -0700 (PDT) Sender: adrian.chadd@gmail.com Received: by 10.217.116.136 with HTTP; Sat, 10 Aug 2013 18:58:51 -0700 (PDT) In-Reply-To: References: <002d01ce9200$88b19dc0$9a14d940$@info> <000601ce9234$010f07c0$032d1740$@info> <004801ce9424$15c88780$41599680$@info> Date: Sat, 10 Aug 2013 18:58:51 -0700 X-Google-Sender-Auth: VSi7EHEACQC6z_GIB8Svnlcllvg Message-ID: Subject: Re: [iwn] Review split 5 From: Adrian Chadd To: Cedric GROSS Content-Type: text/plain; charset=ISO-8859-1 Cc: freebsd-wireless@freebsd.org X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.14 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, 11 Aug 2013 01:58:54 -0000 Tested, tidyed up and committed, thanks! -adrian On 9 August 2013 08:37, Adrian Chadd wrote: > On 8 August 2013 03:43, Cedric GROSS wrote: > >>> So please go and fix that! >> >> Done. > > Cool. I'll test this out on the 4965 and 5100 today/tomorrow and get > back to you. > > > > -adrian From owner-freebsd-wireless@FreeBSD.ORG Sun Aug 11 02:03:35 2013 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id EE76D569 for ; Sun, 11 Aug 2013 02:03:35 +0000 (UTC) (envelope-from adrian.chadd@gmail.com) Received: from mail-wg0-x22d.google.com (mail-wg0-x22d.google.com [IPv6:2a00:1450:400c:c00::22d]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 890142AEA for ; Sun, 11 Aug 2013 02:03:35 +0000 (UTC) Received: by mail-wg0-f45.google.com with SMTP id x12so4606051wgg.24 for ; Sat, 10 Aug 2013 19:03:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:date:message-id:subject:from:to:content-type; bh=LTVoE7qUhjVy3gvzCEh49hCxkOP222Q9bTh34mvSdh0=; b=yh7/U4n73lSLSbFElrid+EhE9kOtcMdFKv1RrpBUJy2PEcXCFRaCA4U7cKPiywkMql eZF04ypDrkZSoj2OCQ9RqEucYnZBT6Ru8MNX+xeXq7J2wvSkGfqtFoqzZQ6577v7naQ1 RybNgl327prLmgDmQOWxuVdvy8FIzVdp3UnkW6R9GAgqwaxGgVKGB9uLI6ZXR6TkWV6T QmzJgOOKtoyITu4ayi6B9M8Nqixjc4svMG5TZnw3hh1w9C2OpkcSQ2Vt0/uTliP5pTUc 9ZiKXqMEuHsGi0hwD8IR7W/1JnEVcaSr/mkS7o0nHklczX0pGLMGPOsn6+dtwVUFbv0e GM2g== MIME-Version: 1.0 X-Received: by 10.194.203.73 with SMTP id ko9mr3639298wjc.79.1376186613981; Sat, 10 Aug 2013 19:03:33 -0700 (PDT) Sender: adrian.chadd@gmail.com Received: by 10.217.116.136 with HTTP; Sat, 10 Aug 2013 19:03:33 -0700 (PDT) Date: Sat, 10 Aug 2013 19:03:33 -0700 X-Google-Sender-Auth: elxhke4Op9SOqusfxD3k8zLlImA Message-ID: Subject: iwn(4) changes, net80211(4) changes, things may be odd From: Adrian Chadd To: freebsd-wireless@freebsd.org, Cedric GROSS Content-Type: text/plain; charset=ISO-8859-1 X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.14 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, 11 Aug 2013 02:03:36 -0000 Hiya! * net80211 now uses if_transmit instead of if_start for transmit. Lev has reported issues in hostap mode since this commit; I'll figure this out with him * I've been merging in some changes from Cedric for iwn(4). Nothing (yet) has broken the 5100 and 4965 NICs that I have here. I'm going to test some 6000 series NICs soon to see if things got better/worse. * I've updated the iwn(4) firmware - the 6000 firmware was updated, there's now firmware for the 2000 series NICs. Cedric - would you please update your git repository and post an updated diff to -wireless? I'm seeing some odd TX behaviour with 5100 (still) - and the 4965 is still unstable. I'll go add some further debugging soon to iwn(4) to figure out what's going on. There's likely some TX aggregation bugs that need fixing. Sigh. I'd very much like to get some further testing done. Would everyone using iwn(4) hardware (and it somewhat works) please update to the latest -HEAD and try it out? I'd really like to shake out any further issues. Thanks, -adrian From owner-freebsd-wireless@FreeBSD.ORG Sun Aug 11 04:10:15 2013 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 7A2A65C9 for ; Sun, 11 Aug 2013 04:10:15 +0000 (UTC) (envelope-from adrian.chadd@gmail.com) Received: from mail-we0-x22d.google.com (mail-we0-x22d.google.com [IPv6:2a00:1450:400c:c03::22d]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 0B0E12FF1 for ; Sun, 11 Aug 2013 04:10:14 +0000 (UTC) Received: by mail-we0-f173.google.com with SMTP id x55so4549489wes.4 for ; Sat, 10 Aug 2013 21:10:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:in-reply-to:references:date:message-id:subject :from:to:content-type; bh=fUf7EgRsW0l47Yt3iWSI/Guj9wCtm2d8KOoF9JBPMPI=; b=CYXPP+/m5aAWmtTtoidgDbOGCRUo31mVidctBuxv39NFUMoG5h7N5412Dh5Er26Rfb 3iw7XTICF50LpSBwFWfzSAzSoclfc7q6l8dZumt2fT3YoNRydFOlvWXsxaVy5EcIZLGT Y/X6NDyK9dSJkiL9h3NPUg1SBbFpKaQEegmSvH5w89IVOiOOj9MXuLSTKU+C0SrL7J06 SBXQYCnpcjoK3Obtg0xZu3HBjeRmAnzJ5GwyBJ0Bzdq+kMrXReWUrvflLDSnO9cnQ0Pu 2CzAa/i44tkx8hS5lCr0hUCPVSyj+yo8MldLmcAC7Ep9riYptvOAaLI/qfYKxypcxumH KZ4w== MIME-Version: 1.0 X-Received: by 10.180.211.206 with SMTP id ne14mr5382912wic.30.1376194212362; Sat, 10 Aug 2013 21:10:12 -0700 (PDT) Sender: adrian.chadd@gmail.com Received: by 10.217.116.136 with HTTP; Sat, 10 Aug 2013 21:10:12 -0700 (PDT) In-Reply-To: References: Date: Sat, 10 Aug 2013 21:10:12 -0700 X-Google-Sender-Auth: YcPLoz3hAeELV89mw_4sMZ0fUsQ Message-ID: Subject: Re: iwn(4) changes, net80211(4) changes, things may be odd From: Adrian Chadd To: freebsd-wireless@freebsd.org, Cedric GROSS Content-Type: text/plain; charset=ISO-8859-1 X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.14 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, 11 Aug 2013 04:10:15 -0000 On 10 August 2013 19:03, Adrian Chadd wrote: > Hiya! > > * net80211 now uses if_transmit instead of if_start for transmit. Lev > has reported issues in hostap mode since this commit; I'll figure this > out with him > * I've been merging in some changes from Cedric for iwn(4). Nothing > (yet) has broken the 5100 and 4965 NICs that I have here. I'm going to > test some 6000 series NICs soon to see if things got better/worse. > * I've updated the iwn(4) firmware - the 6000 firmware was updated, > there's now firmware for the 2000 series NICs. * Just fixed a panic with the BTCoex code for the Intel 6230. That now works. -adrian From owner-freebsd-wireless@FreeBSD.ORG Sun Aug 11 10:22:48 2013 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id AAAB298D; Sun, 11 Aug 2013 10:22:48 +0000 (UTC) (envelope-from cg@cgross.info) Received: from alpha.kreiz-it.fr (alpha.kreiz-it.fr [IPv6:2001:41d0:8:dda6::1]) by mx1.freebsd.org (Postfix) with ESMTP id 91AE32DE9; Sun, 11 Aug 2013 10:22:47 +0000 (UTC) Received: from DirTech (lnr56-1-82-246-51-185.fbx.proxad.net [82.246.51.185]) by alpha.kreiz-it.fr (Postfix) with ESMTPSA id E6F0F18A; Sun, 11 Aug 2013 12:22:43 +0200 (CEST) From: "Cedric GROSS" To: "'Adrian Chadd'" References: In-Reply-To: Subject: RE: iwn(4) changes, net80211(4) changes, things may be odd Date: Sun, 11 Aug 2013 12:22:41 +0200 Message-ID: <000301ce967c$b8092040$281b60c0$@info> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_0004_01CE968D.7B91F040" X-Mailer: Microsoft Office Outlook 12.0 Thread-Index: Ac6WNwAj9vrWmYt9TLij9brl9peqJwARL18Q Content-Language: fr Cc: freebsd-wireless@freebsd.org X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.14 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, 11 Aug 2013 10:22:48 -0000 This is a multi-part message in MIME format. ------=_NextPart_000_0004_01CE968D.7B91F040 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable > De=A0: adrian.chadd@gmail.com [mailto:adrian.chadd@gmail.com] De la = part > de Adrian Chadd > Envoy=E9=A0: dimanche 11 ao=FBt 2013 04:04 > =C0=A0: freebsd-wireless@freebsd.org; Cedric GROSS > Objet=A0: iwn(4) changes, net80211(4) changes, things may be odd >=20 >=20 > Cedric - would you please update your git repository and post an > updated diff to -wireless? >=20 Yep. Here is the updated diff. > -adrian Cedric ------=_NextPart_000_0004_01CE968D.7B91F040 Content-Type: application/octet-stream; name="full_a5.patch" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="full_a5.patch" Index: sys/dev/iwn/if_iwn.c=0A= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=0A= --- sys/dev/iwn/if_iwn.c (revision 254210)=0A= +++ sys/dev/iwn/if_iwn.c (working copy)=0A= @@ -119,6 +119,8 @@=0A= { 0x8086, IWN_DID_5x50_2, "Intel WiMAX/WiFi Link 5350" },=0A= { 0x8086, IWN_DID_5x50_3, "Intel WiMAX/WiFi Link 5150" },=0A= { 0x8086, IWN_DID_5x50_4, "Intel WiMAX/WiFi Link 5150" },=0A= + { 0x8086, IWN_DID_6035_1, "Centrino Advanced-N 6235" },=0A= + { 0x8086, IWN_DID_6035_2, "Centrino Advanced-N 6235" },=0A= { 0, 0, NULL }=0A= };=0A= =0A= @@ -235,7 +237,8 @@=0A= static int iwn_add_broadcast_node(struct iwn_softc *, int);=0A= static int iwn_updateedca(struct ieee80211com *);=0A= static void iwn_update_mcast(struct ifnet *);=0A= -static void iwn_set_led(struct iwn_softc *, uint8_t, uint8_t, uint8_t);=0A= +static void iwn_set_led(struct iwn_softc *, uint8_t, uint8_t, uint8_t,=0A= + uint8_t);=0A= static int iwn_set_critical_temp(struct iwn_softc *);=0A= static int iwn_set_timing(struct iwn_softc *, struct ieee80211_node *);=0A= static void iwn4965_power_calibration(struct iwn_softc *, int);=0A= @@ -261,7 +264,7 @@=0A= static int iwn_set_pslevel(struct iwn_softc *, int, int, int);=0A= static int iwn_send_btcoex(struct iwn_softc *);=0A= static int iwn_send_advanced_btcoex(struct iwn_softc *);=0A= -static int iwn5000_runtime_calib(struct iwn_softc *);=0A= +//static int iwn5000_runtime_calib(struct iwn_softc *);=0A= static int iwn_config(struct iwn_softc *);=0A= static uint8_t *ieee80211_add_ssid(uint8_t *, const uint8_t *, u_int);=0A= static int iwn_scan(struct iwn_softc *);=0A= @@ -292,6 +295,7 @@=0A= static int iwn5000_send_wimax_coex(struct iwn_softc *);=0A= static int iwn5000_crystal_calib(struct iwn_softc *);=0A= static int iwn5000_temp_offset_calib(struct iwn_softc *);=0A= +static int iwn5000_temp_offset_calibv2(struct iwn_softc *);=0A= static int iwn4965_post_alive(struct iwn_softc *);=0A= static int iwn5000_post_alive(struct iwn_softc *);=0A= static int iwn4965_load_bootcode(struct iwn_softc *, const uint8_t *,=0A= @@ -330,6 +334,21 @@=0A= static char *iwn_get_csr_string(int);=0A= static void iwn_debug_register(struct iwn_softc *);=0A= #endif=0A= +static int iwn_config_specific(struct iwn_softc *,uint16_t);=0A= +static int iwn_set_statistics_request(struct iwn_softc *,bool ,bool = ,int);=0A= +static int iwn_cfg_ucode_post_alive(struct iwn_softc *);=0A= +static int iwn_iv_reset(struct ieee80211vap *, u_long);=0A= +static int iwn_newstate_u1(struct ieee80211vap *, enum ieee80211_state = , int);=0A= +static int iwn_auth_u1(struct iwn_softc *, struct ieee80211vap *);=0A= +static int iwn_run_u1(struct iwn_softc *, struct ieee80211vap *);=0A= +static int iwn_set_timing_u1(struct iwn_softc *);=0A= +static int iwn_config_u1(struct iwn_softc *);=0A= +static int iwn_set_pan_params(struct iwn_softc *);=0A= +static int iwn_updateedca_u1(struct ieee80211com *);=0A= +static int iwn_add_broadcast_node_u1(struct iwn_softc *, int);=0A= +static uint16_t iwn_get_active_dwell(struct iwn_softc *, struct = ieee80211_channel *);=0A= +static uint16_t iwn_get_passive_dwell(struct iwn_softc *, struct = ieee80211_channel *);=0A= +static void iwn_led_pattern(struct iwn_softc *);=0A= =0A= #ifdef IWN_DEBUG=0A= enum {=0A= @@ -376,6 +395,7 @@=0A= case IWN_RX_PHY: return "RX_PHY";=0A= case IWN_MPDU_RX_DONE: return "MPDU_RX_DONE";=0A= case IWN_RX_DONE: return "RX_DONE";=0A= + case IWN_TEMP_NOTIFICATION: return "TEMPERATURE_NOTIFICATION";=0A= =0A= /* Command Notifications */=0A= case IWN_CMD_RXON: return "IWN_CMD_RXON";=0A= @@ -398,6 +418,19 @@=0A= case IWN_CMD_SET_CRITICAL_TEMP: return "IWN_CMD_SET_CRITICAL_TEMP";=0A= case IWN_CMD_SET_SENSITIVITY: return "IWN_CMD_SET_SENSITIVITY";=0A= case IWN_CMD_PHY_CALIB: return "IWN_CMD_PHY_CALIB";=0A= + case IWN_CMD_BT_COEX_PRIOTABLE: return "IWN_CMD_BT_COEX_PRIOTABLE";=0A= + case IWN_CMD_BT_COEX_PROT: return "IWN_CMD_BT_COEX_PROT";=0A= + case IWN_CMD_BT_COEX_NOTIF: return "IWN_CMD_BT_COEX_NOTIF";=0A= + /* PAN commands */=0A= + case IWN_CMD_WIPAN_PARAMS: return "IWN_CMD_WIPAN_PARAMS";=0A= + case IWN_CMD_WIPAN_RXON: return "IWN_CMD_WIPAN_RXON";=0A= + case IWN_CMD_WIPAN_RXON_TIMING: return "IWN_CMD_WIPAN_RXON_TIMING";=0A= + case IWN_CMD_WIPAN_RXON_ASSOC: return "IWN_CMD_WIPAN_RXON_ASSOC";=0A= + case IWN_CMD_WIPAN_QOS_PARAM: return "IWN_CMD_WIPAN_QOS_PARAM";=0A= + case IWN_CMD_WIPAN_WEPKEY: return "IWN_CMD_WIPAN_WEPKEY";=0A= + case IWN_CMD_WIPAN_P2P_CHANNEL_SWITCH: return = "IWN_CMD_WIPAN_P2P_CHANNEL_SWITCH";=0A= + case IWN_CMD_WIPAN_NOA_NOTIFICATION: return = "IWN_CMD_WIPAN_NOA_NOTIFICATION";=0A= + case IWN_CMD_WIPAN_DEACTIVATION_COMPLETE: return = "IWN_CMD_WIPAN_DEACTIVATION_COMPLETE";=0A= }=0A= return "UNKNOWN INTR NOTIF/CMD";=0A= }=0A= @@ -456,6 +489,9 @@=0A= int i, error, result;=0A= uint8_t macaddr[IEEE80211_ADDR_LEN];=0A= =0A= + sc->desired_pwrsave_level =3D IWN_POWERSAVE_LVL_DEFAULT;=0A= + sc->current_pwrsave_level =3D -1; /* signifies uninitialized */=0A= +=0A= sc->sc_dev =3D dev;=0A= =0A= #ifdef IWN_DEBUG=0A= @@ -615,6 +651,11 @@=0A= | IEEE80211_C_WME /* WME */=0A= | IEEE80211_C_PMGT /* Station-side power mgmt */=0A= ;=0A= + if (sc->base_params->support_hostap) {=0A= + ic->ic_caps |=3D IEEE80211_C_HOSTAP ;/* HOSTAP mode supported */=0A= + } else {=0A= + ic->ic_caps &=3D ~ IEEE80211_C_HOSTAP ; /* HOSTAP mode not supported = */=0A= + }=0A= =0A= /* Read MAC address, channels, etc from EEPROM. */=0A= if ((error =3D iwn_read_eeprom(sc, macaddr)) !=3D 0) {=0A= @@ -712,10 +753,17 @@=0A= ic->ic_scan_mindwell =3D iwn_scan_mindwell;=0A= ic->ic_setregdomain =3D iwn_setregdomain;=0A= =0A= + sc->sc_led.led_cur_mode =3D IWN_LED_STATIC_OFF;=0A= + sc->sc_led.led_cur_tpt =3D 0;=0A= + sc->sc_led.led_last_tpt =3D 0;=0A= + sc->sc_led.led_cur_time =3D 0;=0A= + sc->sc_led.led_last_time =3D 0;=0A= +=0A= iwn_radiotap_attach(sc);=0A= =0A= callout_init_mtx(&sc->calib_to, &sc->sc_mtx, 0);=0A= callout_init_mtx(&sc->watchdog_to, &sc->sc_mtx, 0);=0A= + callout_init_mtx(&sc->ct_kill_exit_to, &sc->sc_mtx, 0);=0A= TASK_INIT(&sc->sc_reinit_task, 0, iwn_hw_reset, sc);=0A= TASK_INIT(&sc->sc_radioon_task, 0, iwn_radio_on, sc);=0A= TASK_INIT(&sc->sc_radiooff_task, 0, iwn_radio_off, sc);=0A= @@ -732,6 +780,11 @@=0A= error);=0A= goto fail;=0A= }=0A= + /* update ic->ic_flags to the default power save mode */=0A= + if (IWN_POWERSAVE_LVL_DEFAULT !=3D IWN_POWERSAVE_LVL_NONE)=0A= + ic->ic_flags |=3D IEEE80211_F_PMGTON;=0A= + else=0A= + ic->ic_flags &=3D ~IEEE80211_F_PMGTON;=0A= =0A= if (bootverbose)=0A= ieee80211_announce(ic);=0A= @@ -778,6 +831,7 @@=0A= /* Override chains masks, ROM is known to be broken. */=0A= sc->txchainmask =3D IWN_ANT_AB;=0A= sc->rxchainmask =3D IWN_ANT_ABC;=0A= + sc->base_params =3D &iwn_default_base_params; /* !! TODO : Define = something may be more specific */=0A= =0A= DPRINTF(sc, IWN_DEBUG_TRACE, "%s: end\n",__func__);=0A= =0A= @@ -818,59 +872,7 @@=0A= sc->reset_noise_gain =3D IWN5000_PHY_CALIB_RESET_NOISE_GAIN;=0A= sc->noise_gain =3D IWN5000_PHY_CALIB_NOISE_GAIN;=0A= =0A= - switch (sc->hw_type) {=0A= - case IWN_HW_REV_TYPE_5100:=0A= - sc->limits =3D &iwn5000_sensitivity_limits;=0A= - sc->fwname =3D "iwn5000fw";=0A= - /* Override chains masks, ROM is known to be broken. */=0A= - sc->txchainmask =3D IWN_ANT_B;=0A= - sc->rxchainmask =3D IWN_ANT_AB;=0A= - break;=0A= - case IWN_HW_REV_TYPE_5150:=0A= - sc->limits =3D &iwn5150_sensitivity_limits;=0A= - sc->fwname =3D "iwn5150fw";=0A= - break;=0A= - case IWN_HW_REV_TYPE_5300:=0A= - case IWN_HW_REV_TYPE_5350:=0A= - sc->limits =3D &iwn5000_sensitivity_limits;=0A= - sc->fwname =3D "iwn5000fw";=0A= - break;=0A= - case IWN_HW_REV_TYPE_1000:=0A= - sc->limits =3D &iwn1000_sensitivity_limits;=0A= - sc->fwname =3D "iwn1000fw";=0A= - break;=0A= - case IWN_HW_REV_TYPE_6000:=0A= - sc->limits =3D &iwn6000_sensitivity_limits;=0A= - sc->fwname =3D "iwn6000fw";=0A= - if (pid =3D=3D 0x422c || pid =3D=3D 0x4239) {=0A= - sc->sc_flags |=3D IWN_FLAG_INTERNAL_PA;=0A= - /* Override chains masks, ROM is known to be broken. */=0A= - sc->txchainmask =3D IWN_ANT_BC;=0A= - sc->rxchainmask =3D IWN_ANT_BC;=0A= - }=0A= - break;=0A= - case IWN_HW_REV_TYPE_6050:=0A= - sc->limits =3D &iwn6000_sensitivity_limits;=0A= - sc->fwname =3D "iwn6050fw";=0A= - /* Override chains masks, ROM is known to be broken. */=0A= - sc->txchainmask =3D IWN_ANT_AB;=0A= - sc->rxchainmask =3D IWN_ANT_AB;=0A= - break;=0A= - case IWN_HW_REV_TYPE_6005:=0A= - sc->limits =3D &iwn6000_sensitivity_limits;=0A= - if (pid !=3D 0x0082 && pid !=3D 0x0085) {=0A= - sc->fwname =3D "iwn6000g2bfw";=0A= - sc->sc_flags |=3D IWN_FLAG_ADV_BTCOEX;=0A= - } else=0A= - sc->fwname =3D "iwn6000g2afw";=0A= - break;=0A= - default:=0A= - device_printf(sc->sc_dev, "adapter type %d not supported\n",=0A= - sc->hw_type);=0A= - DPRINTF(sc, IWN_DEBUG_TRACE, "->%s: end in error\n",__func__);=0A= - return ENOTSUP;=0A= - }=0A= - return 0;=0A= + return iwn_config_specific(sc,pid);=0A= }=0A= =0A= /*=0A= @@ -914,24 +916,50 @@=0A= uint8_t mac1[IEEE80211_ADDR_LEN];=0A= struct iwn_softc *sc =3D ic->ic_ifp->if_softc;=0A= =0A= - if (!TAILQ_EMPTY(&ic->ic_vaps)) /* only one at a time */=0A= - return NULL;=0A= + if (sc->base_params->no_multi_vaps) {=0A= + if (!TAILQ_EMPTY(&ic->ic_vaps)) /* only one at a time */=0A= + return NULL;=0A= + }=0A= =0A= IEEE80211_ADDR_COPY(mac1, mac);=0A= =0A= + if(unit =3D=3D 1) {=0A= + if(!(sc->sc_flags & IWN_FLAG_PAN_SUPPORT))=0A= + return NULL;=0A= + mac1[5] +=3D 1;=0A= + sc->ctx =3D IWN_RXON_PAN_CTX;=0A= + }=0A= +=0A= ivp =3D (struct iwn_vap *) malloc(sizeof(struct iwn_vap),=0A= M_80211_VAP, M_NOWAIT | M_ZERO);=0A= if (ivp =3D=3D NULL)=0A= return NULL;=0A= vap =3D &ivp->iv_vap;=0A= +=0A= ieee80211_vap_setup(ic, vap, name, unit, opmode, flags, bssid, mac1);=0A= - ivp->ctx =3D IWN_RXON_BSS_CTX;=0A= - IEEE80211_ADDR_COPY(ivp->macaddr, mac1);=0A= +=0A= + if(unit =3D=3D 1) {=0A= + ivp->ctx =3D IWN_RXON_PAN_CTX;=0A= + ivp->iv_newstate =3D vap->iv_newstate;=0A= + vap->iv_newstate =3D iwn_newstate_u1;=0A= + IEEE80211_ADDR_COPY(ivp->macaddr, mac1);=0A= + memset(&sc->rx_on[IWN_RXON_PAN_CTX], 0, sizeof (struct iwn_rxon));=0A= + memcpy(&sc->rx_on[IWN_RXON_PAN_CTX], &sc->rx_on[IWN_RXON_BSS_CTX], = sc->rxonsz);=0A= + IEEE80211_ADDR_COPY(sc->rx_on[IWN_RXON_PAN_CTX].myaddr, mac1);=0A= + sc->rx_on[IWN_RXON_PAN_CTX].mode =3D IWN_MODE_2STA;=0A= + sc->ivap[IWN_RXON_PAN_CTX] =3D vap;=0A= + }=0A= + else {=0A= + ivp->ctx =3D IWN_RXON_BSS_CTX;=0A= + IEEE80211_ADDR_COPY(ivp->macaddr, mac1);=0A= + ivp->iv_newstate =3D vap->iv_newstate;=0A= + vap->iv_newstate =3D iwn_newstate;=0A= + sc->ivap[IWN_RXON_BSS_CTX] =3D vap;=0A= + }=0A= +=0A= vap->iv_bmissthreshold =3D 10; /* override default */=0A= - /* Override with driver methods. */=0A= - ivp->iv_newstate =3D vap->iv_newstate;=0A= - vap->iv_newstate =3D iwn_newstate;=0A= - sc->ivap[IWN_RXON_BSS_CTX] =3D vap;=0A= + /* handler for setting change (partial 're'set) requested via ioctl */=0A= + vap->iv_reset =3D iwn_iv_reset;=0A= =0A= ieee80211_ratectl_init(vap);=0A= /* Complete setup. */=0A= @@ -944,7 +972,11 @@=0A= iwn_vap_delete(struct ieee80211vap *vap)=0A= {=0A= struct iwn_vap *ivp =3D IWN_VAP(vap);=0A= + struct iwn_softc *sc =3D vap->iv_ic->ic_ifp->if_softc;=0A= =0A= + if(ivp->ctx =3D=3D IWN_RXON_PAN_CTX)=0A= + sc->ctx =3D 0;=0A= +=0A= ieee80211_ratectl_deinit(vap);=0A= ieee80211_vap_detach(vap);=0A= free(ivp, M_80211_VAP);=0A= @@ -969,6 +1001,7 @@=0A= =0A= iwn_stop(sc);=0A= callout_drain(&sc->watchdog_to);=0A= + callout_drain(&sc->ct_kill_exit_to);=0A= callout_drain(&sc->calib_to);=0A= ieee80211_ifdetach(ic);=0A= }=0A= @@ -1016,8 +1049,13 @@=0A= {=0A= struct iwn_softc *sc =3D device_get_softc(dev);=0A= struct ieee80211com *ic =3D sc->sc_ifp->if_l2com;=0A= + struct ieee80211vap *vap =3D TAILQ_FIRST(&ic->ic_vaps);=0A= =0A= ieee80211_suspend_all(ic);=0A= + iwn_stop(sc);=0A= + if (vap !=3D NULL)=0A= + ieee80211_stop(vap);=0A= +=0A= return 0;=0A= }=0A= =0A= @@ -1025,12 +1063,22 @@=0A= iwn_resume(device_t dev)=0A= {=0A= struct iwn_softc *sc =3D device_get_softc(dev);=0A= - struct ieee80211com *ic =3D sc->sc_ifp->if_l2com;=0A= + struct ifnet *ifp =3D sc->sc_ifp;=0A= + struct ieee80211com *ic =3D ifp->if_l2com;=0A= + struct ieee80211vap *vap =3D TAILQ_FIRST(&ic->ic_vaps);=0A= =0A= /* Clear device-specific "PCI retry timeout" register (41h). */=0A= pci_write_config(dev, 0x41, 0, 1);=0A= =0A= ieee80211_resume_all(ic);=0A= + if (ifp->if_flags & IFF_UP) {=0A= + iwn_init(sc);=0A= + if (vap !=3D NULL)=0A= + ieee80211_init(vap);=0A= + if (ifp->if_drv_flags & IFF_DRV_RUNNING)=0A= + iwn_start(ifp);=0A= + }=0A= +=0A= return 0;=0A= }=0A= =0A= @@ -1192,7 +1240,7 @@=0A= iwn_nic_unlock(sc);=0A= =0A= /* Set auto clock gate disable bit for HW with OTP shadow RAM. */=0A= - if (sc->hw_type !=3D IWN_HW_REV_TYPE_1000) {=0A= + if (sc->base_params->shadow_ram_support) {=0A= IWN_SETBITS(sc, IWN_DBG_LINK_PWR_MGMT,=0A= IWN_RESET_LINK_PWR_MGMT_DIS);=0A= }=0A= @@ -1205,11 +1253,11 @@=0A= * Find the block before last block (contains the EEPROM image)=0A= * for HW without OTP shadow RAM.=0A= */=0A= - if (sc->hw_type =3D=3D IWN_HW_REV_TYPE_1000) {=0A= + if (!(sc->base_params->shadow_ram_support)) {=0A= /* Switch to absolute addressing mode. */=0A= IWN_CLRBITS(sc, IWN_OTP_GP, IWN_OTP_GP_RELATIVE_ACCESS);=0A= base =3D prev =3D 0;=0A= - for (count =3D 0; count < IWN1000_OTP_NBLOCKS; count++) {=0A= + for (count =3D 0; count < sc->base_params->max_ll_items; count++) {=0A= error =3D iwn_read_prom_data(sc, base, &next, 2);=0A= if (error !=3D 0)=0A= return error;=0A= @@ -1218,7 +1266,7 @@=0A= prev =3D base;=0A= base =3D le16toh(next);=0A= }=0A= - if (count =3D=3D 0 || count =3D=3D IWN1000_OTP_NBLOCKS)=0A= + if (count =3D=3D 0 || count =3D=3D sc->base_params->max_ll_items)=0A= return EIO;=0A= /* Skip "next" word. */=0A= sc->prom_base =3D prev + 1;=0A= @@ -1453,7 +1501,7 @@=0A= goto fail;=0A= }=0A= =0A= - data->m =3D m_getjcl(M_NOWAIT, MT_DATA, M_PKTHDR,=0A= + data->m =3D m_getjcl(M_DONTWAIT, MT_DATA, M_PKTHDR,=0A= IWN_RBUF_SIZE);=0A= if (data->m =3D=3D NULL) {=0A= device_printf(sc->sc_dev,=0A= @@ -1854,7 +1902,7 @@=0A= {=0A= struct iwn5000_eeprom_calib_hdr hdr;=0A= int32_t volt;=0A= - uint32_t base, addr;=0A= + uint32_t base;=0A= uint16_t val;=0A= int i;=0A= =0A= @@ -1867,16 +1915,12 @@=0A= sc->eeprom_domain, 4);=0A= =0A= /* Read the list of authorized channels (20MHz ones only). */=0A= - for (i =3D 0; i < 7; i++) {=0A= - if (sc->hw_type >=3D IWN_HW_REV_TYPE_6000)=0A= - addr =3D base + iwn6000_regulatory_bands[i];=0A= - else=0A= - addr =3D base + iwn5000_regulatory_bands[i];=0A= - iwn_read_eeprom_channels(sc, i, addr);=0A= + for (i =3D 0; i < (IWN_NBANDS - 1); i++) {=0A= + iwn_read_eeprom_channels(sc, i, = base+sc->base_params->regulatory_bands[i]);=0A= }=0A= =0A= /* Read enhanced TX power information for 6000 Series. */=0A= - if (sc->hw_type >=3D IWN_HW_REV_TYPE_6000)=0A= + if (sc->base_params->enhanced_TX_power)=0A= iwn_read_eeprom_enhinfo(sc);=0A= =0A= iwn_read_prom_data(sc, IWN5000_EEPROM_CAL, &val, 2);=0A= @@ -1887,6 +1931,14 @@=0A= hdr.version, hdr.pa_type, le16toh(hdr.volt));=0A= sc->calib_ver =3D hdr.version;=0A= =0A= + if (sc->base_params->calib_need & = IWN_FLG_NEED_PHY_CALIB_TEMP_OFFSETv2) {=0A= + sc->eeprom_voltage =3D le16toh(hdr.volt);=0A= + iwn_read_prom_data(sc, base + IWN5000_EEPROM_TEMP, &val, 2);=0A= + sc->eeprom_temp_high=3Dle16toh(val);=0A= + iwn_read_prom_data(sc, base + IWN5000_EEPROM_VOLT, &val, 2);=0A= + sc->eeprom_temp =3D le16toh(val);=0A= + }=0A= +=0A= if (sc->hw_type =3D=3D IWN_HW_REV_TYPE_5150) {=0A= /* Compute temperature offset. */=0A= iwn_read_prom_data(sc, base + IWN5000_EEPROM_TEMP, &val, 2);=0A= @@ -2423,12 +2475,7 @@=0A= =0A= /* Force automatic TX power calibration every 60 secs. */=0A= if (++sc->calib_cnt >=3D 120) {=0A= - uint32_t flags =3D 0;=0A= -=0A= - DPRINTF(sc, IWN_DEBUG_CALIBRATE, "%s\n",=0A= - "sending request for statistics");=0A= - (void)iwn_cmd(sc, IWN_CMD_GET_STATISTICS, &flags,=0A= - sizeof flags, 1);=0A= + iwn_set_statistics_request(sc,true,false,1);=0A= sc->calib_cnt =3D 0;=0A= }=0A= callout_reset(&sc->calib_to, msecs_to_ticks(500), iwn_calib_timeout,=0A= @@ -2521,7 +2568,7 @@=0A= return;=0A= }=0A= =0A= - m1 =3D m_getjcl(M_NOWAIT, MT_DATA, M_PKTHDR, IWN_RBUF_SIZE);=0A= + m1 =3D m_getjcl(M_DONTWAIT, MT_DATA, M_PKTHDR, IWN_RBUF_SIZE);=0A= if (m1 =3D=3D NULL) {=0A= DPRINTF(sc, IWN_DEBUG_ANY, "%s: no mbuf to restock ring\n",=0A= __func__);=0A= @@ -2581,6 +2628,7 @@=0A= tap->wr_dbm_antsignal =3D (int8_t)rssi;=0A= tap->wr_dbm_antnoise =3D (int8_t)nf;=0A= tap->wr_tsft =3D stat->tstamp;=0A= + /* XXX rate contain also antenna information */=0A= switch (stat->rate) {=0A= /* CCK rates. */=0A= case 10: tap->wr_rate =3D 2; break;=0A= @@ -2597,7 +2645,10 @@=0A= case 0x1: tap->wr_rate =3D 96; break;=0A= case 0x3: tap->wr_rate =3D 108; break;=0A= /* Unknown rate: should not happen. */=0A= - default: tap->wr_rate =3D 0;=0A= + default: =0A= + tap->wr_rate =3D 0;=0A= + DPRINTF(sc, IWN_DEBUG_RECV, =0A= + "Rate found: 0x%08x and not translated\n", stat->rate);=0A= }=0A= }=0A= =0A= @@ -2740,29 +2791,30 @@=0A= =0A= switch (calib->code) {=0A= case IWN5000_PHY_CALIB_DC:=0A= - if ((sc->sc_flags & IWN_FLAG_INTERNAL_PA) =3D=3D 0 &&=0A= - (sc->hw_type =3D=3D IWN_HW_REV_TYPE_5150 ||=0A= - sc->hw_type >=3D IWN_HW_REV_TYPE_6000) &&=0A= - sc->hw_type !=3D IWN_HW_REV_TYPE_6050)=0A= + if (sc->base_params->calib_need & IWN_FLG_NEED_PHY_CALIB_DC)=0A= idx =3D 0;=0A= break;=0A= case IWN5000_PHY_CALIB_LO:=0A= - idx =3D 1;=0A= + if (sc->base_params->calib_need & IWN_FLG_NEED_PHY_CALIB_LO)=0A= + idx =3D 1;=0A= break;=0A= case IWN5000_PHY_CALIB_TX_IQ:=0A= - idx =3D 2;=0A= + if (sc->base_params->calib_need & IWN_FLG_NEED_PHY_CALIB_TX_IQ)=0A= + idx =3D 2;=0A= break;=0A= case IWN5000_PHY_CALIB_TX_IQ_PERIODIC:=0A= - if (sc->hw_type < IWN_HW_REV_TYPE_6000 &&=0A= - sc->hw_type !=3D IWN_HW_REV_TYPE_5150)=0A= + if (sc->base_params->calib_need & = IWN_FLG_NEED_PHY_CALIB_TX_IQ_PERIODIC)=0A= idx =3D 3;=0A= break;=0A= case IWN5000_PHY_CALIB_BASE_BAND:=0A= - idx =3D 4;=0A= + if (sc->base_params->calib_need & IWN_FLG_NEED_PHY_CALIB_BASE_BAND)=0A= + idx =3D 4;=0A= break;=0A= }=0A= - if (idx =3D=3D -1) /* Ignore other results. */=0A= + if (idx =3D=3D -1) { /* Ignore other results. */=0A= + DPRINTF(sc,IWN_DEBUG_CALIBRATE,"Ignoring calib result = %d",calib->code);=0A= return;=0A= + }=0A= =0A= /* Save calibration result. */=0A= if (sc->calibcmd[idx].buf !=3D NULL)=0A= @@ -2778,6 +2830,7 @@=0A= "saving calibration result code=3D%d len=3D%d\n", calib->code, = len);=0A= sc->calibcmd[idx].len =3D len;=0A= memcpy(sc->calibcmd[idx].buf, calib, len);=0A= + DPRINTF(sc, IWN_DEBUG_TRACE, "->%s end\n", __func__);=0A= }=0A= =0A= /*=0A= @@ -2794,6 +2847,12 @@=0A= struct ieee80211vap *vap =3D TAILQ_FIRST(&ic->ic_vaps);=0A= struct iwn_calib_state *calib =3D &sc->calib;=0A= struct iwn_stats *stats =3D (struct iwn_stats *)(desc + 1);=0A= + struct ieee80211_node *ni =3D vap->iv_bss;=0A= + struct ieee80211_nodestats ns =3D ni->ni_stats;=0A= + struct bintime bt;=0A= +=0A= + struct ieee80211vap *vap1;=0A= +=0A= int temp;=0A= =0A= DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);=0A= @@ -2805,7 +2864,42 @@=0A= __func__);=0A= return;=0A= }=0A= + if(sc->ctx =3D=3D IWN_RXON_PAN_CTX) {=0A= + vap1 =3D sc->ivap[IWN_RXON_PAN_CTX];=0A= + /* Ignore statistics received during a scan. */=0A= + if (vap1->iv_state !=3D IEEE80211_S_RUN ||=0A= + (ic->ic_flags & IEEE80211_F_SCAN))=0A= + return;=0A= + }=0A= =0A= + getbinuptime(&bt);=0A= + sc->sc_led.led_cur_time =3D bt.sec;=0A= + int time_diff =3D (sc->sc_led.led_cur_time - sc->sc_led.led_last_time);=0A= +=0A= + if(time_diff >=3D 4) {=0A= + if(vap->iv_state =3D=3D IEEE80211_S_RUN) {=0A= + sc->sc_led.led_cur_bt =3D (ns.ns_rx_bytes + ns.ns_tx_bytes);=0A= + if(sc->sc_led.led_cur_bt < sc->sc_led.led_last_bt) {=0A= + sc->sc_led.led_cur_bt =3D 0;=0A= + sc->sc_led.led_last_bt =3D 0;=0A= + }=0A= + sc->sc_led.led_bt_diff =3D (sc->sc_led.led_cur_bt - = sc->sc_led.led_last_bt);=0A= + sc->sc_led.led_last_bt =3D sc->sc_led.led_cur_bt;=0A= + sc->sc_led.led_cur_tpt =3D (sc->sc_led.led_bt_diff / time_diff);=0A= + sc->sc_led.led_last_time =3D sc->sc_led.led_cur_time;=0A= +=0A= + if(sc->sc_led.led_cur_tpt > 0) {=0A= + sc->sc_led.led_cur_mode =3D IWN_LED_INT_BLINK;=0A= + iwn_led_pattern(sc);=0A= + } else {=0A= + sc->sc_led.led_cur_mode =3D IWN_LED_STATIC_ON;=0A= + iwn_set_led(sc, IWN_LED_LINK, 0, 1, IWN_LED_STATIC_ON);=0A= + }=0A= +=0A= + sc->sc_led.led_last_tpt =3D sc->sc_led.led_cur_tpt;=0A= + }=0A= + }=0A= +=0A= bus_dmamap_sync(sc->rxq.data_dmat, data->map, BUS_DMASYNC_POSTREAD);=0A= =0A= DPRINTF(sc, IWN_DEBUG_CALIBRATE, "%s: received statistics, cmd %d\n",=0A= @@ -2896,7 +2990,7 @@=0A= =0A= #ifdef notyet=0A= /* Reset TX scheduler slot. */=0A= - iwn5000_reset_sched(sc, desc->qid & 0xf, desc->idx);=0A= + iwn5000_reset_sched(sc, desc->qid & IWN_RX_DESC_QID_MSK, desc->idx);=0A= #endif=0A= =0A= bus_dmamap_sync(ring->data_dmat, data->map, BUS_DMASYNC_POSTREAD);=0A= @@ -2905,7 +2999,7 @@=0A= &stat->status);=0A= } else {=0A= iwn_tx_done(sc, desc, stat->ackfailcnt,=0A= - le16toh(stat->status) & 0xff);=0A= + le16toh(stat->status) & IWN_TX_STATUS_MSK);=0A= }=0A= }=0A= =0A= @@ -2917,11 +3011,16 @@=0A= uint8_t status)=0A= {=0A= struct ifnet *ifp =3D sc->sc_ifp;=0A= - struct iwn_tx_ring *ring =3D &sc->txq[desc->qid & 0xf];=0A= + struct iwn_tx_ring *ring =3D &sc->txq[desc->qid & IWN_RX_DESC_QID_MSK];=0A= struct iwn_tx_data *data =3D &ring->data[desc->idx];=0A= +=0A= + struct iwn_tx_cmd *cmd;=0A= + struct iwn_cmd_data *tx;=0A= +=0A= struct mbuf *m;=0A= struct ieee80211_node *ni;=0A= struct ieee80211vap *vap;=0A= + struct ieee80211_frame *wh;=0A= =0A= KASSERT(data->ni !=3D NULL, ("no node"));=0A= =0A= @@ -2928,12 +3027,21 @@=0A= DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);=0A= =0A= /* Unmap and free mbuf. */=0A= + uint8_t ridx;=0A= bus_dmamap_sync(ring->data_dmat, data->map, BUS_DMASYNC_POSTWRITE);=0A= bus_dmamap_unload(ring->data_dmat, data->map);=0A= m =3D data->m, data->m =3D NULL;=0A= ni =3D data->ni, data->ni =3D NULL;=0A= + uint8_t type;=0A= vap =3D ni->ni_vap;=0A= =0A= + cmd =3D &ring->cmd[desc->idx];=0A= + tx =3D (struct iwn_cmd_data *)cmd->data;=0A= + wh =3D (struct ieee80211_frame *)(tx + 1);=0A= +=0A= + struct ieee80211com *ic =3D ni->ni_ic;=0A= +=0A= + type =3D wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK;=0A= if (m->m_flags & M_TXCB) {=0A= /*=0A= * Channels marked for "radar" require traffic to be received=0A= @@ -2957,6 +3065,7 @@=0A= (status & IWN_TX_FAIL) !=3D 0);=0A= }=0A= =0A= + ridx =3D ic->ic_rt->rateCodeToIndex[ni->ni_txrate];=0A= /*=0A= * Update rate control statistics for the node.=0A= */=0A= @@ -2993,12 +3102,24 @@=0A= static void=0A= iwn_cmd_done(struct iwn_softc *sc, struct iwn_rx_desc *desc)=0A= {=0A= - struct iwn_tx_ring *ring =3D &sc->txq[4];=0A= + struct iwn_tx_ring *ring;=0A= struct iwn_tx_data *data;=0A= + int cmd_queue_num;=0A= =0A= - if ((desc->qid & 0xf) !=3D 4)=0A= + if(sc->sc_flags & IWN_FLAG_PAN_SUPPORT)=0A= + cmd_queue_num =3D IWN_PAN_CMD_QUEUE;=0A= + else=0A= + cmd_queue_num =3D IWN_CMD_QUEUE_NUM;=0A= +=0A= +=0A= + DPRINTF(sc, IWN_DEBUG_CMD, "%s: qid: %d\n",=0A= + __func__, (desc->qid & IWN_RX_DESC_QID_MSK));=0A= +=0A= +=0A= + if ((desc->qid & IWN_RX_DESC_QID_MSK) !=3D cmd_queue_num)=0A= return; /* Not a command ack. */=0A= =0A= + ring =3D &sc->txq[cmd_queue_num];=0A= data =3D &ring->data[desc->idx];=0A= =0A= /* If the command was mapped in an mbuf, free it. */=0A= @@ -3133,7 +3254,9 @@=0A= struct iwn_ops *ops =3D &sc->ops;=0A= struct ifnet *ifp =3D sc->sc_ifp;=0A= struct ieee80211com *ic =3D ifp->if_l2com;=0A= - struct ieee80211vap *vap =3D TAILQ_FIRST(&ic->ic_vaps);=0A= + struct ieee80211_scan_state *ss =3D ic->ic_scan;=0A= + struct ieee80211vap *vapscan =3D ss->ss_vap;=0A= +=0A= uint16_t hw;=0A= =0A= bus_dmamap_sync(sc->rxq.stat_dma.tag, sc->rxq.stat_dma.map,=0A= @@ -3153,8 +3276,10 @@=0A= __func__, desc->qid & 0xf, desc->idx, desc->flags,=0A= desc->type, iwn_intr_str(desc->type),=0A= le16toh(desc->len));=0A= -=0A= - if (!(desc->qid & 0x80)) /* Reply to a command. */=0A= + if (le16toh(desc->len) =3D=3D 8 && desc->qid =3D=3D 0)=0A= + DPRINTF(sc, IWN_DEBUG_RECV, "%s: strange inter values: 0x%08x\n",=0A= + __func__,le32toh(desc->len));=0A= + if (!(desc->qid & IWN_UNSOLICITED_RX_NOTIF)) /* Reply to a command. */=0A= iwn_cmd_done(sc, desc);=0A= =0A= switch (desc->type) {=0A= @@ -3188,6 +3313,10 @@=0A= struct iwn_beacon_missed *miss =3D=0A= (struct iwn_beacon_missed *)(desc + 1);=0A= int misses;=0A= + int iv_bmissthreshold;=0A= + int DoReinit =3D0 ;=0A= + struct ieee80211vap *vap0 =3D sc->ivap[IWN_RXON_BSS_CTX];=0A= + struct ieee80211vap *vap1 =3D sc->ivap[IWN_RXON_PAN_CTX];=0A= =0A= bus_dmamap_sync(sc->rxq.data_dmat, data->map,=0A= BUS_DMASYNC_POSTREAD);=0A= @@ -3194,17 +3323,31 @@=0A= misses =3D le32toh(miss->consecutive);=0A= =0A= DPRINTF(sc, IWN_DEBUG_STATE,=0A= - "%s: beacons missed %d/%d\n", __func__,=0A= - misses, le32toh(miss->total));=0A= + "%s: beacons missed %d/%d rcv %d expect %d\n", __func__,=0A= + misses, le32toh(miss->total), le32toh(miss->received),=0A= + le32toh(miss->expected));=0A= +=0A= + iv_bmissthreshold =3D vap0->iv_bmissthreshold;=0A= +=0A= + if(sc->ctx =3D=3D IWN_RXON_PAN_CTX) {=0A= + iv_bmissthreshold =3D vap1->iv_bmissthreshold;=0A= + if (vap0->iv_state =3D=3D IEEE80211_S_RUN &&=0A= + vap1->iv_state =3D=3D IEEE80211_S_RUN &&=0A= + (ic->ic_flags & IEEE80211_F_SCAN) =3D=3D 0)=0A= + DoReinit =3D 1;=0A= + }=0A= + else if (vap0->iv_state =3D=3D IEEE80211_S_RUN &&=0A= + (ic->ic_flags & IEEE80211_F_SCAN) =3D=3D 0)=0A= + DoReinit =3D 1;=0A= +=0A= /*=0A= * If more than 5 consecutive beacons are missed,=0A= * reinitialize the sensitivity state machine.=0A= */=0A= - if (vap->iv_state =3D=3D IEEE80211_S_RUN &&=0A= - (ic->ic_flags & IEEE80211_F_SCAN) =3D=3D 0) {=0A= + if (DoReinit=3D=3D1) {=0A= if (misses > 5)=0A= (void)iwn_init_sensitivity(sc);=0A= - if (misses >=3D vap->iv_bmissthreshold) {=0A= + if (misses >=3D iv_bmissthreshold) {=0A= IWN_UNLOCK(sc);=0A= ieee80211_beacon_miss(ic);=0A= IWN_LOCK(sc);=0A= @@ -3214,6 +3357,13 @@=0A= }=0A= case IWN_UC_READY:=0A= {=0A= +/**=0A= + * uCode issues this "alive" notification once the runtime image is = ready=0A= + * to receive commands from the driver. This is the *second* "alive"=0A= + * notification that the driver will receive after rebooting uCode;=0A= + * this "alive" is indicated by subtype field !=3D 9.=0A= + *=0A= + **/=0A= struct iwn_ucode_info *uc =3D=0A= (struct iwn_ucode_info *)(desc + 1);=0A= =0A= @@ -3240,6 +3390,8 @@=0A= }=0A= case IWN_STATE_CHANGED:=0A= {=0A= + uint32_t *status =3D (uint32_t *)(desc + 1);=0A= +=0A= /*=0A= * State change allows hardware switch change to be=0A= * noted. However, we handle this in iwn_intr as we=0A= @@ -3246,12 +3398,33 @@=0A= * get both the enable/disble intr.=0A= */=0A= bus_dmamap_sync(sc->rxq.data_dmat, data->map,=0A= - BUS_DMASYNC_POSTREAD);=0A= -#ifdef IWN_DEBUG=0A= - uint32_t *status =3D (uint32_t *)(desc + 1);=0A= - DPRINTF(sc, IWN_DEBUG_INTR, "state changed to %x\n",=0A= + BUS_DMASYNC_POSTREAD);=0A= + if (*status & (IWN_STATE_CHANGE_HW_CARD_DISABLED | = IWN_STATE_CHANGE_CT_CARD_DISABLED |IWN_STATE_CHANGE_SW_CARD_DISABLED)){=0A= + IWN_WRITE(sc, IWN_UCODE_GP1_SET, IWN_UCODE_GP1_CMD_BLOCKED);=0A= + IWN_WRITE(sc,IWN_TARG_MBX_C, 0x00000004);=0A= +=0A= + if (!(*status & IWN_STATE_CHANGE_RXON_CARD_DISABLED)) {=0A= + IWN_WRITE(sc, IWN_UCODE_GP1_CLR, IWN_UCODE_GP1_CMD_BLOCKED);=0A= + IWN_WRITE(sc, IWN_TARG_MBX_C, 0x00000004);=0A= + }=0A= + =0A= + if(*status & IWN_STATE_CHANGE_CT_CARD_DISABLED) {=0A= + device_printf(sc->sc_dev,"critical temp. reached\n");=0A= + /* XXX: enter CT kill */=0A= + }=0A= + } =0A= + if(!(*status & IWN_STATE_CHANGE_CT_CARD_DISABLED)){=0A= + callout_stop(&sc->ct_kill_exit_to);=0A= + /* XXX: exit CT kill */=0A= + }=0A= + /*=0A= + * State change allows hardware switch change to be=0A= + * noted. However, we handle this in iwn_intr as we=0A= + * get both the enable/disble intr.=0A= + */=0A= +=0A= + DPRINTF(sc, IWN_DEBUG_INTR, "state changed to %x\n",=0A= le32toh(*status));=0A= -#endif=0A= break;=0A= }=0A= case IWN_START_SCAN:=0A= @@ -3280,7 +3453,7 @@=0A= #endif=0A= =0A= IWN_UNLOCK(sc);=0A= - ieee80211_scan_next(vap);=0A= + ieee80211_scan_next(vapscan);=0A= IWN_LOCK(sc);=0A= break;=0A= }=0A= @@ -3292,6 +3465,9 @@=0A= sc->sc_flags |=3D IWN_FLAG_CALIB_DONE;=0A= wakeup(sc);=0A= break;=0A= + default:=0A= + DPRINTF(sc,IWN_DEBUG_INTR,"Interrupt type %d not managed\n",=0A= + desc->type);=0A= }=0A= =0A= sc->rxq.cur =3D (sc->rxq.cur + 1) % IWN_RX_RING_COUNT;=0A= @@ -3435,8 +3611,6 @@=0A= r2 =3D IWN_READ(sc, IWN_FH_INT);=0A= }=0A= =0A= - DPRINTF(sc, IWN_DEBUG_INTR, "interrupt reg1=3D0x%08x reg2=3D0x%08x\n"=0A= - , r1, r2);=0A= =0A= if (r1 =3D=3D 0 && r2 =3D=3D 0)=0A= goto done; /* Interrupt not for us. */=0A= @@ -3446,6 +3620,8 @@=0A= if (!(sc->sc_flags & IWN_FLAG_USE_ICT))=0A= IWN_WRITE(sc, IWN_FH_INT, r2);=0A= =0A= + DPRINTF(sc, IWN_DEBUG_INTR, "Acked interupt reg1=3D0x%08x = reg2=3D0x%08x\n", r1, r2);=0A= +=0A= if (r1 & IWN_INT_RF_TOGGLED) {=0A= iwn_rftoggle_intr(sc);=0A= goto done;=0A= @@ -3454,6 +3630,7 @@=0A= device_printf(sc->sc_dev, "%s: critical temperature reached!\n",=0A= __func__);=0A= }=0A= + /* Todo : Make separate action for HW Error and SW_error. SW Error = maybe require just a restart */=0A= if (r1 & (IWN_INT_SW_ERR | IWN_INT_HW_ERR)) {=0A= device_printf(sc->sc_dev, "%s: fatal firmware error\n",=0A= __func__);=0A= @@ -3583,6 +3760,7 @@=0A= bus_dma_segment_t *seg, segs[IWN_MAX_SCATTER];=0A= uint8_t tid, ridx, txant, type;=0A= int ac, i, totlen, error, pad, nsegs =3D 0, rate;=0A= + struct iwn_vap *ivp =3D IWN_VAP(vap);=0A= =0A= DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);=0A= =0A= @@ -3600,21 +3778,23 @@=0A= qos =3D 0;=0A= tid =3D 0;=0A= }=0A= - ac =3D M_WME_GETAC(m);=0A= - if (m->m_flags & M_AMPDU_MPDU) {=0A= +=0A= + if(ivp->ctx =3D=3D IWN_RXON_PAN_CTX)=0A= + ac =3D iwn_pan_ac_to_queue[M_WME_GETAC(m)];=0A= + else=0A= + ac =3D iwn_bss_ac_to_queue[M_WME_GETAC(m)];=0A= +=0A= + if (IEEE80211_QOS_HAS_SEQ(wh) &&=0A= + IEEE80211_AMPDU_RUNNING(&ni->ni_tx_ampdu[ac])) {=0A= struct ieee80211_tx_ampdu *tap =3D &ni->ni_tx_ampdu[ac];=0A= =0A= - if (!IEEE80211_AMPDU_RUNNING(tap)) {=0A= - m_freem(m);=0A= - return EINVAL;=0A= - }=0A= -=0A= - ac =3D *(int *)tap->txa_private;=0A= + ring =3D &sc->txq[*(int *)tap->txa_private];=0A= *(uint16_t *)wh->i_seq =3D=0A= htole16(ni->ni_txseqs[tid] << IEEE80211_SEQ_SEQ_SHIFT);=0A= ni->ni_txseqs[tid]++;=0A= - }=0A= - ring =3D &sc->txq[ac];=0A= + } else=0A= + ring =3D &sc->txq[ac];=0A= +=0A= desc =3D &ring->desc[ring->cur];=0A= data =3D &ring->data[ring->cur];=0A= =0A= @@ -3706,10 +3886,12 @@=0A= }=0A= }=0A= =0A= - if (IEEE80211_IS_MULTICAST(wh->i_addr1) ||=0A= - type !=3D IEEE80211_FC0_TYPE_DATA)=0A= - tx->id =3D sc->broadcast_id;=0A= - else=0A= + if (IEEE80211_IS_MULTICAST(wh->i_addr1) || type !=3D = IEEE80211_FC0_TYPE_DATA) {=0A= + if(ivp->ctx =3D=3D IWN_RXON_PAN_CTX)=0A= + tx->id =3D IWN_PAN_ID_BCAST;=0A= + else=0A= + tx->id =3D sc->broadcast_id;=0A= + } else=0A= tx->id =3D wn->id;=0A= =0A= if (type =3D=3D IEEE80211_FC0_TYPE_MGT) {=0A= @@ -3739,7 +3921,7 @@=0A= tx->data_ntries =3D 15;=0A= tx->lifetime =3D htole32(IWN_LIFETIME_INFINITE);=0A= tx->rate =3D iwn_rate_to_plcp(sc, ni, rate);=0A= - if (tx->id =3D=3D sc->broadcast_id) {=0A= + if ((tx->id =3D=3D IWN_PAN_ID_BCAST) || (tx->id =3D=3D = sc->broadcast_id)) {=0A= /* Group or management frame. */=0A= tx->linkq =3D 0;=0A= /* XXX Alternate between antenna A and B? */=0A= @@ -3771,7 +3953,7 @@=0A= return error;=0A= }=0A= /* Too many DMA segments, linearize mbuf. */=0A= - m1 =3D m_collapse(m, M_NOWAIT, IWN_MAX_SCATTER);=0A= + m1 =3D m_collapse(m, M_DONTWAIT, IWN_MAX_SCATTER);=0A= if (m1 =3D=3D NULL) {=0A= device_printf(sc->sc_dev,=0A= "%s: could not defrag mbuf\n", __func__);=0A= @@ -3856,7 +4038,7 @@=0A= u_int hdrlen;=0A= int ac, totlen, error, pad, nsegs =3D 0, i, rate;=0A= uint8_t ridx, type, txant;=0A= -=0A= + struct iwn_vap *ivp =3D IWN_VAP(vap);=0A= DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);=0A= =0A= IWN_LOCK_ASSERT(sc);=0A= @@ -3946,7 +4128,10 @@=0A= =0A= tx->len =3D htole16(totlen);=0A= tx->tid =3D 0;=0A= - tx->id =3D sc->broadcast_id;=0A= + if(ivp->ctx =3D=3D IWN_RXON_PAN_CTX)=0A= + tx->id =3D IWN_PAN_ID_BCAST;=0A= + else=0A= + tx->id =3D sc->broadcast_id;=0A= tx->rts_ntries =3D params->ibp_try1;=0A= tx->data_ntries =3D params->ibp_try0;=0A= tx->lifetime =3D htole32(IWN_LIFETIME_INFINITE);=0A= @@ -3956,12 +4141,10 @@=0A= if (ridx < IWN_RIDX_OFDM6 &&=0A= IEEE80211_IS_CHAN_2GHZ(ni->ni_chan))=0A= tx->rate |=3D htole32(IWN_RFLAG_CCK);=0A= -=0A= /* Group or management frame. */=0A= tx->linkq =3D 0;=0A= txant =3D IWN_LSB(sc->txchainmask);=0A= tx->rate |=3D htole32(IWN_RFLAG_ANT(txant));=0A= -=0A= /* Set physical address of "scratch area". */=0A= tx->loaddr =3D htole32(IWN_LOADDR(data->scratch_paddr));=0A= tx->hiaddr =3D IWN_HIADDR(data->scratch_paddr);=0A= @@ -3984,7 +4167,7 @@=0A= return error;=0A= }=0A= /* Too many DMA segments, linearize mbuf. */=0A= - m1 =3D m_collapse(m, M_NOWAIT, IWN_MAX_SCATTER);=0A= + m1 =3D m_collapse(m, M_DONTWAIT, IWN_MAX_SCATTER);=0A= if (m1 =3D=3D NULL) {=0A= device_printf(sc->sc_dev,=0A= "%s: could not defrag mbuf\n", __func__);=0A= @@ -4141,6 +4324,8 @@=0A= struct iwn_softc *sc =3D arg;=0A= struct ifnet *ifp =3D sc->sc_ifp;=0A= struct ieee80211com *ic =3D ifp->if_l2com;=0A= + struct ieee80211_scan_state *ss =3D ic->ic_scan;=0A= + struct ieee80211vap *vapscan =3D ss->ss_vap;=0A= =0A= IWN_LOCK_ASSERT(sc);=0A= =0A= @@ -4155,6 +4340,12 @@=0A= return;=0A= }=0A= }=0A= +=0A= + if (sc->sc_scan_timer > 0) {=0A= + if (--sc->sc_scan_timer =3D=3D 0)=0A= + ieee80211_scan_next(vapscan);=0A= + }=0A= +=0A= callout_reset(&sc->watchdog_to, hz, iwn_watchdog, sc);=0A= }=0A= =0A= @@ -4207,7 +4398,7 @@=0A= static int=0A= iwn_cmd(struct iwn_softc *sc, int code, const void *buf, int size, int = async)=0A= {=0A= - struct iwn_tx_ring *ring =3D &sc->txq[4];=0A= + struct iwn_tx_ring *ring ;=0A= struct iwn_tx_desc *desc;=0A= struct iwn_tx_data *data;=0A= struct iwn_tx_cmd *cmd;=0A= @@ -4214,12 +4405,25 @@=0A= struct mbuf *m;=0A= bus_addr_t paddr;=0A= int totlen, error;=0A= + int cmd_queue_num;=0A= =0A= + if((sc->uc_scan_progress =3D=3D 1) && (code !=3D IWN_CMD_SCAN)) {=0A= + DPRINTF(sc,IWN_DEBUG_CMD,"Scanning in progress..not sending cmd = %x.\n",code);=0A= + return 0;=0A= + }=0A= +=0A= DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);=0A= =0A= if (async =3D=3D 0)=0A= IWN_LOCK_ASSERT(sc);=0A= =0A= + if(sc->sc_flags & IWN_FLAG_PAN_SUPPORT)=0A= + cmd_queue_num =3D IWN_PAN_CMD_QUEUE;=0A= + else=0A= + cmd_queue_num =3D IWN_CMD_QUEUE_NUM;=0A= +=0A= + ring =3D &sc->txq[cmd_queue_num];=0A= +=0A= desc =3D &ring->desc[ring->cur];=0A= data =3D &ring->data[ring->cur];=0A= totlen =3D 4 + size;=0A= @@ -4228,7 +4432,7 @@=0A= /* Command is too large to fit in a descriptor. */=0A= if (totlen > MCLBYTES)=0A= return EINVAL;=0A= - m =3D m_getjcl(M_NOWAIT, MT_DATA, M_PKTHDR, MJUMPAGESIZE);=0A= + m =3D m_getjcl(M_DONTWAIT, MT_DATA, M_PKTHDR, MJUMPAGESIZE);=0A= if (m =3D=3D NULL)=0A= return ENOMEM;=0A= cmd =3D mtod(m, struct iwn_tx_cmd *);=0A= @@ -4303,7 +4507,14 @@=0A= {=0A= =0A= DPRINTF(sc, IWN_DEBUG_TRACE, "->Doing %s\n", __func__);=0A= -=0A= + if (node->control =3D=3D 0)=0A= + DPRINTF(sc, IWN_DEBUG_NODE, =0A= + "Adding node id : %d MAC : %6D flags: 0x%x\n", node->id,=0A= + node->macaddr,":", node->flags);=0A= + else=0A= + DPRINTF(sc, IWN_DEBUG_NODE, =0A= + "Updating node id : %d MAC : %6D flags: 0x%x\n", node->id,=0A= + node->macaddr,":", node->flags);=0A= /* Direct mapping. */=0A= return iwn_cmd(sc, IWN_CMD_ADD_NODE, node, sizeof (*node), async);=0A= }=0A= @@ -4311,6 +4522,10 @@=0A= static int=0A= iwn_set_link_quality(struct iwn_softc *sc, struct ieee80211_node *ni)=0A= {=0A= +=0A= + DPRINTF(sc,IWN_DEBUG_RESET,"Disabled %s reached\n",__func__);=0A= + return 0;=0A= +=0A= #define RV(v) ((v) & IEEE80211_RATE_VAL)=0A= struct iwn_node *wn =3D (void *)ni;=0A= struct ieee80211_rateset *rs =3D &ni->ni_rates;=0A= @@ -4456,7 +4671,8 @@=0A= }=0A= =0A= static void=0A= -iwn_set_led(struct iwn_softc *sc, uint8_t which, uint8_t off, uint8_t = on)=0A= +iwn_set_led(struct iwn_softc *sc, uint8_t which, uint8_t off, uint8_t = on,=0A= + uint8_t mode)=0A= {=0A= struct iwn_cmd_led led;=0A= =0A= @@ -4466,7 +4682,12 @@=0A= IWN_CLRBITS(sc, IWN_LED, IWN_LED_BSM_CTRL);=0A= =0A= led.which =3D which;=0A= - led.unit =3D htole32(10000); /* on/off in unit of 100ms */=0A= +=0A= + if(mode =3D=3D IWN_LED_SLOW_BLINK)=0A= + led.unit =3D htole32(IWN_LED_UNIT * 5); /* on/off in unit of 10ms */=0A= + else=0A= + led.unit =3D htole32(IWN_LED_UNIT);=0A= +=0A= led.off =3D off;=0A= led.on =3D on;=0A= (void)iwn_cmd(sc, IWN_CMD_SET_LED, &led, sizeof led, 1);=0A= @@ -4480,21 +4701,30 @@=0A= iwn_set_critical_temp(struct iwn_softc *sc)=0A= {=0A= struct iwn_critical_temp crit;=0A= - int32_t temp;=0A= + int32_t ct_enter,ct_exit;=0A= =0A= DPRINTF(sc, IWN_DEBUG_TRACE, "->Doing %s\n", __func__);=0A= =0A= IWN_WRITE(sc, IWN_UCODE_GP1_CLR, IWN_UCODE_GP1_CTEMP_STOP_RF);=0A= =0A= - if (sc->hw_type =3D=3D IWN_HW_REV_TYPE_5150)=0A= - temp =3D (IWN_CTOK(110) - sc->temp_off) * -5;=0A= - else if (sc->hw_type =3D=3D IWN_HW_REV_TYPE_4965)=0A= - temp =3D IWN_CTOK(110);=0A= - else=0A= - temp =3D 110;=0A= + ct_enter =3D IWN_CT_KILL_THRESHOLD;=0A= + ct_exit =3D IWN_CT_KILL_EXIT_THRESHOLD;=0A= +=0A= + if (sc->hw_type =3D=3D IWN_HW_REV_TYPE_5150) {=0A= + ct_enter =3D (IWN_CTOK(IWN_CT_KILL_THRESHOLD) - sc->temp_off) * -5;=0A= + ct_exit =3D 0;=0A= + } else if (sc->hw_type =3D=3D IWN_HW_REV_TYPE_4965) {=0A= + ct_enter =3D IWN_CTOK(IWN_CT_KILL_THRESHOLD);=0A= + ct_exit =3D 0;=0A= + } else {=0A= + ct_enter =3D IWN_CT_KILL_THRESHOLD;=0A= + ct_exit =3D IWN_CT_KILL_EXIT_THRESHOLD;=0A= + }=0A= +=0A= memset(&crit, 0, sizeof crit);=0A= - crit.tempR =3D htole32(temp);=0A= - DPRINTF(sc, IWN_DEBUG_RESET, "setting critical temp to %d\n", temp);=0A= + crit.tempR =3D htole32(ct_enter);=0A= + crit.tempM =3D htole32(ct_exit);=0A= + DPRINTF(sc, IWN_DEBUG_RESET, "setting critical temp to %d and exit to = %d \n", ct_enter,ct_exit);=0A= return iwn_cmd(sc, IWN_CMD_SET_CRITICAL_TEMP, &crit, sizeof crit, 0);=0A= }=0A= =0A= @@ -4516,10 +4746,12 @@=0A= mod =3D le64toh(cmd.tstamp) % val;=0A= cmd.binitval =3D htole32((uint32_t)(val - mod));=0A= =0A= +// cmd.dtim_period=3D1; //XXX It's defined in linux kernel=0A= +=0A= DPRINTF(sc, IWN_DEBUG_RESET, "timing bintval=3D%u tstamp=3D%ju, = init=3D%u\n",=0A= - ni->ni_intval, le64toh(cmd.tstamp), (uint32_t)(val - mod));=0A= + le16toh(cmd.bintval), le64toh(cmd.tstamp), (uint32_t)(val - mod));=0A= =0A= - return iwn_cmd(sc, IWN_CMD_TIMING, &cmd, sizeof cmd, 1);=0A= + return iwn_cmd(sc, IWN_CMD_TIMING | IWN_DEBUG_RESET, &cmd, sizeof cmd, = 0);=0A= }=0A= =0A= static void=0A= @@ -4696,6 +4928,11 @@=0A= #undef fdivround=0A= }=0A= =0A= +/*=0A= + * Set TX power for current channel (each rate has its own power = settings).=0A= + * This function takes into account the regulatory information from = EEPROM,=0A= + * the current temperature and the current voltage.=0A= + */=0A= static int=0A= iwn5000_set_txpower(struct iwn_softc *sc, struct ieee80211_channel *ch,=0A= int async)=0A= @@ -4751,19 +4988,22 @@=0A= {=0A= struct iwn5000_rx_phystat *phy =3D (void *)stat->phybuf;=0A= uint8_t agc;=0A= - int rssi;=0A= + int rssi, rssi_a, rssi_b, rssi_c;=0A= =0A= DPRINTF(sc, IWN_DEBUG_TRACE, "->Doing %s\n", __func__);=0A= =0A= - agc =3D (le32toh(phy->agc) >> 9) & 0x7f;=0A= + agc =3D (le32toh(phy->agc) >> 9) & 0x7f; /* 0x7f =3D=3D (0xfe00 >> 9) = */=0A= =0A= - rssi =3D MAX(le16toh(phy->rssi[0]) & 0xff,=0A= - le16toh(phy->rssi[1]) & 0xff);=0A= - rssi =3D MAX(le16toh(phy->rssi[2]) & 0xff, rssi);=0A= + rssi_a =3D le16toh(phy->rssi[0]) & 0xff;=0A= + rssi_b =3D le16toh(phy->rssi[1]) & 0xff;=0A= + rssi_c =3D le16toh(phy->rssi[2]) & 0xff;=0A= =0A= + rssi =3D MAX(rssi_a, rssi_b); =0A= + rssi =3D MAX(rssi_c, rssi);=0A= +=0A= DPRINTF(sc, IWN_DEBUG_RECV,=0A= - "%s: agc %d rssi %d %d %d result %d\n", __func__, agc,=0A= - phy->rssi[0], phy->rssi[1], phy->rssi[2],=0A= + "%s: agc %d rssi ANT_A:%d ANT_B:%d ANT_C:%d result %d dBm\n", = __func__, agc,=0A= + rssi_a, rssi_b, rssi_c,=0A= rssi - agc - IWN_RSSI_TO_DBM);=0A= return rssi - agc - IWN_RSSI_TO_DBM;=0A= }=0A= @@ -4833,6 +5073,8 @@=0A= temp =3D (temp / -5) + sc->temp_off;=0A= temp =3D IWN_KTOC(temp);=0A= }=0A= + DPRINTF(sc,IWN_DEBUG_CALIBRATE,"Temperature %d\n",temp);=0A= + //XXX: handle thermal throttling state machine=0A= return temp;=0A= }=0A= =0A= @@ -4844,7 +5086,6 @@=0A= {=0A= struct iwn_ops *ops =3D &sc->ops;=0A= struct iwn_calib_state *calib =3D &sc->calib;=0A= - uint32_t flags;=0A= int error;=0A= =0A= DPRINTF(sc, IWN_DEBUG_TRACE, "->Doing %s\n", __func__);=0A= @@ -4858,9 +5099,10 @@=0A= calib->ofdm_mrc_x1 =3D sc->limits->min_ofdm_mrc_x1;=0A= calib->ofdm_x4 =3D sc->limits->min_ofdm_x4;=0A= calib->ofdm_mrc_x4 =3D sc->limits->min_ofdm_mrc_x4;=0A= - calib->cck_x4 =3D 125;=0A= + calib->cck_x4 =3D sc->limits->min_cck_x4;=0A= calib->cck_mrc_x4 =3D sc->limits->min_cck_mrc_x4;=0A= calib->energy_cck =3D sc->limits->energy_cck;=0A= + calib->corr_barker_mrc =3D sc->limits->min_corr_barker_mrc;=0A= =0A= /* Write initial sensitivity. */=0A= if ((error =3D iwn_send_sensitivity(sc)) !=3D 0)=0A= @@ -4871,10 +5113,7 @@=0A= return error;=0A= =0A= /* Request statistics at each beacon interval. */=0A= - flags =3D 0;=0A= - DPRINTF(sc, IWN_DEBUG_CALIBRATE, "%s: sending request for = statistics\n",=0A= - __func__);=0A= - return iwn_cmd(sc, IWN_CMD_GET_STATISTICS, &flags, sizeof flags, 1);=0A= + return iwn_set_statistics_request(sc,true,false,1);=0A= }=0A= =0A= /*=0A= @@ -5217,15 +5456,15 @@=0A= cmd.corr_ofdm_mrc_x1 =3D htole16(calib->ofdm_mrc_x1);=0A= cmd.corr_ofdm_x4 =3D htole16(calib->ofdm_x4);=0A= cmd.corr_ofdm_mrc_x4 =3D htole16(calib->ofdm_mrc_x4);=0A= - cmd.energy_ofdm =3D htole16(sc->limits->energy_ofdm);=0A= - cmd.energy_ofdm_th =3D htole16(62);=0A= + cmd.energy_ofdm =3D htole16(calib->energy_ofdm);=0A= + cmd.energy_ofdm_th =3D htole16(62); //Value doesn't change in = linux Kernel=0A= /* CCK modulation. */=0A= cmd.corr_cck_x4 =3D htole16(calib->cck_x4);=0A= cmd.corr_cck_mrc_x4 =3D htole16(calib->cck_mrc_x4);=0A= cmd.energy_cck =3D htole16(calib->energy_cck);=0A= /* Barker modulation: use default values. */=0A= - cmd.corr_barker =3D htole16(190);=0A= - cmd.corr_barker_mrc =3D htole16(390);=0A= + cmd.corr_barker =3D htole16(190); //Value doesn't change in = linux Kernel=0A= + cmd.corr_barker_mrc =3D htole16(calib->corr_barker_mrc);=0A= =0A= DPRINTF(sc, IWN_DEBUG_CALIBRATE,=0A= "%s: set sensitivity %d/%d/%d/%d/%d/%d/%d\n", __func__,=0A= @@ -5252,6 +5491,8 @@=0A= /*=0A= * Set STA mode power saving level (between 0 and 5).=0A= * Level 0 is CAM (Continuously Aware Mode), 5 is for maximum power = saving.=0A= + * DTIM value passed in will if so configured, be ignored and taken from=0A= + * the value set at the AP.=0A= */=0A= static int=0A= iwn_set_pslevel(struct iwn_softc *sc, int dtim, int level, int async)=0A= @@ -5260,8 +5501,25 @@=0A= const struct iwn_pmgt *pmgt;=0A= uint32_t max, skip_dtim;=0A= uint32_t reg;=0A= - int i;=0A= + int i, retval;=0A= + struct ifnet *ifp =3D sc->sc_ifp;=0A= + struct ieee80211com *ic =3D ifp->if_l2com;=0A= =0A= + if(!TAILQ_EMPTY(&ic->ic_vaps)) {=0A= + /* At present the driver supports only a single vap. */=0A= + struct ieee80211vap *vap =3D TAILQ_FIRST(&ic->ic_vaps);=0A= +=0A= + /* XXX confirm PS level setting validity for various modes */=0A= + if(vap->iv_opmode =3D=3D IEEE80211_M_HOSTAP ||=0A= + vap->iv_opmode =3D=3D IEEE80211_M_MONITOR)=0A= + return 0;=0A= +=0A= + #ifdef IWN_DTIM_INDICATES_UNICAST_PENDING_AT_AP=0A= + if (vap->iv_state =3D=3D IEEE80211_S_RUN)=0A= + dtim =3D vap->iv_bss->ni_dtim_period;=0A= + #endif=0A= + }=0A= +=0A= DPRINTF(sc, IWN_DEBUG_PWRSAVE,=0A= "%s: dtim=3D%d, level=3D%d, async=3D%d\n",=0A= __func__,=0A= @@ -5279,7 +5537,7 @@=0A= =0A= memset(&cmd, 0, sizeof cmd);=0A= if (level !=3D 0) /* not CAM */=0A= - cmd.flags |=3D htole16(IWN_PS_ALLOW_SLEEP);=0A= + cmd.flags |=3D = htole16(IWN_PS_ALLOW_SLEEP)|htole16(IWN_PS_ADVANCED_PM);=0A= if (level =3D=3D 5)=0A= cmd.flags |=3D htole16(IWN_PS_FAST_PD);=0A= /* Retrieve PCIe Active State Power Management (ASPM). */=0A= @@ -5306,9 +5564,18 @@=0A= for (i =3D 0; i < 5; i++)=0A= cmd.intval[i] =3D htole32(MIN(max, pmgt->intval[i]));=0A= =0A= - DPRINTF(sc, IWN_DEBUG_RESET, "setting power saving level to %d\n",=0A= + DPRINTF(sc, IWN_DEBUG_PWRSAVE, "setting power saving level to %d\n",=0A= level);=0A= - return iwn_cmd(sc, IWN_CMD_SET_POWER_MODE, &cmd, sizeof cmd, async);=0A= + retval =3D iwn_cmd(sc, IWN_CMD_SET_POWER_MODE, &cmd, sizeof cmd, = async);=0A= + /*=0A= + * XXX: update current_pwrsave_level using completion notification=0A= + * in case of async mode=0A= + */=0A= + if(retval=3D=3D0)=0A= + sc->current_pwrsave_level =3D level;=0A= +=0A= + return retval;=0A= +=0A= }=0A= =0A= static int=0A= @@ -5333,26 +5600,63 @@=0A= 0xcc00ff28, 0x0000aaaa, 0xcc00aaaa, 0x0000aaaa,=0A= 0xc0004000, 0x00004000, 0xf0005000, 0xf0005000,=0A= };=0A= +=0A= struct iwn6000_btcoex_config btconfig;=0A= + struct iwn2000_btcoex_config btconfig2k;=0A= struct iwn_btcoex_priotable btprio;=0A= struct iwn_btcoex_prot btprot;=0A= int error, i;=0A= + uint8_t flags;=0A= =0A= memset(&btconfig, 0, sizeof btconfig);=0A= - btconfig.flags =3D 145;=0A= - btconfig.max_kill =3D 5;=0A= - btconfig.bt3_t7_timer =3D 1;=0A= - btconfig.kill_ack =3D htole32(0xffff0000);=0A= - btconfig.kill_cts =3D htole32(0xffff0000);=0A= - btconfig.sample_time =3D 2;=0A= - btconfig.bt3_t2_timer =3D 0xc;=0A= - for (i =3D 0; i < 12; i++)=0A= - btconfig.lookup_table[i] =3D htole32(btcoex_3wire[i]);=0A= - btconfig.valid =3D htole16(0xff);=0A= - btconfig.prio_boost =3D 0xf0;=0A= - DPRINTF(sc, IWN_DEBUG_RESET,=0A= - "%s: configuring advanced bluetooth coexistence\n", __func__);=0A= - error =3D iwn_cmd(sc, IWN_CMD_BT_COEX, &btconfig, sizeof(btconfig), 1);=0A= + memset(&btconfig2k, 0, sizeof btconfig2k);=0A= +=0A= + flags =3D IWN_BT_FLAG_COEX6000_MODE_3W << = IWN_BT_FLAG_COEX6000_MODE_SHIFT; // Done as is in linux kernel 3.2=0A= +=0A= + if (sc->base_params->bt_sco_disable)=0A= + flags &=3D ~IWN_BT_FLAG_SYNC_2_BT_DISABLE; =0A= + else=0A= + flags |=3D IWN_BT_FLAG_SYNC_2_BT_DISABLE; =0A= +=0A= + flags |=3D IWN_BT_FLAG_COEX6000_CHAN_INHIBITION;=0A= +=0A= +=0A= + /* Default flags result is 145 as old value */=0A= +=0A= + /* Flags value has to be review. Values must change if we which to = disable it */=0A= + if (sc->base_params->bt_session_2) {=0A= + btconfig2k.flags =3D flags; =0A= + btconfig2k.max_kill =3D 5;=0A= + btconfig2k.bt3_t7_timer =3D 1;=0A= + btconfig2k.kill_ack =3D htole32(0xffff0000);=0A= + btconfig2k.kill_cts =3D htole32(0xffff0000);=0A= + btconfig2k.sample_time =3D 2;=0A= + btconfig2k.bt3_t2_timer =3D 0xc;=0A= +=0A= + for (i =3D 0; i < 12; i++)=0A= + btconfig2k.lookup_table[i] =3D htole32(btcoex_3wire[i]);=0A= + btconfig2k.valid =3D htole16(0xff);=0A= + btconfig2k.prio_boost =3D htole32(0xf0);=0A= + DPRINTF(sc, IWN_DEBUG_RESET,=0A= + "%s: configuring advanced bluetooth coexistence session 2, flags : = 0X%x\n", __func__,flags);=0A= + error =3D iwn_cmd(sc, IWN_CMD_BT_COEX, &btconfig2k, = sizeof(btconfig2k), 1);=0A= + } else {=0A= + btconfig.flags =3D flags;=0A= + btconfig.max_kill =3D 5;=0A= + btconfig.bt3_t7_timer =3D 1;=0A= + btconfig.kill_ack =3D htole32(0xffff0000);=0A= + btconfig.kill_cts =3D htole32(0xffff0000);=0A= + btconfig.sample_time =3D 2;=0A= + btconfig.bt3_t2_timer =3D 0xc;=0A= +=0A= + for (i =3D 0; i < 12; i++)=0A= + btconfig.lookup_table[i] =3D htole32(btcoex_3wire[i]);=0A= + btconfig.valid =3D htole16(0xff);=0A= + btconfig.prio_boost =3D 0xf0;=0A= + DPRINTF(sc, IWN_DEBUG_RESET,=0A= + "%s: configuring advanced bluetooth coexistence, flags : 0X%x\n", = __func__,flags);=0A= + error =3D iwn_cmd(sc, IWN_CMD_BT_COEX, &btconfig, sizeof(btconfig), = 1);=0A= + }=0A= if (error !=3D 0)=0A= return error;=0A= =0A= @@ -5383,19 +5687,6 @@=0A= }=0A= =0A= static int=0A= -iwn5000_runtime_calib(struct iwn_softc *sc)=0A= -{=0A= - struct iwn5000_calib_config cmd;=0A= -=0A= - memset(&cmd, 0, sizeof cmd);=0A= - cmd.ucode.once.enable =3D 0xffffffff;=0A= - cmd.ucode.once.start =3D IWN5000_CALIB_DC;=0A= - DPRINTF(sc, IWN_DEBUG_CALIBRATE,=0A= - "%s: configuring runtime calibration\n", __func__);=0A= - return iwn_cmd(sc, IWN5000_CMD_CALIB_CONFIG, &cmd, sizeof(cmd), 0);=0A= -}=0A= -=0A= -static int=0A= iwn_config(struct iwn_softc *sc)=0A= {=0A= struct iwn_ops *ops =3D &sc->ops;=0A= @@ -5407,8 +5698,12 @@=0A= =0A= DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);=0A= =0A= - if (sc->hw_type =3D=3D IWN_HW_REV_TYPE_6005) {=0A= - /* Set radio temperature sensor offset. */=0A= + if ((sc->base_params->calib_need & IWN_FLG_NEED_PHY_CALIB_TEMP_OFFSET) = && (sc->base_params->calib_need & = IWN_FLG_NEED_PHY_CALIB_TEMP_OFFSETv2)) {=0A= + device_printf(sc->sc_dev,"%s: temp_offset and temp_offsetv2 are = exclusive each together. Review NIC config file. Conf : 0x%08x Flags : = 0x%08x \n", = __func__,sc->base_params->calib_need,(IWN_FLG_NEED_PHY_CALIB_TEMP_OFFSET = | IWN_FLG_NEED_PHY_CALIB_TEMP_OFFSETv2));=0A= + return EINVAL;=0A= + }=0A= + /* Compute temperature calib if needed. Will be send by send calib */=0A= + if (sc->base_params->calib_need & IWN_FLG_NEED_PHY_CALIB_TEMP_OFFSET) {=0A= error =3D iwn5000_temp_offset_calib(sc);=0A= if (error !=3D 0) {=0A= device_printf(sc->sc_dev,=0A= @@ -5415,19 +5710,28 @@=0A= "%s: could not set temperature offset\n", __func__);=0A= return error;=0A= }=0A= - }=0A= -=0A= - if (sc->hw_type =3D=3D IWN_HW_REV_TYPE_6050) {=0A= - /* Configure runtime DC calibration. */=0A= - error =3D iwn5000_runtime_calib(sc);=0A= + } else if (sc->base_params->calib_need & = IWN_FLG_NEED_PHY_CALIB_TEMP_OFFSETv2) {=0A= + error =3D iwn5000_temp_offset_calibv2(sc);=0A= if (error !=3D 0) {=0A= device_printf(sc->sc_dev,=0A= - "%s: could not configure runtime calibration\n",=0A= - __func__);=0A= + "%s: could not compute temperature offset v2\n", __func__);=0A= return error;=0A= }=0A= }=0A= =0A= + /* Configure bluetooth coexistence. */=0A= + if (sc->base_params->advanced_bt_coexist) =0A= + error =3D iwn_send_advanced_btcoex(sc);=0A= + else=0A= + error =3D iwn_send_btcoex(sc);=0A= +=0A= + if (error !=3D 0) {=0A= + device_printf(sc->sc_dev,=0A= + "%s: could not configure bluetooth coexistence, error %d\n",=0A= + __func__, error);=0A= + return error;=0A= + }=0A= +=0A= /* Configure valid TX chains for >=3D5000 Series. */=0A= if (sc->hw_type !=3D IWN_HW_REV_TYPE_4965) {=0A= txmask =3D htole32(sc->txchainmask);=0A= @@ -5443,17 +5747,6 @@=0A= }=0A= }=0A= =0A= - /* Configure bluetooth coexistence. */=0A= - if (sc->sc_flags & IWN_FLAG_ADV_BTCOEX)=0A= - error =3D iwn_send_advanced_btcoex(sc);=0A= - else=0A= - error =3D iwn_send_btcoex(sc);=0A= - if (error !=3D 0) {=0A= - device_printf(sc->sc_dev,=0A= - "%s: could not configure bluetooth coexistence, error %d\n",=0A= - __func__, error);=0A= - return error;=0A= - }=0A= =0A= /* Set mode, channel, RX filter and enable RX. */=0A= sc->rxon =3D &sc->rx_on[IWN_RXON_BSS_CTX];=0A= @@ -5515,8 +5808,18 @@=0A= return error;=0A= }=0A= =0A= - /* Set power saving level to CAM during initialization. */=0A= - if ((error =3D iwn_set_pslevel(sc, 0, 0, 0)) !=3D 0) {=0A= + /*=0A= + * Any vap's iv_flags are cloned from ic->ic_flags. Setting the flags=0A= + * on ic will allow a vap to get the correct powersave level once=0A= + * it is created.=0A= + */=0A= + if(sc->desired_pwrsave_level!=3DIWN_POWERSAVE_LVL_NONE)=0A= + ic->ic_flags |=3D IEEE80211_F_PMGTON;=0A= + else=0A= + ic->ic_flags &=3D ~IEEE80211_F_PMGTON;=0A= +=0A= + if ((error =3D iwn_set_pslevel(sc, IWN_POWERSAVE_DTIM_VOIP_COMPATIBLE,=0A= + sc->desired_pwrsave_level, 0)) !=3D 0) {=0A= device_printf(sc->sc_dev,=0A= "%s: could not set power saving level\n", __func__);=0A= return error;=0A= @@ -5557,10 +5860,20 @@=0A= uint16_t rxchain;=0A= uint8_t txant;=0A= int buflen, error;=0A= + uint8_t new_scan_threshold;=0A= + struct iwn_eeprom_chan *channel;=0A= =0A= DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);=0A= =0A= - sc->rxon =3D &sc->rx_on[IWN_RXON_BSS_CTX];=0A= +=0A= + struct ieee80211vap *vap =3D ni->ni_vap;=0A= + struct iwn_vap *ivp =3D IWN_VAP(vap);=0A= +=0A= + if(ivp->ctx =3D=3D IWN_RXON_BSS_CTX)=0A= + sc->rxon =3D &sc->rx_on[IWN_RXON_BSS_CTX];=0A= + else if(ivp->ctx =3D=3D IWN_RXON_PAN_CTX)=0A= + sc->rxon =3D &sc->rx_on[IWN_RXON_PAN_CTX];=0A= +=0A= buf =3D malloc(IWN_SCAN_MAXSZ, M_DEVBUF, M_NOWAIT | M_ZERO);=0A= if (buf =3D=3D NULL) {=0A= device_printf(sc->sc_dev,=0A= @@ -5592,7 +5905,11 @@=0A= =0A= tx =3D (struct iwn_cmd_data *)(hdr + 1);=0A= tx->flags =3D htole32(IWN_TX_AUTO_SEQ);=0A= - tx->id =3D sc->broadcast_id;=0A= + if(ivp->ctx =3D=3D IWN_RXON_PAN_CTX)=0A= + tx->id =3D IWN_PAN_ID_BCAST;=0A= + else=0A= + tx->id =3D sc->broadcast_id;=0A= +=0A= tx->lifetime =3D htole32(IWN_LIFETIME_INFINITE);=0A= =0A= if (IEEE80211_IS_CHAN_5GHZ(ic->ic_curchan)) {=0A= @@ -5629,7 +5946,7 @@=0A= IEEE80211_FC0_SUBTYPE_PROBE_REQ;=0A= wh->i_fc[1] =3D IEEE80211_FC1_DIR_NODS;=0A= IEEE80211_ADDR_COPY(wh->i_addr1, ifp->if_broadcastaddr);=0A= - IEEE80211_ADDR_COPY(wh->i_addr2, IF_LLADDR(ifp));=0A= + IEEE80211_ADDR_COPY(wh->i_addr2, ivp->macaddr);=0A= IEEE80211_ADDR_COPY(wh->i_addr3, ifp->if_broadcastaddr);=0A= *(uint16_t *)&wh->i_dur[0] =3D 0; /* filled by HW */=0A= *(uint16_t *)&wh->i_seq[0] =3D 0; /* filled by HW */=0A= @@ -5651,36 +5968,61 @@=0A= chan->flags =3D 0;=0A= if (ss->ss_nssid > 0)=0A= chan->flags |=3D htole32(IWN_CHAN_NPBREQS(1));=0A= - chan->dsp_gain =3D 0x6e;=0A= - if (IEEE80211_IS_CHAN_5GHZ(c) &&=0A= - !(c->ic_flags & IEEE80211_CHAN_PASSIVE)) {=0A= - chan->rf_gain =3D 0x3b;=0A= - chan->active =3D htole16(24);=0A= - chan->passive =3D htole16(110);=0A= - chan->flags |=3D htole32(IWN_CHAN_ACTIVE);=0A= - } else if (IEEE80211_IS_CHAN_5GHZ(c)) {=0A= - chan->rf_gain =3D 0x3b;=0A= - chan->active =3D htole16(24);=0A= - if (sc->rxon->associd)=0A= - chan->passive =3D htole16(78);=0A= + /*=0A= + * If active scanning is requested but a certain channel is=0A= + * marked passive, we can do active scanning if we detect=0A= + * transmissions.=0A= + *=0A= + * There is an issue with some firmware versions that triggers=0A= + * a sysassert on a "good CRC threshold" of zero (=3D=3D disabled),=0A= + * on a radar channel even though this means that we should NOT=0A= + * send probes.=0A= + *=0A= + * The "good CRC threshold" is the number of frames that we=0A= + * need to receive during our dwell time on a channel before=0A= + * sending out probes -- setting this to a huge value will=0A= + * mean we never reach it, but at the same time work around=0A= + * the aforementioned issue. Thus use IWN_SCAN_CRC_TH_NEVER=0A= + * here instead of IWN_SCAN_CRC_TH_DISABLED.=0A= + *=0A= + * This was fixed in later versions along with some other=0A= + * scan changes, and the threshold behaves as a flag in those=0A= + * versions.=0A= + */=0A= +=0A= + channel =3D iwn_find_eeprom_channel(sc, c);=0A= + if (channel =3D=3D NULL) {=0A= + if_printf(ic->ic_ifp,=0A= + "%s: invalid channel %u freq %u/0x%x\n",=0A= + __func__, c->ic_ieee, c->ic_freq, c->ic_flags);=0A= + return EINVAL;=0A= + }=0A= +=0A= + new_scan_threshold =3D ((sc->tlv_feature_flags &=0A= + (1<> = IWN_FW_TLV_FLAGS_NEW_SCAN_BITPOS);=0A= +=0A= + /* Selection criteria for Active/Passive scanning */=0A= + if ((ss->ss_nssid =3D=3D 0) || ((channel->flags & = IWN_EEPROM_CHAN_ACTIVE) =3D=3D 0) ||=0A= + (c->ic_flags & IEEE80211_CHAN_PASSIVE)) {=0A= + chan->flags |=3D htole32(IWN_CHAN_PASSIVE);=0A= + if (new_scan_threshold =3D=3D 1)=0A= + hdr->crc_threshold =3D IWN_SCAN_CRC_TH_DISABLED;=0A= else=0A= - chan->passive =3D htole16(110);=0A= - hdr->crc_threshold =3D 0xffff;=0A= - } else if (!(c->ic_flags & IEEE80211_CHAN_PASSIVE)) {=0A= - chan->rf_gain =3D 0x28;=0A= - chan->active =3D htole16(36);=0A= - chan->passive =3D htole16(120);=0A= + hdr->crc_threshold =3D IWN_SCAN_CRC_TH_NEVER;=0A= + } else {=0A= chan->flags |=3D htole32(IWN_CHAN_ACTIVE);=0A= - } else {=0A= - chan->rf_gain =3D 0x28;=0A= - chan->active =3D htole16(36);=0A= - if (sc->rxon->associd)=0A= - chan->passive =3D htole16(88);=0A= - else=0A= - chan->passive =3D htole16(120);=0A= - hdr->crc_threshold =3D 0xffff;=0A= + hdr->crc_threshold =3D IWN_SCAN_CRC_TH_DEFAULT;=0A= }=0A= =0A= + chan->dsp_gain =3D 0x6e;=0A= + if (IEEE80211_IS_CHAN_5GHZ(c))=0A= + chan->rf_gain =3D 0x3b;=0A= + else=0A= + chan->rf_gain =3D 0x28;=0A= +=0A= + chan->active =3D htole16(iwn_get_active_dwell(sc, c));=0A= + chan->passive =3D htole16(iwn_get_passive_dwell(sc, c));=0A= +=0A= DPRINTF(sc, IWN_DEBUG_STATE,=0A= "%s: chan %u flags 0x%x rf_gain 0x%x "=0A= "dsp_gain 0x%x active 0x%x passive 0x%x\n", __func__,=0A= @@ -5694,6 +6036,9 @@=0A= =0A= DPRINTF(sc, IWN_DEBUG_STATE, "sending scan command nchan=3D%d\n",=0A= hdr->nchan);=0A= +=0A= + sc->sc_scan_timer =3D IWN_SCAN_CHAN_TIMEOUT;=0A= +=0A= error =3D iwn_cmd(sc, IWN_CMD_SCAN, buf, buflen, 1);=0A= free(buf, M_DEVBUF);=0A= =0A= @@ -5781,9 +6126,18 @@=0A= DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);=0A= =0A= sc->rxon =3D &sc->rx_on[IWN_RXON_BSS_CTX];=0A= +=0A= + if(sc->ctx =3D=3D IWN_RXON_PAN_CTX) {=0A= + if ((error =3D iwn_set_pan_params(sc)) !=3D 0) {=0A= + device_printf(sc->sc_dev,=0A= + "%s: iwn_set_pan_params error %d\n", __func__, error);=0A= + return error;=0A= + }=0A= + }=0A= +=0A= if (ic->ic_opmode =3D=3D IEEE80211_M_MONITOR) {=0A= /* Link LED blinks while monitoring. */=0A= - iwn_set_led(sc, IWN_LED_LINK, 5, 5);=0A= + iwn_set_led(sc, IWN_LED_LINK, 5, 5,IWN_LED_INT_BLINK);=0A= return 0;=0A= }=0A= if ((error =3D iwn_set_timing(sc, ni)) !=3D 0) {=0A= @@ -5877,6 +6231,7 @@=0A= "%s: could not add BSS node, error %d\n", __func__, error);=0A= return error;=0A= }=0A= + /*XXX Not done in iwl and lead to instability with 6235=0A= DPRINTF(sc, IWN_DEBUG_STATE, "%s: setting link quality for node %d\n",=0A= __func__, node.id);=0A= if ((error =3D iwn_set_link_quality(sc, ni)) !=3D 0) {=0A= @@ -5892,18 +6247,26 @@=0A= error);=0A= return error;=0A= }=0A= - /* Start periodic calibration timer. */=0A= + // Start periodic calibration timer. =0A= sc->calib.state =3D IWN_CALIB_STATE_ASSOC;=0A= sc->calib_cnt =3D 0;=0A= callout_reset(&sc->calib_to, msecs_to_ticks(500), iwn_calib_timeout,=0A= sc);=0A= =0A= + */=0A= +=0A= /* Link LED always on while associated. */=0A= - iwn_set_led(sc, IWN_LED_LINK, 0, 1);=0A= + iwn_set_led(sc, IWN_LED_LINK, 0, 1,IWN_LED_STATIC_ON);=0A= =0A= DPRINTF(sc, IWN_DEBUG_TRACE, "->%s: end\n",__func__);=0A= =0A= - return 0;=0A= +#ifdef IWN_DTIM_INDICATES_UNICAST_PENDING_AT_AP=0A= + return iwn_set_pslevel(sc, IWN_POWERSAVE_DTIM_VOIP_COMPATIBLE,=0A= + sc->desired_pwrsave_level, 0);=0A= +#else=0A= + return 0;=0A= +#endif=0A= +=0A= }=0A= =0A= /*=0A= @@ -6037,7 +6400,7 @@=0A= iwn_ampdu_tx_start(struct ieee80211com *ic, struct ieee80211_node *ni,=0A= uint8_t tid)=0A= {=0A= - struct ieee80211_tx_ampdu *tap =3D &ni->ni_tx_ampdu[tid];=0A= + struct ieee80211_tx_ampdu *tap =3D = &ni->ni_tx_ampdu[TID_TO_WME_AC(tid)];=0A= struct iwn_softc *sc =3D ni->ni_ic->ic_ifp->if_softc;=0A= struct iwn_ops *ops =3D &sc->ops;=0A= struct iwn_node *wn =3D (void *)ni;=0A= @@ -6256,9 +6619,15 @@=0A= {=0A= int idx, error;=0A= =0A= - for (idx =3D 0; idx < 5; idx++) {=0A= - if (sc->calibcmd[idx].buf =3D=3D NULL)=0A= - continue; /* No results available. */=0A= + for (idx =3D 0; idx < IWN5000_PHY_CALIB_MAX_RESULT ; idx++) {=0A= + if (!(sc->base_params->calib_need & (1<calibcmd[idx].buf =3D=3D NULL) {=0A= + DPRINTF(sc, IWN_DEBUG_CALIBRATE, "Need calib idx : %d but no = available data\n",idx);=0A= + continue;=0A= + }=0A= DPRINTF(sc, IWN_DEBUG_CALIBRATE,=0A= "send calibration result idx=3D%d len=3D%d\n", idx,=0A= sc->calibcmd[idx].len);=0A= @@ -6335,6 +6704,32 @@=0A= return iwn_cmd(sc, IWN_CMD_PHY_CALIB, &cmd, sizeof cmd, 0);=0A= }=0A= =0A= +static int=0A= +iwn5000_temp_offset_calibv2(struct iwn_softc *sc)=0A= +{=0A= + struct iwn5000_phy_calib_temp_offsetv2 cmd;=0A= +=0A= + memset(&cmd, 0, sizeof cmd);=0A= + cmd.code =3D IWN5000_PHY_CALIB_TEMP_OFFSET;=0A= + cmd.ngroups =3D 1;=0A= + cmd.isvalid =3D 1;=0A= + if (sc->eeprom_temp !=3D 0) {=0A= + cmd.offset_low =3D htole16(sc->eeprom_temp);=0A= + cmd.offset_high =3D htole16(sc->eeprom_temp_high);=0A= + } else {=0A= + cmd.offset_low =3D htole16(IWN_DEFAULT_TEMP_OFFSET);=0A= + cmd.offset_high =3D htole16(IWN_DEFAULT_TEMP_OFFSET);=0A= + }=0A= + cmd.burnt_voltage_ref =3D htole16(sc->eeprom_voltage);=0A= +=0A= + DPRINTF(sc, IWN_DEBUG_CALIBRATE, "setting radio sensor low offset to = %d, high offset to %d, voltage to %d\n",=0A= + le16toh(cmd.offset_low),=0A= + le16toh(cmd.offset_high),=0A= + le16toh(cmd.burnt_voltage_ref));=0A= +=0A= + return iwn_cmd(sc, IWN_CMD_PHY_CALIB, &cmd, sizeof cmd, 0);=0A= +}=0A= +=0A= /*=0A= * This function is called after the runtime firmware notifies us of its=0A= * readiness (called in a process context).=0A= @@ -6420,7 +6815,11 @@=0A= IWN_SETBITS(sc, IWN_FH_TX_CHICKEN, IWN_FH_TX_CHICKEN_SCHED_RETRY);=0A= =0A= /* Enable chain mode for all queues, except command queue. */=0A= - iwn_prph_write(sc, IWN5000_SCHED_QCHAIN_SEL, 0xfffef);=0A= + if(sc->sc_flags & IWN_FLAG_PAN_SUPPORT)=0A= + iwn_prph_write(sc, IWN5000_SCHED_QCHAIN_SEL, 0xffdff);=0A= + else=0A= + iwn_prph_write(sc, IWN5000_SCHED_QCHAIN_SEL, 0xfffef);=0A= +=0A= iwn_prph_write(sc, IWN5000_SCHED_AGGR_SEL, 0);=0A= =0A= for (qid =3D 0; qid < IWN5000_NTXQUEUES; qid++) {=0A= @@ -6440,32 +6839,29 @@=0A= /* Identify TX FIFO rings (0-7). */=0A= iwn_prph_write(sc, IWN5000_SCHED_TXFACT, 0xff);=0A= =0A= - /* Mark TX rings (4 EDCA + cmd + 2 HCCA) as active. */=0A= - for (qid =3D 0; qid < 7; qid++) {=0A= - static uint8_t qid2fifo[] =3D { 3, 2, 1, 0, 7, 5, 6 };=0A= - iwn_prph_write(sc, IWN5000_SCHED_QUEUE_STATUS(qid),=0A= - IWN5000_TXQ_STATUS_ACTIVE | qid2fifo[qid]);=0A= + if(sc->sc_flags & IWN_FLAG_PAN_SUPPORT) {=0A= + /* Mark TX rings as active. */=0A= + for (qid =3D 0; qid < 11; qid++) {=0A= + static uint8_t qid2fifo[] =3D { 3, 2, 1, 0, 0, 4, 2, 5, 4, 7, 5 };=0A= + iwn_prph_write(sc, IWN5000_SCHED_QUEUE_STATUS(qid),=0A= + IWN5000_TXQ_STATUS_ACTIVE | qid2fifo[qid]);=0A= + }=0A= + } else {=0A= + /* Mark TX rings (4 EDCA + cmd + 2 HCCA) as active. */=0A= + for (qid =3D 0; qid < 7; qid++) {=0A= + static uint8_t qid2fifo[] =3D { 3, 2, 1, 0, 7, 5, 6 };=0A= + iwn_prph_write(sc, IWN5000_SCHED_QUEUE_STATUS(qid),=0A= + IWN5000_TXQ_STATUS_ACTIVE | qid2fifo[qid]);=0A= + }=0A= }=0A= iwn_nic_unlock(sc);=0A= =0A= - /* Configure WiMAX coexistence for combo adapters. */=0A= - error =3D iwn5000_send_wimax_coex(sc);=0A= - if (error !=3D 0) {=0A= - device_printf(sc->sc_dev,=0A= - "%s: could not configure WiMAX coexistence, error %d\n",=0A= - __func__, error);=0A= +=0A= + if ((error=3Diwn_cfg_ucode_post_alive(sc))!=3D0) {=0A= + DPRINTF(sc, IWN_DEBUG_TRACE, "->%s end in error\n", __func__);=0A= return error;=0A= }=0A= - if (sc->hw_type !=3D IWN_HW_REV_TYPE_5150) {=0A= - /* Perform crystal calibration. */=0A= - error =3D iwn5000_crystal_calib(sc);=0A= - if (error !=3D 0) {=0A= - device_printf(sc->sc_dev,=0A= - "%s: crystal calibration failed, error %d\n",=0A= - __func__, error);=0A= - return error;=0A= - }=0A= - }=0A= +=0A= if (!(sc->sc_flags & IWN_FLAG_CALIB_DONE)) {=0A= /* Query calibration from the initialization firmware. */=0A= if ((error =3D iwn5000_query_calibration(sc)) !=3D 0) {=0A= @@ -6474,6 +6870,7 @@=0A= __func__, error);=0A= return error;=0A= }=0A= +=0A= /*=0A= * We have the calibration results now, reboot with the=0A= * runtime firmware (call ourselves recursively!)=0A= @@ -6957,9 +7354,8 @@=0A= else=0A= IWN_CLRBITS(sc, IWN_GIO, IWN_GIO_L0S_ENA);=0A= =0A= - if (sc->hw_type !=3D IWN_HW_REV_TYPE_4965 &&=0A= - sc->hw_type <=3D IWN_HW_REV_TYPE_1000)=0A= - IWN_SETBITS(sc, IWN_ANA_PLL, IWN_ANA_PLL_INIT);=0A= + if (sc->base_params->pll_cfg_val)=0A= + IWN_SETBITS(sc, IWN_ANA_PLL, sc->base_params->pll_cfg_val);=0A= =0A= /* Wait for clock stabilization before accessing prph. */=0A= if ((error =3D iwn_clock_wait(sc)) !=3D 0)=0A= @@ -7071,13 +7467,12 @@=0A= /* Use internal power amplifier only. */=0A= IWN_WRITE(sc, IWN_GP_DRIVER, IWN_GP_DRIVER_RADIO_2X2_IPA);=0A= }=0A= - if ((sc->hw_type =3D=3D IWN_HW_REV_TYPE_6050 ||=0A= - sc->hw_type =3D=3D IWN_HW_REV_TYPE_6005) && sc->calib_ver >=3D 6) = {=0A= + if (sc->base_params->additional_nic_config && sc->calib_ver >=3D 6) {=0A= /* Indicate that ROM calibration version is >=3D6. */=0A= IWN_SETBITS(sc, IWN_GP_DRIVER, IWN_GP_DRIVER_CALIB_VER6);=0A= }=0A= - if (sc->hw_type =3D=3D IWN_HW_REV_TYPE_6005)=0A= - IWN_SETBITS(sc, IWN_GP_DRIVER, IWN_GP_DRIVER_6050_1X2);=0A= + if (sc->base_params->additional_gp_drv_bit) =0A= + IWN_SETBITS(sc, IWN_GP_DRIVER, = sc->base_params->additional_gp_drv_bit);=0A= return 0;=0A= }=0A= =0A= @@ -7212,7 +7607,7 @@=0A= IWN_WRITE(sc, IWN_UCODE_GP1_CLR, IWN_UCODE_GP1_RFKILL);=0A= =0A= /* Enable shadow registers. */=0A= - if (sc->hw_type >=3D IWN_HW_REV_TYPE_6000)=0A= + if (sc->base_params->shadow_reg_enable)=0A= IWN_SETBITS(sc, IWN_SHADOW_REG_CTRL, 0x800fffff);=0A= =0A= if ((error =3D ops->load_firmware(sc)) !=3D 0) {=0A= @@ -7283,6 +7678,12 @@=0A= iwn_nic_unlock(sc);=0A= }=0A= DELAY(5);=0A= +=0A= + if (sc->sc_led.led_cur_mode !=3D IWN_LED_STATIC_OFF) {=0A= + sc->sc_led.led_cur_mode =3D IWN_LED_STATIC_OFF;=0A= + iwn_set_led(sc, IWN_LED_LINK, 1, 0, IWN_LED_STATIC_OFF);=0A= + }=0A= +=0A= /* Power OFF adapter. */=0A= iwn_apm_stop(sc);=0A= }=0A= @@ -7331,7 +7732,6 @@=0A= int error;=0A= =0A= DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);=0A= -=0A= IWN_LOCK_ASSERT(sc);=0A= =0A= if ((error =3D iwn_hw_prepare(sc)) !=3D 0) {=0A= @@ -7417,6 +7817,7 @@=0A= IWN_LOCK_ASSERT(sc);=0A= =0A= sc->sc_tx_timer =3D 0;=0A= + sc->sc_scan_timer =3D 0;=0A= callout_stop(&sc->watchdog_to);=0A= callout_stop(&sc->calib_to);=0A= ifp->if_drv_flags &=3D ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE);=0A= @@ -7441,10 +7842,23 @@=0A= {=0A= struct ifnet *ifp =3D ic->ic_ifp;=0A= struct iwn_softc *sc =3D ifp->if_softc;=0A= + struct ieee80211_scan_state *ss =3D ic->ic_scan;=0A= + struct ieee80211vap *vap =3D ss->ss_vap;=0A= =0A= IWN_LOCK(sc);=0A= +=0A= + sc->uc_scan_progress =3D 1;=0A= + if(sc->ctx =3D=3D IWN_RXON_PAN_CTX)=0A= + iwn_set_pan_params(sc);=0A= +=0A= /* make the link LED blink while we're scanning */=0A= - iwn_set_led(sc, IWN_LED_LINK, 20, 2);=0A= + if (vap->iv_state !=3D IEEE80211_S_RUN) {=0A= + if(sc->sc_led.led_cur_mode !=3D IWN_LED_SLOW_BLINK) {=0A= + sc->sc_led.led_cur_mode =3D IWN_LED_SLOW_BLINK;=0A= + iwn_set_led(sc, IWN_LED_LINK, 190, 10,IWN_LED_SLOW_BLINK);=0A= + }=0A= + }=0A= +=0A= IWN_UNLOCK(sc);=0A= }=0A= =0A= @@ -7456,12 +7870,19 @@=0A= {=0A= struct ifnet *ifp =3D ic->ic_ifp;=0A= struct iwn_softc *sc =3D ifp->if_softc;=0A= - struct ieee80211vap *vap =3D TAILQ_FIRST(&ic->ic_vaps);=0A= + struct ieee80211_scan_state *ss =3D ic->ic_scan;=0A= + struct ieee80211vap *vap =3D ss->ss_vap;=0A= =0A= IWN_LOCK(sc);=0A= +=0A= + sc->uc_scan_progress =3D 0;=0A= + sc->sc_scan_timer =3D 0;=0A= + if(sc->ctx =3D=3D IWN_RXON_PAN_CTX)=0A= + iwn_set_pan_params(sc);=0A= +=0A= if (vap->iv_state =3D=3D IEEE80211_S_RUN) {=0A= - /* Set link LED to ON status if we are associated */=0A= - iwn_set_led(sc, IWN_LED_LINK, 0, 1);=0A= + sc->sc_led.led_cur_mode =3D IWN_LED_STATIC_ON;=0A= + iwn_set_led(sc, IWN_LED_LINK, 0, 1,IWN_LED_STATIC_ON);=0A= }=0A= IWN_UNLOCK(sc);=0A= }=0A= @@ -7509,10 +7930,14 @@=0A= int error;=0A= =0A= IWN_LOCK(sc);=0A= + sc->sc_scan_timer =3D 0;=0A= error =3D iwn_scan(sc);=0A= IWN_UNLOCK(sc);=0A= - if (error !=3D 0)=0A= + if (error !=3D 0) {=0A= + sc->uc_scan_progress =3D 0;=0A= + sc->sc_scan_timer =3D 0;=0A= ieee80211_cancel_scan(vap);=0A= + }=0A= }=0A= =0A= /*=0A= @@ -7621,3 +8046,1058 @@=0A= DPRINTF(sc, IWN_DEBUG_REGISTER,"%s","\n");=0A= }=0A= #endif=0A= +=0A= +/*=0A= + * Define specific configuration based on device id and subdevice id=0A= + * pid : PCI device id=0A= + */=0A= +static int=0A= +iwn_config_specific(struct iwn_softc *sc,uint16_t pid)=0A= +{=0A= + switch(pid) {=0A= +/* 1000 Series */=0A= + case IWN_DID_1000_1:=0A= + case IWN_DID_1000_2:=0A= + switch(sc->subdevice_id) {=0A= + case IWN_SDID_1000_1:=0A= + case IWN_SDID_1000_2:=0A= + case IWN_SDID_1000_3:=0A= + case IWN_SDID_1000_4:=0A= + case IWN_SDID_1000_5:=0A= + case IWN_SDID_1000_6:=0A= + case IWN_SDID_1000_7:=0A= + case IWN_SDID_1000_8:=0A= + case IWN_SDID_1000_9:=0A= + case IWN_SDID_1000_10:=0A= + case IWN_SDID_1000_11:=0A= + case IWN_SDID_1000_12:=0A= + sc->limits =3D &iwn1000_sensitivity_limits;=0A= + sc->base_params =3D &iwn_1000_base_params; =0A= + sc->fwname =3D "iwn1000fw";=0A= + break;=0A= + default:=0A= + device_printf(sc->sc_dev, "adapter type id : 0x%04x sub id : 0x%04x = rev %d not supported (subdevice) \n",pid,sc->subdevice_id,sc->hw_type);=0A= + return ENOTSUP;=0A= + }=0A= + break;=0A= +/* 6x00 Series */=0A= + case IWN_DID_6x00_2:=0A= + case IWN_DID_6x00_4:=0A= + case IWN_DID_6x00_1:=0A= + case IWN_DID_6x00_3:=0A= + sc->fwname =3D "iwn6000fw";=0A= + sc->limits =3D &iwn6000_sensitivity_limits;=0A= + switch(sc->subdevice_id) {=0A= +=0A= + case IWN_SDID_6x00_1:=0A= + case IWN_SDID_6x00_2:=0A= + case IWN_SDID_6x00_8:=0A= + //iwl6000_3agn_cfg=0A= + sc->base_params =3D &iwn_6000_base_params;=0A= + break;=0A= + case IWN_SDID_6x00_3:=0A= + case IWN_SDID_6x00_6:=0A= + case IWN_SDID_6x00_9:=0A= + ////iwl6000i_2agn=0A= + case IWN_SDID_6x00_4:=0A= + case IWN_SDID_6x00_7:=0A= + case IWN_SDID_6x00_10:=0A= + //iwl6000i_2abg_cfg=0A= + case IWN_SDID_6x00_5:=0A= + //iwl6000i_2bg_cfg=0A= + sc->base_params =3D &iwn_6000i_base_params;=0A= + sc->sc_flags |=3D IWN_FLAG_INTERNAL_PA;=0A= + sc->txchainmask =3D IWN_ANT_BC;=0A= + sc->rxchainmask =3D IWN_ANT_BC;=0A= + break;=0A= + default:=0A= + device_printf(sc->sc_dev, "adapter type id : 0x%04x sub id : 0x%04x = rev %d not supported (subdevice) \n",pid,sc->subdevice_id,sc->hw_type);=0A= + return ENOTSUP;=0A= + }=0A= + break;=0A= +/* 6x05 Series */=0A= + case IWN_DID_6x05_1: =0A= + case IWN_DID_6x05_2:=0A= + switch(sc->subdevice_id) {=0A= + case IWN_SDID_6x05_1:=0A= + case IWN_SDID_6x05_4:=0A= + case IWN_SDID_6x05_6:=0A= + //iwl6005_2agn_cfg=0A= + case IWN_SDID_6x05_2:=0A= + case IWN_SDID_6x05_5:=0A= + case IWN_SDID_6x05_7:=0A= + //iwl6005_2abg_cfg=0A= + case IWN_SDID_6x05_3:=0A= + //iwl6005_2bg_cfg=0A= + case IWN_SDID_6x05_8:=0A= + case IWN_SDID_6x05_9:=0A= + //iwl6005_2agn_sff_cfg=0A= + case IWN_SDID_6x05_10:=0A= + //iwl6005_2agn_d_cfg=0A= + case IWN_SDID_6x05_11:=0A= + //iwl6005_2agn_mow1_cfg=0A= + case IWN_SDID_6x05_12:=0A= + //iwl6005_2agn_mow2_cfg=0A= + sc->fwname =3D "iwn6000g2afw";=0A= + sc->limits =3D &iwn6000_sensitivity_limits;=0A= + sc->base_params =3D &iwn_6000g2_base_params;=0A= + break;=0A= + default:=0A= + device_printf(sc->sc_dev, "adapter type id : 0x%04x sub id : = 0x%04x rev %d not supported (subdevice) = \n",pid,sc->subdevice_id,sc->hw_type);=0A= + return ENOTSUP;=0A= + }=0A= + break;=0A= +/* 6x35 Series */=0A= + case IWN_DID_6035_1:=0A= + case IWN_DID_6035_2:=0A= + switch(sc->subdevice_id) {=0A= + case IWN_SDID_6035_1:=0A= + case IWN_SDID_6035_2:=0A= + case IWN_SDID_6035_3:=0A= + case IWN_SDID_6035_4:=0A= + sc->fwname =3D "iwn6000g2bfw";=0A= + sc->limits =3D &iwn6000_sensitivity_limits;=0A= + sc->base_params =3D &iwn_6000g2b_base_params;=0A= + break;=0A= + default:=0A= + device_printf(sc->sc_dev, "adapter type id : 0x%04x sub id : = 0x%04x rev %d not supported (subdevice) = \n",pid,sc->subdevice_id,sc->hw_type);=0A= + return ENOTSUP;=0A= + }=0A= + break;=0A= +/* 6x50 WiFi/WiMax Series */=0A= + case IWN_DID_6050_1:=0A= + case IWN_DID_6050_2:=0A= + switch(sc->subdevice_id) {=0A= + case IWN_SDID_6050_1:=0A= + case IWN_SDID_6050_3:=0A= + case IWN_SDID_6050_5:=0A= + //iwl6050_2agn_cfg=0A= + case IWN_SDID_6050_2:=0A= + case IWN_SDID_6050_4:=0A= + case IWN_SDID_6050_6:=0A= + //iwl6050_2abg_cfg=0A= + sc->fwname =3D "iwn6050fw";=0A= + sc->txchainmask =3D IWN_ANT_AB;=0A= + sc->rxchainmask =3D IWN_ANT_AB;=0A= + sc->limits =3D &iwn6000_sensitivity_limits;=0A= + sc->base_params =3D &iwn_6050_base_params;=0A= + break;=0A= + default:=0A= + device_printf(sc->sc_dev, "adapter type id : 0x%04x sub id : = 0x%04x rev %d not supported (subdevice) = \n",pid,sc->subdevice_id,sc->hw_type);=0A= + return ENOTSUP;=0A= + }=0A= + break;=0A= +/* 6150 WiFi/WiMax Series */=0A= + case IWN_DID_6150_1:=0A= + case IWN_DID_6150_2:=0A= + switch(sc->subdevice_id) {=0A= + case IWN_SDID_6150_1:=0A= + case IWN_SDID_6150_3:=0A= + case IWN_SDID_6150_5:=0A= + // iwl6150_bgn_cfg=0A= + case IWN_SDID_6150_2:=0A= + case IWN_SDID_6150_4:=0A= + case IWN_SDID_6150_6:=0A= + //iwl6150_bg_cfg=0A= + sc->fwname =3D "iwn6050fw";=0A= + sc->limits =3D &iwn6000_sensitivity_limits;=0A= + sc->base_params =3D &iwn_6150_base_params;=0A= + break;=0A= + default:=0A= + device_printf(sc->sc_dev, "adapter type id : 0x%04x sub id : = 0x%04x rev %d not supported (subdevice) = \n",pid,sc->subdevice_id,sc->hw_type);=0A= + return ENOTSUP;=0A= + }=0A= + break;=0A= +/* 6030 Series and 1030 Series */=0A= + case IWN_DID_x030_1:=0A= + case IWN_DID_x030_2:=0A= + case IWN_DID_x030_3:=0A= + case IWN_DID_x030_4:=0A= + switch(sc->subdevice_id) {=0A= + case IWN_SDID_x030_1:=0A= + case IWN_SDID_x030_3:=0A= + case IWN_SDID_x030_5:=0A= + // iwl1030_bgn_cfg=0A= + =0A= + case IWN_SDID_x030_2:=0A= + case IWN_SDID_x030_4:=0A= + case IWN_SDID_x030_6:=0A= + //iwl1030_bg_cfg=0A= + =0A= + case IWN_SDID_x030_7:=0A= + case IWN_SDID_x030_10:=0A= + case IWN_SDID_x030_14:=0A= + //iwl6030_2agn_cfg=0A= + =0A= + case IWN_SDID_x030_8:=0A= + case IWN_SDID_x030_11:=0A= + case IWN_SDID_x030_15:=0A= + // iwl6030_2bgn_cfg=0A= + =0A= + case IWN_SDID_x030_9:=0A= + case IWN_SDID_x030_12:=0A= + case IWN_SDID_x030_16:=0A= + // iwl6030_2abg_cfg=0A= + =0A= + case IWN_SDID_x030_13:=0A= + //iwl6030_2bg_cfg=0A= + sc->fwname =3D "iwn6000g2bfw";=0A= + sc->limits =3D &iwn6000_sensitivity_limits;=0A= + sc->base_params =3D &iwn_6000g2b_base_params;=0A= + break;=0A= + default:=0A= + device_printf(sc->sc_dev, "adapter type id : 0x%04x sub id : = 0x%04x rev %d not supported (subdevice) = \n",pid,sc->subdevice_id,sc->hw_type);=0A= + return ENOTSUP;=0A= + }=0A= + break;=0A= +/* 130 Series WiFi */=0A= +/* XXX: This series will need adjustement for rate see = rx_with_siso_diversity in linux kernel */=0A= + case IWN_DID_130_1:=0A= + case IWN_DID_130_2:=0A= + switch(sc->subdevice_id) {=0A= + case IWN_SDID_130_1: =0A= + case IWN_SDID_130_3:=0A= + case IWN_SDID_130_5:=0A= + //iwl130_bgn_cfg=0A= + case IWN_SDID_130_2:=0A= + case IWN_SDID_130_4:=0A= + case IWN_SDID_130_6:=0A= + //iwl130_bg_cfg=0A= + sc->fwname =3D "iwn6000g2bfw";=0A= + sc->limits =3D &iwn6000_sensitivity_limits;=0A= + sc->base_params =3D &iwn_6000g2b_base_params;=0A= + break;=0A= + default:=0A= + device_printf(sc->sc_dev, "adapter type id : 0x%04x sub id : = 0x%04x rev %d not supported (subdevice) = \n",pid,sc->subdevice_id,sc->hw_type);=0A= + return ENOTSUP;=0A= + }=0A= + break;=0A= +/* 100 Series WiFi */=0A= + case IWN_DID_100_1:=0A= + case IWN_DID_100_2:=0A= + switch(sc->subdevice_id) {=0A= + case IWN_SDID_100_1:=0A= + case IWN_SDID_100_2:=0A= + case IWN_SDID_100_3:=0A= + case IWN_SDID_100_4:=0A= + case IWN_SDID_100_5:=0A= + case IWN_SDID_100_6:=0A= + sc->limits =3D &iwn1000_sensitivity_limits;=0A= + sc->base_params =3D &iwn_1000_base_params; =0A= + sc->fwname =3D "iwn100fw";=0A= + break;=0A= + default:=0A= + device_printf(sc->sc_dev, "adapter type id : 0x%04x sub id : 0x%04x = rev %d not supported (subdevice) \n",pid,sc->subdevice_id,sc->hw_type);=0A= + return ENOTSUP;=0A= + }=0A= + break;=0A= +=0A= +/* 2x30 Series */=0A= + case IWN_DID_2x30_1:=0A= + case IWN_DID_2x30_2:=0A= + switch(sc->subdevice_id) {=0A= + case IWN_SDID_2x30_1:=0A= + case IWN_SDID_2x30_3:=0A= + case IWN_SDID_2x30_5:=0A= + //iwl100_bgn_cfg=0A= + case IWN_SDID_2x30_2:=0A= + case IWN_SDID_2x30_4:=0A= + case IWN_SDID_2x30_6:=0A= + //iwl100_bg_cfg=0A= + sc->limits =3D &iwn2030_sensitivity_limits;=0A= + sc->base_params =3D &iwn2030_base_params; =0A= + sc->fwname =3D "iwn2030fw";=0A= + break;=0A= + default:=0A= + device_printf(sc->sc_dev, "adapter type id : 0x%04x sub id : 0x%04x = rev %d not supported (subdevice) \n",pid,sc->subdevice_id,sc->hw_type);=0A= + return ENOTSUP;=0A= + }=0A= + break;=0A= +/* 5x00 Series */=0A= + case IWN_DID_5x00_1:=0A= + case IWN_DID_5x00_2:=0A= + case IWN_DID_5x00_3:=0A= + case IWN_DID_5x00_4:=0A= + sc->limits =3D &iwn5000_sensitivity_limits;=0A= + sc->base_params =3D &iwn_default_base_params; =0A= + sc->fwname =3D "iwn5000fw";=0A= + switch(sc->subdevice_id) {=0A= + case IWN_SDID_5x00_1:=0A= + case IWN_SDID_5x00_2:=0A= + case IWN_SDID_5x00_3:=0A= + case IWN_SDID_5x00_4:=0A= + case IWN_SDID_5x00_9:=0A= + case IWN_SDID_5x00_10:=0A= + case IWN_SDID_5x00_11:=0A= + case IWN_SDID_5x00_12:=0A= + case IWN_SDID_5x00_17:=0A= + case IWN_SDID_5x00_18:=0A= + case IWN_SDID_5x00_19:=0A= + case IWN_SDID_5x00_20:=0A= + //iwl5100_agn_cfg=0A= + sc->txchainmask =3D IWN_ANT_B;=0A= + sc->rxchainmask =3D IWN_ANT_AB;=0A= + break; =0A= + case IWN_SDID_5x00_5:=0A= + case IWN_SDID_5x00_6:=0A= + case IWN_SDID_5x00_13:=0A= + case IWN_SDID_5x00_14:=0A= + case IWN_SDID_5x00_21:=0A= + case IWN_SDID_5x00_22:=0A= + //iwl5100_bgn_cfg=0A= + sc->txchainmask =3D IWN_ANT_B;=0A= + sc->rxchainmask =3D IWN_ANT_AB;=0A= + break;=0A= + case IWN_SDID_5x00_7:=0A= + case IWN_SDID_5x00_8:=0A= + case IWN_SDID_5x00_15:=0A= + case IWN_SDID_5x00_16:=0A= + case IWN_SDID_5x00_23:=0A= + case IWN_SDID_5x00_24:=0A= + //iwl5100_abg_cfg=0A= + sc->txchainmask =3D IWN_ANT_B;=0A= + sc->rxchainmask =3D IWN_ANT_AB;=0A= + break;=0A= + =0A= + case IWN_SDID_5x00_25:=0A= + case IWN_SDID_5x00_26:=0A= + case IWN_SDID_5x00_27:=0A= + case IWN_SDID_5x00_28:=0A= + case IWN_SDID_5x00_29:=0A= + case IWN_SDID_5x00_30:=0A= + case IWN_SDID_5x00_31:=0A= + case IWN_SDID_5x00_32:=0A= + case IWN_SDID_5x00_33:=0A= + case IWN_SDID_5x00_34:=0A= + case IWN_SDID_5x00_35:=0A= + case IWN_SDID_5x00_36:=0A= + //iwl5300_agn_cfg=0A= + sc->txchainmask =3D IWN_ANT_ABC;=0A= + sc->rxchainmask =3D IWN_ANT_ABC;=0A= + break;=0A= + default:=0A= + device_printf(sc->sc_dev, "adapter type id : 0x%04x sub id : 0x%04x = rev %d not supported (subdevice) \n",pid,sc->subdevice_id,sc->hw_type);=0A= + return ENOTSUP;=0A= + }=0A= + break;=0A= +/* 5x50 Series */=0A= + case IWN_DID_5x50_1:=0A= + case IWN_DID_5x50_2:=0A= + case IWN_DID_5x50_3:=0A= + case IWN_DID_5x50_4:=0A= + sc->limits =3D &iwn5000_sensitivity_limits;=0A= + sc->base_params =3D &iwn_default_base_params; =0A= + sc->fwname =3D "iwn5000fw";=0A= + switch(sc->subdevice_id) {=0A= + case IWN_SDID_5x50_1:=0A= + case IWN_SDID_5x50_2:=0A= + case IWN_SDID_5x50_3:=0A= + //iwl5350_agn_cfg=0A= + sc->limits =3D &iwn5000_sensitivity_limits;=0A= + sc->base_params =3D &iwn_default_base_params; =0A= + sc->fwname =3D "iwn5000fw";=0A= + break;=0A= +=0A= + case IWN_SDID_5x50_4:=0A= + case IWN_SDID_5x50_5:=0A= + case IWN_SDID_5x50_8:=0A= + case IWN_SDID_5x50_9:=0A= + case IWN_SDID_5x50_10:=0A= + case IWN_SDID_5x50_11:=0A= + //iwl5150_agn_cfg=0A= + case IWN_SDID_5x50_6:=0A= + case IWN_SDID_5x50_7:=0A= + case IWN_SDID_5x50_12:=0A= + case IWN_SDID_5x50_13:=0A= + //iwl5150_abg_cfg=0A= + sc->limits =3D &iwn5000_sensitivity_limits;=0A= + sc->fwname =3D "iwn5150fw";=0A= + sc->base_params =3D &iwn_5x50_base_params;=0A= + break;=0A= + default:=0A= + device_printf(sc->sc_dev, "adapter type id : 0x%04x sub id : 0x%04x = rev %d not supported (subdevice) \n",pid,sc->subdevice_id,sc->hw_type);=0A= + return ENOTSUP;=0A= + }=0A= + break;=0A= + default:=0A= + device_printf(sc->sc_dev, "adapter type id : 0x%04x sub id : 0x%04x = rev 0x%08x not supported (device) \n",pid,sc->subdevice_id,sc->hw_type);=0A= + return ENOTSUP;=0A= + }=0A= + return 0;=0A= +}=0A= +/*=0A= + * Send IWN_CMD_GET_STATISTICS to ucode.=0A= + * @enable: activate sending statistics from uCode=0A= + * @clear : ask uCode to clear internal counter=0A= + * @async : Sync mode for command (1=3D ASYNC, 0=3DSYNC)=0A= +*/=0A= +static int =0A= +iwn_set_statistics_request(struct iwn_softc *sc,bool enable,bool = clear,int async)=0A= +{=0A= + struct iwn_statistics_cmd cmd;=0A= +=0A= + if (enable) =0A= + cmd.configuration_flags=3D clear ? IWN_STATS_CONF_CLEAR_STATS :0;=0A= + else=0A= + cmd.configuration_flags=3D IWN_STATS_CONF_DISABLE_NOTIF;=0A= +=0A= +=0A= + DPRINTF(sc, IWN_DEBUG_CALIBRATE, "%s: sending request for statistics = flags : 0x%x\n",=0A= + __func__,cmd.configuration_flags);=0A= + return iwn_cmd(sc, IWN_CMD_GET_STATISTICS, &cmd, sizeof cmd, async ? = 1:0);=0A= +}=0A= +=0A= +static int=0A= +iwn_cfg_ucode_post_alive(struct iwn_softc *sc)=0A= +{=0A= + int error;=0A= +=0A= + /* Configure WiMAX coexistence for combo adapters. */=0A= + error =3D iwn5000_send_wimax_coex(sc);=0A= + if (error !=3D 0) {=0A= + device_printf(sc->sc_dev,=0A= + "%s: could not configure WiMAX coexistence, error %d\n",=0A= + __func__, error);=0A= + return error;=0A= + }=0A= +=0A= + if (!(sc->base_params->no_crystal_calibration)) {=0A= + DPRINTF(sc, IWN_DEBUG_RESET, "Doing calib in %s\n",__func__);=0A= + error =3D iwn5000_crystal_calib(sc);=0A= + if (error !=3D 0) {=0A= + device_printf(sc->sc_dev,=0A= + "%s: crystal calibration failed, error %d\n",=0A= + __func__, error);=0A= + return error;=0A= + }=0A= + } else {=0A= + DPRINTF(sc, IWN_DEBUG_RESET, "Crystal calibration disable in = %s\n",__func__);=0A= + }=0A= +=0A= + return 0;=0A= +}=0A= +//----------------- NEW----------------------=0A= +/*=0A= + * Handles ioctl change requests for power management state etc.=0A= + */=0A= +static int iwn_iv_reset(struct ieee80211vap *vap, u_long cmd)=0A= +{=0A= + int error =3D 0;=0A= + switch (cmd) {=0A= + case IEEE80211_IOC_POWERSAVE:{=0A= + struct iwn_softc * sc =3D (struct iwn_softc *)=0A= + (vap->iv_ic->ic_ifp->if_softc);=0A= + IWN_LOCK(sc);=0A= +=0A= + /* XXX to discuss */=0A= + int dtim =3D IWN_POWERSAVE_DTIM_VOIP_COMPATIBLE;=0A= +=0A= + int async =3D 0;=0A= +=0A= + /*=0A= + * At present the powersave level is set to 0 (receiver=0A= + * continuously on) if power save is disabled, and set to=0A= + * IWN_POWERSAVE_LVL_VOIP_COMPATIBLE otherwise.=0A= + * Later the power levels 0-5 could be exposed to the user.=0A= + */=0A= + if (vap->iv_flags & IEEE80211_F_PMGTON) {=0A= + /*=0A= + * In ieee80211_vap_setup() we have:=0A= + * vap->iv_flags =3D ic->ic_flags;=0A= + * i.e. any vap's iv_flags initialize to ic->ic_flags.=0A= + * Setting the flags on ic will allow a vap to get=0A= + * the correct powersave level once it is created.=0A= + */=0A= + vap->iv_ic->ic_flags |=3D IEEE80211_F_PMGTON;=0A= + sc->desired_pwrsave_level =3D=0A= + IWN_POWERSAVE_LVL_VOIP_COMPATIBLE;=0A= + } else {=0A= + vap->iv_ic->ic_flags &=3D ~IEEE80211_F_PMGTON;=0A= + sc->desired_pwrsave_level =3D IWN_POWERSAVE_LVL_NONE;=0A= + }=0A= + error =3D iwn_set_pslevel(sc, dtim, sc->desired_pwrsave_level,=0A= + async);=0A= + IWN_UNLOCK(sc);=0A= + }=0A= + break;=0A= + default:=0A= + /*=0A= + * For unhandled ioctls, ENETRESET has to be passed back to=0A= + * net80211 layer, which will in turn call the function to=0A= + * reinitialize the entire device.=0A= + */=0A= + error =3D ENETRESET;=0A= + break;=0A= + }=0A= + return error;=0A= +}=0A= +=0A= +static int=0A= +iwn_newstate_u1(struct ieee80211vap *vap, enum ieee80211_state nstate, = int arg)=0A= +{=0A= + struct iwn_vap *ivp =3D IWN_VAP(vap);=0A= + struct ieee80211com *ic =3D vap->iv_ic;=0A= + struct iwn_softc *sc =3D ic->ic_ifp->if_softc;=0A= +=0A= + int error =3D 0;=0A= +=0A= + DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);=0A= +=0A= + DPRINTF(sc, IWN_DEBUG_STATE, "%s: %s -> %s\n", __func__,=0A= + ieee80211_state_name[vap->iv_state], ieee80211_state_name[nstate]);=0A= +=0A= + IEEE80211_UNLOCK(ic);=0A= + IWN_LOCK(sc);=0A= + callout_stop(&sc->calib_to);=0A= +=0A= + sc->rxon =3D &sc->rx_on[IWN_RXON_PAN_CTX];=0A= +=0A= + switch (nstate) {=0A= + case IEEE80211_S_ASSOC:=0A= + if (vap->iv_state !=3D IEEE80211_S_RUN)=0A= + break;=0A= + /* FALLTHROUGH */=0A= + case IEEE80211_S_AUTH:=0A= + if (vap->iv_state =3D=3D IEEE80211_S_AUTH)=0A= + break;=0A= +=0A= + /*=0A= + * !AUTH -> AUTH transition requires state reset to handle=0A= + * reassociations correctly.=0A= + */=0A= + sc->rxon->associd =3D 0;=0A= + sc->rxon->filter &=3D ~htole32(IWN_FILTER_BSS);=0A= + sc->calib.state =3D IWN_CALIB_STATE_INIT;=0A= +=0A= + if ((error =3D iwn_auth_u1(sc, vap)) !=3D 0) {=0A= + device_printf(sc->sc_dev,=0A= + "%s: could not move to auth state\n", __func__);=0A= + }=0A= + break;=0A= +=0A= + case IEEE80211_S_SCAN:=0A= +=0A= +=0A= + if ((error =3D iwn_set_timing_u1(sc)) !=3D 0) {=0A= + device_printf(sc->sc_dev,=0A= + "%s: iwn_set_timing_u1 error %d\n", __func__, error);=0A= + return error;=0A= + }=0A= +=0A= + break;=0A= +=0A= + case IEEE80211_S_RUN:=0A= +=0A= + /*=0A= + * RUN -> RUN transition; Just restart the timers.=0A= + */=0A= + if (vap->iv_state =3D=3D IEEE80211_S_RUN) {=0A= + sc->calib_cnt =3D 0;=0A= + break;=0A= + }=0A= +=0A= + /*=0A= + * !RUN -> RUN requires setting the association id=0A= + * which is done with a firmware cmd. We also defer=0A= + * starting the timers until that work is done.=0A= + */=0A= + if ((error =3D iwn_run_u1(sc, vap)) !=3D 0) {=0A= + device_printf(sc->sc_dev,=0A= + "%s: could not move to run state\n", __func__);=0A= + }=0A= + break;=0A= +=0A= + case IEEE80211_S_INIT:=0A= + sc->calib.state =3D IWN_CALIB_STATE_INIT;=0A= + break;=0A= +=0A= + default:=0A= + break;=0A= + }=0A= + IWN_UNLOCK(sc);=0A= + IEEE80211_LOCK(ic);=0A= + if (error !=3D 0) {=0A= + DPRINTF(sc, IWN_DEBUG_TRACE, "->%s end in error\n", __func__);=0A= + return error;=0A= + }=0A= + DPRINTF(sc, IWN_DEBUG_TRACE, "->%s end\n", __func__);=0A= + return ivp->iv_newstate(vap, nstate, arg);=0A= +}=0A= +=0A= +static int=0A= +iwn_auth_u1(struct iwn_softc *sc, struct ieee80211vap *vap)=0A= +{=0A= + struct iwn_ops *ops =3D &sc->ops;=0A= + struct ifnet *ifp =3D sc->sc_ifp;=0A= + struct ieee80211com *ic =3D ifp->if_l2com;=0A= + struct ieee80211_node *ni =3D vap->iv_bss;=0A= + int error;=0A= + struct iwn_vap *ivp =3D IWN_VAP(vap);=0A= +=0A= + DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);=0A= +=0A= + sc->rxon =3D &sc->rx_on[IWN_RXON_PAN_CTX];=0A= + IEEE80211_ADDR_COPY(sc->rxon->myaddr, ivp->macaddr);=0A= + IEEE80211_ADDR_COPY(sc->rxon->wlap, IF_LLADDR(ifp));=0A= + /* Update adapter configuration. */=0A= + IEEE80211_ADDR_COPY(sc->rxon->bssid, ni->ni_bssid);=0A= + sc->rxon->chan =3D ieee80211_chan2ieee(ic, ni->ni_chan);=0A= + sc->rxon->flags =3D htole32(IWN_RXON_TSF | IWN_RXON_CTS_TO_SELF);=0A= + if (IEEE80211_IS_CHAN_2GHZ(ni->ni_chan))=0A= + sc->rxon->flags |=3D htole32(IWN_RXON_AUTO | IWN_RXON_24GHZ);=0A= + if (ic->ic_flags & IEEE80211_F_SHSLOT)=0A= + sc->rxon->flags |=3D htole32(IWN_RXON_SHSLOT);=0A= + if (ic->ic_flags & IEEE80211_F_SHPREAMBLE)=0A= + sc->rxon->flags |=3D htole32(IWN_RXON_SHPREAMBLE);=0A= + if (IEEE80211_IS_CHAN_A(ni->ni_chan)) {=0A= + sc->rxon->cck_mask =3D 0;=0A= + sc->rxon->ofdm_mask =3D 0x15;=0A= + } else if (IEEE80211_IS_CHAN_B(ni->ni_chan)) {=0A= + sc->rxon->cck_mask =3D 0x03;=0A= + sc->rxon->ofdm_mask =3D 0;=0A= + } else {=0A= + /* Assume 802.11b/g. */=0A= + sc->rxon->cck_mask =3D 0x0f;=0A= + sc->rxon->ofdm_mask =3D 0x15;=0A= + }=0A= + DPRINTF(sc, IWN_DEBUG_STATE, "rxon chan %d flags %x cck %x ofdm %x\n",=0A= + sc->rxon->chan, sc->rxon->flags, sc->rxon->cck_mask,=0A= + sc->rxon->ofdm_mask);=0A= + sc->rxon->mode =3D IWN_MODE_2STA;=0A= + error =3D iwn_cmd(sc, IWN_CMD_WIPAN_RXON, sc->rxon, sc->rxonsz, 0);=0A= + if (error !=3D 0) {=0A= + device_printf(sc->sc_dev, "%s: RXON command failed, error %d\n",=0A= + __func__, error);=0A= + return error;=0A= + }=0A= +=0A= + /* Configuration has changed, set TX power accordingly. */=0A= + if ((error =3D ops->set_txpower(sc, ni->ni_chan, 1)) !=3D 0) {=0A= + device_printf(sc->sc_dev,=0A= + "%s: could not set TX power, error %d\n", __func__, error);=0A= + return error;=0A= + }=0A= + /*=0A= + * Reconfiguring RXON clears the firmware nodes table so we must=0A= + * add the broadcast node again.=0A= + */=0A= + if ((error =3D iwn_add_broadcast_node_u1(sc, 0)) !=3D 0) {=0A= + device_printf(sc->sc_dev,=0A= + "%s: could not add broadcast node, error %d\n", __func__,=0A= + error);=0A= + return error;=0A= + }=0A= + DPRINTF(sc, IWN_DEBUG_TRACE, "->%s end\n", __func__);=0A= +=0A= + return 0;=0A= +}=0A= +=0A= +static int=0A= +iwn_run_u1(struct iwn_softc *sc, struct ieee80211vap *vap)=0A= +{=0A= + struct iwn_ops *ops =3D &sc->ops;=0A= + struct ifnet *ifp =3D sc->sc_ifp;=0A= + struct ieee80211com *ic =3D ifp->if_l2com;=0A= + struct ieee80211_node *ni =3D vap->iv_bss;=0A= + struct iwn_node_info node;=0A= + uint32_t htflags =3D 0;=0A= + int error;=0A= + struct iwn_vap *ivp =3D IWN_VAP(vap);=0A= +=0A= + DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);=0A= +=0A= + if (ic->ic_opmode =3D=3D IEEE80211_M_MONITOR) {=0A= + /* Link LED blinks while monitoring. */=0A= + return 0;=0A= + }=0A= +=0A= + if ((error =3D iwn_set_timing_u1(sc)) !=3D 0) {=0A= + device_printf(sc->sc_dev,=0A= + "%s: could not set timing, error %d\n", __func__, error);=0A= + }=0A= +=0A= + if ((error =3D iwn_updateedca_u1(ic)) !=3D 0) {=0A= + device_printf(sc->sc_dev,=0A= + "%s: iwn_updateedca_u1, error %d\n", __func__, error);=0A= + return error;=0A= + }=0A= +=0A= + sc->rxon =3D &sc->rx_on[IWN_RXON_PAN_CTX];=0A= + IEEE80211_ADDR_COPY(sc->rxon->myaddr, ivp->macaddr);=0A= + IEEE80211_ADDR_COPY(sc->rxon->wlap, IF_LLADDR(ifp));=0A= + /* Update adapter configuration. */=0A= + IEEE80211_ADDR_COPY(sc->rxon->bssid, ni->ni_bssid);=0A= + sc->rxon->associd =3D htole16(IEEE80211_AID(ni->ni_associd));=0A= + sc->rxon->chan =3D ieee80211_chan2ieee(ic, ni->ni_chan);=0A= + sc->rxon->flags =3D htole32(IWN_RXON_TSF | IWN_RXON_CTS_TO_SELF);=0A= + if (IEEE80211_IS_CHAN_2GHZ(ni->ni_chan))=0A= + sc->rxon->flags |=3D htole32(IWN_RXON_AUTO | IWN_RXON_24GHZ);=0A= + if (ic->ic_flags & IEEE80211_F_SHSLOT)=0A= + sc->rxon->flags |=3D htole32(IWN_RXON_SHSLOT);=0A= + if (ic->ic_flags & IEEE80211_F_SHPREAMBLE)=0A= + sc->rxon->flags |=3D htole32(IWN_RXON_SHPREAMBLE);=0A= + if (IEEE80211_IS_CHAN_A(ni->ni_chan)) {=0A= + sc->rxon->cck_mask =3D 0;=0A= + sc->rxon->ofdm_mask =3D 0x15;=0A= + } else if (IEEE80211_IS_CHAN_B(ni->ni_chan)) {=0A= + sc->rxon->cck_mask =3D 0x03;=0A= + sc->rxon->ofdm_mask =3D 0;=0A= + } else {=0A= + /* Assume 802.11b/g. */=0A= + sc->rxon->cck_mask =3D 0x0f;=0A= + sc->rxon->ofdm_mask =3D 0x15;=0A= + }=0A= + if (IEEE80211_IS_CHAN_HT(ni->ni_chan)) {=0A= + htflags |=3D IWN_RXON_HT_PROTMODE(ic->ic_curhtprotmode);=0A= + if (IEEE80211_IS_CHAN_HT40(ni->ni_chan)) {=0A= + switch (ic->ic_curhtprotmode) {=0A= + case IEEE80211_HTINFO_OPMODE_HT20PR:=0A= + htflags |=3D IWN_RXON_HT_MODEPURE40;=0A= + break;=0A= + default:=0A= + htflags |=3D IWN_RXON_HT_MODEMIXED;=0A= + break;=0A= + }=0A= + }=0A= + if (IEEE80211_IS_CHAN_HT40D(ni->ni_chan))=0A= + htflags |=3D IWN_RXON_HT_HT40MINUS;=0A= + }=0A= + sc->rxon->flags |=3D htole32(htflags);=0A= + sc->rxon->filter |=3D htole32(IWN_FILTER_BSS);=0A= + DPRINTF(sc, IWN_DEBUG_STATE, "rxon chan %d flags %x\n",=0A= + sc->rxon->chan, sc->rxon->flags);=0A= + sc->rxon->mode =3D IWN_MODE_2STA;=0A= + error =3D iwn_cmd(sc, IWN_CMD_WIPAN_RXON, sc->rxon, sc->rxonsz, 0);=0A= + if (error !=3D 0) {=0A= + device_printf(sc->sc_dev,=0A= + "%s: could not update configuration, error %d\n", __func__,=0A= + error);=0A= + return error;=0A= + }=0A= +=0A= + /* Configuration has changed, set TX power accordingly. */=0A= + if ((error =3D ops->set_txpower(sc, ni->ni_chan, 1)) !=3D 0) {=0A= + device_printf(sc->sc_dev,=0A= + "%s: could not set TX power, error %d\n", __func__, error);=0A= + return error;=0A= + }=0A= +=0A= + /* Fake a join to initialize the TX rate. */=0A= + ((struct iwn_node *)ni)->id =3D IWN_STA_ID;=0A= + iwn_newassoc(ni, 1);=0A= +=0A= + /* Add BSS node. */=0A= + memset(&node, 0, sizeof node);=0A= + node.htflags |=3D htole32(IWN_STA_FLAG_PAN_STATION);=0A= + IEEE80211_ADDR_COPY(node.macaddr, ni->ni_macaddr);=0A= + node.id =3D IWN_STA_ID;=0A= + if (IEEE80211_IS_CHAN_HT(ni->ni_chan)) {=0A= + switch (ni->ni_htcap & IEEE80211_HTCAP_SMPS) {=0A= + case IEEE80211_HTCAP_SMPS_ENA:=0A= + node.htflags |=3D htole32(IWN_SMPS_MIMO_DIS);=0A= + break;=0A= + case IEEE80211_HTCAP_SMPS_DYNAMIC:=0A= + node.htflags |=3D htole32(IWN_SMPS_MIMO_PROT);=0A= + break;=0A= + }=0A= + node.htflags |=3D htole32(IWN_AMDPU_SIZE_FACTOR(3) |=0A= + IWN_AMDPU_DENSITY(5)); /* 4us */=0A= + if (IEEE80211_IS_CHAN_HT40(ni->ni_chan))=0A= + node.htflags |=3D htole32(IWN_NODE_HT40);=0A= + }=0A= + DPRINTF(sc, IWN_DEBUG_STATE, "%s: adding BSS node1\n", __func__);=0A= + error =3D ops->add_node(sc, &node, 0);=0A= + if (error !=3D 0) {=0A= + device_printf(sc->sc_dev,=0A= + "%s: could not add BSS node1, error %d\n", __func__, error);=0A= + return error;=0A= + }=0A= +=0A= + /* Setting the initial rate for node */=0A= + ni->ni_txrate =3D ni->ni_rates.rs_rates[0];=0A= +=0A= + /* XXX: init rate scaling */=0A= +=0A= + DPRINTF(sc, IWN_DEBUG_TRACE, "->%s end\n", __func__);=0A= +=0A= + #ifdef IWN_DTIM_INDICATES_UNICAST_PENDING_AT_AP=0A= + return iwn_set_pslevel(sc, IWN_POWERSAVE_DTIM_VOIP_COMPATIBLE,=0A= + sc->desired_pwrsave_level, 0);=0A= + #else=0A= + return 0;=0A= + #endif=0A= +=0A= +}=0A= +=0A= +static int=0A= +iwn_set_timing_u1(struct iwn_softc *sc)=0A= +{=0A= + struct iwn_cmd_timing cmd;=0A= + int error =3D 0;=0A= + struct ieee80211vap *vap;=0A= + struct iwn_vap *ivp;=0A= +=0A= + DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);=0A= +=0A= + vap =3D sc->ivap[IWN_RXON_PAN_CTX];=0A= + ivp =3D IWN_VAP(vap);=0A= +=0A= + if ((error =3D iwn_config_u1(sc)) !=3D 0) {=0A= + device_printf(sc->sc_dev,=0A= + "%s: iwn_config1 error %d\n", __func__, error);=0A= + return error;=0A= + }=0A= +=0A= + if ((error =3D iwn_set_pan_params(sc)) !=3D 0) {=0A= + device_printf(sc->sc_dev,=0A= + "%s: iwn_set_pan_params error %d\n", __func__, error);=0A= + return error;=0A= + }=0A= +=0A= + memset(&cmd, 0, sizeof cmd);=0A= + cmd.lintval =3D htole16(10);=0A= + cmd.bintval =3D htole16(IWN_BEACON_INTERVAL_DEFAULT);=0A= + ivp->beacon_int =3D cmd.bintval;=0A= + cmd.binitval =3D htole32(0x032000);=0A= + cmd.dtim_period =3D 1;=0A= +=0A= + DPRINTF(sc, IWN_DEBUG_TRACE, "->%s end\n", __func__);=0A= +=0A= + return iwn_cmd(sc, IWN_CMD_WIPAN_RXON_TIMING, &cmd, sizeof cmd, 0);=0A= +}=0A= +=0A= +static int=0A= +iwn_config_u1(struct iwn_softc *sc)=0A= +{=0A= + struct ifnet *ifp =3D sc->sc_ifp;=0A= + struct ieee80211com *ic =3D ifp->if_l2com;=0A= + uint16_t rxchain;=0A= + int error;=0A= + struct ieee80211vap *vap =3D sc->ivap[IWN_RXON_PAN_CTX];=0A= + struct iwn_vap *ivp =3D IWN_VAP(vap);=0A= +=0A= + DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);=0A= +=0A= + sc->rxon =3D &sc->rx_on[IWN_RXON_PAN_CTX];=0A= + IEEE80211_ADDR_COPY(sc->rxon->myaddr, ivp->macaddr);=0A= + IEEE80211_ADDR_COPY(sc->rxon->wlap, IF_LLADDR(ifp));=0A= + sc->rxon->chan =3D ieee80211_chan2ieee(ic, ic->ic_curchan);=0A= + sc->rxon->flags =3D htole32(IWN_RXON_TSF);=0A= + if (IEEE80211_IS_CHAN_2GHZ(ic->ic_curchan))=0A= + sc->rxon->flags |=3D htole32(IWN_RXON_AUTO | IWN_RXON_24GHZ);=0A= + sc->rxon->mode =3D IWN_MODE_P2P;=0A= + sc->rxon->filter =3D htole32(IWN_FILTER_MULTICAST);=0A= + sc->rxon->cck_mask =3D 0x0f; /* not yet negotiated */=0A= + sc->rxon->ofdm_mask =3D 0xff; /* not yet negotiated */=0A= + sc->rxon->ht_single_mask =3D 0xff;=0A= + sc->rxon->ht_dual_mask =3D 0xff;=0A= + sc->rxon->ht_triple_mask =3D 0xff;=0A= + rxchain =3D=0A= + IWN_RXCHAIN_VALID(sc->rxchainmask) |=0A= + IWN_RXCHAIN_MIMO_COUNT(2) |=0A= + IWN_RXCHAIN_IDLE_COUNT(2);=0A= + sc->rxon->rxchain =3D htole16(rxchain);=0A= + sc->rxon->associd =3D 0;=0A= + sc->rxon->filter &=3D ~htole32(IWN_FILTER_BSS);=0A= +=0A= + error =3D iwn_cmd(sc, IWN_CMD_WIPAN_RXON, sc->rxon, sc->rxonsz, 0);=0A= + if (error !=3D 0) {=0A= + device_printf(sc->sc_dev, "%s: IWN_CMD_WIPAN_RXON command failed\n",=0A= + __func__);=0A= + return error;=0A= + }=0A= + DPRINTF(sc, IWN_DEBUG_TRACE, "->%s end\n", __func__);=0A= +=0A= + return 0;=0A= +}=0A= +=0A= +static int=0A= +iwn_set_pan_params(struct iwn_softc *sc)=0A= +{=0A= + struct iwn_pan_params_cmd cmd;=0A= + int slot0 =3D 300, slot1 =3D 0;=0A= + int bcnint;=0A= + int error =3D 0;=0A= +=0A= + DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);=0A= +=0A= + /*=0A= + * If the PAN context is inactive, then we don't need=0A= + * to update the PAN parameters=0A= + */=0A= + if (sc->ctx !=3D IWN_RXON_PAN_CTX) {=0A= + DPRINTF(sc, IWN_DEBUG_TRACE, "->%s end with no need to do that\n", = __func__);=0A= + return 0;=0A= + }=0A= +=0A= + memset(&cmd, 0, sizeof(cmd));=0A= +=0A= + /* only 2 slots are currently allowed */=0A= + cmd.num_slots =3D 2;=0A= +=0A= + cmd.slots[0].type =3D IWN_RXON_BSS_CTX; /* BSS */=0A= + cmd.slots[1].type =3D IWN_RXON_PAN_CTX; /* PAN */=0A= +=0A= + cmd.flags |=3D htole16(IWN_PAN_PARAMS_FLG_SLOTTED_MODE);=0A= + bcnint =3D IWN_BEACON_INTERVAL_DEFAULT;=0A= + slot0 =3D (bcnint >> 1);=0A= + slot1 =3D (bcnint - slot0);=0A= +=0A= + if(sc->uc_scan_progress =3D=3D 1) {=0A= + slot0 =3D bcnint * 3 - IWN_SLOT_TIME_MIN;=0A= + slot1 =3D IWN_SLOT_TIME_MIN;=0A= + }=0A= + cmd.slots[0].time =3D htole16(slot0);=0A= + cmd.slots[1].time =3D htole16(slot1);=0A= +=0A= + error =3D iwn_cmd(sc, IWN_CMD_WIPAN_PARAMS, &cmd, sizeof(cmd), 0);=0A= + if (error !=3D 0) {=0A= + device_printf(sc->sc_dev, "%s: IWN_CMD_WIPAN_PARAMS command failed, = error %d\n",=0A= + __func__, error);=0A= + return error;=0A= + }=0A= +=0A= + DPRINTF(sc, IWN_DEBUG_TRACE, "->%s end\n", __func__);=0A= +=0A= + return 0;=0A= +}=0A= +=0A= +static int=0A= +iwn_updateedca_u1(struct ieee80211com *ic)=0A= +{=0A= +#define IWN_EXP2(x) ((1 << (x)) - 1) /* CWmin =3D 2^ECWmin - 1 */=0A= + struct iwn_softc *sc =3D ic->ic_ifp->if_softc;=0A= + struct iwn_edca_params cmd;=0A= + int aci;=0A= +=0A= + memset(&cmd, 0, sizeof cmd);=0A= + cmd.flags =3D htole32(IWN_EDCA_UPDATE);=0A= + for (aci =3D 0; aci < WME_NUM_AC; aci++) {=0A= + const struct wmeParams *ac =3D=0A= + &ic->ic_wme.wme_chanParams.cap_wmeParams[aci];=0A= + cmd.ac[aci].aifsn =3D ac->wmep_aifsn;=0A= + cmd.ac[aci].cwmin =3D htole16(IWN_EXP2(ac->wmep_logcwmin));=0A= + cmd.ac[aci].cwmax =3D htole16(IWN_EXP2(ac->wmep_logcwmax));=0A= + cmd.ac[aci].txoplimit =3D=0A= + htole16(IEEE80211_TXOP_TO_US(ac->wmep_txopLimit));=0A= + }=0A= + return iwn_cmd(sc, IWN_CMD_WIPAN_QOS_PARAM, &cmd, sizeof cmd, 1);=0A= +#undef IWN_EXP2=0A= +}=0A= +=0A= +/*=0A= + * Broadcast node is used to send group-addressed and management frames.=0A= + */=0A= +static int=0A= +iwn_add_broadcast_node_u1(struct iwn_softc *sc, int async)=0A= +{=0A= + struct iwn_ops *ops =3D &sc->ops;=0A= + struct ifnet *ifp =3D sc->sc_ifp;=0A= + struct ieee80211com *ic =3D ifp->if_l2com;=0A= + struct iwn_node_info node;=0A= + struct iwn_cmd_link_quality linkq;=0A= + uint8_t txant;=0A= + int i, error;=0A= +=0A= + DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);=0A= +=0A= + sc->rxon =3D &sc->rx_on[IWN_RXON_PAN_CTX];=0A= +=0A= + memset(&node, 0, sizeof node);=0A= + IEEE80211_ADDR_COPY(node.macaddr, ifp->if_broadcastaddr);=0A= +=0A= + node.id =3D IWN_PAN_ID_BCAST;=0A= + node.htflags |=3D htole32(IWN_STA_FLAG_PAN_STATION);=0A= + DPRINTF(sc, IWN_DEBUG_RESET, "%s: adding broadcast node1\n", __func__);=0A= + if ((error =3D ops->add_node(sc, &node, async)) !=3D 0)=0A= + return error;=0A= +=0A= + /* Use the first valid TX antenna. */=0A= + txant =3D IWN_LSB(sc->txchainmask);=0A= +=0A= + memset(&linkq, 0, sizeof linkq);=0A= + linkq.id =3D IWN_PAN_ID_BCAST;=0A= + linkq.antmsk_1stream =3D txant;=0A= + linkq.antmsk_2stream =3D IWN_ANT_AB;=0A= + linkq.ampdu_max =3D 64;=0A= + linkq.ampdu_threshold =3D 3;=0A= + linkq.ampdu_limit =3D htole16(4000); /* 4ms */=0A= +=0A= + /* Use lowest mandatory bit-rate. */=0A= + if (IEEE80211_IS_CHAN_5GHZ(ic->ic_curchan))=0A= + linkq.retry[0] =3D htole32(0xd);=0A= + else=0A= + linkq.retry[0] =3D htole32(10 | IWN_RFLAG_CCK);=0A= + linkq.retry[0] |=3D htole32(IWN_RFLAG_ANT(txant));=0A= + /* Use same bit-rate for all TX retries. */=0A= + for (i =3D 1; i < IWN_MAX_TX_RETRIES; i++) {=0A= + linkq.retry[i] =3D linkq.retry[0];=0A= + }=0A= + DPRINTF(sc, IWN_DEBUG_TRACE, "->%s end\n", __func__);=0A= +=0A= + return iwn_cmd(sc, IWN_CMD_LINK_QUALITY, &linkq, sizeof linkq, async);=0A= +}=0A= +=0A= +static uint16_t=0A= +iwn_get_active_dwell(struct iwn_softc *sc, struct ieee80211_channel *c)=0A= +{=0A= + int n_probes =3D 1;=0A= +=0A= + if (IEEE80211_IS_CHAN_5GHZ(c))=0A= + return IWN_ACTIVE_DWELL_TIME_52 +=0A= + IWN_ACTIVE_DWELL_FACTOR_52 * (n_probes + 1);=0A= + else=0A= + return IWN_ACTIVE_DWELL_TIME_24 +=0A= + IWN_ACTIVE_DWELL_FACTOR_24 * (n_probes + 1);=0A= +}=0A= +=0A= +static uint16_t=0A= +iwn_get_passive_dwell(struct iwn_softc *sc, struct ieee80211_channel *c)=0A= +{=0A= + uint8_t ctx_id =3D 0;=0A= + uint16_t beacon_int;=0A= + struct ieee80211vap *vap;=0A= + struct iwn_vap *ivp;=0A= + uint16_t dwell_time;=0A= +=0A= + dwell_time =3D (IEEE80211_IS_CHAN_2GHZ(c)) ?=0A= + IWN_PASSIVE_DWELL_BASE + IWN_PASSIVE_DWELL_TIME_24 :=0A= + IWN_PASSIVE_DWELL_BASE + IWN_PASSIVE_DWELL_TIME_52;=0A= +=0A= + for (ctx_id =3D 0; ctx_id < IWN_NUM_RXON_CTX; ctx_id++) {=0A= + vap =3D sc->ivap[ctx_id];=0A= + ivp =3D IWN_VAP(vap);=0A= + sc->rxon =3D &sc->rx_on[ctx_id];=0A= + if (!sc->rxon->associd)=0A= + continue;=0A= + beacon_int =3D ivp->beacon_int;=0A= + if (!beacon_int)=0A= + beacon_int =3D IWN_PASSIVE_DWELL_BASE;=0A= + beacon_int =3D (beacon_int * 98) / 100 - IWN_CHANNEL_TUNE_TIME * 2;=0A= + dwell_time =3D min(beacon_int, dwell_time);=0A= + if(sc->ctx !=3D IWN_RXON_PAN_CTX) break;=0A= + }=0A= +=0A= + return dwell_time;=0A= +}=0A= +static void=0A= +iwn_led_pattern(struct iwn_softc *sc)=0A= +{=0A= + int i,j;=0A= +=0A= + for(i =3D 0; i < IWN_MAX_BLINK_TBL; i++) {=0A= + if((sc->sc_led.led_last_tpt) > (blink_tbl[i].tpt * 1024 * 1024))=0A= + break;=0A= + }=0A= +=0A= + for(j =3D 0; j < IWN_MAX_BLINK_TBL; j++) {=0A= + if((sc->sc_led.led_cur_tpt) > (blink_tbl[j].tpt * 1024 * 1024))=0A= + break;=0A= + }=0A= +=0A= + if (i !=3D j)=0A= + iwn_set_led(sc, IWN_LED_LINK,blink_tbl[j].off_time,=0A= + blink_tbl[j].on_time, IWN_LED_INT_BLINK);=0A= +}=0A= +=0A= +=0A= Index: sys/dev/iwn/if_iwnreg.h=0A= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=0A= --- sys/dev/iwn/if_iwnreg.h (revision 254210)=0A= +++ sys/dev/iwn/if_iwnreg.h (working copy)=0A= @@ -2,6 +2,8 @@=0A= /* $OpenBSD: if_iwnreg.h,v 1.40 2010/05/05 19:41:57 damien Exp $ */=0A= =0A= /*-=0A= + * Copyright (c) 2013 Cedric GROSS =0A= + * Copyright (c) 2011 Intel Corporation=0A= * Copyright (c) 2007, 2008=0A= * Damien Bergamini =0A= *=0A= @@ -1046,8 +1048,8 @@=0A= =0A= /* Structure for command IWN_CMD_SET_CRITICAL_TEMP. */=0A= struct iwn_critical_temp {=0A= + uint32_t tempM;=0A= uint32_t reserved;=0A= - uint32_t tempM;=0A= uint32_t tempR;=0A= /* degK <-> degC conversion macros. */=0A= #define IWN_CTOK(c) ((c) + 273)=0A= @@ -1102,6 +1104,10 @@=0A= uint16_t reserved;=0A= } __packed;=0A= =0A= +/* Define maximal number of calib result send to runtime firmware =0A= + * PS: TEMP_OFFSET count for 2 (std and v2)=0A= + */=0A= +#define IWN5000_PHY_CALIB_MAX_RESULT 8=0A= /* Structures for command IWN_CMD_PHY_CALIB. */=0A= struct iwn_phy_calib {=0A= uint8_t code;=0A= @@ -1122,6 +1128,15 @@=0A= uint8_t isvalid;=0A= } __packed;=0A= =0A= +#define IWN_BUF_IX_PHY_CALIB_DC 0=0A= +#define IWN_BUF_IX_PHY_CALIB_LO 1=0A= +#define IWN_BUF_IX_PHY_CALIB_TX_IQ 2=0A= +#define IWN_BUF_IX_PHY_CALIB_CRYSTAL 3=0A= +#define IWN_BUF_IX_PHY_CALIB_BASE_BAND 4=0A= +#define IWN_BUF_IX_PHY_CALIB_TX_IQ_PERIODIC 5=0A= +#define IWN_BUF_IX_PHY_CALIB_TEMP_OFFSET 6 =0A= +#define IWN_BUF_IX_PHY_CALIB_TEMP_OFFSETv2 7=0A= +=0A= struct iwn5000_phy_calib_crystal {=0A= uint8_t code;=0A= uint8_t group;=0A= @@ -1581,6 +1596,8 @@=0A= uint32_t len;=0A= } __packed;=0A= =0A= +#define IWN_FW_TLV_FLAGS_NEW_SCAN_BITPOS 1=0A= +=0A= #define IWN4965_FW_TEXT_MAXSZ ( 96 * 1024)=0A= #define IWN4965_FW_DATA_MAXSZ ( 40 * 1024)=0A= #define IWN5000_FW_TEXT_MAXSZ (256 * 1024)=0A= @@ -1688,6 +1705,16 @@=0A= struct iwn4965_eeprom_chan_samples chans[2];=0A= } __packed;=0A= =0A= +/* =0A= + * ADD / MODIFY STATION Command (Op Code 18) - byte 76-18 -bit13=0A= + * STA_FLAG_PAN_STATION bit:=0A= + * This bit is set (1) for a station in PAN mode =0A= + */=0A= +#define IWN_STA_FLAG_PAN_STATION (1 << 13)=0A= +=0A= +#define IWN_BEACON_INTERVAL_DEFAULT 200=0A= +#define IWN_SLOT_TIME_MIN 20=0A= +=0A= /*=0A= * Offsets of channels descriptions in EEPROM.=0A= */=0A= @@ -1731,6 +1758,16 @@=0A= IWN5000_EEPROM_NO_HT40,=0A= };=0A= =0A= +static const uint32_t iwn2030_regulatory_bands[IWN_NBANDS] =3D {=0A= + IWN5000_EEPROM_BAND1,=0A= + IWN5000_EEPROM_BAND2,=0A= + IWN5000_EEPROM_BAND3,=0A= + IWN5000_EEPROM_BAND4,=0A= + IWN5000_EEPROM_BAND5,=0A= + IWN6000_EEPROM_BAND6,=0A= + IWN5000_EEPROM_BAND7=0A= +};=0A= +=0A= #define IWN_CHAN_BANDS_COUNT 7=0A= #define IWN_MAX_CHAN_PER_BAND 14=0A= static const struct iwn_chan_band {=0A= @@ -1775,6 +1812,8 @@=0A= /* DTIM value to pass in for IWN_POWERSAVE_LVL_VOIP_COMPATIBLE */=0A= #define IWN_POWERSAVE_DTIM_VOIP_COMPATIBLE 2=0A= =0A= +#define IWN_DTIM_INDICATES_UNICAST_PENDING_AT_AP=0A= +=0A= /*=0A= * RF Tx gain values from highest to lowest power (values obtained from=0A= * the reference driver.)=0A= @@ -1891,6 +1930,7 @@=0A= uint32_t min_energy_cck;=0A= uint32_t energy_cck;=0A= uint32_t energy_ofdm;=0A= + uint32_t min_corr_barker_mrc;=0A= };=0A= =0A= /*=0A= @@ -1917,7 +1957,8 @@=0A= 170, 400,=0A= 95,=0A= 95,=0A= - 95=0A= + 95,=0A= + 390=0A= };=0A= =0A= static const struct iwn_sensitivity_limits iwn5150_sensitivity_limits = =3D {=0A= @@ -1929,7 +1970,8 @@=0A= 170, 400,=0A= 95,=0A= 95,=0A= - 95=0A= + 95,=0A= + 390=0A= };=0A= =0A= static const struct iwn_sensitivity_limits iwn1000_sensitivity_limits = =3D {=0A= @@ -1941,7 +1983,8 @@=0A= 170, 400,=0A= 95,=0A= 95,=0A= - 95=0A= + 95,=0A= + 390=0A= };=0A= =0A= static const struct iwn_sensitivity_limits iwn6000_sensitivity_limits = =3D {=0A= @@ -1951,9 +1994,10 @@=0A= 128, 232,=0A= 125, 175,=0A= 160, 310,=0A= - 97,=0A= - 97,=0A= - 100=0A= + 110,=0A= + 110,=0A= + 110,=0A= + 336=0A= };=0A= =0A= /* Get value from linux kernel 3.2.+ in = Drivers/net/wireless/iwlwifi/iwl-2000.c*/=0A= @@ -2052,3 +2096,360 @@=0A= #define IWN_BARRIER_READ_WRITE(sc) \=0A= bus_space_barrier((sc)->sc_st, (sc)->sc_sh, 0, (sc)->sc_sz, \=0A= BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE)=0A= +=0A= +/* = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=0A= + * NIC PARAMETERS=0A= + *=0A= + * = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=0A= + */=0A= + =0A= +/* Flags for managing calibration result. See calib_need =0A= + * in iwn_base_params struct =0A= + */=0A= +#define IWN_FLG_NEED_PHY_CALIB_DC (1<<0)=0A= +#define IWN_FLG_NEED_PHY_CALIB_LO (1<<1)=0A= +#define IWN_FLG_NEED_PHY_CALIB_TX_IQ (1<<2)=0A= +#define IWN_FLG_NEED_PHY_CALIB_CRYSTAL (1<<3)=0A= +#define IWN_FLG_NEED_PHY_CALIB_BASE_BAND (1<<4)=0A= +#define IWN_FLG_NEED_PHY_CALIB_TX_IQ_PERIODIC (1<<5)=0A= +#define IWN_FLG_NEED_PHY_CALIB_TEMP_OFFSET (1<<6)=0A= +#define IWN_FLG_NEED_PHY_CALIB_TEMP_OFFSETv2 (1<<7)=0A= +=0A= + =0A= +/* Define some parameters for managing different NIC.=0A= + * Refer to linux specific file like iwl-xxxx.c to determine correct = value =0A= + * for NIC.=0A= + *=0A= + * @max_ll_items: max number of OTP blocks=0A= + * @shadow_ram_support: shadow support for OTP memory=0A= + * @led_compensation: compensate on the led on/off time per HW according=0A= + * to the deviation to achieve the desired led frequency.=0A= + * The detail algorithm is described in iwl-led.c=0A= + * @chain_noise_num_beacons: number of beacons used to compute chain = noise=0A= + * @adv_thermal_throttle: support advance thermal throttle=0A= + * @support_ct_kill_exit: support ct kill exit condition=0A= + * @support_wimax_coexist: support wimax/wifi co-exist=0A= + * @plcp_delta_threshold: plcp error rate threshold used to trigger=0A= + * radio tuning when there is a high receiving plcp error rate=0A= + * @chain_noise_scale: default chain noise scale used for gain = computation=0A= + * @wd_timeout: TX queues watchdog timeout=0A= + * @max_event_log_size: size of event log buffer size for ucode event = logging=0A= + * @shadow_reg_enable: HW shadhow register bit=0A= + * @no_idle_support: do not support idle mode=0A= + * @hd_v2: v2 of enhanced sensitivity value, used for 2000 series and up=0A= + * advanced_bt_coexist : Advanced BT management=0A= + * bt_session_2 : NIC need a new struct for configure BT coexistence. = Needed =0A= + * only if advanced_bt_coexist is true =0A= + * bt_sco_disable :=0A= + * additional_nic_config: For 6005 series=0A= + * iq_invert : ? But need it for N 2000 series=0A= + * regulatory_bands :=0A= + * enhanced_TX_power : EEPROM Has advanced TX power options. Set 'True'=0A= + * if update_enhanced_txpower =3D iwl_eeprom_enhanced_txpower =0A= + * need_temp_offset_calib : Need to compute some temp offset for = calibration.=0A= + * calib_need : Use IWN_FLG_NEED_PHY_CALIB_* flags to specify which =0A= + * calibration data ucode need. See calib_init_cfg in iwl-xxxx.c =0A= + * linux kernel file=0A= + * additional_gp_drv_bit : Specific bit to defined during nic_config=0A= + */=0A= +struct iwn_base_params {=0A= + uint32_t pll_cfg_val;=0A= + const uint16_t max_ll_items;=0A= +#define IWN_OTP_MAX_LL_ITEMS_1000 (3) /* OTP blocks for 1000 */=0A= +#define IWN_OTP_MAX_LL_ITEMS_6x00 (4) /* OTP blocks for 6x00 */=0A= +#define IWN_OTP_MAX_LL_ITEMS_6x50 (7) /* OTP blocks for 6x50 */=0A= +#define IWN_OTP_MAX_LL_ITEMS_2x00 (4) /* OTP blocks for 2x00 */=0A= + const bool shadow_ram_support;=0A= + uint16_t led_compensation;=0A= + bool adv_thermal_throttle;=0A= + bool support_ct_kill_exit;=0A= + uint8_t plcp_delta_threshold;=0A= + int chain_noise_scale;=0A= + unsigned int wd_timeout;=0A= + uint32_t max_event_log_size;=0A= + const bool shadow_reg_enable;=0A= + const bool hd_v2;=0A= + const bool advanced_bt_coexist;=0A= + const bool bt_session_2;=0A= + const bool bt_sco_disable;=0A= + const bool additional_nic_config;=0A= + const uint32_t *regulatory_bands;=0A= + const bool enhanced_TX_power; // See iwl-agn-devices.c file to = determine that(enhanced_txpower). =0A= + const uint16_t calib_need;=0A= + const bool no_crystal_calibration; // see no_xtal_calib in linux=0A= + const bool support_hostap; //Define IEEE80211_C_HOSTAP for ic_caps=0A= + const bool no_multi_vaps; // see iwn_vap_create=0A= + uint8_t additional_gp_drv_bit; //=0A= + =0A= +};=0A= +=0A= +/* NOTA : Values with comments BEFORE are not yet used in driver */=0A= +static struct iwn_base_params iwn_default_base_params =3D {=0A= + IWN_ANA_PLL_INIT, // pll_cfg_val=0A= + 4, //max_ll_items=0A= + true, // shadow_ram_support=0A= + /*.led_compensation =3D */57,=0A= + /*.adv_thermal_throttle =3D*/ true,=0A= + /*.support_ct_kill_exit =3D */true,=0A= + /*.plcp_delta_threshold =3D*/ 50, /*IWL_MAX_PLCP_ERR_THRESHOLD_DEF,*/=0A= + /*.chain_noise_scale =3D*/ 1000,=0A= + /*.wd_timeout =3D */2000, /* IWL_LONG_WD_TIMEOUT,*/=0A= + /*.max_event_log_size =3D*/ 512,=0A= + false, //shadow_reg_enable=0A= + /*.hd_v2 =3D */true,=0A= + false, // advanced_bt_coexist=0A= + false, // bt_session_2=0A= + true, // bt_sco_disable=0A= + false, //additional_nic_config=0A= + iwn5000_regulatory_bands, //regulatory_bands=0A= + false, //enhanced_TX_power=0A= + (IWN_FLG_NEED_PHY_CALIB_DC | IWN_FLG_NEED_PHY_CALIB_LO =0A= + | IWN_FLG_NEED_PHY_CALIB_TX_IQ | IWN_FLG_NEED_PHY_CALIB_BASE_BAND = ), //calib_need=0A= + false, //no_crystal_calibration=0A= + false, //support_hostap=0A= + true, // no_multi_vaps=0A= + 0, //additional_gp_drv_bit=0A= +};=0A= +=0A= +static struct iwn_base_params iwn2030_base_params =3D {=0A= + 0, //pll_cfg_val=0A= + IWN_OTP_MAX_LL_ITEMS_2x00, //max_ll_items=0A= + true, //shadow_ram_support=0A= + /*.led_compensation =3D */ 57,=0A= + /*.adv_thermal_throttle =3D */ true,=0A= + /*.support_ct_kill_exit =3D */ true,=0A= + /*.plcp_delta_threshold =3D */ 50,=0A= + /*.chain_noise_scale =3D */ 1000,=0A= + /*.wd_timeout =3D */ 2000,=0A= + /*.max_event_log_size =3D */ 512,=0A= + false, //shadow_reg_enable=0A= + /*.hd_v2 =3D */ true,=0A= + true, //advanced_bt_coexist=0A= + true, //bt_session_2=0A= + true, //bt_sco_disable=0A= + false, //additional_nic_config=0A= + iwn2030_regulatory_bands, //regulatory_bands=0A= + true, //enhanced_TX_power=0A= + (IWN_FLG_NEED_PHY_CALIB_DC | IWN_FLG_NEED_PHY_CALIB_LO |=0A= + IWN_FLG_NEED_PHY_CALIB_TX_IQ | IWN_FLG_NEED_PHY_CALIB_BASE_BAND |=0A= + IWN_FLG_NEED_PHY_CALIB_TEMP_OFFSETv2 ), //calib_need=0A= + false, //no_crystal_calibration=0A= + true, //support_hostap=0A= + false, //no_multi_vaps=0A= + IWN_GP_DRIVER_REG_BIT_RADIO_IQ_INVERT, // additional_gp_drv_bit=0A= +};=0A= +=0A= +static struct iwn_base_params iwn_1000_base_params =3D {=0A= + IWN_ANA_PLL_INIT, //pll_cfg_val=0A= + IWN_OTP_MAX_LL_ITEMS_1000, //max_ll_items=0A= + false, //shadow_ram_support=0A= + /*.led_compensation =3D */57,=0A= + /*.adv_thermal_throttle =3D*/ true,=0A= + /*.support_ct_kill_exit =3D */true,=0A= + /*.plcp_delta_threshold =3D*/ 50, /*IWL_MAX_PLCP_ERR_THRESHOLD_DEF,*/=0A= + /*.chain_noise_scale =3D*/ 1000,=0A= + /*.wd_timeout =3D */2000, /* IWL_LONG_WD_TIMEOUT,*/=0A= + /*.max_event_log_size =3D*/ 512,=0A= + false, //shadow_reg_enable=0A= + /*.hd_v2 =3D */true,=0A= + false, //advanced_bt_coexist=0A= + false, //bt_session_2=0A= + false, //bt_sco_disable=0A= + false, //additional_nic_config=0A= + iwn5000_regulatory_bands, //regulatory_bands=0A= + false, //enhanced_TX_power=0A= + ( IWN_FLG_NEED_PHY_CALIB_DC | IWN_FLG_NEED_PHY_CALIB_LO |=0A= + IWN_FLG_NEED_PHY_CALIB_TX_IQ | IWN_FLG_NEED_PHY_CALIB_BASE_BAND ), = //calib_need=0A= + false, //no_crystal_calibration=0A= + false, //support_hostap=0A= + true, //no_multi_vaps=0A= + 0, //additional_gp_drv_bit=0A= +};=0A= +static struct iwn_base_params iwn_6000_base_params =3D {=0A= + 0, //pll_cfg_val=0A= + IWN_OTP_MAX_LL_ITEMS_6x00, // max_ll_items=0A= + true, //shadow_ram_support=0A= + /*.led_compensation =3D */57,=0A= + /*.adv_thermal_throttle =3D*/ true,=0A= + /*.support_ct_kill_exit =3D */true,=0A= + /*.plcp_delta_threshold =3D*/ 50, /*IWL_MAX_PLCP_ERR_THRESHOLD_DEF,*/=0A= + /*.chain_noise_scale =3D*/ 1000,=0A= + /*.wd_timeout =3D */2000, /* IWL_LONG_WD_TIMEOUT,*/=0A= + /*.max_event_log_size =3D*/ 512,=0A= + false, //shadow_reg_enable=0A= + /*.hd_v2 =3D */true,=0A= + false, // advanced_bt_coexist=0A= + false, //bt_session_2=0A= + false, //bt_sco_disable=0A= + false, //additional_nic_config=0A= + iwn6000_regulatory_bands, //regulatory_bands=0A= + true, //enhanced_TX_power=0A= + (IWN_FLG_NEED_PHY_CALIB_DC | IWN_FLG_NEED_PHY_CALIB_LO |=0A= + IWN_FLG_NEED_PHY_CALIB_TX_IQ | IWN_FLG_NEED_PHY_CALIB_BASE_BAND ), = //calib_need=0A= + false, //no_crystal_calibration=0A= + false, //support_hostap=0A= + true, //no_multi_vaps=0A= + 0, //additional_gp_drv_bit=0A= +};=0A= +static struct iwn_base_params iwn_6000i_base_params =3D {=0A= + 0, //pll_cfg_val=0A= + IWN_OTP_MAX_LL_ITEMS_6x00, // max_ll_items=0A= + true, //shadow_ram_support=0A= + /*.led_compensation =3D */57,=0A= + /*.adv_thermal_throttle =3D*/ true,=0A= + /*.support_ct_kill_exit =3D */true,=0A= + /*.plcp_delta_threshold =3D*/ 50, /*IWL_MAX_PLCP_ERR_THRESHOLD_DEF,*/=0A= + /*.chain_noise_scale =3D*/ 1000,=0A= + /*.wd_timeout =3D */2000, /* IWL_LONG_WD_TIMEOUT,*/=0A= + /*.max_event_log_size =3D*/ 512,=0A= + false, //shadow_reg_enable=0A= + /*.hd_v2 =3D */true,=0A= + false, // advanced_bt_coexist=0A= + false, //bt_session_2=0A= + true, //bt_sco_disable=0A= + false, //additional_nic_config=0A= + iwn6000_regulatory_bands, //regulatory_bands=0A= + true, //enhanced_TX_power=0A= + (IWN_FLG_NEED_PHY_CALIB_DC | IWN_FLG_NEED_PHY_CALIB_LO |=0A= + IWN_FLG_NEED_PHY_CALIB_TX_IQ | IWN_FLG_NEED_PHY_CALIB_BASE_BAND ), = //calib_need=0A= + false, //no_crystal_calibration=0A= + false, //support_hostap=0A= + true, //no_multi_vaps=0A= + 0, //additional_gp_drv_bit=0A= +};=0A= +static struct iwn_base_params iwn_6000g2_base_params =3D {=0A= + 0, //pll_cfg_val=0A= + IWN_OTP_MAX_LL_ITEMS_6x00, // max_ll_items=0A= + true, //shadow_ram_support=0A= + /*.led_compensation =3D */57,=0A= + /*.adv_thermal_throttle =3D*/ true,=0A= + /*.support_ct_kill_exit =3D */true,=0A= + /*.plcp_delta_threshold =3D*/ 50, /*IWL_MAX_PLCP_ERR_THRESHOLD_DEF,*/=0A= + /*.chain_noise_scale =3D*/ 1000,=0A= + /*.wd_timeout =3D */2000, /* IWL_LONG_WD_TIMEOUT,*/=0A= + /*.max_event_log_size =3D*/ 512,=0A= + false, //shadow_reg_enable=0A= + /*.hd_v2 =3D */true,=0A= + false, // advanced_bt_coexist=0A= + false, //bt_session_2=0A= + true, //bt_sco_disable=0A= + false, //additional_nic_config=0A= + iwn6000_regulatory_bands, //regulatory_bands=0A= + true, //enhanced_TX_power=0A= + (IWN_FLG_NEED_PHY_CALIB_DC | IWN_FLG_NEED_PHY_CALIB_LO |=0A= + IWN_FLG_NEED_PHY_CALIB_TX_IQ | IWN_FLG_NEED_PHY_CALIB_BASE_BAND |=0A= + IWN_FLG_NEED_PHY_CALIB_TEMP_OFFSET ), //calib_need=0A= + false, //no_crystal_calibration=0A= + false, //support_hostap=0A= + true, //no_multi_vaps=0A= + 0, //additional_gp_drv_bit=0A= +};=0A= +static struct iwn_base_params iwn_6050_base_params =3D {=0A= + 0, //pll_cfg_val=0A= + IWN_OTP_MAX_LL_ITEMS_6x50, // max_ll_items=0A= + true, //shadow_ram_support=0A= + /*.led_compensation =3D */57,=0A= + /*.adv_thermal_throttle =3D*/ true,=0A= + /*.support_ct_kill_exit =3D */true,=0A= + /*.plcp_delta_threshold =3D*/ 50, /*IWL_MAX_PLCP_ERR_THRESHOLD_DEF,*/=0A= + /*.chain_noise_scale =3D*/ 1000,=0A= + /*.wd_timeout =3D */2000, /* IWL_LONG_WD_TIMEOUT,*/=0A= + /*.max_event_log_size =3D*/ 512,=0A= + false, //shadow_reg_enable=0A= + /*.hd_v2 =3D */true,=0A= + false, // advanced_bt_coexist=0A= + false, //bt_session_2=0A= + true, //bt_sco_disable=0A= + true, //additional_nic_config=0A= + iwn6000_regulatory_bands, //regulatory_bands=0A= + true, //enhanced_TX_power=0A= + (IWN_FLG_NEED_PHY_CALIB_DC | IWN_FLG_NEED_PHY_CALIB_LO |=0A= + IWN_FLG_NEED_PHY_CALIB_TX_IQ | IWN_FLG_NEED_PHY_CALIB_BASE_BAND |=0A= + IWN_FLG_NEED_PHY_CALIB_TEMP_OFFSET ), //calib_need=0A= + false, //no_crystal_calibration=0A= + false, //support_hostap=0A= + true, //no_multi_vaps=0A= + 0, //additional_gp_drv_bit=0A= +};=0A= +static struct iwn_base_params iwn_6150_base_params =3D {=0A= + 0, //pll_cfg_val=0A= + IWN_OTP_MAX_LL_ITEMS_6x50, // max_ll_items=0A= + true, //shadow_ram_support=0A= + /*.led_compensation =3D */57,=0A= + /*.adv_thermal_throttle =3D*/ true,=0A= + /*.support_ct_kill_exit =3D */true,=0A= + /*.plcp_delta_threshold =3D*/ 50, /*IWL_MAX_PLCP_ERR_THRESHOLD_DEF,*/=0A= + /*.chain_noise_scale =3D*/ 1000,=0A= + /*.wd_timeout =3D */2000, /* IWL_LONG_WD_TIMEOUT,*/=0A= + /*.max_event_log_size =3D*/ 512,=0A= + false, //shadow_reg_enable=0A= + /*.hd_v2 =3D */true,=0A= + false, // advanced_bt_coexist=0A= + false, //bt_session_2=0A= + true, //bt_sco_disable=0A= + true, //additional_nic_config=0A= + iwn6000_regulatory_bands, //regulatory_bands=0A= + true, //enhanced_TX_power=0A= + (IWN_FLG_NEED_PHY_CALIB_DC | IWN_FLG_NEED_PHY_CALIB_LO |=0A= + IWN_FLG_NEED_PHY_CALIB_TX_IQ | IWN_FLG_NEED_PHY_CALIB_BASE_BAND |=0A= + IWN_FLG_NEED_PHY_CALIB_TEMP_OFFSET ), //calib_need=0A= + false, //no_crystal_calibration=0A= + false, //support_hostap=0A= + true, //no_multi_vaps=0A= + IWN_GP_DRIVER_6050_1X2, //additional_gp_drv_bit=0A= +};=0A= +//IWL_DEVICE_6035 & IWL_DEVICE_6030=0A= +static struct iwn_base_params iwn_6000g2b_base_params =3D {=0A= + 0, //pll_cfg_val=0A= + IWN_OTP_MAX_LL_ITEMS_6x00, // max_ll_items=0A= + true, //shadow_ram_support=0A= + /*.led_compensation =3D */57,=0A= + /*.adv_thermal_throttle =3D*/ true,=0A= + /*.support_ct_kill_exit =3D */true,=0A= + /*.plcp_delta_threshold =3D*/ 50, /*IWL_MAX_PLCP_ERR_THRESHOLD_DEF,*/=0A= + /*.chain_noise_scale =3D*/ 1000,=0A= + /*.wd_timeout =3D */2000, /* IWL_LONG_WD_TIMEOUT,*/=0A= + /*.max_event_log_size =3D*/ 512,=0A= + false, //shadow_reg_enable=0A= + /*.hd_v2 =3D */true,=0A= + true, // advanced_bt_coexist=0A= + false, //bt_session_2=0A= + true, //bt_sco_disable=0A= + false, //additional_nic_config=0A= + iwn6000_regulatory_bands, //regulatory_bands=0A= + true, //enhanced_TX_power=0A= + (IWN_FLG_NEED_PHY_CALIB_DC | IWN_FLG_NEED_PHY_CALIB_LO |=0A= + IWN_FLG_NEED_PHY_CALIB_TX_IQ | IWN_FLG_NEED_PHY_CALIB_BASE_BAND |=0A= + IWN_FLG_NEED_PHY_CALIB_TEMP_OFFSET ), //calib_need=0A= + false, //no_crystal_calibration=0A= + false, //support_hostap=0A= + true, //no_multi_vaps=0A= + 0, //additional_gp_drv_bit=0A= +};=0A= +static struct iwn_base_params iwn_5x50_base_params =3D {=0A= + IWN_ANA_PLL_INIT, // pll_cfg_val=0A= + 4, //max_ll_items=0A= + true, // shadow_ram_support=0A= + /*.led_compensation =3D */57,=0A= + /*.adv_thermal_throttle =3D*/ true,=0A= + /*.support_ct_kill_exit =3D */true,=0A= + /*.plcp_delta_threshold =3D*/ 50, /*IWL_MAX_PLCP_ERR_THRESHOLD_DEF,*/=0A= + /*.chain_noise_scale =3D*/ 1000,=0A= + /*.wd_timeout =3D */2000, /* IWL_LONG_WD_TIMEOUT,*/=0A= + /*.max_event_log_size =3D*/ 512,=0A= + false, //shadow_reg_enable=0A= + /*.hd_v2 =3D */true,=0A= + false, // advanced_bt_coexist=0A= + false, // bt_session_2=0A= + true, // bt_sco_disable=0A= + false, //additional_nic_config=0A= + iwn5000_regulatory_bands, //regulatory_bands=0A= + false, //enhanced_TX_power=0A= + (IWN_FLG_NEED_PHY_CALIB_DC | IWN_FLG_NEED_PHY_CALIB_LO |=0A= + IWN_FLG_NEED_PHY_CALIB_TX_IQ | IWN_FLG_NEED_PHY_CALIB_BASE_BAND ), = //calib_need=0A= + true, //no_crystal_calibration=0A= + false, //support_hostap=0A= + true, // no_multi_vaps=0A= + 0, //additional_gp_drv_bit=0A= +};=0A= +=0A= Index: sys/dev/iwn/if_iwnvar.h=0A= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=0A= --- sys/dev/iwn/if_iwnvar.h (revision 254210)=0A= +++ sys/dev/iwn/if_iwnvar.h (working copy)=0A= @@ -136,6 +136,7 @@=0A= struct ieee80211_node ni; /* must be the first */=0A= uint16_t disable_tid;=0A= uint8_t id;=0A= + uint32_t ridx[256];=0A= struct {=0A= uint64_t bitmap;=0A= int startidx;=0A= @@ -174,6 +175,9 @@=0A= uint32_t energy_samples[10];=0A= u_int cur_energy_sample;=0A= uint32_t energy_cck;=0A= +=0A= + uint32_t corr_barker_mrc;=0A= + uint32_t energy_ofdm;=0A= };=0A= =0A= struct iwn_calib_info {=0A= @@ -315,7 +319,7 @@=0A= struct callout watchdog_to;=0A= struct callout ct_kill_exit_to;=0A= struct iwn_fw_info fw;=0A= - struct iwn_calib_info calibcmd[5];=0A= + struct iwn_calib_info calibcmd[IWN5000_PHY_CALIB_MAX_RESULT];=0A= uint32_t errptr;=0A= =0A= struct iwn_rx_stat last_rx_stat;=0A= ------=_NextPart_000_0004_01CE968D.7B91F040-- From owner-freebsd-wireless@FreeBSD.ORG Sun Aug 11 13:09:59 2013 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 77B7F7DE for ; Sun, 11 Aug 2013 13:09:59 +0000 (UTC) (envelope-from cg@cgross.info) Received: from alpha.kreiz-it.fr (alpha.kreiz-it.fr [IPv6:2001:41d0:8:dda6::1]) by mx1.freebsd.org (Postfix) with ESMTP id 8D31F24AB for ; Sun, 11 Aug 2013 13:09:58 +0000 (UTC) Received: from DirTech (lnr56-1-82-246-51-185.fbx.proxad.net [82.246.51.185]) by alpha.kreiz-it.fr (Postfix) with ESMTPSA id 9CF851B3 for ; Sun, 11 Aug 2013 15:09:56 +0200 (CEST) From: "Cedric GROSS" To: Subject: [iwn]Review Split 6 Date: Sun, 11 Aug 2013 15:09:54 +0200 Message-ID: <001d01ce9694$142db8b0$3c892a10$@info> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_001E_01CE96A4.D7B688B0" X-Mailer: Microsoft Office Outlook 12.0 Thread-Index: Ac6WlBJVX/p7JGXXQomXWq855xMLrA== Content-Language: fr X-Content-Filtered-By: Mailman/MimeDel 2.1.14 X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.14 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, 11 Aug 2013 13:09:59 -0000 This is a multi-part message in MIME format. ------=_NextPart_000_001E_01CE96A4.D7B688B0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Hello, Here is patch split 6. It's follow split 5 as it implement PAN context. This patch is purely based on work done by Sean Bruno. Cedric ------=_NextPart_000_001E_01CE96A4.D7B688B0 Content-Type: application/octet-stream; name="pan.patch" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="pan.patch" Index: sys/dev/iwn/if_iwn.c=0A= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=0A= --- sys/dev/iwn/if_iwn.c (revision 254210)=0A= +++ sys/dev/iwn/if_iwn.c (working copy)=0A= @@ -330,7 +330,16 @@=0A= static char *iwn_get_csr_string(int);=0A= static void iwn_debug_register(struct iwn_softc *);=0A= #endif=0A= +static int iwn_newstate_u1(struct ieee80211vap *, enum ieee80211_state, = int);=0A= +static int iwn_auth_u1(struct iwn_softc *, struct ieee80211vap *);=0A= +static int iwn_run_u1(struct iwn_softc *, struct ieee80211vap *);=0A= +static int iwn_set_timing_u1(struct iwn_softc *);=0A= +static int iwn_config_u1(struct iwn_softc *);=0A= +static int iwn_set_pan_params(struct iwn_softc *);=0A= +static int iwn_updateedca_u1(struct ieee80211com *);=0A= +static int iwn_add_broadcast_node_u1(struct iwn_softc *, int);=0A= =0A= +=0A= #ifdef IWN_DEBUG=0A= enum {=0A= IWN_DEBUG_XMIT =3D 0x00000001, /* basic xmit operation */=0A= @@ -919,6 +928,13 @@=0A= =0A= IEEE80211_ADDR_COPY(mac1, mac);=0A= =0A= + if(unit =3D=3D 1) {=0A= + if(!(sc->sc_flags & IWN_FLAG_PAN_SUPPORT))=0A= + return NULL;=0A= + mac1[5] +=3D 1;=0A= + sc->ctx =3D IWN_RXON_PAN_CTX;=0A= + }=0A= +=0A= ivp =3D (struct iwn_vap *) malloc(sizeof(struct iwn_vap),=0A= M_80211_VAP, M_NOWAIT | M_ZERO);=0A= if (ivp =3D=3D NULL)=0A= @@ -925,13 +941,27 @@=0A= return NULL;=0A= vap =3D &ivp->iv_vap;=0A= ieee80211_vap_setup(ic, vap, name, unit, opmode, flags, bssid, mac1);=0A= - ivp->ctx =3D IWN_RXON_BSS_CTX;=0A= - IEEE80211_ADDR_COPY(ivp->macaddr, mac1);=0A= +=0A= + if(unit =3D=3D 1) {=0A= + ivp->ctx =3D IWN_RXON_PAN_CTX;=0A= + ivp->iv_newstate =3D vap->iv_newstate;=0A= + vap->iv_newstate =3D iwn_newstate_u1;=0A= + IEEE80211_ADDR_COPY(ivp->macaddr, mac1);=0A= + memset(&sc->rx_on[IWN_RXON_PAN_CTX], 0, sizeof (struct iwn_rxon));=0A= + memcpy(&sc->rx_on[IWN_RXON_PAN_CTX], &sc->rx_on[IWN_RXON_BSS_CTX], = sc->rxonsz);=0A= + IEEE80211_ADDR_COPY(sc->rx_on[IWN_RXON_PAN_CTX].myaddr, mac1);=0A= + sc->rx_on[IWN_RXON_PAN_CTX].mode =3D IWN_MODE_2STA;=0A= + sc->ivap[IWN_RXON_PAN_CTX] =3D vap;=0A= + }=0A= + else {=0A= + ivp->ctx =3D IWN_RXON_BSS_CTX;=0A= + IEEE80211_ADDR_COPY(ivp->macaddr, mac1);=0A= + ivp->iv_newstate =3D vap->iv_newstate;=0A= + vap->iv_newstate =3D iwn_newstate;=0A= + sc->ivap[IWN_RXON_BSS_CTX] =3D vap;=0A= + }=0A= +=0A= vap->iv_bmissthreshold =3D 10; /* override default */=0A= - /* Override with driver methods. */=0A= - ivp->iv_newstate =3D vap->iv_newstate;=0A= - vap->iv_newstate =3D iwn_newstate;=0A= - sc->ivap[IWN_RXON_BSS_CTX] =3D vap;=0A= =0A= ieee80211_ratectl_init(vap);=0A= /* Complete setup. */=0A= @@ -944,7 +974,11 @@=0A= iwn_vap_delete(struct ieee80211vap *vap)=0A= {=0A= struct iwn_vap *ivp =3D IWN_VAP(vap);=0A= + struct iwn_softc *sc =3D vap->iv_ic->ic_ifp->if_softc;=0A= =0A= + if(ivp->ctx =3D=3D IWN_RXON_PAN_CTX)=0A= + sc->ctx =3D 0;=0A= +=0A= ieee80211_ratectl_deinit(vap);=0A= ieee80211_vap_detach(vap);=0A= free(ivp, M_80211_VAP);=0A= @@ -2794,6 +2828,7 @@=0A= struct ieee80211vap *vap =3D TAILQ_FIRST(&ic->ic_vaps);=0A= struct iwn_calib_state *calib =3D &sc->calib;=0A= struct iwn_stats *stats =3D (struct iwn_stats *)(desc + 1);=0A= + struct ieee80211vap *vap1;=0A= int temp;=0A= =0A= DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);=0A= @@ -2805,6 +2840,13 @@=0A= __func__);=0A= return;=0A= }=0A= + if(sc->ctx =3D=3D IWN_RXON_PAN_CTX) {=0A= + vap1 =3D sc->ivap[IWN_RXON_PAN_CTX];=0A= + /* Ignore statistics received during a scan. */=0A= + if (vap1->iv_state !=3D IEEE80211_S_RUN ||=0A= + (ic->ic_flags & IEEE80211_F_SCAN))=0A= + return;=0A= + }=0A= =0A= bus_dmamap_sync(sc->rxq.data_dmat, data->map, BUS_DMASYNC_POSTREAD);=0A= =0A= @@ -2993,12 +3035,20 @@=0A= static void=0A= iwn_cmd_done(struct iwn_softc *sc, struct iwn_rx_desc *desc)=0A= {=0A= - struct iwn_tx_ring *ring =3D &sc->txq[4];=0A= + struct iwn_tx_ring *ring;=0A= struct iwn_tx_data *data;=0A= + int cmd_queue_num;=0A= =0A= - if ((desc->qid & 0xf) !=3D 4)=0A= + if(sc->sc_flags & IWN_FLAG_PAN_SUPPORT)=0A= + cmd_queue_num =3D IWN_PAN_CMD_QUEUE;=0A= + else=0A= + cmd_queue_num =3D IWN_CMD_QUEUE_NUM;=0A= +=0A= +=0A= + if ((desc->qid & IWN_RX_DESC_QID_MSK) !=3D cmd_queue_num)=0A= return; /* Not a command ack. */=0A= =0A= + ring =3D &sc->txq[cmd_queue_num];=0A= data =3D &ring->data[desc->idx];=0A= =0A= /* If the command was mapped in an mbuf, free it. */=0A= @@ -3154,7 +3204,7 @@=0A= desc->type, iwn_intr_str(desc->type),=0A= le16toh(desc->len));=0A= =0A= - if (!(desc->qid & 0x80)) /* Reply to a command. */=0A= + if (!(desc->qid & IWN_UNSOLICITED_RX_NOTIF)) /* Reply to a command. */=0A= iwn_cmd_done(sc, desc);=0A= =0A= switch (desc->type) {=0A= @@ -3187,7 +3237,10 @@=0A= {=0A= struct iwn_beacon_missed *miss =3D=0A= (struct iwn_beacon_missed *)(desc + 1);=0A= - int misses;=0A= + int misses,iv_bmissthreshold;=0A= + int DoReinit =3D0 ;=0A= + struct ieee80211vap *vap0 =3D sc->ivap[IWN_RXON_BSS_CTX];=0A= + struct ieee80211vap *vap1 =3D sc->ivap[IWN_RXON_PAN_CTX];=0A= =0A= bus_dmamap_sync(sc->rxq.data_dmat, data->map,=0A= BUS_DMASYNC_POSTREAD);=0A= @@ -3194,17 +3247,31 @@=0A= misses =3D le32toh(miss->consecutive);=0A= =0A= DPRINTF(sc, IWN_DEBUG_STATE,=0A= - "%s: beacons missed %d/%d\n", __func__,=0A= - misses, le32toh(miss->total));=0A= + "%s: beacons missed %d/%d rcv %d expect %d\n", __func__,=0A= + misses, le32toh(miss->total), le32toh(miss->received),=0A= + le32toh(miss->expected));=0A= +=0A= + iv_bmissthreshold =3D vap0->iv_bmissthreshold;=0A= +=0A= + if(sc->ctx =3D=3D IWN_RXON_PAN_CTX) {=0A= + iv_bmissthreshold =3D vap1->iv_bmissthreshold;=0A= + if (vap0->iv_state =3D=3D IEEE80211_S_RUN &&=0A= + vap1->iv_state =3D=3D IEEE80211_S_RUN &&=0A= + (ic->ic_flags & IEEE80211_F_SCAN) =3D=3D 0)=0A= + DoReinit =3D 1;=0A= + }=0A= + else if (vap0->iv_state =3D=3D IEEE80211_S_RUN &&=0A= + (ic->ic_flags & IEEE80211_F_SCAN) =3D=3D 0)=0A= + DoReinit =3D 1;=0A= +=0A= /*=0A= * If more than 5 consecutive beacons are missed,=0A= * reinitialize the sensitivity state machine.=0A= */=0A= - if (vap->iv_state =3D=3D IEEE80211_S_RUN &&=0A= - (ic->ic_flags & IEEE80211_F_SCAN) =3D=3D 0) {=0A= + if (DoReinit=3D=3D1) {=0A= if (misses > 5)=0A= (void)iwn_init_sensitivity(sc);=0A= - if (misses >=3D vap->iv_bmissthreshold) {=0A= + if (misses >=3D iv_bmissthreshold) {=0A= IWN_UNLOCK(sc);=0A= ieee80211_beacon_miss(ic);=0A= IWN_LOCK(sc);=0A= @@ -3568,6 +3635,7 @@=0A= const struct ieee80211_txparam *tp;=0A= struct ieee80211vap *vap =3D ni->ni_vap;=0A= struct ieee80211com *ic =3D ni->ni_ic;=0A= + struct iwn_vap *ivp =3D IWN_VAP(vap);=0A= struct iwn_node *wn =3D (void *)ni;=0A= struct iwn_tx_ring *ring;=0A= struct iwn_tx_desc *desc;=0A= @@ -3600,21 +3668,23 @@=0A= qos =3D 0;=0A= tid =3D 0;=0A= }=0A= - ac =3D M_WME_GETAC(m);=0A= - if (m->m_flags & M_AMPDU_MPDU) {=0A= +=0A= + if(ivp->ctx =3D=3D IWN_RXON_PAN_CTX)=0A= + ac =3D iwn_pan_ac_to_queue[M_WME_GETAC(m)];=0A= + else=0A= + ac =3D iwn_bss_ac_to_queue[M_WME_GETAC(m)];=0A= +=0A= + if (IEEE80211_QOS_HAS_SEQ(wh) &&=0A= + IEEE80211_AMPDU_RUNNING(&ni->ni_tx_ampdu[ac])) {=0A= struct ieee80211_tx_ampdu *tap =3D &ni->ni_tx_ampdu[ac];=0A= =0A= - if (!IEEE80211_AMPDU_RUNNING(tap)) {=0A= - m_freem(m);=0A= - return EINVAL;=0A= - }=0A= -=0A= - ac =3D *(int *)tap->txa_private;=0A= + ring =3D &sc->txq[*(int *)tap->txa_private];=0A= *(uint16_t *)wh->i_seq =3D=0A= htole16(ni->ni_txseqs[tid] << IEEE80211_SEQ_SEQ_SHIFT);=0A= ni->ni_txseqs[tid]++;=0A= - }=0A= - ring =3D &sc->txq[ac];=0A= + } else=0A= + ring =3D &sc->txq[ac];=0A= +=0A= desc =3D &ring->desc[ring->cur];=0A= data =3D &ring->data[ring->cur];=0A= =0A= @@ -3707,9 +3777,12 @@=0A= }=0A= =0A= if (IEEE80211_IS_MULTICAST(wh->i_addr1) ||=0A= - type !=3D IEEE80211_FC0_TYPE_DATA)=0A= - tx->id =3D sc->broadcast_id;=0A= - else=0A= + type !=3D IEEE80211_FC0_TYPE_DATA) {=0A= + if(ivp->ctx =3D=3D IWN_RXON_PAN_CTX)=0A= + tx->id =3D IWN_PAN_ID_BCAST;=0A= + else=0A= + tx->id =3D sc->broadcast_id;=0A= + } else=0A= tx->id =3D wn->id;=0A= =0A= if (type =3D=3D IEEE80211_FC0_TYPE_MGT) {=0A= @@ -3739,7 +3812,7 @@=0A= tx->data_ntries =3D 15;=0A= tx->lifetime =3D htole32(IWN_LIFETIME_INFINITE);=0A= tx->rate =3D iwn_rate_to_plcp(sc, ni, rate);=0A= - if (tx->id =3D=3D sc->broadcast_id) {=0A= + if ((tx->id =3D=3D IWN_PAN_ID_BCAST) || (tx->id =3D=3D = sc->broadcast_id)) {=0A= /* Group or management frame. */=0A= tx->linkq =3D 0;=0A= /* XXX Alternate between antenna A and B? */=0A= @@ -3856,7 +3929,7 @@=0A= u_int hdrlen;=0A= int ac, totlen, error, pad, nsegs =3D 0, i, rate;=0A= uint8_t ridx, type, txant;=0A= -=0A= + struct iwn_vap *ivp =3D IWN_VAP(vap);=0A= DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);=0A= =0A= IWN_LOCK_ASSERT(sc);=0A= @@ -3946,7 +4019,10 @@=0A= =0A= tx->len =3D htole16(totlen);=0A= tx->tid =3D 0;=0A= - tx->id =3D sc->broadcast_id;=0A= + if(ivp->ctx =3D=3D IWN_RXON_PAN_CTX)=0A= + tx->id =3D IWN_PAN_ID_BCAST;=0A= + else=0A= + tx->id =3D sc->broadcast_id;=0A= tx->rts_ntries =3D params->ibp_try1;=0A= tx->data_ntries =3D params->ibp_try0;=0A= tx->lifetime =3D htole32(IWN_LIFETIME_INFINITE);=0A= @@ -4207,13 +4283,13 @@=0A= static int=0A= iwn_cmd(struct iwn_softc *sc, int code, const void *buf, int size, int = async)=0A= {=0A= - struct iwn_tx_ring *ring =3D &sc->txq[4];=0A= + struct iwn_tx_ring *ring ;=0A= struct iwn_tx_desc *desc;=0A= struct iwn_tx_data *data;=0A= struct iwn_tx_cmd *cmd;=0A= struct mbuf *m;=0A= bus_addr_t paddr;=0A= - int totlen, error;=0A= + int totlen, error,cmd_queue_num;=0A= =0A= DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);=0A= =0A= @@ -4220,6 +4296,12 @@=0A= if (async =3D=3D 0)=0A= IWN_LOCK_ASSERT(sc);=0A= =0A= + if(sc->sc_flags & IWN_FLAG_PAN_SUPPORT)=0A= + cmd_queue_num =3D IWN_PAN_CMD_QUEUE;=0A= + else=0A= + cmd_queue_num =3D IWN_CMD_QUEUE_NUM;=0A= +=0A= + ring =3D &sc->txq[cmd_queue_num];=0A= desc =3D &ring->desc[ring->cur];=0A= data =3D &ring->data[ring->cur];=0A= totlen =3D 4 + size;=0A= @@ -5546,6 +5628,8 @@=0A= struct ieee80211com *ic =3D ifp->if_l2com;=0A= struct ieee80211_scan_state *ss =3D ic->ic_scan; /*XXX*/=0A= struct ieee80211_node *ni =3D ss->ss_vap->iv_bss;=0A= + struct ieee80211vap *vap =3D ni->ni_vap;=0A= + struct iwn_vap *ivp =3D IWN_VAP(vap);=0A= struct iwn_scan_hdr *hdr;=0A= struct iwn_cmd_data *tx;=0A= struct iwn_scan_essid *essid;=0A= @@ -5560,7 +5644,11 @@=0A= =0A= DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);=0A= =0A= - sc->rxon =3D &sc->rx_on[IWN_RXON_BSS_CTX];=0A= + if(ivp->ctx =3D=3D IWN_RXON_BSS_CTX)=0A= + sc->rxon =3D &sc->rx_on[IWN_RXON_BSS_CTX];=0A= + else if(ivp->ctx =3D=3D IWN_RXON_PAN_CTX)=0A= + sc->rxon =3D &sc->rx_on[IWN_RXON_PAN_CTX];=0A= +=0A= buf =3D malloc(IWN_SCAN_MAXSZ, M_DEVBUF, M_NOWAIT | M_ZERO);=0A= if (buf =3D=3D NULL) {=0A= device_printf(sc->sc_dev,=0A= @@ -5592,7 +5680,11 @@=0A= =0A= tx =3D (struct iwn_cmd_data *)(hdr + 1);=0A= tx->flags =3D htole32(IWN_TX_AUTO_SEQ);=0A= - tx->id =3D sc->broadcast_id;=0A= + if(ivp->ctx =3D=3D IWN_RXON_PAN_CTX)=0A= + tx->id =3D IWN_PAN_ID_BCAST;=0A= + else=0A= + tx->id =3D sc->broadcast_id;=0A= +=0A= tx->lifetime =3D htole32(IWN_LIFETIME_INFINITE);=0A= =0A= if (IEEE80211_IS_CHAN_5GHZ(ic->ic_curchan)) {=0A= @@ -5629,7 +5721,7 @@=0A= IEEE80211_FC0_SUBTYPE_PROBE_REQ;=0A= wh->i_fc[1] =3D IEEE80211_FC1_DIR_NODS;=0A= IEEE80211_ADDR_COPY(wh->i_addr1, ifp->if_broadcastaddr);=0A= - IEEE80211_ADDR_COPY(wh->i_addr2, IF_LLADDR(ifp));=0A= + IEEE80211_ADDR_COPY(wh->i_addr2, ivp->macaddr);=0A= IEEE80211_ADDR_COPY(wh->i_addr3, ifp->if_broadcastaddr);=0A= *(uint16_t *)&wh->i_dur[0] =3D 0; /* filled by HW */=0A= *(uint16_t *)&wh->i_seq[0] =3D 0; /* filled by HW */=0A= @@ -5781,6 +5873,15 @@=0A= DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);=0A= =0A= sc->rxon =3D &sc->rx_on[IWN_RXON_BSS_CTX];=0A= +=0A= + if(sc->ctx =3D=3D IWN_RXON_PAN_CTX) {=0A= + if ((error =3D iwn_set_pan_params(sc)) !=3D 0) {=0A= + device_printf(sc->sc_dev,=0A= + "%s: iwn_set_pan_params error %d\n", __func__, error);=0A= + return error;=0A= + }=0A= + }=0A= +=0A= if (ic->ic_opmode =3D=3D IEEE80211_M_MONITOR) {=0A= /* Link LED blinks while monitoring. */=0A= iwn_set_led(sc, IWN_LED_LINK, 5, 5);=0A= @@ -6420,7 +6521,11 @@=0A= IWN_SETBITS(sc, IWN_FH_TX_CHICKEN, IWN_FH_TX_CHICKEN_SCHED_RETRY);=0A= =0A= /* Enable chain mode for all queues, except command queue. */=0A= - iwn_prph_write(sc, IWN5000_SCHED_QCHAIN_SEL, 0xfffef);=0A= + if(sc->sc_flags & IWN_FLAG_PAN_SUPPORT)=0A= + iwn_prph_write(sc, IWN5000_SCHED_QCHAIN_SEL, 0xffdff);=0A= + else=0A= + iwn_prph_write(sc, IWN5000_SCHED_QCHAIN_SEL, 0xfffef);=0A= +=0A= iwn_prph_write(sc, IWN5000_SCHED_AGGR_SEL, 0);=0A= =0A= for (qid =3D 0; qid < IWN5000_NTXQUEUES; qid++) {=0A= @@ -6440,11 +6545,20 @@=0A= /* Identify TX FIFO rings (0-7). */=0A= iwn_prph_write(sc, IWN5000_SCHED_TXFACT, 0xff);=0A= =0A= - /* Mark TX rings (4 EDCA + cmd + 2 HCCA) as active. */=0A= - for (qid =3D 0; qid < 7; qid++) {=0A= - static uint8_t qid2fifo[] =3D { 3, 2, 1, 0, 7, 5, 6 };=0A= - iwn_prph_write(sc, IWN5000_SCHED_QUEUE_STATUS(qid),=0A= - IWN5000_TXQ_STATUS_ACTIVE | qid2fifo[qid]);=0A= + if(sc->sc_flags & IWN_FLAG_PAN_SUPPORT) {=0A= + /* Mark TX rings as active. */=0A= + for (qid =3D 0; qid < 11; qid++) {=0A= + static uint8_t qid2fifo[] =3D { 3, 2, 1, 0, 0, 4, 2, 5, 4, 7, 5 };=0A= + iwn_prph_write(sc, IWN5000_SCHED_QUEUE_STATUS(qid),=0A= + IWN5000_TXQ_STATUS_ACTIVE | qid2fifo[qid]);=0A= + }=0A= + } else {=0A= + /* Mark TX rings (4 EDCA + cmd + 2 HCCA) as active. */=0A= + for (qid =3D 0; qid < 7; qid++) {=0A= + static uint8_t qid2fifo[] =3D { 3, 2, 1, 0, 7, 5, 6 };=0A= + iwn_prph_write(sc, IWN5000_SCHED_QUEUE_STATUS(qid),=0A= + IWN5000_TXQ_STATUS_ACTIVE | qid2fifo[qid]);=0A= + }=0A= }=0A= iwn_nic_unlock(sc);=0A= =0A= @@ -7621,3 +7735,510 @@=0A= DPRINTF(sc, IWN_DEBUG_REGISTER,"%s","\n");=0A= }=0A= #endif=0A= +static int=0A= +iwn_newstate_u1(struct ieee80211vap *vap, enum ieee80211_state nstate, = int arg)=0A= +{=0A= + struct iwn_vap *ivp =3D IWN_VAP(vap);=0A= + struct ieee80211com *ic =3D vap->iv_ic;=0A= + struct iwn_softc *sc =3D ic->ic_ifp->if_softc;=0A= +=0A= + int error =3D 0;=0A= +=0A= + DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);=0A= +=0A= + DPRINTF(sc, IWN_DEBUG_STATE, "%s: %s -> %s\n", __func__,=0A= + ieee80211_state_name[vap->iv_state], ieee80211_state_name[nstate]);=0A= +=0A= + IEEE80211_UNLOCK(ic);=0A= + IWN_LOCK(sc);=0A= + callout_stop(&sc->calib_to);=0A= +=0A= + sc->rxon =3D &sc->rx_on[IWN_RXON_PAN_CTX];=0A= +=0A= + switch (nstate) {=0A= + case IEEE80211_S_ASSOC:=0A= + if (vap->iv_state !=3D IEEE80211_S_RUN)=0A= + break;=0A= + /* FALLTHROUGH */=0A= + case IEEE80211_S_AUTH:=0A= + if (vap->iv_state =3D=3D IEEE80211_S_AUTH)=0A= + break;=0A= +=0A= + /*=0A= + * !AUTH -> AUTH transition requires state reset to handle=0A= + * reassociations correctly.=0A= + */=0A= + sc->rxon->associd =3D 0;=0A= + sc->rxon->filter &=3D ~htole32(IWN_FILTER_BSS);=0A= + sc->calib.state =3D IWN_CALIB_STATE_INIT;=0A= +=0A= + if ((error =3D iwn_auth_u1(sc, vap)) !=3D 0) {=0A= + device_printf(sc->sc_dev,=0A= + "%s: could not move to auth state\n", __func__);=0A= + }=0A= + break;=0A= +=0A= + case IEEE80211_S_SCAN:=0A= +=0A= +=0A= + if ((error =3D iwn_set_timing_u1(sc)) !=3D 0) {=0A= + device_printf(sc->sc_dev,=0A= + "%s: iwn_set_timing_u1 error %d\n", __func__, error);=0A= + return error;=0A= + }=0A= +=0A= + break;=0A= +=0A= + case IEEE80211_S_RUN:=0A= +=0A= + /*=0A= + * RUN -> RUN transition; Just restart the timers.=0A= + */=0A= + if (vap->iv_state =3D=3D IEEE80211_S_RUN) {=0A= + sc->calib_cnt =3D 0;=0A= + break;=0A= + }=0A= +=0A= + /*=0A= + * !RUN -> RUN requires setting the association id=0A= + * which is done with a firmware cmd. We also defer=0A= + * starting the timers until that work is done.=0A= + */=0A= + if ((error =3D iwn_run_u1(sc, vap)) !=3D 0) {=0A= + device_printf(sc->sc_dev,=0A= + "%s: could not move to run state\n", __func__);=0A= + }=0A= + break;=0A= +=0A= + case IEEE80211_S_INIT:=0A= + sc->calib.state =3D IWN_CALIB_STATE_INIT;=0A= + break;=0A= +=0A= + default:=0A= + break;=0A= + }=0A= + IWN_UNLOCK(sc);=0A= + IEEE80211_LOCK(ic);=0A= + if (error !=3D 0) {=0A= + DPRINTF(sc, IWN_DEBUG_TRACE, "->%s end in error\n", __func__);=0A= + return error;=0A= + }=0A= + DPRINTF(sc, IWN_DEBUG_TRACE, "->%s end\n", __func__);=0A= + return ivp->iv_newstate(vap, nstate, arg);=0A= +}=0A= +=0A= +static int=0A= +iwn_auth_u1(struct iwn_softc *sc, struct ieee80211vap *vap)=0A= +{=0A= + struct iwn_ops *ops =3D &sc->ops;=0A= + struct ifnet *ifp =3D sc->sc_ifp;=0A= + struct ieee80211com *ic =3D ifp->if_l2com;=0A= + struct ieee80211_node *ni =3D vap->iv_bss;=0A= + int error;=0A= + struct iwn_vap *ivp =3D IWN_VAP(vap);=0A= +=0A= + DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);=0A= +=0A= + sc->rxon =3D &sc->rx_on[IWN_RXON_PAN_CTX];=0A= + IEEE80211_ADDR_COPY(sc->rxon->myaddr, ivp->macaddr);=0A= + IEEE80211_ADDR_COPY(sc->rxon->wlap, IF_LLADDR(ifp));=0A= + /* Update adapter configuration. */=0A= + IEEE80211_ADDR_COPY(sc->rxon->bssid, ni->ni_bssid);=0A= + sc->rxon->chan =3D ieee80211_chan2ieee(ic, ni->ni_chan);=0A= + sc->rxon->flags =3D htole32(IWN_RXON_TSF | IWN_RXON_CTS_TO_SELF);=0A= + if (IEEE80211_IS_CHAN_2GHZ(ni->ni_chan))=0A= + sc->rxon->flags |=3D htole32(IWN_RXON_AUTO | IWN_RXON_24GHZ);=0A= + if (ic->ic_flags & IEEE80211_F_SHSLOT)=0A= + sc->rxon->flags |=3D htole32(IWN_RXON_SHSLOT);=0A= + if (ic->ic_flags & IEEE80211_F_SHPREAMBLE)=0A= + sc->rxon->flags |=3D htole32(IWN_RXON_SHPREAMBLE);=0A= + if (IEEE80211_IS_CHAN_A(ni->ni_chan)) {=0A= + sc->rxon->cck_mask =3D 0;=0A= + sc->rxon->ofdm_mask =3D 0x15;=0A= + } else if (IEEE80211_IS_CHAN_B(ni->ni_chan)) {=0A= + sc->rxon->cck_mask =3D 0x03;=0A= + sc->rxon->ofdm_mask =3D 0;=0A= + } else {=0A= + /* Assume 802.11b/g. */=0A= + sc->rxon->cck_mask =3D 0x0f;=0A= + sc->rxon->ofdm_mask =3D 0x15;=0A= + }=0A= + DPRINTF(sc, IWN_DEBUG_STATE, "rxon chan %d flags %x cck %x ofdm %x\n",=0A= + sc->rxon->chan, sc->rxon->flags, sc->rxon->cck_mask,=0A= + sc->rxon->ofdm_mask);=0A= + sc->rxon->mode =3D IWN_MODE_2STA;=0A= + error =3D iwn_cmd(sc, IWN_CMD_WIPAN_RXON, sc->rxon, sc->rxonsz, 0);=0A= + if (error !=3D 0) {=0A= + device_printf(sc->sc_dev, "%s: RXON command failed, error %d\n",=0A= + __func__, error);=0A= + return error;=0A= + }=0A= +=0A= + /* Configuration has changed, set TX power accordingly. */=0A= + if ((error =3D ops->set_txpower(sc, ni->ni_chan, 1)) !=3D 0) {=0A= + device_printf(sc->sc_dev,=0A= + "%s: could not set TX power, error %d\n", __func__, error);=0A= + return error;=0A= + }=0A= + /*=0A= + * Reconfiguring RXON clears the firmware nodes table so we must=0A= + * add the broadcast node again.=0A= + */=0A= + if ((error =3D iwn_add_broadcast_node_u1(sc, 0)) !=3D 0) {=0A= + device_printf(sc->sc_dev,=0A= + "%s: could not add broadcast node, error %d\n", __func__,=0A= + error);=0A= + return error;=0A= + }=0A= + DPRINTF(sc, IWN_DEBUG_TRACE, "->%s end\n", __func__);=0A= +=0A= + return 0;=0A= +}=0A= +=0A= +static int=0A= +iwn_run_u1(struct iwn_softc *sc, struct ieee80211vap *vap)=0A= +{=0A= + struct iwn_ops *ops =3D &sc->ops;=0A= + struct ifnet *ifp =3D sc->sc_ifp;=0A= + struct ieee80211com *ic =3D ifp->if_l2com;=0A= + struct ieee80211_node *ni =3D vap->iv_bss;=0A= + struct iwn_node_info node;=0A= + uint32_t htflags =3D 0;=0A= + int error;=0A= + struct iwn_vap *ivp =3D IWN_VAP(vap);=0A= +=0A= + DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);=0A= +=0A= + if (ic->ic_opmode =3D=3D IEEE80211_M_MONITOR) {=0A= + /* Link LED blinks while monitoring. */=0A= + return 0;=0A= + }=0A= +=0A= + if ((error =3D iwn_set_timing_u1(sc)) !=3D 0) {=0A= + device_printf(sc->sc_dev,=0A= + "%s: could not set timing, error %d\n", __func__, error);=0A= + }=0A= +=0A= + if ((error =3D iwn_updateedca_u1(ic)) !=3D 0) {=0A= + device_printf(sc->sc_dev,=0A= + "%s: iwn_updateedca_u1, error %d\n", __func__, error);=0A= + return error;=0A= + }=0A= +=0A= + sc->rxon =3D &sc->rx_on[IWN_RXON_PAN_CTX];=0A= + IEEE80211_ADDR_COPY(sc->rxon->myaddr, ivp->macaddr);=0A= + IEEE80211_ADDR_COPY(sc->rxon->wlap, IF_LLADDR(ifp));=0A= + /* Update adapter configuration. */=0A= + IEEE80211_ADDR_COPY(sc->rxon->bssid, ni->ni_bssid);=0A= + sc->rxon->associd =3D htole16(IEEE80211_AID(ni->ni_associd));=0A= + sc->rxon->chan =3D ieee80211_chan2ieee(ic, ni->ni_chan);=0A= + sc->rxon->flags =3D htole32(IWN_RXON_TSF | IWN_RXON_CTS_TO_SELF);=0A= + if (IEEE80211_IS_CHAN_2GHZ(ni->ni_chan))=0A= + sc->rxon->flags |=3D htole32(IWN_RXON_AUTO | IWN_RXON_24GHZ);=0A= + if (ic->ic_flags & IEEE80211_F_SHSLOT)=0A= + sc->rxon->flags |=3D htole32(IWN_RXON_SHSLOT);=0A= + if (ic->ic_flags & IEEE80211_F_SHPREAMBLE)=0A= + sc->rxon->flags |=3D htole32(IWN_RXON_SHPREAMBLE);=0A= + if (IEEE80211_IS_CHAN_A(ni->ni_chan)) {=0A= + sc->rxon->cck_mask =3D 0;=0A= + sc->rxon->ofdm_mask =3D 0x15;=0A= + } else if (IEEE80211_IS_CHAN_B(ni->ni_chan)) {=0A= + sc->rxon->cck_mask =3D 0x03;=0A= + sc->rxon->ofdm_mask =3D 0;=0A= + } else {=0A= + /* Assume 802.11b/g. */=0A= + sc->rxon->cck_mask =3D 0x0f;=0A= + sc->rxon->ofdm_mask =3D 0x15;=0A= + }=0A= + if (IEEE80211_IS_CHAN_HT(ni->ni_chan)) {=0A= + htflags |=3D IWN_RXON_HT_PROTMODE(ic->ic_curhtprotmode);=0A= + if (IEEE80211_IS_CHAN_HT40(ni->ni_chan)) {=0A= + switch (ic->ic_curhtprotmode) {=0A= + case IEEE80211_HTINFO_OPMODE_HT20PR:=0A= + htflags |=3D IWN_RXON_HT_MODEPURE40;=0A= + break;=0A= + default:=0A= + htflags |=3D IWN_RXON_HT_MODEMIXED;=0A= + break;=0A= + }=0A= + }=0A= + if (IEEE80211_IS_CHAN_HT40D(ni->ni_chan))=0A= + htflags |=3D IWN_RXON_HT_HT40MINUS;=0A= + }=0A= + sc->rxon->flags |=3D htole32(htflags);=0A= + sc->rxon->filter |=3D htole32(IWN_FILTER_BSS);=0A= + DPRINTF(sc, IWN_DEBUG_STATE, "rxon chan %d flags %x\n",=0A= + sc->rxon->chan, sc->rxon->flags);=0A= + sc->rxon->mode =3D IWN_MODE_2STA;=0A= + error =3D iwn_cmd(sc, IWN_CMD_WIPAN_RXON, sc->rxon, sc->rxonsz, 0);=0A= + if (error !=3D 0) {=0A= + device_printf(sc->sc_dev,=0A= + "%s: could not update configuration, error %d\n", __func__,=0A= + error);=0A= + return error;=0A= + }=0A= +=0A= + /* Configuration has changed, set TX power accordingly. */=0A= + if ((error =3D ops->set_txpower(sc, ni->ni_chan, 1)) !=3D 0) {=0A= + device_printf(sc->sc_dev,=0A= + "%s: could not set TX power, error %d\n", __func__, error);=0A= + return error;=0A= + }=0A= +=0A= + /* Fake a join to initialize the TX rate. */=0A= + ((struct iwn_node *)ni)->id =3D IWN_STA_ID;=0A= + iwn_newassoc(ni, 1);=0A= +=0A= + /* Add BSS node. */=0A= + memset(&node, 0, sizeof node);=0A= + node.htflags |=3D htole32(IWN_STA_FLAG_PAN_STATION);=0A= + IEEE80211_ADDR_COPY(node.macaddr, ni->ni_macaddr);=0A= + node.id =3D IWN_STA_ID;=0A= + if (IEEE80211_IS_CHAN_HT(ni->ni_chan)) {=0A= + switch (ni->ni_htcap & IEEE80211_HTCAP_SMPS) {=0A= + case IEEE80211_HTCAP_SMPS_ENA:=0A= + node.htflags |=3D htole32(IWN_SMPS_MIMO_DIS);=0A= + break;=0A= + case IEEE80211_HTCAP_SMPS_DYNAMIC:=0A= + node.htflags |=3D htole32(IWN_SMPS_MIMO_PROT);=0A= + break;=0A= + }=0A= + node.htflags |=3D htole32(IWN_AMDPU_SIZE_FACTOR(3) |=0A= + IWN_AMDPU_DENSITY(5)); /* 4us */=0A= + if (IEEE80211_IS_CHAN_HT40(ni->ni_chan))=0A= + node.htflags |=3D htole32(IWN_NODE_HT40);=0A= + }=0A= + DPRINTF(sc, IWN_DEBUG_STATE, "%s: adding BSS node1\n", __func__);=0A= + error =3D ops->add_node(sc, &node, 0);=0A= + if (error !=3D 0) {=0A= + device_printf(sc->sc_dev,=0A= + "%s: could not add BSS node1, error %d\n", __func__, error);=0A= + return error;=0A= + }=0A= +=0A= + /* Setting the initial rate for node */=0A= + ni->ni_txrate =3D ni->ni_rates.rs_rates[0];=0A= +=0A= + /* XXX: init rate scaling */=0A= +=0A= + DPRINTF(sc, IWN_DEBUG_TRACE, "->%s end\n", __func__);=0A= +=0A= +#ifdef IWN_DTIM_INDICATES_UNICAST_PENDING_AT_AP=0A= + return iwn_set_pslevel(sc, IWN_POWERSAVE_DTIM_VOIP_COMPATIBLE,=0A= + sc->desired_pwrsave_level, 0);=0A= +#else=0A= + return 0;=0A= +#endif=0A= +=0A= +}=0A= +=0A= +static int=0A= +iwn_set_timing_u1(struct iwn_softc *sc)=0A= +{=0A= + struct iwn_cmd_timing cmd;=0A= + int error =3D 0;=0A= + struct ieee80211vap *vap;=0A= + struct iwn_vap *ivp;=0A= +=0A= + DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);=0A= +=0A= + vap =3D sc->ivap[IWN_RXON_PAN_CTX];=0A= + ivp =3D IWN_VAP(vap);=0A= +=0A= + if ((error =3D iwn_config_u1(sc)) !=3D 0) {=0A= + device_printf(sc->sc_dev,=0A= + "%s: iwn_config1 error %d\n", __func__, error);=0A= + return error;=0A= + }=0A= +=0A= + if ((error =3D iwn_set_pan_params(sc)) !=3D 0) {=0A= + device_printf(sc->sc_dev,=0A= + "%s: iwn_set_pan_params error %d\n", __func__, error);=0A= + return error;=0A= + }=0A= +=0A= + memset(&cmd, 0, sizeof cmd);=0A= + cmd.lintval =3D htole16(10);=0A= + cmd.bintval =3D htole16(IWN_BEACON_INTERVAL_DEFAULT);=0A= + ivp->beacon_int =3D cmd.bintval;=0A= + cmd.binitval =3D htole32(0x032000);=0A= + cmd.dtim_period =3D 1;=0A= +=0A= + DPRINTF(sc, IWN_DEBUG_TRACE, "->%s end\n", __func__);=0A= +=0A= + return iwn_cmd(sc, IWN_CMD_WIPAN_RXON_TIMING, &cmd, sizeof cmd, 0);=0A= +}=0A= +=0A= +static int=0A= +iwn_config_u1(struct iwn_softc *sc)=0A= +{=0A= + struct ifnet *ifp =3D sc->sc_ifp;=0A= + struct ieee80211com *ic =3D ifp->if_l2com;=0A= + uint16_t rxchain;=0A= + int error;=0A= + struct ieee80211vap *vap =3D sc->ivap[IWN_RXON_PAN_CTX];=0A= + struct iwn_vap *ivp =3D IWN_VAP(vap);=0A= +=0A= + DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);=0A= +=0A= + sc->rxon =3D &sc->rx_on[IWN_RXON_PAN_CTX];=0A= + IEEE80211_ADDR_COPY(sc->rxon->myaddr, ivp->macaddr);=0A= + IEEE80211_ADDR_COPY(sc->rxon->wlap, IF_LLADDR(ifp));=0A= + sc->rxon->chan =3D ieee80211_chan2ieee(ic, ic->ic_curchan);=0A= + sc->rxon->flags =3D htole32(IWN_RXON_TSF);=0A= + if (IEEE80211_IS_CHAN_2GHZ(ic->ic_curchan))=0A= + sc->rxon->flags |=3D htole32(IWN_RXON_AUTO | IWN_RXON_24GHZ);=0A= + sc->rxon->mode =3D IWN_MODE_P2P;=0A= + sc->rxon->filter =3D htole32(IWN_FILTER_MULTICAST);=0A= + sc->rxon->cck_mask =3D 0x0f; /* not yet negotiated */=0A= + sc->rxon->ofdm_mask =3D 0xff; /* not yet negotiated */=0A= + sc->rxon->ht_single_mask =3D 0xff;=0A= + sc->rxon->ht_dual_mask =3D 0xff;=0A= + sc->rxon->ht_triple_mask =3D 0xff;=0A= + rxchain =3D=0A= + IWN_RXCHAIN_VALID(sc->rxchainmask) |=0A= + IWN_RXCHAIN_MIMO_COUNT(2) |=0A= + IWN_RXCHAIN_IDLE_COUNT(2);=0A= + sc->rxon->rxchain =3D htole16(rxchain);=0A= + sc->rxon->associd =3D 0;=0A= + sc->rxon->filter &=3D ~htole32(IWN_FILTER_BSS);=0A= +=0A= + error =3D iwn_cmd(sc, IWN_CMD_WIPAN_RXON, sc->rxon, sc->rxonsz, 0);=0A= + if (error !=3D 0) {=0A= + device_printf(sc->sc_dev, "%s: IWN_CMD_WIPAN_RXON command failed\n",=0A= + __func__);=0A= + return error;=0A= + }=0A= + DPRINTF(sc, IWN_DEBUG_TRACE, "->%s end\n", __func__);=0A= +=0A= + return 0;=0A= +}=0A= +=0A= +static int=0A= +iwn_set_pan_params(struct iwn_softc *sc)=0A= +{=0A= + struct iwn_pan_params_cmd cmd;=0A= + int slot0 =3D 300, slot1 =3D 0;=0A= + int bcnint;=0A= + int error =3D 0;=0A= +=0A= + DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);=0A= +=0A= + /*=0A= + * If the PAN context is inactive, then we don't need=0A= + * to update the PAN parameters=0A= + */=0A= + if (sc->ctx !=3D IWN_RXON_PAN_CTX) {=0A= + DPRINTF(sc, IWN_DEBUG_TRACE, "->%s end with no need to do that\n",=0A= + __func__);=0A= + return 0;=0A= + }=0A= +=0A= + memset(&cmd, 0, sizeof(cmd));=0A= +=0A= + /* only 2 slots are currently allowed */=0A= + cmd.num_slots =3D 2;=0A= +=0A= + cmd.slots[0].type =3D IWN_RXON_BSS_CTX; /* BSS */=0A= + cmd.slots[1].type =3D IWN_RXON_PAN_CTX; /* PAN */=0A= +=0A= + cmd.flags |=3D htole16(IWN_PAN_PARAMS_FLG_SLOTTED_MODE);=0A= + bcnint =3D IWN_BEACON_INTERVAL_DEFAULT;=0A= + slot0 =3D (bcnint >> 1);=0A= + slot1 =3D (bcnint - slot0);=0A= +=0A= + if(sc->uc_scan_progress =3D=3D 1) {=0A= + slot0 =3D bcnint * 3 - IWN_SLOT_TIME_MIN;=0A= + slot1 =3D IWN_SLOT_TIME_MIN;=0A= + }=0A= + cmd.slots[0].time =3D htole16(slot0);=0A= + cmd.slots[1].time =3D htole16(slot1);=0A= +=0A= + error =3D iwn_cmd(sc, IWN_CMD_WIPAN_PARAMS, &cmd, sizeof(cmd), 0);=0A= + if (error !=3D 0) {=0A= + device_printf(sc->sc_dev,=0A= + "%s: IWN_CMD_WIPAN_PARAMS command failed, error %d\n",=0A= + __func__, error);=0A= + return error;=0A= + }=0A= +=0A= + DPRINTF(sc, IWN_DEBUG_TRACE, "->%s end\n", __func__);=0A= +=0A= + return 0;=0A= +}=0A= +=0A= +static int=0A= +iwn_updateedca_u1(struct ieee80211com *ic)=0A= +{=0A= +#define IWN_EXP2(x) ((1 << (x)) - 1) /* CWmin =3D 2^ECWmin - 1 */=0A= + struct iwn_softc *sc =3D ic->ic_ifp->if_softc;=0A= + struct iwn_edca_params cmd;=0A= + int aci;=0A= +=0A= + memset(&cmd, 0, sizeof cmd);=0A= + cmd.flags =3D htole32(IWN_EDCA_UPDATE);=0A= + for (aci =3D 0; aci < WME_NUM_AC; aci++) {=0A= + const struct wmeParams *ac =3D=0A= + &ic->ic_wme.wme_chanParams.cap_wmeParams[aci];=0A= + cmd.ac[aci].aifsn =3D ac->wmep_aifsn;=0A= + cmd.ac[aci].cwmin =3D htole16(IWN_EXP2(ac->wmep_logcwmin));=0A= + cmd.ac[aci].cwmax =3D htole16(IWN_EXP2(ac->wmep_logcwmax));=0A= + cmd.ac[aci].txoplimit =3D=0A= + htole16(IEEE80211_TXOP_TO_US(ac->wmep_txopLimit));=0A= + }=0A= + return iwn_cmd(sc, IWN_CMD_WIPAN_QOS_PARAM, &cmd, sizeof cmd, 1);=0A= +#undef IWN_EXP2=0A= +}=0A= +=0A= +/*=0A= + * Broadcast node is used to send group-addressed and management frames.=0A= + */=0A= +static int=0A= +iwn_add_broadcast_node_u1(struct iwn_softc *sc, int async)=0A= +{=0A= + struct iwn_ops *ops =3D &sc->ops;=0A= + struct ifnet *ifp =3D sc->sc_ifp;=0A= + struct ieee80211com *ic =3D ifp->if_l2com;=0A= + struct iwn_node_info node;=0A= + struct iwn_cmd_link_quality linkq;=0A= + uint8_t txant;=0A= + int i, error;=0A= +=0A= + DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);=0A= +=0A= + sc->rxon =3D &sc->rx_on[IWN_RXON_PAN_CTX];=0A= +=0A= + memset(&node, 0, sizeof node);=0A= + IEEE80211_ADDR_COPY(node.macaddr, ifp->if_broadcastaddr);=0A= +=0A= + node.id =3D IWN_PAN_ID_BCAST;=0A= + node.htflags |=3D htole32(IWN_STA_FLAG_PAN_STATION);=0A= + DPRINTF(sc, IWN_DEBUG_RESET, "%s: adding broadcast node1\n", __func__);=0A= + if ((error =3D ops->add_node(sc, &node, async)) !=3D 0)=0A= + return error;=0A= +=0A= + /* Use the first valid TX antenna. */=0A= + txant =3D IWN_LSB(sc->txchainmask);=0A= +=0A= + memset(&linkq, 0, sizeof linkq);=0A= + linkq.id =3D IWN_PAN_ID_BCAST;=0A= + linkq.antmsk_1stream =3D txant;=0A= + linkq.antmsk_2stream =3D IWN_ANT_AB;=0A= + linkq.ampdu_max =3D 64;=0A= + linkq.ampdu_threshold =3D 3;=0A= + linkq.ampdu_limit =3D htole16(4000); /* 4ms */=0A= +=0A= + /* Use lowest mandatory bit-rate. */=0A= + if (IEEE80211_IS_CHAN_5GHZ(ic->ic_curchan))=0A= + linkq.retry[0] =3D htole32(0xd);=0A= + else=0A= + linkq.retry[0] =3D htole32(10 | IWN_RFLAG_CCK);=0A= + linkq.retry[0] |=3D htole32(IWN_RFLAG_ANT(txant));=0A= + /* Use same bit-rate for all TX retries. */=0A= + for (i =3D 1; i < IWN_MAX_TX_RETRIES; i++) {=0A= + linkq.retry[i] =3D linkq.retry[0];=0A= + }=0A= + DPRINTF(sc, IWN_DEBUG_TRACE, "->%s end\n", __func__);=0A= +=0A= + return iwn_cmd(sc, IWN_CMD_LINK_QUALITY, &linkq, sizeof linkq, async);=0A= +}=0A= Index: sys/dev/iwn/if_iwnreg.h=0A= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=0A= --- sys/dev/iwn/if_iwnreg.h (revision 254210)=0A= +++ sys/dev/iwn/if_iwnreg.h (working copy)=0A= @@ -1689,6 +1689,16 @@=0A= } __packed;=0A= =0A= /*=0A= + * ADD / MODIFY STATION Command (Op Code 18) - byte 76-18 -bit13=0A= + * STA_FLAG_PAN_STATION bit:=0A= + * This bit is set (1) for a station in PAN mode=0A= + */=0A= +#define IWN_STA_FLAG_PAN_STATION (1 << 13)=0A= +=0A= +#define IWN_BEACON_INTERVAL_DEFAULT 200=0A= +#define IWN_SLOT_TIME_MIN 20=0A= +=0A= +/*=0A= * Offsets of channels descriptions in EEPROM.=0A= */=0A= static const uint32_t iwn4965_regulatory_bands[IWN_NBANDS] =3D {=0A= ------=_NextPart_000_001E_01CE96A4.D7B688B0-- From owner-freebsd-wireless@FreeBSD.ORG Sun Aug 11 16:34:01 2013 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 67DD619C for ; Sun, 11 Aug 2013 16:34:01 +0000 (UTC) (envelope-from adrian.chadd@gmail.com) Received: from mail-wi0-x234.google.com (mail-wi0-x234.google.com [IPv6:2a00:1450:400c:c05::234]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 016432BF6 for ; Sun, 11 Aug 2013 16:34:00 +0000 (UTC) Received: by mail-wi0-f180.google.com with SMTP id f14so1030595wiw.13 for ; Sun, 11 Aug 2013 09:33:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:in-reply-to:references:date:message-id:subject :from:to:cc:content-type; bh=vc2RI9CMH6O5tTP/tmdfWfQzGiFj5ekT/odDKgSu09Q=; b=IgM+3Io1zFd27t7noWdgWwM7HW1P1OyE0gBNbN++Cw9KaFnOZ3tVNO+7QQt2tXkGZX KnZIy8DxBWjMU9EnE0FLlEXQFNgC7blCuiUr15wXgwUNup5LOWgM8E+xzdLARYesW+Eg Hf8owGdXJ+Z7rF3d1jiCVUFyvMD209B1CA3h4OcN1SeLIy687h2GoK/3xAX7TmYJjB5B 41Z/a9WlPdLhzHxLjJJOuexIaGc15kUtwcak5ZozbTw3Q440XFEeHQjWmnQ48rdpNjuf IDzdMUqjLtYFLVDDWdFEnKiR1jnOJfe+1o3tRUvaq3o8LUD8UdROoih1hBIEU8BeyM3P WIFQ== MIME-Version: 1.0 X-Received: by 10.194.203.73 with SMTP id ko9mr4741193wjc.79.1376238839207; Sun, 11 Aug 2013 09:33:59 -0700 (PDT) Sender: adrian.chadd@gmail.com Received: by 10.217.116.136 with HTTP; Sun, 11 Aug 2013 09:33:59 -0700 (PDT) In-Reply-To: <001d01ce9694$142db8b0$3c892a10$@info> References: <001d01ce9694$142db8b0$3c892a10$@info> Date: Sun, 11 Aug 2013 09:33:59 -0700 X-Google-Sender-Auth: uSskCIwazLkLdGdpa_EyOu8x4eE Message-ID: Subject: Re: [iwn]Review Split 6 From: Adrian Chadd To: Cedric GROSS Content-Type: text/plain; charset=ISO-8859-1 Cc: freebsd-wireless@freebsd.org X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.14 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, 11 Aug 2013 16:34:01 -0000 Hi! What's 'u1' as a prefix supposed to represent? -adrian On 11 August 2013 06:09, Cedric GROSS wrote: > Hello, > > > > Here is patch split 6. > > > > It's follow split 5 as it implement PAN context. > > This patch is purely based on work done by Sean Bruno. > > > > Cedric > > > _______________________________________________ > freebsd-wireless@freebsd.org mailing list > http://lists.freebsd.org/mailman/listinfo/freebsd-wireless > To unsubscribe, send any mail to "freebsd-wireless-unsubscribe@freebsd.org" From owner-freebsd-wireless@FreeBSD.ORG Sun Aug 11 16:50:01 2013 Return-Path: Delivered-To: freebsd-wireless@smarthost.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id CCACB6AB for ; Sun, 11 Aug 2013 16:50:01 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [IPv6:2001:1900:2254:206c::16:87]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id B85032C92 for ; Sun, 11 Aug 2013 16:50:01 +0000 (UTC) Received: from freefall.freebsd.org (localhost [127.0.0.1]) by freefall.freebsd.org (8.14.7/8.14.7) with ESMTP id r7BGo1u5048072 for ; Sun, 11 Aug 2013 16:50:01 GMT (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.14.7/8.14.7/Submit) id r7BGo1Qt048071; Sun, 11 Aug 2013 16:50:01 GMT (envelope-from gnats) Date: Sun, 11 Aug 2013 16:50:01 GMT Message-Id: <201308111650.r7BGo1Qt048071@freefall.freebsd.org> To: freebsd-wireless@FreeBSD.org Cc: From: Julio Merino Subject: Re: kern/181100: [bwi] Turning up bwi0 crashes / deadlocks the kernel X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list Reply-To: Julio Merino 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, 11 Aug 2013 16:50:01 -0000 The following reply was made to PR kern/181100; it has been noted by GNATS. From: Julio Merino To: bug-followup@freebsd.org, julio+host-mastodon-jmmv@meroh.net Cc: Subject: Re: kern/181100: [bwi] Turning up bwi0 crashes / deadlocks the kernel Date: Sun, 11 Aug 2013 12:40:56 -0400 I rebuilt a kernel with WITNESS enabled and got the following stacktrace, which probably sheds some useful details. Copying by hand so omitting addresses: Sleeping on "fwload" with the following non-sleepable locks held: exclusive sleep mutex bwi0 (network driver) r = 0 (0x...) locked @ /usr/src/sys/modules/bwi/../../dev/bwi/if_bwi.c:1313 KDB: stack backtrace: 0x...: at .kdb_backgrace 0x...: at ._witness_debugger 0x...: at .witness_warn 0x...: at ._sleep 0x...: at .firmware_get 0x...: at .bwi_mac_init 0x...: at .bwi_init_statechg 0x...: at .bwi_ioctl 0x...: at .parent_updown 0x...: at .taskqueue_run_locked 0x...: at .taskqueue_thread_loop 0x...: at .fork_exit 0x...: at .fork_tramploline 0x...: at fffffffffffffffc bwi0: firmware rev 0x0127, patch level 0x000e panic: rate 130 is basic/mcs? cpuid = 0 KDB: stack backtrace: 0x...: at .kdb_backtrace 0x...: at .vpanic 0x...: at .kassert_panic 0x...: at .bwi_mac_set_ackrates 0x...: at .bwi_mac_init 0x...: at .bwi_init_statechg 0x...: at .bwi_ioctl 0x...: at .parent_updown 0x...: at .taskqueue_run_locked 0x...: at .taskqueue_thread_loop 0x...: at .fork_exit 0x...: at .fork_trampoline 0x...: at fffffffffffffffc KDB: enter: panic [ thread pid 0 tid 100100 ] Stopped at 0x... -- Julio Merino / @jmmv From owner-freebsd-wireless@FreeBSD.ORG Sun Aug 11 17:06:13 2013 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 2EAF1B7C; Sun, 11 Aug 2013 17:06:13 +0000 (UTC) (envelope-from cg@cgross.info) Received: from alpha.kreiz-it.fr (alpha.kreiz-it.fr [IPv6:2001:41d0:8:dda6::1]) by mx1.freebsd.org (Postfix) with ESMTP id EAB362D7A; Sun, 11 Aug 2013 17:06:12 +0000 (UTC) Received: from DirTech (lnr56-1-82-246-51-185.fbx.proxad.net [82.246.51.185]) by alpha.kreiz-it.fr (Postfix) with ESMTPSA id 26F4021B; Sun, 11 Aug 2013 19:06:11 +0200 (CEST) From: "Cedric GROSS" To: "'Adrian Chadd'" References: <001d01ce9694$142db8b0$3c892a10$@info> In-Reply-To: Subject: RE: [iwn]Review Split 6 Date: Sun, 11 Aug 2013 19:06:10 +0200 Message-ID: <003c01ce96b5$15c93d40$415bb7c0$@info> MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable X-Mailer: Microsoft Office Outlook 12.0 Thread-Index: Ac6WsJipKY7TObxxTBSSrTv9DCDFHwAA67+Q Content-Language: fr Cc: freebsd-wireless@freebsd.org X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.14 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, 11 Aug 2013 17:06:13 -0000 > -----Message d'origine----- > De=A0: adrian.chadd@gmail.com [mailto:adrian.chadd@gmail.com] De la = part > de Adrian Chadd > Envoy=E9=A0: dimanche 11 ao=FBt 2013 18:34 > =C0=A0: Cedric GROSS > Cc=A0: freebsd-wireless@freebsd.org > Objet=A0: Re: [iwn]Review Split 6 >=20 > Hi! >=20 > What's 'u1' as a prefix supposed to represent? >=20 U1 stand for unit 1.=20 As you see, all function with this prefix will be call when unit=3D=3D1 = within iwn_vap_create. As previously, I haven't investigate a lot this side. I plan to do so = when standard run will be ok. >=20 >=20 > -adrian >=20 > > It's follow split 5 as it implement PAN context. > > > > This patch is purely based on work done by Sean Bruno. > > > > Cedric From owner-freebsd-wireless@FreeBSD.ORG Sun Aug 11 17:07:39 2013 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 0633BD40 for ; Sun, 11 Aug 2013 17:07:39 +0000 (UTC) (envelope-from adrian.chadd@gmail.com) Received: from mail-wg0-x233.google.com (mail-wg0-x233.google.com [IPv6:2a00:1450:400c:c00::233]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 928722D9A for ; Sun, 11 Aug 2013 17:07:38 +0000 (UTC) Received: by mail-wg0-f51.google.com with SMTP id a12so4709108wgh.18 for ; Sun, 11 Aug 2013 10:07:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:in-reply-to:references:date:message-id:subject :from:to:cc:content-type; bh=i29ee2YURIkKhrTdSruBqN0LeJS9RnKwn9iKt/acfdY=; b=q0dpC/xmC+ewKNv2XIGSBgcSjFLiOCVH22D6FhARlPGO+aUlCxF4LLpOdYmiOacVlH 1PcRNP37ua2prEheVQQUMV6QmrzeahNTx1kcgews8TO7gVM7Sq0AehWWnY9GSkzJVlHd 9bVZSKMiB6TyYH7d/jKEKjbPiE3SZc1+LXNrkoGnbqBHwD48B81p0S4JOGY3JMEPH3fK +6/wipWffnkbeVogTWreETmcRUvnYP9pMzZAqoypve8yordnKIHHhtTDvVbAItVEat5m aB1/GWhuMY61W/wm7uTWsUxPGxbTto7a9IOYsau6DZht5WLph2LkI/NBw/dsLpi16vwx +jIw== MIME-Version: 1.0 X-Received: by 10.194.203.73 with SMTP id ko9mr4786190wjc.79.1376240856846; Sun, 11 Aug 2013 10:07:36 -0700 (PDT) Sender: adrian.chadd@gmail.com Received: by 10.217.116.136 with HTTP; Sun, 11 Aug 2013 10:07:36 -0700 (PDT) In-Reply-To: <201308111650.r7BGo1Qt048071@freefall.freebsd.org> References: <201308111650.r7BGo1Qt048071@freefall.freebsd.org> Date: Sun, 11 Aug 2013 10:07:36 -0700 X-Google-Sender-Auth: JCfNH-GCTh-2kICE7c8jnQci1p0 Message-ID: Subject: Re: kern/181100: [bwi] Turning up bwi0 crashes / deadlocks the kernel From: Adrian Chadd To: Julio Merino Content-Type: text/plain; charset=ISO-8859-1 Cc: freebsd-wireless@freebsd.org X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.14 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, 11 Aug 2013 17:07:39 -0000 Hi! THanks for the report! This is my fault. But, is bwi actually doing 11n rates? On 11 August 2013 09:50, Julio Merino wrote: > bwi0: firmware rev 0x0127, patch level 0x000e > panic: rate 130 is basic/mcs? See, that's just odd. If it's a non-11n (MCS) rate, then it should be 2x the speed, which is 65MBit - which is odd, as that looks more like an MCS rate speed than what the NIC should do. Can you get a crashdump? (Can someone send me a bwi NIC for a PC?) -adrian > cpuid = 0 > KDB: stack backtrace: > 0x...: at .kdb_backtrace > 0x...: at .vpanic > 0x...: at .kassert_panic > 0x...: at .bwi_mac_set_ackrates > 0x...: at .bwi_mac_init > 0x...: at .bwi_init_statechg > 0x...: at .bwi_ioctl > 0x...: at .parent_updown > 0x...: at .taskqueue_run_locked > 0x...: at .taskqueue_thread_loop > 0x...: at .fork_exit > 0x...: at .fork_trampoline > 0x...: at fffffffffffffffc > KDB: enter: panic > [ thread pid 0 tid 100100 ] > Stopped at 0x... > > -- > Julio Merino / @jmmv > _______________________________________________ > freebsd-wireless@freebsd.org mailing list > http://lists.freebsd.org/mailman/listinfo/freebsd-wireless > To unsubscribe, send any mail to "freebsd-wireless-unsubscribe@freebsd.org" From owner-freebsd-wireless@FreeBSD.ORG Sun Aug 11 17:08:41 2013 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 8CAA3D60 for ; Sun, 11 Aug 2013 17:08:41 +0000 (UTC) (envelope-from adrian.chadd@gmail.com) Received: from mail-wi0-x22d.google.com (mail-wi0-x22d.google.com [IPv6:2a00:1450:400c:c05::22d]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 233B72DA1 for ; Sun, 11 Aug 2013 17:08:40 +0000 (UTC) Received: by mail-wi0-f173.google.com with SMTP id en1so976252wid.12 for ; Sun, 11 Aug 2013 10:08:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:in-reply-to:references:date:message-id:subject :from:to:cc:content-type; bh=bC4JgHNlSKEI8k6AjbQgx+W9s4GBS3imsdbsQmudBe0=; b=qpL/727tIWD5XuErF2tKzGAB0qhXTjXQftM2PgroI7ggSKVaGLSVqVNHKDfBj7GIDR pk611rUJpjBEYHTRKYuj/0VtqoQOQWSyxBzGSZcRAMD6sUWSP1x822bRnugfhHPb4GNp BS3O7QOyNIVgYwWUC2teAmhnxaerQ0vecMkor8zsBlpFTNTRZPyuAbnGA/oB6YFJ+Bns ymjpLnSHabIH5Mh+U7t4JbX4J20LtzOtJGwSwbNBuxBLcOBO7eutQpN6MfBFE9GByMTS friHbL+CkHHuWvGN9qPy1knYz+VCIi3g7giG6ITZPO8FxnBj70JKSoeWBE++5i+cc4X/ b5BA== MIME-Version: 1.0 X-Received: by 10.194.201.202 with SMTP id kc10mr10793853wjc.1.1376240919484; Sun, 11 Aug 2013 10:08:39 -0700 (PDT) Sender: adrian.chadd@gmail.com Received: by 10.217.116.136 with HTTP; Sun, 11 Aug 2013 10:08:39 -0700 (PDT) In-Reply-To: <003c01ce96b5$15c93d40$415bb7c0$@info> References: <001d01ce9694$142db8b0$3c892a10$@info> <003c01ce96b5$15c93d40$415bb7c0$@info> Date: Sun, 11 Aug 2013 10:08:39 -0700 X-Google-Sender-Auth: qO2rT7LPl6fe-Py1s9Q0PSsMTIQ Message-ID: Subject: Re: [iwn]Review Split 6 From: Adrian Chadd To: Cedric GROSS Content-Type: text/plain; charset=ISO-8859-1 Cc: freebsd-wireless@freebsd.org X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.14 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, 11 Aug 2013 17:08:41 -0000 On 11 August 2013 10:06, Cedric GROSS wrote: > U1 stand for unit 1. > As you see, all function with this prefix will be call when unit==1 within > iwn_vap_create. > > As previously, I haven't investigate a lot this side. I plan to do so when > standard run will be ok. Right. But what's going on, per se? Is it two separate NICs that show up as separate PCI devices? Or is this a hack so the firmware can present two virtual NICs via the firmware API? -adrian From owner-freebsd-wireless@FreeBSD.ORG Mon Aug 12 03:02:43 2013 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 9F457E1 for ; Mon, 12 Aug 2013 03:02:43 +0000 (UTC) (envelope-from julio@meroh.net) Received: from mail-lb0-f171.google.com (mail-lb0-f171.google.com [209.85.217.171]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 264B72532 for ; Mon, 12 Aug 2013 03:02:42 +0000 (UTC) Received: by mail-lb0-f171.google.com with SMTP id t13so4395568lbd.2 for ; Sun, 11 Aug 2013 20:02:35 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc:content-type; bh=ImpO+jJ1wrqqKYE32Q+7HO3w/zEFBZnSUuWOOT0vEOc=; b=fR0HDkWr9qgnnMW+9HbAeAstDYU9+hvwuD5oOvtYFqAm0dbshR4bRE66MRxJDn4Bqy cm2RCx5P27IffXzB6Sg36Rvaz3h4l+R4A5FeXk69S8+b+YcoW68iFQceoCFkIn6U789B xaJit8Oj48d22/TYVJ5l2jyI3hl1O8483GZ1zWq9YBtlpBWLmXCMkQE4sKtS+gbrzhbJ StdaCnmQL5u0FPbV8F722bGE/YHRUzcCoxMkLM5jjxIe+tq8b5La9wy+8KAlGHW9TuK2 3HU9dElPwGS5j3pBSTMU2jDSnfQ26oGESr8pWVIYAz7YPeiE6Sy+GZNOcIidG/ggntL+ dnDQ== X-Gm-Message-State: ALoCoQnBGPNVJ1amSIhkc1mOYPDonv54GSia9xD55MoJvvdyIKE+1gUHZbe48cxZFuTQeEf0mvL5 X-Received: by 10.152.170.197 with SMTP id ao5mr4793681lac.35.1376276555026; Sun, 11 Aug 2013 20:02:35 -0700 (PDT) MIME-Version: 1.0 Received: by 10.112.149.2 with HTTP; Sun, 11 Aug 2013 20:02:14 -0700 (PDT) X-Originating-IP: [108.176.158.82] In-Reply-To: References: <201308111650.r7BGo1Qt048071@freefall.freebsd.org> From: Julio Merino Date: Sun, 11 Aug 2013 23:02:14 -0400 Message-ID: Subject: Re: kern/181100: [bwi] Turning up bwi0 crashes / deadlocks the kernel To: Adrian Chadd Content-Type: text/plain; charset=ISO-8859-1 Cc: freebsd-wireless@freebsd.org X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.14 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, 12 Aug 2013 03:02:43 -0000 On Sun, Aug 11, 2013 at 1:07 PM, Adrian Chadd wrote: > Hi! > > THanks for the report! Hi Adrian, Thanks for getting back to me so quickly. > This is my fault. But, is bwi actually doing 11n rates? I don't know. Is there a way to tell for sure? This machine is from ~2005 so I don't think so, but Wikipedia claims that work on 11n started in 2002... > On 11 August 2013 09:50, Julio Merino wrote: > >> bwi0: firmware rev 0x0127, patch level 0x000e >> panic: rate 130 is basic/mcs? > > See, that's just odd. If it's a non-11n (MCS) rate, then it should be > 2x the speed, which is 65MBit - which is odd, as that looks more like > an MCS rate speed than what the NIC should do. But is that related? The crash / freezes seem due to a locking issue. >From a very quick look at the code, the ioctl handler is holding the bwi mutex and then calls firmware_get, which goes to sleep possibly waiting for the disk. > Can you get a crashdump? Sure, but any hints at how? When the system enters kdb, I type "panic" as described in section 10.4 of the guide... and the system immediately reboots, without dumping core. Thanks, -- Julio Merino / @jmmv From owner-freebsd-wireless@FreeBSD.ORG Mon Aug 12 03:03:55 2013 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 5158A119 for ; Mon, 12 Aug 2013 03:03:55 +0000 (UTC) (envelope-from adrian.chadd@gmail.com) Received: from mail-we0-x230.google.com (mail-we0-x230.google.com [IPv6:2a00:1450:400c:c03::230]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id DD763253F for ; Mon, 12 Aug 2013 03:03:54 +0000 (UTC) Received: by mail-we0-f176.google.com with SMTP id q56so4914746wes.7 for ; Sun, 11 Aug 2013 20:03:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:in-reply-to:references:date:message-id:subject :from:to:cc:content-type; bh=dO09X0qW/mZlBvK7OMLAV9C5ZNWt/+XIQ/nmy28aZm0=; b=aL0J4NroOHnHocz+1J0ieDaBTnXZku0mmXijPXNIyJoomwq9XWR4XuTEqVIjL0pZy1 UhQlL5DXQzKr3ZFq/9GJxWz3JUhJlV1d07wKdpyQtQ/SD3PB7eNRCOMNX9EEKgSHl0Lx blEU7xM2CMjfDlGMFYjN5A2/4AmF1/FAY2UMEGvMU45rmSCKJzDJHR65Lw+rXbRKJ96J yYvdHRQGHiwCHf2U1Q/XyjjM1YMSnZx8Nk1m2mMYs8sibsi88GyGFUNHPleqOHpr31yA 96rux/MMdKmPLeVLTjqwsjsWupmTfyCbmRc53JmIJfmqa8JiR7XihPAbqVjpJRzs0j2j +ghA== MIME-Version: 1.0 X-Received: by 10.180.8.42 with SMTP id o10mr5494099wia.0.1376276633167; Sun, 11 Aug 2013 20:03:53 -0700 (PDT) Sender: adrian.chadd@gmail.com Received: by 10.217.116.136 with HTTP; Sun, 11 Aug 2013 20:03:53 -0700 (PDT) In-Reply-To: References: <201308111650.r7BGo1Qt048071@freefall.freebsd.org> Date: Sun, 11 Aug 2013 20:03:53 -0700 X-Google-Sender-Auth: yG6DPx0ou42orytruSCYHKnTIHw Message-ID: Subject: Re: kern/181100: [bwi] Turning up bwi0 crashes / deadlocks the kernel From: Adrian Chadd To: Julio Merino Content-Type: text/plain; charset=ISO-8859-1 Cc: freebsd-wireless@freebsd.org X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.14 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, 12 Aug 2013 03:03:55 -0000 Try "call doadump" and see what it does. I think bwi is non-11n. So somehow it's getting a rather .. large rate. -adrian From owner-freebsd-wireless@FreeBSD.ORG Mon Aug 12 03:09:32 2013 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 7D8351C5 for ; Mon, 12 Aug 2013 03:09:32 +0000 (UTC) (envelope-from julio@meroh.net) Received: from mail-lb0-f176.google.com (mail-lb0-f176.google.com [209.85.217.176]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 03BE72576 for ; Mon, 12 Aug 2013 03:09:31 +0000 (UTC) Received: by mail-lb0-f176.google.com with SMTP id w10so4352175lbi.7 for ; Sun, 11 Aug 2013 20:09:24 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc:content-type; bh=6VXmLRg/mcMsVXkOH6VQX8/+kNBreXoZjhujMv2/BWQ=; b=fG9fQB1xJBuWIVgUiSMDYZ+zIh3OqNaM5E8tAAiOVRPFCWj1SL9od+nXQYjbKl3lDT Ox9KRmx4AmbjplX3qEHJVwEC8E7GgzWRqxb+mkqLmZms9GVumnLpOoCCtir0ugttMI+I 08xCz9jEhbfO4CjK5lC/8IWB69IK6tSle1V3UfiJ0R3LChHoGh2Ii+lzPInOUQEKfN89 zmMlDI/uMelaPExHJYeoR6Wl8NEt1i+Big26hjPLOh8W2ixUzti5rbGmJgQxO0m9Ht4e m1LHjkslDfn0GAYiiU8fQ86rbwGlhC+QOt+oRzymmPyeed98Jvc/JMreoYViJozOcKbW Vk4g== X-Gm-Message-State: ALoCoQkBRO1jwFEpVODUn2wIHBegTAOstHxA9LkAihY2kqx+EYwWt+VxIYLFBlH74w0s68BqrB6l X-Received: by 10.152.170.197 with SMTP id ao5mr4801662lac.35.1376276964504; Sun, 11 Aug 2013 20:09:24 -0700 (PDT) MIME-Version: 1.0 Received: by 10.112.149.2 with HTTP; Sun, 11 Aug 2013 20:09:04 -0700 (PDT) X-Originating-IP: [108.176.158.82] In-Reply-To: References: <201308111650.r7BGo1Qt048071@freefall.freebsd.org> From: Julio Merino Date: Sun, 11 Aug 2013 23:09:04 -0400 Message-ID: Subject: Re: kern/181100: [bwi] Turning up bwi0 crashes / deadlocks the kernel To: Adrian Chadd Content-Type: text/plain; charset=ISO-8859-1 Cc: freebsd-wireless@freebsd.org X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.14 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, 12 Aug 2013 03:09:32 -0000 On Sun, Aug 11, 2013 at 11:03 PM, Adrian Chadd wrote: > Try "call doadump" and see what it does. No luck. That said "Dumping 0 MB" and didn't record anything... -- Julio Merino / @jmmv From owner-freebsd-wireless@FreeBSD.ORG Mon Aug 12 03:20:00 2013 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 6925D35C for ; Mon, 12 Aug 2013 03:20:00 +0000 (UTC) (envelope-from adrian.chadd@gmail.com) Received: from mail-wg0-x230.google.com (mail-wg0-x230.google.com [IPv6:2a00:1450:400c:c00::230]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id F2400260D for ; Mon, 12 Aug 2013 03:19:59 +0000 (UTC) Received: by mail-wg0-f48.google.com with SMTP id f12so4992831wgh.27 for ; Sun, 11 Aug 2013 20:19:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:in-reply-to:references:date:message-id:subject :from:to:cc:content-type; bh=Gr/n0CncLkWyz7fzGGYFupTJ9wZxLKrO0xEoVP3dBOM=; b=jg9ZzJ8fB9X6pcccp34vL8GYGX1Sw1c1OGo3TdCRE+mTRsKqdKidTA6hd7woOO21Xc KxmDfluPFirR0eqvk3oGAJvz/wzeS3WGhwy8PHkTl/gMxPENAxKle2n7qTLiE1KVFh1V Fu0x76QfKCobNNjenX0gj2TRxeuYGntg4B9jMDUvktg+zHkkLavjuPKFsIkFfNwuIGWY 1jjL0dwsr+f1/1phb9kHDJkWNT4GlSgaYYrwujSXNEMj3j6QeOl/udncvI2W7i3trfgu nzmZduG7+OCAC33mocuaOHSUKuP3WX+idNOAWTgZvbZXRUeZKbuQBvqNt/5/5ycMTnsg 0D7w== MIME-Version: 1.0 X-Received: by 10.180.8.42 with SMTP id o10mr5515195wia.0.1376277598381; Sun, 11 Aug 2013 20:19:58 -0700 (PDT) Sender: adrian.chadd@gmail.com Received: by 10.217.116.136 with HTTP; Sun, 11 Aug 2013 20:19:58 -0700 (PDT) In-Reply-To: References: <201308111650.r7BGo1Qt048071@freefall.freebsd.org> Date: Sun, 11 Aug 2013 20:19:58 -0700 X-Google-Sender-Auth: MMJxqcGd0-VNcARh_VA9_kD2akU Message-ID: Subject: Re: kern/181100: [bwi] Turning up bwi0 crashes / deadlocks the kernel From: Adrian Chadd To: Julio Merino Content-Type: text/plain; charset=ISO-8859-1 Cc: freebsd-wireless@freebsd.org X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.14 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, 12 Aug 2013 03:20:00 -0000 Try this patch in sys/dev/bwi/ : Index: bwimac.c =================================================================== --- bwimac.c (revision 254197) +++ bwimac.c (working copy) @@ -1427,6 +1427,12 @@ enum ieee80211_phytype modtype; uint16_t ofs; + printf("%s: i=%d (of %d); rs->rs_rates = %d\n", + __func__, + i, + rs->rs_nrates, + rs->rs_rates[i]); + modtype = ieee80211_rate2phytype(rt, rs->rs_rates[i]); switch (modtype) { case IEEE80211_T_DS: I'd like to see what the rate table looks like. I wonder if it's chosen the 11n rate table somehow. ;( -adrian From owner-freebsd-wireless@FreeBSD.ORG Mon Aug 12 11:06:56 2013 Return-Path: Delivered-To: freebsd-wireless@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 0479CB8D for ; Mon, 12 Aug 2013 11:06:56 +0000 (UTC) (envelope-from owner-bugmaster@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [IPv6:2001:1900:2254:206c::16:87]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id D9B8C2156 for ; Mon, 12 Aug 2013 11:06:55 +0000 (UTC) Received: from freefall.freebsd.org (localhost [127.0.0.1]) by freefall.freebsd.org (8.14.7/8.14.7) with ESMTP id r7CB6tI0085231 for ; Mon, 12 Aug 2013 11:06:55 GMT (envelope-from owner-bugmaster@FreeBSD.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.14.7/8.14.7/Submit) id r7CB6tmv085229 for freebsd-wireless@FreeBSD.org; Mon, 12 Aug 2013 11:06:55 GMT (envelope-from owner-bugmaster@FreeBSD.org) Date: Mon, 12 Aug 2013 11:06:55 GMT Message-Id: <201308121106.r7CB6tmv085229@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 Subject: Current problem reports assigned to freebsd-wireless@FreeBSD.org X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.14 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, 12 Aug 2013 11:06:56 -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/181161 wireless [wl] config a old compaq wl-110 wireless card make ker o kern/181132 wireless [iwn] stream calculation is wrong for the Intel 4965 o kern/181100 wireless [bwi] Turning up bwi0 crashes / deadlocks the kernel o kern/180816 wireless [iwl] Intel Centrino Wireless-N 2200 not supported o kern/179847 wireless [ath] [patch] Update regdomain in ath drivers includin o kern/179709 wireless [ath] Atheros 5212 does not work: stuck beacon; resett o kern/179547 wireless [ath] Add AR9485 custom board fixes (CUS198) o kern/179482 wireless [ath] [patch] Fix AR9462 external LNA configuration o kern/179269 wireless [ath] [AR9285] RX antenna diversity is not functioning o kern/179232 wireless [ath] panic in ath o kern/178986 wireless [ath] Change mac address of ath(4) is not reflected wh o kern/178492 wireless [ath] ath0 (AR9287) panic o kern/178491 wireless [ath] ath0 (AR9287) stuck beacon o kern/178477 wireless [ath] missed beacon / soft reset in STA mode results i o kern/178470 wireless [panic][ath] bss vap can and does change o kern/178411 wireless [ral] [panic] FreeBSD kernel crash in rt2860 o kern/178379 wireless [net80211] [ath] WPA rekey on the STA side fails when o kern/178378 wireless [net80211] crypto state isn't reset during a reassocia o kern/178263 wireless [ath] review the use of ic_freq / ic_ieee / ic_flags / o kern/177847 wireless [ath] With TPC enabled, TX power values aren't clamped o kern/177846 wireless [ath] [net80211] net80211 TX power limit isn't correct o conf/177688 wireless WiFi regodmains information is inconsistent between "e o kern/177530 wireless [ath] ath driver isn't 32 bit int clean o kern/177465 wireless [iwn] 20%-100% packet loss with iwn driver o kern/177451 wireless [ieee80211] page fault in ieee80211_tx_mgt_timeout o kern/176238 wireless [ath] [patch] Correct buffer size calculation and simp o kern/176201 wireless [net80211] [patch] 11n station includes unrelated ht p o kern/176104 wireless [iwn] iwn0: iwn_intr: fatal firmware error o kern/175722 wireless [ath]lot of bad seriesx hwrate in kernel messages o kern/175446 wireless [ath] high volumes of PHY errors lead to BB/MAC hangs o kern/175227 wireless [ath] beacon timers aren't necessarily reprogrammed af o kern/175183 wireless [iwn] iwn(4) becomes unresponsive during initial confi o kern/175053 wireless [iwn] iwn firmware error on 9-stable with Ultimate-N 6 o kern/174891 wireless [ieee80211] struct ieee80211_node is freed during acti o kern/174722 wireless [wlan] can't use channel 12 and 13 (14) with my wifi i o kern/174661 wireless [wlan] lost alias on wlan interface o kern/174283 wireless [net80211] panics in ieee80211_ff_age() and ieee80211_ o kern/174276 wireless [ath] if_ath memory modified after free o kern/174273 wireless [net80211] taking down a net80211 node with active fas o kern/173917 wireless [iwn] wpa-supplicant issues on iwn o kern/173898 wireless [iwn] [patch] iwn(4) DOES support 6235 chip. o kern/173883 wireless [ath] ath0: unable to attach - pci issue? o kern/173711 wireless [ath] powerd kills ath on the Asus EeePC 1005HA o kern/173342 wireless PS-Poll isn't working o kern/173336 wireless [ath] Atheros card improper device poweroff handling o o kern/172955 wireless [ath] 11n does not work in adhoc mode o kern/172706 wireless [wpi] wpi0 fails to load firmware when using country o kern/172672 wireless [ubt] Bluetooth device recognised but not working o kern/172661 wireless hostapd(8) securing wireless adapter in HostAP mode is o kern/172338 wireless [ath] [net80211] CCMP IV transmit counters are not cor o kern/171598 wireless [ath] TP-Link TL-WN951N W-LAN PCI Adapter 300 MBit stu o kern/171235 wireless [ath] ath loses connection, system freezes on netif re o kern/170889 wireless [ath] ath driver uses some uninitilized memory o kern/170620 wireless [ath] LOR and deadlock when multiple vaps are used o kern/170573 wireless [iwi] Intel 2200BG iwi NIC hangs with need multicast c o kern/170513 wireless [ath] ath logs: ath_tx_aggr_comp_aggr: AR5416 bug: o kern/170433 wireless [ath] TX hang after a stuck beacon message with active o kern/170397 wireless [ath] [patch] Uninitialized variables in ah_eeprom_928 o kern/170302 wireless [ath] 802.11n frames are not being transmitted with mu o kern/170281 wireless [ath] 802.11n locks up on aggregation setup (ampdutx) o kern/170098 wireless [ath] [net80211] VAPs (Virtual access points) with Ath o kern/170066 wireless [ral] ral(4) rt61pci Linksys freezes the machine as so o kern/169432 wireless [ath] BAR TX hang when aggregation session is reset du p kern/169362 wireless [ath] AR5416: radar pulse PHY errors sometimes include o kern/169336 wireless [ath] ANI isn't triggering in a busy/noisy environment o kern/169199 wireless [ath] Cannot set up static ip addresses for wireless w o kern/169084 wireless [ath] suspend/resume doesn't cause a rescan; the assoc o kern/168530 wireless [ath] Broken WEP probably o kern/168393 wireless AR9285: suspend/resume sometimes fails o kern/168170 wireless [net80211] ieee80211_send_bar() doesn't complete corre o kern/167870 wireless [ath] adhoc wifi client does not join an existing IBSS o kern/167834 wireless [ath] kickpcu; 'handled 0 packets' o kern/167828 wireless [iwn] iwn(4) doesn't recover automatically after firmw o kern/167798 wireless ifconfig(8): problem with "ifconfig list scan" command o kern/167491 wireless [ath] TID != hardware queue TID in ath_tx_aggr_comp_ag o kern/167113 wireless [ath] AR5210: "stuck" TX seems to be occuring, without o kern/167080 wireless [ath] channel switch on another VAP break channel setu o kern/166684 wireless [ath] [net80211] mgmtrate/mcastrate isn't updated base p kern/166642 wireless [ieee80211] [patch] in 802.11n mode for FreeBSD AP, ha o kern/166641 wireless [ieee80211] [patch] mbuf/cluster leak in AP mode in 80 p kern/166357 wireless [ath] 802.11n TX stall when the first frame in the BAW o kern/166286 wireless [net80211] [ath] initial switch to HT40 isn't causing p kern/166190 wireless [ath] TX hangs and frames stuck in TX queue o kern/166086 wireless [Patch][ath] Reflect state of rfkill switch in a sysct o kern/165969 wireless [ath] Slower performance in adhoc mode vs Client/AP mo o kern/165966 wireless [ath] ath0: device timeout on SMP machines due to race o kern/165895 wireless [ath] overly busy cabq can tie up all tx buffers o kern/165870 wireless [bwn] bwn driver does not attach on HP Pavilion dv9420 o kern/165866 wireless [ath] TX hangs, requiring a "scan" to properly reset t o kern/165849 wireless [ath] [hang] network ath driver freeze o kern/165595 wireless [ipw] ipw(4): Can't load firmare for ipw2200bg o kern/165543 wireless [ath] ath0 endless scanning of channels without connec o kern/165517 wireless [net80211] bgscan isn't triggered when invalid beacons o kern/165475 wireless [ath] operational mode change doesn't poke the underly o kern/165382 wireless [kernel] taskqueue_unblock doesn't unblock currently q o kern/165306 wireless [ath] race conditions between scanning and beacon time o kern/165220 wireless [ath] "ath_rx_tasklet: sc_inreset_cnt > 0; skipping" m o kern/165214 wireless [ieee80211] Kernel panic in ieee80211_output.c:2505 o kern/165212 wireless [ath] No WiFi on Acer Aspire One 751h (Atheros AR5BHB6 o kern/165149 wireless [ath] [net80211] Ping with data length more than iv_fr o kern/165146 wireless [net80211] Net802.11 Fragment number is assigned 1 (sh o kern/165060 wireless [ath] vap->iv_bss race conditions causing crashes insi o kern/165021 wireless [ath] ath device timeout during scan/attach, if wlan_c o kern/164721 wireless [ath] ath device timeouts o kern/164382 wireless [ath] crash when down/deleting a vap - inside ieee8021 o kern/164365 wireless [iwi] iwi0: UP/DOWN in o bin/164102 wireless hostapd not configured for 802.11n o kern/163759 wireless [ath] ath(4) "stops working" in hostap mode o kern/163724 wireless [mwl] [patch] NULL check before dereference o kern/163719 wireless [ath] ath interface do not receive multicast o kern/163689 wireless [ath] TX timeouts when sending probe/mgmt frames durin o kern/163574 wireless [net80211] overly-frequent HT occupancy changes o kern/163573 wireless [ath] hostap mode TX buffer hang o kern/163559 wireless [ath] kernel panic AH_DEBUG o kern/163318 wireless [ath] ath(4) stops working p kern/163312 wireless [panic] [ath driver] kernel panic: page fault with ath o kern/163237 wireless [ath] AR5416 as HostAP. Delays among clients when a cl o kern/163082 wireless [ath] ar9285 diversity fixes o kern/162648 wireless [ath] AR9227 ADC DC calibration failure o kern/162647 wireless [ath] 11n TX aggregation session / TX hang o kern/161293 wireless [iwn] hang at startup when starting network o kern/161035 wireless [ieee80211] Incorrect number describing 11ng MCS rate o kern/160391 wireless [ieee80211] [patch] Panic in mesh mode o kern/160296 wireless [zyd] [panic] 802.11 usb device reboots system on 'ifc o misc/160176 wireless [mips] [panic] Kernel panic on AR7161 platform with AR o kern/157449 wireless [ath] MAC address conflict causes system to freeze o kern/157243 wireless [ath] investigate beacon TX (AP) / RX (STA) when under o kern/156904 wireless [ath] AR9285 antenna diversity algorithm is buggy and o kern/156884 wireless [ath] ath instablity 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/155498 wireless [ral] ral(4) needs to be resynced with OpenBSD's to ga 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/153594 wireless [wlan] netif/devd race 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/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/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/148078 wireless [ath] wireless networking stops functioning o kern/146426 wireless [mwl] 802.11n rates not possible on mwl o kern/146425 wireless [mwl] mwl dropping all packets during and after high u 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 kern/144755 wireless [wlan] netif/devd race o bin/144109 wireless hostapd(8) uses the MAC of the wireless interface, but 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 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/125617 wireless [ath] [panic] ath(4) related panic o kern/125501 wireless [ath] atheros cardbus driver hangs 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 kern/121061 wireless [ath] [panic] panic while ejecting ath(4)-adapter duri 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 175 problems total. From owner-freebsd-wireless@FreeBSD.ORG Mon Aug 12 13:50:25 2013 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id EA7E9B4F for ; Mon, 12 Aug 2013 13:50:25 +0000 (UTC) (envelope-from sfourman@gmail.com) Received: from mail-vc0-x22d.google.com (mail-vc0-x22d.google.com [IPv6:2607:f8b0:400c:c03::22d]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id AC9042F4A for ; Mon, 12 Aug 2013 13:50:25 +0000 (UTC) Received: by mail-vc0-f173.google.com with SMTP id id13so2355355vcb.18 for ; Mon, 12 Aug 2013 06:50:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:date:message-id:subject:from:to:content-type; bh=o08otHqty1fSmyobrr7vRnh05dqvxgd3liIUfvOD+u8=; b=zgo4gu1MVes46yd114DO2tleAAwuw2IF0O/cekgQp9aOygLmcflR735pVtHk+r+h4E G8Ua4+n7RKb4+/JTKym+RW+TaFXmzw47ISxVgriQqATGHw1UzZSzZT2LeSC8xez46D89 igoUXJ1P+P99WicXWprG2k7W66jOLI9Kb+BV6BgFyt2nf4J1ZfDgrfTMSWUXY4IlyNr2 S0R6Cj1FeSfP5SLctQeLGdKVoduyvWQeseS4v6EwBx7KcRdWLUHm97pkgqJCS1a959m4 avpNaTDqnSbWXSbA0Gom6V6yjsg/+li3XGW4pIBludu43rv3u6hz46mn+1EDR/AaWGjT 4qFg== MIME-Version: 1.0 X-Received: by 10.220.65.134 with SMTP id j6mr12790453vci.78.1376315424838; Mon, 12 Aug 2013 06:50:24 -0700 (PDT) Received: by 10.220.96.78 with HTTP; Mon, 12 Aug 2013 06:50:24 -0700 (PDT) Date: Mon, 12 Aug 2013 09:50:24 -0400 Message-ID: Subject: Ath9300 From: "Sam Fourman Jr." To: freebsd-wireless@freebsd.org Content-Type: text/plain; charset=ISO-8859-1 X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.14 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, 12 Aug 2013 13:50:26 -0000 wifi guys, It would seem that, samsung android devices somehow upset ath(4) this ath device is operating in hostap mode, the laptops with ath devices have no issues root@Border:~ # uname -a FreeBSD Border 10.0-CURRENT FreeBSD 10.0-CURRENT #4 r254222: Sun Aug 11 16:31:57 UTC 2013 root@Border:/usr/obj/usr/src/sys/BORDER amd64 root@Border:~ # ath0: mem 0xfe200000-0xfe21ffff irq 48 at device 0.0 on pci5 ath0: RX status length: 48 ath0: RX buffer size: 4096 ath0: TX descriptor length: 128 ath0: TX status length: 36 ath0: TX buffers per descriptor: 4 ath0: ath_edma_setup_rxfifo: type=0, FIFO depth = 16 entries ath0: ath_edma_setup_rxfifo: type=1, FIFO depth = 128 entries ath0: [HT] enabling HT modes ath0: [HT] enabling short-GI in 20MHz mode ath0: [HT] 1 stream STBC receive enabled ath0: [HT] 1 stream STBC transmit enabled ath0: [HT] 3 RX streams; 3 TX streams ath0: AR9380 mac 448.3 RF5110 phy 0.0 ath0: 2GHz radio: 0x0000; 5GHz radio: 0x0000 ar9300_Stub_GetCTSTimeout: called ar9300_Stub_GetCTSTimeout: called ar9300_Stub_GetAntennaSwitch: called ar9300_Stub_GetAntennaSwitch: called wlan0: Ethernet address: 7c:c3:a1:b3:fc:af ath0: ath_tx_should_swq_frame: 78:d6:f0:86:1a:91: Node is asleep; sending mgmt (type=0, subtype=192) ath0: ath_tx_should_swq_frame: 78:d6:f0:86:1a:91: Node is asleep; sending mgmt (type=0, subtype=192) ath0: ath_tx_should_swq_frame: 78:d6:f0:86:1a:91: Node is asleep; sending mgmt (type=0, subtype=192) ath0: ath_tx_should_swq_frame: 78:d6:f0:86:1a:91: Node is asleep; sending mgmt (type=0, subtype=192) ath0: ath_tx_should_swq_frame: 78:d6:f0:86:1a:91: Node is asleep; sending mgmt (type=0, subtype=192) ath0: ath_tx_should_swq_frame: 78:d6:f0:86:1a:91: Node is asleep; sending mgmt (type=0, subtype=192) ath0: ath_tx_should_swq_frame: 78:d6:f0:86:1a:91: Node is asleep; sending mgmt (type=0, subtype=192) ath0: ath_tx_should_swq_frame: 78:d6:f0:86:1a:91: Node is asleep; sending mgmt (type=0, subtype=192) ath0: ath_tx_should_swq_frame: 78:d6:f0:86:1a:91: Node is asleep; sending mgmt (type=0, subtype=192) ath0: ath_tx_should_swq_frame: 78:d6:f0:86:1a:91: Node is asleep; sending mgmt (type=0, subtype=192) ath0: ath_tx_should_swq_frame: 78:d6:f0:86:1a:91: Node is asleep; sending mgmt (type=0, subtype=192) ath0: ath_tx_should_swq_frame: 78:d6:f0:86:1a:91: Node is asleep; sending mgmt (type=0, subtype=192) ath0: ath_tx_should_swq_frame: 78:d6:f0:86:1a:91: Node is asleep; sending mgmt (type=0, subtype=192) ath0: ath_tx_should_swq_frame: 78:d6:f0:86:1a:91: Node is asleep; sending mgmt (type=0, subtype=192) ath0: ath_tx_should_swq_frame: 78:d6:f0:86:1a:91: Node is asleep; sending mgmt (type=0, subtype=192) ath0: ath_tx_should_swq_frame: 78:d6:f0:86:1a:91: Node is asleep; sending mgmt (type=0, subtype=192) ath0: ath_tx_should_swq_frame: 78:d6:f0:86:1a:91: Node is asleep; sending mgmt (type=0, subtype=192) ath0: ath_tx_should_swq_frame: 78:d6:f0:86:1a:91: Node is asleep; sending mgmt (type=0, subtype=192) ath0: ath_tx_should_swq_frame: 78:d6:f0:86:1a:91: Node is asleep; sending mgmt (type=0, subtype=192) ath0: ath_tx_should_swq_frame: 78:d6:f0:86:1a:91: Node is asleep; sending mgmt (type=0, subtype=192) ath0: ath_tx_should_swq_frame: 78:d6:f0:86:1a:91: Node is asleep; sending mgmt (type=0, subtype=192) ath0: ath_tx_should_swq_frame: 78:d6:f0:86:1a:91: Node is asleep; sending mgmt (type=0, subtype=176) ath0: ath_tx_should_swq_frame: 78:d6:f0:86:1a:91: Node is asleep; sending mgmt (type=0, subtype=192) ath0: ath_tx_should_swq_frame: 78:d6:f0:86:1a:91: Node is asleep; sending mgmt (type=0, subtype=176) ath0: device timeout ath0: stuck beacon; resetting (bmiss count 4) ath0: stuck beacon; resetting (bmiss count 0) ath0: stuck beacon; resetting (bmiss count 0) ath0: stuck beacon; resetting (bmiss count 0) ath0: device timeout ath0: stuck beacon; resetting (bmiss count 4) ath0: stuck beacon; resetting (bmiss count 0) ath0: stuck beacon; resetting (bmiss count 0) ath0: device timeout ath0: stuck beacon; resetting (bmiss count 4) ath0: stuck beacon; resetting (bmiss count 0) ath0: stuck beacon; resetting (bmiss count 0) ath0: stuck beacon; resetting (bmiss count 0) ath0: stuck beacon; resetting (bmiss count 0) ath0: ath_tx_should_swq_frame: 78:d6:f0:86:1a:91: Node is asleep; sending mgmt (type=0, subtype=192) ath0: ath_tx_should_swq_frame: 78:d6:f0:86:1a:91: Node is asleep; sending mgmt (type=0, subtype=192) ath0: ath_tx_should_swq_frame: 78:d6:f0:86:1a:91: Node is asleep; sending mgmt (type=0, subtype=192) ath0: ath_tx_should_swq_frame: 78:d6:f0:86:1a:91: Node is asleep; sending mgmt (type=0, subtype=192) ath0: ath_tx_should_swq_frame: 78:d6:f0:86:1a:91: Node is asleep; sending mgmt (type=0, subtype=192) ath0: ath_tx_should_swq_frame: 78:d6:f0:86:1a:91: Node is asleep; sending mgmt (type=0, subtype=192) ath0: ath_tx_should_swq_frame: 78:d6:f0:86:1a:91: Node is asleep; sending mgmt (type=0, subtype=192) ath0: ath_tx_should_swq_frame: 78:d6:f0:86:1a:91: Node is asleep; sending mgmt (type=0, subtype=192) ath0: ath_tx_should_swq_frame: 78:d6:f0:86:1a:91: Node is asleep; sending mgmt (type=0, subtype=192) ath0: ath_tx_should_swq_frame: 78:d6:f0:86:1a:91: Node is asleep; sending mgmt (type=0, subtype=192) ath0: ath_tx_should_swq_frame: 78:d6:f0:86:1a:91: Node is asleep; sending mgmt (type=0, subtype=192) ath0: ath_tx_should_swq_frame: 78:d6:f0:86:1a:91: Node is asleep; sending mgmt (type=0, subtype=192) ath0: ath_tx_should_swq_frame: 78:d6:f0:86:1a:91: Node is asleep; sending mgmt (type=0, subtype=192) ath0: ath_tx_should_swq_frame: 78:d6:f0:86:1a:91: Node is asleep; sending mgmt (type=0, subtype=192) ath0: ath_tx_should_swq_frame: 78:d6:f0:86:1a:91: Node is asleep; sending mgmt (type=0, subtype=192) ath0: ath_tx_should_swq_frame: 78:d6:f0:86:1a:91: Node is asleep; sending mgmt (type=0, subtype=192) ath0: ath_tx_should_swq_frame: 78:d6:f0:86:1a:91: Node is asleep; sending mgmt (type=0, subtype=192) ath0: ath_tx_should_swq_frame: 78:d6:f0:86:1a:91: Node is asleep; sending mgmt (type=0, subtype=192) ath0: ath_tx_should_swq_frame: 78:d6:f0:86:1a:91: Node is asleep; sending mgmt (type=0, subtype=192) ath0: ath_tx_should_swq_frame: 78:d6:f0:86:1a:91: Node is asleep; sending mgmt (type=0, subtype=192) ath0: ath_tx_should_swq_frame: 78:d6:f0:86:1a:91: Node is asleep; sending mgmt (type=0, subtype=192) ath0: ath_tx_should_swq_frame: 78:d6:f0:86:1a:91: Node is asleep; sending mgmt (type=0, subtype=192) ath0: ath_tx_should_swq_frame: 78:d6:f0:86:1a:91: Node is asleep; sending mgmt (type=0, subtype=192) ath0: ath_tx_should_swq_frame: 78:d6:f0:86:1a:91: Node is asleep; sending mgmt (type=0, subtype=192) ath0: ath_tx_should_swq_frame: 78:d6:f0:86:1a:91: Node is asleep; sending mgmt (type=0, subtype=176) -- Sam Fourman Jr. From owner-freebsd-wireless@FreeBSD.ORG Mon Aug 12 17:23:40 2013 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id C444C5CD for ; Mon, 12 Aug 2013 17:23:40 +0000 (UTC) (envelope-from lev@FreeBSD.org) Received: from onlyone.friendlyhosting.spb.ru (onlyone.friendlyhosting.spb.ru [46.4.40.135]) by mx1.freebsd.org (Postfix) with ESMTP id 87C712E5C for ; Mon, 12 Aug 2013 17:23:40 +0000 (UTC) Received: from lion.home.serebryakov.spb.ru (unknown [IPv6:2001:470:923f:1:acaf:d9db:8ffe:1642]) (Authenticated sender: lev@serebryakov.spb.ru) by onlyone.friendlyhosting.spb.ru (Postfix) with ESMTPSA id D75954AC1C for ; Mon, 12 Aug 2013 21:23:32 +0400 (MSK) Date: Mon, 12 Aug 2013 21:23:28 +0400 From: Lev Serebryakov X-Priority: 3 (Normal) Message-ID: <238348209.20130812212328@serebryakov.spb.ru> To: freebsd-wireless@freebsd.org Subject: ath as AP panics MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.14 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, 12 Aug 2013 17:23:40 -0000 Hello, Freebsd-wireless. r254238 with ath used as AP panics in fragment processing. This patch from adrian: Index: ieee80211_output.c =================================================================== --- ieee80211_output.c (revision 254224) +++ ieee80211_output.c (working copy) @@ -458,6 +458,16 @@ m->m_flags &= ~(M_80211_TX - M_PWR_SAV - M_MORE_DATA); /* + * Complain if m->m_nextpkt is set. + * + * The caller should've pulled this apart for us. + */ + if (m->m_nextpkt != NULL) { + printf("%s: m_nextpkt not NULL?!\n", __func__); + m->m_nextpkt = NULL; + } + + /* * Bump to the packet transmission path. * The mbuf will be consumed here. */ replaces panic with lot of debug output and looks like not a solution, but dirty hack. Now I'm trying r254250 with this patch, but it looks like it should be same as r254238, as nothing 802.11-related was changed in-between. -- // Black Lion AKA Lev Serebryakov From owner-freebsd-wireless@FreeBSD.ORG Mon Aug 12 17:27:03 2013 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 62909648; Mon, 12 Aug 2013 17:27:03 +0000 (UTC) (envelope-from cg@cgross.info) Received: from alpha.kreiz-it.fr (alpha.kreiz-it.fr [178.32.219.166]) by mx1.freebsd.org (Postfix) with ESMTP id 2AD5E2E92; Mon, 12 Aug 2013 17:27:02 +0000 (UTC) Received: from DirTech (lnr56-1-82-246-51-185.fbx.proxad.net [82.246.51.185]) by alpha.kreiz-it.fr (Postfix) with ESMTPSA id 87462444; Mon, 12 Aug 2013 19:26:55 +0200 (CEST) From: "Cedric GROSS" To: "'Adrian Chadd'" References: <001d01ce9694$142db8b0$3c892a10$@info> <003c01ce96b5$15c93d40$415bb7c0$@info> In-Reply-To: Subject: RE: [iwn]Review Split 6 Date: Mon, 12 Aug 2013 19:26:53 +0200 Message-ID: <00c601ce9781$25060550$6f120ff0$@info> MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable X-Mailer: Microsoft Office Outlook 12.0 Thread-Index: Ac6WtXBwqAuWnkeuSOSTW/BwQwU5ugAy3hRQ Content-Language: fr Cc: freebsd-wireless@freebsd.org X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.14 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, 12 Aug 2013 17:27:03 -0000 > De=A0: adrian.chadd@gmail.com [mailto:adrian.chadd@gmail.com] De la = part > de Adrian Chadd > Envoy=E9=A0: dimanche 11 ao=FBt 2013 19:09 > =C0=A0: Cedric GROSS > Cc=A0: freebsd-wireless@freebsd.org > Objet=A0: Re: [iwn]Review Split 6 >=20 > On 11 August 2013 10:06, Cedric GROSS wrote: >=20 > > U1 stand for unit 1. > > As you see, all function with this prefix will be call when = unit=3D=3D1 > > within iwn_vap_create. > > > > As previously, I haven't investigate a lot this side. I plan to do = so > > when standard run will be ok. >=20 > Right. But what's going on, per se? Is it two separate NICs that show > up as separate PCI devices? Or is this a hack so the firmware can > present two virtual NICs via the firmware API? >=20 Not a separate PCI device but yes ability to create 2 wlan NIC : iwn0: flags=3D8843 metric 0 mtu = 2290 ether 60:36:dd:93:34:56 nd6 options=3D29 media: IEEE 802.11 Wireless Ethernet autoselect mode 11ng status: associated wlan0: flags=3D8943 = metric 0 mtu 1500 ether 60:36:dd:93:34:56 inet 192.168.1.20 netmask 0xffffff00 broadcast 192.168.1.255 nd6 options=3D29 media: IEEE 802.11 Wireless Ethernet MCS mode 11ng status: associated ssid WLenine channel 5 (2432 MHz 11g ht/20) bssid = 00:24:d4:97:80:20 country US authmode WPA2/802.11i privacy ON deftxkey UNDEF AES-CCM 2:128-bit txpower 15 bmiss 10 scanvalid 450 bgscan bgscanintvl 300 bgscanidle 250 roam:rssi 7 roam:rate 64 protmode = CTS ampdulimit 64k -amsdutx amsdurx shortgi wme roaming MANUAL = bintval 96 wlan1: flags=3D8802 metric 0 mtu 1500 ether 60:36:dd:93:34:57 nd6 options=3D29 media: IEEE 802.11 Wireless Ethernet autoselect (autoselect) status: no carrier ssid "" channel 5 (2432 MHz 11g ht/20) country US authmode OPEN privacy OFF txpower 15 bmiss 10 = scanvalid 60 bgscan bgscanintvl 300 bgscanidle 250 roam:rssi 7 roam:rate 64 protmode CTS ampdulimit 8k -amsdutx amsdurx shortgi wme bintval = 0 From owner-freebsd-wireless@FreeBSD.ORG Mon Aug 12 17:29:10 2013 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id D6E9281F; Mon, 12 Aug 2013 17:29:10 +0000 (UTC) (envelope-from adrian.chadd@gmail.com) Received: from mail-wg0-x22c.google.com (mail-wg0-x22c.google.com [IPv6:2a00:1450:400c:c00::22c]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 495422EAD; Mon, 12 Aug 2013 17:29:10 +0000 (UTC) Received: by mail-wg0-f44.google.com with SMTP id l18so5618083wgh.11 for ; Mon, 12 Aug 2013 10:29:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:in-reply-to:references:date:message-id:subject :from:to:cc:content-type; bh=LlH2tuKSL6BMPQNcc9gqIIVPJd2YevwzNjmr9654ciU=; b=JfB3ofT3mVKLpIsNF5/11wf2B38ZCx8wiAD0p8gpsqTDbGCzgob22ombwCT7LU49u7 Hn15riW9HbIPpYpZSJdq67LiOQJkfrwEMHP1BU2lL3T4AO+FRhS2yRSPVy5JTaAkp58t LBz7Id8jF/K+pxOv2oUNyau+JDg/H1XdOCkwWkxaQSe6gX0MWmPlLMiImURN8sBK9UJw u10RXcswPjeIdV7ZQM212zSfzLWCTiGhxE7aIg2sOVkyNtP/FEuHjTncZ/LIK49lgOla NxnP8oZXCAGxIqA+IbtPcnwQyB+5jRLIE5kcQhgIFRT2C1heK9tOk0L/V2RRsUrcP4ns Hq+w== MIME-Version: 1.0 X-Received: by 10.180.211.206 with SMTP id ne14mr85128wic.30.1376328548513; Mon, 12 Aug 2013 10:29:08 -0700 (PDT) Sender: adrian.chadd@gmail.com Received: by 10.217.116.136 with HTTP; Mon, 12 Aug 2013 10:29:08 -0700 (PDT) In-Reply-To: <238348209.20130812212328@serebryakov.spb.ru> References: <238348209.20130812212328@serebryakov.spb.ru> Date: Mon, 12 Aug 2013 10:29:08 -0700 X-Google-Sender-Auth: 0YbgY07jjtpttCRWvib7HIqrhdY Message-ID: Subject: Re: ath as AP panics From: Adrian Chadd To: Lev Serebryakov Content-Type: text/plain; charset=ISO-8859-1 Cc: freebsd-wireless@freebsd.org X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.14 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, 12 Aug 2013 17:29:10 -0000 Hi, So the if_transmit() change did change a few things. if_start() / *_ENQUEUE() clears m_nextpkt(). I'd like to know where m_nextpkt() is NOT being cleared. How about triggering it quickly - put in a panic there rather than NULL'ing it, then when it immediately panics, do a backtrace? -adrian On 12 August 2013 10:23, Lev Serebryakov wrote: > Hello, Freebsd-wireless. > > r254238 with ath used as AP panics in fragment processing. This patch from > adrian: > > Index: ieee80211_output.c > =================================================================== > --- ieee80211_output.c (revision 254224) > +++ ieee80211_output.c (working copy) > @@ -458,6 +458,16 @@ > m->m_flags &= ~(M_80211_TX - M_PWR_SAV - M_MORE_DATA); > > /* > + * Complain if m->m_nextpkt is set. > + * > + * The caller should've pulled this apart for us. > + */ > + if (m->m_nextpkt != NULL) { > + printf("%s: m_nextpkt not NULL?!\n", __func__); > + m->m_nextpkt = NULL; > + } > + > + /* > * Bump to the packet transmission path. > * The mbuf will be consumed here. > */ > > > replaces panic with lot of debug output and looks like not a solution, but > dirty hack. Now I'm trying r254250 with this patch, but it looks like it > should be same as r254238, as nothing 802.11-related was changed in-between. > > -- > // Black Lion AKA Lev Serebryakov > > _______________________________________________ > freebsd-wireless@freebsd.org mailing list > http://lists.freebsd.org/mailman/listinfo/freebsd-wireless > To unsubscribe, send any mail to "freebsd-wireless-unsubscribe@freebsd.org" From owner-freebsd-wireless@FreeBSD.ORG Mon Aug 12 17:30:40 2013 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id D3F61842 for ; Mon, 12 Aug 2013 17:30:40 +0000 (UTC) (envelope-from adrian.chadd@gmail.com) Received: from mail-wg0-x229.google.com (mail-wg0-x229.google.com [IPv6:2a00:1450:400c:c00::229]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 6A6FD2EB6 for ; Mon, 12 Aug 2013 17:30:40 +0000 (UTC) Received: by mail-wg0-f41.google.com with SMTP id l18so1834730wgh.2 for ; Mon, 12 Aug 2013 10:30:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:in-reply-to:references:date:message-id:subject :from:to:cc:content-type:content-transfer-encoding; bh=T4G21KnQK729UXtneHOrKC2kYB5hzzPUhS+nWROJZwM=; b=w/t8fd+N4YjBX6m/tdPMrDN5Ba7ybpjMC1wtGswxSIwuHU+yD6o9I2V0ZDZf3X35La pl30viTUZSTktOIoduRmuVCExx7+4+IqI93+6j0V/Yj5Dsh4YBvTrhMr1rNZGA/nTDUB 1SOdSHCrbvbUK8uPrRcJUt/tXTQWxfsDWq90kYaOmhWaoW8k42bOhH7yr3Pn/0Cfw1lP i1McmPqSDYu7v9Ahxtd9rW1ntdEYatwKGhNOLUQjaL+M45FjPKRaSkdQ7nsmBhlA+Thl 6NlpbtmrYDCXQ8C97AZSUw/5TUlhNnF2QkLKnx+nERHwWr17GH2uoDv9QxOlpI2FIAnl 98QQ== MIME-Version: 1.0 X-Received: by 10.194.238.199 with SMTP id vm7mr92880wjc.37.1376328638719; Mon, 12 Aug 2013 10:30:38 -0700 (PDT) Sender: adrian.chadd@gmail.com Received: by 10.217.116.136 with HTTP; Mon, 12 Aug 2013 10:30:38 -0700 (PDT) In-Reply-To: <00c601ce9781$25060550$6f120ff0$@info> References: <001d01ce9694$142db8b0$3c892a10$@info> <003c01ce96b5$15c93d40$415bb7c0$@info> <00c601ce9781$25060550$6f120ff0$@info> Date: Mon, 12 Aug 2013 10:30:38 -0700 X-Google-Sender-Auth: coG4OV6uuUVrFPWyV1GNvk8y6xM Message-ID: Subject: Re: [iwn]Review Split 6 From: Adrian Chadd To: Cedric GROSS Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Cc: freebsd-wireless@freebsd.org X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.14 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, 12 Aug 2013 17:30:41 -0000 How do you create the second VAP, and what's it for? -adrian On 12 August 2013 10:26, Cedric GROSS wrote: > >> De : adrian.chadd@gmail.com [mailto:adrian.chadd@gmail.com] De la part >> de Adrian Chadd >> Envoy=E9 : dimanche 11 ao=FBt 2013 19:09 >> =C0 : Cedric GROSS >> Cc : freebsd-wireless@freebsd.org >> Objet : Re: [iwn]Review Split 6 >> >> On 11 August 2013 10:06, Cedric GROSS wrote: >> >> > U1 stand for unit 1. >> > As you see, all function with this prefix will be call when unit=3D=3D= 1 >> > within iwn_vap_create. >> > >> > As previously, I haven't investigate a lot this side. I plan to do so >> > when standard run will be ok. >> >> Right. But what's going on, per se? Is it two separate NICs that show >> up as separate PCI devices? Or is this a hack so the firmware can >> present two virtual NICs via the firmware API? >> > Not a separate PCI device but yes ability to create 2 wlan NIC : > > iwn0: flags=3D8843 metric 0 mtu 2= 290 > ether 60:36:dd:93:34:56 > nd6 options=3D29 > media: IEEE 802.11 Wireless Ethernet autoselect mode 11ng > status: associated > wlan0: flags=3D8943 metri= c 0 > mtu 1500 > ether 60:36:dd:93:34:56 > inet 192.168.1.20 netmask 0xffffff00 broadcast 192.168.1.255 > nd6 options=3D29 > media: IEEE 802.11 Wireless Ethernet MCS mode 11ng > status: associated > ssid WLenine channel 5 (2432 MHz 11g ht/20) bssid 00:24:d4:97:80:= 20 > country US authmode WPA2/802.11i privacy ON deftxkey UNDEF > AES-CCM 2:128-bit txpower 15 bmiss 10 scanvalid 450 bgscan > bgscanintvl 300 bgscanidle 250 roam:rssi 7 roam:rate 64 protmode = CTS > ampdulimit 64k -amsdutx amsdurx shortgi wme roaming MANUAL bintva= l > 96 > wlan1: flags=3D8802 metric 0 mtu 1500 > ether 60:36:dd:93:34:57 > nd6 options=3D29 > media: IEEE 802.11 Wireless Ethernet autoselect (autoselect) > status: no carrier > ssid "" channel 5 (2432 MHz 11g ht/20) > country US authmode OPEN privacy OFF txpower 15 bmiss 10 scanvali= d > 60 > bgscan bgscanintvl 300 bgscanidle 250 roam:rssi 7 roam:rate 64 > protmode CTS ampdulimit 8k -amsdutx amsdurx shortgi wme bintval 0 > From owner-freebsd-wireless@FreeBSD.ORG Mon Aug 12 17:32:39 2013 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id C13B8884; Mon, 12 Aug 2013 17:32:39 +0000 (UTC) (envelope-from lev@FreeBSD.org) Received: from onlyone.friendlyhosting.spb.ru (onlyone.friendlyhosting.spb.ru [46.4.40.135]) by mx1.freebsd.org (Postfix) with ESMTP id 810EE2EEC; Mon, 12 Aug 2013 17:32:39 +0000 (UTC) Received: from lion.home.serebryakov.spb.ru (unknown [IPv6:2001:470:923f:1:acaf:d9db:8ffe:1642]) (Authenticated sender: lev@serebryakov.spb.ru) by onlyone.friendlyhosting.spb.ru (Postfix) with ESMTPSA id B869D4AC1C; Mon, 12 Aug 2013 21:32:37 +0400 (MSK) Date: Mon, 12 Aug 2013 21:32:35 +0400 From: Lev Serebryakov Organization: FreeBSD Project X-Priority: 3 (Normal) Message-ID: <1391593482.20130812213235@serebryakov.spb.ru> To: Adrian Chadd Subject: Re: ath as AP panics In-Reply-To: References: <238348209.20130812212328@serebryakov.spb.ru> MIME-Version: 1.0 Content-Type: text/plain; charset=windows-1251 Content-Transfer-Encoding: quoted-printable Cc: freebsd-wireless@freebsd.org X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list Reply-To: lev@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, 12 Aug 2013 17:32:39 -0000 Hello, Adrian. You wrote 12 =E0=E2=E3=F3=F1=F2=E0 2013 =E3., 21:29:08: AC> So the if_transmit() change did change a few things. if_start() / AC> *_ENQUEUE() clears m_nextpkt(). AC> I'd like to know where m_nextpkt() is NOT being cleared. AC> How about triggering it quickly - put in a panic there rather than AC> NULL'ing it, then when it immediately panics, do a backtrace? So, replace printf() here with panic()? Now I have backtrace from panic BEFORE this diagnostic patch is applied. Isn't it enough? #0 doadump (textdump=3D1) at pcpu.h:236 236 pcpu.h: No such file or directory. in pcpu.h (kgdb) #0 doadump (textdump=3D1) at pcpu.h:236 #1 0xffffffff804b4505 in kern_reboot (howto=3D260) at /data/src/sys/kern/kern_shutdown.c:447 #2 0xffffffff804b48e4 in panic (fmt=3D) at /data/src/sys/kern/kern_shutdown.c:754 #3 0xffffffff806c5b5a in trap_fatal (frame=3D,=20 eva=3D) at /data/src/sys/amd64/amd64/trap.c:873 #4 0xffffffff806c5dc7 in trap_pfault (frame=3D0x0, usermode=3D0) at /data/src/sys/amd64/amd64/trap.c:699 #5 0xffffffff806c54f4 in trap (frame=3D0xffffff812205e7a0) at /data/src/sys/amd64/amd64/trap.c:463 #6 0xffffffff806af7b3 in calltrap () at /data/src/sys/amd64/amd64/exception.S:232 #7 0xffffffff802ef411 in ath_transmit (ifp=3D0xfffffe0001a9a800,=20 m=3D) at /data/src/sys/dev/ath/if_ath.c:2953 #8 0xffffffff8059a1e6 in ieee80211_vap_pkt_send_dest ( vap=3D, m=3D, ni=3D0xffffff80= 00f96000) at /data/src/sys/net80211/ieee80211_output.c:239 #9 0xffffffff8059ae3b in ieee80211_vap_transmit (ifp=3D,=20 m=3D) at /data/src/sys/net80211/ieee80211_output.c= :389 #10 0xffffffff8059f5ff in pwrsave_flushq (ni=3D) at /data/src/sys/net80211/ieee80211_power.c:479 #11 0xffffffff80588209 in hostap_input (ni=3D0xffffff8000f96000,=20 m=3D, rssi=3D43, nf=3D-96) at /data/src/sys/net80211/ieee80211_hostap.c:648 #12 0xffffffff8030825a in ath_rx_pkt (sc=3D0xffffff80007ba000,=20 rs=3D0xffffff8000880d78, status=3DHAL_OK, tsf=3D, = nf=3D-96,=20 qtype=3D, m=3D) at /data/src/sys/dev/ath/if_ath_rx.c:808 #13 0xffffffff80308ec0 in ath_rx_proc (sc=3D0xffffff80007ba000, resched=3D1) at /data/src/sys/dev/ath/if_ath_rx.c:995 #14 0xffffffff804f2426 in taskqueue_run_locked (queue=3D0xfffffe0001a59b00) at /data/src/sys/kern/subr_taskqueue.c:333 #15 0xffffffff804f2ca8 in taskqueue_thread_loop (arg=3D) at /data/src/sys/kern/subr_taskqueue.c:535 #16 0xffffffff804885e5 in fork_exit ( callout=3D0xffffffff804f2c00 ,=20 arg=3D0xffffff80007ba830, frame=3D0xffffff812205ec00) at /data/src/sys/kern/kern_fork.c:991 #17 0xffffffff806afcee in fork_trampoline () at /data/src/sys/amd64/amd64/exception.S:606 --=20 // Black Lion AKA Lev Serebryakov From owner-freebsd-wireless@FreeBSD.ORG Mon Aug 12 17:34:06 2013 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id EC9918BE; Mon, 12 Aug 2013 17:34:06 +0000 (UTC) (envelope-from adrian.chadd@gmail.com) Received: from mail-wi0-x231.google.com (mail-wi0-x231.google.com [IPv6:2a00:1450:400c:c05::231]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 5CE882EFE; Mon, 12 Aug 2013 17:34:06 +0000 (UTC) Received: by mail-wi0-f177.google.com with SMTP id hq12so2007878wib.10 for ; Mon, 12 Aug 2013 10:34:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:in-reply-to:references:date:message-id:subject :from:to:cc:content-type:content-transfer-encoding; bh=fQJ0kAenSOSfhFFZwAwFhwuByP12KC2Wfs8/+uGLXfc=; b=Kiy0wEWk/GtoyP/xMXJW8/mMRkzjQkCatNJvZ/mEJqr5cmteBM8LwO2Xsi8B77rZeE bIJ3EF/QIQ3p53lkz6wAdv7JLF4bP5/ifh7uDjeXoxAnKkTdgRfbe+9wluJ0CxThDWMc +fq5BQx01SNGXFPPMXx0icLsrn1rHhy2AudcjSsmx0RgJQB7j8X0UyMy2PmYoBYPL8GU I4/Ljcrk3gkPeDAEqtOMaHFZ0N5Z7uJ1iXl2KeQsB/Ion/Gj6OG+DXXimTw8zEqWfEIL syXWDcrSyauiLl0HhFsHqvlT7dwpHDB0wsEx6mHJ37k2YQAZUTSyJcjKVQHg6cp9aft1 LUCQ== MIME-Version: 1.0 X-Received: by 10.180.211.206 with SMTP id ne14mr96677wic.30.1376328844669; Mon, 12 Aug 2013 10:34:04 -0700 (PDT) Sender: adrian.chadd@gmail.com Received: by 10.217.116.136 with HTTP; Mon, 12 Aug 2013 10:34:04 -0700 (PDT) In-Reply-To: <1391593482.20130812213235@serebryakov.spb.ru> References: <238348209.20130812212328@serebryakov.spb.ru> <1391593482.20130812213235@serebryakov.spb.ru> Date: Mon, 12 Aug 2013 10:34:04 -0700 X-Google-Sender-Auth: _wDm7Vc0frqC7pydMQJRCbpMYVA Message-ID: Subject: Re: ath as AP panics From: Adrian Chadd To: lev@freebsd.org Content-Type: text/plain; charset=KOI8-R Content-Transfer-Encoding: quoted-printable Cc: freebsd-wireless@freebsd.org X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.14 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, 12 Aug 2013 17:34:07 -0000 Hm. OK. What I want is the code path _in_ that's queuing a frame via ieee80211_vap_transmit() with m_nextpkt set to NON-NULL. -adrian On 12 August 2013 10:32, Lev Serebryakov wrote: > Hello, Adrian. > You wrote 12 =C1=D7=C7=D5=D3=D4=C1 2013 =C7., 21:29:08: > > AC> So the if_transmit() change did change a few things. if_start() / > AC> *_ENQUEUE() clears m_nextpkt(). > > AC> I'd like to know where m_nextpkt() is NOT being cleared. > > AC> How about triggering it quickly - put in a panic there rather than > AC> NULL'ing it, then when it immediately panics, do a backtrace? > So, replace printf() here with panic()? > Now I have backtrace from panic BEFORE this diagnostic patch is applied= . > Isn't it enough? > > #0 doadump (textdump=3D1) at pcpu.h:236 > 236 pcpu.h: No such file or directory. > in pcpu.h > (kgdb) #0 doadump (textdump=3D1) at pcpu.h:236 > #1 0xffffffff804b4505 in kern_reboot (howto=3D260) > at /data/src/sys/kern/kern_shutdown.c:447 > #2 0xffffffff804b48e4 in panic (fmt=3D) > at /data/src/sys/kern/kern_shutdown.c:754 > #3 0xffffffff806c5b5a in trap_fatal (frame=3D, > eva=3D) at /data/src/sys/amd64/amd64/trap.c:873 > #4 0xffffffff806c5dc7 in trap_pfault (frame=3D0x0, usermode=3D0) > at /data/src/sys/amd64/amd64/trap.c:699 > #5 0xffffffff806c54f4 in trap (frame=3D0xffffff812205e7a0) > at /data/src/sys/amd64/amd64/trap.c:463 > #6 0xffffffff806af7b3 in calltrap () > at /data/src/sys/amd64/amd64/exception.S:232 > #7 0xffffffff802ef411 in ath_transmit (ifp=3D0xfffffe0001a9a800, > m=3D) at /data/src/sys/dev/ath/if_ath.c:2953 > #8 0xffffffff8059a1e6 in ieee80211_vap_pkt_send_dest ( > vap=3D, m=3D, ni=3D0xffffff= 8000f96000) > at /data/src/sys/net80211/ieee80211_output.c:239 > #9 0xffffffff8059ae3b in ieee80211_vap_transmit (ifp=3D, > m=3D) at /data/src/sys/net80211/ieee80211_output= .c:389 > #10 0xffffffff8059f5ff in pwrsave_flushq (ni=3D) > at /data/src/sys/net80211/ieee80211_power.c:479 > #11 0xffffffff80588209 in hostap_input (ni=3D0xffffff8000f96000, > m=3D, rssi=3D43, nf=3D-96) > at /data/src/sys/net80211/ieee80211_hostap.c:648 > #12 0xffffffff8030825a in ath_rx_pkt (sc=3D0xffffff80007ba000, > rs=3D0xffffff8000880d78, status=3DHAL_OK, tsf=3D= , nf=3D-96, > qtype=3D, m=3D) > at /data/src/sys/dev/ath/if_ath_rx.c:808 > #13 0xffffffff80308ec0 in ath_rx_proc (sc=3D0xffffff80007ba000, resched= =3D1) > at /data/src/sys/dev/ath/if_ath_rx.c:995 > #14 0xffffffff804f2426 in taskqueue_run_locked (queue=3D0xfffffe0001a59b0= 0) > at /data/src/sys/kern/subr_taskqueue.c:333 > #15 0xffffffff804f2ca8 in taskqueue_thread_loop (arg=3D) > at /data/src/sys/kern/subr_taskqueue.c:535 > #16 0xffffffff804885e5 in fork_exit ( > callout=3D0xffffffff804f2c00 , > arg=3D0xffffff80007ba830, frame=3D0xffffff812205ec00) > at /data/src/sys/kern/kern_fork.c:991 > #17 0xffffffff806afcee in fork_trampoline () > at /data/src/sys/amd64/amd64/exception.S:606 > > > > > -- > // Black Lion AKA Lev Serebryakov > From owner-freebsd-wireless@FreeBSD.ORG Mon Aug 12 17:41:19 2013 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 6387FA35; Mon, 12 Aug 2013 17:41:19 +0000 (UTC) (envelope-from cg@cgross.info) Received: from alpha.kreiz-it.fr (alpha.kreiz-it.fr [178.32.219.166]) by mx1.freebsd.org (Postfix) with ESMTP id ECFFC2F66; Mon, 12 Aug 2013 17:41:18 +0000 (UTC) Received: from DirTech (lnr56-1-82-246-51-185.fbx.proxad.net [82.246.51.185]) by alpha.kreiz-it.fr (Postfix) with ESMTPSA id CE2E3471; Mon, 12 Aug 2013 19:41:17 +0200 (CEST) From: "Cedric GROSS" To: "'Adrian Chadd'" References: <001d01ce9694$142db8b0$3c892a10$@info> <003c01ce96b5$15c93d40$415bb7c0$@info> <00c601ce9781$25060550$6f120ff0$@info> In-Reply-To: Subject: RE: [iwn]Review Split 6 Date: Mon, 12 Aug 2013 19:41:16 +0200 Message-ID: <00c901ce9783$26fedd30$74fc9790$@info> MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable X-Mailer: Microsoft Office Outlook 12.0 Thread-Index: Ac6Xga0JRSQMUdY/S+qTtNthDQzxAQAAHxTA Content-Language: fr Cc: freebsd-wireless@freebsd.org X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.14 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, 12 Aug 2013 17:41:19 -0000 > De=A0: adrian.chadd@gmail.com [mailto:adrian.chadd@gmail.com] De la = part > de Adrian Chadd > Envoy=E9=A0: lundi 12 ao=FBt 2013 19:31 > =C0=A0: Cedric GROSS > Cc=A0: freebsd-wireless@freebsd.org > Objet=A0: Re: [iwn]Review Split 6 >=20 > How do you create the second VAP, and what's it for? >=20 #ifconfig wlan1 create wlandev iwn0 You could also have different mode, as #ifconfig wlan1 create wlanmode monitor wlandev iwn0 But again, as current version is not stable in normal operation, I = haven't test it further. What could be interest of this ? Wifi relay, bridge or whatever usage of 2 wireless but only with 1 card. >=20 >=20 > -adrian >=20 > On 12 August 2013 10:26, Cedric GROSS wrote: > > > >> De : adrian.chadd@gmail.com [mailto:adrian.chadd@gmail.com] De la > >> part de Adrian Chadd Envoy=E9 : dimanche 11 ao=FBt 2013 19:09 =C0 : = Cedric > >> GROSS Cc : freebsd-wireless@freebsd.org Objet : Re: [iwn]Review > Split > >> 6 > >> > >> On 11 August 2013 10:06, Cedric GROSS wrote: > >> > >> > U1 stand for unit 1. > >> > As you see, all function with this prefix will be call when > unit=3D=3D1 > >> > within iwn_vap_create. > >> > > >> > As previously, I haven't investigate a lot this side. I plan to = do > >> > so when standard run will be ok. > >> > >> Right. But what's going on, per se? Is it two separate NICs that > show > >> up as separate PCI devices? Or is this a hack so the firmware can > >> present two virtual NICs via the firmware API? > >> > > Not a separate PCI device but yes ability to create 2 wlan NIC : > > > > iwn0: flags=3D8843 metric 0 = mtu > 2290 > > ether 60:36:dd:93:34:56 > > nd6 options=3D29 > > media: IEEE 802.11 Wireless Ethernet autoselect mode 11ng > > status: associated > > wlan0: flags=3D8943 > > metric 0 mtu 1500 > > ether 60:36:dd:93:34:56 > > inet 192.168.1.20 netmask 0xffffff00 broadcast 192.168.1.255 > > nd6 options=3D29 > > media: IEEE 802.11 Wireless Ethernet MCS mode 11ng > > status: associated > > ssid WLenine channel 5 (2432 MHz 11g ht/20) bssid > 00:24:d4:97:80:20 > > country US authmode WPA2/802.11i privacy ON deftxkey UNDEF > > AES-CCM 2:128-bit txpower 15 bmiss 10 scanvalid 450 bgscan > > bgscanintvl 300 bgscanidle 250 roam:rssi 7 roam:rate 64 > protmode CTS > > ampdulimit 64k -amsdutx amsdurx shortgi wme roaming MANUAL > > bintval > > 96 > > wlan1: flags=3D8802 metric 0 mtu 1500 > > ether 60:36:dd:93:34:57 > > nd6 options=3D29 > > media: IEEE 802.11 Wireless Ethernet autoselect (autoselect) > > status: no carrier > > ssid "" channel 5 (2432 MHz 11g ht/20) > > country US authmode OPEN privacy OFF txpower 15 bmiss 10 > > scanvalid > > 60 > > bgscan bgscanintvl 300 bgscanidle 250 roam:rssi 7 roam:rate > 64 > > protmode CTS ampdulimit 8k -amsdutx amsdurx shortgi wme > > bintval 0 > > From owner-freebsd-wireless@FreeBSD.ORG Mon Aug 12 17:41:52 2013 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 237ACB2E; Mon, 12 Aug 2013 17:41:52 +0000 (UTC) (envelope-from lev@FreeBSD.org) Received: from onlyone.friendlyhosting.spb.ru (onlyone.friendlyhosting.spb.ru [IPv6:2a01:4f8:131:60a2::2]) by mx1.freebsd.org (Postfix) with ESMTP id DC3792F6B; Mon, 12 Aug 2013 17:41:51 +0000 (UTC) Received: from lion.home.serebryakov.spb.ru (unknown [IPv6:2001:470:923f:1:acaf:d9db:8ffe:1642]) (Authenticated sender: lev@serebryakov.spb.ru) by onlyone.friendlyhosting.spb.ru (Postfix) with ESMTPSA id 9E2964AC1C; Mon, 12 Aug 2013 21:41:50 +0400 (MSK) Date: Mon, 12 Aug 2013 21:41:48 +0400 From: Lev Serebryakov Organization: FreeBSD Project X-Priority: 3 (Normal) Message-ID: <1769815169.20130812214148@serebryakov.spb.ru> To: Adrian Chadd Subject: Re: ath as AP panics In-Reply-To: References: <238348209.20130812212328@serebryakov.spb.ru> <1391593482.20130812213235@serebryakov.spb.ru> MIME-Version: 1.0 Content-Type: text/plain; charset=koi8-r Content-Transfer-Encoding: quoted-printable Cc: freebsd-wireless@freebsd.org X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list Reply-To: lev@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, 12 Aug 2013 17:41:52 -0000 Hello, Adrian. You wrote 12 =C1=D7=C7=D5=D3=D4=C1 2013 =C7., 21:34:04: AC> Hm. OK. AC> What I want is the code path _in_ that's queuing a frame via AC> ieee80211_vap_transmit() with m_nextpkt set to NON-NULL. I could set breakpoint on "printf()" from patch and get backtrace when it will be hit. Is it enough? --=20 // Black Lion AKA Lev Serebryakov From owner-freebsd-wireless@FreeBSD.ORG Mon Aug 12 17:47:48 2013 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id E83AAEF1; Mon, 12 Aug 2013 17:47:48 +0000 (UTC) (envelope-from adrian.chadd@gmail.com) Received: from mail-wg0-x231.google.com (mail-wg0-x231.google.com [IPv6:2a00:1450:400c:c00::231]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 4E7562FBE; Mon, 12 Aug 2013 17:47:48 +0000 (UTC) Received: by mail-wg0-f49.google.com with SMTP id y10so4849718wgg.28 for ; Mon, 12 Aug 2013 10:47:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:in-reply-to:references:date:message-id:subject :from:to:cc:content-type:content-transfer-encoding; bh=FshYhkIQvTrvxMw9C55mjx+OoHkrO3qM7jxzIX9KsTI=; b=PIUoOMoccb07wFIHvZp8uwu1WRYviuAwS65uHukbEMnVqSkvfZxbbBPbn9gLN+mFFK zdQuv2Qad7qzJ7xBJ+viVea+XlR4YEQaUP2RXQtNLjfBZC8/9uoQZNPDEAtVHY/52N26 GsTmHTF5rkkd9168gY7bA9lsdPJRzD5CstUAwM+xdsnS7cfvoVOXIcltNaiipOrii1uu VsFNv1lTwGD+wZvYBv1jwPluBotmRGX2aK80IOFEti0IKoM3EOfT3jNFuLegcHyc6MTD 5hkubo8Q6ozefo42J8J3c+597wfW5dhDSmGSpcOZKusEDBClotG9J4j5OnLtVEpKjWyo rmOA== MIME-Version: 1.0 X-Received: by 10.194.234.100 with SMTP id ud4mr134763wjc.44.1376329666664; Mon, 12 Aug 2013 10:47:46 -0700 (PDT) Sender: adrian.chadd@gmail.com Received: by 10.217.116.136 with HTTP; Mon, 12 Aug 2013 10:47:46 -0700 (PDT) In-Reply-To: <1769815169.20130812214148@serebryakov.spb.ru> References: <238348209.20130812212328@serebryakov.spb.ru> <1391593482.20130812213235@serebryakov.spb.ru> <1769815169.20130812214148@serebryakov.spb.ru> Date: Mon, 12 Aug 2013 10:47:46 -0700 X-Google-Sender-Auth: PB44t0mkVkBByHRmCr2Jwt-5wMQ Message-ID: Subject: Re: ath as AP panics From: Adrian Chadd To: lev@freebsd.org Content-Type: text/plain; charset=KOI8-R Content-Transfer-Encoding: quoted-printable Cc: freebsd-wireless@freebsd.org X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.14 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, 12 Aug 2013 17:47:49 -0000 On 12 August 2013 10:41, Lev Serebryakov wrote: > Hello, Adrian. > You wrote 12 =C1=D7=C7=D5=D3=D4=C1 2013 =C7., 21:34:04: > > AC> Hm. OK. > AC> What I want is the code path _in_ that's queuing a frame via > AC> ieee80211_vap_transmit() with m_nextpkt set to NON-NULL. > I could set breakpoint on "printf()" from patch and get backtrace when = it > will be hit. Is it enough? yup -adrian From owner-freebsd-wireless@FreeBSD.ORG Mon Aug 12 18:20:21 2013 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 728B994F for ; Mon, 12 Aug 2013 18:20:21 +0000 (UTC) (envelope-from adrian.chadd@gmail.com) Received: from mail-wi0-x233.google.com (mail-wi0-x233.google.com [IPv6:2a00:1450:400c:c05::233]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 08CDB222A for ; Mon, 12 Aug 2013 18:20:20 +0000 (UTC) Received: by mail-wi0-f179.google.com with SMTP id hr7so2057554wib.6 for ; Mon, 12 Aug 2013 11:20:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:in-reply-to:references:date:message-id:subject :from:to:cc:content-type; bh=+5grCxKyyEFtNAGw4XdIAU+h0sjsrokxXVUpJm9HCsQ=; b=qzEEgGdO7Kgn8hDlYMkW/luHXrVlGvqqkdwumloSFOzS/wldHlTW3Cua5c0p83vm2R z44+/SY9Q7P9d0d/m8Tgmn/EKNzf4JAUjZW/J4VTQnD5wTDge1cdqOA5moqeQVtHsh3r F+WgeQe3pGrVRkxFUjp3ZORREy4hQ0b6+T8Nl/USM0Fer3m4FdVqM20Kp9Io3oCz9DJ0 /7sEet43ffimlwsvmaDZDflXv/HUWKomV16CUxBteykYRsVyTD0TEPQNN0lxdtA4O9Co IMfo2EGwZOTC8xjVBw9kkK2RgruN97CCphdKtSqFMMHGUKnLjn4OM+pJxM1TeuujXJ6L VLmQ== MIME-Version: 1.0 X-Received: by 10.180.37.164 with SMTP id z4mr105525wij.30.1376331619329; Mon, 12 Aug 2013 11:20:19 -0700 (PDT) Sender: adrian.chadd@gmail.com Received: by 10.217.116.136 with HTTP; Mon, 12 Aug 2013 11:20:19 -0700 (PDT) In-Reply-To: <00c901ce9783$26fedd30$74fc9790$@info> References: <001d01ce9694$142db8b0$3c892a10$@info> <003c01ce96b5$15c93d40$415bb7c0$@info> <00c601ce9781$25060550$6f120ff0$@info> <00c901ce9783$26fedd30$74fc9790$@info> Date: Mon, 12 Aug 2013 11:20:19 -0700 X-Google-Sender-Auth: X9Mk4HOj4rB2ZBWRbcv0tVvugZI Message-ID: Subject: Re: [iwn]Review Split 6 From: Adrian Chadd To: Cedric GROSS Content-Type: text/plain; charset=ISO-8859-1 Cc: freebsd-wireless@freebsd.org X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.14 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, 12 Aug 2013 18:20:21 -0000 On 12 August 2013 10:41, Cedric GROSS wrote: > But again, as current version is not stable in normal operation, I haven't > test it further. > > What could be interest of this ? > Wifi relay, bridge or whatever usage of 2 wireless but only with 1 card. It's likely for STA on one VAP and P2P-GO on the other VAP. -adrian From owner-freebsd-wireless@FreeBSD.ORG Mon Aug 12 18:24:46 2013 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id D9A6F9D1 for ; Mon, 12 Aug 2013 18:24:46 +0000 (UTC) (envelope-from adrian.chadd@gmail.com) Received: from mail-wi0-x22e.google.com (mail-wi0-x22e.google.com [IPv6:2a00:1450:400c:c05::22e]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 71B8A2281 for ; Mon, 12 Aug 2013 18:24:46 +0000 (UTC) Received: by mail-wi0-f174.google.com with SMTP id j17so2062875wiw.1 for ; Mon, 12 Aug 2013 11:24:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:in-reply-to:references:date:message-id:subject :from:to:cc:content-type; bh=qOKqgkHH0BLRQjb7CENfB642ZJc3uF+RSE5JlJvunLc=; b=LR0pKxOAD4+TcrUfCY/6TGLpWNINjeqWRDY1q56oRdFpkrJ7Ou0/MLCzKqj9Ampye/ LsQHPw1xVBdtS3+Y5B773X2HfSvCPKQl2Ij9qdBb7TOlDzHw62PfeZant5oMyQKVQhJV qUj4mgdNCG8LP6rZz6f3ZQ0qD8bUZ0EGLWRmI2HuHlhoRhx7nuVwRZ0dH884sgQoS4bg plI1yiNITu+lumD/y91xWpamYXGGyTU3aOQc8nVo4GeiN9da/Dwj0fk/N87aOb1kff42 fhARJlQ8/RAgCqd+nrGyKWo60mZNuTvY6e+VE3IOMUXzOLF/b48jBvT6YTpwkNiifZK8 qTCg== MIME-Version: 1.0 X-Received: by 10.180.160.165 with SMTP id xl5mr80479wib.46.1376331884585; Mon, 12 Aug 2013 11:24:44 -0700 (PDT) Sender: adrian.chadd@gmail.com Received: by 10.217.116.136 with HTTP; Mon, 12 Aug 2013 11:24:44 -0700 (PDT) In-Reply-To: <001d01ce9694$142db8b0$3c892a10$@info> References: <001d01ce9694$142db8b0$3c892a10$@info> Date: Mon, 12 Aug 2013 11:24:44 -0700 X-Google-Sender-Auth: KN4lHPHex2vdKs9PmMyVK1T7ObE Message-ID: Subject: Re: [iwn]Review Split 6 From: Adrian Chadd To: Cedric GROSS Content-Type: text/plain; charset=ISO-8859-1 Cc: freebsd-wireless@freebsd.org X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.14 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, 12 Aug 2013 18:24:46 -0000 Ok, so this PAN support is .. pretty terrifying. We'll have to tidy it up once the rest of this work is debugged. I guess '_u1' here is 'PAN VAP'. We'll eventually rename this stuff and maybe shift it into a separate source file so all the PAN stuff clearly lives elsewhere. I wonder which NICs support PAN - ie, how I would even begin going about testing it out. Unfortunately our net80211 stack doesn't yet have P2P support - it would be nice if someone wrote up the basic infrastructure for that. Anyway. I'll test this out on the iwn(4) NICs I now have and I'll get back to you with any regressions that my light testing finds. As always, thanks! -adrian From owner-freebsd-wireless@FreeBSD.ORG Mon Aug 12 19:05:05 2013 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 579582CE; Mon, 12 Aug 2013 19:05:05 +0000 (UTC) (envelope-from cg@cgross.info) Received: from alpha.kreiz-it.fr (alpha.kreiz-it.fr [178.32.219.166]) by mx1.freebsd.org (Postfix) with ESMTP id 20E5224AC; Mon, 12 Aug 2013 19:05:04 +0000 (UTC) Received: from DirTech (lnr56-1-82-246-51-185.fbx.proxad.net [82.246.51.185]) by alpha.kreiz-it.fr (Postfix) with ESMTPSA id D1BE449C; Mon, 12 Aug 2013 21:05:03 +0200 (CEST) From: "Cedric GROSS" To: "'Adrian Chadd'" References: <001d01ce9694$142db8b0$3c892a10$@info> In-Reply-To: Subject: RE: [iwn]Review Split 6 Date: Mon, 12 Aug 2013 21:05:02 +0200 Message-ID: <00cc01ce978e$dada4190$908ec4b0$@info> MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable X-Mailer: Microsoft Office Outlook 12.0 Thread-Index: Ac6XiTvO4Eaiu0GSS/ikTzDuFG0H+QABP3cQ Content-Language: fr Cc: freebsd-wireless@freebsd.org X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.14 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, 12 Aug 2013 19:05:05 -0000 > -----Message d'origine----- > De=A0: adrian.chadd@gmail.com [mailto:adrian.chadd@gmail.com] De la = part > de Adrian Chadd > Envoy=E9=A0: lundi 12 ao=FBt 2013 20:25 > =C0=A0: Cedric GROSS > Cc=A0: freebsd-wireless@freebsd.org > Objet=A0: Re: [iwn]Review Split 6 >=20 > Ok, so this PAN support is .. pretty terrifying. We'll have to tidy it > up once the rest of this work is debugged. >=20 > I guess '_u1' here is 'PAN VAP'. We'll eventually rename this stuff = and > maybe shift it into a separate source file so all the PAN stuff = clearly > lives elsewhere. Ok I'll do that.=20 >=20 > I wonder which NICs support PAN - ie, how I would even begin going > about testing it out. Unfortunately our net80211 stack doesn't yet = have > P2P support - it would be nice if someone wrote up the basic > infrastructure for that. PAN support is found within firmware: IWN_FW_TLV_PAN >=20 > Anyway. I'll test this out on the iwn(4) NICs I now have and I'll get > back to you with any regressions that my light testing finds. As > always, thanks! >=20 Should be none I guess ;) >=20 >=20 > -adrian From owner-freebsd-wireless@FreeBSD.ORG Mon Aug 12 19:05:56 2013 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 3904F2ED for ; Mon, 12 Aug 2013 19:05:56 +0000 (UTC) (envelope-from adrian.chadd@gmail.com) Received: from mail-wi0-x22d.google.com (mail-wi0-x22d.google.com [IPv6:2a00:1450:400c:c05::22d]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id C521324B0 for ; Mon, 12 Aug 2013 19:05:55 +0000 (UTC) Received: by mail-wi0-f173.google.com with SMTP id en1so2108805wid.6 for ; Mon, 12 Aug 2013 12:05:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:in-reply-to:references:date:message-id:subject :from:to:cc:content-type; bh=e6L5+ABrP+LdYiM/BXwLmiiYb6yk1QRK99eSwoXM5jU=; b=SLn0PrXQJ8l62n0ozNqwMjUTC5fTeGd5CsGCBVgdN7uBAuSAT/zDubUGtIqSpxBblA QvrS1y/krjXoLX/qnNdEAq3waboh+2pTYi9MWWOR/+rYS/jnMs/k1rI0AjNsSHabsJpi a1EXC8PiGevBMRGudQzYCQrblYTPxK22LUkNEd/tDJ0r+4MTTL+0ep5swQMRHd2RxbHP V5RbIze99tpJNuM6eEjZf7x1j3i0KcMo2HPEk4u5oeoqhzvpykJxSAa2HzLGnxYnJzmK G29xbh0hAv4yprlA9HXMD6YFLDCASSt9YzcfsyeC91TUZYC42Vx3l9bGzNsjDKl4KX8J ShBQ== MIME-Version: 1.0 X-Received: by 10.195.12.170 with SMTP id er10mr335405wjd.5.1376334354046; Mon, 12 Aug 2013 12:05:54 -0700 (PDT) Sender: adrian.chadd@gmail.com Received: by 10.217.116.136 with HTTP; Mon, 12 Aug 2013 12:05:53 -0700 (PDT) In-Reply-To: <00cc01ce978e$dada4190$908ec4b0$@info> References: <001d01ce9694$142db8b0$3c892a10$@info> <00cc01ce978e$dada4190$908ec4b0$@info> Date: Mon, 12 Aug 2013 12:05:53 -0700 X-Google-Sender-Auth: pNw0Sr_LImXVUEh1tyVeXh7O_lY Message-ID: Subject: Re: [iwn]Review Split 6 From: Adrian Chadd To: Cedric GROSS Content-Type: text/plain; charset=ISO-8859-1 Cc: freebsd-wireless@freebsd.org X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.14 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, 12 Aug 2013 19:05:56 -0000 I have a lot of the NICs now. I may even test with the 1000 series NICs. :p -adrian From owner-freebsd-wireless@FreeBSD.ORG Mon Aug 12 21:35:49 2013 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 967854D9; Mon, 12 Aug 2013 21:35:49 +0000 (UTC) (envelope-from lev@FreeBSD.org) Received: from onlyone.friendlyhosting.spb.ru (onlyone.friendlyhosting.spb.ru [IPv6:2a01:4f8:131:60a2::2]) by mx1.freebsd.org (Postfix) with ESMTP id 24E952D45; Mon, 12 Aug 2013 21:35:49 +0000 (UTC) Received: from lion.home.serebryakov.spb.ru (unknown [IPv6:2001:470:923f:1:acaf:d9db:8ffe:1642]) (Authenticated sender: lev@serebryakov.spb.ru) by onlyone.friendlyhosting.spb.ru (Postfix) with ESMTPSA id 43BD14AC1C; Tue, 13 Aug 2013 01:35:47 +0400 (MSK) Date: Tue, 13 Aug 2013 01:35:44 +0400 From: Lev Serebryakov Organization: FreeBSD Project X-Priority: 3 (Normal) Message-ID: <809218974.20130813013544@serebryakov.spb.ru> To: Adrian Chadd Subject: Re: ath as AP panics In-Reply-To: References: <238348209.20130812212328@serebryakov.spb.ru> <1391593482.20130812213235@serebryakov.spb.ru> <1769815169.20130812214148@serebryakov.spb.ru> MIME-Version: 1.0 Content-Type: text/plain; charset=koi8-r Content-Transfer-Encoding: quoted-printable Cc: freebsd-wireless@freebsd.org X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list Reply-To: lev@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, 12 Aug 2013 21:35:49 -0000 Hello, Adrian. You wrote 12 =C1=D7=C7=D5=D3=D4=C1 2013 =C7., 21:47:46: >> AC> Hm. OK. >> AC> What I want is the code path _in_ that's queuing a frame via >> AC> ieee80211_vap_transmit() with m_nextpkt set to NON-NULL. >> I could set breakpoint on "printf()" from patch and get backtrace when= it >> will be hit. Is it enough? AC> yup db> trace Tracing pid 0 tid 100037 td 0xfffffe0001a95920 ieee80211_vap_transmit() at ieee80211_vap_transmit+0x12b/frame 0xffffff8122= 05e950 pwrsave_flushq() at pwrsave_flushq+0x19f/frame 0xffffff812205e9a0 hostap_input() at hostap_input+0x8a9/frame 0xffffff812205ea30 ath_rx_pkt() at ath_rx_pkt+0x3fa/frame 0xffffff812205eaa0 ath_rx_proc() at ath_rx_proc+0x290/frame 0xffffff812205eb30 taskqueue_run_locked() at taskqueue_run_locked+0xe6/frame 0xffffff812205eb80 taskqueue_thread_loop() at taskqueue_thread_loop+0xa8/frame 0xffffff812205e= bb0 fork_exit() at fork_exit+0x75/frame 0xffffff812205ebf0 fork_trampoline() at fork_trampoline+0xe/frame 0xffffff812205ebf0 --- trap 0, rip =3D 0, rsp =3D 0xffffff812205ecb0, rbp =3D 0 --- And here are files/lines in r254250 with "printf() patch"): // No surprise here :) (kgdb) list *(ieee80211_vap_transmit+0x12b) 0xffffffff8059ad6b is in ieee80211_vap_transmit (/data/src/sys/net80211/iee= e80211_output.c:466). 461 * Complain if m->m_nextpkt is set. 462 * 463 * The caller should've pulled this apart for us. 464 */ 465 if (m->m_nextpkt !=3D NULL) { 466 printf("%s: m_nextpkt not NULL?!\n", __func__); 467 m->m_nextpkt =3D NULL; 468 } 469 470 /* (kgdb) list *(pwrsave_flushq+0x19f) 0xffffffff8059f63f is in pwrsave_flushq (/data/src/sys/net80211/ieee80211_p= ower.c:477). 472 473 /* VAP frames, aren't encapsulated */ 474 if (ifp !=3D NULL) { 475 while (ifp_q !=3D NULL) { 476 m =3D ifp_q; 477 ifp_q =3D m->m_nextpkt; 478 KASSERT((!(m->m_flags & M_ENCAP)), 479 ("%s: vapq with M_ENCAP frame!\n", __fu= nc__)); 480 (void) ieee80211_vap_xmitpkt(vap, m); 481 } (kgdb) list *(hostap_input+0x8a9) 0xffffffff80588219 is in hostap_input (/data/src/sys/net80211/ieee80211_hos= tap.c:655). 650 /* 651 * For 4-address packets handle WDS discovery 652 * notifications. Once a WDS link is setup frames 653 * are just delivered to the WDS vap (see below). 654 */ 655 if (dir =3D=3D IEEE80211_FC1_DIR_DSTODS && ni->ni_w= dsvap =3D=3D NULL) { 656 if (!ieee80211_node_is_authorized(ni)) { 657 IEEE80211_DISCARD(vap, 658 IEEE80211_MSG_INPUT | 659 IEEE80211_MSG_WDS, wh, (kgdb) list *(ath_rx_proc+0x290) 0xffffffff80308ec0 is in ath_rx_proc (/data/src/sys/dev/ath/if_ath_rx.c:995= ). 990 * Process a single frame. 991 */ 992 bus_dmamap_sync(sc->sc_dmat, bf->bf_dmamap, BUS_DMA= SYNC_POSTREAD); 993 bus_dmamap_unload(sc->sc_dmat, bf->bf_dmamap); 994 bf->bf_m =3D NULL; 995 if (ath_rx_pkt(sc, rs, status, tsf, nf, HAL_RX_QUEU= E_HP, bf, m)) 996 ngood++; 997 rx_proc_next: 998 TAILQ_INSERT_TAIL(&sc->sc_rxbuf, bf, bf_list); 999 } while (ath_rxbuf_init(sc, bf) =3D=3D 0); --=20 // Black Lion AKA Lev Serebryakov From owner-freebsd-wireless@FreeBSD.ORG Mon Aug 12 22:28:09 2013 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id EACD3143; Mon, 12 Aug 2013 22:28:09 +0000 (UTC) (envelope-from adrian.chadd@gmail.com) Received: from mail-wi0-x22d.google.com (mail-wi0-x22d.google.com [IPv6:2a00:1450:400c:c05::22d]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 58CF8205E; Mon, 12 Aug 2013 22:28:09 +0000 (UTC) Received: by mail-wi0-f173.google.com with SMTP id en1so2300397wid.6 for ; Mon, 12 Aug 2013 15:28:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:in-reply-to:references:date:message-id:subject :from:to:cc:content-type:content-transfer-encoding; bh=/L5LPvSBauyxIKM1Xb6XBpYwHpnMsgQ/uu54+k7GLnQ=; b=VaR19848OYWTkYfPj1QLJ4dpJkY0f0FeUmT3gltDku79UxqKbi+6r3Pm8BjW02Yx+V i5NC90/Pj6ulqWLvCEgfzt1GrQTZLI8uGUUB0v81r3rBU5XcK5fAQw9MQhLbDK7lnKV0 0WAt8S8UXXQdVh6QDkur5NyBWTnQI6yHCu8BuUTse3t7ZJHXqS2ezqi7Wq4OE8Y9hDJs AbJ4oHjXIef0ooj3ZJLMElhuiaI/7pkHTodvm+hIQCvQvwWDtAcfktkH6ejKmfk6ZmT3 p7h1NPqc7YLEFnKkrZTO8VZ4+x9GcGutpAyZmR1aKC5ZJ0j0sry/ELAKk63cLyk8kXZk gVAg== MIME-Version: 1.0 X-Received: by 10.180.160.165 with SMTP id xl5mr429491wib.46.1376346487675; Mon, 12 Aug 2013 15:28:07 -0700 (PDT) Sender: adrian.chadd@gmail.com Received: by 10.217.116.136 with HTTP; Mon, 12 Aug 2013 15:28:07 -0700 (PDT) In-Reply-To: <809218974.20130813013544@serebryakov.spb.ru> References: <238348209.20130812212328@serebryakov.spb.ru> <1391593482.20130812213235@serebryakov.spb.ru> <1769815169.20130812214148@serebryakov.spb.ru> <809218974.20130813013544@serebryakov.spb.ru> Date: Mon, 12 Aug 2013 15:28:07 -0700 X-Google-Sender-Auth: yPdD-Qp-IKAjeTPPXbWnpFrc4GQ Message-ID: Subject: Re: ath as AP panics From: Adrian Chadd To: lev@freebsd.org Content-Type: text/plain; charset=KOI8-R Content-Transfer-Encoding: quoted-printable Cc: freebsd-wireless@freebsd.org X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.14 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, 12 Aug 2013 22:28:10 -0000 Ugh, I missed another m_nextpkt =3D NULL assignment. Try updating again. Thanks! -adrian On 12 August 2013 14:35, Lev Serebryakov wrote: > Hello, Adrian. > You wrote 12 =C1=D7=C7=D5=D3=D4=C1 2013 =C7., 21:47:46: > >>> AC> Hm. OK. >>> AC> What I want is the code path _in_ that's queuing a frame via >>> AC> ieee80211_vap_transmit() with m_nextpkt set to NON-NULL. >>> I could set breakpoint on "printf()" from patch and get backtrace whe= n it >>> will be hit. Is it enough? > > AC> yup > > db> trace > Tracing pid 0 tid 100037 td 0xfffffe0001a95920 > ieee80211_vap_transmit() at ieee80211_vap_transmit+0x12b/frame 0xffffff81= 2205e950 > pwrsave_flushq() at pwrsave_flushq+0x19f/frame 0xffffff812205e9a0 > hostap_input() at hostap_input+0x8a9/frame 0xffffff812205ea30 > ath_rx_pkt() at ath_rx_pkt+0x3fa/frame 0xffffff812205eaa0 > ath_rx_proc() at ath_rx_proc+0x290/frame 0xffffff812205eb30 > taskqueue_run_locked() at taskqueue_run_locked+0xe6/frame 0xffffff812205e= b80 > taskqueue_thread_loop() at taskqueue_thread_loop+0xa8/frame 0xffffff81220= 5ebb0 > fork_exit() at fork_exit+0x75/frame 0xffffff812205ebf0 > fork_trampoline() at fork_trampoline+0xe/frame 0xffffff812205ebf0 > --- trap 0, rip =3D 0, rsp =3D 0xffffff812205ecb0, rbp =3D 0 --- > > And here are files/lines in r254250 with "printf() patch"): > > // No surprise here :) > (kgdb) list *(ieee80211_vap_transmit+0x12b) > 0xffffffff8059ad6b is in ieee80211_vap_transmit (/data/src/sys/net80211/i= eee80211_output.c:466). > 461 * Complain if m->m_nextpkt is set. > 462 * > 463 * The caller should've pulled this apart for us. > 464 */ > 465 if (m->m_nextpkt !=3D NULL) { > 466 printf("%s: m_nextpkt not NULL?!\n", __func__); > 467 m->m_nextpkt =3D NULL; > 468 } > 469 > 470 /* > (kgdb) list *(pwrsave_flushq+0x19f) > 0xffffffff8059f63f is in pwrsave_flushq (/data/src/sys/net80211/ieee80211= _power.c:477). > 472 > 473 /* VAP frames, aren't encapsulated */ > 474 if (ifp !=3D NULL) { > 475 while (ifp_q !=3D NULL) { > 476 m =3D ifp_q; > 477 ifp_q =3D m->m_nextpkt; > 478 KASSERT((!(m->m_flags & M_ENCAP)), > 479 ("%s: vapq with M_ENCAP frame!\n", __= func__)); > 480 (void) ieee80211_vap_xmitpkt(vap, m); > 481 } > (kgdb) list *(hostap_input+0x8a9) > 0xffffffff80588219 is in hostap_input (/data/src/sys/net80211/ieee80211_h= ostap.c:655). > 650 /* > 651 * For 4-address packets handle WDS discovery > 652 * notifications. Once a WDS link is setup frame= s > 653 * are just delivered to the WDS vap (see below). > 654 */ > 655 if (dir =3D=3D IEEE80211_FC1_DIR_DSTODS && ni->ni= _wdsvap =3D=3D NULL) { > 656 if (!ieee80211_node_is_authorized(ni)) { > 657 IEEE80211_DISCARD(vap, > 658 IEEE80211_MSG_INPUT | > 659 IEEE80211_MSG_WDS, wh, > (kgdb) list *(ath_rx_proc+0x290) > 0xffffffff80308ec0 is in ath_rx_proc (/data/src/sys/dev/ath/if_ath_rx.c:9= 95). > 990 * Process a single frame. > 991 */ > 992 bus_dmamap_sync(sc->sc_dmat, bf->bf_dmamap, BUS_D= MASYNC_POSTREAD); > 993 bus_dmamap_unload(sc->sc_dmat, bf->bf_dmamap); > 994 bf->bf_m =3D NULL; > 995 if (ath_rx_pkt(sc, rs, status, tsf, nf, HAL_RX_QU= EUE_HP, bf, m)) > 996 ngood++; > 997 rx_proc_next: > 998 TAILQ_INSERT_TAIL(&sc->sc_rxbuf, bf, bf_list); > 999 } while (ath_rxbuf_init(sc, bf) =3D=3D 0); > > > -- > // Black Lion AKA Lev Serebryakov > From owner-freebsd-wireless@FreeBSD.ORG Tue Aug 13 02:47:38 2013 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 7ED923AD for ; Tue, 13 Aug 2013 02:47:38 +0000 (UTC) (envelope-from julio@meroh.net) Received: from mail-vc0-f182.google.com (mail-vc0-f182.google.com [209.85.220.182]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 38C3F2F60 for ; Tue, 13 Aug 2013 02:47:37 +0000 (UTC) Received: by mail-vc0-f182.google.com with SMTP id hf12so3459473vcb.27 for ; Mon, 12 Aug 2013 19:47:31 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-gm-message-state:message-id:date:from:user-agent:mime-version:to :cc:subject:references:in-reply-to:content-type :content-transfer-encoding; bh=ztKvRVk9NOS23bk/HbXrEktiNAGxbLWEXWVxJ2InK1Q=; b=SdYgeIclXgax08+CYDWgjh/knT6FwcPA054AX/M3sMk7ynhdHlQIGkV2gEDnjsoRO6 Z2fNVI3sHKi4VuDw64DjLk1c1A8vZ1my6bcgmHmHNzpqUNrNn53GlUhFkddsxKvdcd2M StpGW2478YZHFq1Ck+eKpD6NMV6PLNKEQBbnSb/Bm9k1vQyvryO4a9fiOTXVyD7rD/Be 65B1NAJjGooqQHvEX1zeFXjV7tbYRZJNq486QKuYB0cjnvj+RpgXIZvIGsKkiqr82mqS LngB8/t0zrDWTjuMRcvhiz9ubJ+B8Tb2tm5dUav/Qm793juj7gt1IpwNqaLzdCW0jtnG b1sA== X-Gm-Message-State: ALoCoQmCXOFx+vDfQMLuH9x/3mqMKbtDHEJvxckmZp0hdY4c8y5WI7go9/cbOaFIyCTkP0/SRgyI X-Received: by 10.58.171.4 with SMTP id aq4mr1972675vec.26.1376361718988; Mon, 12 Aug 2013 19:41:58 -0700 (PDT) Received: from lime-wifi.meroh.net (cpe-108-176-158-82.nyc.res.rr.com. [108.176.158.82]) by mx.google.com with ESMTPSA id ee5sm7966877vdb.9.2013.08.12.19.41.56 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 12 Aug 2013 19:41:57 -0700 (PDT) Message-ID: <52099CF4.7050101@meroh.net> Date: Mon, 12 Aug 2013 22:41:56 -0400 From: Julio Merino User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Adrian Chadd Subject: Re: kern/181100: [bwi] Turning up bwi0 crashes / deadlocks the kernel References: <201308111650.r7BGo1Qt048071@freefall.freebsd.org> In-Reply-To: X-Enigmail-Version: 1.5.2 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Cc: freebsd-wireless@freebsd.org X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.14 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, 13 Aug 2013 02:47:38 -0000 On 2013-08-11 23:19 , Adrian Chadd wrote: > Try this patch in sys/dev/bwi/ : This is what I got: bwi_mac_set_ackrates: i=0 (of 12); rs->rs_rates = 130 From owner-freebsd-wireless@FreeBSD.ORG Tue Aug 13 03:24:17 2013 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 5BB3CFCB for ; Tue, 13 Aug 2013 03:24:17 +0000 (UTC) (envelope-from adrian.chadd@gmail.com) Received: from mail-wi0-x229.google.com (mail-wi0-x229.google.com [IPv6:2a00:1450:400c:c05::229]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id E3FE72258 for ; Tue, 13 Aug 2013 03:24:16 +0000 (UTC) Received: by mail-wi0-f169.google.com with SMTP id f14so2482060wiw.0 for ; Mon, 12 Aug 2013 20:24:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:in-reply-to:references:date:message-id:subject :from:to:cc:content-type; bh=/2+LQEf4U0sf4CscPuRETpDbWjTrkZqnJK1ERReWZKs=; b=n44mXvtuaFhtxRTxb0Y5zAjHyJz/AmQFfjCSrnz7i2usSCISoZmW4BSSSYv8+DOHxT sY6vyc4neW0d02rvI45GXlk0z4iK1bFWvS5C2tx6IrQof4rXO34PjXIjVD3S+ZFdnn51 HUO4+S4N0G+NNlUafOPaI7A6WwD/TqxruSOBI9OP4BELjO9azk75TtILPiJRMVoDHCDM 3+xLrTAGw5XlYYfk1aOducqlaaAo0gIix9vnsRET3k6LT1hEHEDqc0qipMitg0+DfzFp FnxRKnOL3wa2wjn9ehCKjseW1wqF5EoPbsGFU9YA9BTr737G1JUQsZeuSkGVfltv5/sn dZfw== MIME-Version: 1.0 X-Received: by 10.180.160.165 with SMTP id xl5mr274772wib.46.1376364255211; Mon, 12 Aug 2013 20:24:15 -0700 (PDT) Sender: adrian.chadd@gmail.com Received: by 10.217.116.136 with HTTP; Mon, 12 Aug 2013 20:24:15 -0700 (PDT) In-Reply-To: <52099CF4.7050101@meroh.net> References: <201308111650.r7BGo1Qt048071@freefall.freebsd.org> <52099CF4.7050101@meroh.net> Date: Mon, 12 Aug 2013 20:24:15 -0700 X-Google-Sender-Auth: YSwGcgZf71lnjSLGWI7-JvyAvbw Message-ID: Subject: Re: kern/181100: [bwi] Turning up bwi0 crashes / deadlocks the kernel From: Adrian Chadd To: Julio Merino Content-Type: text/plain; charset=ISO-8859-1 Cc: freebsd-wireless@freebsd.org X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.14 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, 13 Aug 2013 03:24:17 -0000 Oh, god damnit! On 12 August 2013 19:41, Julio Merino wrote: > On 2013-08-11 23:19 , Adrian Chadd wrote: >> Try this patch in sys/dev/bwi/ : > > This is what I got: > > bwi_mac_set_ackrates: i=0 (of 12); rs->rs_rates = 130 Oh hm, the problem is that rs_rates[] shouldn't be directly used anymore. The rate table value has the basic rate bit set, so it's rate == 1mbit, it's stored as 2*throughput; and the basic rate (128) is set, so: 128 + 2*1 == 130 Sigh. Lemme go through my patch archive to see where the code went. I thought I committed it when I threw the 11n code into ieee80211_phy.c . Grr! Thanks! -adrian From owner-freebsd-wireless@FreeBSD.ORG Tue Aug 13 07:08:16 2013 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 26EF8226; Tue, 13 Aug 2013 07:08:16 +0000 (UTC) (envelope-from cg@cgross.info) Received: from alpha.kreiz-it.fr (alpha.kreiz-it.fr [IPv6:2001:41d0:8:dda6::1]) by mx1.freebsd.org (Postfix) with ESMTP id 572742E85; Tue, 13 Aug 2013 07:08:15 +0000 (UTC) Received: from DirTech (lnr56-1-82-246-51-185.fbx.proxad.net [82.246.51.185]) by alpha.kreiz-it.fr (Postfix) with ESMTPSA id 4D41755C; Tue, 13 Aug 2013 09:08:13 +0200 (CEST) From: "Cedric GROSS" To: "'Adrian Chadd'" References: <001d01ce9694$142db8b0$3c892a10$@info> <00cc01ce978e$dada4190$908ec4b0$@info> In-Reply-To: <00cc01ce978e$dada4190$908ec4b0$@info> Subject: RE: [iwn]Review Split 6 Date: Tue, 13 Aug 2013 09:08:10 +0200 Message-ID: <000c01ce97f3$e0178d10$a046a730$@info> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_000D_01CE9804.A3A05D10" X-Mailer: Microsoft Office Outlook 12.0 Thread-Index: Ac6XiTvO4Eaiu0GSS/ikTzDuFG0H+QABP3cQABkHZ1A= Content-Language: fr Cc: freebsd-wireless@freebsd.org X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.14 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, 13 Aug 2013 07:08:16 -0000 This is a multi-part message in MIME format. ------=_NextPart_000_000D_01CE9804.A3A05D10 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit > > > > I guess '_u1' here is 'PAN VAP'. We'll eventually rename this stuff > > and maybe shift it into a separate source file so all the PAN stuff > > clearly lives elsewhere. > > Ok I'll do that. > Here is new version of split 6 with new files and new function renamed. Cedric ------=_NextPart_000_000D_01CE9804.A3A05D10 Content-Type: application/octet-stream; name="pan2.patch" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="pan2.patch" Index: sys/dev/iwn/if_iwn.c=0A= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=0A= --- sys/dev/iwn/if_iwn.c (revision 254271)=0A= +++ sys/dev/iwn/if_iwn.c (working copy)=0A= @@ -77,6 +77,7 @@=0A= #include =0A= #include =0A= #include =0A= +#include =0A= =0A= struct iwn_ident {=0A= uint16_t vendor;=0A= @@ -180,7 +181,6 @@=0A= static void iwn_read_eeprom_enhinfo(struct iwn_softc *);=0A= static struct ieee80211_node *iwn_node_alloc(struct ieee80211vap *,=0A= const uint8_t mac[IEEE80211_ADDR_LEN]);=0A= -static void iwn_newassoc(struct ieee80211_node *, int);=0A= static int iwn_media_change(struct ifnet *);=0A= static int iwn_newstate(struct ieee80211vap *, enum ieee80211_state, = int);=0A= static void iwn_calib_timeout(void *);=0A= @@ -225,7 +225,6 @@=0A= static void iwn_start_locked(struct ifnet *);=0A= static void iwn_watchdog(void *);=0A= static int iwn_ioctl(struct ifnet *, u_long, caddr_t);=0A= -static int iwn_cmd(struct iwn_softc *, int, const void *, int, int);=0A= static int iwn4965_add_node(struct iwn_softc *, struct iwn_node_info *,=0A= int);=0A= static int iwn5000_add_node(struct iwn_softc *, struct iwn_node_info *,=0A= @@ -329,37 +328,7 @@=0A= #ifdef IWN_DEBUG=0A= static char *iwn_get_csr_string(int);=0A= static void iwn_debug_register(struct iwn_softc *);=0A= -#endif=0A= -=0A= -#ifdef IWN_DEBUG=0A= -enum {=0A= - IWN_DEBUG_XMIT =3D 0x00000001, /* basic xmit operation */=0A= - IWN_DEBUG_RECV =3D 0x00000002, /* basic recv operation */=0A= - IWN_DEBUG_STATE =3D 0x00000004, /* 802.11 state transitions */=0A= - IWN_DEBUG_TXPOW =3D 0x00000008, /* tx power processing */=0A= - IWN_DEBUG_RESET =3D 0x00000010, /* reset processing */=0A= - IWN_DEBUG_OPS =3D 0x00000020, /* iwn_ops processing */=0A= - IWN_DEBUG_BEACON =3D 0x00000040, /* beacon handling */=0A= - IWN_DEBUG_WATCHDOG =3D 0x00000080, /* watchdog timeout */=0A= - IWN_DEBUG_INTR =3D 0x00000100, /* ISR */=0A= - IWN_DEBUG_CALIBRATE =3D 0x00000200, /* periodic calibration */=0A= - IWN_DEBUG_NODE =3D 0x00000400, /* node management */=0A= - IWN_DEBUG_LED =3D 0x00000800, /* led management */=0A= - IWN_DEBUG_CMD =3D 0x00001000, /* cmd submission */=0A= - IWN_DEBUG_TXRATE =3D 0x00002000, /* TX rate debugging */=0A= - IWN_DEBUG_PWRSAVE =3D 0x00004000, /* Power save operations */=0A= - IWN_DEBUG_REGISTER =3D 0x20000000, /* print chipset register */=0A= - IWN_DEBUG_TRACE =3D 0x40000000, /* Print begin and start driver = function */=0A= - IWN_DEBUG_FATAL =3D 0x80000000, /* fatal errors */=0A= - IWN_DEBUG_ANY =3D 0xffffffff=0A= -};=0A= -=0A= -#define DPRINTF(sc, m, fmt, ...) do { \=0A= - if (sc->sc_debug & (m)) \=0A= - printf(fmt, __VA_ARGS__); \=0A= -} while (0)=0A= -=0A= -static const char *=0A= +const char *=0A= iwn_intr_str(uint8_t cmd)=0A= {=0A= switch (cmd) {=0A= @@ -401,8 +370,6 @@=0A= }=0A= return "UNKNOWN INTR NOTIF/CMD";=0A= }=0A= -#else=0A= -#define DPRINTF(sc, m, fmt, ...) do { (void) sc; } while (0)=0A= #endif=0A= =0A= static device_method_t iwn_methods[] =3D {=0A= @@ -919,6 +886,13 @@=0A= =0A= IEEE80211_ADDR_COPY(mac1, mac);=0A= =0A= + if(unit =3D=3D 1) {=0A= + if(!(sc->sc_flags & IWN_FLAG_PAN_SUPPORT))=0A= + return NULL;=0A= + mac1[5] +=3D 1;=0A= + sc->ctx =3D IWN_RXON_PAN_CTX;=0A= + }=0A= +=0A= ivp =3D (struct iwn_vap *) malloc(sizeof(struct iwn_vap),=0A= M_80211_VAP, M_NOWAIT | M_ZERO);=0A= if (ivp =3D=3D NULL)=0A= @@ -925,13 +899,27 @@=0A= return NULL;=0A= vap =3D &ivp->iv_vap;=0A= ieee80211_vap_setup(ic, vap, name, unit, opmode, flags, bssid, mac1);=0A= - ivp->ctx =3D IWN_RXON_BSS_CTX;=0A= - IEEE80211_ADDR_COPY(ivp->macaddr, mac1);=0A= +=0A= + if(unit =3D=3D 1) {=0A= + ivp->ctx =3D IWN_RXON_PAN_CTX;=0A= + ivp->iv_newstate =3D vap->iv_newstate;=0A= + vap->iv_newstate =3D iwn_newstate_pan;=0A= + IEEE80211_ADDR_COPY(ivp->macaddr, mac1);=0A= + memset(&sc->rx_on[IWN_RXON_PAN_CTX], 0, sizeof (struct iwn_rxon));=0A= + memcpy(&sc->rx_on[IWN_RXON_PAN_CTX], &sc->rx_on[IWN_RXON_BSS_CTX], = sc->rxonsz);=0A= + IEEE80211_ADDR_COPY(sc->rx_on[IWN_RXON_PAN_CTX].myaddr, mac1);=0A= + sc->rx_on[IWN_RXON_PAN_CTX].mode =3D IWN_MODE_2STA;=0A= + sc->ivap[IWN_RXON_PAN_CTX] =3D vap;=0A= + }=0A= + else {=0A= + ivp->ctx =3D IWN_RXON_BSS_CTX;=0A= + IEEE80211_ADDR_COPY(ivp->macaddr, mac1);=0A= + ivp->iv_newstate =3D vap->iv_newstate;=0A= + vap->iv_newstate =3D iwn_newstate;=0A= + sc->ivap[IWN_RXON_BSS_CTX] =3D vap;=0A= + }=0A= +=0A= vap->iv_bmissthreshold =3D 10; /* override default */=0A= - /* Override with driver methods. */=0A= - ivp->iv_newstate =3D vap->iv_newstate;=0A= - vap->iv_newstate =3D iwn_newstate;=0A= - sc->ivap[IWN_RXON_BSS_CTX] =3D vap;=0A= =0A= ieee80211_ratectl_init(vap);=0A= /* Complete setup. */=0A= @@ -944,7 +932,11 @@=0A= iwn_vap_delete(struct ieee80211vap *vap)=0A= {=0A= struct iwn_vap *ivp =3D IWN_VAP(vap);=0A= + struct iwn_softc *sc =3D vap->iv_ic->ic_ifp->if_softc;=0A= =0A= + if(ivp->ctx =3D=3D IWN_RXON_PAN_CTX)=0A= + sc->ctx =3D 0;=0A= +=0A= ieee80211_ratectl_deinit(vap);=0A= ieee80211_vap_detach(vap);=0A= free(ivp, M_80211_VAP);=0A= @@ -2317,7 +2309,7 @@=0A= #undef RV=0A= }=0A= =0A= -static void=0A= +void=0A= iwn_newassoc(struct ieee80211_node *ni, int isnew)=0A= {=0A= /* Doesn't do anything at the moment */=0A= @@ -2794,6 +2786,7 @@=0A= struct ieee80211vap *vap =3D TAILQ_FIRST(&ic->ic_vaps);=0A= struct iwn_calib_state *calib =3D &sc->calib;=0A= struct iwn_stats *stats =3D (struct iwn_stats *)(desc + 1);=0A= + struct ieee80211vap *vap1;=0A= int temp;=0A= =0A= DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);=0A= @@ -2805,6 +2798,13 @@=0A= __func__);=0A= return;=0A= }=0A= + if(sc->ctx =3D=3D IWN_RXON_PAN_CTX) {=0A= + vap1 =3D sc->ivap[IWN_RXON_PAN_CTX];=0A= + /* Ignore statistics received during a scan. */=0A= + if (vap1->iv_state !=3D IEEE80211_S_RUN ||=0A= + (ic->ic_flags & IEEE80211_F_SCAN))=0A= + return;=0A= + }=0A= =0A= bus_dmamap_sync(sc->rxq.data_dmat, data->map, BUS_DMASYNC_POSTREAD);=0A= =0A= @@ -2993,12 +2993,19 @@=0A= static void=0A= iwn_cmd_done(struct iwn_softc *sc, struct iwn_rx_desc *desc)=0A= {=0A= - struct iwn_tx_ring *ring =3D &sc->txq[4];=0A= + struct iwn_tx_ring *ring;=0A= struct iwn_tx_data *data;=0A= + int cmd_queue_num;=0A= =0A= - if ((desc->qid & 0xf) !=3D 4)=0A= + if(sc->sc_flags & IWN_FLAG_PAN_SUPPORT)=0A= + cmd_queue_num =3D IWN_PAN_CMD_QUEUE;=0A= + else=0A= + cmd_queue_num =3D IWN_CMD_QUEUE_NUM;=0A= +=0A= + if ((desc->qid & IWN_RX_DESC_QID_MSK) !=3D cmd_queue_num)=0A= return; /* Not a command ack. */=0A= =0A= + ring =3D &sc->txq[cmd_queue_num];=0A= data =3D &ring->data[desc->idx];=0A= =0A= /* If the command was mapped in an mbuf, free it. */=0A= @@ -3154,7 +3161,7 @@=0A= desc->type, iwn_intr_str(desc->type),=0A= le16toh(desc->len));=0A= =0A= - if (!(desc->qid & 0x80)) /* Reply to a command. */=0A= + if (!(desc->qid & IWN_UNSOLICITED_RX_NOTIF)) /* Reply to a command. */=0A= iwn_cmd_done(sc, desc);=0A= =0A= switch (desc->type) {=0A= @@ -3187,7 +3194,10 @@=0A= {=0A= struct iwn_beacon_missed *miss =3D=0A= (struct iwn_beacon_missed *)(desc + 1);=0A= - int misses;=0A= + struct ieee80211vap *vap0 =3D sc->ivap[IWN_RXON_BSS_CTX];=0A= + struct ieee80211vap *vap1 =3D sc->ivap[IWN_RXON_PAN_CTX];=0A= + int misses,iv_bmissthreshold;=0A= + int DoReinit =3D0 ;=0A= =0A= bus_dmamap_sync(sc->rxq.data_dmat, data->map,=0A= BUS_DMASYNC_POSTREAD);=0A= @@ -3194,17 +3204,31 @@=0A= misses =3D le32toh(miss->consecutive);=0A= =0A= DPRINTF(sc, IWN_DEBUG_STATE,=0A= - "%s: beacons missed %d/%d\n", __func__,=0A= - misses, le32toh(miss->total));=0A= + "%s: beacons missed %d/%d rcv %d expect %d\n", __func__,=0A= + misses, le32toh(miss->total), le32toh(miss->received),=0A= + le32toh(miss->expected));=0A= +=0A= + iv_bmissthreshold =3D vap0->iv_bmissthreshold;=0A= +=0A= + if(sc->ctx =3D=3D IWN_RXON_PAN_CTX) {=0A= + iv_bmissthreshold =3D vap1->iv_bmissthreshold;=0A= + if (vap0->iv_state =3D=3D IEEE80211_S_RUN &&=0A= + vap1->iv_state =3D=3D IEEE80211_S_RUN &&=0A= + (ic->ic_flags & IEEE80211_F_SCAN) =3D=3D 0)=0A= + DoReinit =3D 1;=0A= + }=0A= + else if (vap0->iv_state =3D=3D IEEE80211_S_RUN &&=0A= + (ic->ic_flags & IEEE80211_F_SCAN) =3D=3D 0)=0A= + DoReinit =3D 1;=0A= +=0A= /*=0A= * If more than 5 consecutive beacons are missed,=0A= * reinitialize the sensitivity state machine.=0A= */=0A= - if (vap->iv_state =3D=3D IEEE80211_S_RUN &&=0A= - (ic->ic_flags & IEEE80211_F_SCAN) =3D=3D 0) {=0A= + if (DoReinit=3D=3D1) {=0A= if (misses > 5)=0A= (void)iwn_init_sensitivity(sc);=0A= - if (misses >=3D vap->iv_bmissthreshold) {=0A= + if (misses >=3D iv_bmissthreshold) {=0A= IWN_UNLOCK(sc);=0A= ieee80211_beacon_miss(ic);=0A= IWN_LOCK(sc);=0A= @@ -3568,6 +3592,7 @@=0A= const struct ieee80211_txparam *tp;=0A= struct ieee80211vap *vap =3D ni->ni_vap;=0A= struct ieee80211com *ic =3D ni->ni_ic;=0A= + struct iwn_vap *ivp =3D IWN_VAP(vap);=0A= struct iwn_node *wn =3D (void *)ni;=0A= struct iwn_tx_ring *ring;=0A= struct iwn_tx_desc *desc;=0A= @@ -3600,21 +3625,23 @@=0A= qos =3D 0;=0A= tid =3D 0;=0A= }=0A= - ac =3D M_WME_GETAC(m);=0A= - if (m->m_flags & M_AMPDU_MPDU) {=0A= +=0A= + if(ivp->ctx =3D=3D IWN_RXON_PAN_CTX)=0A= + ac =3D iwn_pan_ac_to_queue[M_WME_GETAC(m)];=0A= + else=0A= + ac =3D iwn_bss_ac_to_queue[M_WME_GETAC(m)];=0A= +=0A= + if (IEEE80211_QOS_HAS_SEQ(wh) &&=0A= + IEEE80211_AMPDU_RUNNING(&ni->ni_tx_ampdu[ac])) {=0A= struct ieee80211_tx_ampdu *tap =3D &ni->ni_tx_ampdu[ac];=0A= =0A= - if (!IEEE80211_AMPDU_RUNNING(tap)) {=0A= - m_freem(m);=0A= - return EINVAL;=0A= - }=0A= -=0A= - ac =3D *(int *)tap->txa_private;=0A= + ring =3D &sc->txq[*(int *)tap->txa_private];=0A= *(uint16_t *)wh->i_seq =3D=0A= htole16(ni->ni_txseqs[tid] << IEEE80211_SEQ_SEQ_SHIFT);=0A= ni->ni_txseqs[tid]++;=0A= - }=0A= - ring =3D &sc->txq[ac];=0A= + } else=0A= + ring =3D &sc->txq[ac];=0A= +=0A= desc =3D &ring->desc[ring->cur];=0A= data =3D &ring->data[ring->cur];=0A= =0A= @@ -3707,9 +3734,12 @@=0A= }=0A= =0A= if (IEEE80211_IS_MULTICAST(wh->i_addr1) ||=0A= - type !=3D IEEE80211_FC0_TYPE_DATA)=0A= - tx->id =3D sc->broadcast_id;=0A= - else=0A= + type !=3D IEEE80211_FC0_TYPE_DATA) {=0A= + if(ivp->ctx =3D=3D IWN_RXON_PAN_CTX)=0A= + tx->id =3D IWN_PAN_ID_BCAST;=0A= + else=0A= + tx->id =3D sc->broadcast_id;=0A= + } else=0A= tx->id =3D wn->id;=0A= =0A= if (type =3D=3D IEEE80211_FC0_TYPE_MGT) {=0A= @@ -3739,7 +3769,7 @@=0A= tx->data_ntries =3D 15;=0A= tx->lifetime =3D htole32(IWN_LIFETIME_INFINITE);=0A= tx->rate =3D iwn_rate_to_plcp(sc, ni, rate);=0A= - if (tx->id =3D=3D sc->broadcast_id) {=0A= + if ((tx->id =3D=3D IWN_PAN_ID_BCAST) || (tx->id =3D=3D = sc->broadcast_id)) {=0A= /* Group or management frame. */=0A= tx->linkq =3D 0;=0A= /* XXX Alternate between antenna A and B? */=0A= @@ -3856,7 +3886,7 @@=0A= u_int hdrlen;=0A= int ac, totlen, error, pad, nsegs =3D 0, i, rate;=0A= uint8_t ridx, type, txant;=0A= -=0A= + struct iwn_vap *ivp =3D IWN_VAP(vap);=0A= DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);=0A= =0A= IWN_LOCK_ASSERT(sc);=0A= @@ -3946,7 +3976,10 @@=0A= =0A= tx->len =3D htole16(totlen);=0A= tx->tid =3D 0;=0A= - tx->id =3D sc->broadcast_id;=0A= + if(ivp->ctx =3D=3D IWN_RXON_PAN_CTX)=0A= + tx->id =3D IWN_PAN_ID_BCAST;=0A= + else=0A= + tx->id =3D sc->broadcast_id;=0A= tx->rts_ntries =3D params->ibp_try1;=0A= tx->data_ntries =3D params->ibp_try0;=0A= tx->lifetime =3D htole32(IWN_LIFETIME_INFINITE);=0A= @@ -4204,16 +4237,16 @@=0A= /*=0A= * Send a command to the firmware.=0A= */=0A= -static int=0A= +int=0A= iwn_cmd(struct iwn_softc *sc, int code, const void *buf, int size, int = async)=0A= {=0A= - struct iwn_tx_ring *ring =3D &sc->txq[4];=0A= + struct iwn_tx_ring *ring ;=0A= struct iwn_tx_desc *desc;=0A= struct iwn_tx_data *data;=0A= struct iwn_tx_cmd *cmd;=0A= struct mbuf *m;=0A= bus_addr_t paddr;=0A= - int totlen, error;=0A= + int totlen, error,cmd_queue_num;=0A= =0A= DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);=0A= =0A= @@ -4220,6 +4253,12 @@=0A= if (async =3D=3D 0)=0A= IWN_LOCK_ASSERT(sc);=0A= =0A= + if(sc->sc_flags & IWN_FLAG_PAN_SUPPORT)=0A= + cmd_queue_num =3D IWN_PAN_CMD_QUEUE;=0A= + else=0A= + cmd_queue_num =3D IWN_CMD_QUEUE_NUM;=0A= +=0A= + ring =3D &sc->txq[cmd_queue_num];=0A= desc =3D &ring->desc[ring->cur];=0A= data =3D &ring->data[ring->cur];=0A= totlen =3D 4 + size;=0A= @@ -5546,6 +5585,8 @@=0A= struct ieee80211com *ic =3D ifp->if_l2com;=0A= struct ieee80211_scan_state *ss =3D ic->ic_scan; /*XXX*/=0A= struct ieee80211_node *ni =3D ss->ss_vap->iv_bss;=0A= + struct ieee80211vap *vap =3D ni->ni_vap;=0A= + struct iwn_vap *ivp =3D IWN_VAP(vap);=0A= struct iwn_scan_hdr *hdr;=0A= struct iwn_cmd_data *tx;=0A= struct iwn_scan_essid *essid;=0A= @@ -5560,7 +5601,11 @@=0A= =0A= DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);=0A= =0A= - sc->rxon =3D &sc->rx_on[IWN_RXON_BSS_CTX];=0A= + if(ivp->ctx =3D=3D IWN_RXON_BSS_CTX)=0A= + sc->rxon =3D &sc->rx_on[IWN_RXON_BSS_CTX];=0A= + else if(ivp->ctx =3D=3D IWN_RXON_PAN_CTX)=0A= + sc->rxon =3D &sc->rx_on[IWN_RXON_PAN_CTX];=0A= +=0A= buf =3D malloc(IWN_SCAN_MAXSZ, M_DEVBUF, M_NOWAIT | M_ZERO);=0A= if (buf =3D=3D NULL) {=0A= device_printf(sc->sc_dev,=0A= @@ -5592,7 +5637,11 @@=0A= =0A= tx =3D (struct iwn_cmd_data *)(hdr + 1);=0A= tx->flags =3D htole32(IWN_TX_AUTO_SEQ);=0A= - tx->id =3D sc->broadcast_id;=0A= + if(ivp->ctx =3D=3D IWN_RXON_PAN_CTX)=0A= + tx->id =3D IWN_PAN_ID_BCAST;=0A= + else=0A= + tx->id =3D sc->broadcast_id;=0A= +=0A= tx->lifetime =3D htole32(IWN_LIFETIME_INFINITE);=0A= =0A= if (IEEE80211_IS_CHAN_5GHZ(ic->ic_curchan)) {=0A= @@ -5629,7 +5678,7 @@=0A= IEEE80211_FC0_SUBTYPE_PROBE_REQ;=0A= wh->i_fc[1] =3D IEEE80211_FC1_DIR_NODS;=0A= IEEE80211_ADDR_COPY(wh->i_addr1, ifp->if_broadcastaddr);=0A= - IEEE80211_ADDR_COPY(wh->i_addr2, IF_LLADDR(ifp));=0A= + IEEE80211_ADDR_COPY(wh->i_addr2, ivp->macaddr);=0A= IEEE80211_ADDR_COPY(wh->i_addr3, ifp->if_broadcastaddr);=0A= *(uint16_t *)&wh->i_dur[0] =3D 0; /* filled by HW */=0A= *(uint16_t *)&wh->i_seq[0] =3D 0; /* filled by HW */=0A= @@ -5781,6 +5830,15 @@=0A= DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);=0A= =0A= sc->rxon =3D &sc->rx_on[IWN_RXON_BSS_CTX];=0A= +=0A= + if(sc->ctx =3D=3D IWN_RXON_PAN_CTX) {=0A= + if ((error =3D iwn_set_pan_params(sc)) !=3D 0) {=0A= + device_printf(sc->sc_dev,=0A= + "%s: iwn_set_pan_params error %d\n", __func__, error);=0A= + return error;=0A= + }=0A= + }=0A= +=0A= if (ic->ic_opmode =3D=3D IEEE80211_M_MONITOR) {=0A= /* Link LED blinks while monitoring. */=0A= iwn_set_led(sc, IWN_LED_LINK, 5, 5);=0A= @@ -6420,7 +6478,11 @@=0A= IWN_SETBITS(sc, IWN_FH_TX_CHICKEN, IWN_FH_TX_CHICKEN_SCHED_RETRY);=0A= =0A= /* Enable chain mode for all queues, except command queue. */=0A= - iwn_prph_write(sc, IWN5000_SCHED_QCHAIN_SEL, 0xfffef);=0A= + if(sc->sc_flags & IWN_FLAG_PAN_SUPPORT)=0A= + iwn_prph_write(sc, IWN5000_SCHED_QCHAIN_SEL, 0xffdff);=0A= + else=0A= + iwn_prph_write(sc, IWN5000_SCHED_QCHAIN_SEL, 0xfffef);=0A= +=0A= iwn_prph_write(sc, IWN5000_SCHED_AGGR_SEL, 0);=0A= =0A= for (qid =3D 0; qid < IWN5000_NTXQUEUES; qid++) {=0A= @@ -6440,11 +6502,20 @@=0A= /* Identify TX FIFO rings (0-7). */=0A= iwn_prph_write(sc, IWN5000_SCHED_TXFACT, 0xff);=0A= =0A= - /* Mark TX rings (4 EDCA + cmd + 2 HCCA) as active. */=0A= - for (qid =3D 0; qid < 7; qid++) {=0A= - static uint8_t qid2fifo[] =3D { 3, 2, 1, 0, 7, 5, 6 };=0A= - iwn_prph_write(sc, IWN5000_SCHED_QUEUE_STATUS(qid),=0A= - IWN5000_TXQ_STATUS_ACTIVE | qid2fifo[qid]);=0A= + if(sc->sc_flags & IWN_FLAG_PAN_SUPPORT) {=0A= + /* Mark TX rings as active. */=0A= + for (qid =3D 0; qid < 11; qid++) {=0A= + static uint8_t qid2fifo[] =3D { 3, 2, 1, 0, 0, 4, 2, 5, 4, 7, 5 };=0A= + iwn_prph_write(sc, IWN5000_SCHED_QUEUE_STATUS(qid),=0A= + IWN5000_TXQ_STATUS_ACTIVE | qid2fifo[qid]);=0A= + }=0A= + } else {=0A= + /* Mark TX rings (4 EDCA + cmd + 2 HCCA) as active. */=0A= + for (qid =3D 0; qid < 7; qid++) {=0A= + static uint8_t qid2fifo[] =3D { 3, 2, 1, 0, 7, 5, 6 };=0A= + iwn_prph_write(sc, IWN5000_SCHED_QUEUE_STATUS(qid),=0A= + IWN5000_TXQ_STATUS_ACTIVE | qid2fifo[qid]);=0A= + }=0A= }=0A= iwn_nic_unlock(sc);=0A= =0A= Index: sys/dev/iwn/if_iwn_pan.c=0A= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=0A= --- sys/dev/iwn/if_iwn_pan.c (revision 0)=0A= +++ sys/dev/iwn/if_iwn_pan.c (working copy)=0A= @@ -0,0 +1,566 @@=0A= +/*-=0A= + * Copyright (c) 2013 Cedric GROSS =0A= + * Copyright (c) 2011 Intel Corporation=0A= + * Copyright (c) 2007-2009=0A= + * Damien Bergamini =0A= + * Copyright (c) 2008=0A= + * Benjamin Close =0A= + * Copyright (c) 2008 Sam Leffler, Errno Consulting=0A= + *=0A= + * Permission to use, copy, modify, and distribute this software for any=0A= + * purpose with or without fee is hereby granted, provided that the = above=0A= + * copyright notice and this permission notice appear in all copies.=0A= + *=0A= + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL = WARRANTIES=0A= + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF=0A= + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE = FOR=0A= + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY = DAMAGES=0A= + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN=0A= + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT = OF=0A= + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.=0A= + */=0A= +=0A= +#include =0A= +__FBSDID("$FreeBSD$");=0A= +=0A= +/*=0A= + * Driver for Intel WiFi Link 4965 and 1000/2000/5000/6000 Series 802.11=0A= + * network adapters.=0A= + */=0A= +=0A= +#include "opt_wlan.h"=0A= +#include "opt_iwn.h"=0A= +=0A= +#include =0A= +#include =0A= +#include =0A= +#include =0A= +#include =0A= +=0A= +#include =0A= +=0A= +#include =0A= +#include =0A= +#include =0A= +=0A= +#include =0A= +=0A= +#include =0A= +#include =0A= +=0A= +#include =0A= +=0A= +static int iwn_auth_pan(struct iwn_softc *, struct ieee80211vap *);=0A= +static int iwn_set_timing_pan(struct iwn_softc *);=0A= +static int iwn_run_pan(struct iwn_softc *, struct ieee80211vap *);=0A= +static int iwn_config_pan(struct iwn_softc *);=0A= +static int iwn_updateedca_pan(struct ieee80211com *);=0A= +static int iwn_add_broadcast_node_pan(struct iwn_softc *, int);=0A= +=0A= +int=0A= +iwn_newstate_pan(struct ieee80211vap *vap, enum ieee80211_state nstate,=0A= + int arg)=0A= +{=0A= + struct iwn_vap *ivp =3D IWN_VAP(vap);=0A= + struct ieee80211com *ic =3D vap->iv_ic;=0A= + struct iwn_softc *sc =3D ic->ic_ifp->if_softc;=0A= +=0A= + int error =3D 0;=0A= +=0A= + DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);=0A= +=0A= + DPRINTF(sc, IWN_DEBUG_STATE, "%s: %s -> %s\n", __func__,=0A= + ieee80211_state_name[vap->iv_state], ieee80211_state_name[nstate]);=0A= +=0A= + IEEE80211_UNLOCK(ic);=0A= + IWN_LOCK(sc);=0A= + callout_stop(&sc->calib_to);=0A= +=0A= + sc->rxon =3D &sc->rx_on[IWN_RXON_PAN_CTX];=0A= +=0A= + switch (nstate) {=0A= + case IEEE80211_S_ASSOC:=0A= + if (vap->iv_state !=3D IEEE80211_S_RUN)=0A= + break;=0A= + /* FALLTHROUGH */=0A= + case IEEE80211_S_AUTH:=0A= + if (vap->iv_state =3D=3D IEEE80211_S_AUTH)=0A= + break;=0A= +=0A= + /*=0A= + * !AUTH -> AUTH transition requires state reset to handle=0A= + * reassociations correctly.=0A= + */=0A= + sc->rxon->associd =3D 0;=0A= + sc->rxon->filter &=3D ~htole32(IWN_FILTER_BSS);=0A= + sc->calib.state =3D IWN_CALIB_STATE_INIT;=0A= +=0A= + if ((error =3D iwn_auth_pan(sc, vap)) !=3D 0) {=0A= + device_printf(sc->sc_dev,=0A= + "%s: could not move to auth state\n", __func__);=0A= + }=0A= + break;=0A= +=0A= + case IEEE80211_S_SCAN:=0A= +=0A= + if ((error =3D iwn_set_timing_pan(sc)) !=3D 0) {=0A= + device_printf(sc->sc_dev,=0A= + "%s: iwn_set_timing_pan error %d\n", __func__, error);=0A= + return error;=0A= + }=0A= +=0A= + break;=0A= +=0A= + case IEEE80211_S_RUN:=0A= +=0A= + /*=0A= + * RUN -> RUN transition; Just restart the timers.=0A= + */=0A= + if (vap->iv_state =3D=3D IEEE80211_S_RUN) {=0A= + sc->calib_cnt =3D 0;=0A= + break;=0A= + }=0A= +=0A= + /*=0A= + * !RUN -> RUN requires setting the association id=0A= + * which is done with a firmware cmd. We also defer=0A= + * starting the timers until that work is done.=0A= + */=0A= + if ((error =3D iwn_run_pan(sc, vap)) !=3D 0) {=0A= + device_printf(sc->sc_dev,=0A= + "%s: could not move to run state\n", __func__);=0A= + }=0A= + break;=0A= +=0A= + case IEEE80211_S_INIT:=0A= + sc->calib.state =3D IWN_CALIB_STATE_INIT;=0A= + break;=0A= +=0A= + default:=0A= + break;=0A= + }=0A= + IWN_UNLOCK(sc);=0A= + IEEE80211_LOCK(ic);=0A= + if (error !=3D 0) {=0A= + DPRINTF(sc, IWN_DEBUG_TRACE, "->%s end in error\n", __func__);=0A= + return error;=0A= + }=0A= + DPRINTF(sc, IWN_DEBUG_TRACE, "->%s end\n", __func__);=0A= + return ivp->iv_newstate(vap, nstate, arg);=0A= +}=0A= +=0A= +static int=0A= +iwn_auth_pan(struct iwn_softc *sc, struct ieee80211vap *vap)=0A= +{=0A= + struct iwn_ops *ops =3D &sc->ops;=0A= + struct ifnet *ifp =3D sc->sc_ifp;=0A= + struct ieee80211com *ic =3D ifp->if_l2com;=0A= + struct ieee80211_node *ni =3D vap->iv_bss;=0A= + int error;=0A= + struct iwn_vap *ivp =3D IWN_VAP(vap);=0A= +=0A= + DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);=0A= +=0A= + sc->rxon =3D &sc->rx_on[IWN_RXON_PAN_CTX];=0A= + IEEE80211_ADDR_COPY(sc->rxon->myaddr, ivp->macaddr);=0A= + IEEE80211_ADDR_COPY(sc->rxon->wlap, IF_LLADDR(ifp));=0A= + /* Update adapter configuration. */=0A= + IEEE80211_ADDR_COPY(sc->rxon->bssid, ni->ni_bssid);=0A= + sc->rxon->chan =3D ieee80211_chan2ieee(ic, ni->ni_chan);=0A= + sc->rxon->flags =3D htole32(IWN_RXON_TSF | IWN_RXON_CTS_TO_SELF);=0A= + if (IEEE80211_IS_CHAN_2GHZ(ni->ni_chan))=0A= + sc->rxon->flags |=3D htole32(IWN_RXON_AUTO | IWN_RXON_24GHZ);=0A= + if (ic->ic_flags & IEEE80211_F_SHSLOT)=0A= + sc->rxon->flags |=3D htole32(IWN_RXON_SHSLOT);=0A= + if (ic->ic_flags & IEEE80211_F_SHPREAMBLE)=0A= + sc->rxon->flags |=3D htole32(IWN_RXON_SHPREAMBLE);=0A= + if (IEEE80211_IS_CHAN_A(ni->ni_chan)) {=0A= + sc->rxon->cck_mask =3D 0;=0A= + sc->rxon->ofdm_mask =3D 0x15;=0A= + } else if (IEEE80211_IS_CHAN_B(ni->ni_chan)) {=0A= + sc->rxon->cck_mask =3D 0x03;=0A= + sc->rxon->ofdm_mask =3D 0;=0A= + } else {=0A= + /* Assume 802.11b/g. */=0A= + sc->rxon->cck_mask =3D 0x0f;=0A= + sc->rxon->ofdm_mask =3D 0x15;=0A= + }=0A= + DPRINTF(sc, IWN_DEBUG_STATE, "rxon chan %d flags %x cck %x ofdm %x\n",=0A= + sc->rxon->chan, sc->rxon->flags, sc->rxon->cck_mask,=0A= + sc->rxon->ofdm_mask);=0A= + sc->rxon->mode =3D IWN_MODE_2STA;=0A= + error =3D iwn_cmd(sc, IWN_CMD_WIPAN_RXON, sc->rxon, sc->rxonsz, 0);=0A= + if (error !=3D 0) {=0A= + device_printf(sc->sc_dev, "%s: RXON command failed, error %d\n",=0A= + __func__, error);=0A= + return error;=0A= + }=0A= +=0A= + /* Configuration has changed, set TX power accordingly. */=0A= + if ((error =3D ops->set_txpower(sc, ni->ni_chan, 1)) !=3D 0) {=0A= + device_printf(sc->sc_dev,=0A= + "%s: could not set TX power, error %d\n", __func__, error);=0A= + return error;=0A= + }=0A= + /*=0A= + * Reconfiguring RXON clears the firmware nodes table so we must=0A= + * add the broadcast node again.=0A= + */=0A= + if ((error =3D iwn_add_broadcast_node_pan(sc, 0)) !=3D 0) {=0A= + device_printf(sc->sc_dev,=0A= + "%s: could not add broadcast node, error %d\n", __func__,=0A= + error);=0A= + return error;=0A= + }=0A= + DPRINTF(sc, IWN_DEBUG_TRACE, "->%s end\n", __func__);=0A= +=0A= + return 0;=0A= +}=0A= +=0A= +static int=0A= +iwn_set_timing_pan(struct iwn_softc *sc)=0A= +{=0A= + struct iwn_cmd_timing cmd;=0A= + int error =3D 0;=0A= + struct ieee80211vap *vap;=0A= + struct iwn_vap *ivp;=0A= +=0A= + DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);=0A= +=0A= + vap =3D sc->ivap[IWN_RXON_PAN_CTX];=0A= + ivp =3D IWN_VAP(vap);=0A= +=0A= + if ((error =3D iwn_config_pan(sc)) !=3D 0) {=0A= + device_printf(sc->sc_dev,=0A= + "%s: iwn_config1 error %d\n", __func__, error);=0A= + return error;=0A= + }=0A= +=0A= + if ((error =3D iwn_set_pan_params(sc)) !=3D 0) {=0A= + device_printf(sc->sc_dev,=0A= + "%s: iwn_set_pan_params error %d\n", __func__, error);=0A= + return error;=0A= + }=0A= +=0A= + memset(&cmd, 0, sizeof cmd);=0A= + cmd.lintval =3D htole16(10);=0A= + cmd.bintval =3D htole16(IWN_BEACON_INTERVAL_DEFAULT);=0A= + ivp->beacon_int =3D cmd.bintval;=0A= + cmd.binitval =3D htole32(0x032000);=0A= + cmd.dtim_period =3D 1;=0A= +=0A= + DPRINTF(sc, IWN_DEBUG_TRACE, "->%s end\n", __func__);=0A= +=0A= + return iwn_cmd(sc, IWN_CMD_WIPAN_RXON_TIMING, &cmd, sizeof cmd, 0);=0A= +}=0A= +static int=0A= +iwn_run_pan(struct iwn_softc *sc, struct ieee80211vap *vap)=0A= +{=0A= + struct iwn_ops *ops =3D &sc->ops;=0A= + struct ifnet *ifp =3D sc->sc_ifp;=0A= + struct ieee80211com *ic =3D ifp->if_l2com;=0A= + struct ieee80211_node *ni =3D vap->iv_bss;=0A= + struct iwn_vap *ivp =3D IWN_VAP(vap);=0A= + struct iwn_node_info node;=0A= + uint32_t htflags =3D 0;=0A= + int error;=0A= +=0A= + DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);=0A= +=0A= + if (ic->ic_opmode =3D=3D IEEE80211_M_MONITOR) {=0A= + /* Link LED blinks while monitoring. */=0A= + return 0;=0A= + }=0A= +=0A= + if ((error =3D iwn_set_timing_pan(sc)) !=3D 0) {=0A= + device_printf(sc->sc_dev,=0A= + "%s: could not set timing, error %d\n", __func__, error);=0A= + }=0A= +=0A= + if ((error =3D iwn_updateedca_pan(ic)) !=3D 0) {=0A= + device_printf(sc->sc_dev,=0A= + "%s: iwn_updateedca_pan, error %d\n", __func__, error);=0A= + return error;=0A= + }=0A= +=0A= + sc->rxon =3D &sc->rx_on[IWN_RXON_PAN_CTX];=0A= + IEEE80211_ADDR_COPY(sc->rxon->myaddr, ivp->macaddr);=0A= + IEEE80211_ADDR_COPY(sc->rxon->wlap, IF_LLADDR(ifp));=0A= + /* Update adapter configuration. */=0A= + IEEE80211_ADDR_COPY(sc->rxon->bssid, ni->ni_bssid);=0A= + sc->rxon->associd =3D htole16(IEEE80211_AID(ni->ni_associd));=0A= + sc->rxon->chan =3D ieee80211_chan2ieee(ic, ni->ni_chan);=0A= + sc->rxon->flags =3D htole32(IWN_RXON_TSF | IWN_RXON_CTS_TO_SELF);=0A= + if (IEEE80211_IS_CHAN_2GHZ(ni->ni_chan))=0A= + sc->rxon->flags |=3D htole32(IWN_RXON_AUTO | IWN_RXON_24GHZ);=0A= + if (ic->ic_flags & IEEE80211_F_SHSLOT)=0A= + sc->rxon->flags |=3D htole32(IWN_RXON_SHSLOT);=0A= + if (ic->ic_flags & IEEE80211_F_SHPREAMBLE)=0A= + sc->rxon->flags |=3D htole32(IWN_RXON_SHPREAMBLE);=0A= + if (IEEE80211_IS_CHAN_A(ni->ni_chan)) {=0A= + sc->rxon->cck_mask =3D 0;=0A= + sc->rxon->ofdm_mask =3D 0x15;=0A= + } else if (IEEE80211_IS_CHAN_B(ni->ni_chan)) {=0A= + sc->rxon->cck_mask =3D 0x03;=0A= + sc->rxon->ofdm_mask =3D 0;=0A= + } else {=0A= + /* Assume 802.11b/g. */=0A= + sc->rxon->cck_mask =3D 0x0f;=0A= + sc->rxon->ofdm_mask =3D 0x15;=0A= + }=0A= + if (IEEE80211_IS_CHAN_HT(ni->ni_chan)) {=0A= + htflags |=3D IWN_RXON_HT_PROTMODE(ic->ic_curhtprotmode);=0A= + if (IEEE80211_IS_CHAN_HT40(ni->ni_chan)) {=0A= + switch (ic->ic_curhtprotmode) {=0A= + case IEEE80211_HTINFO_OPMODE_HT20PR:=0A= + htflags |=3D IWN_RXON_HT_MODEPURE40;=0A= + break;=0A= + default:=0A= + htflags |=3D IWN_RXON_HT_MODEMIXED;=0A= + break;=0A= + }=0A= + }=0A= + if (IEEE80211_IS_CHAN_HT40D(ni->ni_chan))=0A= + htflags |=3D IWN_RXON_HT_HT40MINUS;=0A= + }=0A= + sc->rxon->flags |=3D htole32(htflags);=0A= + sc->rxon->filter |=3D htole32(IWN_FILTER_BSS);=0A= + DPRINTF(sc, IWN_DEBUG_STATE, "rxon chan %d flags %x\n",=0A= + sc->rxon->chan, sc->rxon->flags);=0A= + sc->rxon->mode =3D IWN_MODE_2STA;=0A= + error =3D iwn_cmd(sc, IWN_CMD_WIPAN_RXON, sc->rxon, sc->rxonsz, 0);=0A= + if (error !=3D 0) {=0A= + device_printf(sc->sc_dev,=0A= + "%s: could not update configuration, error %d\n", __func__,=0A= + error);=0A= + return error;=0A= + }=0A= +=0A= + /* Configuration has changed, set TX power accordingly. */=0A= + if ((error =3D ops->set_txpower(sc, ni->ni_chan, 1)) !=3D 0) {=0A= + device_printf(sc->sc_dev,=0A= + "%s: could not set TX power, error %d\n", __func__, error);=0A= + return error;=0A= + }=0A= +=0A= + /* Fake a join to initialize the TX rate. */=0A= + ((struct iwn_node *)ni)->id =3D IWN_STA_ID;=0A= + iwn_newassoc(ni, 1);=0A= +=0A= + /* Add BSS node. */=0A= + memset(&node, 0, sizeof node);=0A= + node.htflags |=3D htole32(IWN_STA_FLAG_PAN_STATION);=0A= + IEEE80211_ADDR_COPY(node.macaddr, ni->ni_macaddr);=0A= + node.id =3D IWN_STA_ID;=0A= + if (IEEE80211_IS_CHAN_HT(ni->ni_chan)) {=0A= + switch (ni->ni_htcap & IEEE80211_HTCAP_SMPS) {=0A= + case IEEE80211_HTCAP_SMPS_ENA:=0A= + node.htflags |=3D htole32(IWN_SMPS_MIMO_DIS);=0A= + break;=0A= + case IEEE80211_HTCAP_SMPS_DYNAMIC:=0A= + node.htflags |=3D htole32(IWN_SMPS_MIMO_PROT);=0A= + break;=0A= + }=0A= + node.htflags |=3D htole32(IWN_AMDPU_SIZE_FACTOR(3) |=0A= + IWN_AMDPU_DENSITY(5)); /* 4us */=0A= + if (IEEE80211_IS_CHAN_HT40(ni->ni_chan))=0A= + node.htflags |=3D htole32(IWN_NODE_HT40);=0A= + }=0A= + DPRINTF(sc, IWN_DEBUG_STATE, "%s: adding BSS node1\n", __func__);=0A= + error =3D ops->add_node(sc, &node, 0);=0A= + if (error !=3D 0) {=0A= + device_printf(sc->sc_dev,=0A= + "%s: could not add BSS node1, error %d\n", __func__, error);=0A= + return error;=0A= + }=0A= +=0A= + /* Setting the initial rate for node */=0A= + ni->ni_txrate =3D ni->ni_rates.rs_rates[0];=0A= +=0A= + /* XXX: init rate scaling */=0A= +=0A= + DPRINTF(sc, IWN_DEBUG_TRACE, "->%s end\n", __func__);=0A= +=0A= +#ifdef IWN_DTIM_INDICATES_UNICAST_PENDING_AT_AP=0A= + return iwn_set_pslevel(sc, IWN_POWERSAVE_DTIM_VOIP_COMPATIBLE,=0A= + sc->desired_pwrsave_level, 0);=0A= +#else=0A= + return 0;=0A= +#endif=0A= +=0A= +}=0A= +=0A= +static int=0A= +iwn_config_pan(struct iwn_softc *sc)=0A= +{=0A= + struct ifnet *ifp =3D sc->sc_ifp;=0A= + struct ieee80211com *ic =3D ifp->if_l2com;=0A= + struct ieee80211vap *vap =3D sc->ivap[IWN_RXON_PAN_CTX];=0A= + struct iwn_vap *ivp =3D IWN_VAP(vap);=0A= + uint16_t rxchain;=0A= + int error;=0A= +=0A= + DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);=0A= +=0A= + sc->rxon =3D &sc->rx_on[IWN_RXON_PAN_CTX];=0A= + IEEE80211_ADDR_COPY(sc->rxon->myaddr, ivp->macaddr);=0A= + IEEE80211_ADDR_COPY(sc->rxon->wlap, IF_LLADDR(ifp));=0A= + sc->rxon->chan =3D ieee80211_chan2ieee(ic, ic->ic_curchan);=0A= + sc->rxon->flags =3D htole32(IWN_RXON_TSF);=0A= + if (IEEE80211_IS_CHAN_2GHZ(ic->ic_curchan))=0A= + sc->rxon->flags |=3D htole32(IWN_RXON_AUTO | IWN_RXON_24GHZ);=0A= + sc->rxon->mode =3D IWN_MODE_P2P;=0A= + sc->rxon->filter =3D htole32(IWN_FILTER_MULTICAST);=0A= + sc->rxon->cck_mask =3D 0x0f; /* not yet negotiated */=0A= + sc->rxon->ofdm_mask =3D 0xff; /* not yet negotiated */=0A= + sc->rxon->ht_single_mask =3D 0xff;=0A= + sc->rxon->ht_dual_mask =3D 0xff;=0A= + sc->rxon->ht_triple_mask =3D 0xff;=0A= + rxchain =3D=0A= + IWN_RXCHAIN_VALID(sc->rxchainmask) |=0A= + IWN_RXCHAIN_MIMO_COUNT(2) |=0A= + IWN_RXCHAIN_IDLE_COUNT(2);=0A= + sc->rxon->rxchain =3D htole16(rxchain);=0A= + sc->rxon->associd =3D 0;=0A= + sc->rxon->filter &=3D ~htole32(IWN_FILTER_BSS);=0A= +=0A= + error =3D iwn_cmd(sc, IWN_CMD_WIPAN_RXON, sc->rxon, sc->rxonsz, 0);=0A= + if (error !=3D 0) {=0A= + device_printf(sc->sc_dev, "%s: IWN_CMD_WIPAN_RXON command failed\n",=0A= + __func__);=0A= + return error;=0A= + }=0A= + DPRINTF(sc, IWN_DEBUG_TRACE, "->%s end\n", __func__);=0A= +=0A= + return 0;=0A= +}=0A= +=0A= +int=0A= +iwn_set_pan_params(struct iwn_softc *sc)=0A= +{=0A= + struct iwn_pan_params_cmd cmd;=0A= + int slot0 =3D 300, slot1 =3D 0;=0A= + int bcnint;=0A= + int error =3D 0;=0A= +=0A= + DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);=0A= +=0A= + /*=0A= + * If the PAN context is inactive, then we don't need=0A= + * to update the PAN parameters=0A= + */=0A= + if (sc->ctx !=3D IWN_RXON_PAN_CTX) {=0A= + DPRINTF(sc, IWN_DEBUG_TRACE, "->%s end with no need to do that\n",=0A= + __func__);=0A= + return 0;=0A= + }=0A= +=0A= + memset(&cmd, 0, sizeof(cmd));=0A= +=0A= + /* only 2 slots are currently allowed */=0A= + cmd.num_slots =3D 2;=0A= +=0A= + cmd.slots[0].type =3D IWN_RXON_BSS_CTX; /* BSS */=0A= + cmd.slots[1].type =3D IWN_RXON_PAN_CTX; /* PAN */=0A= +=0A= + cmd.flags |=3D htole16(IWN_PAN_PARAMS_FLG_SLOTTED_MODE);=0A= + bcnint =3D IWN_BEACON_INTERVAL_DEFAULT;=0A= + slot0 =3D (bcnint >> 1);=0A= + slot1 =3D (bcnint - slot0);=0A= +=0A= + if(sc->uc_scan_progress =3D=3D 1) {=0A= + slot0 =3D bcnint * 3 - IWN_SLOT_TIME_MIN;=0A= + slot1 =3D IWN_SLOT_TIME_MIN;=0A= + }=0A= + cmd.slots[0].time =3D htole16(slot0);=0A= + cmd.slots[1].time =3D htole16(slot1);=0A= +=0A= + error =3D iwn_cmd(sc, IWN_CMD_WIPAN_PARAMS, &cmd, sizeof(cmd), 0);=0A= + if (error !=3D 0) {=0A= + device_printf(sc->sc_dev,=0A= + "%s: IWN_CMD_WIPAN_PARAMS command failed, error %d\n",=0A= + __func__, error);=0A= + return error;=0A= + }=0A= +=0A= + DPRINTF(sc, IWN_DEBUG_TRACE, "->%s end\n", __func__);=0A= +=0A= + return 0;=0A= +}=0A= +=0A= +static int=0A= +iwn_updateedca_pan(struct ieee80211com *ic)=0A= +{=0A= +#define IWN_EXP2(x) ((1 << (x)) - 1) /* CWmin =3D 2^ECWmin - 1 */=0A= + struct iwn_softc *sc =3D ic->ic_ifp->if_softc;=0A= + struct iwn_edca_params cmd;=0A= + int aci;=0A= +=0A= + memset(&cmd, 0, sizeof cmd);=0A= + cmd.flags =3D htole32(IWN_EDCA_UPDATE);=0A= + for (aci =3D 0; aci < WME_NUM_AC; aci++) {=0A= + const struct wmeParams *ac =3D=0A= + &ic->ic_wme.wme_chanParams.cap_wmeParams[aci];=0A= + cmd.ac[aci].aifsn =3D ac->wmep_aifsn;=0A= + cmd.ac[aci].cwmin =3D htole16(IWN_EXP2(ac->wmep_logcwmin));=0A= + cmd.ac[aci].cwmax =3D htole16(IWN_EXP2(ac->wmep_logcwmax));=0A= + cmd.ac[aci].txoplimit =3D=0A= + htole16(IEEE80211_TXOP_TO_US(ac->wmep_txopLimit));=0A= + }=0A= + return iwn_cmd(sc, IWN_CMD_WIPAN_QOS_PARAM, &cmd, sizeof cmd, 1);=0A= +#undef IWN_EXP2=0A= +}=0A= +=0A= +/*=0A= + * Broadcast node is used to send group-addressed and management frames.=0A= + */=0A= +static int=0A= +iwn_add_broadcast_node_pan(struct iwn_softc *sc, int async)=0A= +{=0A= + struct iwn_ops *ops =3D &sc->ops;=0A= + struct ifnet *ifp =3D sc->sc_ifp;=0A= + struct ieee80211com *ic =3D ifp->if_l2com;=0A= + struct iwn_node_info node;=0A= + struct iwn_cmd_link_quality linkq;=0A= + uint8_t txant;=0A= + int i, error;=0A= +=0A= + DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);=0A= +=0A= + sc->rxon =3D &sc->rx_on[IWN_RXON_PAN_CTX];=0A= +=0A= + memset(&node, 0, sizeof node);=0A= + IEEE80211_ADDR_COPY(node.macaddr, ifp->if_broadcastaddr);=0A= +=0A= + node.id =3D IWN_PAN_ID_BCAST;=0A= + node.htflags |=3D htole32(IWN_STA_FLAG_PAN_STATION);=0A= + DPRINTF(sc, IWN_DEBUG_RESET, "%s: adding broadcast node1\n", __func__);=0A= + if ((error =3D ops->add_node(sc, &node, async)) !=3D 0)=0A= + return error;=0A= +=0A= + /* Use the first valid TX antenna. */=0A= + txant =3D IWN_LSB(sc->txchainmask);=0A= +=0A= + memset(&linkq, 0, sizeof linkq);=0A= + linkq.id =3D IWN_PAN_ID_BCAST;=0A= + linkq.antmsk_1stream =3D txant;=0A= + linkq.antmsk_2stream =3D IWN_ANT_AB;=0A= + linkq.ampdu_max =3D 64;=0A= + linkq.ampdu_threshold =3D 3;=0A= + linkq.ampdu_limit =3D htole16(4000); /* 4ms */=0A= +=0A= + /* Use lowest mandatory bit-rate. */=0A= + if (IEEE80211_IS_CHAN_5GHZ(ic->ic_curchan))=0A= + linkq.retry[0] =3D htole32(0xd);=0A= + else=0A= + linkq.retry[0] =3D htole32(10 | IWN_RFLAG_CCK);=0A= + linkq.retry[0] |=3D htole32(IWN_RFLAG_ANT(txant));=0A= + /* Use same bit-rate for all TX retries. */=0A= + for (i =3D 1; i < IWN_MAX_TX_RETRIES; i++) {=0A= + linkq.retry[i] =3D linkq.retry[0];=0A= + }=0A= + DPRINTF(sc, IWN_DEBUG_TRACE, "->%s end\n", __func__);=0A= +=0A= + return iwn_cmd(sc, IWN_CMD_LINK_QUALITY, &linkq, sizeof linkq, async);=0A= +}=0A= +=0A= Index: sys/dev/iwn/if_iwn_pan.h=0A= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=0A= --- sys/dev/iwn/if_iwn_pan.h (revision 0)=0A= +++ sys/dev/iwn/if_iwn_pan.h (working copy)=0A= @@ -0,0 +1,34 @@=0A= +/*-=0A= + * Copyright (c) 2013 Cedric GROSS =0A= + *=0A= + * Permission to use, copy, modify, and distribute this software for any=0A= + * purpose with or without fee is hereby granted, provided that the = above=0A= + * copyright notice and this permission notice appear in all copies.=0A= + *=0A= + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL = WARRANTIES=0A= + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF=0A= + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE = FOR=0A= + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY = DAMAGES=0A= + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN=0A= + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT = OF=0A= + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.=0A= + *=0A= + * $FreeBSD$=0A= + */=0A= +=0A= +#ifndef __IF_IWN_PAN_H__=0A= +#define __IF_IWN_PAN_H__=0A= +/*=0A= + * ADD / MODIFY STATION Command (Op Code 18) - byte 76-18 -bit13=0A= + * STA_FLAG_PAN_STATION bit:=0A= + * This bit is set (1) for a station in PAN mode=0A= + */=0A= +#define IWN_STA_FLAG_PAN_STATION (1 << 13)=0A= +=0A= +#define IWN_BEACON_INTERVAL_DEFAULT 200=0A= +#define IWN_SLOT_TIME_MIN 20=0A= +=0A= +extern int iwn_newstate_pan(struct ieee80211vap *, enum = ieee80211_state, int);=0A= +extern int iwn_set_pan_params(struct iwn_softc *);=0A= +=0A= +#endif=0A= Index: sys/dev/iwn/if_iwnreg.h=0A= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=0A= --- sys/dev/iwn/if_iwnreg.h (revision 254271)=0A= +++ sys/dev/iwn/if_iwnreg.h (working copy)=0A= @@ -2052,3 +2052,36 @@=0A= #define IWN_BARRIER_READ_WRITE(sc) \=0A= bus_space_barrier((sc)->sc_st, (sc)->sc_sh, 0, (sc)->sc_sz, \=0A= BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE)=0A= +=0A= +#ifdef IWN_DEBUG=0A= +enum {=0A= + IWN_DEBUG_XMIT =3D 0x00000001, /* basic xmit operation */=0A= + IWN_DEBUG_RECV =3D 0x00000002, /* basic recv operation */=0A= + IWN_DEBUG_STATE =3D 0x00000004, /* 802.11 state transitions */=0A= + IWN_DEBUG_TXPOW =3D 0x00000008, /* tx power processing */=0A= + IWN_DEBUG_RESET =3D 0x00000010, /* reset processing */=0A= + IWN_DEBUG_OPS =3D 0x00000020, /* iwn_ops processing */=0A= + IWN_DEBUG_BEACON =3D 0x00000040, /* beacon handling */=0A= + IWN_DEBUG_WATCHDOG =3D 0x00000080, /* watchdog timeout */=0A= + IWN_DEBUG_INTR =3D 0x00000100, /* ISR */=0A= + IWN_DEBUG_CALIBRATE =3D 0x00000200, /* periodic calibration */=0A= + IWN_DEBUG_NODE =3D 0x00000400, /* node management */=0A= + IWN_DEBUG_LED =3D 0x00000800, /* led management */=0A= + IWN_DEBUG_CMD =3D 0x00001000, /* cmd submission */=0A= + IWN_DEBUG_TXRATE =3D 0x00002000, /* TX rate debugging */=0A= + IWN_DEBUG_PWRSAVE =3D 0x00004000, /* Power save operations */=0A= + IWN_DEBUG_REGISTER =3D 0x20000000, /* print chipset register */=0A= + IWN_DEBUG_TRACE =3D 0x40000000, /* Print begin and start driver = function */=0A= + IWN_DEBUG_FATAL =3D 0x80000000, /* fatal errors */=0A= + IWN_DEBUG_ANY =3D 0xffffffff=0A= +};=0A= +=0A= +#define DPRINTF(sc, m, fmt, ...) do { \=0A= + if (sc->sc_debug & (m)) \=0A= + printf(fmt, __VA_ARGS__); \=0A= +} while (0)=0A= +=0A= +#else=0A= +#define DPRINTF(sc, m, fmt, ...) do { (void) sc; } while (0)=0A= +#endif=0A= +=0A= Index: sys/dev/iwn/if_iwnvar.h=0A= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=0A= --- sys/dev/iwn/if_iwnvar.h (revision 254271)=0A= +++ sys/dev/iwn/if_iwnvar.h (working copy)=0A= @@ -391,6 +391,12 @@=0A= struct iwn_base_params *base_params;=0A= };=0A= =0A= +extern int iwn_cmd(struct iwn_softc *, int, const void *, int, int);=0A= +extern void iwn_newassoc(struct ieee80211_node *, int);=0A= +#ifdef IWN_DEBUG=0A= +extern const char *iwn_intr_str(uint8_t);=0A= +#endif=0A= +=0A= #define IWN_LOCK_INIT(_sc) \=0A= mtx_init(&(_sc)->sc_mtx, device_get_nameunit((_sc)->sc_dev), \=0A= MTX_NETWORK_LOCK, MTX_DEF)=0A= Index: sys/modules/iwn/Makefile=0A= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=0A= --- sys/modules/iwn/Makefile (revision 254271)=0A= +++ sys/modules/iwn/Makefile (working copy)=0A= @@ -3,6 +3,7 @@=0A= .PATH: ${.CURDIR}/../../dev/iwn=0A= =0A= KMOD =3D if_iwn=0A= -SRCS =3D if_iwn.c device_if.h bus_if.h pci_if.h opt_iwn.h opt_wlan.h=0A= +SRCS =3D if_iwn.c if_iwn_pan.c device_if.h bus_if.h pci_if.h=0A= +SRCS +=3D opt_iwn.h opt_wlan.h=0A= =0A= .include =0A= ------=_NextPart_000_000D_01CE9804.A3A05D10-- From owner-freebsd-wireless@FreeBSD.ORG Tue Aug 13 09:58:54 2013 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 24F3F65E for ; Tue, 13 Aug 2013 09:58:54 +0000 (UTC) (envelope-from adrian.chadd@gmail.com) Received: from mail-wg0-x234.google.com (mail-wg0-x234.google.com [IPv6:2a00:1450:400c:c00::234]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id AD7E9296D for ; Tue, 13 Aug 2013 09:58:53 +0000 (UTC) Received: by mail-wg0-f52.google.com with SMTP id b13so6464992wgh.7 for ; Tue, 13 Aug 2013 02:58:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:in-reply-to:references:date:message-id:subject :from:to:cc:content-type; bh=Kgf29iK/TqG3QgCJmR5nxyEPM/tWI8dCMtlIRU3XFt4=; b=IscjdhxxvB44t/ZpQUCNVGLsDyEdTYiFYNlF64ugX7ADBisvIVksaz6N53UhNzCzMK as/3Q+LFOK2JtqYY9rkSrBGmhTUvd0jwX9QE8Axmi0cEpMNLR/yT7BIQsv8XHgdjB3Pf hhcK5cMP0ikY0BgQPp+CT/8HRDerVz21R6enrv2UpzhvBLDUNwtNsHhyyRXoX6I1Pe2U HFB8O7NNTEWhjERNL+xxn78MkbOcmtfSqCgs0TuYWqelcf1bEdyBTqZUr7i67xCpzyGG rIEsc72+TxqxWJ2ozv5peDmUlWVj7KvtgC2blOmBbR3m32wzhY6zb0xsE+EDfFH7Ai3O vNGA== MIME-Version: 1.0 X-Received: by 10.180.8.42 with SMTP id o10mr256336wia.0.1376387932005; Tue, 13 Aug 2013 02:58:52 -0700 (PDT) Sender: adrian.chadd@gmail.com Received: by 10.217.116.136 with HTTP; Tue, 13 Aug 2013 02:58:51 -0700 (PDT) In-Reply-To: References: <201308111650.r7BGo1Qt048071@freefall.freebsd.org> <52099CF4.7050101@meroh.net> Date: Tue, 13 Aug 2013 02:58:51 -0700 X-Google-Sender-Auth: qGnVN27KSrj9nHKjbv4hkBgKz-8 Message-ID: Subject: Re: kern/181100: [bwi] Turning up bwi0 crashes / deadlocks the kernel From: Adrian Chadd To: Julio Merino Content-Type: text/plain; charset=ISO-8859-1 Cc: freebsd-wireless@freebsd.org X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.14 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, 13 Aug 2013 09:58:54 -0000 Hi! Please update to the latest -HEAD and try again. Thanks! -adrian From owner-freebsd-wireless@FreeBSD.ORG Tue Aug 13 10:00:01 2013 Return-Path: Delivered-To: freebsd-wireless@smarthost.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 95E1E6B4 for ; Tue, 13 Aug 2013 10:00:01 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [IPv6:2001:1900:2254:206c::16:87]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 696332983 for ; Tue, 13 Aug 2013 10:00:01 +0000 (UTC) Received: from freefall.freebsd.org (localhost [127.0.0.1]) by freefall.freebsd.org (8.14.7/8.14.7) with ESMTP id r7DA01O7077997 for ; Tue, 13 Aug 2013 10:00:01 GMT (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.14.7/8.14.7/Submit) id r7DA0135077996; Tue, 13 Aug 2013 10:00:01 GMT (envelope-from gnats) Date: Tue, 13 Aug 2013 10:00:01 GMT Message-Id: <201308131000.r7DA0135077996@freefall.freebsd.org> To: freebsd-wireless@FreeBSD.org Cc: From: dfilter@FreeBSD.ORG (dfilter service) Subject: Re: kern/181100: commit references a PR X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list Reply-To: dfilter service 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, 13 Aug 2013 10:00:01 -0000 The following reply was made to PR kern/181100; it has been noted by GNATS. From: dfilter@FreeBSD.ORG (dfilter service) To: bug-followup@FreeBSD.org Cc: Subject: Re: kern/181100: commit references a PR Date: Tue, 13 Aug 2013 09:58:35 +0000 (UTC) Author: adrian Date: Tue Aug 13 09:58:27 2013 New Revision: 254279 URL: http://svnweb.freebsd.org/changeset/base/254279 Log: ieee80211_rate2plcp() and ieee80211_rate2phytype() are both pre-11n routines and thus assert if one passes in a rate code with the high bit set. Since the high bit can indicate either IEEE80211_RATE_BASIC or IEEE80211_RATE_MCS, it's up to the caller to determine whether the rate is 11n or not, and either mask out the BASIC bit, or call a different function. (Yes, this does mean that net80211 should grow 11n-aware rate2phytype() and rate2plcp() functions..) This may need to happen for the other drivers - it's currently only done (now) for iwn(4) and bwi(4). PR: kern/181100 Modified: head/sys/dev/bwi/bwimac.c Modified: head/sys/dev/bwi/bwimac.c ============================================================================== --- head/sys/dev/bwi/bwimac.c Tue Aug 13 09:06:18 2013 (r254278) +++ head/sys/dev/bwi/bwimac.c Tue Aug 13 09:58:27 2013 (r254279) @@ -1427,7 +1427,8 @@ bwi_mac_set_ackrates(struct bwi_mac *mac enum ieee80211_phytype modtype; uint16_t ofs; - modtype = ieee80211_rate2phytype(rt, rs->rs_rates[i]); + modtype = ieee80211_rate2phytype(rt, + rs->rs_rates[i] & IEEE80211_RATE_VAL); switch (modtype) { case IEEE80211_T_DS: ofs = 0x4c0; @@ -1438,7 +1439,9 @@ bwi_mac_set_ackrates(struct bwi_mac *mac default: panic("unsupported modtype %u\n", modtype); } - ofs += 2*(ieee80211_rate2plcp(rs->rs_rates[i], modtype) & 0xf); + ofs += 2*(ieee80211_rate2plcp( + rs->rs_rates[i] & IEEE80211_RATE_VAL, + modtype) & 0xf); MOBJ_WRITE_2(mac, BWI_COMM_MOBJ, ofs + 0x20, MOBJ_READ_2(mac, BWI_COMM_MOBJ, ofs)); _______________________________________________ svn-src-all@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/svn-src-all To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org" From owner-freebsd-wireless@FreeBSD.ORG Tue Aug 13 12:22:00 2013 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 610E4D8C; Tue, 13 Aug 2013 12:22:00 +0000 (UTC) (envelope-from qinchenchong@gmail.com) Received: from mail-vc0-x22c.google.com (mail-vc0-x22c.google.com [IPv6:2607:f8b0:400c:c03::22c]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id DD029225F; Tue, 13 Aug 2013 12:21:59 +0000 (UTC) Received: by mail-vc0-f172.google.com with SMTP id m17so3781085vca.31 for ; Tue, 13 Aug 2013 05:21:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=ss8gwLvKf9c3h7/q64coqYFff52XhxmVMz49l2fVIBw=; b=obarRv6DMvH1TTM7rxmqoVrcbZameaz3IXXWMs64tL3FNqyGP72e1VIk0KmrGXLDnb OHnd9Pgaszvcce5ZrsH9afycGgXGaQ3RRGBfn7VpLbilnQYnl4DRzGpC4wj9INA6D5IQ TatD9qZR3yfhCabGLhCvDB7MqemRCZy7K/o0Mh5wdH6CQ2adAhs9KH4HWA7ZMGEu+aLE PcDO+z2YeCjnaD3HYh1e0XmpRoPdb5ol4cKQJ6SFk2eBKqQpq9c2/Sc2begnXSQU9JhW q4++XRZi30KHZfKJn6i/x7vd/88GNcjRpDImAgEyYVjtjdPxJQ2Rb9m9uKOVGsXnOMll xSLQ== MIME-Version: 1.0 X-Received: by 10.220.238.81 with SMTP id kr17mr68276vcb.61.1376396518988; Tue, 13 Aug 2013 05:21:58 -0700 (PDT) Received: by 10.220.57.142 with HTTP; Tue, 13 Aug 2013 05:21:58 -0700 (PDT) In-Reply-To: References: Date: Tue, 13 Aug 2013 20:21:58 +0800 Message-ID: Subject: Re: Chenchong's work on net80211_ratectl From: Chenchong Qin To: Adrian Chadd Content-Type: multipart/mixed; boundary=047d7b3434b695a01504e3d34963 X-Content-Filtered-By: Mailman/MimeDel 2.1.14 Cc: freebsd-wireless@freebsd.org X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.14 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, 13 Aug 2013 12:22:00 -0000 --047d7b3434b695a01504e3d34963 Content-Type: text/plain; charset=ISO-8859-1 Hi! Here is an update of work these days. I've added a new struct called ieee80211_rc_info to the ratectl API. It contains tx completing information, i.e. txcnt, retrycnt, finaltsi, etc, which can be provided to ratectl algo during the __complete__ period. ir_rates, ieee80211_ratectl_rates and ieee80211_ratectl_complete_rcflags are adapted to accept the ieee80211_rc_info pointer through which framelen and shortpreamble can also be reached. Then I added __complete__ stuff and ir_rates to ieee80211_rc_sample. Thanks! Chenchong On Tue, Aug 6, 2013 at 12:03 AM, Adrian Chadd wrote: > Hi! > > Great! > > So what's the problem with complete? Linux just provides all the > information that the NIC supplies - how many attempts were made, how > many attempts failed, which rate suceeded, etc. It looks a lot like it > was designed around the requirements for the atheros driver (that has > the most interesting information available) and other NICs just have > to fake it somehow. > > > > -adrian > > On 5 August 2013 08:58, Chenchong Qin wrote: > > Hi! > > > > Here is my work done these days on porting ath_rate_sample to net80211. > It > > has not been finished yet. _complete_ and _update_ are to be added. > > > > _complete_ is really a tricky thing. We have to provide rc algos with rc > > information > > during the frame completion period. Different rc algos may need > different rc > > information. What makes things more thornier is that different drivers > > provide > > different rc information in different ways. So, it seems we need a > unified > > way to > > provide the rc information during completion of a frame. > > > > I'm browsing mac80211 these days to see what Linux do about _complete_. > And, > > looking forward to your commets! > > > > Thanks! > > > > Chenchong > > > > > > On Sat, Aug 3, 2013 at 1:30 AM, Adrian Chadd wrote: > >> > >> Well just remember you can always ask me/us questions! > >> > >> What's your latest diff against -HEAD? Maybe I can start looking at > >> including parts of it in the tree. > >> > >> > >> > >> > >> -adrian > >> > >> On 2 August 2013 09:17, Chenchong Qin wrote: > >> > Hi! > >> > > >> > These days, I'm taking a further look at what Linux done for the > >> > _completion_ of a > >> > frame. Some updates will be posted here later. > >> > > >> > And, with ir_rates, we can return/fill an rc array rather than just > >> > returning the rix. > >> > > >> > Thanks! > >> > > >> > Chenchong > >> > > >> > > >> > > >> > > >> > > >> > On Thu, Aug 1, 2013 at 12:21 AM, Adrian Chadd > >> > wrote: > >> >> > >> >> Boo! > >> >> > >> >> Do you have another update? > >> >> > >> >> > >> >> > >> >> -adrian > >> >> > >> >> On 24 July 2013 06:44, Adrian Chadd wrote: > >> >> > On 24 July 2013 06:38, Chenchong Qin > wrote: > >> >> >> > >> >> >> My pleasure! > >> >> >> > >> >> >> It's also against HEAD. > >> >> >> > >> >> >> Thanks! > >> >> > > >> >> > Ok. This is looking great! > >> >> > > >> >> > Next - we need to update the rate control API to now populate an rc > >> >> > array rather than just returning the rix. > >> >> > > >> >> > This is the tricky part - as we're going to have to modify all the > >> >> > drivers that use the rate control API to use this. > >> >> > Which is fine, as there's only a handful. It's just annoying. > >> >> > > >> >> > Then we have to provide the rate control information during frame > >> >> > _completion_, so the rate control code knows which transmission > rates > >> >> > succeeded or failed. I'm still not sure what to do about it here. > >> >> > Maybe do something like Linux and attach TX rate control and > >> >> > completion information as an mbuf tag? > >> >> > > >> >> > _Then_ we can start doing interesting thing with it. :) > >> >> > > >> >> > > >> >> > > >> >> > -adrian > >> > > >> > > > > > > --047d7b3434b695a01504e3d34963 Content-Type: application/octet-stream; name="20130812-net80211-ratectl.diff" Content-Disposition: attachment; filename="20130812-net80211-ratectl.diff" Content-Transfer-Encoding: base64 X-Attachment-Id: f_hkb2x1090 SW5kZXg6IHN5cy9uZXQ4MDIxMS9pZWVlODAyMTFfcmNfc2FtcGxlLmMKPT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g c3lzL25ldDgwMjExL2llZWU4MDIxMV9yY19zYW1wbGUuYwkocmV2aXNpb24gMCkKKysrIHN5cy9u ZXQ4MDIxMS9pZWVlODAyMTFfcmNfc2FtcGxlLmMJKHJldmlzaW9uIDI1NTg3MikKQEAgLTAsMCAr MSwxMTYyIEBACisvKiAkRnJlZUJTRDogaGVhZC9zeXMvZGV2L2F0aC9hdGhfcmF0ZS9zYW1wbGUv c2FtcGxlLmMgMjQ4NTczIDIwMTMtMDItMjcgMDQ6MzM6MDZaIGFkcmlhbiAkKi8KKworLyotCisg KiBDb3B5cmlnaHQgKGMpIDIwMTMgQ2hlbmNob25nIFFpbiA8Y2NxaW5ARnJlZUJTRC5vcmc+Cisg KiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0 YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9u cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns YWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg UFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJ TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1Q TElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg UEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwg VEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURF TlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV RElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBC VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9S WSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8 c3lzL2NkZWZzLmg+CisKKyNpbmNsdWRlICJvcHRfd2xhbi5oIgorCisjaW5jbHVkZSA8c3lzL3Bh cmFtLmg+CisjaW5jbHVkZSA8c3lzL2tlcm5lbC5oPgorI2luY2x1ZGUgPHN5cy9tb2R1bGUuaD4K KyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL3N5c2N0bC5oPgorCisjaW5j bHVkZSA8bmV0L2lmLmg+CisjaW5jbHVkZSA8bmV0L2lmX21lZGlhLmg+CisKKyNpZmRlZiBJTkVU CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPG5ldGluZXQvaWZfZXRoZXIuaD4K KyNlbmRpZgorCisjaW5jbHVkZSA8bmV0ODAyMTEvaWVlZTgwMjExX3Zhci5oPgorI2luY2x1ZGUg PG5ldDgwMjExL2llZWU4MDIxMV9odC5oPgorI2luY2x1ZGUgPG5ldDgwMjExL2llZWU4MDIxMV9y YXRlY3RsLmg+CisjaW5jbHVkZSA8bmV0ODAyMTEvaWVlZTgwMjExX3JjX3NhbXBsZS5oPgorI2lu Y2x1ZGUgPG5ldDgwMjExL2llZWU4MDIxMV9yY19zYW1wbGVfdHhzY2hlZC5oPgorCitzdGF0aWMg dm9pZAlzYW1wbGVfaW5pdChzdHJ1Y3QgaWVlZTgwMjExdmFwICopOworc3RhdGljIHZvaWQJc2Ft cGxlX2RlaW5pdChzdHJ1Y3QgaWVlZTgwMjExdmFwICopOworc3RhdGljIHZvaWQJc2FtcGxlX25v ZGVfaW5pdChzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKik7CitzdGF0aWMgdm9pZAlzYW1wbGVfbm9k ZV9kZWluaXQoc3RydWN0IGllZWU4MDIxMV9ub2RlICopOworc3RhdGljIGludAlzYW1wbGVfcmF0 ZShzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKiwgdm9pZCAqLCB1aW50MzJfdCk7CitzdGF0aWMgdm9p ZAlzYW1wbGVfdHhfY29tcGxldGUoY29uc3Qgc3RydWN0IGllZWU4MDIxMXZhcCAqLAorICAgIAkJ CWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqLCBpbnQsIAorCQkJdm9pZCAqLCB2b2lkICop Oworc3RhdGljIHZvaWQJc2FtcGxlX3R4X3VwZGF0ZShjb25zdCBzdHJ1Y3QgaWVlZTgwMjExdmFw ICp2YXAsCisJCQljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKiwgdm9pZCAqLCB2b2lkICos IHZvaWQgKik7CitzdGF0aWMgdm9pZAlzYW1wbGVfc2V0aW50ZXJ2YWwoY29uc3Qgc3RydWN0IGll ZWU4MDIxMXZhcCAqLCBpbnQpOworCisvKiBudW1iZXIgb2YgcmVmZXJlbmNlcyBmcm9tIG5ldDgw MjExIGxheWVyICovCitzdGF0aWMJaW50IG5yZWZzID0gMDsKKworc3RhdGljIGNvbnN0IHN0cnVj dCBpZWVlODAyMTFfcmF0ZWN0bCBzYW1wbGUgPSB7CisJLmlyX25hbWUJPSAic2FtcGxlIiwKKwku aXJfYXR0YWNoCT0gTlVMTCwKKwkuaXJfZGV0YWNoCT0gTlVMTCwKKwkuaXJfaW5pdAk9IHNhbXBs ZV9pbml0LAorCS5pcl9kZWluaXQJPSBzYW1wbGVfZGVpbml0LAorCS5pcl9ub2RlX2luaXQJPSBz YW1wbGVfbm9kZV9pbml0LAorCS5pcl9ub2RlX2RlaW5pdAk9IHNhbXBsZV9ub2RlX2RlaW5pdCwK KwkuaXJfcmF0ZQk9IHNhbXBsZV9yYXRlLAorCS5pcl9yYXRlcwk9IHNhbXBsZV9yYXRlcywKKwku aXJfdHhfY29tcGxldGUJPSBzYW1wbGVfdHhfY29tcGxldGUsCisJLmlyX3R4X3VwZGF0ZQk9IHNh bXBsZV90eF91cGRhdGUsCisJLmlyX3NldGludGVydmFsCT0gc2FtcGxlX3NldGludGVydmFsLAor fTsKK0lFRUU4MDIxMV9SQVRFQ1RMX01PRFVMRShzYW1wbGUsIDEpOworSUVFRTgwMjExX1JBVEVD VExfQUxHKHNhbXBsZSwgSUVFRTgwMjExX1JBVEVDVExfU0FNUExFLCBzYW1wbGUpOworCitzdGF0 aWMgdm9pZAorc2FtcGxlX2luaXQoc3RydWN0IGllZWU4MDIxMXZhcCAqdmFwKQoreworCXN0cnVj dCBpZWVlODAyMTFfc2FtcGxlICpzYW1wbGU7CisKKwlLQVNTRVJUKHZhcC0+aXZfcnMgPT0gTlVM TCwgKCIlcyBjYWxsZWQgbXVsdGlwbGUgdGltZXMiLCBfX2Z1bmNfXykpOworCisJc2FtcGxlID0g dmFwLT5pdl9ycyA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9zYW1wbGUpLAorCSAg ICBNXzgwMjExX1JBVEVDVEwsIE1fTk9XQUlUfE1fWkVSTyk7CisJaWYgKHNhbXBsZSA9PSBOVUxM KSB7CisJCWlmX3ByaW50Zih2YXAtPml2X2lmcCwgImNvdWxkbid0IGFsbG9jIHJhdGVjdGwgc3Ry dWN0dXJlXG4iKTsKKwkJcmV0dXJuOworCX0KKwlzYW1wbGUtPnNhbXBsZV9zbW9vdGhpbmdfcmF0 ZSA9IDc1OwkJLyogZXdtYSBwZXJjZW50YWdlIChbMC4uOTldKSAqLworCXNhbXBsZS0+c2FtcGxl X3Ntb290aGluZ19taW5wYWNrZXRzID0gMTAwIC8gKDEwMCAtIHNhbXBsZS0+c2FtcGxlX3Ntb290 aGluZ19yYXRlKTsKKwlzYW1wbGUtPnNhbXBsZV9yYXRlID0gMTA7CQkJLyogJXRpbWUgdG8gdHJ5 IGRpZmYgdHggcmF0ZXMgKi8KKwlzYW1wbGUtPnNhbXBsZV9tYXhfc3VjY2Vzc2l2ZV9mYWlsdXJl cyA9IDM7CS8qIHRocmVzaG9sZCBmb3IgcmF0ZSBzYW1wbGluZyovCisJc2FtcGxlLT5zYW1wbGVf c3RhbGVfZmFpbHVyZV90aW1lb3V0ID0gMTAgKiBoejsJLyogMTAgc2Vjb25kcyAqLworCXNhbXBs ZS0+c2FtcGxlX21pbl9zd2l0Y2ggPSBoejsJCQkvKiAxIHNlY29uZCAqLworCXNhbXBsZV9zZXRp bnRlcnZhbCh2YXAsIDUwMCAvKiBtcyAqLyk7IAkvKiBhY3R1YWxseSBkbyBub3RoaW5nICovCisJ c2FtcGxlX3N5c2N0bGF0dGFjaCh2YXAsIHZhcC0+aXZfc3lzY3RsLCB2YXAtPml2X29pZCk7Cit9 CisKK3N0YXRpYyB2b2lkCitzYW1wbGVfZGVpbml0KHN0cnVjdCBpZWVlODAyMTF2YXAgKnZhcCkK K3sKKwlmcmVlKHZhcC0+aXZfcnMsIE1fODAyMTFfUkFURUNUTCk7Cit9CisKKy8vIFhYWCBzaG91 bGQgYmUgc2hhcmVkIGJ5IHJhdGVjdGwgYWxnb3MKK3N0YXRpYyBpbnQKK3NhbXBsZV9ub2RlX2lz XzExbihzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pKQoreworCisJaWYgKG5pLT5uaV9jaGFuID09 IE5VTEwpCisJCXJldHVybiAoMCk7CisJaWYgKG5pLT5uaV9jaGFuID09IElFRUU4MDIxMV9DSEFO X0FOWUMpCisJCXJldHVybiAoMCk7CisJcmV0dXJuIChJRUVFODAyMTFfSVNfQ0hBTl9IVChuaS0+ bmlfY2hhbikpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHR4c2NoZWR1bGUgKm1ycl9zY2hl ZHVsZXNbSUVFRTgwMjExX01PREVfTUFYKzJdID0geworCU5VTEwsCQkvKiBJRUVFODAyMTFfTU9E RV9BVVRPICovCisJc2VyaWVzXzExYSwJLyogSUVFRTgwMjExX01PREVfMTFBICovCisJc2VyaWVz XzExZywJLyogSUVFRTgwMjExX01PREVfMTFCICovCisJc2VyaWVzXzExZywJLyogSUVFRTgwMjEx X01PREVfMTFHICovCisJTlVMTCwJCS8qIElFRUU4MDIxMV9NT0RFX0ZIICovCisJc2VyaWVzXzEx YSwJLyogSUVFRTgwMjExX01PREVfVFVSQk9fQSAqLworCXNlcmllc18xMWcsCS8qIElFRUU4MDIx MV9NT0RFX1RVUkJPX0cgKi8KKwlzZXJpZXNfMTFhLAkvKiBJRUVFODAyMTFfTU9ERV9TVFVSQk9f QSAqLworCXNlcmllc18xMW5hLAkvKiBJRUVFODAyMTFfTU9ERV8xMU5BICovCisJc2VyaWVzXzEx bmcsCS8qIElFRUU4MDIxMV9NT0RFXzExTkcgKi8KKwlzZXJpZXNfaGFsZiwJLyogSUVFRTgwMjEx X01PREVfSEFMRiAqLworCXNlcmllc19xdWFydGVyLAkvKiBJRUVFODAyMTFfTU9ERV9RVUFSVEVS ICovCit9OworCitzdGF0aWMgdm9pZAorc2FtcGxlX25vZGVfaW5pdChzdHJ1Y3QgaWVlZTgwMjEx X25vZGUgKm5pKQoreworI2RlZmluZQlSQVRFKF9peCkJKG5pLT5uaV9yYXRlcy5yc19yYXRlc1so X2l4KV0gJiBJRUVFODAyMTFfUkFURV9WQUwpCisjZGVmaW5lCURPVDExUkFURShfaXgpCShydC0+ aW5mb1soX2l4KV0uZG90MTFSYXRlICYgSUVFRTgwMjExX1JBVEVfVkFMKQorI2RlZmluZQlNQ1Mo X2l4KQkobmktPm5pX2h0cmF0ZXMucnNfcmF0ZXNbX2l4XSB8IElFRUU4MDIxMV9SQVRFX01DUykK KwlzdHJ1Y3QgaWVlZTgwMjExdmFwICp2YXAgPSBuaS0+bmlfdmFwOworCXN0cnVjdCBpZWVlODAy MTFfc2FtcGxlICpzYW1wbGUgPSB2YXAtPml2X3JzOworCXN0cnVjdCBpZWVlODAyMTFfc2FtcGxl X25vZGUgKnNhbiA9IE5VTEw7CisJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yYXRlX3RhYmxlICpy dCA9IGllZWU4MDIxMV9nZXRfcmF0ZXRhYmxlKHZhcC0+aXZfaWMtPmljX2N1cmNoYW4pOworCWVu dW0gaWVlZTgwMjExX3BoeW1vZGUgY3VybW9kZSA9IGllZWU4MDIxMV9jaGFuMm1vZGUodmFwLT5p dl9pYy0+aWNfY3VyY2hhbik7CisJaW50IHgsIHksIHJpeDsKKworCWlmIChuaS0+bmlfcmN0bHMg PT0gTlVMTCkgeworCQluaS0+bmlfcmN0bHMgPSBzYW4gPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBp ZWVlODAyMTFfc2FtcGxlX25vZGUpLAorCQkgICAgTV84MDIxMV9SQVRFQ1RMLCBNX05PV0FJVHxN X1pFUk8pOworCQlpZiAoc2FuID09IE5VTEwpIHsKKwkJCWlmX3ByaW50Zih2YXAtPml2X2lmcCwg ImNvdWxkbid0IGFsbG9jIHBlci1ub2RlIHJhdGVjdGwgIgorCQkJICAgICJzdHJ1Y3R1cmVcbiIp OworCQkJcmV0dXJuOworCQl9CisJfSBlbHNlCisJCXNhbiA9IG5pLT5uaV9yY3RsczsKKwlzYW4t PnNhbl9zYW1wbGUgPSBzYW1wbGU7CisKKwlLQVNTRVJUKHJ0ICE9IE5VTEwsICgibm8gcmF0ZSB0 YWJsZSwgbW9kZSAldSIsIGN1cm1vZGUpKTsKKworCXNhbi0+c2NoZWQgPSBtcnJfc2NoZWR1bGVz W2N1cm1vZGVdOworCUtBU1NFUlQoc2FuLT5zY2hlZCAhPSBOVUxMLCAoIm5vIG1yciBzY2hlZHVs ZSBmb3IgbW9kZSAldSIsIGN1cm1vZGUpKTsKKworCXNhbi0+c3RhdGljX3JpeCA9IC0xOworCXNh bXBsZV91cGRhdGVfc3RhdGljX3JpeChuaSk7CisKKwkvKgorCSAqIENvbnN0cnVjdCBhIGJpdG1h c2sgb2YgdXNhYmxlIHJhdGVzLiAgVGhpcyBoYXMgYWxsCisJICogbmVnb3RpYXRlZCByYXRlcyBt aW51cyB0aG9zZSBtYXJrZWQgYnkgdGhlIGhhbCBhcworCSAqIHRvIGJlIGlnbm9yZWQgZm9yIGRv aW5nIHJhdGUgY29udHJvbC4KKwkgKi8KKwlzYW4tPnJhdGVtYXNrID0gMDsKKworCS8qIE1DUyBy YXRlcyAqLworCWlmIChuaS0+bmlfZmxhZ3MgJiBJRUVFODAyMTFfTk9ERV9IVCkgeworCQlmb3Ig KHggPSAwOyB4IDwgbmktPm5pX2h0cmF0ZXMucnNfbnJhdGVzOyB4KyspIHsKKwkJCXJpeCA9IHJ0 LT5yYXRlQ29kZVRvSW5kZXhbTUNTKHgpXTsKKwkJCWlmIChyaXggPT0gMHhmZikKKwkJCQljb250 aW51ZTsKKwkJCS8qIHNraXAgcmF0ZXMgbWFya2VkIGJyb2tlbiBieSBoYWwgKi8KKwkJCWlmICgh cnQtPmluZm9bcml4XS52YWxpZCkKKwkJCQljb250aW51ZTsKKwkJCUtBU1NFUlQocml4IDwgU0FN UExFX01BWFJBVEVTLAorCQkJICAgICgibWNzICV1IGhhcyByaXggJWQiLCBNQ1MoeCksIHJpeCkp OworCQkJc2FuLT5yYXRlbWFzayB8PSAodWludDY0X3QpIDE8PHJpeDsKKwkJfQorCX0KKworCS8q IExlZ2FjeSByYXRlcyAqLworCWZvciAoeCA9IDA7IHggPCBuaS0+bmlfcmF0ZXMucnNfbnJhdGVz OyB4KyspIHsKKwkJcml4ID0gcnQtPnJhdGVDb2RlVG9JbmRleFtSQVRFKHgpXTsKKwkJaWYgKHJp eCA9PSAweGZmKQorCQkJY29udGludWU7CisJCS8qIHNraXAgcmF0ZXMgbWFya2VkIGJyb2tlbiBi eSBoYWwgKi8KKwkJaWYgKCFydC0+aW5mb1tyaXhdLnZhbGlkKQorCQkJY29udGludWU7CisJCUtB U1NFUlQocml4IDwgU0FNUExFX01BWFJBVEVTLAorCQkgICAgKCJyYXRlICV1IGhhcyByaXggJWQi LCBSQVRFKHgpLCByaXgpKTsKKwkJc2FuLT5yYXRlbWFzayB8PSAodWludDY0X3QpIDE8PHJpeDsK Kwl9CisKKwlmb3IgKHkgPSAwOyB5IDwgTlVNX1BBQ0tFVF9TSVpFX0JJTlM7IHkrKykgeworCQlp bnQgc2l6ZSA9IGJpbl90b19zaXplKHkpOworCQl1aW50NjRfdCBtYXNrOworCisJCXNhbi0+cGFj a2V0c19zZW50W3ldID0gMDsKKwkJc2FuLT5jdXJyZW50X3NhbXBsZV9yaXhbeV0gPSAtMTsKKwkJ c2FuLT5sYXN0X3NhbXBsZV9yaXhbeV0gPSAwOworCQkvKiBYWFggc3RhcnQgd2l0aCBmaXJzdCB2 YWxpZCByYXRlICovCisJCXNhbi0+Y3VycmVudF9yaXhbeV0gPSBmZnMoc2FuLT5yYXRlbWFzaykt MTsKKwkJCisJCS8qCisJCSAqIEluaXRpYWxpemUgdGhlIHN0YXRpc3RpY3MgYnVja2V0czsgdGhl c2UgYXJlCisJCSAqIGluZGV4ZWQgYnkgdGhlIHJhdGUgY29kZSBpbmRleC4KKwkJICovCisJCWZv ciAocml4ID0gMCwgbWFzayA9IHNhbi0+cmF0ZW1hc2s7IG1hc2sgIT0gMDsgcml4KyssIG1hc2sg Pj49IDEpIHsKKwkJCWlmICgobWFzayAmIDEpID09IDApCQkvKiBub3QgYSB2YWxpZCByYXRlICov CisJCQkJY29udGludWU7CisJCQlzYW4tPnN0YXRzW3ldW3JpeF0uc3VjY2Vzc2l2ZV9mYWlsdXJl cyA9IDA7CisJCQlzYW4tPnN0YXRzW3ldW3JpeF0udHJpZXMgPSAwOworCQkJc2FuLT5zdGF0c1t5 XVtyaXhdLnRvdGFsX3BhY2tldHMgPSAwOworCQkJc2FuLT5zdGF0c1t5XVtyaXhdLnBhY2tldHNf YWNrZWQgPSAwOworCQkJc2FuLT5zdGF0c1t5XVtyaXhdLmxhc3RfdHggPSAwOworCQkJc2FuLT5z dGF0c1t5XVtyaXhdLmV3bWFfcGN0ID0gMDsKKwkJCQorCQkJc2FuLT5zdGF0c1t5XVtyaXhdLnBl cmZlY3RfdHhfdGltZSA9CisJCQkgICAgY2FsY191c2Vjc191bmljYXN0X3BhY2tldCh2YXAsIHNp emUsIHJpeCwgMCwgMCwKKwkJCSAgICAobmktPm5pX2NodyA9PSA0MCkpOworCQkJc2FuLT5zdGF0 c1t5XVtyaXhdLmF2ZXJhZ2VfdHhfdGltZSA9CisJCQkgICAgc2FuLT5zdGF0c1t5XVtyaXhdLnBl cmZlY3RfdHhfdGltZTsKKwkJfQorCX0KKworCS8qIHNldCB0aGUgdmlzaWJsZSBiaXQtcmF0ZSAq LworCWlmIChzYW4tPnN0YXRpY19yaXggIT0gLTEpCisJCW5pLT5uaV90eHJhdGUgPSBET1QxMVJB VEUoc2FuLT5zdGF0aWNfcml4KTsKKwllbHNlCisJCW5pLT5uaV90eHJhdGUgPSBSQVRFKDApOwor I3VuZGVmIFJBVEUKKyN1bmRlZiBET1QxMVJBVEUKKyN1bmRlZiBNQ1MKK30KKworc3RhdGljIHZv aWQKK3NhbXBsZV9ub2RlX2RlaW5pdChzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pKQoreworCWZy ZWUobmktPm5pX3JjdGxzLCBNXzgwMjExX1JBVEVDVEwpOworfQorCitzdGF0aWMgaW50Citkb3Qx MXJhdGUoY29uc3QgaWVlZTgwMjExX3JhdGVfdGFibGUgKnJ0LCBpbnQgcml4KQoreworCWlmIChy aXggPCAwKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIHJ0LT5pbmZvW3JpeF0ucGh5ID09IElFRUU4 MDIxMV9UX0hUID8KKwkgICAgcnQtPmluZm9bcml4XS5kb3QxMVJhdGUgOiAocnQtPmluZm9bcml4 XS5kb3QxMVJhdGUgJiBJRUVFODAyMTFfUkFURV9WQUwpIC8gMjsKK30KKworc3RhdGljIGNvbnN0 IGNoYXIgKgorZG90MTFyYXRlX2xhYmVsKGNvbnN0IGllZWU4MDIxMV9yYXRlX3RhYmxlICpydCwg aW50IHJpeCkKK3sKKwlpZiAocml4IDwgMCkKKwkJcmV0dXJuICIiOworCXJldHVybiBydC0+aW5m b1tyaXhdLnBoeSA9PSBJRUVFODAyMTFfVF9IVCA/ICJNQ1MiIDogIk1iICI7Cit9CisKKy8qCisg KiBSZXR1cm4gdGhlIHJpeCB3aXRoIHRoZSBsb3dlc3QgYXZlcmFnZV90eF90aW1lLAorICogb3Ig LTEgaWYgYWxsIHRoZSBhdmVyYWdlX3R4X3RpbWVzIGFyZSAwLgorICovCitzdGF0aWMgX19pbmxp bmUgaW50CitwaWNrX2Jlc3RfcmF0ZShjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pLCBj b25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JhdGVfdGFibGUgKnJ0LAorICAgIGludCBzaXplX2Jpbiwg aW50IHJlcXVpcmVfYWNrZWRfYmVmb3JlKQoreworCXN0cnVjdCBpZWVlODAyMTFfc2FtcGxlX25v ZGUgKnNhbiA9IG5pLT5uaV9yY3RsczsKKyAgICBpbnQgYmVzdF9yYXRlX3JpeCwgYmVzdF9yYXRl X3R0LCBiZXN0X3JhdGVfcGN0OworCXVpbnQ2NF90IG1hc2s7CisJaW50IHJpeCwgdHQsIHBjdDsK KworICAgIGJlc3RfcmF0ZV9yaXggPSAwOworICAgIGJlc3RfcmF0ZV90dCA9IDA7CisJYmVzdF9y YXRlX3BjdCA9IDA7CisKKwlmb3IgKG1hc2sgPSBzYW4tPnJhdGVtYXNrLCByaXggPSAwOyBtYXNr ICE9IDA7IG1hc2sgPj49IDEsIHJpeCsrKSB7CisJCWlmICgobWFzayAmIDEpID09IDApCQkvKiBu b3QgYSBzdXBwb3J0ZWQgcmF0ZSAqLworCQkJY29udGludWU7CisKKwkJLyogRG9uJ3QgcGljayBh IG5vbi1IVCByYXRlIGZvciBhIEhUIG5vZGUgKi8KKwkJaWYgKChuaS0+bmlfZmxhZ3MgJiBJRUVF ODAyMTFfTk9ERV9IVCkgJiYKKwkJICAgIChydC0+aW5mb1tyaXhdLnBoeSAhPSBJRUVFODAyMTFf VF9IVCkpIHsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJdHQgPSBzYW4tPnN0YXRzW3NpemVfYmlu XVtyaXhdLmF2ZXJhZ2VfdHhfdGltZTsKKwkJaWYgKHR0IDw9IDAgfHwKKwkJICAgIChyZXF1aXJl X2Fja2VkX2JlZm9yZSAmJgorCQkgICAgICFzYW4tPnN0YXRzW3NpemVfYmluXVtyaXhdLnBhY2tl dHNfYWNrZWQpKQorCQkJY29udGludWU7CisKKwkJLyogQ2FsY3VsYXRlIHBlcmNlbnRhZ2UgaWYg cG9zc2libGUgKi8KKwkJaWYgKHNhbi0+c3RhdHNbc2l6ZV9iaW5dW3JpeF0udG90YWxfcGFja2V0 cyA+IDApIHsKKwkJCXBjdCA9IHNhbi0+c3RhdHNbc2l6ZV9iaW5dW3JpeF0uZXdtYV9wY3Q7CisJ CX0gZWxzZSB7CisJCQkvKiBYWFggZm9yIG5vdywgYXNzdW1lIDk1JSBvayAqLworCQkJcGN0ID0g OTU7CisJCX0KKworCQkvKiBkb24ndCB1c2UgYSBiaXQtcmF0ZSB0aGF0IGhhcyBiZWVuIGZhaWxp bmcgKi8KKwkJaWYgKHNhbi0+c3RhdHNbc2l6ZV9iaW5dW3JpeF0uc3VjY2Vzc2l2ZV9mYWlsdXJl cyA+IDMpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBGb3IgSFQsIERvbid0IHVzZSBhIGJp dCByYXRlIHRoYXQgaXMgbXVjaCBtb3JlCisJCSAqIGxvc3N5IHRoYW4gdGhlIGJlc3QuCisJCSAq CisJCSAqIFhYWCB0aGlzIGlzbid0IG9wdGltYWw7IGl0J3MganVzdCBkZXNpZ25lZCB0bworCQkg KiBlbGltaW5hdGUgcmF0ZXMgdGhhdCBhcmUgZ29pbmcgdG8gYmUgb2J2aW91c2x5CisJCSAqIHdv cnNlLgorCQkgKi8KKwkJaWYgKG5pLT5uaV9mbGFncyAmIElFRUU4MDIxMV9OT0RFX0hUKSB7CisJ CQlpZiAoYmVzdF9yYXRlX3BjdCA+IChwY3QgKyA1MCkpCisJCQkJY29udGludWU7CisJCX0KKwor CQkvKgorCQkgKiBGb3Igbm9uLU1DUyByYXRlcywgdXNlIHRoZSBjdXJyZW50IGF2ZXJhZ2UgdHh0 aW1lIGZvcgorCQkgKiBjb21wYXJpc29uLgorCQkgKi8KKwkJaWYgKCEgKG5pLT5uaV9mbGFncyAm IElFRUU4MDIxMV9OT0RFX0hUKSkgeworCQkJaWYgKGJlc3RfcmF0ZV90dCA9PSAwIHx8IHR0IDw9 IGJlc3RfcmF0ZV90dCkgeworCQkJCWJlc3RfcmF0ZV90dCA9IHR0OworCQkJCWJlc3RfcmF0ZV9y aXggPSByaXg7CisJCQkJYmVzdF9yYXRlX3BjdCA9IHBjdDsKKwkJCX0KKwkJfQorCisJCS8qCisJ CSAqIFNpbmNlIDIgc3RyZWFtIHJhdGVzIGhhdmUgc2xpZ2h0bHkgaGlnaGVyIFRYIHRpbWVzLAor CQkgKiBhbGxvdyBhIGxpdHRsZSBiaXQgb2YgbGVld2F5LiBUaGlzIHNob3VsZCBsYXRlcgorCQkg KiBiZSBhYnN0cmFjdGVkIG91dCBhbmQgcHJvcGVybHkgaGFuZGxlZC4KKwkJICovCisJCWlmIChu aS0+bmlfZmxhZ3MgJiBJRUVFODAyMTFfTk9ERV9IVCkgeworCQkJaWYgKGJlc3RfcmF0ZV90dCA9 PSAwIHx8ICh0dCAqIDggPD0gYmVzdF9yYXRlX3R0ICogMTApKSB7CisJCQkJYmVzdF9yYXRlX3R0 ID0gdHQ7CisJCQkJYmVzdF9yYXRlX3JpeCA9IHJpeDsKKwkJCQliZXN0X3JhdGVfcGN0ID0gcGN0 OworCQkJfQorCQl9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChiZXN0X3JhdGVfdHQgPyBi ZXN0X3JhdGVfcml4IDogLTEpOworfQorCisvKgorICogUGljayBhIGdvb2QgInJhbmRvbSIgYml0 LXJhdGUgdG8gc2FtcGxlIG90aGVyIHRoYW4gdGhlIGN1cnJlbnQgb25lLgorICovCitzdGF0aWMg X19pbmxpbmUgaW50CitwaWNrX3NhbXBsZV9yYXRlKGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfbm9k ZSAqbmksIGNvbnN0IGllZWU4MDIxMV9yYXRlX3RhYmxlICpydCwgCisJaW50IHNpemVfYmluKQor eworI2RlZmluZQlET1QxMVJBVEUoaXgpCShydC0+aW5mb1tpeF0uZG90MTFSYXRlICYgSUVFRTgw MjExX1JBVEVfVkFMKQorI2RlZmluZQlNQ1MoaXgpCQkocnQtPmluZm9baXhdLmRvdDExUmF0ZSB8 IElFRUU4MDIxMV9SQVRFX01DUykKKwlzdHJ1Y3QgaWVlZTgwMjExX3NhbXBsZV9ub2RlICpzYW4g PSBuaS0+bmlfcmN0bHM7CisJc3RydWN0IGllZWU4MDIxMV9zYW1wbGUgKnNhbXBsZSA9IHNhbi0+ c2FuX3NhbXBsZTsKKwlpbnQgY3VycmVudF9yaXgsIHJpeDsKKwl1bnNpZ25lZCBjdXJyZW50X3R0 OworCXVpbnQ2NF90IG1hc2s7CisJCisJY3VycmVudF9yaXggPSBzYW4tPmN1cnJlbnRfcml4W3Np emVfYmluXTsKKwlpZiAoY3VycmVudF9yaXggPCAwKSB7CisJCS8qIG5vIHN1Y2Nlc3NlcyB5ZXQs IHNlbmQgYXQgdGhlIGxvd2VzdCBiaXQtcmF0ZSAqLworCQkvKiBYWFggc2hvdWxkIHJldHVybiBN Q1MwIGlmIEhUICovCisJCXJldHVybiAwOworCX0KKworCWN1cnJlbnRfdHQgPSBzYW4tPnN0YXRz W3NpemVfYmluXVtjdXJyZW50X3JpeF0uYXZlcmFnZV90eF90aW1lOworCisJcml4ID0gc2FuLT5s YXN0X3NhbXBsZV9yaXhbc2l6ZV9iaW5dKzE7CS8qIG5leHQgc2FtcGxlIHJhdGUgKi8KKwltYXNr ID0gc2FuLT5yYXRlbWFzayAmfiAoKHVpbnQ2NF90KSAxPDxjdXJyZW50X3JpeCk7LyogZG9uJ3Qg c2FtcGxlIGN1cnJlbnQgcmF0ZSAqLworCXdoaWxlIChtYXNrICE9IDApIHsKKwkJaWYgKChtYXNr ICYgKCh1aW50NjRfdCkgMTw8cml4KSkgPT0gMCkgewkvKiBub3QgYSBzdXBwb3J0ZWQgcmF0ZSAq LworCW5leHRyYXRlOgorCQkJaWYgKCsrcml4ID49IHJ0LT5yYXRlQ291bnQpCisJCQkJcml4ID0g MDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJICogVGhlIGZvbGxvd2luZyBjb2RlIHN0 b3BzIHRyeWluZyB0byBzYW1wbGUKKwkJICogbm9uLU1DUyByYXRlcyB3aGVuIHNwZWFraW5nIHRv IGFuIE1DUyBub2RlLgorCQkgKiBIb3dldmVyLCBhdCBsZWFzdCBmb3IgQ0NLIHJhdGVzIGluIDIu NEdIeiBtb2RlLAorCQkgKiB0aGUgbm9uLU1DUyByYXRlcyBNQVkgYWN0dWFsbHkgcHJvdmlkZSBi ZXR0ZXIKKwkJICogUEVSIGF0IHRoZSB2ZXJ5IGZhciBlZGdlIG9mIHJlY2VwdGlvbi4KKwkJICoK KwkJICogSG93ZXZlciEgVW50aWwgYXRoX3JhdGVfZm9ybV9hZ2dyKCkgZ3Jvd3MKKwkJICogc29t ZSBsb2dpYyB0byBub3QgZm9ybSBhZ2dyZWdhdGVzIGlmIHRoZQorCQkgKiBzZWxlY3RlZCByYXRl IGlzIG5vbi1NQ1MsIHRoaXMgd29uJ3Qgd29yay4KKwkJICoKKwkJICogU28gZG9uJ3QgZGlzYWJs ZSB0aGlzIGNvZGUgdW50aWwgeW91J3ZlIHRhdWdodAorCQkgKiBhdGhfcmF0ZV9mb3JtX2FnZ3Io KSB0byBkcm9wIG91dCBpZiBhbnkgb2YKKwkJICogdGhlIHNlbGVjdGVkIHJhdGVzIGFyZSBub24t TUNTLgorCQkgKi8KKyNpZiAxCisJCS8qIGlmIHRoZSBub2RlIGlzIEhUIGFuZCB0aGUgcmF0ZSBp c24ndCBIVCwgZG9uJ3QgYm90aGVyIHNhbXBsZSAqLworCQlpZiAoKG5pLT5uaV9mbGFncyAmIElF RUU4MDIxMV9OT0RFX0hUKSAmJgorCQkgICAgKHJ0LT5pbmZvW3JpeF0ucGh5ICE9IElFRUU4MDIx MV9UX0hUKSkgeworCQkJbWFzayAmPSB+KCh1aW50NjRfdCkgMTw8cml4KTsKKwkJCWdvdG8gbmV4 dHJhdGU7CisJCX0KKyNlbmRpZgorCisJCS8qIHRoaXMgYml0LXJhdGUgaXMgYWx3YXlzIHdvcnNl IHRoYW4gdGhlIGN1cnJlbnQgb25lICovCisJCWlmIChzYW4tPnN0YXRzW3NpemVfYmluXVtyaXhd LnBlcmZlY3RfdHhfdGltZSA+IGN1cnJlbnRfdHQpIHsKKwkJCW1hc2sgJj0gfigodWludDY0X3Qp IDE8PHJpeCk7CisJCQlnb3RvIG5leHRyYXRlOworCQl9CisKKwkJLyogcmFyZWx5IHNhbXBsZSBi aXQtcmF0ZXMgdGhhdCBmYWlsIGEgbG90ICovCisJCWlmIChzYW4tPnN0YXRzW3NpemVfYmluXVty aXhdLnN1Y2Nlc3NpdmVfZmFpbHVyZXMgPiBzYW1wbGUtPnNhbXBsZV9tYXhfc3VjY2Vzc2l2ZV9m YWlsdXJlcyAmJgorCQkgICAgdGlja3MgLSBzYW4tPnN0YXRzW3NpemVfYmluXVtyaXhdLmxhc3Rf dHggPCBzYW1wbGUtPnNhbXBsZV9zdGFsZV9mYWlsdXJlX3RpbWVvdXQpIHsKKwkJCW1hc2sgJj0g figodWludDY0X3QpIDE8PHJpeCk7CisJCQlnb3RvIG5leHRyYXRlOworCQl9CisKKwkJLyoKKwkJ ICogRm9yIEhULCBvbmx5IHNhbXBsZSBhIGZldyByYXRlcyBvbiBlaXRoZXIgc2lkZSBvZiB0aGUK KwkJICogY3VycmVudCByaXg7IHRoZXJlJ3MgcXVpdGUgbGlrZWx5IGEgbG90IG9mIHRoZW0uCisJ CSAqLworCQlpZiAobmktPm5pX2ZsYWdzICYgSUVFRTgwMjExX05PREVfSFQpIHsKKwkJCWlmIChy aXggPCAoY3VycmVudF9yaXggLSAzKSB8fAorCQkJICAgIHJpeCA+IChjdXJyZW50X3JpeCArIDMp KSB7CisJCQkJbWFzayAmPSB+KCh1aW50NjRfdCkgMTw8cml4KTsKKwkJCQlnb3RvIG5leHRyYXRl OworCQkJfQorCQl9CisKKwkJLyogRG9uJ3Qgc2FtcGxlIG1vcmUgdGhhbiAyIHJhdGVzIGhpZ2hl ciBmb3IgcmF0ZXMgPiAxMU0gZm9yIG5vbi1IVCByYXRlcyAqLworCQlpZiAoISAobmktPm5pX2Zs YWdzICYgSUVFRTgwMjExX05PREVfSFQpKSB7CisJCQlpZiAoRE9UMTFSQVRFKHJpeCkgPiAyKjEx ICYmIHJpeCA+IGN1cnJlbnRfcml4ICsgMikgeworCQkJCW1hc2sgJj0gfigodWludDY0X3QpIDE8 PHJpeCk7CisJCQkJZ290byBuZXh0cmF0ZTsKKwkJCX0KKwkJfQorCisJCXNhbi0+bGFzdF9zYW1w bGVfcml4W3NpemVfYmluXSA9IHJpeDsKKwkJcmV0dXJuIHJpeDsKKwl9CisJcmV0dXJuIGN1cnJl bnRfcml4OworI3VuZGVmIERPVDExUkFURQorI3VuZGVmIE1DUworfQorCitzdGF0aWMgaW50Citz YW1wbGVfZ2V0X3N0YXRpY19yaXgoY29uc3Qgc3RydWN0IGllZWU4MDIxMV9ub2RlICpuaSkKK3sK KyNkZWZpbmUJUkFURShfaXgpCShuaS0+bmlfcmF0ZXMucnNfcmF0ZXNbKF9peCldICYgSUVFRTgw MjExX1JBVEVfVkFMKQorI2RlZmluZQlNQ1MoX2l4KQkobmktPm5pX2h0cmF0ZXMucnNfcmF0ZXNb X2l4XSB8IElFRUU4MDIxMV9SQVRFX01DUykKKwlzdHJ1Y3QgaWVlZTgwMjExdmFwICp2YXAgPSBu aS0+bmlfdmFwOworCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmF0ZV90YWJsZSAqcnQgPSBpZWVl ODAyMTFfZ2V0X3JhdGV0YWJsZSh2YXAtPml2X2ljLT5pY19jdXJjaGFuKTsKKwljb25zdCBzdHJ1 Y3QgaWVlZTgwMjExX3R4cGFyYW0gKnRwID0gbmktPm5pX3R4cGFybXM7CisJaW50IHNyYXRlOwor CisJLyogQ2hlY2sgTUNTIHJhdGVzICovCisJZm9yIChzcmF0ZSA9IG5pLT5uaV9odHJhdGVzLnJz X25yYXRlcyAtIDE7IHNyYXRlID49IDA7IHNyYXRlLS0pIHsKKwkJaWYgKE1DUyhzcmF0ZSkgPT0g dHAtPnVjYXN0cmF0ZSkKKwkJCXJldHVybiBydC0+cmF0ZUNvZGVUb0luZGV4W3RwLT51Y2FzdHJh dGVdOworCX0KKworCS8qIENoZWNrIGxlZ2FjeSByYXRlcyAqLworCWZvciAoc3JhdGUgPSBuaS0+ bmlfcmF0ZXMucnNfbnJhdGVzIC0gMTsgc3JhdGUgPj0gMDsgc3JhdGUtLSkgeworCQlpZiAoUkFU RShzcmF0ZSkgPT0gdHAtPnVjYXN0cmF0ZSkKKwkJCXJldHVybiBydC0+cmF0ZUNvZGVUb0luZGV4 W3RwLT51Y2FzdHJhdGVdOworCX0KKwlyZXR1cm4gLTE7CisjdW5kZWYJUkFURQorI3VuZGVmCU1D UworfQorCitzdGF0aWMgdm9pZAorc2FtcGxlX3VwZGF0ZV9zdGF0aWNfcml4KHN0cnVjdCBpZWVl ODAyMTFfbm9kZSAqbmkpCit7CisJc3RydWN0IGllZWU4MDIxMV9zYW1wbGVfbm9kZSAqc2FuID0g bmktPm5pX3JjdGxzOworCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfdHhwYXJhbSAqdHAgPSBuaS0+ bmlfdHhwYXJtczsKKworCWlmICh0cCAhPSBOVUxMICYmIHRwLT51Y2FzdHJhdGUgIT0gSUVFRTgw MjExX0ZJWEVEX1JBVEVfTk9ORSkgeworCQkvKgorCQkgKiBBIGZpeGVkIHJhdGUgaXMgdG8gYmUg dXNlZDsgdWNhc3RyYXRlIGlzIHRoZSBJRUVFIGNvZGUKKwkJICogZm9yIHRoaXMgcmF0ZSAoc2Fu cyBiYXNpYyBiaXQpLiAgQ2hlY2sgdGhpcyBhZ2FpbnN0IHRoZQorCQkgKiBuZWdvdGlhdGVkIHJh dGUgc2V0IGZvciB0aGUgbm9kZS4gIE5vdGUgdGhlIGZpeGVkIHJhdGUKKwkJICogbWF5IG5vdCBi ZSBhdmFpbGFibGUgZm9yIHZhcmlvdXMgcmVhc29ucyBzbyB3ZSBvbmx5CisJCSAqIHNldHVwIHRo ZSBzdGF0aWMgcmF0ZSBpbmRleCBpZiB0aGUgbG9va3VwIGlzIHN1Y2Nlc3NmdWwuCisJCSAqLwor CQlzYW4tPnN0YXRpY19yaXggPSBzYW1wbGVfZ2V0X3N0YXRpY19yaXgobmkpOworCX0gZWxzZSB7 CisJCXNhbi0+c3RhdGljX3JpeCA9IC0xOworCX0KK30KKworLyoKKyAqIFBpY2sgYSBub24tSFQg cmF0ZSB0byBiZWdpbiB1c2luZy4KKyAqLworc3RhdGljIGludAorc2FtcGxlX3BpY2tfc2VlZF9y YXRlX2xlZ2FjeShjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pLCBpbnQgZnJhbWVMZW4p Cit7CisjZGVmaW5lCURPVDExUkFURShpeCkJKHJ0LT5pbmZvW2l4XS5kb3QxMVJhdGUgJiBJRUVF ODAyMTFfUkFURV9WQUwpCisJc3RydWN0IGllZWU4MDIxMXZhcCAqdmFwID0gbmktPm5pX3ZhcDsK KwlzdHJ1Y3QgaWVlZTgwMjExX3NhbXBsZV9ub2RlICpzYW4gPSBuaS0+bmlfcmN0bHM7CisJY29u c3Qgc3RydWN0IGllZWU4MDIxMV9yYXRlX3RhYmxlICpydCA9IGllZWU4MDIxMV9nZXRfcmF0ZXRh YmxlKHZhcC0+aXZfaWMtPmljX2N1cmNoYW4pOworCQorCWNvbnN0IGludCBzaXplX2JpbiA9IHNp emVfdG9fYmluKGZyYW1lTGVuKTsKKwlpbnQgcml4ID0gLTE7CisKKwkvKiBubyBwYWNrZXQgaGFz IGJlZW4gc2VudCBzdWNjZXNzZnVsbHkgeWV0ICovCisJZm9yIChyaXggPSBydC0+cmF0ZUNvdW50 LTE7IHJpeCA+IDA7IHJpeC0tKSB7CisJCWlmICgoc2FuLT5yYXRlbWFzayAmICgodWludDY0X3Qp IDE8PHJpeCkpID09IDApCisJCQljb250aW51ZTsKKworCQkvKiBTa2lwIEhUIHJhdGVzICovCisJ CWlmIChydC0+aW5mb1tyaXhdLnBoeSA9PSBJRUVFODAyMTFfVF9IVCkKKwkJCWNvbnRpbnVlOwor CisJCS8qCisJCSAqIFBpY2sgdGhlIGhpZ2hlc3QgcmF0ZSA8PSAzNiBNYnBzCisJCSAqIHRoYXQg aGFzbid0IGZhaWxlZC4KKwkJICovCisJCWlmIChET1QxMVJBVEUocml4KSA8PSA3MiAmJgorCQkg ICAgc2FuLT5zdGF0c1tzaXplX2Jpbl1bcml4XS5zdWNjZXNzaXZlX2ZhaWx1cmVzID09IDApIHsK KwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiByaXg7CisjdW5kZWYgRE9UMTFSQVRFCit9CisK Ky8qCisgKiBQaWNrIGEgSFQgcmF0ZSB0byBiZWdpbiB1c2luZy4KKyAqCisgKiBEb24ndCB1c2Ug YW55IG5vbi1IVCByYXRlczsgb25seSBjb25zaWRlciBIVCByYXRlcy4KKyAqLworc3RhdGljIGlu dAorc2FtcGxlX3BpY2tfc2VlZF9yYXRlX2h0KGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfbm9kZSAq bmksIGludCBmcmFtZUxlbikKK3sKKyNkZWZpbmUJTUNTKGl4KQkJKHJ0LT5pbmZvW2l4XS5kb3Qx MVJhdGUgfCBJRUVFODAyMTFfUkFURV9NQ1MpCisJc3RydWN0IGllZWU4MDIxMXZhcCAqdmFwID0g bmktPm5pX3ZhcDsKKwlzdHJ1Y3QgaWVlZTgwMjExX3NhbXBsZV9ub2RlICpzYW4gPSBuaS0+bmlf cmN0bHM7CisJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yYXRlX3RhYmxlICpydCA9IGllZWU4MDIx MV9nZXRfcmF0ZXRhYmxlKHZhcC0+aXZfaWMtPmljX2N1cmNoYW4pOworCQorCWNvbnN0IGludCBz aXplX2JpbiA9IHNpemVfdG9fYmluKGZyYW1lTGVuKTsKKwlpbnQgcml4ID0gLTEsIGh0X3JpeCA9 IC0xOworCisJLyogbm8gcGFja2V0IGhhcyBiZWVuIHNlbnQgc3VjY2Vzc2Z1bGx5IHlldCAqLwor CWZvciAocml4ID0gcnQtPnJhdGVDb3VudC0xOyByaXggPiAwOyByaXgtLSkgeworCQkvKiBTa2lw IHJhdGVzIHdlIGNhbid0IHVzZSAqLworCQlpZiAoKHNhbi0+cmF0ZW1hc2sgJiAoKHVpbnQ2NF90 KSAxPDxyaXgpKSA9PSAwKQorCQkJY29udGludWU7CisKKwkJLyogS2VlcCBhIGNvcHkgb2YgdGhl IGxhc3Qgc2VlbiBIVCByYXRlIGluZGV4ICovCisJCWlmIChydC0+aW5mb1tyaXhdLnBoeSA9PSBJ RUVFODAyMTFfVF9IVCkKKwkJCWh0X3JpeCA9IHJpeDsKKworCQkvKiBTa2lwIG5vbi1IVCByYXRl cyAqLworCQlpZiAocnQtPmluZm9bcml4XS5waHkgIT0gSUVFRTgwMjExX1RfSFQpCisJCQljb250 aW51ZTsKKworCQkvKgorCQkgKiBQaWNrIGEgbWVkaXVtLXNwZWVkIHJhdGUgcmVnYXJkbGVzcyBv ZiBzdHJlYW0gY291bnQKKwkJICogd2hpY2ggaGFzIG5vdCBzZWVuIGFueSBmYWlsdXJlcy4gSGln aGVyIHJhdGVzIG1heSBmYWlsOworCQkgKiB3ZSdsbCB0cnkgdGhlbSBsYXRlci4KKwkJICovCisJ CWlmICgoKE1DUyhyaXgpICYgMHg3KSA8PSA0KSAmJgorCQkgICAgc2FuLT5zdGF0c1tzaXplX2Jp bl1bcml4XS5zdWNjZXNzaXZlX2ZhaWx1cmVzID09IDApIHsKKwkJCWJyZWFrOworCQl9CisJfQor CisJLyoKKwkgKiBJZiBhbGwgdGhlIE1DUyByYXRlcyBoYXZlIHN1Y2Nlc3NpdmUgZmFpbHVyZXMs IHJpeCBzaG91bGQgYmUKKwkgKiA+IDA7IG90aGVyd2lzZSB1c2UgdGhlIGxvd2VzdCBNQ1Mgcml4 IChob3BlZnVsbHkgTUNTIDAuKQorCSAqLworCXJldHVybiBNQVgocml4LCBodF9yaXgpOworI3Vu ZGVmIE1DUworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yYXRlc2V0ICoKK3Nh bXBsZV9nZXRfcmF0ZXNldChjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pKQoreworCWNv bnN0IHN0cnVjdCBpZWVlODAyMTFfcmF0ZXNldCAqcnMgPSBOVUxMOworCS8qIDExbiBvciBub3Q/ IFBpY2sgdGhlIHJpZ2h0IHJhdGVzZXQgKi8KKwlpZiAoc2FtcGxlX25vZGVfaXNfMTFuKG5pKSkg eworCQkvKiBYWFggZXcgKi8KKwkJSUVFRTgwMjExX05PVEUobmktPm5pX3ZhcCwgSUVFRTgwMjEx X01TR19SQVRFQ1RMLCBuaSwKKwkJICAgICIlczogMTFuIG5vZGUiLCBfX2Z1bmNfXyk7CisJCXJz ID0gKHN0cnVjdCBpZWVlODAyMTFfcmF0ZXNldCAqKSAmbmktPm5pX2h0cmF0ZXM7CisJfSBlbHNl IHsKKwkJSUVFRTgwMjExX05PVEUobmktPm5pX3ZhcCwgSUVFRTgwMjExX01TR19SQVRFQ1RMLCBu aSwKKwkJICAgICIlczogbm9uLTExbiBub2RlIiwgX19mdW5jX18pOworCQlycyA9ICZuaS0+bmlf cmF0ZXM7CisJfQorCXJldHVybiByczsKK30KKworc3RhdGljIGludAorc2FtcGxlX3JhdGUoc3Ry dWN0IGllZWU4MDIxMV9ub2RlICpuaSwgdm9pZCAqYXJnIF9fdW51c2VkLCB1aW50MzJfdCBpYXJn IF9fdW51c2VkKQoreworI2RlZmluZQlET1QxMVJBVEUoaXgpCShydC0+aW5mb1tpeF0uZG90MTFS YXRlICYgSUVFRTgwMjExX1JBVEVfVkFMKQorI2RlZmluZQlNQ1MoaXgpCQkocnQtPmluZm9baXhd LmRvdDExUmF0ZSB8IElFRUU4MDIxMV9SQVRFX01DUykKKyNkZWZpbmUJUkFURShpeCkJKERPVDEx UkFURShpeCkgLyAyKQorCXN0cnVjdCBpZWVlODAyMTF2YXAgKnZhcCA9IG5pLT5uaV92YXA7CisJ c3RydWN0IGllZWU4MDIxMV9zYW1wbGVfbm9kZSAqc2FuID0gbmktPm5pX3JjdGxzOworCXN0cnVj dCBpZWVlODAyMTFfc2FtcGxlICpzYW1wbGUgPSBzYW4tPnNhbl9zYW1wbGU7CisJY29uc3Qgc3Ry dWN0IGllZWU4MDIxMV9yYXRlX3RhYmxlICpydCA9IGllZWU4MDIxMV9nZXRfcmF0ZXRhYmxlKHZh cC0+aXZfaWMtPmljX2N1cmNoYW4pOworCQorCWludCByaXgsIG1yciwgYmVzdF9yaXgsIGNoYW5n ZV9yYXRlczsKKwl1bnNpZ25lZCBhdmVyYWdlX3R4X3RpbWU7CisJCisJc2l6ZV90IGZyYW1lTGVu ID0gKHNpemVfdClpYXJnOworCWNvbnN0IGludCBzaXplX2JpbiA9IHNpemVfdG9fYmluKGZyYW1l TGVuKTsKKworCXNhbXBsZV91cGRhdGVfc3RhdGljX3JpeChuaSk7CisKKwlpZiAoc2FuLT5zdGF0 aWNfcml4ICE9IC0xKSB7CisJCXJpeCA9IHNhbi0+c3RhdGljX3JpeDsKKwkJZ290byBkb25lOwor CX0KKworCWlmICh2YXAtPml2X3JhdGUtPmlyX2NhcGFiaWxpdGllcyAmIElFRUU4MDIxMV9SQVRF Q1RMX0NBUF9NUlIpCisJCW1yciA9IDE7CisJaWYgKCEodmFwLT5pdl9yYXRlLT5pcl9jYXBhYmls aXRpZXMgJiBJRUVFODAyMTFfUkFURUNUTF9DQVBfTVJSUFJPVCkpCisJCW1yciA9IDA7CisKKwli ZXN0X3JpeCA9IHBpY2tfYmVzdF9yYXRlKG5pLCBydCwgc2l6ZV9iaW4sICFtcnIpOworCWlmIChi ZXN0X3JpeCA+PSAwKSB7CisJCWF2ZXJhZ2VfdHhfdGltZSA9IHNhbi0+c3RhdHNbc2l6ZV9iaW5d W2Jlc3Rfcml4XS5hdmVyYWdlX3R4X3RpbWU7CisJfSBlbHNlIHsKKwkJYXZlcmFnZV90eF90aW1l ID0gMDsKKwl9CisKKwkvKgorCSAqIExpbWl0IHRoZSB0aW1lIG1lYXN1cmluZyB0aGUgcGVyZm9y bWFuY2Ugb2Ygb3RoZXIgdHgKKwkgKiByYXRlcyB0byBzYW1wbGVfcmF0ZSUgb2YgdGhlIHRvdGFs IHRyYW5zbWlzc2lvbiB0aW1lLgorCSAqLworCWlmIChzYW4tPnNhbXBsZV90dFtzaXplX2Jpbl0g PCBhdmVyYWdlX3R4X3RpbWUgKiAoc2FuLT5wYWNrZXRzX3NpbmNlX3NhbXBsZVtzaXplX2Jpbl0g KgorCQlzYW1wbGUtPnNhbXBsZV9yYXRlLzEwMCkpIHsKKwkJcml4ID0gcGlja19zYW1wbGVfcmF0 ZShuaSwgcnQsIHNpemVfYmluKTsKKwkJSUVFRTgwMjExX05PVEUodmFwLCBJRUVFODAyMTFfTVNH X1JBVEVDVEwsCisJCSAgICAgJm5pLCAiYXR0ICVkIHNhbXBsZV90dCAlZCBzaXplICV1IHNhbXBs ZSByYXRlICVkICVzIGN1cnJlbnQgcmF0ZSAlZCAlcyIsCisJCSAgICAgYXZlcmFnZV90eF90aW1l LAorCQkgICAgIHNhbi0+c2FtcGxlX3R0W3NpemVfYmluXSwKKwkJICAgICBiaW5fdG9fc2l6ZShz aXplX2JpbiksCisJCSAgICAgZG90MTFyYXRlKHJ0LCByaXgpLAorCQkgICAgIGRvdDExcmF0ZV9s YWJlbChydCwgcml4KSwKKwkJICAgICBkb3QxMXJhdGUocnQsIHNhbi0+Y3VycmVudF9yaXhbc2l6 ZV9iaW5dKSwKKwkJICAgICBkb3QxMXJhdGVfbGFiZWwocnQsIHNhbi0+Y3VycmVudF9yaXhbc2l6 ZV9iaW5dKSk7CisJCWlmIChyaXggIT0gc2FuLT5jdXJyZW50X3JpeFtzaXplX2Jpbl0pIHsKKwkJ CXNhbi0+Y3VycmVudF9zYW1wbGVfcml4W3NpemVfYmluXSA9IHJpeDsKKwkJfSBlbHNlIHsKKwkJ CXNhbi0+Y3VycmVudF9zYW1wbGVfcml4W3NpemVfYmluXSA9IC0xOworCQl9CisJCXNhbi0+cGFj a2V0c19zaW5jZV9zYW1wbGVbc2l6ZV9iaW5dID0gMDsKKwl9IGVsc2UgeworCQljaGFuZ2VfcmF0 ZXMgPSAwOworCQlpZiAoIXNhbi0+cGFja2V0c19zZW50W3NpemVfYmluXSB8fCBiZXN0X3JpeCA9 PSAtMSkgeworCQkJLyogbm8gcGFja2V0IGhhcyBiZWVuIHNlbnQgc3VjY2Vzc2Z1bGx5IHlldCAq LworCQkJY2hhbmdlX3JhdGVzID0gMTsKKwkJCWlmIChuaS0+bmlfZmxhZ3MgJiBJRUVFODAyMTFf Tk9ERV9IVCkKKwkJCQliZXN0X3JpeCA9IHNhbXBsZV9waWNrX3NlZWRfcmF0ZV9odChuaSwgZnJh bWVMZW4pOworCQkJZWxzZQorCQkJCWJlc3Rfcml4ID0gc2FtcGxlX3BpY2tfc2VlZF9yYXRlX2xl Z2FjeShuaSwgZnJhbWVMZW4pOworCQl9IGVsc2UgaWYgKHNhbi0+cGFja2V0c19zZW50W3NpemVf YmluXSA8IDIwKSB7CisJCQkvKiBsZXQgdGhlIGJpdC1yYXRlIHN3aXRjaCBxdWlja2x5IGR1cmlu ZyB0aGUgZmlyc3QgZmV3IHBhY2tldHMgKi8KKwkJCUlFRUU4MDIxMV9OT1RFKHZhcCwKKwkJCSAg ICBJRUVFODAyMTFfTVNHX1JBVEVDVEwsICZuaSwKKwkJCSAgICAiJXM6IHN3aXRjaGluZyBxdWlj a2x5Li4iLCBfX2Z1bmNfXyk7CisJCQljaGFuZ2VfcmF0ZXMgPSAxOworCQl9IGVsc2UgaWYgKHRp Y2tzIC0gc2FtcGxlLT5zYW1wbGVfbWluX3N3aXRjaCA+IHNhbi0+dGlja3Nfc2luY2Vfc3dpdGNo W3NpemVfYmluXSkgeworCQkJLyogbWluX3N3aXRjaCBzZWNvbmRzIGhhdmUgZ29uZSBieSAqLwor CQkJSUVFRTgwMjExX05PVEUodmFwLAorCQkJICAgIElFRUU4MDIxMV9NU0dfUkFURUNUTCwgJm5p LAorCQkJICAgICIlczogbWluX3N3aXRjaCAlZCA+IHRpY2tzX3NpbmNlX3N3aXRjaCAlZC4uIiwK KwkJCSAgICBfX2Z1bmNfXywgdGlja3MgLSBzYW1wbGUtPnNhbXBsZV9taW5fc3dpdGNoLCBzYW4t PnRpY2tzX3NpbmNlX3N3aXRjaFtzaXplX2Jpbl0pOworCQkJY2hhbmdlX3JhdGVzID0gMTsKKwkJ fSBlbHNlIGlmICgoISAobmktPm5pX2ZsYWdzICYgSUVFRTgwMjExX05PREVfSFQpKSAmJgorCQkg ICAgKDIqYXZlcmFnZV90eF90aW1lIDwgc2FuLT5zdGF0c1tzaXplX2Jpbl1bc2FuLT5jdXJyZW50 X3JpeFtzaXplX2Jpbl1dLmF2ZXJhZ2VfdHhfdGltZSkpIHsKKwkJCS8qIHRoZSBjdXJyZW50IGJp dC1yYXRlIGlzIHR3aWNlIGFzIHNsb3cgYXMgdGhlIGJlc3Qgb25lICovCisJCQlJRUVFODAyMTFf Tk9URSh2YXAsCisJCQkgICAgSUVFRTgwMjExX01TR19SQVRFQ1RMLCAmbmksCisJCQkgICAgIiVz OiAyeCBhdHQgKD0gJWQpIDwgY3VyX3JpeCBhdHQgJWQiLAorCQkJICAgIF9fZnVuY19fLAorCQkJ ICAgIDIgKiBhdmVyYWdlX3R4X3RpbWUsIHNhbi0+c3RhdHNbc2l6ZV9iaW5dW3Nhbi0+Y3VycmVu dF9yaXhbc2l6ZV9iaW5dXS5hdmVyYWdlX3R4X3RpbWUpOworCQkJY2hhbmdlX3JhdGVzID0gMTsK KwkJfSBlbHNlIGlmICgobmktPm5pX2ZsYWdzICYgSUVFRTgwMjExX05PREVfSFQpKSB7CisJCQlp bnQgY3VyX3JpeCA9IHNhbi0+Y3VycmVudF9yaXhbc2l6ZV9iaW5dOworCQkJaW50IGN1cl9hdHQg PSBzYW4tPnN0YXRzW3NpemVfYmluXVtjdXJfcml4XS5hdmVyYWdlX3R4X3RpbWU7CisJCQkvKgor CQkJICogSWYgdGhlIG5vZGUgaXMgSFQsIHVwZ3JhZGUgaXQgaWYgdGhlIE1DUyByYXRlIGlzCisJ CQkgKiBoaWdoZXIgYW5kIHRoZSBhdmVyYWdlIHR4IHRpbWUgaXMgd2l0aGluIDIwJSBvZgorCQkJ ICogdGhlIGN1cnJlbnQgcmF0ZS4gSXQgY2FuIGZhaWwgYSBsaXR0bGUuCisJCQkgKgorCQkJICog VGhpcyBpcyBsaWtlbHkgbm90IG9wdGltYWwhCisJCQkgKi8KKyNpZiAwCisJCQlwcmludGYoImN1 ciByaXgvYXR0ICV4LyVkLCBiZXN0IHJpeC9hdHQgJXgvJWRcbiIsCisJCQkgICAgTUNTKGN1cl9y aXgpLCBjdXJfYXR0LCBNQ1MoYmVzdF9yaXgpLCBhdmVyYWdlX3R4X3RpbWUpOworI2VuZGlmCisJ CQlpZiAoKE1DUyhiZXN0X3JpeCkgPiBNQ1MoY3VyX3JpeCkpICYmCisJCQkgICAgKGF2ZXJhZ2Vf dHhfdGltZSAqIDgpIDw9IChjdXJfYXR0ICogMTApKSB7CisJCQkJSUVFRTgwMjExX05PVEUodmFw LAorCQkJCSAgICBJRUVFODAyMTFfTVNHX1JBVEVDVEwsICZuaSwKKwkJCQkgICAgIiVzOiBIVDog YmVzdF9yaXggMHglZCA+IGN1cl9yaXggMHgleCwgYXZlcmFnZV90eF90aW1lICVkLCBjdXJfYXR0 ICVkIiwKKwkJCQkgICAgX19mdW5jX18sCisJCQkJICAgIE1DUyhiZXN0X3JpeCksIE1DUyhjdXJf cml4KSwgYXZlcmFnZV90eF90aW1lLCBjdXJfYXR0KTsKKwkJCQljaGFuZ2VfcmF0ZXMgPSAxOwor CQkJfQorCQl9CisKKwkJc2FuLT5wYWNrZXRzX3NpbmNlX3NhbXBsZVtzaXplX2Jpbl0rKzsKKwkJ CisJCWlmIChjaGFuZ2VfcmF0ZXMpIHsKKwkJCWlmIChiZXN0X3JpeCAhPSBzYW4tPmN1cnJlbnRf cml4W3NpemVfYmluXSkgeworCQkJCUlFRUU4MDIxMV9OT1RFKHZhcCwKKwkJCQkgICAgSUVFRTgw MjExX01TR19SQVRFQ1RMLAorCQkJCSAgICAmbmksCisiJXM6IHNpemUgJWQgc3dpdGNoIHJhdGUg JWQgKCVkLyVkKSAtPiAlZCAoJWQvJWQpIGFmdGVyICVkIHBhY2tldHMgbXJyICVkIiwKKwkJCQkg ICAgX19mdW5jX18sCisJCQkJICAgIGJpbl90b19zaXplKHNpemVfYmluKSwKKwkJCQkgICAgUkFU RShzYW4tPmN1cnJlbnRfcml4W3NpemVfYmluXSksCisJCQkJICAgIHNhbi0+c3RhdHNbc2l6ZV9i aW5dW3Nhbi0+Y3VycmVudF9yaXhbc2l6ZV9iaW5dXS5hdmVyYWdlX3R4X3RpbWUsCisJCQkJICAg IHNhbi0+c3RhdHNbc2l6ZV9iaW5dW3Nhbi0+Y3VycmVudF9yaXhbc2l6ZV9iaW5dXS5wZXJmZWN0 X3R4X3RpbWUsCisJCQkJICAgIFJBVEUoYmVzdF9yaXgpLAorCQkJCSAgICBzYW4tPnN0YXRzW3Np emVfYmluXVtiZXN0X3JpeF0uYXZlcmFnZV90eF90aW1lLAorCQkJCSAgICBzYW4tPnN0YXRzW3Np emVfYmluXVtiZXN0X3JpeF0ucGVyZmVjdF90eF90aW1lLAorCQkJCSAgICBzYW4tPnBhY2tldHNf c2luY2Vfc3dpdGNoW3NpemVfYmluXSwKKwkJCQkgICAgbXJyKTsKKwkJCX0KKwkJCXNhbi0+cGFj a2V0c19zaW5jZV9zd2l0Y2hbc2l6ZV9iaW5dID0gMDsKKwkJCXNhbi0+Y3VycmVudF9yaXhbc2l6 ZV9iaW5dID0gYmVzdF9yaXg7CisJCQlzYW4tPnRpY2tzX3NpbmNlX3N3aXRjaFtzaXplX2Jpbl0g PSB0aWNrczsKKwkJCS8qIAorCQkJICogU2V0IHRoZSB2aXNpYmxlIHR4cmF0ZSBmb3IgdGhpcyBu b2RlLgorCQkJICovCisJCQluaS0+bmlfdHhyYXRlID0gZG90MTFyYXRlKHJ0LCBiZXN0X3JpeCk7 CisJCX0KKwkJcml4ID0gc2FuLT5jdXJyZW50X3JpeFtzaXplX2Jpbl07CisJCXNhbi0+cGFja2V0 c19zaW5jZV9zd2l0Y2hbc2l6ZV9iaW5dKys7CisJfQorCS8vICp0cnkwID0gbXJyID8gc2FuLT5z Y2hlZFtyaXhdLnQwIDogQVRIX1RYTUFYVFJZOworZG9uZToKKworCS8qCisJICogVGhpcyBidWcg dG90YWxseSBzdWNrcyBhbmQgc2hvdWxkIGJlIGZpeGVkLgorCSAqCisJICogRm9yIG5vdyB0aG91 Z2gsIGxldCdzIG5vdCBwYW5pYywgc28gd2UgY2FuIHN0YXJ0IHRvIGZpZ3VyZQorCSAqIG91dCBo b3cgdG8gYmV0dGVyIHJlcHJvZHVjZSBpdC4KKwkgKi8KKwlpZiAocml4IDwgMCB8fCByaXggPj0g cnQtPnJhdGVDb3VudCkgeworCQlwcmludGYoIiVzOiBFUlJPUjogcml4ICVkIG91dCBvZiBib3Vu ZHMgKHJhdGVDb3VudD0lZClcbiIsCisJCSAgICBfX2Z1bmNfXywKKwkJICAgIHJpeCwKKwkJICAg IHJ0LT5yYXRlQ291bnQpOworCQkgICAgcml4ID0gMDsJLyogWFhYIGp1c3QgZGVmYXVsdCBmb3Ig bm93ICovCisJfQorCUtBU1NFUlQocml4ID49IDAgJiYgcml4IDwgcnQtPnJhdGVDb3VudCwgKCJy aXggaXMgJWQiLCByaXgpKTsKKworCS8vICpyaXgwID0gcml4OworCS8vICp0eHJhdGUgPSBydC0+ aW5mb1tyaXhdLnJhdGVDb2RlCisJLy8gCXwgKHNob3J0UHJlYW1ibGUgPyBydC0+aW5mb1tyaXhd LnNob3J0UHJlYW1ibGUgOiAwKTsKKwlzYW4tPnBhY2tldHNfc2VudFtzaXplX2Jpbl0rKzsKKwor CXJldHVybiByaXg7CisjdW5kZWYgRE9UMTFSQVRFCisjdW5kZWYgTUNTCisjdW5kZWYgUkFURQor fQorCitzdGF0aWMgdm9pZAorc2FtcGxlX3JhdGVzKHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqbmks IHN0cnVjdCBpZWVlODAyMTFfcmNfaW5mbyAqcmNfaW5mbykKK3sKKwlzdHJ1Y3QgaWVlZTgwMjEx X3NhbXBsZV9ub2RlICpzYW4gPSBuaS0+bmlfcmN0bHM7CisJdWludDhfdCByaXgwID0gc2FtcGxl X3JhdGUobmksIE5VTEwsIDApOworCWNvbnN0IHN0cnVjdCB0eHNjaGVkdWxlICpzY2hlZCA9ICZz YW4tPnNjaGVkW3JpeDBdOworCXN0cnVjdCBpZWVlODAyMTFfcmNfc2VyaWVzICpyYyA9IHJjX2lu Zm8tPnJpX3JjOworCisJS0FTU0VSVChyaXgwID09IHNjaGVkLT5yMCwgKCJyaXgwICgleCkgIT0g c2NoZWQtPnIwICgleCkhXG4iLAorCSAgICByaXgwLCBzY2hlZC0+cjApKTsKKwkvKiBYWFggKi8K KwlyY1swXS5mbGFncyA9IHJjWzFdLmZsYWdzID0gcmNbMl0uZmxhZ3MgPSByY1szXS5mbGFncyA9 IDA7CisKKwlyY1swXS5yaXggPSBzY2hlZC0+cjA7CisJcmNbMV0ucml4ID0gc2NoZWQtPnIxOwor CXJjWzJdLnJpeCA9IHNjaGVkLT5yMjsKKwlyY1szXS5yaXggPSBzY2hlZC0+cjM7CisKKwlyY1sw XS50cmllcyA9IHNjaGVkLT50MDsKKwlyY1sxXS50cmllcyA9IHNjaGVkLT50MTsKKwlyY1syXS50 cmllcyA9IHNjaGVkLT50MjsKKwlyY1szXS50cmllcyA9IHNjaGVkLT50MzsKK30KKworc3RhdGlj IHZvaWQKK3VwZGF0ZV9zdGF0cyhjb25zdCBzdHJ1Y3QgaWVlZTgwMjExdmFwICp2YXAsCisgICAg CSAgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9ub2RlICpuaSwKKwkJICBpbnQgZnJhbWVfc2l6ZSwK KwkJICBpbnQgcml4MCwgaW50IHRyaWVzMCwKKwkJICBpbnQgcml4MSwgaW50IHRyaWVzMSwKKwkJ ICBpbnQgcml4MiwgaW50IHRyaWVzMiwKKwkJICBpbnQgcml4MywgaW50IHRyaWVzMywKKwkJICBp bnQgc2hvcnRfdHJpZXMsIGludCB0cmllcywKKwkJICBpbnQgbmZyYW1lcywgaW50IG5iYWQpCit7 CisJc3RydWN0IGllZWU4MDIxMV9zYW1wbGVfbm9kZSAqc2FuID0gbmktPm5pX3JjdGxzOworCXN0 cnVjdCBpZWVlODAyMTFfc2FtcGxlICpzYW1wbGUgPSBzYW4tPnNhbl9zYW1wbGU7CisKKwljb25z dCBpbnQgc2l6ZV9iaW4gPSBzaXplX3RvX2JpbihmcmFtZV9zaXplKTsKKwljb25zdCBpbnQgc2l6 ZSA9IGJpbl90b19zaXplKHNpemVfYmluKTsKKworCWludCBpc19odDQwID0gaWVlZTgwMjExX3Jh dGVjdGxfaGFzY2FwX2N3NDAodmFwLCBuaSk7CisJaW50IHR0LCB0cmllc19zb19mYXI7CisJaW50 IHBjdDsKKworCWlmICghSVNfUkFURV9ERUZJTkVEKHNhbiwgcml4MCkpCisJCXJldHVybjsKKwl0 dCA9IGNhbGNfdXNlY3NfdW5pY2FzdF9wYWNrZXQodmFwLCBzaXplLCByaXgwLCBzaG9ydF90cmll cywKKwkJTUlOKHRyaWVzMCwgdHJpZXMpIC0gMSwgaXNfaHQ0MCk7CisJdHJpZXNfc29fZmFyID0g dHJpZXMwOworCisJaWYgKHRyaWVzMSAmJiB0cmllc19zb19mYXIgPCB0cmllcykgeworCQlpZiAo IUlTX1JBVEVfREVGSU5FRChzYW4sIHJpeDEpKQorCQkJcmV0dXJuOworCQl0dCArPSBjYWxjX3Vz ZWNzX3VuaWNhc3RfcGFja2V0KHZhcCwgc2l6ZSwgcml4MSwgc2hvcnRfdHJpZXMsCisJCQlNSU4o dHJpZXMxICsgdHJpZXNfc29fZmFyLCB0cmllcykgLSB0cmllc19zb19mYXIgLSAxLCBpc19odDQw KTsKKwkJdHJpZXNfc29fZmFyICs9IHRyaWVzMTsKKwl9CisKKwlpZiAodHJpZXMyICYmIHRyaWVz X3NvX2ZhciA8IHRyaWVzKSB7CisJCWlmICghSVNfUkFURV9ERUZJTkVEKHNhbiwgcml4MikpCisJ CQlyZXR1cm47CisJCXR0ICs9IGNhbGNfdXNlY3NfdW5pY2FzdF9wYWNrZXQodmFwLCBzaXplLCBy aXgyLCBzaG9ydF90cmllcywKKwkJCU1JTih0cmllczIgKyB0cmllc19zb19mYXIsIHRyaWVzKSAt IHRyaWVzX3NvX2ZhciAtIDEsIGlzX2h0NDApOworCQl0cmllc19zb19mYXIgKz0gdHJpZXMyOwor CX0KKworCWlmICh0cmllczMgJiYgdHJpZXNfc29fZmFyIDwgdHJpZXMpIHsKKwkJaWYgKCFJU19S QVRFX0RFRklORUQoc2FuLCByaXgzKSkKKwkJCXJldHVybjsKKwkJdHQgKz0gY2FsY191c2Vjc191 bmljYXN0X3BhY2tldCh2YXAsIHNpemUsIHJpeDMsIHNob3J0X3RyaWVzLAorCQkJTUlOKHRyaWVz MyArIHRyaWVzX3NvX2ZhciwgdHJpZXMpIC0gdHJpZXNfc29fZmFyIC0gMSwgaXNfaHQ0MCk7CisJ fQorCisJaWYgKHNhbi0+c3RhdHNbc2l6ZV9iaW5dW3JpeDBdLnRvdGFsX3BhY2tldHMgPCBzYW1w bGUtPnNhbnBsZV9zbW9vdGhpbmdfbWlucGFja2V0cykgeworCQkvKiBqdXN0IGF2ZXJhZ2UgdGhl IGZpcnN0IGZldyBwYWNrZXRzICovCisJCWludCBhdmdfdHggPSBzYW4tPnN0YXRzW3NpemVfYmlu XVtyaXgwXS5hdmVyYWdlX3R4X3RpbWU7CisJCWludCBwYWNrZXRzID0gc2FuLT5zdGF0c1tzaXpl X2Jpbl1bcml4MF0udG90YWxfcGFja2V0czsKKwkJc2FuLT5zdGF0c1tzaXplX2Jpbl1bcml4MF0u YXZlcmFnZV90eF90aW1lID0gKHR0KyhhdmdfdHgqcGFja2V0cykpLyhwYWNrZXRzK25mcmFtZXMp OworCX0gZWxzZSB7CisJCS8qIHVzZSBhIGV3bWEgKi8KKwkJc2FuLT5zdGF0c1tzaXplX2Jpbl1b cml4MF0uYXZlcmFnZV90eF90aW1lID0gCisJCQkoKHNhbi0+c3RhdHNbc2l6ZV9iaW5dW3JpeDBd LmF2ZXJhZ2VfdHhfdGltZSAqIHNhbXBsZS0+c2FucGxlX3Ntb290aGluZ19yYXRlKSArIAorCQkJ ICh0dCAqICgxMDAgLSBzYW1wbGUtPnNhbnBsZV9zbW9vdGhpbmdfcmF0ZSkpKSAvIDEwMDsKKwl9 CisJCisJLyoKKwkgKiBYWFggRG9uJ3QgbWFyayB0aGUgaGlnaGVyIGJpdCByYXRlcyBhcyBhbHNv IGhhdmluZyBmYWlsZWQ7IGFzIHRoaXMKKwkgKiB1bmZvcnR1bmF0ZWx5IHN0b3BzIHRob3NlIHJh dGVzIGZyb20gYmVpbmcgdGFzdGVkIHdoZW4gdHJ5aW5nIHRvCisJICogVFguIFRoaXMgaGFwcGVu cyB3aXRoIDExbiBhZ2dyZWdhdGlvbi4KKwkgKi8KKwlpZiAobmZyYW1lcyA9PSBuYmFkKSB7CisJ CXNhbi0+c3RhdHNbc2l6ZV9iaW5dW3JpeDBdLnN1Y2Nlc3NpdmVfZmFpbHVyZXMgKz0gbmJhZDsK KworCX0gZWxzZSB7CisJCXNhbi0+c3RhdHNbc2l6ZV9iaW5dW3JpeDBdLnBhY2tldHNfYWNrZWQg Kz0gKG5mcmFtZXMgLSBuYmFkKTsKKwkJc2FuLT5zdGF0c1tzaXplX2Jpbl1bcml4MF0uc3VjY2Vz c2l2ZV9mYWlsdXJlcyA9IDA7CisJfQorCXNhbi0+c3RhdHNbc2l6ZV9iaW5dW3JpeDBdLnRyaWVz ICs9IHRyaWVzOworCXNhbi0+c3RhdHNbc2l6ZV9iaW5dW3JpeDBdLmxhc3RfdHggPSB0aWNrczsK KwlzYW4tPnN0YXRzW3NpemVfYmluXVtyaXgwXS50b3RhbF9wYWNrZXRzICs9IG5mcmFtZXM7CisK KwkvKiB1cGRhdGUgRVdNQSBmb3IgdGhpcyByaXggKi8KKworCS8qIENhbGN1bGF0ZSBwZXJjZW50 YWdlIGJhc2VkIG9uIGN1cnJlbnQgcmF0ZSAqLworCWlmIChuZnJhbWVzID09IDApCisJCW5mcmFt ZXMgPSBuYmFkID0gMTsKKwlwY3QgPSAoKG5mcmFtZXMgLSBuYmFkKSAqIDEwMDApIC8gbmZyYW1l czsKKworCWlmIChzYW4tPnN0YXRzW3NpemVfYmluXVtyaXgwXS50b3RhbF9wYWNrZXRzIDwKKwkg ICAgc2FtcGxlLT5zYW5wbGVfc21vb3RoaW5nX21pbnBhY2tldHMpIHsKKwkJLyoganVzdCBhdmVy YWdlIHRoZSBmaXJzdCBmZXcgcGFja2V0cyAqLworCQlpbnQgYV9wY3QgPSAoc2FuLT5zdGF0c1tz aXplX2Jpbl1bcml4MF0ucGFja2V0c19hY2tlZCAqIDEwMDApIC8KKwkJICAgIChzYW4tPnN0YXRz W3NpemVfYmluXVtyaXgwXS50b3RhbF9wYWNrZXRzKTsKKwkJc2FuLT5zdGF0c1tzaXplX2Jpbl1b cml4MF0uZXdtYV9wY3QgPSBhX3BjdDsKKwl9IGVsc2UgeworCQkvKiB1c2UgYSBld21hICovCisJ CXNhbi0+c3RhdHNbc2l6ZV9iaW5dW3JpeDBdLmV3bWFfcGN0ID0KKwkJCSgoc2FuLT5zdGF0c1tz aXplX2Jpbl1bcml4MF0uZXdtYV9wY3QgKiBzYW1wbGUtPnNhbnBsZV9zbW9vdGhpbmdfcmF0ZSkg KworCQkJIChwY3QgKiAoMTAwIC0gc2FtcGxlLT5zYW5wbGVfc21vb3RoaW5nX3JhdGUpKSkgLyAx MDA7CisJfQorCisJaWYgKHJpeDAgPT0gc2FuLT5jdXJyZW50X3NhbXBsZV9yaXhbc2l6ZV9iaW5d KSB7CisJCXNhbi0+c2FtcGxlX3R0W3NpemVfYmluXSA9IHR0OworCQlzYW4tPmN1cnJlbnRfc2Ft cGxlX3JpeFtzaXplX2Jpbl0gPSAtMTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitzYW1wbGVfdHhf Y29tcGxldGUoY29uc3Qgc3RydWN0IGllZWU4MDIxMXZhcCAqdmFwLAorICAgIGNvbnN0IHN0cnVj dCBpZWVlODAyMTFfbm9kZSAqbmksIGludCBvaywKKyAgICB2b2lkICphcmcxLCB2b2lkICphcmcy KQoreworCXN0cnVjdCBpZWVlODAyMTFfc2FtcGxlX25vZGUgKnNhbiA9IG5pLT5uaV9yY3RsczsK Kwljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JhdGVfdGFibGUgKnJ0ID0gaWVlZTgwMjExX2dldF9y YXRldGFibGUodmFwLT5pdl9pYy0+aWNfY3VyY2hhbik7CisKKwkvKiBYWFggbmVlZCB0byBjaGFu Z2UgYXJnMiB0byBwb2ludGVyIG9mIGllZWU4MDIxMV9yY19pbmZvICovCisJc3RydWN0IGllZWU4 MDIxMV9yY19pbmZvICpyY19pbmZvID0gKHN0cnVjdCBpZWVlODAyMTFfcmNfaW5mbyopYXJnMjsK KworCWludCBmaW5hbF9yaXgsIHNob3J0X3RyaWVzLCBsb25nX3RyaWVzOworCWludCBuZnJhbWVz LCBuYmFkOworCWludCBmcmFtZV9zaXplLCBtcnI7CisKKwlmaW5hbF9yaXggPSBydC0+cmF0ZUNv ZGVUb0luZGV4W3JjX2luZm8tPnJpX3R4cmF0ZV07CisJc2hvcnRfdHJpZXMgPSByY19pbmZvLT5y aV9zaG9ydHJldHJ5OworCS8qIFhYWCB3aHkgcGx1cyAxIGhlcmU/ICovCisJbG9uZ190cmllcyA9 IHJjX2luZm8tPnJpX2xvbmdyZXRyeSArIDE7CisKKwluZnJhbWVzID0gcmNfaW5mby0+cmlfdHhj bnQ7CisJbmJhZCA9IHJjX2luZm8tPnJpX2ZhaWxjbnQ7CisKKwlmcmFtZV9zaXplID0gcmNfaW5m by0+cmlfZnJhbWVsZW47CisJbXJyID0gMDsKKworCWlmIChuZnJhbWVzID09IDApIHsKKwkJcmV0 dXJuOworCX0KKworCWlmIChmcmFtZV9zaXplID09IDApCQkgICAgLyogTkI6IHNob3VsZCBub3Qg aGFwcGVuICovCisJCWZyYW1lX3NpemUgPSAxNTAwOworCisJaWYgKHNhbi0+cmF0ZW1hc2sgPT0g MCkgeworCQlyZXR1cm47CisJfQorCQorCWlmICh2YXAtPml2X3JhdGUtPmlyX2NhcGFiaWxpdGll cyAmIElFRUU4MDIxMV9SQVRFQ1RMX0NBUF9NUlIpCisJCW1yciA9IDE7CisJLyogWFhYIGNoZWNr IEhUIHByb3Rtb2RlIHRvbyAqLworCWlmIChtcnIgJiYgISh2YXAtPml2X3JhdGUtPmlyX2NhcGFi aWxpdGllcyAmIElFRUU4MDIxMV9SQVRFQ1RMX0NBUF9NUlJQUk9UKSkKKwkJbXJyID0gMDsKKwor CWlmICghbXJyIHx8IHJjX2luZm8tPnJpX2ZpbmFsdHNpID09IDApIHsKKwkJaWYgKCFJU19SQVRF X0RFRklORUQoc2FuLCBmaW5hbF9yaXgpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJLyoKKwkJICog T25seSBvbmUgcmF0ZSB3YXMgdXNlZDsgb3B0aW1pemUgd29yay4KKwkJICovCisJCXVwZGF0ZV9z dGF0cyh2YXAsIG5pLCBmcmFtZV9zaXplLCAKKwkJCSAgICAgZmluYWxfcml4LCBsb25nX3RyaWVz LAorCQkJICAgICAwLCAwLAorCQkJICAgICAwLCAwLAorCQkJICAgICAwLCAwLAorCQkJICAgICBz aG9ydF90cmllcywgbG9uZ190cmllcywKKwkJCSAgICAgbmZyYW1lcywgbmJhZCk7CisKKwl9IGVs c2UgeworCQlpbnQgZmluYWxUU0lkeCA9IHJjX2luZm8tPnJpX2ZpbmFsdHNpOworCQlpbnQgaTsK KworCQkvKgorCQkgKiBOQjogc2VyaWVzID4gMCBhcmUgbm90IHBlbmFsaXplZCBmb3IgZmFpbHVy ZQorCQkgKiBiYXNlZCBvbiB0aGUgdHJ5IGNvdW50cyB1bmRlciB0aGUgYXNzdW1wdGlvbgorCQkg KiB0aGF0IGxvc3NlcyBhcmUgb2Z0ZW4gYnVyc3R5IGFuZCBzaW5jZSB3ZQorCQkgKiBzYW1wbGUg aGlnaGVyIHJhdGVzIDEgdHJ5IGF0IGEgdGltZSBkb2luZyBzbworCQkgKiBtYXkgdW5mYWlybHkg cGVuYWxpemUgdGhlbS4KKwkJICovCisJCWlmIChyY1swXS50cmllcykgeworCQkJdXBkYXRlX3N0 YXRzKHZhcCwgbmksIGZyYW1lX3NpemUsCisJCQkJICAgICByY1swXS5yaXgsIHJjWzBdLnRyaWVz LAorCQkJCSAgICAgcmNbMV0ucml4LCByY1sxXS50cmllcywKKwkJCQkgICAgIHJjWzJdLnJpeCwg cmNbMl0udHJpZXMsCisJCQkJICAgICByY1szXS5yaXgsIHJjWzNdLnRyaWVzLAorCQkJCSAgICAg c2hvcnRfdHJpZXMsIGxvbmdfdHJpZXMsCisJCQkJICAgICBuZnJhbWVzLCBuYmFkKTsKKwkJCWxv bmdfdHJpZXMgLT0gcmNbMF0udHJpZXM7CisJCX0KKwkJCisJCWlmIChyY1sxXS50cmllcyAmJiBm aW5hbFRTSWR4ID4gMCkgeworCQkJdXBkYXRlX3N0YXRzKHZhcCwgbmksIGZyYW1lX3NpemUsCisJ CQkJICAgICByY1sxXS5yaXgsIHJjWzFdLnRyaWVzLAorCQkJCSAgICAgcmNbMl0ucml4LCByY1sy XS50cmllcywKKwkJCQkgICAgIHJjWzNdLnJpeCwgcmNbM10udHJpZXMsCisJCQkJICAgICAwLCAw LAorCQkJCSAgICAgc2hvcnRfdHJpZXMsIGxvbmdfdHJpZXMsCisJCQkJICAgICBuZnJhbWVzLCBu YmFkKTsKKwkJCWxvbmdfdHJpZXMgLT0gcmNbMV0udHJpZXM7CisJCX0KKworCQlpZiAocmNbMl0u dHJpZXMgJiYgZmluYWxUU0lkeCA+IDEpIHsKKwkJCXVwZGF0ZV9zdGF0cyh2YXAsIG5pLCBmcmFt ZV9zaXplLAorCQkJCSAgICAgcmNbMl0ucml4LCByY1syXS50cmllcywKKwkJCQkgICAgIHJjWzNd LnJpeCwgcmNbM10udHJpZXMsCisJCQkJICAgICAwLCAwLAorCQkJCSAgICAgMCwgMCwKKwkJCQkg ICAgIHNob3J0X3RyaWVzLCBsb25nX3RyaWVzLAorCQkJCSAgICAgbmZyYW1lcywgbmJhZCk7CisJ CQlsb25nX3RyaWVzIC09IHJjWzJdLnRyaWVzOworCQl9CisKKwkJaWYgKHJjWzNdLnRyaWVzICYm IGZpbmFsVFNJZHggPiAyKSB7CisJCQl1cGRhdGVfc3RhdHModmFwLCBuaSwgZnJhbWVfc2l6ZSwK KwkJCQkgICAgIHJjWzNdLnJpeCwgcmNbM10udHJpZXMsCisJCQkJICAgICAwLCAwLAorCQkJCSAg ICAgMCwgMCwKKwkJCQkgICAgIDAsIDAsCisJCQkJICAgICBzaG9ydF90cmllcywgbG9uZ190cmll cywKKwkJCQkgICAgIG5mcmFtZXMsIG5iYWQpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZAor c2FtcGxlX3R4X3VwZGF0ZShjb25zdCBzdHJ1Y3QgaWVlZTgwMjExdmFwICp2YXAsIGNvbnN0IHN0 cnVjdCBpZWVlODAyMTFfbm9kZSAqbmksCisgICAgdm9pZCAqYXJnMSwgdm9pZCAqYXJnMiwgdm9p ZCAqYXJnMykKK3sKKwkvKiBub3RoaW5nIGhlcmUuICovCit9CisKK3N0YXRpYyB2b2lkCitzYW1w bGVfc2V0aW50ZXJ2YWwoY29uc3Qgc3RydWN0IGllZWU4MDIxMXZhcCAqdmFwLCBpbnQgbXNlY3Mp Cit7CisJc3RydWN0IGllZWU4MDIxMV9zYW1wbGUgKnNhbXBsZSA9IHZhcC0+aXZfcnM7CisJaW50 IHQ7CisKKwlpZiAobXNlY3MgPCAxMDApCisJCW1zZWNzID0gMTAwOworCXQgPSBtc2Vjc190b190 aWNrcyhtc2Vjcyk7CisJLyogaWVlZTgwMjExX3NhbXBsZSBkb2Vzbid0IGhhdmUgdGhlIHNhbXBs ZV9pbnRlcnZhbCBmaWVsZCBieSBub3cgKi8KKwkvLyBzYW1wbGUtPnNhbXBsZV9pbnRlcnZhbCA9 ICh0IDwgMSkgPyAxIDogdDsKK30KKworc3RhdGljIHZvaWQKK3NhbXBsZV9zdGF0cyh2b2lkICph cmcsIHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqbmkpCit7CisJc3RydWN0IGllZWU4MDIxMXZhcCAq dmFwID0gbmktPm5pX3ZhcDsKKwlzdHJ1Y3QgaWVlZTgwMjExX3NhbXBsZV9ub2RlICpzYW4gPSBu aS0+bmlfcmN0bHM7CisJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yYXRlX3RhYmxlICpydCA9IGll ZWU4MDIxMV9nZXRfcmF0ZXRhYmxlKHZhcC0+aXZfaWMtPmljX2N1cmNoYW4pOworCXVpbnQ2NF90 IG1hc2s7CisJaW50IHJpeCwgeTsKKworCXByaW50ZigiXG5bJXNdIHJlZmNudCAlZCBzdGF0aWNf cml4ICglZCAlcykgcmF0ZW1hc2sgMHglanhcbiIsCisJICAgIGV0aGVyX3NwcmludGYobmktPm5p X21hY2FkZHIpLCBpZWVlODAyMTFfbm9kZV9yZWZjbnQobmkpLAorCSAgICBkb3QxMXJhdGUocnQs IHNhbi0+c3RhdGljX3JpeCksCisJICAgIGRvdDExcmF0ZV9sYWJlbChydCwgc2FuLT5zdGF0aWNf cml4KSwKKwkgICAgKHVpbnRtYXhfdClzYW4tPnJhdGVtYXNrKTsKKwlmb3IgKHkgPSAwOyB5IDwg TlVNX1BBQ0tFVF9TSVpFX0JJTlM7IHkrKykgeworCQlwcmludGYoIlslNHVdIGN1ciByaXggJWQg KCVkICVzKSBzaW5jZSBzd2l0Y2g6IHBhY2tldHMgJWQgdGlja3MgJXVcbiIsCisJCSAgICBiaW5f dG9fc2l6ZSh5KSwgc2FuLT5jdXJyZW50X3JpeFt5XSwKKwkJICAgIGRvdDExcmF0ZShydCwgc2Fu LT5jdXJyZW50X3JpeFt5XSksCisJCSAgICBkb3QxMXJhdGVfbGFiZWwocnQsIHNhbi0+Y3VycmVu dF9yaXhbeV0pLAorCQkgICAgc2FuLT5wYWNrZXRzX3NpbmNlX3N3aXRjaFt5XSwgc2FuLT50aWNr c19zaW5jZV9zd2l0Y2hbeV0pOworCQlwcmludGYoIlslNHVdIGxhc3Qgc2FtcGxlICglZCAlcykg Y3VyIHNhbXBsZSAoJWQgJXMpIHBhY2tldHMgc2VudCAlZFxuIiwKKwkJICAgIGJpbl90b19zaXpl KHkpLAorCQkgICAgZG90MTFyYXRlKHJ0LCBzYW4tPmxhc3Rfc2FtcGxlX3JpeFt5XSksCisJCSAg ICBkb3QxMXJhdGVfbGFiZWwocnQsIHNhbi0+bGFzdF9zYW1wbGVfcml4W3ldKSwKKwkJICAgIGRv dDExcmF0ZShydCwgc2FuLT5jdXJyZW50X3NhbXBsZV9yaXhbeV0pLAorCQkgICAgZG90MTFyYXRl X2xhYmVsKHJ0LCBzYW4tPmN1cnJlbnRfc2FtcGxlX3JpeFt5XSksCisJCSAgICBzYW4tPnBhY2tl dHNfc2VudFt5XSk7CisJCXByaW50ZigiWyU0dV0gcGFja2V0cyBzaW5jZSBzYW1wbGUgJWQgc2Ft cGxlIHR0ICV1XG4iLAorCQkgICAgYmluX3RvX3NpemUoeSksIHNhbi0+cGFja2V0c19zaW5jZV9z YW1wbGVbeV0sCisJCSAgICBzYW4tPnNhbXBsZV90dFt5XSk7CisJfQorCWZvciAobWFzayA9IHNh bi0+cmF0ZW1hc2ssIHJpeCA9IDA7IG1hc2sgIT0gMDsgbWFzayA+Pj0gMSwgcml4KyspIHsKKwkJ aWYgKChtYXNrICYgMSkgPT0gMCkKKwkJCQljb250aW51ZTsKKwkJZm9yICh5ID0gMDsgeSA8IE5V TV9QQUNLRVRfU0laRV9CSU5TOyB5KyspIHsKKwkJCWlmIChzYW4tPnN0YXRzW3ldW3JpeF0udG90 YWxfcGFja2V0cyA9PSAwKQorCQkJCWNvbnRpbnVlOworCQkJcHJpbnRmKCJbJTJ1ICVzOiU0dV0g JThqdTolLThqdSAoJTNkJSUpIChFV01BICUzZC4lMWQlJSkgVCAlOGp1IEYgJTRkIGF2ZyAlNXUg bGFzdCAldVxuIiwKKwkJCSAgICBkb3QxMXJhdGUocnQsIHJpeCksIGRvdDExcmF0ZV9sYWJlbChy dCwgcml4KSwKKwkJCSAgICBiaW5fdG9fc2l6ZSh5KSwKKwkJCSAgICAodWludG1heF90KSBzYW4t PnN0YXRzW3ldW3JpeF0udG90YWxfcGFja2V0cywKKwkJCSAgICAodWludG1heF90KSBzYW4tPnN0 YXRzW3ldW3JpeF0ucGFja2V0c19hY2tlZCwKKwkJCSAgICAoaW50KSAoKHNhbi0+c3RhdHNbeV1b cml4XS5wYWNrZXRzX2Fja2VkICogMTAwVUxMKSAvCisJCQkgICAgIHNhbi0+c3RhdHNbeV1bcml4 XS50b3RhbF9wYWNrZXRzKSwKKwkJCSAgICBzYW4tPnN0YXRzW3ldW3JpeF0uZXdtYV9wY3QgLyAx MCwKKwkJCSAgICBzYW4tPnN0YXRzW3ldW3JpeF0uZXdtYV9wY3QgJSAxMCwKKwkJCSAgICAodWlu dG1heF90KSBzYW4tPnN0YXRzW3ldW3JpeF0udHJpZXMsCisJCQkgICAgc2FuLT5zdGF0c1t5XVty aXhdLnN1Y2Nlc3NpdmVfZmFpbHVyZXMsCisJCQkgICAgc2FuLT5zdGF0c1t5XVtyaXhdLmF2ZXJh Z2VfdHhfdGltZSwKKwkJCSAgICB0aWNrcyAtIHNhbi0+c3RhdHNbeV1bcml4XS5sYXN0X3R4KTsK KwkJfQorCX0KK30KKworc3RhdGljIGludAorc2FtcGxlX3N5c2N0bF9zdGF0cyhTWVNDVExfSEFO RExFUl9BUkdTKQoreworCXN0cnVjdCBpZWVlODAyMTF2YXAgKnZhcCA9IGFyZzE7CisJc3RydWN0 IGllZWU4MDIxMWNvbSAqaWMgPSB2YXAtPml2X2lmcC0+aWZfbDJjb207CisJaW50IGVycm9yLCB2 OworCisJdiA9IDA7CisJZXJyb3IgPSBzeXNjdGxfaGFuZGxlX2ludChvaWRwLCAmdiwgMCwgcmVx KTsKKwlpZiAoZXJyb3IgfHwgIXJlcS0+bmV3cHRyKQorCQlyZXR1cm4gZXJyb3I7CisJaWVlZTgw MjExX2l0ZXJhdGVfbm9kZXMoJmljLT5pY19zdGEsIHNhbXBsZV9zdGF0cywgTlVMTCk7CisJcmV0 dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3NhbXBsZV9zeXNjdGxfc21vb3RoaW5nX3JhdGUoU1lT Q1RMX0hBTkRMRVJfQVJHUykKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExdmFwICp2YXAgPSBhcmcxOwor CXN0cnVjdCBpZWVlODAyMTFfc2FtcGxlICpzYW1wbGUgPSB2YXAtPml2X3JzOworCWludCByYXRl LCBlcnJvcjsKKworCXJhdGUgPSBzYW1wbGUtPnNhbXBsZV9zbW9vdGhpbmdfcmF0ZTsKKwllcnJv ciA9IHN5c2N0bF9oYW5kbGVfaW50KG9pZHAsICZyYXRlLCAwLCByZXEpOworCWlmIChlcnJvciB8 fCAhcmVxLT5uZXdwdHIpCisJCXJldHVybiBlcnJvcjsKKwlpZiAoISgwIDw9IHJhdGUgJiYgcmF0 ZSA8IDEwMCkpCisJCXJldHVybiBFSU5WQUw7CisJc2FtcGxlLT5zYW1wbGVfc21vb3RoaW5nX3Jh dGUgPSByYXRlOworCXNhbXBsZS0+c2FtcGxlX3Ntb290aGluZ19taW5wYWNrZXRzID0gMTAwIC8g KDEwMCAtIHJhdGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitzYW1wbGVfc3lzY3Rs X3NhbXBsZV9yYXRlKFNZU0NUTF9IQU5ETEVSX0FSR1MpCit7CisJc3RydWN0IGllZWU4MDIxMXZh cCAqdmFwID0gYXJnMTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3NhbXBsZSAqc2FtcGxlID0gdmFwLT5p dl9yczsKKwlpbnQgcmF0ZSwgZXJyb3I7CisKKwlyYXRlID0gc2FtcGxlLT5zYW1wbGVfcmF0ZTsK KwllcnJvciA9IHN5c2N0bF9oYW5kbGVfaW50KG9pZHAsICZyYXRlLCAwLCByZXEpOworCWlmIChl cnJvciB8fCAhcmVxLT5uZXdwdHIpCisJCXJldHVybiBlcnJvcjsKKwlpZiAoISgyIDw9IHJhdGUg JiYgcmF0ZSA8PSAxMDApKQorCQlyZXR1cm4gRUlOVkFMOworCXNhbXBsZS0+c2FtcGxlX3JhdGUg PSByYXRlOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorc2FtcGxlX3N5c2N0bGF0dGFj aChzdHJ1Y3QgaWVlZTgwMjExdmFwICp2YXAsCisgICAgc3RydWN0IHN5c2N0bF9jdHhfbGlzdCAq Y3R4LCBzdHJ1Y3Qgc3lzY3RsX29pZCAqdHJlZSkKK3sKKwlTWVNDVExfQUREX1BST0MoY3R4LCBT WVNDVExfQ0hJTERSRU4odHJlZSksIE9JRF9BVVRPLAorCSAgICAic2FtcGxlX3Ntb290aGluZ19y YXRlIiwgQ1RMVFlQRV9JTlQgfCBDVExGTEFHX1JXLCB2YXAsIDAsCisJICAgIHNhbXBsZV9zeXNj dGxfc21vb3RoaW5nX3JhdGUsICJJIiwKKwkgICAgInNhbXBsZTogc21vb3RoaW5nIHJhdGUgZm9y IGF2ZyB0eCB0aW1lICglJSkiKTsKKwlTWVNDVExfQUREX1BST0MoY3R4LCBTWVNDVExfQ0hJTERS RU4odHJlZSksIE9JRF9BVVRPLAorCSAgICAic2FtcGxlX3JhdGUiLCBDVExUWVBFX0lOVCB8IENU TEZMQUdfUlcsIHZhcCwgMCwKKwkgICAgc2FtcGxlX3N5c2N0bF9zYW1wbGVfcmF0ZSwgIkkiLAor CSAgICAic2FtcGxlOiBwZXJjZW50IGFpciB0aW1lIGRldm90ZWQgdG8gc2FtcGxpbmcgbmV3IHJh dGVzICglJSkiKTsKKwkvKiBYWFggbWF4X3N1Y2Nlc3NpdmVfZmFpbHVyZXMsIHN0YWxlX2ZhaWx1 cmVfdGltZW91dCwgbWluX3N3aXRjaCAqLworCVNZU0NUTF9BRERfUFJPQyhjdHgsIFNZU0NUTF9D SElMRFJFTih0cmVlKSwgT0lEX0FVVE8sCisJICAgICJzYW1wbGVfc3RhdHMiLCBDVExUWVBFX0lO VCB8IENUTEZMQUdfUlcsIHZhcCwgMCwKKwkgICAgc2FtcGxlX3N5c2N0bF9zdGF0cywgIkkiLCAi c2FtcGxlOiBwcmludCBzdGF0aXN0aWNzIik7Cit9CkluZGV4OiBzeXMvbmV0ODAyMTEvaWVlZTgw MjExX3JjX3NhbXBsZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHN5cy9uZXQ4MDIxMS9pZWVlODAyMTFfcmNf c2FtcGxlLmgJKHJldmlzaW9uIDApCisrKyBzeXMvbmV0ODAyMTEvaWVlZTgwMjExX3JjX3NhbXBs ZS5oCShyZXZpc2lvbiAyNTU4NzIpCkBAIC0wLDAgKzEsMjgzIEBACisvKiAkRnJlZUJTRDogaGVh ZC9zeXMvZGV2L2F0aC9hdGhfcmF0ZS9zYW1wbGUvc2FtcGxlLmggMjQwMzgyIDIwMTItMDgtMTUg MDc6MTA6MTBaIGFkcmlhbiAkKi8KKworLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgQ2hlbmNo b25nIFFpbiA8Y2NxaW5ARnJlZUJTRC5vcmc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz Y2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRp b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVy CisgKiAgICBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cgKCJE aXNjbGFpbWVyIikgYW5kIGFueQorICogICAgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRp b25lZCB1cG9uIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkKKyAqICAgIHNpbWlsYXIgRGlzY2xh aW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlciBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAz LiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJz IG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8g ZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0 d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBB bHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUg dGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNp b24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisg KgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENP UFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqIGBgQVMgSVMnJyBBTkQgQU5ZIEVY UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlU RUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTk9OSU5GUklOR0VNRU5ULCBNRVJDSEFO VElCSUxJVFkKKyAqIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElT Q0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSUyBPUiBD T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksCisgKiBPUiBDT05T RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJF TUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB VEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV U0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUgorICogSU4gQ09OVFJB Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U SEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNP RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB TUFHRVMuCisgKi8KKworI2lmbmRlZiBfTkVUODAyMTFfSUVFRTgwMjExX1JBVEVDVExfU0FNUExF X0hfCisjZGVmaW5lIF9ORVQ4MDIxMV9JRUVFODAyMTFfUkFURUNUTF9TQU1QTEVfSF8KKworLyoK KyAqIGZvciBub3csIHdlIHRyYWNrIHBlcmZvcm1hbmNlIGZvciB0aHJlZSBkaWZmZXJlbnQgcGFj a2V0CisgKiBzaXplIGJ1Y2tldHMKKyAqLworI2RlZmluZSBOVU1fUEFDS0VUX1NJWkVfQklOUyAy CisjZGVmaW5lCVNBTVBMRV9NQVhSQVRFUwk2NAkJLyogTkI6IGNvcnJlc3BvbmRzIHRvIGhhbCBp bmZvWzMyXSAqLworCisvKgorICogUmF0ZSBjb250cm9sIHNldHRpbmdzLgorICovCitzdHJ1Y3Qg aWVlZTgwMjExX3NhbXBsZSB7CisJaW50CXNhbXBsZV9zbW9vdGhpbmdfcmF0ZTsJCQkvKiBld21h IHBlcmNlbnRhZ2UgWzAuLjk5XSAqLworCWludAlzYW1wbGVfc21vb3RoaW5nX21pbnBhY2tldHM7 CisJaW50CXNhbXBsZV9yYXRlOwkJCS8qICV0aW1lIHRvIHRyeSBkaWZmZXJlbnQgdHggcmF0ZXMg Ki8KKwlpbnQJc2FtcGxlX21heF9zdWNjZXNzaXZlX2ZhaWx1cmVzOworCWludAlzYW1wbGVfc3Rh bGVfZmFpbHVyZV90aW1lb3V0OwkvKiBob3cgbG9uZyB0byBob25vciBtYXhfc3VjY2Vzc2l2ZV9m YWlsdXJlcyAqLworCWludAlzYW1wbGVfbWluX3N3aXRjaDsJCS8qIG1pbiB0aW1lIGJldHdlZW4g cmF0ZSBjaGFuZ2VzICovCisJaW50CXNhbXBsZV9taW5fZ29vZF9wY3Q7CS8qIG1pbiBnb29kIHBl cmNlbnRhZ2UgZm9yIGEgcmF0ZSB0byBiZSBjb25zaWRlcmVkICovCit9OworCitzdHJ1Y3QgcmF0 ZV9zdGF0cyB7CQorCXVuc2lnbmVkIGF2ZXJhZ2VfdHhfdGltZTsKKwlpbnQgc3VjY2Vzc2l2ZV9m YWlsdXJlczsKKwl1aW50NjRfdCB0cmllczsKKwl1aW50NjRfdCB0b3RhbF9wYWNrZXRzOwkvKiBw a3RzIHRvdGFsIHNpbmNlIGFzc29jICovCisJdWludDY0X3QgcGFja2V0c19hY2tlZDsJLyogcGt0 cyBhY2tlZCBzaW5jZSBhc3NvYyAqLworCWludCBld21hX3BjdDsJLyogRVdNQSBwZXJjZW50YWdl ICovCisJdW5zaWduZWQgcGVyZmVjdF90eF90aW1lOyAvKiB0cmFuc21pdCB0aW1lIGZvciAwIHJl dHJpZXMgKi8KKwlpbnQgbGFzdF90eDsKK307CisKK3N0cnVjdCB0eHNjaGVkdWxlIHsKKwl1aW50 OF90CXQwLCByMDsJCS8qIHNlcmllcyAwOiB0cmllcywgcmF0ZSBjb2RlICovCisJdWludDhfdAl0 MSwgcjE7CQkvKiBzZXJpZXMgMTogdHJpZXMsIHJhdGUgY29kZSAqLworCXVpbnQ4X3QJdDIsIHIy OwkJLyogc2VyaWVzIDI6IHRyaWVzLCByYXRlIGNvZGUgKi8KKwl1aW50OF90CXQzLCByMzsJCS8q IHNlcmllcyAzOiB0cmllcywgcmF0ZSBjb2RlICovCit9OworCisvKgorICogUmF0ZSBjb250cm9s IHN0YXRlIGZvciBhIGdpdmVuIG5vZGUuCisgKi8KKy8qIFhYWCBjaGFuZ2UgbmFtaW5nIGNvbnZl cnNpb24/ICovCitzdHJ1Y3QgaWVlZTgwMjExX3NhbXBsZV9ub2RlIHsKKwlzdHJ1Y3QgaWVlZTgw MjExX3NhbXBsZSAqc2FuX3NhbXBsZTsvKiBiYWNrcG9pbnRlciAqLworCWludCBzdGF0aWNfcml4 OwkJCS8qIHJhdGUgaW5kZXggb2YgZml4ZWQgdHggcmF0ZSAqLworCXVpbnQ2NF90IHJhdGVtYXNr OwkJLyogYml0IG1hc2sgb2YgdmFsaWQgcmF0ZSBpbmRpY2VzICovCisJY29uc3Qgc3RydWN0IHR4 c2NoZWR1bGUgKnNjaGVkOwkvKiB0eCBzY2hlZHVsZSB0YWJsZSAqLworCisJc3RydWN0IHJhdGVf c3RhdHMgc3RhdHNbTlVNX1BBQ0tFVF9TSVpFX0JJTlNdW1NBTVBMRV9NQVhSQVRFU107CisJaW50 IGxhc3Rfc2FtcGxlX3JpeFtOVU1fUEFDS0VUX1NJWkVfQklOU107CisKKwlpbnQgY3VycmVudF9z YW1wbGVfcml4W05VTV9QQUNLRVRfU0laRV9CSU5TXTsgICAgICAgCisJaW50IHBhY2tldHNfc2Vu dFtOVU1fUEFDS0VUX1NJWkVfQklOU107CisKKwlpbnQgY3VycmVudF9yaXhbTlVNX1BBQ0tFVF9T SVpFX0JJTlNdOworCWludCBwYWNrZXRzX3NpbmNlX3N3aXRjaFtOVU1fUEFDS0VUX1NJWkVfQklO U107CisJdW5zaWduZWQgdGlja3Nfc2luY2Vfc3dpdGNoW05VTV9QQUNLRVRfU0laRV9CSU5TXTsK KworCWludCBwYWNrZXRzX3NpbmNlX3NhbXBsZVtOVU1fUEFDS0VUX1NJWkVfQklOU107CisJdW5z aWduZWQgc2FtcGxlX3R0W05VTV9QQUNLRVRfU0laRV9CSU5TXTsKK307CisKKyNkZWZpbmUJSVNf UkFURV9ERUZJTkVEKHNhbiwgcml4KQkoKChzYW4pLT5yYXRlbWFzayAmICgxPDwocml4KSkpICE9 IDApCisKKyNpZm5kZWYgTUlOCisjZGVmaW5lCU1JTihhLGIpCSgoYSkgPCAoYikgPyAoYSkgOiAo YikpCisjZW5kaWYKKyNpZm5kZWYgTUFYCisjZGVmaW5lCU1BWChhLGIpCSgoYSkgPiAoYikgPyAo YSkgOiAoYikpCisjZW5kaWYKKworc3RhdGljIGNvbnN0IGludCBwYWNrZXRfc2l6ZV9iaW5zW05V TV9QQUNLRVRfU0laRV9CSU5TXSAgPSB7IDI1MCwgMTYwMCB9OworCitzdGF0aWMgaW5saW5lIGlu dAorYmluX3RvX3NpemUoaW50IGluZGV4KQoreworCXJldHVybiBwYWNrZXRfc2l6ZV9iaW5zW2lu ZGV4XTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3NpemVfdG9fYmluKGludCBzaXplKSAKK3sK KyNpZiBOVU1fUEFDS0VUX1NJWkVfQklOUyA+IDEKKwlpZiAoc2l6ZSA8PSBwYWNrZXRfc2l6ZV9i aW5zWzBdKQorCQlyZXR1cm4gMDsKKyNlbmRpZgorI2lmIE5VTV9QQUNLRVRfU0laRV9CSU5TID4g MgorCWlmIChzaXplIDw9IHBhY2tldF9zaXplX2JpbnNbMV0pCisJCXJldHVybiAxOworI2VuZGlm CisjaWYgTlVNX1BBQ0tFVF9TSVpFX0JJTlMgPiAzCisJaWYgKHNpemUgPD0gcGFja2V0X3NpemVf Ymluc1syXSkKKwkJcmV0dXJuIDI7CisjZW5kaWYKKyNpZiBOVU1fUEFDS0VUX1NJWkVfQklOUyA+ IDQKKyNlcnJvciAiYWRkIHN1cHBvcnQgZm9yIG1vcmUgcGFja2V0IHNpemVzIgorI2VuZGlmCisJ cmV0dXJuIE5VTV9QQUNLRVRfU0laRV9CSU5TLTE7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBzYW1w bGVfcGt0X3R4dGltZShjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JhdGVfdGFibGUgKnJ0LAorCXVp bnQzMl90IGZyYW1lTGVuLCB1aW50MTZfdCByYXRlaXgsIGludCBpc2h0NDAsIGludCBpc1Nob3J0 UHJlYW1ibGUpCit7CisJdWludDhfdCByYzsKKyAgICBpbnQgbnVtU3RyZWFtczsKKworICAgIHJj ID0gcnQtPmluZm9bcmF0ZWl4XS5yYXRlQ29kZTsKKworICAgIC8qIExlZ2FjeSByYXRlPyBSZXR1 cm4gdGhlIG9sZCB3YXkgKi8KKyAgICBpZiAoISBJU19IVF9SQVRFKHJjKSkKKyAgICAJcmV0dXJu IGllZWU4MDIxMV9jb21wdXRlX2R1cmF0aW9uKHJ0LCBmcmFtZUxlbiwgcmF0ZWl4LCBpc1Nob3J0 UHJlYW1ibGUpOworCisgICAgLyogMTFuIGZyYW1lIC0gZXh0cmFjdCBvdXQgdGhlIG51bWJlciBv ZiBzcGF0aWFsIHN0cmVhbXMgKi8KKyAgICBudW1TdHJlYW1zID0gSFRfUkNfMl9TVFJFQU1TKHJj KTsKKyAgICBLQVNTRVJUKG51bVN0cmVhbXMgPiAwICYmIG51bVN0cmVhbXMgPD0gNCwKKyAgICAg ICAgKCJudW1iZXIgb2Ygc3BhdGlhbCBzdHJlYW1zIG5lZWRzIHRvIGJlIDEuLjM6IE1DUyByYXRl IDB4JXghIiwKKyAgICAgICAgcmF0ZWl4KSk7CisKKyAgICByZXR1cm4gaWVlZTgwMjExX2NvbXB1 dGVfZHVyYXRpb25faHQoZnJhbWVMZW4sIHJjLCBudW1TdHJlYW1zLCBpc2h0NDAsIGlzU2hvcnRQ cmVhbWJsZSk7Cit9CisKKyNkZWZpbmUgV0lGSV9DV19NSU4gMzEKKyNkZWZpbmUgV0lGSV9DV19N QVggMTAyMworCisvKgorICogQ2FsY3VsYXRlIHRoZSB0cmFuc21pdCBkdXJhdGlvbiBvZiBhIGZy YW1lLgorICovCitzdGF0aWMgdW5zaWduZWQgY2FsY191c2Vjc191bmljYXN0X3BhY2tldChjb25z dCBzdHJ1Y3QgaWVlZTgwMjExdmFwICp2YXAsCisJCQkJaW50IGxlbmd0aCwKKwkJCQlpbnQgcml4 LCBpbnQgc2hvcnRfcmV0cmllcywKKwkJCQlpbnQgbG9uZ19yZXRyaWVzLCBpbnQgaXNfaHQ0MCkK K3sKKwljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JhdGVfdGFibGUgKnJ0ID0gaWVlZTgwMjExX2dl dF9yYXRldGFibGUodmFwLT5pdl9pYy0+aWNfY3VyY2hhbik7CisJc3RydWN0IGllZWU4MDIxMWNv bSAqaWMgPSB2YXAtPml2X2ljOworCWludCBjdXJtb2RlID0gaWVlZTgwMjExX2NoYW4ybW9kZSh2 YXAtPml2X2ljLT5pY19jdXJjaGFuKTsKKwkKKwl1bnNpZ25lZCB0X3Nsb3QsIHRfZGlmcywgdF9z aWZzOyAKKwlpbnQgcnRzLCBjdHM7CisJaW50IHR0LCB4LCBjdywgY2l4OworCisJaW50IHR0ID0g MDsKKwlpbnQgeCA9IDA7CisJaW50IGN3ID0gV0lGSV9DV19NSU47CisKKwlLQVNTRVJUKHJ0ICE9 IE5VTEwsICgibm8gcmF0ZSB0YWJsZSwgbW9kZSAldSIsIGN1cm1vZGUpKTsKKworCWlmIChyaXgg Pj0gcnQtPnJhdGVDb3VudCkgeworCQlwcmludGYoImJvZ3VzIHJpeCAlZCwgbWF4ICV1LCBtb2Rl ICV1XG4iLAorCQkgICAgICAgcml4LCBydC0+cmF0ZUNvdW50LCBjdXJtb2RlKTsKKwkJcmV0dXJu IDA7CisJfQorCWNpeCA9IHJ0LT5pbmZvW3JpeF0uY29udHJvbFJhdGU7CisJLyogCisJICogWFhY IGdldHRpbmcgbWFjL3BoeSBsZXZlbCB0aW1pbmdzIHNob3VsZCBiZSBmaXhlZCBmb3IgdHVyYm8K KwkgKiByYXRlcywgYW5kIHRoZXJlIGlzIHByb2JhYmx5IGEgd2F5IHRvIGdldCB0aGlzIGZyb20g dGhlCisJICogaGFsLi4uCisJICovCisJc3dpdGNoIChydC0+aW5mb1tyaXhdLnBoeSkgeworCWNh c2UgSUVFRTgwMjExX1RfT0ZETToKKwkJdF9zbG90ID0gOTsKKwkJdF9zaWZzID0gMTY7CisJCXRf ZGlmcyA9IDI4OworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIElFRUU4MDIxMV9UX1RVUkJP OgorCQl0X3Nsb3QgPSA5OworCQl0X3NpZnMgPSA4OworCQl0X2RpZnMgPSAyODsKKwkJYnJlYWs7 CisJY2FzZSBJRUVFODAyMTFfVF9IVDoKKwkJdF9zbG90ID0gOTsKKwkJdF9zaWZzID0gODsKKwkJ dF9kaWZzID0gMjg7CisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX1RfRFM6CisJCS8qIGZhbGwg dGhyb3VnaCB0byBkZWZhdWx0ICovCisJZGVmYXVsdDoKKwkJLyogcGcgMjA1IGllZWUuODAyLjEx LnBkZiAqLworCQl0X3Nsb3QgPSAyMDsKKwkJdF9kaWZzID0gNTA7CisJCXRfc2lmcyA9IDEwOwor CX0KKworCXJ0cyA9IGN0cyA9IDA7CisKKwlpZiAoKGljLT5pY19mbGFncyAmIElFRUU4MDIxMV9G X1VTRVBST1QpICYmCisJICAgIHJ0LT5pbmZvW3JpeF0ucGh5ID09IElFRUU4MDIxMV9UX09GRE0p IHsKKwkJaWYgKGljLT5pY19wcm90bW9kZSA9PSBJRUVFODAyMTFfUFJPVF9SVFNDVFMpCisJCQly dHMgPSAxOworCQllbHNlIGlmIChpYy0+aWNfcHJvdG1vZGUgPT0gSUVFRTgwMjExX1BST1RfQ1RT T05MWSkKKwkJCWN0cyA9IDE7CisKKwkJaW50IHByb3RyaXg7CisgICAgCWlmIChjdXJtb2RlID09 IElFRUU4MDIxMV9NT0RFXzExRykKKyAgICAJICAgIHByb3RyaXggPSBydC0+cmF0ZUNvZGVUb0lu ZGV4WzIqMl07CisgICAgCWVsc2UgCisgICAgCSAgICBwcm90cml4ID0gcnQtPnJhdGVDb2RlVG9J bmRleFsyKjFdOworICAgIAlpZiAoMHhmZiA9PSBwcm90cml4KQorICAgIAkJcHJvdHJpeCA9IDA7 CisKKwkJY2l4ID0gcnQtPmluZm9bcHJvdHJpeF0uY29udHJvbFJhdGU7CisJfQorCisJaWYgKDAg LypsZW5ndGggPiBpYy0+aWNfcnRzdGhyZXNob2xkICovKSB7CisJCXJ0cyA9IDE7CisJfQorCisJ aWYgKHJ0cyB8fCBjdHMpIHsKKwkJaW50IGN0c3JhdGU7CisJCWludCBjdHNkdXJhdGlvbiA9IDA7 CisKKwkJLyogTkI6IHRoaXMgaXMgaW50ZW50aW9uYWxseSBub3QgYSBydW50aW1lIGNoZWNrICov CisJCUtBU1NFUlQoY2l4IDwgcnQtPnJhdGVDb3VudCwKKwkJICAgICgiYm9ndXMgY2l4ICVkLCBt YXggJXUsIG1vZGUgJXVcbiIsIGNpeCwgcnQtPnJhdGVDb3VudCwKKwkJICAgICBjdXJtb2RlKSk7 CisKKwkJY3RzcmF0ZSA9IHJ0LT5pbmZvW2NpeF0ucmF0ZUNvZGUgfCBydC0+aW5mb1tjaXhdLnNo b3J0UHJlYW1ibGU7CisJCWlmIChydHMpCQkvKiBTSUZTICsgQ1RTICovCisJCQljdHNkdXJhdGlv biArPSBydC0+aW5mb1tjaXhdLnNwQWNrRHVyYXRpb247CisKKwkJLyogWFhYIGFzc3VtZXMgc2hv cnQgcHJlYW1ibGUgKi8KKwkJY3RzZHVyYXRpb24gKz0gc2FtcGxlX3BrdF90eHRpbWUocnQsIGxl bmd0aCwgcml4LCBpc19odDQwLCAwKTsKKworCQlpZiAoY3RzKQkvKiBTSUZTICsgQUNLICovCisJ CQljdHNkdXJhdGlvbiArPSBydC0+aW5mb1tjaXhdLnNwQWNrRHVyYXRpb247CisKKwkJdHQgKz0g KHNob3J0X3JldHJpZXMgKyAxKSAqIGN0c2R1cmF0aW9uOworCX0KKwl0dCArPSB0X2RpZnM7CisK KwkvKiBYWFggYXNzdW1lcyBzaG9ydCBwcmVhbWJsZSAqLworCXR0ICs9IChsb25nX3JldHJpZXMr MSkqc2FtcGxlX3BrdF90eHRpbWUocnQsIGxlbmd0aCwgcml4LCBpc19odDQwLCAwKTsKKworCXR0 ICs9IChsb25nX3JldHJpZXMrMSkqKHRfc2lmcyArIHJ0LT5pbmZvW3JpeF0uc3BBY2tEdXJhdGlv bik7CisKKwlmb3IgKHggPSAwOyB4IDw9IHNob3J0X3JldHJpZXMgKyBsb25nX3JldHJpZXM7IHgr KykgeworCQljdyA9IE1JTihXSUZJX0NXX01BWCwgKGN3ICsgMSkgKiAyKTsKKwkJdHQgKz0gKHRf c2xvdCAqIGN3LzIpOworCX0KKwlyZXR1cm4gdHQ7Cit9CisKKyNlbmRpZiAvKiBfTkVUODAyMTFf SUVFRTgwMjExX1JBVEVDVExfU0FNUExFX0hfICovCkluZGV4OiBzeXMvbmV0ODAyMTEvaWVlZTgw MjExX3JjX3NhbXBsZV90eHNjaGVkLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gc3lzL25ldDgwMjExL2llZWU4 MDIxMV9yY19zYW1wbGVfdHhzY2hlZC5oCShyZXZpc2lvbiAwKQorKysgc3lzL25ldDgwMjExL2ll ZWU4MDIxMV9yY19zYW1wbGVfdHhzY2hlZC5oCShyZXZpc2lvbiAyNTU4NzIpCkBAIC0wLDAgKzEs MjQxIEBACisvKiAkRnJlZUJTRDogaGVhZC9zeXMvZGV2L2F0aC9hdGhfcmF0ZS9zYW1wbGUvdHhf c2NoZWR1bGVzLmggMjQwMzg0IDIwMTItMDgtMTUgMDc6NTA6NDJaIGFkcmlhbiAkKi8KKworLyot CisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgSm9obiBCaWNrZXQKKyAqIENvcHlyaWdodCAoYykgMjAx MyBDaGVuY2hvbmcgUWluIDxjY3FpbkBGcmVlQlNELm9yZz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2 ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv d2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRp c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRp c2NsYWltZXIKKyAqICAgIHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBi ZWxvdyAoIkRpc2NsYWltZXIiKSBhbmQgYW55CisgKiAgICByZWRpc3RyaWJ1dGlvbiBtdXN0IGJl IGNvbmRpdGlvbmVkIHVwb24gaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseQorICogICAgc2ltaWxh ciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyIGJpbmFyeSByZWRpc3RyaWJ1dGlv bi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0 IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUg dXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0 aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgor ICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVu ZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BM IikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRh dGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC WSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogYGBBUyBJUycnIEFO RCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAor ICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBOT05JTkZSSU5HRU1FTlQs IE1FUkNIQU5USUJJTElUWQorICogQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NF IEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xE RVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwKKyAq IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s IFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G IFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9X RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJ TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VO Q0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9G IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9G IFNVQ0ggREFNQUdFUy4KKyAqCisgKi8KKyNpZm5kZWYJX19BVEhfUkFURV9TQU1QTEVfVFhTQ0hF RFVMRVNfSF9fCisjZGVmaW5lCV9fQVRIX1JBVEVfU0FNUExFX1RYU0NIRURVTEVTX0hfXworCisj aW5jbHVkZSA8c3lzL2NkZWZzLmg+CisKKyNkZWZpbmUgQShfcikgXAorICAgICgoKF9yKSA9PSA2 KSAgID8gMCA6ICgoKF9yKSA9PSA5KSAgID8gMSA6ICgoKF9yKSA9PSAxMikgID8gMiA6IFwKKyAg ICAoKChfcikgPT0gMTgpICA/IDMgOiAoKChfcikgPT0gMjQpICA/IDQgOiAoKChfcikgPT0gMzYp ICA/IDUgOiBcCisgICAgKCgoX3IpID09IDQ4KSAgPyA2IDogKCgoX3IpID09IDU0KSAgPyA3IDog MCkpKSkpKSkpCitzdGF0aWMgY29uc3Qgc3RydWN0IHR4c2NoZWR1bGUgc2VyaWVzXzExYVtdID0g eworCXsgMyxBKCA2KSwgMyxBKCAgNiksIDAsQSggIDYpLCAwLEEoIDYpIH0sCS8qICAgNk1iL3Mg Ki8KKwl7IDQsQSggOSksIDMsQSggIDYpLCA0LEEoICA2KSwgMCxBKCA2KSB9LAkvKiAgIDlNYi9z ICovCisJeyA0LEEoMTIpLCAzLEEoICA2KSwgNCxBKCAgNiksIDAsQSggNikgfSwJLyogIDEyTWIv cyAqLworCXsgNCxBKDE4KSwgMyxBKCAxMiksIDQsQSggIDYpLCAyLEEoIDYpIH0sCS8qICAxOE1i L3MgKi8KKwl7IDQsQSgyNCksIDMsQSggMTgpLCA0LEEoIDEyKSwgMixBKCA2KSB9LAkvKiAgMjRN Yi9zICovCisJeyA0LEEoMzYpLCAzLEEoIDI0KSwgNCxBKCAxOCksIDIsQSggNikgfSwJLyogIDM2 TWIvcyAqLworCXsgNCxBKDQ4KSwgMyxBKCAzNiksIDQsQSggMjQpLCAyLEEoMTIpIH0sCS8qICA0 OE1iL3MgKi8KKwl7IDQsQSg1NCksIDMsQSggNDgpLCA0LEEoIDM2KSwgMixBKDI0KSB9CS8qICA1 NE1iL3MgKi8KK307CisKKyNkZWZpbmUgTkExKF9yKSBcCisJKCgoX3IpID09IDYuNSkgID8gOCA6 ICgoKF9yKSA9PSAxMykgID8gIDkgOiAoKChfcikgPT0gMTkuNSk/IDEwIDogXAorCSgoKF9yKSA9 PSAyNikgID8gMTEgOiAoKChfcikgPT0gMzkpICA/IDEyIDogKCgoX3IpID09IDUyKSAgPyAxMyA6 IFwKKwkoKChfcikgPT0gNTguNSk/IDE0IDogKCgoX3IpID09IDY1KSAgPyAxNSA6IDApKSkpKSkp KQorI2RlZmluZSBOQTIoX3IpIFwKKwkoKChfcikgPT0gMTMpID8gMTYgOiAoKChfcikgPT0gMjYp ID8gMTcgOiAoKChfcikgPT0gMzkpID8gMTggOiBcCisJKCgoX3IpID09IDUyKSA/IDE5IDogKCgo X3IpID09IDc4KSA/IDIwIDogKCgoX3IpID09IDEwNCk/IDIxIDogXAorCSgoKF9yKSA9PSAxMTcp PyAyMiA6ICgoKF9yKSA9PSAxMzApPyAyMyA6IDApKSkpKSkpKQorI2RlZmluZSBOQTMoX3IpIFwK KwkoKChfcikgPT0gMTkuNSkgID8gMjQgOiAoKChfcikgPT0gMzkpID8gMjUgOiAoKChfcikgPT0g NTguNSkgID8gMjYgOiBcCisJKCgoX3IpID09IDc4KSAgPyAyNyA6ICgoKF9yKSA9PSAxMTcpID8g MjggOiAoKChfcikgPT0gMTU2KSA/IDI5IDogXAorCSgoKF9yKSA9PSAxNzUuNSkgPyAzMCA6ICgo KF9yKSA9PSAxOTUpPyAzMSA6IDApKSkpKSkpKQorc3RhdGljIGNvbnN0IHN0cnVjdCB0eHNjaGVk dWxlIHNlcmllc18xMW5hW10gPSB7CisJeyAzLEEoIDYpLCAzLEEoICA2KSwgMCxBKCAgNiksIDAs QSggNikgfSwgICAgICAgLyogICA2TWIvcyAqLworCXsgNCxBKCA5KSwgMyxBKCAgNiksIDQsQSgg IDYpLCAwLEEoIDYpIH0sICAgICAgIC8qICAgOU1iL3MgKi8KKwl7IDQsQSgxMiksIDMsQSggIDYp LCA0LEEoICA2KSwgMCxBKCA2KSB9LCAgICAgICAvKiAgMTJNYi9zICovCisJeyA0LEEoMTgpLCAz LEEoIDEyKSwgNCxBKCAgNiksIDIsQSggNikgfSwgICAgICAgLyogIDE4TWIvcyAqLworCXsgNCxB KDI0KSwgMyxBKCAxOCksIDQsQSggMTIpLCAyLEEoIDYpIH0sICAgICAgIC8qICAyNE1iL3MgKi8K Kwl7IDQsQSgzNiksIDMsQSggMjQpLCA0LEEoIDE4KSwgMixBKCA2KSB9LCAgICAgICAvKiAgMzZN Yi9zICovCisJeyA0LEEoNDgpLCAzLEEoIDM2KSwgNCxBKCAyNCksIDIsQSgxMikgfSwgICAgICAg LyogIDQ4TWIvcyAqLworCXsgNCxBKDU0KSwgMyxBKCA0OCksIDQsQSggMzYpLCAyLEEoMjQpIH0s ICAgICAgIC8qICA1NE1iL3MgKi8KKworCS8qIDEgc3RyZWFtIHJhdGVzICovCisKKwl7IDMsTkEx KCA2LjUpLCAzLE5BMSggNi41KSwgMCxOQTEoIDYuNSksIDAsTkExKDYuNSkgfSwgIC8qIDYuNU1i L3MgKi8KKwl7IDQsTkExKCAgMTMpLCAzLE5BMSggNi41KSwgNCxOQTEoIDYuNSksIDAsTkExKDYu NSkgfSwgIC8qICAxM01iL3MgKi8KKwl7IDQsTkExKDE5LjUpLCAzLE5BMSggNi41KSwgNCxOQTEo IDYuNSksIDAsTkExKDYuNSkgfSwgIC8qMTkuNU1iL3MgKi8KKwl7IDQsTkExKCAgMjYpLCAzLE5B MSgxOS41KSwgNCxOQTEoIDYuNSksIDIsTkExKDYuNSkgfSwgIC8qICAyNk1iL3MgKi8KKwl7IDQs TkExKCAgMzkpLCAzLE5BMSggIDI2KSwgNCxOQTEoMTkuNSksIDIsTkExKDYuNSkgfSwgIC8qICAz OU1iL3MgKi8KKwl7IDQsTkExKCAgNTIpLCAzLE5BMSggIDM5KSwgNCxOQTEoICAyNiksIDIsTkEx KDYuNSkgfSwgIC8qICA1Mk1iL3MgKi8KKwl7IDQsTkExKDU4LjUpLCAzLE5BMSggIDUyKSwgNCxO QTEoICAzOSksIDIsTkExKCAxMykgfSwgIC8qNTguNU1iL3MgKi8KKwl7IDQsTkExKCAgNjUpLCAz LE5BMSg1OC41KSwgNCxOQTEoICA1MiksIDIsTkExKCAxMykgfSwgIC8qICA2NU1iL3MgKi8KKwor CS8qIDIgc3RyZWFtIHJhdGVzICovCisKKwl7IDMsTkEyKCAgMTMpLCAzLE5BMiggIDEzKSwgMCxO QTIoICAxMyksIDAsTkEyKCAxMykgfSwgIC8qICAxM01iL3MgKi8KKwl7IDQsTkEyKCAgMjYpLCAz LE5BMiggIDEzKSwgNCxOQTIoICAxMyksIDAsTkEyKCAxMykgfSwgIC8qICAyNk1iL3MgKi8KKwl7 IDQsTkEyKCAgMzkpLCAzLE5BMiggIDI2KSwgNCxOQTIoICAxMyksIDIsTkEyKCAxMykgfSwgIC8q ICAzOU1iL3MgKi8KKwl7IDQsTkEyKCAgNTIpLCAzLE5BMiggIDM5KSwgNCxOQTIoICAyNiksIDIs TkEyKCAxMykgfSwgIC8qICA1Mk1iL3MgKi8KKwl7IDQsTkEyKCAgNzgpLCAzLE5BMiggIDUyKSwg NCxOQTIoICAzOSksIDIsTkEyKCAxMykgfSwgIC8qICA3OE1iL3MgKi8KKwl7IDQsTkEyKCAxMDQp LCAzLE5BMiggIDc4KSwgNCxOQTIoICA1MiksIDIsTkEyKCAxMykgfSwgIC8qIDEwNE1iL3MgKi8K Kwl7IDQsTkEyKCAxMTcpLCAzLE5BMiggMTA0KSwgNCxOQTIoICA3OCksIDIsTkEyKCAyNikgfSwg IC8qIDExN01iL3MgKi8KKwl7IDQsTkEyKCAxMzApLCAzLE5BMiggMTE3KSwgNCxOQTIoIDEwNCks IDIsTkEyKCAyNikgfSwgICAvKiAxMzBNYi9zICovCisKKwkvKiAzIHN0cmVhbSByYXRlcyAqLwor CisJeyAzLE5BMygxOS41KSwgMyxOQTMoMTkuNSksIDAsTkEzKDE5LjUpLCAwLE5BMygxOS41KSB9 LCAgLyogIDE5TWIvcyAqLworCXsgMyxOQTMoICAzOSksIDMsTkEzKDE5LjUpLCAwLE5BMygxOS41 KSwgMCxOQTMoMTkuNSkgfSwgIC8qICAzOU1iL3MgKi8KKwl7IDMsTkEzKDU4LjUpLCAzLE5BMygg IDM5KSwgMCxOQTMoMTkuNSksIDAsTkEzKDE5LjUpIH0sICAvKiAgNThNYi9zICovCisJeyAzLE5B MyggIDc4KSwgMyxOQTMoNTguNSksIDAsTkEzKCAgMzkpLCAwLE5BMygxOS41KSB9LCAgLyogIDc4 TWIvcyAqLworCXsgMyxOQTMoIDExNyksIDMsTkEzKCAgNzgpLCAwLE5BMyg1OC41KSwgMCxOQTMo MTkuNSkgfSwgIC8qIDExN01iL3MgKi8KKwl7IDMsTkEzKCAxNTYpLCAzLE5BMyggMTE3KSwgMCxO QTMoICA3OCksIDAsTkEzKDE5LjUpIH0sICAvKiAgMTU2TWIvcyAqLworCXsgMyxOQTMoMTc1LjUp LCAzLE5BMyggMTU2KSwgMCxOQTMoIDExNyksIDAsTkEzKCAgMzkpIH0sICAvKiAgMTc1TWIvcyAq LworCXsgMyxOQTMoIDE5NSksIDMsTkEzKCAxOTUpLCAwLE5BMyggMTU2KSwgMCxOQTMoNTguNSkg fSwgIC8qIDE5NU1iL3MgKi8KK307CisjdW5kZWYgQQorI3VuZGVmIE5BMworI3VuZGVmIE5BMgor I3VuZGVmIE5BMQorCisjZGVmaW5lIEcoX3IpIFwKKyAgICAoKChfcikgPT0gMSkgICA/IDAgOiAo KChfcikgPT0gMikgICA/IDEgOiAoKChfcikgPT0gNS41KSA/IDIgOiBcCisgICAgKCgoX3IpID09 IDExKSAgPyAzIDogKCgoX3IpID09IDYpICAgPyA0IDogKCgoX3IpID09IDkpICAgPyA1IDogXAor ICAgICgoKF9yKSA9PSAxMikgID8gNiA6ICgoKF9yKSA9PSAxOCkgID8gNyA6ICgoKF9yKSA9PSAy NCkgID8gOCA6IFwKKyAgICAoKChfcikgPT0gMzYpICA/IDkgOiAoKChfcikgPT0gNDgpICA/IDEw IDogKCgoX3IpID09IDU0KSAgPyAxMSA6IDApKSkpKSkpKSkpKSkKK3N0YXRpYyBjb25zdCBzdHJ1 Y3QgdHhzY2hlZHVsZSBzZXJpZXNfMTFnW10gPSB7CisJeyAzLEcoIDEpLCAzLEcoICAxKSwgMCxH KCAgMSksIDAsRyggMSkgfSwJLyogICAxTWIvcyAqLworCXsgNCxHKCAyKSwgMyxHKCAgMSksIDQs RyggIDEpLCAwLEcoIDEpIH0sCS8qICAgMk1iL3MgKi8KKwl7IDQsRyg1LjUpLDMsRyggIDIpLCA0 LEcoICAxKSwgMixHKCAxKSB9LAkvKiA1LjVNYi9zICovCisJeyA0LEcoMTEpLCAzLEcoNS41KSwg NCxHKCAgMiksIDIsRyggMSkgfSwJLyogIDExTWIvcyAqLworCXsgNCxHKCA2KSwgMyxHKDUuNSks IDQsRyggIDIpLCAyLEcoIDEpIH0sCS8qICAgNk1iL3MgKi8KKwl7IDQsRyggOSksIDMsRyggIDYp LCA0LEcoNS41KSwgMixHKCAxKSB9LAkvKiAgIDlNYi9zICovCisJeyA0LEcoMTIpLCAzLEcoIDEx KSwgNCxHKDUuNSksIDIsRyggMSkgfSwJLyogIDEyTWIvcyAqLworCXsgNCxHKDE4KSwgMyxHKCAx MiksIDQsRyggMTEpLCAyLEcoIDEpIH0sCS8qICAxOE1iL3MgKi8KKwl7IDQsRygyNCksIDMsRygg MTgpLCA0LEcoIDEyKSwgMixHKCAxKSB9LAkvKiAgMjRNYi9zICovCisJeyA0LEcoMzYpLCAzLEco IDI0KSwgNCxHKCAxOCksIDIsRyggMSkgfSwJLyogIDM2TWIvcyAqLworCXsgNCxHKDQ4KSwgMyxH KCAzNiksIDQsRyggMjQpLCAyLEcoIDEpIH0sCS8qICA0OE1iL3MgKi8KKwl7IDQsRyg1NCksIDMs RyggNDgpLCA0LEcoIDM2KSwgMixHKCAxKSB9CS8qICA1NE1iL3MgKi8KK307CisKKyNkZWZpbmUg TkcxKF9yKSBcCisJKCgoX3IpID09IDYuNSkgPyAxMiA6ICgoKF9yKSA9PSAxMykgPyAxMyA6ICgo KF9yKSA9PSAxOS41KT8gMTQgOiBcCisJKCgoX3IpID09IDI2KSAgPyAxNSA6ICgoKF9yKSA9PSAz OSkgPyAxNiA6ICgoKF9yKSA9PSA1MikgID8gMTcgOiBcCisJKCgoX3IpID09IDU4LjUpPyAxOCA6 ICgoKF9yKSA9PSA2NSkgPyAxOSA6IDApKSkpKSkpKQorI2RlZmluZSBORzIoX3IpIFwKKwkoKChf cikgPT0gMTMpICA/IDIwIDogKCgoX3IpID09IDI2KSA/IDIxIDogKCgoX3IpID09IDM5KSAgPyAy MiA6IFwKKwkoKChfcikgPT0gNTIpICA/IDIzIDogKCgoX3IpID09IDc4KSA/IDI0IDogKCgoX3Ip ID09IDEwNCkgPyAyNSA6IFwKKwkoKChfcikgPT0gMTE3KSA/IDI2IDogKCgoX3IpID09IDEzMCk/ IDI3IDogMCkpKSkpKSkpCisjZGVmaW5lIE5HMyhfcikgXAorCSgoKF9yKSA9PSAxOS41KSAgPyAy OCA6ICgoKF9yKSA9PSAzOSkgPyAyOSA6ICgoKF9yKSA9PSA1OC41KSAgPyAzMCA6IFwKKwkoKChf cikgPT0gNzgpICA/IDMxIDogKCgoX3IpID09IDExNykgPyAzMiA6ICgoKF9yKSA9PSAxNTYpID8g MzMgOiBcCisJKCgoX3IpID09IDE3NS41KSA/IDM0IDogKCgoX3IpID09IDE5NSk/IDM1IDogMCkp KSkpKSkpCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdHhzY2hlZHVsZSBzZXJpZXNfMTFuZ1tdID0g eworCXsgMyxHKCAxKSwgMyxHKCAgMSksIDAsRyggIDEpLCAwLEcoIDEpIH0sICAgICAgIC8qICAg MU1iL3MgKi8KKwl7IDQsRyggMiksIDMsRyggIDEpLCA0LEcoICAxKSwgMCxHKCAxKSB9LCAgICAg ICAvKiAgIDJNYi9zICovCisJeyA0LEcoNS41KSwzLEcoICAyKSwgNCxHKCAgMSksIDIsRyggMSkg fSwgICAgICAgLyogNS41TWIvcyAqLworCXsgNCxHKDExKSwgMyxHKDUuNSksIDQsRyggIDIpLCAy LEcoIDEpIH0sICAgICAgIC8qICAxMU1iL3MgKi8KKwl7IDQsRyggNiksIDMsRyg1LjUpLCA0LEco ICAyKSwgMixHKCAxKSB9LCAgICAgICAvKiAgIDZNYi9zICovCisJeyA0LEcoIDkpLCAzLEcoICA2 KSwgNCxHKDUuNSksIDIsRyggMSkgfSwgICAgICAgLyogICA5TWIvcyAqLworCXsgNCxHKDEyKSwg MyxHKCAxMSksIDQsRyg1LjUpLCAyLEcoIDEpIH0sICAgICAgIC8qICAxMk1iL3MgKi8KKwl7IDQs RygxOCksIDMsRyggMTIpLCA0LEcoIDExKSwgMixHKCAxKSB9LCAgICAgICAvKiAgMThNYi9zICov CisJeyA0LEcoMjQpLCAzLEcoIDE4KSwgNCxHKCAxMiksIDIsRyggMSkgfSwgICAgICAgLyogIDI0 TWIvcyAqLworCXsgNCxHKDM2KSwgMyxHKCAyNCksIDQsRyggMTgpLCAyLEcoIDEpIH0sICAgICAg IC8qICAzNk1iL3MgKi8KKwl7IDQsRyg0OCksIDMsRyggMzYpLCA0LEcoIDI0KSwgMixHKCAxKSB9 LCAgICAgICAvKiAgNDhNYi9zICovCisJeyA0LEcoNTQpLCAzLEcoIDQ4KSwgNCxHKCAzNiksIDIs RyggMSkgfSwgICAgICAgLyogIDU0TWIvcyAqLworCisJLyogMSBzdHJlYW0gcmF0ZXMgKi8KKwor CXsgMyxORzEoIDYuNSksIDMsTkcxKCA2LjUpLCAwLE5HMSggNi41KSwgMCxORzEoNi41KSB9LCAg LyogNi41TWIvcyAqLworCXsgNCxORzEoICAxMyksIDMsTkcxKCA2LjUpLCA0LE5HMSggNi41KSwg MCxORzEoNi41KSB9LCAgLyogIDEzTWIvcyAqLworCXsgNCxORzEoMTkuNSksIDMsTkcxKCA2LjUp LCA0LE5HMSggNi41KSwgMCxORzEoNi41KSB9LCAgLyoxOS41TWIvcyAqLworCXsgNCxORzEoICAy NiksIDMsTkcxKDE5LjUpLCA0LE5HMSggNi41KSwgMixORzEoNi41KSB9LCAgLyogIDI2TWIvcyAq LworCXsgNCxORzEoICAzOSksIDMsTkcxKCAgMjYpLCA0LE5HMSgxOS41KSwgMixORzEoNi41KSB9 LCAgLyogIDM5TWIvcyAqLworCXsgNCxORzEoICA1MiksIDMsTkcxKCAgMzkpLCA0LE5HMSggIDI2 KSwgMixORzEoNi41KSB9LCAgLyogIDUyTWIvcyAqLworCXsgNCxORzEoNTguNSksIDMsTkcxKCAg NTIpLCA0LE5HMSggIDM5KSwgMixORzEoIDEzKSB9LCAgLyo1OC41TWIvcyAqLworCXsgNCxORzEo ICA2NSksIDMsTkcxKDU4LjUpLCA0LE5HMSggIDUyKSwgMixORzEoIDEzKSB9LCAgLyogIDY1TWIv cyAqLworCisJLyogMiBzdHJlYW0gcmF0ZXMgKi8KKworCXsgMyxORzIoICAxMyksIDMsTkcyKCAg MTMpLCAwLE5HMiggIDEzKSwgMCxORzIoIDEzKSB9LCAgLyogIDEzTWIvcyAqLworCXsgNCxORzIo ICAyNiksIDMsTkcyKCAgMTMpLCA0LE5HMiggIDEzKSwgMCxORzIoIDEzKSB9LCAgLyogIDI2TWIv cyAqLworCXsgNCxORzIoICAzOSksIDMsTkcyKCAgMjYpLCA0LE5HMiggIDEzKSwgMixORzIoIDEz KSB9LCAgLyogIDM5TWIvcyAqLworCXsgNCxORzIoICA1MiksIDMsTkcyKCAgMzkpLCA0LE5HMigg IDI2KSwgMixORzIoIDEzKSB9LCAgLyogIDUyTWIvcyAqLworCXsgNCxORzIoICA3OCksIDMsTkcy KCAgNTIpLCA0LE5HMiggIDM5KSwgMixORzIoIDEzKSB9LCAgLyogIDc4TWIvcyAqLworCXsgNCxO RzIoIDEwNCksIDMsTkcyKCAgNzgpLCA0LE5HMiggIDUyKSwgMixORzIoIDEzKSB9LCAgLyogMTA0 TWIvcyAqLworCXsgNCxORzIoIDExNyksIDMsTkcyKCAxMDQpLCA0LE5HMiggIDc4KSwgMixORzIo IDI2KSB9LCAgLyogMTE3TWIvcyAqLworCXsgNCxORzIoIDEzMCksIDMsTkcyKCAxMTcpLCA0LE5H MiggMTA0KSwgMixORzIoIDI2KSB9LCAgLyogMTMwTWIvcyAqLworCisJLyogMyBzdHJlYW0gcmF0 ZXMgKi8KKworCXsgMyxORzMoMTkuNSksIDMsTkczKDE5LjUpLCAwLE5HMygxOS41KSwgMCxORzMo MTkuNSkgfSwgIC8qICAxOU1iL3MgKi8KKwl7IDMsTkczKCAgMzkpLCAzLE5HMygxOS41KSwgMCxO RzMoMTkuNSksIDAsTkczKDE5LjUpIH0sICAvKiAgMzlNYi9zICovCisJeyAzLE5HMyg1OC41KSwg MyxORzMoICAzOSksIDAsTkczKDE5LjUpLCAwLE5HMygxOS41KSB9LCAgLyogIDU4TWIvcyAqLwor CXsgMyxORzMoICA3OCksIDMsTkczKDU4LjUpLCAwLE5HMyggIDM5KSwgMCxORzMoMTkuNSkgfSwg IC8qICA3OE1iL3MgKi8KKwl7IDMsTkczKCAxMTcpLCAzLE5HMyggIDc4KSwgMCxORzMoNTguNSks IDAsTkczKDE5LjUpIH0sICAvKiAxMTdNYi9zICovCisJeyAzLE5HMyggMTU2KSwgMyxORzMoIDEx NyksIDAsTkczKCAgNzgpLCAwLE5HMygxOS41KSB9LCAgLyogIDE1Nk1iL3MgKi8KKwl7IDMsTkcz KDE3NS41KSwgMyxORzMoIDE1NiksIDAsTkczKCAxMTcpLCAwLE5HMyggIDM5KSB9LCAgLyogIDE3 NU1iL3MgKi8KKwl7IDMsTkczKCAxOTUpLCAzLE5HMyggMTk1KSwgMCxORzMoIDE1NiksIDAsTkcz KDU4LjUpIH0sICAvKiAxOTVNYi9zICovCisKK307CisjdW5kZWYgRworI3VuZGVmIE5HMworI3Vu ZGVmIE5HMgorI3VuZGVmIE5HMQorCisjZGVmaW5lIEgoX3IpIFwKKyAgICAoKChfcikgPT0gMykg ICA/IDAgOiAoKChfcikgPT0gNC41KSA/IDEgOiAoKChfcikgPT0gNikgID8gMiA6IFwKKyAgICAo KChfcikgPT0gOSkgICA/IDMgOiAoKChfcikgPT0gMTIpICA/IDQgOiAoKChfcikgPT0gMTgpID8g NSA6IFwKKyAgICAoKChfcikgPT0gMjQpICA/IDYgOiAoKChfcikgPT0gMjcpICA/IDcgOiAwKSkp KSkpKSkKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdHhzY2hlZHVsZSBzZXJpZXNfaGFsZltdID0gewor CXsgMyxIKCAzKSwgMyxIKCAgMyksIDAsSCggIDMpLCAwLEgoIDMpIH0sCS8qICAgM01iL3MgKi8K Kwl7IDQsSCg0LjUpLDMsSCggIDMpLCA0LEgoICAzKSwgMCxIKCAzKSB9LAkvKiA0LjVNYi9zICov CisJeyA0LEgoIDYpLCAzLEgoICAzKSwgNCxIKCAgMyksIDAsSCggMykgfSwJLyogICA2TWIvcyAq LworCXsgNCxIKCA5KSwgMyxIKCAgNiksIDQsSCggIDMpLCAyLEgoIDMpIH0sCS8qICAgOU1iL3Mg Ki8KKwl7IDQsSCgxMiksIDMsSCggIDkpLCA0LEgoICA2KSwgMixIKCAzKSB9LAkvKiAgMTJNYi9z ICovCisJeyA0LEgoMTgpLCAzLEgoIDEyKSwgNCxIKCAgOSksIDIsSCggMykgfSwJLyogIDE4TWIv cyAqLworCXsgNCxIKDI0KSwgMyxIKCAxOCksIDQsSCggMTIpLCAyLEgoIDYpIH0sCS8qICAyNE1i L3MgKi8KKwl7IDQsSCgyNyksIDMsSCggMjQpLCA0LEgoIDE4KSwgMixIKDEyKSB9CS8qICAyN01i L3MgKi8KK307CisjdW5kZWYgSAorCisjaWZkZWYgUQorI3VuZGVmIFEKKyNlbmRpZgorI2RlZmlu ZSBRKF9yKSBcCisgICAgKCgoX3IpID09IDEuNSkgPyAwIDogKCgoX3IpID09Mi4yNSkgPyAxIDog KCgoX3IpID09IDMpICA/IDIgOiBcCisgICAgKCgoX3IpID09IDQuNSkgPyAzIDogKCgoX3IpID09 ICA2KSAgPyA0IDogKCgoX3IpID09IDkpICA/IDUgOiBcCisgICAgKCgoX3IpID09IDEyKSAgPyA2 IDogKCgoX3IpID09IDEzLjUpPyA3IDogMCkpKSkpKSkpCitzdGF0aWMgY29uc3Qgc3RydWN0IHR4 c2NoZWR1bGUgc2VyaWVzX3F1YXJ0ZXJbXSA9IHsKKwl7IDMsUSggMS41KSwzLFEoMS41KSwgMCxR KDEuNSksIDAsUSgxLjUpIH0sCS8qIDEuNU1iL3MgKi8KKwl7IDQsUSgyLjI1KSwzLFEoMS41KSwg NCxRKDEuNSksIDAsUSgxLjUpIH0sCS8qMi4yNU1iL3MgKi8KKwl7IDQsUSggICAzKSwzLFEoMS41 KSwgNCxRKDEuNSksIDAsUSgxLjUpIH0sCS8qICAgM01iL3MgKi8KKwl7IDQsUSggNC41KSwzLFEo ICAzKSwgNCxRKDEuNSksIDIsUSgxLjUpIH0sCS8qIDQuNU1iL3MgKi8KKwl7IDQsUSggICA2KSwz LFEoNC41KSwgNCxRKCAgMyksIDIsUSgxLjUpIH0sCS8qICAgNk1iL3MgKi8KKwl7IDQsUSggICA5 KSwzLFEoICA2KSwgNCxRKDQuNSksIDIsUSgxLjUpIH0sCS8qICAgOU1iL3MgKi8KKwl7IDQsUSgg IDEyKSwzLFEoICA5KSwgNCxRKCAgNiksIDIsUSggIDMpIH0sCS8qICAxMk1iL3MgKi8KKwl7IDQs USgxMy41KSwzLFEoIDEyKSwgNCxRKCAgOSksIDIsUSggIDYpIH0JLyoxMy41TWIvcyAqLworfTsK KyN1bmRlZiBRCisKKyNlbmRpZgpJbmRleDogc3lzL25ldDgwMjExL2llZWU4MDIxMV9yYXRlY3Rs LmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PQotLS0gc3lzL25ldDgwMjExL2llZWU4MDIxMV9yYXRlY3RsLmMJKHJldmlz aW9uIDI1NDgyNikKKysrIHN5cy9uZXQ4MDIxMS9pZWVlODAyMTFfcmF0ZWN0bC5jCShyZXZpc2lv biAyNTU4NzIpCkBAIC0xLDUgKzEsNiBAQAogLyotCiAgKiBDb3B5cmlnaHQgKGMpIDIwMTAgUnVp IFBhdWxvIDxycGF1bG9ARnJlZUJTRC5vcmc+CisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgQ2hlbmNo b25nIFFpbiA8Y2NxaW5ARnJlZUJTRC5vcmc+CiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoK ICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp dGggb3Igd2l0aG91dApAQCAtNDksNiArNTAsMzMgQEAKIAogTUFMTE9DX0RFRklORShNXzgwMjEx X1JBVEVDVEwsICI4MDIxMXJhdGVjdGwiLCAiODAyLjExIHJhdGUgY29udHJvbCIpOwogCitpbnQg bWF4XzRtc19mcmFtZWxlbls0XVszMl0gPSB7CisJW01DU19IVDIwXSA9IHsKKwkJMzIxMiwgIDY0 MzIsICA5NjQ4LCAgMTI4NjQsICAxOTMwMCwgIDI1NzM2LCAgMjg5NTIsICAzMjE3MiwKKwkJNjQy NCwgIDEyODUyLCAxOTI4MCwgMjU3MDgsICAzODU2OCwgIDUxNDI0LCAgNTc4NTIsICA2NDI4MCwK KwkJOTYyOCwgIDE5MjYwLCAyODg5NiwgMzg1MjgsICA1Nzc5MiwgIDY1NTMyLCAgNjU1MzIsICA2 NTUzMiwKKwkJMTI4MjgsIDI1NjU2LCAzODQ4OCwgNTEzMjAsICA2NTUzMiwgIDY1NTMyLCAgNjU1 MzIsICA2NTUzMiwKKwl9LAorCVtNQ1NfSFQyMF9TR0ldID0geworCQkzNTcyLCAgNzE0NCwgIDEw NzIwLCAgMTQyOTYsICAyMTQ0NCwgIDI4NTk2LCAgMzIxNzIsICAzNTc0NCwKKwkJNzE0MCwgIDE0 Mjg0LCAyMTQyOCwgIDI4NTY4LCAgNDI4NTYsICA1NzE0NCwgIDY0Mjg4LCAgNjU1MzIsCisJCTEw NzAwLCAyMTQwOCwgMzIxMTIsICA0MjgxNiwgIDY0MjI4LCAgNjU1MzIsICA2NTUzMiwgIDY1NTMy LAorCQkxNDI1NiwgMjg1MTYsIDQyNzgwLCAgNTcwNDAsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIs ICA2NTUzMiwKKwl9LAorCVtNQ1NfSFQ0MF0gPSB7CisJCTY2ODAsICAxMzM2MCwgIDIwMDQ0LCAg MjY3MjQsICA0MDA5MiwgIDUzNDU2LCAgNjAxNDAsICA2NTUzMiwKKwkJMTMzNDgsIDI2NzAwLCAg NDAwNTIsICA1MzQwMCwgIDY1NTMyLCAgNjU1MzIsICA2NTUzMiwgIDY1NTMyLAorCQkyMDAwNCwg NDAwMDgsICA2MDAxNiwgIDY1NTMyLCAgNjU1MzIsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIsCisJ CTI2NjQ0LCA1MzI5MiwgIDY1NTMyLCAgNjU1MzIsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIsICA2 NTUzMiwKKwl9LAorCVtNQ1NfSFQ0MF9TR0ldID0geworCQk3NDIwLCAgMTQ4NDQsICAyMjI3Miwg IDI5Njk2LCAgNDQ1NDQsICA1OTM5NiwgIDY1NTMyLCAgNjU1MzIsCisJCTE0ODMyLCAyOTY2OCwg IDQ0NTA0LCAgNTkzNDAsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIsICA2NTUzMiwKKwkJMjIyMzIs IDQ0NDY0LCAgNjU1MzIsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIsICA2NTUzMiwgIDY1NTMyLAor CQkyOTYxNiwgNTkyMzIsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIsICA2NTUzMiwgIDY1NTMyLCAg NjU1MzIsCisJfQorfTsKKwogdm9pZAogaWVlZTgwMjExX3JhdGVjdGxfcmVnaXN0ZXIoaW50IHR5 cGUsIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmF0ZWN0bCAqcmF0ZWN0bCkKIHsKQEAgLTY2LDEw ICs5NCwxMSBAQAogfQogCiB2b2lkCi1pZWVlODAyMTFfcmF0ZWN0bF9pbml0KHN0cnVjdCBpZWVl ODAyMTF2YXAgKnZhcCkKK2llZWU4MDIxMV9yYXRlY3RsX2luaXQoc3RydWN0IGllZWU4MDIxMXZh cCAqdmFwLCB1aW50MzJfdCBjYXBhYmlsaXRpZXMpCiB7CiAJaWYgKHZhcC0+aXZfcmF0ZSA9PSBy YXRlY3Rsc1tJRUVFODAyMTFfUkFURUNUTF9OT05FXSkKIAkJaWVlZTgwMjExX3JhdGVjdGxfc2V0 KHZhcCwgSUVFRTgwMjExX1JBVEVDVExfQU1SUik7CisJdmFwLT5pdl9yYXRlLmlyX2NhcGFiaWxp dGllcyA9IGNhcGFiaWxpdGllczsKIAl2YXAtPml2X3JhdGUtPmlyX2luaXQodmFwKTsKIH0KIApA QCAtOTAsMyArMTE5LDk3IEBACiAJfQogCXZhcC0+aXZfcmF0ZSA9IHJhdGVjdGxzW3R5cGVdOwog fQorCit2b2lkCitpZWVlODAyMTFfcmF0ZWN0bF9jb21wbGV0ZV9yY2ZsYWdzKGNvbnN0IHN0cnVj dCBpZWVlODAyMTFfbm9kZSAqbmksCisJCXN0cnVjdCBpZWVlODAyMTFfcmNfaW5mbyAqcmNfaW5m bykKK3sKKwljb25zdCBzdHJ1Y3QgaWVlZTgwMjExY29tICppYyA9IG5pLT5uaV9pYzsKKwljb25z dCBzdHJ1Y3QgaWVlZTgwMjExdmFwICp2YXAgPSBuaS0+bmlfdmFwOworCWNvbnN0IHN0cnVjdCBp ZWVlODAyMTFfcmF0ZV90YWJsZSAqIHJ0ID0gaWMtPmljX3J0OworCXN0cnVjdCBpZWVlODAyMTFf cmNfc2VyaWVzICpyYyA9IHJjX2luZm8tPnJpX3JjOworCWludCBzaG9ydFByZWFtYmxlID0gcmNf aW5mby0+cmlfc2hvcnRQcmVhbWJsZTsKKwl1aW50OF90IHJhdGU7CisJaW50IGk7CisKKwkvKiBN YWtlIHN1cmUgdGhhdCByYXRlIGNvbnRyb2wgY29kZSBkb2Vzbid0IG1lc3MgaXQgdXAuCisJICog SWYgZW5hYmxlIHJ0cy9jdHMgYW5kIGlzIHByZS04MDIuMTFuLCBibGFuayB0cmllcyAxLCAyLCAz IAorCSAqLworCisJaWYgKCEgKHZhcC0+aXZfcmF0ZS0+aXJfY2FwYWJpbGl0aWVzICYgSUVFRTgw MjExX1JBVEVDVExfQ0FQX01SUlBST1QpKQorCXsKKwkJZm9yIChpID0gMTsgaSA8IElFRUU4MDIx MV9SQVRFQ1RMX05VTTsgaSsrKQorCQl7CisJCQlpZiAocmNbMF0uZmxhZ3MgJiBJRUVFODAyMTFf UkFURUNUTF9SVFNDVFNfRkxBRykKKwkJCQlyY1tpXS50cmllcyA9IDA7CisJCQlyY1tpXS5mbGFn cyAmPSB+SUVFRTgwMjExX1JBVEVDVExfUlRTQ1RTX0ZMQUc7IAorCQl9CisJfQorCisJZm9yIChp ID0gMDsgaSA8IElFRUU4MDIxMV9SQVRFQ1RMX05VTTsgaSsrKSB7CisJCQorCQlpZiAocmNbaV0u dHJpZXMgPT0gMCkKKwkJCWNvbnRpbnVlOworCisJCXJhdGUgPSBydC0+aW5mb1tyY1tpXS5yaXhd LnJhdGVDb2RlOworCisJCS8qCisJCSAqIE9ubHkgZW5hYmxlIHNob3J0IHByZWFtYmxlIGZvciBs ZWdhY3kgcmF0ZXMKKwkJICovCisJCWlmICgoISBJU19IVF9SQVRFKHJhdGUpKSAmJiBzaG9ydFBy ZWFtYmxlKQorCQkJcmF0ZSB8PSBydC0+aW5mb1tyY1tpXS5yaXhdLnNob3J0UHJlYW1ibGU7CisK KwkJLyoKKwkJICogU2F2ZSB0aGlzLCB1c2VkIGJ5IHRoZSBUWCBhbmQgY29tcGxldGlvbiBjb2Rl CisJCSAqLworCQlyY1tpXS5yYXRlY29kZSA9IHJhdGU7CisKKwkJLyogT25seSBlbmFibGUgc2hv cnRnaSwgMjA0MCwgZHVhbC1zdHJlYW0gaWYgSFQgaXMgc2V0ICovCisJCWlmIChJU19IVF9SQVRF KHJhdGUpKSB7CisJCQlyY1tpXS5mbGFncyB8PSBJRUVFODAyMTFfUkFURUNUTF9IVF9GTEFHOwor CisJCQkvKgorCQkJICogWFhYIFRPRE86IExEUEMKKwkJCSAqLworCisJCQkvKgorCQkJICogRHVh bCAvIFRyaXBsZSBzdHJlYW0gcmF0ZT8KKwkJCSAqLworCQkJaWYgKEhUX1JDXzJfU1RSRUFNUyhy YXRlKSA9PSAyKQorCQkJCXJjW2ldLmZsYWdzIHw9IElFRUU4MDIxMV9SQVRFQ1RMX0RTX0ZMQUc7 CisJCQllbHNlIGlmIChIVF9SQ18yX1NUUkVBTVMocmF0ZSkgPT0gMykKKwkJCQlyY1tpXS5mbGFn cyB8PSBJRUVFODAyMTFfUkFURUNUTF9UU19GTEFHOworCQl9CisKKwkJLyoKKwkJICogQ2FsY3Vs YXRlIHRoZSBtYXhpbXVtIFRYIHBvd2VyIGNhcCBmb3IgdGhlIGN1cnJlbnQKKwkJICogbm9kZS4g CisJCSAqIFJhdGUgY29udHJvbCBhbGdvIGNhbid0IGNvbnRyb2wgVFggcG93ZXIgYnkgbm93Lgor CQkgKi8KKwkJcmNbaV0udHhfcG93ZXJfY2FwID0gaWVlZTgwMjExX2dldF9ub2RlX3R4cG93ZXIo bmkpOworCQkKKwkJLyoKKwkJICogQ2FsY3VsYXRlIHRoZSBtYXhpbXVtIDRtcyBmcmFtZSBsZW5n dGggYmFzZWQKKwkJICogb24gdGhlIE1DUyByYXRlLCBTR0kgYW5kIGNoYW5uZWwgd2lkdGggZmxh Z3MuCisJCSAqLworCQlpZiAoKHJjW2ldLmZsYWdzICYgSUVFRTgwMjExX1JBVEVDVExfSFRfRkxB RykgJiYKKwkJICAgIChIVF9SQ18yX01DUyhyYXRlKSA8IDMyKSkgeworCQkJaW50IGo7CisJCQlp ZiAocmNbaV0uZmxhZ3MgJiBJRUVFODAyMTFfUkFURUNUTF9DVzQwX0ZMQUcpIHsKKwkJCQlpZiAo cmNbaV0uZmxhZ3MgJiBJRUVFODAyMTFfUkFURUNUTF9TR0lfRkxBRykKKwkJCQkJaiA9IE1DU19I VDQwX1NHSTsKKwkJCQllbHNlCisJCQkJCWogPSBNQ1NfSFQ0MDsKKwkJCX0gZWxzZSB7CisJCQkJ aWYgKHJjW2ldLmZsYWdzICYgSUVFRTgwMjExX1JBVEVDVExfU0dJX0ZMQUcpCisJCQkJCWogPSBN Q1NfSFQyMF9TR0k7CisJCQkJZWxzZQorCQkJCQlqID0gTUNTX0hUMjA7CisJCQl9CisJCQlyY1tp XS5tYXg0bXNmcmFtZWxlbiA9CisJCQkgICAgbWF4XzRtc19mcmFtZWxlbltqXVtIVF9SQ18yX01D UyhyYXRlKV07CisJCX0gZWxzZQorCQkJcmNbaV0ubWF4NG1zZnJhbWVsZW4gPSAwOworCX0KK30K KwpJbmRleDogc3lzL25ldDgwMjExL2llZWU4MDIxMV9yYXRlY3RsLmgKPT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g c3lzL25ldDgwMjExL2llZWU4MDIxMV9yYXRlY3RsLmgJKHJldmlzaW9uIDI1NDgyNikKKysrIHN5 cy9uZXQ4MDIxMS9pZWVlODAyMTFfcmF0ZWN0bC5oCShyZXZpc2lvbiAyNTU4NzIpCkBAIC0xLDUg KzEsNiBAQAogLyotCiAgKiBDb3B5cmlnaHQgKGMpIDIwMTAgUnVpIFBhdWxvIDxycGF1bG9ARnJl ZUJTRC5vcmc+CisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgQ2hlbmNob25nIFFpbiA8Y2NxaW5ARnJl ZUJTRC5vcmc+CiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9u IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAt MjQsNiArMjUsOCBAQAogICoKICAqICRGcmVlQlNEJAogICovCisjaWZuZGVmIF9ORVQ4MDIxMV9J RUVFODAyMTFfUkFURUNUTF9IXworI2RlZmluZSBfTkVUODAyMTFfSUVFRTgwMjExX1JBVEVDVExf SF8KIAogZW51bSBpZWVlODAyMTFfcmF0ZWFsZ3MgewogCUlFRUU4MDIxMV9SQVRFQ1RMX0FNUlIJ CT0gMCwKQEAgLTM0LDExICszNyw3NCBAQAogCUlFRUU4MDIxMV9SQVRFQ1RMX01BWAogfTsKIAor ZW51bSB7CisJTUNTX0hUMjAsCisJTUNTX0hUMjBfU0dJLAorCU1DU19IVDQwLAorCU1DU19IVDQw X1NHSSwKK307CisKICNkZWZpbmUJSUVFRTgwMjExX1JBVEVDVExfVFhfU1VDQ0VTUwkxCiAjZGVm aW5lCUlFRUU4MDIxMV9SQVRFQ1RMX1RYX0ZBSUxVUkUJMAogCisjZGVmaW5lCUlFRUU4MDIxMV9S QVRFQ1RMX1RSVUUJCTEKKyNkZWZpbmUJSUVFRTgwMjExX1JBVEVDVExfRkFMU0UJCTAKKworI2Rl ZmluZQlJRUVFODAyMTFfUkFURUNUTF9OVU0JCTQKKworI2RlZmluZQlJRUVFODAyMTFfUkFURUNU TF9EU19GTEFHCQkweDAxCS8qIGR1YWwtc3RyZWFtIHJhdGUgKi8KKyNkZWZpbmUJSUVFRTgwMjEx X1JBVEVDVExfQ1c0MF9GTEFHCQkweDAyCS8qIHVzZSBIVDQwICovCisjZGVmaW5lCUlFRUU4MDIx MV9SQVRFQ1RMX1NHSV9GTEFHCQkweDA0CS8qIHVzZSBzaG9ydC1HSSAqLworI2RlZmluZQlJRUVF ODAyMTFfUkFURUNUTF9IVF9GTEFHCQkweDA4CS8qIHVzZSBIVCAqLworI2RlZmluZQlJRUVFODAy MTFfUkFURUNUTF9SVFNDVFNfRkxBRwkweDEwCS8qIGVuYWJsZSBSVFMvQ1RTIHByb3RlY3Rpb24g Ki8KKyNkZWZpbmUJSUVFRTgwMjExX1JBVEVDVExfU1RCQ19GTEFHCQkweDIwCS8qIGVuYWJsZSBT VEJDICovCisjZGVmaW5lCUlFRUU4MDIxMV9SQVRFQ1RMX1RTX0ZMQUcJCTB4NDAJLyogdHJpcGxl LXN0cmVhbSByYXRlICovCisKKy8qIEhhcmR3YXJlIENBUHMgY2hpcCBvZmZlcmVkIHRvIHJhdGUg Y29udHJvbCBjb2RlICovCisjZGVmaW5lCUlFRUU4MDIxMV9SQVRFQ1RMX0NBUF9NUlIJCQkweDAx CS8qIHN1cHBvcnQgTVJSICovCisjZGVmaW5lCUlFRUU4MDIxMV9SQVRFQ1RMX0NBUF9NUlJQUk9U CQkweDAyCS8qIHN1cHBvcnQgTVJSICsgcHJvdGVjdCAqLworI2RlZmluZQlJRUVFODAyMTFfUkFU RUNUTF9DQVBfTVVMVFhDSEFJTgkweDA0CS8qIGhhcyBtb3JlIHRoYW4gMSB0eGNoYWluICovCisK KyNkZWZpbmUgSVNfVkFQX0hUKHZhcCkJKCh2YXApLT5pdl9odGNhcHMgJiBJRUVFODAyMTFfSFRD X0hUKQorCisjZGVmaW5lIElTX0hUX1JBVEUoX3JhdGUpICAgKChfcmF0ZSkgJiAweDgwKQorI2Rl ZmluZSBIVF9SQ18yX01DUyhfcmMpICAgICgoX3JjKSAmIDB4N2YpCisjZGVmaW5lIEhUX1JDXzJf U1RSRUFNUyhfcmMpICAgICgoKChfcmMpICYgMHg3OCkgPj4gMykgKyAxKQorCisKK2V4dGVybiBp bnQgbWF4XzRtc19mcmFtZWxlbls0XVszMl07CisKK3N0cnVjdCBpZWVlODAyMTFfcmNfc2VyaWVz IHsKKwl1aW50OF90IHJpeDsJCS8qIHJhdGV0YWJsZSBpbmRleCwgbm90IHJhdGUgY29kZSAqLwor CXVpbnQ4X3QgcmF0ZWNvZGU7CS8qIGhhcmR3YXJlIHJhdGUgY29kZSAqLworCXVpbnQ4X3QgdHJp ZXM7CisJdWludDhfdCB0eF9wb3dlcl9jYXA7CisJdWludDE2X3QgZmxhZ3M7CisJdWludDE2X3Qg bWF4NG1zZnJhbWVsZW47Cit9OworCisvKiAgKi8KK3N0cnVjdCBpZWVlODAyMTFfcmNfaW5mbyB7 CisJc3RydWN0IGllZWU4MDIxMV9yY19zZXJpZXMgcmlfcmNbSUVFRTgwMjExX1JBVEVDVExfTlVN XTsKKwlpbnQgcmlfZnJhbWVsZW47CisJaW50IHJpX3Nob3J0UHJlYW1ibGU7CisKKwkvKiBUWCBp bmZvICovCisJaW50IHJpX3N1Y2Nlc3M7CQkvKiBUWCBzdWNjZXNzIG9yIG5vdCAqLworCWludCBy aV9va2NudDsJCS8qIFRYIG9rIHdpdGggb3Igd2l0aG91dCByZXRyeSAqLworCWludCByaV9mYWls Y250OwkJLyogVFggcmV0cnktZmFpbCBjb3VudCAqLworCWludCByaV90eGNudDsJCS8qIFRYIGNv dW50ICovCisJaW50IHJpX3JldHJ5Y250OwkvKiBUWCByZXRyeSBjb3VudCAqLworCWludCByaV9z aG9ydHJldHJ5OworCWludCByaV9sb25ncmV0cnk7CisJaW50IHJpX2ZpbmFsdHNpOworCWludCBy aV90eHJhdGU7CQkvKiBodyB0eCByYXRlICovCit9OworCiBzdHJ1Y3QgaWVlZTgwMjExX3JhdGVj dGwgewogCWNvbnN0IGNoYXIgKmlyX25hbWU7CisJdWludDMyX3QgaXJfY2FwYWJpbGl0aWVzOwkJ LyogaGFyZHdhcmUgY2FwYWJpbGl0aWVzIG9mZmVyZWQgdG8gcmMgKi8KKwogCWludAkoKmlyX2F0 dGFjaCkoY29uc3Qgc3RydWN0IGllZWU4MDIxMXZhcCAqKTsKIAl2b2lkCSgqaXJfZGV0YWNoKShj b25zdCBzdHJ1Y3QgaWVlZTgwMjExdmFwICopOwogCXZvaWQJKCppcl9pbml0KShzdHJ1Y3QgaWVl ZTgwMjExdmFwICopOwpAQCAtNDYsNiArMTEyLDcgQEAKIAl2b2lkCSgqaXJfbm9kZV9pbml0KShz dHJ1Y3QgaWVlZTgwMjExX25vZGUgKik7CiAJdm9pZAkoKmlyX25vZGVfZGVpbml0KShzdHJ1Y3Qg aWVlZTgwMjExX25vZGUgKik7CiAJaW50CSgqaXJfcmF0ZSkoc3RydWN0IGllZWU4MDIxMV9ub2Rl ICosIHZvaWQgKiwgdWludDMyX3QpOworCXZvaWQJKCppcl9yYXRlcykoc3RydWN0IGllZWU4MDIx MV9ub2RlICosIHN0cnVjdCBpZWVlODAyMTFfcmNfaW5mbyAqKTsKIAl2b2lkCSgqaXJfdHhfY29t cGxldGUpKGNvbnN0IHN0cnVjdCBpZWVlODAyMTF2YXAgKiwKIAkgICAgCQkJICBjb25zdCBzdHJ1 Y3QgaWVlZTgwMjExX25vZGUgKiwgaW50LAogCSAgICAJCQkgIHZvaWQgKiwgdm9pZCAqKTsKQEAg LTU3LDggKzEyNCwxMCBAQAogCiB2b2lkCWllZWU4MDIxMV9yYXRlY3RsX3JlZ2lzdGVyKGludCwg Y29uc3Qgc3RydWN0IGllZWU4MDIxMV9yYXRlY3RsICopOwogdm9pZAlpZWVlODAyMTFfcmF0ZWN0 bF91bnJlZ2lzdGVyKGludCk7Ci12b2lkCWllZWU4MDIxMV9yYXRlY3RsX2luaXQoc3RydWN0IGll ZWU4MDIxMXZhcCAqKTsKK3ZvaWQJaWVlZTgwMjExX3JhdGVjdGxfaW5pdChzdHJ1Y3QgaWVlZTgw MjExdmFwICosIHVpbnQzMl90KTsKIHZvaWQJaWVlZTgwMjExX3JhdGVjdGxfc2V0KHN0cnVjdCBp ZWVlODAyMTF2YXAgKiwgaW50KTsKK3ZvaWQJaWVlZTgwMjExX3JhdGVjdGxfY29tcGxldGVfcmNm bGFncyhjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKiwgCisJCXN0cnVjdCBpZWVlODAyMTFf cmNfaW5mbyopCiAKIE1BTExPQ19ERUNMQVJFKE1fODAyMTFfUkFURUNUTCk7CiAKQEAgLTkzLDYg KzE2MiwxNSBAQAogfQogCiBzdGF0aWMgdm9pZCBfX2lubGluZQoraWVlZTgwMjExX3JhdGVjdGxf cmF0ZXMoc3RydWN0IGllZWU4MDIxMV9ub2RlICpuaSwgc3RydWN0IGllZWU4MDIxMV9yY19pbmZv ICpyY19pbmZvKQoreworCWNvbnN0IHN0cnVjdCBpZWVlODAyMTF2YXAgKnZhcCA9IG5pLT5uaV92 YXA7CisKKwl2YXAtPml2X3JhdGUtPmlyX3JhdGVzKG5pLCByY19pbmZvKTsKKwlpZWVlODAyMTFf cmF0ZWN0bF9jb21wbGV0ZV9yY2ZsYWdzKG5pLCByY19pbmZvKTsKK30KKworc3RhdGljIHZvaWQg X19pbmxpbmUKIGllZWU4MDIxMV9yYXRlY3RsX3R4X2NvbXBsZXRlKGNvbnN0IHN0cnVjdCBpZWVl ODAyMTF2YXAgKnZhcCwKICAgICBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pLCBpbnQg c3RhdHVzLCB2b2lkICphcmcxLCB2b2lkICphcmcyKQogewpAQCAtMTE1LDMgKzE5Myw0MCBAQAog CQlyZXR1cm47CiAJdmFwLT5pdl9yYXRlLT5pcl9zZXRpbnRlcnZhbCh2YXAsIG1zZWNzKTsKIH0K Kworc3RhdGljIGludCBfX2lubGluZQoraWVlZTgwMjExX3JhdGVjdGxfaGFzY2FwX2N3NDAoY29u c3Qgc3RydWN0IGllZWU4MDIxMXZhcCAqdmFwLAorCQljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX25v ZGUgKm5pKQoreworCXJldHVybiBJU19WQVBfSFQodmFwKSAmJiAobmktPm5pX2NodyA9PSA0MCk7 Cit9CisKK3N0YXRpYyBpbnQgX19pbmxpbmUKK2llZWU4MDIxMV9yYXRlY3RsX2hhc2NhcF9zaG9y dGdpKGNvbnN0IHN0cnVjdCBpZWVlODAyMTF2YXAgKnZhcCwKKwkJY29uc3Qgc3RydWN0IGllZWU4 MDIxMV9ub2RlICpuaSkKK3sKKwlpZiAoISBJU19WQVBfSFQodmFwKSkKKwkJcmV0dXJuIElFRUU4 MDIxMV9SQVRFQ1RMX0ZBTFNFOworCisJaWYgKG5pLT5uaV9jaHcgPT0gNDAgJiYKKwkJCXZhcC0+ aXZfaHRjYXBzICYgSUVFRTgwMjExX0hUQ0FQX1NIT1JUR0k0MCAmJgorCQkJbmktPm5pX2h0Y2Fw ICYgSUVFRTgwMjExX0hUQ0FQX1NIT1JUR0k0MCkKKwkJcmV0dXJuIElFRUU4MDIxMV9SQVRFQ1RM X1RSVUU7CisKKwlpZiAobmktPm5pX2NodyA9PSAyMCAmJgorCQkJdmFwLT5pdl9odGNhcHMgJiBJ RUVFODAyMTFfSFRDQVBfU0hPUlRHSTIwICYmCisJCQluaS0+bmlfaHRjYXAgJiBJRUVFODAyMTFf SFRDQVBfU0hPUlRHSTIwKQorCQlyZXR1cm4gSUVFRTgwMjExX1JBVEVDVExfVFJVRTsKK30KKwor CitzdGF0aWMgaW50IF9faW5saW5lCitpZWVlODAyMTFfcmF0ZWN0bF9oYXNjYXBfc3RiYyhjb25z dCBzdHJ1Y3QgaWVlZTgwMjExdmFwICp2YXAsCisJCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfbm9k ZSAqbmkpCit7CisgICByZXR1cm4gSVNfVkFQX0hUKHZhcCkgJiYgKHZhcC0+aXZfaHRjYXBzICYg SUVFRTgwMjExX0hUQ0FQX1RYU1RCQykgJiYKKwkJCSAgICAobmktPm5pX2h0Y2FwICYgSUVFRTgw MjExX0hUQ0FQX1JYU1RCQ18xU1RSRUFNKSAmJgorCQkJICAgICh2YXAtPml2X3JhdGUtPmlyX2Nh cGFiaWxpdGllcyAmIElFRUU4MDIxMV9SQVRFQ1RMX0NBUF9NVUxUWENIQUlOKTsKK30KKworI2Vu ZGlmCg== --047d7b3434b695a01504e3d34963-- From owner-freebsd-wireless@FreeBSD.ORG Tue Aug 13 21:57:43 2013 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 7DB27DED; Tue, 13 Aug 2013 21:57:43 +0000 (UTC) (envelope-from lev@FreeBSD.org) Received: from onlyone.friendlyhosting.spb.ru (onlyone.friendlyhosting.spb.ru [46.4.40.135]) by mx1.freebsd.org (Postfix) with ESMTP id 3B6BE28D5; Tue, 13 Aug 2013 21:57:42 +0000 (UTC) Received: from lion.home.serebryakov.spb.ru (unknown [IPv6:2001:470:923f:1:acaf:d9db:8ffe:1642]) (Authenticated sender: lev@serebryakov.spb.ru) by onlyone.friendlyhosting.spb.ru (Postfix) with ESMTPSA id 5034A4AC57; Wed, 14 Aug 2013 01:57:33 +0400 (MSK) Date: Wed, 14 Aug 2013 01:57:28 +0400 From: Lev Serebryakov X-Priority: 3 (Normal) Message-ID: <1316202925.20130814015728@serebryakov.spb.ru> To: Adrian Chadd Subject: Re: ath as AP panics In-Reply-To: References: <238348209.20130812212328@serebryakov.spb.ru> <1391593482.20130812213235@serebryakov.spb.ru> <1769815169.20130812214148@serebryakov.spb.ru> <809218974.20130813013544@serebryakov.spb.ru> MIME-Version: 1.0 Content-Type: text/plain; charset=koi8-r Content-Transfer-Encoding: quoted-printable Cc: freebsd-wireless@freebsd.org X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.14 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, 13 Aug 2013 21:57:43 -0000 Hello, Adrian. You wrote 13 =C1=D7=C7=D5=D3=D4=C1 2013 =C7., 2:28:07: AC> Ugh, I missed another m_nextpkt =3D NULL assignment. AC> Try updating again. r254276 seems to work -- doesn't show messages from diagnostic / fixup patch. --=20 // Black Lion AKA Lev Serebryakov From owner-freebsd-wireless@FreeBSD.ORG Tue Aug 13 22:06:47 2013 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 05AAA292; Tue, 13 Aug 2013 22:06:47 +0000 (UTC) (envelope-from adrian.chadd@gmail.com) Received: from mail-wg0-x22d.google.com (mail-wg0-x22d.google.com [IPv6:2a00:1450:400c:c00::22d]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 66B03295A; Tue, 13 Aug 2013 22:06:46 +0000 (UTC) Received: by mail-wg0-f45.google.com with SMTP id x12so7108016wgg.12 for ; Tue, 13 Aug 2013 15:06:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:in-reply-to:references:date:message-id:subject :from:to:cc:content-type:content-transfer-encoding; bh=LFKuy7qonpBZ2206jamunv7S5iipLV07XQvjmHUbous=; b=DzSvVvk6sZ93nS9yoSSthtAb9JBOKIY66kZ6p1IXb0lHz8134qn7aFI5FNaX+70D+V YET9prpfrdfdB0Po2IfFGBNFGJviIcpgexeZUacp6DnvZ4sT01/0PjGHRG/p7cd6d4zM hH7YPTtUV6XDsxcex9XCZ1ZOlQyKZvMBkys+0SvWI/CWztz+x+JyQYZ3wCx3C2vZmHz/ UvtlAlrFV4NwfoPvVrgR7DMtEJ1hrYA6XXeWCu9rpWqeZCFCQJy3zsyKY6Y79hSCxra0 jftEUdX1M27j5T5nPEpSyZBZBCFAJoRkqT+9C90xdbYwqJN41eyBl5lnL9corNtNYzCx 1Xaw== MIME-Version: 1.0 X-Received: by 10.180.36.133 with SMTP id q5mr4218715wij.0.1376431604678; Tue, 13 Aug 2013 15:06:44 -0700 (PDT) Sender: adrian.chadd@gmail.com Received: by 10.217.116.136 with HTTP; Tue, 13 Aug 2013 15:06:44 -0700 (PDT) In-Reply-To: <1316202925.20130814015728@serebryakov.spb.ru> References: <238348209.20130812212328@serebryakov.spb.ru> <1391593482.20130812213235@serebryakov.spb.ru> <1769815169.20130812214148@serebryakov.spb.ru> <809218974.20130813013544@serebryakov.spb.ru> <1316202925.20130814015728@serebryakov.spb.ru> Date: Tue, 13 Aug 2013 15:06:44 -0700 X-Google-Sender-Auth: Ljnuk-TIU6f2a0-B3kEXfyPxYhs Message-ID: Subject: Re: ath as AP panics From: Adrian Chadd To: Lev Serebryakov Content-Type: text/plain; charset=KOI8-R Content-Transfer-Encoding: quoted-printable Cc: freebsd-wireless@freebsd.org X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.14 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, 13 Aug 2013 22:06:47 -0000 Woo! Thanks! -adrian On 13 August 2013 14:57, Lev Serebryakov wrote: > Hello, Adrian. > You wrote 13 =C1=D7=C7=D5=D3=D4=C1 2013 =C7., 2:28:07: > > AC> Ugh, I missed another m_nextpkt =3D NULL assignment. > AC> Try updating again. > r254276 seems to work -- doesn't show messages from diagnostic / fixup > patch. > > -- > // Black Lion AKA Lev Serebryakov > From owner-freebsd-wireless@FreeBSD.ORG Tue Aug 13 22:14:08 2013 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 509664B4; Tue, 13 Aug 2013 22:14:08 +0000 (UTC) (envelope-from lev@FreeBSD.org) Received: from onlyone.friendlyhosting.spb.ru (onlyone.friendlyhosting.spb.ru [IPv6:2a01:4f8:131:60a2::2]) by mx1.freebsd.org (Postfix) with ESMTP id 1284629B6; Tue, 13 Aug 2013 22:14:08 +0000 (UTC) Received: from lion.home.serebryakov.spb.ru (unknown [IPv6:2001:470:923f:1:acaf:d9db:8ffe:1642]) (Authenticated sender: lev@serebryakov.spb.ru) by onlyone.friendlyhosting.spb.ru (Postfix) with ESMTPSA id C4D854AC1C; Wed, 14 Aug 2013 02:14:03 +0400 (MSK) Date: Wed, 14 Aug 2013 02:14:00 +0400 From: Lev Serebryakov X-Priority: 3 (Normal) Message-ID: <1528052276.20130814021400@serebryakov.spb.ru> To: Adrian Chadd Subject: Re: ath as AP panics In-Reply-To: References: <238348209.20130812212328@serebryakov.spb.ru> <1391593482.20130812213235@serebryakov.spb.ru> <1769815169.20130812214148@serebryakov.spb.ru> <809218974.20130813013544@serebryakov.spb.ru> <1316202925.20130814015728@serebryakov.spb.ru> MIME-Version: 1.0 Content-Type: text/plain; charset=koi8-r Content-Transfer-Encoding: quoted-printable Cc: freebsd-wireless@freebsd.org X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.14 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, 13 Aug 2013 22:14:08 -0000 Hello, Adrian. You wrote 14 =C1=D7=C7=D5=D3=D4=C1 2013 =C7., 2:06:44: AC> Woo! AC> Thanks! Now, when I set up full-featured serial console, I could debug problems with more easy :) And if I find second Null Modem cable, I'll be able to do gdb debugging with sources :) Hmm... Is it possible to forward debug connection from one computer (to which null modem is attached) to other (with -CURRENT sources, it is different one)?.. --=20 // Black Lion AKA Lev Serebryakov From owner-freebsd-wireless@FreeBSD.ORG Wed Aug 14 02:52:40 2013 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 467157E2 for ; Wed, 14 Aug 2013 02:52:40 +0000 (UTC) (envelope-from julio@meroh.net) Received: from mail-lb0-f169.google.com (mail-lb0-f169.google.com [209.85.217.169]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id BD8422824 for ; Wed, 14 Aug 2013 02:52:39 +0000 (UTC) Received: by mail-lb0-f169.google.com with SMTP id u10so6511518lbi.28 for ; Tue, 13 Aug 2013 19:52:37 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc:content-type; bh=BK0sZXh0xtZusMSPoEboEby6bRDbaKoPq9r5XP2GiY8=; b=mIICLmYpzde1yPZzlFN3naefFYp2/Xw7tIJxBM/V+Yhp4PnI3ApkbyK7Nh55gApIB+ jHpcOZg5lTwUQIbmUsoH5Nnnxpa6Uevjwuqv3FqAjDqb2yHDU0rR4uQWExh4cgmCqDLG SEUhaBuflNCQ77o2sm5FxDnoC5bGQexqIYiDm9jtkfANh2e+T1RNMzXfBoJ0/d9dbwjM 9xERx960kSc3MgzNa5G5vMv16SehNd81nrWPw52rPhHbrj2MAzuo3WPilisP80Ar0fmw TXgOaAg1vz2k3GXxRqRuypo9aN8g46auGwwKC/Bb3Mq5xO+/wHuUMxU7Sh46lzusmtSB sDnw== X-Gm-Message-State: ALoCoQkiCNuUSKfn1/LSjI5vKW1FBfheBiHLsG7Orck+4Wa28ney4SaFu4Y3cdbMCpkeQa4rILQP X-Received: by 10.112.135.99 with SMTP id pr3mr6054715lbb.23.1376448343941; Tue, 13 Aug 2013 19:45:43 -0700 (PDT) MIME-Version: 1.0 Received: by 10.112.149.2 with HTTP; Tue, 13 Aug 2013 19:45:23 -0700 (PDT) X-Originating-IP: [108.176.158.82] In-Reply-To: References: <201308111650.r7BGo1Qt048071@freefall.freebsd.org> <52099CF4.7050101@meroh.net> From: Julio Merino Date: Tue, 13 Aug 2013 22:45:23 -0400 Message-ID: Subject: Re: kern/181100: [bwi] Turning up bwi0 crashes / deadlocks the kernel To: Adrian Chadd Content-Type: text/plain; charset=ISO-8859-1 Cc: freebsd-wireless@freebsd.org X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.14 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, 14 Aug 2013 02:52:40 -0000 On Tue, Aug 13, 2013 at 5:58 AM, Adrian Chadd wrote: > Hi! > > Please update to the latest -HEAD and try again. No luck. It gets a bit further now (ifconfig wlan0 up returns to the shell) but then panics: panic: ring_idx 0 cpuid = 1 KDB: stack backtrace: kdb_backtrace vpanic kassert_panic _bwi_txeof bwi_txeof_status32 bwi_intr intr_event_execute_handlers ithread_loop fork_exit fork_trampoline (blindly typed while reading from kdb) -- Julio Merino / @jmmv From owner-freebsd-wireless@FreeBSD.ORG Wed Aug 14 03:25:53 2013 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 51A02EC3 for ; Wed, 14 Aug 2013 03:25:53 +0000 (UTC) (envelope-from adrian.chadd@gmail.com) Received: from mail-wi0-x233.google.com (mail-wi0-x233.google.com [IPv6:2a00:1450:400c:c05::233]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id D6D772A14 for ; Wed, 14 Aug 2013 03:25:52 +0000 (UTC) Received: by mail-wi0-f179.google.com with SMTP id hr7so1416264wib.6 for ; Tue, 13 Aug 2013 20:25:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:in-reply-to:references:date:message-id:subject :from:to:cc:content-type; bh=ouQp3Fl8mJgGbKNNx0vvx3nxRcZZG4JSB5sJtZrHMJA=; b=o6yR0YzvKFnPMxLQ6B3UnOliad0VElp5yvpqQmmo8MAPAvGSD2D0/kHX9cywtMaNHk lJg+lfUmm1RxjOjrfIt4xgnuY/cnted1LPkVTbayJUr+5puk5Vhv3LowOv4MW2p3aPcC 9sNKZNrIouOP5dMo3FeTq8+Dq8B5T6oxqumbC4e7lNcoBC6cfK1Ykwx9C1cGMy7kINAX MB3wjqQ9Z3c08VToivOoPt77AtJmyxGFgmhHtSU+dDbhhsWsJjEHkcgEXXZEk2PDJKVg wolVgm72MuOn+sik2qVvHI+tc9z9H4A5ULwa3ZjwUzBLbPE+ZOTDSJZUY2Cf3uXOrxb6 Hfhw== MIME-Version: 1.0 X-Received: by 10.180.211.206 with SMTP id ne14mr4733178wic.30.1376450751189; Tue, 13 Aug 2013 20:25:51 -0700 (PDT) Sender: adrian.chadd@gmail.com Received: by 10.217.116.136 with HTTP; Tue, 13 Aug 2013 20:25:51 -0700 (PDT) In-Reply-To: References: <201308111650.r7BGo1Qt048071@freefall.freebsd.org> <52099CF4.7050101@meroh.net> Date: Tue, 13 Aug 2013 20:25:51 -0700 X-Google-Sender-Auth: AbQXhIg2i4AcU70v71lqx7a9dCE Message-ID: Subject: Re: kern/181100: [bwi] Turning up bwi0 crashes / deadlocks the kernel From: Adrian Chadd To: Julio Merino Content-Type: text/plain; charset=ISO-8859-1 X-Content-Filtered-By: Mailman/MimeDel 2.1.14 Cc: "freebsd-wireless@freebsd.org" X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.14 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, 14 Aug 2013 03:25:53 -0000 Cool, I'll check whether there's another odd thing to do with rate table stuff in bwi_txeof. Thanks! -adrian On 13 August 2013 19:45, Julio Merino wrote: > On Tue, Aug 13, 2013 at 5:58 AM, Adrian Chadd wrote: > > Hi! > > > > Please update to the latest -HEAD and try again. > > No luck. It gets a bit further now (ifconfig wlan0 up returns to the > shell) but then panics: > > panic: ring_idx 0 > cpuid = 1 > KDB: stack backtrace: > kdb_backtrace > vpanic > kassert_panic > _bwi_txeof > bwi_txeof_status32 > bwi_intr > intr_event_execute_handlers > ithread_loop > fork_exit > fork_trampoline > > (blindly typed while reading from kdb) > > -- > Julio Merino / @jmmv > From owner-freebsd-wireless@FreeBSD.ORG Wed Aug 14 16:34:18 2013 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id BC0E724B for ; Wed, 14 Aug 2013 16:34:18 +0000 (UTC) (envelope-from adrian.chadd@gmail.com) Received: from mail-wi0-x22b.google.com (mail-wi0-x22b.google.com [IPv6:2a00:1450:400c:c05::22b]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 3E1742629 for ; Wed, 14 Aug 2013 16:34:18 +0000 (UTC) Received: by mail-wi0-f171.google.com with SMTP id hr7so2199397wib.4 for ; Wed, 14 Aug 2013 09:34:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:in-reply-to:references:date:message-id:subject :from:to:cc:content-type; bh=eE8yo+Kqlhgk5dcHzEcVnowLcVBOacJyHEcaoXT5Pik=; b=Q7WNyYkOTQc7rE21i9pPg3RXi62o6g5/rPVVW+JRVPrV0l2jrDZ8Y2ofkjsM6XlrG5 ykuYkVxe69v4xvUvd7lwDvcpcgWiDQbWHyNZriFmp1ZllsX8wAlqQ08TIc7Cxkm1U18N 7P73tHfAIDGSbxhUrD64baquG2mRYtL5Dlds8migNasPePo2OkGAJm/n4n6S122jyfvP p3JTyUL+cej2gF4Y6nz14zJqr3TL7GhW7sReNWkhVte6d9mTxdCzP5y4GJSaAcO2kQzl fKeWld6203/2VoQ5JyZYqtX/FAlcgUVm8Hld6HgPYe106SwOXHCsQ4OrArsM3goXECIC 4amg== MIME-Version: 1.0 X-Received: by 10.180.8.42 with SMTP id o10mr2406908wia.0.1376498056580; Wed, 14 Aug 2013 09:34:16 -0700 (PDT) Sender: adrian.chadd@gmail.com Received: by 10.217.116.136 with HTTP; Wed, 14 Aug 2013 09:34:16 -0700 (PDT) In-Reply-To: References: Date: Wed, 14 Aug 2013 09:34:16 -0700 X-Google-Sender-Auth: yTW-t3-BDCbLfis9ZxR6GmYEy34 Message-ID: Subject: Re: Chenchong's work on net80211_ratectl From: Adrian Chadd To: Chenchong Qin Content-Type: text/plain; charset=ISO-8859-1 X-Content-Filtered-By: Mailman/MimeDel 2.1.14 Cc: "freebsd-wireless@freebsd.org" X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.14 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, 14 Aug 2013 16:34:18 -0000 Hi! Just a note - you need to keep the old copyright headers for code you've just shifted around. Eg, the ieee80211_rc_sample.[ch] files. -adrian On 13 August 2013 05:21, Chenchong Qin wrote: > Hi! > > Here is an update of work these days. > > I've added a new struct called ieee80211_rc_info to the ratectl API. It > contains tx completing information, i.e. txcnt, retrycnt, finaltsi, etc, > which > can be provided to ratectl algo during the __complete__ period. ir_rates, > ieee80211_ratectl_rates and ieee80211_ratectl_complete_rcflags are > adapted to accept the ieee80211_rc_info pointer through which framelen > and shortpreamble can also be reached. Then I added __complete__ stuff > and ir_rates to ieee80211_rc_sample. > > Thanks! > > Chenchong > > > On Tue, Aug 6, 2013 at 12:03 AM, Adrian Chadd wrote: > >> Hi! >> >> Great! >> >> So what's the problem with complete? Linux just provides all the >> information that the NIC supplies - how many attempts were made, how >> many attempts failed, which rate suceeded, etc. It looks a lot like it >> was designed around the requirements for the atheros driver (that has >> the most interesting information available) and other NICs just have >> to fake it somehow. >> >> >> >> -adrian >> >> On 5 August 2013 08:58, Chenchong Qin wrote: >> > Hi! >> > >> > Here is my work done these days on porting ath_rate_sample to net80211. >> It >> > has not been finished yet. _complete_ and _update_ are to be added. >> > >> > _complete_ is really a tricky thing. We have to provide rc algos with rc >> > information >> > during the frame completion period. Different rc algos may need >> different rc >> > information. What makes things more thornier is that different drivers >> > provide >> > different rc information in different ways. So, it seems we need a >> unified >> > way to >> > provide the rc information during completion of a frame. >> > >> > I'm browsing mac80211 these days to see what Linux do about _complete_. >> And, >> > looking forward to your commets! >> > >> > Thanks! >> > >> > Chenchong >> > >> > >> > On Sat, Aug 3, 2013 at 1:30 AM, Adrian Chadd >> wrote: >> >> >> >> Well just remember you can always ask me/us questions! >> >> >> >> What's your latest diff against -HEAD? Maybe I can start looking at >> >> including parts of it in the tree. >> >> >> >> >> >> >> >> >> >> -adrian >> >> >> >> On 2 August 2013 09:17, Chenchong Qin wrote: >> >> > Hi! >> >> > >> >> > These days, I'm taking a further look at what Linux done for the >> >> > _completion_ of a >> >> > frame. Some updates will be posted here later. >> >> > >> >> > And, with ir_rates, we can return/fill an rc array rather than just >> >> > returning the rix. >> >> > >> >> > Thanks! >> >> > >> >> > Chenchong >> >> > >> >> > >> >> > >> >> > >> >> > >> >> > On Thu, Aug 1, 2013 at 12:21 AM, Adrian Chadd >> >> > wrote: >> >> >> >> >> >> Boo! >> >> >> >> >> >> Do you have another update? >> >> >> >> >> >> >> >> >> >> >> >> -adrian >> >> >> >> >> >> On 24 July 2013 06:44, Adrian Chadd wrote: >> >> >> > On 24 July 2013 06:38, Chenchong Qin >> wrote: >> >> >> >> >> >> >> >> My pleasure! >> >> >> >> >> >> >> >> It's also against HEAD. >> >> >> >> >> >> >> >> Thanks! >> >> >> > >> >> >> > Ok. This is looking great! >> >> >> > >> >> >> > Next - we need to update the rate control API to now populate an >> rc >> >> >> > array rather than just returning the rix. >> >> >> > >> >> >> > This is the tricky part - as we're going to have to modify all the >> >> >> > drivers that use the rate control API to use this. >> >> >> > Which is fine, as there's only a handful. It's just annoying. >> >> >> > >> >> >> > Then we have to provide the rate control information during frame >> >> >> > _completion_, so the rate control code knows which transmission >> rates >> >> >> > succeeded or failed. I'm still not sure what to do about it here. >> >> >> > Maybe do something like Linux and attach TX rate control and >> >> >> > completion information as an mbuf tag? >> >> >> > >> >> >> > _Then_ we can start doing interesting thing with it. :) >> >> >> > >> >> >> > >> >> >> > >> >> >> > -adrian >> >> > >> >> > >> > >> > >> > > From owner-freebsd-wireless@FreeBSD.ORG Wed Aug 14 16:58:24 2013 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 32C4B604 for ; Wed, 14 Aug 2013 16:58:24 +0000 (UTC) (envelope-from adrian.chadd@gmail.com) Received: from mail-wg0-x22c.google.com (mail-wg0-x22c.google.com [IPv6:2a00:1450:400c:c00::22c]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id A8B69277F for ; Wed, 14 Aug 2013 16:58:23 +0000 (UTC) Received: by mail-wg0-f44.google.com with SMTP id l18so7784251wgh.35 for ; Wed, 14 Aug 2013 09:58:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:in-reply-to:references:date:message-id:subject :from:to:cc:content-type; bh=uewyV+sT6fsEGSPAbUWR4hfIAQjdFRSWiMWDDlLPUsg=; b=LG49ktrzn62iR6XTLw0FOlGyaBOELyI1cOYmWqxMfgdH4wbRH+a6v/iFudbLkvaUGX hbYZ6hY/ehc2oVqAKLeiuwmtFeYknsucqhjG5Nmvaw159z7B2zsgCKsgM+A7OYOmugeK DSsRMQuq5zjMPTuXj8BDagDIN/N9sbI8WfTpWZYfaJIIbasKl2cdt2E+Hd0glfebIoAc xl86R2QqkW89hbwd1dBGJMATsxvi01IfJqqCtuxv8Z+jaAvyIvo1wLBP38EM/IML4AEC tiiacIuRwcdKB8V44oa1cvec9tSLBTvErR2XispXbiyINIa2ZEy0318sHffq+cFsTaUA SPGw== MIME-Version: 1.0 X-Received: by 10.180.10.99 with SMTP id h3mr2326740wib.0.1376499501924; Wed, 14 Aug 2013 09:58:21 -0700 (PDT) Sender: adrian.chadd@gmail.com Received: by 10.217.116.136 with HTTP; Wed, 14 Aug 2013 09:58:21 -0700 (PDT) In-Reply-To: References: Date: Wed, 14 Aug 2013 09:58:21 -0700 X-Google-Sender-Auth: eIJyHqV0jx190qAQdTudKMqzdyA Message-ID: Subject: Re: Chenchong's work on net80211_ratectl From: Adrian Chadd To: Chenchong Qin Content-Type: text/plain; charset=ISO-8859-1 X-Content-Filtered-By: Mailman/MimeDel 2.1.14 Cc: "freebsd-wireless@freebsd.org" X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.14 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, 14 Aug 2013 16:58:24 -0000 Hi! So yes, we do need to have a generic way of returning that completion information to the rate control code. I'm all for you churning the rate control API to return a struct ieee80211_rc_info in the complete function and totally just kill arg1/arg2. That forces us to extend ieee80211_rc_info to be "right" for all the drivers. What wifi devices do you have there? It looks like we're almost at the point where we can start converting a few things to use the modified rate control API and modules - notably iwn (which won't use the multi-rate retry stuff to begin with - it works "differently"..) and ath (which will use the multi-rate retry stuff and the sample rate control module.) Thanks! -adrian On 14 August 2013 09:34, Adrian Chadd wrote: > Hi! > > Just a note - you need to keep the old copyright headers for code you've > just shifted around. > > Eg, the ieee80211_rc_sample.[ch] files. > > > -adrian > > > > On 13 August 2013 05:21, Chenchong Qin wrote: > >> Hi! >> >> Here is an update of work these days. >> >> I've added a new struct called ieee80211_rc_info to the ratectl API. It >> contains tx completing information, i.e. txcnt, retrycnt, finaltsi, etc, >> which >> can be provided to ratectl algo during the __complete__ period. ir_rates, >> ieee80211_ratectl_rates and ieee80211_ratectl_complete_rcflags are >> adapted to accept the ieee80211_rc_info pointer through which framelen >> and shortpreamble can also be reached. Then I added __complete__ stuff >> and ir_rates to ieee80211_rc_sample. >> >> Thanks! >> >> Chenchong >> >> >> On Tue, Aug 6, 2013 at 12:03 AM, Adrian Chadd wrote: >> >>> Hi! >>> >>> Great! >>> >>> So what's the problem with complete? Linux just provides all the >>> information that the NIC supplies - how many attempts were made, how >>> many attempts failed, which rate suceeded, etc. It looks a lot like it >>> was designed around the requirements for the atheros driver (that has >>> the most interesting information available) and other NICs just have >>> to fake it somehow. >>> >>> >>> >>> -adrian >>> >>> On 5 August 2013 08:58, Chenchong Qin wrote: >>> > Hi! >>> > >>> > Here is my work done these days on porting ath_rate_sample to >>> net80211. It >>> > has not been finished yet. _complete_ and _update_ are to be added. >>> > >>> > _complete_ is really a tricky thing. We have to provide rc algos with >>> rc >>> > information >>> > during the frame completion period. Different rc algos may need >>> different rc >>> > information. What makes things more thornier is that different drivers >>> > provide >>> > different rc information in different ways. So, it seems we need a >>> unified >>> > way to >>> > provide the rc information during completion of a frame. >>> > >>> > I'm browsing mac80211 these days to see what Linux do about >>> _complete_. And, >>> > looking forward to your commets! >>> > >>> > Thanks! >>> > >>> > Chenchong >>> > >>> > >>> > On Sat, Aug 3, 2013 at 1:30 AM, Adrian Chadd >>> wrote: >>> >> >>> >> Well just remember you can always ask me/us questions! >>> >> >>> >> What's your latest diff against -HEAD? Maybe I can start looking at >>> >> including parts of it in the tree. >>> >> >>> >> >>> >> >>> >> >>> >> -adrian >>> >> >>> >> On 2 August 2013 09:17, Chenchong Qin wrote: >>> >> > Hi! >>> >> > >>> >> > These days, I'm taking a further look at what Linux done for the >>> >> > _completion_ of a >>> >> > frame. Some updates will be posted here later. >>> >> > >>> >> > And, with ir_rates, we can return/fill an rc array rather than just >>> >> > returning the rix. >>> >> > >>> >> > Thanks! >>> >> > >>> >> > Chenchong >>> >> > >>> >> > >>> >> > >>> >> > >>> >> > >>> >> > On Thu, Aug 1, 2013 at 12:21 AM, Adrian Chadd >>> >> > wrote: >>> >> >> >>> >> >> Boo! >>> >> >> >>> >> >> Do you have another update? >>> >> >> >>> >> >> >>> >> >> >>> >> >> -adrian >>> >> >> >>> >> >> On 24 July 2013 06:44, Adrian Chadd wrote: >>> >> >> > On 24 July 2013 06:38, Chenchong Qin >>> wrote: >>> >> >> >> >>> >> >> >> My pleasure! >>> >> >> >> >>> >> >> >> It's also against HEAD. >>> >> >> >> >>> >> >> >> Thanks! >>> >> >> > >>> >> >> > Ok. This is looking great! >>> >> >> > >>> >> >> > Next - we need to update the rate control API to now populate an >>> rc >>> >> >> > array rather than just returning the rix. >>> >> >> > >>> >> >> > This is the tricky part - as we're going to have to modify all >>> the >>> >> >> > drivers that use the rate control API to use this. >>> >> >> > Which is fine, as there's only a handful. It's just annoying. >>> >> >> > >>> >> >> > Then we have to provide the rate control information during frame >>> >> >> > _completion_, so the rate control code knows which transmission >>> rates >>> >> >> > succeeded or failed. I'm still not sure what to do about it here. >>> >> >> > Maybe do something like Linux and attach TX rate control and >>> >> >> > completion information as an mbuf tag? >>> >> >> > >>> >> >> > _Then_ we can start doing interesting thing with it. :) >>> >> >> > >>> >> >> > >>> >> >> > >>> >> >> > -adrian >>> >> > >>> >> > >>> > >>> > >>> >> >> > From owner-freebsd-wireless@FreeBSD.ORG Wed Aug 14 17:13:52 2013 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 20BA892A for ; Wed, 14 Aug 2013 17:13:52 +0000 (UTC) (envelope-from adrian.chadd@gmail.com) Received: from mail-we0-x236.google.com (mail-we0-x236.google.com [IPv6:2a00:1450:400c:c03::236]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id A1B5E284F for ; Wed, 14 Aug 2013 17:13:51 +0000 (UTC) Received: by mail-we0-f182.google.com with SMTP id u55so7935975wes.41 for ; Wed, 14 Aug 2013 10:13:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:in-reply-to:references:date:message-id:subject :from:to:cc:content-type; bh=hpBFcctP4pxjpM6HknTwNzt8wBSwYxQryA3FoFeB4Zo=; b=n0reFxuf+J9gbXgMIJyKYm653/Kjz4BQy2cpar5ZGW0sQGLKxCFF8IJyCZek6lLhxH QsPx0yAZDSL6BVTu39QjbGlnj458/LjUGtLmapnjJHAOEjiJJjMNqXBNdb4GBehLOVUH iAwP1CFaNRTMqzg+678iUKk9FnjHjAWRuQe+osBXSluTg6rUZ0+D+PuqFaBWqdtAJJ2f 7ToySkHl+GyQOXuvYMRDqz4UaCW9DY+yzqIyLrBpkbqxgVe2DTZbJg5s5jZG9eKpEfmw Ml1vB+H4JpKRxPXm+QVk2GXoMKEV4GWcifGoZmZDYkNcidlzcPfPoIDDae5BFv6rT610 06Tw== MIME-Version: 1.0 X-Received: by 10.180.211.206 with SMTP id ne14mr6846859wic.30.1376500429594; Wed, 14 Aug 2013 10:13:49 -0700 (PDT) Sender: adrian.chadd@gmail.com Received: by 10.217.116.136 with HTTP; Wed, 14 Aug 2013 10:13:49 -0700 (PDT) In-Reply-To: References: <201308111650.r7BGo1Qt048071@freefall.freebsd.org> <52099CF4.7050101@meroh.net> Date: Wed, 14 Aug 2013 10:13:49 -0700 X-Google-Sender-Auth: fga-tmcRsF1qqMEbHfe0rbAL5RE Message-ID: Subject: Re: kern/181100: [bwi] Turning up bwi0 crashes / deadlocks the kernel From: Adrian Chadd To: Julio Merino Content-Type: text/plain; charset=ISO-8859-1 X-Content-Filtered-By: Mailman/MimeDel 2.1.14 Cc: "freebsd-wireless@freebsd.org" X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.14 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, 14 Aug 2013 17:13:52 -0000 Hi, Can you please work with Justin to figure out the IP of that panic inside _bwi_txeof(), and then map it back to a line number? I've no idea where the panic is actually triggering. Thanks, -adrian On 13 August 2013 19:45, Julio Merino wrote: > On Tue, Aug 13, 2013 at 5:58 AM, Adrian Chadd wrote: > > Hi! > > > > Please update to the latest -HEAD and try again. > > No luck. It gets a bit further now (ifconfig wlan0 up returns to the > shell) but then panics: > > panic: ring_idx 0 > cpuid = 1 > KDB: stack backtrace: > kdb_backtrace > vpanic > kassert_panic > _bwi_txeof > bwi_txeof_status32 > bwi_intr > intr_event_execute_handlers > ithread_loop > fork_exit > fork_trampoline > > (blindly typed while reading from kdb) > > -- > Julio Merino / @jmmv > From owner-freebsd-wireless@FreeBSD.ORG Thu Aug 15 11:44:34 2013 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 965F586C; Thu, 15 Aug 2013 11:44:34 +0000 (UTC) (envelope-from qinchenchong@gmail.com) Received: from mail-ve0-x236.google.com (mail-ve0-x236.google.com [IPv6:2607:f8b0:400c:c01::236]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 37B832965; Thu, 15 Aug 2013 11:44:34 +0000 (UTC) Received: by mail-ve0-f182.google.com with SMTP id m1so477701ves.27 for ; Thu, 15 Aug 2013 04:44:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=E4FZ22GilN3BeWwx3YyDoRBJ0YWETAY/ezILnT+0Jik=; b=FfJgc+yHBDfTQYABmvDp3lB4+Pj0pY2Kft2gatNhDeiOiAYzqmpGET0c6YyY/Vua+e xLbuE6kJGjW0OtQskwWV/XYmyw55LD3hBpoClnjXWaiuKQ6iyzOcGcgT6YXL911YkOhA EXcJ2R5bh+/t2a6UeTSoKt06FkxachPFRQxBvUQ8fN3MHCYs89h+HJBcytK9Rh2ctmHn 1TK0+Zx6+qR7gxN7VenJ6TCuLbjEDXH2ueTJKIbVUAarwOdG1UP/rKLt2+JADkN8ia5V f57DXSIIDCaY0601qyeaPhu8oJVCbRdXth/sFtVpqOrFwoHUBFanoBfREjnI87cSoaa2 Gmdg== MIME-Version: 1.0 X-Received: by 10.220.164.70 with SMTP id d6mr14046428vcy.19.1376567073265; Thu, 15 Aug 2013 04:44:33 -0700 (PDT) Received: by 10.220.57.142 with HTTP; Thu, 15 Aug 2013 04:44:33 -0700 (PDT) In-Reply-To: References: Date: Thu, 15 Aug 2013 19:44:33 +0800 Message-ID: Subject: Re: Chenchong's work on net80211_ratectl From: Chenchong Qin To: Adrian Chadd Content-Type: text/plain; charset=ISO-8859-1 X-Content-Filtered-By: Mailman/MimeDel 2.1.14 Cc: "freebsd-wireless@freebsd.org" X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.14 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, 15 Aug 2013 11:44:34 -0000 Hi! Sorry to miss it. It's added now. Thanks! Chenchong On Thu, Aug 15, 2013 at 12:34 AM, Adrian Chadd wrote: > Hi! > > Just a note - you need to keep the old copyright headers for code you've > just shifted around. > > Eg, the ieee80211_rc_sample.[ch] files. > > > -adrian > > > > On 13 August 2013 05:21, Chenchong Qin wrote: > >> Hi! >> >> Here is an update of work these days. >> >> I've added a new struct called ieee80211_rc_info to the ratectl API. It >> contains tx completing information, i.e. txcnt, retrycnt, finaltsi, etc, >> which >> can be provided to ratectl algo during the __complete__ period. ir_rates, >> ieee80211_ratectl_rates and ieee80211_ratectl_complete_rcflags are >> adapted to accept the ieee80211_rc_info pointer through which framelen >> and shortpreamble can also be reached. Then I added __complete__ stuff >> and ir_rates to ieee80211_rc_sample. >> >> Thanks! >> >> Chenchong >> >> >> On Tue, Aug 6, 2013 at 12:03 AM, Adrian Chadd wrote: >> >>> Hi! >>> >>> Great! >>> >>> So what's the problem with complete? Linux just provides all the >>> information that the NIC supplies - how many attempts were made, how >>> many attempts failed, which rate suceeded, etc. It looks a lot like it >>> was designed around the requirements for the atheros driver (that has >>> the most interesting information available) and other NICs just have >>> to fake it somehow. >>> >>> >>> >>> -adrian >>> >>> On 5 August 2013 08:58, Chenchong Qin wrote: >>> > Hi! >>> > >>> > Here is my work done these days on porting ath_rate_sample to >>> net80211. It >>> > has not been finished yet. _complete_ and _update_ are to be added. >>> > >>> > _complete_ is really a tricky thing. We have to provide rc algos with >>> rc >>> > information >>> > during the frame completion period. Different rc algos may need >>> different rc >>> > information. What makes things more thornier is that different drivers >>> > provide >>> > different rc information in different ways. So, it seems we need a >>> unified >>> > way to >>> > provide the rc information during completion of a frame. >>> > >>> > I'm browsing mac80211 these days to see what Linux do about >>> _complete_. And, >>> > looking forward to your commets! >>> > >>> > Thanks! >>> > >>> > Chenchong >>> > >>> > >>> > On Sat, Aug 3, 2013 at 1:30 AM, Adrian Chadd >>> wrote: >>> >> >>> >> Well just remember you can always ask me/us questions! >>> >> >>> >> What's your latest diff against -HEAD? Maybe I can start looking at >>> >> including parts of it in the tree. >>> >> >>> >> >>> >> >>> >> >>> >> -adrian >>> >> >>> >> On 2 August 2013 09:17, Chenchong Qin wrote: >>> >> > Hi! >>> >> > >>> >> > These days, I'm taking a further look at what Linux done for the >>> >> > _completion_ of a >>> >> > frame. Some updates will be posted here later. >>> >> > >>> >> > And, with ir_rates, we can return/fill an rc array rather than just >>> >> > returning the rix. >>> >> > >>> >> > Thanks! >>> >> > >>> >> > Chenchong >>> >> > >>> >> > >>> >> > >>> >> > >>> >> > >>> >> > On Thu, Aug 1, 2013 at 12:21 AM, Adrian Chadd >>> >> > wrote: >>> >> >> >>> >> >> Boo! >>> >> >> >>> >> >> Do you have another update? >>> >> >> >>> >> >> >>> >> >> >>> >> >> -adrian >>> >> >> >>> >> >> On 24 July 2013 06:44, Adrian Chadd wrote: >>> >> >> > On 24 July 2013 06:38, Chenchong Qin >>> wrote: >>> >> >> >> >>> >> >> >> My pleasure! >>> >> >> >> >>> >> >> >> It's also against HEAD. >>> >> >> >> >>> >> >> >> Thanks! >>> >> >> > >>> >> >> > Ok. This is looking great! >>> >> >> > >>> >> >> > Next - we need to update the rate control API to now populate an >>> rc >>> >> >> > array rather than just returning the rix. >>> >> >> > >>> >> >> > This is the tricky part - as we're going to have to modify all >>> the >>> >> >> > drivers that use the rate control API to use this. >>> >> >> > Which is fine, as there's only a handful. It's just annoying. >>> >> >> > >>> >> >> > Then we have to provide the rate control information during frame >>> >> >> > _completion_, so the rate control code knows which transmission >>> rates >>> >> >> > succeeded or failed. I'm still not sure what to do about it here. >>> >> >> > Maybe do something like Linux and attach TX rate control and >>> >> >> > completion information as an mbuf tag? >>> >> >> > >>> >> >> > _Then_ we can start doing interesting thing with it. :) >>> >> >> > >>> >> >> > >>> >> >> > >>> >> >> > -adrian >>> >> > >>> >> > >>> > >>> > >>> >> >> > From owner-freebsd-wireless@FreeBSD.ORG Thu Aug 15 12:03:32 2013 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 643BF2A0; Thu, 15 Aug 2013 12:03:32 +0000 (UTC) (envelope-from qinchenchong@gmail.com) Received: from mail-vb0-x233.google.com (mail-vb0-x233.google.com [IPv6:2607:f8b0:400c:c02::233]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id D0B372AD7; Thu, 15 Aug 2013 12:03:31 +0000 (UTC) Received: by mail-vb0-f51.google.com with SMTP id x16so437856vbf.24 for ; Thu, 15 Aug 2013 05:03:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=lS1JznlvIcv/eRJULwv/O1uCEiI1Bxc9NEbAjozv2q0=; b=YngHIUUG/xkeYRhof0ESUwkJY+zPoZ9krh5Sd81VmGqgkby26YCtU6v8b+6n1n3DxM iADGzu1wo6diEJtHQgcL13gsTPnS6QXrvsXDvrIn6oWizYdpuprNQzKxxeM7r6cUg/5j gDkGesNoxvOH0XxIg+3iTXD9Ds/nToMjVYAfSwGAwlFpol0BwA9zU76+x0JAeEUATXU8 gudJeFiUTDNuPp1XLWisICRINH4hHWk+53YWv6xiFcBKCdeUgWCbMVGxKQ/JVPhKqQ2T 9R5g3HiOS1UCMlhcogGw3z1couga7pjR+KMbMId6m0+KDRtm15z/oFWBZv393nc+OFmi h7NQ== MIME-Version: 1.0 X-Received: by 10.221.6.195 with SMTP id ol3mr1267vcb.34.1376568210967; Thu, 15 Aug 2013 05:03:30 -0700 (PDT) Received: by 10.220.57.142 with HTTP; Thu, 15 Aug 2013 05:03:30 -0700 (PDT) In-Reply-To: References: Date: Thu, 15 Aug 2013 20:03:30 +0800 Message-ID: Subject: Re: Chenchong's work on net80211_ratectl From: Chenchong Qin To: Adrian Chadd Content-Type: multipart/mixed; boundary=089e013cbc8c39586e04e3fb4374 X-Content-Filtered-By: Mailman/MimeDel 2.1.14 Cc: "freebsd-wireless@freebsd.org" X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.14 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, 15 Aug 2013 12:03:32 -0000 --089e013cbc8c39586e04e3fb4374 Content-Type: text/plain; charset=ISO-8859-1 Hi! Here is my latest update. In this update: * add a new struct, ieee80211_ratectl_node. This is the common state that all per node rc state, i.e. ieee80211_[amrr|sample]_node, should contains it as the first field. It's now used to store the capabilities. see below. * rename ir_capabilities to irn_capabilities and move it to ieee80211_ratectl_node (it contained in ieee80211_[amrr|sample]_node). ieee80211_ratectl is readonly, so ir_capabilities can't be set. And, the capabilities is not a part of rc algo. It seems that it should be put in the per node rc state. Interface of ieee80211_ratectl_node_init() and its callers are updated. References to ir_capabilities are also adapted. * add ieee80211_ratectl_[node_is11n|get_rateset] to the ratectl api. rc algoes all need these functions. * change the naming conversion of IEEE80211_RATECTL_FLAG_*. * some errors fixed. On Thu, Aug 15, 2013 at 12:58 AM, Adrian Chadd wrote: > Hi! > > So yes, we do need to have a generic way of returning that completion > information to the rate control code. > > I'm all for you churning the rate control API to return a struct > ieee80211_rc_info in the complete function and totally just kill arg1/arg2. > That forces us to extend ieee80211_rc_info to be "right" for all the > drivers. > Do you mean drop arg1/arg2 and pass pointer of ieee80211_rc_info to the complete function directly? Or return it when complete function return? > What wifi devices do you have there? It looks like we're almost at the > point where we can start converting a few things to use the modified rate > control API and modules - notably iwn (which won't use the multi-rate retry > stuff to begin with - it works "differently"..) and ath (which will use the > multi-rate retry stuff and the sample rate control module.) > Yeah, I have an AR9227 device at hand. And, I also get a question here. The ieee80211_ratetable doesn't get a rateCode field. So, how we get the ratecode of the non_ht rate? Thanks! Chenchong --089e013cbc8c39586e04e3fb4374 Content-Type: application/octet-stream; name="20130815-net80211-ratectl.diff" Content-Disposition: attachment; filename="20130815-net80211-ratectl.diff" Content-Transfer-Encoding: base64 X-Attachment-Id: f_hkdwimbd0 SW5kZXg6IG5ldDgwMjExL2llZWU4MDIxMV9yYXRlY3RsX25vbmUuYwo9PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBu ZXQ4MDIxMS9pZWVlODAyMTFfcmF0ZWN0bF9ub25lLmMJKHJldmlzaW9uIDI1NDgyNikKKysrIG5l dDgwMjExL2llZWU4MDIxMV9yYXRlY3RsX25vbmUuYwkod29ya2luZyBjb3B5KQpAQCAtNTcsNyAr NTcsNyBAQAogfQogCiBzdGF0aWMgdm9pZAotbm9uZV9ub2RlX2luaXQoc3RydWN0IGllZWU4MDIx MV9ub2RlICpuaSkKK25vbmVfbm9kZV9pbml0KHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqbmksIHVp bnQzMl90IGNhcGFiaWxpdGllcykKIHsKIAluaS0+bmlfdHhyYXRlID0gbmktPm5pX3JhdGVzLnJz X3JhdGVzWzBdICYgSUVFRTgwMjExX1JBVEVfVkFMOwogfQpJbmRleDogbmV0ODAyMTEvaWVlZTgw MjExX3JhdGVjdGwuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBuZXQ4MDIxMS9pZWVlODAyMTFfcmF0ZWN0bC5j CShyZXZpc2lvbiAyNTQ4MjYpCisrKyBuZXQ4MDIxMS9pZWVlODAyMTFfcmF0ZWN0bC5jCSh3b3Jr aW5nIGNvcHkpCkBAIC0xLDUgKzEsNiBAQAogLyotCiAgKiBDb3B5cmlnaHQgKGMpIDIwMTAgUnVp IFBhdWxvIDxycGF1bG9ARnJlZUJTRC5vcmc+CisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgQ2hlbmNo b25nIFFpbiA8Y2NxaW5ARnJlZUJTRC5vcmc+CiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoK ICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp dGggb3Igd2l0aG91dApAQCAtNDksNiArNTAsMzMgQEAKIAogTUFMTE9DX0RFRklORShNXzgwMjEx X1JBVEVDVEwsICI4MDIxMXJhdGVjdGwiLCAiODAyLjExIHJhdGUgY29udHJvbCIpOwogCitpbnQg bWF4XzRtc19mcmFtZWxlbls0XVszMl0gPSB7CisJW01DU19IVDIwXSA9IHsKKwkJMzIxMiwgIDY0 MzIsICA5NjQ4LCAgMTI4NjQsICAxOTMwMCwgIDI1NzM2LCAgMjg5NTIsICAzMjE3MiwKKwkJNjQy NCwgIDEyODUyLCAxOTI4MCwgMjU3MDgsICAzODU2OCwgIDUxNDI0LCAgNTc4NTIsICA2NDI4MCwK KwkJOTYyOCwgIDE5MjYwLCAyODg5NiwgMzg1MjgsICA1Nzc5MiwgIDY1NTMyLCAgNjU1MzIsICA2 NTUzMiwKKwkJMTI4MjgsIDI1NjU2LCAzODQ4OCwgNTEzMjAsICA2NTUzMiwgIDY1NTMyLCAgNjU1 MzIsICA2NTUzMiwKKwl9LAorCVtNQ1NfSFQyMF9TR0ldID0geworCQkzNTcyLCAgNzE0NCwgIDEw NzIwLCAgMTQyOTYsICAyMTQ0NCwgIDI4NTk2LCAgMzIxNzIsICAzNTc0NCwKKwkJNzE0MCwgIDE0 Mjg0LCAyMTQyOCwgIDI4NTY4LCAgNDI4NTYsICA1NzE0NCwgIDY0Mjg4LCAgNjU1MzIsCisJCTEw NzAwLCAyMTQwOCwgMzIxMTIsICA0MjgxNiwgIDY0MjI4LCAgNjU1MzIsICA2NTUzMiwgIDY1NTMy LAorCQkxNDI1NiwgMjg1MTYsIDQyNzgwLCAgNTcwNDAsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIs ICA2NTUzMiwKKwl9LAorCVtNQ1NfSFQ0MF0gPSB7CisJCTY2ODAsICAxMzM2MCwgIDIwMDQ0LCAg MjY3MjQsICA0MDA5MiwgIDUzNDU2LCAgNjAxNDAsICA2NTUzMiwKKwkJMTMzNDgsIDI2NzAwLCAg NDAwNTIsICA1MzQwMCwgIDY1NTMyLCAgNjU1MzIsICA2NTUzMiwgIDY1NTMyLAorCQkyMDAwNCwg NDAwMDgsICA2MDAxNiwgIDY1NTMyLCAgNjU1MzIsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIsCisJ CTI2NjQ0LCA1MzI5MiwgIDY1NTMyLCAgNjU1MzIsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIsICA2 NTUzMiwKKwl9LAorCVtNQ1NfSFQ0MF9TR0ldID0geworCQk3NDIwLCAgMTQ4NDQsICAyMjI3Miwg IDI5Njk2LCAgNDQ1NDQsICA1OTM5NiwgIDY1NTMyLCAgNjU1MzIsCisJCTE0ODMyLCAyOTY2OCwg IDQ0NTA0LCAgNTkzNDAsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIsICA2NTUzMiwKKwkJMjIyMzIs IDQ0NDY0LCAgNjU1MzIsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIsICA2NTUzMiwgIDY1NTMyLAor CQkyOTYxNiwgNTkyMzIsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIsICA2NTUzMiwgIDY1NTMyLCAg NjU1MzIsCisJfQorfTsKKwogdm9pZAogaWVlZTgwMjExX3JhdGVjdGxfcmVnaXN0ZXIoaW50IHR5 cGUsIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmF0ZWN0bCAqcmF0ZWN0bCkKIHsKQEAgLTkwLDMg KzExOCwxMDIgQEAKIAl9CiAJdmFwLT5pdl9yYXRlID0gcmF0ZWN0bHNbdHlwZV07CiB9CisKK3Zv aWQKK2llZWU4MDIxMV9yYXRlY3RsX2NvbXBsZXRlX3JjZmxhZ3Moc3RydWN0IGllZWU4MDIxMV9u b2RlICpuaSwKKwkJc3RydWN0IGllZWU4MDIxMV9yY19pbmZvICpyY19pbmZvKQoreworCWNvbnN0 IHN0cnVjdCBpZWVlODAyMTFfcmF0ZV90YWJsZSAqIHJ0ID0gTlVMTDsKKwlzdHJ1Y3QgaWVlZTgw MjExX3JjX3NlcmllcyAqcmMgPSByY19pbmZvLT5yaV9yYzsKKwkvKiBpbnQgc2hvcnRQcmVhbWJs ZSA9IHJjX2luZm8tPnJpX3Nob3J0UHJlYW1ibGU7ICovCisJdWludDhfdCByYXRlOworCWludCBp OworCisJcnQgPSBpZWVlODAyMTFfZ2V0X3JhdGV0YWJsZShuaS0+bmlfaWMtPmljX2N1cmNoYW4p OworCisJLyogTWFrZSBzdXJlIHRoYXQgcmF0ZSBjb250cm9sIGNvZGUgZG9lc24ndCBtZXNzIGl0 IHVwLgorCSAqIElmIGVuYWJsZSBydHMvY3RzIGFuZCBpcyBwcmUtODAyLjExbiwgYmxhbmsgdHJp ZXMgMSwgMiwgMyAKKwkgKi8KKworCWlmICghIElFRUU4MDIxMV9SQVRFQ1RMX0hBU0NBUF9NUlJQ Uk9UKG5pKSkKKwl7CisJCWZvciAoaSA9IDE7IGkgPCBJRUVFODAyMTFfUkFURUNUTF9OVU07IGkr KykKKwkJeworCQkJaWYgKHJjWzBdLmZsYWdzICYgSUVFRTgwMjExX1JBVEVDVExfRkxBR19SVFND VFMpCisJCQkJcmNbaV0udHJpZXMgPSAwOworCQkJcmNbaV0uZmxhZ3MgJj0gfklFRUU4MDIxMV9S QVRFQ1RMX0ZMQUdfUlRTQ1RTOyAKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBJRUVFODAy MTFfUkFURUNUTF9OVU07IGkrKykgeworCQkKKwkJaWYgKHJjW2ldLnRyaWVzID09IDApCisJCQlj b250aW51ZTsKKworCQlyYXRlID0gcnQtPmluZm9bcmNbaV0ucml4XS5kb3QxMVJhdGU7CisKKwkJ LyoKKwkJICogT25seSBlbmFibGUgc2hvcnQgcHJlYW1ibGUgZm9yIGxlZ2FjeSByYXRlcworCQkg Ki8KKworCQkvKiBYWFggaG93IHdlIGdldCB0aGUgbm9uX2h0IHJhdGVjb2RlIGhlcmU/ICovCisK KwkJI2lmIDAKKwkJaWYgKCghIElTX0hUX1JBVEUocmF0ZSkpICYmIHNob3J0UHJlYW1ibGUpCisJ CQlyYXRlIHw9IHJ0LT5pbmZvW3JjW2ldLnJpeF0uc2hvcnRQcmVhbWJsZTsKKwkJI2VuZGlmCisK KwkJLyoKKwkJICogU2F2ZSB0aGlzLCB1c2VkIGJ5IHRoZSBUWCBhbmQgY29tcGxldGlvbiBjb2Rl CisJCSAqLworCQlyY1tpXS5yYXRlY29kZSA9IHJhdGU7CisKKwkJLyogT25seSBlbmFibGUgc2hv cnRnaSwgMjA0MCwgZHVhbC1zdHJlYW0gaWYgSFQgaXMgc2V0ICovCisJCWlmIChJU19IVF9SQVRF KHJhdGUpKSB7CisJCQlyY1tpXS5mbGFncyB8PSBJRUVFODAyMTFfUkFURUNUTF9GTEFHX0hUOwor CisJCQkvKgorCQkJICogWFhYIFRPRE86IExEUEMKKwkJCSAqLworCisJCQkvKgorCQkJICogRHVh bCAvIFRyaXBsZSBzdHJlYW0gcmF0ZT8KKwkJCSAqLworCQkJaWYgKEhUX1JDXzJfU1RSRUFNUyhy YXRlKSA9PSAyKQorCQkJCXJjW2ldLmZsYWdzIHw9IElFRUU4MDIxMV9SQVRFQ1RMX0ZMQUdfRFM7 CisJCQllbHNlIGlmIChIVF9SQ18yX1NUUkVBTVMocmF0ZSkgPT0gMykKKwkJCQlyY1tpXS5mbGFn cyB8PSBJRUVFODAyMTFfUkFURUNUTF9GTEFHX1RTOworCQl9CisKKwkJLyoKKwkJICogQ2FsY3Vs YXRlIHRoZSBtYXhpbXVtIFRYIHBvd2VyIGNhcCBmb3IgdGhlIGN1cnJlbnQKKwkJICogbm9kZS4g CisJCSAqIFJhdGUgY29udHJvbCBhbGdvIGNhbid0IGNvbnRyb2wgVFggcG93ZXIgYnkgbm93Lgor CQkgKi8KKwkJcmNbaV0udHhfcG93ZXJfY2FwID0gaWVlZTgwMjExX2dldF9ub2RlX3R4cG93ZXIo bmkpOworCQkKKwkJLyoKKwkJICogQ2FsY3VsYXRlIHRoZSBtYXhpbXVtIDRtcyBmcmFtZSBsZW5n dGggYmFzZWQKKwkJICogb24gdGhlIE1DUyByYXRlLCBTR0kgYW5kIGNoYW5uZWwgd2lkdGggZmxh Z3MuCisJCSAqLworCQlpZiAoKHJjW2ldLmZsYWdzICYgSUVFRTgwMjExX1JBVEVDVExfRkxBR19I VCkgJiYKKwkJICAgIChIVF9SQ18yX01DUyhyYXRlKSA8IDMyKSkgeworCQkJaW50IGo7CisJCQlp ZiAocmNbaV0uZmxhZ3MgJiBJRUVFODAyMTFfUkFURUNUTF9GTEFHX0NXNDApIHsKKwkJCQlpZiAo cmNbaV0uZmxhZ3MgJiBJRUVFODAyMTFfUkFURUNUTF9GTEFHX1NHSSkKKwkJCQkJaiA9IE1DU19I VDQwX1NHSTsKKwkJCQllbHNlCisJCQkJCWogPSBNQ1NfSFQ0MDsKKwkJCX0gZWxzZSB7CisJCQkJ aWYgKHJjW2ldLmZsYWdzICYgSUVFRTgwMjExX1JBVEVDVExfRkxBR19TR0kpCisJCQkJCWogPSBN Q1NfSFQyMF9TR0k7CisJCQkJZWxzZQorCQkJCQlqID0gTUNTX0hUMjA7CisJCQl9CisJCQlyY1tp XS5tYXg0bXNmcmFtZWxlbiA9CisJCQkgICAgbWF4XzRtc19mcmFtZWxlbltqXVtIVF9SQ18yX01D UyhyYXRlKV07CisJCX0gZWxzZQorCQkJcmNbaV0ubWF4NG1zZnJhbWVsZW4gPSAwOworCX0KK30K KwpJbmRleDogbmV0ODAyMTEvaWVlZTgwMjExX3JhdGVjdGwuaAo9PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBuZXQ4 MDIxMS9pZWVlODAyMTFfcmF0ZWN0bC5oCShyZXZpc2lvbiAyNTQ4MjYpCisrKyBuZXQ4MDIxMS9p ZWVlODAyMTFfcmF0ZWN0bC5oCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNiBAQAogLyotCiAg KiBDb3B5cmlnaHQgKGMpIDIwMTAgUnVpIFBhdWxvIDxycGF1bG9ARnJlZUJTRC5vcmc+CisgKiBD b3B5cmlnaHQgKGMpIDIwMTMgQ2hlbmNob25nIFFpbiA8Y2NxaW5ARnJlZUJTRC5vcmc+CiAgKiBB bGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291 cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtMjQsNiArMjUsOCBAQAog ICoKICAqICRGcmVlQlNEJAogICovCisjaWZuZGVmIF9ORVQ4MDIxMV9JRUVFODAyMTFfUkFURUNU TF9IXworI2RlZmluZSBfTkVUODAyMTFfSUVFRTgwMjExX1JBVEVDVExfSF8KIAogZW51bSBpZWVl ODAyMTFfcmF0ZWFsZ3MgewogCUlFRUU4MDIxMV9SQVRFQ1RMX0FNUlIJCT0gMCwKQEAgLTM3LDYg KzQwLDY1IEBACiAjZGVmaW5lCUlFRUU4MDIxMV9SQVRFQ1RMX1RYX1NVQ0NFU1MJMQogI2RlZmlu ZQlJRUVFODAyMTFfUkFURUNUTF9UWF9GQUlMVVJFCTAKIAorI2RlZmluZQlJRUVFODAyMTFfUkFU RUNUTF9UUlVFCQkxCisjZGVmaW5lCUlFRUU4MDIxMV9SQVRFQ1RMX0ZBTFNFCQkwCisKKyNkZWZp bmUJSUVFRTgwMjExX1JBVEVDVExfTlVNCQk0CisKKyNkZWZpbmUJSUVFRTgwMjExX1JBVEVDVExf RkxBR19EUwkJMHgwMQkvKiBkdWFsLXN0cmVhbSByYXRlICovCisjZGVmaW5lCUlFRUU4MDIxMV9S QVRFQ1RMX0ZMQUdfQ1c0MAkJMHgwMgkvKiB1c2UgSFQ0MCAqLworI2RlZmluZQlJRUVFODAyMTFf UkFURUNUTF9GTEFHX1NHSQkJMHgwNAkvKiB1c2Ugc2hvcnQtR0kgKi8KKyNkZWZpbmUJSUVFRTgw MjExX1JBVEVDVExfRkxBR19IVAkJMHgwOAkvKiB1c2UgSFQgKi8KKyNkZWZpbmUJSUVFRTgwMjEx X1JBVEVDVExfRkxBR19SVFNDVFMJMHgxMAkvKiBlbmFibGUgUlRTL0NUUyBwcm90ZWN0aW9uICov CisjZGVmaW5lCUlFRUU4MDIxMV9SQVRFQ1RMX0ZMQUdfU1RCQwkJMHgyMAkvKiBlbmFibGUgU1RC QyAqLworI2RlZmluZQlJRUVFODAyMTFfUkFURUNUTF9GTEFHX1RTCQkweDQwCS8qIHRyaXBsZS1z dHJlYW0gcmF0ZSAqLworCisvKiBIYXJkd2FyZSBDQVBzIG9mZmVyZWQgdG8gcmF0ZSBjb250cm9s IGFsZ28gKi8KKyNkZWZpbmUJSUVFRTgwMjExX1JBVEVDVExfQ0FQX01SUgkJCTB4MDEJLyogc3Vw cG9ydCBNUlIgKi8KKyNkZWZpbmUJSUVFRTgwMjExX1JBVEVDVExfQ0FQX01SUlBST1QJCTB4MDIJ Lyogc3VwcG9ydCBNUlIgKyBwcm90ZWN0ICovCisjZGVmaW5lCUlFRUU4MDIxMV9SQVRFQ1RMX0NB UF9NVUxUWENIQUlOCTB4MDQJLyogaGFzIG1vcmUgdGhhbiAxIHR4Y2hhaW4gKi8KKworI2RlZmlu ZSBJU19WQVBfSFQodmFwKQkoKHZhcCktPml2X2h0Y2FwcyAmIElFRUU4MDIxMV9IVENfSFQpCisj ZGVmaW5lIElTX0hUX1JBVEUoX3JhdGUpICAgKChfcmF0ZSkgJiAweDgwKQorI2RlZmluZSBIVF9S Q18yX01DUyhfcmMpICAgICgoX3JjKSAmIDB4N2YpCisjZGVmaW5lIEhUX1JDXzJfU1RSRUFNUyhf cmMpICAgICgoKChfcmMpICYgMHg3OCkgPj4gMykgKyAxKQorCitlbnVtIHsKKwlNQ1NfSFQyMCwK KwlNQ1NfSFQyMF9TR0ksCisJTUNTX0hUNDAsCisJTUNTX0hUNDBfU0dJLAorfTsKKworZXh0ZXJu IGludCBtYXhfNG1zX2ZyYW1lbGVuWzRdWzMyXTsKKworc3RydWN0IGllZWU4MDIxMV9yY19zZXJp ZXMgeworCXVpbnQ4X3Qgcml4OwkJLyogcmF0ZXRhYmxlIGluZGV4LCBub3QgcmF0ZSBjb2RlICov CisJdWludDhfdCByYXRlY29kZTsJLyogaGFyZHdhcmUgcmF0ZSBjb2RlICovCisJdWludDhfdCB0 cmllczsKKwl1aW50OF90IHR4X3Bvd2VyX2NhcDsKKwl1aW50MTZfdCBmbGFnczsKKwl1aW50MTZf dCBtYXg0bXNmcmFtZWxlbjsKK307CisKKy8qIG5ldDgwMjExIHJhdGUgY29udHJvbCBpbmZvbWF0 aW9uICovCitzdHJ1Y3QgaWVlZTgwMjExX3JjX2luZm8geworCXN0cnVjdCBpZWVlODAyMTFfcmNf c2VyaWVzIHJpX3JjW0lFRUU4MDIxMV9SQVRFQ1RMX05VTV07CisJaW50IHJpX2ZyYW1lbGVuOwor CWludCByaV9zaG9ydFByZWFtYmxlOworCisJLyogVFggaW5mbyAqLworCWludCByaV9zdWNjZXNz OwkJLyogVFggc3VjY2VzcyBvciBub3QgKi8KKwlpbnQgcmlfb2tjbnQ7CQkvKiBUWCBvayB3aXRo IG9yIHdpdGhvdXQgcmV0cnkgKi8KKwlpbnQgcmlfZmFpbGNudDsJCS8qIFRYIHJldHJ5LWZhaWwg Y291bnQgKi8KKwlpbnQgcmlfdHhjbnQ7CQkvKiBUWCBjb3VudCAqLworCWludCByaV9yZXRyeWNu dDsJLyogVFggcmV0cnkgY291bnQgKi8KKwlpbnQgcmlfc2hvcnRyZXRyeTsKKwlpbnQgcmlfbG9u Z3JldHJ5OworCWludCByaV9maW5hbHRzaTsKKwlpbnQgcmlfdHhyYXRlOwkJLyogaHcgdHggcmF0 ZSAqLworfTsKKwogc3RydWN0IGllZWU4MDIxMV9yYXRlY3RsIHsKIAljb25zdCBjaGFyICppcl9u YW1lOwogCWludAkoKmlyX2F0dGFjaCkoY29uc3Qgc3RydWN0IGllZWU4MDIxMXZhcCAqKTsKQEAg LTQzLDkgKzEwNSwxMCBAQAogCXZvaWQJKCppcl9kZXRhY2gpKGNvbnN0IHN0cnVjdCBpZWVlODAy MTF2YXAgKik7CiAJdm9pZAkoKmlyX2luaXQpKHN0cnVjdCBpZWVlODAyMTF2YXAgKik7CiAJdm9p ZAkoKmlyX2RlaW5pdCkoc3RydWN0IGllZWU4MDIxMXZhcCAqKTsKLQl2b2lkCSgqaXJfbm9kZV9p bml0KShzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKik7CisJdm9pZAkoKmlyX25vZGVfaW5pdCkoc3Ry dWN0IGllZWU4MDIxMV9ub2RlICosIHVpbnQzMl90KTsKIAl2b2lkCSgqaXJfbm9kZV9kZWluaXQp KHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqKTsKIAlpbnQJKCppcl9yYXRlKShzdHJ1Y3QgaWVlZTgw MjExX25vZGUgKiwgdm9pZCAqLCB1aW50MzJfdCk7CisJdm9pZAkoKmlyX3JhdGVzKShzdHJ1Y3Qg aWVlZTgwMjExX25vZGUgKiwgc3RydWN0IGllZWU4MDIxMV9yY19pbmZvICopOwogCXZvaWQJKCpp cl90eF9jb21wbGV0ZSkoY29uc3Qgc3RydWN0IGllZWU4MDIxMXZhcCAqLAogCSAgICAJCQkgIGNv bnN0IHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqLCBpbnQsCiAJICAgIAkJCSAgdm9pZCAqLCB2b2lk ICopOwpAQCAtNTUsMTAgKzExOCwyNyBAQAogCXZvaWQJKCppcl9zZXRpbnRlcnZhbCkoY29uc3Qg c3RydWN0IGllZWU4MDIxMXZhcCAqLCBpbnQpOwogfTsKIAorLyogcGVyIHJhdGVjdGwgbm9kZSBt dXN0IHN0YXJ0IHdpdGggdGhpcyBjb21tb24gc3RhdGUgKi8KK3N0cnVjdCBpZWVlODAyMTFfcmF0 ZWN0bF9ub2RlIHsKKwl1aW50MzJfdCBpcm5fY2FwYWJpbGl0aWVzOwkJLyogaGFyZHdhcmUgY2Fw YWJpbGl0aWVzIG9mZmVyZWQgdG8gcmMgKi8KK307CisKKyNkZWZpbmUgSUVFRTgwMjExX1JBVEVD VExfTk9ERShfbmkpIFwKKwkoKHN0cnVjdCBpZWVlODAyMTFfcmF0ZWN0bF9ub2RlICopKChfbmkp LT5uaV9yY3RscykpCisKKyNkZWZpbmUJSUVFRTgwMjExX1JBVEVDVExfSEFTQ0FQX01SUihfbmkp IFwKKwkoSUVFRTgwMjExX1JBVEVDVExfTk9ERShfbmkpLT5pcm5fY2FwYWJpbGl0aWVzICYgSUVF RTgwMjExX1JBVEVDVExfQ0FQX01SUikKKyNkZWZpbmUJSUVFRTgwMjExX1JBVEVDVExfSEFTQ0FQ X01SUlBST1QoX25pKSBcCisJKElFRUU4MDIxMV9SQVRFQ1RMX05PREUoX25pKS0+aXJuX2NhcGFi aWxpdGllcyAmIElFRUU4MDIxMV9SQVRFQ1RMX0NBUF9NUlJQUk9UKQorI2RlZmluZQlJRUVFODAy MTFfUkFURUNUTF9IQVNDQVBfTVVMVFhDSEFJTihfbmkpIFwKKwkoSUVFRTgwMjExX1JBVEVDVExf Tk9ERShfbmkpLT5pcm5fY2FwYWJpbGl0aWVzICYgSUVFRTgwMjExX1JBVEVDVExfQ0FQX01VTFRY Q0hBSU4pCisKIHZvaWQJaWVlZTgwMjExX3JhdGVjdGxfcmVnaXN0ZXIoaW50LCBjb25zdCBzdHJ1 Y3QgaWVlZTgwMjExX3JhdGVjdGwgKik7CiB2b2lkCWllZWU4MDIxMV9yYXRlY3RsX3VucmVnaXN0 ZXIoaW50KTsKIHZvaWQJaWVlZTgwMjExX3JhdGVjdGxfaW5pdChzdHJ1Y3QgaWVlZTgwMjExdmFw ICopOwogdm9pZAlpZWVlODAyMTFfcmF0ZWN0bF9zZXQoc3RydWN0IGllZWU4MDIxMXZhcCAqLCBp bnQpOwordm9pZAlpZWVlODAyMTFfcmF0ZWN0bF9jb21wbGV0ZV9yY2ZsYWdzKHN0cnVjdCBpZWVl ODAyMTFfbm9kZSAqLCAKKwkJc3RydWN0IGllZWU4MDIxMV9yY19pbmZvKik7CiAKIE1BTExPQ19E RUNMQVJFKE1fODAyMTFfUkFURUNUTCk7CiAKQEAgLTY5LDExICsxNDksMTEgQEAKIH0KIAogc3Rh dGljIHZvaWQgX19pbmxpbmUKLWllZWU4MDIxMV9yYXRlY3RsX25vZGVfaW5pdChzdHJ1Y3QgaWVl ZTgwMjExX25vZGUgKm5pKQoraWVlZTgwMjExX3JhdGVjdGxfbm9kZV9pbml0KHN0cnVjdCBpZWVl ODAyMTFfbm9kZSAqbmksIHVpbnQzMl90IGNhcGFiaWxpdGllcykKIHsKIAljb25zdCBzdHJ1Y3Qg aWVlZTgwMjExdmFwICp2YXAgPSBuaS0+bmlfdmFwOwogCi0JdmFwLT5pdl9yYXRlLT5pcl9ub2Rl X2luaXQobmkpOworCXZhcC0+aXZfcmF0ZS0+aXJfbm9kZV9pbml0KG5pLCBjYXBhYmlsaXRpZXMp OwogfQogCiBzdGF0aWMgdm9pZCBfX2lubGluZQpAQCAtOTMsNiArMTczLDE1IEBACiB9CiAKIHN0 YXRpYyB2b2lkIF9faW5saW5lCitpZWVlODAyMTFfcmF0ZWN0bF9yYXRlcyhzdHJ1Y3QgaWVlZTgw MjExX25vZGUgKm5pLCBzdHJ1Y3QgaWVlZTgwMjExX3JjX2luZm8gKnJjX2luZm8pCit7CisJY29u c3Qgc3RydWN0IGllZWU4MDIxMXZhcCAqdmFwID0gbmktPm5pX3ZhcDsKKworCXZhcC0+aXZfcmF0 ZS0+aXJfcmF0ZXMobmksIHJjX2luZm8pOworCWllZWU4MDIxMV9yYXRlY3RsX2NvbXBsZXRlX3Jj ZmxhZ3MobmksIHJjX2luZm8pOworfQorCitzdGF0aWMgdm9pZCBfX2lubGluZQogaWVlZTgwMjEx X3JhdGVjdGxfdHhfY29tcGxldGUoY29uc3Qgc3RydWN0IGllZWU4MDIxMXZhcCAqdmFwLAogICAg IGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqbmksIGludCBzdGF0dXMsIHZvaWQgKmFyZzEs IHZvaWQgKmFyZzIpCiB7CkBAIC0xMTUsMyArMjA0LDU5IEBACiAJCXJldHVybjsKIAl2YXAtPml2 X3JhdGUtPmlyX3NldGludGVydmFsKHZhcCwgbXNlY3MpOwogfQorCitzdGF0aWMgaW50IF9faW5s aW5lCitpZWVlODAyMTFfcmF0ZWN0bF9oYXNjYXBfY3c0MChjb25zdCBzdHJ1Y3QgaWVlZTgwMjEx dmFwICp2YXAsCisJCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqbmkpCit7CisJcmV0dXJu IElTX1ZBUF9IVCh2YXApICYmIChuaS0+bmlfY2h3ID09IDQwKTsKK30KKworc3RhdGljIGludCBf X2lubGluZQoraWVlZTgwMjExX3JhdGVjdGxfaGFzY2FwX3Nob3J0Z2koY29uc3Qgc3RydWN0IGll ZWU4MDIxMXZhcCAqdmFwLAorCQljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pKQorewor CWlmIChJU19WQVBfSFQodmFwKSkKKwl7CisJCWlmIChuaS0+bmlfY2h3ID09IDQwICYmCisJCQkJ dmFwLT5pdl9odGNhcHMgJiBJRUVFODAyMTFfSFRDQVBfU0hPUlRHSTQwICYmCisJCQkJbmktPm5p X2h0Y2FwICYgSUVFRTgwMjExX0hUQ0FQX1NIT1JUR0k0MCkKKwkJCXJldHVybiBJRUVFODAyMTFf UkFURUNUTF9UUlVFOworCisJCWlmIChuaS0+bmlfY2h3ID09IDIwICYmCisJCQkJdmFwLT5pdl9o dGNhcHMgJiBJRUVFODAyMTFfSFRDQVBfU0hPUlRHSTIwICYmCisJCQkJbmktPm5pX2h0Y2FwICYg SUVFRTgwMjExX0hUQ0FQX1NIT1JUR0kyMCkKKwkJCXJldHVybiBJRUVFODAyMTFfUkFURUNUTF9U UlVFOworCX0KKwlyZXR1cm4gSUVFRTgwMjExX1JBVEVDVExfRkFMU0U7Cit9CisKKworc3RhdGlj IGludCBfX2lubGluZQoraWVlZTgwMjExX3JhdGVjdGxfaGFzY2FwX3N0YmMoY29uc3Qgc3RydWN0 IGllZWU4MDIxMXZhcCAqdmFwLAorCQljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pKQor eworICAgcmV0dXJuIElTX1ZBUF9IVCh2YXApICYmICh2YXAtPml2X2h0Y2FwcyAmIElFRUU4MDIx MV9IVENBUF9UWFNUQkMpICYmCisJCQkgICAgKG5pLT5uaV9odGNhcCAmIElFRUU4MDIxMV9IVENB UF9SWFNUQkNfMVNUUkVBTSkgJiYKKwkJCSAgICBJRUVFODAyMTFfUkFURUNUTF9IQVNDQVBfTVVM VFhDSEFJTihuaSk7Cit9CisKK3N0YXRpYyBpbnQgX19pbmxpbmUKK2llZWU4MDIxMV9yYXRlY3Rs X25vZGVfaXMxMW4oY29uc3Qgc3RydWN0IGllZWU4MDIxMV9ub2RlICpuaSkKK3sKKwlpZiAobmkt Pm5pX2NoYW4gPT0gTlVMTCkKKwkJcmV0dXJuICgwKTsKKwlpZiAobmktPm5pX2NoYW4gPT0gSUVF RTgwMjExX0NIQU5fQU5ZQykKKwkJcmV0dXJuICgwKTsKKwlyZXR1cm4gKElFRUU4MDIxMV9JU19D SEFOX0hUKG5pLT5uaV9jaGFuKSk7Cit9CisKK19faW5saW5lIHN0YXRpYyBjb25zdCBzdHJ1Y3Qg aWVlZTgwMjExX3JhdGVzZXQgKgoraWVlZTgwMjExX3JhdGVjdGxfZ2V0X3JhdGVzZXQoY29uc3Qg c3RydWN0IGllZWU4MDIxMV9ub2RlICpuaSkKK3sKKwlyZXR1cm4gaWVlZTgwMjExX3JhdGVjdGxf bm9kZV9pczExbihuaSkgPyAKKwkJCQkoc3RydWN0IGllZWU4MDIxMV9yYXRlc2V0ICopICZuaS0+ bmlfaHRyYXRlcyA6CisJCQkJJm5pLT5uaV9yYXRlczsKK30KKworI2VuZGlmCkluZGV4OiBuZXQ4 MDIxMS9pZWVlODAyMTFfc3RhLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gbmV0ODAyMTEvaWVlZTgwMjExX3N0 YS5jCShyZXZpc2lvbiAyNTQ4MjYpCisrKyBuZXQ4MDIxMS9pZWVlODAyMTFfc3RhLmMJKHdvcmtp bmcgY29weSkKQEAgLTE2MzYsNyArMTYzNiw4IEBACiAJCQkgICAgIElFRUU4MDIxMV9GX0pPSU4g fCBJRUVFODAyMTFfRl9ET0JSUyk7CiAJCQlpZWVlODAyMTFfc2V0dXBfYmFzaWNfaHRyYXRlcyhu aSwgaHRpbmZvKTsKIAkJCWllZWU4MDIxMV9ub2RlX3NldHVwdHhwYXJtcyhuaSk7Ci0JCQlpZWVl ODAyMTFfcmF0ZWN0bF9ub2RlX2luaXQobmkpOworCQkJLyogWFhYIFRPRE8gZmlsbCB0aGUgY2Fw IGZpZWxkICovCisJCQlpZWVlODAyMTFfcmF0ZWN0bF9ub2RlX2luaXQobmksIDApOwogCQl9IGVs c2UgewogI2lmZGVmIElFRUU4MDIxMV9TVVBQT1JUX1NVUEVSRwogCQkJaWYgKElFRUU4MDIxMV9B VEhfQ0FQKHZhcCwgbmksIElFRUU4MDIxMV9OT0RFX0FUSCkpCkluZGV4OiBuZXQ4MDIxMS9pZWVl ODAyMTFfYW1yci5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIG5ldDgwMjExL2llZWU4MDIxMV9hbXJyLmMJKHJl dmlzaW9uIDI1NDgyNikKKysrIG5ldDgwMjExL2llZWU4MDIxMV9hbXJyLmMJKHdvcmtpbmcgY29w eSkKQEAgLTQ3LDggKzQ3LDggQEAKIAogI2luY2x1ZGUgPG5ldDgwMjExL2llZWU4MDIxMV92YXIu aD4KICNpbmNsdWRlIDxuZXQ4MDIxMS9pZWVlODAyMTFfaHQuaD4KKyNpbmNsdWRlIDxuZXQ4MDIx MS9pZWVlODAyMTFfcmF0ZWN0bC5oPgogI2luY2x1ZGUgPG5ldDgwMjExL2llZWU4MDIxMV9hbXJy Lmg+Ci0jaW5jbHVkZSA8bmV0ODAyMTEvaWVlZTgwMjExX3JhdGVjdGwuaD4KIAogI2RlZmluZSBp c19zdWNjZXNzKGFtbikJXAogCSgoYW1uKS0+YW1uX3JldHJ5Y250IDwgKGFtbiktPmFtbl90eGNu dCAvIDEwKQpAQCAtNjAsNyArNjAsNyBAQAogc3RhdGljIHZvaWQJYW1ycl9zZXRpbnRlcnZhbChj b25zdCBzdHJ1Y3QgaWVlZTgwMjExdmFwICosIGludCk7CiBzdGF0aWMgdm9pZAlhbXJyX2luaXQo c3RydWN0IGllZWU4MDIxMXZhcCAqKTsKIHN0YXRpYyB2b2lkCWFtcnJfZGVpbml0KHN0cnVjdCBp ZWVlODAyMTF2YXAgKik7Ci1zdGF0aWMgdm9pZAlhbXJyX25vZGVfaW5pdChzdHJ1Y3QgaWVlZTgw MjExX25vZGUgKik7CitzdGF0aWMgdm9pZAlhbXJyX25vZGVfaW5pdChzdHJ1Y3QgaWVlZTgwMjEx X25vZGUgKiwgdWludDMyX3QpOwogc3RhdGljIHZvaWQJYW1ycl9ub2RlX2RlaW5pdChzdHJ1Y3Qg aWVlZTgwMjExX25vZGUgKik7CiBzdGF0aWMgaW50CWFtcnJfdXBkYXRlKHN0cnVjdCBpZWVlODAy MTFfYW1yciAqLAogICAgIAkJCXN0cnVjdCBpZWVlODAyMTFfYW1ycl9ub2RlICosIHN0cnVjdCBp ZWVlODAyMTFfbm9kZSAqKTsKQEAgLTEyOSwxOSArMTI5LDggQEAKIAlmcmVlKHZhcC0+aXZfcnMs IE1fODAyMTFfUkFURUNUTCk7CiB9CiAKLXN0YXRpYyBpbnQKLWFtcnJfbm9kZV9pc18xMW4oc3Ry dWN0IGllZWU4MDIxMV9ub2RlICpuaSkKLXsKLQotCWlmIChuaS0+bmlfY2hhbiA9PSBOVUxMKQot CQlyZXR1cm4gKDApOwotCWlmIChuaS0+bmlfY2hhbiA9PSBJRUVFODAyMTFfQ0hBTl9BTllDKQot CQlyZXR1cm4gKDApOwotCXJldHVybiAoSUVFRTgwMjExX0lTX0NIQU5fSFQobmktPm5pX2NoYW4p KTsKLX0KLQogc3RhdGljIHZvaWQKLWFtcnJfbm9kZV9pbml0KHN0cnVjdCBpZWVlODAyMTFfbm9k ZSAqbmkpCithbXJyX25vZGVfaW5pdChzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pLCB1aW50MzJf dCBjYXBhYmlsaXRpZXMpCiB7CiAJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yYXRlc2V0ICpycyA9 IE5VTEw7CiAJc3RydWN0IGllZWU4MDIxMXZhcCAqdmFwID0gbmktPm5pX3ZhcDsKQEAgLTE1OSw2 ICsxNDgsMTAgQEAKIAkJfQogCX0gZWxzZQogCQlhbW4gPSBuaS0+bmlfcmN0bHM7CisKKwlzdHJ1 Y3QgaWVlZTgwMjExX3JhdGVjdGxfbm9kZSAqaXJuID0gSUVFRTgwMjExX1JBVEVDVExfTk9ERShu aSk7CisJaXJuLT5pcm5fY2FwYWJpbGl0aWVzID0gY2FwYWJpbGl0aWVzOworCQogCWFtbi0+YW1u X2FtcnIgPSBhbXJyOwogCWFtbi0+YW1uX3N1Y2Nlc3MgPSAwOwogCWFtbi0+YW1uX3JlY292ZXJ5 ID0gMDsKQEAgLTE2NSwyMyArMTU4LDEzIEBACiAJYW1uLT5hbW5fdHhjbnQgPSBhbW4tPmFtbl9y ZXRyeWNudCA9IDA7CiAJYW1uLT5hbW5fc3VjY2Vzc190aHJlc2hvbGQgPSBhbXJyLT5hbXJyX21p bl9zdWNjZXNzX3RocmVzaG9sZDsKIAotCS8qIDExbiBvciBub3Q/IFBpY2sgdGhlIHJpZ2h0IHJh dGVzZXQgKi8KLQlpZiAoYW1ycl9ub2RlX2lzXzExbihuaSkpIHsKLQkJLyogWFhYIGV3ICovCi0J CUlFRUU4MDIxMV9OT1RFKG5pLT5uaV92YXAsIElFRUU4MDIxMV9NU0dfUkFURUNUTCwgbmksCi0J CSAgICAiJXM6IDExbiBub2RlIiwgX19mdW5jX18pOwotCQlycyA9IChzdHJ1Y3QgaWVlZTgwMjEx X3JhdGVzZXQgKikgJm5pLT5uaV9odHJhdGVzOwotCX0gZWxzZSB7Ci0JCUlFRUU4MDIxMV9OT1RF KG5pLT5uaV92YXAsIElFRUU4MDIxMV9NU0dfUkFURUNUTCwgbmksCi0JCSAgICAiJXM6IG5vbi0x MW4gbm9kZSIsIF9fZnVuY19fKTsKLQkJcnMgPSAmbmktPm5pX3JhdGVzOwotCX0KKwlycyA9IGll ZWU4MDIxMV9yYXRlY3RsX2dldF9yYXRlc2V0KG5pKTsKIAogCS8qIEluaXRpYWwgcmF0ZSAtIGxv d2VzdCAqLwogCXJhdGUgPSBycy0+cnNfcmF0ZXNbMF07CiAKIAkvKiBYWFggY2xlYXIgdGhlIGJh c2ljIHJhdGUgZmxhZyBpZiBpdCdzIG5vdCAxMW4gKi8KLQlpZiAoISBhbXJyX25vZGVfaXNfMTFu KG5pKSkKKwlpZiAoISBpZWVlODAyMTFfcmF0ZWN0bF9ub2RlX2lzMTFuKG5pKSkKIAkJcmF0ZSAm PSBJRUVFODAyMTFfUkFURV9WQUw7CiAKIAkvKiBwaWNrIGluaXRpYWwgcmF0ZSBmcm9tIHRoZSBy YXRlc2V0IC0gSFQgb3Igb3RoZXJ3aXNlICovCkBAIC0xODksNyArMTcyLDcgQEAKIAkgICAgYW1u LT5hbW5fcml4LS0pIHsKIAkJLyogbGVnYWN5IC0gYW55dGhpbmcgPCAzNm1iaXQsIHN0b3Agc2Vh cmNoaW5nICovCiAJCS8qIDExbiAtIHN0b3AgYXQgTUNTNCAvIE1DUzEyIC8gTUNTMjggKi8KLQkJ aWYgKGFtcnJfbm9kZV9pc18xMW4obmkpICYmCisJCWlmIChpZWVlODAyMTFfcmF0ZWN0bF9ub2Rl X2lzMTFuKG5pKSAmJgogCQkgICAgKHJzLT5yc19yYXRlc1thbW4tPmFtbl9yaXhdICYgMHg3KSA8 IDQpCiAJCQlicmVhazsKIAkJZWxzZSBpZiAoKHJzLT5yc19yYXRlc1thbW4tPmFtbl9yaXhdICYg SUVFRTgwMjExX1JBVEVfVkFMKSA8PSA3MikKQEAgLTE5OCw3ICsxODEsNyBAQAogCX0KIAogCS8q IGlmIHRoZSByYXRlIGlzIGFuIDExbiByYXRlLCBlbnN1cmUgdGhlIE1DUyBiaXQgaXMgc2V0ICov Ci0JaWYgKGFtcnJfbm9kZV9pc18xMW4obmkpKQorCWlmIChpZWVlODAyMTFfcmF0ZWN0bF9ub2Rl X2lzMTFuKG5pKSkKIAkJcmF0ZSB8PSBJRUVFODAyMTFfUkFURV9NQ1M7CiAKIAkvKiBBc3NpZ24g aW5pdGlhbCByYXRlIGZyb20gdGhlIHJhdGVzZXQgKi8KQEAgLTIyNiwxNCArMjA5LDkgQEAKIAog CUtBU1NFUlQoaXNfZW5vdWdoKGFtbiksICgidHhjbnQgJWQiLCBhbW4tPmFtbl90eGNudCkpOwog Ci0JLyogMTFuIG9yIG5vdD8gUGljayB0aGUgcmlnaHQgcmF0ZXNldCAqLwotCWlmIChhbXJyX25v ZGVfaXNfMTFuKG5pKSkgewotCQkvKiBYWFggZXcgKi8KLQkJcnMgPSAoc3RydWN0IGllZWU4MDIx MV9yYXRlc2V0ICopICZuaS0+bmlfaHRyYXRlczsKLQl9IGVsc2UgewotCQlycyA9ICZuaS0+bmlf cmF0ZXM7Ci0JfQorCXJzID0gaWVlZTgwMjExX3JhdGVjdGxfZ2V0X3JhdGVzZXQobmkpOwogCisK IAlJRUVFODAyMTFfTk9URShuaS0+bmlfdmFwLCBJRUVFODAyMTFfTVNHX1JBVEVDVEwsIG5pLAog CSAgICAiQU1SUjogY3VycmVudCByYXRlICVkLCB0eGNudD0lZCwgcmV0cnljbnQ9JWQiLAogCSAg ICBycy0+cnNfcmF0ZXNbcml4XSAmIElFRUU4MDIxMV9SQVRFX1ZBTCwKQEAgLTMwNCwxMyArMjgy LDcgQEAKIAljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JhdGVzZXQgKnJzID0gTlVMTDsKIAlpbnQg cml4OwogCi0JLyogMTFuIG9yIG5vdD8gUGljayB0aGUgcmlnaHQgcmF0ZXNldCAqLwotCWlmIChh bXJyX25vZGVfaXNfMTFuKG5pKSkgewotCQkvKiBYWFggZXcgKi8KLQkJcnMgPSAoc3RydWN0IGll ZWU4MDIxMV9yYXRlc2V0ICopICZuaS0+bmlfaHRyYXRlczsKLQl9IGVsc2UgewotCQlycyA9ICZu aS0+bmlfcmF0ZXM7Ci0JfQorCXJzID0gaWVlZTgwMjExX3JhdGVjdGxfZ2V0X3JhdGVzZXQobmkp OwogCiAJaWYgKGlzX2Vub3VnaChhbW4pICYmICh0aWNrcyAtIGFtbi0+YW1uX3RpY2tzKSA+IGFt cnItPmFtcnJfaW50ZXJ2YWwpIHsKIAkJcml4ID0gYW1ycl91cGRhdGUoYW1yciwgYW1uLCBuaSk7 CkBAIC0zMTgsNyArMjkwLDcgQEAKIAkJCS8qIHVwZGF0ZSBwdWJsaWMgcmF0ZSAqLwogCQkJbmkt Pm5pX3R4cmF0ZSA9IHJzLT5yc19yYXRlc1tyaXhdOwogCQkJLyogWFhYIHN0cmlwIGJhc2ljIHJh dGUgZmxhZyBmcm9tIHR4cmF0ZSwgaWYgbm9uLTExbiAqLwotCQkJaWYgKGFtcnJfbm9kZV9pc18x MW4obmkpKQorCQkJaWYgKGllZWU4MDIxMV9yYXRlY3RsX25vZGVfaXMxMW4obmkpKQogCQkJCW5p LT5uaV90eHJhdGUgfD0gSUVFRTgwMjExX1JBVEVfTUNTOwogCQkJZWxzZQogCQkJCW5pLT5uaV90 eHJhdGUgJj0gSUVFRTgwMjExX1JBVEVfVkFMOwpJbmRleDogbmV0ODAyMTEvaWVlZTgwMjExX2Ft cnIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09Ci0tLSBuZXQ4MDIxMS9pZWVlODAyMTFfYW1yci5oCShyZXZpc2lvbiAy NTQ4MjYpCisrKyBuZXQ4MDIxMS9pZWVlODAyMTFfYW1yci5oCSh3b3JraW5nIGNvcHkpCkBAIC0y MCw2ICsyMCw3IEBACiAjaWZuZGVmIF9ORVQ4MDIxMV9JRUVFODAyMTFfQU1SUl9IXwogI2RlZmlu ZSBfTkVUODAyMTFfSUVFRTgwMjExX0FNUlJfSF8KIAorI2luY2x1ZGUgPG5ldDgwMjExL2llZWU4 MDIxMV9yYXRlY3RsLmg+CiAvKi0KICAqIE5haXZlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBZGFw dGl2ZSBNdWx0aSBSYXRlIFJldHJ5IGFsZ29yaXRobToKICAqCkBAIC00Nyw2ICs0OCw3IEBACiAg KiBSYXRlIGNvbnRyb2wgc3RhdGUgZm9yIGEgZ2l2ZW4gbm9kZS4KICAqLwogc3RydWN0IGllZWU4 MDIxMV9hbXJyX25vZGUgeworCXN0cnVjdCBpZWVlODAyMTFfcmF0ZWN0bF9ub2RlIGFtbl9ub2Rl OwogCXN0cnVjdCBpZWVlODAyMTFfYW1yciAqYW1uX2FtcnI7LyogYmFja3BvaW50ZXIgKi8KIAlp bnQJYW1uX3JpeDsJCS8qIGN1cnJlbnQgcmF0ZSBpbmRleCAqLwogCWludAlhbW5fdGlja3M7CQkv KiB0aW1lIG9mIGxhc3QgdXBkYXRlICovCkluZGV4OiBuZXQ4MDIxMS9pZWVlODAyMTFfbm9kZS5j Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT0KLS0tIG5ldDgwMjExL2llZWU4MDIxMV9ub2RlLmMJKHJldmlzaW9uIDI1NDgy NikKKysrIG5ldDgwMjExL2llZWU4MDIxMV9ub2RlLmMJKHdvcmtpbmcgY29weSkKQEAgLTg0Niw3 ICs4NDYsOCBAQAogCS8qIFhYWCBRb1M/IERpZmZpY3VsdCBnaXZlbiB0aGF0IFdNRSBjb25maWcg aXMgc3BlY2lmaWMgdG8gYSBtYXN0ZXIgKi8KIAogCWllZWU4MDIxMV9ub2RlX3NldHVwdHhwYXJt cyhuaSk7Ci0JaWVlZTgwMjExX3JhdGVjdGxfbm9kZV9pbml0KG5pKTsKKwkvKiBYWFggVE9ETyBm aWxsIHRoZSBjYXAgZmllbGQgKi8KKwlpZWVlODAyMTFfcmF0ZWN0bF9ub2RlX2luaXQobmksIDAp OwogCiAJcmV0dXJuIGllZWU4MDIxMV9zdGFfam9pbjEoaWVlZTgwMjExX3JlZl9ub2RlKG5pKSk7 CiB9CkBAIC0xMTg4LDcgKzExODksOCBAQAogCUlFRUU4MDIxMV9OT1RFKHZhcCwgSUVFRTgwMjEx X01TR19JTkFDVCwgbmksCiAJICAgICIlczogaW5hY3RfcmVsb2FkICV1IiwgX19mdW5jX18sIG5p LT5uaV9pbmFjdF9yZWxvYWQpOwogCi0JaWVlZTgwMjExX3JhdGVjdGxfbm9kZV9pbml0KG5pKTsK KwkvKiBYWFggVE9ETyBmaWxsIHRoZSBjYXAgZmllbGQgKi8KKwlpZWVlODAyMTFfcmF0ZWN0bF9u b2RlX2luaXQobmksIDApOwogCiAJcmV0dXJuIG5pOwogfQpAQCAtMTIyOCw3ICsxMjMwLDggQEAK IAkJLyogWFhYIG9wdGltaXplIGF3YXkgKi8KIAkJaWVlZTgwMjExX3BzcV9pbml0KCZuaS0+bmlf cHNxLCAidW5rbm93biIpOwogCi0JCWllZWU4MDIxMV9yYXRlY3RsX25vZGVfaW5pdChuaSk7CisJ CS8qIFhYWCBUT0RPIGZpbGwgdGhlIGNhcCBmaWVsZCAqLworCQlpZWVlODAyMTFfcmF0ZWN0bF9u b2RlX2luaXQobmksIDApOwogCX0gZWxzZSB7CiAJCS8qIFhYWCBtc2cgKi8KIAkJdmFwLT5pdl9z dGF0cy5pc19yeF9ub2RlYWxsb2MrKzsKQEAgLTE0NTcsNyArMTQ2MCw4IEBACiAjZW5kaWYKIAkJ fQogCQlpZWVlODAyMTFfbm9kZV9zZXR1cHR4cGFybXMobmkpOwotCQlpZWVlODAyMTFfcmF0ZWN0 bF9ub2RlX2luaXQobmkpOworCQkvKiBYWFggVE9ETyBmaWxsIHRoZSBjYXAgZmllbGQgKi8KKwkJ aWVlZTgwMjExX3JhdGVjdGxfbm9kZV9pbml0KG5pLCAwKTsKIAkJaWYgKGljLT5pY19uZXdhc3Nv YyAhPSBOVUxMKQogCQkJaWMtPmljX25ld2Fzc29jKG5pLCAxKTsKIAkJLyogWFhYIG5vdCByaWdo dCBmb3IgODAyLjF4L1dQQSAqLwpAQCAtMTUzMSw3ICsxNTM1LDggQEAKIAkJaWVlZTgwMjExX3Nl dHVwX2Jhc2ljX2h0cmF0ZXMobmksCiAJCSAgICBuaS0+bmlfaWVzLmh0aW5mb19pZSk7CiAJCWll ZWU4MDIxMV9ub2RlX3NldHVwdHhwYXJtcyhuaSk7Ci0JCWllZWU4MDIxMV9yYXRlY3RsX25vZGVf aW5pdChuaSk7CisJCS8qIFhYWCBUT0RPIGZpbGwgdGhlIGNhcCBmaWVsZCAqLworCQlpZWVlODAy MTFfcmF0ZWN0bF9ub2RlX2luaXQobmksIDApOwogCX0KIH0KIApAQCAtMTU1OCw3ICsxNTYzLDgg QEAKIAkJaWYgKGllZWU4MDIxMV9pc2VycF9yYXRlc2V0KCZuaS0+bmlfcmF0ZXMpKQogCQkJbmkt Pm5pX2ZsYWdzIHw9IElFRUU4MDIxMV9OT0RFX0VSUDsKIAkJaWVlZTgwMjExX25vZGVfc2V0dXB0 eHBhcm1zKG5pKTsKLQkJaWVlZTgwMjExX3JhdGVjdGxfbm9kZV9pbml0KG5pKTsKKwkJLyogWFhY IFRPRE8gZmlsbCB0aGUgY2FwIGZpZWxkICovCisJCWllZWU4MDIxMV9yYXRlY3RsX25vZGVfaW5p dChuaSwgMCk7CiAJCWlmIChpYy0+aWNfbmV3YXNzb2MgIT0gTlVMTCkKIAkJCWljLT5pY19uZXdh c3NvYyhuaSwgMSk7CiAJCS8qIFhYWCBub3QgcmlnaHQgZm9yIDgwMi4xeC9XUEEgKi8KQEAgLTI1 MjgsNyArMjUzNCw4IEBACiAJKTsKIAogCWllZWU4MDIxMV9ub2RlX3NldHVwdHhwYXJtcyhuaSk7 Ci0JaWVlZTgwMjExX3JhdGVjdGxfbm9kZV9pbml0KG5pKTsKKwkvKiBYWFggVE9ETyBmaWxsIHRo ZSBjYXAgZmllbGQgKi8KKwlpZWVlODAyMTFfcmF0ZWN0bF9ub2RlX2luaXQobmksIDApOwogCS8q IGdpdmUgZHJpdmVyIGEgY2hhbmNlIHRvIHNldHVwIHN0YXRlIGxpa2UgbmlfdHhyYXRlICovCiAJ aWYgKGljLT5pY19uZXdhc3NvYyAhPSBOVUxMKQogCQlpYy0+aWNfbmV3YXNzb2MobmksIG5ld2Fz c29jKTsKSW5kZXg6IG5ldDgwMjExL2llZWU4MDIxMV9yY19zYW1wbGUuYwo9PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t LSBuZXQ4MDIxMS9pZWVlODAyMTFfcmNfc2FtcGxlLmMJKHJldmlzaW9uIDApCisrKyBuZXQ4MDIx MS9pZWVlODAyMTFfcmNfc2FtcGxlLmMJKHJldmlzaW9uIDI1NTk3MCkKQEAgLTAsMCArMSwxMTM3 IEBACisvKiAkRnJlZUJTRDogaGVhZC9zeXMvZGV2L2F0aC9hdGhfcmF0ZS9zYW1wbGUvc2FtcGxl LmMgMjQ4NTczIDIwMTMtMDItMjcgMDQ6MzM6MDZaIGFkcmlhbiAkKi8KKworLyotCisgKiBDb3B5 cmlnaHQgKGMpIDIwMDUgSm9obiBCaWNrZXQKKyAqIENvcHlyaWdodCAoYykgMjAxMyBDaGVuY2hv bmcgUWluIDxjY3FpbkBGcmVlQlNELm9yZz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0 aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1 dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj bGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50 YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp b24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMg SVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H LCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNI QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NM QUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5Z IERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9S IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRP LCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT RSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF UiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisg KiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV Q0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKworI2luY2x1ZGUgIm9w dF93bGFuLmgiCisKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMva2VybmVs Lmg+CisjaW5jbHVkZSA8c3lzL21vZHVsZS5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNp bmNsdWRlIDxzeXMvc3lzY3RsLmg+CisKKyNpbmNsdWRlIDxuZXQvaWYuaD4KKyNpbmNsdWRlIDxu ZXQvaWZfbWVkaWEuaD4KKworI2lmZGVmIElORVQKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+Cisj aW5jbHVkZSA8bmV0aW5ldC9pZl9ldGhlci5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxuZXQ4MDIx MS9pZWVlODAyMTFfdmFyLmg+CisjaW5jbHVkZSA8bmV0ODAyMTEvaWVlZTgwMjExX2h0Lmg+Cisj aW5jbHVkZSA8bmV0ODAyMTEvaWVlZTgwMjExX3JhdGVjdGwuaD4KKyNpbmNsdWRlIDxuZXQ4MDIx MS9pZWVlODAyMTFfcmNfc2FtcGxlLmg+CisjaW5jbHVkZSA8bmV0ODAyMTEvaWVlZTgwMjExX3Jj X3NhbXBsZV90eHNjaGVkLmg+CisKK3N0YXRpYyB2b2lkCXNhbXBsZV9pbml0KHN0cnVjdCBpZWVl ODAyMTF2YXAgKik7CitzdGF0aWMgdm9pZAlzYW1wbGVfZGVpbml0KHN0cnVjdCBpZWVlODAyMTF2 YXAgKik7CitzdGF0aWMgdm9pZAlzYW1wbGVfbm9kZV9pbml0KHN0cnVjdCBpZWVlODAyMTFfbm9k ZSAqKTsKK3N0YXRpYyB2b2lkCXNhbXBsZV9ub2RlX2RlaW5pdChzdHJ1Y3QgaWVlZTgwMjExX25v ZGUgKik7CitzdGF0aWMgaW50CXNhbXBsZV9yYXRlKHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqLCB2 b2lkICosIHVpbnQzMl90KTsKK3N0YXRpYyB2b2lkCXNhbXBsZV90eF9jb21wbGV0ZShjb25zdCBz dHJ1Y3QgaWVlZTgwMjExdmFwICosCisgICAgCQkJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9ub2Rl ICosIGludCwgCisJCQl2b2lkICosIHZvaWQgKik7CitzdGF0aWMgdm9pZAlzYW1wbGVfdHhfdXBk YXRlKGNvbnN0IHN0cnVjdCBpZWVlODAyMTF2YXAgKnZhcCwKKwkJCWNvbnN0IHN0cnVjdCBpZWVl ODAyMTFfbm9kZSAqLCB2b2lkICosIHZvaWQgKiwgdm9pZCAqKTsKK3N0YXRpYyB2b2lkCXNhbXBs ZV9zZXRpbnRlcnZhbChjb25zdCBzdHJ1Y3QgaWVlZTgwMjExdmFwICosIGludCk7CisKKy8qIG51 bWJlciBvZiByZWZlcmVuY2VzIGZyb20gbmV0ODAyMTEgbGF5ZXIgKi8KK3N0YXRpYwlpbnQgbnJl ZnMgPSAwOworCitzdGF0aWMgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yYXRlY3RsIHNhbXBsZSA9 IHsKKwkuaXJfbmFtZQk9ICJzYW1wbGUiLAorCS5pcl9hdHRhY2gJPSBOVUxMLAorCS5pcl9kZXRh Y2gJPSBOVUxMLAorCS5pcl9pbml0CT0gc2FtcGxlX2luaXQsCisJLmlyX2RlaW5pdAk9IHNhbXBs ZV9kZWluaXQsCisJLmlyX25vZGVfaW5pdAk9IHNhbXBsZV9ub2RlX2luaXQsCisJLmlyX25vZGVf ZGVpbml0CT0gc2FtcGxlX25vZGVfZGVpbml0LAorCS5pcl9yYXRlCT0gc2FtcGxlX3JhdGUsCisJ LmlyX3JhdGVzCT0gc2FtcGxlX3JhdGVzLAorCS5pcl90eF9jb21wbGV0ZQk9IHNhbXBsZV90eF9j b21wbGV0ZSwKKwkuaXJfdHhfdXBkYXRlCT0gc2FtcGxlX3R4X3VwZGF0ZSwKKwkuaXJfc2V0aW50 ZXJ2YWwJPSBzYW1wbGVfc2V0aW50ZXJ2YWwsCit9OworSUVFRTgwMjExX1JBVEVDVExfTU9EVUxF KHNhbXBsZSwgMSk7CitJRUVFODAyMTFfUkFURUNUTF9BTEcoc2FtcGxlLCBJRUVFODAyMTFfUkFU RUNUTF9TQU1QTEUsIHNhbXBsZSk7CisKK3N0YXRpYyB2b2lkCitzYW1wbGVfaW5pdChzdHJ1Y3Qg aWVlZTgwMjExdmFwICp2YXApCit7CisJc3RydWN0IGllZWU4MDIxMV9zYW1wbGUgKnNhbXBsZTsK KworCUtBU1NFUlQodmFwLT5pdl9ycyA9PSBOVUxMLCAoIiVzIGNhbGxlZCBtdWx0aXBsZSB0aW1l cyIsIF9fZnVuY19fKSk7CisKKwlzYW1wbGUgPSB2YXAtPml2X3JzID0gbWFsbG9jKHNpemVvZihz dHJ1Y3QgaWVlZTgwMjExX3NhbXBsZSksCisJICAgIE1fODAyMTFfUkFURUNUTCwgTV9OT1dBSVR8 TV9aRVJPKTsKKwlpZiAoc2FtcGxlID09IE5VTEwpIHsKKwkJaWZfcHJpbnRmKHZhcC0+aXZfaWZw LCAiY291bGRuJ3QgYWxsb2MgcmF0ZWN0bCBzdHJ1Y3R1cmVcbiIpOworCQlyZXR1cm47CisJfQor CXNhbXBsZS0+c2FtcGxlX3Ntb290aGluZ19yYXRlID0gNzU7CQkvKiBld21hIHBlcmNlbnRhZ2Ug KFswLi45OV0pICovCisJc2FtcGxlLT5zYW1wbGVfc21vb3RoaW5nX21pbnBhY2tldHMgPSAxMDAg LyAoMTAwIC0gc2FtcGxlLT5zYW1wbGVfc21vb3RoaW5nX3JhdGUpOworCXNhbXBsZS0+c2FtcGxl X3JhdGUgPSAxMDsJCQkvKiAldGltZSB0byB0cnkgZGlmZiB0eCByYXRlcyAqLworCXNhbXBsZS0+ c2FtcGxlX21heF9zdWNjZXNzaXZlX2ZhaWx1cmVzID0gMzsJLyogdGhyZXNob2xkIGZvciByYXRl IHNhbXBsaW5nKi8KKwlzYW1wbGUtPnNhbXBsZV9zdGFsZV9mYWlsdXJlX3RpbWVvdXQgPSAxMCAq IGh6OwkvKiAxMCBzZWNvbmRzICovCisJc2FtcGxlLT5zYW1wbGVfbWluX3N3aXRjaCA9IGh6OwkJ CS8qIDEgc2Vjb25kICovCisJc2FtcGxlX3NldGludGVydmFsKHZhcCwgNTAwIC8qIG1zICovKTsg CS8qIGFjdHVhbGx5IGRvIG5vdGhpbmcgKi8KKwlzYW1wbGVfc3lzY3RsYXR0YWNoKHZhcCwgdmFw LT5pdl9zeXNjdGwsIHZhcC0+aXZfb2lkKTsKK30KKworc3RhdGljIHZvaWQKK3NhbXBsZV9kZWlu aXQoc3RydWN0IGllZWU4MDIxMXZhcCAqdmFwKQoreworCWZyZWUodmFwLT5pdl9ycywgTV84MDIx MV9SQVRFQ1RMKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB0eHNjaGVkdWxlICptcnJfc2No ZWR1bGVzW0lFRUU4MDIxMV9NT0RFX01BWCsyXSA9IHsKKwlOVUxMLAkJLyogSUVFRTgwMjExX01P REVfQVVUTyAqLworCXNlcmllc18xMWEsCS8qIElFRUU4MDIxMV9NT0RFXzExQSAqLworCXNlcmll c18xMWcsCS8qIElFRUU4MDIxMV9NT0RFXzExQiAqLworCXNlcmllc18xMWcsCS8qIElFRUU4MDIx MV9NT0RFXzExRyAqLworCU5VTEwsCQkvKiBJRUVFODAyMTFfTU9ERV9GSCAqLworCXNlcmllc18x MWEsCS8qIElFRUU4MDIxMV9NT0RFX1RVUkJPX0EgKi8KKwlzZXJpZXNfMTFnLAkvKiBJRUVFODAy MTFfTU9ERV9UVVJCT19HICovCisJc2VyaWVzXzExYSwJLyogSUVFRTgwMjExX01PREVfU1RVUkJP X0EgKi8KKwlzZXJpZXNfMTFuYSwJLyogSUVFRTgwMjExX01PREVfMTFOQSAqLworCXNlcmllc18x MW5nLAkvKiBJRUVFODAyMTFfTU9ERV8xMU5HICovCisJc2VyaWVzX2hhbGYsCS8qIElFRUU4MDIx MV9NT0RFX0hBTEYgKi8KKwlzZXJpZXNfcXVhcnRlciwJLyogSUVFRTgwMjExX01PREVfUVVBUlRF UiAqLworfTsKKworc3RhdGljIHZvaWQKK3NhbXBsZV9ub2RlX2luaXQoc3RydWN0IGllZWU4MDIx MV9ub2RlICpuaSwgdWludDMyX3QgY2FwYWJpbGl0aWVzKQoreworI2RlZmluZQlSQVRFKF9peCkJ KG5pLT5uaV9yYXRlcy5yc19yYXRlc1soX2l4KV0gJiBJRUVFODAyMTFfUkFURV9WQUwpCisjZGVm aW5lCURPVDExUkFURShfaXgpCShydC0+aW5mb1soX2l4KV0uZG90MTFSYXRlICYgSUVFRTgwMjEx X1JBVEVfVkFMKQorI2RlZmluZQlNQ1MoX2l4KQkobmktPm5pX2h0cmF0ZXMucnNfcmF0ZXNbX2l4 XSB8IElFRUU4MDIxMV9SQVRFX01DUykKKwlzdHJ1Y3QgaWVlZTgwMjExdmFwICp2YXAgPSBuaS0+ bmlfdmFwOworCXN0cnVjdCBpZWVlODAyMTFfc2FtcGxlICpzYW1wbGUgPSB2YXAtPml2X3JzOwor CXN0cnVjdCBpZWVlODAyMTFfc2FtcGxlX25vZGUgKnNhbiA9IE5VTEw7CisJY29uc3Qgc3RydWN0 IGllZWU4MDIxMV9yYXRlX3RhYmxlICpydCA9IGllZWU4MDIxMV9nZXRfcmF0ZXRhYmxlKHZhcC0+ aXZfaWMtPmljX2N1cmNoYW4pOworCWVudW0gaWVlZTgwMjExX3BoeW1vZGUgY3VybW9kZSA9IGll ZWU4MDIxMV9jaGFuMm1vZGUodmFwLT5pdl9pYy0+aWNfY3VyY2hhbik7CisJaW50IHgsIHksIHJp eDsKKworCWlmIChuaS0+bmlfcmN0bHMgPT0gTlVMTCkgeworCQluaS0+bmlfcmN0bHMgPSBzYW4g PSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfc2FtcGxlX25vZGUpLAorCQkgICAgTV84 MDIxMV9SQVRFQ1RMLCBNX05PV0FJVHxNX1pFUk8pOworCQlpZiAoc2FuID09IE5VTEwpIHsKKwkJ CWlmX3ByaW50Zih2YXAtPml2X2lmcCwgImNvdWxkbid0IGFsbG9jIHBlci1ub2RlIHJhdGVjdGwg IgorCQkJICAgICJzdHJ1Y3R1cmVcbiIpOworCQkJcmV0dXJuOworCQl9CisJfSBlbHNlCisJCXNh biA9IG5pLT5uaV9yY3RsczsKKworCXN0cnVjdCBpZWVlODAyMTFfcmF0ZWN0bF9ub2RlICppcm4g PSBJRUVFODAyMTFfUkFURUNUTF9OT0RFKG5pKTsKKwlpcm4tPmlybl9jYXBhYmlsaXRpZXMgPSBj YXBhYmlsaXRpZXM7CisJCisJc2FuLT5zYW5fc2FtcGxlID0gc2FtcGxlOworCisJS0FTU0VSVChy dCAhPSBOVUxMLCAoIm5vIHJhdGUgdGFibGUsIG1vZGUgJXUiLCBjdXJtb2RlKSk7CisKKwlzYW4t PnNjaGVkID0gbXJyX3NjaGVkdWxlc1tjdXJtb2RlXTsKKwlLQVNTRVJUKHNhbi0+c2NoZWQgIT0g TlVMTCwgKCJubyBtcnIgc2NoZWR1bGUgZm9yIG1vZGUgJXUiLCBjdXJtb2RlKSk7CisKKwlzYW4t PnN0YXRpY19yaXggPSAtMTsKKwlzYW1wbGVfdXBkYXRlX3N0YXRpY19yaXgobmkpOworCisJLyoK KwkgKiBDb25zdHJ1Y3QgYSBiaXRtYXNrIG9mIHVzYWJsZSByYXRlcy4gIFRoaXMgaGFzIGFsbAor CSAqIG5lZ290aWF0ZWQgcmF0ZXMgbWludXMgdGhvc2UgbWFya2VkIGJ5IHRoZSBoYWwgYXMKKwkg KiB0byBiZSBpZ25vcmVkIGZvciBkb2luZyByYXRlIGNvbnRyb2wuCisJICovCisJc2FuLT5yYXRl bWFzayA9IDA7CisKKwkvKiBNQ1MgcmF0ZXMgKi8KKwlpZiAobmktPm5pX2ZsYWdzICYgSUVFRTgw MjExX05PREVfSFQpIHsKKwkJZm9yICh4ID0gMDsgeCA8IG5pLT5uaV9odHJhdGVzLnJzX25yYXRl czsgeCsrKSB7CisJCQlyaXggPSBydC0+cmF0ZUNvZGVUb0luZGV4W01DUyh4KV07CisJCQlpZiAo cml4ID09IDB4ZmYpCisJCQkJY29udGludWU7CisJCQkvKiBza2lwIHJhdGVzIG1hcmtlZCBicm9r ZW4gYnkgaGFsICovCisJCQlpZiAoIXJ0LT5pbmZvW3JpeF0udmFsaWQpCisJCQkJY29udGludWU7 CisJCQlLQVNTRVJUKHJpeCA8IFNBTVBMRV9NQVhSQVRFUywKKwkJCSAgICAoIm1jcyAldSBoYXMg cml4ICVkIiwgTUNTKHgpLCByaXgpKTsKKwkJCXNhbi0+cmF0ZW1hc2sgfD0gKHVpbnQ2NF90KSAx PDxyaXg7CisJCX0KKwl9CisKKwkvKiBMZWdhY3kgcmF0ZXMgKi8KKwlmb3IgKHggPSAwOyB4IDwg bmktPm5pX3JhdGVzLnJzX25yYXRlczsgeCsrKSB7CisJCXJpeCA9IHJ0LT5yYXRlQ29kZVRvSW5k ZXhbUkFURSh4KV07CisJCWlmIChyaXggPT0gMHhmZikKKwkJCWNvbnRpbnVlOworCQkvKiBza2lw IHJhdGVzIG1hcmtlZCBicm9rZW4gYnkgaGFsICovCisJCWlmICghcnQtPmluZm9bcml4XS52YWxp ZCkKKwkJCWNvbnRpbnVlOworCQlLQVNTRVJUKHJpeCA8IFNBTVBMRV9NQVhSQVRFUywKKwkJICAg ICgicmF0ZSAldSBoYXMgcml4ICVkIiwgUkFURSh4KSwgcml4KSk7CisJCXNhbi0+cmF0ZW1hc2sg fD0gKHVpbnQ2NF90KSAxPDxyaXg7CisJfQorCisJZm9yICh5ID0gMDsgeSA8IE5VTV9QQUNLRVRf U0laRV9CSU5TOyB5KyspIHsKKwkJaW50IHNpemUgPSBiaW5fdG9fc2l6ZSh5KTsKKwkJdWludDY0 X3QgbWFzazsKKworCQlzYW4tPnBhY2tldHNfc2VudFt5XSA9IDA7CisJCXNhbi0+Y3VycmVudF9z YW1wbGVfcml4W3ldID0gLTE7CisJCXNhbi0+bGFzdF9zYW1wbGVfcml4W3ldID0gMDsKKwkJLyog WFhYIHN0YXJ0IHdpdGggZmlyc3QgdmFsaWQgcmF0ZSAqLworCQlzYW4tPmN1cnJlbnRfcml4W3ld ID0gZmZzKHNhbi0+cmF0ZW1hc2spLTE7CisJCQorCQkvKgorCQkgKiBJbml0aWFsaXplIHRoZSBz dGF0aXN0aWNzIGJ1Y2tldHM7IHRoZXNlIGFyZQorCQkgKiBpbmRleGVkIGJ5IHRoZSByYXRlIGNv ZGUgaW5kZXguCisJCSAqLworCQlmb3IgKHJpeCA9IDAsIG1hc2sgPSBzYW4tPnJhdGVtYXNrOyBt YXNrICE9IDA7IHJpeCsrLCBtYXNrID4+PSAxKSB7CisJCQlpZiAoKG1hc2sgJiAxKSA9PSAwKQkJ Lyogbm90IGEgdmFsaWQgcmF0ZSAqLworCQkJCWNvbnRpbnVlOworCQkJc2FuLT5zdGF0c1t5XVty aXhdLnN1Y2Nlc3NpdmVfZmFpbHVyZXMgPSAwOworCQkJc2FuLT5zdGF0c1t5XVtyaXhdLnRyaWVz ID0gMDsKKwkJCXNhbi0+c3RhdHNbeV1bcml4XS50b3RhbF9wYWNrZXRzID0gMDsKKwkJCXNhbi0+ c3RhdHNbeV1bcml4XS5wYWNrZXRzX2Fja2VkID0gMDsKKwkJCXNhbi0+c3RhdHNbeV1bcml4XS5s YXN0X3R4ID0gMDsKKwkJCXNhbi0+c3RhdHNbeV1bcml4XS5ld21hX3BjdCA9IDA7CisJCQkKKwkJ CXNhbi0+c3RhdHNbeV1bcml4XS5wZXJmZWN0X3R4X3RpbWUgPQorCQkJICAgIGNhbGNfdXNlY3Nf dW5pY2FzdF9wYWNrZXQodmFwLCBzaXplLCByaXgsIDAsIDAsCisJCQkgICAgKG5pLT5uaV9jaHcg PT0gNDApKTsKKwkJCXNhbi0+c3RhdHNbeV1bcml4XS5hdmVyYWdlX3R4X3RpbWUgPQorCQkJICAg IHNhbi0+c3RhdHNbeV1bcml4XS5wZXJmZWN0X3R4X3RpbWU7CisJCX0KKwl9CisKKwkvKiBzZXQg dGhlIHZpc2libGUgYml0LXJhdGUgKi8KKwlpZiAoc2FuLT5zdGF0aWNfcml4ICE9IC0xKQorCQlu aS0+bmlfdHhyYXRlID0gRE9UMTFSQVRFKHNhbi0+c3RhdGljX3JpeCk7CisJZWxzZQorCQluaS0+ bmlfdHhyYXRlID0gUkFURSgwKTsKKyN1bmRlZiBSQVRFCisjdW5kZWYgRE9UMTFSQVRFCisjdW5k ZWYgTUNTCit9CisKK3N0YXRpYyB2b2lkCitzYW1wbGVfbm9kZV9kZWluaXQoc3RydWN0IGllZWU4 MDIxMV9ub2RlICpuaSkKK3sKKwlmcmVlKG5pLT5uaV9yY3RscywgTV84MDIxMV9SQVRFQ1RMKTsK K30KKworc3RhdGljIGludAorZG90MTFyYXRlKGNvbnN0IGllZWU4MDIxMV9yYXRlX3RhYmxlICpy dCwgaW50IHJpeCkKK3sKKwlpZiAocml4IDwgMCkKKwkJcmV0dXJuIC0xOworCXJldHVybiBydC0+ aW5mb1tyaXhdLnBoeSA9PSBJRUVFODAyMTFfVF9IVCA/CisJICAgIHJ0LT5pbmZvW3JpeF0uZG90 MTFSYXRlIDogKHJ0LT5pbmZvW3JpeF0uZG90MTFSYXRlICYgSUVFRTgwMjExX1JBVEVfVkFMKSAv IDI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICoKK2RvdDExcmF0ZV9sYWJlbChjb25zdCBpZWVl ODAyMTFfcmF0ZV90YWJsZSAqcnQsIGludCByaXgpCit7CisJaWYgKHJpeCA8IDApCisJCXJldHVy biAiIjsKKwlyZXR1cm4gcnQtPmluZm9bcml4XS5waHkgPT0gSUVFRTgwMjExX1RfSFQgPyAiTUNT IiA6ICJNYiAiOworfQorCisvKgorICogUmV0dXJuIHRoZSByaXggd2l0aCB0aGUgbG93ZXN0IGF2 ZXJhZ2VfdHhfdGltZSwKKyAqIG9yIC0xIGlmIGFsbCB0aGUgYXZlcmFnZV90eF90aW1lcyBhcmUg MC4KKyAqLworc3RhdGljIF9faW5saW5lIGludAorcGlja19iZXN0X3JhdGUoY29uc3Qgc3RydWN0 IGllZWU4MDIxMV9ub2RlICpuaSwgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yYXRlX3RhYmxlICpy dCwKKyAgICBpbnQgc2l6ZV9iaW4sIGludCByZXF1aXJlX2Fja2VkX2JlZm9yZSkKK3sKKwlzdHJ1 Y3QgaWVlZTgwMjExX3NhbXBsZV9ub2RlICpzYW4gPSBuaS0+bmlfcmN0bHM7CisgICAgaW50IGJl c3RfcmF0ZV9yaXgsIGJlc3RfcmF0ZV90dCwgYmVzdF9yYXRlX3BjdDsKKwl1aW50NjRfdCBtYXNr OworCWludCByaXgsIHR0LCBwY3Q7CisKKyAgICBiZXN0X3JhdGVfcml4ID0gMDsKKyAgICBiZXN0 X3JhdGVfdHQgPSAwOworCWJlc3RfcmF0ZV9wY3QgPSAwOworCisJZm9yIChtYXNrID0gc2FuLT5y YXRlbWFzaywgcml4ID0gMDsgbWFzayAhPSAwOyBtYXNrID4+PSAxLCByaXgrKykgeworCQlpZiAo KG1hc2sgJiAxKSA9PSAwKQkJLyogbm90IGEgc3VwcG9ydGVkIHJhdGUgKi8KKwkJCWNvbnRpbnVl OworCisJCS8qIERvbid0IHBpY2sgYSBub24tSFQgcmF0ZSBmb3IgYSBIVCBub2RlICovCisJCWlm ICgobmktPm5pX2ZsYWdzICYgSUVFRTgwMjExX05PREVfSFQpICYmCisJCSAgICAocnQtPmluZm9b cml4XS5waHkgIT0gSUVFRTgwMjExX1RfSFQpKSB7CisJCQljb250aW51ZTsKKwkJfQorCisJCXR0 ID0gc2FuLT5zdGF0c1tzaXplX2Jpbl1bcml4XS5hdmVyYWdlX3R4X3RpbWU7CisJCWlmICh0dCA8 PSAwIHx8CisJCSAgICAocmVxdWlyZV9hY2tlZF9iZWZvcmUgJiYKKwkJICAgICAhc2FuLT5zdGF0 c1tzaXplX2Jpbl1bcml4XS5wYWNrZXRzX2Fja2VkKSkKKwkJCWNvbnRpbnVlOworCisJCS8qIENh bGN1bGF0ZSBwZXJjZW50YWdlIGlmIHBvc3NpYmxlICovCisJCWlmIChzYW4tPnN0YXRzW3NpemVf YmluXVtyaXhdLnRvdGFsX3BhY2tldHMgPiAwKSB7CisJCQlwY3QgPSBzYW4tPnN0YXRzW3NpemVf YmluXVtyaXhdLmV3bWFfcGN0OworCQl9IGVsc2UgeworCQkJLyogWFhYIGZvciBub3csIGFzc3Vt ZSA5NSUgb2sgKi8KKwkJCXBjdCA9IDk1OworCQl9CisKKwkJLyogZG9uJ3QgdXNlIGEgYml0LXJh dGUgdGhhdCBoYXMgYmVlbiBmYWlsaW5nICovCisJCWlmIChzYW4tPnN0YXRzW3NpemVfYmluXVty aXhdLnN1Y2Nlc3NpdmVfZmFpbHVyZXMgPiAzKQorCQkJY29udGludWU7CisKKwkJLyoKKwkJICog Rm9yIEhULCBEb24ndCB1c2UgYSBiaXQgcmF0ZSB0aGF0IGlzIG11Y2ggbW9yZQorCQkgKiBsb3Nz eSB0aGFuIHRoZSBiZXN0LgorCQkgKgorCQkgKiBYWFggdGhpcyBpc24ndCBvcHRpbWFsOyBpdCdz IGp1c3QgZGVzaWduZWQgdG8KKwkJICogZWxpbWluYXRlIHJhdGVzIHRoYXQgYXJlIGdvaW5nIHRv IGJlIG9idmlvdXNseQorCQkgKiB3b3JzZS4KKwkJICovCisJCWlmIChuaS0+bmlfZmxhZ3MgJiBJ RUVFODAyMTFfTk9ERV9IVCkgeworCQkJaWYgKGJlc3RfcmF0ZV9wY3QgPiAocGN0ICsgNTApKQor CQkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJICogRm9yIG5vbi1NQ1MgcmF0ZXMsIHVzZSB0 aGUgY3VycmVudCBhdmVyYWdlIHR4dGltZSBmb3IKKwkJICogY29tcGFyaXNvbi4KKwkJICovCisJ CWlmICghIChuaS0+bmlfZmxhZ3MgJiBJRUVFODAyMTFfTk9ERV9IVCkpIHsKKwkJCWlmIChiZXN0 X3JhdGVfdHQgPT0gMCB8fCB0dCA8PSBiZXN0X3JhdGVfdHQpIHsKKwkJCQliZXN0X3JhdGVfdHQg PSB0dDsKKwkJCQliZXN0X3JhdGVfcml4ID0gcml4OworCQkJCWJlc3RfcmF0ZV9wY3QgPSBwY3Q7 CisJCQl9CisJCX0KKworCQkvKgorCQkgKiBTaW5jZSAyIHN0cmVhbSByYXRlcyBoYXZlIHNsaWdo dGx5IGhpZ2hlciBUWCB0aW1lcywKKwkJICogYWxsb3cgYSBsaXR0bGUgYml0IG9mIGxlZXdheS4g VGhpcyBzaG91bGQgbGF0ZXIKKwkJICogYmUgYWJzdHJhY3RlZCBvdXQgYW5kIHByb3Blcmx5IGhh bmRsZWQuCisJCSAqLworCQlpZiAobmktPm5pX2ZsYWdzICYgSUVFRTgwMjExX05PREVfSFQpIHsK KwkJCWlmIChiZXN0X3JhdGVfdHQgPT0gMCB8fCAodHQgKiA4IDw9IGJlc3RfcmF0ZV90dCAqIDEw KSkgeworCQkJCWJlc3RfcmF0ZV90dCA9IHR0OworCQkJCWJlc3RfcmF0ZV9yaXggPSByaXg7CisJ CQkJYmVzdF9yYXRlX3BjdCA9IHBjdDsKKwkJCX0KKwkJfQorICAgICAgICB9CisgICAgICAgIHJl dHVybiAoYmVzdF9yYXRlX3R0ID8gYmVzdF9yYXRlX3JpeCA6IC0xKTsKK30KKworLyoKKyAqIFBp Y2sgYSBnb29kICJyYW5kb20iIGJpdC1yYXRlIHRvIHNhbXBsZSBvdGhlciB0aGFuIHRoZSBjdXJy ZW50IG9uZS4KKyAqLworc3RhdGljIF9faW5saW5lIGludAorcGlja19zYW1wbGVfcmF0ZShjb25z dCBzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pLCBjb25zdCBpZWVlODAyMTFfcmF0ZV90YWJsZSAq cnQsIAorCWludCBzaXplX2JpbikKK3sKKyNkZWZpbmUJRE9UMTFSQVRFKGl4KQkocnQtPmluZm9b aXhdLmRvdDExUmF0ZSAmIElFRUU4MDIxMV9SQVRFX1ZBTCkKKyNkZWZpbmUJTUNTKGl4KQkJKHJ0 LT5pbmZvW2l4XS5kb3QxMVJhdGUgfCBJRUVFODAyMTFfUkFURV9NQ1MpCisJc3RydWN0IGllZWU4 MDIxMV9zYW1wbGVfbm9kZSAqc2FuID0gbmktPm5pX3JjdGxzOworCXN0cnVjdCBpZWVlODAyMTFf c2FtcGxlICpzYW1wbGUgPSBzYW4tPnNhbl9zYW1wbGU7CisJaW50IGN1cnJlbnRfcml4LCByaXg7 CisJdW5zaWduZWQgY3VycmVudF90dDsKKwl1aW50NjRfdCBtYXNrOworCQorCWN1cnJlbnRfcml4 ID0gc2FuLT5jdXJyZW50X3JpeFtzaXplX2Jpbl07CisJaWYgKGN1cnJlbnRfcml4IDwgMCkgewor CQkvKiBubyBzdWNjZXNzZXMgeWV0LCBzZW5kIGF0IHRoZSBsb3dlc3QgYml0LXJhdGUgKi8KKwkJ LyogWFhYIHNob3VsZCByZXR1cm4gTUNTMCBpZiBIVCAqLworCQlyZXR1cm4gMDsKKwl9CisKKwlj dXJyZW50X3R0ID0gc2FuLT5zdGF0c1tzaXplX2Jpbl1bY3VycmVudF9yaXhdLmF2ZXJhZ2VfdHhf dGltZTsKKworCXJpeCA9IHNhbi0+bGFzdF9zYW1wbGVfcml4W3NpemVfYmluXSsxOwkvKiBuZXh0 IHNhbXBsZSByYXRlICovCisJbWFzayA9IHNhbi0+cmF0ZW1hc2sgJn4gKCh1aW50NjRfdCkgMTw8 Y3VycmVudF9yaXgpOy8qIGRvbid0IHNhbXBsZSBjdXJyZW50IHJhdGUgKi8KKwl3aGlsZSAobWFz ayAhPSAwKSB7CisJCWlmICgobWFzayAmICgodWludDY0X3QpIDE8PHJpeCkpID09IDApIHsJLyog bm90IGEgc3VwcG9ydGVkIHJhdGUgKi8KKwluZXh0cmF0ZToKKwkJCWlmICgrK3JpeCA+PSBydC0+ cmF0ZUNvdW50KQorCQkJCXJpeCA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qCisJCSAq IFRoZSBmb2xsb3dpbmcgY29kZSBzdG9wcyB0cnlpbmcgdG8gc2FtcGxlCisJCSAqIG5vbi1NQ1Mg cmF0ZXMgd2hlbiBzcGVha2luZyB0byBhbiBNQ1Mgbm9kZS4KKwkJICogSG93ZXZlciwgYXQgbGVh c3QgZm9yIENDSyByYXRlcyBpbiAyLjRHSHogbW9kZSwKKwkJICogdGhlIG5vbi1NQ1MgcmF0ZXMg TUFZIGFjdHVhbGx5IHByb3ZpZGUgYmV0dGVyCisJCSAqIFBFUiBhdCB0aGUgdmVyeSBmYXIgZWRn ZSBvZiByZWNlcHRpb24uCisJCSAqCisJCSAqIEhvd2V2ZXIhIFVudGlsIGF0aF9yYXRlX2Zvcm1f YWdncigpIGdyb3dzCisJCSAqIHNvbWUgbG9naWMgdG8gbm90IGZvcm0gYWdncmVnYXRlcyBpZiB0 aGUKKwkJICogc2VsZWN0ZWQgcmF0ZSBpcyBub24tTUNTLCB0aGlzIHdvbid0IHdvcmsuCisJCSAq CisJCSAqIFNvIGRvbid0IGRpc2FibGUgdGhpcyBjb2RlIHVudGlsIHlvdSd2ZSB0YXVnaHQKKwkJ ICogYXRoX3JhdGVfZm9ybV9hZ2dyKCkgdG8gZHJvcCBvdXQgaWYgYW55IG9mCisJCSAqIHRoZSBz ZWxlY3RlZCByYXRlcyBhcmUgbm9uLU1DUy4KKwkJICovCisjaWYgMQorCQkvKiBpZiB0aGUgbm9k ZSBpcyBIVCBhbmQgdGhlIHJhdGUgaXNuJ3QgSFQsIGRvbid0IGJvdGhlciBzYW1wbGUgKi8KKwkJ aWYgKChuaS0+bmlfZmxhZ3MgJiBJRUVFODAyMTFfTk9ERV9IVCkgJiYKKwkJICAgIChydC0+aW5m b1tyaXhdLnBoeSAhPSBJRUVFODAyMTFfVF9IVCkpIHsKKwkJCW1hc2sgJj0gfigodWludDY0X3Qp IDE8PHJpeCk7CisJCQlnb3RvIG5leHRyYXRlOworCQl9CisjZW5kaWYKKworCQkvKiB0aGlzIGJp dC1yYXRlIGlzIGFsd2F5cyB3b3JzZSB0aGFuIHRoZSBjdXJyZW50IG9uZSAqLworCQlpZiAoc2Fu LT5zdGF0c1tzaXplX2Jpbl1bcml4XS5wZXJmZWN0X3R4X3RpbWUgPiBjdXJyZW50X3R0KSB7CisJ CQltYXNrICY9IH4oKHVpbnQ2NF90KSAxPDxyaXgpOworCQkJZ290byBuZXh0cmF0ZTsKKwkJfQor CisJCS8qIHJhcmVseSBzYW1wbGUgYml0LXJhdGVzIHRoYXQgZmFpbCBhIGxvdCAqLworCQlpZiAo c2FuLT5zdGF0c1tzaXplX2Jpbl1bcml4XS5zdWNjZXNzaXZlX2ZhaWx1cmVzID4gc2FtcGxlLT5z YW1wbGVfbWF4X3N1Y2Nlc3NpdmVfZmFpbHVyZXMgJiYKKwkJICAgIHRpY2tzIC0gc2FuLT5zdGF0 c1tzaXplX2Jpbl1bcml4XS5sYXN0X3R4IDwgc2FtcGxlLT5zYW1wbGVfc3RhbGVfZmFpbHVyZV90 aW1lb3V0KSB7CisJCQltYXNrICY9IH4oKHVpbnQ2NF90KSAxPDxyaXgpOworCQkJZ290byBuZXh0 cmF0ZTsKKwkJfQorCisJCS8qCisJCSAqIEZvciBIVCwgb25seSBzYW1wbGUgYSBmZXcgcmF0ZXMg b24gZWl0aGVyIHNpZGUgb2YgdGhlCisJCSAqIGN1cnJlbnQgcml4OyB0aGVyZSdzIHF1aXRlIGxp a2VseSBhIGxvdCBvZiB0aGVtLgorCQkgKi8KKwkJaWYgKG5pLT5uaV9mbGFncyAmIElFRUU4MDIx MV9OT0RFX0hUKSB7CisJCQlpZiAocml4IDwgKGN1cnJlbnRfcml4IC0gMykgfHwKKwkJCSAgICBy aXggPiAoY3VycmVudF9yaXggKyAzKSkgeworCQkJCW1hc2sgJj0gfigodWludDY0X3QpIDE8PHJp eCk7CisJCQkJZ290byBuZXh0cmF0ZTsKKwkJCX0KKwkJfQorCisJCS8qIERvbid0IHNhbXBsZSBt b3JlIHRoYW4gMiByYXRlcyBoaWdoZXIgZm9yIHJhdGVzID4gMTFNIGZvciBub24tSFQgcmF0ZXMg Ki8KKwkJaWYgKCEgKG5pLT5uaV9mbGFncyAmIElFRUU4MDIxMV9OT0RFX0hUKSkgeworCQkJaWYg KERPVDExUkFURShyaXgpID4gMioxMSAmJiByaXggPiBjdXJyZW50X3JpeCArIDIpIHsKKwkJCQlt YXNrICY9IH4oKHVpbnQ2NF90KSAxPDxyaXgpOworCQkJCWdvdG8gbmV4dHJhdGU7CisJCQl9CisJ CX0KKworCQlzYW4tPmxhc3Rfc2FtcGxlX3JpeFtzaXplX2Jpbl0gPSByaXg7CisJCXJldHVybiBy aXg7CisJfQorCXJldHVybiBjdXJyZW50X3JpeDsKKyN1bmRlZiBET1QxMVJBVEUKKyN1bmRlZiBN Q1MKK30KKworc3RhdGljIGludAorc2FtcGxlX2dldF9zdGF0aWNfcml4KGNvbnN0IHN0cnVjdCBp ZWVlODAyMTFfbm9kZSAqbmkpCit7CisjZGVmaW5lCVJBVEUoX2l4KQkobmktPm5pX3JhdGVzLnJz X3JhdGVzWyhfaXgpXSAmIElFRUU4MDIxMV9SQVRFX1ZBTCkKKyNkZWZpbmUJTUNTKF9peCkJKG5p LT5uaV9odHJhdGVzLnJzX3JhdGVzW19peF0gfCBJRUVFODAyMTFfUkFURV9NQ1MpCisJc3RydWN0 IGllZWU4MDIxMXZhcCAqdmFwID0gbmktPm5pX3ZhcDsKKwljb25zdCBzdHJ1Y3QgaWVlZTgwMjEx X3JhdGVfdGFibGUgKnJ0ID0gaWVlZTgwMjExX2dldF9yYXRldGFibGUodmFwLT5pdl9pYy0+aWNf Y3VyY2hhbik7CisJY29uc3Qgc3RydWN0IGllZWU4MDIxMV90eHBhcmFtICp0cCA9IG5pLT5uaV90 eHBhcm1zOworCWludCBzcmF0ZTsKKworCS8qIENoZWNrIE1DUyByYXRlcyAqLworCWZvciAoc3Jh dGUgPSBuaS0+bmlfaHRyYXRlcy5yc19ucmF0ZXMgLSAxOyBzcmF0ZSA+PSAwOyBzcmF0ZS0tKSB7 CisJCWlmIChNQ1Moc3JhdGUpID09IHRwLT51Y2FzdHJhdGUpCisJCQlyZXR1cm4gcnQtPnJhdGVD b2RlVG9JbmRleFt0cC0+dWNhc3RyYXRlXTsKKwl9CisKKwkvKiBDaGVjayBsZWdhY3kgcmF0ZXMg Ki8KKwlmb3IgKHNyYXRlID0gbmktPm5pX3JhdGVzLnJzX25yYXRlcyAtIDE7IHNyYXRlID49IDA7 IHNyYXRlLS0pIHsKKwkJaWYgKFJBVEUoc3JhdGUpID09IHRwLT51Y2FzdHJhdGUpCisJCQlyZXR1 cm4gcnQtPnJhdGVDb2RlVG9JbmRleFt0cC0+dWNhc3RyYXRlXTsKKwl9CisJcmV0dXJuIC0xOwor I3VuZGVmCVJBVEUKKyN1bmRlZglNQ1MKK30KKworc3RhdGljIHZvaWQKK3NhbXBsZV91cGRhdGVf c3RhdGljX3JpeChzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pKQoreworCXN0cnVjdCBpZWVlODAy MTFfc2FtcGxlX25vZGUgKnNhbiA9IG5pLT5uaV9yY3RsczsKKwljb25zdCBzdHJ1Y3QgaWVlZTgw MjExX3R4cGFyYW0gKnRwID0gbmktPm5pX3R4cGFybXM7CisKKwlpZiAodHAgIT0gTlVMTCAmJiB0 cC0+dWNhc3RyYXRlICE9IElFRUU4MDIxMV9GSVhFRF9SQVRFX05PTkUpIHsKKwkJLyoKKwkJICog QSBmaXhlZCByYXRlIGlzIHRvIGJlIHVzZWQ7IHVjYXN0cmF0ZSBpcyB0aGUgSUVFRSBjb2RlCisJ CSAqIGZvciB0aGlzIHJhdGUgKHNhbnMgYmFzaWMgYml0KS4gIENoZWNrIHRoaXMgYWdhaW5zdCB0 aGUKKwkJICogbmVnb3RpYXRlZCByYXRlIHNldCBmb3IgdGhlIG5vZGUuICBOb3RlIHRoZSBmaXhl ZCByYXRlCisJCSAqIG1heSBub3QgYmUgYXZhaWxhYmxlIGZvciB2YXJpb3VzIHJlYXNvbnMgc28g d2Ugb25seQorCQkgKiBzZXR1cCB0aGUgc3RhdGljIHJhdGUgaW5kZXggaWYgdGhlIGxvb2t1cCBp cyBzdWNjZXNzZnVsLgorCQkgKi8KKwkJc2FuLT5zdGF0aWNfcml4ID0gc2FtcGxlX2dldF9zdGF0 aWNfcml4KG5pKTsKKwl9IGVsc2UgeworCQlzYW4tPnN0YXRpY19yaXggPSAtMTsKKwl9Cit9CisK Ky8qCisgKiBQaWNrIGEgbm9uLUhUIHJhdGUgdG8gYmVnaW4gdXNpbmcuCisgKi8KK3N0YXRpYyBp bnQKK3NhbXBsZV9waWNrX3NlZWRfcmF0ZV9sZWdhY3koY29uc3Qgc3RydWN0IGllZWU4MDIxMV9u b2RlICpuaSwgaW50IGZyYW1lTGVuKQoreworI2RlZmluZQlET1QxMVJBVEUoaXgpCShydC0+aW5m b1tpeF0uZG90MTFSYXRlICYgSUVFRTgwMjExX1JBVEVfVkFMKQorCXN0cnVjdCBpZWVlODAyMTF2 YXAgKnZhcCA9IG5pLT5uaV92YXA7CisJc3RydWN0IGllZWU4MDIxMV9zYW1wbGVfbm9kZSAqc2Fu ID0gbmktPm5pX3JjdGxzOworCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmF0ZV90YWJsZSAqcnQg PSBpZWVlODAyMTFfZ2V0X3JhdGV0YWJsZSh2YXAtPml2X2ljLT5pY19jdXJjaGFuKTsKKwkKKwlj b25zdCBpbnQgc2l6ZV9iaW4gPSBzaXplX3RvX2JpbihmcmFtZUxlbik7CisJaW50IHJpeCA9IC0x OworCisJLyogbm8gcGFja2V0IGhhcyBiZWVuIHNlbnQgc3VjY2Vzc2Z1bGx5IHlldCAqLworCWZv ciAocml4ID0gcnQtPnJhdGVDb3VudC0xOyByaXggPiAwOyByaXgtLSkgeworCQlpZiAoKHNhbi0+ cmF0ZW1hc2sgJiAoKHVpbnQ2NF90KSAxPDxyaXgpKSA9PSAwKQorCQkJY29udGludWU7CisKKwkJ LyogU2tpcCBIVCByYXRlcyAqLworCQlpZiAocnQtPmluZm9bcml4XS5waHkgPT0gSUVFRTgwMjEx X1RfSFQpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBQaWNrIHRoZSBoaWdoZXN0IHJhdGUg PD0gMzYgTWJwcworCQkgKiB0aGF0IGhhc24ndCBmYWlsZWQuCisJCSAqLworCQlpZiAoRE9UMTFS QVRFKHJpeCkgPD0gNzIgJiYKKwkJICAgIHNhbi0+c3RhdHNbc2l6ZV9iaW5dW3JpeF0uc3VjY2Vz c2l2ZV9mYWlsdXJlcyA9PSAwKSB7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gcml4Owor I3VuZGVmIERPVDExUkFURQorfQorCisvKgorICogUGljayBhIEhUIHJhdGUgdG8gYmVnaW4gdXNp bmcuCisgKgorICogRG9uJ3QgdXNlIGFueSBub24tSFQgcmF0ZXM7IG9ubHkgY29uc2lkZXIgSFQg cmF0ZXMuCisgKi8KK3N0YXRpYyBpbnQKK3NhbXBsZV9waWNrX3NlZWRfcmF0ZV9odChjb25zdCBz dHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pLCBpbnQgZnJhbWVMZW4pCit7CisjZGVmaW5lCU1DUyhp eCkJCShydC0+aW5mb1tpeF0uZG90MTFSYXRlIHwgSUVFRTgwMjExX1JBVEVfTUNTKQorCXN0cnVj dCBpZWVlODAyMTF2YXAgKnZhcCA9IG5pLT5uaV92YXA7CisJc3RydWN0IGllZWU4MDIxMV9zYW1w bGVfbm9kZSAqc2FuID0gbmktPm5pX3JjdGxzOworCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmF0 ZV90YWJsZSAqcnQgPSBpZWVlODAyMTFfZ2V0X3JhdGV0YWJsZSh2YXAtPml2X2ljLT5pY19jdXJj aGFuKTsKKwkKKwljb25zdCBpbnQgc2l6ZV9iaW4gPSBzaXplX3RvX2JpbihmcmFtZUxlbik7CisJ aW50IHJpeCA9IC0xLCBodF9yaXggPSAtMTsKKworCS8qIG5vIHBhY2tldCBoYXMgYmVlbiBzZW50 IHN1Y2Nlc3NmdWxseSB5ZXQgKi8KKwlmb3IgKHJpeCA9IHJ0LT5yYXRlQ291bnQtMTsgcml4ID4g MDsgcml4LS0pIHsKKwkJLyogU2tpcCByYXRlcyB3ZSBjYW4ndCB1c2UgKi8KKwkJaWYgKChzYW4t PnJhdGVtYXNrICYgKCh1aW50NjRfdCkgMTw8cml4KSkgPT0gMCkKKwkJCWNvbnRpbnVlOworCisJ CS8qIEtlZXAgYSBjb3B5IG9mIHRoZSBsYXN0IHNlZW4gSFQgcmF0ZSBpbmRleCAqLworCQlpZiAo cnQtPmluZm9bcml4XS5waHkgPT0gSUVFRTgwMjExX1RfSFQpCisJCQlodF9yaXggPSByaXg7CisK KwkJLyogU2tpcCBub24tSFQgcmF0ZXMgKi8KKwkJaWYgKHJ0LT5pbmZvW3JpeF0ucGh5ICE9IElF RUU4MDIxMV9UX0hUKQorCQkJY29udGludWU7CisKKwkJLyoKKwkJICogUGljayBhIG1lZGl1bS1z cGVlZCByYXRlIHJlZ2FyZGxlc3Mgb2Ygc3RyZWFtIGNvdW50CisJCSAqIHdoaWNoIGhhcyBub3Qg c2VlbiBhbnkgZmFpbHVyZXMuIEhpZ2hlciByYXRlcyBtYXkgZmFpbDsKKwkJICogd2UnbGwgdHJ5 IHRoZW0gbGF0ZXIuCisJCSAqLworCQlpZiAoKChNQ1Mocml4KSAmIDB4NykgPD0gNCkgJiYKKwkJ ICAgIHNhbi0+c3RhdHNbc2l6ZV9iaW5dW3JpeF0uc3VjY2Vzc2l2ZV9mYWlsdXJlcyA9PSAwKSB7 CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qCisJICogSWYgYWxsIHRoZSBNQ1MgcmF0ZXMgaGF2 ZSBzdWNjZXNzaXZlIGZhaWx1cmVzLCByaXggc2hvdWxkIGJlCisJICogPiAwOyBvdGhlcndpc2Ug dXNlIHRoZSBsb3dlc3QgTUNTIHJpeCAoaG9wZWZ1bGx5IE1DUyAwLikKKwkgKi8KKwlyZXR1cm4g TUFYKHJpeCwgaHRfcml4KTsKKyN1bmRlZiBNQ1MKK30KKworc3RhdGljIGludAorc2FtcGxlX3Jh dGUoc3RydWN0IGllZWU4MDIxMV9ub2RlICpuaSwgdm9pZCAqYXJnIF9fdW51c2VkLCB1aW50MzJf dCBpYXJnIF9fdW51c2VkKQoreworI2RlZmluZQlET1QxMVJBVEUoaXgpCShydC0+aW5mb1tpeF0u ZG90MTFSYXRlICYgSUVFRTgwMjExX1JBVEVfVkFMKQorI2RlZmluZQlNQ1MoaXgpCQkocnQtPmlu Zm9baXhdLmRvdDExUmF0ZSB8IElFRUU4MDIxMV9SQVRFX01DUykKKyNkZWZpbmUJUkFURShpeCkJ KERPVDExUkFURShpeCkgLyAyKQorCXN0cnVjdCBpZWVlODAyMTF2YXAgKnZhcCA9IG5pLT5uaV92 YXA7CisJc3RydWN0IGllZWU4MDIxMV9zYW1wbGVfbm9kZSAqc2FuID0gbmktPm5pX3JjdGxzOwor CXN0cnVjdCBpZWVlODAyMTFfc2FtcGxlICpzYW1wbGUgPSBzYW4tPnNhbl9zYW1wbGU7CisJY29u c3Qgc3RydWN0IGllZWU4MDIxMV9yYXRlX3RhYmxlICpydCA9IGllZWU4MDIxMV9nZXRfcmF0ZXRh YmxlKHZhcC0+aXZfaWMtPmljX2N1cmNoYW4pOworCQorCWludCByaXgsIG1yciwgYmVzdF9yaXgs IGNoYW5nZV9yYXRlczsKKwl1bnNpZ25lZCBhdmVyYWdlX3R4X3RpbWU7CisJCisJc2l6ZV90IGZy YW1lTGVuID0gKHNpemVfdClpYXJnOworCWNvbnN0IGludCBzaXplX2JpbiA9IHNpemVfdG9fYmlu KGZyYW1lTGVuKTsKKworCXNhbXBsZV91cGRhdGVfc3RhdGljX3JpeChuaSk7CisKKwlpZiAoc2Fu LT5zdGF0aWNfcml4ICE9IC0xKSB7CisJCXJpeCA9IHNhbi0+c3RhdGljX3JpeDsKKwkJZ290byBk b25lOworCX0KKworCWlmIChJRUVFODAyMTFfUkFURUNUTF9IQVNDQVBfTVJSKG5pKSkKKwkJbXJy ID0gMTsKKwlpZiAoISBJRUVFODAyMTFfUkFURUNUTF9IQVNDQVBfTVJSUFJPVChuaSkpCisJCW1y ciA9IDA7CisKKwliZXN0X3JpeCA9IHBpY2tfYmVzdF9yYXRlKG5pLCBydCwgc2l6ZV9iaW4sICFt cnIpOworCWlmIChiZXN0X3JpeCA+PSAwKSB7CisJCWF2ZXJhZ2VfdHhfdGltZSA9IHNhbi0+c3Rh dHNbc2l6ZV9iaW5dW2Jlc3Rfcml4XS5hdmVyYWdlX3R4X3RpbWU7CisJfSBlbHNlIHsKKwkJYXZl cmFnZV90eF90aW1lID0gMDsKKwl9CisKKwkvKgorCSAqIExpbWl0IHRoZSB0aW1lIG1lYXN1cmlu ZyB0aGUgcGVyZm9ybWFuY2Ugb2Ygb3RoZXIgdHgKKwkgKiByYXRlcyB0byBzYW1wbGVfcmF0ZSUg b2YgdGhlIHRvdGFsIHRyYW5zbWlzc2lvbiB0aW1lLgorCSAqLworCWlmIChzYW4tPnNhbXBsZV90 dFtzaXplX2Jpbl0gPCBhdmVyYWdlX3R4X3RpbWUgKiAoc2FuLT5wYWNrZXRzX3NpbmNlX3NhbXBs ZVtzaXplX2Jpbl0gKgorCQlzYW1wbGUtPnNhbXBsZV9yYXRlLzEwMCkpIHsKKwkJcml4ID0gcGlj a19zYW1wbGVfcmF0ZShuaSwgcnQsIHNpemVfYmluKTsKKwkJSUVFRTgwMjExX05PVEUodmFwLCBJ RUVFODAyMTFfTVNHX1JBVEVDVEwsCisJCSAgICAgJm5pLCAiYXR0ICVkIHNhbXBsZV90dCAlZCBz aXplICV1IHNhbXBsZSByYXRlICVkICVzIGN1cnJlbnQgcmF0ZSAlZCAlcyIsCisJCSAgICAgYXZl cmFnZV90eF90aW1lLAorCQkgICAgIHNhbi0+c2FtcGxlX3R0W3NpemVfYmluXSwKKwkJICAgICBi aW5fdG9fc2l6ZShzaXplX2JpbiksCisJCSAgICAgZG90MTFyYXRlKHJ0LCByaXgpLAorCQkgICAg IGRvdDExcmF0ZV9sYWJlbChydCwgcml4KSwKKwkJICAgICBkb3QxMXJhdGUocnQsIHNhbi0+Y3Vy cmVudF9yaXhbc2l6ZV9iaW5dKSwKKwkJICAgICBkb3QxMXJhdGVfbGFiZWwocnQsIHNhbi0+Y3Vy cmVudF9yaXhbc2l6ZV9iaW5dKSk7CisJCWlmIChyaXggIT0gc2FuLT5jdXJyZW50X3JpeFtzaXpl X2Jpbl0pIHsKKwkJCXNhbi0+Y3VycmVudF9zYW1wbGVfcml4W3NpemVfYmluXSA9IHJpeDsKKwkJ fSBlbHNlIHsKKwkJCXNhbi0+Y3VycmVudF9zYW1wbGVfcml4W3NpemVfYmluXSA9IC0xOworCQl9 CisJCXNhbi0+cGFja2V0c19zaW5jZV9zYW1wbGVbc2l6ZV9iaW5dID0gMDsKKwl9IGVsc2Ugewor CQljaGFuZ2VfcmF0ZXMgPSAwOworCQlpZiAoIXNhbi0+cGFja2V0c19zZW50W3NpemVfYmluXSB8 fCBiZXN0X3JpeCA9PSAtMSkgeworCQkJLyogbm8gcGFja2V0IGhhcyBiZWVuIHNlbnQgc3VjY2Vz c2Z1bGx5IHlldCAqLworCQkJY2hhbmdlX3JhdGVzID0gMTsKKwkJCWlmIChuaS0+bmlfZmxhZ3Mg JiBJRUVFODAyMTFfTk9ERV9IVCkKKwkJCQliZXN0X3JpeCA9IHNhbXBsZV9waWNrX3NlZWRfcmF0 ZV9odChuaSwgZnJhbWVMZW4pOworCQkJZWxzZQorCQkJCWJlc3Rfcml4ID0gc2FtcGxlX3BpY2tf c2VlZF9yYXRlX2xlZ2FjeShuaSwgZnJhbWVMZW4pOworCQl9IGVsc2UgaWYgKHNhbi0+cGFja2V0 c19zZW50W3NpemVfYmluXSA8IDIwKSB7CisJCQkvKiBsZXQgdGhlIGJpdC1yYXRlIHN3aXRjaCBx dWlja2x5IGR1cmluZyB0aGUgZmlyc3QgZmV3IHBhY2tldHMgKi8KKwkJCUlFRUU4MDIxMV9OT1RF KHZhcCwKKwkJCSAgICBJRUVFODAyMTFfTVNHX1JBVEVDVEwsICZuaSwKKwkJCSAgICAiJXM6IHN3 aXRjaGluZyBxdWlja2x5Li4iLCBfX2Z1bmNfXyk7CisJCQljaGFuZ2VfcmF0ZXMgPSAxOworCQl9 IGVsc2UgaWYgKHRpY2tzIC0gc2FtcGxlLT5zYW1wbGVfbWluX3N3aXRjaCA+IHNhbi0+dGlja3Nf c2luY2Vfc3dpdGNoW3NpemVfYmluXSkgeworCQkJLyogbWluX3N3aXRjaCBzZWNvbmRzIGhhdmUg Z29uZSBieSAqLworCQkJSUVFRTgwMjExX05PVEUodmFwLAorCQkJICAgIElFRUU4MDIxMV9NU0df UkFURUNUTCwgJm5pLAorCQkJICAgICIlczogbWluX3N3aXRjaCAlZCA+IHRpY2tzX3NpbmNlX3N3 aXRjaCAlZC4uIiwKKwkJCSAgICBfX2Z1bmNfXywgdGlja3MgLSBzYW1wbGUtPnNhbXBsZV9taW5f c3dpdGNoLCBzYW4tPnRpY2tzX3NpbmNlX3N3aXRjaFtzaXplX2Jpbl0pOworCQkJY2hhbmdlX3Jh dGVzID0gMTsKKwkJfSBlbHNlIGlmICgoISAobmktPm5pX2ZsYWdzICYgSUVFRTgwMjExX05PREVf SFQpKSAmJgorCQkgICAgKDIqYXZlcmFnZV90eF90aW1lIDwgc2FuLT5zdGF0c1tzaXplX2Jpbl1b c2FuLT5jdXJyZW50X3JpeFtzaXplX2Jpbl1dLmF2ZXJhZ2VfdHhfdGltZSkpIHsKKwkJCS8qIHRo ZSBjdXJyZW50IGJpdC1yYXRlIGlzIHR3aWNlIGFzIHNsb3cgYXMgdGhlIGJlc3Qgb25lICovCisJ CQlJRUVFODAyMTFfTk9URSh2YXAsCisJCQkgICAgSUVFRTgwMjExX01TR19SQVRFQ1RMLCAmbmks CisJCQkgICAgIiVzOiAyeCBhdHQgKD0gJWQpIDwgY3VyX3JpeCBhdHQgJWQiLAorCQkJICAgIF9f ZnVuY19fLAorCQkJICAgIDIgKiBhdmVyYWdlX3R4X3RpbWUsIHNhbi0+c3RhdHNbc2l6ZV9iaW5d W3Nhbi0+Y3VycmVudF9yaXhbc2l6ZV9iaW5dXS5hdmVyYWdlX3R4X3RpbWUpOworCQkJY2hhbmdl X3JhdGVzID0gMTsKKwkJfSBlbHNlIGlmICgobmktPm5pX2ZsYWdzICYgSUVFRTgwMjExX05PREVf SFQpKSB7CisJCQlpbnQgY3VyX3JpeCA9IHNhbi0+Y3VycmVudF9yaXhbc2l6ZV9iaW5dOworCQkJ aW50IGN1cl9hdHQgPSBzYW4tPnN0YXRzW3NpemVfYmluXVtjdXJfcml4XS5hdmVyYWdlX3R4X3Rp bWU7CisJCQkvKgorCQkJICogSWYgdGhlIG5vZGUgaXMgSFQsIHVwZ3JhZGUgaXQgaWYgdGhlIE1D UyByYXRlIGlzCisJCQkgKiBoaWdoZXIgYW5kIHRoZSBhdmVyYWdlIHR4IHRpbWUgaXMgd2l0aGlu IDIwJSBvZgorCQkJICogdGhlIGN1cnJlbnQgcmF0ZS4gSXQgY2FuIGZhaWwgYSBsaXR0bGUuCisJ CQkgKgorCQkJICogVGhpcyBpcyBsaWtlbHkgbm90IG9wdGltYWwhCisJCQkgKi8KKyNpZiAwCisJ CQlwcmludGYoImN1ciByaXgvYXR0ICV4LyVkLCBiZXN0IHJpeC9hdHQgJXgvJWRcbiIsCisJCQkg ICAgTUNTKGN1cl9yaXgpLCBjdXJfYXR0LCBNQ1MoYmVzdF9yaXgpLCBhdmVyYWdlX3R4X3RpbWUp OworI2VuZGlmCisJCQlpZiAoKE1DUyhiZXN0X3JpeCkgPiBNQ1MoY3VyX3JpeCkpICYmCisJCQkg ICAgKGF2ZXJhZ2VfdHhfdGltZSAqIDgpIDw9IChjdXJfYXR0ICogMTApKSB7CisJCQkJSUVFRTgw MjExX05PVEUodmFwLAorCQkJCSAgICBJRUVFODAyMTFfTVNHX1JBVEVDVEwsICZuaSwKKwkJCQkg ICAgIiVzOiBIVDogYmVzdF9yaXggMHglZCA+IGN1cl9yaXggMHgleCwgYXZlcmFnZV90eF90aW1l ICVkLCBjdXJfYXR0ICVkIiwKKwkJCQkgICAgX19mdW5jX18sCisJCQkJICAgIE1DUyhiZXN0X3Jp eCksIE1DUyhjdXJfcml4KSwgYXZlcmFnZV90eF90aW1lLCBjdXJfYXR0KTsKKwkJCQljaGFuZ2Vf cmF0ZXMgPSAxOworCQkJfQorCQl9CisKKwkJc2FuLT5wYWNrZXRzX3NpbmNlX3NhbXBsZVtzaXpl X2Jpbl0rKzsKKwkJCisJCWlmIChjaGFuZ2VfcmF0ZXMpIHsKKwkJCWlmIChiZXN0X3JpeCAhPSBz YW4tPmN1cnJlbnRfcml4W3NpemVfYmluXSkgeworCQkJCUlFRUU4MDIxMV9OT1RFKHZhcCwKKwkJ CQkgICAgSUVFRTgwMjExX01TR19SQVRFQ1RMLAorCQkJCSAgICAmbmksCisiJXM6IHNpemUgJWQg c3dpdGNoIHJhdGUgJWQgKCVkLyVkKSAtPiAlZCAoJWQvJWQpIGFmdGVyICVkIHBhY2tldHMgbXJy ICVkIiwKKwkJCQkgICAgX19mdW5jX18sCisJCQkJICAgIGJpbl90b19zaXplKHNpemVfYmluKSwK KwkJCQkgICAgUkFURShzYW4tPmN1cnJlbnRfcml4W3NpemVfYmluXSksCisJCQkJICAgIHNhbi0+ c3RhdHNbc2l6ZV9iaW5dW3Nhbi0+Y3VycmVudF9yaXhbc2l6ZV9iaW5dXS5hdmVyYWdlX3R4X3Rp bWUsCisJCQkJICAgIHNhbi0+c3RhdHNbc2l6ZV9iaW5dW3Nhbi0+Y3VycmVudF9yaXhbc2l6ZV9i aW5dXS5wZXJmZWN0X3R4X3RpbWUsCisJCQkJICAgIFJBVEUoYmVzdF9yaXgpLAorCQkJCSAgICBz YW4tPnN0YXRzW3NpemVfYmluXVtiZXN0X3JpeF0uYXZlcmFnZV90eF90aW1lLAorCQkJCSAgICBz YW4tPnN0YXRzW3NpemVfYmluXVtiZXN0X3JpeF0ucGVyZmVjdF90eF90aW1lLAorCQkJCSAgICBz YW4tPnBhY2tldHNfc2luY2Vfc3dpdGNoW3NpemVfYmluXSwKKwkJCQkgICAgbXJyKTsKKwkJCX0K KwkJCXNhbi0+cGFja2V0c19zaW5jZV9zd2l0Y2hbc2l6ZV9iaW5dID0gMDsKKwkJCXNhbi0+Y3Vy cmVudF9yaXhbc2l6ZV9iaW5dID0gYmVzdF9yaXg7CisJCQlzYW4tPnRpY2tzX3NpbmNlX3N3aXRj aFtzaXplX2Jpbl0gPSB0aWNrczsKKwkJCS8qIAorCQkJICogU2V0IHRoZSB2aXNpYmxlIHR4cmF0 ZSBmb3IgdGhpcyBub2RlLgorCQkJICovCisJCQluaS0+bmlfdHhyYXRlID0gZG90MTFyYXRlKHJ0 LCBiZXN0X3JpeCk7CisJCX0KKwkJcml4ID0gc2FuLT5jdXJyZW50X3JpeFtzaXplX2Jpbl07CisJ CXNhbi0+cGFja2V0c19zaW5jZV9zd2l0Y2hbc2l6ZV9iaW5dKys7CisJfQorCS8vICp0cnkwID0g bXJyID8gc2FuLT5zY2hlZFtyaXhdLnQwIDogQVRIX1RYTUFYVFJZOworZG9uZToKKworCS8qCisJ ICogVGhpcyBidWcgdG90YWxseSBzdWNrcyBhbmQgc2hvdWxkIGJlIGZpeGVkLgorCSAqCisJICog Rm9yIG5vdyB0aG91Z2gsIGxldCdzIG5vdCBwYW5pYywgc28gd2UgY2FuIHN0YXJ0IHRvIGZpZ3Vy ZQorCSAqIG91dCBob3cgdG8gYmV0dGVyIHJlcHJvZHVjZSBpdC4KKwkgKi8KKwlpZiAocml4IDwg MCB8fCByaXggPj0gcnQtPnJhdGVDb3VudCkgeworCQlwcmludGYoIiVzOiBFUlJPUjogcml4ICVk IG91dCBvZiBib3VuZHMgKHJhdGVDb3VudD0lZClcbiIsCisJCSAgICBfX2Z1bmNfXywKKwkJICAg IHJpeCwKKwkJICAgIHJ0LT5yYXRlQ291bnQpOworCQkgICAgcml4ID0gMDsJLyogWFhYIGp1c3Qg ZGVmYXVsdCBmb3Igbm93ICovCisJfQorCUtBU1NFUlQocml4ID49IDAgJiYgcml4IDwgcnQtPnJh dGVDb3VudCwgKCJyaXggaXMgJWQiLCByaXgpKTsKKworCS8vICpyaXgwID0gcml4OworCS8vICp0 eHJhdGUgPSBydC0+aW5mb1tyaXhdLnJhdGVDb2RlCisJLy8gCXwgKHNob3J0UHJlYW1ibGUgPyBy dC0+aW5mb1tyaXhdLnNob3J0UHJlYW1ibGUgOiAwKTsKKwlzYW4tPnBhY2tldHNfc2VudFtzaXpl X2Jpbl0rKzsKKworCXJldHVybiByaXg7CisjdW5kZWYgRE9UMTFSQVRFCisjdW5kZWYgTUNTCisj dW5kZWYgUkFURQorfQorCitzdGF0aWMgdm9pZAorc2FtcGxlX3JhdGVzKHN0cnVjdCBpZWVlODAy MTFfbm9kZSAqbmksIHN0cnVjdCBpZWVlODAyMTFfcmNfaW5mbyAqcmNfaW5mbykKK3sKKwlzdHJ1 Y3QgaWVlZTgwMjExX3NhbXBsZV9ub2RlICpzYW4gPSBuaS0+bmlfcmN0bHM7CisJdWludDhfdCBy aXgwID0gc2FtcGxlX3JhdGUobmksIE5VTEwsIDApOworCWNvbnN0IHN0cnVjdCB0eHNjaGVkdWxl ICpzY2hlZCA9ICZzYW4tPnNjaGVkW3JpeDBdOworCXN0cnVjdCBpZWVlODAyMTFfcmNfc2VyaWVz ICpyYyA9IHJjX2luZm8tPnJpX3JjOworCisJS0FTU0VSVChyaXgwID09IHNjaGVkLT5yMCwgKCJy aXgwICgleCkgIT0gc2NoZWQtPnIwICgleCkhXG4iLAorCSAgICByaXgwLCBzY2hlZC0+cjApKTsK KwkvKiBYWFggKi8KKwlyY1swXS5mbGFncyA9IHJjWzFdLmZsYWdzID0gcmNbMl0uZmxhZ3MgPSBy Y1szXS5mbGFncyA9IDA7CisKKwlyY1swXS5yaXggPSBzY2hlZC0+cjA7CisJcmNbMV0ucml4ID0g c2NoZWQtPnIxOworCXJjWzJdLnJpeCA9IHNjaGVkLT5yMjsKKwlyY1szXS5yaXggPSBzY2hlZC0+ cjM7CisKKwlyY1swXS50cmllcyA9IHNjaGVkLT50MDsKKwlyY1sxXS50cmllcyA9IHNjaGVkLT50 MTsKKwlyY1syXS50cmllcyA9IHNjaGVkLT50MjsKKwlyY1szXS50cmllcyA9IHNjaGVkLT50MzsK K30KKworc3RhdGljIHZvaWQKK3VwZGF0ZV9zdGF0cyhjb25zdCBzdHJ1Y3QgaWVlZTgwMjExdmFw ICp2YXAsCisgICAgCSAgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9ub2RlICpuaSwKKwkJICBpbnQg ZnJhbWVfc2l6ZSwKKwkJICBpbnQgcml4MCwgaW50IHRyaWVzMCwKKwkJICBpbnQgcml4MSwgaW50 IHRyaWVzMSwKKwkJICBpbnQgcml4MiwgaW50IHRyaWVzMiwKKwkJICBpbnQgcml4MywgaW50IHRy aWVzMywKKwkJICBpbnQgc2hvcnRfdHJpZXMsIGludCB0cmllcywKKwkJICBpbnQgbmZyYW1lcywg aW50IG5iYWQpCit7CisJc3RydWN0IGllZWU4MDIxMV9zYW1wbGVfbm9kZSAqc2FuID0gbmktPm5p X3JjdGxzOworCXN0cnVjdCBpZWVlODAyMTFfc2FtcGxlICpzYW1wbGUgPSBzYW4tPnNhbl9zYW1w bGU7CisKKwljb25zdCBpbnQgc2l6ZV9iaW4gPSBzaXplX3RvX2JpbihmcmFtZV9zaXplKTsKKwlj b25zdCBpbnQgc2l6ZSA9IGJpbl90b19zaXplKHNpemVfYmluKTsKKworCWludCBpc19odDQwID0g aWVlZTgwMjExX3JhdGVjdGxfaGFzY2FwX2N3NDAodmFwLCBuaSk7CisJaW50IHR0LCB0cmllc19z b19mYXI7CisJaW50IHBjdDsKKworCWlmICghSVNfUkFURV9ERUZJTkVEKHNhbiwgcml4MCkpCisJ CXJldHVybjsKKwl0dCA9IGNhbGNfdXNlY3NfdW5pY2FzdF9wYWNrZXQodmFwLCBzaXplLCByaXgw LCBzaG9ydF90cmllcywKKwkJTUlOKHRyaWVzMCwgdHJpZXMpIC0gMSwgaXNfaHQ0MCk7CisJdHJp ZXNfc29fZmFyID0gdHJpZXMwOworCisJaWYgKHRyaWVzMSAmJiB0cmllc19zb19mYXIgPCB0cmll cykgeworCQlpZiAoIUlTX1JBVEVfREVGSU5FRChzYW4sIHJpeDEpKQorCQkJcmV0dXJuOworCQl0 dCArPSBjYWxjX3VzZWNzX3VuaWNhc3RfcGFja2V0KHZhcCwgc2l6ZSwgcml4MSwgc2hvcnRfdHJp ZXMsCisJCQlNSU4odHJpZXMxICsgdHJpZXNfc29fZmFyLCB0cmllcykgLSB0cmllc19zb19mYXIg LSAxLCBpc19odDQwKTsKKwkJdHJpZXNfc29fZmFyICs9IHRyaWVzMTsKKwl9CisKKwlpZiAodHJp ZXMyICYmIHRyaWVzX3NvX2ZhciA8IHRyaWVzKSB7CisJCWlmICghSVNfUkFURV9ERUZJTkVEKHNh biwgcml4MikpCisJCQlyZXR1cm47CisJCXR0ICs9IGNhbGNfdXNlY3NfdW5pY2FzdF9wYWNrZXQo dmFwLCBzaXplLCByaXgyLCBzaG9ydF90cmllcywKKwkJCU1JTih0cmllczIgKyB0cmllc19zb19m YXIsIHRyaWVzKSAtIHRyaWVzX3NvX2ZhciAtIDEsIGlzX2h0NDApOworCQl0cmllc19zb19mYXIg Kz0gdHJpZXMyOworCX0KKworCWlmICh0cmllczMgJiYgdHJpZXNfc29fZmFyIDwgdHJpZXMpIHsK KwkJaWYgKCFJU19SQVRFX0RFRklORUQoc2FuLCByaXgzKSkKKwkJCXJldHVybjsKKwkJdHQgKz0g Y2FsY191c2Vjc191bmljYXN0X3BhY2tldCh2YXAsIHNpemUsIHJpeDMsIHNob3J0X3RyaWVzLAor CQkJTUlOKHRyaWVzMyArIHRyaWVzX3NvX2ZhciwgdHJpZXMpIC0gdHJpZXNfc29fZmFyIC0gMSwg aXNfaHQ0MCk7CisJfQorCisJaWYgKHNhbi0+c3RhdHNbc2l6ZV9iaW5dW3JpeDBdLnRvdGFsX3Bh Y2tldHMgPCBzYW1wbGUtPnNhbnBsZV9zbW9vdGhpbmdfbWlucGFja2V0cykgeworCQkvKiBqdXN0 IGF2ZXJhZ2UgdGhlIGZpcnN0IGZldyBwYWNrZXRzICovCisJCWludCBhdmdfdHggPSBzYW4tPnN0 YXRzW3NpemVfYmluXVtyaXgwXS5hdmVyYWdlX3R4X3RpbWU7CisJCWludCBwYWNrZXRzID0gc2Fu LT5zdGF0c1tzaXplX2Jpbl1bcml4MF0udG90YWxfcGFja2V0czsKKwkJc2FuLT5zdGF0c1tzaXpl X2Jpbl1bcml4MF0uYXZlcmFnZV90eF90aW1lID0gKHR0KyhhdmdfdHgqcGFja2V0cykpLyhwYWNr ZXRzK25mcmFtZXMpOworCX0gZWxzZSB7CisJCS8qIHVzZSBhIGV3bWEgKi8KKwkJc2FuLT5zdGF0 c1tzaXplX2Jpbl1bcml4MF0uYXZlcmFnZV90eF90aW1lID0gCisJCQkoKHNhbi0+c3RhdHNbc2l6 ZV9iaW5dW3JpeDBdLmF2ZXJhZ2VfdHhfdGltZSAqIHNhbXBsZS0+c2FucGxlX3Ntb290aGluZ19y YXRlKSArIAorCQkJICh0dCAqICgxMDAgLSBzYW1wbGUtPnNhbnBsZV9zbW9vdGhpbmdfcmF0ZSkp KSAvIDEwMDsKKwl9CisJCisJLyoKKwkgKiBYWFggRG9uJ3QgbWFyayB0aGUgaGlnaGVyIGJpdCBy YXRlcyBhcyBhbHNvIGhhdmluZyBmYWlsZWQ7IGFzIHRoaXMKKwkgKiB1bmZvcnR1bmF0ZWx5IHN0 b3BzIHRob3NlIHJhdGVzIGZyb20gYmVpbmcgdGFzdGVkIHdoZW4gdHJ5aW5nIHRvCisJICogVFgu IFRoaXMgaGFwcGVucyB3aXRoIDExbiBhZ2dyZWdhdGlvbi4KKwkgKi8KKwlpZiAobmZyYW1lcyA9 PSBuYmFkKSB7CisJCXNhbi0+c3RhdHNbc2l6ZV9iaW5dW3JpeDBdLnN1Y2Nlc3NpdmVfZmFpbHVy ZXMgKz0gbmJhZDsKKworCX0gZWxzZSB7CisJCXNhbi0+c3RhdHNbc2l6ZV9iaW5dW3JpeDBdLnBh Y2tldHNfYWNrZWQgKz0gKG5mcmFtZXMgLSBuYmFkKTsKKwkJc2FuLT5zdGF0c1tzaXplX2Jpbl1b cml4MF0uc3VjY2Vzc2l2ZV9mYWlsdXJlcyA9IDA7CisJfQorCXNhbi0+c3RhdHNbc2l6ZV9iaW5d W3JpeDBdLnRyaWVzICs9IHRyaWVzOworCXNhbi0+c3RhdHNbc2l6ZV9iaW5dW3JpeDBdLmxhc3Rf dHggPSB0aWNrczsKKwlzYW4tPnN0YXRzW3NpemVfYmluXVtyaXgwXS50b3RhbF9wYWNrZXRzICs9 IG5mcmFtZXM7CisKKwkvKiB1cGRhdGUgRVdNQSBmb3IgdGhpcyByaXggKi8KKworCS8qIENhbGN1 bGF0ZSBwZXJjZW50YWdlIGJhc2VkIG9uIGN1cnJlbnQgcmF0ZSAqLworCWlmIChuZnJhbWVzID09 IDApCisJCW5mcmFtZXMgPSBuYmFkID0gMTsKKwlwY3QgPSAoKG5mcmFtZXMgLSBuYmFkKSAqIDEw MDApIC8gbmZyYW1lczsKKworCWlmIChzYW4tPnN0YXRzW3NpemVfYmluXVtyaXgwXS50b3RhbF9w YWNrZXRzIDwKKwkgICAgc2FtcGxlLT5zYW5wbGVfc21vb3RoaW5nX21pbnBhY2tldHMpIHsKKwkJ LyoganVzdCBhdmVyYWdlIHRoZSBmaXJzdCBmZXcgcGFja2V0cyAqLworCQlpbnQgYV9wY3QgPSAo c2FuLT5zdGF0c1tzaXplX2Jpbl1bcml4MF0ucGFja2V0c19hY2tlZCAqIDEwMDApIC8KKwkJICAg IChzYW4tPnN0YXRzW3NpemVfYmluXVtyaXgwXS50b3RhbF9wYWNrZXRzKTsKKwkJc2FuLT5zdGF0 c1tzaXplX2Jpbl1bcml4MF0uZXdtYV9wY3QgPSBhX3BjdDsKKwl9IGVsc2UgeworCQkvKiB1c2Ug YSBld21hICovCisJCXNhbi0+c3RhdHNbc2l6ZV9iaW5dW3JpeDBdLmV3bWFfcGN0ID0KKwkJCSgo c2FuLT5zdGF0c1tzaXplX2Jpbl1bcml4MF0uZXdtYV9wY3QgKiBzYW1wbGUtPnNhbnBsZV9zbW9v dGhpbmdfcmF0ZSkgKworCQkJIChwY3QgKiAoMTAwIC0gc2FtcGxlLT5zYW5wbGVfc21vb3RoaW5n X3JhdGUpKSkgLyAxMDA7CisJfQorCisJaWYgKHJpeDAgPT0gc2FuLT5jdXJyZW50X3NhbXBsZV9y aXhbc2l6ZV9iaW5dKSB7CisJCXNhbi0+c2FtcGxlX3R0W3NpemVfYmluXSA9IHR0OworCQlzYW4t PmN1cnJlbnRfc2FtcGxlX3JpeFtzaXplX2Jpbl0gPSAtMTsKKwl9Cit9CisKK3N0YXRpYyB2b2lk CitzYW1wbGVfdHhfY29tcGxldGUoY29uc3Qgc3RydWN0IGllZWU4MDIxMXZhcCAqdmFwLAorICAg IGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqbmksIGludCBvaywKKyAgICB2b2lkICphcmcx LCB2b2lkICphcmcyKQoreworCXN0cnVjdCBpZWVlODAyMTFfc2FtcGxlX25vZGUgKnNhbiA9IG5p LT5uaV9yY3RsczsKKwljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JhdGVfdGFibGUgKnJ0ID0gaWVl ZTgwMjExX2dldF9yYXRldGFibGUodmFwLT5pdl9pYy0+aWNfY3VyY2hhbik7CisKKwkvKiBYWFgg bmVlZCB0byBjaGFuZ2UgYXJnMiB0byBwb2ludGVyIG9mIGllZWU4MDIxMV9yY19pbmZvICovCisJ c3RydWN0IGllZWU4MDIxMV9yY19pbmZvICpyY19pbmZvID0gKHN0cnVjdCBpZWVlODAyMTFfcmNf aW5mbyopYXJnMjsKKworCWludCBmaW5hbF9yaXgsIHNob3J0X3RyaWVzLCBsb25nX3RyaWVzOwor CWludCBuZnJhbWVzLCBuYmFkOworCWludCBmcmFtZV9zaXplLCBtcnI7CisKKwlmaW5hbF9yaXgg PSBydC0+cmF0ZUNvZGVUb0luZGV4W3JjX2luZm8tPnJpX3R4cmF0ZV07CisJc2hvcnRfdHJpZXMg PSByY19pbmZvLT5yaV9zaG9ydHJldHJ5OworCS8qIFhYWCB3aHkgcGx1cyAxIGhlcmU/ICovCisJ bG9uZ190cmllcyA9IHJjX2luZm8tPnJpX2xvbmdyZXRyeSArIDE7CisKKwluZnJhbWVzID0gcmNf aW5mby0+cmlfdHhjbnQ7CisJbmJhZCA9IHJjX2luZm8tPnJpX2ZhaWxjbnQ7CisKKwlmcmFtZV9z aXplID0gcmNfaW5mby0+cmlfZnJhbWVsZW47CisJbXJyID0gMDsKKworCWlmIChuZnJhbWVzID09 IDApIHsKKwkJcmV0dXJuOworCX0KKworCWlmIChmcmFtZV9zaXplID09IDApCQkgICAgLyogTkI6 IHNob3VsZCBub3QgaGFwcGVuICovCisJCWZyYW1lX3NpemUgPSAxNTAwOworCisJaWYgKHNhbi0+ cmF0ZW1hc2sgPT0gMCkgeworCQlyZXR1cm47CisJfQorCQorCWlmIChJRUVFODAyMTFfUkFURUNU TF9IQVNDQVBfTVJSKG5pKSkKKwkJbXJyID0gMTsKKwkvKiBYWFggY2hlY2sgSFQgcHJvdG1vZGUg dG9vICovCisJaWYgKG1yciAmJiAhSUVFRTgwMjExX1JBVEVDVExfSEFTQ0FQX01SUlBST1Qobmkp KQorCQltcnIgPSAwOworCQorCWlmICghbXJyIHx8IHJjX2luZm8tPnJpX2ZpbmFsdHNpID09IDAp IHsKKwkJaWYgKCFJU19SQVRFX0RFRklORUQoc2FuLCBmaW5hbF9yaXgpKSB7CisJCQlyZXR1cm47 CisJCX0KKwkJLyoKKwkJICogT25seSBvbmUgcmF0ZSB3YXMgdXNlZDsgb3B0aW1pemUgd29yay4K KwkJICovCisJCXVwZGF0ZV9zdGF0cyh2YXAsIG5pLCBmcmFtZV9zaXplLCAKKwkJCSAgICAgZmlu YWxfcml4LCBsb25nX3RyaWVzLAorCQkJICAgICAwLCAwLAorCQkJICAgICAwLCAwLAorCQkJICAg ICAwLCAwLAorCQkJICAgICBzaG9ydF90cmllcywgbG9uZ190cmllcywKKwkJCSAgICAgbmZyYW1l cywgbmJhZCk7CisKKwl9IGVsc2UgeworCQlpbnQgZmluYWxUU0lkeCA9IHJjX2luZm8tPnJpX2Zp bmFsdHNpOworCQlpbnQgaTsKKworCQkvKgorCQkgKiBOQjogc2VyaWVzID4gMCBhcmUgbm90IHBl bmFsaXplZCBmb3IgZmFpbHVyZQorCQkgKiBiYXNlZCBvbiB0aGUgdHJ5IGNvdW50cyB1bmRlciB0 aGUgYXNzdW1wdGlvbgorCQkgKiB0aGF0IGxvc3NlcyBhcmUgb2Z0ZW4gYnVyc3R5IGFuZCBzaW5j ZSB3ZQorCQkgKiBzYW1wbGUgaGlnaGVyIHJhdGVzIDEgdHJ5IGF0IGEgdGltZSBkb2luZyBzbwor CQkgKiBtYXkgdW5mYWlybHkgcGVuYWxpemUgdGhlbS4KKwkJICovCisJCWlmIChyY1swXS50cmll cykgeworCQkJdXBkYXRlX3N0YXRzKHZhcCwgbmksIGZyYW1lX3NpemUsCisJCQkJICAgICByY1sw XS5yaXgsIHJjWzBdLnRyaWVzLAorCQkJCSAgICAgcmNbMV0ucml4LCByY1sxXS50cmllcywKKwkJ CQkgICAgIHJjWzJdLnJpeCwgcmNbMl0udHJpZXMsCisJCQkJICAgICByY1szXS5yaXgsIHJjWzNd LnRyaWVzLAorCQkJCSAgICAgc2hvcnRfdHJpZXMsIGxvbmdfdHJpZXMsCisJCQkJICAgICBuZnJh bWVzLCBuYmFkKTsKKwkJCWxvbmdfdHJpZXMgLT0gcmNbMF0udHJpZXM7CisJCX0KKwkJCisJCWlm IChyY1sxXS50cmllcyAmJiBmaW5hbFRTSWR4ID4gMCkgeworCQkJdXBkYXRlX3N0YXRzKHZhcCwg bmksIGZyYW1lX3NpemUsCisJCQkJICAgICByY1sxXS5yaXgsIHJjWzFdLnRyaWVzLAorCQkJCSAg ICAgcmNbMl0ucml4LCByY1syXS50cmllcywKKwkJCQkgICAgIHJjWzNdLnJpeCwgcmNbM10udHJp ZXMsCisJCQkJICAgICAwLCAwLAorCQkJCSAgICAgc2hvcnRfdHJpZXMsIGxvbmdfdHJpZXMsCisJ CQkJICAgICBuZnJhbWVzLCBuYmFkKTsKKwkJCWxvbmdfdHJpZXMgLT0gcmNbMV0udHJpZXM7CisJ CX0KKworCQlpZiAocmNbMl0udHJpZXMgJiYgZmluYWxUU0lkeCA+IDEpIHsKKwkJCXVwZGF0ZV9z dGF0cyh2YXAsIG5pLCBmcmFtZV9zaXplLAorCQkJCSAgICAgcmNbMl0ucml4LCByY1syXS50cmll cywKKwkJCQkgICAgIHJjWzNdLnJpeCwgcmNbM10udHJpZXMsCisJCQkJICAgICAwLCAwLAorCQkJ CSAgICAgMCwgMCwKKwkJCQkgICAgIHNob3J0X3RyaWVzLCBsb25nX3RyaWVzLAorCQkJCSAgICAg bmZyYW1lcywgbmJhZCk7CisJCQlsb25nX3RyaWVzIC09IHJjWzJdLnRyaWVzOworCQl9CisKKwkJ aWYgKHJjWzNdLnRyaWVzICYmIGZpbmFsVFNJZHggPiAyKSB7CisJCQl1cGRhdGVfc3RhdHModmFw LCBuaSwgZnJhbWVfc2l6ZSwKKwkJCQkgICAgIHJjWzNdLnJpeCwgcmNbM10udHJpZXMsCisJCQkJ ICAgICAwLCAwLAorCQkJCSAgICAgMCwgMCwKKwkJCQkgICAgIDAsIDAsCisJCQkJICAgICBzaG9y dF90cmllcywgbG9uZ190cmllcywKKwkJCQkgICAgIG5mcmFtZXMsIG5iYWQpOworCQl9CisJfQor fQorCitzdGF0aWMgdm9pZAorc2FtcGxlX3R4X3VwZGF0ZShjb25zdCBzdHJ1Y3QgaWVlZTgwMjEx dmFwICp2YXAsIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqbmksCisgICAgdm9pZCAqYXJn MSwgdm9pZCAqYXJnMiwgdm9pZCAqYXJnMykKK3sKKwkvKiBub3RoaW5nIGhlcmUuICovCit9CisK K3N0YXRpYyB2b2lkCitzYW1wbGVfc2V0aW50ZXJ2YWwoY29uc3Qgc3RydWN0IGllZWU4MDIxMXZh cCAqdmFwLCBpbnQgbXNlY3MpCit7CisJc3RydWN0IGllZWU4MDIxMV9zYW1wbGUgKnNhbXBsZSA9 IHZhcC0+aXZfcnM7CisJaW50IHQ7CisKKwlpZiAobXNlY3MgPCAxMDApCisJCW1zZWNzID0gMTAw OworCXQgPSBtc2Vjc190b190aWNrcyhtc2Vjcyk7CisJLyogaWVlZTgwMjExX3NhbXBsZSBkb2Vz bid0IGhhdmUgdGhlIHNhbXBsZV9pbnRlcnZhbCBmaWVsZCBieSBub3cgKi8KKwkvLyBzYW1wbGUt PnNhbXBsZV9pbnRlcnZhbCA9ICh0IDwgMSkgPyAxIDogdDsKK30KKworc3RhdGljIHZvaWQKK3Nh bXBsZV9zdGF0cyh2b2lkICphcmcsIHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqbmkpCit7CisJc3Ry dWN0IGllZWU4MDIxMXZhcCAqdmFwID0gbmktPm5pX3ZhcDsKKwlzdHJ1Y3QgaWVlZTgwMjExX3Nh bXBsZV9ub2RlICpzYW4gPSBuaS0+bmlfcmN0bHM7CisJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9y YXRlX3RhYmxlICpydCA9IGllZWU4MDIxMV9nZXRfcmF0ZXRhYmxlKHZhcC0+aXZfaWMtPmljX2N1 cmNoYW4pOworCXVpbnQ2NF90IG1hc2s7CisJaW50IHJpeCwgeTsKKworCXByaW50ZigiXG5bJXNd IHJlZmNudCAlZCBzdGF0aWNfcml4ICglZCAlcykgcmF0ZW1hc2sgMHglanhcbiIsCisJICAgIGV0 aGVyX3NwcmludGYobmktPm5pX21hY2FkZHIpLCBpZWVlODAyMTFfbm9kZV9yZWZjbnQobmkpLAor CSAgICBkb3QxMXJhdGUocnQsIHNhbi0+c3RhdGljX3JpeCksCisJICAgIGRvdDExcmF0ZV9sYWJl bChydCwgc2FuLT5zdGF0aWNfcml4KSwKKwkgICAgKHVpbnRtYXhfdClzYW4tPnJhdGVtYXNrKTsK Kwlmb3IgKHkgPSAwOyB5IDwgTlVNX1BBQ0tFVF9TSVpFX0JJTlM7IHkrKykgeworCQlwcmludGYo IlslNHVdIGN1ciByaXggJWQgKCVkICVzKSBzaW5jZSBzd2l0Y2g6IHBhY2tldHMgJWQgdGlja3Mg JXVcbiIsCisJCSAgICBiaW5fdG9fc2l6ZSh5KSwgc2FuLT5jdXJyZW50X3JpeFt5XSwKKwkJICAg IGRvdDExcmF0ZShydCwgc2FuLT5jdXJyZW50X3JpeFt5XSksCisJCSAgICBkb3QxMXJhdGVfbGFi ZWwocnQsIHNhbi0+Y3VycmVudF9yaXhbeV0pLAorCQkgICAgc2FuLT5wYWNrZXRzX3NpbmNlX3N3 aXRjaFt5XSwgc2FuLT50aWNrc19zaW5jZV9zd2l0Y2hbeV0pOworCQlwcmludGYoIlslNHVdIGxh c3Qgc2FtcGxlICglZCAlcykgY3VyIHNhbXBsZSAoJWQgJXMpIHBhY2tldHMgc2VudCAlZFxuIiwK KwkJICAgIGJpbl90b19zaXplKHkpLAorCQkgICAgZG90MTFyYXRlKHJ0LCBzYW4tPmxhc3Rfc2Ft cGxlX3JpeFt5XSksCisJCSAgICBkb3QxMXJhdGVfbGFiZWwocnQsIHNhbi0+bGFzdF9zYW1wbGVf cml4W3ldKSwKKwkJICAgIGRvdDExcmF0ZShydCwgc2FuLT5jdXJyZW50X3NhbXBsZV9yaXhbeV0p LAorCQkgICAgZG90MTFyYXRlX2xhYmVsKHJ0LCBzYW4tPmN1cnJlbnRfc2FtcGxlX3JpeFt5XSks CisJCSAgICBzYW4tPnBhY2tldHNfc2VudFt5XSk7CisJCXByaW50ZigiWyU0dV0gcGFja2V0cyBz aW5jZSBzYW1wbGUgJWQgc2FtcGxlIHR0ICV1XG4iLAorCQkgICAgYmluX3RvX3NpemUoeSksIHNh bi0+cGFja2V0c19zaW5jZV9zYW1wbGVbeV0sCisJCSAgICBzYW4tPnNhbXBsZV90dFt5XSk7CisJ fQorCWZvciAobWFzayA9IHNhbi0+cmF0ZW1hc2ssIHJpeCA9IDA7IG1hc2sgIT0gMDsgbWFzayA+ Pj0gMSwgcml4KyspIHsKKwkJaWYgKChtYXNrICYgMSkgPT0gMCkKKwkJCQljb250aW51ZTsKKwkJ Zm9yICh5ID0gMDsgeSA8IE5VTV9QQUNLRVRfU0laRV9CSU5TOyB5KyspIHsKKwkJCWlmIChzYW4t PnN0YXRzW3ldW3JpeF0udG90YWxfcGFja2V0cyA9PSAwKQorCQkJCWNvbnRpbnVlOworCQkJcHJp bnRmKCJbJTJ1ICVzOiU0dV0gJThqdTolLThqdSAoJTNkJSUpIChFV01BICUzZC4lMWQlJSkgVCAl OGp1IEYgJTRkIGF2ZyAlNXUgbGFzdCAldVxuIiwKKwkJCSAgICBkb3QxMXJhdGUocnQsIHJpeCks IGRvdDExcmF0ZV9sYWJlbChydCwgcml4KSwKKwkJCSAgICBiaW5fdG9fc2l6ZSh5KSwKKwkJCSAg ICAodWludG1heF90KSBzYW4tPnN0YXRzW3ldW3JpeF0udG90YWxfcGFja2V0cywKKwkJCSAgICAo dWludG1heF90KSBzYW4tPnN0YXRzW3ldW3JpeF0ucGFja2V0c19hY2tlZCwKKwkJCSAgICAoaW50 KSAoKHNhbi0+c3RhdHNbeV1bcml4XS5wYWNrZXRzX2Fja2VkICogMTAwVUxMKSAvCisJCQkgICAg IHNhbi0+c3RhdHNbeV1bcml4XS50b3RhbF9wYWNrZXRzKSwKKwkJCSAgICBzYW4tPnN0YXRzW3ld W3JpeF0uZXdtYV9wY3QgLyAxMCwKKwkJCSAgICBzYW4tPnN0YXRzW3ldW3JpeF0uZXdtYV9wY3Qg JSAxMCwKKwkJCSAgICAodWludG1heF90KSBzYW4tPnN0YXRzW3ldW3JpeF0udHJpZXMsCisJCQkg ICAgc2FuLT5zdGF0c1t5XVtyaXhdLnN1Y2Nlc3NpdmVfZmFpbHVyZXMsCisJCQkgICAgc2FuLT5z dGF0c1t5XVtyaXhdLmF2ZXJhZ2VfdHhfdGltZSwKKwkJCSAgICB0aWNrcyAtIHNhbi0+c3RhdHNb eV1bcml4XS5sYXN0X3R4KTsKKwkJfQorCX0KK30KKworc3RhdGljIGludAorc2FtcGxlX3N5c2N0 bF9zdGF0cyhTWVNDVExfSEFORExFUl9BUkdTKQoreworCXN0cnVjdCBpZWVlODAyMTF2YXAgKnZh cCA9IGFyZzE7CisJc3RydWN0IGllZWU4MDIxMWNvbSAqaWMgPSB2YXAtPml2X2lmcC0+aWZfbDJj b207CisJaW50IGVycm9yLCB2OworCisJdiA9IDA7CisJZXJyb3IgPSBzeXNjdGxfaGFuZGxlX2lu dChvaWRwLCAmdiwgMCwgcmVxKTsKKwlpZiAoZXJyb3IgfHwgIXJlcS0+bmV3cHRyKQorCQlyZXR1 cm4gZXJyb3I7CisJaWVlZTgwMjExX2l0ZXJhdGVfbm9kZXMoJmljLT5pY19zdGEsIHNhbXBsZV9z dGF0cywgTlVMTCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3NhbXBsZV9zeXNjdGxf c21vb3RoaW5nX3JhdGUoU1lTQ1RMX0hBTkRMRVJfQVJHUykKK3sKKwlzdHJ1Y3QgaWVlZTgwMjEx dmFwICp2YXAgPSBhcmcxOworCXN0cnVjdCBpZWVlODAyMTFfc2FtcGxlICpzYW1wbGUgPSB2YXAt Pml2X3JzOworCWludCByYXRlLCBlcnJvcjsKKworCXJhdGUgPSBzYW1wbGUtPnNhbXBsZV9zbW9v dGhpbmdfcmF0ZTsKKwllcnJvciA9IHN5c2N0bF9oYW5kbGVfaW50KG9pZHAsICZyYXRlLCAwLCBy ZXEpOworCWlmIChlcnJvciB8fCAhcmVxLT5uZXdwdHIpCisJCXJldHVybiBlcnJvcjsKKwlpZiAo ISgwIDw9IHJhdGUgJiYgcmF0ZSA8IDEwMCkpCisJCXJldHVybiBFSU5WQUw7CisJc2FtcGxlLT5z YW1wbGVfc21vb3RoaW5nX3JhdGUgPSByYXRlOworCXNhbXBsZS0+c2FtcGxlX3Ntb290aGluZ19t aW5wYWNrZXRzID0gMTAwIC8gKDEwMCAtIHJhdGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMg aW50CitzYW1wbGVfc3lzY3RsX3NhbXBsZV9yYXRlKFNZU0NUTF9IQU5ETEVSX0FSR1MpCit7CisJ c3RydWN0IGllZWU4MDIxMXZhcCAqdmFwID0gYXJnMTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3NhbXBs ZSAqc2FtcGxlID0gdmFwLT5pdl9yczsKKwlpbnQgcmF0ZSwgZXJyb3I7CisKKwlyYXRlID0gc2Ft cGxlLT5zYW1wbGVfcmF0ZTsKKwllcnJvciA9IHN5c2N0bF9oYW5kbGVfaW50KG9pZHAsICZyYXRl LCAwLCByZXEpOworCWlmIChlcnJvciB8fCAhcmVxLT5uZXdwdHIpCisJCXJldHVybiBlcnJvcjsK KwlpZiAoISgyIDw9IHJhdGUgJiYgcmF0ZSA8PSAxMDApKQorCQlyZXR1cm4gRUlOVkFMOworCXNh bXBsZS0+c2FtcGxlX3JhdGUgPSByYXRlOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAor c2FtcGxlX3N5c2N0bGF0dGFjaChzdHJ1Y3QgaWVlZTgwMjExdmFwICp2YXAsCisgICAgc3RydWN0 IHN5c2N0bF9jdHhfbGlzdCAqY3R4LCBzdHJ1Y3Qgc3lzY3RsX29pZCAqdHJlZSkKK3sKKwlTWVND VExfQUREX1BST0MoY3R4LCBTWVNDVExfQ0hJTERSRU4odHJlZSksIE9JRF9BVVRPLAorCSAgICAi c2FtcGxlX3Ntb290aGluZ19yYXRlIiwgQ1RMVFlQRV9JTlQgfCBDVExGTEFHX1JXLCB2YXAsIDAs CisJICAgIHNhbXBsZV9zeXNjdGxfc21vb3RoaW5nX3JhdGUsICJJIiwKKwkgICAgInNhbXBsZTog c21vb3RoaW5nIHJhdGUgZm9yIGF2ZyB0eCB0aW1lICglJSkiKTsKKwlTWVNDVExfQUREX1BST0Mo Y3R4LCBTWVNDVExfQ0hJTERSRU4odHJlZSksIE9JRF9BVVRPLAorCSAgICAic2FtcGxlX3JhdGUi LCBDVExUWVBFX0lOVCB8IENUTEZMQUdfUlcsIHZhcCwgMCwKKwkgICAgc2FtcGxlX3N5c2N0bF9z YW1wbGVfcmF0ZSwgIkkiLAorCSAgICAic2FtcGxlOiBwZXJjZW50IGFpciB0aW1lIGRldm90ZWQg dG8gc2FtcGxpbmcgbmV3IHJhdGVzICglJSkiKTsKKwkvKiBYWFggbWF4X3N1Y2Nlc3NpdmVfZmFp bHVyZXMsIHN0YWxlX2ZhaWx1cmVfdGltZW91dCwgbWluX3N3aXRjaCAqLworCVNZU0NUTF9BRERf UFJPQyhjdHgsIFNZU0NUTF9DSElMRFJFTih0cmVlKSwgT0lEX0FVVE8sCisJICAgICJzYW1wbGVf c3RhdHMiLCBDVExUWVBFX0lOVCB8IENUTEZMQUdfUlcsIHZhcCwgMCwKKwkgICAgc2FtcGxlX3N5 c2N0bF9zdGF0cywgIkkiLCAic2FtcGxlOiBwcmludCBzdGF0aXN0aWNzIik7Cit9CkluZGV4OiBu ZXQ4MDIxMS9pZWVlODAyMTFfcmNfc2FtcGxlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gbmV0ODAyMTEvaWVl ZTgwMjExX3JjX3NhbXBsZS5oCShyZXZpc2lvbiAwKQorKysgbmV0ODAyMTEvaWVlZTgwMjExX3Jj X3NhbXBsZS5oCShyZXZpc2lvbiAyNTU5NzApCkBAIC0wLDAgKzEsMjg3IEBACisvKiAkRnJlZUJT RDogaGVhZC9zeXMvZGV2L2F0aC9hdGhfcmF0ZS9zYW1wbGUvc2FtcGxlLmggMjQwMzgyIDIwMTIt MDgtMTUgMDc6MTA6MTBaIGFkcmlhbiAkKi8KKworLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUg Sm9obiBCaWNrZXQKKyAqIENvcHlyaWdodCAoYykgMjAxMyBDaGVuY2hvbmcgUWluIDxjY3FpbkBG cmVlQlNELm9yZz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAg d2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv cm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHNpbWlsYXIg dG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdyAoIkRpc2NsYWltZXIiKSBhbmQg YW55CisgKiAgICByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24gaW5jbHVk aW5nIGEgc3Vic3RhbnRpYWxseQorICogICAgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50 IGZvciBmdXJ0aGVyIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5h bWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcwor ICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21v dGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3Bl Y2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRo aXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAq IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hl ZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5U WQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMg QU5EIENPTlRSSUJVVE9SUworICogYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVE IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJ RUQgV0FSUkFOVElFUyBPRiBOT05JTkZSSU5HRU1FTlQsIE1FUkNIQU5USUJJTElUWQorICogQU5E IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBF VkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBM SUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwKKyAqIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJT VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsg T1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU SEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ TElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJ U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg QURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqLworCisj aWZuZGVmIF9ORVQ4MDIxMV9JRUVFODAyMTFfUkFURUNUTF9TQU1QTEVfSF8KKyNkZWZpbmUgX05F VDgwMjExX0lFRUU4MDIxMV9SQVRFQ1RMX1NBTVBMRV9IXworCisjaW5jbHVkZSA8bmV0ODAyMTEv aWVlZTgwMjExX3JhdGVjdGwuaD4KKworLyoKKyAqIGZvciBub3csIHdlIHRyYWNrIHBlcmZvcm1h bmNlIGZvciB0aHJlZSBkaWZmZXJlbnQgcGFja2V0CisgKiBzaXplIGJ1Y2tldHMKKyAqLworI2Rl ZmluZSBOVU1fUEFDS0VUX1NJWkVfQklOUyAyCisjZGVmaW5lCVNBTVBMRV9NQVhSQVRFUwk2NAkJ LyogTkI6IGNvcnJlc3BvbmRzIHRvIGhhbCBpbmZvWzMyXSAqLworCisvKgorICogUmF0ZSBjb250 cm9sIHNldHRpbmdzLgorICovCitzdHJ1Y3QgaWVlZTgwMjExX3NhbXBsZSB7CisJaW50CXNhbXBs ZV9zbW9vdGhpbmdfcmF0ZTsJCQkvKiBld21hIHBlcmNlbnRhZ2UgWzAuLjk5XSAqLworCWludAlz YW1wbGVfc21vb3RoaW5nX21pbnBhY2tldHM7CisJaW50CXNhbXBsZV9yYXRlOwkJCS8qICV0aW1l IHRvIHRyeSBkaWZmZXJlbnQgdHggcmF0ZXMgKi8KKwlpbnQJc2FtcGxlX21heF9zdWNjZXNzaXZl X2ZhaWx1cmVzOworCWludAlzYW1wbGVfc3RhbGVfZmFpbHVyZV90aW1lb3V0OwkvKiBob3cgbG9u ZyB0byBob25vciBtYXhfc3VjY2Vzc2l2ZV9mYWlsdXJlcyAqLworCWludAlzYW1wbGVfbWluX3N3 aXRjaDsJCS8qIG1pbiB0aW1lIGJldHdlZW4gcmF0ZSBjaGFuZ2VzICovCisJaW50CXNhbXBsZV9t aW5fZ29vZF9wY3Q7CS8qIG1pbiBnb29kIHBlcmNlbnRhZ2UgZm9yIGEgcmF0ZSB0byBiZSBjb25z aWRlcmVkICovCit9OworCitzdHJ1Y3QgcmF0ZV9zdGF0cyB7CQorCXVuc2lnbmVkIGF2ZXJhZ2Vf dHhfdGltZTsKKwlpbnQgc3VjY2Vzc2l2ZV9mYWlsdXJlczsKKwl1aW50NjRfdCB0cmllczsKKwl1 aW50NjRfdCB0b3RhbF9wYWNrZXRzOwkvKiBwa3RzIHRvdGFsIHNpbmNlIGFzc29jICovCisJdWlu dDY0X3QgcGFja2V0c19hY2tlZDsJLyogcGt0cyBhY2tlZCBzaW5jZSBhc3NvYyAqLworCWludCBl d21hX3BjdDsJLyogRVdNQSBwZXJjZW50YWdlICovCisJdW5zaWduZWQgcGVyZmVjdF90eF90aW1l OyAvKiB0cmFuc21pdCB0aW1lIGZvciAwIHJldHJpZXMgKi8KKwlpbnQgbGFzdF90eDsKK307CisK K3N0cnVjdCB0eHNjaGVkdWxlIHsKKwl1aW50OF90CXQwLCByMDsJCS8qIHNlcmllcyAwOiB0cmll cywgcmF0ZSBjb2RlICovCisJdWludDhfdAl0MSwgcjE7CQkvKiBzZXJpZXMgMTogdHJpZXMsIHJh dGUgY29kZSAqLworCXVpbnQ4X3QJdDIsIHIyOwkJLyogc2VyaWVzIDI6IHRyaWVzLCByYXRlIGNv ZGUgKi8KKwl1aW50OF90CXQzLCByMzsJCS8qIHNlcmllcyAzOiB0cmllcywgcmF0ZSBjb2RlICov Cit9OworCisvKgorICogUmF0ZSBjb250cm9sIHN0YXRlIGZvciBhIGdpdmVuIG5vZGUuCisgKi8K Ky8qIFhYWCBjaGFuZ2UgbmFtaW5nIGNvbnZlcnNpb24/ICovCitzdHJ1Y3QgaWVlZTgwMjExX3Nh bXBsZV9ub2RlIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX3JhdGVjdGxfbm9kZSBzYW5fbm9kZTsJLyog Y29tbW9uIHN0YXRlICovCisJc3RydWN0IGllZWU4MDIxMV9zYW1wbGUgKnNhbl9zYW1wbGU7Lyog YmFja3BvaW50ZXIgKi8KKwlpbnQgc3RhdGljX3JpeDsJCQkvKiByYXRlIGluZGV4IG9mIGZpeGVk IHR4IHJhdGUgKi8KKwl1aW50NjRfdCByYXRlbWFzazsJCS8qIGJpdCBtYXNrIG9mIHZhbGlkIHJh dGUgaW5kaWNlcyAqLworCWNvbnN0IHN0cnVjdCB0eHNjaGVkdWxlICpzY2hlZDsJLyogdHggc2No ZWR1bGUgdGFibGUgKi8KKworCXN0cnVjdCByYXRlX3N0YXRzIHN0YXRzW05VTV9QQUNLRVRfU0la RV9CSU5TXVtTQU1QTEVfTUFYUkFURVNdOworCWludCBsYXN0X3NhbXBsZV9yaXhbTlVNX1BBQ0tF VF9TSVpFX0JJTlNdOworCisJaW50IGN1cnJlbnRfc2FtcGxlX3JpeFtOVU1fUEFDS0VUX1NJWkVf QklOU107ICAgICAgIAorCWludCBwYWNrZXRzX3NlbnRbTlVNX1BBQ0tFVF9TSVpFX0JJTlNdOwor CisJaW50IGN1cnJlbnRfcml4W05VTV9QQUNLRVRfU0laRV9CSU5TXTsKKwlpbnQgcGFja2V0c19z aW5jZV9zd2l0Y2hbTlVNX1BBQ0tFVF9TSVpFX0JJTlNdOworCXVuc2lnbmVkIHRpY2tzX3NpbmNl X3N3aXRjaFtOVU1fUEFDS0VUX1NJWkVfQklOU107CisKKwlpbnQgcGFja2V0c19zaW5jZV9zYW1w bGVbTlVNX1BBQ0tFVF9TSVpFX0JJTlNdOworCXVuc2lnbmVkIHNhbXBsZV90dFtOVU1fUEFDS0VU X1NJWkVfQklOU107Cit9OworCisjZGVmaW5lCUlTX1JBVEVfREVGSU5FRChzYW4sIHJpeCkJKCgo c2FuKS0+cmF0ZW1hc2sgJiAoMTw8KHJpeCkpKSAhPSAwKQorCisjaWZuZGVmIE1JTgorI2RlZmlu ZQlNSU4oYSxiKQkoKGEpIDwgKGIpID8gKGEpIDogKGIpKQorI2VuZGlmCisjaWZuZGVmIE1BWAor I2RlZmluZQlNQVgoYSxiKQkoKGEpID4gKGIpID8gKGEpIDogKGIpKQorI2VuZGlmCisKK3N0YXRp YyBjb25zdCBpbnQgcGFja2V0X3NpemVfYmluc1tOVU1fUEFDS0VUX1NJWkVfQklOU10gID0geyAy NTAsIDE2MDAgfTsKKworc3RhdGljIGlubGluZSBpbnQKK2Jpbl90b19zaXplKGludCBpbmRleCkK K3sKKwlyZXR1cm4gcGFja2V0X3NpemVfYmluc1tpbmRleF07Cit9CisKK3N0YXRpYyBpbmxpbmUg aW50CitzaXplX3RvX2JpbihpbnQgc2l6ZSkgCit7CisjaWYgTlVNX1BBQ0tFVF9TSVpFX0JJTlMg PiAxCisJaWYgKHNpemUgPD0gcGFja2V0X3NpemVfYmluc1swXSkKKwkJcmV0dXJuIDA7CisjZW5k aWYKKyNpZiBOVU1fUEFDS0VUX1NJWkVfQklOUyA+IDIKKwlpZiAoc2l6ZSA8PSBwYWNrZXRfc2l6 ZV9iaW5zWzFdKQorCQlyZXR1cm4gMTsKKyNlbmRpZgorI2lmIE5VTV9QQUNLRVRfU0laRV9CSU5T ID4gMworCWlmIChzaXplIDw9IHBhY2tldF9zaXplX2JpbnNbMl0pCisJCXJldHVybiAyOworI2Vu ZGlmCisjaWYgTlVNX1BBQ0tFVF9TSVpFX0JJTlMgPiA0CisjZXJyb3IgImFkZCBzdXBwb3J0IGZv ciBtb3JlIHBhY2tldCBzaXplcyIKKyNlbmRpZgorCXJldHVybiBOVU1fUEFDS0VUX1NJWkVfQklO Uy0xOworfQorCitzdGF0aWMgdWludDMyX3Qgc2FtcGxlX3BrdF90eHRpbWUoY29uc3Qgc3RydWN0 IGllZWU4MDIxMV9yYXRlX3RhYmxlICpydCwKKwl1aW50MzJfdCBmcmFtZUxlbiwgdWludDE2X3Qg cmF0ZWl4LCBpbnQgaXNodDQwLCBpbnQgaXNTaG9ydFByZWFtYmxlKQoreworCXVpbnQ4X3QgcmM7 CisgICAgaW50IG51bVN0cmVhbXM7CisKKyAgICByYyA9IHJ0LT5pbmZvW3JhdGVpeF0ucmF0ZUNv ZGU7CisKKyAgICAvKiBMZWdhY3kgcmF0ZT8gUmV0dXJuIHRoZSBvbGQgd2F5ICovCisgICAgaWYg KCEgSVNfSFRfUkFURShyYykpCisgICAgCXJldHVybiBpZWVlODAyMTFfY29tcHV0ZV9kdXJhdGlv bihydCwgZnJhbWVMZW4sIHJhdGVpeCwgaXNTaG9ydFByZWFtYmxlKTsKKworICAgIC8qIDExbiBm cmFtZSAtIGV4dHJhY3Qgb3V0IHRoZSBudW1iZXIgb2Ygc3BhdGlhbCBzdHJlYW1zICovCisgICAg bnVtU3RyZWFtcyA9IEhUX1JDXzJfU1RSRUFNUyhyYyk7CisgICAgS0FTU0VSVChudW1TdHJlYW1z ID4gMCAmJiBudW1TdHJlYW1zIDw9IDQsCisgICAgICAgICgibnVtYmVyIG9mIHNwYXRpYWwgc3Ry ZWFtcyBuZWVkcyB0byBiZSAxLi4zOiBNQ1MgcmF0ZSAweCV4ISIsCisgICAgICAgIHJhdGVpeCkp OworCisgICAgcmV0dXJuIGllZWU4MDIxMV9jb21wdXRlX2R1cmF0aW9uX2h0KGZyYW1lTGVuLCBy YywgbnVtU3RyZWFtcywgaXNodDQwLCBpc1Nob3J0UHJlYW1ibGUpOworfQorCisjZGVmaW5lIFdJ RklfQ1dfTUlOIDMxCisjZGVmaW5lIFdJRklfQ1dfTUFYIDEwMjMKKworLyoKKyAqIENhbGN1bGF0 ZSB0aGUgdHJhbnNtaXQgZHVyYXRpb24gb2YgYSBmcmFtZS4KKyAqLworc3RhdGljIHVuc2lnbmVk IGNhbGNfdXNlY3NfdW5pY2FzdF9wYWNrZXQoY29uc3Qgc3RydWN0IGllZWU4MDIxMXZhcCAqdmFw LAorCQkJCWludCBsZW5ndGgsCisJCQkJaW50IHJpeCwgaW50IHNob3J0X3JldHJpZXMsCisJCQkJ aW50IGxvbmdfcmV0cmllcywgaW50IGlzX2h0NDApCit7CisJY29uc3Qgc3RydWN0IGllZWU4MDIx MV9yYXRlX3RhYmxlICpydCA9IGllZWU4MDIxMV9nZXRfcmF0ZXRhYmxlKHZhcC0+aXZfaWMtPmlj X2N1cmNoYW4pOworCXN0cnVjdCBpZWVlODAyMTFjb20gKmljID0gdmFwLT5pdl9pYzsKKwlpbnQg Y3VybW9kZSA9IGllZWU4MDIxMV9jaGFuMm1vZGUodmFwLT5pdl9pYy0+aWNfY3VyY2hhbik7CisJ CisJdW5zaWduZWQgdF9zbG90LCB0X2RpZnMsIHRfc2lmczsgCisJaW50IHJ0cywgY3RzOworCWlu dCB0dCwgeCwgY3csIGNpeDsKKworCWludCB0dCA9IDA7CisJaW50IHggPSAwOworCWludCBjdyA9 IFdJRklfQ1dfTUlOOworCisJS0FTU0VSVChydCAhPSBOVUxMLCAoIm5vIHJhdGUgdGFibGUsIG1v ZGUgJXUiLCBjdXJtb2RlKSk7CisKKwlpZiAocml4ID49IHJ0LT5yYXRlQ291bnQpIHsKKwkJcHJp bnRmKCJib2d1cyByaXggJWQsIG1heCAldSwgbW9kZSAldVxuIiwKKwkJICAgICAgIHJpeCwgcnQt PnJhdGVDb3VudCwgY3VybW9kZSk7CisJCXJldHVybiAwOworCX0KKwljaXggPSBydC0+aW5mb1ty aXhdLmNvbnRyb2xSYXRlOworCS8qIAorCSAqIFhYWCBnZXR0aW5nIG1hYy9waHkgbGV2ZWwgdGlt aW5ncyBzaG91bGQgYmUgZml4ZWQgZm9yIHR1cmJvCisJICogcmF0ZXMsIGFuZCB0aGVyZSBpcyBw cm9iYWJseSBhIHdheSB0byBnZXQgdGhpcyBmcm9tIHRoZQorCSAqIGhhbC4uLgorCSAqLworCXN3 aXRjaCAocnQtPmluZm9bcml4XS5waHkpIHsKKwljYXNlIElFRUU4MDIxMV9UX09GRE06CisJCXRf c2xvdCA9IDk7CisJCXRfc2lmcyA9IDE2OworCQl0X2RpZnMgPSAyODsKKwkJLyogZmFsbCB0aHJv dWdoICovCisJY2FzZSBJRUVFODAyMTFfVF9UVVJCTzoKKwkJdF9zbG90ID0gOTsKKwkJdF9zaWZz ID0gODsKKwkJdF9kaWZzID0gMjg7CisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX1RfSFQ6CisJ CXRfc2xvdCA9IDk7CisJCXRfc2lmcyA9IDg7CisJCXRfZGlmcyA9IDI4OworCQlicmVhazsKKwlj YXNlIElFRUU4MDIxMV9UX0RTOgorCQkvKiBmYWxsIHRocm91Z2ggdG8gZGVmYXVsdCAqLworCWRl ZmF1bHQ6CisJCS8qIHBnIDIwNSBpZWVlLjgwMi4xMS5wZGYgKi8KKwkJdF9zbG90ID0gMjA7CisJ CXRfZGlmcyA9IDUwOworCQl0X3NpZnMgPSAxMDsKKwl9CisKKwlydHMgPSBjdHMgPSAwOworCisJ aWYgKChpYy0+aWNfZmxhZ3MgJiBJRUVFODAyMTFfRl9VU0VQUk9UKSAmJgorCSAgICBydC0+aW5m b1tyaXhdLnBoeSA9PSBJRUVFODAyMTFfVF9PRkRNKSB7CisJCWlmIChpYy0+aWNfcHJvdG1vZGUg PT0gSUVFRTgwMjExX1BST1RfUlRTQ1RTKQorCQkJcnRzID0gMTsKKwkJZWxzZSBpZiAoaWMtPmlj X3Byb3Rtb2RlID09IElFRUU4MDIxMV9QUk9UX0NUU09OTFkpCisJCQljdHMgPSAxOworCisJCWlu dCBwcm90cml4OworICAgIAlpZiAoY3VybW9kZSA9PSBJRUVFODAyMTFfTU9ERV8xMUcpCisgICAg CSAgICBwcm90cml4ID0gcnQtPnJhdGVDb2RlVG9JbmRleFsyKjJdOworICAgIAllbHNlIAorICAg IAkgICAgcHJvdHJpeCA9IHJ0LT5yYXRlQ29kZVRvSW5kZXhbMioxXTsKKyAgICAJaWYgKDB4ZmYg PT0gcHJvdHJpeCkKKyAgICAJCXByb3RyaXggPSAwOworCisJCWNpeCA9IHJ0LT5pbmZvW3Byb3Ry aXhdLmNvbnRyb2xSYXRlOworCX0KKworCWlmICgwIC8qbGVuZ3RoID4gaWMtPmljX3J0c3RocmVz aG9sZCAqLykgeworCQlydHMgPSAxOworCX0KKworCWlmIChydHMgfHwgY3RzKSB7CisJCWludCBj dHNyYXRlOworCQlpbnQgY3RzZHVyYXRpb24gPSAwOworCisJCS8qIE5COiB0aGlzIGlzIGludGVu dGlvbmFsbHkgbm90IGEgcnVudGltZSBjaGVjayAqLworCQlLQVNTRVJUKGNpeCA8IHJ0LT5yYXRl Q291bnQsCisJCSAgICAoImJvZ3VzIGNpeCAlZCwgbWF4ICV1LCBtb2RlICV1XG4iLCBjaXgsIHJ0 LT5yYXRlQ291bnQsCisJCSAgICAgY3VybW9kZSkpOworCisJCWN0c3JhdGUgPSBydC0+aW5mb1tj aXhdLnJhdGVDb2RlIHwgcnQtPmluZm9bY2l4XS5zaG9ydFByZWFtYmxlOworCQlpZiAocnRzKQkJ LyogU0lGUyArIENUUyAqLworCQkJY3RzZHVyYXRpb24gKz0gcnQtPmluZm9bY2l4XS5zcEFja0R1 cmF0aW9uOworCisJCS8qIFhYWCBhc3N1bWVzIHNob3J0IHByZWFtYmxlICovCisJCWN0c2R1cmF0 aW9uICs9IHNhbXBsZV9wa3RfdHh0aW1lKHJ0LCBsZW5ndGgsIHJpeCwgaXNfaHQ0MCwgMCk7CisK KwkJaWYgKGN0cykJLyogU0lGUyArIEFDSyAqLworCQkJY3RzZHVyYXRpb24gKz0gcnQtPmluZm9b Y2l4XS5zcEFja0R1cmF0aW9uOworCisJCXR0ICs9IChzaG9ydF9yZXRyaWVzICsgMSkgKiBjdHNk dXJhdGlvbjsKKwl9CisJdHQgKz0gdF9kaWZzOworCisJLyogWFhYIGFzc3VtZXMgc2hvcnQgcHJl YW1ibGUgKi8KKwl0dCArPSAobG9uZ19yZXRyaWVzKzEpKnNhbXBsZV9wa3RfdHh0aW1lKHJ0LCBs ZW5ndGgsIHJpeCwgaXNfaHQ0MCwgMCk7CisKKwl0dCArPSAobG9uZ19yZXRyaWVzKzEpKih0X3Np ZnMgKyBydC0+aW5mb1tyaXhdLnNwQWNrRHVyYXRpb24pOworCisJZm9yICh4ID0gMDsgeCA8PSBz aG9ydF9yZXRyaWVzICsgbG9uZ19yZXRyaWVzOyB4KyspIHsKKwkJY3cgPSBNSU4oV0lGSV9DV19N QVgsIChjdyArIDEpICogMik7CisJCXR0ICs9ICh0X3Nsb3QgKiBjdy8yKTsKKwl9CisJcmV0dXJu IHR0OworfQorCisjZW5kaWYgLyogX05FVDgwMjExX0lFRUU4MDIxMV9SQVRFQ1RMX1NBTVBMRV9I XyAqLwpJbmRleDogbmV0ODAyMTEvaWVlZTgwMjExX3JjX3NhbXBsZV90eHNjaGVkLmgKPT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PQotLS0gbmV0ODAyMTEvaWVlZTgwMjExX3JjX3NhbXBsZV90eHNjaGVkLmgJKHJldmlzaW9u IDApCisrKyBuZXQ4MDIxMS9pZWVlODAyMTFfcmNfc2FtcGxlX3R4c2NoZWQuaAkocmV2aXNpb24g MjU1OTcwKQpAQCAtMCwwICsxLDI0MSBAQAorLyogJEZyZWVCU0Q6IGhlYWQvc3lzL2Rldi9hdGgv YXRoX3JhdGUvc2FtcGxlL3R4X3NjaGVkdWxlcy5oIDI0MDM4NCAyMDEyLTA4LTE1IDA3OjUwOjQy WiBhZHJpYW4gJCovCisKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA1IEpvaG4gQmlja2V0Cisg KiBDb3B5cmlnaHQgKGMpIDIwMTMgQ2hlbmNob25nIFFpbiA8Y2NxaW5ARnJlZUJTRC5vcmc+Cisg KiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0 YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZp Y2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k dWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzaW1pbGFyIHRvIHRoZSAiTk8gV0FS UkFOVFkiIGRpc2NsYWltZXIgYmVsb3cgKCJEaXNjbGFpbWVyIikgYW5kIGFueQorICogICAgcmVk aXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uIGluY2x1ZGluZyBhIHN1YnN0YW50 aWFsbHkKKyAqICAgIHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlciBi aW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJv dmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBj b250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRl cml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdy aXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1h eSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQ dWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUK KyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09G VFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRP UlMKKyAqIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ TkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMg T0YgTk9OSU5GUklOR0VNRU5ULCBNRVJDSEFOVElCSUxJVFkKKyAqIEFORCBGSVRORVNTIEZPUiBB IFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAq IFRIRSBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVD SUFMLCBFWEVNUExBUlksCisgKiBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg QlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBP UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisg KiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJ TElUWSwgV0hFVEhFUgorICogSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQg KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdB WSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAq IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKgorICovCisjaWZuZGVmCV9fQVRI X1JBVEVfU0FNUExFX1RYU0NIRURVTEVTX0hfXworI2RlZmluZQlfX0FUSF9SQVRFX1NBTVBMRV9U WFNDSEVEVUxFU19IX18KKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorCisjZGVmaW5lIEEoX3Ip IFwKKyAgICAoKChfcikgPT0gNikgICA/IDAgOiAoKChfcikgPT0gOSkgICA/IDEgOiAoKChfcikg PT0gMTIpICA/IDIgOiBcCisgICAgKCgoX3IpID09IDE4KSAgPyAzIDogKCgoX3IpID09IDI0KSAg PyA0IDogKCgoX3IpID09IDM2KSAgPyA1IDogXAorICAgICgoKF9yKSA9PSA0OCkgID8gNiA6ICgo KF9yKSA9PSA1NCkgID8gNyA6IDApKSkpKSkpKQorc3RhdGljIGNvbnN0IHN0cnVjdCB0eHNjaGVk dWxlIHNlcmllc18xMWFbXSA9IHsKKwl7IDMsQSggNiksIDMsQSggIDYpLCAwLEEoICA2KSwgMCxB KCA2KSB9LAkvKiAgIDZNYi9zICovCisJeyA0LEEoIDkpLCAzLEEoICA2KSwgNCxBKCAgNiksIDAs QSggNikgfSwJLyogICA5TWIvcyAqLworCXsgNCxBKDEyKSwgMyxBKCAgNiksIDQsQSggIDYpLCAw LEEoIDYpIH0sCS8qICAxMk1iL3MgKi8KKwl7IDQsQSgxOCksIDMsQSggMTIpLCA0LEEoICA2KSwg MixBKCA2KSB9LAkvKiAgMThNYi9zICovCisJeyA0LEEoMjQpLCAzLEEoIDE4KSwgNCxBKCAxMiks IDIsQSggNikgfSwJLyogIDI0TWIvcyAqLworCXsgNCxBKDM2KSwgMyxBKCAyNCksIDQsQSggMTgp LCAyLEEoIDYpIH0sCS8qICAzNk1iL3MgKi8KKwl7IDQsQSg0OCksIDMsQSggMzYpLCA0LEEoIDI0 KSwgMixBKDEyKSB9LAkvKiAgNDhNYi9zICovCisJeyA0LEEoNTQpLCAzLEEoIDQ4KSwgNCxBKCAz NiksIDIsQSgyNCkgfQkvKiAgNTRNYi9zICovCit9OworCisjZGVmaW5lIE5BMShfcikgXAorCSgo KF9yKSA9PSA2LjUpICA/IDggOiAoKChfcikgPT0gMTMpICA/ICA5IDogKCgoX3IpID09IDE5LjUp PyAxMCA6IFwKKwkoKChfcikgPT0gMjYpICA/IDExIDogKCgoX3IpID09IDM5KSAgPyAxMiA6ICgo KF9yKSA9PSA1MikgID8gMTMgOiBcCisJKCgoX3IpID09IDU4LjUpPyAxNCA6ICgoKF9yKSA9PSA2 NSkgID8gMTUgOiAwKSkpKSkpKSkKKyNkZWZpbmUgTkEyKF9yKSBcCisJKCgoX3IpID09IDEzKSA/ IDE2IDogKCgoX3IpID09IDI2KSA/IDE3IDogKCgoX3IpID09IDM5KSA/IDE4IDogXAorCSgoKF9y KSA9PSA1MikgPyAxOSA6ICgoKF9yKSA9PSA3OCkgPyAyMCA6ICgoKF9yKSA9PSAxMDQpPyAyMSA6 IFwKKwkoKChfcikgPT0gMTE3KT8gMjIgOiAoKChfcikgPT0gMTMwKT8gMjMgOiAwKSkpKSkpKSkK KyNkZWZpbmUgTkEzKF9yKSBcCisJKCgoX3IpID09IDE5LjUpICA/IDI0IDogKCgoX3IpID09IDM5 KSA/IDI1IDogKCgoX3IpID09IDU4LjUpICA/IDI2IDogXAorCSgoKF9yKSA9PSA3OCkgID8gMjcg OiAoKChfcikgPT0gMTE3KSA/IDI4IDogKCgoX3IpID09IDE1NikgPyAyOSA6IFwKKwkoKChfcikg PT0gMTc1LjUpID8gMzAgOiAoKChfcikgPT0gMTk1KT8gMzEgOiAwKSkpKSkpKSkKK3N0YXRpYyBj b25zdCBzdHJ1Y3QgdHhzY2hlZHVsZSBzZXJpZXNfMTFuYVtdID0geworCXsgMyxBKCA2KSwgMyxB KCAgNiksIDAsQSggIDYpLCAwLEEoIDYpIH0sICAgICAgIC8qICAgNk1iL3MgKi8KKwl7IDQsQSgg OSksIDMsQSggIDYpLCA0LEEoICA2KSwgMCxBKCA2KSB9LCAgICAgICAvKiAgIDlNYi9zICovCisJ eyA0LEEoMTIpLCAzLEEoICA2KSwgNCxBKCAgNiksIDAsQSggNikgfSwgICAgICAgLyogIDEyTWIv cyAqLworCXsgNCxBKDE4KSwgMyxBKCAxMiksIDQsQSggIDYpLCAyLEEoIDYpIH0sICAgICAgIC8q ICAxOE1iL3MgKi8KKwl7IDQsQSgyNCksIDMsQSggMTgpLCA0LEEoIDEyKSwgMixBKCA2KSB9LCAg ICAgICAvKiAgMjRNYi9zICovCisJeyA0LEEoMzYpLCAzLEEoIDI0KSwgNCxBKCAxOCksIDIsQSgg NikgfSwgICAgICAgLyogIDM2TWIvcyAqLworCXsgNCxBKDQ4KSwgMyxBKCAzNiksIDQsQSggMjQp LCAyLEEoMTIpIH0sICAgICAgIC8qICA0OE1iL3MgKi8KKwl7IDQsQSg1NCksIDMsQSggNDgpLCA0 LEEoIDM2KSwgMixBKDI0KSB9LCAgICAgICAvKiAgNTRNYi9zICovCisKKwkvKiAxIHN0cmVhbSBy YXRlcyAqLworCisJeyAzLE5BMSggNi41KSwgMyxOQTEoIDYuNSksIDAsTkExKCA2LjUpLCAwLE5B MSg2LjUpIH0sICAvKiA2LjVNYi9zICovCisJeyA0LE5BMSggIDEzKSwgMyxOQTEoIDYuNSksIDQs TkExKCA2LjUpLCAwLE5BMSg2LjUpIH0sICAvKiAgMTNNYi9zICovCisJeyA0LE5BMSgxOS41KSwg MyxOQTEoIDYuNSksIDQsTkExKCA2LjUpLCAwLE5BMSg2LjUpIH0sICAvKjE5LjVNYi9zICovCisJ eyA0LE5BMSggIDI2KSwgMyxOQTEoMTkuNSksIDQsTkExKCA2LjUpLCAyLE5BMSg2LjUpIH0sICAv KiAgMjZNYi9zICovCisJeyA0LE5BMSggIDM5KSwgMyxOQTEoICAyNiksIDQsTkExKDE5LjUpLCAy LE5BMSg2LjUpIH0sICAvKiAgMzlNYi9zICovCisJeyA0LE5BMSggIDUyKSwgMyxOQTEoICAzOSks IDQsTkExKCAgMjYpLCAyLE5BMSg2LjUpIH0sICAvKiAgNTJNYi9zICovCisJeyA0LE5BMSg1OC41 KSwgMyxOQTEoICA1MiksIDQsTkExKCAgMzkpLCAyLE5BMSggMTMpIH0sICAvKjU4LjVNYi9zICov CisJeyA0LE5BMSggIDY1KSwgMyxOQTEoNTguNSksIDQsTkExKCAgNTIpLCAyLE5BMSggMTMpIH0s ICAvKiAgNjVNYi9zICovCisKKwkvKiAyIHN0cmVhbSByYXRlcyAqLworCisJeyAzLE5BMiggIDEz KSwgMyxOQTIoICAxMyksIDAsTkEyKCAgMTMpLCAwLE5BMiggMTMpIH0sICAvKiAgMTNNYi9zICov CisJeyA0LE5BMiggIDI2KSwgMyxOQTIoICAxMyksIDQsTkEyKCAgMTMpLCAwLE5BMiggMTMpIH0s ICAvKiAgMjZNYi9zICovCisJeyA0LE5BMiggIDM5KSwgMyxOQTIoICAyNiksIDQsTkEyKCAgMTMp LCAyLE5BMiggMTMpIH0sICAvKiAgMzlNYi9zICovCisJeyA0LE5BMiggIDUyKSwgMyxOQTIoICAz OSksIDQsTkEyKCAgMjYpLCAyLE5BMiggMTMpIH0sICAvKiAgNTJNYi9zICovCisJeyA0LE5BMigg IDc4KSwgMyxOQTIoICA1MiksIDQsTkEyKCAgMzkpLCAyLE5BMiggMTMpIH0sICAvKiAgNzhNYi9z ICovCisJeyA0LE5BMiggMTA0KSwgMyxOQTIoICA3OCksIDQsTkEyKCAgNTIpLCAyLE5BMiggMTMp IH0sICAvKiAxMDRNYi9zICovCisJeyA0LE5BMiggMTE3KSwgMyxOQTIoIDEwNCksIDQsTkEyKCAg NzgpLCAyLE5BMiggMjYpIH0sICAvKiAxMTdNYi9zICovCisJeyA0LE5BMiggMTMwKSwgMyxOQTIo IDExNyksIDQsTkEyKCAxMDQpLCAyLE5BMiggMjYpIH0sICAgLyogMTMwTWIvcyAqLworCisJLyog MyBzdHJlYW0gcmF0ZXMgKi8KKworCXsgMyxOQTMoMTkuNSksIDMsTkEzKDE5LjUpLCAwLE5BMygx OS41KSwgMCxOQTMoMTkuNSkgfSwgIC8qICAxOU1iL3MgKi8KKwl7IDMsTkEzKCAgMzkpLCAzLE5B MygxOS41KSwgMCxOQTMoMTkuNSksIDAsTkEzKDE5LjUpIH0sICAvKiAgMzlNYi9zICovCisJeyAz LE5BMyg1OC41KSwgMyxOQTMoICAzOSksIDAsTkEzKDE5LjUpLCAwLE5BMygxOS41KSB9LCAgLyog IDU4TWIvcyAqLworCXsgMyxOQTMoICA3OCksIDMsTkEzKDU4LjUpLCAwLE5BMyggIDM5KSwgMCxO QTMoMTkuNSkgfSwgIC8qICA3OE1iL3MgKi8KKwl7IDMsTkEzKCAxMTcpLCAzLE5BMyggIDc4KSwg MCxOQTMoNTguNSksIDAsTkEzKDE5LjUpIH0sICAvKiAxMTdNYi9zICovCisJeyAzLE5BMyggMTU2 KSwgMyxOQTMoIDExNyksIDAsTkEzKCAgNzgpLCAwLE5BMygxOS41KSB9LCAgLyogIDE1Nk1iL3Mg Ki8KKwl7IDMsTkEzKDE3NS41KSwgMyxOQTMoIDE1NiksIDAsTkEzKCAxMTcpLCAwLE5BMyggIDM5 KSB9LCAgLyogIDE3NU1iL3MgKi8KKwl7IDMsTkEzKCAxOTUpLCAzLE5BMyggMTk1KSwgMCxOQTMo IDE1NiksIDAsTkEzKDU4LjUpIH0sICAvKiAxOTVNYi9zICovCit9OworI3VuZGVmIEEKKyN1bmRl ZiBOQTMKKyN1bmRlZiBOQTIKKyN1bmRlZiBOQTEKKworI2RlZmluZSBHKF9yKSBcCisgICAgKCgo X3IpID09IDEpICAgPyAwIDogKCgoX3IpID09IDIpICAgPyAxIDogKCgoX3IpID09IDUuNSkgPyAy IDogXAorICAgICgoKF9yKSA9PSAxMSkgID8gMyA6ICgoKF9yKSA9PSA2KSAgID8gNCA6ICgoKF9y KSA9PSA5KSAgID8gNSA6IFwKKyAgICAoKChfcikgPT0gMTIpICA/IDYgOiAoKChfcikgPT0gMTgp ICA/IDcgOiAoKChfcikgPT0gMjQpICA/IDggOiBcCisgICAgKCgoX3IpID09IDM2KSAgPyA5IDog KCgoX3IpID09IDQ4KSAgPyAxMCA6ICgoKF9yKSA9PSA1NCkgID8gMTEgOiAwKSkpKSkpKSkpKSkp CitzdGF0aWMgY29uc3Qgc3RydWN0IHR4c2NoZWR1bGUgc2VyaWVzXzExZ1tdID0geworCXsgMyxH KCAxKSwgMyxHKCAgMSksIDAsRyggIDEpLCAwLEcoIDEpIH0sCS8qICAgMU1iL3MgKi8KKwl7IDQs RyggMiksIDMsRyggIDEpLCA0LEcoICAxKSwgMCxHKCAxKSB9LAkvKiAgIDJNYi9zICovCisJeyA0 LEcoNS41KSwzLEcoICAyKSwgNCxHKCAgMSksIDIsRyggMSkgfSwJLyogNS41TWIvcyAqLworCXsg NCxHKDExKSwgMyxHKDUuNSksIDQsRyggIDIpLCAyLEcoIDEpIH0sCS8qICAxMU1iL3MgKi8KKwl7 IDQsRyggNiksIDMsRyg1LjUpLCA0LEcoICAyKSwgMixHKCAxKSB9LAkvKiAgIDZNYi9zICovCisJ eyA0LEcoIDkpLCAzLEcoICA2KSwgNCxHKDUuNSksIDIsRyggMSkgfSwJLyogICA5TWIvcyAqLwor CXsgNCxHKDEyKSwgMyxHKCAxMSksIDQsRyg1LjUpLCAyLEcoIDEpIH0sCS8qICAxMk1iL3MgKi8K Kwl7IDQsRygxOCksIDMsRyggMTIpLCA0LEcoIDExKSwgMixHKCAxKSB9LAkvKiAgMThNYi9zICov CisJeyA0LEcoMjQpLCAzLEcoIDE4KSwgNCxHKCAxMiksIDIsRyggMSkgfSwJLyogIDI0TWIvcyAq LworCXsgNCxHKDM2KSwgMyxHKCAyNCksIDQsRyggMTgpLCAyLEcoIDEpIH0sCS8qICAzNk1iL3Mg Ki8KKwl7IDQsRyg0OCksIDMsRyggMzYpLCA0LEcoIDI0KSwgMixHKCAxKSB9LAkvKiAgNDhNYi9z ICovCisJeyA0LEcoNTQpLCAzLEcoIDQ4KSwgNCxHKCAzNiksIDIsRyggMSkgfQkvKiAgNTRNYi9z ICovCit9OworCisjZGVmaW5lIE5HMShfcikgXAorCSgoKF9yKSA9PSA2LjUpID8gMTIgOiAoKChf cikgPT0gMTMpID8gMTMgOiAoKChfcikgPT0gMTkuNSk/IDE0IDogXAorCSgoKF9yKSA9PSAyNikg ID8gMTUgOiAoKChfcikgPT0gMzkpID8gMTYgOiAoKChfcikgPT0gNTIpICA/IDE3IDogXAorCSgo KF9yKSA9PSA1OC41KT8gMTggOiAoKChfcikgPT0gNjUpID8gMTkgOiAwKSkpKSkpKSkKKyNkZWZp bmUgTkcyKF9yKSBcCisJKCgoX3IpID09IDEzKSAgPyAyMCA6ICgoKF9yKSA9PSAyNikgPyAyMSA6 ICgoKF9yKSA9PSAzOSkgID8gMjIgOiBcCisJKCgoX3IpID09IDUyKSAgPyAyMyA6ICgoKF9yKSA9 PSA3OCkgPyAyNCA6ICgoKF9yKSA9PSAxMDQpID8gMjUgOiBcCisJKCgoX3IpID09IDExNykgPyAy NiA6ICgoKF9yKSA9PSAxMzApPyAyNyA6IDApKSkpKSkpKQorI2RlZmluZSBORzMoX3IpIFwKKwko KChfcikgPT0gMTkuNSkgID8gMjggOiAoKChfcikgPT0gMzkpID8gMjkgOiAoKChfcikgPT0gNTgu NSkgID8gMzAgOiBcCisJKCgoX3IpID09IDc4KSAgPyAzMSA6ICgoKF9yKSA9PSAxMTcpID8gMzIg OiAoKChfcikgPT0gMTU2KSA/IDMzIDogXAorCSgoKF9yKSA9PSAxNzUuNSkgPyAzNCA6ICgoKF9y KSA9PSAxOTUpPyAzNSA6IDApKSkpKSkpKQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHR4c2NoZWR1 bGUgc2VyaWVzXzExbmdbXSA9IHsKKwl7IDMsRyggMSksIDMsRyggIDEpLCAwLEcoICAxKSwgMCxH KCAxKSB9LCAgICAgICAvKiAgIDFNYi9zICovCisJeyA0LEcoIDIpLCAzLEcoICAxKSwgNCxHKCAg MSksIDAsRyggMSkgfSwgICAgICAgLyogICAyTWIvcyAqLworCXsgNCxHKDUuNSksMyxHKCAgMiks IDQsRyggIDEpLCAyLEcoIDEpIH0sICAgICAgIC8qIDUuNU1iL3MgKi8KKwl7IDQsRygxMSksIDMs Ryg1LjUpLCA0LEcoICAyKSwgMixHKCAxKSB9LCAgICAgICAvKiAgMTFNYi9zICovCisJeyA0LEco IDYpLCAzLEcoNS41KSwgNCxHKCAgMiksIDIsRyggMSkgfSwgICAgICAgLyogICA2TWIvcyAqLwor CXsgNCxHKCA5KSwgMyxHKCAgNiksIDQsRyg1LjUpLCAyLEcoIDEpIH0sICAgICAgIC8qICAgOU1i L3MgKi8KKwl7IDQsRygxMiksIDMsRyggMTEpLCA0LEcoNS41KSwgMixHKCAxKSB9LCAgICAgICAv KiAgMTJNYi9zICovCisJeyA0LEcoMTgpLCAzLEcoIDEyKSwgNCxHKCAxMSksIDIsRyggMSkgfSwg ICAgICAgLyogIDE4TWIvcyAqLworCXsgNCxHKDI0KSwgMyxHKCAxOCksIDQsRyggMTIpLCAyLEco IDEpIH0sICAgICAgIC8qICAyNE1iL3MgKi8KKwl7IDQsRygzNiksIDMsRyggMjQpLCA0LEcoIDE4 KSwgMixHKCAxKSB9LCAgICAgICAvKiAgMzZNYi9zICovCisJeyA0LEcoNDgpLCAzLEcoIDM2KSwg NCxHKCAyNCksIDIsRyggMSkgfSwgICAgICAgLyogIDQ4TWIvcyAqLworCXsgNCxHKDU0KSwgMyxH KCA0OCksIDQsRyggMzYpLCAyLEcoIDEpIH0sICAgICAgIC8qICA1NE1iL3MgKi8KKworCS8qIDEg c3RyZWFtIHJhdGVzICovCisKKwl7IDMsTkcxKCA2LjUpLCAzLE5HMSggNi41KSwgMCxORzEoIDYu NSksIDAsTkcxKDYuNSkgfSwgIC8qIDYuNU1iL3MgKi8KKwl7IDQsTkcxKCAgMTMpLCAzLE5HMSgg Ni41KSwgNCxORzEoIDYuNSksIDAsTkcxKDYuNSkgfSwgIC8qICAxM01iL3MgKi8KKwl7IDQsTkcx KDE5LjUpLCAzLE5HMSggNi41KSwgNCxORzEoIDYuNSksIDAsTkcxKDYuNSkgfSwgIC8qMTkuNU1i L3MgKi8KKwl7IDQsTkcxKCAgMjYpLCAzLE5HMSgxOS41KSwgNCxORzEoIDYuNSksIDIsTkcxKDYu NSkgfSwgIC8qICAyNk1iL3MgKi8KKwl7IDQsTkcxKCAgMzkpLCAzLE5HMSggIDI2KSwgNCxORzEo MTkuNSksIDIsTkcxKDYuNSkgfSwgIC8qICAzOU1iL3MgKi8KKwl7IDQsTkcxKCAgNTIpLCAzLE5H MSggIDM5KSwgNCxORzEoICAyNiksIDIsTkcxKDYuNSkgfSwgIC8qICA1Mk1iL3MgKi8KKwl7IDQs TkcxKDU4LjUpLCAzLE5HMSggIDUyKSwgNCxORzEoICAzOSksIDIsTkcxKCAxMykgfSwgIC8qNTgu NU1iL3MgKi8KKwl7IDQsTkcxKCAgNjUpLCAzLE5HMSg1OC41KSwgNCxORzEoICA1MiksIDIsTkcx KCAxMykgfSwgIC8qICA2NU1iL3MgKi8KKworCS8qIDIgc3RyZWFtIHJhdGVzICovCisKKwl7IDMs TkcyKCAgMTMpLCAzLE5HMiggIDEzKSwgMCxORzIoICAxMyksIDAsTkcyKCAxMykgfSwgIC8qICAx M01iL3MgKi8KKwl7IDQsTkcyKCAgMjYpLCAzLE5HMiggIDEzKSwgNCxORzIoICAxMyksIDAsTkcy KCAxMykgfSwgIC8qICAyNk1iL3MgKi8KKwl7IDQsTkcyKCAgMzkpLCAzLE5HMiggIDI2KSwgNCxO RzIoICAxMyksIDIsTkcyKCAxMykgfSwgIC8qICAzOU1iL3MgKi8KKwl7IDQsTkcyKCAgNTIpLCAz LE5HMiggIDM5KSwgNCxORzIoICAyNiksIDIsTkcyKCAxMykgfSwgIC8qICA1Mk1iL3MgKi8KKwl7 IDQsTkcyKCAgNzgpLCAzLE5HMiggIDUyKSwgNCxORzIoICAzOSksIDIsTkcyKCAxMykgfSwgIC8q ICA3OE1iL3MgKi8KKwl7IDQsTkcyKCAxMDQpLCAzLE5HMiggIDc4KSwgNCxORzIoICA1MiksIDIs TkcyKCAxMykgfSwgIC8qIDEwNE1iL3MgKi8KKwl7IDQsTkcyKCAxMTcpLCAzLE5HMiggMTA0KSwg NCxORzIoICA3OCksIDIsTkcyKCAyNikgfSwgIC8qIDExN01iL3MgKi8KKwl7IDQsTkcyKCAxMzAp LCAzLE5HMiggMTE3KSwgNCxORzIoIDEwNCksIDIsTkcyKCAyNikgfSwgIC8qIDEzME1iL3MgKi8K KworCS8qIDMgc3RyZWFtIHJhdGVzICovCisKKwl7IDMsTkczKDE5LjUpLCAzLE5HMygxOS41KSwg MCxORzMoMTkuNSksIDAsTkczKDE5LjUpIH0sICAvKiAgMTlNYi9zICovCisJeyAzLE5HMyggIDM5 KSwgMyxORzMoMTkuNSksIDAsTkczKDE5LjUpLCAwLE5HMygxOS41KSB9LCAgLyogIDM5TWIvcyAq LworCXsgMyxORzMoNTguNSksIDMsTkczKCAgMzkpLCAwLE5HMygxOS41KSwgMCxORzMoMTkuNSkg fSwgIC8qICA1OE1iL3MgKi8KKwl7IDMsTkczKCAgNzgpLCAzLE5HMyg1OC41KSwgMCxORzMoICAz OSksIDAsTkczKDE5LjUpIH0sICAvKiAgNzhNYi9zICovCisJeyAzLE5HMyggMTE3KSwgMyxORzMo ICA3OCksIDAsTkczKDU4LjUpLCAwLE5HMygxOS41KSB9LCAgLyogMTE3TWIvcyAqLworCXsgMyxO RzMoIDE1NiksIDMsTkczKCAxMTcpLCAwLE5HMyggIDc4KSwgMCxORzMoMTkuNSkgfSwgIC8qICAx NTZNYi9zICovCisJeyAzLE5HMygxNzUuNSksIDMsTkczKCAxNTYpLCAwLE5HMyggMTE3KSwgMCxO RzMoICAzOSkgfSwgIC8qICAxNzVNYi9zICovCisJeyAzLE5HMyggMTk1KSwgMyxORzMoIDE5NSks IDAsTkczKCAxNTYpLCAwLE5HMyg1OC41KSB9LCAgLyogMTk1TWIvcyAqLworCit9OworI3VuZGVm IEcKKyN1bmRlZiBORzMKKyN1bmRlZiBORzIKKyN1bmRlZiBORzEKKworI2RlZmluZSBIKF9yKSBc CisgICAgKCgoX3IpID09IDMpICAgPyAwIDogKCgoX3IpID09IDQuNSkgPyAxIDogKCgoX3IpID09 IDYpICA/IDIgOiBcCisgICAgKCgoX3IpID09IDkpICAgPyAzIDogKCgoX3IpID09IDEyKSAgPyA0 IDogKCgoX3IpID09IDE4KSA/IDUgOiBcCisgICAgKCgoX3IpID09IDI0KSAgPyA2IDogKCgoX3Ip ID09IDI3KSAgPyA3IDogMCkpKSkpKSkpCitzdGF0aWMgY29uc3Qgc3RydWN0IHR4c2NoZWR1bGUg c2VyaWVzX2hhbGZbXSA9IHsKKwl7IDMsSCggMyksIDMsSCggIDMpLCAwLEgoICAzKSwgMCxIKCAz KSB9LAkvKiAgIDNNYi9zICovCisJeyA0LEgoNC41KSwzLEgoICAzKSwgNCxIKCAgMyksIDAsSCgg MykgfSwJLyogNC41TWIvcyAqLworCXsgNCxIKCA2KSwgMyxIKCAgMyksIDQsSCggIDMpLCAwLEgo IDMpIH0sCS8qICAgNk1iL3MgKi8KKwl7IDQsSCggOSksIDMsSCggIDYpLCA0LEgoICAzKSwgMixI KCAzKSB9LAkvKiAgIDlNYi9zICovCisJeyA0LEgoMTIpLCAzLEgoICA5KSwgNCxIKCAgNiksIDIs SCggMykgfSwJLyogIDEyTWIvcyAqLworCXsgNCxIKDE4KSwgMyxIKCAxMiksIDQsSCggIDkpLCAy LEgoIDMpIH0sCS8qICAxOE1iL3MgKi8KKwl7IDQsSCgyNCksIDMsSCggMTgpLCA0LEgoIDEyKSwg MixIKCA2KSB9LAkvKiAgMjRNYi9zICovCisJeyA0LEgoMjcpLCAzLEgoIDI0KSwgNCxIKCAxOCks IDIsSCgxMikgfQkvKiAgMjdNYi9zICovCit9OworI3VuZGVmIEgKKworI2lmZGVmIFEKKyN1bmRl ZiBRCisjZW5kaWYKKyNkZWZpbmUgUShfcikgXAorICAgICgoKF9yKSA9PSAxLjUpID8gMCA6ICgo KF9yKSA9PTIuMjUpID8gMSA6ICgoKF9yKSA9PSAzKSAgPyAyIDogXAorICAgICgoKF9yKSA9PSA0 LjUpID8gMyA6ICgoKF9yKSA9PSAgNikgID8gNCA6ICgoKF9yKSA9PSA5KSAgPyA1IDogXAorICAg ICgoKF9yKSA9PSAxMikgID8gNiA6ICgoKF9yKSA9PSAxMy41KT8gNyA6IDApKSkpKSkpKQorc3Rh dGljIGNvbnN0IHN0cnVjdCB0eHNjaGVkdWxlIHNlcmllc19xdWFydGVyW10gPSB7CisJeyAzLFEo IDEuNSksMyxRKDEuNSksIDAsUSgxLjUpLCAwLFEoMS41KSB9LAkvKiAxLjVNYi9zICovCisJeyA0 LFEoMi4yNSksMyxRKDEuNSksIDQsUSgxLjUpLCAwLFEoMS41KSB9LAkvKjIuMjVNYi9zICovCisJ eyA0LFEoICAgMyksMyxRKDEuNSksIDQsUSgxLjUpLCAwLFEoMS41KSB9LAkvKiAgIDNNYi9zICov CisJeyA0LFEoIDQuNSksMyxRKCAgMyksIDQsUSgxLjUpLCAyLFEoMS41KSB9LAkvKiA0LjVNYi9z ICovCisJeyA0LFEoICAgNiksMyxRKDQuNSksIDQsUSggIDMpLCAyLFEoMS41KSB9LAkvKiAgIDZN Yi9zICovCisJeyA0LFEoICAgOSksMyxRKCAgNiksIDQsUSg0LjUpLCAyLFEoMS41KSB9LAkvKiAg IDlNYi9zICovCisJeyA0LFEoICAxMiksMyxRKCAgOSksIDQsUSggIDYpLCAyLFEoICAzKSB9LAkv KiAgMTJNYi9zICovCisJeyA0LFEoMTMuNSksMyxRKCAxMiksIDQsUSggIDkpLCAyLFEoICA2KSB9 CS8qMTMuNU1iL3MgKi8KK307CisjdW5kZWYgUQorCisjZW5kaWYK --089e013cbc8c39586e04e3fb4374-- From owner-freebsd-wireless@FreeBSD.ORG Sat Aug 17 22:57:24 2013 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id BFA897CD for ; Sat, 17 Aug 2013 22:57:24 +0000 (UTC) (envelope-from julio@meroh.net) Received: from mail-lb0-f169.google.com (mail-lb0-f169.google.com [209.85.217.169]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 40FBA20D1 for ; Sat, 17 Aug 2013 22:57:23 +0000 (UTC) Received: by mail-lb0-f169.google.com with SMTP id u10so2166068lbi.14 for ; Sat, 17 Aug 2013 15:57:15 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc:content-type; bh=KBl0bSD8aaD7MP1MbADJ5dXtRpJJ6HXnWBqhUGRHRrs=; b=JtH/RNUR5XkH8CLlLUga6ULgsB2VUEOwpsRph1PlhnkDKHBrwCjbbgQ73ZfxZjQPej zny4XFLLsxwlBXTl8uiDcT6EyCQ5Wg4Hx50D5ssJnHN2LUrWsP2WhtRGW2H6JarLm7pW CdUJ6wM21L3ki8c1ICZzRJJlZyAC7xk2XH8SzIOV1wIG8y7xH0Qv4lK2FN2onrbschF1 US/m2PkvlZNa46BXXkzvDk4ZSJtvWzJ0VeK9/3FAYF2sXA2t+4IZImyA1d9tWVFLE8Vg 1bJnGG5g7fQvyyC3dFlKHYf2mFj3bcv6KgHwjRDgSbeT4UzmuhYOL9UkwIezSO9cM9Ue XaRA== X-Gm-Message-State: ALoCoQn3SaKGnIy949YBUQ4Os6Pg9u7fs1IJO20HZAjsqUDMzJPLkWr95XuFtlp21zbMCKuBSqF6 X-Received: by 10.112.168.170 with SMTP id zx10mr3705344lbb.0.1376780235718; Sat, 17 Aug 2013 15:57:15 -0700 (PDT) MIME-Version: 1.0 Received: by 10.112.149.2 with HTTP; Sat, 17 Aug 2013 15:56:54 -0700 (PDT) X-Originating-IP: [108.176.158.82] In-Reply-To: References: <201308111650.r7BGo1Qt048071@freefall.freebsd.org> <52099CF4.7050101@meroh.net> From: Julio Merino Date: Sat, 17 Aug 2013 18:56:54 -0400 Message-ID: Subject: Re: kern/181100: [bwi] Turning up bwi0 crashes / deadlocks the kernel To: Adrian Chadd Content-Type: text/plain; charset=ISO-8859-1 Cc: freebsd-wireless@freebsd.org X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.14 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, 17 Aug 2013 22:57:24 -0000 On Wed, Aug 14, 2013 at 1:13 PM, Adrian Chadd wrote: > Hi, > > Can you please work with Justin to figure out the IP of that panic inside > _bwi_txeof(), and then map it back to a line number? > > I've no idea where the panic is actually triggering. There is only one KASSERT within _bwi_txeof() mentioning "ring_idx", and that's the line triggering the panic. (And yes, I've verified this... not with a core dump, because I cannot get one, but by putting printfs() around the various KASSERTS that yield this message.) Does that help? -- Julio Merino / @jmmv From owner-freebsd-wireless@FreeBSD.ORG Sat Aug 17 23:03:43 2013 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 05B649D9 for ; Sat, 17 Aug 2013 23:03:43 +0000 (UTC) (envelope-from adrian.chadd@gmail.com) Received: from mail-wi0-x233.google.com (mail-wi0-x233.google.com [IPv6:2a00:1450:400c:c05::233]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 88B7E2131 for ; Sat, 17 Aug 2013 23:03:42 +0000 (UTC) Received: by mail-wi0-f179.google.com with SMTP id hr7so1896257wib.6 for ; Sat, 17 Aug 2013 16:03:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:in-reply-to:references:date:message-id:subject :from:to:cc:content-type; bh=w0sk4NzjK8jdg0wNpNmO5dhccbCqKx/wJt701r2qD0c=; b=bJt1k5aiPgEvH073bnfbkmOVIW0Y/0AT/iZxlztS6MK5I/jUCv8D+L/Ds4cChNCB2f cWlPQfppSvpcObMgJMJ/Q8uasNbKA2P5vmJ9LvJ6SekibK9aNAn/m2hxtBKyhGvKOvDq ci/pF0LOz6TIEXluafhKdVjDa0WCZ0cHHrJ54OMW21r3SF6iKnWqFWYIsoEDw++CKCyA apqft5VRCU/etMxolXsavloWpk8jVwLw2IGXBEyXxuUMLn/nf4HN6Bmnho5ZhhaZ6mk2 y05L/eSRqrwuo1dvMRg2xI0XOjyxngKnSRnZXODkJYDIT1H5eCZUA8vhSaIJKcLR85Xp sdlA== MIME-Version: 1.0 X-Received: by 10.194.123.227 with SMTP id md3mr3123056wjb.17.1376780620439; Sat, 17 Aug 2013 16:03:40 -0700 (PDT) Sender: adrian.chadd@gmail.com Received: by 10.217.116.136 with HTTP; Sat, 17 Aug 2013 16:03:40 -0700 (PDT) In-Reply-To: References: <201308111650.r7BGo1Qt048071@freefall.freebsd.org> <52099CF4.7050101@meroh.net> Date: Sat, 17 Aug 2013 16:03:40 -0700 X-Google-Sender-Auth: E3nycUj8b-FBZz4NtZRbLCt0MHQ Message-ID: Subject: Re: kern/181100: [bwi] Turning up bwi0 crashes / deadlocks the kernel From: Adrian Chadd To: Julio Merino Content-Type: text/plain; charset=ISO-8859-1 X-Content-Filtered-By: Mailman/MimeDel 2.1.14 Cc: "freebsd-wireless@freebsd.org" X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.14 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, 17 Aug 2013 23:03:43 -0000 yes, print out ring_idx -adrian On 17 August 2013 15:56, Julio Merino wrote: > On Wed, Aug 14, 2013 at 1:13 PM, Adrian Chadd wrote: > > Hi, > > > > Can you please work with Justin to figure out the IP of that panic inside > > _bwi_txeof(), and then map it back to a line number? > > > > I've no idea where the panic is actually triggering. > > There is only one KASSERT within _bwi_txeof() mentioning "ring_idx", > and that's the line triggering the panic. > > (And yes, I've verified this... not with a core dump, because I cannot > get one, but by putting printfs() around the various KASSERTS that > yield this message.) > > Does that help? > > -- > Julio Merino / @jmmv >