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:
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?
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 t-926 [000] 408.763133: drv_return_void: phy0 t-926 [000] 408.763134: drv_flush: phy0 drop:0 t-926 [000] 408.763135: drv_return_void: phy0 t-926 [000] 408.763136: drv_prepare_ multicast: phy0 prepare mc (2) t-926 [000] 408.763137: drv_return_u64: phy0 - 0 t-926 [000] 408.763138: drv_configure_ filter: phy0 changed:0x10 total:0x80000010 t-926 [000] 408.763138: drv_return_void: phy0 u:0-935 [000] 408.790633: drv_flush: phy0 drop:0 u:0-935 [000] 408.790635: drv_return_void: phy0 u:0-935 [000] 408.890579: drv_config: phy0 ch:0x40 freq:2412 u:0-935 [000] 408.890580: drv_return_int: phy0 - -12 u:0-935 [000] 408.890581: drv_config: phy0 ch:0x40 freq:2417 u:0-935 [000] 408.890582: drv_return_int: phy0 - -12 u:0-935 [000] 408.890582: drv_config: phy0 ch:0x40 freq:2422 u:0-935 [000] 408.890583: drv_return_int: phy0 - -12
wpa_supplican
wpa_supplican
wpa_supplican
wpa_supplican
wpa_supplican
wpa_supplican
wpa_supplican
kworker/
kworker/
kworker/
kworker/
kworker/
kworker/
kworker/
kworker/
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?