From nobody Wed Oct 28 03:13:38 2026 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4jDsrg0bKcz6wMgZ for ; Wed, 28 Oct 2026 03:13:39 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 4jDsrg0D1Dz3K4p for ; Wed, 28 Oct 2026 03:13:39 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1793157219; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=JdFHgpiYvY2mahRioMMtRq9DSXEujqZT27RR1ca+Hlk=; b=kv+AYd4BobalTuXAmwZzOMlWsEvXM0Ad8hMUvfKCJbibZZghSOfpj+wJVoD+gR47P7/6LR jYb3GRwjYgOuEiEjVbZ7GPJzunohSibIBg03yCOBaoqQmfgR8BXPhiQgyl9FRq8l1zDSGp g8iOMr4BoTcrt5xrV0GW3bbe2WWvRVvFyYmUOW1Qj/g+c/5Pl1CO5TyeVvgMK1MSTpoNQK tRAvFAxsn3l7mYKUHq7rUwFOfBaskfYfFvU7iTXC6dTa6gVLBBFQQpA22WF6G9CQcA4cI9 88ked6cosn1IHG9vMe4v3gBgvnXvlACzWMb1zIE2hXCPV+YiTHeV9R9YL3Q51g== ARC-Seal: i=1; a=rsa-sha256; d=freebsd.org; s=dkim; cv=none; t=1793157219; b=bNu8/1jLPE/R8Xf8uSBO1YX1Dflae0o4uy2pQY7IqTrzIup9Yv1/JL73Px7EYpmrmeGwDt 0qQKfRTwTw0WZY9DCyrFAMoV/FGTbTrCbHGLe6P4p/22y2OYai6kDAGCvLKzFz4jmlIftq nvbxQDbejdFNomEb+4q4vhB+cv47NRtnticd9D+WQcagCFGdU8qoBTO7MOOqiNe5n/7L8f 6+GHxyYg5XJqOyVBCfjCLLZWSERx1RuO2Yj7mMGFVs2v0AND2DkOq5vkeYDM1EcxqXPW0F tP2F+4sr12h2Qk897i3slw/PR7tOTl3qsnXDnhdR2UBCULvHOjbqoG8KFFrWjA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1793157219; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=JdFHgpiYvY2mahRioMMtRq9DSXEujqZT27RR1ca+Hlk=; b=dztFbiinX/JwtlkKryrD97fsisA0uWosfsrxMG74ecWxknUIjstC8NDfxuPwVjgMfmgU5u knryZyCwIkFhkSReyDcsypADPrsaPUKAqyLoSGZohrZ+XUC+RE+FWBMYarvk8LZ1qp3Feq KqokEfrDPMC8shIxY8bVRnV/hcLYKJm9YjUuD+FoBS8fclGDTj4WYs14xzURVlgZ1gpJB+ lpAHI07v88F7D5v/qPEd/q46UNG7Iw6Bna8xoiTRHHH9mGCV1mxU6szNuSTugH7uQWQf9G uDr+P9RxOKxc6ZaxFC6h3HVuv3qeoyRqLW5gXmfhbcri8GEJHOCQFnSmJSWbtw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4jDsrf70Vkzr3h for ; Wed, 28 Oct 2026 03:13:38 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 1c143 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Wed, 28 Oct 2026 03:13:38 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org Cc: Mir Saheb Ali From: Adrian Chadd Subject: git: 2c38dc04d6f8 - main - rtwn: add support for the RTL8188FTV USB chipset List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org List-Id: Commit messages for all branches of the src repository List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: adrian X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 2c38dc04d6f8bc84620bb3b67c8ccd9f910c4d03 Auto-Submitted: auto-generated Date: Wed, 28 Oct 2026 03:13:38 +0000 Message-Id: <6ae16862.1c143.12f56624@gitrepo.freebsd.org> The branch main has been updated by adrian: URL: https://cgit.FreeBSD.org/src/commit/?id=2c38dc04d6f8bc84620bb3b67c8ccd9f910c4d03 commit 2c38dc04d6f8bc84620bb3b67c8ccd9f910c4d03 Author: Mir Saheb Ali AuthorDate: 2026-10-19 19:10:27 +0000 Commit: Adrian Chadd CommitDate: 2026-10-28 02:57:07 +0000 rtwn: add support for the RTL8188FTV USB chipset Add support for the RTL8188FTV chipset to rtwn(4)/rtwn_usb(4). Differential Revision: https://reviews.freebsd.org/D60875 --- share/man/man4/rtwn.4 | 5 +- share/man/man4/rtwn_usb.4 | 3 +- share/man/man4/rtwnfw.4 | 4 +- sys/conf/files | 11 + sys/contrib/dev/rtwn/rtwn-rtl8188fufw.fw.uu | 471 ++++++++++++++++++ sys/dev/rtwn/if_rtwn.c | 4 +- sys/dev/rtwn/if_rtwnvar.h | 6 + sys/dev/rtwn/rtl8188e/pci/r88ee_attach.c | 2 + sys/dev/rtwn/rtl8188e/usb/r88eu_attach.c | 2 + sys/dev/rtwn/rtl8188f/r88f.h | 57 +++ sys/dev/rtwn/rtl8188f/r88f_calib.c | 728 ++++++++++++++++++++++++++++ sys/dev/rtwn/rtl8188f/r88f_chan.c | 358 ++++++++++++++ sys/dev/rtwn/rtl8188f/r88f_fw.c | 79 +++ sys/dev/rtwn/rtl8188f/r88f_init.c | 212 ++++++++ sys/dev/rtwn/rtl8188f/r88f_priv.h | 214 ++++++++ sys/dev/rtwn/rtl8188f/r88f_reg.h | 80 +++ sys/dev/rtwn/rtl8188f/r88f_rom.c | 121 +++++ sys/dev/rtwn/rtl8188f/r88f_rom_defs.h | 12 + sys/dev/rtwn/rtl8188f/r88f_rom_image.h | 56 +++ sys/dev/rtwn/rtl8188f/r88f_rx.c | 132 +++++ sys/dev/rtwn/rtl8188f/usb/r88fu.h | 24 + sys/dev/rtwn/rtl8188f/usb/r88fu_attach.c | 254 ++++++++++ sys/dev/rtwn/rtl8188f/usb/r88fu_init.c | 444 +++++++++++++++++ sys/dev/rtwn/rtl8192c/pci/r92ce_attach.c | 2 + sys/dev/rtwn/rtl8192c/r92c.h | 1 + sys/dev/rtwn/rtl8192c/r92c_beacon.c | 6 + sys/dev/rtwn/rtl8192c/r92c_reg.h | 5 + sys/dev/rtwn/rtl8192c/usb/r92cu_attach.c | 2 + sys/dev/rtwn/rtl8192e/r92e_reg.h | 11 + sys/dev/rtwn/rtl8192e/usb/r92eu_attach.c | 2 + sys/dev/rtwn/rtl8723b/usb/r23bu_attach.c | 2 + sys/dev/rtwn/rtl8812a/usb/r12au_attach.c | 2 + sys/dev/rtwn/rtl8821a/usb/r21au_attach.c | 2 + sys/dev/rtwn/usb/rtwn_usb_attach.h | 10 + sys/dev/usb/usbdevs | 1 + sys/modules/rtwn/Makefile | 5 + sys/modules/rtwn_usb/Makefile | 4 + sys/modules/rtwnfw/Makefile | 3 +- sys/modules/rtwnfw/rtwnrtl8188fu/Makefile | 4 + 39 files changed, 3336 insertions(+), 5 deletions(-) diff --git a/share/man/man4/rtwn.4 b/share/man/man4/rtwn.4 index fd219f228f65..0b1aed6f52bf 100644 --- a/share/man/man4/rtwn.4 +++ b/share/man/man4/rtwn.4 @@ -19,7 +19,7 @@ .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd September 1, 2026 +.Dd October 22, 2026 .Dt RTWN 4 .Os .Sh NAME @@ -89,6 +89,8 @@ driver supports USB and PCI devices with the following chipsets: .It Realtek 802.11n wireless 8188e (RTL8188E) .It +Realtek 802.11n wireless 8188f (RTL8188F) +.It Realtek 802.11n wireless 8192c (RTL8192C) .It Realtek 802.11n wireless 8192e (RTL8192E) @@ -119,6 +121,7 @@ which are loaded when an interface is brought up: .Bl -tag -width Ds -offset indent -compact .It Pa /boot/kernel/rtwn-rtl8188eefw.ko .It Pa /boot/kernel/rtwn-rtl8188eufw.ko +.It Pa /boot/kernel/rtwn-rtl8188fufw.ko .It Pa /boot/kernel/rtwn-rtl8192cfwE_B.ko .It Pa /boot/kernel/rtwn-rtl8192cfwE.ko .It Pa /boot/kernel/rtwn-rtl8192cfwT.ko diff --git a/share/man/man4/rtwn_usb.4 b/share/man/man4/rtwn_usb.4 index 706696514920..285ef95430d2 100644 --- a/share/man/man4/rtwn_usb.4 +++ b/share/man/man4/rtwn_usb.4 @@ -29,7 +29,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF .\" THE POSSIBILITY OF SUCH DAMAGES. .\" -.Dd September 11, 2026 +.Dd October 22, 2026 .Dt RTWN_USB 4 .Os .Sh NAME @@ -101,6 +101,7 @@ Realtek RTL 8188/8192/8723/8812 and 8821 chipsets, including: .It "Realtek RTL8723BU" Ta RTL8723BU Ta USB 2.0 .It "Realtek RTL8192CU" Ta RTL8192CU Ta USB 2.0 .It "Realtek RTL8188CUS" Ta RTL8188CUS Ta USB 2.0 +.It "Realtek RTL8188FTV" Ta RTL8188FTV Ta USB 2.0 .It "Sitecom WLA-7100" Ta RTL8812AU Ta USB 3.0 .It "TP-Link Archer T2U Nano" Ta RTL8821AU Ta USB 2.0 .It "TP-Link Archer T2U Plus" Ta RTL8821AU Ta USB 2.0 diff --git a/share/man/man4/rtwnfw.4 b/share/man/man4/rtwnfw.4 index 98e3ef0c13aa..c3eeae7f1bdf 100644 --- a/share/man/man4/rtwnfw.4 +++ b/share/man/man4/rtwnfw.4 @@ -41,6 +41,7 @@ of the following: .Bd -ragged -offset indent .Cd "device rtwn-rtl8188eefw" .Cd "device rtwn-rtl8188eufw" +.Cd "device rtwn-rtl8188fufw" .Cd "device rtwn-rtl8192cfwE_B" .Cd "device rtwn-rtl8192cfwE" .Cd "device rtwn-rtl8192cfwT" @@ -56,6 +57,7 @@ module at boot time, place the following line in .Bd -literal -offset indent rtwn-rtl8188eefw_load="YES" rtwn-rtl8188eufw_load="YES" +rtwn-rtl8188fufw_load="YES" rtwn-rtl8192cfwE_B_load="YES" rtwn-rtl8192cfwE_load="YES" rtwn-rtl8192cfwT_load="YES" @@ -70,7 +72,7 @@ to firmware sets for the Realtek RTL8188CE chip based PCIe adapters. rtwn-rtl8188ee module provides access to firmware sets for the Realtek RTL8188EE chip based PCIe adapters. Other modules provide access to firmware sets for the Realtek RTL8188CUS, -RTL8188CE-VAU, RTL8188EUS, RTL8188RU, RTL8192CU, RTL8192EU, RTL8812AU and +RTL8188CE-VAU, RTL8188EUS, RTL8188FTV, RTL8188RU, RTL8192CU, RTL8192EU, RTL8812AU and RTL8821AU chip based USB WiFi adapters. They may be statically linked into the kernel, or loaded as a modules. diff --git a/sys/conf/files b/sys/conf/files index c3b8e8288745..e83e27c54d4d 100644 --- a/sys/conf/files +++ b/sys/conf/files @@ -2964,6 +2964,17 @@ dev/rtwn/rtl8188e/pci/r88ee_init.c optional rtwn_pci pci dev/rtwn/rtl8188e/pci/r88ee_rx.c optional rtwn_pci pci dev/rtwn/rtl8188e/usb/r88eu_attach.c optional rtwn_usb dev/rtwn/rtl8188e/usb/r88eu_init.c optional rtwn_usb + +# RTL8188F +dev/rtwn/rtl8188f/r88f_calib.c optional rtwn +dev/rtwn/rtl8188f/r88f_chan.c optional rtwn +dev/rtwn/rtl8188f/r88f_fw.c optional rtwn +dev/rtwn/rtl8188f/r88f_init.c optional rtwn +dev/rtwn/rtl8188f/r88f_rom.c optional rtwn +dev/rtwn/rtl8188f/r88f_rx.c optional rtwn +dev/rtwn/rtl8188f/usb/r88fu_attach.c optional rtwn_usb +dev/rtwn/rtl8188f/usb/r88fu_init.c optional rtwn_usb + # RTL8192C dev/rtwn/rtl8192c/r92c_attach.c optional rtwn dev/rtwn/rtl8192c/r92c_beacon.c optional rtwn diff --git a/sys/contrib/dev/rtwn/rtwn-rtl8188fufw.fw.uu b/sys/contrib/dev/rtwn/rtwn-rtl8188fufw.fw.uu new file mode 100644 index 000000000000..c73dba79f911 --- /dev/null +++ b/sys/contrib/dev/rtwn/rtwn-rtl8188fufw.fw.uu @@ -0,0 +1,471 @@ +begin 644 rtwn-rtl8188fufw.fw.uu +M\8@0``0````((A +M%```,`("`P0$"`D)#`X0$@()"PX-#Q`2``0`!``(`!``(P`M`%``D0##`2`(P`R`#<`5X!:`&:`?6,THSL)(?XYKP"`G3_PY6!M$``0,YY`WB`%N8(<`O"K^8PX0-$&/;2 +MKPC9[>J+T"+E#/\C)('X#P@(OP,$?P!X@>8PY/(`Y0S#GU`@!0QTAB4,^.;] +MIH$(YJX,O@("=/_-^.AM8.`(YL#@@/;E#-.?0"?E#"2'^.:N#+X"`G3__1CF +MS?CE@6U@!M#@]AB`]>4,)(;(]A4,@-/E#",D@?A_!,*OYC#@`Q#B#'\`,.$' +M,.,$?PA4]%1\QM*O5(!"!R)XAJ:!=`)@!O\(=O_?^W\#Y'B`]@CV"-_Z>(%V +M,)"(#70!D\#@Y)/`X$.)`76*8'6,>=*,TJ\B`N_3E`)``W__(G2!+R_XYB#E +M],*OYD0P]M*OK@SNPY]0(0YTAB[XYOD(YAB^`@)T__WM:6`)"><9&?<)"8#S +M%A:`VN[3GT`$!8$%@>[3GT`B=(8N^`CF^>ZU#`*I@1@&!N;][6E@"1D9YPD) +M]QF`\QZ`V>\DAOCF!/CO+P20B`V3]@CO+Y/V?P`B[].4`D`#?_\B[R,D@?CF +M,.7TPJ_F5(SVTJ_E#+4'"G2&+_CF]8$"A$U0+G2'+_CFOP("=/_]&.;Y=(8O +M^/OF_.EL8`BH!>?V'1F`]*@#I@4?Y0RU!^-_`")TAR_XYOT8A@$/=(8O^*8! +M"(8$Y0RU!P*L@>UL8`@-":@%YO>`].4,M0?>B8%_`"+OTY0"0`-__R+O(R2! +M^,*OYC#E!3#@`M+DTN+&TJ]_`##B`0\"A$R/\.3__N4,(R2`^,*I,/<-?PCF +M8`LM]F`P4"Z`!S#Q!NWV8"5^`@@P\!#"K^80YR,.,.(,TJ]_!(`2PJ_F$.<3 +M5.Q.]M*O`H1-?P@([T2#],*O5L;2KU2`3_\B[RO_[CK^[3G][#C\(L/OF__N +MFO[MF?WLF/PBZ(_PI,R+\*0L_.F.\*0L_(KP[:0L_.J.\*3-J/"+\*0MS#@E +M\/WIC_"D+,TU\/SKCO"D_JGPZX_PI,_%\"[-.?[D//SJI"W.-?#]Y#S\(N]; +M_^Y:_NU9_>Q8_"+O2__N2O[M2?WL2/PBX/RCX/VCX/ZCX/\BX/BCX/FCX/JC +MX/LBX/NCX/JCX/DBZ_"CZO"CZ?`BT(/0@OCDDW`2=`&3<`VCHY/X=`&3]8*( +M@^1S=`*3:&#OHZ.C@-\"A[L"A-WDDZ/XY).C0`/V@`'R"-_T@"GDDZ/X5``OD&5$0!!E1(`0949``"[(,!FR`$27A!_!)"5%^_P?P(2AB>0 +MA,'@_Y"5%^#^[TZ0A,'P(I"3^^_P47Y_]'X`$F0WOP$(D)0:X)"4'/!1?G_U +M?@`29#>_`0B0E!K@D)0=\%%^?_9^`!)D-[\!")"4&N"0E![P47Y_]WX`$F0W +MOP$(D)0:X)"4'_!1?G_X?@`29#>_`0B0E!K@D)0@\%%^$K]LOP$(D)0:X)"4 +M(?!1?E&%<%*0E!K@D)0B\%0'8`B0E!K@5.!P/GL!>I1Y&W_Z48=P,I"4&N#\ +M5`=P$I"4(N#^D)0;X%0'_>Y-D)0B\.Q4X'`2D)0BX/^0E!O@5.#^[TZ0E"+P +M47Y__5&'<$>0E!K@_E3,D)0C\.Y4#/]@")"4&N!4P'`N[W`2D)0CX/^0E!K@ +M5`,2T_`0B0E!K@ +MD)0F\%%^?_-^`!)D-[\!")"4&N"0E"?P47Y__'X`$F0WOP$(D)0:X)"4*/"0 +MD_QT&?"0E`IT"/"0E!S@D)/^\)"4'>"0D__PD)0>X)"4`/"0E!_@D)0!\)"4 +M(."0E`+PD)0AX)"4`_"0E"+@D)0$\)"4(^"0E`7PD)0+=!KPD)09=`7PD)0D +MX)"4#?"0E"7@D)0.\)"4)N"0E`_PD)0GX)"4$/"0E"C@D)01\)"3^^"T`19[ +M`7J3>?P27A![`7J4>0L27A!_!`$8=1L!=1R3=1W\=1X*>P%Z`7F@$FHA=1L! +M=1R4=1T-=1X%>P%Z`7FJ`FHA>P%ZE'D:(G_[?@`29#?O9`$B$J`W$@+V__%S +M_E0#_>X3$U0'^\`#\5CQ\Q+0:M`#$JE9\5CQP%ZDWG&$EX0?P0!&)"3P!*'3I"3O^_P$H=7BS,`BSWP +MY*/P[Q1@`H&OD`8#X%3[\)"5%>#[Q#-4X/Z0!$+@5)]._O#D_1+-!9"5%N_P +MD`2#\)"4TQ($]P````&0E-<2!/<````!L8(2!/<````!D)37$@3W`````7\` +M?@FQAA($]P```!"0E16QI>]4`__D>`$2!,5X!/%D?P!^"K&&$@3W```,`)"5 +M%;&E[U0#_^1X"O%D?P!^#;&&$@3W#````)"5%K&E[U0#_^1X&O%D?QBQA!($ +M]P``#`"0E-<2!/<`````L1B0E,$2!/<```P`D)3%$@3W```$`(!;D`8#X$0$ +M\)"4TQ($]P````&0E-<2!/<`````L8(2!/<````!D)37$@3W`````'\`?@FQ +MAA($]P``#`"0E-<2!/<```P`L1B0E,$2!/<```P`D)3%$@3W```,`'T8?`#D +M_Q*ITM#0DJ\B?X1^"-,0KP'#P-"0E-'N\*/O\!)P89"4VQ($ZY"4TQ*'+1($ +MIY"4V_%>P`3`!<`&P`>0E-,2ARV0E-?Q7M`#T`+0`=``$H<@D)3?$@3KD)3? +M$H0E&_Q?.##GY"1;Q*OD?O]?U!^`1)A09"4 +M;^#_\:94!_YD`F`#[G`1[_%]X"3\_^20D6[PH^\2QB"0D@K@\:)4!_\48`\4 +M8`<48`DD`W`+$LQ>@`,2E^X2E!>0DK/@_Y"2MN#3GT`"X4FQC!*'(,`$P`7` +M!L`'D`5BL:5X$!($V-`#T`+0`=``$H<@P`3`!<`&P`>CL:5X&!($V-`#T`+0 +M`=``$H<@D)1P$@3KD`5EL:42KH"0!62QI1*'(,`$P`7`!L`'D`5FL:5X$!($ +MV-`#T`+0`=``$H<@P`3`!<`&P`>CL:5X&!($V-`#T`+0`=``$H<@D)1T$@3K +MD)1O\7RQI1*OII"4!($ZY"4!*OGU`1\4P2N3?D +M/?WD//R0E'02!.OQ3!*OM_%*$J_`\4H2K\GQ2I`%B._PD)1X$H!*'+1*OY._PD)1X$H`PX`L2KXKDD)(,\!+%\2+#$U0'=?`;I"0Z]8+D-)+U +M@^`B$@+V_Y"2O/"_`0E_`1$SY)"2O/`B$J^ND)(\\/%SD)(]\?*0DE?P$I$) +MD))8\!*7YY"2#_D(7!X%3]3_#L5`3_D)+)X%3[3_#M5`_$5/#_$K?<$H_QD(7$\!$Y +M,.!0PQ-4!__#E`20A=A0!._P@"=T`_`2CUCI)`82I^[_=`,D_?[OQ%0/_>]4 +M#__M+E0/_L14\$\2`SP2CU@1.<14#__#E`20AP%1KC$),S,S5/@2T?']=?`.I"06]8+D-)+U@^_P,0G$$U0'_^UU\`ZD)!?U +M@N0TDO6#[_#NQ%0/_Q1M<"&0D@OO\!$Y5`_$5/#_D)(*X%0/3_!4\?"0D@G@ +M1`$2T2,BCUZ-7ZX#=!_#E5Y`"E&FY/U1GB34@#%T/\.57D`*4:9](%&<)(B` +M('1?PY5>0`I1IGU`49PDT(`/='_#E5Y`(%&F?6!1G"2$_>0T!/SE7Q+1$_6# +M=?`#[A(%*.SPH^WP(L/OG?5@PY0(4!SD]6%QG\"#P(*0D\?@T(+0@W7P`Q(% +M*.5@\(`^Y6##E!!0"75A`>5@)/B`%^5@PY084`EU80+E8"3P@`=U80/E8"3H +M_W&?P(/`@I"3Q^#0@M"#=?`#$@4H[_"O82*O7E$UD)/#[_`BD)/'[O"K7R(Q +MU*M;JERI72+M=?`.I"0.]8+D-)+U@^`BCU[1YN5>\?WU@^#\Y5Y1N!+06J\$ +M$JE9Y5Y1N!*+ON5>$JKC_;&2L8*M7G\!@`#3$*\!P\#0D)3Y[_"C[?#DH_"0 +ME/O@_\.4`T`"89J0E/K@_A+1$_6#=?`#[Q+1>^"0E/SPD)3YX/RT`B"0E/S@ +M_>YQH,"#P(*0E/O@T(+0@Q*R>X`"PS/8_$V`(.RT`2`2T9UQH,"#P(*0E/O@ +MT(+0@Q*R>X`"PS/8_/1?D)3\\!+1G1+1$_6#P(/`@I"4^^#0@M"#=?`#$M%[ +M[_"0E/O@!/!A"-#0DJ\BZW7P#J0D$?6"Y#22]8,B$M"GM0<$[E3Q\!+%\>20 +MD@SPT>X2T+[Q_/6#X/I1M_Q4`_WL$Q-4!_ON$M!IKP(2J5F1#E&X$HN^D0[_ +M=?`.I"08]8+D-)+U@^`$\!*JXOVQDN3[_9$*_7\!0?9__[&'D)(*X,,35`0E'SP8`?@9`)@`J$ED)(,X'`N$M&P>TY] +M;Y$*\=G@_WX`>P1]`;&2OP$-\5K@1`'PD)(,=`'P(I"4?>#]>T^!_9"2#.!D +M`6`"H1:1#O\2CZ;^Q%0/,.`"H13O\6+@_S#@")"4?W0!\(`7[\,3(.`1D)1_ +M=`'P$M&P>U!];W__L8>0E'_@8&20DKO@_Y"2NN!O8$/@!/#@TY0!0`B0E(!T +M!/"`!>20E(#PD0[QV>#_?@"0E(#@^WT!L9*_`0X2T5?PY/O]?UA^`0)A09"4 +M?>#]>U'D_Z&'Y)"2NO'MD)(*X/_Q7N!4^_"``O'ND)(,X&0%<&/1-^]P7H!7 +MD)1\X/]D`V`%[V0!<$Z0D@S@9`5P1I"4?.!D`7`L$H]YX-.4'Y"2"N!`"O'6 +MX/]]`'Q\@!+#\=;@^Q*/>>!]`"7@)>#\KP,2F.Z1#OU_`A*J4M$W[W`%?P82 +MJOOP(M,0KP'#P-"0E/+N\*,2L0.0!!W@8">0!2+@ +MD)3X\'L4T>CO9`%P!1+0<8`$?P"`%9"4^.#]>Q7D_[&'@`,2T'$2G_A_`=#0 +MDJ\BD)()X##@4Y"2#.!P)7L6?6_1ZI$.$JKC?0&QDI$.$L4!X$0!\!+15Q+& +M()"2#'0!\"*0D@S@9`%P'I$.$L4`X##@%1*JXGT!L9(2T5?PY/O]?U1^`0)A +M07&N(M'N[W`"_R*1#I"2B/`2T*>U!P3N5/'PD0[U=^20D@SPY7=U\!ND)#OU +M@N0TDO6#X##@)_%.X"2+]8+D-)+U@^#_$JK2[_%-X`3Q3>#_D)**X/[OM08$ +M\4[D\!*JTN#\D)*(X!*JU.!L8`_E=Q+03*\$$JE9Y7<2B[#E=Q*/IE0'_V`# +MOP(.Y7?QV>#_?@![!.3]L9*M=W\!$JI2D)*)X,,35`/_OP(%Y/\2JO=_`2)[ +M%WW_?_^QA^20E07PH_"0!2+@D)4'\'U'?_\2F..0!?C@D2F.-_`2+3D)4&X)3HD)4%X)0#0!"0`<#@1"#P$M'I$ICC?P`B?S)^ +M`!)\GY"5!1*]_X"W\'2N)7?U@N0TDO6#(I"2"N##$U0'=?`;I"0^]8+D-)+U +M@R+DD)1O\)"2"N`PX%G#$U0'__%BX/XPX$WO\6+N5/[P[_%B$L2Y,.`1D)(* +MX/[Q7N]4^_"0E&]T`?"0!.#@,.$=\>[Q6N!$`O#DD)*Z\)$._7\"$JI2D)1O +MX&`*@1?Q6N!4_?"Q@B(35`=U\!ND)$#U@N0TDO6#(I``!`(##_"0D@QT!?`B +M\)``!0(##_UU\`ZD)`WU@N0TDB*+6XIY5[3E6!0*!'75`']KUX2;E^O7A)W.>^O7G`$$9^``O'@D)+$X&`$ +MKUX1GP5>@-'E7W`6_Q)W.>]P#Q*_BQ)Y81+&I52_\%1_\")]`=,0KP'#P-"0 +MD\/O\*/M\'U$?V]1@9"3Q."0D\.T`0G@4;S@1`3P@`?@4;S@5/OP$>#0T)*O +M(JM;JERI70("]N3]_Y`%(N_PD)(![?`BTQ"O`_PH^SPH^WPD`0= +MX&`.``C'4D`4BX%1O_WTX$>/Q +M^-#0DJ\BTQ"O`RI\`*T'D)3]X)`$)?"0 +ME/[@8`51K$2`\*\%="`O]8+D-/SU@^!4P/!1K%3`\)"5`.#_K@5T&"[U@N0T +M_/6#[_!1CO6#X"#A%U0!_Y"4_^`EX"7@^^]$`DO_48[U@^_PKP5T$2_U@N0T +M_/6#=/_P="DO]8+D-/SU@^!4]_"N!*\%T-"2KR*0E('@_Y"5`'0,\.3[?0$Q +M-I"4A.[PH^_PD)2"X/RCX/T"=]C3$*\!P\#0D)22[_"C[?"0A,/@!/"0!!W@ +M8#60!2+@D)26\'TF47_O9`%P%U&7^WT!$CK"$M#\(.`)D)()X"#@`E&AD)26 +MX/]])Q'C48:`'E&&49?[D)4`=`KP?0$Q-A+0_"#@"9"2">`@X`)1H?'XD(2_ +MH^`D?_6"Y#2"]8-T`?#_T-"2KR)__Q'C`I;ND)22X/\"7*-T$B[U@N0T_"*0 +MA,C@_Y"4D^`BD)24X/ZCX/\"4-=T(2_U@N0T_/6#X"+@_>5VQ%3P)`7U@N0T +M@?6#(HUV[S#F&G%(4;C@5`.0D0OPY/NO=A(G/7$[T5UT`8!)T60$\-%D9`)P +M'G2I)7;Q0>#]]&`"@`1Q2.#]4;H2T3MQ2-%==`*`(=%DTY0#0`VO=A)ME'$[ +MT5UT`X`-<4A1N!+1.W%(T5UT`O"K=N3]_P)2PW2\)7;U@N0TD/6#Y/#E=L14 +M\"0`]8+D-('U@R*0!(7@]6N0E*C@!/#D]6.0A;O@_^5CPY]``L%$Y6-Q2N#U +M;1+1A^!E;6`6D(IQY6WPY*/PJV/]_Q)2PQ+1A^5M\)`$H.!D`7!,H^!E8W!& +MH^#U9*/@D)1%\.5C<4K@961P`L%`Y6-Q2N5D\.5C4;S@5/S_D)1%X%0#3__E +M8U&\[_"0BG'E9/"C=/_PJV/D_?\24L/!0*]C$GP&0E$`2ATZ0``(2!!C_ +M$@/M+_\2T>'_$M&YD``($@08+_5L\=7@]6BCX/5I\##E`%`!=%%X!3PD)1`$H=%D``( +M$@08_Y"41.`O_Y"40^`U\/X2T;GN-?#^$M'A_>XU\/SE:,,3_N5I$__3[9_L +MGD`-Y6.4!5`%T45T`_"A_9"40!*'11(#[65L<`+E\'`JY6/#E`50"M%%X-.4 +M`$`"@`?E;,.4`U`(?0:O8_%OP4#D_:]CT7'Q:\$]$M'2P3W11>3PD)1*=`+P +MJVJM8Z]IKF@2RV^.9H]G$M%)PW0!DY5GY).59E`,T5'D\'T!KV/1<8!1$M'9 +MP^5GG^5FE`!0#=%1Y/!]`:]C$K18@#?Q:]%1X`3PY660@VV3_]%1X,.?0"+1 +M4>3P$M'9$M%)=`&3+__DDS0`PQ/^[Q/_Y6/Q7^[PH^_P$M'2!6-A9B)TN25C +M]8+D-)3U@R)TK"5C]8+D-(_U@R+@D(IQ\*,B=+PE=O6"Y#20]8/@(H]NC6_O +M<4K@_51_]7#M5(#U<77P$N\2M1?U_P@`<2 +MM0OE<_#]D)$+Y7+PJV^O;@(G/72I)6[U@N0TE/6#(N5P)>`D]?6"Y#2"]8/D +MD_YT`9/_Y6XEX"1[]8+D-(_U@R)]!Z]C[3#@(G7P$N^0B43QOI")1O&^D(E( +M\;Z0B4KQOI")3!(%*.3PH_#M,.$*=?`2[_':Y/"C\.TPX@AU\!+O\<_D\!+1 +M8.!4OT2`_A+18.[P(A(%*.3PH_!U\!+O(G7P$N5CD(E"`@4H=?`2Y6.0B4`" +M!2CD_0&A?1]_;Q'CD`4GX%2_\)"%OW0$\"*0!!]T(/`B$3>0!"3@]5OD_Q*/ +M6!$J=?`.I"09]8+D-)+U@^[P$2H2E]GN\`_OM`/@(H^"=8,`$@,/)5O^[R*0 +MD\,"ATX1-Q*/6!("]E1__1*/<_Y4'Y"3QU']D)/&$H_R_E0#_.Y4,,14#Y"3 +MR1*/\OY40,03$U0#D)/(4?W_$H_S^U0($Q,35!^0D\OP^NM4!!,35#^C\.]4 +M`<0S,S-4@#&*5']/\)"3R.!4`<0S,U3`,8I4OT_PZF`"(8F0D\?@5!]1Z53@ +M3_#L5`,QBE3\3_#L5`,EX"7@,8I4\T_PD)/&X%0!Q#-4X%'I5-]/\)"3R>!4 +M`\14\#&*5,]/\23@5/OQ),"#P(+@_Y"3S.`2T`D_&`/)`-@`D&I +MD)4(X/_1&T&ID)4(X"3<]8+D-(]1]O]1XG7P$C&/$Q-4`_L-Y/]1XG7P$C&/ +M<0'[#>3_4>)U\!(QC\14`_L-Y/]1XG7P$A*U%_OD_0]1XG7P$I")/1(%*%'? +M=?`24>[$$U0!^PU_`5'B=?`24>Y4'U'@\?51]@]1XG7P"*0D`?6"Y#2"4=UU +M\`BD)`+U@N0T@E'==?`(I"0#]8+D-()1W77P"*0D!/6"Y#2"4?8/4>)U\`BD +M)`7U@N0T@E'==?`(I"0&]8+D-()1W77P"*0D!_6"Y#2"]8/@^PU1M=$4,.`" +M\=+0T)*O(N]P!'3P@!;OM`$$=/2`#N^T`@1T^(`&[[0##'3\+?6"Y#0"]8/K +M\"+U@^#[#5&UD)4(X"+_=?`2[9")/A(%*.`B]8/@^^3](O#N5(#$$Q,35`$B +M?0%_!-,0KP'#P-"0E1OM\)"%P>#^Q!,35`,PX`*!9NYQ`3#@`H%FD(7(X/YO +M<`*!9N]P`F'1)/YP`H$.)/Y@323\<`*!323\8`*!7^ZT#@,2=).0A8"0A$LWQ[V0!<%82=_Z`49"%R."T#@B1 +M:[\!`Q)TDY"%R."T!@,2?.`$I"%R."T#`L2PTY4/S#@`Q)ZBI"%R!+1;O#0T)*O(M,0KP'# +MP-`2>BGO9`%@!74/`8`DD(7!X!,3$U0?,.`%=0\"@!.0A;P2:B$2F-?_PQ,@X`*A:Y"%O.`PX&S1:75>(=%Y,.`% +M$M$K@`WDD(6]\*/P?4#_$GQ!T7!4'S#@`T->$N_$5`\PX`-#7A20A;S@Q!-4 +M!S#@`T->@/'B(.`#0UY`T0V0A;_@<`5_`1+)7M&",.`$?P2`"]&-[V`$?P&` +M`G\"$LE>@'[1"I"%O^!D!&`"P07_$LE>P060A;S@,.!MT6E#7C'1>3#@!1+1 +M*X`'?4#D_Q)\0=%P5!\PX`-#7@+OQ%0/,.`#0UX$T0W1@C#@"O%L8##D_7\" +M@!X2RL*0A<#@M`(8$GJBT8V_`0F0AU'O(M,0KP'#P-"0E1/O\-$4,.8X?XT2>U'O +M9`%P+I"5%/"0E13@_9"5$^`2FTKE@BWQ-N#[Y/]1M9"5%.`$\.##E!!`W=$4 +M,.`"\=+0T)*O(GT#?P(">_V0A;S@_Q,3$R*0A;S@$Q-4/R*0A;S@_\03$U0# +M(I`%0^!_`##G`G\!(N3U=9"%Q>!@;Q+$9W!J$L?`=74!D(6\X##@$9"%P."T +M`@/D]771C>]P`O5UY75@2)"%R.`@X@)Q")"%R>!$$/"0A<[@8`1D`7`7Y)"1 +M;O"0A<[@\1*0D6\2QB"0A<[@@!'DD)%N\/$9\1*0D6\2QB#Q&?$2D(7>\"+_ +MD(7-X"\BD(7.X'7P`Z0D_B+P=,PM]8+D-(_U@R(2!2CE@BGU@N0U@_6#(JX' +MT8V_`0[QXB#@":\&?0%Q#'\!(G\`(M&",.`*\6Q@!GT!?P)Q#/%L8`+Q]P!?U_#'$,(I"%Q>!D`7`9$K?<8`SD +M_7\,<0P2F.`":YB0A0A;S@,.`0D(6\X##@!]&-OP$$ +M@*KQC"+@_WT!80SD_7^-`GL^$GHI[W`"\8PBD(6\X,03$U0#(B&7^>0Z^@(" +M]G7P"*0D`/6"Y#2"(O&N_U0/]5[OQ%0/9`]P.Y"2"N!4_O_PY5Y4!R7@_N]4 +M\4[P$I?GQ!-4!Y"2NR#@!70&\(`#=`'P\8JO7C$#OP$%Y/W_45)_`B$`Y5YU +M\!ND)#?Y=)(U\/I[`<`"P`'E720!^>0U7(5;&_4!P!Y"%O.`PX`1_!8!D$IC7Q%0/D)(+\!*0 +M.?Q4#\14\/Z0D@K@5`].\.Q48,14#_^0DHG@5/E/\)"2"N!4\?"0!5AT`O"0 +MDK'@D)*U,.`+X%3^\%3!1`+P@`?@1`'P5,'PD)*UX%2_\)"2"N!$`?!_`U'W +M(H]?D`4BX)"3P_`2EN;O9`%P->5?4=3@_.5?$M!,KP0Q6>5?$HNPY5\2CZ94 +M!_]@`[\""^5?$I?94?#]$I62K5]_`5%2?P$BD)/#X/U[2>3_$I6'?P`BTQ"O +M`_P[60!<"[KM`$'X"0"]0Z`")"5`>`D_O4.D)3!$@3W````_Z\. +M,<-12A($]P```/^O#H`@D)3!$@3W````_Y"5`1*-I3''44H2!/<```#_D)4! +MX/\QPW\!,=+0T)*O(N3\_?Z0E,42!.M]&'P`(M,0KP'#P-"0E+_L\*/M\)"4 +MON_PHZ/@_1)[X)"4R1($ZY"4P1*'+1($IY"4R1*/7L`$P`7`!L`'D)3!$HT`/0`M`!T``2AR"0E,T2!.N0E+^CX/W`!9"4S1*'+9"-G1($ZY"4 +MON#_T`42>-W0T)*O(N3_,=*0E,$BTQ"O`T8Q48!"D)2!X&0!<#$2E8.0 +ME(+@_W7P&Z0D//6"Y#22]8/@])`$U/#O=?`;I"0]]8+D-)+U@^#TD`35\(`' +MD`34Y/"C\'\!T-"2KR+E=W7P&Z0D-_6"Y#22]8,B[W7P#J0D&?6"Y#22]8/@ +M_WX`Y/LBTQ"O`@`D`/_J/I"4D/"C[_"0!6'@_I`% +M8.`D`/_J/O[MM`@*D`58X/PO_^H^_I"4@707\)"4CW0&\)"4@^WPD)(*X/W# +M$U0'4=3@D)2$\*/O\.ZC\)"4D.#^H^"0E(?P[J/P>P%ZE'F!$H@3T-"2KR*0 +MD@K@_R#@`L%-D)*UX/X@X`*!NY"2L^#]D)*VX-.=4`*!NY`%6."0E%WP[Q*/ +MHU0'_V0"8`/O<"/NQ!,35`,@X!J0DK7@1$#QD9"47>#_D)*RX"\D_9"1;Q+& +M(!*-C!*'(,`$P`7`!L`'D`5B$HVE>!`2!-C0`]`"T`'0`!*'(,`$P`7`!L`' +MHQ*-I7@8$@38T`/0`M`!T``2AR"0E%$2!.N0!642C:71@)`%9!*-I1*'(,`$ +MP`7`!L`'D`5F$HVE>!`2!-C0`]`"T`'0`!*'(,`$P`7`!L`'HQ*-I7@8$@38 +MT`/0`M`!T``2AR#1>I"2LN#[Y/KY^)"471*-I1*&J>3[>@02AL319Q*&J9"4 +M6=%>D)19\9]0!-%0T6W14/&WT4[QP-%.\]4P?_N%%0?_B7@3_#@ +MPQ-4'V`"P4V0!2+@1$#]>UA_0!*5AY`%4.!4]_"0!6D2C:71@)`%:!*-I1*' +M(,`$P`7`!L`'D`5J$HVE>!`2!-C0`]`"T`'0`!*'(,`$P`7`!L`'HQ*-I7@8 +M$@38T`/0`M`!T``2AR"0E%'17I"461($ZY`%;1*-I=&`D`5L$HVE$H<@P`3` +M!<`&P`>0!6X2C:5X$!($V-`#T`+0`=``$H<@P`3`!<`&P`>C$HVE>!@2!-C0 +M`]`"T`'0`!*'(-%ZT6?``,`!P`+``Y"2L>##$U1__^3\_?[QIM`#T`+0`=`` +M$H:ID)11$@3KT5C19\,2!+10!-%0T6W14'@8$@3%D`5GT4YX$!($Q9`%9M%. +M>`@2!,60!6713I`%9._PT6%X&!($Q9`%8^_PT6%X$!($Q9`%8N_PT6%X"!($ +MQ9`%8>_PT6&0!6#O\)`%4.!$"/"0!2+@5+_]>UE_0!*5AW\(4?>0DK7@5,%$ +M*/!$`?`B[_"0E%4"ARWO\)"460*'+1($ZY"440*'+9"440*'.>\D`?_D/O[D +M/?WD//R0E%4"!.MX"!($V*@$J06J!JL'(I"%O.`PX!"C=`'PD(6\X/_#$S#@ +M`M&N$J:9Y/_1R6%WTQ"O`#^$Q-4/S#@'Y"4XW0>\)"4\70!\)"4Y>_P>P%ZE'GC$EX0?P02MF+0 +MT)*O(A+%BO%Z?P'1R9"2!.`PX!3Q@9"2!^!@!13P`GJ*$K%8Y/_Q)2+3$*\! +MP\#0[V0!_WQ@8`(\6L2>[\2MR\2>HJ`%_%R8`?Q:Q)[_8`% +M\6L2>[_Q>O&8$GJYT-"2KR+PD`$_=!#P_7\#(I"2!N"0`3\B?0)_`@)\J9"2 +M!N"0!7/P(GT@Y/\">[_PY)"1;O`B?0%_`@)\J1*'.=,"!+3[>@3Y^`*&Q(M; +MBER)70("]G@8$@3%D`6+(G@0$@3%D`6*(G@($@3%D`6)(G@8$@3%D`6'(G@0 +M$@3%D`6&(G@($@3%D`6%(O&N_U0!_I"2L1*Q4%3^_^Y4`4_P$H]SD)*R$H_R +MD)*S\.2C\)"2L^#_M&0%=`'P@`KOM)8&D)*S=`/PD)*SX`20DK;P(A("]O^0 +MD@/POP$'$47DD)(#\")[`7J3><-_[WX`$F0WOP$&D)/#X*/P>P%ZDWG#?^Y^ +M`!)D-[\!")"3P^"0D\7P>P%ZDWG#?^U^`!)D-[\!")"3P^"0D\;P>P%ZDWG# +M?^Q^`!)D-[\!")"3P^"0D\?P>P%ZDWG#?^M^`!)D-[\!")"3P^"0D\CPD)/$ +MX/^CX/VCX/NCX)"3S/"0D\C@D)/-\)"3SG02\)"3W'0%\)"3T#$#D)/,X)"3 +MT_"0D\W@D)/4\'L!>I-YSA)>$'\$`H@8[_"C[?"CZ_`B$@+V5`'_D)+(X%3^ +M3_`B$@+VD(9Q\"(2`O;_5`'^D)($,5!4`O_N5/U/\!*/`4D)('\"*0`!1DH`%PS/.,\[8^?_O77`"04+DD).^\)"3ON#YPY0$4#918:3_Z?U\`"__ +M[#7P_G3046F0A,T2IS#O46"D+?_L-?#^=/!1:9"$T1*G,._PD).^X`3P@,"0 +MD[W@_Y"5$5&!@`+#,]C\]%^0D[WPD)41X/]T`:@'"(`"PS/8_)`!S/"0E1'@ +M!/#@5`/PD(4>48FT"@)_`>]P`B%LY)"%'O`A;)`!P.!$`O"0E1'@1("0`(I1 +M8)`!T!(%*."0`]@6>5U$Q,35!__Y754!_YT=2]Q$:\&49.`!<,SSC/.V/G_[UU@->5UQ%3P +M)`'U@N0T@?6#X"#G`H`3Y77$5/`D`O6"Y#2!]8/@_R#G"9`!P>!$(/"`!:UU +M$IK)!76`D"*`BO6"Y#2/]8/@_2*0A;7@_W`&H^!D"6`*[Q3_D(6VX+4'!'\! +M@`)_`.]@")`!P>!$`O`BP`&0A;;@=?`/I"0?^72%-?"H`?Q]`=`!?@!_#Q(" +MT'W,?_X2>SZ0A;91B;0*`G\![V`%Y)"%MO`BTQ"O`#^=?`(D(3-$@4HX/WN=?`(I"3.^72$-?#Z>P&O!1** +MV9"%'5&)M`H"?P'O8`7DD(4=\'UH?_X2>SX20+F0A,'@1`+PT-"2KR+D]7/O +M%/5R[?_E3_[\.5<5`S +MY6XPYPF%<&X9Z7`D@"60E$?@_>5PTYU`#ZL"D)1+Z?"O<''DCVZ`"Y"41^#U +M;H`##X#'KP*0D0OE;_#D^ZUN`B<]=,PE;O6"Y#20]8,BD(D\$@4HX"+U@N0T +MD/6#(L#@P/#`@\""P-!UT`#``,`!P`+``\`$P`7`!L`'D`'$="?P=+6C\!)Q +MD.5,,.$"L=_E3##D`M%=Y4PPY0,2S,GE3##F`Q+(V.5.,.`#$JZ.Y4XPX0+1 +M<>5.,.(#$L>>Y4XPXP+Q/>5.,.0#$L&-Y4XPY0+Q<>5.,.8"\5'E3S#A`Q*G +MKN5/,.0"\>/E3S#E`G$/="<$D`'$\'2UH_#0!]`&T`70!-`#T`+0`=``T-#0 +M@M"#T/#0X#+D_Y"44>_PD`1^X/^CX)"48?#@_F]@9I"44G0#\)"48'0(\.X$ +M5`__Y/[O=?`(I"0`]8+D-(#U@^6"+A*G-N#]=%0N]8+D-)3U@^WP#NZT"-E[ +M`7J4>5(27A"0E&'@!%0/__"_#P+D\)"48>"0!'_PD)11X'\$<`*`"1*(&"(2 +M0+E_`H\-?P(2AB>0A,'@10WP(I"%O.`PX`:0A;YT`?"0A<7@<`+A&I"%W.`$ +M\!*-C!*'(,`$P`7`!L`'D`5B$HVE>!`2!-C0`]`"T`'0`!*'(,`$P`7`!L`' +MHQ*-I7@8$@38T`/0`M`!T``2AR"0A?SN\*/O\)"2R>!4_O#@PQ,PX`T2QWT2 +M47V0DLG@5/WPD(7"X!,3$U0?,.`)D`$[X##D`O$OD)48X`3PX,.4@$`+D`&8 +MX%3^\.!$`?!_`=%BD)($X##@"9`!.^`PY`+Q+R)]`G\"$GQ!?0%_`@)\01+$ +M9W`.D(7%X&`($L2`\>L2QB`BY/\2=SF_`0^0A<7@8`GQ:50'<`,2P7LBD(7) +MX%3^\"+D_Q)W.;\!$I"%Q>!@#/'<9`)@`P)W81)Y02+D]760!JG@]754P'`( +M\6E4_?`"P7OE=3#F&)"%Q>!D`7`2\=5D`F`%$G=A@`<2>4&``O%IY760A!4_?`BD(7)X$0!\)"%P^!4#R+D_P(MO>!$`O#DD)%N\)"& +M;N"0D6\BY/SM+"0`$4KD\`SLM!CS=``M$4KO\.Y4/_]T`2WU@N0T^_6#[_!T +M`BWU@N0T^_6#X%3P\'0#+?6"Y#3[]8/@1(#P=`LM]8+D-/OU@^!$$/`B]8+D +M-/OU@R*0D_/O\*,2ATZ0E1+@_@3PD``![A(#3G0`+_GD-/OZ>P'``\`"P`&0 +MD_02AT6+&XHDD`OGD.HL;]1R)'9"3]!'$]1[0`=`"T`,":B$2AT60``X"`P_3$*\!P\#0 +MD)/W$H=.?Y9^`A)F@.]@3I`!%^#^D`$6X'P`)`#_[#[^,3>0D_KO\.[_D/T1 +M\)"3^N#]D`*4\*/O\)"3]Q'$)`+_Y#/^$EJED)/ZX"08_Y"3]Q*'11)6])`" +MEG0!\-#0DJ\B[R0!_^0^_B(2`O9D`6`"(="0D^+PD)/BX/_#E!!0)^\QT7J3 +M>>$29#>_`1*0D^'@_Z/@)./U@N0TD_6#[_"0D^+@!/"`SW4;`74 +M"'L!>I-YQ1)J(9"3PW0D\)"3T70(\'4;`74>P%ZDWG4$FHAD)/2 +M="7PD)/@=`CP>P%ZDWG#$EX0>P%ZDWG2$H@3(B3>_^0S_GL!(A*@-Q("]F0! +M8`)!;N\D.6`2%&`9)`)P'^20D\GPHW0&\(`4D)/)=`;PH_"`"I"3R70,\*-T +M!/!1@?!1;T`I-YQA)D-[\!!Y"3QN#T<#]1=_"`X%&!\%%O0#.0 +MD\?@_7P`)-[_[#/^[20!_>PS_)"3R>#[P^V;_>R4`/P2CUB-@HR#$@,/_5&1 +M47?P@,DBD)/(X-.4`"*0D\?@!/"CX!0BD)/)X)"3Q_"0D\K@D)/((HY;CUR- +M7>20D\OPD``WX$2`_7\W$GL^?6E_SQ)[/N5<_7\Q$GL^Y5M4`_^0`#+@5/Q/ +M_7\R$GL^K5U_,!)[/I``,^!$@/U_,Q)[/I``,^`PYPEQ"%`%X`3P@/#D_7_/ +M$GL^D``WX%1__7\W$GL^<0A_`%`"?P$BD)/+X,.49"+DD(3!\*/PH_"C\)"2 +M`?`BD`"`X$2`_7^`$GL^$L?H$LQU$GNSYU(/\2?,V0`:#@M/T%Y/\2B#.1 +MS9``@>!$!/U_@1)[/A+`*W&.Y/\"A9Y^`'\+?0![`7J2>;T2!MZ1%O%LOP$< +MD)/[X/Y4`9"2O?#N5`20DK_PD)/[X%0(D)*^\)$6$HJ%<#20D_O@5`=P%'L! +M>I-Y_'_Z_A)D-[\!#Y"3_(`#D)/[X%0'D)+!\)"3^^!4X,035`>0DL#PD19_ +M_7X`$F0WOP$.D)/[X%0,$Q-4/Y"2PO`B>P%ZDWG[(K'Y$GOO$CP#$LKI$LV1 +ML1Z1/GX`?[-]`'L!>I)Y"0(&WK'L`@;>D```X%3[_>3_\7M$!/U_`1)[/I`! +MF'2`\*-TB/"CY/"C=(#P(A)\3I"$Q>_PD9R0`61T`?"0!"/@1(#PD``7X%3\ +M1`3]?Q<2>SZ0`#C@1$#]?S@2>SX":.(2=;82=5CQY1+`#.3U0/5!]4)U0X"M +M0']0$GL^K4%_41)[/JU"?U(2>SZM0W]3`GL^Y)"3^_"C\!+,H.]D`6`[PY"3 +M_."4B)"3^^"4$T`/D`'!X$00\)`!QW3]\(`=D)/[L?_15].0D_S@E#*0D_O@ +ME`!`Q)`!QN`PX[V0`<=T_O`B?@!_K'T`>P%ZA7G!$@;>L>P2!MZ0A<1T`O"0 +MA3PHW0"L=P2SHGD_?\25X)]#'\"$E>"?0Q_`1)7@I"$ +MQ>#_M`$(D(70=-WP@`_OD(70M`,%=-3P@`-T0/!_+!)[4>]4#_^_!0B0A?MT +M`O"`!>20A?OPD(9M=`+PHW0/\*/@5`%$*/"C=`>QW.20A=?PH_!_`1)I,Y`% +M6'0"\)`&!.!4?_"0!@K@5/CPD`4BY/"0AG'P(O"0A?O@)`20A=WPHW0*\")^ +M`'\$?0![`7J2>00BY/W_`FY?Y'7P`0('"I"5"^_PY*/PH_"0`0G@?P`PYP)_ +M`9"5"^!O8#3#D)4-X)2(D)4,X)030`B0`<#@1!#P(I"5#+'_T5?3D)4-X)0R +MD)4,X)0`0,&0`<;@,."Z(G\4?@`"?)\2S7)_"!)[4>]4[_U_"!)[/N3_T09] +M-7\G$GL^D(7"X%3O\"+3$*\!P\#0T9+17M#0DJ\BD(7"X$00\)"%T.#]?Y,2 +M>SZ0A<;@8!*0`2_@,.<%=!#P@`:0`2]TD/!_"!)[4>]$$/U_"!)[/G\!T09] +M-'\G$GL^?Y#Q@W^0$GL^?Q1^``)\GY"%R.#_8`.T"`WQ';\!"-&"D`'EX`3P +M(I"%P>`PX!F0A;S@_S#@#\,3,.`($LVSOP$&@`*``-'D(I"2!.##$R#@-9`" +MA^!@`H`(D`$`X&0_8`5U8@&`(I`"EN!@!75B$(`7D`*&X"#A`H`'D`*&X##C +M!75B!(`"@!:0`;ET"/"0`;CE8O!_`")_^7X``F0WD`&XY/!_`2(2>SZ0`0'@ +M(A)[4>]$`?TBTQ"O` +M?P$BY)"4*?"C\*/PD)0IX&0!\)"2QN!P&)"2P^!P$J/@<`Z0E"G@)&:0`<3P +M=,"C\!)\9K\!`Q);)9"%Q>!@#I"%R.#_D(7'X&]@`C%[PJ\1-;\!`Q*^_-*O +M$<<2I^P2A$V`J-,0KP'#P-"0DL/@8"5_5'X)$G!A,6_O1/[_[D0#_NU$!/WL +M,6^0D682!.M_5'X)$G$8D)*^X'`DD`?,X##@'>3PD)0P="+PD)0^=`'PD)0R +M=`/P>P%ZE'DP$H@3D)+&X/]P"I"2P^!P!*/@8!60`!_@5/#PD`'%=.KPHW3O +M\*-T_?#O8`:0`<1T!_"0DL/@8`:0`<1T`?"0DL3@8`:0`<1T`O#0T)*O(I"4 +M+!($ZY"4+`*'+9"%O."0A<Y"2#."T`0,2E!R*0A<'@_Q*C`3#@'N]4 +M?U'+,.$&X$0"\(`(X%3]\%'4!/"0A<7@8`(Q>Y`$X.`PX061V1*7<"+`X,#P +MP(/`@L#0==``P`#``<`"P`/`!,`%P`;`!Y`!Q'0A\'3"H_`2=2CE5C#@`O&+ +MY58PX0)1WN56,.(",:?E5C#E`Q*/B^57,.`"L0_E6##A`K%"Y5@PX`,2R.7E +M6##D`M&MT(020`<3P +M=,*C\-`'T`;0!=`$T`/0`M`!T`#0T-""T(/0\-#@,O"0!.#@D(7"(I`!N70! +M\)`!N"*0A<7@8`)1[!*5W`*4%W%.$U0?,.`+[\03$U0#,.`"D7F0A<&1N3#@ +M">^1KE0'<#>`,Y'`0"^19W`M$K?<<`42<-N`)!)PVY"%S^`$\.#3E`)`"7%& +MY)"%S_"``Q)Y0>20A<[P(C%[(I"%PN!4^_`BD(7"X/\3$R*19V`"@4N0A<7@ +M<`*!2Y`%8^"0DL[PD`5BX)"2S_"0!6'@D)+0\)`%8."0DM'PD8#PD(7)X%3L +M\)%P)/U0`H`.D(6\X##@!-$K@`,2MXR1<&0!<#"0!JO@D(7,\)`&J>`PY06C +MX/^`!9"%R^#_D(7+[_"CX/]P")"%R^#^_X``D(7,[_`2SJ'DD(7.\-&M<4X3 +M5!\PX%WOQ!,35`,@X"217V]P3^]@3)"%PN!$0/"QZ1*O9Q)[_1*W-I%YD(7, +MX!3P@#"0A[\2KY@2KWJ15Y"%O.##$R#@`I%7(I"%PN!$!/`BD(7+X/^CX"+D_Q)W.>]D +M`2*0A!4_?`BX/\3$U0_(I"%SN`$\)"% +MR>!4[_"0AFW@_Y"%SN#3GR*0D@G@,.`?H^##$U0'L0#@_C#@$N^Q`>Y4_A*7 +M[1*4#OU_`A*2]B+_=?`.I"05]8+D-)+U@R(2S2V0E&_O\##@!7T!Y(`"Y/W_ +M$E>"D)1OX##F$9`!+^`PYP3D\(`&D`$O=(#P\7T"47V0A;S@_S#@/Y"%P.!^ +M`+0"`GX!D(6_X'T`M`0"?0'M3G`E[\,3,.`#`JZND8N0A<#@M`P&Y/U_"(`* +MD(7`X+0$!N3]_Q*C#"+DD)1O\)"%Q>!@4Y%G<$^QZ?#QP)"4;W0!\.20A]P!)"4;_"0E&_@8!R0A"0 +ME%'PX/U4P'`%$K=I@%KM,.9!D(7%X&0"<"B0A<'@_\,3(.`)D(7)X$0!\(`< +M$K?<9`%P(I"%R>!$!/!_`1)BCH`4$K?59`)@!1)W88`($GE!@`,2MVF0E%'@ +MD(7),.<'$K?HT2"`!N!4_?`B(I"%P>!$!/`BD(7!X%3W\"*0A=&CX)`%6/`B +MK`>0DLG@^3#@`N%KD(7!X##@%I"%^^`D!)"%VO"0A?O@)`.0A=GP@`V0A=IT +M`O"0A=D4\`L+D(79X/J0A=C@TYI0#I"%S>OPD(7:X,.=+(`1P^V:*Y"%S?"0 +MA=G@_Z/@PY^0A=WPD(7:X/\D"OWD,_R0A=WQ0S +M_)"%S?%SF$`$[R0C\)"%W>#_?@"0A='N\*/O\)`%6.!O<`'D8`+1K>E4_8`# +MZ40"D)+)\"+@TYWL9(#X=(`BD(77X/^CX/V0A=[@^R*0D@K@,.`+D)*TX&`% +M?P<2JO!P!.\PX`J0A#_<`2CX&#EPJ_O +M,.`/D(3!X%3^\.3_$BV]$IM7$4LPX094_?`28%T12S#B!E3[\!)J;=*O@,;2 +MK\*OD(3!X/\B,L#@P/#`@\""P-!UT`#``,`!P`+``\`$P`7`!L`'D`'$=%;P +M=,BC\!)LO'16!)`!Q/!TR*/PT`?0!M`%T`30`]`"T`'0`-#0T(+0@]#PT.`R +M,L#@P(/`@L#0==``P`7`!WVGD`'$[?!TR/^C\.T$D`'$\*/O\-`'T`70T-"" +MT(/0X#*0A;S@,.`%Y*/PH_`BD(6\X/\PX#^0A<#@?@"T`@)^`9"%O^!]`+0$ +M`GT![4YP)>_#$S#@`P*NKA*G5I"%P."T"`;D_7\,@`F0A<#@<`;]?P02HPPB +MTQ"O`P!Z`'D` +MD(D;$H=.>_]Z@GD`D(D>$H=.>H)Y/Y")(1*'3GJ">>&0B2<2ATYZ@GGUD(DJ +M$H=.>H-Y'9")+1*'3GJ#>3&0B3,2ATYZ@WE9D(DV$H=.>H-Y@9").1*'3N20 +ME*CPD)27\)"3^_"0D_O@_\.4!5`0=+DO$IY)Y/"0D_O@!/"`YB*0E$;N\*/O +M\*/M\.MU\`:D_Y")(1*'1>DO^>HU\/J0E$X2ATZ0E$C@$I]?X/^CX)"42\_P +MH^_PY*/PD)1.$H=%D)1-X/_U@G6#`!(##_U\`)"42.!U\!*0B402!2AU\`+O +M$@4HX/ZCX/^0E$K@^^^H`PB`!<[#$\X3V/F15NZ/\!('"I"43>`$\."T!:V0 +ME$X2AT42E_;]?`"0E$K@_Y"41N#^H^"H!PB`!<[#$\X3V/F15N#\H^#]TY_L +MGD`([9__[)[^@`1^`'\`D)1+[O"C[_"0E$O@_J/@_Y"42.`2GU_N\*/O\"+_ +M$@-PD)1+(A*76N`@X`C#$S#@"@*7[A*76N!$!/`BD`&4X$0!\)`!Q^3P(I`! +MFN!4P$0+\'\*?@`2?)^0`9C@5,!_`+1``G\!(I`!F.3PH_"C=!'PH^3P?PK^ +M$GR?D`&9X%0P_V008`3OM"`#?P$B?P`BD`'/X)"44?#@_S#@!Y`!S^!4_O#O +M,.4CD`'/X%3?\)`!-'0@\.3UJ/7H$G6VD``#X%3[_7\#$GL^@/XBTQ"O`^T`0WKM`(##8`&Z[0!`GT"KP;OQ%3P3?_0T)*O(N20E''PH_!_@Q)[ +M49"4<._P?X,2>U&N!Y"4<.#_M08!(L.0E'+@E&20E''@E`!`#9`!P.!$0/"0 +ME'#@_R*0E'$2O?^`PI`!Q'1R\'3-H_!_D!)[4>\@X/=T<@20`<3P=,VC\")^ +M`'\!?0![`7J%>;P2!MZ0A;S@5/WPY*/PH_"C\*-T#/`BD(6_X&0"?P%@`G\` +M(I"5#A*'3A)Q5)"%Q>#_$F#0D(7%X&`9D)4.$H=%$H]S5`__$H_S_1)JN!+' +M?1)1?2+3$*\!P\#0$GHI[V0!8`5U$`&`<9"%R>#_5`-@!740`H!CD(7'X/[D +MPYY0!740!(!4[S#B!740"(!+D(7)X##D!740$(`_D(7"X!,35#\@X`5U$""` +M+Y"&<>!@!740@(`DD`9BX##A!740$8`8D`9BX##@#.!4_/^_@`5U$!*`!1*_ +M"0DM(PX!`2T,B0A?O@ +M)`0O_Y"3`X`&$M#(D),$X/[#[YZ0E%+PD)12X/_#E"U0%G36+Q+01.`$\)"% +MV^`$\.#]?_X2>SZ0A=O@_].0DP;@GY"3!>"4`$`"X><2T9,2T:=0'A+0Y?^0 +ME%/@TY]`"I"44>"0E%3P@`B0E%'@!/"`W1+1DQ+1IU`N$M#E_\.0DP;@G_^0 +MDP7@E`#^D)13X-.?Y)Y`"I"44>"0E%7P@`B0E%'@!/"`S9"45."0A>#PD)15 +MX)"%X1+1PI0*0`KO)/:0A=CPY(`*Y)"%V!+1PG0*GY"%U_"0A>#@_Z/@PY^0 +MA=[PD(7!X##@!9"3`X`#D),$X/^0A=[@+P3PD(7>X,.4"E`#=`KPD(7>X"0" +M\!+'?1)1?>3_$FDS(A+$S4`OD(7?X`3PD),(X/^0A=_@TY]0')"%U^`$\!*G +M&1*G$I"%WO#[D(77X/^CX/T247TBY/YTUBX11.3P#NZT+?3DD(7<\)"%V_"0 +MA=_P[[0!!Z-T+?#DH_`B]8+D-)+U@R)U\!ND)#CU@N0TDO6#X/Y4`_WN$Q-4 +M!_N0D@K@_L14#Y"5!/`BD)3RH^#_D)4`=`/P>P9]`1*9-I"4]N[P_*/O\/V0 +ME/7@_W00+?6"Y#3\]8/O\)"4].#_`F5AD)(*X/_#$_[O5/'_[@14!R7@3_"C +MX/^0D@K@_L,35``H2!,60A=W@_L-T"IXO_R)TUB_U +M@N0TDO6#X/^0E%/@+_"0DP?@(I"4E.[P_*/O\/V0E)+@_Q)E89"2"N`B=?`. +MI"0/]8+D-)(BD`6$[_!](.3_`GO]D`$T=$#P_>3_$GRI0UX((N!4`Y"1"_![ +M`:]V`B<]Y64EX"3U]8+D-(+U@R+DD)%N\*-T`R+OQ%3P)`/U@N0T@?6#(N"0 +M`;KPD(7'X)`!NR(2!2C@_*/@]8*,@R)TO"5C]8+D-(_U@R+DD)13\)"44?`B +MD)3\X/^0E/K@(I"44>#_PY0M(I`%(N"0E'WP(I``!A($&"__(O"0A>#@_\,B +M)>`EX/[O3B)]`:]C`F7"Y660@QV3_R*0``02!!@O(I"5!^#_?4@B_Q("]OY4 +%#R(`:2H` +` +end diff --git a/sys/dev/rtwn/if_rtwn.c b/sys/dev/rtwn/if_rtwn.c index c5889937fb08..aa17b9695f81 100644 --- a/sys/dev/rtwn/if_rtwn.c +++ b/sys/dev/rtwn/if_rtwn.c @@ -1520,6 +1520,8 @@ rtwn_dma_init(struct rtwn_softc *sc) if (error != 0) return (error); + rtwn_enable_mac_txrx(sc); + /* Set the number of pages for each queue. */ RTWN_DPRINTF(sc, RTWN_DEBUG_RESET, "%s: pages per queue: high %d, normal %d, low %d, public %d\n", @@ -1903,7 +1905,7 @@ rtwn_init_beacon_reg(struct rtwn_softc *sc) rtwn_write_1(sc, R92C_BCN_CTRL(0), R92C_BCN_CTRL_DIS_TSF_UDT0); rtwn_write_1(sc, R92C_BCN_CTRL(1), R92C_BCN_CTRL_DIS_TSF_UDT0); rtwn_write_2(sc, R92C_TBTT_PROHIBIT, 0x6404); - rtwn_write_1(sc, R92C_DRVERLYINT, 0x05); + rtwn_init_beacon_timer(sc); rtwn_write_1(sc, R92C_BCNDMATIM, 0x02); rtwn_write_2(sc, R92C_BCNTCFG, 0x660f); } diff --git a/sys/dev/rtwn/if_rtwnvar.h b/sys/dev/rtwn/if_rtwnvar.h index 54a74d898e00..a8793de853c9 100644 --- a/sys/dev/rtwn/if_rtwnvar.h +++ b/sys/dev/rtwn/if_rtwnvar.h @@ -308,6 +308,7 @@ struct rtwn_softc { void (*sc_fw_download_enable)(struct rtwn_softc *, int); #endif int (*sc_llt_init)(struct rtwn_softc *); + void (*sc_enable_mac_txrx)(struct rtwn_softc *); int (*sc_set_page_size)(struct rtwn_softc *); void (*sc_lc_calib)(struct rtwn_softc *); void (*sc_iq_calib)(struct rtwn_softc *); @@ -362,6 +363,7 @@ struct rtwn_softc { uint8_t (*sc_temp_read)(struct rtwn_softc *); void (*sc_init_tx_agg)(struct rtwn_softc *); void (*sc_init_rx_agg)(struct rtwn_softc *); + void (*sc_init_beacon_timer)(struct rtwn_softc *); void (*sc_init_intr)(struct rtwn_softc *); void (*sc_init_ampdu)(struct rtwn_softc *); void (*sc_init_edca)(struct rtwn_softc *); @@ -515,6 +517,8 @@ void rtwn_attach_vht_cap_info_mcs(struct rtwn_softc *); #endif #define rtwn_llt_init(_sc) \ (((_sc)->sc_llt_init)((_sc))) +#define rtwn_enable_mac_txrx(_sc) \ + (((_sc)->sc_enable_mac_txrx)((_sc))) #define rtwn_set_page_size(_sc) \ (((_sc)->sc_set_page_size)((_sc))) #define rtwn_lc_calib(_sc) \ @@ -587,6 +591,8 @@ void rtwn_attach_vht_cap_info_mcs(struct rtwn_softc *); (((_sc)->sc_init_tx_agg)((_sc))) #define rtwn_init_rx_agg(_sc) \ (((_sc)->sc_init_rx_agg)((_sc))) +#define rtwn_init_beacon_timer(_sc) \ + (((_sc)->sc_init_beacon_timer)((_sc))) #define rtwn_init_intr(_sc) \ (((_sc)->sc_init_intr)((_sc))) #define rtwn_init_ampdu(_sc) \ diff --git a/sys/dev/rtwn/rtl8188e/pci/r88ee_attach.c b/sys/dev/rtwn/rtl8188e/pci/r88ee_attach.c index 75f59b27d470..e92fdb664cd0 100644 --- a/sys/dev/rtwn/rtl8188e/pci/r88ee_attach.c +++ b/sys/dev/rtwn/rtl8188e/pci/r88ee_attach.c @@ -162,6 +162,7 @@ r88ee_attach(struct rtwn_pci_softc *pc) sc->sc_fw_download_enable = r88e_fw_download_enable; #endif sc->sc_llt_init = r92c_llt_init; + sc->sc_enable_mac_txrx = rtwn_nop_softc; sc->sc_set_page_size = r92c_set_page_size; sc->sc_lc_calib = r92c_lc_calib; sc->sc_iq_calib = r88e_iq_calib; @@ -185,6 +186,7 @@ r88ee_attach(struct rtwn_pci_softc *pc) sc->sc_temp_read = r88e_temp_read; sc->sc_init_tx_agg = rtwn_nop_softc; sc->sc_init_rx_agg = rtwn_nop_softc; + sc->sc_init_beacon_timer = r92c_init_beacon_timer; sc->sc_init_ampdu = r92ce_init_ampdu; sc->sc_init_intr = r88ee_init_intr; sc->sc_init_edca = r92ce_init_edca; diff --git a/sys/dev/rtwn/rtl8188e/usb/r88eu_attach.c b/sys/dev/rtwn/rtl8188e/usb/r88eu_attach.c index a0ead28037c2..266e20521772 100644 --- a/sys/dev/rtwn/rtl8188e/usb/r88eu_attach.c +++ b/sys/dev/rtwn/rtl8188e/usb/r88eu_attach.c @@ -155,6 +155,7 @@ r88eu_attach(struct rtwn_usb_softc *uc) sc->sc_fw_download_enable = r88e_fw_download_enable; #endif sc->sc_llt_init = r92c_llt_init; + sc->sc_enable_mac_txrx = rtwn_nop_softc; sc->sc_set_page_size = r92c_set_page_size; sc->sc_lc_calib = r92c_lc_calib; sc->sc_iq_calib = r88e_iq_calib; @@ -178,6 +179,7 @@ r88eu_attach(struct rtwn_usb_softc *uc) sc->sc_temp_read = r88e_temp_read; sc->sc_init_tx_agg = r92cu_init_tx_agg; sc->sc_init_rx_agg = r88eu_init_rx_agg; + sc->sc_init_beacon_timer = r92c_init_beacon_timer; sc->sc_init_ampdu = rtwn_nop_softc; sc->sc_init_intr = r88eu_init_intr; sc->sc_init_edca = r92c_init_edca; diff --git a/sys/dev/rtwn/rtl8188f/r88f.h b/sys/dev/rtwn/rtl8188f/r88f.h new file mode 100644 index 000000000000..b3160c208aa2 --- /dev/null +++ b/sys/dev/rtwn/rtl8188f/r88f.h @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2026 Mir Saheb Ali + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#ifndef RTL8188F_H +#define RTL8188F_H + +#include + +/* + * Global Definitions. + */ +#define R88F_HQ_NPAGES 12 +#define R88F_LQ_NPAGES 2 +#define R88F_NQ_NPAGES 2 +#define R88F_TXPKTBUF_COUNT 177 +#define R88F_TX_PAGE_COUNT 247 +#define R88F_RX_DMA_BUFFER_SIZE 0x3f80 +#define R88F_MAX_FW_SIZE 21020 +#define R88F_RTWN_POWER_COUNT 28 + +/* + * Function declarations. + */ + +/* r88f_rom.c */ +int r88f_efuse_preread(struct rtwn_softc *); +void r88f_parse_rom(struct rtwn_softc *, uint8_t *); + +/* r88f_rx.c */ +int8_t r88f_get_rssi_cck(struct rtwn_softc *, void *); +int8_t r88f_get_rssi_ofdm(struct rtwn_softc *, void *); +void r88f_get_rx_stats(struct rtwn_softc *, struct ieee80211_rx_stats *, + const void *, const void *); + +/* r88f_init.c */ +int r88f_set_page_size(struct rtwn_softc *); +void r88f_init_ampdu(struct rtwn_softc *); +int r88f_llt_init(struct rtwn_softc *); +void r88f_init_rf(struct rtwn_softc *); + +/* r88f_calib.c */ +void r88f_lc_calib(struct rtwn_softc *); +void r88f_iq_calib(struct rtwn_softc *); + +/* r88f_chan.c */ +void r88f_set_chan(struct rtwn_softc *, struct ieee80211_channel *); +void r88f_get_txpower(struct rtwn_softc *, int, struct ieee80211_channel *, + uint8_t[RTWN_RIDX_COUNT]); + +/* r88f_fw.c */ +void r88f_fw_reset(struct rtwn_softc *, int); +void r88f_fw_download_enable(struct rtwn_softc *, int); + +#endif /* RTL8188F_H */ diff --git a/sys/dev/rtwn/rtl8188f/r88f_calib.c b/sys/dev/rtwn/rtl8188f/r88f_calib.c new file mode 100644 index 000000000000..75cf97763bdf --- /dev/null +++ b/sys/dev/rtwn/rtl8188f/r88f_calib.c @@ -0,0 +1,728 @@ +/* + * Copyright (c) 2026 Mir Saheb Ali + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include "opt_wlan.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include + +#include +#include + +#include + +#include +#include + +#include + +#include + +#include +#include + +#define OFDM_LSTF_MASK 0x70000000 + +void +r88f_lc_calib(struct rtwn_softc *sc) +{ + uint32_t reg; + uint32_t rf_amode, lstf; + int i; + + /* Check continuous TX and Packet TX */ + lstf = rtwn_bb_read(sc, R92C_OFDM1_LSTF); + + if (lstf & OFDM_LSTF_MASK) { + /* Disable all continuous TX */ + reg = lstf & ~OFDM_LSTF_MASK; + rtwn_bb_write(sc, R92C_OFDM1_LSTF, reg); + } else { + /* Deal with Packet TX case */ + /* block all queues */ + rtwn_write_1(sc, R92C_TXPAUSE, 0xff); + } + + /* Read original RF mode Path A */ + rf_amode = rtwn_rf_read(sc, 0, R92C_RF_CHNLBW); + + /* Start LC calibration */ + rtwn_rf_write(sc, 0, R92C_RF_CHNLBW, rf_amode | 0x08000); + + for (i = 0; i < 100; i++) { + if ((rtwn_rf_read(sc, 0, R92C_RF_CHNLBW) & 0x08000) == 0) + break; + rtwn_delay(sc, 10); + } + + if (i == 100) + device_printf(sc->sc_dev, "LC calibration timed out.\n"); + + rtwn_rf_write(sc, 0, R92C_RF_CHNLBW, rf_amode); + + /* Restore original parameters */ + if (lstf & OFDM_LSTF_MASK) + rtwn_bb_write(sc, R92C_OFDM1_LSTF, lstf); + else /* Deal with Packet TX case */ + rtwn_write_1(sc, R92C_TXPAUSE, 0x00); +} + +#define R88F_ADDA_REGS 16 +#define R88F_MAC_REGS 4 +#define R88F_BB_REGS 9 + +struct r88f_iqk_calib_regs { + uint32_t adda_regs[R88F_ADDA_REGS]; + uint32_t mac_regs[R88F_MAC_REGS]; + uint32_t bb_regs[R88F_BB_REGS]; + uint32_t hssi_param1; +}; + +struct r88f_iqk_result { + uint32_t before; + uint32_t after; +}; + +static const uint32_t iqk_adda_regs[R88F_ADDA_REGS] = { + R88F_FPGA0_XCD_SWITCH_CTRL, R88F_BLUETOOTH, + R88F_RX_WAIT_CCA, R88F_TX_CCK_RFON, + R88F_TX_CCK_BBON, R88F_TX_OFDM_RFON, + R88F_TX_OFDM_BBON, R88F_TX_TO_RX, + R88F_TX_TO_TX, R88F_RX_CCK, + R88F_RX_OFDM, R88F_RX_WAIT_RIFS, + R88F_RX_TO_RX, R88F_STANDBY, + R88F_SLEEP, R88F_PMPD_ANAEN +}; +static const uint32_t iqk_mac_regs[R88F_MAC_REGS] = { + R92C_TXPAUSE, R92C_BCN_CTRL(0), + R92C_BCN_CTRL(1), R92C_GPIO_MUXCFG +}; +static const uint32_t iqk_bb_regs[R88F_BB_REGS] = { + R92C_OFDM0_TRXPATHENA, R92C_OFDM0_TRMUXPAR, + R88F_FPGA0_XCD_RF_SW_CTRL, R92C_CONFIG_ANT(0), R92C_CONFIG_ANT(1), + R92C_FPGA0_RFIFACESW(0), R92C_FPGA0_RFIFACEOE(0), + R92C_FPGA0_RFIFACEOE(1), R92C_FPGA0_RFMOD +}; + +static void +r88f_iqk_save_regs(struct rtwn_softc *sc, struct r88f_iqk_calib_regs *backup) +{ + int i; + + for (i = 0; i < R88F_ADDA_REGS; i++) + backup->adda_regs[i] = rtwn_bb_read(sc, iqk_adda_regs[i]); + + for (i = 0; i < R88F_MAC_REGS - 1; i++) + backup->mac_regs[i] = rtwn_read_1(sc, iqk_mac_regs[i]); + + backup->mac_regs[i] = rtwn_bb_read(sc, iqk_mac_regs[i]); + + for (i = 0; i < R88F_BB_REGS; i++) + backup->bb_regs[i] = rtwn_bb_read(sc, iqk_bb_regs[i]); +} + +static void +r88f_iqk_restore_regs(struct rtwn_softc *sc, + const struct r88f_iqk_calib_regs *backup) +{ + int i; + + for (i = 0; i < R88F_ADDA_REGS; i++) + rtwn_bb_write(sc, iqk_adda_regs[i], backup->adda_regs[i]); + + for (i = 0; i < R88F_MAC_REGS - 1; i++) + rtwn_write_1(sc, iqk_mac_regs[i], backup->mac_regs[i]); + + rtwn_bb_write(sc, iqk_mac_regs[i], backup->mac_regs[i]); + + for (i = 0; i < R88F_BB_REGS; i++) + rtwn_bb_write(sc, iqk_bb_regs[i], backup->bb_regs[i]); +} + +static void +r88f_path_adda_on(struct rtwn_softc *sc) +{ + int i; + + rtwn_bb_write(sc, iqk_adda_regs[0], 0x03c00014); + + for (i = 1; i < R88F_ADDA_REGS; i++) + rtwn_bb_write(sc, iqk_adda_regs[i], 0x03c00014); +} + +static void +r88f_fill_iqk_matrix_a(struct rtwn_softc *sc, + const struct r88f_iqk_result *tx_result, + const struct r88f_iqk_result *rx_result, + bool tx_only) +{ + uint32_t oldval, x, tx0_a, result_reg; *** 2908 LINES SKIPPED ***