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

Commit e988f306 authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman
Browse files

Merge tag 'fixes-for-v3.15-rc3' of...

Merge tag 'fixes-for-v3.15-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb

 into usb-linus

Felipe writes:

usb: fixes for v3.15-rc3

Quite a few fixes this time since I lost v3.15-rc2
window.

Most fixes are MUSB which learned to remove its debugfs directories
properly, got a fix for PHY handling and now knows that it should
make sure its clocks aren't gated before trying to access registers.

ffs got a race fix between ffs_epfile_io() and ffs_func_eps_disable().

dwc3 got a fix for system suspend/resume and now only iterates over
valid endpoints when trying to resize TX fifos.

usb_get_phy() now will properly return an error if try_module_get() fails.

We also have a revert for a NAPI conversion on the ethernet gadget which
was causing a kernel BUG.

Signed-of-by: default avatarFelipe Balbi <balbi@ti.com>
parents a798c10f a31a942a
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -821,6 +821,7 @@ static void dwc3_complete(struct device *dev)


	spin_lock_irqsave(&dwc->lock, flags);
	spin_lock_irqsave(&dwc->lock, flags);


	dwc3_event_buffers_setup(dwc);
	switch (dwc->dr_mode) {
	switch (dwc->dr_mode) {
	case USB_DR_MODE_PERIPHERAL:
	case USB_DR_MODE_PERIPHERAL:
	case USB_DR_MODE_OTG:
	case USB_DR_MODE_OTG:
@@ -828,7 +829,6 @@ static void dwc3_complete(struct device *dev)
		/* FALLTHROUGH */
		/* FALLTHROUGH */
	case USB_DR_MODE_HOST:
	case USB_DR_MODE_HOST:
	default:
	default:
		dwc3_event_buffers_setup(dwc);
		break;
		break;
	}
	}


+4 −8
Original line number Original line Diff line number Diff line
@@ -187,15 +187,12 @@ int dwc3_gadget_resize_tx_fifos(struct dwc3 *dwc)
	 * improve this algorithm so that we better use the internal
	 * improve this algorithm so that we better use the internal
	 * FIFO space
	 * FIFO space
	 */
	 */
	for (num = 0; num < DWC3_ENDPOINTS_NUM; num++) {
	for (num = 0; num < dwc->num_in_eps; num++) {
		struct dwc3_ep	*dep = dwc->eps[num];
		/* bit0 indicates direction; 1 means IN ep */
		int		fifo_number = dep->number >> 1;
		struct dwc3_ep	*dep = dwc->eps[(num << 1) | 1];
		int		mult = 1;
		int		mult = 1;
		int		tmp;
		int		tmp;


		if (!(dep->number & 1))
			continue;

		if (!(dep->flags & DWC3_EP_ENABLED))
		if (!(dep->flags & DWC3_EP_ENABLED))
			continue;
			continue;


@@ -224,8 +221,7 @@ int dwc3_gadget_resize_tx_fifos(struct dwc3 *dwc)
		dev_vdbg(dwc->dev, "%s: Fifo Addr %04x Size %d\n",
		dev_vdbg(dwc->dev, "%s: Fifo Addr %04x Size %d\n",
				dep->name, last_fifo_depth, fifo_size & 0xffff);
				dep->name, last_fifo_depth, fifo_size & 0xffff);


		dwc3_writel(dwc->regs, DWC3_GTXFIFOSIZ(fifo_number),
		dwc3_writel(dwc->regs, DWC3_GTXFIFOSIZ(num), fifo_size);
				fifo_size);


		last_fifo_depth += (fifo_size & 0xffff);
		last_fifo_depth += (fifo_size & 0xffff);
	}
	}
+7 −0
Original line number Original line Diff line number Diff line
@@ -745,6 +745,12 @@ static ssize_t ffs_epfile_io(struct file *file, struct ffs_io_data *io_data)
		 */
		 */
		struct usb_gadget *gadget = epfile->ffs->gadget;
		struct usb_gadget *gadget = epfile->ffs->gadget;


		spin_lock_irq(&epfile->ffs->eps_lock);
		/* In the meantime, endpoint got disabled or changed. */
		if (epfile->ep != ep) {
			spin_unlock_irq(&epfile->ffs->eps_lock);
			return -ESHUTDOWN;
		}
		/*
		/*
		 * Controller may require buffer size to be aligned to
		 * Controller may require buffer size to be aligned to
		 * maxpacketsize of an out endpoint.
		 * maxpacketsize of an out endpoint.
@@ -752,6 +758,7 @@ static ssize_t ffs_epfile_io(struct file *file, struct ffs_io_data *io_data)
		data_len = io_data->read ?
		data_len = io_data->read ?
			   usb_ep_align_maybe(gadget, ep->ep, io_data->len) :
			   usb_ep_align_maybe(gadget, ep->ep, io_data->len) :
			   io_data->len;
			   io_data->len;
		spin_unlock_irq(&epfile->ffs->eps_lock);


		data = kmalloc(data_len, GFP_KERNEL);
		data = kmalloc(data_len, GFP_KERNEL);
		if (unlikely(!data))
		if (unlikely(!data))
+1 −1
Original line number Original line Diff line number Diff line
@@ -377,7 +377,7 @@ static struct sk_buff *rndis_add_header(struct gether *port,
	if (skb2)
	if (skb2)
		rndis_add_hdr(skb2);
		rndis_add_hdr(skb2);


	dev_kfree_skb_any(skb);
	dev_kfree_skb(skb);
	return skb2;
	return skb2;
}
}


+5 −1
Original line number Original line Diff line number Diff line
@@ -1219,6 +1219,10 @@ static int fsl_pullup(struct usb_gadget *gadget, int is_on)
	struct fsl_udc *udc;
	struct fsl_udc *udc;


	udc = container_of(gadget, struct fsl_udc, gadget);
	udc = container_of(gadget, struct fsl_udc, gadget);

	if (!udc->vbus_active)
		return -EOPNOTSUPP;

	udc->softconnect = (is_on != 0);
	udc->softconnect = (is_on != 0);
	if (can_pullup(udc))
	if (can_pullup(udc))
		fsl_writel((fsl_readl(&dr_regs->usbcmd) | USB_CMD_RUN_STOP),
		fsl_writel((fsl_readl(&dr_regs->usbcmd) | USB_CMD_RUN_STOP),
@@ -2532,8 +2536,8 @@ static int __exit fsl_udc_remove(struct platform_device *pdev)
	if (!udc_controller)
	if (!udc_controller)
		return -ENODEV;
		return -ENODEV;


	usb_del_gadget_udc(&udc_controller->gadget);
	udc_controller->done = &done;
	udc_controller->done = &done;
	usb_del_gadget_udc(&udc_controller->gadget);


	fsl_udc_clk_release();
	fsl_udc_clk_release();


Loading