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

Commit 26dc72a0 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "USB: gadget: rndis: Flush rx_work & tx_work before free_net_dev in cleanup"

parents 7fafce23 236dfe4e
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -474,12 +474,13 @@ static void rndis_response_available(void *_rndis)

static void rndis_response_complete(struct usb_ep *ep, struct usb_request *req)
{
	struct f_rndis			*rndis = __rndis;
	struct f_rndis			*rndis;
	struct usb_composite_dev	*cdev;
	int				status = req->status;
	struct usb_ep *notify_ep;

	spin_lock(&_rndis_lock);
	rndis = __rndis;
	if (!rndis || !rndis->notify || !rndis->notify->driver_data) {
		spin_unlock(&_rndis_lock);
		return;
@@ -537,12 +538,13 @@ out:

static void rndis_command_complete(struct usb_ep *ep, struct usb_request *req)
{
	struct f_rndis			*rndis = __rndis;
	struct f_rndis			*rndis;
	struct usb_composite_dev	*cdev;
	int				status;
	rndis_init_msg_type		*buf;

	spin_lock(&_rndis_lock);
	rndis = __rndis;
	if (!rndis || !rndis->notify || !rndis->notify->driver_data) {
		spin_unlock(&_rndis_lock);
		return;
+14 −0
Original line number Diff line number Diff line
@@ -573,8 +573,16 @@ static void rx_fill(struct eth_dev *dev, gfp_t gfp_flags)
	unsigned long		flags;
	int			req_cnt = 0;

	if (!dev)
		return;

	/* fill unused rxq slots with some skb */
	spin_lock_irqsave(&dev->req_lock, flags);
	if (!dev->port_usb) {
		spin_unlock_irqrestore(&dev->req_lock, flags);
		return;
	}

	while (!list_empty(&dev->rx_reqs)) {
		/* break the nexus of continuous completion and re-submission*/
		if (++req_cnt > qlen(dev->gadget, dev->qmult))
@@ -588,6 +596,10 @@ static void rx_fill(struct eth_dev *dev, gfp_t gfp_flags)
		if (rx_submit(dev, req, gfp_flags) < 0) {
			spin_lock_irqsave(&dev->req_lock, flags);
			list_add(&req->list, &dev->rx_reqs);
			if (!dev->port_usb) {
				spin_unlock_irqrestore(&dev->req_lock, flags);
				return;
			}
			spin_unlock_irqrestore(&dev->req_lock, flags);
			defer_kevent(dev, WORK_RX_MEMORY);
			return;
@@ -1957,6 +1969,8 @@ void gether_cleanup(struct eth_dev *dev)
	uether_debugfs_exit(dev);
	unregister_netdev(dev->net);
	flush_work(&dev->work);
	cancel_work_sync(&dev->rx_work);
	cancel_work_sync(&dev->tx_work);
	free_netdev(dev->net);
}
EXPORT_SYMBOL_GPL(gether_cleanup);