aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/ath9k/xmit.c
diff options
context:
space:
mode:
authorJouni Malinen <jouni.malinen@atheros.com>2009-03-03 12:23:31 -0500
committerJohn W. Linville <linville@tuxdriver.com>2009-03-05 14:39:45 -0500
commitf0ed85c6c7960b26666db013e02e748b56eef98a (patch)
tree005de0605ebb2899a671e5ebc06e5b45393f91e5 /drivers/net/wireless/ath9k/xmit.c
parentb93bce2a5e8fd5c9f5d8c982efd6bca71a9b83f3 (diff)
ath9k: Virtual wiphy pause/unpause functionality
Allow virtual wiphys to be paused/unpaused to allow off-channel operations. Pause will stop all TX queues for the wiphy and move the STA into power save mode if in managed mode. Unpause wakes up the TX queues and notifies the AP that the STA woke up if in managed mode. Signed-off-by: Jouni Malinen <jouni.malinen@atheros.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/ath9k/xmit.c')
-rw-r--r--drivers/net/wireless/ath9k/xmit.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/drivers/net/wireless/ath9k/xmit.c b/drivers/net/wireless/ath9k/xmit.c
index 3c48fa5646f..a82d2ab7c3a 100644
--- a/drivers/net/wireless/ath9k/xmit.c
+++ b/drivers/net/wireless/ath9k/xmit.c
@@ -1514,6 +1514,7 @@ static int ath_tx_setup_buffer(struct ieee80211_hw *hw, struct ath_buf *bf,
1514 return -ENOMEM; 1514 return -ENOMEM;
1515 tx_info->rate_driver_data[0] = tx_info_priv; 1515 tx_info->rate_driver_data[0] = tx_info_priv;
1516 tx_info_priv->aphy = aphy; 1516 tx_info_priv->aphy = aphy;
1517 tx_info_priv->frame_type = txctl->frame_type;
1517 hdrlen = ieee80211_get_hdrlen_from_skb(skb); 1518 hdrlen = ieee80211_get_hdrlen_from_skb(skb);
1518 fc = hdr->frame_control; 1519 fc = hdr->frame_control;
1519 1520
@@ -1722,11 +1723,14 @@ static void ath_tx_complete(struct ath_softc *sc, struct sk_buff *skb,
1722 struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb); 1723 struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
1723 struct ath_tx_info_priv *tx_info_priv = ATH_TX_INFO_PRIV(tx_info); 1724 struct ath_tx_info_priv *tx_info_priv = ATH_TX_INFO_PRIV(tx_info);
1724 int hdrlen, padsize; 1725 int hdrlen, padsize;
1726 int frame_type = ATH9K_NOT_INTERNAL;
1725 1727
1726 DPRINTF(sc, ATH_DBG_XMIT, "TX complete: skb: %p\n", skb); 1728 DPRINTF(sc, ATH_DBG_XMIT, "TX complete: skb: %p\n", skb);
1727 1729
1728 if (tx_info_priv) 1730 if (tx_info_priv) {
1729 hw = tx_info_priv->aphy->hw; 1731 hw = tx_info_priv->aphy->hw;
1732 frame_type = tx_info_priv->frame_type;
1733 }
1730 1734
1731 if (tx_info->flags & IEEE80211_TX_CTL_NO_ACK || 1735 if (tx_info->flags & IEEE80211_TX_CTL_NO_ACK ||
1732 tx_info->flags & IEEE80211_TX_STAT_TX_FILTERED) { 1736 tx_info->flags & IEEE80211_TX_STAT_TX_FILTERED) {
@@ -1757,7 +1761,10 @@ static void ath_tx_complete(struct ath_softc *sc, struct sk_buff *skb,
1757 skb_pull(skb, padsize); 1761 skb_pull(skb, padsize);
1758 } 1762 }
1759 1763
1760 ieee80211_tx_status(hw, skb); 1764 if (frame_type == ATH9K_NOT_INTERNAL)
1765 ieee80211_tx_status(hw, skb);
1766 else
1767 ath9k_tx_status(hw, skb);
1761} 1768}
1762 1769
1763static void ath_tx_complete_buf(struct ath_softc *sc, struct ath_buf *bf, 1770static void ath_tx_complete_buf(struct ath_softc *sc, struct ath_buf *bf,