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()
220 priv->ipa = ipa; in ipa_modem_start()
226 ipa->modem_netdev = netdev; in ipa_modem_start()
230 atomic_set(&ipa->modem_state, IPA_MODEM_STATE_STOPPED); in ipa_modem_start()
232 atomic_set(&ipa->modem_state, IPA_MODEM_STATE_RUNNING); in ipa_modem_start()
240 struct net_device *netdev = ipa->modem_netdev; in ipa_modem_stop()
244 /* Only attempt to stop the modem if it's running */ in ipa_modem_stop()
245 state = atomic_cmpxchg(&ipa->modem_state, IPA_MODEM_STATE_RUNNING, in ipa_modem_stop()
254 return -EBUSY; in ipa_modem_stop()
256 /* Prevent the modem from triggering a call to ipa_setup() */ in ipa_modem_stop()
265 ipa->modem_netdev = NULL; in ipa_modem_stop()
274 atomic_set(&ipa->modem_state, IPA_MODEM_STATE_RUNNING); in ipa_modem_stop()
276 atomic_set(&ipa->modem_state, IPA_MODEM_STATE_STOPPED); in ipa_modem_stop()
282 /* Treat a "clean" modem stop the same as a crash */
285 struct device *dev = &ipa->pdev->dev; in ipa_modem_crashed()
306 dev_err(dev, "error %d stopping modem\n", ret); in ipa_modem_crashed()
308 /* Now prepare for the next modem boot */ in ipa_modem_crashed()
311 dev_err(dev, "error %d zeroing modem memory regions\n", ret); in ipa_modem_crashed()
319 struct device *dev = &ipa->pdev->dev; in ipa_modem_notify()
323 dev_info(dev, "received modem starting event\n"); in ipa_modem_notify()
328 dev_info(dev, "received modem running event\n"); in ipa_modem_notify()
332 dev_info(dev, "received modem %s event\n", in ipa_modem_notify()
333 notify_data->crashed ? "crashed" : "stopping"); in ipa_modem_notify()
334 if (ipa->setup_complete) in ipa_modem_notify()
339 dev_info(dev, "received modem offline event\n"); in ipa_modem_notify()
364 ipa->nb.notifier_call = ipa_modem_notify; in ipa_modem_config()
366 notifier = qcom_register_ssr_notifier("mpss", &ipa->nb); in ipa_modem_config()
370 ipa->notifier = notifier; in ipa_modem_config()
377 struct device *dev = &ipa->pdev->dev; in ipa_modem_deconfig()
380 ret = qcom_unregister_ssr_notifier(ipa->notifier, &ipa->nb); in ipa_modem_deconfig()
384 ipa->notifier = NULL; in ipa_modem_deconfig()
385 memset(&ipa->nb, 0, sizeof(ipa->nb)); in ipa_modem_deconfig()