diff --git a/plugins/wiimote.c b/plugins/wiimote.c
index 90d6d7b..12312b6 100644
--- a/plugins/wiimote.c
+++ b/plugins/wiimote.c
};
static ssize_t wii_pincb(struct btd_adapter *adapter, struct btd_device *device,
- char *pinbuf, gboolean *display)
+ char *pinbuf, gboolean *display, unsigned int attempt)
{
uint16_t vendor, product;
char addr[18], name[25];
unsigned int i;
+ /* Only try the pin code once per device. If it's not correct then it's
+ * an unknown device. */
+ if (attempt > 1)
+ return 0;
+
ba2str(device_get_address(device), addr);
vendor = btd_device_get_vendor(device);
diff --git a/src/adapter.c b/src/adapter.c
index d6c865c..87e2d90 100644
--- a/src/adapter.c
+++ b/src/adapter.c
while (iter->it != NULL) {
cb = iter->it->data;
- ret = cb(adapter, device, pin_buf, display);
+ ret = cb(adapter, device, pin_buf, display, iter->attempt);
iter->attempt++;
if (ret > 0)
return ret;
diff --git a/src/adapter.h b/src/adapter.h
index 425a11f..09d80c2 100644
--- a/src/adapter.h
+++ b/src/adapter.h
int btd_adapter_restore_powered(struct btd_adapter *adapter);
typedef ssize_t (*btd_adapter_pin_cb_t) (struct btd_adapter *adapter,
- struct btd_device *dev, char *out, gboolean *display);
+ struct btd_device *dev, char *out, gboolean *display,
+ unsigned int attempt);
void btd_adapter_register_pin_cb(struct btd_adapter *adapter,
btd_adapter_pin_cb_t cb);
void btd_adapter_unregister_pin_cb(struct btd_adapter *adapter,