diff options
Diffstat (limited to 'drivers/net/wwan/iosm/iosm_ipc_wwan.c')
| -rw-r--r-- | drivers/net/wwan/iosm/iosm_ipc_wwan.c | 42 | 
1 files changed, 6 insertions, 36 deletions
diff --git a/drivers/net/wwan/iosm/iosm_ipc_wwan.c b/drivers/net/wwan/iosm/iosm_ipc_wwan.c index 0108d8d01ff2..4c9022a93e01 100644 --- a/drivers/net/wwan/iosm/iosm_ipc_wwan.c +++ b/drivers/net/wwan/iosm/iosm_ipc_wwan.c @@ -40,13 +40,11 @@ struct iosm_netdev_priv {   * @ipc_imem:		Pointer to imem data-struct   * @sub_netlist:	List of active netdevs   * @dev:		Pointer device structure - * @if_mutex:		Mutex used for add and remove interface id   */  struct iosm_wwan {  	struct iosm_imem *ipc_imem;  	struct iosm_netdev_priv __rcu *sub_netlist[IP_MUX_SESSION_END + 1];  	struct device *dev; -	struct mutex if_mutex; /* Mutex used for add and remove interface id */  };  /* Bring-up the wwan net link */ @@ -55,14 +53,11 @@ static int ipc_wwan_link_open(struct net_device *netdev)  	struct iosm_netdev_priv *priv = wwan_netdev_drvpriv(netdev);  	struct iosm_wwan *ipc_wwan = priv->ipc_wwan;  	int if_id = priv->if_id; -	int ret;  	if (if_id < IP_MUX_SESSION_START ||  	    if_id >= ARRAY_SIZE(ipc_wwan->sub_netlist))  		return -EINVAL; -	mutex_lock(&ipc_wwan->if_mutex); -  	/* get channel id */  	priv->ch_id = ipc_imem_sys_wwan_open(ipc_wwan->ipc_imem, if_id); @@ -70,8 +65,7 @@ static int ipc_wwan_link_open(struct net_device *netdev)  		dev_err(ipc_wwan->dev,  			"cannot connect wwan0 & id %d to the IPC mem layer",  			if_id); -		ret = -ENODEV; -		goto out; +		return -ENODEV;  	}  	/* enable tx path, DL data may follow */ @@ -80,10 +74,7 @@ static int ipc_wwan_link_open(struct net_device *netdev)  	dev_dbg(ipc_wwan->dev, "Channel id %d allocated to if_id %d",  		priv->ch_id, priv->if_id); -	ret = 0; -out: -	mutex_unlock(&ipc_wwan->if_mutex); -	return ret; +	return 0;  }  /* Bring-down the wwan net link */ @@ -93,11 +84,9 @@ static int ipc_wwan_link_stop(struct net_device *netdev)  	netif_stop_queue(netdev); -	mutex_lock(&priv->ipc_wwan->if_mutex);  	ipc_imem_sys_wwan_close(priv->ipc_wwan->ipc_imem, priv->if_id,  				priv->ch_id);  	priv->ch_id = -1; -	mutex_unlock(&priv->ipc_wwan->if_mutex);  	return 0;  } @@ -190,26 +179,17 @@ static int ipc_wwan_newlink(void *ctxt, struct net_device *dev,  	priv->netdev = dev;  	priv->ipc_wwan = ipc_wwan; -	mutex_lock(&ipc_wwan->if_mutex); -	if (rcu_access_pointer(ipc_wwan->sub_netlist[if_id])) { -		err = -EBUSY; -		goto out_unlock; -	} +	if (rcu_access_pointer(ipc_wwan->sub_netlist[if_id])) +		return -EBUSY;  	err = register_netdevice(dev);  	if (err) -		goto out_unlock; +		return err;  	rcu_assign_pointer(ipc_wwan->sub_netlist[if_id], priv); -	mutex_unlock(&ipc_wwan->if_mutex); -  	netif_device_attach(dev);  	return 0; - -out_unlock: -	mutex_unlock(&ipc_wwan->if_mutex); -	return err;  }  static void ipc_wwan_dellink(void *ctxt, struct net_device *dev, @@ -223,17 +203,12 @@ static void ipc_wwan_dellink(void *ctxt, struct net_device *dev,  		    if_id >= ARRAY_SIZE(ipc_wwan->sub_netlist)))  		return; -	mutex_lock(&ipc_wwan->if_mutex); -  	if (WARN_ON(rcu_access_pointer(ipc_wwan->sub_netlist[if_id]) != priv)) -		goto unlock; +		return;  	RCU_INIT_POINTER(ipc_wwan->sub_netlist[if_id], NULL);  	/* unregistering includes synchronize_net() */  	unregister_netdevice_queue(dev, head); - -unlock: -	mutex_unlock(&ipc_wwan->if_mutex);  }  static const struct wwan_ops iosm_wwan_ops = { @@ -324,12 +299,9 @@ struct iosm_wwan *ipc_wwan_init(struct iosm_imem *ipc_imem, struct device *dev)  	ipc_wwan->dev = dev;  	ipc_wwan->ipc_imem = ipc_imem; -	mutex_init(&ipc_wwan->if_mutex); -  	/* WWAN core will create a netdev for the default IP MUX channel */  	if (wwan_register_ops(ipc_wwan->dev, &iosm_wwan_ops, ipc_wwan,  			      IP_MUX_SESSION_DEFAULT)) { -		mutex_destroy(&ipc_wwan->if_mutex);  		kfree(ipc_wwan);  		return NULL;  	} @@ -342,7 +314,5 @@ void ipc_wwan_deinit(struct iosm_wwan *ipc_wwan)  	/* This call will remove all child netdev(s) */  	wwan_unregister_ops(ipc_wwan->dev); -	mutex_destroy(&ipc_wwan->if_mutex); -  	kfree(ipc_wwan);  }  | 
