Comment 12 for bug 722185

Revision history for this message
Jason Conti (jconti) wrote :

Narrowed it down to the p54common.ko module. If I build a kernel with CONFIG_DEBUG_SECTION_MISMATCH=y, install it, then rebuild just the p54 driver: make SUBDIRS=drivers/net/wireless/p54/ modules; and update just the p54common.ko module, the wireless will connect.

I also enabled mac80211 tracing to compare with and without the above option, and they are mostly identical except in the direct probe phase the driver is returning many instances of ENOMEM:

wpa_supplicant-926 [000] 408.763132: drv_sw_scan_start: phy0
  wpa_supplicant-926 [000] 408.763133: drv_return_void: phy0
  wpa_supplicant-926 [000] 408.763134: drv_flush: phy0 drop:0
  wpa_supplicant-926 [000] 408.763135: drv_return_void: phy0
  wpa_supplicant-926 [000] 408.763136: drv_prepare_multicast: phy0 prepare mc (2)
  wpa_supplicant-926 [000] 408.763137: drv_return_u64: phy0 - 0
  wpa_supplicant-926 [000] 408.763138: drv_configure_filter: phy0 changed:0x10 total:0x80000010
  wpa_supplicant-926 [000] 408.763138: drv_return_void: phy0
     kworker/u:0-935 [000] 408.790633: drv_flush: phy0 drop:0
     kworker/u:0-935 [000] 408.790635: drv_return_void: phy0
     kworker/u:0-935 [000] 408.890579: drv_config: phy0 ch:0x40 freq:2412
     kworker/u:0-935 [000] 408.890580: drv_return_int: phy0 - -12
     kworker/u:0-935 [000] 408.890581: drv_config: phy0 ch:0x40 freq:2417
     kworker/u:0-935 [000] 408.890582: drv_return_int: phy0 - -12
     kworker/u:0-935 [000] 408.890582: drv_config: phy0 ch:0x40 freq:2422
     kworker/u:0-935 [000] 408.890583: drv_return_int: phy0 - -12

Which, with the help of many printks, I tracked down to the p54_scan function of fwio.c in the p54common module. It is returning that because p54_alloc_skb is returning NULL in the second branch: unlikely(skb_queue_len(&priv->tx_pending) > 64)

So the outgoing buffer appears to be full. The question is, why does this only happen when using gcc-4.5 and -fno-inline-functions-called-once?