Lines Matching +full:4 +full:ghz +full:- +full:coexistence

1 // SPDX-License-Identifier: GPL-2.0-only
4 * Copyright(c) 2003 - 2014, 2018 - 2020 Intel Corporation. All rights reserved.
12 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
33 #include "iwl-eeprom-read.h"
34 #include "iwl-eeprom-parse.h"
35 #include "iwl-io.h"
36 #include "iwl-trans.h"
37 #include "iwl-op-mode.h"
38 #include "iwl-drv.h"
39 #include "iwl-modparams.h"
40 #include "iwl-prph.h"
153 if (ctx->active.rx_chain != ctx->staging.rx_chain) in iwl_update_chain_flags()
168 * variable-length part of the beacon. in iwl_set_beacon_tim()
170 tim_idx = mgmt->u.beacon.variable - beacon; in iwl_set_beacon_tim()
172 /* Parse variable-length elements of beacon to find WLAN_EID_TIM */ in iwl_set_beacon_tim()
173 while ((tim_idx < (frame_size - 2)) && in iwl_set_beacon_tim()
178 if ((tim_idx < (frame_size - 1)) && (beacon[tim_idx] == WLAN_EID_TIM)) { in iwl_set_beacon_tim()
179 tx_beacon_cmd->tim_idx = cpu_to_le16(tim_idx); in iwl_set_beacon_tim()
180 tx_beacon_cmd->tim_size = beacon[tim_idx+1]; in iwl_set_beacon_tim()
201 lockdep_assert_held(&priv->mutex); in iwlagn_send_beacon_cmd()
203 if (!priv->beacon_ctx) { in iwlagn_send_beacon_cmd()
208 if (WARN_ON(!priv->beacon_skb)) in iwlagn_send_beacon_cmd()
209 return -EINVAL; in iwlagn_send_beacon_cmd()
212 if (!priv->beacon_cmd) in iwlagn_send_beacon_cmd()
213 priv->beacon_cmd = kzalloc(sizeof(*tx_beacon_cmd), GFP_KERNEL); in iwlagn_send_beacon_cmd()
214 tx_beacon_cmd = priv->beacon_cmd; in iwlagn_send_beacon_cmd()
216 return -ENOMEM; in iwlagn_send_beacon_cmd()
218 frame_size = priv->beacon_skb->len; in iwlagn_send_beacon_cmd()
221 tx_beacon_cmd->tx.len = cpu_to_le16((u16)frame_size); in iwlagn_send_beacon_cmd()
222 tx_beacon_cmd->tx.sta_id = priv->beacon_ctx->bcast_sta_id; in iwlagn_send_beacon_cmd()
223 tx_beacon_cmd->tx.stop_time.life_time = TX_CMD_LIFE_TIME_INFINITE; in iwlagn_send_beacon_cmd()
224 tx_beacon_cmd->tx.tx_flags = TX_CMD_FLG_SEQ_CTL_MSK | in iwlagn_send_beacon_cmd()
228 iwl_set_beacon_tim(priv, tx_beacon_cmd, priv->beacon_skb->data, in iwlagn_send_beacon_cmd()
232 info = IEEE80211_SKB_CB(priv->beacon_skb); in iwlagn_send_beacon_cmd()
239 if (info->control.rates[0].idx < 0 || in iwlagn_send_beacon_cmd()
240 info->control.rates[0].flags & IEEE80211_TX_RC_MCS) in iwlagn_send_beacon_cmd()
243 rate = info->control.rates[0].idx; in iwlagn_send_beacon_cmd()
245 priv->mgmt_tx_ant = iwl_toggle_tx_ant(priv, priv->mgmt_tx_ant, in iwlagn_send_beacon_cmd()
246 priv->nvm_data->valid_tx_ant); in iwlagn_send_beacon_cmd()
247 rate_flags = iwl_ant_idx_to_flags(priv->mgmt_tx_ant); in iwlagn_send_beacon_cmd()
249 /* In mac80211, rates for 5 GHz start at 0 */ in iwlagn_send_beacon_cmd()
250 if (info->band == NL80211_BAND_5GHZ) in iwlagn_send_beacon_cmd()
255 tx_beacon_cmd->tx.rate_n_flags = in iwlagn_send_beacon_cmd()
263 cmd.data[1] = priv->beacon_skb->data; in iwlagn_send_beacon_cmd()
275 mutex_lock(&priv->mutex); in iwl_bg_beacon_update()
276 if (!priv->beacon_ctx) { in iwl_bg_beacon_update()
281 if (priv->beacon_ctx->vif->type != NL80211_IFTYPE_AP) { in iwl_bg_beacon_update()
292 beacon = ieee80211_beacon_get(priv->hw, priv->beacon_ctx->vif); in iwl_bg_beacon_update()
294 IWL_ERR(priv, "update beacon failed -- keeping old\n"); in iwl_bg_beacon_update()
299 dev_kfree_skb(priv->beacon_skb); in iwl_bg_beacon_update()
301 priv->beacon_skb = beacon; in iwl_bg_beacon_update()
305 mutex_unlock(&priv->mutex); in iwl_bg_beacon_update()
313 mutex_lock(&priv->mutex); in iwl_bg_bt_runtime_config()
314 if (test_bit(STATUS_EXIT_PENDING, &priv->status)) in iwl_bg_bt_runtime_config()
317 /* dont send host command if rf-kill is on */ in iwl_bg_bt_runtime_config()
323 mutex_unlock(&priv->mutex); in iwl_bg_bt_runtime_config()
332 mutex_lock(&priv->mutex); in iwl_bg_bt_full_concurrency()
334 if (test_bit(STATUS_EXIT_PENDING, &priv->status)) in iwl_bg_bt_full_concurrency()
337 /* dont send host command if rf-kill is on */ in iwl_bg_bt_full_concurrency()
342 priv->bt_full_concurrent ? in iwl_bg_bt_full_concurrency()
343 "full concurrency" : "3-wire"); in iwl_bg_bt_full_concurrency()
347 * to avoid 3-wire collisions in iwl_bg_bt_full_concurrency()
356 mutex_unlock(&priv->mutex); in iwl_bg_bt_full_concurrency()
378 * iwl_bg_statistics_periodic - Timer callback to queue statistics
391 if (test_bit(STATUS_EXIT_PENDING, &priv->status)) in iwl_bg_statistics_periodic()
394 /* dont send host command if rf-kill is on */ in iwl_bg_statistics_periodic()
412 ptr = base + (4 * sizeof(u32)) + (start_idx * 2 * sizeof(u32)); in iwl_print_cont_event_trace()
414 ptr = base + (4 * sizeof(u32)) + (start_idx * 3 * sizeof(u32)); in iwl_print_cont_event_trace()
417 if (!iwl_trans_grab_nic_access(priv->trans, &reg_flags)) in iwl_print_cont_event_trace()
420 /* Set starting address; reads will auto-increment */ in iwl_print_cont_event_trace()
421 iwl_write32(priv->trans, HBUS_TARG_MEM_RADDR, ptr); in iwl_print_cont_event_trace()
429 if (WARN_ON(num_events > capacity - start_idx)) in iwl_print_cont_event_trace()
430 num_events = capacity - start_idx; in iwl_print_cont_event_trace()
437 ev = iwl_read32(priv->trans, HBUS_TARG_MEM_RDAT); in iwl_print_cont_event_trace()
438 time = iwl_read32(priv->trans, HBUS_TARG_MEM_RDAT); in iwl_print_cont_event_trace()
441 priv->trans->dev, 0, time, ev); in iwl_print_cont_event_trace()
443 data = iwl_read32(priv->trans, HBUS_TARG_MEM_RDAT); in iwl_print_cont_event_trace()
445 priv->trans->dev, time, data, ev); in iwl_print_cont_event_trace()
449 iwl_trans_release_nic_access(priv->trans, &reg_flags); in iwl_print_cont_event_trace()
462 u32 mode; /* 0 - no timestamp, 1 - timestamp recorded */ in iwl_continuous_event_trace()
466 base = priv->device_pointers.log_event_table; in iwl_continuous_event_trace()
468 iwl_trans_read_mem_bytes(priv->trans, base, in iwl_continuous_event_trace()
489 * num_wraps update (this does happen in practice!!) -- take in iwl_continuous_event_trace()
492 if (unlikely(next_entry < priv->event_log.next_entry && in iwl_continuous_event_trace()
493 num_wraps == priv->event_log.num_wraps)) in iwl_continuous_event_trace()
496 if (num_wraps == priv->event_log.num_wraps) { in iwl_continuous_event_trace()
498 priv, base, priv->event_log.next_entry, in iwl_continuous_event_trace()
499 next_entry - priv->event_log.next_entry, in iwl_continuous_event_trace()
502 priv->event_log.non_wraps_count++; in iwl_continuous_event_trace()
504 if (num_wraps - priv->event_log.num_wraps > 1) in iwl_continuous_event_trace()
505 priv->event_log.wraps_more_count++; in iwl_continuous_event_trace()
507 priv->event_log.wraps_once_count++; in iwl_continuous_event_trace()
509 trace_iwlwifi_dev_ucode_wrap_event(priv->trans->dev, in iwl_continuous_event_trace()
510 num_wraps - priv->event_log.num_wraps, in iwl_continuous_event_trace()
511 next_entry, priv->event_log.next_entry); in iwl_continuous_event_trace()
513 if (next_entry < priv->event_log.next_entry) { in iwl_continuous_event_trace()
515 priv, base, priv->event_log.next_entry, in iwl_continuous_event_trace()
516 capacity - priv->event_log.next_entry, in iwl_continuous_event_trace()
524 capacity - next_entry, in iwl_continuous_event_trace()
532 priv->event_log.num_wraps = num_wraps; in iwl_continuous_event_trace()
533 priv->event_log.next_entry = next_entry; in iwl_continuous_event_trace()
537 * iwl_bg_ucode_trace - Timer callback to log ucode event
548 if (test_bit(STATUS_EXIT_PENDING, &priv->status)) in iwl_bg_ucode_trace()
551 if (priv->event_log.ucode_trace) { in iwl_bg_ucode_trace()
554 mod_timer(&priv->ucode_trace, in iwl_bg_ucode_trace()
564 if (test_bit(STATUS_EXIT_PENDING, &priv->status)) in iwl_bg_tx_flush()
567 /* do nothing if rf-kill is on */ in iwl_bg_tx_flush()
598 7, 6, 5, 4,
609 priv->valid_contexts = BIT(IWL_RXON_CTX_BSS); in iwl_init_context()
611 priv->valid_contexts |= BIT(IWL_RXON_CTX_PAN); in iwl_init_context()
614 priv->contexts[i].ctxid = i; in iwl_init_context()
616 priv->contexts[IWL_RXON_CTX_BSS].always_active = true; in iwl_init_context()
617 priv->contexts[IWL_RXON_CTX_BSS].is_active = true; in iwl_init_context()
618 priv->contexts[IWL_RXON_CTX_BSS].rxon_cmd = REPLY_RXON; in iwl_init_context()
619 priv->contexts[IWL_RXON_CTX_BSS].rxon_timing_cmd = REPLY_RXON_TIMING; in iwl_init_context()
620 priv->contexts[IWL_RXON_CTX_BSS].rxon_assoc_cmd = REPLY_RXON_ASSOC; in iwl_init_context()
621 priv->contexts[IWL_RXON_CTX_BSS].qos_cmd = REPLY_QOS_PARAM; in iwl_init_context()
622 priv->contexts[IWL_RXON_CTX_BSS].ap_sta_id = IWL_AP_ID; in iwl_init_context()
623 priv->contexts[IWL_RXON_CTX_BSS].wep_key_cmd = REPLY_WEPKEY; in iwl_init_context()
624 priv->contexts[IWL_RXON_CTX_BSS].bcast_sta_id = IWLAGN_BROADCAST_ID; in iwl_init_context()
625 priv->contexts[IWL_RXON_CTX_BSS].exclusive_interface_modes = in iwl_init_context()
627 priv->contexts[IWL_RXON_CTX_BSS].interface_modes = in iwl_init_context()
629 priv->contexts[IWL_RXON_CTX_BSS].ap_devtype = RXON_DEV_TYPE_AP; in iwl_init_context()
630 priv->contexts[IWL_RXON_CTX_BSS].ibss_devtype = RXON_DEV_TYPE_IBSS; in iwl_init_context()
631 priv->contexts[IWL_RXON_CTX_BSS].station_devtype = RXON_DEV_TYPE_ESS; in iwl_init_context()
632 priv->contexts[IWL_RXON_CTX_BSS].unused_devtype = RXON_DEV_TYPE_ESS; in iwl_init_context()
633 memcpy(priv->contexts[IWL_RXON_CTX_BSS].ac_to_queue, in iwl_init_context()
635 memcpy(priv->contexts[IWL_RXON_CTX_BSS].ac_to_fifo, in iwl_init_context()
638 priv->contexts[IWL_RXON_CTX_PAN].rxon_cmd = REPLY_WIPAN_RXON; in iwl_init_context()
639 priv->contexts[IWL_RXON_CTX_PAN].rxon_timing_cmd = in iwl_init_context()
641 priv->contexts[IWL_RXON_CTX_PAN].rxon_assoc_cmd = in iwl_init_context()
643 priv->contexts[IWL_RXON_CTX_PAN].qos_cmd = REPLY_WIPAN_QOS_PARAM; in iwl_init_context()
644 priv->contexts[IWL_RXON_CTX_PAN].ap_sta_id = IWL_AP_ID_PAN; in iwl_init_context()
645 priv->contexts[IWL_RXON_CTX_PAN].wep_key_cmd = REPLY_WIPAN_WEPKEY; in iwl_init_context()
646 priv->contexts[IWL_RXON_CTX_PAN].bcast_sta_id = IWLAGN_PAN_BCAST_ID; in iwl_init_context()
647 priv->contexts[IWL_RXON_CTX_PAN].station_flags = STA_FLG_PAN_STATION; in iwl_init_context()
648 priv->contexts[IWL_RXON_CTX_PAN].interface_modes = in iwl_init_context()
651 priv->contexts[IWL_RXON_CTX_PAN].ap_devtype = RXON_DEV_TYPE_CP; in iwl_init_context()
652 priv->contexts[IWL_RXON_CTX_PAN].station_devtype = RXON_DEV_TYPE_2STA; in iwl_init_context()
653 priv->contexts[IWL_RXON_CTX_PAN].unused_devtype = RXON_DEV_TYPE_P2P; in iwl_init_context()
654 memcpy(priv->contexts[IWL_RXON_CTX_PAN].ac_to_queue, in iwl_init_context()
656 memcpy(priv->contexts[IWL_RXON_CTX_PAN].ac_to_fifo, in iwl_init_context()
658 priv->contexts[IWL_RXON_CTX_PAN].mcast_queue = IWL_IPAN_MCAST_QUEUE; in iwl_init_context()
669 iwl_write32(priv->trans, CSR_UCODE_DRV_GP1_CLR, in iwl_rf_kill_ct_config()
672 priv->thermal_throttle.ct_kill_toggle = false; in iwl_rf_kill_ct_config()
674 if (priv->lib->support_ct_kill_exit) { in iwl_rf_kill_ct_config()
676 cpu_to_le32(priv->hw_params.ct_kill_threshold); in iwl_rf_kill_ct_config()
678 cpu_to_le32(priv->hw_params.ct_kill_exit_threshold); in iwl_rf_kill_ct_config()
689 priv->hw_params.ct_kill_threshold, in iwl_rf_kill_ct_config()
690 priv->hw_params.ct_kill_exit_threshold); in iwl_rf_kill_ct_config()
693 cpu_to_le32(priv->hw_params.ct_kill_threshold); in iwl_rf_kill_ct_config()
704 priv->hw_params.ct_kill_threshold); in iwl_rf_kill_ct_config()
731 if (IWL_UCODE_API(priv->fw->ucode_ver) > 1) { in iwlagn_send_tx_ant_config()
738 return -EOPNOTSUPP; in iwlagn_send_tx_ant_config()
756 priv->bt_enable_flag = bt_cmd.flags; in iwl_send_bt_config()
766 * iwl_alive_start - called after REPLY_ALIVE notification received
773 struct iwl_rxon_context *ctx = &priv->contexts[IWL_RXON_CTX_BSS]; in iwl_alive_start()
778 set_bit(STATUS_ALIVE, &priv->status); in iwl_alive_start()
781 return -ERFKILL; in iwl_alive_start()
783 if (priv->event_log.ucode_trace) { in iwl_alive_start()
785 mod_timer(&priv->ucode_trace, jiffies); in iwl_alive_start()
789 if (priv->lib->bt_params && in iwl_alive_start()
790 priv->lib->bt_params->advanced_bt_coexist) { in iwl_alive_start()
791 /* Configure Bluetooth device coexistence support */ in iwl_alive_start()
792 if (priv->lib->bt_params->bt_sco_disable) in iwl_alive_start()
793 priv->bt_enable_pspoll = false; in iwl_alive_start()
795 priv->bt_enable_pspoll = true; in iwl_alive_start()
797 priv->bt_valid = IWLAGN_BT_ALL_VALID_MSK; in iwl_alive_start()
798 priv->kill_ack_mask = IWLAGN_BT_KILL_ACK_MASK_DEFAULT; in iwl_alive_start()
799 priv->kill_cts_mask = IWLAGN_BT_KILL_CTS_MASK_DEFAULT; in iwl_alive_start()
801 priv->bt_valid = IWLAGN_BT_VALID_ENABLE_FLAGS; in iwl_alive_start()
802 priv->cur_rssi_ctx = NULL; in iwl_alive_start()
815 } else if (priv->lib->bt_params) { in iwl_alive_start()
817 * default is 2-wire BT coexexistence support in iwl_alive_start()
827 ieee80211_wake_queues(priv->hw); in iwl_alive_start()
830 iwlagn_send_tx_ant_config(priv, priv->nvm_data->valid_tx_ant); in iwl_alive_start()
832 if (iwl_is_associated_ctx(ctx) && !priv->wowlan) { in iwl_alive_start()
834 (struct iwl_rxon_cmd *)&ctx->active; in iwl_alive_start()
836 ctx->staging.filter_flags |= RXON_FILTER_ASSOC_MSK; in iwl_alive_start()
837 active_rxon->filter_flags &= ~RXON_FILTER_ASSOC_MSK; in iwl_alive_start()
847 if (!priv->wowlan) { in iwl_alive_start()
852 set_bit(STATUS_READY, &priv->status); in iwl_alive_start()
868 * iwl_clear_driver_stations - clear knowledge of all stations from driver
873 * able to reconfigure stations -- if we're getting there in the
880 spin_lock_bh(&priv->sta_lock); in iwl_clear_driver_stations()
881 memset(priv->stations, 0, sizeof(priv->stations)); in iwl_clear_driver_stations()
882 priv->num_stations = 0; in iwl_clear_driver_stations()
884 priv->ucode_key_table = 0; in iwl_clear_driver_stations()
894 memset(ctx->wep_keys, 0, sizeof(ctx->wep_keys)); in iwl_clear_driver_stations()
895 ctx->key_mapping_keys = 0; in iwl_clear_driver_stations()
898 spin_unlock_bh(&priv->sta_lock); in iwl_clear_driver_stations()
907 lockdep_assert_held(&priv->mutex); in iwl_down()
912 test_and_set_bit(STATUS_EXIT_PENDING, &priv->status); in iwl_down()
919 priv->bt_status = 0; in iwl_down()
920 priv->cur_rssi_ctx = NULL; in iwl_down()
921 priv->bt_is_sco = 0; in iwl_down()
922 if (priv->lib->bt_params) in iwl_down()
923 priv->bt_traffic_load = in iwl_down()
924 priv->lib->bt_params->bt_init_traffic_load; in iwl_down()
926 priv->bt_traffic_load = 0; in iwl_down()
927 priv->bt_full_concurrent = false; in iwl_down()
928 priv->bt_ci_compliance = 0; in iwl_down()
933 clear_bit(STATUS_EXIT_PENDING, &priv->status); in iwl_down()
935 if (priv->mac80211_registered) in iwl_down()
936 ieee80211_stop_queues(priv->hw); in iwl_down()
938 priv->ucode_loaded = false; in iwl_down()
939 iwl_trans_stop_device(priv->trans); in iwl_down()
942 atomic_set(&priv->num_aux_in_flight, 0); in iwl_down()
945 priv->status &= test_bit(STATUS_RF_KILL_HW, &priv->status) << in iwl_down()
947 test_bit(STATUS_FW_ERROR, &priv->status) << in iwl_down()
949 test_bit(STATUS_EXIT_PENDING, &priv->status) << in iwl_down()
952 dev_kfree_skb(priv->beacon_skb); in iwl_down()
953 priv->beacon_skb = NULL; in iwl_down()
967 mutex_lock(&priv->mutex); in iwl_bg_run_time_calib_work()
969 if (test_bit(STATUS_EXIT_PENDING, &priv->status) || in iwl_bg_run_time_calib_work()
970 test_bit(STATUS_SCANNING, &priv->status)) { in iwl_bg_run_time_calib_work()
971 mutex_unlock(&priv->mutex); in iwl_bg_run_time_calib_work()
975 if (priv->start_calib) { in iwl_bg_run_time_calib_work()
980 mutex_unlock(&priv->mutex); in iwl_bg_run_time_calib_work()
992 lockdep_assert_held(&priv->mutex); in iwlagn_prepare_restart()
994 priv->is_open = 0; in iwlagn_prepare_restart()
1002 * re-configure the hw when we reconfigure the BT in iwlagn_prepare_restart()
1005 bt_full_concurrent = priv->bt_full_concurrent; in iwlagn_prepare_restart()
1006 bt_ci_compliance = priv->bt_ci_compliance; in iwlagn_prepare_restart()
1007 bt_load = priv->bt_traffic_load; in iwlagn_prepare_restart()
1008 bt_status = priv->bt_status; in iwlagn_prepare_restart()
1009 bt_is_sco = priv->bt_is_sco; in iwlagn_prepare_restart()
1013 priv->bt_full_concurrent = bt_full_concurrent; in iwlagn_prepare_restart()
1014 priv->bt_ci_compliance = bt_ci_compliance; in iwlagn_prepare_restart()
1015 priv->bt_traffic_load = bt_load; in iwlagn_prepare_restart()
1016 priv->bt_status = bt_status; in iwlagn_prepare_restart()
1017 priv->bt_is_sco = bt_is_sco; in iwlagn_prepare_restart()
1021 priv->queue_to_mac80211[i] = IWL_INVALID_MAC80211_QUEUE; in iwlagn_prepare_restart()
1024 atomic_set(&priv->queue_stop_count[i], 0); in iwlagn_prepare_restart()
1026 memset(priv->agg_q_alloc, 0, sizeof(priv->agg_q_alloc)); in iwlagn_prepare_restart()
1033 if (test_bit(STATUS_EXIT_PENDING, &priv->status)) in iwl_bg_restart()
1036 if (test_and_clear_bit(STATUS_FW_ERROR, &priv->status)) { in iwl_bg_restart()
1037 mutex_lock(&priv->mutex); in iwl_bg_restart()
1039 mutex_unlock(&priv->mutex); in iwl_bg_restart()
1041 if (priv->mac80211_registered) in iwl_bg_restart()
1042 ieee80211_restart_hw(priv->hw); in iwl_bg_restart()
1059 priv->workqueue = alloc_ordered_workqueue(DRV_NAME, 0); in iwl_setup_deferred_work()
1061 INIT_WORK(&priv->restart, iwl_bg_restart); in iwl_setup_deferred_work()
1062 INIT_WORK(&priv->beacon_update, iwl_bg_beacon_update); in iwl_setup_deferred_work()
1063 INIT_WORK(&priv->run_time_calib_work, iwl_bg_run_time_calib_work); in iwl_setup_deferred_work()
1064 INIT_WORK(&priv->tx_flush, iwl_bg_tx_flush); in iwl_setup_deferred_work()
1065 INIT_WORK(&priv->bt_full_concurrency, iwl_bg_bt_full_concurrency); in iwl_setup_deferred_work()
1066 INIT_WORK(&priv->bt_runtime_config, iwl_bg_bt_runtime_config); in iwl_setup_deferred_work()
1070 if (priv->lib->bt_params) in iwl_setup_deferred_work()
1073 timer_setup(&priv->statistics_periodic, iwl_bg_statistics_periodic, 0); in iwl_setup_deferred_work()
1075 timer_setup(&priv->ucode_trace, iwl_bg_ucode_trace, 0); in iwl_setup_deferred_work()
1080 if (priv->lib->bt_params) in iwl_cancel_deferred_work()
1083 cancel_work_sync(&priv->run_time_calib_work); in iwl_cancel_deferred_work()
1084 cancel_work_sync(&priv->beacon_update); in iwl_cancel_deferred_work()
1088 cancel_work_sync(&priv->bt_full_concurrency); in iwl_cancel_deferred_work()
1089 cancel_work_sync(&priv->bt_runtime_config); in iwl_cancel_deferred_work()
1091 del_timer_sync(&priv->statistics_periodic); in iwl_cancel_deferred_work()
1092 del_timer_sync(&priv->ucode_trace); in iwl_cancel_deferred_work()
1097 spin_lock_init(&priv->sta_lock); in iwl_init_drv()
1099 mutex_init(&priv->mutex); in iwl_init_drv()
1101 INIT_LIST_HEAD(&priv->calib_results); in iwl_init_drv()
1103 priv->band = NL80211_BAND_2GHZ; in iwl_init_drv()
1105 priv->plcp_delta_threshold = priv->lib->plcp_delta_threshold; in iwl_init_drv()
1107 priv->iw_mode = NL80211_IFTYPE_STATION; in iwl_init_drv()
1108 priv->current_ht_config.smps = IEEE80211_SMPS_STATIC; in iwl_init_drv()
1109 priv->missed_beacon_threshold = IWL_MISSED_BEACON_THRESHOLD_DEF; in iwl_init_drv()
1110 priv->agg_tids_count = 0; in iwl_init_drv()
1112 priv->rx_statistics_jiffies = jiffies; in iwl_init_drv()
1115 iwlagn_set_rxon_chain(priv, &priv->contexts[IWL_RXON_CTX_BSS]); in iwl_init_drv()
1120 if (priv->lib->bt_params && in iwl_init_drv()
1121 priv->lib->bt_params->advanced_bt_coexist) { in iwl_init_drv()
1122 priv->kill_ack_mask = IWLAGN_BT_KILL_ACK_MASK_DEFAULT; in iwl_init_drv()
1123 priv->kill_cts_mask = IWLAGN_BT_KILL_CTS_MASK_DEFAULT; in iwl_init_drv()
1124 priv->bt_valid = IWLAGN_BT_ALL_VALID_MSK; in iwl_init_drv()
1125 priv->bt_on_thresh = BT_ON_THRESHOLD_DEF; in iwl_init_drv()
1126 priv->bt_duration = BT_DURATION_LIMIT_DEF; in iwl_init_drv()
1127 priv->dynamic_frag_thresh = BT_FRAG_THRESHOLD_DEF; in iwl_init_drv()
1135 kfree(priv->scan_cmd); in iwl_uninit_drv()
1136 kfree(priv->beacon_cmd); in iwl_uninit_drv()
1137 kfree(rcu_dereference_raw(priv->noa_data)); in iwl_uninit_drv()
1140 kfree(priv->wowlan_sram); in iwl_uninit_drv()
1146 if (priv->cfg->ht_params) in iwl_set_hw_params()
1147 priv->hw_params.use_rts_for_aggregation = in iwl_set_hw_params()
1148 priv->cfg->ht_params->use_rts_for_aggregation; in iwl_set_hw_params()
1150 /* Device-specific setup */ in iwl_set_hw_params()
1151 priv->lib->set_hw_params(priv); in iwl_set_hw_params()
1180 struct iwl_nvm_data *data = priv->nvm_data; in iwl_eeprom_init_hw_params()
1182 if (data->sku_cap_11n_enable && in iwl_eeprom_init_hw_params()
1183 !priv->cfg->ht_params) { in iwl_eeprom_init_hw_params()
1185 return -EINVAL; in iwl_eeprom_init_hw_params()
1188 if (!data->sku_cap_11n_enable && !data->sku_cap_band_24ghz_enable && in iwl_eeprom_init_hw_params()
1189 !data->sku_cap_band_52ghz_enable) { in iwl_eeprom_init_hw_params()
1191 return -EINVAL; in iwl_eeprom_init_hw_params()
1195 "Device SKU: 24GHz %s %s, 52GHz %s %s, 11.n %s %s\n", in iwl_eeprom_init_hw_params()
1196 data->sku_cap_band_24ghz_enable ? "" : "NOT", "enabled", in iwl_eeprom_init_hw_params()
1197 data->sku_cap_band_52ghz_enable ? "" : "NOT", "enabled", in iwl_eeprom_init_hw_params()
1198 data->sku_cap_11n_enable ? "" : "NOT", "enabled"); in iwl_eeprom_init_hw_params()
1200 priv->hw_params.tx_chains_num = in iwl_eeprom_init_hw_params()
1201 num_of_ant(data->valid_tx_ant); in iwl_eeprom_init_hw_params()
1202 if (priv->cfg->rx_with_siso_diversity) in iwl_eeprom_init_hw_params()
1203 priv->hw_params.rx_chains_num = 1; in iwl_eeprom_init_hw_params()
1205 priv->hw_params.rx_chains_num = in iwl_eeprom_init_hw_params()
1206 num_of_ant(data->valid_rx_ant); in iwl_eeprom_init_hw_params()
1209 data->valid_tx_ant, in iwl_eeprom_init_hw_params()
1210 data->valid_rx_ant); in iwl_eeprom_init_hw_params()
1218 if (data->nvm_version >= trans->cfg->nvm_ver || in iwl_nvm_check_version()
1219 data->calib_version >= trans->cfg->nvm_calib_ver) { in iwl_nvm_check_version()
1221 data->nvm_version, data->calib_version); in iwl_nvm_check_version()
1227 data->nvm_version, trans->cfg->nvm_ver, in iwl_nvm_check_version()
1228 data->calib_version, trans->cfg->nvm_calib_ver); in iwl_nvm_check_version()
1229 return -EINVAL; in iwl_nvm_check_version()
1257 pr_err("%s: Cannot allocate network device\n", trans->name); in iwl_op_mode_dvm_start()
1261 op_mode = hw->priv; in iwl_op_mode_dvm_start()
1262 op_mode->ops = &iwl_dvm_ops; in iwl_op_mode_dvm_start()
1264 priv->trans = trans; in iwl_op_mode_dvm_start()
1265 priv->dev = trans->dev; in iwl_op_mode_dvm_start()
1266 priv->cfg = cfg; in iwl_op_mode_dvm_start()
1267 priv->fw = fw; in iwl_op_mode_dvm_start()
1269 switch (priv->trans->trans_cfg->device_family) { in iwl_op_mode_dvm_start()
1272 priv->lib = &iwl_dvm_1000_cfg; in iwl_op_mode_dvm_start()
1275 priv->lib = &iwl_dvm_2000_cfg; in iwl_op_mode_dvm_start()
1278 priv->lib = &iwl_dvm_105_cfg; in iwl_op_mode_dvm_start()
1282 priv->lib = &iwl_dvm_2030_cfg; in iwl_op_mode_dvm_start()
1285 priv->lib = &iwl_dvm_5000_cfg; in iwl_op_mode_dvm_start()
1288 priv->lib = &iwl_dvm_5150_cfg; in iwl_op_mode_dvm_start()
1292 priv->lib = &iwl_dvm_6000_cfg; in iwl_op_mode_dvm_start()
1295 priv->lib = &iwl_dvm_6005_cfg; in iwl_op_mode_dvm_start()
1299 priv->lib = &iwl_dvm_6050_cfg; in iwl_op_mode_dvm_start()
1302 priv->lib = &iwl_dvm_6030_cfg; in iwl_op_mode_dvm_start()
1308 if (WARN_ON(!priv->lib)) in iwl_op_mode_dvm_start()
1343 WARN_ON(sizeof(priv->transport_queue_stop) * BITS_PER_BYTE < in iwl_op_mode_dvm_start()
1344 priv->trans->trans_cfg->base_params->num_of_queues); in iwl_op_mode_dvm_start()
1346 ucode_flags = fw->ucode_capa.flags; in iwl_op_mode_dvm_start()
1349 priv->sta_key_max_num = STA_KEY_MAX_NUM_PAN; in iwl_op_mode_dvm_start()
1352 priv->sta_key_max_num = STA_KEY_MAX_NUM; in iwl_op_mode_dvm_start()
1357 iwl_trans_configure(priv->trans, &trans_cfg); in iwl_op_mode_dvm_start()
1359 trans->rx_mpdu_cmd = REPLY_RX_MPDU_CMD; in iwl_op_mode_dvm_start()
1360 trans->rx_mpdu_cmd_hdr_size = sizeof(struct iwl_rx_mpdu_res_start); in iwl_op_mode_dvm_start()
1361 trans->command_groups = trans_cfg.command_groups; in iwl_op_mode_dvm_start()
1362 trans->command_groups_size = trans_cfg.command_groups_size; in iwl_op_mode_dvm_start()
1366 SET_IEEE80211_DEV(priv->hw, priv->trans->dev); in iwl_op_mode_dvm_start()
1373 priv->bt_ch_announce = true; in iwl_op_mode_dvm_start()
1375 (priv->bt_ch_announce) ? "On" : "Off"); in iwl_op_mode_dvm_start()
1380 spin_lock_init(&priv->statistics.lock); in iwl_op_mode_dvm_start()
1386 priv->trans->name, priv->trans->hw_rev); in iwl_op_mode_dvm_start()
1388 if (iwl_trans_start_hw(priv->trans)) in iwl_op_mode_dvm_start()
1392 if (iwl_read_eeprom(priv->trans, &priv->eeprom_blob, in iwl_op_mode_dvm_start()
1393 &priv->eeprom_blob_size)) { in iwl_op_mode_dvm_start()
1399 iwl_trans_stop_device(priv->trans); in iwl_op_mode_dvm_start()
1401 priv->nvm_data = iwl_parse_eeprom_data(priv->trans, priv->cfg, in iwl_op_mode_dvm_start()
1402 priv->eeprom_blob, in iwl_op_mode_dvm_start()
1403 priv->eeprom_blob_size); in iwl_op_mode_dvm_start()
1404 if (!priv->nvm_data) in iwl_op_mode_dvm_start()
1407 if (iwl_nvm_check_version(priv->nvm_data, priv->trans)) in iwl_op_mode_dvm_start()
1414 memcpy(priv->addresses[0].addr, priv->nvm_data->hw_addr, ETH_ALEN); in iwl_op_mode_dvm_start()
1415 IWL_DEBUG_INFO(priv, "MAC address: %pM\n", priv->addresses[0].addr); in iwl_op_mode_dvm_start()
1416 priv->hw->wiphy->addresses = priv->addresses; in iwl_op_mode_dvm_start()
1417 priv->hw->wiphy->n_addresses = 1; in iwl_op_mode_dvm_start()
1418 num_mac = priv->nvm_data->n_hw_addrs; in iwl_op_mode_dvm_start()
1420 memcpy(priv->addresses[1].addr, priv->addresses[0].addr, in iwl_op_mode_dvm_start()
1422 priv->addresses[1].addr[5]++; in iwl_op_mode_dvm_start()
1423 priv->hw->wiphy->n_addresses++; in iwl_op_mode_dvm_start()
1427 * 4. Setup HW constants in iwl_op_mode_dvm_start()
1431 if (!(priv->nvm_data->sku_cap_ipan_enable)) { in iwl_op_mode_dvm_start()
1435 * if not PAN, then don't support P2P -- might be a uCode in iwl_op_mode_dvm_start()
1438 priv->sta_key_max_num = STA_KEY_MAX_NUM; in iwl_op_mode_dvm_start()
1442 iwl_trans_configure(priv->trans, &trans_cfg); in iwl_op_mode_dvm_start()
1449 priv->queue_to_mac80211[i] = IWL_INVALID_MAC80211_QUEUE; in iwl_op_mode_dvm_start()
1453 priv->queue_to_mac80211[i] = i; in iwl_op_mode_dvm_start()
1454 atomic_set(&priv->queue_stop_count[i], 0); in iwl_op_mode_dvm_start()
1471 snprintf(priv->hw->wiphy->fw_version, in iwl_op_mode_dvm_start()
1472 sizeof(priv->hw->wiphy->fw_version), in iwl_op_mode_dvm_start()
1473 "%s", fw->fw_version); in iwl_op_mode_dvm_start()
1475 priv->new_scan_threshold_behaviour = in iwl_op_mode_dvm_start()
1478 priv->phy_calib_chain_noise_reset_cmd = in iwl_op_mode_dvm_start()
1479 fw->ucode_capa.standard_phy_calibration_size; in iwl_op_mode_dvm_start()
1480 priv->phy_calib_chain_noise_gain_cmd = in iwl_op_mode_dvm_start()
1481 fw->ucode_capa.standard_phy_calibration_size + 1; in iwl_op_mode_dvm_start()
1491 if (iwlagn_mac_setup_register(priv, &fw->ucode_capa)) in iwl_op_mode_dvm_start()
1501 destroy_workqueue(priv->workqueue); in iwl_op_mode_dvm_start()
1502 priv->workqueue = NULL; in iwl_op_mode_dvm_start()
1505 kfree(priv->eeprom_blob); in iwl_op_mode_dvm_start()
1507 kfree(priv->nvm_data); in iwl_op_mode_dvm_start()
1509 ieee80211_free_hw(priv->hw); in iwl_op_mode_dvm_start()
1525 kfree(priv->eeprom_blob); in iwl_op_mode_dvm_stop()
1526 kfree(priv->nvm_data); in iwl_op_mode_dvm_stop()
1529 flush_workqueue(priv->workqueue); in iwl_op_mode_dvm_stop()
1532 * priv->workqueue... so we can't take down the workqueue in iwl_op_mode_dvm_stop()
1534 destroy_workqueue(priv->workqueue); in iwl_op_mode_dvm_stop()
1535 priv->workqueue = NULL; in iwl_op_mode_dvm_stop()
1539 dev_kfree_skb(priv->beacon_skb); in iwl_op_mode_dvm_stop()
1541 iwl_trans_op_mode_leave(priv->trans); in iwl_op_mode_dvm_stop()
1542 ieee80211_free_hw(priv->hw); in iwl_op_mode_dvm_stop()
1603 max = ARRAY_SIZE(advanced_lookup) - 1; in desc_lookup()
1616 struct iwl_trans *trans = priv->trans; in iwl_dump_nic_error_log()
1620 base = priv->device_pointers.error_event_table; in iwl_dump_nic_error_log()
1621 if (priv->cur_ucode == IWL_UCODE_INIT) { in iwl_dump_nic_error_log()
1623 base = priv->fw->init_errlog_ptr; in iwl_dump_nic_error_log()
1626 base = priv->fw->inst_errlog_ptr; in iwl_dump_nic_error_log()
1633 (priv->cur_ucode == IWL_UCODE_INIT) in iwl_dump_nic_error_log()
1644 priv->status, table.valid); in iwl_dump_nic_error_log()
1647 IWL_ERR(priv, "0x%08X | %-28s\n", table.error_id, in iwl_dump_nic_error_log()
1683 #define EVENT_START_OFFSET (4 * sizeof(u32))
1686 * iwl_print_event_log - Dump error event log to syslog
1699 struct iwl_trans *trans = priv->trans; in iwl_print_event_log()
1704 base = priv->device_pointers.log_event_table; in iwl_print_event_log()
1705 if (priv->cur_ucode == IWL_UCODE_INIT) { in iwl_print_event_log()
1707 base = priv->fw->init_evtlog_ptr; in iwl_print_event_log()
1710 base = priv->fw->inst_evtlog_ptr; in iwl_print_event_log()
1724 /* Set starting address; reads will auto-increment */ in iwl_print_event_log()
1735 pos += scnprintf(*buf + pos, bufsz - pos, in iwl_print_event_log()
1739 trace_iwlwifi_dev_ucode_event(trans->dev, 0, in iwl_print_event_log()
1747 pos += scnprintf(*buf + pos, bufsz - pos, in iwl_print_event_log()
1753 trace_iwlwifi_dev_ucode_event(trans->dev, time, in iwl_print_event_log()
1765 * iwl_print_last_event_logs - Dump the newest # of event log to syslog
1779 capacity - (size - next_entry), in iwl_print_last_event_logs()
1780 size - next_entry, mode, in iwl_print_last_event_logs()
1786 pos = iwl_print_event_log(priv, next_entry - size, in iwl_print_last_event_logs()
1793 pos = iwl_print_event_log(priv, next_entry - size, in iwl_print_last_event_logs()
1807 u32 mode; /* 0 - no timestamp, 1 - timestamp recorded */ in iwl_dump_nic_event_log()
1814 struct iwl_trans *trans = priv->trans; in iwl_dump_nic_event_log()
1816 base = priv->device_pointers.log_event_table; in iwl_dump_nic_event_log()
1817 if (priv->cur_ucode == IWL_UCODE_INIT) { in iwl_dump_nic_event_log()
1818 logsize = priv->fw->init_evtlog_size; in iwl_dump_nic_event_log()
1820 base = priv->fw->init_evtlog_ptr; in iwl_dump_nic_event_log()
1822 logsize = priv->fw->inst_evtlog_size; in iwl_dump_nic_event_log()
1824 base = priv->fw->inst_evtlog_ptr; in iwl_dump_nic_event_log()
1831 (priv->cur_ucode == IWL_UCODE_INIT) in iwl_dump_nic_event_log()
1833 return -EINVAL; in iwl_dump_nic_event_log()
1876 return -ENOMEM; in iwl_dump_nic_event_log()
1886 capacity - next_entry, mode, in iwl_dump_nic_event_log()
1912 priv->ucode_loaded = false; in iwlagn_fw_error()
1914 /* Set the FW error flag -- cleared on iwl_down */ in iwlagn_fw_error()
1915 set_bit(STATUS_FW_ERROR, &priv->status); in iwlagn_fw_error()
1917 iwl_abort_notification_waits(&priv->notif_wait); in iwlagn_fw_error()
1921 clear_bit(STATUS_READY, &priv->status); in iwlagn_fw_error()
1931 reload_msec = jiffies_to_msecs((long) reload_jiffies - in iwlagn_fw_error()
1932 (long) priv->reload_jiffies); in iwlagn_fw_error()
1933 priv->reload_jiffies = reload_jiffies; in iwlagn_fw_error()
1935 priv->reload_count++; in iwlagn_fw_error()
1936 if (priv->reload_count >= IWL_MAX_CONTINUE_RELOAD_CNT) { in iwlagn_fw_error()
1941 priv->reload_count = 0; in iwlagn_fw_error()
1944 if (!test_bit(STATUS_EXIT_PENDING, &priv->status)) { in iwlagn_fw_error()
1948 queue_work(priv->workqueue, &priv->restart); in iwlagn_fw_error()
1960 priv->fw->fw_version); in iwl_nic_error()
1985 iwl_trans_set_bits_mask(priv->trans, CSR_HW_IF_CONFIG_REG, in iwl_nic_config()
1988 (CSR_HW_REV_STEP(priv->trans->hw_rev) << in iwl_nic_config()
1990 (CSR_HW_REV_DASH(priv->trans->hw_rev) << in iwl_nic_config()
1994 if (priv->nvm_data->radio_cfg_type <= EEPROM_RF_CONFIG_TYPE_MAX) { in iwl_nic_config()
1996 priv->nvm_data->radio_cfg_type << in iwl_nic_config()
1998 priv->nvm_data->radio_cfg_step << in iwl_nic_config()
2000 priv->nvm_data->radio_cfg_dash << in iwl_nic_config()
2003 iwl_trans_set_bits_mask(priv->trans, CSR_HW_IF_CONFIG_REG, in iwl_nic_config()
2009 IWL_INFO(priv, "Radio type=0x%x-0x%x-0x%x\n", in iwl_nic_config()
2010 priv->nvm_data->radio_cfg_type, in iwl_nic_config()
2011 priv->nvm_data->radio_cfg_step, in iwl_nic_config()
2012 priv->nvm_data->radio_cfg_dash); in iwl_nic_config()
2018 iwl_set_bit(priv->trans, CSR_HW_IF_CONFIG_REG, in iwl_nic_config()
2026 iwl_set_bits_mask_prph(priv->trans, APMG_PS_CTRL_REG, in iwl_nic_config()
2030 if (priv->lib->nic_config) in iwl_nic_config()
2031 priv->lib->nic_config(priv); in iwl_nic_config()
2038 clear_bit(STATUS_READY, &priv->status); in iwl_wimax_active()
2045 int mq = priv->queue_to_mac80211[queue]; in iwl_stop_sw_queue()
2050 if (atomic_inc_return(&priv->queue_stop_count[mq]) > 1) { in iwl_stop_sw_queue()
2057 set_bit(mq, &priv->transport_queue_stop); in iwl_stop_sw_queue()
2058 ieee80211_stop_queue(priv->hw, mq); in iwl_stop_sw_queue()
2064 int mq = priv->queue_to_mac80211[queue]; in iwl_wake_sw_queue()
2069 if (atomic_dec_return(&priv->queue_stop_count[mq]) > 0) { in iwl_wake_sw_queue()
2076 clear_bit(mq, &priv->transport_queue_stop); in iwl_wake_sw_queue()
2078 if (!priv->passive_no_rx) in iwl_wake_sw_queue()
2079 ieee80211_wake_queue(priv->hw, mq); in iwl_wake_sw_queue()
2086 if (!priv->passive_no_rx) in iwlagn_lift_passive_no_rx()
2090 if (!test_bit(mq, &priv->transport_queue_stop)) { in iwlagn_lift_passive_no_rx()
2092 ieee80211_wake_queue(priv->hw, mq); in iwlagn_lift_passive_no_rx()
2098 priv->passive_no_rx = false; in iwlagn_lift_passive_no_rx()
2107 iwl_trans_free_tx_cmd(priv->trans, info->driver_data[1]); in iwl_free_skb()
2108 ieee80211_free_txskb(priv->hw, skb); in iwl_free_skb()
2116 set_bit(STATUS_RF_KILL_HW, &priv->status); in iwl_set_hw_rfkill_state()
2118 clear_bit(STATUS_RF_KILL_HW, &priv->status); in iwl_set_hw_rfkill_state()
2120 wiphy_rfkill_set_hw_state(priv->hw->wiphy, state); in iwl_set_hw_rfkill_state()