lkml.org 
[lkml]   [2023]   [Oct]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v9 06/34] usb: host: xhci-mem: Allow for interrupter clients to choose specific index
    Date
    Some clients may operate only on a specific XHCI interrupter instance.
    Allow for the associated class driver to request for the interrupter that
    it requires.

    Signed-off-by: Wesley Cheng <quic_wcheng@quicinc.com>
    ---
    drivers/usb/host/xhci-mem.c | 30 ++++++++++++++++--------------
    drivers/usb/host/xhci-sideband.c | 5 +++--
    drivers/usb/host/xhci.h | 3 ++-
    include/linux/usb/xhci-sideband.h | 3 ++-
    4 files changed, 23 insertions(+), 18 deletions(-)

    diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c
    index b8936daf6cf5..3d6ee70bd6f7 100644
    --- a/drivers/usb/host/xhci-mem.c
    +++ b/drivers/usb/host/xhci-mem.c
    @@ -2343,7 +2343,7 @@ xhci_add_interrupter(struct xhci_hcd *xhci, struct xhci_interrupter *ir,
    }

    struct xhci_interrupter *
    -xhci_create_secondary_interrupter(struct usb_hcd *hcd)
    +xhci_create_secondary_interrupter(struct usb_hcd *hcd, int intr_num)
    {
    struct xhci_hcd *xhci = hcd_to_xhci(hcd);
    struct xhci_interrupter *ir;
    @@ -2358,28 +2358,30 @@ xhci_create_secondary_interrupter(struct usb_hcd *hcd)
    return NULL;

    spin_lock_irq(&xhci->lock);
    -
    - /* Find available secondary interrupter, interrupter 0 is reserved for primary */
    + /* Find available secondary interrupter, interrupter 0 is reserverd for primary */
    for (i = 1; i < xhci->max_interrupters; i++) {
    - if (xhci->interrupters[i] == NULL) {
    - err = xhci_add_interrupter(xhci, ir, i);
    - break;
    + if ((intr_num > 0 && i == intr_num) || intr_num <= 0) {
    + if (xhci->interrupters[i] == NULL) {
    + err = xhci_add_interrupter(xhci, ir, i);
    + if (err) {
    + spin_unlock_irq(&xhci->lock);
    + goto free_ir;
    + }
    + break;
    + }
    }
    }
    -
    spin_unlock_irq(&xhci->lock);

    - if (err) {
    - xhci_warn(xhci, "Failed to add secondary interrupter, max interrupters %d\n",
    - xhci->max_interrupters);
    - xhci_free_interrupter(xhci, ir);
    - return NULL;
    - }
    -
    xhci_dbg(xhci, "Add secondary interrupter %d, max interrupters %d\n",
    i, xhci->max_interrupters);

    return ir;
    +
    +free_ir:
    + xhci_free_interrupter(xhci, ir);
    +
    + return NULL;
    }
    EXPORT_SYMBOL_GPL(xhci_create_secondary_interrupter);

    diff --git a/drivers/usb/host/xhci-sideband.c b/drivers/usb/host/xhci-sideband.c
    index cc4f90375e00..13a8a260b024 100644
    --- a/drivers/usb/host/xhci-sideband.c
    +++ b/drivers/usb/host/xhci-sideband.c
    @@ -242,12 +242,13 @@ EXPORT_SYMBOL_GPL(xhci_sideband_get_event_buffer);
    * Returns 0 on success, negative error otherwise
    */
    int
    -xhci_sideband_create_interrupter(struct xhci_sideband *sb)
    +xhci_sideband_create_interrupter(struct xhci_sideband *sb, int intr_num)
    {
    if (sb->ir)
    return -EBUSY;

    - sb->ir = xhci_create_secondary_interrupter(xhci_to_hcd(sb->xhci));
    + sb->ir = xhci_create_secondary_interrupter(xhci_to_hcd(sb->xhci),
    + intr_num);
    if (!sb->ir)
    return -ENOMEM;

    diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h
    index 7161b0841368..23d26f44e9b5 100644
    --- a/drivers/usb/host/xhci.h
    +++ b/drivers/usb/host/xhci.h
    @@ -2092,7 +2092,8 @@ struct xhci_container_ctx *xhci_alloc_container_ctx(struct xhci_hcd *xhci,
    int type, gfp_t flags);
    void xhci_free_container_ctx(struct xhci_hcd *xhci,
    struct xhci_container_ctx *ctx);
    -struct xhci_interrupter *xhci_create_secondary_interrupter(struct usb_hcd *hcd);
    +struct xhci_interrupter *xhci_create_secondary_interrupter(struct usb_hcd *hcd,
    + int intr_num);
    void xhci_remove_secondary_interrupter(struct usb_hcd
    *hcd, struct xhci_interrupter *ir);
    void xhci_skip_sec_intr_events(struct xhci_hcd *xhci,
    diff --git a/include/linux/usb/xhci-sideband.h b/include/linux/usb/xhci-sideband.h
    index c1457d1800f4..7f4080f530d3 100644
    --- a/include/linux/usb/xhci-sideband.h
    +++ b/include/linux/usb/xhci-sideband.h
    @@ -54,7 +54,8 @@ struct sg_table *
    xhci_sideband_get_event_buffer(struct xhci_sideband *sb);

    int
    -xhci_sideband_create_interrupter(struct xhci_sideband *sb);
    +xhci_sideband_create_interrupter(struct xhci_sideband *sb,
    + int intr_num);

    void
    xhci_sideband_remove_interrupter(struct xhci_sideband *sb);
    \
     
     \ /
      Last update: 2023-10-17 22:03    [W:4.200 / U:0.036 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site