Commit 9a7a579e authored by Linus Torvalds's avatar Linus Torvalds

Merge bk://kernel.bkbits.net/gregkh/linux/fix-2.6

into ppc970.osdl.org:/home/torvalds/v2.6/linux
parents f2dbdbf8 20f758ca
...@@ -1382,6 +1382,9 @@ static int hub_port_reset(struct usb_hub *hub, int port1, ...@@ -1382,6 +1382,9 @@ static int hub_port_reset(struct usb_hub *hub, int port1,
/* return on disconnect or reset */ /* return on disconnect or reset */
switch (status) { switch (status) {
case 0: case 0:
/* TRSTRCY = 10 ms */
msleep(10);
/* FALL THROUGH */
case -ENOTCONN: case -ENOTCONN:
case -ENODEV: case -ENODEV:
clear_port_feature(hub->hdev, clear_port_feature(hub->hdev,
......
...@@ -389,8 +389,29 @@ static int ehci_hc_reset (struct usb_hcd *hcd) ...@@ -389,8 +389,29 @@ static int ehci_hc_reset (struct usb_hcd *hcd)
temp = HCS_N_CC(ehci->hcs_params) * HCS_N_PCC(ehci->hcs_params); temp = HCS_N_CC(ehci->hcs_params) * HCS_N_PCC(ehci->hcs_params);
temp &= 0x0f; temp &= 0x0f;
if (temp && HCS_N_PORTS(ehci->hcs_params) > temp) { if (temp && HCS_N_PORTS(ehci->hcs_params) > temp) {
temp |= (ehci->hcs_params & ~0xf); ehci_dbg (ehci, "bogus port configuration: "
ehci->hcs_params = temp; "cc=%d x pcc=%d < ports=%d\n",
HCS_N_CC(ehci->hcs_params),
HCS_N_PCC(ehci->hcs_params),
HCS_N_PORTS(ehci->hcs_params));
#ifdef CONFIG_PCI
if (hcd->self.controller->bus == &pci_bus_type) {
struct pci_dev *pdev;
pdev = to_pci_dev(hcd->self.controller);
switch (pdev->vendor) {
case 0x17a0: /* GENESYS */
/* GL880S: should be PORTS=2 */
temp |= (ehci->hcs_params & ~0xf);
ehci->hcs_params = temp;
break;
case PCI_VENDOR_ID_NVIDIA:
/* NF4: should be PCC=10 */
break;
}
}
#endif
} }
/* force HC to halt state */ /* force HC to halt state */
......
...@@ -267,6 +267,7 @@ __acquires(ehci->lock) ...@@ -267,6 +267,7 @@ __acquires(ehci->lock)
} }
static void start_unlink_async (struct ehci_hcd *ehci, struct ehci_qh *qh); static void start_unlink_async (struct ehci_hcd *ehci, struct ehci_qh *qh);
static void unlink_async (struct ehci_hcd *ehci, struct ehci_qh *qh);
static void intr_deschedule (struct ehci_hcd *ehci, struct ehci_qh *qh); static void intr_deschedule (struct ehci_hcd *ehci, struct ehci_qh *qh);
static int qh_schedule (struct ehci_hcd *ehci, struct ehci_qh *qh); static int qh_schedule (struct ehci_hcd *ehci, struct ehci_qh *qh);
...@@ -430,7 +431,7 @@ qh_completions (struct ehci_hcd *ehci, struct ehci_qh *qh, struct pt_regs *regs) ...@@ -430,7 +431,7 @@ qh_completions (struct ehci_hcd *ehci, struct ehci_qh *qh, struct pt_regs *regs)
intr_deschedule (ehci, qh); intr_deschedule (ehci, qh);
(void) qh_schedule (ehci, qh); (void) qh_schedule (ehci, qh);
} else } else
start_unlink_async (ehci, qh); unlink_async (ehci, qh);
break; break;
/* otherwise, unlink already started */ /* otherwise, unlink already started */
} }
......
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