Lines Matching refs:wmi

91 struct wmi *ath9k_init_wmi(struct ath9k_htc_priv *priv)  in ath9k_init_wmi()
93 struct wmi *wmi; in ath9k_init_wmi() local
95 wmi = kzalloc(sizeof(struct wmi), GFP_KERNEL); in ath9k_init_wmi()
96 if (!wmi) in ath9k_init_wmi()
99 wmi->drv_priv = priv; in ath9k_init_wmi()
100 wmi->stopped = false; in ath9k_init_wmi()
101 skb_queue_head_init(&wmi->wmi_event_queue); in ath9k_init_wmi()
102 spin_lock_init(&wmi->wmi_lock); in ath9k_init_wmi()
103 spin_lock_init(&wmi->event_lock); in ath9k_init_wmi()
104 mutex_init(&wmi->op_mutex); in ath9k_init_wmi()
105 mutex_init(&wmi->multi_write_mutex); in ath9k_init_wmi()
106 mutex_init(&wmi->multi_rmw_mutex); in ath9k_init_wmi()
107 init_completion(&wmi->cmd_wait); in ath9k_init_wmi()
108 INIT_LIST_HEAD(&wmi->pending_tx_events); in ath9k_init_wmi()
109 tasklet_init(&wmi->wmi_event_tasklet, ath9k_wmi_event_tasklet, in ath9k_init_wmi()
110 (unsigned long)wmi); in ath9k_init_wmi()
112 return wmi; in ath9k_init_wmi()
117 struct wmi *wmi = priv->wmi; in ath9k_deinit_wmi() local
119 mutex_lock(&wmi->op_mutex); in ath9k_deinit_wmi()
120 wmi->stopped = true; in ath9k_deinit_wmi()
121 mutex_unlock(&wmi->op_mutex); in ath9k_deinit_wmi()
123 kfree(priv->wmi); in ath9k_deinit_wmi()
130 tasklet_kill(&priv->wmi->wmi_event_tasklet); in ath9k_wmi_event_drain()
131 spin_lock_irqsave(&priv->wmi->wmi_lock, flags); in ath9k_wmi_event_drain()
132 __skb_queue_purge(&priv->wmi->wmi_event_queue); in ath9k_wmi_event_drain()
133 spin_unlock_irqrestore(&priv->wmi->wmi_lock, flags); in ath9k_wmi_event_drain()
138 struct wmi *wmi = (struct wmi *)data; in ath9k_wmi_event_tasklet() local
139 struct ath9k_htc_priv *priv = wmi->drv_priv; in ath9k_wmi_event_tasklet()
148 spin_lock_irqsave(&wmi->wmi_lock, flags); in ath9k_wmi_event_tasklet()
149 skb = __skb_dequeue(&wmi->wmi_event_queue); in ath9k_wmi_event_tasklet()
151 spin_unlock_irqrestore(&wmi->wmi_lock, flags); in ath9k_wmi_event_tasklet()
154 spin_unlock_irqrestore(&wmi->wmi_lock, flags); in ath9k_wmi_event_tasklet()
166 ieee80211_queue_work(wmi->drv_priv->hw, in ath9k_wmi_event_tasklet()
167 &wmi->drv_priv->fatal_work); in ath9k_wmi_event_tasklet()
197 static void ath9k_wmi_rsp_callback(struct wmi *wmi, struct sk_buff *skb) in ath9k_wmi_rsp_callback() argument
201 if (wmi->cmd_rsp_buf != NULL && wmi->cmd_rsp_len != 0) in ath9k_wmi_rsp_callback()
202 memcpy(wmi->cmd_rsp_buf, skb->data, wmi->cmd_rsp_len); in ath9k_wmi_rsp_callback()
204 complete(&wmi->cmd_wait); in ath9k_wmi_rsp_callback()
210 struct wmi *wmi = (struct wmi *) priv; in ath9k_wmi_ctrl_rx() local
214 if (unlikely(wmi->stopped)) in ath9k_wmi_ctrl_rx()
221 spin_lock(&wmi->wmi_lock); in ath9k_wmi_ctrl_rx()
222 __skb_queue_tail(&wmi->wmi_event_queue, skb); in ath9k_wmi_ctrl_rx()
223 spin_unlock(&wmi->wmi_lock); in ath9k_wmi_ctrl_rx()
224 tasklet_schedule(&wmi->wmi_event_tasklet); in ath9k_wmi_ctrl_rx()
229 spin_lock(&wmi->wmi_lock); in ath9k_wmi_ctrl_rx()
230 if (be16_to_cpu(hdr->seq_no) != wmi->last_seq_id) { in ath9k_wmi_ctrl_rx()
231 spin_unlock(&wmi->wmi_lock); in ath9k_wmi_ctrl_rx()
234 spin_unlock(&wmi->wmi_lock); in ath9k_wmi_ctrl_rx()
237 ath9k_wmi_rsp_callback(wmi, skb); in ath9k_wmi_ctrl_rx()
249 int ath9k_wmi_connect(struct htc_target *htc, struct wmi *wmi, in ath9k_wmi_connect() argument
255 wmi->htc = htc; in ath9k_wmi_connect()
259 connect.ep_callbacks.priv = wmi; in ath9k_wmi_connect()
264 ret = htc_connect_service(htc, &connect, &wmi->ctrl_epid); in ath9k_wmi_connect()
268 *wmi_ctrl_epid = wmi->ctrl_epid; in ath9k_wmi_connect()
273 static int ath9k_wmi_cmd_issue(struct wmi *wmi, in ath9k_wmi_cmd_issue() argument
282 hdr->seq_no = cpu_to_be16(++wmi->tx_seq_id); in ath9k_wmi_cmd_issue()
284 spin_lock_irqsave(&wmi->wmi_lock, flags); in ath9k_wmi_cmd_issue()
285 wmi->last_seq_id = wmi->tx_seq_id; in ath9k_wmi_cmd_issue()
286 spin_unlock_irqrestore(&wmi->wmi_lock, flags); in ath9k_wmi_cmd_issue()
288 return htc_send_epid(wmi->htc, skb, wmi->ctrl_epid); in ath9k_wmi_cmd_issue()
291 int ath9k_wmi_cmd(struct wmi *wmi, enum wmi_cmd_id cmd_id, in ath9k_wmi_cmd() argument
296 struct ath_hw *ah = wmi->drv_priv->ah; in ath9k_wmi_cmd()
319 mutex_lock(&wmi->op_mutex); in ath9k_wmi_cmd()
322 if (unlikely(wmi->stopped)) { in ath9k_wmi_cmd()
328 wmi->cmd_rsp_buf = rsp_buf; in ath9k_wmi_cmd()
329 wmi->cmd_rsp_len = rsp_len; in ath9k_wmi_cmd()
331 ret = ath9k_wmi_cmd_issue(wmi, skb, cmd_id, cmd_len); in ath9k_wmi_cmd()
335 time_left = wait_for_completion_timeout(&wmi->cmd_wait, timeout); in ath9k_wmi_cmd()
339 mutex_unlock(&wmi->op_mutex); in ath9k_wmi_cmd()
343 mutex_unlock(&wmi->op_mutex); in ath9k_wmi_cmd()
349 mutex_unlock(&wmi->op_mutex); in ath9k_wmi_cmd()