fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / drivers / usb / host / ohci-mem.c
index 1341936..2f20d3d 100644 (file)
@@ -1,61 +1,48 @@
 /*
  * OHCI HCD (Host Controller Driver) for USB.
- * 
+ *
  * (C) Copyright 1999 Roman Weissgaerber <weissg@vienna.at>
  * (C) Copyright 2000-2002 David Brownell <dbrownell@users.sourceforge.net>
- * 
+ *
  * This file is licenced under the GPL.
  */
 
 /*-------------------------------------------------------------------------*/
 
 /*
- * There's basically three types of memory:
+ * OHCI deals with three types of memory:
  *     - data used only by the HCD ... kmalloc is fine
  *     - async and periodic schedules, shared by HC and HCD ... these
  *       need to use dma_pool or dma_alloc_coherent
  *     - driver buffers, read/written by HC ... the hcd glue or the
  *       device driver provides us with dma addresses
  *
- * There's also PCI "register" data, which is memory mapped.
- * No memory seen by this driver is pagable.
+ * There's also "register" data, which is memory mapped.
+ * No memory seen by this driver (or any HCD) may be paged out.
  */
 
 /*-------------------------------------------------------------------------*/
 
-static struct usb_hcd *ohci_hcd_alloc (void)
-{
-       struct ohci_hcd *ohci;
-
-       ohci = (struct ohci_hcd *) kmalloc (sizeof *ohci, GFP_KERNEL);
-       if (ohci != 0) {
-               memset (ohci, 0, sizeof (struct ohci_hcd));
-               ohci->hcd.product_desc = "OHCI Host Controller";
-               ohci->next_statechange = jiffies;
-               spin_lock_init (&ohci->lock);
-               INIT_LIST_HEAD (&ohci->pending);
-               INIT_WORK (&ohci->rh_resume, ohci_rh_resume, &ohci->hcd);
-               return &ohci->hcd;
-       }
-       return NULL;
-}
-
-static void ohci_hcd_free (struct usb_hcd *hcd)
+static void ohci_hcd_init (struct ohci_hcd *ohci)
 {
-       kfree (hcd_to_ohci (hcd));
+       ohci->next_statechange = jiffies;
+       spin_lock_init (&ohci->lock);
+       INIT_LIST_HEAD (&ohci->pending);
 }
 
 /*-------------------------------------------------------------------------*/
 
 static int ohci_mem_init (struct ohci_hcd *ohci)
 {
-       ohci->td_cache = dma_pool_create ("ohci_td", ohci->hcd.self.controller,
+       ohci->td_cache = dma_pool_create ("ohci_td",
+               ohci_to_hcd(ohci)->self.controller,
                sizeof (struct td),
                32 /* byte alignment */,
                0 /* no page-crossing issues */);
        if (!ohci->td_cache)
                return -ENOMEM;
-       ohci->ed_cache = dma_pool_create ("ohci_ed", ohci->hcd.self.controller,
+       ohci->ed_cache = dma_pool_create ("ohci_ed",
+               ohci_to_hcd(ohci)->self.controller,
                sizeof (struct ed),
                16 /* byte alignment */,
                0 /* no page-crossing issues */);
@@ -95,7 +82,7 @@ dma_to_td (struct ohci_hcd *hc, dma_addr_t td_dma)
 
 /* TDs ... */
 static struct td *
-td_alloc (struct ohci_hcd *hc, int mem_flags)
+td_alloc (struct ohci_hcd *hc, gfp_t mem_flags)
 {
        dma_addr_t      dma;
        struct td       *td;
@@ -104,7 +91,7 @@ td_alloc (struct ohci_hcd *hc, int mem_flags)
        if (td) {
                /* in case hc fetches it, make it look dead */
                memset (td, 0, sizeof *td);
-               td->hwNextTD = cpu_to_le32 (dma);
+               td->hwNextTD = cpu_to_hc32 (hc, dma);
                td->td_dma = dma;
                /* hashed in td_fill */
        }
@@ -120,7 +107,7 @@ td_free (struct ohci_hcd *hc, struct td *td)
                prev = &(*prev)->td_hash;
        if (*prev)
                *prev = td->td_hash;
-       else if ((td->hwINFO & TD_DONE) != 0)
+       else if ((td->hwINFO & cpu_to_hc32(hc, TD_DONE)) != 0)
                ohci_dbg (hc, "no hash for td %p\n", td);
        dma_pool_free (hc->td_cache, td, td->td_dma);
 }
@@ -129,7 +116,7 @@ td_free (struct ohci_hcd *hc, struct td *td)
 
 /* EDs ... */
 static struct ed *
-ed_alloc (struct ohci_hcd *hc, int mem_flags)
+ed_alloc (struct ohci_hcd *hc, gfp_t mem_flags)
 {
        dma_addr_t      dma;
        struct ed       *ed;