Skip site navigation (1)Skip section navigation (2)
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>