diff options
| author | Jakub Kicinski <[email protected]> | 2021-12-09 08:10:38 -0800 | 
|---|---|---|
| committer | Jakub Kicinski <[email protected]> | 2021-12-09 08:10:39 -0800 | 
| commit | 19961780f115769c8f998fa6b05b48ce499b21fc (patch) | |
| tree | 121b68afca2b4c81a2378dd5cd267bbcf0a67e51 /drivers/net/wwan/iosm/iosm_ipc_imem.c | |
| parent | e8b1d7698038e76363859fb47ae0a262080646f5 (diff) | |
| parent | 383451ceb07831d37dafdf011c09366d1c034df5 (diff) | |
Merge branch 'net-wwan-iosm-bug-fixes'
M Chetan Kumar says:
====================
net: wwan: iosm: bug fixes
This patch series brings in IOSM driver bug fixes. Patch details are
explained below.
PATCH1: stop sending unnecessary doorbell in IP tx flow.
PATCH2: Restore the IP channel configuration after fw flash.
PATCH3: Removed the unnecessary check around control port TX transfer.
====================
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Jakub Kicinski <[email protected]>
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: |