Sophie

Sophie

distrib > Scientific%20Linux > 5x > x86_64 > by-pkgid > 8bacd36c2a21109f88c6a6764759e290 > files > 10

NetworkManager-0.6.4-8.el5.src.rpm

diff -up NetworkManager-0.6.4/src/nm-device-802-11-wireless.c.ipw3945-resume-fix NetworkManager-0.6.4/src/nm-device-802-11-wireless.c
--- NetworkManager-0.6.4/src/nm-device-802-11-wireless.c.ipw3945-resume-fix	2007-11-30 12:17:12.000000000 -0500
+++ NetworkManager-0.6.4/src/nm-device-802-11-wireless.c	2007-11-30 13:30:01.000000000 -0500
@@ -29,6 +29,7 @@
 #include <sys/stat.h>
 #include <sys/wait.h>
 #include <signal.h>
+#include <errno.h>
 
 #include "nm-device.h"
 #include "nm-device-802-11-wireless.h"
@@ -308,14 +309,34 @@ real_get_generic_capabilities (NMDevice 
 	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)
+	 */
+	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)
 	{