Commit e09711ae authored by david-b@pacbell.net's avatar david-b@pacbell.net Committed by Greg Kroah-Hartman

[PATCH] ehci: add think_time

This adds think_time to the usb_tt struct and sets it appropriately
(measured in ns); this can help us implement better split transaction
scheduling.
Signed-off-by: default avatarDan Streetman <ddstreet@ieee.org>
Signed-off-by: default avatarDavid Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 090ffa9d
...@@ -627,19 +627,33 @@ static int hub_configure(struct usb_hub *hub, ...@@ -627,19 +627,33 @@ static int hub_configure(struct usb_hub *hub,
break; break;
} }
/* Note 8 FS bit times == (8 bits / 12000000 bps) ~= 666ns */
switch (hub->descriptor->wHubCharacteristics & HUB_CHAR_TTTT) { switch (hub->descriptor->wHubCharacteristics & HUB_CHAR_TTTT) {
case 0x00: case HUB_TTTT_8_BITS:
if (hdev->descriptor.bDeviceProtocol != 0) if (hdev->descriptor.bDeviceProtocol != 0) {
dev_dbg(hub_dev, "TT requires at most 8 FS bit times\n"); hub->tt.think_time = 666;
dev_dbg(hub_dev, "TT requires at most %d "
"FS bit times (%d ns)\n",
8, hub->tt.think_time);
}
break; break;
case 0x20: case HUB_TTTT_16_BITS:
dev_dbg(hub_dev, "TT requires at most 16 FS bit times\n"); hub->tt.think_time = 666 * 2;
dev_dbg(hub_dev, "TT requires at most %d "
"FS bit times (%d ns)\n",
16, hub->tt.think_time);
break; break;
case 0x40: case HUB_TTTT_24_BITS:
dev_dbg(hub_dev, "TT requires at most 24 FS bit times\n"); hub->tt.think_time = 666 * 3;
dev_dbg(hub_dev, "TT requires at most %d "
"FS bit times (%d ns)\n",
24, hub->tt.think_time);
break; break;
case 0x60: case HUB_TTTT_32_BITS:
dev_dbg(hub_dev, "TT requires at most 32 FS bit times\n"); hub->tt.think_time = 666 * 4;
dev_dbg(hub_dev, "TT requires at most %d "
"FS bit times (%d ns)\n",
32, hub->tt.think_time);
break; break;
} }
......
...@@ -157,6 +157,12 @@ enum hub_led_mode { ...@@ -157,6 +157,12 @@ enum hub_led_mode {
struct usb_device; struct usb_device;
/* Transaction Translator Think Times, in bits */
#define HUB_TTTT_8_BITS 0x00
#define HUB_TTTT_16_BITS 0x20
#define HUB_TTTT_24_BITS 0x40
#define HUB_TTTT_32_BITS 0x60
/* /*
* As of USB 2.0, full/low speed devices are segregated into trees. * As of USB 2.0, full/low speed devices are segregated into trees.
* One type grows from USB 1.1 host controllers (OHCI, UHCI etc). * One type grows from USB 1.1 host controllers (OHCI, UHCI etc).
...@@ -170,6 +176,7 @@ struct usb_device; ...@@ -170,6 +176,7 @@ struct usb_device;
struct usb_tt { struct usb_tt {
struct usb_device *hub; /* upstream highspeed hub */ struct usb_device *hub; /* upstream highspeed hub */
int multi; /* true means one TT per port */ int multi; /* true means one TT per port */
unsigned think_time; /* think time in ns */
/* for control/bulk error recovery (CLEAR_TT_BUFFER) */ /* for control/bulk error recovery (CLEAR_TT_BUFFER) */
spinlock_t lock; spinlock_t lock;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment