Lines Matching +full:modem +full:- +full:remoteproc
1 // SPDX-License-Identifier: GPL-2.0
3 /* Copyright (c) 2014-2018, The Linux Foundation. All rights reserved.
4 * Copyright (C) 2018-2020 Linaro Ltd.
12 #include <linux/remoteproc/qcom_rproc.h>
34 /** struct ipa_priv - IPA network device private data */
39 /** ipa_open() - Opens the modem network interface */
43 struct ipa *ipa = priv->ipa; in ipa_open()
46 ret = ipa_endpoint_enable_one(ipa->name_map[IPA_ENDPOINT_AP_MODEM_TX]); in ipa_open()
49 ret = ipa_endpoint_enable_one(ipa->name_map[IPA_ENDPOINT_AP_MODEM_RX]); in ipa_open()
58 ipa_endpoint_disable_one(ipa->name_map[IPA_ENDPOINT_AP_MODEM_TX]); in ipa_open()
63 /** ipa_stop() - Stops the modem network interface. */
67 struct ipa *ipa = priv->ipa; in ipa_stop()
71 ipa_endpoint_disable_one(ipa->name_map[IPA_ENDPOINT_AP_MODEM_RX]); in ipa_stop()
72 ipa_endpoint_disable_one(ipa->name_map[IPA_ENDPOINT_AP_MODEM_TX]); in ipa_stop()
77 /** ipa_start_xmit() - Transmits an skb.
87 struct net_device_stats *stats = &netdev->stats; in ipa_start_xmit()
90 struct ipa *ipa = priv->ipa; in ipa_start_xmit()
91 u32 skb_len = skb->len; in ipa_start_xmit()
97 endpoint = ipa->name_map[IPA_ENDPOINT_AP_MODEM_TX]; in ipa_start_xmit()
98 if (endpoint->data->qmap && skb->protocol != htons(ETH_P_MAP)) in ipa_start_xmit()
103 if (ret != -E2BIG) in ipa_start_xmit()
108 stats->tx_packets++; in ipa_start_xmit()
109 stats->tx_bytes += skb_len; in ipa_start_xmit()
115 stats->tx_dropped++; in ipa_start_xmit()
122 struct net_device_stats *stats = &netdev->stats; in ipa_modem_skb_rx()
125 skb->dev = netdev; in ipa_modem_skb_rx()
126 skb->protocol = htons(ETH_P_MAP); in ipa_modem_skb_rx()
127 stats->rx_packets++; in ipa_modem_skb_rx()
128 stats->rx_bytes += skb->len; in ipa_modem_skb_rx()
132 stats->rx_dropped++; in ipa_modem_skb_rx()
142 /** ipa_modem_netdev_setup() - netdev setup function for the modem */
145 netdev->netdev_ops = &ipa_modem_ops; in ipa_modem_netdev_setup()
148 netdev->header_ops = NULL; in ipa_modem_netdev_setup()
149 netdev->type = ARPHRD_RAWIP; in ipa_modem_netdev_setup()
150 netdev->hard_header_len = 0; in ipa_modem_netdev_setup()
151 netdev->max_mtu = IPA_MTU; in ipa_modem_netdev_setup()
152 netdev->mtu = netdev->max_mtu; in ipa_modem_netdev_setup()
153 netdev->addr_len = 0; in ipa_modem_netdev_setup()
154 netdev->flags &= ~(IFF_BROADCAST | IFF_MULTICAST); in ipa_modem_netdev_setup()
156 netdev->needed_headroom = sizeof(struct rmnet_map_header); in ipa_modem_netdev_setup()
157 netdev->needed_tailroom = IPA_NETDEV_TAILROOM; in ipa_modem_netdev_setup()
158 netdev->watchdog_timeo = IPA_NETDEV_TIMEOUT * HZ; in ipa_modem_netdev_setup()
159 netdev->hw_features = NETIF_F_SG; in ipa_modem_netdev_setup()
162 /** ipa_modem_suspend() - suspend callback
165 * Suspend the modem's endpoints.
170 struct ipa *ipa = priv->ipa; in ipa_modem_suspend()
174 ipa_endpoint_suspend_one(ipa->name_map[IPA_ENDPOINT_AP_MODEM_RX]); in ipa_modem_suspend()
175 ipa_endpoint_suspend_one(ipa->name_map[IPA_ENDPOINT_AP_MODEM_TX]); in ipa_modem_suspend()
178 /** ipa_modem_resume() - resume callback for runtime_pm
181 * Resume the modem's endpoints.
186 struct ipa *ipa = priv->ipa; in ipa_modem_resume()
188 ipa_endpoint_resume_one(ipa->name_map[IPA_ENDPOINT_AP_MODEM_TX]); in ipa_modem_resume()
189 ipa_endpoint_resume_one(ipa->name_map[IPA_ENDPOINT_AP_MODEM_RX]); in ipa_modem_resume()
201 /* Only attempt to start the modem if it's stopped */ in ipa_modem_start()
202 state = atomic_cmpxchg(&ipa->modem_state, IPA_MODEM_STATE_STOPPED, in ipa_modem_start()
212 ret = -ENOMEM; in ipa_modem_start()
216 ipa->name_map[IPA_ENDPOINT_AP_MODEM_TX]->netdev = netdev; in ipa_modem_start()
217 ipa->name_map[IPA_ENDPOINT_AP_MODEM_RX]->netdev = netdev; in ipa_modem_start()
219 SET_NETDEV_DEV(netdev, &ipa->pdev->dev); in ipa_modem_start()
221 priv->ipa = ipa; in ipa_modem_start()
227 ipa->modem_netdev = netdev; in ipa_modem_start()
231 atomic_set(&ipa->modem_state, IPA_MODEM_STATE_STOPPED); in ipa_modem_start()
233 atomic_set(&ipa->modem_state, IPA_MODEM_STATE_RUNNING); in ipa_modem_start()
241 struct net_device *netdev = ipa->modem_netdev; in ipa_modem_stop()
245 /* Only attempt to stop the modem if it's running */ in ipa_modem_stop()
246 state = atomic_cmpxchg(&ipa->modem_state, IPA_MODEM_STATE_RUNNING, in ipa_modem_stop()
255 return -EBUSY; in ipa_modem_stop()
257 /* Prevent the modem from triggering a call to ipa_setup() */ in ipa_modem_stop()
266 ipa->modem_netdev = NULL; in ipa_modem_stop()
275 atomic_set(&ipa->modem_state, IPA_MODEM_STATE_RUNNING); in ipa_modem_stop()
277 atomic_set(&ipa->modem_state, IPA_MODEM_STATE_STOPPED); in ipa_modem_stop()
283 /* Treat a "clean" modem stop the same as a crash */
286 struct device *dev = &ipa->pdev->dev; in ipa_modem_crashed()
307 dev_err(dev, "error %d stopping modem\n", ret); in ipa_modem_crashed()
309 /* Now prepare for the next modem boot */ in ipa_modem_crashed()
312 dev_err(dev, "error %d zeroing modem memory regions\n", ret); in ipa_modem_crashed()
320 struct device *dev = &ipa->pdev->dev; in ipa_modem_notify()
324 dev_info(dev, "received modem starting event\n"); in ipa_modem_notify()
329 dev_info(dev, "received modem running event\n"); in ipa_modem_notify()
333 dev_info(dev, "received modem %s event\n", in ipa_modem_notify()
334 notify_data->crashed ? "crashed" : "stopping"); in ipa_modem_notify()
335 if (ipa->setup_complete) in ipa_modem_notify()
340 dev_info(dev, "received modem offline event\n"); in ipa_modem_notify()
365 ipa->nb.notifier_call = ipa_modem_notify; in ipa_modem_config()
367 notifier = qcom_register_ssr_notifier("mpss", &ipa->nb); in ipa_modem_config()
371 ipa->notifier = notifier; in ipa_modem_config()
378 struct device *dev = &ipa->pdev->dev; in ipa_modem_deconfig()
381 ret = qcom_unregister_ssr_notifier(ipa->notifier, &ipa->nb); in ipa_modem_deconfig()
385 ipa->notifier = NULL; in ipa_modem_deconfig()
386 memset(&ipa->nb, 0, sizeof(ipa->nb)); in ipa_modem_deconfig()