# This is a BitKeeper generated patch for the following project: # Project Name: Linux kernel tree # This patch format is intended for GNU patch command version 2.5 or higher. # This patch includes the following deltas: # ChangeSet 1.543 -> 1.544 # drivers/usb/hcd/ehci-q.c 1.7 -> 1.8 # drivers/usb/hcd/ehci-hub.c 1.5 -> 1.6 # drivers/usb/hcd/ehci-hcd.c 1.8 -> 1.9 # # The following is the BitKeeper ChangeSet Log # -------------------------------------------- # 02/03/18 david-b@pacbell.net 1.544 # USB echi and Intel ICH # # This updates the Philips tweak so that it also applies # to late-model ICH chips from Intel. (Or so I'm told ... :) # That's at least three EHCI implementations known to # behave on Linux. (And one hopes VIA soon too...) # # It also cleans up a few comments relating to 64bit DMA; # recent API spec updates make it look like no games are # needed with the PCI DMA mask -- it doesn't change the # segment used by pci_pool allocations, so it just needs # to get turned on if the overall system does 64bit DMA. # # I've a query in to see if those Philips/Intel tweaks are # chip quirks, or just something the EHCI 1.0 spec isn't # at all clear about. # -------------------------------------------- # diff -Nru a/drivers/usb/hcd/ehci-hcd.c b/drivers/usb/hcd/ehci-hcd.c --- a/drivers/usb/hcd/ehci-hcd.c Wed Apr 3 16:40:11 2002 +++ b/drivers/usb/hcd/ehci-hcd.c Wed Apr 3 16:40:11 2002 @@ -208,6 +208,7 @@ /* controller state: unknown --> reset */ /* EHCI spec section 4.1 */ + // FIXME require STS_HALT before reset... ehci_reset (ehci); writel (INTR_MASK, &ehci->regs->intr_enable); writel (ehci->periodic_dma, &ehci->regs->frame_list); @@ -215,16 +216,17 @@ /* * hcc_params controls whether ehci->regs->segment must (!!!) * be used; it constrains QH/ITD/SITD and QTD locations. - * By default, pci_alloc_consistent() won't hand out addresses - * above 4GB (via pdev->dma_mask) so we know this value. - * - * NOTE: that pdev->dma_mask setting means that all DMA mappings - * for I/O buffers will have the same restriction, though it's - * neither necessary nor desirable in that case. + * pci_pool consistent memory always uses segment zero. */ if (HCC_64BIT_ADDR (hcc_params)) { writel (0, &ehci->regs->segment); - info ("using segment 0 for 64bit DMA addresses ..."); + /* + * FIXME Enlarge pci_set_dma_mask() when possible. The DMA + * mapping API spec now says that'll affect only single shot + * mappings, and the pci_pool data will stay safe in seg 0. + * That's what we want: no extra copies for USB transfers. + */ + info ("restricting 64bit DMA mappings to segment 0 ..."); } /* clear interrupt enables, set irq latency */ @@ -234,6 +236,9 @@ temp |= 1 << (16 + log2_irq_thresh); // keeping default periodic framelist size temp &= ~(CMD_IAAD | CMD_ASE | CMD_PSE), + // Philips, Intel, and maybe others need CMD_RUN before the + // root hub will detect new devices (why?); NEC doesn't + temp |= CMD_RUN; writel (temp, &ehci->regs->command); dbg_cmd (ehci, "init", temp); @@ -260,7 +265,7 @@ readl (&ehci->regs->command); /* unblock posted write */ /* PCI Serial Bus Release Number is at 0x60 offset */ - pci_read_config_byte(hcd->pdev, 0x60, &tempbyte); + pci_read_config_byte (hcd->pdev, 0x60, &tempbyte); temp = readw (&ehci->caps->hci_version); info ("USB %x.%x support enabled, EHCI rev %x.%2x", ((tempbyte & 0xf0)>>4), @@ -387,6 +392,8 @@ // restore pci FLADJ value // khubd and drivers will set HC running, if needed; hcd->state = USB_STATE_READY; + // FIXME Philips/Intel/... etc don't really have a "READY" + // state ... turn on CMD_RUN too for (i = 0; i < ports; i++) { int temp = readl (&ehci->regs->port_status [i]); diff -Nru a/drivers/usb/hcd/ehci-hub.c b/drivers/usb/hcd/ehci-hub.c --- a/drivers/usb/hcd/ehci-hub.c Wed Apr 3 16:40:11 2002 +++ b/drivers/usb/hcd/ehci-hub.c Wed Apr 3 16:40:11 2002 @@ -309,13 +309,6 @@ hcd->bus_name, wIndex + 1); temp |= PORT_OWNER; } else { - /* Philips 1562 wants CMD_RUN to reset */ - if (!HCD_IS_RUNNING(ehci->hcd.state)) { - u32 cmd = readl (&ehci->regs->command); - cmd |= CMD_RUN; - writel (cmd, &ehci->regs->command); - ehci->hcd.state = USB_STATE_RUNNING; - } vdbg ("%s port %d reset", hcd->bus_name, wIndex + 1); temp |= PORT_RESET; diff -Nru a/drivers/usb/hcd/ehci-q.c b/drivers/usb/hcd/ehci-q.c --- a/drivers/usb/hcd/ehci-q.c Wed Apr 3 16:40:11 2002 +++ b/drivers/usb/hcd/ehci-q.c Wed Apr 3 16:40:11 2002 @@ -436,14 +436,6 @@ if (usb_pipecontrol (urb->pipe)) { /* control request data is passed in the "setup" pid */ - - /* NOTE: this isn't smart about 64bit DMA, since it uses the - * default (32bit) mask rather than using the whole address - * space. we could set pdev->dma_mask to all-ones while - * getting this mapping, locking it and restoring before - * allocating qtd/qh/... or maybe only do that for the main - * data phase (below). - */ qtd->buf_dma = pci_map_single ( ehci->hcd.pdev, urb->setup_packet, @@ -472,7 +464,6 @@ */ len = urb->transfer_buffer_length; if (likely (len > 0)) { - /* NOTE: sub-optimal mapping with 64bit DMA (see above) */ buf = map_buf = pci_map_single (ehci->hcd.pdev, urb->transfer_buffer, len, usb_pipein (urb->pipe)