aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/host/xhci.h
diff options
context:
space:
mode:
authorSarah Sharp <sarah.a.sharp@linux.intel.com>2011-09-02 14:05:48 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2011-09-09 18:52:53 -0400
commit9af5d71d8e1fc404ad2ac1b568dafa1a2f9b3be2 (patch)
treed3f3732ada05aaef7ffb76cfbc5d849b0fc421ac /drivers/usb/host/xhci.h
parent839c817ce67178ca3c7c7ad534c571bba1e69ebe (diff)
xhci: Store endpoint bandwidth information.
In the upcoming patches, we'll use some stored endpoint information to make software keep track of the worst-case bandwidth schedule. We need to store several variables associated with each periodic endpoint: - the type of endpoint - Max Packet Size - Mult - Max ESIT payload - Max Burst Size (aka number of packets, stored in one-based form) - the endpoint interval (normalized to powers of 2 microframes) All this information is available to the hardware, and stored in its device output context. However, we need to ensure that the new information is stored before the xHCI driver drops the xhci->lock to wait on the Configure Endpoint command, so that another driver requesting a configuration or alt setting change will see the update. The Configure Endpoint command will never fail on the hardware that needs this software bandwidth checking (assuming the slot is enabled and the flags are set properly), so updating the endpoint info before the command completes should be fine. Until we add in the bandwidth checking code, just update the endpoint information after the Configure Endpoint command completes, and after a Reset Device command completes. Don't bother to clear the endpoint bandwidth info when a device is being freed, since the xhci_virt_ep is just going to be freed anyway. Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb/host/xhci.h')
-rw-r--r--drivers/usb/host/xhci.h31
1 files changed, 31 insertions, 0 deletions
diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h
index eee47c8a6ee8..af15b903e061 100644
--- a/drivers/usb/host/xhci.h
+++ b/drivers/usb/host/xhci.h
@@ -611,11 +611,13 @@ struct xhci_ep_ctx {
611#define EP_STATE_ERROR 4 611#define EP_STATE_ERROR 4
612/* Mult - Max number of burtst within an interval, in EP companion desc. */ 612/* Mult - Max number of burtst within an interval, in EP companion desc. */
613#define EP_MULT(p) (((p) & 0x3) << 8) 613#define EP_MULT(p) (((p) & 0x3) << 8)
614#define CTX_TO_EP_MULT(p) (((p) >> 8) & 0x3)
614/* bits 10:14 are Max Primary Streams */ 615/* bits 10:14 are Max Primary Streams */
615/* bit 15 is Linear Stream Array */ 616/* bit 15 is Linear Stream Array */
616/* Interval - period between requests to an endpoint - 125u increments. */ 617/* Interval - period between requests to an endpoint - 125u increments. */
617#define EP_INTERVAL(p) (((p) & 0xff) << 16) 618#define EP_INTERVAL(p) (((p) & 0xff) << 16)
618#define EP_INTERVAL_TO_UFRAMES(p) (1 << (((p) >> 16) & 0xff)) 619#define EP_INTERVAL_TO_UFRAMES(p) (1 << (((p) >> 16) & 0xff))
620#define CTX_TO_EP_INTERVAL(p) (((p) >> 16) & 0xff)
619#define EP_MAXPSTREAMS_MASK (0x1f << 10) 621#define EP_MAXPSTREAMS_MASK (0x1f << 10)
620#define EP_MAXPSTREAMS(p) (((p) << 10) & EP_MAXPSTREAMS_MASK) 622#define EP_MAXPSTREAMS(p) (((p) << 10) & EP_MAXPSTREAMS_MASK)
621/* Endpoint is set up with a Linear Stream Array (vs. Secondary Stream Array) */ 623/* Endpoint is set up with a Linear Stream Array (vs. Secondary Stream Array) */
@@ -640,6 +642,7 @@ struct xhci_ep_ctx {
640/* bit 6 reserved */ 642/* bit 6 reserved */
641/* bit 7 is Host Initiate Disable - for disabling stream selection */ 643/* bit 7 is Host Initiate Disable - for disabling stream selection */
642#define MAX_BURST(p) (((p)&0xff) << 8) 644#define MAX_BURST(p) (((p)&0xff) << 8)
645#define CTX_TO_MAX_BURST(p) (((p) >> 8) & 0xff)
643#define MAX_PACKET(p) (((p)&0xffff) << 16) 646#define MAX_PACKET(p) (((p)&0xffff) << 16)
644#define MAX_PACKET_MASK (0xffff << 16) 647#define MAX_PACKET_MASK (0xffff << 16)
645#define MAX_PACKET_DECODED(p) (((p) >> 16) & 0xffff) 648#define MAX_PACKET_DECODED(p) (((p) >> 16) & 0xffff)
@@ -652,6 +655,7 @@ struct xhci_ep_ctx {
652/* tx_info bitmasks */ 655/* tx_info bitmasks */
653#define AVG_TRB_LENGTH_FOR_EP(p) ((p) & 0xffff) 656#define AVG_TRB_LENGTH_FOR_EP(p) ((p) & 0xffff)
654#define MAX_ESIT_PAYLOAD_FOR_EP(p) (((p) & 0xffff) << 16) 657#define MAX_ESIT_PAYLOAD_FOR_EP(p) (((p) & 0xffff) << 16)
658#define CTX_TO_MAX_ESIT_PAYLOAD(p) (((p) >> 16) & 0xffff)
655 659
656/* deq bitmasks */ 660/* deq bitmasks */
657#define EP_CTX_CYCLE_MASK (1 << 0) 661#define EP_CTX_CYCLE_MASK (1 << 0)
@@ -670,6 +674,11 @@ struct xhci_input_control_ctx {
670 __le32 rsvd2[6]; 674 __le32 rsvd2[6];
671}; 675};
672 676
677#define EP_IS_ADDED(ctrl_ctx, i) \
678 (le32_to_cpu(ctrl_ctx->add_flags) & (1 << (i + 1)))
679#define EP_IS_DROPPED(ctrl_ctx, i) \
680 (le32_to_cpu(ctrl_ctx->drop_flags) & (1 << (i + 1)))
681
673/* Represents everything that is needed to issue a command on the command ring. 682/* Represents everything that is needed to issue a command on the command ring.
674 * It's useful to pre-allocate these for commands that cannot fail due to 683 * It's useful to pre-allocate these for commands that cannot fail due to
675 * out-of-memory errors, like freeing streams. 684 * out-of-memory errors, like freeing streams.
@@ -731,6 +740,22 @@ struct xhci_stream_info {
731#define SMALL_STREAM_ARRAY_SIZE 256 740#define SMALL_STREAM_ARRAY_SIZE 256
732#define MEDIUM_STREAM_ARRAY_SIZE 1024 741#define MEDIUM_STREAM_ARRAY_SIZE 1024
733 742
743/* Some Intel xHCI host controllers need software to keep track of the bus
744 * bandwidth. Keep track of endpoint info here. Each root port is allocated
745 * the full bus bandwidth. We must also treat TTs (including each port under a
746 * multi-TT hub) as a separate bandwidth domain. The direct memory interface
747 * (DMI) also limits the total bandwidth (across all domains) that can be used.
748 */
749struct xhci_bw_info {
750 unsigned int ep_interval;
751 /* mult and num_packets are zero-based */
752 unsigned int mult;
753 unsigned int num_packets;
754 unsigned int max_packet_size;
755 unsigned int max_esit_payload;
756 unsigned int type;
757};
758
734struct xhci_virt_ep { 759struct xhci_virt_ep {
735 struct xhci_ring *ring; 760 struct xhci_ring *ring;
736 /* Related to endpoints that are configured to use stream IDs only */ 761 /* Related to endpoints that are configured to use stream IDs only */
@@ -772,6 +797,7 @@ struct xhci_virt_ep {
772 * process the missed tds on the endpoint ring. 797 * process the missed tds on the endpoint ring.
773 */ 798 */
774 bool skip; 799 bool skip;
800 struct xhci_bw_info bw_info;
775}; 801};
776 802
777enum xhci_overhead_type { 803enum xhci_overhead_type {
@@ -1485,6 +1511,11 @@ unsigned int xhci_get_endpoint_flag(struct usb_endpoint_descriptor *desc);
1485unsigned int xhci_get_endpoint_flag_from_index(unsigned int ep_index); 1511unsigned int xhci_get_endpoint_flag_from_index(unsigned int ep_index);
1486unsigned int xhci_last_valid_endpoint(u32 added_ctxs); 1512unsigned int xhci_last_valid_endpoint(u32 added_ctxs);
1487void xhci_endpoint_zero(struct xhci_hcd *xhci, struct xhci_virt_device *virt_dev, struct usb_host_endpoint *ep); 1513void xhci_endpoint_zero(struct xhci_hcd *xhci, struct xhci_virt_device *virt_dev, struct usb_host_endpoint *ep);
1514void xhci_clear_endpoint_bw_info(struct xhci_bw_info *bw_info);
1515void xhci_update_bw_info(struct xhci_hcd *xhci,
1516 struct xhci_container_ctx *in_ctx,
1517 struct xhci_input_control_ctx *ctrl_ctx,
1518 struct xhci_virt_device *virt_dev);
1488void xhci_endpoint_copy(struct xhci_hcd *xhci, 1519void xhci_endpoint_copy(struct xhci_hcd *xhci,
1489 struct xhci_container_ctx *in_ctx, 1520 struct xhci_container_ctx *in_ctx,
1490 struct xhci_container_ctx *out_ctx, 1521 struct xhci_container_ctx *out_ctx,