NetworkManager r3557 - in branches/NETWORKMANAGER_0_6_0_RELEASE: . src



Author: dcbw
Date: Thu Apr 10 22:05:26 2008
New Revision: 3557
URL: http://svn.gnome.org/viewvc/NetworkManager?rev=3557&view=rev

Log:
2008-04-10  Dan Williams  <dcbw redhat com>

	* src/nm-device-802-11-wireless.c
		- (real_get_generic_capabilities): give the driver some time to respond;
			mainly for ipw3945 and the binary regulatory daemon which stupidly
			need a few seconds after resume to actually work.  People should
			really start using iwlwifi instead.



Modified:
   branches/NETWORKMANAGER_0_6_0_RELEASE/ChangeLog
   branches/NETWORKMANAGER_0_6_0_RELEASE/src/nm-device-802-11-wireless.c

Modified: branches/NETWORKMANAGER_0_6_0_RELEASE/src/nm-device-802-11-wireless.c
==============================================================================
--- branches/NETWORKMANAGER_0_6_0_RELEASE/src/nm-device-802-11-wireless.c	(original)
+++ branches/NETWORKMANAGER_0_6_0_RELEASE/src/nm-device-802-11-wireless.c	Thu Apr 10 22:05:26 2008
@@ -31,6 +31,7 @@
 #include <sys/wait.h>
 #include <signal.h>
 #include <unistd.h>
+#include <errno.h>
 
 #include "nm-device.h"
 #include "nm-device-802-11-wireless.h"
@@ -295,14 +296,34 @@
 	guint32			caps = NM_DEVICE_CAP_NONE;
 	iwrange			range;
 	struct iwreq		wrq;
+	int i = 24;
+	const char *iface;
 
 	/* Check for Wireless Extensions support >= 16 for wireless devices */
 
 	if (!(sk = nm_dev_sock_open (dev, DEV_WIRELESS, __func__, NULL)))
 		goto out;
 
-	if (iw_get_range_info (nm_dev_sock_get_fd (sk), nm_device_get_iface (dev), &range) < 0)
+	iface = nm_device_get_iface (dev);
+
+	/* Need to give some drivers time to recover after suspend/resume
+	 * (ipw3945 specifically; see rhbz #362421, rhbz #312911)
+	 */
+	while (i-- > 0) {
+		err = iw_get_range_info (nm_dev_sock_get_fd (sk), iface, &range);
+		if (err == 0)
+			break;
+
+		if ((err < 0) && (errno != EAGAIN))  /* Real error */
+			goto out;
+
+		g_usleep (G_USEC_PER_SEC / 4);
+	}
+
+	if (i <= 0) {
+		nm_warning ("%s: device took too long to respond to IWRANGE query.", iface);
 		goto out;
+	}
 
 	if (range.we_version_compiled < 16)
 	{



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]