Lines Matching refs:ah
24 static void ar9003_mci_reset_req_wakeup(struct ath_hw *ah) in ar9003_mci_reset_req_wakeup() argument
26 REG_RMW_FIELD(ah, AR_MCI_COMMAND2, in ar9003_mci_reset_req_wakeup()
29 REG_RMW_FIELD(ah, AR_MCI_COMMAND2, in ar9003_mci_reset_req_wakeup()
33 static int ar9003_mci_wait_for_interrupt(struct ath_hw *ah, u32 address, in ar9003_mci_wait_for_interrupt() argument
36 struct ath_common *common = ath9k_hw_common(ah); in ar9003_mci_wait_for_interrupt()
39 if (!(REG_READ(ah, address) & bit_position)) { in ar9003_mci_wait_for_interrupt()
48 REG_WRITE(ah, address, bit_position); in ar9003_mci_wait_for_interrupt()
54 ar9003_mci_reset_req_wakeup(ah); in ar9003_mci_wait_for_interrupt()
58 REG_WRITE(ah, AR_MCI_INTERRUPT_RAW, in ar9003_mci_wait_for_interrupt()
61 REG_WRITE(ah, AR_MCI_INTERRUPT_RAW, AR_MCI_INTERRUPT_RX_MSG); in ar9003_mci_wait_for_interrupt()
71 REG_READ(ah, AR_MCI_INTERRUPT_RAW), in ar9003_mci_wait_for_interrupt()
72 REG_READ(ah, AR_MCI_INTERRUPT_RX_MSG_RAW)); in ar9003_mci_wait_for_interrupt()
79 static void ar9003_mci_remote_reset(struct ath_hw *ah, bool wait_done) in ar9003_mci_remote_reset() argument
83 ar9003_mci_send_message(ah, MCI_REMOTE_RESET, 0, payload, 16, in ar9003_mci_remote_reset()
88 static void ar9003_mci_send_lna_transfer(struct ath_hw *ah, bool wait_done) in ar9003_mci_send_lna_transfer() argument
92 ar9003_mci_send_message(ah, MCI_LNA_TRANS, 0, &payload, 1, in ar9003_mci_send_lna_transfer()
96 static void ar9003_mci_send_req_wake(struct ath_hw *ah, bool wait_done) in ar9003_mci_send_req_wake() argument
98 ar9003_mci_send_message(ah, MCI_REQ_WAKE, MCI_FLAG_DISABLE_TIMESTAMP, in ar9003_mci_send_req_wake()
103 static void ar9003_mci_send_sys_waking(struct ath_hw *ah, bool wait_done) in ar9003_mci_send_sys_waking() argument
105 ar9003_mci_send_message(ah, MCI_SYS_WAKING, MCI_FLAG_DISABLE_TIMESTAMP, in ar9003_mci_send_sys_waking()
109 static void ar9003_mci_send_lna_take(struct ath_hw *ah, bool wait_done) in ar9003_mci_send_lna_take() argument
113 ar9003_mci_send_message(ah, MCI_LNA_TAKE, 0, &payload, 1, in ar9003_mci_send_lna_take()
117 static void ar9003_mci_send_sys_sleeping(struct ath_hw *ah, bool wait_done) in ar9003_mci_send_sys_sleeping() argument
119 ar9003_mci_send_message(ah, MCI_SYS_SLEEPING, in ar9003_mci_send_sys_sleeping()
124 static void ar9003_mci_send_coex_version_query(struct ath_hw *ah, in ar9003_mci_send_coex_version_query() argument
127 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; in ar9003_mci_send_coex_version_query()
136 ar9003_mci_send_message(ah, MCI_GPM, 0, payload, 16, wait_done, true); in ar9003_mci_send_coex_version_query()
139 static void ar9003_mci_send_coex_version_response(struct ath_hw *ah, in ar9003_mci_send_coex_version_response() argument
142 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; in ar9003_mci_send_coex_version_response()
151 ar9003_mci_send_message(ah, MCI_GPM, 0, payload, 16, wait_done, true); in ar9003_mci_send_coex_version_response()
154 static void ar9003_mci_send_coex_wlan_channels(struct ath_hw *ah, in ar9003_mci_send_coex_wlan_channels() argument
157 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; in ar9003_mci_send_coex_wlan_channels()
166 ar9003_mci_send_message(ah, MCI_GPM, 0, payload, 16, wait_done, true); in ar9003_mci_send_coex_wlan_channels()
170 static void ar9003_mci_send_coex_bt_status_query(struct ath_hw *ah, in ar9003_mci_send_coex_bt_status_query() argument
173 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; in ar9003_mci_send_coex_bt_status_query()
191 if (!ar9003_mci_send_message(ah, MCI_GPM, 0, payload, 16, in ar9003_mci_send_coex_bt_status_query()
201 static void ar9003_mci_send_coex_halt_bt_gpm(struct ath_hw *ah, bool halt, in ar9003_mci_send_coex_halt_bt_gpm() argument
204 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; in ar9003_mci_send_coex_halt_bt_gpm()
221 ar9003_mci_send_message(ah, MCI_GPM, 0, payload, 16, wait_done, true); in ar9003_mci_send_coex_halt_bt_gpm()
224 static void ar9003_mci_prep_interface(struct ath_hw *ah) in ar9003_mci_prep_interface() argument
226 struct ath_common *common = ath9k_hw_common(ah); in ar9003_mci_prep_interface()
227 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; in ar9003_mci_prep_interface()
232 saved_mci_int_en = REG_READ(ah, AR_MCI_INTERRUPT_EN); in ar9003_mci_prep_interface()
234 REG_WRITE(ah, AR_MCI_INTERRUPT_EN, 0); in ar9003_mci_prep_interface()
235 REG_WRITE(ah, AR_MCI_INTERRUPT_RX_MSG_RAW, in ar9003_mci_prep_interface()
236 REG_READ(ah, AR_MCI_INTERRUPT_RX_MSG_RAW)); in ar9003_mci_prep_interface()
237 REG_WRITE(ah, AR_MCI_INTERRUPT_RAW, in ar9003_mci_prep_interface()
238 REG_READ(ah, AR_MCI_INTERRUPT_RAW)); in ar9003_mci_prep_interface()
240 ar9003_mci_remote_reset(ah, true); in ar9003_mci_prep_interface()
241 ar9003_mci_send_req_wake(ah, true); in ar9003_mci_prep_interface()
243 if (!ar9003_mci_wait_for_interrupt(ah, AR_MCI_INTERRUPT_RX_MSG_RAW, in ar9003_mci_prep_interface()
265 ar9003_mci_send_sys_waking(ah, true); in ar9003_mci_prep_interface()
272 REG_WRITE(ah, AR_MCI_BT_PRI0, 0xFFFFFFFF); in ar9003_mci_prep_interface()
273 REG_WRITE(ah, AR_MCI_BT_PRI1, 0xFFFFFFFF); in ar9003_mci_prep_interface()
274 REG_WRITE(ah, AR_MCI_BT_PRI2, 0xFFFFFFFF); in ar9003_mci_prep_interface()
275 REG_WRITE(ah, AR_MCI_BT_PRI3, 0xFFFFFFFF); in ar9003_mci_prep_interface()
276 REG_WRITE(ah, AR_MCI_BT_PRI, 0X000000FF); in ar9003_mci_prep_interface()
284 REG_WRITE(ah, AR_MCI_INTERRUPT_RX_MSG_RAW, in ar9003_mci_prep_interface()
286 REG_WRITE(ah, AR_MCI_INTERRUPT_RAW, AR_MCI_INTERRUPT_BT_PRI); in ar9003_mci_prep_interface()
289 ar9003_mci_send_lna_transfer(ah, true); in ar9003_mci_prep_interface()
294 if (ar9003_mci_wait_for_interrupt(ah, in ar9003_mci_prep_interface()
308 (REG_READ_FIELD(ah, AR_MCI_INTERRUPT_RX_MSG_RAW, in ar9003_mci_prep_interface()
310 (REG_READ_FIELD(ah, AR_MCI_INTERRUPT_RX_MSG_RAW, in ar9003_mci_prep_interface()
312 REG_WRITE(ah, AR_MCI_INTERRUPT_RX_MSG_RAW, in ar9003_mci_prep_interface()
314 REG_WRITE(ah, AR_MCI_INTERRUPT_RAW, in ar9003_mci_prep_interface()
318 REG_WRITE(ah, AR_MCI_INTERRUPT_EN, saved_mci_int_en); in ar9003_mci_prep_interface()
321 void ar9003_mci_set_full_sleep(struct ath_hw *ah) in ar9003_mci_set_full_sleep() argument
323 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; in ar9003_mci_set_full_sleep()
325 if (ar9003_mci_state(ah, MCI_STATE_ENABLE) && in ar9003_mci_set_full_sleep()
328 ar9003_mci_send_coex_halt_bt_gpm(ah, true, true); in ar9003_mci_set_full_sleep()
334 static void ar9003_mci_disable_interrupt(struct ath_hw *ah) in ar9003_mci_disable_interrupt() argument
336 REG_WRITE(ah, AR_MCI_INTERRUPT_EN, 0); in ar9003_mci_disable_interrupt()
337 REG_WRITE(ah, AR_MCI_INTERRUPT_RX_MSG_EN, 0); in ar9003_mci_disable_interrupt()
340 static void ar9003_mci_enable_interrupt(struct ath_hw *ah) in ar9003_mci_enable_interrupt() argument
342 REG_WRITE(ah, AR_MCI_INTERRUPT_EN, AR_MCI_INTERRUPT_DEFAULT); in ar9003_mci_enable_interrupt()
343 REG_WRITE(ah, AR_MCI_INTERRUPT_RX_MSG_EN, in ar9003_mci_enable_interrupt()
347 static bool ar9003_mci_check_int(struct ath_hw *ah, u32 ints) in ar9003_mci_check_int() argument
351 intr = REG_READ(ah, AR_MCI_INTERRUPT_RX_MSG_RAW); in ar9003_mci_check_int()
355 void ar9003_mci_get_interrupt(struct ath_hw *ah, u32 *raw_intr, in ar9003_mci_get_interrupt() argument
358 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; in ar9003_mci_get_interrupt()
369 void ar9003_mci_get_isr(struct ath_hw *ah, enum ath9k_int *masked) in ar9003_mci_get_isr() argument
371 struct ath_common *common = ath9k_hw_common(ah); in ar9003_mci_get_isr()
372 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; in ar9003_mci_get_isr()
375 rx_msg_intr = REG_READ(ah, AR_MCI_INTERRUPT_RX_MSG_RAW); in ar9003_mci_get_isr()
376 raw_intr = REG_READ(ah, AR_MCI_INTERRUPT_RAW); in ar9003_mci_get_isr()
387 mci->cont_status = REG_READ(ah, AR_MCI_CONT_STATUS); in ar9003_mci_get_isr()
389 REG_WRITE(ah, AR_MCI_INTERRUPT_RX_MSG_RAW, rx_msg_intr); in ar9003_mci_get_isr()
390 REG_WRITE(ah, AR_MCI_INTERRUPT_RAW, raw_intr); in ar9003_mci_get_isr()
394 static void ar9003_mci_2g5g_changed(struct ath_hw *ah, bool is_2g) in ar9003_mci_2g5g_changed() argument
396 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; in ar9003_mci_2g5g_changed()
405 static bool ar9003_mci_is_gpm_valid(struct ath_hw *ah, u32 msg_index) in ar9003_mci_is_gpm_valid() argument
407 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; in ar9003_mci_is_gpm_valid()
425 static void ar9003_mci_observation_set_up(struct ath_hw *ah) in ar9003_mci_observation_set_up() argument
427 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; in ar9003_mci_observation_set_up()
430 ath9k_hw_cfg_output(ah, 3, AR_GPIO_OUTPUT_MUX_AS_MCI_WLAN_DATA); in ar9003_mci_observation_set_up()
431 ath9k_hw_cfg_output(ah, 2, AR_GPIO_OUTPUT_MUX_AS_MCI_WLAN_CLK); in ar9003_mci_observation_set_up()
432 ath9k_hw_cfg_output(ah, 1, AR_GPIO_OUTPUT_MUX_AS_MCI_BT_DATA); in ar9003_mci_observation_set_up()
433 ath9k_hw_cfg_output(ah, 0, AR_GPIO_OUTPUT_MUX_AS_MCI_BT_CLK); in ar9003_mci_observation_set_up()
435 ath9k_hw_cfg_output(ah, 3, AR_GPIO_OUTPUT_MUX_AS_WL_IN_TX); in ar9003_mci_observation_set_up()
436 ath9k_hw_cfg_output(ah, 2, AR_GPIO_OUTPUT_MUX_AS_WL_IN_RX); in ar9003_mci_observation_set_up()
437 ath9k_hw_cfg_output(ah, 1, AR_GPIO_OUTPUT_MUX_AS_BT_IN_TX); in ar9003_mci_observation_set_up()
438 ath9k_hw_cfg_output(ah, 0, AR_GPIO_OUTPUT_MUX_AS_BT_IN_RX); in ar9003_mci_observation_set_up()
439 ath9k_hw_cfg_output(ah, 5, AR_GPIO_OUTPUT_MUX_AS_OUTPUT); in ar9003_mci_observation_set_up()
441 ath9k_hw_cfg_output(ah, 3, AR_GPIO_OUTPUT_MUX_AS_BT_IN_TX); in ar9003_mci_observation_set_up()
442 ath9k_hw_cfg_output(ah, 2, AR_GPIO_OUTPUT_MUX_AS_BT_IN_RX); in ar9003_mci_observation_set_up()
443 ath9k_hw_cfg_output(ah, 1, AR_GPIO_OUTPUT_MUX_AS_MCI_BT_DATA); in ar9003_mci_observation_set_up()
444 ath9k_hw_cfg_output(ah, 0, AR_GPIO_OUTPUT_MUX_AS_MCI_BT_CLK); in ar9003_mci_observation_set_up()
448 REG_SET_BIT(ah, AR_GPIO_INPUT_EN_VAL, AR_GPIO_JTAG_DISABLE); in ar9003_mci_observation_set_up()
450 REG_RMW_FIELD(ah, AR_PHY_GLB_CONTROL, AR_GLB_DS_JTAG_DISABLE, 1); in ar9003_mci_observation_set_up()
451 REG_RMW_FIELD(ah, AR_PHY_GLB_CONTROL, AR_GLB_WLAN_UART_INTF_EN, 0); in ar9003_mci_observation_set_up()
452 REG_SET_BIT(ah, AR_GLB_GPIO_CONTROL, ATH_MCI_CONFIG_MCI_OBS_GPIO); in ar9003_mci_observation_set_up()
454 REG_RMW_FIELD(ah, AR_BTCOEX_CTRL2, AR_BTCOEX_CTRL2_GPIO_OBS_SEL, 0); in ar9003_mci_observation_set_up()
455 REG_RMW_FIELD(ah, AR_BTCOEX_CTRL2, AR_BTCOEX_CTRL2_MAC_BB_OBS_SEL, 1); in ar9003_mci_observation_set_up()
456 REG_WRITE(ah, AR_OBS, 0x4b); in ar9003_mci_observation_set_up()
457 REG_RMW_FIELD(ah, AR_DIAG_SW, AR_DIAG_OBS_PT_SEL1, 0x03); in ar9003_mci_observation_set_up()
458 REG_RMW_FIELD(ah, AR_DIAG_SW, AR_DIAG_OBS_PT_SEL2, 0x01); in ar9003_mci_observation_set_up()
459 REG_RMW_FIELD(ah, AR_MACMISC, AR_MACMISC_MISC_OBS_BUS_LSB, 0x02); in ar9003_mci_observation_set_up()
460 REG_RMW_FIELD(ah, AR_MACMISC, AR_MACMISC_MISC_OBS_BUS_MSB, 0x03); in ar9003_mci_observation_set_up()
461 REG_RMW_FIELD(ah, AR_PHY_TEST_CTL_STATUS, in ar9003_mci_observation_set_up()
465 static bool ar9003_mci_send_coex_bt_flags(struct ath_hw *ah, bool wait_done, in ar9003_mci_send_coex_bt_flags() argument
479 return ar9003_mci_send_message(ah, MCI_GPM, 0, pld, 16, in ar9003_mci_send_coex_bt_flags()
483 static void ar9003_mci_sync_bt_state(struct ath_hw *ah) in ar9003_mci_sync_bt_state() argument
485 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; in ar9003_mci_sync_bt_state()
488 cur_bt_state = ar9003_mci_state(ah, MCI_STATE_REMOTE_SLEEP); in ar9003_mci_sync_bt_state()
495 ar9003_mci_send_coex_version_query(ah, true); in ar9003_mci_sync_bt_state()
496 ar9003_mci_send_coex_wlan_channels(ah, true); in ar9003_mci_sync_bt_state()
499 ar9003_mci_send_coex_halt_bt_gpm(ah, false, true); in ar9003_mci_sync_bt_state()
503 void ar9003_mci_check_bt(struct ath_hw *ah) in ar9003_mci_check_bt() argument
505 struct ath9k_hw_mci *mci_hw = &ah->btcoex_hw.mci; in ar9003_mci_check_bt()
514 ar9003_mci_sync_bt_state(ah); in ar9003_mci_check_bt()
515 ar9003_mci_2g5g_switch(ah, true); in ar9003_mci_check_bt()
523 static void ar9003_mci_process_gpm_extra(struct ath_hw *ah, u8 gpm_type, in ar9003_mci_process_gpm_extra() argument
526 struct ath_common *common = ath9k_hw_common(ah); in ar9003_mci_process_gpm_extra()
527 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; in ar9003_mci_process_gpm_extra()
536 ar9003_mci_send_coex_version_response(ah, true); in ar9003_mci_process_gpm_extra()
553 ar9003_mci_send_coex_wlan_channels(ah, true); in ar9003_mci_process_gpm_extra()
570 static u32 ar9003_mci_wait_for_gpm(struct ath_hw *ah, u8 gpm_type, in ar9003_mci_wait_for_gpm() argument
573 struct ath_common *common = ath9k_hw_common(ah); in ar9003_mci_wait_for_gpm()
574 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; in ar9003_mci_wait_for_gpm()
589 time_out = ar9003_mci_wait_for_interrupt(ah, in ar9003_mci_wait_for_gpm()
597 offset = ar9003_mci_get_next_gpm_offset(ah, &more_data); in ar9003_mci_wait_for_gpm()
640 ar9003_mci_send_message(ah, MCI_GPM, 0, payload, 16, in ar9003_mci_wait_for_gpm()
647 ar9003_mci_process_gpm_extra(ah, recv_type, in ar9003_mci_wait_for_gpm()
661 offset = ar9003_mci_get_next_gpm_offset(ah, &more_data); in ar9003_mci_wait_for_gpm()
670 ar9003_mci_process_gpm_extra(ah, recv_type, in ar9003_mci_wait_for_gpm()
679 bool ar9003_mci_start_reset(struct ath_hw *ah, struct ath9k_channel *chan) in ar9003_mci_start_reset() argument
681 struct ath_common *common = ath9k_hw_common(ah); in ar9003_mci_start_reset()
682 struct ath9k_hw_mci *mci_hw = &ah->btcoex_hw.mci; in ar9003_mci_start_reset()
685 ar9003_mci_2g5g_changed(ah, IS_CHAN_2GHZ(chan)); in ar9003_mci_start_reset()
697 ar9003_mci_disable_interrupt(ah); in ar9003_mci_start_reset()
700 ar9003_mci_send_message(ah, MCI_GPM, 0, payload, in ar9003_mci_start_reset()
705 if (ar9003_mci_wait_for_gpm(ah, MCI_GPM_BT_CAL_DONE, in ar9003_mci_start_reset()
714 ar9003_mci_enable_interrupt(ah); in ar9003_mci_start_reset()
719 int ar9003_mci_end_reset(struct ath_hw *ah, struct ath9k_channel *chan, in ar9003_mci_end_reset() argument
722 struct ath9k_hw_mci *mci_hw = &ah->btcoex_hw.mci; in ar9003_mci_end_reset()
730 if (!ar9003_mci_check_int(ah, AR_MCI_INTERRUPT_RX_MSG_REMOTE_RESET) && in ar9003_mci_end_reset()
731 !ar9003_mci_check_int(ah, AR_MCI_INTERRUPT_RX_MSG_REQ_WAKE)) in ar9003_mci_end_reset()
740 REG_WRITE(ah, AR_MCI_INTERRUPT_RX_MSG_RAW, in ar9003_mci_end_reset()
744 ar9003_mci_remote_reset(ah, true); in ar9003_mci_end_reset()
745 ar9003_mci_send_sys_waking(ah, true); in ar9003_mci_end_reset()
749 ar9003_mci_send_lna_transfer(ah, true); in ar9003_mci_end_reset()
753 REG_CLR_BIT(ah, AR_PHY_TIMING4, in ar9003_mci_end_reset()
762 if (!ath9k_hw_init_cal(ah, chan)) in ar9003_mci_end_reset()
765 REG_SET_BIT(ah, AR_PHY_TIMING4, in ar9003_mci_end_reset()
769 ar9003_mci_enable_interrupt(ah); in ar9003_mci_end_reset()
773 static void ar9003_mci_mute_bt(struct ath_hw *ah) in ar9003_mci_mute_bt() argument
775 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; in ar9003_mci_mute_bt()
778 REG_WRITE(ah, AR_MCI_MSG_ATTRIBUTES_TABLE, 0xffff0000); in ar9003_mci_mute_bt()
779 REG_WRITE(ah, AR_BTCOEX_WL_WEIGHTS0, 0xffffffff); in ar9003_mci_mute_bt()
780 REG_WRITE(ah, AR_BTCOEX_WL_WEIGHTS1, 0xffffffff); in ar9003_mci_mute_bt()
781 REG_WRITE(ah, AR_BTCOEX_WL_WEIGHTS2, 0xffffffff); in ar9003_mci_mute_bt()
782 REG_WRITE(ah, AR_BTCOEX_WL_WEIGHTS3, 0xffffffff); in ar9003_mci_mute_bt()
783 REG_SET_BIT(ah, AR_MCI_TX_CTRL, AR_MCI_TX_CTRL_DISABLE_LNA_UPDATE); in ar9003_mci_mute_bt()
794 ar9003_mci_send_lna_take(ah, true); in ar9003_mci_mute_bt()
798 ar9003_mci_send_sys_sleeping(ah, true); in ar9003_mci_mute_bt()
801 static void ar9003_mci_osla_setup(struct ath_hw *ah, bool enable) in ar9003_mci_osla_setup() argument
803 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; in ar9003_mci_osla_setup()
807 REG_CLR_BIT(ah, AR_BTCOEX_CTRL, in ar9003_mci_osla_setup()
811 REG_RMW_FIELD(ah, AR_MCI_SCHD_TABLE_2, AR_MCI_SCHD_TABLE_2_HW_BASED, 1); in ar9003_mci_osla_setup()
812 REG_RMW_FIELD(ah, AR_MCI_SCHD_TABLE_2, in ar9003_mci_osla_setup()
815 if (AR_SREV_9565(ah)) in ar9003_mci_osla_setup()
816 REG_RMW_FIELD(ah, AR_MCI_MISC, AR_MCI_MISC_HW_FIX_EN, 1); in ar9003_mci_osla_setup()
820 REG_RMW_FIELD(ah, AR_BTCOEX_CTRL, in ar9003_mci_osla_setup()
822 REG_RMW_FIELD(ah, AR_BTCOEX_CTRL, in ar9003_mci_osla_setup()
825 REG_RMW_FIELD(ah, AR_BTCOEX_CTRL, in ar9003_mci_osla_setup()
828 REG_RMW_FIELD(ah, AR_BTCOEX_CTRL, in ar9003_mci_osla_setup()
832 static void ar9003_mci_stat_setup(struct ath_hw *ah) in ar9003_mci_stat_setup() argument
834 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; in ar9003_mci_stat_setup()
836 if (!AR_SREV_9565(ah)) in ar9003_mci_stat_setup()
840 REG_RMW_FIELD(ah, AR_MCI_DBG_CNT_CTRL, in ar9003_mci_stat_setup()
842 REG_RMW_FIELD(ah, AR_MCI_DBG_CNT_CTRL, in ar9003_mci_stat_setup()
846 REG_RMW_FIELD(ah, AR_MCI_DBG_CNT_CTRL, in ar9003_mci_stat_setup()
851 static void ar9003_mci_set_btcoex_ctrl_9565_1ANT(struct ath_hw *ah) in ar9003_mci_set_btcoex_ctrl_9565_1ANT() argument
865 REG_RMW_FIELD(ah, AR_BTCOEX_CTRL2, in ar9003_mci_set_btcoex_ctrl_9565_1ANT()
867 REG_WRITE(ah, AR_BTCOEX_CTRL, regval); in ar9003_mci_set_btcoex_ctrl_9565_1ANT()
870 static void ar9003_mci_set_btcoex_ctrl_9565_2ANT(struct ath_hw *ah) in ar9003_mci_set_btcoex_ctrl_9565_2ANT() argument
884 REG_RMW_FIELD(ah, AR_BTCOEX_CTRL2, in ar9003_mci_set_btcoex_ctrl_9565_2ANT()
886 REG_WRITE(ah, AR_BTCOEX_CTRL, regval); in ar9003_mci_set_btcoex_ctrl_9565_2ANT()
889 static void ar9003_mci_set_btcoex_ctrl_9462(struct ath_hw *ah) in ar9003_mci_set_btcoex_ctrl_9462() argument
903 REG_WRITE(ah, AR_BTCOEX_CTRL, regval); in ar9003_mci_set_btcoex_ctrl_9462()
906 int ar9003_mci_reset(struct ath_hw *ah, bool en_int, bool is_2g, in ar9003_mci_reset() argument
909 struct ath_common *common = ath9k_hw_common(ah); in ar9003_mci_reset()
910 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; in ar9003_mci_reset()
916 if (REG_READ(ah, AR_BTCOEX_CTRL) == 0xdeadbeef) { in ar9003_mci_reset()
922 REG_WRITE(ah, AR_MCI_GPM_0, mci->gpm_addr); in ar9003_mci_reset()
923 REG_WRITE(ah, AR_MCI_GPM_1, mci->gpm_len); in ar9003_mci_reset()
924 REG_WRITE(ah, AR_MCI_SCHD_TABLE_0, mci->sched_addr); in ar9003_mci_reset()
930 if (AR_SREV_9565(ah)) { in ar9003_mci_reset()
934 ar9003_mci_set_btcoex_ctrl_9565_1ANT(ah); in ar9003_mci_reset()
936 ar9003_mci_set_btcoex_ctrl_9565_2ANT(ah); in ar9003_mci_reset()
938 ar9003_mci_set_btcoex_ctrl_9462(ah); in ar9003_mci_reset()
942 ar9003_mci_osla_setup(ah, true); in ar9003_mci_reset()
944 ar9003_mci_osla_setup(ah, false); in ar9003_mci_reset()
946 REG_SET_BIT(ah, AR_PHY_GLB_CONTROL, in ar9003_mci_reset()
948 REG_RMW_FIELD(ah, AR_BTCOEX_CTRL3, in ar9003_mci_reset()
951 REG_RMW_FIELD(ah, AR_BTCOEX_CTRL2, AR_BTCOEX_CTRL2_RX_DEWEIGHT, 0); in ar9003_mci_reset()
952 REG_RMW_FIELD(ah, AR_PCU_MISC, AR_PCU_BT_ANT_PREVENT_RX, 0); in ar9003_mci_reset()
955 REG_RMW_FIELD(ah, AR_BTCOEX_WL_LNA, AR_BTCOEX_WL_LNA_TIMEOUT, 0x3D090); in ar9003_mci_reset()
959 REG_RMW_FIELD(ah, AR_BTCOEX_CTRL2, in ar9003_mci_reset()
961 REG_RMW_FIELD(ah, AR_BTCOEX_CTRL2, in ar9003_mci_reset()
963 REG_RMW_FIELD(ah, AR_BTCOEX_CTRL, in ar9003_mci_reset()
966 REG_WRITE(ah, AR_BTCOEX_MAX_TXPWR(i), 0x7f7f7f7f); in ar9003_mci_reset()
970 REG_RMW_FIELD(ah, AR_MCI_TX_CTRL, AR_MCI_TX_CTRL_CLK_DIV, regval); in ar9003_mci_reset()
971 REG_SET_BIT(ah, AR_BTCOEX_CTRL, AR_BTCOEX_CTRL_MCI_MODE_EN); in ar9003_mci_reset()
974 regval = REG_READ(ah, AR_MCI_COMMAND2); in ar9003_mci_reset()
976 REG_WRITE(ah, AR_MCI_COMMAND2, regval); in ar9003_mci_reset()
981 REG_WRITE(ah, AR_MCI_COMMAND2, regval); in ar9003_mci_reset()
984 ar9003_mci_mute_bt(ah); in ar9003_mci_reset()
989 ar9003_mci_check_gpm_offset(ah); in ar9003_mci_reset()
992 REG_WRITE(ah, AR_MCI_COMMAND2, regval); in ar9003_mci_reset()
995 REG_WRITE(ah, AR_MCI_COMMAND2, regval); in ar9003_mci_reset()
998 ar9003_mci_state(ah, MCI_STATE_INIT_GPM_OFFSET); in ar9003_mci_reset()
1000 REG_WRITE(ah, AR_MCI_MSG_ATTRIBUTES_TABLE, in ar9003_mci_reset()
1005 REG_CLR_BIT(ah, AR_MCI_TX_CTRL, in ar9003_mci_reset()
1008 REG_SET_BIT(ah, AR_MCI_TX_CTRL, in ar9003_mci_reset()
1011 ar9003_mci_observation_set_up(ah); in ar9003_mci_reset()
1014 ar9003_mci_prep_interface(ah); in ar9003_mci_reset()
1015 ar9003_mci_stat_setup(ah); in ar9003_mci_reset()
1018 ar9003_mci_enable_interrupt(ah); in ar9003_mci_reset()
1020 if (ath9k_hw_is_aic_enabled(ah)) in ar9003_mci_reset()
1021 ar9003_aic_start_normal(ah); in ar9003_mci_reset()
1026 void ar9003_mci_stop_bt(struct ath_hw *ah, bool save_fullsleep) in ar9003_mci_stop_bt() argument
1028 struct ath9k_hw_mci *mci_hw = &ah->btcoex_hw.mci; in ar9003_mci_stop_bt()
1030 ar9003_mci_disable_interrupt(ah); in ar9003_mci_stop_bt()
1033 ar9003_mci_mute_bt(ah); in ar9003_mci_stop_bt()
1035 REG_WRITE(ah, AR_BTCOEX_CTRL, 0); in ar9003_mci_stop_bt()
1042 static void ar9003_mci_send_2g5g_status(struct ath_hw *ah, bool wait_done) in ar9003_mci_send_2g5g_status() argument
1044 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; in ar9003_mci_send_2g5g_status()
1061 ar9003_mci_send_coex_bt_flags(ah, wait_done, in ar9003_mci_send_2g5g_status()
1065 ar9003_mci_send_coex_bt_flags(ah, wait_done, in ar9003_mci_send_2g5g_status()
1070 static void ar9003_mci_queue_unsent_gpm(struct ath_hw *ah, u8 header, in ar9003_mci_queue_unsent_gpm() argument
1073 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; in ar9003_mci_queue_unsent_gpm()
1119 void ar9003_mci_2g5g_switch(struct ath_hw *ah, bool force) in ar9003_mci_2g5g_switch() argument
1121 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; in ar9003_mci_2g5g_switch()
1127 ar9003_mci_send_2g5g_status(ah, true); in ar9003_mci_2g5g_switch()
1128 ar9003_mci_send_lna_transfer(ah, true); in ar9003_mci_2g5g_switch()
1131 REG_CLR_BIT(ah, AR_MCI_TX_CTRL, in ar9003_mci_2g5g_switch()
1133 REG_CLR_BIT(ah, AR_PHY_GLB_CONTROL, in ar9003_mci_2g5g_switch()
1137 ar9003_mci_osla_setup(ah, true); in ar9003_mci_2g5g_switch()
1139 if (AR_SREV_9462(ah)) in ar9003_mci_2g5g_switch()
1140 REG_WRITE(ah, AR_SELFGEN_MASK, 0x02); in ar9003_mci_2g5g_switch()
1142 ar9003_mci_send_lna_take(ah, true); in ar9003_mci_2g5g_switch()
1145 REG_SET_BIT(ah, AR_MCI_TX_CTRL, in ar9003_mci_2g5g_switch()
1147 REG_SET_BIT(ah, AR_PHY_GLB_CONTROL, in ar9003_mci_2g5g_switch()
1150 ar9003_mci_osla_setup(ah, false); in ar9003_mci_2g5g_switch()
1151 ar9003_mci_send_2g5g_status(ah, true); in ar9003_mci_2g5g_switch()
1155 bool ar9003_mci_send_message(struct ath_hw *ah, u8 header, u32 flag, in ar9003_mci_send_message() argument
1159 struct ath_common *common = ath9k_hw_common(ah); in ar9003_mci_send_message()
1160 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; in ar9003_mci_send_message()
1166 saved_mci_int_en = REG_READ(ah, AR_MCI_INTERRUPT_EN); in ar9003_mci_send_message()
1167 regval = REG_READ(ah, AR_BTCOEX_CTRL); in ar9003_mci_send_message()
1172 header, (ah->power_mode == ATH9K_PM_FULL_SLEEP) ? 1 : 0); in ar9003_mci_send_message()
1173 ar9003_mci_queue_unsent_gpm(ah, header, payload, true); in ar9003_mci_send_message()
1179 ar9003_mci_queue_unsent_gpm(ah, header, payload, true); in ar9003_mci_send_message()
1184 REG_WRITE(ah, AR_MCI_INTERRUPT_EN, 0); in ar9003_mci_send_message()
1188 REG_WRITE(ah, AR_MCI_INTERRUPT_RAW, in ar9003_mci_send_message()
1194 REG_WRITE(ah, (AR_MCI_TX_PAYLOAD0 + i * 4), in ar9003_mci_send_message()
1198 REG_WRITE(ah, AR_MCI_COMMAND0, in ar9003_mci_send_message()
1205 !(ar9003_mci_wait_for_interrupt(ah, AR_MCI_INTERRUPT_RAW, in ar9003_mci_send_message()
1207 ar9003_mci_queue_unsent_gpm(ah, header, payload, true); in ar9003_mci_send_message()
1209 ar9003_mci_queue_unsent_gpm(ah, header, payload, false); in ar9003_mci_send_message()
1214 REG_WRITE(ah, AR_MCI_INTERRUPT_EN, saved_mci_int_en); in ar9003_mci_send_message()
1220 void ar9003_mci_init_cal_req(struct ath_hw *ah, bool *is_reusable) in ar9003_mci_init_cal_req() argument
1222 struct ath_common *common = ath9k_hw_common(ah); in ar9003_mci_init_cal_req()
1223 struct ath9k_hw_mci *mci_hw = &ah->btcoex_hw.mci; in ar9003_mci_init_cal_req()
1233 ar9003_mci_send_message(ah, MCI_GPM, 0, pld, 16, true, false); in ar9003_mci_init_cal_req()
1235 if (ar9003_mci_wait_for_gpm(ah, MCI_GPM_BT_CAL_GRANT, 0, 50000)) { in ar9003_mci_init_cal_req()
1243 void ar9003_mci_init_cal_done(struct ath_hw *ah) in ar9003_mci_init_cal_done() argument
1245 struct ath9k_hw_mci *mci_hw = &ah->btcoex_hw.mci; in ar9003_mci_init_cal_done()
1254 ar9003_mci_send_message(ah, MCI_GPM, 0, pld, 16, true, false); in ar9003_mci_init_cal_done()
1257 int ar9003_mci_setup(struct ath_hw *ah, u32 gpm_addr, void *gpm_buf, in ar9003_mci_setup() argument
1260 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; in ar9003_mci_setup()
1267 return ar9003_mci_reset(ah, true, true, true); in ar9003_mci_setup()
1271 void ar9003_mci_cleanup(struct ath_hw *ah) in ar9003_mci_cleanup() argument
1274 REG_WRITE(ah, AR_BTCOEX_CTRL, 0x00); in ar9003_mci_cleanup()
1275 ar9003_mci_disable_interrupt(ah); in ar9003_mci_cleanup()
1279 u32 ar9003_mci_state(struct ath_hw *ah, u32 state_type) in ar9003_mci_state() argument
1281 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; in ar9003_mci_state()
1288 value = REG_READ(ah, AR_BTCOEX_CTRL); in ar9003_mci_state()
1296 value = MS(REG_READ(ah, AR_MCI_GPM_1), AR_MCI_GPM_WRITE_PTR); in ar9003_mci_state()
1304 value = MS(REG_READ(ah, AR_MCI_RX_STATUS), in ar9003_mci_state()
1310 value = MS(REG_READ(ah, AR_MCI_RX_STATUS), in ar9003_mci_state()
1316 ar9003_mci_send_coex_version_query(ah, true); in ar9003_mci_state()
1317 ar9003_mci_send_coex_wlan_channels(ah, true); in ar9003_mci_state()
1320 ar9003_mci_send_coex_halt_bt_gpm(ah, false, true); in ar9003_mci_state()
1322 ar9003_mci_2g5g_switch(ah, false); in ar9003_mci_state()
1325 ar9003_mci_reset_req_wakeup(ah); in ar9003_mci_state()
1330 if ((REG_READ(ah, AR_GLB_GPIO_CONTROL) & in ar9003_mci_state()
1333 ar9003_mci_observation_set_up(ah); in ar9003_mci_state()
1338 ar9003_mci_send_coex_version_response(ah, true); in ar9003_mci_state()
1341 ar9003_mci_send_coex_version_query(ah, true); in ar9003_mci_state()
1345 ar9003_mci_send_coex_bt_status_query(ah, true, query_type); in ar9003_mci_state()
1348 tsf = ath9k_hw_gettsf32(ah); in ar9003_mci_state()
1350 ath_dbg(ath9k_hw_common(ah), MCI, in ar9003_mci_state()
1354 ath_dbg(ath9k_hw_common(ah), MCI, "(MCI) RECOVER RX\n"); in ar9003_mci_state()
1356 ar9003_mci_prep_interface(ah); in ar9003_mci_state()
1359 ar9003_mci_send_coex_wlan_channels(ah, true); in ar9003_mci_state()
1360 ar9003_mci_2g5g_switch(ah, false); in ar9003_mci_state()
1370 if (ath9k_hw_is_aic_enabled(ah)) in ar9003_mci_state()
1371 value = ar9003_aic_calibration(ah); in ar9003_mci_state()
1374 if (ath9k_hw_is_aic_enabled(ah)) in ar9003_mci_state()
1375 ar9003_aic_start_normal(ah); in ar9003_mci_state()
1378 if (ath9k_hw_is_aic_enabled(ah)) in ar9003_mci_state()
1379 value = ar9003_aic_cal_reset(ah); in ar9003_mci_state()
1382 if (ath9k_hw_is_aic_enabled(ah)) in ar9003_mci_state()
1383 value = ar9003_aic_calibration_single(ah); in ar9003_mci_state()
1393 void ar9003_mci_bt_gain_ctrl(struct ath_hw *ah) in ar9003_mci_bt_gain_ctrl() argument
1395 struct ath_common *common = ath9k_hw_common(ah); in ar9003_mci_bt_gain_ctrl()
1396 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; in ar9003_mci_bt_gain_ctrl()
1400 ar9003_mci_send_lna_take(ah, true); in ar9003_mci_bt_gain_ctrl()
1403 REG_SET_BIT(ah, AR_PHY_GLB_CONTROL, AR_BTCOEX_CTRL_BT_OWN_SPDT_CTRL); in ar9003_mci_bt_gain_ctrl()
1406 ar9003_mci_send_2g5g_status(ah, true); in ar9003_mci_bt_gain_ctrl()
1412 void ar9003_mci_set_power_awake(struct ath_hw *ah) in ar9003_mci_set_power_awake() argument
1419 btcoex_ctrl2 = REG_READ(ah, AR_BTCOEX_CTRL2); in ar9003_mci_set_power_awake()
1424 REG_WRITE(ah, AR_BTCOEX_CTRL2, (btcoex_ctrl2 | BIT(23))); in ar9003_mci_set_power_awake()
1427 diag_sw = REG_READ(ah, AR_DIAG_SW); in ar9003_mci_set_power_awake()
1432 REG_WRITE(ah, AR_DIAG_SW, (diag_sw | BIT(27) | BIT(19) | BIT(18))); in ar9003_mci_set_power_awake()
1433 lna_ctrl = REG_READ(ah, AR_OBS_BUS_CTRL) & 0x3; in ar9003_mci_set_power_awake()
1434 bt_sleep = MS(REG_READ(ah, AR_MCI_RX_STATUS), AR_MCI_RX_REMOTE_SLEEP); in ar9003_mci_set_power_awake()
1436 REG_WRITE(ah, AR_BTCOEX_CTRL2, btcoex_ctrl2); in ar9003_mci_set_power_awake()
1437 REG_WRITE(ah, AR_DIAG_SW, diag_sw); in ar9003_mci_set_power_awake()
1440 REG_SET_BIT(ah, AR_BTCOEX_RC, 0x1); in ar9003_mci_set_power_awake()
1441 REG_CLR_BIT(ah, AR_BTCOEX_RC, 0x1); in ar9003_mci_set_power_awake()
1446 void ar9003_mci_check_gpm_offset(struct ath_hw *ah) in ar9003_mci_check_gpm_offset() argument
1448 struct ath_common *common = ath9k_hw_common(ah); in ar9003_mci_check_gpm_offset()
1449 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; in ar9003_mci_check_gpm_offset()
1455 offset = MS(REG_READ(ah, AR_MCI_GPM_1), AR_MCI_GPM_WRITE_PTR); in ar9003_mci_check_gpm_offset()
1465 u32 ar9003_mci_get_next_gpm_offset(struct ath_hw *ah, u32 *more) in ar9003_mci_get_next_gpm_offset() argument
1467 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; in ar9003_mci_get_next_gpm_offset()
1479 REG_WRITE(ah, AR_MCI_INTERRUPT_RX_MSG_RAW, in ar9003_mci_get_next_gpm_offset()
1482 gpm_ptr = MS(REG_READ(ah, AR_MCI_GPM_1), AR_MCI_GPM_WRITE_PTR); in ar9003_mci_get_next_gpm_offset()
1519 if (ar9003_mci_is_gpm_valid(ah, temp_index)) { in ar9003_mci_get_next_gpm_offset()
1540 void ar9003_mci_set_bt_version(struct ath_hw *ah, u8 major, u8 minor) in ar9003_mci_set_bt_version() argument
1542 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; in ar9003_mci_set_bt_version()
1547 ath_dbg(ath9k_hw_common(ah), MCI, "MCI BT version set: %d.%d\n", in ar9003_mci_set_bt_version()
1552 void ar9003_mci_send_wlan_channels(struct ath_hw *ah) in ar9003_mci_send_wlan_channels() argument
1554 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; in ar9003_mci_send_wlan_channels()
1557 ar9003_mci_send_coex_wlan_channels(ah, true); in ar9003_mci_send_wlan_channels()
1561 u16 ar9003_mci_get_max_txpower(struct ath_hw *ah, u8 ctlmode) in ar9003_mci_get_max_txpower() argument
1563 if (!ah->btcoex_hw.mci.concur_tx) in ar9003_mci_get_max_txpower()