aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorAlex He <alex.he@amd.com>2011-06-08 06:34:06 -0400
committerSarah Sharp <sarah.a.sharp@linux.intel.com>2011-06-17 14:28:08 -0400
commitf6ba6fe2d913da6707a71a413d6ec8ae98d6ce18 (patch)
tree2da2e6bc2b35659e5372825ecfd575ffad70ca5e /drivers
parente1cf486d881d853d710e2d86a7adfc5fd260990f (diff)
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@amd.com> Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/usb/host/xhci-ring.c5
-rw-r--r--drivers/usb/host/xhci.c15
-rw-r--r--drivers/usb/host/xhci.h2
3 files changed, 22 insertions, 0 deletions
diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c
index 0c008497edfd..436332aa341b 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,
1733 frame->status = -EOVERFLOW; 1733 frame->status = -EOVERFLOW;
1734 skip_td = true; 1734 skip_td = true;
1735 break; 1735 break;
1736 case COMP_DEV_ERR:
1736 case COMP_STALL: 1737 case COMP_STALL:
1737 frame->status = -EPROTO; 1738 frame->status = -EPROTO;
1738 skip_td = true; 1739 skip_td = true;
@@ -2016,6 +2017,10 @@ static int handle_tx_event(struct xhci_hcd *xhci,
2016 TRB_TO_SLOT_ID(le32_to_cpu(event->flags)), 2017 TRB_TO_SLOT_ID(le32_to_cpu(event->flags)),
2017 ep_index); 2018 ep_index);
2018 goto cleanup; 2019 goto cleanup;
2020 case COMP_DEV_ERR:
2021 xhci_warn(xhci, "WARN: detect an incompatible device");
2022 status = -EPROTO;
2023 break;
2019 case COMP_MISSED_INT: 2024 case COMP_MISSED_INT:
2020 /* 2025 /*
2021 * When encounter missed service error, one or more isoc tds 2026 * 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 e5a01713f937..15eb4c3d793c 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,
1551 "and endpoint is not disabled.\n"); 1551 "and endpoint is not disabled.\n");
1552 ret = -EINVAL; 1552 ret = -EINVAL;
1553 break; 1553 break;
1554 case COMP_DEV_ERR:
1555 dev_warn(&udev->dev, "ERROR: Incompatible device for endpoint "
1556 "configure command.\n");
1557 ret = -ENODEV;
1558 break;
1554 case COMP_SUCCESS: 1559 case COMP_SUCCESS:
1555 dev_dbg(&udev->dev, "Successful Endpoint Configure command\n"); 1560 dev_dbg(&udev->dev, "Successful Endpoint Configure command\n");
1556 ret = 0; 1561 ret = 0;
@@ -1585,6 +1590,11 @@ static int xhci_evaluate_context_result(struct xhci_hcd *xhci,
1585 xhci_dbg_ctx(xhci, virt_dev->out_ctx, 1); 1590 xhci_dbg_ctx(xhci, virt_dev->out_ctx, 1);
1586 ret = -EINVAL; 1591 ret = -EINVAL;
1587 break; 1592 break;
1593 case COMP_DEV_ERR:
1594 dev_warn(&udev->dev, "ERROR: Incompatible device for evaluate "
1595 "context command.\n");
1596 ret = -ENODEV;
1597 break;
1588 case COMP_MEL_ERR: 1598 case COMP_MEL_ERR:
1589 /* Max Exit Latency too large error */ 1599 /* Max Exit Latency too large error */
1590 dev_warn(&udev->dev, "WARN: Max Exit Latency too large\n"); 1600 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)
2867 dev_warn(&udev->dev, "Device not responding to set address.\n"); 2877 dev_warn(&udev->dev, "Device not responding to set address.\n");
2868 ret = -EPROTO; 2878 ret = -EPROTO;
2869 break; 2879 break;
2880 case COMP_DEV_ERR:
2881 dev_warn(&udev->dev, "ERROR: Incompatible device for address "
2882 "device command.\n");
2883 ret = -ENODEV;
2884 break;
2870 case COMP_SUCCESS: 2885 case COMP_SUCCESS:
2871 xhci_dbg(xhci, "Successful Address Device command\n"); 2886 xhci_dbg(xhci, "Successful Address Device command\n");
2872 break; 2887 break;
diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h
index 7d1ea3bf5e1f..ba90af1c34b4 100644
--- a/drivers/usb/host/xhci.h
+++ b/drivers/usb/host/xhci.h
@@ -874,6 +874,8 @@ struct xhci_transfer_event {
874#define COMP_PING_ERR 20 874#define COMP_PING_ERR 20
875/* Event Ring is full */ 875/* Event Ring is full */
876#define COMP_ER_FULL 21 876#define COMP_ER_FULL 21
877/* Incompatible Device Error */
878#define COMP_DEV_ERR 22
877/* Missed Service Error - HC couldn't service an isoc ep within interval */ 879/* Missed Service Error - HC couldn't service an isoc ep within interval */
878#define COMP_MISSED_INT 23 880#define COMP_MISSED_INT 23
879/* Successfully stopped command ring */ 881/* Successfully stopped command ring */