Ejemplo n.º 1
0
/*
 * 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;
}
Ejemplo n.º 2
0
/*
 * 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;
}