/* * Register a firmware image with the specified name. The * image name must not already be registered. If this is a * subimage then parent refers to a previously registered * image that this should be associated with. */ const struct firmware * firmware_register(const char *imagename, const void *data, size_t datasize, unsigned int version, const struct firmware *parent) { struct priv_fw *match, *frp; char *str; str = strdup(imagename, M_TEMP); mtx_lock(&firmware_mtx); /* * Do a lookup to make sure the name is unique or find a free slot. */ match = lookup(imagename, &frp); if (match != NULL) { mtx_unlock(&firmware_mtx); printf("%s: image %s already registered!\n", __func__, imagename); free(str, M_TEMP); return NULL; } if (frp == NULL) { mtx_unlock(&firmware_mtx); printf("%s: cannot register image %s, firmware table full!\n", __func__, imagename); free(str, M_TEMP); return NULL; } bzero(frp, sizeof(frp)); /* start from a clean record */ frp->fw.name = str; frp->fw.data = data; frp->fw.datasize = datasize; frp->fw.version = version; if (parent != NULL) frp->parent = PRIV_FW(parent); mtx_unlock(&firmware_mtx); if (bootverbose) printf("firmware: '%s' version %u: %zu bytes loaded at %p\n", imagename, version, datasize, data); return &frp->fw; }
/* * Register a firmware image with the specified name. The * image name must not already be registered. If this is a * subimage then parent refers to a previously registered * image that this should be associated with. */ const struct firmware * firmware_register(const char *imagename, const void *data, size_t datasize, unsigned int version, const struct firmware *parent) { struct priv_fw *match, *frp; lockmgr(&firmware_lock, LK_EXCLUSIVE); /* * Do a lookup to make sure the name is unique or find a free slot. */ match = lookup(imagename, &frp); if (match != NULL) { lockmgr(&firmware_lock, LK_RELEASE); kprintf("%s: image %s already registered!\n", __func__, imagename); return NULL; } if (frp == NULL) { lockmgr(&firmware_lock, LK_RELEASE); kprintf("%s: cannot register image %s, firmware table full!\n", __func__, imagename); return NULL; } bzero(frp, sizeof(*frp)); /* start from a clean record */ frp->fw.name = imagename; frp->fw.data = data; frp->fw.datasize = datasize; frp->fw.version = version; if (parent != NULL) { frp->parent = PRIV_FW(parent); frp->parent->refcnt++; } lockmgr(&firmware_lock, LK_RELEASE); if (bootverbose) kprintf("firmware: '%s' version %u: %zu bytes loaded at %p\n", imagename, version, datasize, data); return &frp->fw; }