fw_download
.fw_download.opcode = PDS_CORE_CMD_FW_DOWNLOAD,
.fw_download.offset = cpu_to_le32(offset),
.fw_download.addr = cpu_to_le64(addr),
.fw_download.length = cpu_to_le32(length),
.fw_download.opcode = IONIC_CMD_FW_DOWNLOAD,
.fw_download.offset = cpu_to_le32(offset),
.fw_download.addr = cpu_to_le64(addr),
.fw_download.length = cpu_to_le32(length),
struct ionic_fw_download_cmd fw_download;
ionic_fw_download_comp fw_download;
struct ionic_fw_download_cmd fw_download;
.fw_download = nfcmrvl_nci_fw_download,
.fw_download = nxp_nci_fw_download,
fw_download_t fw_download;
if (info->fw_download == NULL)
return info->fw_download(info->phy_id, firmware_name, hdev->sw_romlib);
.fw_download = pn544_hci_fw_download,
int phy_payload, fw_download_t fw_download,
info->fw_download = fw_download;
int phy_payload, fw_download_t fw_download,
mutex_unlock(&fw_download->mutex);
static void free_firmware(struct fw_download *fw_download,
mutex_lock(&fw_download->mutex);
mutex_unlock(&fw_download->mutex);
struct fw_download *fw_download = fw_req->fw_download;
dev_err(fw_download->parent,
free_firmware(fw_download, fw_req);
struct fw_download *fw_download = fw_req->fw_download;
dev_err(fw_download->parent,
free_firmware(fw_download, fw_req);
static struct fw_request *find_firmware(struct fw_download *fw_download,
struct gb_interface *intf = fw_download->connection->bundle->intf;
ret = ida_alloc_range(&fw_download->id_map, 1, 255, GFP_KERNEL);
dev_err(fw_download->parent,
dev_info(fw_download->parent, "Requested firmware package '%s'\n",
ret = request_firmware(&fw_req->fw, fw_req->name, fw_download->parent);
dev_err(fw_download->parent,
fw_req->fw_download = fw_download;
mutex_lock(&fw_download->mutex);
list_add(&fw_req->node, &fw_download->fw_requests);
mutex_unlock(&fw_download->mutex);
ida_free(&fw_download->id_map, fw_req->firmware_id);
struct fw_download *fw_download = gb_connection_get_data(connection);
dev_err(fw_download->parent,
dev_err(fw_download->parent,
fw_req = find_firmware(fw_download, tag);
dev_err(fw_download->parent, "error allocating response\n");
free_firmware(fw_download, fw_req);
dev_dbg(fw_download->parent,
struct fw_download *fw_download = gb_connection_get_data(connection);
dev_err(fw_download->parent,
fw_req = get_fw_req(fw_download, firmware_id);
dev_err(fw_download->parent,
dev_err(fw_download->parent,
dev_err(fw_download->parent,
struct fw_download *fw_download;
dev_dbg(fw_download->parent,
struct fw_download *fw_download = gb_connection_get_data(connection);
dev_err(fw_download->parent,
fw_req = get_fw_req(fw_download, firmware_id);
dev_err(fw_download->parent,
free_firmware(fw_download, fw_req);
dev_dbg(fw_download->parent, "release firmware\n");
struct fw_download *fw_download;
fw_download = kzalloc_obj(*fw_download);
if (!fw_download)
fw_download->parent = &connection->bundle->dev;
INIT_LIST_HEAD(&fw_download->fw_requests);
ida_init(&fw_download->id_map);
gb_connection_set_data(connection, fw_download);
fw_download->connection = connection;
mutex_init(&fw_download->mutex);
ida_destroy(&fw_download->id_map);
kfree(fw_download);
struct fw_download *fw_download;
fw_download = gb_connection_get_data(connection);
gb_connection_disable(fw_download->connection);
mutex_lock(&fw_download->mutex);
list_for_each_entry(fw_req, &fw_download->fw_requests, node)
mutex_unlock(&fw_download->mutex);
list_for_each_entry_safe(fw_req, tmp, &fw_download->fw_requests, node) {
free_firmware(fw_download, fw_req);
ida_destroy(&fw_download->id_map);
kfree(fw_download);
dev_dbg(fw_req->fw_download->parent, "firmware %s released\n",
ida_free(&fw_req->fw_download->id_map, fw_req->firmware_id);
static struct fw_request *get_fw_req(struct fw_download *fw_download,
mutex_lock(&fw_download->mutex);
list_for_each_entry(fw_req, &fw_download->fw_requests, node) {
struct pds_core_fw_download_cmd fw_download;
struct pds_core_fw_download_comp fw_download;
int (*fw_download)(struct nfc_hci_dev *hdev, const char *firmware_name);
int (*fw_download)(struct nci_dev *ndev, const char *firmware_name);
int (*fw_download)(struct nfc_dev *dev, const char *firmware_name);
if (!dev->ops->fw_download) {
rc = dev->ops->fw_download(dev, firmware_name);
if (!hdev->ops->fw_download)
return hdev->ops->fw_download(hdev, firmware_name);
.fw_download = hci_fw_download,
if (!ndev->ops->fw_download)
return ndev->ops->fw_download(ndev, firmware_name);
.fw_download = nci_fw_download,