mirror of
https://github.com/edk2-porting/linux-next.git
synced 2025-01-21 12:04:03 +08:00
rt2x00: add mutex to synchronize config and link tuner
Do not perform mac80211 config and link_tuner at the same time, this can possibly result in wrong RF or BBP configuration. Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com> Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
This commit is contained in:
parent
31369c323b
commit
c7d1c77781
@ -833,6 +833,10 @@ struct rt2x00_dev {
|
|||||||
*/
|
*/
|
||||||
struct mutex csr_mutex;
|
struct mutex csr_mutex;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Mutex to synchronize config and link tuner.
|
||||||
|
*/
|
||||||
|
struct mutex conf_mutex;
|
||||||
/*
|
/*
|
||||||
* Current packet filter configuration for the device.
|
* Current packet filter configuration for the device.
|
||||||
* This contains all currently active FIF_* flags send
|
* This contains all currently active FIF_* flags send
|
||||||
|
@ -1313,6 +1313,7 @@ int rt2x00lib_probe_dev(struct rt2x00_dev *rt2x00dev)
|
|||||||
|
|
||||||
spin_lock_init(&rt2x00dev->irqmask_lock);
|
spin_lock_init(&rt2x00dev->irqmask_lock);
|
||||||
mutex_init(&rt2x00dev->csr_mutex);
|
mutex_init(&rt2x00dev->csr_mutex);
|
||||||
|
mutex_init(&rt2x00dev->conf_mutex);
|
||||||
INIT_LIST_HEAD(&rt2x00dev->bar_list);
|
INIT_LIST_HEAD(&rt2x00dev->bar_list);
|
||||||
spin_lock_init(&rt2x00dev->bar_list_lock);
|
spin_lock_init(&rt2x00dev->bar_list_lock);
|
||||||
|
|
||||||
|
@ -363,6 +363,9 @@ static void rt2x00link_tuner(struct work_struct *work)
|
|||||||
test_bit(DEVICE_STATE_SCANNING, &rt2x00dev->flags))
|
test_bit(DEVICE_STATE_SCANNING, &rt2x00dev->flags))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
/* Do not race with rt2x00mac_config(). */
|
||||||
|
mutex_lock(&rt2x00dev->conf_mutex);
|
||||||
|
|
||||||
if (rt2x00dev->intf_sta_count)
|
if (rt2x00dev->intf_sta_count)
|
||||||
rt2x00link_tuner_sta(rt2x00dev, link);
|
rt2x00link_tuner_sta(rt2x00dev, link);
|
||||||
|
|
||||||
@ -375,6 +378,8 @@ static void rt2x00link_tuner(struct work_struct *work)
|
|||||||
(link->count % (VCO_SECONDS / LINK_TUNE_SECONDS)) == 0)
|
(link->count % (VCO_SECONDS / LINK_TUNE_SECONDS)) == 0)
|
||||||
rt2x00dev->ops->lib->vco_calibration(rt2x00dev);
|
rt2x00dev->ops->lib->vco_calibration(rt2x00dev);
|
||||||
|
|
||||||
|
mutex_unlock(&rt2x00dev->conf_mutex);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Increase tuner counter, and reschedule the next link tuner run.
|
* Increase tuner counter, and reschedule the next link tuner run.
|
||||||
*/
|
*/
|
||||||
|
@ -320,6 +320,9 @@ int rt2x00mac_config(struct ieee80211_hw *hw, u32 changed)
|
|||||||
*/
|
*/
|
||||||
rt2x00queue_stop_queue(rt2x00dev->rx);
|
rt2x00queue_stop_queue(rt2x00dev->rx);
|
||||||
|
|
||||||
|
/* Do not race with with link tuner. */
|
||||||
|
mutex_lock(&rt2x00dev->conf_mutex);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* When we've just turned on the radio, we want to reprogram
|
* When we've just turned on the radio, we want to reprogram
|
||||||
* everything to ensure a consistent state
|
* everything to ensure a consistent state
|
||||||
@ -335,6 +338,8 @@ int rt2x00mac_config(struct ieee80211_hw *hw, u32 changed)
|
|||||||
*/
|
*/
|
||||||
rt2x00lib_config_antenna(rt2x00dev, rt2x00dev->default_ant);
|
rt2x00lib_config_antenna(rt2x00dev, rt2x00dev->default_ant);
|
||||||
|
|
||||||
|
mutex_unlock(&rt2x00dev->conf_mutex);
|
||||||
|
|
||||||
/* Turn RX back on */
|
/* Turn RX back on */
|
||||||
rt2x00queue_start_queue(rt2x00dev->rx);
|
rt2x00queue_start_queue(rt2x00dev->rx);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user