Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 13 Oct 2009 10:42:01 -0700
From:      Weongyo Jeong <weongyo.jeong@gmail.com>
To:        Poul-Henning Kamp <phk@phk.freebsd.dk>
Cc:        current@freebsd.org
Subject:   Re: if_rum dies on transmit...
Message-ID:  <20091013174201.GC67082@weongyo>
In-Reply-To: <86051.1254232666@critter.freebsd.dk>
References:  <86051.1254232666@critter.freebsd.dk>

next in thread | previous in thread | raw e-mail | index | archive | help

--UugvWAfsgieZRqgk
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

On Tue, Sep 29, 2009 at 01:57:46PM +0000, Poul-Henning Kamp wrote:
> 
> Has anybody else seen if_rum die when you try to transmit a file over
> a TCP connection ?
> 
> If I try to print across the network, upload a file with ftp or anything
> else of that general tenor, if_rum seems to hang the output queue and
> stops transmitting packets.
> 
> Restarting wpa_supplicant mostly resolves the issue, but it does not
> on its own discover the problem.
> 
> According to tcpdump(8), packets are still received.
> 
> Any ideas ?

Could you please test with attached patch?

regards,
Weongyo Jeong


--UugvWAfsgieZRqgk
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment; filename="patch_rum_20091013.diff"

Index: if_rum.c
===================================================================
--- if_rum.c	(revision 198036)
+++ if_rum.c	(working copy)
@@ -826,6 +826,9 @@
 
 			usbd_transfer_submit(xfer);
 		}
+		RUM_UNLOCK(sc);
+		rum_start(ifp);
+		RUM_LOCK(sc);
 		break;
 
 	default:			/* Error */
@@ -930,8 +933,8 @@
 		 * the private mutex of a device! That is why we do the
 		 * "ieee80211_input" here, and not some lines up!
 		 */
+		RUM_UNLOCK(sc);
 		if (m) {
-			RUM_UNLOCK(sc);
 			ni = ieee80211_find_rxnode(ic,
 			    mtod(m, struct ieee80211_frame_min *));
 			if (ni != NULL) {
@@ -941,8 +944,11 @@
 			} else
 				(void) ieee80211_input_all(ic, m, rssi,
 				    RT2573_NOISE_FLOOR);
-			RUM_LOCK(sc);
 		}
+		if ((ifp->if_drv_flags & IFF_DRV_OACTIVE) == 0 &&
+		    !IFQ_IS_EMPTY(&ifp->if_snd))
+			rum_start(ifp);
+		RUM_LOCK(sc);
 		return;
 
 	default:			/* Error */

--UugvWAfsgieZRqgk--



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