Lines Matching refs:midev

109 static int mctp_i2c_recv(struct mctp_i2c_dev *midev);
207 struct mctp_i2c_dev *midev) in __mctp_i2c_device_select() argument
210 if (midev) in __mctp_i2c_device_select()
211 dev_hold(midev->ndev); in __mctp_i2c_device_select()
214 mcli->sel = midev; in __mctp_i2c_device_select()
219 struct mctp_i2c_dev *midev) in mctp_i2c_device_select() argument
224 __mctp_i2c_device_select(mcli, midev); in mctp_i2c_device_select()
232 struct mctp_i2c_dev *midev = NULL; in mctp_i2c_slave_cb() local
237 midev = mcli->sel; in mctp_i2c_slave_cb()
238 if (midev) in mctp_i2c_slave_cb()
239 dev_hold(midev->ndev); in mctp_i2c_slave_cb()
242 if (!midev) in mctp_i2c_slave_cb()
247 if (midev->rx_pos < MCTP_I2C_BUFSZ) { in mctp_i2c_slave_cb()
248 midev->rx_buffer[midev->rx_pos] = *val; in mctp_i2c_slave_cb()
249 midev->rx_pos++; in mctp_i2c_slave_cb()
251 midev->ndev->stats.rx_over_errors++; in mctp_i2c_slave_cb()
257 midev->rx_buffer[0] = mcli->lladdr << 1; in mctp_i2c_slave_cb()
258 midev->rx_pos = 1; in mctp_i2c_slave_cb()
261 rc = mctp_i2c_recv(midev); in mctp_i2c_slave_cb()
267 dev_put(midev->ndev); in mctp_i2c_slave_cb()
272 static int mctp_i2c_recv(struct mctp_i2c_dev *midev) in mctp_i2c_recv() argument
274 struct net_device *ndev = midev->ndev; in mctp_i2c_recv()
284 if (midev->rx_pos < MCTP_I2C_MINLEN + 1) { in mctp_i2c_recv()
289 recvlen = midev->rx_pos - 1; in mctp_i2c_recv()
291 hdr = (void *)midev->rx_buffer; in mctp_i2c_recv()
302 pec = midev->rx_buffer[midev->rx_pos - 1]; in mctp_i2c_recv()
303 calc_pec = i2c_smbus_pec(0, midev->rx_buffer, recvlen); in mctp_i2c_recv()
316 skb_put_data(skb, midev->rx_buffer, recvlen); in mctp_i2c_recv()
328 spin_lock_irqsave(&midev->lock, flags); in mctp_i2c_recv()
329 if (midev->allow_rx) { in mctp_i2c_recv()
330 reinit_completion(&midev->rx_done); in mctp_i2c_recv()
331 spin_unlock_irqrestore(&midev->lock, flags); in mctp_i2c_recv()
334 complete(&midev->rx_done); in mctp_i2c_recv()
337 spin_unlock_irqrestore(&midev->lock, flags); in mctp_i2c_recv()
357 mctp_i2c_get_tx_flow_state(struct mctp_i2c_dev *midev, struct sk_buff *skb) in mctp_i2c_get_tx_flow_state() argument
401 static void mctp_i2c_lock_nest(struct mctp_i2c_dev *midev) in mctp_i2c_lock_nest() argument
406 spin_lock_irqsave(&midev->lock, flags); in mctp_i2c_lock_nest()
407 lock = midev->i2c_lock_count == 0; in mctp_i2c_lock_nest()
408 midev->i2c_lock_count++; in mctp_i2c_lock_nest()
409 spin_unlock_irqrestore(&midev->lock, flags); in mctp_i2c_lock_nest()
412 i2c_lock_bus(midev->adapter, I2C_LOCK_SEGMENT); in mctp_i2c_lock_nest()
415 static void mctp_i2c_unlock_nest(struct mctp_i2c_dev *midev) in mctp_i2c_unlock_nest() argument
420 spin_lock_irqsave(&midev->lock, flags); in mctp_i2c_unlock_nest()
421 if (!WARN_ONCE(midev->i2c_lock_count == 0, "lock count underflow!")) in mctp_i2c_unlock_nest()
422 midev->i2c_lock_count--; in mctp_i2c_unlock_nest()
423 unlock = midev->i2c_lock_count == 0; in mctp_i2c_unlock_nest()
424 spin_unlock_irqrestore(&midev->lock, flags); in mctp_i2c_unlock_nest()
427 i2c_unlock_bus(midev->adapter, I2C_LOCK_SEGMENT); in mctp_i2c_unlock_nest()
431 static void mctp_i2c_unlock_reset(struct mctp_i2c_dev *midev) in mctp_i2c_unlock_reset() argument
436 spin_lock_irqsave(&midev->lock, flags); in mctp_i2c_unlock_reset()
437 unlock = midev->i2c_lock_count > 0; in mctp_i2c_unlock_reset()
438 midev->i2c_lock_count = 0; in mctp_i2c_unlock_reset()
439 spin_unlock_irqrestore(&midev->lock, flags); in mctp_i2c_unlock_reset()
442 i2c_unlock_bus(midev->adapter, I2C_LOCK_SEGMENT); in mctp_i2c_unlock_reset()
445 static void mctp_i2c_xmit(struct mctp_i2c_dev *midev, struct sk_buff *skb) in mctp_i2c_xmit() argument
447 struct net_device_stats *stats = &midev->ndev->stats; in mctp_i2c_xmit()
454 fs = mctp_i2c_get_tx_flow_state(midev, skb); in mctp_i2c_xmit()
461 dev_warn_ratelimited(&midev->adapter->dev, in mctp_i2c_xmit()
472 skb_copy_bits(skb, 0, midev->tx_scratch, skb->len); in mctp_i2c_xmit()
473 hdr = (void *)midev->tx_scratch; in mctp_i2c_xmit()
486 mctp_i2c_lock_nest(midev); in mctp_i2c_xmit()
487 mctp_i2c_device_select(midev->client, midev); in mctp_i2c_xmit()
488 rc = __i2c_transfer(midev->adapter, &msg, 1); in mctp_i2c_xmit()
489 mctp_i2c_unlock_nest(midev); in mctp_i2c_xmit()
496 mctp_i2c_lock_nest(midev); in mctp_i2c_xmit()
497 mctp_i2c_device_select(midev->client, midev); in mctp_i2c_xmit()
502 rc = __i2c_transfer(midev->adapter, &msg, 1); in mctp_i2c_xmit()
510 dev_warn_ratelimited(&midev->adapter->dev, in mctp_i2c_xmit()
519 static void mctp_i2c_flow_release(struct mctp_i2c_dev *midev) in mctp_i2c_flow_release() argument
524 spin_lock_irqsave(&midev->lock, flags); in mctp_i2c_flow_release()
525 if (midev->release_count > midev->i2c_lock_count) { in mctp_i2c_flow_release()
527 midev->release_count = midev->i2c_lock_count; in mctp_i2c_flow_release()
530 midev->i2c_lock_count -= midev->release_count; in mctp_i2c_flow_release()
531 unlock = midev->i2c_lock_count == 0 && midev->release_count > 0; in mctp_i2c_flow_release()
532 midev->release_count = 0; in mctp_i2c_flow_release()
533 spin_unlock_irqrestore(&midev->lock, flags); in mctp_i2c_flow_release()
536 i2c_unlock_bus(midev->adapter, I2C_LOCK_SEGMENT); in mctp_i2c_flow_release()
568 struct mctp_i2c_dev *midev = data; in mctp_i2c_tx_thread() local
576 spin_lock_irqsave(&midev->tx_queue.lock, flags); in mctp_i2c_tx_thread()
577 skb = __skb_dequeue(&midev->tx_queue); in mctp_i2c_tx_thread()
578 if (netif_queue_stopped(midev->ndev)) in mctp_i2c_tx_thread()
579 netif_wake_queue(midev->ndev); in mctp_i2c_tx_thread()
580 spin_unlock_irqrestore(&midev->tx_queue.lock, flags); in mctp_i2c_tx_thread()
582 if (skb == &midev->unlock_marker) { in mctp_i2c_tx_thread()
583 mctp_i2c_flow_release(midev); in mctp_i2c_tx_thread()
586 mctp_i2c_xmit(midev, skb); in mctp_i2c_tx_thread()
590 wait_event_idle(midev->tx_wq, in mctp_i2c_tx_thread()
591 !skb_queue_empty(&midev->tx_queue) || in mctp_i2c_tx_thread()
602 struct mctp_i2c_dev *midev = netdev_priv(dev); in mctp_i2c_start_xmit() local
605 spin_lock_irqsave(&midev->tx_queue.lock, flags); in mctp_i2c_start_xmit()
606 if (skb_queue_len(&midev->tx_queue) >= MCTP_I2C_TX_WORK_LEN) { in mctp_i2c_start_xmit()
608 spin_unlock_irqrestore(&midev->tx_queue.lock, flags); in mctp_i2c_start_xmit()
613 __skb_queue_tail(&midev->tx_queue, skb); in mctp_i2c_start_xmit()
614 if (skb_queue_len(&midev->tx_queue) == MCTP_I2C_TX_WORK_LEN) in mctp_i2c_start_xmit()
616 spin_unlock_irqrestore(&midev->tx_queue.lock, flags); in mctp_i2c_start_xmit()
618 wake_up(&midev->tx_wq); in mctp_i2c_start_xmit()
626 struct mctp_i2c_dev *midev = netdev_priv(mdev->dev); in mctp_i2c_release_flow() local
630 spin_lock_irqsave(&midev->lock, flags); in mctp_i2c_release_flow()
635 midev->release_count++; in mctp_i2c_release_flow()
639 spin_unlock_irqrestore(&midev->lock, flags); in mctp_i2c_release_flow()
645 spin_lock(&midev->tx_queue.lock); in mctp_i2c_release_flow()
646 if (!midev->unlock_marker.next) in mctp_i2c_release_flow()
647 __skb_queue_tail(&midev->tx_queue, in mctp_i2c_release_flow()
648 &midev->unlock_marker); in mctp_i2c_release_flow()
649 spin_unlock(&midev->tx_queue.lock); in mctp_i2c_release_flow()
650 wake_up(&midev->tx_wq); in mctp_i2c_release_flow()
691 struct mctp_i2c_dev *midev = netdev_priv(dev); in mctp_i2c_midev_init() local
694 midev->tx_thread = kthread_create(mctp_i2c_tx_thread, midev, in mctp_i2c_midev_init()
696 if (IS_ERR(midev->tx_thread)) in mctp_i2c_midev_init()
697 return ERR_CAST(midev->tx_thread); in mctp_i2c_midev_init()
699 midev->ndev = dev; in mctp_i2c_midev_init()
701 midev->adapter = adap; in mctp_i2c_midev_init()
703 midev->client = mcli; in mctp_i2c_midev_init()
704 INIT_LIST_HEAD(&midev->list); in mctp_i2c_midev_init()
705 spin_lock_init(&midev->lock); in mctp_i2c_midev_init()
706 midev->i2c_lock_count = 0; in mctp_i2c_midev_init()
707 midev->release_count = 0; in mctp_i2c_midev_init()
708 init_completion(&midev->rx_done); in mctp_i2c_midev_init()
709 complete(&midev->rx_done); in mctp_i2c_midev_init()
710 init_waitqueue_head(&midev->tx_wq); in mctp_i2c_midev_init()
711 skb_queue_head_init(&midev->tx_queue); in mctp_i2c_midev_init()
715 list_add(&midev->list, &mcli->devs); in mctp_i2c_midev_init()
718 __mctp_i2c_device_select(mcli, midev); in mctp_i2c_midev_init()
722 wake_up_process(midev->tx_thread); in mctp_i2c_midev_init()
724 return midev; in mctp_i2c_midev_init()
728 static void mctp_i2c_midev_free(struct mctp_i2c_dev *midev) in mctp_i2c_midev_free() argument
730 struct mctp_i2c_client *mcli = midev->client; in mctp_i2c_midev_free()
733 if (midev->tx_thread) { in mctp_i2c_midev_free()
734 kthread_stop(midev->tx_thread); in mctp_i2c_midev_free()
735 midev->tx_thread = NULL; in mctp_i2c_midev_free()
739 mctp_i2c_unlock_reset(midev); in mctp_i2c_midev_free()
743 list_del(&midev->list); in mctp_i2c_midev_free()
744 if (mcli->sel == midev) { in mctp_i2c_midev_free()
752 skb_queue_purge(&midev->tx_queue); in mctp_i2c_midev_free()
753 put_device(&midev->adapter->dev); in mctp_i2c_midev_free()
758 static void mctp_i2c_unregister(struct mctp_i2c_dev *midev) in mctp_i2c_unregister() argument
763 kthread_stop(midev->tx_thread); in mctp_i2c_unregister()
764 midev->tx_thread = NULL; in mctp_i2c_unregister()
767 spin_lock_irqsave(&midev->lock, flags); in mctp_i2c_unregister()
768 midev->allow_rx = false; in mctp_i2c_unregister()
769 spin_unlock_irqrestore(&midev->lock, flags); in mctp_i2c_unregister()
770 wait_for_completion(&midev->rx_done); in mctp_i2c_unregister()
772 mctp_unregister_netdev(midev->ndev); in mctp_i2c_unregister()
775 free_netdev(midev->ndev); in mctp_i2c_unregister()
780 struct mctp_i2c_dev *midev = netdev_priv(dev); in mctp_i2c_ndo_uninit() local
786 mctp_i2c_midev_free(midev); in mctp_i2c_ndo_uninit()
791 struct mctp_i2c_dev *midev = netdev_priv(dev); in mctp_i2c_ndo_open() local
795 spin_lock_irqsave(&midev->lock, flags); in mctp_i2c_ndo_open()
796 midev->allow_rx = true; in mctp_i2c_ndo_open()
797 spin_unlock_irqrestore(&midev->lock, flags); in mctp_i2c_ndo_open()
805 struct mctp_i2c_dev *midev = NULL; in mctp_i2c_add_netdev() local
822 ndev = alloc_netdev(sizeof(*midev), namebuf, NET_NAME_ENUM, mctp_i2c_net_setup); in mctp_i2c_add_netdev()
832 midev = mctp_i2c_midev_init(ndev, mcli, adap); in mctp_i2c_add_netdev()
833 if (IS_ERR(midev)) { in mctp_i2c_add_netdev()
834 rc = PTR_ERR(midev); in mctp_i2c_add_netdev()
835 midev = NULL; in mctp_i2c_add_netdev()
847 spin_lock_irqsave(&midev->lock, flags); in mctp_i2c_add_netdev()
848 midev->allow_rx = false; in mctp_i2c_add_netdev()
849 spin_unlock_irqrestore(&midev->lock, flags); in mctp_i2c_add_netdev()
853 if (midev) in mctp_i2c_add_netdev()
854 mctp_i2c_midev_free(midev); in mctp_i2c_add_netdev()
864 struct mctp_i2c_dev *midev = NULL, *m = NULL; in mctp_i2c_remove_netdev() local
872 midev = m; in mctp_i2c_remove_netdev()
877 if (midev) in mctp_i2c_remove_netdev()
878 mctp_i2c_unregister(midev); in mctp_i2c_remove_netdev()
1009 struct mctp_i2c_dev *midev = NULL, *tmp = NULL; in mctp_i2c_remove() local
1014 list_for_each_entry_safe(midev, tmp, &mcli->devs, list) in mctp_i2c_remove()
1015 mctp_i2c_unregister(midev); in mctp_i2c_remove()