Add ieee80211_netif_oper() calls on the correct places for better flow control.
Signed-off-by Ivo van Doorn <[EMAIL PROTECTED]> --- diff -rU3 wireless-dev-rt2x00-return/drivers/net/wireless/d80211/rt2x00/rt2400pci.c wireless-dev-rt2x00-netif/drivers/net/wireless/d80211/rt2x00/rt2400pci.c --- wireless-dev-rt2x00-return/drivers/net/wireless/d80211/rt2x00/rt2400pci.c 2006-08-27 16:29:05.000000000 +0200 +++ wireless-dev-rt2x00-netif/drivers/net/wireless/d80211/rt2x00/rt2400pci.c 2006-08-27 16:32:51.000000000 +0200 @@ -1465,17 +1465,22 @@ SET_FLAG(rt2x00dev, DEVICE_ENABLED_RADIO); ieee80211_start_queues(net_dev); + ieee80211_netif_oper(net_dev, NETIF_WAKE); return 0; } static void rt2400pci_disable_radio(struct rt2x00_dev *rt2x00dev) { + struct net_device *net_dev = pci_get_drvdata(rt2x00dev_pci(rt2x00dev)); u32 reg; if (!GET_FLAG(rt2x00dev, DEVICE_ENABLED_RADIO)) return; + ieee80211_netif_oper(net_dev, NETIF_STOP); + ieee80211_stop_queues(net_dev); + /* * Disable LED */ @@ -2893,6 +2898,8 @@ goto exit_free_device; } + ieee80211_netif_oper(net_dev, NETIF_ATTACH); + return 0; exit_free_device: @@ -2917,6 +2924,8 @@ rt2400pci_disable_radio(rt2x00dev); + ieee80211_netif_oper(net_dev, NETIF_DETACH); + rt2400pci_uninitialize(rt2x00dev); rt2400pci_free_dev(net_dev); @@ -2945,6 +2954,7 @@ * Disable the radio. */ rt2400pci_disable_radio(rt2x00dev); + ieee80211_netif_oper(net_dev, NETIF_DETACH); /* * Set device mode to sleep for power management. @@ -3001,7 +3011,13 @@ /* * Set device mode to awake for power management. */ - return rt2400pci_set_state(rt2x00dev, STATE_AWAKE); + status = rt2400pci_set_state(rt2x00dev, STATE_AWAKE); + if (status) + return status; + + ieee80211_netif_oper(net_dev, NETIF_ATTACH); + + return 0; } #endif /* CONFIG_PM */ diff -rU3 wireless-dev-rt2x00-return/drivers/net/wireless/d80211/rt2x00/rt2500pci.c wireless-dev-rt2x00-netif/drivers/net/wireless/d80211/rt2x00/rt2500pci.c --- wireless-dev-rt2x00-return/drivers/net/wireless/d80211/rt2x00/rt2500pci.c 2006-08-27 16:29:08.000000000 +0200 +++ wireless-dev-rt2x00-netif/drivers/net/wireless/d80211/rt2x00/rt2500pci.c 2006-08-27 16:34:16.000000000 +0200 @@ -1589,17 +1589,22 @@ SET_FLAG(rt2x00dev, DEVICE_ENABLED_RADIO); ieee80211_start_queues(net_dev); + ieee80211_netif_oper(net_dev, NETIF_WAKE); return 0; } static void rt2500pci_disable_radio(struct rt2x00_dev *rt2x00dev) { + struct net_device *net_dev = pci_get_drvdata(rt2x00dev_pci(rt2x00dev)); u32 reg; if (!GET_FLAG(rt2x00dev, DEVICE_ENABLED_RADIO)) return; + ieee80211_netif_oper(net_dev, NETIF_STOP); + ieee80211_stop_queues(net_dev); + /* * Disable LED */ @@ -3178,6 +3183,8 @@ goto exit_free_device; } + ieee80211_netif_oper(net_dev, NETIF_ATTACH); + return 0; exit_free_device: @@ -3202,6 +3209,8 @@ rt2500pci_disable_radio(rt2x00dev); + ieee80211_netif_oper(net_dev, NETIF_DETACH); + rt2500pci_uninitialize(rt2x00dev); rt2500pci_free_dev(net_dev); @@ -3230,6 +3239,7 @@ * Disable the radio. */ rt2500pci_disable_radio(rt2x00dev); + ieee80211_netif_oper(net_dev, NETIF_DETACH); /* * Set device mode to sleep for power management. @@ -3286,7 +3296,13 @@ /* * Set device mode to awake for power management. */ - return rt2500pci_set_state(rt2x00dev, STATE_AWAKE); + status = rt2500pci_set_state(rt2x00dev, STATE_AWAKE); + if (status) + return status; + + ieee80211_netif_oper(net_dev, NETIF_ATTACH); + + return 0; } #endif /* CONFIG_PM */ diff -rU3 wireless-dev-rt2x00-return/drivers/net/wireless/d80211/rt2x00/rt2500usb.c wireless-dev-rt2x00-netif/drivers/net/wireless/d80211/rt2x00/rt2500usb.c --- wireless-dev-rt2x00-return/drivers/net/wireless/d80211/rt2x00/rt2500usb.c 2006-08-27 16:28:23.000000000 +0200 +++ wireless-dev-rt2x00-netif/drivers/net/wireless/d80211/rt2x00/rt2500usb.c 2006-08-27 16:35:43.000000000 +0200 @@ -1335,12 +1335,15 @@ SET_FLAG(rt2x00dev, DEVICE_ENABLED_RADIO); ieee80211_start_queues(net_dev); + ieee80211_netif_oper(net_dev, NETIF_WAKE); return 0; } static void rt2500usb_disable_radio(struct rt2x00_dev *rt2x00dev) { + struct net_device *net_dev = + usb_get_intfdata(rt2x00dev_usb(rt2x00dev)); struct data_ring *ring; u16 reg; unsigned int i; @@ -1348,6 +1351,9 @@ if (!GET_FLAG(rt2x00dev, DEVICE_ENABLED_RADIO)) return; + ieee80211_netif_oper(net_dev, NETIF_STOP); + ieee80211_stop_queues(net_dev); + /* * Disable LED */ @@ -2802,6 +2808,8 @@ goto exit_free_device; } + ieee80211_netif_oper(net_dev, NETIF_ATTACH); + return 0; exit_free_device: @@ -2820,6 +2828,8 @@ rt2500usb_disable_radio(rt2x00dev); + ieee80211_netif_oper(net_dev, NETIF_DETACH); + rt2500usb_uninitialize(rt2x00dev); rt2500usb_free_dev(net_dev); @@ -2847,6 +2857,7 @@ * Disable the radio. */ rt2500usb_disable_radio(rt2x00dev); + ieee80211_netif_oper(net_dev, NETIF_DETACH); /* * Set device mode to sleep for power management. @@ -2898,7 +2909,13 @@ /* * Set device mode to awake for power management. */ - return rt2500usb_set_state(rt2x00dev, STATE_AWAKE); + status = rt2500usb_set_state(rt2x00dev, STATE_AWAKE); + if (status) + return status; + + ieee80211_netif_oper(net_dev, NETIF_ATTACH); + + return 0; } #endif /* CONFIG_PM */ diff -rU3 wireless-dev-rt2x00-return/drivers/net/wireless/d80211/rt2x00/rt61pci.c wireless-dev-rt2x00-netif/drivers/net/wireless/d80211/rt2x00/rt61pci.c --- wireless-dev-rt2x00-return/drivers/net/wireless/d80211/rt2x00/rt61pci.c 2006-08-27 16:37:11.000000000 +0200 +++ wireless-dev-rt2x00-netif/drivers/net/wireless/d80211/rt2x00/rt61pci.c 2006-08-27 16:38:04.000000000 +0200 @@ -2017,17 +2017,22 @@ SET_FLAG(rt2x00dev, DEVICE_ENABLED_RADIO); ieee80211_start_queues(net_dev); + ieee80211_netif_oper(net_dev, NETIF_WAKE); return 0; } static void rt61pci_disable_radio(struct rt2x00_dev *rt2x00dev) { + struct net_device *net_dev = pci_get_drvdata(rt2x00dev_pci(rt2x00dev)); u32 reg; if (!GET_FLAG(rt2x00dev, DEVICE_ENABLED_RADIO)) return; + ieee80211_netif_oper(net_dev, NETIF_STOP); + ieee80211_stop_queues(net_dev); + /* * Disable LED */ @@ -3695,6 +3700,8 @@ goto exit_free_device; } + ieee80211_netif_oper(net_dev, NETIF_ATTACH); + return 0; exit_free_device: @@ -3719,6 +3726,8 @@ rt61pci_disable_radio(rt2x00dev); + ieee80211_netif_oper(net_dev, NETIF_DETACH); + rt61pci_uninitialize(rt2x00dev); rt61pci_free_dev(net_dev); @@ -3747,6 +3756,7 @@ * Disable the radio. */ rt61pci_disable_radio(rt2x00dev); + ieee80211_netif_oper(net_dev, NETIF_DETACH); /* * Set device mode to sleep for power management. @@ -3803,7 +3813,13 @@ /* * Set device mode to awake for power management. */ - return rt61pci_set_state(rt2x00dev, STATE_AWAKE); + status = rt61pci_set_state(rt2x00dev, STATE_AWAKE); + if (status) + return status; + + ieee80211_netif_oper(net_dev, NETIF_ATTACH); + + return 0; } #endif /* CONFIG_PM */ diff -rU3 wireless-dev-rt2x00-return/drivers/net/wireless/d80211/rt2x00/rt73usb.c wireless-dev-rt2x00-netif/drivers/net/wireless/d80211/rt2x00/rt73usb.c --- wireless-dev-rt2x00-return/drivers/net/wireless/d80211/rt2x00/rt73usb.c 2006-08-27 16:29:43.000000000 +0200 +++ wireless-dev-rt2x00-netif/drivers/net/wireless/d80211/rt2x00/rt73usb.c 2006-08-27 16:40:05.000000000 +0200 @@ -1600,12 +1600,15 @@ SET_FLAG(rt2x00dev, DEVICE_ENABLED_RADIO); ieee80211_start_queues(net_dev); + ieee80211_netif_oper(net_dev, NETIF_WAKE); return 0; } static void rt73usb_disable_radio(struct rt2x00_dev *rt2x00dev) { + struct net_device *net_dev = + usb_get_intfdata(rt2x00dev_usb(rt2x00dev)); struct data_ring *ring; u32 reg; unsigned int i; @@ -1613,6 +1616,9 @@ if (!GET_FLAG(rt2x00dev, DEVICE_ENABLED_RADIO)) return; + ieee80211_netif_oper(net_dev, NETIF_STOP); + ieee80211_stop_queues(net_dev); + /* * Disable LED */ @@ -3168,6 +3174,8 @@ goto exit_free_device; } + ieee80211_netif_oper(net_dev, NETIF_ATTACH); + return 0; exit_free_device: @@ -3186,6 +3194,8 @@ rt73usb_disable_radio(rt2x00dev); + ieee80211_netif_oper(net_dev, NETIF_DETACH); + rt73usb_uninitialize(rt2x00dev); rt73usb_free_dev(net_dev); @@ -3212,6 +3222,7 @@ * Disable the radio. */ rt73usb_disable_radio(rt2x00dev); + ieee80211_netif_oper(net_dev, NETIF_DETACH); /* * Set device mode to sleep for power management. @@ -3263,7 +3274,12 @@ /* * Set device mode to awake for power management. */ - return rt73usb_set_state(rt2x00dev, STATE_AWAKE); + status = rt73usb_set_state(rt2x00dev, STATE_AWAKE); + if (status) + return status; + + ieee80211_netif_oper(net_dev, NETIF_ATTACH); + return 0; } #endif /* CONFIG_PM */ - To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html