Re: [PATCH 5/8] xHCI 1.0: Incompatible Device Error

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Urgh, I didn't notice the patch description looked odd.  I'll resend in
a sec.

Sarah Sharp

On Fri, Jun 17, 2011 at 10:32:06AM -0700, Sarah Sharp wrote:
> From: Alex He <alex.he@xxxxxxx>
> 
> xHCI 1.0: Incompatible Device Error
> 
> It is one new TRB Completion Code for the xHCI spec v1.0.
> Asserted if the xHC detects a problem with a device that does not allow it to
> be successfully accessed, e.g. due to a device compliance or compatibility
> problem. This error may be returned by any command or transfer, and is fatal
> as far as the Slot is concerned. Return -EPROTO by urb->status or frame->status
> of ISOC for transfer case. And return -ENODEV for configure endpoint command,
> evaluate context command and address device command if there is an incompatible
> Device Error. The error codes will be sent back to the USB core to decide how
> to do. It's unnecessary for other commands because after the three commands run
> successfully means that the device has been accepted.
> 
> Signed-off-by: Alex He <alex.he@xxxxxxx>
> Signed-off-by: Sarah Sharp <sarah.a.sharp@xxxxxxxxxxxxxxx>
> ---
>  drivers/usb/host/xhci-ring.c |    5 +++++
>  drivers/usb/host/xhci.c      |   15 +++++++++++++++
>  drivers/usb/host/xhci.h      |    2 ++
>  3 files changed, 22 insertions(+), 0 deletions(-)
> 
> diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c
> index 0c00849..436332a 100644
> --- a/drivers/usb/host/xhci-ring.c
> +++ b/drivers/usb/host/xhci-ring.c
> @@ -1733,6 +1733,7 @@ static int process_isoc_td(struct xhci_hcd *xhci, struct xhci_td *td,
>  		frame->status = -EOVERFLOW;
>  		skip_td = true;
>  		break;
> +	case COMP_DEV_ERR:
>  	case COMP_STALL:
>  		frame->status = -EPROTO;
>  		skip_td = true;
> @@ -2016,6 +2017,10 @@ static int handle_tx_event(struct xhci_hcd *xhci,
>  				 TRB_TO_SLOT_ID(le32_to_cpu(event->flags)),
>  				 ep_index);
>  		goto cleanup;
> +	case COMP_DEV_ERR:
> +		xhci_warn(xhci, "WARN: detect an incompatible device");
> +		status = -EPROTO;
> +		break;
>  	case COMP_MISSED_INT:
>  		/*
>  		 * When encounter missed service error, one or more isoc tds
> diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
> index e5a0171..15eb4c3 100644
> --- a/drivers/usb/host/xhci.c
> +++ b/drivers/usb/host/xhci.c
> @@ -1551,6 +1551,11 @@ static int xhci_configure_endpoint_result(struct xhci_hcd *xhci,
>  				"and endpoint is not disabled.\n");
>  		ret = -EINVAL;
>  		break;
> +	case COMP_DEV_ERR:
> +		dev_warn(&udev->dev, "ERROR: Incompatible device for endpoint "
> +				"configure command.\n");
> +		ret = -ENODEV;
> +		break;
>  	case COMP_SUCCESS:
>  		dev_dbg(&udev->dev, "Successful Endpoint Configure command\n");
>  		ret = 0;
> @@ -1585,6 +1590,11 @@ static int xhci_evaluate_context_result(struct xhci_hcd *xhci,
>  		xhci_dbg_ctx(xhci, virt_dev->out_ctx, 1);
>  		ret = -EINVAL;
>  		break;
> +	case COMP_DEV_ERR:
> +		dev_warn(&udev->dev, "ERROR: Incompatible device for evaluate "
> +				"context command.\n");
> +		ret = -ENODEV;
> +		break;
>  	case COMP_MEL_ERR:
>  		/* Max Exit Latency too large error */
>  		dev_warn(&udev->dev, "WARN: Max Exit Latency too large\n");
> @@ -2867,6 +2877,11 @@ int xhci_address_device(struct usb_hcd *hcd, struct usb_device *udev)
>  		dev_warn(&udev->dev, "Device not responding to set address.\n");
>  		ret = -EPROTO;
>  		break;
> +	case COMP_DEV_ERR:
> +		dev_warn(&udev->dev, "ERROR: Incompatible device for address "
> +				"device command.\n");
> +		ret = -ENODEV;
> +		break;
>  	case COMP_SUCCESS:
>  		xhci_dbg(xhci, "Successful Address Device command\n");
>  		break;
> diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h
> index 7d1ea3b..ba90af1 100644
> --- a/drivers/usb/host/xhci.h
> +++ b/drivers/usb/host/xhci.h
> @@ -874,6 +874,8 @@ struct xhci_transfer_event {
>  #define COMP_PING_ERR	20
>  /* Event Ring is full */
>  #define COMP_ER_FULL	21
> +/* Incompatible Device Error */
> +#define COMP_DEV_ERR	22
>  /* Missed Service Error - HC couldn't service an isoc ep within interval */
>  #define COMP_MISSED_INT	23
>  /* Successfully stopped command ring */
> -- 
> 1.7.4.1
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-usb" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux