drivers/net/wwan/iosm/iosm_ipc_devlink.c

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

File Facts

System
Linux kernel
Corpus path
drivers/net/wwan/iosm/iosm_ipc_devlink.c
Extension
.c
Size
9285 bytes
Lines
325
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 (IS_ERR(devlink->cd_regions[i])) {
			rc = PTR_ERR(devlink->cd_regions[i]);
			dev_err(devlink->dev, "Devlink region fail,err %d", rc);
			/* Delete previously created regions */
			for (i--; i >= 0; i--)
				devlink_region_destroy(devlink->cd_regions[i]);
			goto region_create_fail;
		}
		list[i].entry = i;
		mdm_coredump[i].priv = list + i;
	}
region_create_fail:
	return rc;
}

/* To Destroy devlink regions */
static void ipc_devlink_destroy_region(struct iosm_devlink *ipc_devlink)
{
	u8 i;

	for (i = 0; i < IOSM_NOF_CD_REGION; i++)
		devlink_region_destroy(ipc_devlink->cd_regions[i]);
}

/**
 * ipc_devlink_init - Initialize/register devlink to IOSM driver
 * @ipc_imem:   Pointer to struct iosm_imem
 *
 * Returns:     Pointer to iosm_devlink on success and NULL on failure
 */
struct iosm_devlink *ipc_devlink_init(struct iosm_imem *ipc_imem)
{
	struct ipc_chnl_cfg chnl_cfg_flash = { 0 };
	struct iosm_devlink *ipc_devlink;
	struct devlink *devlink_ctx;
	int rc;

	devlink_ctx = devlink_alloc(&devlink_flash_ops,
				    sizeof(struct iosm_devlink),
				    ipc_imem->dev);
	if (!devlink_ctx) {
		dev_err(ipc_imem->dev, "devlink_alloc failed");
		goto devlink_alloc_fail;
	}

	ipc_devlink = devlink_priv(devlink_ctx);
	ipc_devlink->devlink_ctx = devlink_ctx;
	ipc_devlink->pcie = ipc_imem->pcie;
	ipc_devlink->dev = ipc_imem->dev;

	rc = devlink_params_register(devlink_ctx, iosm_devlink_params,
				     ARRAY_SIZE(iosm_devlink_params));
	if (rc) {
		dev_err(ipc_devlink->dev,
			"devlink_params_register failed. rc %d", rc);
		goto param_reg_fail;
	}

	ipc_devlink->cd_file_info = list;

	rc = ipc_devlink_create_region(ipc_devlink);
	if (rc) {
		dev_err(ipc_devlink->dev, "Devlink Region create failed, rc %d",
			rc);
		goto region_create_fail;
	}

	if (ipc_chnl_cfg_get(&chnl_cfg_flash, IPC_MEM_CTRL_CHL_ID_7) < 0)
		goto chnl_get_fail;

	ipc_imem_channel_init(ipc_imem, IPC_CTYPE_CTRL,
			      chnl_cfg_flash, IRQ_MOD_OFF);

	init_completion(&ipc_devlink->devlink_sio.read_sem);
	skb_queue_head_init(&ipc_devlink->devlink_sio.rx_list);

	devlink_register(devlink_ctx);
	dev_dbg(ipc_devlink->dev, "iosm devlink register success");

	return ipc_devlink;

chnl_get_fail:
	ipc_devlink_destroy_region(ipc_devlink);
region_create_fail:
	devlink_params_unregister(devlink_ctx, iosm_devlink_params,
				  ARRAY_SIZE(iosm_devlink_params));
param_reg_fail:
	devlink_free(devlink_ctx);
devlink_alloc_fail:
	return NULL;

Annotation

Implementation Notes