mwl8k: get rid of mwl8k_bss_info_changed() workqueue use

Signed-off-by: Lennert Buytenhek <buytenh@marvell.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
Lennert Buytenhek 2009-07-17 07:21:46 +02:00 committed by John W. Linville
parent ee03a93241
commit 3a980d0a50

View File

@ -2663,58 +2663,62 @@ static int mwl8k_config(struct ieee80211_hw *hw, u32 changed)
return rc;
}
struct mwl8k_bss_info_changed_worker {
struct mwl8k_work_struct header;
struct ieee80211_vif *vif;
struct ieee80211_bss_conf *info;
u32 changed;
};
static int mwl8k_bss_info_changed_wt(struct work_struct *wt)
static void mwl8k_bss_info_changed(struct ieee80211_hw *hw,
struct ieee80211_vif *vif,
struct ieee80211_bss_conf *info,
u32 changed)
{
struct mwl8k_bss_info_changed_worker *worker =
(struct mwl8k_bss_info_changed_worker *)wt;
struct ieee80211_hw *hw = worker->header.hw;
struct ieee80211_vif *vif = worker->vif;
struct ieee80211_bss_conf *info = worker->info;
u32 changed;
int rc;
struct mwl8k_priv *priv = hw->priv;
struct mwl8k_vif *mwl8k_vif = MWL8K_VIF(vif);
int rc;
if (changed & BSS_CHANGED_BSSID)
memcpy(mwl8k_vif->bssid, info->bssid, ETH_ALEN);
if ((changed & BSS_CHANGED_ASSOC) == 0)
return;
changed = worker->changed;
priv->capture_beacon = false;
rc = mwl8k_fw_lock(hw);
if (!rc)
return;
if (info->assoc) {
memcpy(&mwl8k_vif->bss_info, info,
sizeof(struct ieee80211_bss_conf));
/* Install rates */
if (mwl8k_update_rateset(hw, vif))
goto mwl8k_bss_info_changed_exit;
rc = mwl8k_update_rateset(hw, vif);
if (rc)
goto out;
/* Turn on rate adaptation */
if (mwl8k_cmd_use_fixed_rate(hw, MWL8K_USE_AUTO_RATE,
MWL8K_UCAST_RATE, NULL))
goto mwl8k_bss_info_changed_exit;
rc = mwl8k_cmd_use_fixed_rate(hw, MWL8K_USE_AUTO_RATE,
MWL8K_UCAST_RATE, NULL);
if (rc)
goto out;
/* Set radio preamble */
if (mwl8k_set_radio_preamble(hw, info->use_short_preamble))
goto mwl8k_bss_info_changed_exit;
rc = mwl8k_set_radio_preamble(hw, info->use_short_preamble);
if (rc)
goto out;
/* Set slot time */
if (mwl8k_cmd_set_slot(hw, info->use_short_slot))
goto mwl8k_bss_info_changed_exit;
rc = mwl8k_cmd_set_slot(hw, info->use_short_slot);
if (rc)
goto out;
/* Update peer rate info */
if (mwl8k_cmd_update_sta_db(hw, vif,
MWL8K_STA_DB_MODIFY_ENTRY))
goto mwl8k_bss_info_changed_exit;
rc = mwl8k_cmd_update_sta_db(hw, vif,
MWL8K_STA_DB_MODIFY_ENTRY);
if (rc)
goto out;
/* Set AID */
if (mwl8k_cmd_set_aid(hw, vif))
goto mwl8k_bss_info_changed_exit;
rc = mwl8k_cmd_set_aid(hw, vif);
if (rc)
goto out;
/*
* Finalize the join. Tell rx handler to process
@ -2723,43 +2727,14 @@ static int mwl8k_bss_info_changed_wt(struct work_struct *wt)
memcpy(priv->capture_bssid, mwl8k_vif->bssid, ETH_ALEN);
priv->capture_beacon = true;
} else {
mwl8k_cmd_update_sta_db(hw, vif, MWL8K_STA_DB_DEL_ENTRY);
rc = mwl8k_cmd_update_sta_db(hw, vif, MWL8K_STA_DB_DEL_ENTRY);
memset(&mwl8k_vif->bss_info, 0,
sizeof(struct ieee80211_bss_conf));
memset(mwl8k_vif->bssid, 0, ETH_ALEN);
}
mwl8k_bss_info_changed_exit:
rc = 0;
return rc;
}
static void mwl8k_bss_info_changed(struct ieee80211_hw *hw,
struct ieee80211_vif *vif,
struct ieee80211_bss_conf *info,
u32 changed)
{
struct mwl8k_bss_info_changed_worker *worker;
struct mwl8k_vif *mv_vif = MWL8K_VIF(vif);
int rc;
if (changed & BSS_CHANGED_BSSID)
memcpy(mv_vif->bssid, info->bssid, ETH_ALEN);
if ((changed & BSS_CHANGED_ASSOC) == 0)
return;
worker = kzalloc(sizeof(*worker), GFP_KERNEL);
if (worker == NULL)
return;
worker->vif = vif;
worker->info = info;
worker->changed = changed;
rc = mwl8k_queue_work(hw, &worker->header, mwl8k_bss_info_changed_wt);
kfree(worker);
if (rc == -ETIMEDOUT)
printk(KERN_ERR "%s() timed out\n", __func__);
out:
mwl8k_fw_unlock(hw);
}
static u64 mwl8k_prepare_multicast(struct ieee80211_hw *hw,