Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 658ef04f authored by Sujith Manoharan's avatar Sujith Manoharan Committed by John W. Linville
Browse files

ath9k_htc: Move TX specific stuff to a separate structure

parent ee3fa1bd
Loading
Loading
Loading
Loading
+12 −7
Original line number Diff line number Diff line
@@ -260,6 +260,13 @@ struct ath9k_htc_rx {
	spinlock_t rxbuflock;
};

struct ath9k_htc_tx {
	bool tx_queues_stop;
	spinlock_t tx_lock;

	struct sk_buff_head tx_queue;
};

struct ath9k_htc_tx_ctl {
	u8 type; /* ATH9K_HTC_* */
};
@@ -433,22 +440,20 @@ struct ath9k_htc_priv {
	u16 nstations;
	bool rearm_ani;
	bool reconfig_beacon;
	unsigned int rxfilter;

	struct ath9k_hw_cal_data caldata;
	struct ieee80211_supported_band sbands[IEEE80211_NUM_BANDS];

	spinlock_t beacon_lock;
	struct htc_beacon_config cur_beacon_conf;

	bool tx_queues_stop;
	spinlock_t tx_lock;
	struct ath9k_htc_rx rx;
	struct ath9k_htc_tx tx;

	struct htc_beacon_config cur_beacon_conf;
	unsigned int rxfilter;
	struct tasklet_struct swba_tasklet;
	struct tasklet_struct rx_tasklet;
	struct ieee80211_supported_band sbands[IEEE80211_NUM_BANDS];
	struct ath9k_htc_rx rx;
	struct tasklet_struct tx_tasklet;
	struct sk_buff_head tx_queue;
	struct delayed_work ani_work;
	struct work_struct ps_work;
	struct work_struct fatal_work;
+4 −4
Original line number Diff line number Diff line
@@ -398,9 +398,9 @@ void ath9k_htc_radio_enable(struct ieee80211_hw *hw)

	/* Start TX */
	htc_start(priv->htc);
	spin_lock_bh(&priv->tx_lock);
	priv->tx_queues_stop = false;
	spin_unlock_bh(&priv->tx_lock);
	spin_lock_bh(&priv->tx.tx_lock);
	priv->tx.tx_queues_stop = false;
	spin_unlock_bh(&priv->tx.tx_lock);
	ieee80211_wake_queues(hw);

	WMI_CMD(WMI_ENABLE_INTR_CMDID);
@@ -431,7 +431,7 @@ void ath9k_htc_radio_disable(struct ieee80211_hw *hw)
	ieee80211_stop_queues(hw);
	htc_stop(priv->htc);
	WMI_CMD(WMI_DRAIN_TXQ_ALL_CMDID);
	skb_queue_purge(&priv->tx_queue);
	skb_queue_purge(&priv->tx.tx_queue);

	/* Stop RX */
	WMI_CMD(WMI_STOP_RECV_CMDID);
+1 −1
Original line number Diff line number Diff line
@@ -673,7 +673,7 @@ static int ath9k_init_priv(struct ath9k_htc_priv *priv,

	spin_lock_init(&priv->wmi->wmi_lock);
	spin_lock_init(&priv->beacon_lock);
	spin_lock_init(&priv->tx_lock);
	spin_lock_init(&priv->tx.tx_lock);
	mutex_init(&priv->mutex);
	mutex_init(&priv->htc_pm_lock);
	tasklet_init(&priv->rx_tasklet, ath9k_rx_tasklet,
+11 −11
Original line number Diff line number Diff line
@@ -707,9 +707,9 @@ static int ath9k_htc_tx_aggr_oper(struct ath9k_htc_priv *priv,
			(aggr.aggr_enable) ? "Starting" : "Stopping",
			sta->addr, tid);

	spin_lock_bh(&priv->tx_lock);
	spin_lock_bh(&priv->tx.tx_lock);
	ista->tid_state[tid] = (aggr.aggr_enable && !ret) ? AGGR_START : AGGR_STOP;
	spin_unlock_bh(&priv->tx_lock);
	spin_unlock_bh(&priv->tx.tx_lock);

	return ret;
}
@@ -853,9 +853,9 @@ static void ath9k_htc_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
			ath_dbg(ath9k_hw_common(priv->ah), ATH_DBG_XMIT,
				"Stopping TX queues\n");
			ieee80211_stop_queues(hw);
			spin_lock_bh(&priv->tx_lock);
			priv->tx_queues_stop = true;
			spin_unlock_bh(&priv->tx_lock);
			spin_lock_bh(&priv->tx.tx_lock);
			priv->tx.tx_queues_stop = true;
			spin_unlock_bh(&priv->tx.tx_lock);
		} else {
			ath_dbg(ath9k_hw_common(priv->ah), ATH_DBG_XMIT,
				"Tx failed\n");
@@ -923,9 +923,9 @@ static int ath9k_htc_start(struct ieee80211_hw *hw)
	priv->op_flags &= ~OP_INVALID;
	htc_start(priv->htc);

	spin_lock_bh(&priv->tx_lock);
	priv->tx_queues_stop = false;
	spin_unlock_bh(&priv->tx_lock);
	spin_lock_bh(&priv->tx.tx_lock);
	priv->tx.tx_queues_stop = false;
	spin_unlock_bh(&priv->tx.tx_lock);

	ieee80211_wake_queues(hw);

@@ -965,7 +965,7 @@ static void ath9k_htc_stop(struct ieee80211_hw *hw)
	tasklet_kill(&priv->rx_tasklet);
	tasklet_kill(&priv->tx_tasklet);

	skb_queue_purge(&priv->tx_queue);
	skb_queue_purge(&priv->tx.tx_queue);

	ath9k_wmi_event_drain(priv);

@@ -1563,9 +1563,9 @@ static int ath9k_htc_ampdu_action(struct ieee80211_hw *hw,
		break;
	case IEEE80211_AMPDU_TX_OPERATIONAL:
		ista = (struct ath9k_htc_sta *) sta->drv_priv;
		spin_lock_bh(&priv->tx_lock);
		spin_lock_bh(&priv->tx.tx_lock);
		ista->tid_state[tid] = AGGR_OPERATIONAL;
		spin_unlock_bh(&priv->tx_lock);
		spin_unlock_bh(&priv->tx.tx_lock);
		break;
	default:
		ath_err(ath9k_hw_common(priv->ah), "Unknown AMPDU action\n");
+12 −12
Original line number Diff line number Diff line
@@ -239,10 +239,10 @@ static bool ath9k_htc_check_tx_aggr(struct ath9k_htc_priv *priv,
{
	bool ret = false;

	spin_lock_bh(&priv->tx_lock);
	spin_lock_bh(&priv->tx.tx_lock);
	if ((tid < ATH9K_HTC_MAX_TID) && (ista->tid_state[tid] == AGGR_STOP))
		ret = true;
	spin_unlock_bh(&priv->tx_lock);
	spin_unlock_bh(&priv->tx.tx_lock);

	return ret;
}
@@ -257,7 +257,7 @@ void ath9k_tx_tasklet(unsigned long data)
	struct sk_buff *skb = NULL;
	__le16 fc;

	while ((skb = skb_dequeue(&priv->tx_queue)) != NULL) {
	while ((skb = skb_dequeue(&priv->tx.tx_queue)) != NULL) {

		hdr = (struct ieee80211_hdr *) skb->data;
		fc = hdr->frame_control;
@@ -292,9 +292,9 @@ void ath9k_tx_tasklet(unsigned long data)

				if (ath9k_htc_check_tx_aggr(priv, ista, tid)) {
					ieee80211_start_tx_ba_session(sta, tid, 0);
					spin_lock_bh(&priv->tx_lock);
					spin_lock_bh(&priv->tx.tx_lock);
					ista->tid_state[tid] = AGGR_PROGRESS;
					spin_unlock_bh(&priv->tx_lock);
					spin_unlock_bh(&priv->tx.tx_lock);
				}
			}
		}
@@ -307,16 +307,16 @@ void ath9k_tx_tasklet(unsigned long data)
	}

	/* Wake TX queues if needed */
	spin_lock_bh(&priv->tx_lock);
	if (priv->tx_queues_stop) {
		priv->tx_queues_stop = false;
		spin_unlock_bh(&priv->tx_lock);
	spin_lock_bh(&priv->tx.tx_lock);
	if (priv->tx.tx_queues_stop) {
		priv->tx.tx_queues_stop = false;
		spin_unlock_bh(&priv->tx.tx_lock);
		ath_dbg(ath9k_hw_common(priv->ah), ATH_DBG_XMIT,
			"Waking up TX queues\n");
		ieee80211_wake_queues(priv->hw);
		return;
	}
	spin_unlock_bh(&priv->tx_lock);
	spin_unlock_bh(&priv->tx.tx_lock);
}

void ath9k_htc_txep(void *drv_priv, struct sk_buff *skb,
@@ -348,13 +348,13 @@ void ath9k_htc_txep(void *drv_priv, struct sk_buff *skb,
	if (txok)
		tx_info->flags |= IEEE80211_TX_STAT_ACK;

	skb_queue_tail(&priv->tx_queue, skb);
	skb_queue_tail(&priv->tx.tx_queue, skb);
	tasklet_schedule(&priv->tx_tasklet);
}

int ath9k_tx_init(struct ath9k_htc_priv *priv)
{
	skb_queue_head_init(&priv->tx_queue);
	skb_queue_head_init(&priv->tx.tx_queue);
	return 0;
}