+bridge_remove_member(struct bridge_member *bm)
+{
+ struct bridge_state *bst = bm->bst;
+
+ if (!bm->present)
+ return;
+
+ if (bm == bst->primary_port)
+ bridge_reset_primary(bst);
+
+ if (bst->dev.active)
+ bridge_disable_member(bm);
+
+ bm->present = false;
+ bm->bst->n_present--;
+
+ if (bst->config.bridge_empty)
+ return;
+
+ bst->force_active = false;
+ if (bst->n_present == 0)
+ device_set_present(&bst->dev, false);
+}
+
+static void
+bridge_free_member(struct bridge_member *bm)
+{
+ struct device *dev = bm->dev.dev;
+
+ bridge_remove_member(bm);
+ device_remove_user(&bm->dev);
+
+ /*
+ * When reloading the config and moving a device from one bridge to
+ * another, the other bridge may have tried to claim this device
+ * before it was removed here.
+ * Ensure that claiming the device is retried by toggling its present
+ * state
+ */
+ if (dev->present) {
+ device_set_present(dev, false);
+ device_set_present(dev, true);
+ }
+
+ free(bm);
+}
+
+static void