diff options
Diffstat (limited to 'drivers/usb/host')
| -rw-r--r-- | drivers/usb/host/pci-quirks.c | 9 | ||||
| -rw-r--r-- | drivers/usb/host/xhci-dbg.c | 2 | ||||
| -rw-r--r-- | drivers/usb/host/xhci-hub.c | 9 | ||||
| -rw-r--r-- | drivers/usb/host/xhci-ring.c | 11 | ||||
| -rw-r--r-- | drivers/usb/host/xhci.c | 8 | 
5 files changed, 29 insertions, 10 deletions
diff --git a/drivers/usb/host/pci-quirks.c b/drivers/usb/host/pci-quirks.c index 966d1484ee7..39f9e4a9a2d 100644 --- a/drivers/usb/host/pci-quirks.c +++ b/drivers/usb/host/pci-quirks.c @@ -545,7 +545,14 @@ static const struct dmi_system_id __devinitconst ehci_dmi_nohandoff_table[] = {  		/*  Pegatron Lucid (Ordissimo AIRIS) */  		.matches = {  			DMI_MATCH(DMI_BOARD_NAME, "M11JB"), -			DMI_MATCH(DMI_BIOS_VERSION, "Lucid-GE-133"), +			DMI_MATCH(DMI_BIOS_VERSION, "Lucid-"), +		}, +	}, +	{ +		/*  Pegatron Lucid (Ordissimo) */ +		.matches = { +			DMI_MATCH(DMI_BOARD_NAME, "Ordissimo"), +			DMI_MATCH(DMI_BIOS_VERSION, "Lucid-"),  		},  	},  	{ } diff --git a/drivers/usb/host/xhci-dbg.c b/drivers/usb/host/xhci-dbg.c index 4b436f5a417..5f3a7c74aa8 100644 --- a/drivers/usb/host/xhci-dbg.c +++ b/drivers/usb/host/xhci-dbg.c @@ -544,7 +544,6 @@ void xhci_dbg_ctx(struct xhci_hcd *xhci,  	int i;  	/* Fields are 32 bits wide, DMA addresses are in bytes */  	int field_size = 32 / 8; -	struct xhci_slot_ctx *slot_ctx;  	dma_addr_t dma = ctx->dma;  	int csz = HCC_64BYTE_CONTEXT(xhci->hcc_params); @@ -570,7 +569,6 @@ void xhci_dbg_ctx(struct xhci_hcd *xhci,  			dbg_rsvd64(xhci, (u64 *)ctrl_ctx, dma);  	} -	slot_ctx = xhci_get_slot_ctx(xhci, ctx);  	xhci_dbg_slot_ctx(xhci, ctx);  	xhci_dbg_ep_ctx(xhci, ctx, last_ep);  } diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c index aa90ad4d4fd..a686cf4905b 100644 --- a/drivers/usb/host/xhci-hub.c +++ b/drivers/usb/host/xhci-hub.c @@ -151,9 +151,8 @@ static void xhci_usb3_hub_descriptor(struct usb_hcd *hcd, struct xhci_hcd *xhci,  		if (portsc & PORT_DEV_REMOVE)  			port_removable |= 1 << (i + 1);  	} -	memset(&desc->u.ss.DeviceRemovable, -			(__force __u16) cpu_to_le16(port_removable), -			sizeof(__u16)); + +	desc->u.ss.DeviceRemovable = cpu_to_le16(port_removable);  }  static void xhci_hub_descriptor(struct usb_hcd *hcd, struct xhci_hcd *xhci, @@ -809,11 +808,13 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,  			temp = xhci_readl(xhci, port_array[wIndex]);  			xhci_dbg(xhci, "set port power, actual port %d status  = 0x%x\n", wIndex, temp); +			spin_unlock_irqrestore(&xhci->lock, flags);  			temp = usb_acpi_power_manageable(hcd->self.root_hub,  					wIndex);  			if (temp)  				usb_acpi_set_power_state(hcd->self.root_hub,  						wIndex, true); +			spin_lock_irqsave(&xhci->lock, flags);  			break;  		case USB_PORT_FEAT_RESET:  			temp = (temp | PORT_RESET); @@ -917,11 +918,13 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,  			xhci_writel(xhci, temp & ~PORT_POWER,  				port_array[wIndex]); +			spin_unlock_irqrestore(&xhci->lock, flags);  			temp = usb_acpi_power_manageable(hcd->self.root_hub,  					wIndex);  			if (temp)  				usb_acpi_set_power_state(hcd->self.root_hub,  						wIndex, false); +			spin_lock_irqsave(&xhci->lock, flags);  			break;  		default:  			goto error; diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c index c6ebb176dc4..4e1a8946b8d 100644 --- a/drivers/usb/host/xhci-ring.c +++ b/drivers/usb/host/xhci-ring.c @@ -1228,6 +1228,17 @@ static void xhci_cmd_to_noop(struct xhci_hcd *xhci, struct xhci_cd *cur_cd)  	cur_seg = find_trb_seg(xhci->cmd_ring->first_seg,  			xhci->cmd_ring->dequeue, &cycle_state); +	if (!cur_seg) { +		xhci_warn(xhci, "Command ring mismatch, dequeue = %p %llx (dma)\n", +				xhci->cmd_ring->dequeue, +				(unsigned long long) +				xhci_trb_virt_to_dma(xhci->cmd_ring->deq_seg, +					xhci->cmd_ring->dequeue)); +		xhci_debug_ring(xhci, xhci->cmd_ring); +		xhci_dbg_ring_ptrs(xhci, xhci->cmd_ring); +		return; +	} +  	/* find the command trb matched by cd from command ring */  	for (cmd_trb = xhci->cmd_ring->dequeue;  			cmd_trb != xhci->cmd_ring->enqueue; diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c index 7d462bf2009..c9e419f29b7 100644 --- a/drivers/usb/host/xhci.c +++ b/drivers/usb/host/xhci.c @@ -1627,7 +1627,6 @@ int xhci_add_endpoint(struct usb_hcd *hcd, struct usb_device *udev,  	struct xhci_hcd *xhci;  	struct xhci_container_ctx *in_ctx, *out_ctx;  	unsigned int ep_index; -	struct xhci_ep_ctx *ep_ctx;  	struct xhci_slot_ctx *slot_ctx;  	struct xhci_input_control_ctx *ctrl_ctx;  	u32 added_ctxs; @@ -1663,7 +1662,6 @@ int xhci_add_endpoint(struct usb_hcd *hcd, struct usb_device *udev,  	out_ctx = virt_dev->out_ctx;  	ctrl_ctx = xhci_get_input_control_ctx(xhci, in_ctx);  	ep_index = xhci_get_endpoint_index(&ep->desc); -	ep_ctx = xhci_get_ep_ctx(xhci, out_ctx, ep_index);  	/* If this endpoint is already in use, and the upper layers are trying  	 * to add it again without dropping it, reject the addition. @@ -1817,6 +1815,8 @@ static int xhci_evaluate_context_result(struct xhci_hcd *xhci,  	case COMP_EBADSLT:  		dev_warn(&udev->dev, "WARN: slot not enabled for"  				"evaluate context command.\n"); +		ret = -EINVAL; +		break;  	case COMP_CTX_STATE:  		dev_warn(&udev->dev, "WARN: invalid context state for "  				"evaluate context command.\n"); @@ -4021,7 +4021,7 @@ int xhci_update_device(struct usb_hcd *hcd, struct usb_device *udev)  static unsigned long long xhci_service_interval_to_ns(  		struct usb_endpoint_descriptor *desc)  { -	return (1 << (desc->bInterval - 1)) * 125 * 1000; +	return (1ULL << (desc->bInterval - 1)) * 125 * 1000;  }  static u16 xhci_get_timeout_no_hub_lpm(struct usb_device *udev, @@ -4142,7 +4142,7 @@ static u16 xhci_calculate_intel_u2_timeout(struct usb_device *udev,  			(xhci_service_interval_to_ns(desc) > timeout_ns))  		timeout_ns = xhci_service_interval_to_ns(desc); -	u2_del_ns = udev->bos->ss_cap->bU2DevExitLat * 1000; +	u2_del_ns = le16_to_cpu(udev->bos->ss_cap->bU2DevExitLat) * 1000ULL;  	if (u2_del_ns > timeout_ns)  		timeout_ns = u2_del_ns;  |