drivers/net/wwan/iosm/iosm_ipc_flash.c

Source file repositories/reference/linux-study-clean/drivers/net/wwan/iosm/iosm_ipc_flash.c

File Facts

System
Linux kernel
Corpus path
drivers/net/wwan/iosm/iosm_ipc_flash.c
Extension
.c
Size
16066 bytes
Lines
595
Domain
Driver Families
Bucket
drivers/net
Inferred role
Driver Families: implementation source
Status
source implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

if (!err_info->error[i].error_code) {
				pr_err("EBL: error_class = %d, error_code = %d",
				       err_info->error[i].error_class,
				       err_info->error[i].error_code);
			}
		}
		return -EINVAL;
	}

	return 0;
}

/* Send data to the modem */
static int ipc_flash_send_data(struct iosm_devlink *ipc_devlink, u32 size,
			       u16 pack_id, u8 *payload, u32 payload_length)
{
	struct iosm_flash_data flash_req;
	int ret;

	ret = ipc_flash_proc_format_ebl_pack(&flash_req, size,
					     pack_id, payload, payload_length);
	if (ret) {
		dev_err(ipc_devlink->dev, "EBL2 pack failed for pack_id:%d",
			pack_id);
		goto ipc_free_payload;
	}

	ret = ipc_imem_sys_devlink_write(ipc_devlink, (u8 *)&flash_req,
					 IOSM_EBL_HEAD_SIZE);
	if (ret) {
		dev_err(ipc_devlink->dev, "EBL Header write failed for Id:%x",
			pack_id);
		goto ipc_free_payload;
	}

	ret = ipc_imem_sys_devlink_write(ipc_devlink, payload, payload_length);
	if (ret) {
		dev_err(ipc_devlink->dev, "EBL Payload write failed for Id:%x",
			pack_id);
	}

ipc_free_payload:
	return ret;
}

/**
 * ipc_flash_link_establish - Flash link establishment
 * @ipc_imem:           Pointer to struct iosm_imem
 *
 * Returns:     0 on success and failure value on error
 */
int ipc_flash_link_establish(struct iosm_imem *ipc_imem)
{
	u8 ler_data[IOSM_LER_RSP_SIZE];
	u32 bytes_read;

	/* Allocate channel for flashing/cd collection */
	ipc_imem->ipc_devlink->devlink_sio.channel =
					ipc_imem_sys_devlink_open(ipc_imem);

	if (!ipc_imem->ipc_devlink->devlink_sio.channel)
		goto chl_open_fail;

	if (ipc_imem_sys_devlink_read(ipc_imem->ipc_devlink, ler_data,
				      IOSM_LER_RSP_SIZE, &bytes_read))
		goto devlink_read_fail;

	if (bytes_read != IOSM_LER_RSP_SIZE)
		goto devlink_read_fail;

	return 0;

devlink_read_fail:
	ipc_imem_sys_devlink_close(ipc_imem->ipc_devlink);
chl_open_fail:
	return -EIO;
}

/* Receive data from the modem */
static int ipc_flash_receive_data(struct iosm_devlink *ipc_devlink, u32 size,
				  u8 *mdm_rsp)
{
	u8 mdm_rsp_hdr[IOSM_EBL_HEAD_SIZE];
	u32 bytes_read;
	int ret;

	ret = ipc_imem_sys_devlink_read(ipc_devlink, mdm_rsp_hdr,
					IOSM_EBL_HEAD_SIZE, &bytes_read);
	if (ret) {
		dev_err(ipc_devlink->dev, "EBL rsp to read %d bytes failed",

Annotation

Implementation Notes