diff options
| -rw-r--r-- | drivers/net/wwan/iosm/iosm_ipc_imem.c | 27 | ||||
| -rw-r--r-- | drivers/net/wwan/iosm/iosm_ipc_imem_ops.c | 12 | ||||
| -rw-r--r-- | drivers/net/wwan/iosm/iosm_ipc_imem_ops.h | 6 | 
3 files changed, 33 insertions, 12 deletions
| diff --git a/drivers/net/wwan/iosm/iosm_ipc_imem.c b/drivers/net/wwan/iosm/iosm_ipc_imem.c index c066b0040a3f..829515a601b3 100644 --- a/drivers/net/wwan/iosm/iosm_ipc_imem.c +++ b/drivers/net/wwan/iosm/iosm_ipc_imem.c @@ -565,24 +565,32 @@ static void ipc_imem_run_state_worker(struct work_struct *instance)  	struct ipc_mux_config mux_cfg;  	struct iosm_imem *ipc_imem;  	u8 ctrl_chl_idx = 0; +	int ret;  	ipc_imem = container_of(instance, struct iosm_imem, run_state_worker);  	if (ipc_imem->phase != IPC_P_RUN) {  		dev_err(ipc_imem->dev,  			"Modem link down. Exit run state worker."); -		return; +		goto err_out;  	}  	if (test_and_clear_bit(IOSM_DEVLINK_INIT, &ipc_imem->flag))  		ipc_devlink_deinit(ipc_imem->ipc_devlink); -	if (!ipc_imem_setup_cp_mux_cap_init(ipc_imem, &mux_cfg)) -		ipc_imem->mux = ipc_mux_init(&mux_cfg, ipc_imem); +	ret = ipc_imem_setup_cp_mux_cap_init(ipc_imem, &mux_cfg); +	if (ret < 0) +		goto err_out; + +	ipc_imem->mux = ipc_mux_init(&mux_cfg, ipc_imem); +	if (!ipc_imem->mux) +		goto err_out; + +	ret = ipc_imem_wwan_channel_init(ipc_imem, mux_cfg.protocol); +	if (ret < 0) +		goto err_ipc_mux_deinit; -	ipc_imem_wwan_channel_init(ipc_imem, mux_cfg.protocol); -	if (ipc_imem->mux) -		ipc_imem->mux->wwan = ipc_imem->wwan; +	ipc_imem->mux->wwan = ipc_imem->wwan;  	while (ctrl_chl_idx < IPC_MEM_MAX_CHANNELS) {  		if (!ipc_chnl_cfg_get(&chnl_cfg_port, ctrl_chl_idx)) { @@ -622,6 +630,13 @@ static void ipc_imem_run_state_worker(struct work_struct *instance)  	/* Complete all memory stores after setting bit */  	smp_mb__after_atomic(); + +	return; + +err_ipc_mux_deinit: +	ipc_mux_deinit(ipc_imem->mux); +err_out: +	ipc_uevent_send(ipc_imem->dev, UEVENT_CD_READY_LINK_DOWN);  }  static void ipc_imem_handle_irq(struct iosm_imem *ipc_imem, int irq) diff --git a/drivers/net/wwan/iosm/iosm_ipc_imem_ops.c b/drivers/net/wwan/iosm/iosm_ipc_imem_ops.c index 66b90cc4c346..109cf8930488 100644 --- a/drivers/net/wwan/iosm/iosm_ipc_imem_ops.c +++ b/drivers/net/wwan/iosm/iosm_ipc_imem_ops.c @@ -77,8 +77,8 @@ out:  }  /* Initialize wwan channel */ -void ipc_imem_wwan_channel_init(struct iosm_imem *ipc_imem, -				enum ipc_mux_protocol mux_type) +int ipc_imem_wwan_channel_init(struct iosm_imem *ipc_imem, +			       enum ipc_mux_protocol mux_type)  {  	struct ipc_chnl_cfg chnl_cfg = { 0 }; @@ -87,7 +87,7 @@ void ipc_imem_wwan_channel_init(struct iosm_imem *ipc_imem,  	/* If modem version is invalid (0xffffffff), do not initialize WWAN. */  	if (ipc_imem->cp_version == -1) {  		dev_err(ipc_imem->dev, "invalid CP version"); -		return; +		return -EIO;  	}  	ipc_chnl_cfg_get(&chnl_cfg, ipc_imem->nr_of_channels); @@ -104,9 +104,13 @@ void ipc_imem_wwan_channel_init(struct iosm_imem *ipc_imem,  	/* WWAN registration. */  	ipc_imem->wwan = ipc_wwan_init(ipc_imem, ipc_imem->dev); -	if (!ipc_imem->wwan) +	if (!ipc_imem->wwan) {  		dev_err(ipc_imem->dev,  			"failed to register the ipc_wwan interfaces"); +		return -ENOMEM; +	} + +	return 0;  }  /* Map SKB to DMA for transfer */ diff --git a/drivers/net/wwan/iosm/iosm_ipc_imem_ops.h b/drivers/net/wwan/iosm/iosm_ipc_imem_ops.h index f8afb217d9e2..026c5bd0f999 100644 --- a/drivers/net/wwan/iosm/iosm_ipc_imem_ops.h +++ b/drivers/net/wwan/iosm/iosm_ipc_imem_ops.h @@ -91,9 +91,11 @@ int ipc_imem_sys_wwan_transmit(struct iosm_imem *ipc_imem, int if_id,   *				MUX.   * @ipc_imem:		Pointer to iosm_imem struct.   * @mux_type:		Type of mux protocol. + * + * Return: 0 on success and failure value on error   */ -void ipc_imem_wwan_channel_init(struct iosm_imem *ipc_imem, -				enum ipc_mux_protocol mux_type); +int ipc_imem_wwan_channel_init(struct iosm_imem *ipc_imem, +			       enum ipc_mux_protocol mux_type);  /**   * ipc_imem_sys_devlink_open - Open a Flash/CD Channel link to CP | 
