diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-01-09 12:09:47 -0800 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-01-09 12:09:47 -0800 | 
| commit | 55b81e6f2795484ea8edf5805c95c007cacfa736 (patch) | |
| tree | c3724975107857fcc03b5dd649c462e4f72397be /drivers/usb/host/xhci-ring.c | |
| parent | 5983faf942f260023e547f3c5f38c1033c35cc9b (diff) | |
| parent | 08e87d0d773dc9ca5faf4c3306e238ed0ea129b0 (diff) | |
| download | olio-linux-3.10-55b81e6f2795484ea8edf5805c95c007cacfa736.tar.xz olio-linux-3.10-55b81e6f2795484ea8edf5805c95c007cacfa736.zip  | |
Merge branch 'usb-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb
* 'usb-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb: (232 commits)
  USB: Add USB-ID for Multiplex RC serial adapter to cp210x.c
  xhci: Clean up 32-bit build warnings.
  USB: update documentation for usbmon
  usb: usb-storage doesn't support dynamic id currently, the patch disables the feature to fix an oops
  drivers/usb/class/cdc-acm.c: clear dangling pointer
  drivers/usb/dwc3/dwc3-pci.c: introduce missing kfree
  drivers/usb/host/isp1760-if.c: introduce missing kfree
  usb: option: add ZD Incorporated HSPA modem
  usb: ch9: fix up MaxStreams helper
  USB: usb-skeleton.c: cleanup open_count
  USB: usb-skeleton.c: fix open/disconnect race
  xhci: Properly handle COMP_2ND_BW_ERR
  USB: remove dead code from suspend/resume path
  USB: add quirk for another camera
  drivers: usb: wusbcore: Fix dependency for USB_WUSB
  xhci: Better debugging for critical host errors.
  xhci: Be less verbose during URB cancellation.
  xhci: Remove debugging about ring structure allocation.
  xhci: Remove debugging about toggling cycle bits.
  xhci: Remove debugging for individual transfers.
  ...
Diffstat (limited to 'drivers/usb/host/xhci-ring.c')
| -rw-r--r-- | drivers/usb/host/xhci-ring.c | 113 | 
1 files changed, 32 insertions, 81 deletions
diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c index 9f1d4b15d81..b90e1386418 100644 --- a/drivers/usb/host/xhci-ring.c +++ b/drivers/usb/host/xhci-ring.c @@ -155,10 +155,6 @@ static void inc_deq(struct xhci_hcd *xhci, struct xhci_ring *ring, bool consumer  	while (last_trb(xhci, ring, ring->deq_seg, next)) {  		if (consumer && last_trb_on_last_seg(xhci, ring, ring->deq_seg, next)) {  			ring->cycle_state = (ring->cycle_state ? 0 : 1); -			if (!in_interrupt()) -				xhci_dbg(xhci, "Toggle cycle state for ring %p = %i\n", -						ring, -						(unsigned int) ring->cycle_state);  		}  		ring->deq_seg = ring->deq_seg->next;  		ring->dequeue = ring->deq_seg->trbs; @@ -231,10 +227,6 @@ static void inc_enq(struct xhci_hcd *xhci, struct xhci_ring *ring,  			/* Toggle the cycle bit after the last ring segment. */  			if (last_trb_on_last_seg(xhci, ring, ring->enq_seg, next)) {  				ring->cycle_state = (ring->cycle_state ? 0 : 1); -				if (!in_interrupt()) -					xhci_dbg(xhci, "Toggle cycle state for ring %p = %i\n", -							ring, -							(unsigned int) ring->cycle_state);  			}  		}  		ring->enq_seg = ring->enq_seg->next; @@ -560,12 +552,9 @@ static void td_to_noop(struct xhci_hcd *xhci, struct xhci_ring *ep_ring,  					cpu_to_le32(TRB_CYCLE);  			cur_trb->generic.field[3] |= cpu_to_le32(  				TRB_TYPE(TRB_TR_NOOP)); -			xhci_dbg(xhci, "Cancel TRB %p (0x%llx dma) " -					"in seg %p (0x%llx dma)\n", -					cur_trb, -					(unsigned long long)xhci_trb_virt_to_dma(cur_seg, cur_trb), -					cur_seg, -					(unsigned long long)cur_seg->dma); +			xhci_dbg(xhci, "TRB to noop at offset 0x%llx\n", +					(unsigned long long) +					xhci_trb_virt_to_dma(cur_seg, cur_trb));  		}  		if (cur_trb == cur_td->last_trb)  			break; @@ -705,9 +694,9 @@ static void handle_stopped_endpoint(struct xhci_hcd *xhci,  	 */  	list_for_each(entry, &ep->cancelled_td_list) {  		cur_td = list_entry(entry, struct xhci_td, cancelled_td_list); -		xhci_dbg(xhci, "Cancelling TD starting at %p, 0x%llx (dma).\n", -				cur_td->first_trb, -				(unsigned long long)xhci_trb_virt_to_dma(cur_td->start_seg, cur_td->first_trb)); +		xhci_dbg(xhci, "Removing canceled TD starting at 0x%llx (dma).\n", +				(unsigned long long)xhci_trb_virt_to_dma( +					cur_td->start_seg, cur_td->first_trb));  		ep_ring = xhci_urb_to_transfer_ring(xhci, cur_td->urb);  		if (!ep_ring) {  			/* This shouldn't happen unless a driver is mucking @@ -1627,7 +1616,6 @@ static int process_ctrl_td(struct xhci_hcd *xhci, struct xhci_td *td,  	ep_ctx = xhci_get_ep_ctx(xhci, xdev->out_ctx, ep_index);  	trb_comp_code = GET_COMP_CODE(le32_to_cpu(event->transfer_len)); -	xhci_debug_trb(xhci, xhci->event_ring->dequeue);  	switch (trb_comp_code) {  	case COMP_SUCCESS:  		if (event_trb == ep_ring->dequeue) { @@ -1643,7 +1631,6 @@ static int process_ctrl_td(struct xhci_hcd *xhci, struct xhci_td *td,  		}  		break;  	case COMP_SHORT_TX: -		xhci_warn(xhci, "WARN: short transfer on control ep\n");  		if (td->urb->transfer_flags & URB_SHORT_NOT_OK)  			*status = -EREMOTEIO;  		else @@ -1946,6 +1933,16 @@ static int handle_tx_event(struct xhci_hcd *xhci,  	xdev = xhci->devs[slot_id];  	if (!xdev) {  		xhci_err(xhci, "ERROR Transfer event pointed to bad slot\n"); +		xhci_err(xhci, "@%016llx %08x %08x %08x %08x\n", +			 (unsigned long long) xhci_trb_virt_to_dma( +				 xhci->event_ring->deq_seg, +				 xhci->event_ring->dequeue), +			 lower_32_bits(le64_to_cpu(event->buffer)), +			 upper_32_bits(le64_to_cpu(event->buffer)), +			 le32_to_cpu(event->transfer_len), +			 le32_to_cpu(event->flags)); +		xhci_dbg(xhci, "Event ring:\n"); +		xhci_debug_segment(xhci, xhci->event_ring->deq_seg);  		return -ENODEV;  	} @@ -1959,6 +1956,16 @@ static int handle_tx_event(struct xhci_hcd *xhci,  	    EP_STATE_DISABLED) {  		xhci_err(xhci, "ERROR Transfer event for disabled endpoint "  				"or incorrect stream ring\n"); +		xhci_err(xhci, "@%016llx %08x %08x %08x %08x\n", +			 (unsigned long long) xhci_trb_virt_to_dma( +				 xhci->event_ring->deq_seg, +				 xhci->event_ring->dequeue), +			 lower_32_bits(le64_to_cpu(event->buffer)), +			 upper_32_bits(le64_to_cpu(event->buffer)), +			 le32_to_cpu(event->transfer_len), +			 le32_to_cpu(event->flags)); +		xhci_dbg(xhci, "Event ring:\n"); +		xhci_debug_segment(xhci, xhci->event_ring->deq_seg);  		return -ENODEV;  	} @@ -1985,7 +1992,7 @@ static int handle_tx_event(struct xhci_hcd *xhci,  		xhci_dbg(xhci, "Stopped on No-op or Link TRB\n");  		break;  	case COMP_STALL: -		xhci_warn(xhci, "WARN: Stalled endpoint\n"); +		xhci_dbg(xhci, "Stalled endpoint\n");  		ep->ep_state |= EP_HALTED;  		status = -EPIPE;  		break; @@ -1995,11 +2002,11 @@ static int handle_tx_event(struct xhci_hcd *xhci,  		break;  	case COMP_SPLIT_ERR:  	case COMP_TX_ERR: -		xhci_warn(xhci, "WARN: transfer error on endpoint\n"); +		xhci_dbg(xhci, "Transfer error on endpoint\n");  		status = -EPROTO;  		break;  	case COMP_BABBLE: -		xhci_warn(xhci, "WARN: babble error on endpoint\n"); +		xhci_dbg(xhci, "Babble error on endpoint\n");  		status = -EOVERFLOW;  		break;  	case COMP_DB_ERR: @@ -2390,17 +2397,7 @@ hw_died:  irqreturn_t xhci_msi_irq(int irq, struct usb_hcd *hcd)  { -	irqreturn_t ret; -	struct xhci_hcd *xhci; - -	xhci = hcd_to_xhci(hcd); -	set_bit(HCD_FLAG_SAW_IRQ, &hcd->flags); -	if (xhci->shared_hcd) -		set_bit(HCD_FLAG_SAW_IRQ, &xhci->shared_hcd->flags); - -	ret = xhci_irq(hcd); - -	return ret; +	return xhci_irq(hcd);  }  /****		Endpoint Ring Operations	****/ @@ -2488,11 +2485,6 @@ static int prepare_ring(struct xhci_hcd *xhci, struct xhci_ring *ep_ring,  			/* Toggle the cycle bit after the last ring segment. */  			if (last_trb_on_last_seg(xhci, ring, ring->enq_seg, next)) {  				ring->cycle_state = (ring->cycle_state ? 0 : 1); -				if (!in_interrupt()) { -					xhci_dbg(xhci, "queue_trb: Toggle cycle " -						"state for ring %p = %i\n", -						ring, (unsigned int)ring->cycle_state); -				}  			}  			ring->enq_seg = ring->enq_seg->next;  			ring->enqueue = ring->enq_seg->trbs; @@ -2561,13 +2553,11 @@ static unsigned int count_sg_trbs_needed(struct xhci_hcd *xhci, struct urb *urb)  	struct scatterlist *sg;  	sg = NULL; -	num_sgs = urb->num_sgs; +	num_sgs = urb->num_mapped_sgs;  	temp = urb->transfer_buffer_length; -	xhci_dbg(xhci, "count sg list trbs: \n");  	num_trbs = 0;  	for_each_sg(urb->sg, sg, num_sgs, i) { -		unsigned int previous_total_trbs = num_trbs;  		unsigned int len = sg_dma_len(sg);  		/* Scatter gather list entries may cross 64KB boundaries */ @@ -2582,22 +2572,11 @@ static unsigned int count_sg_trbs_needed(struct xhci_hcd *xhci, struct urb *urb)  			num_trbs++;  			running_total += TRB_MAX_BUFF_SIZE;  		} -		xhci_dbg(xhci, " sg #%d: dma = %#llx, len = %#x (%d), num_trbs = %d\n", -				i, (unsigned long long)sg_dma_address(sg), -				len, len, num_trbs - previous_total_trbs); -  		len = min_t(int, len, temp);  		temp -= len;  		if (temp == 0)  			break;  	} -	xhci_dbg(xhci, "\n"); -	if (!in_interrupt()) -		xhci_dbg(xhci, "ep %#x - urb len = %d, sglist used, " -				"num_trbs = %d\n", -				urb->ep->desc.bEndpointAddress, -				urb->transfer_buffer_length, -				num_trbs);  	return num_trbs;  } @@ -2745,7 +2724,7 @@ static int queue_bulk_sg_tx(struct xhci_hcd *xhci, gfp_t mem_flags,  		return -EINVAL;  	num_trbs = count_sg_trbs_needed(xhci, urb); -	num_sgs = urb->num_sgs; +	num_sgs = urb->num_mapped_sgs;  	total_packet_count = roundup(urb->transfer_buffer_length,  			usb_endpoint_maxp(&urb->ep->desc)); @@ -2783,8 +2762,6 @@ static int queue_bulk_sg_tx(struct xhci_hcd *xhci, gfp_t mem_flags,  	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; -	xhci_dbg(xhci, "First length to xfer from 1st sglist entry = %u\n", -			trb_buff_len);  	first_trb = true;  	/* Queue the first TRB, even if it's zero-length */ @@ -2816,11 +2793,6 @@ static int queue_bulk_sg_tx(struct xhci_hcd *xhci, gfp_t mem_flags,  		if (usb_urb_dir_in(urb))  			field |= TRB_ISP; -		xhci_dbg(xhci, " sg entry: dma = %#x, len = %#x (%d), " -				"64KB boundary at %#x, end dma = %#x\n", -				(unsigned int) addr, trb_buff_len, trb_buff_len, -				(unsigned int) (addr + TRB_MAX_BUFF_SIZE) & ~(TRB_MAX_BUFF_SIZE - 1), -				(unsigned int) addr + trb_buff_len);  		if (TRB_MAX_BUFF_SIZE -  				(addr & (TRB_MAX_BUFF_SIZE - 1)) < trb_buff_len) {  			xhci_warn(xhci, "WARN: sg dma xfer crosses 64KB boundaries!\n"); @@ -2926,15 +2898,6 @@ int xhci_queue_bulk_tx(struct xhci_hcd *xhci, gfp_t mem_flags,  	}  	/* FIXME: this doesn't deal with URB_ZERO_PACKET - need one more */ -	if (!in_interrupt()) -		xhci_dbg(xhci, "ep %#x - urb len = %#x (%d), " -				"addr = %#llx, num_trbs = %d\n", -				urb->ep->desc.bEndpointAddress, -				urb->transfer_buffer_length, -				urb->transfer_buffer_length, -				(unsigned long long)urb->transfer_dma, -				num_trbs); -  	ret = prepare_transfer(xhci, xhci->devs[slot_id],  			ep_index, urb->stream_id,  			num_trbs, urb, 0, false, mem_flags); @@ -3055,9 +3018,6 @@ int xhci_queue_ctrl_tx(struct xhci_hcd *xhci, gfp_t mem_flags,  	if (!urb->setup_packet)  		return -EINVAL; -	if (!in_interrupt()) -		xhci_dbg(xhci, "Queueing ctrl tx for slot id %d, ep %d\n", -				slot_id, ep_index);  	/* 1 TRB for setup, 1 for status */  	num_trbs = 2;  	/* @@ -3249,15 +3209,6 @@ static int xhci_queue_isoc_tx(struct xhci_hcd *xhci, gfp_t mem_flags,  		return -EINVAL;  	} -	if (!in_interrupt()) -		xhci_dbg(xhci, "ep %#x - urb len = %#x (%d)," -				" addr = %#llx, num_tds = %d\n", -				urb->ep->desc.bEndpointAddress, -				urb->transfer_buffer_length, -				urb->transfer_buffer_length, -				(unsigned long long)urb->transfer_dma, -				num_tds); -  	start_addr = (u64) urb->transfer_dma;  	start_trb = &ep_ring->enqueue->generic;  	start_cycle = ep_ring->cycle_state;  |