Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

rt2x00: Implement tx_frames_pending mac80211 callback function.

Implementing this callback function will cause mac80211 refrain from
going to powersave state when there are still untransmitted TX frames
in the queues.
This would exactly mimic the behaviour of the legacy vendor driver which
also doesn't go in powersave mode if there are still TX frames that are not
transmitted.
This should make powersaving and rt2x00 a better couple.

Signed-off-by: Gertjan van Wingerde <gwingerde@gmail.com>
Acked-by: Helmut Schaa <helmut.schaa@googlemail.com>
Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>

authored by

Gertjan van Wingerde and committed by
John W. Linville
5f0dd296 acb56120

+22
+1
drivers/net/wireless/rt2x00/rt2400pci.c
··· 1723 1723 .set_antenna = rt2x00mac_set_antenna, 1724 1724 .get_antenna = rt2x00mac_get_antenna, 1725 1725 .get_ringparam = rt2x00mac_get_ringparam, 1726 + .tx_frames_pending = rt2x00mac_tx_frames_pending, 1726 1727 }; 1727 1728 1728 1729 static const struct rt2x00lib_ops rt2400pci_rt2x00_ops = {
+1
drivers/net/wireless/rt2x00/rt2500pci.c
··· 2016 2016 .set_antenna = rt2x00mac_set_antenna, 2017 2017 .get_antenna = rt2x00mac_get_antenna, 2018 2018 .get_ringparam = rt2x00mac_get_ringparam, 2019 + .tx_frames_pending = rt2x00mac_tx_frames_pending, 2019 2020 }; 2020 2021 2021 2022 static const struct rt2x00lib_ops rt2500pci_rt2x00_ops = {
+1
drivers/net/wireless/rt2x00/rt2500usb.c
··· 1827 1827 .set_antenna = rt2x00mac_set_antenna, 1828 1828 .get_antenna = rt2x00mac_get_antenna, 1829 1829 .get_ringparam = rt2x00mac_get_ringparam, 1830 + .tx_frames_pending = rt2x00mac_tx_frames_pending, 1830 1831 }; 1831 1832 1832 1833 static const struct rt2x00lib_ops rt2500usb_rt2x00_ops = {
+1
drivers/net/wireless/rt2x00/rt2800pci.c
··· 1031 1031 .flush = rt2x00mac_flush, 1032 1032 .get_survey = rt2800_get_survey, 1033 1033 .get_ringparam = rt2x00mac_get_ringparam, 1034 + .tx_frames_pending = rt2x00mac_tx_frames_pending, 1034 1035 }; 1035 1036 1036 1037 static const struct rt2800_ops rt2800pci_rt2800_ops = {
+1
drivers/net/wireless/rt2x00/rt2800usb.c
··· 757 757 .flush = rt2x00mac_flush, 758 758 .get_survey = rt2800_get_survey, 759 759 .get_ringparam = rt2x00mac_get_ringparam, 760 + .tx_frames_pending = rt2x00mac_tx_frames_pending, 760 761 }; 761 762 762 763 static const struct rt2800_ops rt2800usb_rt2800_ops = {
+1
drivers/net/wireless/rt2x00/rt2x00.h
··· 1276 1276 int rt2x00mac_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant); 1277 1277 void rt2x00mac_get_ringparam(struct ieee80211_hw *hw, 1278 1278 u32 *tx, u32 *tx_max, u32 *rx, u32 *rx_max); 1279 + bool rt2x00mac_tx_frames_pending(struct ieee80211_hw *hw); 1279 1280 1280 1281 /* 1281 1282 * Driver allocation handlers.
+14
drivers/net/wireless/rt2x00/rt2x00mac.c
··· 818 818 *rx_max = rt2x00dev->rx->limit; 819 819 } 820 820 EXPORT_SYMBOL_GPL(rt2x00mac_get_ringparam); 821 + 822 + bool rt2x00mac_tx_frames_pending(struct ieee80211_hw *hw) 823 + { 824 + struct rt2x00_dev *rt2x00dev = hw->priv; 825 + struct data_queue *queue; 826 + 827 + tx_queue_for_each(rt2x00dev, queue) { 828 + if (!rt2x00queue_empty(queue)) 829 + return true; 830 + } 831 + 832 + return false; 833 + } 834 + EXPORT_SYMBOL_GPL(rt2x00mac_tx_frames_pending);
+1
drivers/net/wireless/rt2x00/rt61pci.c
··· 2982 2982 .set_antenna = rt2x00mac_set_antenna, 2983 2983 .get_antenna = rt2x00mac_get_antenna, 2984 2984 .get_ringparam = rt2x00mac_get_ringparam, 2985 + .tx_frames_pending = rt2x00mac_tx_frames_pending, 2985 2986 }; 2986 2987 2987 2988 static const struct rt2x00lib_ops rt61pci_rt2x00_ops = {
+1
drivers/net/wireless/rt2x00/rt73usb.c
··· 2314 2314 .set_antenna = rt2x00mac_set_antenna, 2315 2315 .get_antenna = rt2x00mac_get_antenna, 2316 2316 .get_ringparam = rt2x00mac_get_ringparam, 2317 + .tx_frames_pending = rt2x00mac_tx_frames_pending, 2317 2318 }; 2318 2319 2319 2320 static const struct rt2x00lib_ops rt73usb_rt2x00_ops = {