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) {