diff options
Diffstat (limited to 'drivers/usb/host')
| -rw-r--r-- | drivers/usb/host/Kconfig | 2 | ||||
| -rw-r--r-- | drivers/usb/host/ehci-au1xxx.c | 2 | ||||
| -rw-r--r-- | drivers/usb/host/ehci-hub.c | 7 | ||||
| -rw-r--r-- | drivers/usb/host/ehci-omap.c | 6 | ||||
| -rw-r--r-- | drivers/usb/host/ehci-pci.c | 2 | ||||
| -rw-r--r-- | drivers/usb/host/ehci-xilinx-of.c | 1 | ||||
| -rw-r--r-- | drivers/usb/host/sl811-hcd.c | 1 | ||||
| -rw-r--r-- | drivers/usb/host/xhci-dbg.c | 9 | ||||
| -rw-r--r-- | drivers/usb/host/xhci-mem.c | 10 | ||||
| -rw-r--r-- | drivers/usb/host/xhci-ring.c | 40 | ||||
| -rw-r--r-- | drivers/usb/host/xhci.c | 14 | ||||
| -rw-r--r-- | drivers/usb/host/xhci.h | 2 | 
12 files changed, 57 insertions, 39 deletions
| diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig index 24046c0f5878..0e6afa260ed8 100644 --- a/drivers/usb/host/Kconfig +++ b/drivers/usb/host/Kconfig @@ -151,6 +151,8 @@ config USB_EHCI_MSM  	  Qualcomm chipsets. Root Hub has inbuilt TT.  	  This driver depends on OTG driver for PHY initialization,  	  clock management, powering up VBUS, and power management. +	  This driver is not supported on boards like trout which +	  has an external PHY.  config USB_EHCI_HCD_PPC_OF  	bool "EHCI support for PPC USB controller on OF platform bus" diff --git a/drivers/usb/host/ehci-au1xxx.c b/drivers/usb/host/ehci-au1xxx.c index 2baf8a849086..a869e3c103d3 100644 --- a/drivers/usb/host/ehci-au1xxx.c +++ b/drivers/usb/host/ehci-au1xxx.c @@ -227,8 +227,8 @@ static int ehci_hcd_au1xxx_drv_suspend(struct device *dev)  	 * mark HW unaccessible.  The PM and USB cores make sure that  	 * the root hub is either suspended or stopped.  	 */ -	spin_lock_irqsave(&ehci->lock, flags);  	ehci_prepare_ports_for_controller_suspend(ehci, device_may_wakeup(dev)); +	spin_lock_irqsave(&ehci->lock, flags);  	ehci_writel(ehci, 0, &ehci->regs->intr_enable);  	(void)ehci_readl(ehci, &ehci->regs->intr_enable); diff --git a/drivers/usb/host/ehci-hub.c b/drivers/usb/host/ehci-hub.c index 796ea0c8900f..8a515f0d5988 100644 --- a/drivers/usb/host/ehci-hub.c +++ b/drivers/usb/host/ehci-hub.c @@ -111,6 +111,7 @@ static void ehci_adjust_port_wakeup_flags(struct ehci_hcd *ehci,  {  	int		port;  	u32		temp; +	unsigned long	flags;  	/* If remote wakeup is enabled for the root hub but disabled  	 * for the controller, we must adjust all the port wakeup flags @@ -120,6 +121,8 @@ static void ehci_adjust_port_wakeup_flags(struct ehci_hcd *ehci,  	if (!ehci_to_hcd(ehci)->self.root_hub->do_remote_wakeup || do_wakeup)  		return; +	spin_lock_irqsave(&ehci->lock, flags); +  	/* clear phy low-power mode before changing wakeup flags */  	if (ehci->has_hostpc) {  		port = HCS_N_PORTS(ehci->hcs_params); @@ -131,7 +134,9 @@ static void ehci_adjust_port_wakeup_flags(struct ehci_hcd *ehci,  			temp = ehci_readl(ehci, hostpc_reg);  			ehci_writel(ehci, temp & ~HOSTPC_PHCD, hostpc_reg);  		} +		spin_unlock_irqrestore(&ehci->lock, flags);  		msleep(5); +		spin_lock_irqsave(&ehci->lock, flags);  	}  	port = HCS_N_PORTS(ehci->hcs_params); @@ -170,6 +175,8 @@ static void ehci_adjust_port_wakeup_flags(struct ehci_hcd *ehci,  	/* Does the root hub have a port wakeup pending? */  	if (!suspending && (ehci_readl(ehci, &ehci->regs->status) & STS_PCD))  		usb_hcd_resume_root_hub(ehci_to_hcd(ehci)); + +	spin_unlock_irqrestore(&ehci->lock, flags);  }  static int ehci_bus_suspend (struct usb_hcd *hcd) diff --git a/drivers/usb/host/ehci-omap.c b/drivers/usb/host/ehci-omap.c index 680f2ef4e59f..f784ceb862a3 100644 --- a/drivers/usb/host/ehci-omap.c +++ b/drivers/usb/host/ehci-omap.c @@ -796,7 +796,7 @@ static int ehci_hcd_omap_probe(struct platform_device *pdev)  	hcd = usb_create_hcd(&ehci_omap_hc_driver, &pdev->dev,  			dev_name(&pdev->dev));  	if (!hcd) { -		dev_dbg(&pdev->dev, "failed to create hcd with err %d\n", ret); +		dev_err(&pdev->dev, "failed to create hcd with err %d\n", ret);  		ret = -ENOMEM;  		goto err_create_hcd;  	} @@ -864,7 +864,7 @@ static int ehci_hcd_omap_probe(struct platform_device *pdev)  	ret = omap_start_ehc(omap, hcd);  	if (ret) { -		dev_dbg(&pdev->dev, "failed to start ehci\n"); +		dev_err(&pdev->dev, "failed to start ehci with err %d\n", ret);  		goto err_start;  	} @@ -879,7 +879,7 @@ static int ehci_hcd_omap_probe(struct platform_device *pdev)  	ret = usb_add_hcd(hcd, irq, IRQF_DISABLED | IRQF_SHARED);  	if (ret) { -		dev_dbg(&pdev->dev, "failed to add hcd with err %d\n", ret); +		dev_err(&pdev->dev, "failed to add hcd with err %d\n", ret);  		goto err_add_hcd;  	} diff --git a/drivers/usb/host/ehci-pci.c b/drivers/usb/host/ehci-pci.c index bed07d4aab06..07bb982e59f6 100644 --- a/drivers/usb/host/ehci-pci.c +++ b/drivers/usb/host/ehci-pci.c @@ -367,8 +367,8 @@ static int ehci_pci_suspend(struct usb_hcd *hcd, bool do_wakeup)  	 * mark HW unaccessible.  The PM and USB cores make sure that  	 * the root hub is either suspended or stopped.  	 */ -	spin_lock_irqsave (&ehci->lock, flags);  	ehci_prepare_ports_for_controller_suspend(ehci, do_wakeup); +	spin_lock_irqsave (&ehci->lock, flags);  	ehci_writel(ehci, 0, &ehci->regs->intr_enable);  	(void)ehci_readl(ehci, &ehci->regs->intr_enable); diff --git a/drivers/usb/host/ehci-xilinx-of.c b/drivers/usb/host/ehci-xilinx-of.c index e8f4f36fdf0b..a6f21b891f68 100644 --- a/drivers/usb/host/ehci-xilinx-of.c +++ b/drivers/usb/host/ehci-xilinx-of.c @@ -29,6 +29,7 @@  #include <linux/of.h>  #include <linux/of_platform.h> +#include <linux/of_address.h>  /**   * ehci_xilinx_of_setup - Initialize the device for ehci_reset() diff --git a/drivers/usb/host/sl811-hcd.c b/drivers/usb/host/sl811-hcd.c index 990f06b89eaa..2e9602a10e9b 100644 --- a/drivers/usb/host/sl811-hcd.c +++ b/drivers/usb/host/sl811-hcd.c @@ -861,6 +861,7 @@ static int sl811h_urb_enqueue(  			DBG("dev %d ep%d maxpacket %d\n",  				udev->devnum, epnum, ep->maxpacket);  			retval = -EINVAL; +			kfree(ep);  			goto fail;  		} diff --git a/drivers/usb/host/xhci-dbg.c b/drivers/usb/host/xhci-dbg.c index fcbf4abbf381..0231814a97a5 100644 --- a/drivers/usb/host/xhci-dbg.c +++ b/drivers/usb/host/xhci-dbg.c @@ -169,9 +169,10 @@ static void xhci_print_ports(struct xhci_hcd *xhci)  	}  } -void xhci_print_ir_set(struct xhci_hcd *xhci, struct xhci_intr_reg *ir_set, int set_num) +void xhci_print_ir_set(struct xhci_hcd *xhci, int set_num)  { -	void *addr; +	struct xhci_intr_reg __iomem *ir_set = &xhci->run_regs->ir_set[set_num]; +	void __iomem *addr;  	u32 temp;  	u64 temp_64; @@ -449,7 +450,7 @@ char *xhci_get_slot_state(struct xhci_hcd *xhci,  	}  } -void xhci_dbg_slot_ctx(struct xhci_hcd *xhci, struct xhci_container_ctx *ctx) +static void xhci_dbg_slot_ctx(struct xhci_hcd *xhci, struct xhci_container_ctx *ctx)  {  	/* Fields are 32 bits wide, DMA addresses are in bytes */  	int field_size = 32 / 8; @@ -488,7 +489,7 @@ void xhci_dbg_slot_ctx(struct xhci_hcd *xhci, struct xhci_container_ctx *ctx)  		dbg_rsvd64(xhci, (u64 *)slot_ctx, dma);  } -void xhci_dbg_ep_ctx(struct xhci_hcd *xhci, +static void xhci_dbg_ep_ctx(struct xhci_hcd *xhci,  		     struct xhci_container_ctx *ctx,  		     unsigned int last_ep)  { diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c index 1d0f45f0e7a6..a9534396e85b 100644 --- a/drivers/usb/host/xhci-mem.c +++ b/drivers/usb/host/xhci-mem.c @@ -307,7 +307,7 @@ struct xhci_ep_ctx *xhci_get_ep_ctx(struct xhci_hcd *xhci,  /***************** Streams structures manipulation *************************/ -void xhci_free_stream_ctx(struct xhci_hcd *xhci, +static void xhci_free_stream_ctx(struct xhci_hcd *xhci,  		unsigned int num_stream_ctxs,  		struct xhci_stream_ctx *stream_ctx, dma_addr_t dma)  { @@ -335,7 +335,7 @@ void xhci_free_stream_ctx(struct xhci_hcd *xhci,   * The stream context array must be a power of 2, and can be as small as   * 64 bytes or as large as 1MB.   */ -struct xhci_stream_ctx *xhci_alloc_stream_ctx(struct xhci_hcd *xhci, +static struct xhci_stream_ctx *xhci_alloc_stream_ctx(struct xhci_hcd *xhci,  		unsigned int num_stream_ctxs, dma_addr_t *dma,  		gfp_t mem_flags)  { @@ -1900,11 +1900,11 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags)  	val &= DBOFF_MASK;  	xhci_dbg(xhci, "// Doorbell array is located at offset 0x%x"  			" from cap regs base addr\n", val); -	xhci->dba = (void *) xhci->cap_regs + val; +	xhci->dba = (void __iomem *) xhci->cap_regs + val;  	xhci_dbg_regs(xhci);  	xhci_print_run_regs(xhci);  	/* Set ir_set to interrupt register set 0 */ -	xhci->ir_set = (void *) xhci->run_regs->ir_set; +	xhci->ir_set = &xhci->run_regs->ir_set[0];  	/*  	 * Event ring setup: Allocate a normal ring, but also setup @@ -1961,7 +1961,7 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags)  	/* Set the event ring dequeue address */  	xhci_set_hc_event_deq(xhci);  	xhci_dbg(xhci, "Wrote ERST address to ir_set 0.\n"); -	xhci_print_ir_set(xhci, xhci->ir_set, 0); +	xhci_print_ir_set(xhci, 0);  	/*  	 * XXX: Might need to set the Interrupter Moderation Register to diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c index 3e8211c1ce5a..3289bf4832c9 100644 --- a/drivers/usb/host/xhci-ring.c +++ b/drivers/usb/host/xhci-ring.c @@ -474,8 +474,11 @@ void xhci_find_new_dequeue_state(struct xhci_hcd *xhci,  	state->new_deq_seg = find_trb_seg(cur_td->start_seg,  			dev->eps[ep_index].stopped_trb,  			&state->new_cycle_state); -	if (!state->new_deq_seg) -		BUG(); +	if (!state->new_deq_seg) { +		WARN_ON(1); +		return; +	} +  	/* Dig out the cycle state saved by the xHC during the stop ep cmd */  	xhci_dbg(xhci, "Finding endpoint context\n");  	ep_ctx = xhci_get_ep_ctx(xhci, dev->out_ctx, ep_index); @@ -486,8 +489,10 @@ void xhci_find_new_dequeue_state(struct xhci_hcd *xhci,  	state->new_deq_seg = find_trb_seg(state->new_deq_seg,  			state->new_deq_ptr,  			&state->new_cycle_state); -	if (!state->new_deq_seg) -		BUG(); +	if (!state->new_deq_seg) { +		WARN_ON(1); +		return; +	}  	trb = &state->new_deq_ptr->generic;  	if ((trb->field[3] & TRB_TYPE_BITMASK) == TRB_TYPE(TRB_LINK) && @@ -2363,12 +2368,13 @@ static unsigned int count_sg_trbs_needed(struct xhci_hcd *xhci, struct urb *urb)  		/* Scatter gather list entries may cross 64KB boundaries */  		running_total = TRB_MAX_BUFF_SIZE - -			(sg_dma_address(sg) & ((1 << TRB_MAX_BUFF_SHIFT) - 1)); +			(sg_dma_address(sg) & (TRB_MAX_BUFF_SIZE - 1)); +		running_total &= TRB_MAX_BUFF_SIZE - 1;  		if (running_total != 0)  			num_trbs++;  		/* How many more 64KB chunks to transfer, how many more TRBs? */ -		while (running_total < sg_dma_len(sg)) { +		while (running_total < sg_dma_len(sg) && running_total < temp) {  			num_trbs++;  			running_total += TRB_MAX_BUFF_SIZE;  		} @@ -2394,11 +2400,11 @@ static unsigned int count_sg_trbs_needed(struct xhci_hcd *xhci, struct urb *urb)  static void check_trb_math(struct urb *urb, int num_trbs, int running_total)  {  	if (num_trbs != 0) -		dev_dbg(&urb->dev->dev, "%s - ep %#x - Miscalculated number of " +		dev_err(&urb->dev->dev, "%s - ep %#x - Miscalculated number of "  				"TRBs, %d left\n", __func__,  				urb->ep->desc.bEndpointAddress, num_trbs);  	if (running_total != urb->transfer_buffer_length) -		dev_dbg(&urb->dev->dev, "%s - ep %#x - Miscalculated tx length, " +		dev_err(&urb->dev->dev, "%s - ep %#x - Miscalculated tx length, "  				"queued %#x (%d), asked for %#x (%d)\n",  				__func__,  				urb->ep->desc.bEndpointAddress, @@ -2533,8 +2539,7 @@ static int queue_bulk_sg_tx(struct xhci_hcd *xhci, gfp_t mem_flags,  	sg = urb->sg;  	addr = (u64) sg_dma_address(sg);  	this_sg_len = sg_dma_len(sg); -	trb_buff_len = TRB_MAX_BUFF_SIZE - -		(addr & ((1 << TRB_MAX_BUFF_SHIFT) - 1)); +	trb_buff_len = TRB_MAX_BUFF_SIZE - (addr & (TRB_MAX_BUFF_SIZE - 1));  	trb_buff_len = min_t(int, trb_buff_len, this_sg_len);  	if (trb_buff_len > urb->transfer_buffer_length)  		trb_buff_len = urb->transfer_buffer_length; @@ -2572,7 +2577,7 @@ static int queue_bulk_sg_tx(struct xhci_hcd *xhci, gfp_t mem_flags,  				(unsigned int) (addr + TRB_MAX_BUFF_SIZE) & ~(TRB_MAX_BUFF_SIZE - 1),  				(unsigned int) addr + trb_buff_len);  		if (TRB_MAX_BUFF_SIZE - -				(addr & ((1 << TRB_MAX_BUFF_SHIFT) - 1)) < trb_buff_len) { +				(addr & (TRB_MAX_BUFF_SIZE - 1)) < trb_buff_len) {  			xhci_warn(xhci, "WARN: sg dma xfer crosses 64KB boundaries!\n");  			xhci_dbg(xhci, "Next boundary at %#x, end dma = %#x\n",  					(unsigned int) (addr + TRB_MAX_BUFF_SIZE) & ~(TRB_MAX_BUFF_SIZE - 1), @@ -2616,7 +2621,7 @@ static int queue_bulk_sg_tx(struct xhci_hcd *xhci, gfp_t mem_flags,  		}  		trb_buff_len = TRB_MAX_BUFF_SIZE - -			(addr & ((1 << TRB_MAX_BUFF_SHIFT) - 1)); +			(addr & (TRB_MAX_BUFF_SIZE - 1));  		trb_buff_len = min_t(int, trb_buff_len, this_sg_len);  		if (running_total + trb_buff_len > urb->transfer_buffer_length)  			trb_buff_len = @@ -2656,7 +2661,8 @@ int xhci_queue_bulk_tx(struct xhci_hcd *xhci, gfp_t mem_flags,  	num_trbs = 0;  	/* How much data is (potentially) left before the 64KB boundary? */  	running_total = TRB_MAX_BUFF_SIZE - -		(urb->transfer_dma & ((1 << TRB_MAX_BUFF_SHIFT) - 1)); +		(urb->transfer_dma & (TRB_MAX_BUFF_SIZE - 1)); +	running_total &= TRB_MAX_BUFF_SIZE - 1;  	/* If there's some data on this 64KB chunk, or we have to send a  	 * zero-length transfer, we need at least one TRB @@ -2700,8 +2706,8 @@ int xhci_queue_bulk_tx(struct xhci_hcd *xhci, gfp_t mem_flags,  	/* How much data is in the first TRB? */  	addr = (u64) urb->transfer_dma;  	trb_buff_len = TRB_MAX_BUFF_SIZE - -		(urb->transfer_dma & ((1 << TRB_MAX_BUFF_SHIFT) - 1)); -	if (urb->transfer_buffer_length < trb_buff_len) +		(urb->transfer_dma & (TRB_MAX_BUFF_SIZE - 1)); +	if (trb_buff_len > urb->transfer_buffer_length)  		trb_buff_len = urb->transfer_buffer_length;  	first_trb = true; @@ -2879,8 +2885,8 @@ static int count_isoc_trbs_needed(struct xhci_hcd *xhci,  	addr = (u64) (urb->transfer_dma + urb->iso_frame_desc[i].offset);  	td_len = urb->iso_frame_desc[i].length; -	running_total = TRB_MAX_BUFF_SIZE - -			(addr & ((1 << TRB_MAX_BUFF_SHIFT) - 1)); +	running_total = TRB_MAX_BUFF_SIZE - (addr & (TRB_MAX_BUFF_SIZE - 1)); +	running_total &= TRB_MAX_BUFF_SIZE - 1;  	if (running_total != 0)  		num_trbs++; diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c index 34cf4e165877..2083fc2179b2 100644 --- a/drivers/usb/host/xhci.c +++ b/drivers/usb/host/xhci.c @@ -109,7 +109,7 @@ int xhci_halt(struct xhci_hcd *xhci)  /*   * Set the run bit and wait for the host to be running.   */ -int xhci_start(struct xhci_hcd *xhci) +static int xhci_start(struct xhci_hcd *xhci)  {  	u32 temp;  	int ret; @@ -329,7 +329,7 @@ int xhci_init(struct usb_hcd *hcd)  #ifdef CONFIG_USB_XHCI_HCD_DEBUGGING -void xhci_event_ring_work(unsigned long arg) +static void xhci_event_ring_work(unsigned long arg)  {  	unsigned long flags;  	int temp; @@ -473,7 +473,7 @@ int xhci_run(struct usb_hcd *hcd)  			xhci->ir_set, (unsigned int) ER_IRQ_ENABLE(temp));  	xhci_writel(xhci, ER_IRQ_ENABLE(temp),  			&xhci->ir_set->irq_pending); -	xhci_print_ir_set(xhci, xhci->ir_set, 0); +	xhci_print_ir_set(xhci, 0);  	if (NUM_TEST_NOOPS > 0)  		doorbell = xhci_setup_one_noop(xhci); @@ -528,7 +528,7 @@ void xhci_stop(struct usb_hcd *hcd)  	temp = xhci_readl(xhci, &xhci->ir_set->irq_pending);  	xhci_writel(xhci, ER_IRQ_DISABLE(temp),  			&xhci->ir_set->irq_pending); -	xhci_print_ir_set(xhci, xhci->ir_set, 0); +	xhci_print_ir_set(xhci, 0);  	xhci_dbg(xhci, "cleaning up memory\n");  	xhci_mem_cleanup(xhci); @@ -755,7 +755,7 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated)  		temp = xhci_readl(xhci, &xhci->ir_set->irq_pending);  		xhci_writel(xhci, ER_IRQ_DISABLE(temp),  				&xhci->ir_set->irq_pending); -		xhci_print_ir_set(xhci, xhci->ir_set, 0); +		xhci_print_ir_set(xhci, 0);  		xhci_dbg(xhci, "cleaning up memory\n");  		xhci_mem_cleanup(xhci); @@ -857,7 +857,7 @@ unsigned int xhci_last_valid_endpoint(u32 added_ctxs)  /* Returns 1 if the arguments are OK;   * returns 0 this is a root hub; returns -EINVAL for NULL pointers.   */ -int xhci_check_args(struct usb_hcd *hcd, struct usb_device *udev, +static int xhci_check_args(struct usb_hcd *hcd, struct usb_device *udev,  		struct usb_host_endpoint *ep, int check_ep, bool check_virt_dev,  		const char *func) {  	struct xhci_hcd	*xhci; @@ -1693,7 +1693,7 @@ static void xhci_setup_input_ctx_for_config_ep(struct xhci_hcd *xhci,  	xhci_dbg_ctx(xhci, in_ctx, xhci_last_valid_endpoint(add_flags));  } -void xhci_setup_input_ctx_for_quirk(struct xhci_hcd *xhci, +static void xhci_setup_input_ctx_for_quirk(struct xhci_hcd *xhci,  		unsigned int slot_id, unsigned int ep_index,  		struct xhci_dequeue_state *deq_state)  { diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h index 7f236fd22015..7f127df6dd55 100644 --- a/drivers/usb/host/xhci.h +++ b/drivers/usb/host/xhci.h @@ -1348,7 +1348,7 @@ static inline int xhci_link_trb_quirk(struct xhci_hcd *xhci)  }  /* xHCI debugging */ -void xhci_print_ir_set(struct xhci_hcd *xhci, struct xhci_intr_reg *ir_set, int set_num); +void xhci_print_ir_set(struct xhci_hcd *xhci, int set_num);  void xhci_print_registers(struct xhci_hcd *xhci);  void xhci_dbg_regs(struct xhci_hcd *xhci);  void xhci_print_run_regs(struct xhci_hcd *xhci); | 
