drivers: bluetooth: hci: silabs: fix radio IRQ priorities
Fix radio IRQ priorities. With the Controller update from SiSDK, its behavior changed so that it overwrites the IRQ priorities. Reconfigure the priorities after the Controller is initialized. Source interrupt numbers and priorities from devicetree. Also set the SYNTH IRQ priority on all HW, and set either the RDMAILBOX or HOSTMAILBOX IRQ depending on which one exists. Signed-off-by: Jori Rintahaka <jori.rintahaka@silabs.com> Signed-off-by: Aksel Skauge Mellbye <aksel.mellbye@silabs.com>
This commit is contained in:
parent
0810fe3edb
commit
0d5ed7c306
1 changed files with 29 additions and 13 deletions
|
@ -55,20 +55,34 @@ void BTLE_LL_Process(uint32_t events);
|
|||
int16_t BTLE_LL_SetMaxPower(int16_t power);
|
||||
bool sli_pending_btctrl_events(void);
|
||||
|
||||
#define RADIO_IRQN(name) DT_IRQ_BY_NAME(DT_NODELABEL(radio), name, irq)
|
||||
#define RADIO_IRQ_PRIO(name) DT_IRQ_BY_NAME(DT_NODELABEL(radio), name, priority)
|
||||
|
||||
void rail_isr_installer(void)
|
||||
{
|
||||
#ifdef CONFIG_SOC_SERIES_EFR32MG24
|
||||
IRQ_CONNECT(SYNTH_IRQn, 0, SYNTH_IRQHandler, NULL, 0);
|
||||
#else
|
||||
IRQ_CONNECT(RDMAILBOX_IRQn, 0, RDMAILBOX_IRQHandler, NULL, 0);
|
||||
#endif
|
||||
IRQ_CONNECT(RAC_SEQ_IRQn, 0, RAC_SEQ_IRQHandler, NULL, 0);
|
||||
IRQ_CONNECT(RAC_RSM_IRQn, 0, RAC_RSM_IRQHandler, NULL, 0);
|
||||
IRQ_CONNECT(PROTIMER_IRQn, 0, PROTIMER_IRQHandler, NULL, 0);
|
||||
IRQ_CONNECT(MODEM_IRQn, 0, MODEM_IRQHandler, NULL, 0);
|
||||
IRQ_CONNECT(FRC_IRQn, 0, FRC_IRQHandler, NULL, 0);
|
||||
IRQ_CONNECT(BUFC_IRQn, 0, BUFC_IRQHandler, NULL, 0);
|
||||
IRQ_CONNECT(AGC_IRQn, 0, AGC_IRQHandler, NULL, 0);
|
||||
IRQ_CONNECT(RADIO_IRQN(agc), RADIO_IRQ_PRIO(agc), AGC_IRQHandler, NULL, 0);
|
||||
IRQ_CONNECT(RADIO_IRQN(bufc), RADIO_IRQ_PRIO(bufc), BUFC_IRQHandler, NULL, 0);
|
||||
IRQ_CONNECT(RADIO_IRQN(frc_pri), RADIO_IRQ_PRIO(frc_pri), FRC_PRI_IRQHandler, NULL, 0);
|
||||
IRQ_CONNECT(RADIO_IRQN(frc), RADIO_IRQ_PRIO(frc), FRC_IRQHandler, NULL, 0);
|
||||
IRQ_CONNECT(RADIO_IRQN(modem), RADIO_IRQ_PRIO(modem), MODEM_IRQHandler, NULL, 0);
|
||||
IRQ_CONNECT(RADIO_IRQN(protimer), RADIO_IRQ_PRIO(protimer), PROTIMER_IRQHandler, NULL, 0);
|
||||
IRQ_CONNECT(RADIO_IRQN(rac_rsm), RADIO_IRQ_PRIO(rac_rsm), RAC_RSM_IRQHandler, NULL, 0);
|
||||
IRQ_CONNECT(RADIO_IRQN(rac_seq), RADIO_IRQ_PRIO(rac_seq), RAC_SEQ_IRQHandler, NULL, 0);
|
||||
IRQ_CONNECT(RADIO_IRQN(synth), RADIO_IRQ_PRIO(synth), SYNTH_IRQHandler, NULL, 0);
|
||||
|
||||
/* Depending on the chip family, either HOSTMAILBOX, RDMAILBOX or neither is present */
|
||||
IF_ENABLED(DT_IRQ_HAS_NAME(DT_NODELABEL(radio), hostmailbox), ({
|
||||
IRQ_CONNECT(RADIO_IRQN(hostmailbox),
|
||||
RADIO_IRQ_PRIO(hostmailbox),
|
||||
HOSTMAILBOX_IRQHandler,
|
||||
NULL, 0);
|
||||
}));
|
||||
IF_ENABLED(DT_IRQ_HAS_NAME(DT_NODELABEL(radio), rdmailbox), ({
|
||||
IRQ_CONNECT(RADIO_IRQN(rdmailbox),
|
||||
RADIO_IRQ_PRIO(rdmailbox),
|
||||
RDMAILBOX_IRQHandler,
|
||||
NULL, 0);
|
||||
}));
|
||||
}
|
||||
|
||||
static bool slz_is_evt_discardable(const struct bt_hci_evt_hdr *hdr, const uint8_t *params,
|
||||
|
@ -275,7 +289,6 @@ static int slz_bt_open(const struct device *dev, bt_hci_recv_t recv)
|
|||
K_PRIO_COOP(CONFIG_BT_DRIVER_RX_HIGH_PRIO), 0, K_NO_WAIT);
|
||||
k_thread_name_set(&slz_rx_thread, "EFR32 HCI RX");
|
||||
|
||||
rail_isr_installer();
|
||||
sl_rail_util_pa_init();
|
||||
|
||||
/* Initialize Controller features based on Kconfig values */
|
||||
|
@ -301,6 +314,9 @@ static int slz_bt_open(const struct device *dev, bt_hci_recv_t recv)
|
|||
}
|
||||
}
|
||||
|
||||
/* Set up interrupts after Controller init, because it will overwrite them. */
|
||||
rail_isr_installer();
|
||||
|
||||
hci->recv = recv;
|
||||
|
||||
LOG_DBG("SiLabs BT HCI started");
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue