Lines Matching refs:mhiwwan

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