# 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      [EMAIL PROTECTED]     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)

_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to