From fc94364a702383632d644bc04630d36fff67cabe Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Sat, 12 Mar 2022 13:41:37 +0100 Subject: [PATCH] ANDROID: fix up rndis ABI breakage Commit da514063440b ("usb: gadget: rndis: add spinlock for rndis response list") broke the rndis abi by adding a lock to the device structure. This is the correct thing to do, to resolve an issue, but work around this by moving the lock to be a one-lock-per-driver instead of a per-device lock. This matches the first submission of this commit, so it still resolves the same problem, while preserving the ABI for now. Bug: 161946584 Fixes: da514063440b ("usb: gadget: rndis: add spinlock for rndis response list") Signed-off-by: Greg Kroah-Hartman Change-Id: I7c4d32524b7b10f23a15be35f762b1ed9f345b95 --- drivers/usb/gadget/function/rndis.c | 17 +++++++++-------- drivers/usb/gadget/function/rndis.h | 1 - 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/drivers/usb/gadget/function/rndis.c b/drivers/usb/gadget/function/rndis.c index 0f14c5291af0..6cf2ae508205 100644 --- a/drivers/usb/gadget/function/rndis.c +++ b/drivers/usb/gadget/function/rndis.c @@ -63,6 +63,8 @@ MODULE_PARM_DESC (rndis_debug, "enable debugging"); static DEFINE_IDA(rndis_ida); +static DEFINE_SPINLOCK(resp_lock); + /* Driver Version */ static const __le32 rndis_driver_version = cpu_to_le32(1); @@ -922,7 +924,6 @@ struct rndis_params *rndis_register(void (*resp_avail)(void *v), void *v) params->resp_avail = resp_avail; params->v = v; INIT_LIST_HEAD(¶ms->resp_queue); - spin_lock_init(¶ms->resp_lock); pr_debug("%s: configNr = %d\n", __func__, i); return params; @@ -1016,14 +1017,14 @@ void rndis_free_response(struct rndis_params *params, u8 *buf) { rndis_resp_t *r, *n; - spin_lock(¶ms->resp_lock); + spin_lock(&resp_lock); list_for_each_entry_safe(r, n, ¶ms->resp_queue, list) { if (r->buf == buf) { list_del(&r->list); kfree(r); } } - spin_unlock(¶ms->resp_lock); + spin_unlock(&resp_lock); } EXPORT_SYMBOL_GPL(rndis_free_response); @@ -1033,17 +1034,17 @@ u8 *rndis_get_next_response(struct rndis_params *params, u32 *length) if (!length) return NULL; - spin_lock(¶ms->resp_lock); + spin_lock(&resp_lock); list_for_each_entry_safe(r, n, ¶ms->resp_queue, list) { if (!r->send) { r->send = 1; *length = r->length; - spin_unlock(¶ms->resp_lock); + spin_unlock(&resp_lock); return r->buf; } } - spin_unlock(¶ms->resp_lock); + spin_unlock(&resp_lock); return NULL; } EXPORT_SYMBOL_GPL(rndis_get_next_response); @@ -1060,9 +1061,9 @@ static rndis_resp_t *rndis_add_response(struct rndis_params *params, u32 length) r->length = length; r->send = 0; - spin_lock(¶ms->resp_lock); + spin_lock(&resp_lock); list_add_tail(&r->list, ¶ms->resp_queue); - spin_unlock(¶ms->resp_lock); + spin_unlock(&resp_lock); return r; } diff --git a/drivers/usb/gadget/function/rndis.h b/drivers/usb/gadget/function/rndis.h index 6206b8b7490f..f6167f7fea82 100644 --- a/drivers/usb/gadget/function/rndis.h +++ b/drivers/usb/gadget/function/rndis.h @@ -174,7 +174,6 @@ typedef struct rndis_params { void (*resp_avail)(void *v); void *v; struct list_head resp_queue; - spinlock_t resp_lock; } rndis_params; /* RNDIS Message parser and other useless functions */