summaryrefslogtreecommitdiffstats
path: root/drivers/usb
diff options
context:
space:
mode:
authorAndiry Xu <andiry.xu@amd.com>2012-03-05 17:49:33 +0800
committerSarah Sharp <sarah.a.sharp@linux.intel.com>2012-03-13 09:29:46 -0700
commit3fe4fe083d3355537565b2b0a678807513dfa013 (patch)
tree69b30ecc405abdc1c5799db3147574edc6c1334d /drivers/usb
parent3b72fca09d7aed0c1a390370eb3f3f4f0480702a (diff)
xHCI: store ring's last segment and segment numbers
Store the ring's last segment pointer and number of segments for ring expansion usage. Signed-off-by: Andiry Xu <andiry.xu@amd.com> Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com> Tested-by: Paul Zimmerman <Paul.Zimmerman@synopsys.com>
Diffstat (limited to 'drivers/usb')
-rw-r--r--drivers/usb/host/xhci-mem.c2
-rw-r--r--drivers/usb/host/xhci.h2
2 files changed, 4 insertions, 0 deletions
diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c
index 1699df9f256..bdea4de867b 100644
--- a/drivers/usb/host/xhci-mem.c
+++ b/drivers/usb/host/xhci-mem.c
@@ -154,6 +154,7 @@ static struct xhci_ring *xhci_ring_alloc(struct xhci_hcd *xhci,
if (!ring)
return NULL;
+ ring->num_segs = num_segs;
INIT_LIST_HEAD(&ring->td_list);
ring->type = type;
if (num_segs == 0)
@@ -177,6 +178,7 @@ static struct xhci_ring *xhci_ring_alloc(struct xhci_hcd *xhci,
num_segs--;
}
xhci_link_segments(xhci, prev, ring->first_seg, type);
+ ring->last_seg = prev;
/* Only event ring does not use link TRB */
if (type != TYPE_EVENT) {
diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h
index eb369a1723b..2337a8e80b6 100644
--- a/drivers/usb/host/xhci.h
+++ b/drivers/usb/host/xhci.h
@@ -1262,6 +1262,7 @@ enum xhci_ring_type {
struct xhci_ring {
struct xhci_segment *first_seg;
+ struct xhci_segment *last_seg;
union xhci_trb *enqueue;
struct xhci_segment *enq_seg;
unsigned int enq_updates;
@@ -1276,6 +1277,7 @@ struct xhci_ring {
*/
u32 cycle_state;
unsigned int stream_id;
+ unsigned int num_segs;
enum xhci_ring_type type;
bool last_td_was_short;
};