Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 20 May 2014 20:22:48 +0200
From:      Hans Petter Selasky <hps@selasky.org>
To:        Idwer Vollering <vidwer@gmail.com>
Cc:        freebsd-wireless@freebsd.org, freebsd-usb@freebsd.org
Subject:   Re: if_rsu hardware causes a kernel panic on removal..
Message-ID:  <537B9D78.3030103@selasky.org>
In-Reply-To: <CAPp9Or=xuKzsa3zydfvfbjNxJh0m48q9RnHdg2YEnXAExQUhTQ@mail.gmail.com>
References:  <CAPp9Or=6ryhXzLCE07xOKywwQLkJ7FQ-1w8ePru6p0Cfr0FcJQ@mail.gmail.com>	<537AEC79.6080406@selasky.org>	<CAPp9Ork4H=v%2BudbteJgjOCS9HeGUgMSCFdMOm84x8i0jr4%2BJ=w@mail.gmail.com>	<537B497E.8070701@selasky.org>	<CAPp9Or=yUXU2adQP5qppjwWJDJA3q-Ns%2BabRi=bRmwKtg9qaHw@mail.gmail.com>	<537B6F44.6070905@selasky.org> <CAPp9Or=xuKzsa3zydfvfbjNxJh0m48q9RnHdg2YEnXAExQUhTQ@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format.
--------------060006010008000807010602
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit

> Hi,
>
> Certainly, here it is:
> http://ra.openbios.org/~idwer/freebsd/core.txt.9_fbsd_10-stable_rsu-panic-on-insertion
>
> Idwer
>

Does the attached patch make any difference?

--HPS

--------------060006010008000807010602
Content-Type: text/x-diff;
 name="rsu.diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename="rsu.diff"

=== if_rsu.c
==================================================================
--- if_rsu.c	(revision 266476)
+++ if_rsu.c	(local)
@@ -189,9 +189,9 @@
 static void	rsu_init_locked(struct rsu_softc *);
 static void	rsu_watchdog(void *);
 static int	rsu_tx_start(struct rsu_softc *, struct ieee80211_node *, 
-		    struct mbuf *, struct rsu_data *);
+		    struct mbuf *, struct rsu_data *, struct usb_xfer *);
 static void	rsu_start(struct ifnet *);
-static void	rsu_start_locked(struct ifnet *);
+static void	rsu_start_locked(struct ifnet *, struct usb_xfer *);
 static int	rsu_ioctl(struct ifnet *, u_long, caddr_t);
 static void	rsu_stop(struct ifnet *, int);
 static void	rsu_stop_locked(struct ifnet *, int);
@@ -1610,7 +1610,7 @@
 		usbd_xfer_set_frame_data(xfer, 0, data->buf, data->buflen);
 		DPRINTF("submitting transfer %p\n", data);
 		usbd_transfer_submit(xfer);
-		rsu_start_locked(ifp);
+		rsu_start_locked(ifp, xfer);
 		break;
 	default:
 		data = STAILQ_FIRST(&sc->sc_tx_active);
@@ -1631,7 +1631,7 @@
 
 static int
 rsu_tx_start(struct rsu_softc *sc, struct ieee80211_node *ni, 
-    struct mbuf *m0, struct rsu_data *data)
+    struct mbuf *m0, struct rsu_data *data, struct usb_xfer *xfer_self)
 {
 	struct ifnet *ifp = sc->sc_ifp;
 	struct ieee80211com *ic = ifp->if_l2com;
@@ -1736,8 +1736,9 @@
 	data->ni = ni;
 	data->m = m0;
 	STAILQ_INSERT_TAIL(&sc->sc_tx_pending, data, next);
-	usbd_transfer_start(xfer);
 
+	if (xfer != xfer_self)
+		usbd_transfer_start(xfer);
 	return (0);
 }
 
@@ -1750,12 +1751,12 @@
 		return;
 
 	RSU_LOCK(sc);
-	rsu_start_locked(ifp);
+	rsu_start_locked(ifp, NULL);
 	RSU_UNLOCK(sc);
 }
 
 static void
-rsu_start_locked(struct ifnet *ifp)
+rsu_start_locked(struct ifnet *ifp, struct usb_xfer *xfer_self)
 {
 	struct rsu_softc *sc = ifp->if_softc;
 	struct ieee80211_node *ni;
@@ -1776,7 +1777,7 @@
 		ni = (struct ieee80211_node *)m->m_pkthdr.rcvif;
 		m->m_pkthdr.rcvif = NULL;
 
-		if (rsu_tx_start(sc, ni, m, bf) != 0) {
+		if (rsu_tx_start(sc, ni, m, bf, xfer_self) != 0) {
 			ifp->if_oerrors++;
 			STAILQ_INSERT_HEAD(&sc->sc_tx_inactive, bf, next);
 			ieee80211_free_node(ni);
@@ -2303,7 +2304,7 @@
 		return (ENOBUFS);
 	}
 	ifp->if_opackets++;
-	if (rsu_tx_start(sc, ni, m, bf) != 0) {
+	if (rsu_tx_start(sc, ni, m, bf, NULL) != 0) {
 		ieee80211_free_node(ni);
 		ifp->if_oerrors++;
 		STAILQ_INSERT_HEAD(&sc->sc_tx_inactive, bf, next);

--------------060006010008000807010602--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?537B9D78.3030103>