Lines Matching full:mbus
74 struct mctp_i3c_bus *mbus; member
103 struct net_device_stats *stats = &mi->mbus->ndev->stats; in mctp_i3c_read()
110 skb = netdev_alloc_skb(mi->mbus->ndev, in mctp_i3c_read()
123 put_unaligned_be48(mi->mbus->pid, ihdr->dest); in mctp_i3c_read()
255 static int mctp_i3c_add_device(struct mctp_i3c_bus *mbus, in mctp_i3c_add_device() argument
267 mi->mbus = mbus; in mctp_i3c_add_device()
270 list_add(&mi->list, &mbus->devs); in mctp_i3c_add_device()
290 struct mctp_i3c_bus *b = NULL, *mbus = NULL; in mctp_i3c_probe() local
296 mbus = b; in mctp_i3c_probe()
301 if (!mbus) { in mctp_i3c_probe()
306 return mctp_i3c_add_device(mbus, i3c); in mctp_i3c_probe()
345 mctp_i3c_lookup(struct mctp_i3c_bus *mbus, u64 pid) in mctp_i3c_lookup() argument
350 list_for_each_entry(mi, &mbus->devs, list) in mctp_i3c_lookup()
360 static void mctp_i3c_xmit(struct mctp_i3c_bus *mbus, struct sk_buff *skb) in mctp_i3c_xmit() argument
362 struct net_device_stats *stats = &mbus->ndev->stats; in mctp_i3c_xmit()
378 mi = mctp_i3c_lookup(mbus, pid); in mctp_i3c_xmit()
401 skb_copy_bits(skb, 0, mbus->tx_scratch, skb->len); in mctp_i3c_xmit()
402 data = mbus->tx_scratch; in mctp_i3c_xmit()
427 struct mctp_i3c_bus *mbus = data; in mctp_i3c_tx_thread() local
434 spin_lock_bh(&mbus->tx_lock); in mctp_i3c_tx_thread()
435 skb = mbus->tx_skb; in mctp_i3c_tx_thread()
436 mbus->tx_skb = NULL; in mctp_i3c_tx_thread()
437 spin_unlock_bh(&mbus->tx_lock); in mctp_i3c_tx_thread()
439 if (netif_queue_stopped(mbus->ndev)) in mctp_i3c_tx_thread()
440 netif_wake_queue(mbus->ndev); in mctp_i3c_tx_thread()
443 mctp_i3c_xmit(mbus, skb); in mctp_i3c_tx_thread()
446 wait_event_idle(mbus->tx_wq, in mctp_i3c_tx_thread()
447 mbus->tx_skb || kthread_should_stop()); in mctp_i3c_tx_thread()
457 struct mctp_i3c_bus *mbus = netdev_priv(ndev); in mctp_i3c_start_xmit() local
460 spin_lock(&mbus->tx_lock); in mctp_i3c_start_xmit()
462 if (mbus->tx_skb) { in mctp_i3c_start_xmit()
466 mbus->tx_skb = skb; in mctp_i3c_start_xmit()
469 spin_unlock(&mbus->tx_lock); in mctp_i3c_start_xmit()
472 wake_up(&mbus->tx_wq); in mctp_i3c_start_xmit()
477 static void mctp_i3c_bus_free(struct mctp_i3c_bus *mbus) in mctp_i3c_bus_free() argument
482 if (mbus->tx_thread) { in mctp_i3c_bus_free()
483 kthread_stop(mbus->tx_thread); in mctp_i3c_bus_free()
484 mbus->tx_thread = NULL; in mctp_i3c_bus_free()
488 list_for_each_entry_safe(mi, tmp, &mbus->devs, list) { in mctp_i3c_bus_free()
492 kfree_skb(mbus->tx_skb); in mctp_i3c_bus_free()
493 list_del(&mbus->list); in mctp_i3c_bus_free()
498 struct mctp_i3c_bus *mbus = netdev_priv(ndev); in mctp_i3c_ndo_uninit() local
501 mctp_i3c_bus_free(mbus); in mctp_i3c_ndo_uninit()
579 struct mctp_i3c_bus *mbus = NULL; in mctp_i3c_bus_add() local
589 ndev = alloc_netdev(sizeof(*mbus), namebuf, NET_NAME_ENUM, in mctp_i3c_bus_add()
596 mbus = netdev_priv(ndev); in mctp_i3c_bus_add()
597 mbus->ndev = ndev; in mctp_i3c_bus_add()
598 mbus->bus = bus; in mctp_i3c_bus_add()
599 INIT_LIST_HEAD(&mbus->devs); in mctp_i3c_bus_add()
600 list_add(&mbus->list, &busdevs); in mctp_i3c_bus_add()
602 rc = mctp_i3c_bus_local_pid(bus, &mbus->pid); in mctp_i3c_bus_add()
607 put_unaligned_be48(mbus->pid, addr); in mctp_i3c_bus_add()
610 init_waitqueue_head(&mbus->tx_wq); in mctp_i3c_bus_add()
611 spin_lock_init(&mbus->tx_lock); in mctp_i3c_bus_add()
612 mbus->tx_thread = kthread_run(mctp_i3c_tx_thread, mbus, in mctp_i3c_bus_add()
614 if (IS_ERR(mbus->tx_thread)) { in mctp_i3c_bus_add()
616 mbus->tx_thread); in mctp_i3c_bus_add()
617 rc = PTR_ERR(mbus->tx_thread); in mctp_i3c_bus_add()
618 mbus->tx_thread = NULL; in mctp_i3c_bus_add()
627 return mbus; in mctp_i3c_bus_add()
631 * so we perform the same mbus cleanup manually. in mctp_i3c_bus_add()
633 mctp_i3c_bus_free(mbus); in mctp_i3c_bus_add()
642 static void mctp_i3c_bus_remove(struct mctp_i3c_bus *mbus) in mctp_i3c_bus_remove() argument
646 mctp_unregister_netdev(mbus->ndev); in mctp_i3c_bus_remove()
648 free_netdev(mbus->ndev); in mctp_i3c_bus_remove()
649 /* mbus is deallocated */ in mctp_i3c_bus_remove()
655 struct mctp_i3c_bus *mbus = NULL, *tmp = NULL; in mctp_i3c_bus_remove_all() local
658 list_for_each_entry_safe(mbus, tmp, &busdevs, list) { in mctp_i3c_bus_remove_all()
659 mctp_i3c_bus_remove(mbus); in mctp_i3c_bus_remove_all()
669 struct mctp_i3c_bus *mbus = NULL, *tmp = NULL; in mctp_i3c_bus_add_new() local
673 list_for_each_entry_safe(mbus, tmp, &busdevs, list) in mctp_i3c_bus_add_new()
674 if (mbus->bus == bus) in mctp_i3c_bus_add_new()
688 struct mctp_i3c_bus *mbus = NULL, *tmp; in mctp_i3c_notify_bus_remove() local
691 list_for_each_entry_safe(mbus, tmp, &busdevs, list) in mctp_i3c_notify_bus_remove()
692 if (mbus->bus == bus) in mctp_i3c_notify_bus_remove()
693 mctp_i3c_bus_remove(mbus); in mctp_i3c_notify_bus_remove()