Lines Matching refs:priv
15 static void cw1200_scan_restart_delayed(struct cw1200_common *priv);
17 static int cw1200_scan_start(struct cw1200_common *priv, struct wsm_scan *scan)
22 switch (priv->join_status) {
30 wiphy_dbg(priv->hw->wiphy, "[SCAN] hw req, type %d, %d channels, flags: 0x%x.\n",
36 cancel_delayed_work_sync(&priv->clear_recent_scan_work);
37 atomic_set(&priv->scan.in_progress, 1);
38 atomic_set(&priv->recent_scan, 1);
39 cw1200_pm_stay_awake(&priv->pm_state, msecs_to_jiffies(tmo));
40 queue_delayed_work(priv->workqueue, &priv->scan.timeout,
42 ret = wsm_scan(priv, scan);
44 atomic_set(&priv->scan.in_progress, 0);
45 cancel_delayed_work_sync(&priv->scan.timeout);
46 cw1200_scan_restart_delayed(priv);
55 struct cw1200_common *priv = hw->priv;
62 if (!priv->vif)
66 if (priv->join_status == CW1200_JOIN_STATUS_AP)
78 frame.skb = ieee80211_probereq_get(hw, priv->vif->addr, NULL, 0,
87 down(&priv->scan.lock);
88 mutex_lock(&priv->conf_mutex);
90 ret = wsm_set_template_frame(priv, &frame);
93 ret = wsm_set_probe_responder(priv, true);
96 mutex_unlock(&priv->conf_mutex);
97 up(&priv->scan.lock);
102 wsm_lock_tx(priv);
104 BUG_ON(priv->scan.req);
105 priv->scan.req = req;
106 priv->scan.n_ssids = 0;
107 priv->scan.status = 0;
108 priv->scan.begin = &req->channels[0];
109 priv->scan.curr = priv->scan.begin;
110 priv->scan.end = &req->channels[req->n_channels];
111 priv->scan.output_power = priv->output_power;
114 struct wsm_ssid *dst = &priv->scan.ssids[priv->scan.n_ssids];
117 ++priv->scan.n_ssids;
120 mutex_unlock(&priv->conf_mutex);
122 queue_work(priv->workqueue, &priv->scan.work);
128 struct cw1200_common *priv = container_of(work, struct cw1200_common,
135 bool first_run = (priv->scan.begin == priv->scan.curr &&
136 priv->scan.begin != priv->scan.end);
144 if (cancel_delayed_work_sync(&priv->join_timeout) > 0)
145 cw1200_join_timeout(&priv->join_timeout.work);
148 mutex_lock(&priv->conf_mutex);
151 if (priv->join_status == CW1200_JOIN_STATUS_STA &&
152 !(priv->powersave_mode.mode & WSM_PSM_PS)) {
153 struct wsm_set_pm pm = priv->powersave_mode;
155 cw1200_set_pm(priv, &pm);
156 } else if (priv->join_status == CW1200_JOIN_STATUS_MONITOR) {
160 cw1200_disable_listening(priv);
164 if (!priv->scan.req || (priv->scan.curr == priv->scan.end)) {
166 .aborted = priv->scan.status ? 1 : 0,
169 if (priv->scan.output_power != priv->output_power)
170 wsm_set_output_power(priv, priv->output_power * 10);
171 if (priv->join_status == CW1200_JOIN_STATUS_STA &&
172 !(priv->powersave_mode.mode & WSM_PSM_PS))
173 cw1200_set_pm(priv, &priv->powersave_mode);
175 if (priv->scan.status < 0)
176 wiphy_warn(priv->hw->wiphy,
178 priv->scan.status);
179 else if (priv->scan.req)
180 wiphy_dbg(priv->hw->wiphy,
183 wiphy_dbg(priv->hw->wiphy,
186 priv->scan.req = NULL;
187 cw1200_scan_restart_delayed(priv);
188 wsm_unlock_tx(priv);
189 mutex_unlock(&priv->conf_mutex);
190 ieee80211_scan_completed(priv->hw, &info);
191 up(&priv->scan.lock);
194 struct ieee80211_channel *first = *priv->scan.curr;
195 for (it = priv->scan.curr + 1, i = 1;
196 it != priv->scan.end && i < WSM_SCAN_MAX_NUM_OF_CHANNELS;
209 if (priv->scan.req->no_cck)
215 scan.num_ssids = priv->scan.n_ssids;
216 scan.ssids = &priv->scan.ssids[0];
217 scan.num_channels = it - priv->scan.curr;
224 if (priv->join_status == CW1200_JOIN_STATUS_STA) {
228 scan.ch = kcalloc(it - priv->scan.curr,
232 priv->scan.status = -ENOMEM;
236 scan.ch[i].number = priv->scan.curr[i]->hw_value;
237 if (priv->scan.curr[i]->flags & IEEE80211_CHAN_NO_IR) {
246 priv->scan.output_power != first->max_power) {
247 priv->scan.output_power = first->max_power;
248 wsm_set_output_power(priv,
249 priv->scan.output_power * 10);
251 priv->scan.status = cw1200_scan_start(priv, &scan);
253 if (priv->scan.status)
255 priv->scan.curr = it;
257 mutex_unlock(&priv->conf_mutex);
261 priv->scan.curr = priv->scan.end;
262 mutex_unlock(&priv->conf_mutex);
263 queue_work(priv->workqueue, &priv->scan.work);
267 static void cw1200_scan_restart_delayed(struct cw1200_common *priv)
270 if (priv->join_status == CW1200_JOIN_STATUS_MONITOR) {
271 cw1200_enable_listening(priv);
272 cw1200_update_filtering(priv);
275 if (priv->delayed_unjoin) {
276 priv->delayed_unjoin = false;
277 if (queue_work(priv->workqueue, &priv->unjoin_work) <= 0)
278 wsm_unlock_tx(priv);
279 } else if (priv->delayed_link_loss) {
280 wiphy_dbg(priv->hw->wiphy, "[CQM] Requeue BSS loss.\n");
281 priv->delayed_link_loss = 0;
282 cw1200_cqm_bssloss_sm(priv, 1, 0, 0);
286 static void cw1200_scan_complete(struct cw1200_common *priv)
288 queue_delayed_work(priv->workqueue, &priv->clear_recent_scan_work, HZ);
289 if (priv->scan.direct_probe) {
290 wiphy_dbg(priv->hw->wiphy, "[SCAN] Direct probe complete.\n");
291 cw1200_scan_restart_delayed(priv);
292 priv->scan.direct_probe = 0;
293 up(&priv->scan.lock);
294 wsm_unlock_tx(priv);
296 cw1200_scan_work(&priv->scan.work);
300 void cw1200_scan_failed_cb(struct cw1200_common *priv)
302 if (priv->mode == NL80211_IFTYPE_UNSPECIFIED)
306 if (cancel_delayed_work_sync(&priv->scan.timeout) > 0) {
307 priv->scan.status = -EIO;
308 queue_delayed_work(priv->workqueue, &priv->scan.timeout, 0);
313 void cw1200_scan_complete_cb(struct cw1200_common *priv,
316 if (priv->mode == NL80211_IFTYPE_UNSPECIFIED)
320 if (cancel_delayed_work_sync(&priv->scan.timeout) > 0) {
321 priv->scan.status = 1;
322 queue_delayed_work(priv->workqueue, &priv->scan.timeout, 0);
328 struct cw1200_common *priv =
331 atomic_xchg(&priv->recent_scan, 0);
336 struct cw1200_common *priv =
338 if (atomic_xchg(&priv->scan.in_progress, 0)) {
339 if (priv->scan.status > 0) {
340 priv->scan.status = 0;
341 } else if (!priv->scan.status) {
342 wiphy_warn(priv->hw->wiphy,
344 priv->scan.status = -ETIMEDOUT;
345 priv->scan.curr = priv->scan.end;
346 wsm_stop_scan(priv);
348 cw1200_scan_complete(priv);
354 struct cw1200_common *priv =
356 u8 queue_id = cw1200_queue_get_queue_id(priv->pending_frame_id);
357 struct cw1200_queue *queue = &priv->tx_queue[queue_id];
382 wiphy_dbg(priv->hw->wiphy, "[SCAN] Direct probe work.\n");
384 mutex_lock(&priv->conf_mutex);
385 if (down_trylock(&priv->scan.lock)) {
388 queue_delayed_work(priv->workqueue, &priv->scan.probe_work,
390 mutex_unlock(&priv->conf_mutex);
395 if (cw1200_queue_get_skb(queue, priv->pending_frame_id,
397 up(&priv->scan.lock);
398 mutex_unlock(&priv->conf_mutex);
399 wsm_unlock_tx(priv);
404 scan.band = (priv->channel->band == NL80211_BAND_5GHZ) ?
406 if (priv->join_status == CW1200_JOIN_STATUS_STA ||
407 priv->join_status == CW1200_JOIN_STATUS_IBSS) {
411 ch[0].number = priv->channel->hw_value;
440 if (priv->join_status == CW1200_JOIN_STATUS_MONITOR)
441 cw1200_disable_listening(priv);
442 ret = wsm_set_template_frame(priv, &frame);
443 priv->scan.direct_probe = 1;
445 wsm_flush_tx(priv);
446 ret = cw1200_scan_start(priv, &scan);
448 mutex_unlock(&priv->conf_mutex);
453 BUG_ON(cw1200_queue_remove(queue, priv->pending_frame_id));
456 priv->scan.direct_probe = 0;
457 up(&priv->scan.lock);
458 wsm_unlock_tx(priv);