From 671a81c18b3c7e24b04d9310c6c28f675e00e2b9 Mon Sep 17 00:00:00 2001 From: Zarithya Date: Fri, 28 Nov 2025 21:23:05 -0800 Subject: [PATCH] Fix issues when errors cause WPAD early shutdown --- lwbt/bte.c | 2 ++ wiiuse/wpad.c | 74 ++++++++++++++++++++++++--------------------------- 2 files changed, 37 insertions(+), 39 deletions(-) diff --git a/lwbt/bte.c b/lwbt/bte.c index 7c50f436a..a9bd83ca1 100644 --- a/lwbt/bte.c +++ b/lwbt/bte.c @@ -404,6 +404,8 @@ void BTE_Close(void) { u32 level; + if(btstate.hci_inited==0) return; + _CPU_ISR_Disable(level); hci_cmd_complete(NULL); _CPU_ISR_Restore(level); diff --git a/wiiuse/wpad.c b/wiiuse/wpad.c index c0604b552..2b812b15f 100644 --- a/wiiuse/wpad.c +++ b/wiiuse/wpad.c @@ -92,13 +92,13 @@ static u32 __wpad_idletimeout = 300; static vu32 __wpads_active = 0; static vu32 __wpads_used = 0; static wiimote **__wpads = NULL; -static wiimote_listen __wpads_listen[WPAD_MAX_DEVICES]; -static WPADData wpaddata[WPAD_MAX_DEVICES]; -static struct _wpad_cb __wpdcb[WPAD_MAX_DEVICES]; -static conf_pads __wpad_devs; -static conf_pad_guests __wpad_guests; -static struct linkkey_info __wpad_keys[CONF_PAD_MAX_REGISTERED]; -static struct linkkey_info __wpad_guest_keys[CONF_PAD_ACTIVE_AND_OTHER]; +static wiimote_listen __wpads_listen[WPAD_MAX_DEVICES] = {0}; +static WPADData wpaddata[WPAD_MAX_DEVICES] = {0}; +static struct _wpad_cb __wpdcb[WPAD_MAX_DEVICES] = {0}; +static conf_pads __wpad_devs = {0}; +static conf_pad_guests __wpad_guests = {0}; +static struct linkkey_info __wpad_keys[CONF_PAD_MAX_REGISTERED] = {0}; +static struct linkkey_info __wpad_guest_keys[CONF_PAD_ACTIVE_AND_OTHER] = {0}; static sem_t __wpad_confsave_sem; static bool __wpad_confsave_thread_running = false; @@ -818,6 +818,23 @@ static void __wpad_hostsyncbuttonCB(u32 held) _CPU_ISR_Restore(level); } +static s32 GetActiveSlot(struct bd_addr *pad_addr) +{ + int i; + int slot = CONF_PAD_MAX_ACTIVE; + struct bd_addr bdaddr; + + for(i=0; iname, 13)) { // Found Wii accessory, is it controller or something else? if (!strncmp("Nintendo RVL-CNT-", (char *)info->name, 17)) { - // Check active list - for(i=0; ibdaddr,&bdaddr)) { - WIIUSE_DEBUG("Wiimote already active in slot %d", i); - slot = i; - break; - } - } - - // Not active, try to make active - if(slot >= CONF_PAD_MAX_ACTIVE) { + slot = GetActiveSlot(&info->bdaddr); + if (slot < CONF_PAD_MAX_ACTIVE) { + WIIUSE_DEBUG("Wiimote already active in slot %d", slot); + } else { + // Not active, try to make active + slot = WPAD_MAX_DEVICES; for(i=0; ibdaddr,&bdaddr)) { + if (bd_addr_cmp(&info->bdaddr,&bdaddr)) { WIIUSE_DEBUG("Balance Board already registered"); slot = WPAD_BALANCE_BOARD; } @@ -888,23 +899,6 @@ s32 __wpad_read_remote_name_finished(s32 result,void *userdata) return result; } -static s32 GetActiveSlot(struct bd_addr *pad_addr) -{ - int i; - int slot = CONF_PAD_MAX_ACTIVE; - struct bd_addr bdaddr; - - for(i=0; i