Clean up connection failure handling
diff --git a/plugins/hciops.c b/plugins/hciops.c
index 2d2d6c8..dfd3dff 100644
--- a/plugins/hciops.c
+++ b/plugins/hciops.c
@@ -1965,6 +1965,24 @@
 	g_free(conn);
 }
 
+static inline void conn_failed(int index, bdaddr_t *bdaddr, uint8_t status)
+{
+	struct dev_info *dev = &devs[index];
+	struct bt_conn *conn;
+
+	btd_event_conn_complete(&dev->bdaddr, status, bdaddr);
+
+	conn = find_connection(dev, bdaddr);
+	if (conn == NULL)
+		return;
+
+	if (conn->bonding_initiator)
+		bonding_complete(dev, conn, status);
+
+	dev->connections = g_slist_remove(dev->connections, conn);
+	conn_free(conn);
+}
+
 static inline void conn_complete(int index, void *ptr)
 {
 	struct dev_info *dev = &devs[index];
@@ -1978,21 +1996,15 @@
 
 	DBG("status 0x%02x", evt->status);
 
-	conn = find_connection(dev, &evt->bdaddr);
-
-	if (evt->status == 0) {
-		if (conn == NULL)
-			conn = get_connection(dev, &evt->bdaddr);
-		conn->handle = btohs(evt->handle);
-	} else if (conn != NULL) {
-		dev->connections = g_slist_remove(dev->connections, conn);
-		conn_free(conn);
+	if (evt->status != 0) {
+		conn_failed(index, &evt->bdaddr, evt->status);
+		return;
 	}
 
-	btd_event_conn_complete(&dev->bdaddr, evt->status, &evt->bdaddr);
+	conn = get_connection(dev, &evt->bdaddr);
+	conn->handle = btohs(evt->handle);
 
-	if (evt->status != 0)
-		return;
+	btd_event_conn_complete(&dev->bdaddr, evt->status, &evt->bdaddr);
 
 	if (conn->secmode3)
 		bonding_complete(dev, conn, 0);
diff --git a/src/event.c b/src/event.c
index fbc1198..130acfc 100644
--- a/src/event.c
+++ b/src/event.c
@@ -677,8 +677,6 @@
 		return;
 
 	if (status) {
-		if (device_is_bonding(device, NULL))
-			device_bonding_complete(device, status);
 		if (device_is_temporary(device))
 			adapter_remove_device(conn, adapter, device, TRUE);
 		return;