diff options
Diffstat (limited to 'drivers/net/wwan/iosm/iosm_ipc_imem.c')
| -rw-r--r-- | drivers/net/wwan/iosm/iosm_ipc_imem.c | 26 | 
1 files changed, 17 insertions, 9 deletions
| diff --git a/drivers/net/wwan/iosm/iosm_ipc_imem.c b/drivers/net/wwan/iosm/iosm_ipc_imem.c index cff3b43ca4d7..12c03dacb5dd 100644 --- a/drivers/net/wwan/iosm/iosm_ipc_imem.c +++ b/drivers/net/wwan/iosm/iosm_ipc_imem.c @@ -181,9 +181,9 @@ void ipc_imem_hrtimer_stop(struct hrtimer *hr_timer)  bool ipc_imem_ul_write_td(struct iosm_imem *ipc_imem)  {  	struct ipc_mem_channel *channel; +	bool hpda_ctrl_pending = false;  	struct sk_buff_head *ul_list;  	bool hpda_pending = false; -	bool forced_hpdu = false;  	struct ipc_pipe *pipe;  	int i; @@ -200,15 +200,19 @@ bool ipc_imem_ul_write_td(struct iosm_imem *ipc_imem)  		ul_list = &channel->ul_list;  		/* Fill the transfer descriptor with the uplink buffer info. */ -		hpda_pending |= ipc_protocol_ul_td_send(ipc_imem->ipc_protocol, +		if (!ipc_imem_check_wwan_ips(channel)) { +			hpda_ctrl_pending |= +				ipc_protocol_ul_td_send(ipc_imem->ipc_protocol,  							pipe, ul_list); - -		/* forced HP update needed for non data channels */ -		if (hpda_pending && !ipc_imem_check_wwan_ips(channel)) -			forced_hpdu = true; +		} else { +			hpda_pending |= +				ipc_protocol_ul_td_send(ipc_imem->ipc_protocol, +							pipe, ul_list); +		}  	} -	if (forced_hpdu) { +	/* forced HP update needed for non data channels */ +	if (hpda_ctrl_pending) {  		hpda_pending = false;  		ipc_protocol_doorbell_trigger(ipc_imem->ipc_protocol,  					      IPC_HP_UL_WRITE_TD); @@ -527,6 +531,9 @@ static void ipc_imem_run_state_worker(struct work_struct *instance)  		return;  	} +	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); @@ -1167,7 +1174,7 @@ void ipc_imem_cleanup(struct iosm_imem *ipc_imem)  		ipc_port_deinit(ipc_imem->ipc_port);  	} -	if (ipc_imem->ipc_devlink) +	if (test_and_clear_bit(IOSM_DEVLINK_INIT, &ipc_imem->flag))  		ipc_devlink_deinit(ipc_imem->ipc_devlink);  	ipc_imem_device_ipc_uninit(ipc_imem); @@ -1263,7 +1270,6 @@ struct iosm_imem *ipc_imem_init(struct iosm_pcie *pcie, unsigned int device_id,  	ipc_imem->pci_device_id = device_id; -	ipc_imem->ev_cdev_write_pending = false;  	ipc_imem->cp_version = 0;  	ipc_imem->device_sleep = IPC_HOST_SLEEP_ENTER_SLEEP; @@ -1331,6 +1337,8 @@ struct iosm_imem *ipc_imem_init(struct iosm_pcie *pcie, unsigned int device_id,  		if (ipc_flash_link_establish(ipc_imem))  			goto devlink_channel_fail; + +		set_bit(IOSM_DEVLINK_INIT, &ipc_imem->flag);  	}  	return ipc_imem;  devlink_channel_fail: |