• Home
  • Raw
  • Download

Lines Matching refs:ah

23 static void ar9003_mci_reset_req_wakeup(struct ath_hw *ah)  in ar9003_mci_reset_req_wakeup()  argument
25 REG_RMW_FIELD(ah, AR_MCI_COMMAND2, in ar9003_mci_reset_req_wakeup()
28 REG_RMW_FIELD(ah, AR_MCI_COMMAND2, in ar9003_mci_reset_req_wakeup()
32 static int ar9003_mci_wait_for_interrupt(struct ath_hw *ah, u32 address, in ar9003_mci_wait_for_interrupt() argument
35 struct ath_common *common = ath9k_hw_common(ah); in ar9003_mci_wait_for_interrupt()
38 if (!(REG_READ(ah, address) & bit_position)) { in ar9003_mci_wait_for_interrupt()
47 REG_WRITE(ah, address, bit_position); in ar9003_mci_wait_for_interrupt()
53 ar9003_mci_reset_req_wakeup(ah); in ar9003_mci_wait_for_interrupt()
57 REG_WRITE(ah, AR_MCI_INTERRUPT_RAW, in ar9003_mci_wait_for_interrupt()
60 REG_WRITE(ah, AR_MCI_INTERRUPT_RAW, AR_MCI_INTERRUPT_RX_MSG); in ar9003_mci_wait_for_interrupt()
70 REG_READ(ah, AR_MCI_INTERRUPT_RAW), in ar9003_mci_wait_for_interrupt()
71 REG_READ(ah, AR_MCI_INTERRUPT_RX_MSG_RAW)); in ar9003_mci_wait_for_interrupt()
78 static void ar9003_mci_remote_reset(struct ath_hw *ah, bool wait_done) in ar9003_mci_remote_reset() argument
82 ar9003_mci_send_message(ah, MCI_REMOTE_RESET, 0, payload, 16, in ar9003_mci_remote_reset()
87 static void ar9003_mci_send_lna_transfer(struct ath_hw *ah, bool wait_done) in ar9003_mci_send_lna_transfer() argument
91 ar9003_mci_send_message(ah, MCI_LNA_TRANS, 0, &payload, 1, in ar9003_mci_send_lna_transfer()
95 static void ar9003_mci_send_req_wake(struct ath_hw *ah, bool wait_done) in ar9003_mci_send_req_wake() argument
97 ar9003_mci_send_message(ah, MCI_REQ_WAKE, MCI_FLAG_DISABLE_TIMESTAMP, in ar9003_mci_send_req_wake()
102 static void ar9003_mci_send_sys_waking(struct ath_hw *ah, bool wait_done) in ar9003_mci_send_sys_waking() argument
104 ar9003_mci_send_message(ah, MCI_SYS_WAKING, MCI_FLAG_DISABLE_TIMESTAMP, in ar9003_mci_send_sys_waking()
108 static void ar9003_mci_send_lna_take(struct ath_hw *ah, bool wait_done) in ar9003_mci_send_lna_take() argument
112 ar9003_mci_send_message(ah, MCI_LNA_TAKE, 0, &payload, 1, in ar9003_mci_send_lna_take()
116 static void ar9003_mci_send_sys_sleeping(struct ath_hw *ah, bool wait_done) in ar9003_mci_send_sys_sleeping() argument
118 ar9003_mci_send_message(ah, MCI_SYS_SLEEPING, in ar9003_mci_send_sys_sleeping()
123 static void ar9003_mci_send_coex_version_query(struct ath_hw *ah, in ar9003_mci_send_coex_version_query() argument
126 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; in ar9003_mci_send_coex_version_query()
135 ar9003_mci_send_message(ah, MCI_GPM, 0, payload, 16, wait_done, true); in ar9003_mci_send_coex_version_query()
138 static void ar9003_mci_send_coex_version_response(struct ath_hw *ah, in ar9003_mci_send_coex_version_response() argument
141 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; in ar9003_mci_send_coex_version_response()
150 ar9003_mci_send_message(ah, MCI_GPM, 0, payload, 16, wait_done, true); in ar9003_mci_send_coex_version_response()
153 static void ar9003_mci_send_coex_wlan_channels(struct ath_hw *ah, in ar9003_mci_send_coex_wlan_channels() argument
156 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; in ar9003_mci_send_coex_wlan_channels()
165 ar9003_mci_send_message(ah, MCI_GPM, 0, payload, 16, wait_done, true); in ar9003_mci_send_coex_wlan_channels()
169 static void ar9003_mci_send_coex_bt_status_query(struct ath_hw *ah, in ar9003_mci_send_coex_bt_status_query() argument
172 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; in ar9003_mci_send_coex_bt_status_query()
190 if (!ar9003_mci_send_message(ah, MCI_GPM, 0, payload, 16, in ar9003_mci_send_coex_bt_status_query()
200 static void ar9003_mci_send_coex_halt_bt_gpm(struct ath_hw *ah, bool halt, in ar9003_mci_send_coex_halt_bt_gpm() argument
203 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; in ar9003_mci_send_coex_halt_bt_gpm()
220 ar9003_mci_send_message(ah, MCI_GPM, 0, payload, 16, wait_done, true); in ar9003_mci_send_coex_halt_bt_gpm()
223 static void ar9003_mci_prep_interface(struct ath_hw *ah) in ar9003_mci_prep_interface() argument
225 struct ath_common *common = ath9k_hw_common(ah); in ar9003_mci_prep_interface()
226 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; in ar9003_mci_prep_interface()
231 saved_mci_int_en = REG_READ(ah, AR_MCI_INTERRUPT_EN); in ar9003_mci_prep_interface()
233 REG_WRITE(ah, AR_MCI_INTERRUPT_EN, 0); in ar9003_mci_prep_interface()
234 REG_WRITE(ah, AR_MCI_INTERRUPT_RX_MSG_RAW, in ar9003_mci_prep_interface()
235 REG_READ(ah, AR_MCI_INTERRUPT_RX_MSG_RAW)); in ar9003_mci_prep_interface()
236 REG_WRITE(ah, AR_MCI_INTERRUPT_RAW, in ar9003_mci_prep_interface()
237 REG_READ(ah, AR_MCI_INTERRUPT_RAW)); in ar9003_mci_prep_interface()
239 ar9003_mci_remote_reset(ah, true); in ar9003_mci_prep_interface()
240 ar9003_mci_send_req_wake(ah, true); in ar9003_mci_prep_interface()
242 if (!ar9003_mci_wait_for_interrupt(ah, AR_MCI_INTERRUPT_RX_MSG_RAW, in ar9003_mci_prep_interface()
264 ar9003_mci_send_sys_waking(ah, true); in ar9003_mci_prep_interface()
271 REG_WRITE(ah, AR_MCI_BT_PRI0, 0xFFFFFFFF); in ar9003_mci_prep_interface()
272 REG_WRITE(ah, AR_MCI_BT_PRI1, 0xFFFFFFFF); in ar9003_mci_prep_interface()
273 REG_WRITE(ah, AR_MCI_BT_PRI2, 0xFFFFFFFF); in ar9003_mci_prep_interface()
274 REG_WRITE(ah, AR_MCI_BT_PRI3, 0xFFFFFFFF); in ar9003_mci_prep_interface()
275 REG_WRITE(ah, AR_MCI_BT_PRI, 0X000000FF); in ar9003_mci_prep_interface()
283 REG_WRITE(ah, AR_MCI_INTERRUPT_RX_MSG_RAW, in ar9003_mci_prep_interface()
285 REG_WRITE(ah, AR_MCI_INTERRUPT_RAW, AR_MCI_INTERRUPT_BT_PRI); in ar9003_mci_prep_interface()
288 ar9003_mci_send_lna_transfer(ah, true); in ar9003_mci_prep_interface()
293 if (ar9003_mci_wait_for_interrupt(ah, in ar9003_mci_prep_interface()
307 (REG_READ_FIELD(ah, AR_MCI_INTERRUPT_RX_MSG_RAW, in ar9003_mci_prep_interface()
309 (REG_READ_FIELD(ah, AR_MCI_INTERRUPT_RX_MSG_RAW, in ar9003_mci_prep_interface()
311 REG_WRITE(ah, AR_MCI_INTERRUPT_RX_MSG_RAW, in ar9003_mci_prep_interface()
313 REG_WRITE(ah, AR_MCI_INTERRUPT_RAW, in ar9003_mci_prep_interface()
317 REG_WRITE(ah, AR_MCI_INTERRUPT_EN, saved_mci_int_en); in ar9003_mci_prep_interface()
320 void ar9003_mci_set_full_sleep(struct ath_hw *ah) in ar9003_mci_set_full_sleep() argument
322 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; in ar9003_mci_set_full_sleep()
324 if (ar9003_mci_state(ah, MCI_STATE_ENABLE) && in ar9003_mci_set_full_sleep()
327 ar9003_mci_send_coex_halt_bt_gpm(ah, true, true); in ar9003_mci_set_full_sleep()
333 static void ar9003_mci_disable_interrupt(struct ath_hw *ah) in ar9003_mci_disable_interrupt() argument
335 REG_WRITE(ah, AR_MCI_INTERRUPT_EN, 0); in ar9003_mci_disable_interrupt()
336 REG_WRITE(ah, AR_MCI_INTERRUPT_RX_MSG_EN, 0); in ar9003_mci_disable_interrupt()
339 static void ar9003_mci_enable_interrupt(struct ath_hw *ah) in ar9003_mci_enable_interrupt() argument
341 REG_WRITE(ah, AR_MCI_INTERRUPT_EN, AR_MCI_INTERRUPT_DEFAULT); in ar9003_mci_enable_interrupt()
342 REG_WRITE(ah, AR_MCI_INTERRUPT_RX_MSG_EN, in ar9003_mci_enable_interrupt()
346 static bool ar9003_mci_check_int(struct ath_hw *ah, u32 ints) in ar9003_mci_check_int() argument
350 intr = REG_READ(ah, AR_MCI_INTERRUPT_RX_MSG_RAW); in ar9003_mci_check_int()
354 void ar9003_mci_get_interrupt(struct ath_hw *ah, u32 *raw_intr, in ar9003_mci_get_interrupt() argument
357 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; in ar9003_mci_get_interrupt()
368 void ar9003_mci_get_isr(struct ath_hw *ah, enum ath9k_int *masked) in ar9003_mci_get_isr() argument
370 struct ath_common *common = ath9k_hw_common(ah); in ar9003_mci_get_isr()
371 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; in ar9003_mci_get_isr()
374 rx_msg_intr = REG_READ(ah, AR_MCI_INTERRUPT_RX_MSG_RAW); in ar9003_mci_get_isr()
375 raw_intr = REG_READ(ah, AR_MCI_INTERRUPT_RAW); in ar9003_mci_get_isr()
386 mci->cont_status = REG_READ(ah, AR_MCI_CONT_STATUS); in ar9003_mci_get_isr()
388 REG_WRITE(ah, AR_MCI_INTERRUPT_RX_MSG_RAW, rx_msg_intr); in ar9003_mci_get_isr()
389 REG_WRITE(ah, AR_MCI_INTERRUPT_RAW, raw_intr); in ar9003_mci_get_isr()
393 static void ar9003_mci_2g5g_changed(struct ath_hw *ah, bool is_2g) in ar9003_mci_2g5g_changed() argument
395 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; in ar9003_mci_2g5g_changed()
404 static bool ar9003_mci_is_gpm_valid(struct ath_hw *ah, u32 msg_index) in ar9003_mci_is_gpm_valid() argument
406 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; in ar9003_mci_is_gpm_valid()
424 static void ar9003_mci_observation_set_up(struct ath_hw *ah) in ar9003_mci_observation_set_up() argument
426 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; in ar9003_mci_observation_set_up()
429 ath9k_hw_cfg_output(ah, 3, AR_GPIO_OUTPUT_MUX_AS_MCI_WLAN_DATA); in ar9003_mci_observation_set_up()
430 ath9k_hw_cfg_output(ah, 2, AR_GPIO_OUTPUT_MUX_AS_MCI_WLAN_CLK); in ar9003_mci_observation_set_up()
431 ath9k_hw_cfg_output(ah, 1, AR_GPIO_OUTPUT_MUX_AS_MCI_BT_DATA); in ar9003_mci_observation_set_up()
432 ath9k_hw_cfg_output(ah, 0, AR_GPIO_OUTPUT_MUX_AS_MCI_BT_CLK); in ar9003_mci_observation_set_up()
434 ath9k_hw_cfg_output(ah, 3, AR_GPIO_OUTPUT_MUX_AS_WL_IN_TX); in ar9003_mci_observation_set_up()
435 ath9k_hw_cfg_output(ah, 2, AR_GPIO_OUTPUT_MUX_AS_WL_IN_RX); in ar9003_mci_observation_set_up()
436 ath9k_hw_cfg_output(ah, 1, AR_GPIO_OUTPUT_MUX_AS_BT_IN_TX); in ar9003_mci_observation_set_up()
437 ath9k_hw_cfg_output(ah, 0, AR_GPIO_OUTPUT_MUX_AS_BT_IN_RX); in ar9003_mci_observation_set_up()
438 ath9k_hw_cfg_output(ah, 5, AR_GPIO_OUTPUT_MUX_AS_OUTPUT); in ar9003_mci_observation_set_up()
440 ath9k_hw_cfg_output(ah, 3, AR_GPIO_OUTPUT_MUX_AS_BT_IN_TX); in ar9003_mci_observation_set_up()
441 ath9k_hw_cfg_output(ah, 2, AR_GPIO_OUTPUT_MUX_AS_BT_IN_RX); in ar9003_mci_observation_set_up()
442 ath9k_hw_cfg_output(ah, 1, AR_GPIO_OUTPUT_MUX_AS_MCI_BT_DATA); in ar9003_mci_observation_set_up()
443 ath9k_hw_cfg_output(ah, 0, AR_GPIO_OUTPUT_MUX_AS_MCI_BT_CLK); in ar9003_mci_observation_set_up()
447 REG_SET_BIT(ah, AR_GPIO_INPUT_EN_VAL, AR_GPIO_JTAG_DISABLE); in ar9003_mci_observation_set_up()
449 REG_RMW_FIELD(ah, AR_PHY_GLB_CONTROL, AR_GLB_DS_JTAG_DISABLE, 1); in ar9003_mci_observation_set_up()
450 REG_RMW_FIELD(ah, AR_PHY_GLB_CONTROL, AR_GLB_WLAN_UART_INTF_EN, 0); in ar9003_mci_observation_set_up()
451 REG_SET_BIT(ah, AR_GLB_GPIO_CONTROL, ATH_MCI_CONFIG_MCI_OBS_GPIO); in ar9003_mci_observation_set_up()
453 REG_RMW_FIELD(ah, AR_BTCOEX_CTRL2, AR_BTCOEX_CTRL2_GPIO_OBS_SEL, 0); in ar9003_mci_observation_set_up()
454 REG_RMW_FIELD(ah, AR_BTCOEX_CTRL2, AR_BTCOEX_CTRL2_MAC_BB_OBS_SEL, 1); in ar9003_mci_observation_set_up()
455 REG_WRITE(ah, AR_OBS, 0x4b); in ar9003_mci_observation_set_up()
456 REG_RMW_FIELD(ah, AR_DIAG_SW, AR_DIAG_OBS_PT_SEL1, 0x03); in ar9003_mci_observation_set_up()
457 REG_RMW_FIELD(ah, AR_DIAG_SW, AR_DIAG_OBS_PT_SEL2, 0x01); in ar9003_mci_observation_set_up()
458 REG_RMW_FIELD(ah, AR_MACMISC, AR_MACMISC_MISC_OBS_BUS_LSB, 0x02); in ar9003_mci_observation_set_up()
459 REG_RMW_FIELD(ah, AR_MACMISC, AR_MACMISC_MISC_OBS_BUS_MSB, 0x03); in ar9003_mci_observation_set_up()
460 REG_RMW_FIELD(ah, AR_PHY_TEST_CTL_STATUS, in ar9003_mci_observation_set_up()
464 static bool ar9003_mci_send_coex_bt_flags(struct ath_hw *ah, bool wait_done, in ar9003_mci_send_coex_bt_flags() argument
478 return ar9003_mci_send_message(ah, MCI_GPM, 0, pld, 16, in ar9003_mci_send_coex_bt_flags()
482 static void ar9003_mci_sync_bt_state(struct ath_hw *ah) in ar9003_mci_sync_bt_state() argument
484 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; in ar9003_mci_sync_bt_state()
487 cur_bt_state = ar9003_mci_state(ah, MCI_STATE_REMOTE_SLEEP); in ar9003_mci_sync_bt_state()
494 ar9003_mci_send_coex_version_query(ah, true); in ar9003_mci_sync_bt_state()
495 ar9003_mci_send_coex_wlan_channels(ah, true); in ar9003_mci_sync_bt_state()
498 ar9003_mci_send_coex_halt_bt_gpm(ah, false, true); in ar9003_mci_sync_bt_state()
502 void ar9003_mci_check_bt(struct ath_hw *ah) in ar9003_mci_check_bt() argument
504 struct ath9k_hw_mci *mci_hw = &ah->btcoex_hw.mci; in ar9003_mci_check_bt()
513 ar9003_mci_sync_bt_state(ah); in ar9003_mci_check_bt()
514 ar9003_mci_2g5g_switch(ah, true); in ar9003_mci_check_bt()
522 static void ar9003_mci_process_gpm_extra(struct ath_hw *ah, u8 gpm_type, in ar9003_mci_process_gpm_extra() argument
525 struct ath_common *common = ath9k_hw_common(ah); in ar9003_mci_process_gpm_extra()
526 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; in ar9003_mci_process_gpm_extra()
535 ar9003_mci_send_coex_version_response(ah, true); in ar9003_mci_process_gpm_extra()
552 ar9003_mci_send_coex_wlan_channels(ah, true); in ar9003_mci_process_gpm_extra()
569 static u32 ar9003_mci_wait_for_gpm(struct ath_hw *ah, u8 gpm_type, in ar9003_mci_wait_for_gpm() argument
572 struct ath_common *common = ath9k_hw_common(ah); in ar9003_mci_wait_for_gpm()
573 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; in ar9003_mci_wait_for_gpm()
588 time_out = ar9003_mci_wait_for_interrupt(ah, in ar9003_mci_wait_for_gpm()
596 offset = ar9003_mci_get_next_gpm_offset(ah, false, &more_data); in ar9003_mci_wait_for_gpm()
639 ar9003_mci_send_message(ah, MCI_GPM, 0, payload, 16, in ar9003_mci_wait_for_gpm()
646 ar9003_mci_process_gpm_extra(ah, recv_type, in ar9003_mci_wait_for_gpm()
660 offset = ar9003_mci_get_next_gpm_offset(ah, false, &more_data); in ar9003_mci_wait_for_gpm()
669 ar9003_mci_process_gpm_extra(ah, recv_type, in ar9003_mci_wait_for_gpm()
678 bool ar9003_mci_start_reset(struct ath_hw *ah, struct ath9k_channel *chan) in ar9003_mci_start_reset() argument
680 struct ath_common *common = ath9k_hw_common(ah); in ar9003_mci_start_reset()
681 struct ath9k_hw_mci *mci_hw = &ah->btcoex_hw.mci; in ar9003_mci_start_reset()
684 ar9003_mci_2g5g_changed(ah, IS_CHAN_2GHZ(chan)); in ar9003_mci_start_reset()
696 ar9003_mci_disable_interrupt(ah); in ar9003_mci_start_reset()
699 ar9003_mci_send_message(ah, MCI_GPM, 0, payload, in ar9003_mci_start_reset()
704 if (ar9003_mci_wait_for_gpm(ah, MCI_GPM_BT_CAL_DONE, in ar9003_mci_start_reset()
713 ar9003_mci_enable_interrupt(ah); in ar9003_mci_start_reset()
718 int ar9003_mci_end_reset(struct ath_hw *ah, struct ath9k_channel *chan, in ar9003_mci_end_reset() argument
721 struct ath9k_hw_mci *mci_hw = &ah->btcoex_hw.mci; in ar9003_mci_end_reset()
729 if (!ar9003_mci_check_int(ah, AR_MCI_INTERRUPT_RX_MSG_REMOTE_RESET) && in ar9003_mci_end_reset()
730 !ar9003_mci_check_int(ah, AR_MCI_INTERRUPT_RX_MSG_REQ_WAKE)) in ar9003_mci_end_reset()
739 REG_WRITE(ah, AR_MCI_INTERRUPT_RX_MSG_RAW, in ar9003_mci_end_reset()
743 ar9003_mci_remote_reset(ah, true); in ar9003_mci_end_reset()
744 ar9003_mci_send_sys_waking(ah, true); in ar9003_mci_end_reset()
748 ar9003_mci_send_lna_transfer(ah, true); in ar9003_mci_end_reset()
752 REG_CLR_BIT(ah, AR_PHY_TIMING4, in ar9003_mci_end_reset()
761 if (!ath9k_hw_init_cal(ah, chan)) in ar9003_mci_end_reset()
764 REG_SET_BIT(ah, AR_PHY_TIMING4, in ar9003_mci_end_reset()
768 ar9003_mci_enable_interrupt(ah); in ar9003_mci_end_reset()
772 static void ar9003_mci_mute_bt(struct ath_hw *ah) in ar9003_mci_mute_bt() argument
775 REG_WRITE(ah, AR_MCI_MSG_ATTRIBUTES_TABLE, 0xffff0000); in ar9003_mci_mute_bt()
776 REG_SET_BIT(ah, AR_MCI_TX_CTRL, AR_MCI_TX_CTRL_DISABLE_LNA_UPDATE); in ar9003_mci_mute_bt()
786 ar9003_mci_send_lna_take(ah, true); in ar9003_mci_mute_bt()
790 ar9003_mci_send_sys_sleeping(ah, true); in ar9003_mci_mute_bt()
793 static void ar9003_mci_osla_setup(struct ath_hw *ah, bool enable) in ar9003_mci_osla_setup() argument
795 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; in ar9003_mci_osla_setup()
799 REG_CLR_BIT(ah, AR_BTCOEX_CTRL, in ar9003_mci_osla_setup()
803 REG_RMW_FIELD(ah, AR_MCI_SCHD_TABLE_2, AR_MCI_SCHD_TABLE_2_HW_BASED, 1); in ar9003_mci_osla_setup()
804 REG_RMW_FIELD(ah, AR_MCI_SCHD_TABLE_2, in ar9003_mci_osla_setup()
807 if (AR_SREV_9565(ah)) in ar9003_mci_osla_setup()
808 REG_RMW_FIELD(ah, AR_MCI_MISC, AR_MCI_MISC_HW_FIX_EN, 1); in ar9003_mci_osla_setup()
812 REG_RMW_FIELD(ah, AR_BTCOEX_CTRL, in ar9003_mci_osla_setup()
814 REG_RMW_FIELD(ah, AR_BTCOEX_CTRL, in ar9003_mci_osla_setup()
817 REG_RMW_FIELD(ah, AR_BTCOEX_CTRL, in ar9003_mci_osla_setup()
820 REG_RMW_FIELD(ah, AR_BTCOEX_CTRL, in ar9003_mci_osla_setup()
824 int ar9003_mci_reset(struct ath_hw *ah, bool en_int, bool is_2g, in ar9003_mci_reset() argument
827 struct ath_common *common = ath9k_hw_common(ah); in ar9003_mci_reset()
828 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; in ar9003_mci_reset()
839 if (REG_READ(ah, AR_BTCOEX_CTRL) == 0xdeadbeef) { in ar9003_mci_reset()
845 REG_WRITE(ah, AR_MCI_GPM_0, mci->gpm_addr); in ar9003_mci_reset()
846 REG_WRITE(ah, AR_MCI_GPM_1, mci->gpm_len); in ar9003_mci_reset()
847 REG_WRITE(ah, AR_MCI_SCHD_TABLE_0, mci->sched_addr); in ar9003_mci_reset()
861 if (AR_SREV_9565(ah)) { in ar9003_mci_reset()
864 REG_RMW_FIELD(ah, AR_BTCOEX_CTRL2, in ar9003_mci_reset()
871 REG_WRITE(ah, AR_BTCOEX_CTRL, regval); in ar9003_mci_reset()
874 ar9003_mci_osla_setup(ah, true); in ar9003_mci_reset()
876 ar9003_mci_osla_setup(ah, false); in ar9003_mci_reset()
878 REG_SET_BIT(ah, AR_PHY_GLB_CONTROL, in ar9003_mci_reset()
880 REG_RMW_FIELD(ah, AR_BTCOEX_CTRL3, in ar9003_mci_reset()
883 REG_RMW_FIELD(ah, AR_BTCOEX_CTRL2, AR_BTCOEX_CTRL2_RX_DEWEIGHT, 0); in ar9003_mci_reset()
884 REG_RMW_FIELD(ah, AR_PCU_MISC, AR_PCU_BT_ANT_PREVENT_RX, 0); in ar9003_mci_reset()
887 REG_RMW_FIELD(ah, AR_BTCOEX_WL_LNA, AR_BTCOEX_WL_LNA_TIMEOUT, 0x3D090); in ar9003_mci_reset()
891 REG_RMW_FIELD(ah, AR_BTCOEX_CTRL2, in ar9003_mci_reset()
893 REG_RMW_FIELD(ah, AR_BTCOEX_CTRL2, in ar9003_mci_reset()
895 REG_RMW_FIELD(ah, AR_BTCOEX_CTRL, in ar9003_mci_reset()
898 REG_WRITE(ah, AR_BTCOEX_MAX_TXPWR(i), 0x7f7f7f7f); in ar9003_mci_reset()
902 REG_RMW_FIELD(ah, AR_MCI_TX_CTRL, AR_MCI_TX_CTRL_CLK_DIV, regval); in ar9003_mci_reset()
903 REG_SET_BIT(ah, AR_BTCOEX_CTRL, AR_BTCOEX_CTRL_MCI_MODE_EN); in ar9003_mci_reset()
906 regval = REG_READ(ah, AR_MCI_COMMAND2); in ar9003_mci_reset()
908 REG_WRITE(ah, AR_MCI_COMMAND2, regval); in ar9003_mci_reset()
913 REG_WRITE(ah, AR_MCI_COMMAND2, regval); in ar9003_mci_reset()
916 ar9003_mci_mute_bt(ah); in ar9003_mci_reset()
921 ar9003_mci_check_gpm_offset(ah); in ar9003_mci_reset()
924 REG_WRITE(ah, AR_MCI_COMMAND2, regval); in ar9003_mci_reset()
927 REG_WRITE(ah, AR_MCI_COMMAND2, regval); in ar9003_mci_reset()
929 ar9003_mci_get_next_gpm_offset(ah, true, NULL); in ar9003_mci_reset()
931 REG_WRITE(ah, AR_MCI_MSG_ATTRIBUTES_TABLE, in ar9003_mci_reset()
935 REG_CLR_BIT(ah, AR_MCI_TX_CTRL, in ar9003_mci_reset()
938 ar9003_mci_observation_set_up(ah); in ar9003_mci_reset()
941 ar9003_mci_prep_interface(ah); in ar9003_mci_reset()
943 if (AR_SREV_9565(ah)) in ar9003_mci_reset()
944 REG_RMW_FIELD(ah, AR_MCI_DBG_CNT_CTRL, in ar9003_mci_reset()
947 ar9003_mci_enable_interrupt(ah); in ar9003_mci_reset()
952 void ar9003_mci_stop_bt(struct ath_hw *ah, bool save_fullsleep) in ar9003_mci_stop_bt() argument
954 struct ath9k_hw_mci *mci_hw = &ah->btcoex_hw.mci; in ar9003_mci_stop_bt()
956 ar9003_mci_disable_interrupt(ah); in ar9003_mci_stop_bt()
959 ar9003_mci_mute_bt(ah); in ar9003_mci_stop_bt()
961 REG_WRITE(ah, AR_BTCOEX_CTRL, 0); in ar9003_mci_stop_bt()
968 static void ar9003_mci_send_2g5g_status(struct ath_hw *ah, bool wait_done) in ar9003_mci_send_2g5g_status() argument
970 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; in ar9003_mci_send_2g5g_status()
987 ar9003_mci_send_coex_bt_flags(ah, wait_done, in ar9003_mci_send_2g5g_status()
991 ar9003_mci_send_coex_bt_flags(ah, wait_done, in ar9003_mci_send_2g5g_status()
996 static void ar9003_mci_queue_unsent_gpm(struct ath_hw *ah, u8 header, in ar9003_mci_queue_unsent_gpm() argument
999 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; in ar9003_mci_queue_unsent_gpm()
1045 void ar9003_mci_2g5g_switch(struct ath_hw *ah, bool force) in ar9003_mci_2g5g_switch() argument
1047 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; in ar9003_mci_2g5g_switch()
1053 ar9003_mci_send_2g5g_status(ah, true); in ar9003_mci_2g5g_switch()
1054 ar9003_mci_send_lna_transfer(ah, true); in ar9003_mci_2g5g_switch()
1057 REG_CLR_BIT(ah, AR_MCI_TX_CTRL, in ar9003_mci_2g5g_switch()
1059 REG_CLR_BIT(ah, AR_PHY_GLB_CONTROL, in ar9003_mci_2g5g_switch()
1063 ar9003_mci_osla_setup(ah, true); in ar9003_mci_2g5g_switch()
1065 if (AR_SREV_9462(ah)) in ar9003_mci_2g5g_switch()
1066 REG_WRITE(ah, AR_SELFGEN_MASK, 0x02); in ar9003_mci_2g5g_switch()
1068 ar9003_mci_send_lna_take(ah, true); in ar9003_mci_2g5g_switch()
1071 REG_SET_BIT(ah, AR_MCI_TX_CTRL, in ar9003_mci_2g5g_switch()
1073 REG_SET_BIT(ah, AR_PHY_GLB_CONTROL, in ar9003_mci_2g5g_switch()
1076 ar9003_mci_osla_setup(ah, false); in ar9003_mci_2g5g_switch()
1077 ar9003_mci_send_2g5g_status(ah, true); in ar9003_mci_2g5g_switch()
1081 bool ar9003_mci_send_message(struct ath_hw *ah, u8 header, u32 flag, in ar9003_mci_send_message() argument
1085 struct ath_common *common = ath9k_hw_common(ah); in ar9003_mci_send_message()
1086 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; in ar9003_mci_send_message()
1092 saved_mci_int_en = REG_READ(ah, AR_MCI_INTERRUPT_EN); in ar9003_mci_send_message()
1093 regval = REG_READ(ah, AR_BTCOEX_CTRL); in ar9003_mci_send_message()
1098 header, (ah->power_mode == ATH9K_PM_FULL_SLEEP) ? 1 : 0); in ar9003_mci_send_message()
1099 ar9003_mci_queue_unsent_gpm(ah, header, payload, true); in ar9003_mci_send_message()
1105 ar9003_mci_queue_unsent_gpm(ah, header, payload, true); in ar9003_mci_send_message()
1110 REG_WRITE(ah, AR_MCI_INTERRUPT_EN, 0); in ar9003_mci_send_message()
1114 REG_WRITE(ah, AR_MCI_INTERRUPT_RAW, in ar9003_mci_send_message()
1120 REG_WRITE(ah, (AR_MCI_TX_PAYLOAD0 + i * 4), in ar9003_mci_send_message()
1124 REG_WRITE(ah, AR_MCI_COMMAND0, in ar9003_mci_send_message()
1131 !(ar9003_mci_wait_for_interrupt(ah, AR_MCI_INTERRUPT_RAW, in ar9003_mci_send_message()
1133 ar9003_mci_queue_unsent_gpm(ah, header, payload, true); in ar9003_mci_send_message()
1135 ar9003_mci_queue_unsent_gpm(ah, header, payload, false); in ar9003_mci_send_message()
1140 REG_WRITE(ah, AR_MCI_INTERRUPT_EN, saved_mci_int_en); in ar9003_mci_send_message()
1146 void ar9003_mci_init_cal_req(struct ath_hw *ah, bool *is_reusable) in ar9003_mci_init_cal_req() argument
1148 struct ath_common *common = ath9k_hw_common(ah); in ar9003_mci_init_cal_req()
1149 struct ath9k_hw_mci *mci_hw = &ah->btcoex_hw.mci; in ar9003_mci_init_cal_req()
1159 ar9003_mci_send_message(ah, MCI_GPM, 0, pld, 16, true, false); in ar9003_mci_init_cal_req()
1161 if (ar9003_mci_wait_for_gpm(ah, MCI_GPM_BT_CAL_GRANT, 0, 50000)) { in ar9003_mci_init_cal_req()
1169 void ar9003_mci_init_cal_done(struct ath_hw *ah) in ar9003_mci_init_cal_done() argument
1171 struct ath9k_hw_mci *mci_hw = &ah->btcoex_hw.mci; in ar9003_mci_init_cal_done()
1180 ar9003_mci_send_message(ah, MCI_GPM, 0, pld, 16, true, false); in ar9003_mci_init_cal_done()
1183 int ar9003_mci_setup(struct ath_hw *ah, u32 gpm_addr, void *gpm_buf, in ar9003_mci_setup() argument
1186 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; in ar9003_mci_setup()
1193 return ar9003_mci_reset(ah, true, true, true); in ar9003_mci_setup()
1197 void ar9003_mci_cleanup(struct ath_hw *ah) in ar9003_mci_cleanup() argument
1200 REG_WRITE(ah, AR_BTCOEX_CTRL, 0x00); in ar9003_mci_cleanup()
1201 ar9003_mci_disable_interrupt(ah); in ar9003_mci_cleanup()
1205 u32 ar9003_mci_state(struct ath_hw *ah, u32 state_type) in ar9003_mci_state() argument
1207 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; in ar9003_mci_state()
1214 value = REG_READ(ah, AR_BTCOEX_CTRL); in ar9003_mci_state()
1222 value = MS(REG_READ(ah, AR_MCI_RX_STATUS), in ar9003_mci_state()
1228 value = MS(REG_READ(ah, AR_MCI_RX_STATUS), in ar9003_mci_state()
1234 ar9003_mci_send_coex_version_query(ah, true); in ar9003_mci_state()
1235 ar9003_mci_send_coex_wlan_channels(ah, true); in ar9003_mci_state()
1238 ar9003_mci_send_coex_halt_bt_gpm(ah, false, true); in ar9003_mci_state()
1240 ar9003_mci_2g5g_switch(ah, false); in ar9003_mci_state()
1243 ar9003_mci_reset_req_wakeup(ah); in ar9003_mci_state()
1248 if ((REG_READ(ah, AR_GLB_GPIO_CONTROL) & in ar9003_mci_state()
1251 ar9003_mci_observation_set_up(ah); in ar9003_mci_state()
1256 ar9003_mci_send_coex_version_response(ah, true); in ar9003_mci_state()
1259 ar9003_mci_send_coex_version_query(ah, true); in ar9003_mci_state()
1263 ar9003_mci_send_coex_bt_status_query(ah, true, query_type); in ar9003_mci_state()
1266 tsf = ath9k_hw_gettsf32(ah); in ar9003_mci_state()
1268 ath_dbg(ath9k_hw_common(ah), MCI, in ar9003_mci_state()
1272 ath_dbg(ath9k_hw_common(ah), MCI, "(MCI) RECOVER RX\n"); in ar9003_mci_state()
1274 ar9003_mci_prep_interface(ah); in ar9003_mci_state()
1277 ar9003_mci_send_coex_wlan_channels(ah, true); in ar9003_mci_state()
1278 ar9003_mci_2g5g_switch(ah, false); in ar9003_mci_state()
1295 void ar9003_mci_bt_gain_ctrl(struct ath_hw *ah) in ar9003_mci_bt_gain_ctrl() argument
1297 struct ath_common *common = ath9k_hw_common(ah); in ar9003_mci_bt_gain_ctrl()
1298 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; in ar9003_mci_bt_gain_ctrl()
1302 ar9003_mci_send_lna_take(ah, true); in ar9003_mci_bt_gain_ctrl()
1305 REG_SET_BIT(ah, AR_PHY_GLB_CONTROL, AR_BTCOEX_CTRL_BT_OWN_SPDT_CTRL); in ar9003_mci_bt_gain_ctrl()
1308 ar9003_mci_send_2g5g_status(ah, true); in ar9003_mci_bt_gain_ctrl()
1314 void ar9003_mci_set_power_awake(struct ath_hw *ah) in ar9003_mci_set_power_awake() argument
1321 btcoex_ctrl2 = REG_READ(ah, AR_BTCOEX_CTRL2); in ar9003_mci_set_power_awake()
1326 REG_WRITE(ah, AR_BTCOEX_CTRL2, (btcoex_ctrl2 | BIT(23))); in ar9003_mci_set_power_awake()
1329 diag_sw = REG_READ(ah, AR_DIAG_SW); in ar9003_mci_set_power_awake()
1334 REG_WRITE(ah, AR_DIAG_SW, (diag_sw | BIT(27) | BIT(19) | BIT(18))); in ar9003_mci_set_power_awake()
1335 lna_ctrl = REG_READ(ah, AR_OBS_BUS_CTRL) & 0x3; in ar9003_mci_set_power_awake()
1336 bt_sleep = MS(REG_READ(ah, AR_MCI_RX_STATUS), AR_MCI_RX_REMOTE_SLEEP); in ar9003_mci_set_power_awake()
1338 REG_WRITE(ah, AR_BTCOEX_CTRL2, btcoex_ctrl2); in ar9003_mci_set_power_awake()
1339 REG_WRITE(ah, AR_DIAG_SW, diag_sw); in ar9003_mci_set_power_awake()
1342 REG_SET_BIT(ah, AR_BTCOEX_RC, 0x1); in ar9003_mci_set_power_awake()
1343 REG_CLR_BIT(ah, AR_BTCOEX_RC, 0x1); in ar9003_mci_set_power_awake()
1348 void ar9003_mci_check_gpm_offset(struct ath_hw *ah) in ar9003_mci_check_gpm_offset() argument
1350 struct ath_common *common = ath9k_hw_common(ah); in ar9003_mci_check_gpm_offset()
1351 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; in ar9003_mci_check_gpm_offset()
1357 offset = MS(REG_READ(ah, AR_MCI_GPM_1), AR_MCI_GPM_WRITE_PTR); in ar9003_mci_check_gpm_offset()
1367 u32 ar9003_mci_get_next_gpm_offset(struct ath_hw *ah, bool first, u32 *more) in ar9003_mci_get_next_gpm_offset() argument
1369 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; in ar9003_mci_get_next_gpm_offset()
1373 gpm_ptr = MS(REG_READ(ah, AR_MCI_GPM_1), AR_MCI_GPM_WRITE_PTR); in ar9003_mci_get_next_gpm_offset()
1391 REG_WRITE(ah, AR_MCI_INTERRUPT_RX_MSG_RAW, in ar9003_mci_get_next_gpm_offset()
1394 gpm_ptr = MS(REG_READ(ah, AR_MCI_GPM_1), AR_MCI_GPM_WRITE_PTR); in ar9003_mci_get_next_gpm_offset()
1431 if (ar9003_mci_is_gpm_valid(ah, temp_index)) { in ar9003_mci_get_next_gpm_offset()
1452 void ar9003_mci_set_bt_version(struct ath_hw *ah, u8 major, u8 minor) in ar9003_mci_set_bt_version() argument
1454 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; in ar9003_mci_set_bt_version()
1459 ath_dbg(ath9k_hw_common(ah), MCI, "MCI BT version set: %d.%d\n", in ar9003_mci_set_bt_version()
1464 void ar9003_mci_send_wlan_channels(struct ath_hw *ah) in ar9003_mci_send_wlan_channels() argument
1466 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; in ar9003_mci_send_wlan_channels()
1469 ar9003_mci_send_coex_wlan_channels(ah, true); in ar9003_mci_send_wlan_channels()
1473 u16 ar9003_mci_get_max_txpower(struct ath_hw *ah, u8 ctlmode) in ar9003_mci_get_max_txpower() argument
1475 if (!ah->btcoex_hw.mci.concur_tx) in ar9003_mci_get_max_txpower()