Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 712a014d authored by Krzysztof Opasiak's avatar Krzysztof Opasiak Committed by Gerrit - the friendly Code Review server
Browse files

usb: gadget: f_hid: fix: Free out requests



commit 20d2ca955bd09639c7b01db5761d157c297aea0a upstream.

Requests for out endpoint are allocated in bind() function
but never released.

This commit ensures that all pending requests are released
when we disable out endpoint.

Change-Id: Ifeab1eff6223e6380b7a1f6db6900ca33ade9de1
Fixes: 99c51500 ("usb: gadget: hidg: register OUT INT endpoint for SET_REPORT")
Tested-by: default avatarDavid Lechner <david@lechnology.com>
Signed-off-by: default avatarKrzysztof Opasiak <k.opasiak@samsung.com>
Signed-off-by: default avatarFelipe Balbi <felipe.balbi@linux.intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Git-commit: b6092a57150c1641dffb6bfeebbe2cbde7275d1f
Git-repo: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git


Signed-off-by: default avatarAjay Agarwal <ajaya@codeaurora.org>
parent c059ef28
Loading
Loading
Loading
Loading
+24 −8
Original line number Diff line number Diff line
@@ -383,12 +383,17 @@ static inline struct usb_request *hidg_alloc_ep_req(struct usb_ep *ep,
static void hidg_set_report_complete(struct usb_ep *ep, struct usb_request *req)
{
	struct f_hidg *hidg = (struct f_hidg *) req->context;
	struct usb_composite_dev *cdev = hidg->func.config->cdev;
	struct f_hidg_req_list *req_list;
	unsigned long flags;

	switch (req->status) {
	case 0:
		req_list = kzalloc(sizeof(*req_list), GFP_ATOMIC);
	if (!req_list)
		return;
		if (!req_list) {
			ERROR(cdev, "Unable to allocate mem for req_list\n");
			goto free_req;
		}

		req_list->req = req;

@@ -397,6 +402,17 @@ static void hidg_set_report_complete(struct usb_ep *ep, struct usb_request *req)
		spin_unlock_irqrestore(&hidg->spinlock, flags);

		wake_up(&hidg->read_queue);
		break;
	default:
		ERROR(cdev, "Set report failed %d\n", req->status);
		/* FALLTHROUGH */
	case -ECONNABORTED:		/* hardware forced ep reset */
	case -ECONNRESET:		/* request dequeued */
	case -ESHUTDOWN:		/* disconnect from host */
free_req:
		free_ep_req(ep, req);
		return;
	}
}

static int hidg_setup(struct usb_function *f,