spin_lock(&busid_table_lock); for (i = 0; i < MAX_BUSID; i++) {
spin_lock(&busid_table[i].busid_lock); if (busid_table[i].name[0])
out += sprintf(out, "%s ", busid_table[i].name);
spin_unlock(&busid_table[i].busid_lock);
}
spin_unlock(&busid_table_lock);
out += sprintf(out, "\n");
staticint do_rebind(char *busid, struct bus_id_priv *busid_priv)
{ int ret = 0;
/* device_attach() callers should hold parent lock for USB */ if (busid_priv->udev->dev.parent)
device_lock(busid_priv->udev->dev.parent);
ret = device_attach(&busid_priv->udev->dev); if (busid_priv->udev->dev.parent)
device_unlock(busid_priv->udev->dev.parent); if (ret < 0)
dev_err(&busid_priv->udev->dev, "rebind failed\n"); return ret;
}
staticvoid stub_device_rebind(void)
{ #if IS_MODULE(CONFIG_USBIP_HOST) struct bus_id_priv *busid_priv; int i;
/* update status to STUB_BUSID_OTHER so probe ignores the device */
spin_lock(&busid_table_lock); for (i = 0; i < MAX_BUSID; i++) { if (busid_table[i].name[0] &&
busid_table[i].shutdown_busid) {
busid_priv = &(busid_table[i]);
busid_priv->status = STUB_BUSID_OTHER;
}
}
spin_unlock(&busid_table_lock);
/* now run rebind - no need to hold locks. driver files are removed */ for (i = 0; i < MAX_BUSID; i++) { if (busid_table[i].name[0] &&
busid_table[i].shutdown_busid) {
busid_priv = &(busid_table[i]);
do_rebind(busid_table[i].name, busid_priv);
}
} #endif
}
static ssize_t rebind_store(struct device_driver *dev, constchar *buf,
size_t count)
{ int ret; int len; struct bus_id_priv *bid;
/* buf length should be less that BUSID_SIZE */
len = strnlen(buf, BUSID_SIZE);
if (!(len < BUSID_SIZE)) return -EINVAL;
bid = get_busid_priv(buf); if (!bid) return -ENODEV;
/* mark the device for deletion so probe ignores it during rescan */
bid->status = STUB_BUSID_OTHER; /* release the busid lock */
put_busid_priv(bid);
ret = do_rebind((char *) buf, bid); if (ret < 0) return ret;
/* delete device from busid_table */
del_match_busid((char *) buf);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.