FreeBSD Bugzilla – Attachment 253303 Details for
Bug 247528
rtwn(4) RTL8192EU usb wifi dongle can't connect to AP
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Reformated RTL8192EU patch.
0001-rtwn-Fix-RTL8192EU-cannot-associate-in-STA-mode.patch (text/plain), 8.53 KB, created by
Cy Schubert
on 2024-09-03 20:00:32 UTC
(
hide
)
Description:
Reformated RTL8192EU patch.
Filename:
MIME Type:
Creator:
Cy Schubert
Created:
2024-09-03 20:00:32 UTC
Size:
8.53 KB
patch
obsolete
>From 0982eed29bdb8d20b3d3a9f851bae0ead90fad2f Mon Sep 17 00:00:00 2001 >From: Cy Schubert <cy@FreeBSD.org> >Date: Mon, 9 Jan 2023 12:54:00 -0800 >Subject: [PATCH 1/2] rtwn: Fix RTL8192EU cannot associate in STA mode > >On some systems RTL8192EU will fail to associate in STA mode while >others it will work fine. On the systems RTL8192EU fails to associate >in STA mode, it works perfectly fine in AP mode. This points to a USB >timing issue when selecting a channel while in STA mode. > >While here fix RTL8192EU power off and power on hang for the same reason. > >PR: 247528 >Reported by: Mc James <realmcjames@protonmail.ch>, many >Reviewed by: >Tested by: titus@edc.ro >Approved by: >Concept by: titus@edc.ro >MFC after: >Relnotes: >Differential Revision: >--- > sys/dev/rtwn/rtl8192c/r92c_chan.c | 8 ++++++ > sys/dev/rtwn/rtl8192e/r92e_chan.c | 6 +++++ > sys/dev/rtwn/rtl8192e/r92e_init.c | 31 ++++++++++++++++++++++-- > sys/dev/rtwn/rtl8192e/r92e_reg.h | 1 + > sys/dev/rtwn/rtl8192e/usb/r92eu_attach.c | 1 + > sys/dev/rtwn/usb/rtwn_usb_attach.c | 5 ++++ > sys/dev/rtwn/usb/rtwn_usb_reg.c | 4 +++ > sys/dev/rtwn/usb/rtwn_usb_var.h | 3 +++ > 8 files changed, 57 insertions(+), 2 deletions(-) > >diff --git a/sys/dev/rtwn/rtl8192c/r92c_chan.c b/sys/dev/rtwn/rtl8192c/r92c_chan.c >index 0edb32a97b4d..68ce5f080cea 100644 >--- a/sys/dev/rtwn/rtl8192c/r92c_chan.c >+++ b/sys/dev/rtwn/rtl8192c/r92c_chan.c >@@ -52,6 +52,7 @@ > #include <dev/rtwn/rtl8192c/r92c_priv.h> > #include <dev/rtwn/rtl8192c/r92c_reg.h> > #include <dev/rtwn/rtl8192c/r92c_var.h> >+#include <dev/rtwn/usb/rtwn_usb_var.h> > > static int > r92c_get_power_group(struct rtwn_softc *sc, struct ieee80211_channel *c) >@@ -291,9 +292,13 @@ void > r92c_set_chan(struct rtwn_softc *sc, struct ieee80211_channel *c) > { > struct r92c_softc *rs = sc->sc_priv; >+ struct rtwn_usb_softc *uc; > u_int chan; > int i; > >+ if ((uc = RTWN_USB_SOFTC(sc)) != NULL) >+ uc->uc_write_delay = 1; >+ > chan = rtwn_chan2centieee(c); > > /* Set Tx power for this new channel. */ >@@ -307,6 +312,9 @@ r92c_set_chan(struct rtwn_softc *sc, struct ieee80211_channel *c) > r92c_set_bw40(sc, chan, IEEE80211_IS_CHAN_HT40U(c)); > else > rtwn_r92c_set_bw20(sc, chan); >+ >+ if (uc != NULL) >+ uc->uc_write_delay = 0; > } > > void >diff --git a/sys/dev/rtwn/rtl8192e/r92e_chan.c b/sys/dev/rtwn/rtl8192e/r92e_chan.c >index b28462873c09..129880c2e815 100644 >--- a/sys/dev/rtwn/rtl8192e/r92e_chan.c >+++ b/sys/dev/rtwn/rtl8192e/r92e_chan.c >@@ -60,6 +60,7 @@ > #include <dev/rtwn/rtl8192e/r92e.h> > #include <dev/rtwn/rtl8192e/r92e_reg.h> > #include <dev/rtwn/rtl8192e/r92e_var.h> >+#include <dev/rtwn/usb/rtwn_usb_var.h> > > static int > r92e_get_power_group(struct rtwn_softc *sc, struct ieee80211_channel *c) >@@ -210,9 +211,12 @@ void > r92e_set_chan(struct rtwn_softc *sc, struct ieee80211_channel *c) > { > struct r92e_softc *rs = sc->sc_priv; >+ struct rtwn_usb_softc *uc; > u_int chan; > int i; > >+ if ((uc = RTWN_USB_SOFTC(sc)) != NULL) >+ uc->uc_write_delay = 1; > chan = rtwn_chan2centieee(c); > > for (i = 0; i < sc->nrxchains; i++) { >@@ -227,4 +231,6 @@ r92e_set_chan(struct rtwn_softc *sc, struct ieee80211_channel *c) > > /* Set Tx power for this new channel. */ > r92e_set_txpower(sc, c); >+ if (uc != NULL) >+ uc->uc_write_delay = 0; > } >diff --git a/sys/dev/rtwn/rtl8192e/r92e_init.c b/sys/dev/rtwn/rtl8192e/r92e_init.c >index 925221bdabb1..11c51df63ade 100644 >--- a/sys/dev/rtwn/rtl8192e/r92e_init.c >+++ b/sys/dev/rtwn/rtl8192e/r92e_init.c >@@ -53,6 +53,8 @@ > > #include <dev/rtwn/if_rtwn_debug.h> > >+#include <dev/rtwn/usb/rtwn_usb_var.h> >+ > #include <dev/rtwn/rtl8192c/r92c.h> > > #include <dev/rtwn/rtl8192e/r92e.h> >@@ -224,8 +226,12 @@ r92e_power_on(struct rtwn_softc *sc) > if (res != 0) \ > return (EIO); \ > } while(0) >+ struct rtwn_usb_softc *uc; > int ntries; > >+ if ((uc = RTWN_USB_SOFTC(sc)) != NULL) >+ uc->uc_write_delay = 1; >+ > if (rtwn_read_4(sc, R92C_SYS_CFG) & R92C_SYS_CFG_TRP_BT_EN) > RTWN_CHK(rtwn_write_1(sc, R92C_LDO_SWR_CTRL, 0xc3)); > else { >@@ -252,6 +258,8 @@ r92e_power_on(struct rtwn_softc *sc) > rtwn_delay(sc, 10); > } > if (ntries == 5000) { >+ if (uc != NULL) >+ uc->uc_write_delay = 0; > device_printf(sc->sc_dev, > "timeout waiting for chip power up\n"); > return (ETIMEDOUT); >@@ -269,8 +277,11 @@ r92e_power_on(struct rtwn_softc *sc) > break; > rtwn_delay(sc, 10); > } >- if (ntries == 5000) >+ if (ntries == 5000) { >+ if (uc != NULL) >+ uc->uc_write_delay = 0; > return (ETIMEDOUT); >+ } > > /* Enable MAC DMA/WMAC/SCHEDULE/SEC blocks. */ > RTWN_CHK(rtwn_write_2(sc, R92C_CR, 0)); >@@ -281,18 +292,27 @@ r92e_power_on(struct rtwn_softc *sc) > ((sc->sc_hwcrypto != RTWN_CRYPTO_SW) ? R92C_CR_ENSEC : 0) | > R92C_CR_CALTMR_EN)); > >+ if (uc != NULL) >+ uc->uc_write_delay = 0; > return (0); > } > > void > r92e_power_off(struct rtwn_softc *sc) > { >+ struct rtwn_usb_softc *uc; > int error, ntries; > >+ if ((uc = RTWN_USB_SOFTC(sc)) != NULL) >+ uc->uc_write_delay = 1; >+ > /* Stop Rx. */ > error = rtwn_write_1(sc, R92C_CR, 0); >- if (error == ENXIO) /* hardware gone */ >+ if (error == ENXIO) { /* hardware gone */ >+ if (uc != NULL) >+ uc->uc_write_delay = 0; > return; >+ } > > /* Move card to Low Power state. */ > /* Block all Tx queues. */ >@@ -306,6 +326,8 @@ r92e_power_off(struct rtwn_softc *sc) > rtwn_delay(sc, 10); > } > if (ntries == 5000) { >+ if (uc != NULL) >+ uc->uc_write_delay = 0; > device_printf(sc->sc_dev, "%s: failed to block Tx queues\n", > __func__); > return; >@@ -363,6 +385,8 @@ r92e_power_off(struct rtwn_softc *sc) > rtwn_delay(sc, 10); > } > if (ntries == 5000) { >+ if (uc != NULL) >+ uc->uc_write_delay = 0; > device_printf(sc->sc_dev, "%s: could not turn off MAC\n", > __func__); > return; >@@ -385,4 +409,7 @@ r92e_power_off(struct rtwn_softc *sc) > /* Enable SW LPS. */ > rtwn_setbits_1_shift(sc, R92C_APS_FSMCO, 0, > R92C_APS_FSMCO_APFM_RSM, 1); >+ >+ if (uc != NULL) >+ uc->uc_write_delay = 0; > } >diff --git a/sys/dev/rtwn/rtl8192e/r92e_reg.h b/sys/dev/rtwn/rtl8192e/r92e_reg.h >index 5106bcf9d5f0..edcc2fcb2d57 100644 >--- a/sys/dev/rtwn/rtl8192e/r92e_reg.h >+++ b/sys/dev/rtwn/rtl8192e/r92e_reg.h >@@ -41,5 +41,6 @@ > /* Bits for R92E_AFE_XTAL_CTRL. */ > #define R92E_AFE_XTAL_CTRL_ADDR_M 0x00fff000 > #define R92E_AFE_XTAL_CTRL_ADDR_S 12 >+#define R92E_USB_DELAY_US_DEF 1000 > > #endif /* R92E_REG_H */ >diff --git a/sys/dev/rtwn/rtl8192e/usb/r92eu_attach.c b/sys/dev/rtwn/rtl8192e/usb/r92eu_attach.c >index a0a93925358c..60050879623b 100644 >--- a/sys/dev/rtwn/rtl8192e/usb/r92eu_attach.c >+++ b/sys/dev/rtwn/rtl8192e/usb/r92eu_attach.c >@@ -100,6 +100,7 @@ r92eu_attach(struct rtwn_usb_softc *uc) > /* USB part. */ > uc->uc_align_rx = r12au_align_rx; > uc->tx_agg_desc_num = 3; >+ uc->uc_delay_us = R92E_USB_DELAY_US_DEF; > > /* Common part. */ > sc->sc_flags = RTWN_FLAG_EXT_HDR; >diff --git a/sys/dev/rtwn/usb/rtwn_usb_attach.c b/sys/dev/rtwn/usb/rtwn_usb_attach.c >index 71798ffc14f9..88a01cf89efb 100644 >--- a/sys/dev/rtwn/usb/rtwn_usb_attach.c >+++ b/sys/dev/rtwn/usb/rtwn_usb_attach.c >@@ -369,6 +369,11 @@ rtwn_usb_sysctlattach(struct rtwn_softc *sc) > uc->uc_rx_buf_size = RTWN_USB_RXBUFSZ_MIN; > if (uc->uc_rx_buf_size > RTWN_USB_RXBUFSZ_MAX) > uc->uc_rx_buf_size = RTWN_USB_RXBUFSZ_MAX; >+ >+ uc->uc_delay_us = RTWN_USB_DELAY_US_DEF; >+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(tree), OID_AUTO, >+ "delay_us", CTLFLAG_RWTUN, &uc->uc_delay_us, >+ uc->uc_delay_us, "RTWN USB set channel delay microseconds"); > } > > static int >diff --git a/sys/dev/rtwn/usb/rtwn_usb_reg.c b/sys/dev/rtwn/usb/rtwn_usb_reg.c >index 5a992379e248..ba178b1265c4 100644 >--- a/sys/dev/rtwn/usb/rtwn_usb_reg.c >+++ b/sys/dev/rtwn/usb/rtwn_usb_reg.c >@@ -88,12 +88,16 @@ rtwn_usb_write_region_1(struct rtwn_softc *sc, uint16_t addr, uint8_t *buf, > int len) > { > usb_device_request_t req; >+ struct rtwn_usb_softc *uc; > > req.bmRequestType = UT_WRITE_VENDOR_DEVICE; > req.bRequest = R92C_REQ_REGS; > USETW(req.wValue, addr); > USETW(req.wIndex, 0); > USETW(req.wLength, len); >+ uc = RTWN_USB_SOFTC(sc); >+ if (uc->uc_write_delay == 1) >+ (sc->sc_delay)(sc,uc->uc_delay_us); > return (rtwn_do_request(sc, &req, buf)); > } > >diff --git a/sys/dev/rtwn/usb/rtwn_usb_var.h b/sys/dev/rtwn/usb/rtwn_usb_var.h >index bad697bfa1db..9afb183d0d06 100644 >--- a/sys/dev/rtwn/usb/rtwn_usb_var.h >+++ b/sys/dev/rtwn/usb/rtwn_usb_var.h >@@ -27,6 +27,7 @@ > #define RTWN_USB_RXBUFSZ_DEF (24) > #define RTWN_USB_RXBUFSZ_MAX (64) > #define RTWN_USB_TXBUFSZ (16 * 1024) >+#define RTWN_USB_DELAY_US_DEF 0 > > #define RTWN_IFACE_INDEX 0 > >@@ -78,6 +79,8 @@ struct rtwn_usb_softc { > > int ntx; > int tx_agg_desc_num; >+ int uc_delay_us; >+ int uc_write_delay; > }; > #define RTWN_USB_SOFTC(sc) ((struct rtwn_usb_softc *)(sc)) > >-- >2.46.0 >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 247528
:
239366
|
239399
|
239429
|
239455
|
240612
|
253233
|
253264
|
253301
| 253303 |
253304