Date: Thu, 10 May 2012 19:17:24 +0200 From: Bernhard Schmidt <bschmidt@freebsd.org> To: Warren Block <wblock@wonkity.com> Cc: wireless@freebsd.org Subject: Re: Realtek RTL8187B no longer working on 9-stable Message-ID: <CAAgh0_bu56J_UE=usfOeLtMTiR30=beSQ4QhwqkXKY_FY4y3Eg@mail.gmail.com> In-Reply-To: <alpine.BSF.2.00.1205092030350.14584@wonkity.com> References: <alpine.BSF.2.00.1205092030350.14584@wonkity.com>
index | next in thread | previous in thread | raw e-mail
[-- Attachment #1 --]
On Thu, May 10, 2012 at 4:38 AM, Warren Block <wblock@wonkity.com> wrote:
> The Realtek RTL8187B used to work with 8-stable and pre-release 9.
> It doesn't work with 9-stable any more, wpa_supplicant hangs and lags and
> never associates. It does manage to scan and list access points.
>
> This is with 9.0-STABLE FreeBSD 9.0-STABLE #0 r234759, amd64.
I have attached patch in my tree for quite some time now, not sure it
helps with what you are seeing though.
The "hang" you are referring to is a series of quite annoying pause() calls.
--
Bernhard
[-- Attachment #2 --]
Index: sys/dev/usb/wlan/if_urtwvar.h
===================================================================
--- sys/dev/usb/wlan/if_urtwvar.h (revision 235232)
+++ sys/dev/usb/wlan/if_urtwvar.h (working copy)
@@ -152,7 +152,6 @@ struct urtw_softc {
urtw_datahead sc_rx_active;
urtw_datahead sc_rx_inactive;
struct urtw_data sc_tx[URTW_TX_DATA_LIST_COUNT];
- urtw_datahead sc_tx_active;
urtw_datahead sc_tx_inactive;
urtw_datahead sc_tx_pending;
uint8_t sc_rts_retry;
Index: sys/dev/usb/wlan/if_urtw.c
===================================================================
--- sys/dev/usb/wlan/if_urtw.c (revision 235232)
+++ sys/dev/usb/wlan/if_urtw.c (working copy)
@@ -939,11 +939,11 @@ urtw_detach(device_t dev)
usbd_transfer_unsetup(sc->sc_xfer, (sc->sc_flags & URTW_RTL8187B) ?
URTW_8187B_N_XFERS : URTW_8187L_N_XFERS);
- ieee80211_ifdetach(ic);
urtw_free_tx_data_list(sc);
urtw_free_rx_data_list(sc);
+ ieee80211_ifdetach(ic);
if_free(ifp);
mtx_destroy(&sc->sc_mtx);
@@ -1438,7 +1438,9 @@ urtw_start(struct ifnet *ifp)
ifp->if_oerrors++;
STAILQ_INSERT_HEAD(&sc->sc_tx_inactive, bf, next);
ieee80211_free_node(ni);
- break;
+ bf->ni = NULL;
+ bf->m = NULL;
+ continue;
}
sc->sc_txtimer = 5;
@@ -1518,7 +1520,6 @@ urtw_alloc_tx_data_list(struct urtw_softc *sc)
if (error != 0)
return (error);
- STAILQ_INIT(&sc->sc_tx_active);
STAILQ_INIT(&sc->sc_tx_inactive);
STAILQ_INIT(&sc->sc_tx_pending);
@@ -1556,6 +1557,8 @@ urtw_raw_xmit(struct ieee80211_node *ni, struct mb
ifp->if_opackets++;
if (urtw_tx_start(sc, ni, m, bf, URTW_PRIORITY_LOW) != 0) {
ieee80211_free_node(ni);
+ bf->ni = NULL;
+ bf->m = NULL;
ifp->if_oerrors++;
STAILQ_INSERT_HEAD(&sc->sc_tx_inactive, bf, next);
URTW_UNLOCK(sc);
@@ -1740,10 +1743,13 @@ urtw_tx_start(struct urtw_softc *sc, struct ieee80
}
*(uint16_t *)wh->i_dur = htole16(dur);
+
xferlen = m0->m_pkthdr.len;
xferlen += (sc->sc_flags & URTW_RTL8187B) ? (4 * 8) : (4 * 3);
if ((0 == xferlen % 64) || (0 == xferlen % 512))
xferlen += 1;
+ if (xferlen < 64)
+ xferlen = 65;
memset(data->buf, 0, URTW_TX_MAXSIZE);
flags = m0->m_pkthdr.len & 0xfff;
@@ -1801,6 +1807,7 @@ urtw_tx_start(struct urtw_softc *sc, struct ieee80
data->m = m0;
if (sc->sc_flags & URTW_RTL8187B) {
+#if 1
switch (wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) {
case IEEE80211_FC0_TYPE_CTL:
case IEEE80211_FC0_TYPE_MGT:
@@ -1812,6 +1819,12 @@ urtw_tx_start(struct urtw_softc *sc, struct ieee80
xfer = rtl8187b_pipes[M_WME_GETAC(m0)];
break;
}
+#else
+ KASSERT(M_WME_GETAC(m0) < URTW_8187B_TXPIPE_MAX,
+ ("unsupported WME pipe %d", M_WME_GETAC(m0)));
+ xfer = rtl8187b_pipes[M_WME_GETAC(m0)];
+ xfer = sc->sc_xfer[URTW_8187B_BULK_TX_EP12];
+#endif
} else
xfer = (prior == URTW_PRIORITY_LOW) ?
sc->sc_xfer[URTW_8187L_BULK_TX_LOW] :
@@ -2631,7 +2644,6 @@ urtw_8187_write_phy(struct urtw_softc *sc, uint8_t
urtw_write8_m(sc, URTW_PHY_MAGIC3, ((phyw & 0x00ff0000) >> 16));
urtw_write8_m(sc, URTW_PHY_MAGIC2, ((phyw & 0x0000ff00) >> 8));
urtw_write8_m(sc, URTW_PHY_MAGIC1, ((phyw & 0x000000ff)));
- usb_pause_mtx(&sc->sc_mtx, 1);
fail:
return (error);
}
@@ -3303,36 +3315,26 @@ urtw_8225v2b_rf_init(struct urtw_softc *sc)
urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, 0x0480);
urtw_write16_m(sc, URTW_RF_PINS_SELECT, 0x2488);
urtw_write16_m(sc, URTW_RF_PINS_ENABLE, 0x1fff);
- usb_pause_mtx(&sc->sc_mtx, 1100);
+ usb_pause_mtx(&sc->sc_mtx, 100);
for (i = 0; i < N(urtw_8225v2b_rf_part0); i++) {
urtw_8225_write(sc, urtw_8225v2b_rf_part0[i].reg,
urtw_8225v2b_rf_part0[i].val);
- usb_pause_mtx(&sc->sc_mtx, 1);
}
urtw_8225_write(sc, 0x00, 0x01b7);
for (i = 0; i < 95; i++) {
urtw_8225_write(sc, URTW_8225_ADDR_1_MAGIC, (uint8_t)(i + 1));
- usb_pause_mtx(&sc->sc_mtx, 1);
urtw_8225_write(sc, URTW_8225_ADDR_2_MAGIC,
urtw_8225v2b_rxgain[i]);
- usb_pause_mtx(&sc->sc_mtx, 1);
}
urtw_8225_write(sc, URTW_8225_ADDR_3_MAGIC, 0x080);
- usb_pause_mtx(&sc->sc_mtx, 1);
urtw_8225_write(sc, URTW_8225_ADDR_5_MAGIC, 0x004);
- usb_pause_mtx(&sc->sc_mtx, 1);
urtw_8225_write(sc, URTW_8225_ADDR_0_MAGIC, 0x0b7);
- usb_pause_mtx(&sc->sc_mtx, 1);
- usb_pause_mtx(&sc->sc_mtx, 3000);
urtw_8225_write(sc, URTW_8225_ADDR_2_MAGIC, 0xc4d);
- usb_pause_mtx(&sc->sc_mtx, 2000);
urtw_8225_write(sc, URTW_8225_ADDR_2_MAGIC, 0x44d);
- usb_pause_mtx(&sc->sc_mtx, 1);
urtw_8225_write(sc, URTW_8225_ADDR_0_MAGIC, 0x2bf);
- usb_pause_mtx(&sc->sc_mtx, 1);
urtw_write8_m(sc, URTW_TX_GAIN_CCK, 0x03);
urtw_write8_m(sc, URTW_TX_GAIN_OFDM, 0x07);
@@ -4198,11 +4200,11 @@ urtw_bulk_tx_callback(struct usb_xfer *xfer, usb_e
switch (USB_GET_STATE(xfer)) {
case USB_ST_TRANSFERRED:
- data = STAILQ_FIRST(&sc->sc_tx_active);
+ data = usbd_xfer_get_priv(xfer);
if (data == NULL)
goto setup;
- STAILQ_REMOVE_HEAD(&sc->sc_tx_active, next);
urtw_txeof(xfer, data);
+ usbd_xfer_set_priv(xfer, NULL);
STAILQ_INSERT_TAIL(&sc->sc_tx_inactive, data, next);
/* FALLTHROUGH */
case USB_ST_SETUP:
@@ -4214,25 +4216,35 @@ setup:
return;
}
STAILQ_REMOVE_HEAD(&sc->sc_tx_pending, next);
- STAILQ_INSERT_TAIL(&sc->sc_tx_active, data, next);
- usbd_xfer_set_frame_data(xfer, 0, data->buf, data->buflen);
+ usbd_xfer_set_frame_data(xfer, 0, data->buf, data->buflen+1);
usbd_transfer_submit(xfer);
+ usbd_xfer_set_priv(xfer, data);
URTW_UNLOCK(sc);
urtw_start(ifp);
URTW_LOCK(sc);
break;
default:
- data = STAILQ_FIRST(&sc->sc_tx_active);
- if (data == NULL)
- goto setup;
- if (data->ni != NULL) {
- ieee80211_free_node(data->ni);
- data->ni = NULL;
- ifp->if_oerrors++;
+ data = usbd_xfer_get_priv(xfer);
+ if (data != NULL) {
+ if (data->ni != NULL) {
+ ieee80211_free_node(data->ni);
+ data->ni = NULL;
+ ifp->if_oerrors++;
+ }
+ if (data->m != NULL) {
+ m_freem(data->m);
+ data->m = NULL;
+ }
+ usbd_xfer_set_priv(xfer, NULL);
+ STAILQ_INSERT_TAIL(&sc->sc_tx_inactive, data, next);
}
if (error != USB_ERR_CANCELLED) {
+ if (error == USB_ERR_TIMEOUT) {
+ device_printf(sc->sc_dev, "device timeout\n");
+ return;
+ }
usbd_xfer_set_stall(xfer);
goto setup;
}
help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAAgh0_bu56J_UE=usfOeLtMTiR30=beSQ4QhwqkXKY_FY4y3Eg>
