Lines Matching refs:priv

49 int iwlagn_send_tx_power(struct iwl_priv *priv)  in iwlagn_send_tx_power()  argument
54 if (WARN_ONCE(test_bit(STATUS_SCAN_HW, &priv->status), in iwlagn_send_tx_power()
59 tx_power_cmd.global_lmt = (s8)(2 * priv->tx_power_user_lmt); in iwlagn_send_tx_power()
61 if (tx_power_cmd.global_lmt > priv->nvm_data->max_tx_pwr_half_dbm) { in iwlagn_send_tx_power()
74 priv->nvm_data->max_tx_pwr_half_dbm; in iwlagn_send_tx_power()
79 if (IWL_UCODE_API(priv->fw->ucode_ver) == 1) in iwlagn_send_tx_power()
84 return iwl_dvm_send_cmd_pdu(priv, tx_ant_cfg_cmd, 0, in iwlagn_send_tx_power()
88 void iwlagn_temperature(struct iwl_priv *priv) in iwlagn_temperature() argument
90 lockdep_assert_held(&priv->statistics.lock); in iwlagn_temperature()
93 priv->temperature = le32_to_cpu(priv->statistics.common.temperature); in iwlagn_temperature()
94 iwl_tt_handler(priv); in iwlagn_temperature()
118 int iwlagn_manage_ibss_station(struct iwl_priv *priv, in iwlagn_manage_ibss_station() argument
124 return iwlagn_add_bssid_station(priv, vif_priv->ctx, in iwlagn_manage_ibss_station()
127 return iwl_remove_station(priv, vif_priv->ibss_bssid_sta_id, in iwlagn_manage_ibss_station()
138 int iwlagn_txfifo_flush(struct iwl_priv *priv, u32 scd_q_msk) in iwlagn_txfifo_flush() argument
150 if ((priv->valid_contexts != BIT(IWL_RXON_CTX_BSS))) in iwlagn_txfifo_flush()
156 if (priv->nvm_data->sku_cap_11n_enable) in iwlagn_txfifo_flush()
162 IWL_DEBUG_INFO(priv, "queue control: 0x%x\n", queue_control); in iwlagn_txfifo_flush()
166 if (IWL_UCODE_API(priv->fw->ucode_ver) > 2) in iwlagn_txfifo_flush()
167 return iwl_dvm_send_cmd_pdu(priv, REPLY_TXFIFO_FLUSH, 0, in iwlagn_txfifo_flush()
170 return iwl_dvm_send_cmd_pdu(priv, REPLY_TXFIFO_FLUSH, 0, in iwlagn_txfifo_flush()
174 void iwlagn_dev_txfifo_flush(struct iwl_priv *priv) in iwlagn_dev_txfifo_flush() argument
176 mutex_lock(&priv->mutex); in iwlagn_dev_txfifo_flush()
177 ieee80211_stop_queues(priv->hw); in iwlagn_dev_txfifo_flush()
178 if (iwlagn_txfifo_flush(priv, 0)) { in iwlagn_dev_txfifo_flush()
179 IWL_ERR(priv, "flush request fail\n"); in iwlagn_dev_txfifo_flush()
182 IWL_DEBUG_INFO(priv, "wait transmit/flush all frames\n"); in iwlagn_dev_txfifo_flush()
183 iwl_trans_wait_tx_queue_empty(priv->trans, 0xffffffff); in iwlagn_dev_txfifo_flush()
185 ieee80211_wake_queues(priv->hw); in iwlagn_dev_txfifo_flush()
186 mutex_unlock(&priv->mutex); in iwlagn_dev_txfifo_flush()
241 void iwlagn_send_advance_bt_config(struct iwl_priv *priv) in iwlagn_send_advance_bt_config() argument
256 if (priv->lib->bt_params) { in iwlagn_send_advance_bt_config()
263 if (priv->lib->bt_params->bt_session_2) { in iwlagn_send_advance_bt_config()
265 priv->lib->bt_params->bt_prio_boost); in iwlagn_send_advance_bt_config()
270 WARN_ON(priv->lib->bt_params->bt_prio_boost & ~0xFF); in iwlagn_send_advance_bt_config()
272 priv->lib->bt_params->bt_prio_boost; in iwlagn_send_advance_bt_config()
277 IWL_ERR(priv, "failed to construct BT Coex Config\n"); in iwlagn_send_advance_bt_config()
291 basic.kill_ack_mask = priv->kill_ack_mask; in iwlagn_send_advance_bt_config()
292 basic.kill_cts_mask = priv->kill_cts_mask; in iwlagn_send_advance_bt_config()
293 if (priv->reduced_txpower) in iwlagn_send_advance_bt_config()
295 basic.valid = priv->bt_valid; in iwlagn_send_advance_bt_config()
304 priv->iw_mode == NL80211_IFTYPE_ADHOC) { in iwlagn_send_advance_bt_config()
310 if (!priv->bt_enable_pspoll) in iwlagn_send_advance_bt_config()
315 if (priv->bt_ch_announce) in iwlagn_send_advance_bt_config()
317 IWL_DEBUG_COEX(priv, "BT coex flag: 0X%x\n", basic.flags); in iwlagn_send_advance_bt_config()
319 priv->bt_enable_flag = basic.flags; in iwlagn_send_advance_bt_config()
320 if (priv->bt_full_concurrent) in iwlagn_send_advance_bt_config()
327 IWL_DEBUG_COEX(priv, "BT coex %s in %s mode\n", in iwlagn_send_advance_bt_config()
329 priv->bt_full_concurrent ? in iwlagn_send_advance_bt_config()
332 if (priv->lib->bt_params->bt_session_2) { in iwlagn_send_advance_bt_config()
335 ret = iwl_dvm_send_cmd_pdu(priv, REPLY_BT_CONFIG, in iwlagn_send_advance_bt_config()
340 ret = iwl_dvm_send_cmd_pdu(priv, REPLY_BT_CONFIG, in iwlagn_send_advance_bt_config()
344 IWL_ERR(priv, "failed to send BT Coex Config\n"); in iwlagn_send_advance_bt_config()
348 void iwlagn_bt_adjust_rssi_monitor(struct iwl_priv *priv, bool rssi_ena) in iwlagn_bt_adjust_rssi_monitor() argument
353 lockdep_assert_held(&priv->mutex); in iwlagn_bt_adjust_rssi_monitor()
357 for_each_context(priv, ctx) { in iwlagn_bt_adjust_rssi_monitor()
371 if (priv->cur_rssi_ctx) { in iwlagn_bt_adjust_rssi_monitor()
372 ctx = priv->cur_rssi_ctx; in iwlagn_bt_adjust_rssi_monitor()
374 priv->cur_rssi_ctx = NULL; in iwlagn_bt_adjust_rssi_monitor()
383 for_each_context(priv, ctx) { in iwlagn_bt_adjust_rssi_monitor()
395 if (found_ctx == priv->cur_rssi_ctx) in iwlagn_bt_adjust_rssi_monitor()
404 if (priv->cur_rssi_ctx) { in iwlagn_bt_adjust_rssi_monitor()
405 ctx = priv->cur_rssi_ctx; in iwlagn_bt_adjust_rssi_monitor()
410 priv->cur_rssi_ctx = found_ctx; in iwlagn_bt_adjust_rssi_monitor()
428 struct iwl_priv *priv = in iwlagn_bt_traffic_change_work() local
433 if (priv->bt_enable_flag == IWLAGN_BT_FLAG_COEX_MODE_DISABLED) { in iwlagn_bt_traffic_change_work()
443 IWL_DEBUG_COEX(priv, "BT traffic load changes: %d\n", in iwlagn_bt_traffic_change_work()
444 priv->bt_traffic_load); in iwlagn_bt_traffic_change_work()
446 switch (priv->bt_traffic_load) { in iwlagn_bt_traffic_change_work()
448 if (priv->bt_status) in iwlagn_bt_traffic_change_work()
461 IWL_ERR(priv, "Invalid BT traffic load: %d\n", in iwlagn_bt_traffic_change_work()
462 priv->bt_traffic_load); in iwlagn_bt_traffic_change_work()
466 mutex_lock(&priv->mutex); in iwlagn_bt_traffic_change_work()
475 if (test_bit(STATUS_SCAN_HW, &priv->status)) in iwlagn_bt_traffic_change_work()
478 iwl_update_chain_flags(priv); in iwlagn_bt_traffic_change_work()
481 priv->current_ht_config.smps = smps_request; in iwlagn_bt_traffic_change_work()
482 for_each_context(priv, ctx) { in iwlagn_bt_traffic_change_work()
492 iwlagn_bt_coex_rssi_monitor(priv); in iwlagn_bt_traffic_change_work()
494 mutex_unlock(&priv->mutex); in iwlagn_bt_traffic_change_work()
502 void iwlagn_bt_coex_rssi_monitor(struct iwl_priv *priv) in iwlagn_bt_coex_rssi_monitor() argument
504 if (priv->bt_is_sco && in iwlagn_bt_coex_rssi_monitor()
505 priv->bt_traffic_load == IWL_BT_COEX_TRAFFIC_LOAD_CONTINUOUS) in iwlagn_bt_coex_rssi_monitor()
506 iwlagn_bt_adjust_rssi_monitor(priv, true); in iwlagn_bt_coex_rssi_monitor()
508 iwlagn_bt_adjust_rssi_monitor(priv, false); in iwlagn_bt_coex_rssi_monitor()
511 static void iwlagn_print_uartmsg(struct iwl_priv *priv, in iwlagn_print_uartmsg() argument
514 IWL_DEBUG_COEX(priv, "Message Type = 0x%X, SSN = 0x%X, " in iwlagn_print_uartmsg()
523 IWL_DEBUG_COEX(priv, "Open connections = 0x%X, Traffic load = 0x%X, " in iwlagn_print_uartmsg()
534 IWL_DEBUG_COEX(priv, "SCO/eSCO = 0x%X, Sniff = 0x%X, A2DP = 0x%X, " in iwlagn_print_uartmsg()
549 IWL_DEBUG_COEX(priv, "Idle duration = 0x%X\n", in iwlagn_print_uartmsg()
553 IWL_DEBUG_COEX(priv, "Tx Activity = 0x%X, Rx Activity = 0x%X, " in iwlagn_print_uartmsg()
562 IWL_DEBUG_COEX(priv, "Sniff Interval = 0x%X, Discoverable = 0x%X\n", in iwlagn_print_uartmsg()
568 IWL_DEBUG_COEX(priv, "Sniff Activity = 0x%X, Page = " in iwlagn_print_uartmsg()
580 static bool iwlagn_set_kill_msk(struct iwl_priv *priv, in iwlagn_set_kill_msk() argument
594 if (!priv->reduced_txpower) in iwlagn_set_kill_msk()
597 if (priv->kill_ack_mask != bt_kill_ack_msg[kill_msk] || in iwlagn_set_kill_msk()
598 priv->kill_cts_mask != bt_kill_cts_msg[kill_msk]) { in iwlagn_set_kill_msk()
599 priv->bt_valid |= IWLAGN_BT_VALID_KILL_ACK_MASK; in iwlagn_set_kill_msk()
600 priv->kill_ack_mask = bt_kill_ack_msg[kill_msk]; in iwlagn_set_kill_msk()
601 priv->bt_valid |= IWLAGN_BT_VALID_KILL_CTS_MASK; in iwlagn_set_kill_msk()
602 priv->kill_cts_mask = bt_kill_cts_msg[kill_msk]; in iwlagn_set_kill_msk()
617 static bool iwlagn_fill_txpower_mode(struct iwl_priv *priv, in iwlagn_fill_txpower_mode() argument
621 struct iwl_rxon_context *ctx = &priv->contexts[IWL_RXON_CTX_BSS]; in iwlagn_fill_txpower_mode()
625 IWL_DEBUG_INFO(priv, "BSS ctx not active or not in sta mode\n"); in iwlagn_fill_txpower_mode()
632 IWL_DEBUG_COEX(priv, "no rssi data available\n"); in iwlagn_fill_txpower_mode()
635 if (!priv->reduced_txpower && in iwlagn_fill_txpower_mode()
636 !iwl_is_associated(priv, IWL_RXON_CTX_PAN) && in iwlagn_fill_txpower_mode()
643 priv->reduced_txpower = true; in iwlagn_fill_txpower_mode()
644 priv->bt_valid |= IWLAGN_BT_VALID_REDUCED_TX_PWR; in iwlagn_fill_txpower_mode()
646 } else if (priv->reduced_txpower && in iwlagn_fill_txpower_mode()
647 (iwl_is_associated(priv, IWL_RXON_CTX_PAN) || in iwlagn_fill_txpower_mode()
654 priv->reduced_txpower = false; in iwlagn_fill_txpower_mode()
655 priv->bt_valid |= IWLAGN_BT_VALID_REDUCED_TX_PWR; in iwlagn_fill_txpower_mode()
662 static void iwlagn_bt_coex_profile_notif(struct iwl_priv *priv, in iwlagn_bt_coex_profile_notif() argument
669 if (priv->bt_enable_flag == IWLAGN_BT_FLAG_COEX_MODE_DISABLED) { in iwlagn_bt_coex_profile_notif()
674 IWL_DEBUG_COEX(priv, "BT Coex notification:\n"); in iwlagn_bt_coex_profile_notif()
675 IWL_DEBUG_COEX(priv, " status: %d\n", coex->bt_status); in iwlagn_bt_coex_profile_notif()
676 IWL_DEBUG_COEX(priv, " traffic load: %d\n", coex->bt_traffic_load); in iwlagn_bt_coex_profile_notif()
677 IWL_DEBUG_COEX(priv, " CI compliance: %d\n", in iwlagn_bt_coex_profile_notif()
679 iwlagn_print_uartmsg(priv, uart_msg); in iwlagn_bt_coex_profile_notif()
681 priv->last_bt_traffic_load = priv->bt_traffic_load; in iwlagn_bt_coex_profile_notif()
682 priv->bt_is_sco = iwlagn_bt_traffic_is_sco(uart_msg); in iwlagn_bt_coex_profile_notif()
684 if (priv->iw_mode != NL80211_IFTYPE_ADHOC) { in iwlagn_bt_coex_profile_notif()
685 if (priv->bt_status != coex->bt_status || in iwlagn_bt_coex_profile_notif()
686 priv->last_bt_traffic_load != coex->bt_traffic_load) { in iwlagn_bt_coex_profile_notif()
689 if (!priv->bt_ch_announce) in iwlagn_bt_coex_profile_notif()
690 priv->bt_traffic_load = in iwlagn_bt_coex_profile_notif()
693 priv->bt_traffic_load = in iwlagn_bt_coex_profile_notif()
697 priv->bt_traffic_load = in iwlagn_bt_coex_profile_notif()
700 priv->bt_status = coex->bt_status; in iwlagn_bt_coex_profile_notif()
701 queue_work(priv->workqueue, in iwlagn_bt_coex_profile_notif()
702 &priv->bt_traffic_change_work); in iwlagn_bt_coex_profile_notif()
708 if (iwlagn_fill_txpower_mode(priv, uart_msg) || in iwlagn_bt_coex_profile_notif()
709 iwlagn_set_kill_msk(priv, uart_msg)) in iwlagn_bt_coex_profile_notif()
710 queue_work(priv->workqueue, &priv->bt_runtime_config); in iwlagn_bt_coex_profile_notif()
715 priv->bt_ci_compliance = coex->bt_ci_compliance; in iwlagn_bt_coex_profile_notif()
718 void iwlagn_bt_rx_handler_setup(struct iwl_priv *priv) in iwlagn_bt_rx_handler_setup() argument
720 priv->rx_handlers[REPLY_BT_COEX_PROFILE_NOTIF] = in iwlagn_bt_rx_handler_setup()
724 void iwlagn_bt_setup_deferred_work(struct iwl_priv *priv) in iwlagn_bt_setup_deferred_work() argument
726 INIT_WORK(&priv->bt_traffic_change_work, in iwlagn_bt_setup_deferred_work()
730 void iwlagn_bt_cancel_deferred_work(struct iwl_priv *priv) in iwlagn_bt_cancel_deferred_work() argument
732 cancel_work_sync(&priv->bt_traffic_change_work); in iwlagn_bt_cancel_deferred_work()
735 static bool is_single_rx_stream(struct iwl_priv *priv) in is_single_rx_stream() argument
737 return priv->current_ht_config.smps == IEEE80211_SMPS_STATIC || in is_single_rx_stream()
738 priv->current_ht_config.single_chain_sufficient; in is_single_rx_stream()
756 static int iwl_get_active_rx_chain_count(struct iwl_priv *priv) in iwl_get_active_rx_chain_count() argument
758 if (priv->lib->bt_params && in iwl_get_active_rx_chain_count()
759 priv->lib->bt_params->advanced_bt_coexist && in iwl_get_active_rx_chain_count()
760 (priv->bt_full_concurrent || in iwl_get_active_rx_chain_count()
761 priv->bt_traffic_load >= IWL_BT_COEX_TRAFFIC_LOAD_HIGH)) { in iwl_get_active_rx_chain_count()
769 if (is_single_rx_stream(priv)) in iwl_get_active_rx_chain_count()
779 static int iwl_get_idle_rx_chain_count(struct iwl_priv *priv, int active_cnt) in iwl_get_idle_rx_chain_count() argument
782 switch (priv->current_ht_config.smps) { in iwl_get_idle_rx_chain_count()
791 priv->current_ht_config.smps); in iwl_get_idle_rx_chain_count()
813 void iwlagn_set_rxon_chain(struct iwl_priv *priv, struct iwl_rxon_context *ctx) in iwlagn_set_rxon_chain() argument
815 bool is_single = is_single_rx_stream(priv); in iwlagn_set_rxon_chain()
816 bool is_cam = !test_bit(STATUS_POWER_PMI, &priv->status); in iwlagn_set_rxon_chain()
825 if (priv->chain_noise_data.active_chains) in iwlagn_set_rxon_chain()
826 active_chains = priv->chain_noise_data.active_chains; in iwlagn_set_rxon_chain()
828 active_chains = priv->nvm_data->valid_rx_ant; in iwlagn_set_rxon_chain()
830 if (priv->lib->bt_params && in iwlagn_set_rxon_chain()
831 priv->lib->bt_params->advanced_bt_coexist && in iwlagn_set_rxon_chain()
832 (priv->bt_full_concurrent || in iwlagn_set_rxon_chain()
833 priv->bt_traffic_load >= IWL_BT_COEX_TRAFFIC_LOAD_HIGH)) { in iwlagn_set_rxon_chain()
844 active_rx_cnt = iwl_get_active_rx_chain_count(priv); in iwlagn_set_rxon_chain()
845 idle_rx_cnt = iwl_get_idle_rx_chain_count(priv, active_rx_cnt); in iwlagn_set_rxon_chain()
868 IWL_DEBUG_ASSOC(priv, "rx_chain=0x%X active=%d idle=%d\n", in iwlagn_set_rxon_chain()
876 u8 iwl_toggle_tx_ant(struct iwl_priv *priv, u8 ant, u8 valid) in iwl_toggle_tx_ant() argument
881 if (priv->band == IEEE80211_BAND_2GHZ && in iwl_toggle_tx_ant()
882 priv->bt_traffic_load >= IWL_BT_COEX_TRAFFIC_LOAD_HIGH) in iwl_toggle_tx_ant()
917 struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw); in iwlagn_wowlan_program_keys() local
929 mutex_lock(&priv->mutex); in iwlagn_wowlan_program_keys()
934 ret = iwl_set_default_wep_key(priv, ctx, key); in iwlagn_wowlan_program_keys()
936 ret = iwl_set_dynamic_key(priv, ctx, key, sta); in iwlagn_wowlan_program_keys()
939 IWL_ERR(priv, "Error setting key during suspend!\n"); in iwlagn_wowlan_program_keys()
1035 mutex_unlock(&priv->mutex); in iwlagn_wowlan_program_keys()
1038 int iwlagn_send_patterns(struct iwl_priv *priv, in iwlagn_send_patterns() argument
1074 err = iwl_dvm_send_cmd(priv, &cmd); in iwlagn_send_patterns()
1079 int iwlagn_suspend(struct iwl_priv *priv, struct cfg80211_wowlan *wowlan) in iwlagn_suspend() argument
1083 struct iwl_rxon_context *ctx = &priv->contexts[IWL_RXON_CTX_BSS]; in iwlagn_suspend()
1114 seq = le16_to_cpu(priv->last_seq_ctl) & IEEE80211_SCTL_SEQ; in iwlagn_suspend()
1122 seq = priv->tid_data[IWL_AP_ID][i].seq_number; in iwlagn_suspend()
1151 iwl_scan_cancel_timeout(priv, 200); in iwlagn_suspend()
1155 priv->ucode_loaded = false; in iwlagn_suspend()
1156 iwl_trans_stop_device(priv->trans); in iwlagn_suspend()
1157 ret = iwl_trans_start_hw(priv->trans); in iwlagn_suspend()
1161 priv->wowlan = true; in iwlagn_suspend()
1163 ret = iwl_load_ucode_wait_alive(priv, IWL_UCODE_WOWLAN); in iwlagn_suspend()
1168 ret = iwl_alive_start(priv); in iwlagn_suspend()
1173 ret = iwlagn_commit_rxon(priv, ctx); in iwlagn_suspend()
1177 ret = iwl_power_update_mode(priv, true); in iwlagn_suspend()
1183 priv->ucode_key_table = 0; in iwlagn_suspend()
1191 mutex_unlock(&priv->mutex); in iwlagn_suspend()
1192 ieee80211_iter_keys(priv->hw, ctx->vif, in iwlagn_suspend()
1195 mutex_lock(&priv->mutex); in iwlagn_suspend()
1209 ret = iwl_dvm_send_cmd(priv, &rsc_tsc_cmd); in iwlagn_suspend()
1215 ret = iwl_dvm_send_cmd_pdu(priv, in iwlagn_suspend()
1223 if (priv->have_rekey_data) { in iwlagn_suspend()
1225 memcpy(kek_kck_cmd.kck, priv->kck, NL80211_KCK_LEN); in iwlagn_suspend()
1227 memcpy(kek_kck_cmd.kek, priv->kek, NL80211_KEK_LEN); in iwlagn_suspend()
1229 kek_kck_cmd.replay_ctr = priv->replay_ctr; in iwlagn_suspend()
1231 ret = iwl_dvm_send_cmd_pdu(priv, in iwlagn_suspend()
1240 ret = iwl_dvm_send_cmd_pdu(priv, REPLY_D3_CONFIG, 0, in iwlagn_suspend()
1245 ret = iwl_dvm_send_cmd_pdu(priv, REPLY_WOWLAN_WAKEUP_FILTER, in iwlagn_suspend()
1251 ret = iwlagn_send_patterns(priv, wowlan); in iwlagn_suspend()
1258 int iwl_dvm_send_cmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd) in iwl_dvm_send_cmd() argument
1260 if (iwl_is_rfkill(priv) || iwl_is_ctkill(priv)) { in iwl_dvm_send_cmd()
1261 IWL_WARN(priv, "Not sending command - %s KILL\n", in iwl_dvm_send_cmd()
1262 iwl_is_rfkill(priv) ? "RF" : "CT"); in iwl_dvm_send_cmd()
1266 if (test_bit(STATUS_FW_ERROR, &priv->status)) { in iwl_dvm_send_cmd()
1267 IWL_ERR(priv, "Command %s failed: FW Error\n", in iwl_dvm_send_cmd()
1276 if (!priv->ucode_loaded) { in iwl_dvm_send_cmd()
1277 IWL_ERR(priv, "Fw not loaded - dropping CMD: %x\n", cmd->id); in iwl_dvm_send_cmd()
1287 lockdep_assert_held(&priv->mutex); in iwl_dvm_send_cmd()
1289 return iwl_trans_send_cmd(priv->trans, cmd); in iwl_dvm_send_cmd()
1292 int iwl_dvm_send_cmd_pdu(struct iwl_priv *priv, u8 id, in iwl_dvm_send_cmd_pdu() argument
1302 return iwl_dvm_send_cmd(priv, &cmd); in iwl_dvm_send_cmd_pdu()