[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: Dan Streetman <ddstreet@ieee.org> Signed-off-by: David Brownell <dbrownell@users.sourceforge.net> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
090ffa9d0e
commit
e09711aef4
|
@ -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 {
|
||||||
|
|
||||||
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;
|
||||||
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;
|
||||||
|
|
Loading…
Reference in New Issue