Loading drivers/net/wireless/mwl8k.c +38 −63 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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, Loading Loading
drivers/net/wireless/mwl8k.c +38 −63 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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, Loading