Lines Matching defs:mbim
46 struct mhi_mbim_context *mbim;
83 static struct mhi_mbim_link *mhi_mbim_get_link_rcu(struct mhi_mbim_context *mbim,
88 hlist_for_each_entry_rcu(link, &mbim->link_list[LINK_HASH(session)], hlnode) {
129 /* Datagram follows the mbim header */
143 struct mhi_mbim_context *mbim = link->mbim;
148 spin_lock_irqsave(&mbim->tx_lock, flags);
150 skb = mbim_tx_fixup(skb, link->session, mbim->tx_seq);
154 err = mhi_queue_skb(mbim->mdev, DMA_TO_DEVICE, skb, skb->len, MHI_EOT);
156 if (mhi_queue_is_full(mbim->mdev, DMA_TO_DEVICE))
160 mbim->tx_seq++;
163 spin_unlock_irqrestore(&mbim->tx_lock, flags);
182 static int mbim_rx_verify_nth16(struct mhi_mbim_context *mbim, struct sk_buff *skb)
209 if (mbim->rx_seq + 1 != le16_to_cpu(nth16->wSequence) &&
210 (mbim->rx_seq || le16_to_cpu(nth16->wSequence)) &&
211 !(mbim->rx_seq == 0xffff && !le16_to_cpu(nth16->wSequence))) {
213 mbim->rx_seq, le16_to_cpu(nth16->wSequence));
215 mbim->rx_seq = le16_to_cpu(nth16->wSequence);
243 static void mhi_mbim_rx(struct mhi_mbim_context *mbim, struct sk_buff *skb)
248 ndpoffset = mbim_rx_verify_nth16(mbim, skb);
250 net_err_ratelimited("mbim: Incorrect NTB header\n");
263 net_err_ratelimited("mbim: Incorrect NDP offset (%u)\n",
271 net_err_ratelimited("mbim: Incorrect NDP16\n");
278 net_err_ratelimited("mbim: Unsupported NDP type\n");
286 link = mhi_mbim_get_link_rcu(mbim, session);
288 net_err_ratelimited("mbim: bad packet session (%u)\n", session);
354 static struct sk_buff *mhi_net_skb_agg(struct mhi_mbim_context *mbim,
357 struct sk_buff *head = mbim->skbagg_head;
358 struct sk_buff *tail = mbim->skbagg_tail;
362 mbim->skbagg_head = skb;
375 mbim->skbagg_tail = skb;
377 return mbim->skbagg_head;
382 struct mhi_mbim_context *mbim = container_of(work, struct mhi_mbim_context,
384 struct mhi_device *mdev = mbim->mdev;
388 struct sk_buff *skb = alloc_skb(mbim->mru, GFP_KERNEL);
394 mbim->mru, MHI_EOT);
407 if (mhi_get_free_desc_count(mdev, DMA_FROM_DEVICE) == mbim->rx_queue_sz)
408 schedule_delayed_work(&mbim->rx_refill, HZ / 2);
414 struct mhi_mbim_context *mbim = dev_get_drvdata(&mhi_dev->dev);
425 mhi_net_skb_agg(mbim, skb);
438 if (mbim->skbagg_head) {
440 skb = mhi_net_skb_agg(mbim, skb);
441 mbim->skbagg_head = NULL;
444 mhi_mbim_rx(mbim, skb);
448 if (free_desc_count >= mbim->rx_queue_sz / 2)
449 schedule_delayed_work(&mbim->rx_refill, 0);
477 struct mhi_mbim_context *mbim = dev_get_drvdata(&mhi_dev->dev);
502 if (netif_queue_stopped(ndev) && !mhi_queue_is_full(mbim->mdev, DMA_TO_DEVICE))
511 schedule_delayed_work(&link->mbim->rx_refill, 0);
540 struct mhi_mbim_context *mbim = ctxt;
543 link->mbim = mbim;
549 if (mhi_mbim_get_link_rcu(mbim, if_id)) {
556 hlist_add_head_rcu(&link->hlnode, &mbim->link_list[LINK_HASH(if_id)]);
598 struct mhi_mbim_context *mbim;
601 mbim = devm_kzalloc(&mhi_dev->dev, sizeof(*mbim), GFP_KERNEL);
602 if (!mbim)
605 spin_lock_init(&mbim->tx_lock);
606 dev_set_drvdata(&mhi_dev->dev, mbim);
607 mbim->mdev = mhi_dev;
608 mbim->mru = mhi_dev->mhi_cntrl->mru ? mhi_dev->mhi_cntrl->mru : MHI_DEFAULT_MRU;
610 INIT_DELAYED_WORK(&mbim->rx_refill, mhi_net_rx_refill_work);
618 mbim->rx_queue_sz = mhi_get_free_desc_count(mhi_dev, DMA_FROM_DEVICE);
621 return wwan_register_ops(&cntrl->mhi_dev->dev, &mhi_mbim_wwan_ops, mbim, 0);
626 struct mhi_mbim_context *mbim = dev_get_drvdata(&mhi_dev->dev);
630 cancel_delayed_work_sync(&mbim->rx_refill);
632 kfree_skb(mbim->skbagg_head);