Lines Matching refs:mhiwwan
42 static void mhi_wwan_rx_budget_inc(struct mhi_wwan_dev *mhiwwan) in mhi_wwan_rx_budget_inc() argument
44 spin_lock_bh(&mhiwwan->rx_lock); in mhi_wwan_rx_budget_inc()
46 mhiwwan->rx_budget++; in mhi_wwan_rx_budget_inc()
48 if (test_bit(MHI_WWAN_RX_REFILL, &mhiwwan->flags)) in mhi_wwan_rx_budget_inc()
49 schedule_work(&mhiwwan->rx_refill); in mhi_wwan_rx_budget_inc()
51 spin_unlock_bh(&mhiwwan->rx_lock); in mhi_wwan_rx_budget_inc()
55 static bool mhi_wwan_rx_budget_dec(struct mhi_wwan_dev *mhiwwan) in mhi_wwan_rx_budget_dec() argument
59 spin_lock_bh(&mhiwwan->rx_lock); in mhi_wwan_rx_budget_dec()
61 if (mhiwwan->rx_budget) { in mhi_wwan_rx_budget_dec()
62 mhiwwan->rx_budget--; in mhi_wwan_rx_budget_dec()
63 if (test_bit(MHI_WWAN_RX_REFILL, &mhiwwan->flags)) in mhi_wwan_rx_budget_dec()
67 spin_unlock_bh(&mhiwwan->rx_lock); in mhi_wwan_rx_budget_dec()
80 struct mhi_wwan_dev *mhiwwan = container_of(work, struct mhi_wwan_dev, rx_refill); in mhi_wwan_ctrl_refill_work() local
81 struct mhi_device *mhi_dev = mhiwwan->mhi_dev; in mhi_wwan_ctrl_refill_work()
83 while (mhi_wwan_rx_budget_dec(mhiwwan)) { in mhi_wwan_ctrl_refill_work()
86 skb = alloc_skb(mhiwwan->mtu, GFP_KERNEL); in mhi_wwan_ctrl_refill_work()
88 mhi_wwan_rx_budget_inc(mhiwwan); in mhi_wwan_ctrl_refill_work()
97 skb_shinfo(skb)->destructor_arg = mhiwwan; in mhi_wwan_ctrl_refill_work()
99 if (mhi_queue_skb(mhi_dev, DMA_FROM_DEVICE, skb, mhiwwan->mtu, MHI_EOT)) { in mhi_wwan_ctrl_refill_work()
109 struct mhi_wwan_dev *mhiwwan = wwan_port_get_drvdata(port); in mhi_wwan_ctrl_start() local
113 ret = mhi_prepare_for_transfer(mhiwwan->mhi_dev); in mhi_wwan_ctrl_start()
118 mhiwwan->rx_budget = mhi_get_free_desc_count(mhiwwan->mhi_dev, DMA_FROM_DEVICE); in mhi_wwan_ctrl_start()
121 if (test_bit(MHI_WWAN_DL_CAP, &mhiwwan->flags)) { in mhi_wwan_ctrl_start()
122 set_bit(MHI_WWAN_RX_REFILL, &mhiwwan->flags); in mhi_wwan_ctrl_start()
123 mhi_wwan_ctrl_refill_work(&mhiwwan->rx_refill); in mhi_wwan_ctrl_start()
131 struct mhi_wwan_dev *mhiwwan = wwan_port_get_drvdata(port); in mhi_wwan_ctrl_stop() local
133 spin_lock_bh(&mhiwwan->rx_lock); in mhi_wwan_ctrl_stop()
134 clear_bit(MHI_WWAN_RX_REFILL, &mhiwwan->flags); in mhi_wwan_ctrl_stop()
135 spin_unlock_bh(&mhiwwan->rx_lock); in mhi_wwan_ctrl_stop()
137 cancel_work_sync(&mhiwwan->rx_refill); in mhi_wwan_ctrl_stop()
139 mhi_unprepare_from_transfer(mhiwwan->mhi_dev); in mhi_wwan_ctrl_stop()
144 struct mhi_wwan_dev *mhiwwan = wwan_port_get_drvdata(port); in mhi_wwan_ctrl_tx() local
147 if (skb->len > mhiwwan->mtu) in mhi_wwan_ctrl_tx()
150 if (!test_bit(MHI_WWAN_UL_CAP, &mhiwwan->flags)) in mhi_wwan_ctrl_tx()
154 spin_lock_bh(&mhiwwan->tx_lock); in mhi_wwan_ctrl_tx()
155 ret = mhi_queue_skb(mhiwwan->mhi_dev, DMA_TO_DEVICE, skb, skb->len, MHI_EOT); in mhi_wwan_ctrl_tx()
156 if (mhi_queue_is_full(mhiwwan->mhi_dev, DMA_TO_DEVICE)) in mhi_wwan_ctrl_tx()
158 spin_unlock_bh(&mhiwwan->tx_lock); in mhi_wwan_ctrl_tx()
172 struct mhi_wwan_dev *mhiwwan = dev_get_drvdata(&mhi_dev->dev); in mhi_ul_xfer_cb() local
173 struct wwan_port *port = mhiwwan->wwan_port; in mhi_ul_xfer_cb()
183 spin_lock_bh(&mhiwwan->tx_lock); in mhi_ul_xfer_cb()
184 if (!mhi_queue_is_full(mhiwwan->mhi_dev, DMA_TO_DEVICE)) in mhi_ul_xfer_cb()
186 spin_unlock_bh(&mhiwwan->tx_lock); in mhi_ul_xfer_cb()
192 struct mhi_wwan_dev *mhiwwan = dev_get_drvdata(&mhi_dev->dev); in mhi_dl_xfer_cb() local
193 struct wwan_port *port = mhiwwan->wwan_port; in mhi_dl_xfer_cb()
218 struct mhi_wwan_dev *mhiwwan; in mhi_wwan_ctrl_probe() local
221 mhiwwan = kzalloc(sizeof(*mhiwwan), GFP_KERNEL); in mhi_wwan_ctrl_probe()
222 if (!mhiwwan) in mhi_wwan_ctrl_probe()
225 mhiwwan->mhi_dev = mhi_dev; in mhi_wwan_ctrl_probe()
226 mhiwwan->mtu = MHI_WWAN_MAX_MTU; in mhi_wwan_ctrl_probe()
227 INIT_WORK(&mhiwwan->rx_refill, mhi_wwan_ctrl_refill_work); in mhi_wwan_ctrl_probe()
228 spin_lock_init(&mhiwwan->tx_lock); in mhi_wwan_ctrl_probe()
229 spin_lock_init(&mhiwwan->rx_lock); in mhi_wwan_ctrl_probe()
232 set_bit(MHI_WWAN_DL_CAP, &mhiwwan->flags); in mhi_wwan_ctrl_probe()
234 set_bit(MHI_WWAN_UL_CAP, &mhiwwan->flags); in mhi_wwan_ctrl_probe()
236 dev_set_drvdata(&mhi_dev->dev, mhiwwan); in mhi_wwan_ctrl_probe()
240 &wwan_pops, NULL, mhiwwan); in mhi_wwan_ctrl_probe()
242 kfree(mhiwwan); in mhi_wwan_ctrl_probe()
246 mhiwwan->wwan_port = port; in mhi_wwan_ctrl_probe()
253 struct mhi_wwan_dev *mhiwwan = dev_get_drvdata(&mhi_dev->dev); in mhi_wwan_ctrl_remove() local
255 wwan_remove_port(mhiwwan->wwan_port); in mhi_wwan_ctrl_remove()
256 kfree(mhiwwan); in mhi_wwan_ctrl_remove()