|
@@ -2425,70 +2425,6 @@ static int mwl8k_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
|
|
|
return rc;
|
|
|
}
|
|
|
|
|
|
-struct mwl8k_work_struct {
|
|
|
- /* Initialized by mwl8k_queue_work(). */
|
|
|
- struct work_struct wt;
|
|
|
-
|
|
|
- /* Required field passed in to mwl8k_queue_work(). */
|
|
|
- struct ieee80211_hw *hw;
|
|
|
-
|
|
|
- /* Required field passed in to mwl8k_queue_work(). */
|
|
|
- int (*wfunc)(struct work_struct *w);
|
|
|
-
|
|
|
- /* Initialized by mwl8k_queue_work(). */
|
|
|
- struct completion *cmd_wait;
|
|
|
-
|
|
|
- /* Result code. */
|
|
|
- int rc;
|
|
|
-};
|
|
|
-
|
|
|
-static void mwl8k_config_thread(struct work_struct *wt)
|
|
|
-{
|
|
|
- struct mwl8k_work_struct *worker = (struct mwl8k_work_struct *)wt;
|
|
|
- struct ieee80211_hw *hw = worker->hw;
|
|
|
- int rc = 0;
|
|
|
-
|
|
|
- rc = mwl8k_fw_lock(hw);
|
|
|
- if (!rc) {
|
|
|
- rc = worker->wfunc(wt);
|
|
|
- mwl8k_fw_unlock(hw);
|
|
|
- }
|
|
|
-
|
|
|
- worker->rc = rc;
|
|
|
- complete(worker->cmd_wait);
|
|
|
-}
|
|
|
-
|
|
|
-static int mwl8k_queue_work(struct ieee80211_hw *hw,
|
|
|
- struct mwl8k_work_struct *worker,
|
|
|
- int (*wfunc)(struct work_struct *w))
|
|
|
-{
|
|
|
- struct mwl8k_priv *priv = hw->priv;
|
|
|
- unsigned long timeout = 0;
|
|
|
- int rc = 0;
|
|
|
-
|
|
|
- DECLARE_COMPLETION_ONSTACK(cmd_wait);
|
|
|
-
|
|
|
- worker->hw = hw;
|
|
|
- worker->cmd_wait = &cmd_wait;
|
|
|
- worker->rc = 1;
|
|
|
- worker->wfunc = wfunc;
|
|
|
-
|
|
|
- INIT_WORK(&worker->wt, mwl8k_config_thread);
|
|
|
- queue_work(priv->config_wq, &worker->wt);
|
|
|
-
|
|
|
- timeout = wait_for_completion_timeout(&cmd_wait,
|
|
|
- msecs_to_jiffies(10000));
|
|
|
-
|
|
|
- if (timeout)
|
|
|
- rc = worker->rc;
|
|
|
- else {
|
|
|
- cancel_work_sync(&worker->wt);
|
|
|
- rc = -ETIMEDOUT;
|
|
|
- }
|
|
|
-
|
|
|
- return rc;
|
|
|
-}
|
|
|
-
|
|
|
static int mwl8k_start(struct ieee80211_hw *hw)
|
|
|
{
|
|
|
struct mwl8k_priv *priv = hw->priv;
|