X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fusb%2Fhost%2Fohci-mem.c;h=2f20d3dc895b8b4a959459573f4089e2014f27f8;hb=refs%2Fheads%2Fvserver;hp=13419364f86ddf24d7a488819070567ef8174ea9;hpb=9bf4aaab3e101692164d49b7ca357651eb691cb6;p=linux-2.6.git diff --git a/drivers/usb/host/ohci-mem.c b/drivers/usb/host/ohci-mem.c index 13419364f..2f20d3dc8 100644 --- a/drivers/usb/host/ohci-mem.c +++ b/drivers/usb/host/ohci-mem.c @@ -1,61 +1,48 @@ /* * OHCI HCD (Host Controller Driver) for USB. - * + * * (C) Copyright 1999 Roman Weissgaerber * (C) Copyright 2000-2002 David Brownell - * + * * 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;