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

Commit adf26a35 authored by Stanislaw Gruszka's avatar Stanislaw Gruszka Committed by Kalle Valo
Browse files

rt2x00: use different txstatus timeouts when flushing



Use different tx status timeouts for normal operation and when flushing.
This increase timeout to 2s for normal operation as when there are bad
radio conditions and frames are reposted many times device can not provide
the status for quite long. With new timeout we can still get valid status
on such bad conditions.

Signed-off-by: default avatarStanislaw Gruszka <sgruszka@redhat.com>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
parent 5022efb5
Loading
Loading
Loading
Loading
+21 −10
Original line number Diff line number Diff line
@@ -1137,36 +1137,47 @@ void rt2800_txdone(struct rt2x00_dev *rt2x00dev)
}
EXPORT_SYMBOL_GPL(rt2800_txdone);

static inline bool rt2800_entry_txstatus_timeout(struct queue_entry *entry)
static inline bool rt2800_entry_txstatus_timeout(struct rt2x00_dev *rt2x00dev,
						 struct queue_entry *entry)
{
	bool tout;
	bool ret;
	unsigned long tout;

	if (!test_bit(ENTRY_DATA_STATUS_PENDING, &entry->flags))
		return false;

	tout = time_after(jiffies, entry->last_action + msecs_to_jiffies(500));
	if (unlikely(tout))
	if (test_bit(DEVICE_STATE_FLUSHING, &rt2x00dev->flags))
		tout = msecs_to_jiffies(100);
	else
		tout = msecs_to_jiffies(2000);

	ret = time_after(jiffies, entry->last_action + tout);
	if (unlikely(ret))
		rt2x00_dbg(entry->queue->rt2x00dev,
			   "TX status timeout for entry %d in queue %d\n",
			   entry->entry_idx, entry->queue->qid);
	return tout;

	return ret;
}

bool rt2800_txstatus_timeout(struct rt2x00_dev *rt2x00dev)
{
	struct data_queue *queue;
	struct queue_entry *entry;
	unsigned long tout;

	if (test_bit(DEVICE_STATE_FLUSHING, &rt2x00dev->flags))
		tout = msecs_to_jiffies(50);
	else
		tout = msecs_to_jiffies(1000);

	if (time_before(jiffies,
			rt2x00dev->last_nostatus_check + msecs_to_jiffies(500)))
	if (time_before(jiffies, rt2x00dev->last_nostatus_check + tout))
		return false;

	rt2x00dev->last_nostatus_check = jiffies;

	tx_queue_for_each(rt2x00dev, queue) {
		entry = rt2x00queue_get_entry(queue, Q_INDEX_DONE);
		if (rt2800_entry_txstatus_timeout(entry))
		if (rt2800_entry_txstatus_timeout(rt2x00dev, entry))
			return true;
	}

@@ -1195,7 +1206,7 @@ void rt2800_txdone_nostatus(struct rt2x00_dev *rt2x00dev)
				break;

			if (test_bit(ENTRY_DATA_IO_FAILED, &entry->flags) ||
			    rt2800_entry_txstatus_timeout(entry))
			    rt2800_entry_txstatus_timeout(rt2x00dev, entry))
				rt2x00lib_txdone_noinfo(entry, TXDONE_FAILURE);
			else
				break;
+1 −0
Original line number Diff line number Diff line
@@ -665,6 +665,7 @@ enum rt2x00_state_flags {
	DEVICE_STATE_STARTED,
	DEVICE_STATE_ENABLED_RADIO,
	DEVICE_STATE_SCANNING,
	DEVICE_STATE_FLUSHING,

	/*
	 * Driver configuration
+4 −0
Original line number Diff line number Diff line
@@ -720,8 +720,12 @@ void rt2x00mac_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
	if (!test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags))
		return;

	set_bit(DEVICE_STATE_FLUSHING, &rt2x00dev->flags);

	tx_queue_for_each(rt2x00dev, queue)
		rt2x00queue_flush_queue(queue, drop);

	clear_bit(DEVICE_STATE_FLUSHING, &rt2x00dev->flags);
}
EXPORT_SYMBOL_GPL(rt2x00mac_flush);