Skip to content

Commit 65f5542

Browse files
committed
Fix issues when errors cause WPAD early shutdown
1 parent bd28e19 commit 65f5542

File tree

2 files changed

+38
-38
lines changed

2 files changed

+38
-38
lines changed

lwbt/bte.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -404,6 +404,8 @@ void BTE_Close(void)
404404
{
405405
u32 level;
406406

407+
if(btstate.hci_inited==0) return;
408+
407409
_CPU_ISR_Disable(level);
408410
hci_cmd_complete(NULL);
409411
_CPU_ISR_Restore(level);

wiiuse/wpad.c

Lines changed: 36 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -87,18 +87,19 @@ struct _wpad_cb {
8787

8888
static syswd_t __wpad_timer;
8989
static vu32 __wpads_inited = 0;
90+
static vu32 __wpad_guests_inited = 0;
9091
static vs32 __wpads_bonded = 0;
9192
static u32 __wpad_idletimeout = 300;
9293
static vu32 __wpads_active = 0;
9394
static vu32 __wpads_used = 0;
9495
static wiimote **__wpads = NULL;
95-
static wiimote_listen __wpads_listen[WPAD_MAX_DEVICES];
96-
static WPADData wpaddata[WPAD_MAX_DEVICES];
97-
static struct _wpad_cb __wpdcb[WPAD_MAX_DEVICES];
98-
static conf_pads __wpad_devs;
99-
static conf_pad_guests __wpad_guests;
100-
static struct linkkey_info __wpad_keys[CONF_PAD_MAX_REGISTERED];
101-
static struct linkkey_info __wpad_guest_keys[CONF_PAD_ACTIVE_AND_OTHER];
96+
static wiimote_listen __wpads_listen[WPAD_MAX_DEVICES] = {0};
97+
static WPADData wpaddata[WPAD_MAX_DEVICES] = {0};
98+
static struct _wpad_cb __wpdcb[WPAD_MAX_DEVICES] = {0};
99+
static conf_pads __wpad_devs = {0};
100+
static conf_pad_guests __wpad_guests = {0};
101+
static struct linkkey_info __wpad_keys[CONF_PAD_MAX_REGISTERED] = {0};
102+
static struct linkkey_info __wpad_guest_keys[CONF_PAD_ACTIVE_AND_OTHER] = {0};
102103

103104
static sem_t __wpad_confsave_sem;
104105
static bool __wpad_confsave_thread_running = false;
@@ -818,6 +819,23 @@ static void __wpad_hostsyncbuttonCB(u32 held)
818819
_CPU_ISR_Restore(level);
819820
}
820821

822+
static s32 GetActiveSlot(struct bd_addr *pad_addr)
823+
{
824+
int i;
825+
int slot = CONF_PAD_MAX_ACTIVE;
826+
struct bd_addr bdaddr;
827+
828+
for(i=0; i<CONF_PAD_MAX_ACTIVE; i++) {
829+
BD_ADDR_FROM_BYTES(&bdaddr,__wpad_devs.active[i].bdaddr);
830+
if(bd_addr_cmp(pad_addr,&bdaddr)) {
831+
slot = i;
832+
break;
833+
}
834+
}
835+
836+
return slot;
837+
}
838+
821839
s32 __wpad_read_remote_name_finished(s32 result,void *userdata)
822840
{
823841
u32 level;
@@ -832,18 +850,12 @@ s32 __wpad_read_remote_name_finished(s32 result,void *userdata)
832850
if (!strncmp("Nintendo RVL-", (char *)info->name, 13)) {
833851
// Found Wii accessory, is it controller or something else?
834852
if (!strncmp("Nintendo RVL-CNT-", (char *)info->name, 17)) {
835-
// Check active list
836-
for(i=0; i<CONF_PAD_MAX_ACTIVE; i++) {
837-
BD_ADDR_FROM_BYTES(&(bdaddr),__wpad_devs.active[i].bdaddr);
838-
if(bd_addr_cmp(&info->bdaddr,&bdaddr)) {
839-
WIIUSE_DEBUG("Wiimote already active in slot %d", i);
840-
slot = i;
841-
break;
842-
}
843-
}
844-
845-
// Not active, try to make active
846-
if(slot >= CONF_PAD_MAX_ACTIVE) {
853+
slot = GetActiveSlot(&info->bdaddr);
854+
if (slot < CONF_PAD_MAX_ACTIVE) {
855+
WIIUSE_DEBUG("Wiimote already active in slot %d", slot);
856+
} else {
857+
// Not active, try to make active
858+
slot = WPAD_MAX_DEVICES;
847859
for(i=0; i<CONF_PAD_MAX_ACTIVE; i++) {
848860
if(!(__wpads_used & (1<<i))) {
849861
WIIUSE_DEBUG("Attempting to connect to Wiimote using slot %d", i);
@@ -855,7 +867,7 @@ s32 __wpad_read_remote_name_finished(s32 result,void *userdata)
855867
} else {
856868
// Check for balance board
857869
BD_ADDR_FROM_BYTES(&(bdaddr),__wpad_devs.balance_board.bdaddr);
858-
if(bd_addr_cmp(&info->bdaddr,&bdaddr)) {
870+
if (bd_addr_cmp(&info->bdaddr,&bdaddr)) {
859871
WIIUSE_DEBUG("Balance Board already registered");
860872
slot = WPAD_BALANCE_BOARD;
861873
}
@@ -888,23 +900,6 @@ s32 __wpad_read_remote_name_finished(s32 result,void *userdata)
888900
return result;
889901
}
890902

891-
static s32 GetActiveSlot(struct bd_addr *pad_addr)
892-
{
893-
int i;
894-
int slot = CONF_PAD_MAX_ACTIVE;
895-
struct bd_addr bdaddr;
896-
897-
for(i=0; i<CONF_PAD_MAX_ACTIVE; i++) {
898-
BD_ADDR_FROM_BYTES(&bdaddr,__wpad_devs.active[i].bdaddr);
899-
if(bd_addr_cmp(pad_addr,&bdaddr)) {
900-
slot = i;
901-
break;
902-
}
903-
}
904-
905-
return slot;
906-
}
907-
908903
static s32 GetRegisteredSlot(struct bd_addr *pad_addr)
909904
{
910905
int i;
@@ -1732,7 +1727,10 @@ s32 WPAD_Shutdown(void)
17321727
BTE_Close();
17331728

17341729
__wpad_confsave_thread_stop();
1735-
CONF_SetPadGuestDevices(&__wpad_guests);
1730+
if (__wpad_guests_inited) {
1731+
CONF_SetPadGuestDevices(&__wpad_guests);
1732+
}
1733+
17361734
CONF_SaveChanges();
17371735

17381736
__wpads_inited = WPAD_STATE_DISABLED;

0 commit comments

Comments
 (0)