• [PATCH v3 14/19] thunderbolt: Add polling mode for rings

    From Mika Westerberg@21:1/5 to All on Mon Oct 2 12:50:01 2017
    In order to support things like networking over Thunderbolt cable, there
    needs to be a way to switch the ring to a mode where it can be polled
    with the interrupt masked. We implement such mode so that the caller can allocate a ring by passing pointer to a function that is then called
    when an interrupt is triggered. Completed frames can be fetched using tb_ring_poll() and the interrupt can be re-enabled when the caller is
    finished with polling by using tb_ring_poll_complete().

    Signed-off-by: Mika Westerberg <[email protected]>
    Reviewed-by: Michael Jamet <[email protected]>
    Reviewed-by: Yehezkel Bernat <[email protected]>
    Reviewed-by: Andy Shevchenko <[email protected]>
    ---
    drivers/thunderbolt/ctl.c | 2 +-
    drivers/thunderbolt/nhi.c | 126 ++++++++++++++++++++++++++++++++++++++++----
    include/linux/thunderbolt.h | 23 +++++---
    3 files changed, 134 insertions(+), 17 deletions(-)

    diff --git a/drivers/thunderbolt/ctl.c b/drivers/thunderbolt/ctl.c
    index dd10789e1dbb..d079dbba2c03 100644
    --- a/drivers/thunderbolt/ctl.c
    +++ b/drivers/thunderbolt/ctl.c
    @@ -619,7 +619,7 @@ struct tb_ctl *tb_ctl_alloc(struct tb_nhi *nhi, event_cb cb, void *cb_data)
    goto err;

    ctl->rx = tb_ring_alloc_rx(nhi, 0, 10, RING_FLAG_NO_SUSPEND, 0xffff,
    - 0xffff);
    + 0xffff, NULL, NULL);
    if (!ctl->rx)
    goto err;

    diff --git a/drivers/thunderbolt/nhi.c b/drivers/thunderbolt/nhi.c
    index 0b3c0640048b..af0a80ddf594 100644
    --- a/drivers/thunderbolt/nhi.c
    +++ b/drivers/thunderbolt/nhi.c
    @@ -252,7 +252,8 @@ static void ring_work(struct work_struct *work)
    * Do not hold on to it.
    */
    list_del_init(&frame->list);
    - frame->callback(ring, frame, canceled);
    + if