Lines Matching refs:priv
84 static int wsm_cmd_send(struct cw1200_common *priv,
94 static int wsm_generic_confirm(struct cw1200_common *priv, in wsm_generic_confirm() argument
108 int wsm_configuration(struct cw1200_common *priv, struct wsm_configuration *arg) in wsm_configuration() argument
111 struct wsm_buf *buf = &priv->wsm_cmd_buf; in wsm_configuration()
113 wsm_cmd_lock(priv); in wsm_configuration()
126 ret = wsm_cmd_send(priv, buf, arg, in wsm_configuration()
129 wsm_cmd_unlock(priv); in wsm_configuration()
133 wsm_cmd_unlock(priv); in wsm_configuration()
137 static int wsm_configuration_confirm(struct cw1200_common *priv, in wsm_configuration_confirm() argument
166 int wsm_reset(struct cw1200_common *priv, const struct wsm_reset *arg) in wsm_reset() argument
169 struct wsm_buf *buf = &priv->wsm_cmd_buf; in wsm_reset()
172 wsm_cmd_lock(priv); in wsm_reset()
175 ret = wsm_cmd_send(priv, buf, NULL, cmd, WSM_CMD_RESET_TIMEOUT); in wsm_reset()
176 wsm_cmd_unlock(priv); in wsm_reset()
180 wsm_cmd_unlock(priv); in wsm_reset()
192 int wsm_read_mib(struct cw1200_common *priv, u16 mib_id, void *_buf, in wsm_read_mib() argument
196 struct wsm_buf *buf = &priv->wsm_cmd_buf; in wsm_read_mib()
202 wsm_cmd_lock(priv); in wsm_read_mib()
207 ret = wsm_cmd_send(priv, buf, &mib_buf, in wsm_read_mib()
209 wsm_cmd_unlock(priv); in wsm_read_mib()
213 wsm_cmd_unlock(priv); in wsm_read_mib()
217 static int wsm_read_mib_confirm(struct cw1200_common *priv, in wsm_read_mib_confirm() argument
243 int wsm_write_mib(struct cw1200_common *priv, u16 mib_id, void *_buf, in wsm_write_mib() argument
247 struct wsm_buf *buf = &priv->wsm_cmd_buf; in wsm_write_mib()
254 wsm_cmd_lock(priv); in wsm_write_mib()
260 ret = wsm_cmd_send(priv, buf, &mib_buf, in wsm_write_mib()
262 wsm_cmd_unlock(priv); in wsm_write_mib()
266 wsm_cmd_unlock(priv); in wsm_write_mib()
270 static int wsm_write_mib_confirm(struct cw1200_common *priv, in wsm_write_mib_confirm() argument
276 ret = wsm_generic_confirm(priv, arg, buf); in wsm_write_mib_confirm()
283 cw1200_enable_powersave(priv, (p[0] & 0x0F) ? true : false); in wsm_write_mib_confirm()
290 int wsm_scan(struct cw1200_common *priv, const struct wsm_scan *arg) in wsm_scan() argument
294 struct wsm_buf *buf = &priv->wsm_cmd_buf; in wsm_scan()
305 wsm_cmd_lock(priv); in wsm_scan()
331 ret = wsm_cmd_send(priv, buf, NULL, in wsm_scan()
333 wsm_cmd_unlock(priv); in wsm_scan()
337 wsm_cmd_unlock(priv); in wsm_scan()
343 int wsm_stop_scan(struct cw1200_common *priv) in wsm_stop_scan() argument
346 struct wsm_buf *buf = &priv->wsm_cmd_buf; in wsm_stop_scan()
347 wsm_cmd_lock(priv); in wsm_stop_scan()
348 ret = wsm_cmd_send(priv, buf, NULL, in wsm_stop_scan()
350 wsm_cmd_unlock(priv); in wsm_stop_scan()
355 static int wsm_tx_confirm(struct cw1200_common *priv, in wsm_tx_confirm() argument
369 cw1200_tx_confirm_cb(priv, link_id, &tx_confirm); in wsm_tx_confirm()
377 static int wsm_multi_tx_confirm(struct cw1200_common *priv, in wsm_multi_tx_confirm() argument
390 ret = wsm_release_tx_buffer(priv, count - 1); in wsm_multi_tx_confirm()
394 cw1200_bh_wakeup(priv); in wsm_multi_tx_confirm()
397 cw1200_debug_txed_multi(priv, count); in wsm_multi_tx_confirm()
399 ret = wsm_tx_confirm(priv, buf, link_id); in wsm_multi_tx_confirm()
412 static int wsm_join_confirm(struct cw1200_common *priv, in wsm_join_confirm() argument
430 int wsm_join(struct cw1200_common *priv, struct wsm_join *arg) in wsm_join() argument
433 struct wsm_buf *buf = &priv->wsm_cmd_buf; in wsm_join()
435 wsm_cmd_lock(priv); in wsm_join()
451 priv->tx_burst_idx = -1; in wsm_join()
452 ret = wsm_cmd_send(priv, buf, &resp, in wsm_join()
456 priv->join_complete_status = resp.status; in wsm_join()
458 wsm_cmd_unlock(priv); in wsm_join()
462 wsm_cmd_unlock(priv); in wsm_join()
468 int wsm_set_bss_params(struct cw1200_common *priv, in wsm_set_bss_params() argument
472 struct wsm_buf *buf = &priv->wsm_cmd_buf; in wsm_set_bss_params()
474 wsm_cmd_lock(priv); in wsm_set_bss_params()
481 ret = wsm_cmd_send(priv, buf, NULL, in wsm_set_bss_params()
484 wsm_cmd_unlock(priv); in wsm_set_bss_params()
488 wsm_cmd_unlock(priv); in wsm_set_bss_params()
494 int wsm_add_key(struct cw1200_common *priv, const struct wsm_add_key *arg) in wsm_add_key() argument
497 struct wsm_buf *buf = &priv->wsm_cmd_buf; in wsm_add_key()
499 wsm_cmd_lock(priv); in wsm_add_key()
503 ret = wsm_cmd_send(priv, buf, NULL, in wsm_add_key()
506 wsm_cmd_unlock(priv); in wsm_add_key()
510 wsm_cmd_unlock(priv); in wsm_add_key()
516 int wsm_remove_key(struct cw1200_common *priv, const struct wsm_remove_key *arg) in wsm_remove_key() argument
519 struct wsm_buf *buf = &priv->wsm_cmd_buf; in wsm_remove_key()
521 wsm_cmd_lock(priv); in wsm_remove_key()
527 ret = wsm_cmd_send(priv, buf, NULL, in wsm_remove_key()
530 wsm_cmd_unlock(priv); in wsm_remove_key()
534 wsm_cmd_unlock(priv); in wsm_remove_key()
540 int wsm_set_tx_queue_params(struct cw1200_common *priv, in wsm_set_tx_queue_params() argument
544 struct wsm_buf *buf = &priv->wsm_cmd_buf; in wsm_set_tx_queue_params()
547 wsm_cmd_lock(priv); in wsm_set_tx_queue_params()
557 ret = wsm_cmd_send(priv, buf, NULL, 0x0012, WSM_CMD_TIMEOUT); in wsm_set_tx_queue_params()
559 wsm_cmd_unlock(priv); in wsm_set_tx_queue_params()
563 wsm_cmd_unlock(priv); in wsm_set_tx_queue_params()
569 int wsm_set_edca_params(struct cw1200_common *priv, in wsm_set_edca_params() argument
573 struct wsm_buf *buf = &priv->wsm_cmd_buf; in wsm_set_edca_params()
575 wsm_cmd_lock(priv); in wsm_set_edca_params()
604 ret = wsm_cmd_send(priv, buf, NULL, in wsm_set_edca_params()
606 wsm_cmd_unlock(priv); in wsm_set_edca_params()
610 wsm_cmd_unlock(priv); in wsm_set_edca_params()
616 int wsm_switch_channel(struct cw1200_common *priv, in wsm_switch_channel() argument
620 struct wsm_buf *buf = &priv->wsm_cmd_buf; in wsm_switch_channel()
622 wsm_cmd_lock(priv); in wsm_switch_channel()
628 priv->channel_switch_in_progress = 1; in wsm_switch_channel()
630 ret = wsm_cmd_send(priv, buf, NULL, in wsm_switch_channel()
633 priv->channel_switch_in_progress = 0; in wsm_switch_channel()
635 wsm_cmd_unlock(priv); in wsm_switch_channel()
639 wsm_cmd_unlock(priv); in wsm_switch_channel()
645 int wsm_set_pm(struct cw1200_common *priv, const struct wsm_set_pm *arg) in wsm_set_pm() argument
648 struct wsm_buf *buf = &priv->wsm_cmd_buf; in wsm_set_pm()
649 priv->ps_mode_switch_in_progress = 1; in wsm_set_pm()
651 wsm_cmd_lock(priv); in wsm_set_pm()
658 ret = wsm_cmd_send(priv, buf, NULL, in wsm_set_pm()
661 wsm_cmd_unlock(priv); in wsm_set_pm()
665 wsm_cmd_unlock(priv); in wsm_set_pm()
671 int wsm_start(struct cw1200_common *priv, const struct wsm_start *arg) in wsm_start() argument
674 struct wsm_buf *buf = &priv->wsm_cmd_buf; in wsm_start()
676 wsm_cmd_lock(priv); in wsm_start()
690 priv->tx_burst_idx = -1; in wsm_start()
691 ret = wsm_cmd_send(priv, buf, NULL, in wsm_start()
694 wsm_cmd_unlock(priv); in wsm_start()
698 wsm_cmd_unlock(priv); in wsm_start()
704 int wsm_beacon_transmit(struct cw1200_common *priv, in wsm_beacon_transmit() argument
708 struct wsm_buf *buf = &priv->wsm_cmd_buf; in wsm_beacon_transmit()
710 wsm_cmd_lock(priv); in wsm_beacon_transmit()
714 ret = wsm_cmd_send(priv, buf, NULL, in wsm_beacon_transmit()
717 wsm_cmd_unlock(priv); in wsm_beacon_transmit()
721 wsm_cmd_unlock(priv); in wsm_beacon_transmit()
727 int wsm_start_find(struct cw1200_common *priv) in wsm_start_find() argument
730 struct wsm_buf *buf = &priv->wsm_cmd_buf; in wsm_start_find()
732 wsm_cmd_lock(priv); in wsm_start_find()
733 ret = wsm_cmd_send(priv, buf, NULL, 0x0019, WSM_CMD_TIMEOUT); in wsm_start_find()
734 wsm_cmd_unlock(priv); in wsm_start_find()
740 int wsm_stop_find(struct cw1200_common *priv) in wsm_stop_find() argument
743 struct wsm_buf *buf = &priv->wsm_cmd_buf; in wsm_stop_find()
745 wsm_cmd_lock(priv); in wsm_stop_find()
746 ret = wsm_cmd_send(priv, buf, NULL, 0x001A, WSM_CMD_TIMEOUT); in wsm_stop_find()
747 wsm_cmd_unlock(priv); in wsm_stop_find()
753 int wsm_map_link(struct cw1200_common *priv, const struct wsm_map_link *arg) in wsm_map_link() argument
756 struct wsm_buf *buf = &priv->wsm_cmd_buf; in wsm_map_link()
759 wsm_cmd_lock(priv); in wsm_map_link()
764 ret = wsm_cmd_send(priv, buf, NULL, cmd, WSM_CMD_TIMEOUT); in wsm_map_link()
766 wsm_cmd_unlock(priv); in wsm_map_link()
770 wsm_cmd_unlock(priv); in wsm_map_link()
776 int wsm_update_ie(struct cw1200_common *priv, in wsm_update_ie() argument
780 struct wsm_buf *buf = &priv->wsm_cmd_buf; in wsm_update_ie()
782 wsm_cmd_lock(priv); in wsm_update_ie()
788 ret = wsm_cmd_send(priv, buf, NULL, 0x001B, WSM_CMD_TIMEOUT); in wsm_update_ie()
790 wsm_cmd_unlock(priv); in wsm_update_ie()
794 wsm_cmd_unlock(priv); in wsm_update_ie()
799 int wsm_set_probe_responder(struct cw1200_common *priv, bool enable) in wsm_set_probe_responder() argument
801 priv->rx_filter.probeResponder = enable; in wsm_set_probe_responder()
802 return wsm_set_rx_filter(priv, &priv->rx_filter); in wsm_set_probe_responder()
815 static int wsm_startup_indication(struct cw1200_common *priv, in wsm_startup_indication() argument
818 priv->wsm_caps.input_buffers = WSM_GET16(buf); in wsm_startup_indication()
819 priv->wsm_caps.input_buffer_size = WSM_GET16(buf); in wsm_startup_indication()
820 priv->wsm_caps.hw_id = WSM_GET16(buf); in wsm_startup_indication()
821 priv->wsm_caps.hw_subid = WSM_GET16(buf); in wsm_startup_indication()
822 priv->wsm_caps.status = WSM_GET16(buf); in wsm_startup_indication()
823 priv->wsm_caps.fw_cap = WSM_GET16(buf); in wsm_startup_indication()
824 priv->wsm_caps.fw_type = WSM_GET16(buf); in wsm_startup_indication()
825 priv->wsm_caps.fw_api = WSM_GET16(buf); in wsm_startup_indication()
826 priv->wsm_caps.fw_build = WSM_GET16(buf); in wsm_startup_indication()
827 priv->wsm_caps.fw_ver = WSM_GET16(buf); in wsm_startup_indication()
828 WSM_GET(buf, priv->wsm_caps.fw_label, sizeof(priv->wsm_caps.fw_label)); in wsm_startup_indication()
829 priv->wsm_caps.fw_label[sizeof(priv->wsm_caps.fw_label) - 1] = 0; /* Do not trust FW too much... */ in wsm_startup_indication()
831 if (WARN_ON(priv->wsm_caps.status)) in wsm_startup_indication()
834 if (WARN_ON(priv->wsm_caps.fw_type > 4)) in wsm_startup_indication()
842 priv->wsm_caps.input_buffers, in wsm_startup_indication()
843 priv->wsm_caps.input_buffer_size, in wsm_startup_indication()
844 priv->wsm_caps.hw_id, priv->wsm_caps.hw_subid, in wsm_startup_indication()
845 cw1200_fw_types[priv->wsm_caps.fw_type], in wsm_startup_indication()
846 priv->wsm_caps.fw_label, priv->wsm_caps.fw_ver, in wsm_startup_indication()
847 priv->wsm_caps.fw_build, in wsm_startup_indication()
848 priv->wsm_caps.fw_api, priv->wsm_caps.fw_cap); in wsm_startup_indication()
851 if (!(priv->wsm_caps.fw_cap & 0x1)) in wsm_startup_indication()
852 priv->hw->wiphy->bands[IEEE80211_BAND_2GHZ] = NULL; in wsm_startup_indication()
853 if (!(priv->wsm_caps.fw_cap & 0x2)) in wsm_startup_indication()
854 priv->hw->wiphy->bands[IEEE80211_BAND_5GHZ] = NULL; in wsm_startup_indication()
856 priv->firmware_ready = 1; in wsm_startup_indication()
857 wake_up(&priv->wsm_startup_done); in wsm_startup_indication()
865 static int wsm_receive_indication(struct cw1200_common *priv, in wsm_receive_indication() argument
894 if (!priv->cqm_use_rssi) in wsm_receive_indication()
901 if (priv->join_status == CW1200_JOIN_STATUS_STA) { in wsm_receive_indication()
904 wsm_lock_tx_async(priv); in wsm_receive_indication()
905 if (queue_work(priv->workqueue, in wsm_receive_indication()
906 &priv->unjoin_work) <= 0) in wsm_receive_indication()
907 wsm_unlock_tx(priv); in wsm_receive_indication()
910 cw1200_rx_cb(priv, &rx, link_id, skb_p); in wsm_receive_indication()
920 static int wsm_event_indication(struct cw1200_common *priv, struct wsm_buf *buf) in wsm_event_indication() argument
925 if (priv->mode == NL80211_IFTYPE_UNSPECIFIED) { in wsm_event_indication()
940 spin_lock(&priv->event_queue_lock); in wsm_event_indication()
941 first = list_empty(&priv->event_queue); in wsm_event_indication()
942 list_add_tail(&event->link, &priv->event_queue); in wsm_event_indication()
943 spin_unlock(&priv->event_queue_lock); in wsm_event_indication()
946 queue_work(priv->workqueue, &priv->event_handler); in wsm_event_indication()
955 static int wsm_channel_switch_indication(struct cw1200_common *priv, in wsm_channel_switch_indication() argument
960 priv->channel_switch_in_progress = 0; in wsm_channel_switch_indication()
961 wake_up(&priv->channel_switch_done); in wsm_channel_switch_indication()
963 wsm_unlock_tx(priv); in wsm_channel_switch_indication()
971 static int wsm_set_pm_indication(struct cw1200_common *priv, in wsm_set_pm_indication() argument
975 if (priv->ps_mode_switch_in_progress) { in wsm_set_pm_indication()
976 priv->ps_mode_switch_in_progress = 0; in wsm_set_pm_indication()
977 wake_up(&priv->ps_mode_switch_done); in wsm_set_pm_indication()
982 static int wsm_scan_started(struct cw1200_common *priv, void *arg, in wsm_scan_started() argument
987 cw1200_scan_failed_cb(priv); in wsm_scan_started()
997 static int wsm_scan_complete_indication(struct cw1200_common *priv, in wsm_scan_complete_indication() argument
1004 cw1200_scan_complete_cb(priv, &arg); in wsm_scan_complete_indication()
1012 static int wsm_join_complete_indication(struct cw1200_common *priv, in wsm_join_complete_indication() argument
1018 cw1200_join_complete_cb(priv, &arg); in wsm_join_complete_indication()
1026 static int wsm_find_complete_indication(struct cw1200_common *priv, in wsm_find_complete_indication() argument
1033 static int wsm_ba_timeout_indication(struct cw1200_common *priv, in wsm_ba_timeout_indication() argument
1055 static int wsm_suspend_resume_indication(struct cw1200_common *priv, in wsm_suspend_resume_indication() argument
1067 cw1200_suspend_resume(priv, &arg); in wsm_suspend_resume_indication()
1079 static int wsm_cmd_send(struct cw1200_common *priv, in wsm_cmd_send() argument
1087 if (priv->bh_error) { in wsm_cmd_send()
1093 spin_lock(&priv->wsm_cmd.lock); in wsm_cmd_send()
1094 while (!priv->wsm_cmd.done) { in wsm_cmd_send()
1095 spin_unlock(&priv->wsm_cmd.lock); in wsm_cmd_send()
1096 spin_lock(&priv->wsm_cmd.lock); in wsm_cmd_send()
1098 priv->wsm_cmd.done = 0; in wsm_cmd_send()
1099 spin_unlock(&priv->wsm_cmd.lock); in wsm_cmd_send()
1120 spin_lock(&priv->wsm_cmd.lock); in wsm_cmd_send()
1121 BUG_ON(priv->wsm_cmd.ptr); in wsm_cmd_send()
1122 priv->wsm_cmd.ptr = buf->begin; in wsm_cmd_send()
1123 priv->wsm_cmd.len = buf_len; in wsm_cmd_send()
1124 priv->wsm_cmd.arg = arg; in wsm_cmd_send()
1125 priv->wsm_cmd.cmd = cmd; in wsm_cmd_send()
1126 spin_unlock(&priv->wsm_cmd.lock); in wsm_cmd_send()
1128 cw1200_bh_wakeup(priv); in wsm_cmd_send()
1131 ret = wait_event_timeout(priv->wsm_cmd_wq, in wsm_cmd_send()
1132 priv->wsm_cmd.done, tmo); in wsm_cmd_send()
1134 if (!ret && !priv->wsm_cmd.done) { in wsm_cmd_send()
1135 spin_lock(&priv->wsm_cmd.lock); in wsm_cmd_send()
1136 priv->wsm_cmd.done = 1; in wsm_cmd_send()
1137 priv->wsm_cmd.ptr = NULL; in wsm_cmd_send()
1138 spin_unlock(&priv->wsm_cmd.lock); in wsm_cmd_send()
1139 if (priv->bh_error) { in wsm_cmd_send()
1143 pr_err("CMD req (0x%04x) stuck in firmware, killing BH\n", priv->wsm_cmd.cmd); in wsm_cmd_send()
1146 pr_err("Outstanding outgoing frames: %d\n", priv->hw_bufs_used); in wsm_cmd_send()
1149 atomic_add(1, &priv->bh_term); in wsm_cmd_send()
1150 wake_up(&priv->bh_wq); in wsm_cmd_send()
1154 spin_lock(&priv->wsm_cmd.lock); in wsm_cmd_send()
1155 BUG_ON(!priv->wsm_cmd.done); in wsm_cmd_send()
1156 ret = priv->wsm_cmd.ret; in wsm_cmd_send()
1157 spin_unlock(&priv->wsm_cmd.lock); in wsm_cmd_send()
1167 void wsm_lock_tx(struct cw1200_common *priv) in wsm_lock_tx() argument
1169 wsm_cmd_lock(priv); in wsm_lock_tx()
1170 if (atomic_add_return(1, &priv->tx_lock) == 1) { in wsm_lock_tx()
1171 if (wsm_flush_tx(priv)) in wsm_lock_tx()
1174 wsm_cmd_unlock(priv); in wsm_lock_tx()
1177 void wsm_lock_tx_async(struct cw1200_common *priv) in wsm_lock_tx_async() argument
1179 if (atomic_add_return(1, &priv->tx_lock) == 1) in wsm_lock_tx_async()
1183 bool wsm_flush_tx(struct cw1200_common *priv) in wsm_flush_tx() argument
1191 BUG_ON(!atomic_read(&priv->tx_lock)); in wsm_flush_tx()
1197 if (!priv->hw_bufs_used) in wsm_flush_tx()
1200 if (priv->bh_error) { in wsm_flush_tx()
1208 &priv->tx_queue[i], in wsm_flush_tx()
1215 if (timeout < 0 || wait_event_timeout(priv->bh_evt_wq, in wsm_flush_tx()
1216 !priv->hw_bufs_used, in wsm_flush_tx()
1219 priv->bh_error = 1; in wsm_flush_tx()
1220 …wiphy_err(priv->hw->wiphy, "[WSM] TX Frames (%d) stuck in firmware, killing BH\n", priv->hw_bufs_u… in wsm_flush_tx()
1221 wake_up(&priv->bh_wq); in wsm_flush_tx()
1230 void wsm_unlock_tx(struct cw1200_common *priv) in wsm_unlock_tx() argument
1233 tx_lock = atomic_sub_return(1, &priv->tx_lock); in wsm_unlock_tx()
1237 if (!priv->bh_error) in wsm_unlock_tx()
1238 cw1200_bh_wakeup(priv); in wsm_unlock_tx()
1246 int wsm_handle_exception(struct cw1200_common *priv, u8 *data, size_t len) in wsm_handle_exception() argument
1270 wiphy_err(priv->hw->wiphy, in wsm_handle_exception()
1274 wiphy_err(priv->hw->wiphy, in wsm_handle_exception()
1279 wiphy_err(priv->hw->wiphy, in wsm_handle_exception()
1283 wiphy_err(priv->hw->wiphy, in wsm_handle_exception()
1287 wiphy_err(priv->hw->wiphy, in wsm_handle_exception()
1296 wiphy_err(priv->hw->wiphy, "Firmware exception.\n"); in wsm_handle_exception()
1302 int wsm_handle_rx(struct cw1200_common *priv, u16 id, in wsm_handle_rx() argument
1320 ret = wsm_tx_confirm(priv, &wsm_buf, link_id); in wsm_handle_rx()
1322 ret = wsm_multi_tx_confirm(priv, &wsm_buf, link_id); in wsm_handle_rx()
1330 spin_lock(&priv->wsm_cmd.lock); in wsm_handle_rx()
1331 wsm_arg = priv->wsm_cmd.arg; in wsm_handle_rx()
1332 wsm_cmd = priv->wsm_cmd.cmd & in wsm_handle_rx()
1334 priv->wsm_cmd.cmd = 0xFFFF; in wsm_handle_rx()
1335 spin_unlock(&priv->wsm_cmd.lock); in wsm_handle_rx()
1350 ret = wsm_read_mib_confirm(priv, wsm_arg, in wsm_handle_rx()
1355 ret = wsm_write_mib_confirm(priv, wsm_arg, in wsm_handle_rx()
1360 ret = wsm_scan_started(priv, wsm_arg, &wsm_buf); in wsm_handle_rx()
1364 ret = wsm_configuration_confirm(priv, wsm_arg, in wsm_handle_rx()
1369 ret = wsm_join_confirm(priv, wsm_arg, &wsm_buf); in wsm_handle_rx()
1387 ret = wsm_generic_confirm(priv, wsm_arg, &wsm_buf); in wsm_handle_rx()
1389 wiphy_warn(priv->hw->wiphy, in wsm_handle_rx()
1394 if (priv->join_status >= CW1200_JOIN_STATUS_JOINING) { in wsm_handle_rx()
1395 wsm_lock_tx(priv); in wsm_handle_rx()
1396 if (queue_work(priv->workqueue, &priv->unjoin_work) <= 0) in wsm_handle_rx()
1397 wsm_unlock_tx(priv); in wsm_handle_rx()
1402 wiphy_warn(priv->hw->wiphy, in wsm_handle_rx()
1407 spin_lock(&priv->wsm_cmd.lock); in wsm_handle_rx()
1408 priv->wsm_cmd.ret = ret; in wsm_handle_rx()
1409 priv->wsm_cmd.done = 1; in wsm_handle_rx()
1410 spin_unlock(&priv->wsm_cmd.lock); in wsm_handle_rx()
1414 wake_up(&priv->wsm_cmd_wq); in wsm_handle_rx()
1418 ret = wsm_startup_indication(priv, &wsm_buf); in wsm_handle_rx()
1421 ret = wsm_receive_indication(priv, link_id, in wsm_handle_rx()
1425 ret = wsm_event_indication(priv, &wsm_buf); in wsm_handle_rx()
1428 ret = wsm_scan_complete_indication(priv, &wsm_buf); in wsm_handle_rx()
1431 ret = wsm_ba_timeout_indication(priv, &wsm_buf); in wsm_handle_rx()
1434 ret = wsm_set_pm_indication(priv, &wsm_buf); in wsm_handle_rx()
1437 ret = wsm_channel_switch_indication(priv, &wsm_buf); in wsm_handle_rx()
1440 ret = wsm_find_complete_indication(priv, &wsm_buf); in wsm_handle_rx()
1443 ret = wsm_suspend_resume_indication(priv, in wsm_handle_rx()
1447 ret = wsm_join_complete_indication(priv, &wsm_buf); in wsm_handle_rx()
1460 static bool wsm_handle_tx_data(struct cw1200_common *priv, in wsm_handle_tx_data() argument
1477 switch (priv->mode) { in wsm_handle_tx_data()
1479 if (priv->join_status == CW1200_JOIN_STATUS_MONITOR) in wsm_handle_tx_data()
1481 else if (priv->join_status < CW1200_JOIN_STATUS_PRE_STA) in wsm_handle_tx_data()
1485 if (!priv->join_status) { in wsm_handle_tx_data()
1488 (BIT(0) | priv->link_id_map))) { in wsm_handle_tx_data()
1489 wiphy_warn(priv->hw->wiphy, in wsm_handle_tx_data()
1501 wiphy_warn(priv->hw->wiphy, in wsm_handle_tx_data()
1507 if (priv->join_status != CW1200_JOIN_STATUS_IBSS) in wsm_handle_tx_data()
1521 spin_lock(&priv->bss_loss_lock); in wsm_handle_tx_data()
1522 if (priv->bss_loss_state) { in wsm_handle_tx_data()
1523 priv->bss_loss_confirm_id = wsm->packet_id; in wsm_handle_tx_data()
1526 spin_unlock(&priv->bss_loss_lock); in wsm_handle_tx_data()
1530 priv->mode != NL80211_IFTYPE_AP) { in wsm_handle_tx_data()
1532 wsm_lock_tx_async(priv); in wsm_handle_tx_data()
1533 if (queue_work(priv->workqueue, in wsm_handle_tx_data()
1534 &priv->unjoin_work) <= 0) in wsm_handle_tx_data()
1535 wsm_unlock_tx(priv); in wsm_handle_tx_data()
1538 tx_info->control.hw_key->keyidx != priv->wep_default_key_id && in wsm_handle_tx_data()
1552 wsm_lock_tx_async(priv); in wsm_handle_tx_data()
1553 priv->pending_frame_id = wsm->packet_id; in wsm_handle_tx_data()
1554 if (queue_delayed_work(priv->workqueue, in wsm_handle_tx_data()
1555 &priv->scan.probe_work, 0) <= 0) in wsm_handle_tx_data()
1556 wsm_unlock_tx(priv); in wsm_handle_tx_data()
1566 wsm_lock_tx_async(priv); in wsm_handle_tx_data()
1567 priv->wep_default_key_id = tx_info->control.hw_key->keyidx; in wsm_handle_tx_data()
1568 priv->pending_frame_id = wsm->packet_id; in wsm_handle_tx_data()
1569 if (queue_work(priv->workqueue, &priv->wep_key_work) <= 0) in wsm_handle_tx_data()
1570 wsm_unlock_tx(priv); in wsm_handle_tx_data()
1583 static int cw1200_get_prio_queue(struct cw1200_common *priv, in cw1200_get_prio_queue() argument
1596 queued = cw1200_queue_get_num_queued(&priv->tx_queue[i], in cw1200_get_prio_queue()
1601 edca = &priv->edca.params[i]; in cw1200_get_prio_queue()
1612 if (winner >= 0 && priv->tx_burst_idx >= 0 && in cw1200_get_prio_queue()
1613 winner != priv->tx_burst_idx && in cw1200_get_prio_queue()
1615 &priv->tx_queue[winner], in cw1200_get_prio_queue()
1618 &priv->tx_queue[priv->tx_burst_idx], in cw1200_get_prio_queue()
1620 winner = priv->tx_burst_idx; in cw1200_get_prio_queue()
1625 static int wsm_get_tx_queue_and_mask(struct cw1200_common *priv, in wsm_get_tx_queue_and_mask() argument
1635 if (priv->tx_multicast) { in wsm_get_tx_queue_and_mask()
1637 idx = cw1200_get_prio_queue(priv, in wsm_get_tx_queue_and_mask()
1646 tx_allowed_mask = ~priv->sta_asleep_mask; in wsm_get_tx_queue_and_mask()
1648 if (priv->sta_asleep_mask) { in wsm_get_tx_queue_and_mask()
1649 tx_allowed_mask |= priv->pspoll_mask; in wsm_get_tx_queue_and_mask()
1654 idx = cw1200_get_prio_queue(priv, in wsm_get_tx_queue_and_mask()
1660 *queue_p = &priv->tx_queue[idx]; in wsm_get_tx_queue_and_mask()
1665 int wsm_get_tx(struct cw1200_common *priv, u8 **data, in wsm_get_tx() argument
1679 if (priv->wsm_cmd.ptr) { /* CMD request */ in wsm_get_tx()
1681 spin_lock(&priv->wsm_cmd.lock); in wsm_get_tx()
1682 BUG_ON(!priv->wsm_cmd.ptr); in wsm_get_tx()
1683 *data = priv->wsm_cmd.ptr; in wsm_get_tx()
1684 *tx_len = priv->wsm_cmd.len; in wsm_get_tx()
1686 spin_unlock(&priv->wsm_cmd.lock); in wsm_get_tx()
1691 if (atomic_add_return(0, &priv->tx_lock)) in wsm_get_tx()
1694 spin_lock_bh(&priv->ps_state_lock); in wsm_get_tx()
1696 ret = wsm_get_tx_queue_and_mask(priv, &queue, in wsm_get_tx()
1698 queue_num = queue - priv->tx_queue; in wsm_get_tx()
1700 if (priv->buffered_multicasts && in wsm_get_tx()
1702 (priv->tx_multicast || !priv->sta_asleep_mask)) { in wsm_get_tx()
1703 priv->buffered_multicasts = false; in wsm_get_tx()
1704 if (priv->tx_multicast) { in wsm_get_tx()
1705 priv->tx_multicast = false; in wsm_get_tx()
1706 queue_work(priv->workqueue, in wsm_get_tx()
1707 &priv->multicast_stop_work); in wsm_get_tx()
1711 spin_unlock_bh(&priv->ps_state_lock); in wsm_get_tx()
1721 if (wsm_handle_tx_data(priv, wsm, in wsm_get_tx()
1729 priv->pspoll_mask &= ~BIT(txpriv->raw_link_id); in wsm_get_tx()
1735 if (priv->edca.params[queue_num].txop_limit) in wsm_get_tx()
1743 priv->tx_burst_idx = queue_num; in wsm_get_tx()
1745 priv->tx_burst_idx = -1; in wsm_get_tx()
1770 void wsm_txed(struct cw1200_common *priv, u8 *data) in wsm_txed() argument
1772 if (data == priv->wsm_cmd.ptr) { in wsm_txed()
1773 spin_lock(&priv->wsm_cmd.lock); in wsm_txed()
1774 priv->wsm_cmd.ptr = NULL; in wsm_txed()
1775 spin_unlock(&priv->wsm_cmd.lock); in wsm_txed()