diff options
Diffstat (limited to 'drivers/net/ipa/ipa_modem.c')
| -rw-r--r-- | drivers/net/ipa/ipa_modem.c | 34 | 
1 files changed, 13 insertions, 21 deletions
| diff --git a/drivers/net/ipa/ipa_modem.c b/drivers/net/ipa/ipa_modem.c index 9b08eb823984..af9aedbde717 100644 --- a/drivers/net/ipa/ipa_modem.c +++ b/drivers/net/ipa/ipa_modem.c @@ -1,7 +1,7 @@  // SPDX-License-Identifier: GPL-2.0  /* Copyright (c) 2014-2018, The Linux Foundation. All rights reserved. - * Copyright (C) 2018-2020 Linaro Ltd. + * Copyright (C) 2018-2021 Linaro Ltd.   */  #include <linux/errno.h> @@ -213,18 +213,18 @@ int ipa_modem_start(struct ipa *ipa)  		goto out_set_state;  	} -	ipa->name_map[IPA_ENDPOINT_AP_MODEM_TX]->netdev = netdev; -	ipa->name_map[IPA_ENDPOINT_AP_MODEM_RX]->netdev = netdev; -  	SET_NETDEV_DEV(netdev, &ipa->pdev->dev);  	priv = netdev_priv(netdev);  	priv->ipa = ipa;  	ret = register_netdev(netdev); -	if (ret) -		free_netdev(netdev); -	else +	if (!ret) {  		ipa->modem_netdev = netdev; +		ipa->name_map[IPA_ENDPOINT_AP_MODEM_TX]->netdev = netdev; +		ipa->name_map[IPA_ENDPOINT_AP_MODEM_RX]->netdev = netdev; +	} else { +		free_netdev(netdev); +	}  out_set_state:  	if (ret) @@ -240,7 +240,6 @@ int ipa_modem_stop(struct ipa *ipa)  {  	struct net_device *netdev = ipa->modem_netdev;  	enum ipa_modem_state state; -	int ret;  	/* Only attempt to stop the modem if it's running */  	state = atomic_cmpxchg(&ipa->modem_state, IPA_MODEM_STATE_RUNNING, @@ -257,27 +256,20 @@ int ipa_modem_stop(struct ipa *ipa)  	/* Prevent the modem from triggering a call to ipa_setup() */  	ipa_smp2p_disable(ipa); +	/* Stop the queue and disable the endpoints if it's open */  	if (netdev) { -		/* Stop the queue and disable the endpoints if it's open */ -		ret = ipa_stop(netdev); -		if (ret) -			goto out_set_state; - +		(void)ipa_stop(netdev); +		ipa->name_map[IPA_ENDPOINT_AP_MODEM_RX]->netdev = NULL; +		ipa->name_map[IPA_ENDPOINT_AP_MODEM_TX]->netdev = NULL;  		ipa->modem_netdev = NULL;  		unregister_netdev(netdev);  		free_netdev(netdev); -	} else { -		ret = 0;  	} -out_set_state: -	if (ret) -		atomic_set(&ipa->modem_state, IPA_MODEM_STATE_RUNNING); -	else -		atomic_set(&ipa->modem_state, IPA_MODEM_STATE_STOPPED); +	atomic_set(&ipa->modem_state, IPA_MODEM_STATE_STOPPED);  	smp_mb__after_atomic(); -	return ret; +	return 0;  }  /* Treat a "clean" modem stop the same as a crash */ | 
