Skip to content

Commit aafc456

Browse files
authored
Wiimote: Fix issues when errors cause WPAD early shutdown (#238)
1 parent bd28e19 commit aafc456

2 files changed

Lines changed: 37 additions & 39 deletions

File tree

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: 35 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -92,13 +92,13 @@ static u32 __wpad_idletimeout = 300;
9292
static vu32 __wpads_active = 0;
9393
static vu32 __wpads_used = 0;
9494
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];
95+
static wiimote_listen __wpads_listen[WPAD_MAX_DEVICES] = {0};
96+
static WPADData wpaddata[WPAD_MAX_DEVICES] = {0};
97+
static struct _wpad_cb __wpdcb[WPAD_MAX_DEVICES] = {0};
98+
static conf_pads __wpad_devs = {0};
99+
static conf_pad_guests __wpad_guests = {0};
100+
static struct linkkey_info __wpad_keys[CONF_PAD_MAX_REGISTERED] = {0};
101+
static struct linkkey_info __wpad_guest_keys[CONF_PAD_ACTIVE_AND_OTHER] = {0};
102102

103103
static sem_t __wpad_confsave_sem;
104104
static bool __wpad_confsave_thread_running = false;
@@ -818,6 +818,23 @@ static void __wpad_hostsyncbuttonCB(u32 held)
818818
_CPU_ISR_Restore(level);
819819
}
820820

821+
static s32 GetActiveSlot(struct bd_addr *pad_addr)
822+
{
823+
int i;
824+
int slot = CONF_PAD_MAX_ACTIVE;
825+
struct bd_addr bdaddr;
826+
827+
for(i=0; i<CONF_PAD_MAX_ACTIVE; i++) {
828+
BD_ADDR_FROM_BYTES(&bdaddr,__wpad_devs.active[i].bdaddr);
829+
if(bd_addr_cmp(pad_addr,&bdaddr)) {
830+
slot = i;
831+
break;
832+
}
833+
}
834+
835+
return slot;
836+
}
837+
821838
s32 __wpad_read_remote_name_finished(s32 result,void *userdata)
822839
{
823840
u32 level;
@@ -832,18 +849,12 @@ s32 __wpad_read_remote_name_finished(s32 result,void *userdata)
832849
if (!strncmp("Nintendo RVL-", (char *)info->name, 13)) {
833850
// Found Wii accessory, is it controller or something else?
834851
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) {
852+
slot = GetActiveSlot(&info->bdaddr);
853+
if (slot < CONF_PAD_MAX_ACTIVE) {
854+
WIIUSE_DEBUG("Wiimote already active in slot %d", slot);
855+
} else {
856+
// Not active, try to make active
857+
slot = WPAD_MAX_DEVICES;
847858
for(i=0; i<CONF_PAD_MAX_ACTIVE; i++) {
848859
if(!(__wpads_used & (1<<i))) {
849860
WIIUSE_DEBUG("Attempting to connect to Wiimote using slot %d", i);
@@ -855,7 +866,7 @@ s32 __wpad_read_remote_name_finished(s32 result,void *userdata)
855866
} else {
856867
// Check for balance board
857868
BD_ADDR_FROM_BYTES(&(bdaddr),__wpad_devs.balance_board.bdaddr);
858-
if(bd_addr_cmp(&info->bdaddr,&bdaddr)) {
869+
if (bd_addr_cmp(&info->bdaddr,&bdaddr)) {
859870
WIIUSE_DEBUG("Balance Board already registered");
860871
slot = WPAD_BALANCE_BOARD;
861872
}
@@ -888,23 +899,6 @@ s32 __wpad_read_remote_name_finished(s32 result,void *userdata)
888899
return result;
889900
}
890901

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-
908902
static s32 GetRegisteredSlot(struct bd_addr *pad_addr)
909903
{
910904
int i;
@@ -1732,8 +1726,10 @@ s32 WPAD_Shutdown(void)
17321726
BTE_Close();
17331727

17341728
__wpad_confsave_thread_stop();
1735-
CONF_SetPadGuestDevices(&__wpad_guests);
1736-
CONF_SaveChanges();
1729+
if(__wpads_inited!=WPAD_STATE_DISABLED) {
1730+
CONF_SetPadGuestDevices(&__wpad_guests);
1731+
CONF_SaveChanges();
1732+
}
17371733

17381734
__wpads_inited = WPAD_STATE_DISABLED;
17391735
SYS_RemoveAlarm(__wpad_timer);

0 commit comments

Comments
 (0)