xref: /utopia/UTPA2-700.0.x/modules/usb/drv/usb_ecos/usbhost/drvPCIMEM.c (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
1*53ee8cc1Swenshuai.xi //<MStar Software>
2*53ee8cc1Swenshuai.xi //******************************************************************************
3*53ee8cc1Swenshuai.xi // MStar Software
4*53ee8cc1Swenshuai.xi // Copyright (c) 2010 - 2012 MStar Semiconductor, Inc. All rights reserved.
5*53ee8cc1Swenshuai.xi // All software, firmware and related documentation herein ("MStar Software") are
6*53ee8cc1Swenshuai.xi // intellectual property of MStar Semiconductor, Inc. ("MStar") and protected by
7*53ee8cc1Swenshuai.xi // law, including, but not limited to, copyright law and international treaties.
8*53ee8cc1Swenshuai.xi // Any use, modification, reproduction, retransmission, or republication of all
9*53ee8cc1Swenshuai.xi // or part of MStar Software is expressly prohibited, unless prior written
10*53ee8cc1Swenshuai.xi // permission has been granted by MStar.
11*53ee8cc1Swenshuai.xi //
12*53ee8cc1Swenshuai.xi // By accessing, browsing and/or using MStar Software, you acknowledge that you
13*53ee8cc1Swenshuai.xi // have read, understood, and agree, to be bound by below terms ("Terms") and to
14*53ee8cc1Swenshuai.xi // comply with all applicable laws and regulations:
15*53ee8cc1Swenshuai.xi //
16*53ee8cc1Swenshuai.xi // 1. MStar shall retain any and all right, ownership and interest to MStar
17*53ee8cc1Swenshuai.xi //    Software and any modification/derivatives thereof.
18*53ee8cc1Swenshuai.xi //    No right, ownership, or interest to MStar Software and any
19*53ee8cc1Swenshuai.xi //    modification/derivatives thereof is transferred to you under Terms.
20*53ee8cc1Swenshuai.xi //
21*53ee8cc1Swenshuai.xi // 2. You understand that MStar Software might include, incorporate or be
22*53ee8cc1Swenshuai.xi //    supplied together with third party`s software and the use of MStar
23*53ee8cc1Swenshuai.xi //    Software may require additional licenses from third parties.
24*53ee8cc1Swenshuai.xi //    Therefore, you hereby agree it is your sole responsibility to separately
25*53ee8cc1Swenshuai.xi //    obtain any and all third party right and license necessary for your use of
26*53ee8cc1Swenshuai.xi //    such third party`s software.
27*53ee8cc1Swenshuai.xi //
28*53ee8cc1Swenshuai.xi // 3. MStar Software and any modification/derivatives thereof shall be deemed as
29*53ee8cc1Swenshuai.xi //    MStar`s confidential information and you agree to keep MStar`s
30*53ee8cc1Swenshuai.xi //    confidential information in strictest confidence and not disclose to any
31*53ee8cc1Swenshuai.xi //    third party.
32*53ee8cc1Swenshuai.xi //
33*53ee8cc1Swenshuai.xi // 4. MStar Software is provided on an "AS IS" basis without warranties of any
34*53ee8cc1Swenshuai.xi //    kind. Any warranties are hereby expressly disclaimed by MStar, including
35*53ee8cc1Swenshuai.xi //    without limitation, any warranties of merchantability, non-infringement of
36*53ee8cc1Swenshuai.xi //    intellectual property rights, fitness for a particular purpose, error free
37*53ee8cc1Swenshuai.xi //    and in conformity with any international standard.  You agree to waive any
38*53ee8cc1Swenshuai.xi //    claim against MStar for any loss, damage, cost or expense that you may
39*53ee8cc1Swenshuai.xi //    incur related to your use of MStar Software.
40*53ee8cc1Swenshuai.xi //    In no event shall MStar be liable for any direct, indirect, incidental or
41*53ee8cc1Swenshuai.xi //    consequential damages, including without limitation, lost of profit or
42*53ee8cc1Swenshuai.xi //    revenues, lost or damage of data, and unauthorized system use.
43*53ee8cc1Swenshuai.xi //    You agree that this Section 4 shall still apply without being affected
44*53ee8cc1Swenshuai.xi //    even if MStar Software has been modified by MStar in accordance with your
45*53ee8cc1Swenshuai.xi //    request or instruction for your use, except otherwise agreed by both
46*53ee8cc1Swenshuai.xi //    parties in writing.
47*53ee8cc1Swenshuai.xi //
48*53ee8cc1Swenshuai.xi // 5. If requested, MStar may from time to time provide technical supports or
49*53ee8cc1Swenshuai.xi //    services in relation with MStar Software to you for your use of
50*53ee8cc1Swenshuai.xi //    MStar Software in conjunction with your or your customer`s product
51*53ee8cc1Swenshuai.xi //    ("Services").
52*53ee8cc1Swenshuai.xi //    You understand and agree that, except otherwise agreed by both parties in
53*53ee8cc1Swenshuai.xi //    writing, Services are provided on an "AS IS" basis and the warranty
54*53ee8cc1Swenshuai.xi //    disclaimer set forth in Section 4 above shall apply.
55*53ee8cc1Swenshuai.xi //
56*53ee8cc1Swenshuai.xi // 6. Nothing contained herein shall be construed as by implication, estoppels
57*53ee8cc1Swenshuai.xi //    or otherwise:
58*53ee8cc1Swenshuai.xi //    (a) conferring any license or right to use MStar name, trademark, service
59*53ee8cc1Swenshuai.xi //        mark, symbol or any other identification;
60*53ee8cc1Swenshuai.xi //    (b) obligating MStar or any of its affiliates to furnish any person,
61*53ee8cc1Swenshuai.xi //        including without limitation, you and your customers, any assistance
62*53ee8cc1Swenshuai.xi //        of any kind whatsoever, or any information; or
63*53ee8cc1Swenshuai.xi //    (c) conferring any license or right under any intellectual property right.
64*53ee8cc1Swenshuai.xi //
65*53ee8cc1Swenshuai.xi // 7. These terms shall be governed by and construed in accordance with the laws
66*53ee8cc1Swenshuai.xi //    of Taiwan, R.O.C., excluding its conflict of law rules.
67*53ee8cc1Swenshuai.xi //    Any and all dispute arising out hereof or related hereto shall be finally
68*53ee8cc1Swenshuai.xi //    settled by arbitration referred to the Chinese Arbitration Association,
69*53ee8cc1Swenshuai.xi //    Taipei in accordance with the ROC Arbitration Law and the Arbitration
70*53ee8cc1Swenshuai.xi //    Rules of the Association by three (3) arbitrators appointed in accordance
71*53ee8cc1Swenshuai.xi //    with the said Rules.
72*53ee8cc1Swenshuai.xi //    The place of arbitration shall be in Taipei, Taiwan and the language shall
73*53ee8cc1Swenshuai.xi //    be English.
74*53ee8cc1Swenshuai.xi //    The arbitration award shall be final and binding to both parties.
75*53ee8cc1Swenshuai.xi //
76*53ee8cc1Swenshuai.xi //******************************************************************************
77*53ee8cc1Swenshuai.xi //<MStar Software>
78*53ee8cc1Swenshuai.xi 
79*53ee8cc1Swenshuai.xi #include <MsCommon.h>
80*53ee8cc1Swenshuai.xi #include "include/drvCompiler.h"
81*53ee8cc1Swenshuai.xi #include "include/drvPorts.h"
82*53ee8cc1Swenshuai.xi #include "include/drvPCIMEM.h"
83*53ee8cc1Swenshuai.xi #include "include/drvKernel.h"
84*53ee8cc1Swenshuai.xi #include "include/drvUSB.h"
85*53ee8cc1Swenshuai.xi #include "include/drvBitops.h"
86*53ee8cc1Swenshuai.xi 
87*53ee8cc1Swenshuai.xi /* ================================================ PCI Memory Management Porting ====================================================== */
88*53ee8cc1Swenshuai.xi 
89*53ee8cc1Swenshuai.xi static __inline__ int
is_page_busy(int blocks,U32 * bitmap)90*53ee8cc1Swenshuai.xi is_page_busy (int blocks, U32 *bitmap)
91*53ee8cc1Swenshuai.xi {
92*53ee8cc1Swenshuai.xi   while (blocks > 0) {
93*53ee8cc1Swenshuai.xi     if (*bitmap++ != ~0UL)
94*53ee8cc1Swenshuai.xi       return 1;
95*53ee8cc1Swenshuai.xi     blocks -= BITS_PER_LONG;
96*53ee8cc1Swenshuai.xi   }
97*53ee8cc1Swenshuai.xi   return 0;
98*53ee8cc1Swenshuai.xi }
99*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
100*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
101*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
102*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
103*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
104*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
105*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
106*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
107*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
108*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
109*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
110*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
111*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
112*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
113*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
114*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
115*53ee8cc1Swenshuai.xi 
pci_pool_create(const char * name,struct pci_dev * pdev,size_t size,size_t align,size_t allocation)116*53ee8cc1Swenshuai.xi struct pci_pool *pci_pool_create (const char *name, struct pci_dev *pdev,
117*53ee8cc1Swenshuai.xi   size_t size, size_t align, size_t allocation)
118*53ee8cc1Swenshuai.xi {
119*53ee8cc1Swenshuai.xi   struct pci_pool    *retval;
120*53ee8cc1Swenshuai.xi 
121*53ee8cc1Swenshuai.xi   if (align == 0)
122*53ee8cc1Swenshuai.xi     align = 1;
123*53ee8cc1Swenshuai.xi   if (size == 0)
124*53ee8cc1Swenshuai.xi     return 0;
125*53ee8cc1Swenshuai.xi   else if (size < align)
126*53ee8cc1Swenshuai.xi     size = align;
127*53ee8cc1Swenshuai.xi   else if ((size % align) != 0) {
128*53ee8cc1Swenshuai.xi     size += align + 1;
129*53ee8cc1Swenshuai.xi     size &= ~(align - 1);
130*53ee8cc1Swenshuai.xi   }
131*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
132*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
133*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
134*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
135*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
136*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
137*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
138*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
139*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
140*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
141*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
142*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
143*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
144*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
145*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
146*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
147*53ee8cc1Swenshuai.xi 
148*53ee8cc1Swenshuai.xi   if (allocation == 0) {
149*53ee8cc1Swenshuai.xi     if (PAGE_SIZE < size)
150*53ee8cc1Swenshuai.xi       allocation = size;
151*53ee8cc1Swenshuai.xi     else
152*53ee8cc1Swenshuai.xi       allocation = PAGE_SIZE;
153*53ee8cc1Swenshuai.xi   } else if (allocation < size)
154*53ee8cc1Swenshuai.xi     return 0;
155*53ee8cc1Swenshuai.xi 
156*53ee8cc1Swenshuai.xi   if (!(retval = (struct pci_pool*) kmalloc (sizeof (*retval), SLAB_KERNEL)))
157*53ee8cc1Swenshuai.xi     return retval;
158*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
159*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
160*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
161*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
162*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
163*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
164*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
165*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
166*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
167*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
168*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
169*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
170*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
171*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
172*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
173*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
174*53ee8cc1Swenshuai.xi 
175*53ee8cc1Swenshuai.xi   strncpy (retval->name, name, sizeof (retval->name) );
176*53ee8cc1Swenshuai.xi   INIT_LIST_HEAD (&retval->page_list);
177*53ee8cc1Swenshuai.xi   retval->dev = pdev;
178*53ee8cc1Swenshuai.xi   retval->size = size;
179*53ee8cc1Swenshuai.xi   retval->allocation = allocation;
180*53ee8cc1Swenshuai.xi   retval->blocks_per_page = allocation / size;
181*53ee8cc1Swenshuai.xi   kdbg("Created Mem info: size=%d,allocation=%d bytes, %d blocks per page", retval->size, retval->allocation, retval->blocks_per_page);
182*53ee8cc1Swenshuai.xi   return retval;
183*53ee8cc1Swenshuai.xi }
184*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
185*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
186*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
187*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
188*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
189*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
190*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
191*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
192*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
193*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
194*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
195*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
196*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
197*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
198*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
199*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
200*53ee8cc1Swenshuai.xi 
201*53ee8cc1Swenshuai.xi static struct pci_page *
pool_alloc_page(struct pci_pool * pool,int mem_flags)202*53ee8cc1Swenshuai.xi pool_alloc_page (struct pci_pool *pool, int mem_flags)
203*53ee8cc1Swenshuai.xi {
204*53ee8cc1Swenshuai.xi   struct pci_page  *page;
205*53ee8cc1Swenshuai.xi   int    mapsize;
206*53ee8cc1Swenshuai.xi 
207*53ee8cc1Swenshuai.xi   mapsize = pool->blocks_per_page;
208*53ee8cc1Swenshuai.xi   mapsize = (mapsize + BITS_PER_LONG - 1) / BITS_PER_LONG;
209*53ee8cc1Swenshuai.xi   mapsize *= sizeof (U32);
210*53ee8cc1Swenshuai.xi 
211*53ee8cc1Swenshuai.xi   page = (struct pci_page *) kmalloc (mapsize + sizeof(struct pci_page), mem_flags);
212*53ee8cc1Swenshuai.xi   INIT_LIST_HEAD(&page->page_list);
213*53ee8cc1Swenshuai.xi   if (!page)
214*53ee8cc1Swenshuai.xi     return 0;
215*53ee8cc1Swenshuai.xi 
216*53ee8cc1Swenshuai.xi   page->vaddr = ncmem_alloc_page(&page->dma);
217*53ee8cc1Swenshuai.xi 
218*53ee8cc1Swenshuai.xi   if (page->vaddr) {
219*53ee8cc1Swenshuai.xi     memset (page->bitmap, ((U32)-1), mapsize);  // bit set == free
220*53ee8cc1Swenshuai.xi     list_add (&page->page_list, &pool->page_list);
221*53ee8cc1Swenshuai.xi   } else {
222*53ee8cc1Swenshuai.xi     kfree (page);
223*53ee8cc1Swenshuai.xi     page = 0;
224*53ee8cc1Swenshuai.xi   }
225*53ee8cc1Swenshuai.xi   return page;
226*53ee8cc1Swenshuai.xi }
227*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
228*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
229*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
230*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
231*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
232*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
233*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
234*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
235*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
236*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
237*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
238*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
239*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
240*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
241*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
242*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
243*53ee8cc1Swenshuai.xi 
pci_pool_alloc(struct pci_pool * pool,int mem_flags,dma_addr_t * handle)244*53ee8cc1Swenshuai.xi void *pci_pool_alloc (struct pci_pool *pool, int mem_flags, dma_addr_t *handle)
245*53ee8cc1Swenshuai.xi {
246*53ee8cc1Swenshuai.xi   U32    flags;
247*53ee8cc1Swenshuai.xi   struct list_head  *entry;
248*53ee8cc1Swenshuai.xi   struct pci_page    *page;
249*53ee8cc1Swenshuai.xi   int      map, block;
250*53ee8cc1Swenshuai.xi   size_t      offset;
251*53ee8cc1Swenshuai.xi   void      *retval;
252*53ee8cc1Swenshuai.xi 
253*53ee8cc1Swenshuai.xi //restart:  //restrain warning message
254*53ee8cc1Swenshuai.xi   spin_lock_irqsave (&pool->lock, flags);
255*53ee8cc1Swenshuai.xi   list_for_each (entry, &pool->page_list) {
256*53ee8cc1Swenshuai.xi     U32    i;
257*53ee8cc1Swenshuai.xi     //page = list_entry (entry, struct pci_page, page_list);
258*53ee8cc1Swenshuai.xi     const struct list_head *__mptr = entry;
259*53ee8cc1Swenshuai.xi     page = (struct pci_page *)( (char *)__mptr - (char *)offsetof(struct pci_page,page_list));
260*53ee8cc1Swenshuai.xi 
261*53ee8cc1Swenshuai.xi     /* only cachable accesses here ... */
262*53ee8cc1Swenshuai.xi     for (map = 0, i = 0;
263*53ee8cc1Swenshuai.xi         i < pool->blocks_per_page;
264*53ee8cc1Swenshuai.xi         i += BITS_PER_LONG, map++) {
265*53ee8cc1Swenshuai.xi       if (page->bitmap [map] == 0)
266*53ee8cc1Swenshuai.xi         continue;
267*53ee8cc1Swenshuai.xi       block = ffz (~ page->bitmap [map]);
268*53ee8cc1Swenshuai.xi       if ((i + block) < pool->blocks_per_page) {
269*53ee8cc1Swenshuai.xi         clear_bit ( block, &page->bitmap [map],U32);
270*53ee8cc1Swenshuai.xi         offset = (BITS_PER_LONG * map) + block;
271*53ee8cc1Swenshuai.xi         offset *= pool->size;
272*53ee8cc1Swenshuai.xi         goto ready;
273*53ee8cc1Swenshuai.xi       }
274*53ee8cc1Swenshuai.xi     }
275*53ee8cc1Swenshuai.xi   }
276*53ee8cc1Swenshuai.xi 
277*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
278*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
279*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
280*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
281*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
282*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
283*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
284*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
285*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
286*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
287*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
288*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
289*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
290*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
291*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
292*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
293*53ee8cc1Swenshuai.xi   if (!(page = pool_alloc_page (pool, mem_flags))) {
294*53ee8cc1Swenshuai.xi     /*
295*53ee8cc1Swenshuai.xi     if (mem_flags == SLAB_KERNEL) {
296*53ee8cc1Swenshuai.xi       DECLARE_WAITQUEUE (wait, current);
297*53ee8cc1Swenshuai.xi 
298*53ee8cc1Swenshuai.xi       current->state = TASK_INTERRUPTIBLE;
299*53ee8cc1Swenshuai.xi       add_wait_queue (&pool->waitq, &wait);
300*53ee8cc1Swenshuai.xi       spin_unlock_irqrestore (&pool->lock, flags);
301*53ee8cc1Swenshuai.xi 
302*53ee8cc1Swenshuai.xi       schedule_timeout (POOL_TIMEOUT_JIFFIES);
303*53ee8cc1Swenshuai.xi 
304*53ee8cc1Swenshuai.xi       current->state = TASK_RUNNING;
305*53ee8cc1Swenshuai.xi       remove_wait_queue (&pool->waitq, &wait);
306*53ee8cc1Swenshuai.xi       goto restart;
307*53ee8cc1Swenshuai.xi     }
308*53ee8cc1Swenshuai.xi     */
309*53ee8cc1Swenshuai.xi     retval = 0;
310*53ee8cc1Swenshuai.xi     goto done;
311*53ee8cc1Swenshuai.xi   }
312*53ee8cc1Swenshuai.xi 
313*53ee8cc1Swenshuai.xi   clear_bit (0, &page->bitmap [0],U32);
314*53ee8cc1Swenshuai.xi   offset = 0;
315*53ee8cc1Swenshuai.xi ready:
316*53ee8cc1Swenshuai.xi 
317*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
318*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
319*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
320*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
321*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
322*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
323*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
324*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
325*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
326*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
327*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
328*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
329*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
330*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
331*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
332*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
333*53ee8cc1Swenshuai.xi   retval = (void*) (offset + (size_t) ( page->vaddr ));
334*53ee8cc1Swenshuai.xi   *handle = offset + page->dma;
335*53ee8cc1Swenshuai.xi done:
336*53ee8cc1Swenshuai.xi   spin_unlock_irqrestore (&pool->lock, flags);
337*53ee8cc1Swenshuai.xi   kdbg("The allocated addr is %p, block size is %d ,bit_map[%d] is 0x%08X",retval, pool->size ,map,(U32)page->bitmap [map]);
338*53ee8cc1Swenshuai.xi   return retval;
339*53ee8cc1Swenshuai.xi }
340*53ee8cc1Swenshuai.xi 
341*53ee8cc1Swenshuai.xi static void
pool_free_page(struct pci_pool * pool,struct pci_page * page)342*53ee8cc1Swenshuai.xi pool_free_page (struct pci_pool *pool, struct pci_page *page)
343*53ee8cc1Swenshuai.xi {
344*53ee8cc1Swenshuai.xi   //dma_addr_t  dma = page->dma;
345*53ee8cc1Swenshuai.xi   ncmem_free_page((U32)page->vaddr);
346*53ee8cc1Swenshuai.xi   list_del (&page->page_list);
347*53ee8cc1Swenshuai.xi   kfree (page);
348*53ee8cc1Swenshuai.xi }
349*53ee8cc1Swenshuai.xi 
350*53ee8cc1Swenshuai.xi 
351*53ee8cc1Swenshuai.xi void
pci_pool_destroy(struct pci_pool * pool)352*53ee8cc1Swenshuai.xi pci_pool_destroy (struct pci_pool *pool)
353*53ee8cc1Swenshuai.xi {
354*53ee8cc1Swenshuai.xi   U32    flags;
355*53ee8cc1Swenshuai.xi   spin_lock_irqsave (&pool->lock, flags);
356*53ee8cc1Swenshuai.xi   while (!list_empty (&pool->page_list)) {
357*53ee8cc1Swenshuai.xi     struct pci_page    *page;
358*53ee8cc1Swenshuai.xi 
359*53ee8cc1Swenshuai.xi     //page = list_entry (pool->page_list.next,struct pci_page, page_list);
360*53ee8cc1Swenshuai.xi     const struct list_head *__mptr = pool->page_list.next;
361*53ee8cc1Swenshuai.xi     page = (struct pci_page *)( (char *)__mptr - (char *)offsetof(struct pci_page,page_list) );
362*53ee8cc1Swenshuai.xi 
363*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
364*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
365*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
366*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
367*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
368*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
369*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
370*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
371*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
372*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
373*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
374*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
375*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
376*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
377*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
378*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
379*53ee8cc1Swenshuai.xi 
380*53ee8cc1Swenshuai.xi     if (is_page_busy (pool->blocks_per_page, page->bitmap)) {
381*53ee8cc1Swenshuai.xi       printk (KERN_ERR "pci_pool_destroy %s, %p busy\n",
382*53ee8cc1Swenshuai.xi          pool->name, page->vaddr);
383*53ee8cc1Swenshuai.xi       /* leak the still-in-use consistent memory */
384*53ee8cc1Swenshuai.xi       list_del (&page->page_list);
385*53ee8cc1Swenshuai.xi       kfree (page);
386*53ee8cc1Swenshuai.xi     } else
387*53ee8cc1Swenshuai.xi       pool_free_page (pool, page);
388*53ee8cc1Swenshuai.xi   }
389*53ee8cc1Swenshuai.xi   spin_unlock_irqrestore (&pool->lock, flags);
390*53ee8cc1Swenshuai.xi   kfree (pool);
391*53ee8cc1Swenshuai.xi }
392*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
393*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
394*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
395*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
396*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
397*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
398*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
399*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
400*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
401*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
402*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
403*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
404*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
405*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
406*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
407*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
408*53ee8cc1Swenshuai.xi 
409*53ee8cc1Swenshuai.xi 
410*53ee8cc1Swenshuai.xi static struct pci_page *
pool_find_page(struct pci_pool * pool,dma_addr_t dma)411*53ee8cc1Swenshuai.xi pool_find_page (struct pci_pool *pool, dma_addr_t dma)
412*53ee8cc1Swenshuai.xi {
413*53ee8cc1Swenshuai.xi   U32    flags;
414*53ee8cc1Swenshuai.xi   struct list_head  *entry;
415*53ee8cc1Swenshuai.xi   struct pci_page    *page;
416*53ee8cc1Swenshuai.xi 
417*53ee8cc1Swenshuai.xi   spin_lock_irqsave (&pool->lock, flags);
418*53ee8cc1Swenshuai.xi   list_for_each (entry, &pool->page_list) {
419*53ee8cc1Swenshuai.xi 
420*53ee8cc1Swenshuai.xi     //page = list_entry (entry, struct pci_page, page_list);
421*53ee8cc1Swenshuai.xi     const struct list_head *__mptr = entry;
422*53ee8cc1Swenshuai.xi     page = (struct pci_page *)( (char *)__mptr - (char *)offsetof(struct pci_page,page_list) );
423*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
424*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
425*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
426*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
427*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
428*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
429*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
430*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
431*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
432*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
433*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
434*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
435*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
436*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
437*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
438*53ee8cc1Swenshuai.xi 	/*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
439*53ee8cc1Swenshuai.xi 
440*53ee8cc1Swenshuai.xi     if (dma < page->dma)
441*53ee8cc1Swenshuai.xi       continue;
442*53ee8cc1Swenshuai.xi     if (dma < (page->dma + pool->allocation))
443*53ee8cc1Swenshuai.xi       goto done;
444*53ee8cc1Swenshuai.xi   }
445*53ee8cc1Swenshuai.xi   page = 0;
446*53ee8cc1Swenshuai.xi done:
447*53ee8cc1Swenshuai.xi   spin_unlock_irqrestore (&pool->lock, flags);
448*53ee8cc1Swenshuai.xi   return page;
449*53ee8cc1Swenshuai.xi }
450*53ee8cc1Swenshuai.xi 
451*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
452*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
453*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
454*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
455*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
456*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
457*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
458*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
459*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
460*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
461*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
462*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
463*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
464*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
465*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
466*53ee8cc1Swenshuai.xi /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
467*53ee8cc1Swenshuai.xi 
468*53ee8cc1Swenshuai.xi BOOL
pci_pool_free(struct pci_pool * pool,void * vaddr,dma_addr_t dma)469*53ee8cc1Swenshuai.xi pci_pool_free (struct pci_pool *pool, void *vaddr, dma_addr_t dma)
470*53ee8cc1Swenshuai.xi {
471*53ee8cc1Swenshuai.xi   struct pci_page    *page;
472*53ee8cc1Swenshuai.xi   U32    flags;
473*53ee8cc1Swenshuai.xi   int      map, block;
474*53ee8cc1Swenshuai.xi 
475*53ee8cc1Swenshuai.xi   if ((page = pool_find_page (pool, dma)) == 0) {
476*53ee8cc1Swenshuai.xi     printk (KERN_ERR "pci_pool_free %s, %p/%lx (bad dma)\n",
477*53ee8cc1Swenshuai.xi     pool->name, vaddr,
478*53ee8cc1Swenshuai.xi     (U32) dma);
479*53ee8cc1Swenshuai.xi     return FALSE;
480*53ee8cc1Swenshuai.xi   }
481*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
482*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
483*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
484*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
485*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
486*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
487*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
488*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
489*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
490*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
491*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
492*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
493*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
494*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
495*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
496*53ee8cc1Swenshuai.xi   /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
497*53ee8cc1Swenshuai.xi 
498*53ee8cc1Swenshuai.xi   block = dma - page->dma;
499*53ee8cc1Swenshuai.xi   block /= pool->size;
500*53ee8cc1Swenshuai.xi   map = block / BITS_PER_LONG;
501*53ee8cc1Swenshuai.xi   block %= BITS_PER_LONG;
502*53ee8cc1Swenshuai.xi 
503*53ee8cc1Swenshuai.xi   spin_lock_irqsave (&pool->lock, flags);
504*53ee8cc1Swenshuai.xi   set_bit (block, &page->bitmap [map], U32);
505*53ee8cc1Swenshuai.xi   kdbg("Free Block: addr=0x%08X bitmap is 0x%08X",dma,(U32)page->bitmap [map]);
506*53ee8cc1Swenshuai.xi   /*
507*53ee8cc1Swenshuai.xi   if (waitqueue_active (&pool->waitq))
508*53ee8cc1Swenshuai.xi     wake_up (&pool->waitq);
509*53ee8cc1Swenshuai.xi   */
510*53ee8cc1Swenshuai.xi 	  /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
511*53ee8cc1Swenshuai.xi 	  /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
512*53ee8cc1Swenshuai.xi 	  /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
513*53ee8cc1Swenshuai.xi 	  /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
514*53ee8cc1Swenshuai.xi 	  /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
515*53ee8cc1Swenshuai.xi 	  /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
516*53ee8cc1Swenshuai.xi 	  /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
517*53ee8cc1Swenshuai.xi 	  /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
518*53ee8cc1Swenshuai.xi 	  /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
519*53ee8cc1Swenshuai.xi 	  /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
520*53ee8cc1Swenshuai.xi 	  /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
521*53ee8cc1Swenshuai.xi 	  /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
522*53ee8cc1Swenshuai.xi 	  /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
523*53ee8cc1Swenshuai.xi 	  /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
524*53ee8cc1Swenshuai.xi 	  /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
525*53ee8cc1Swenshuai.xi 	  /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
526*53ee8cc1Swenshuai.xi 
527*53ee8cc1Swenshuai.xi   /*
528*53ee8cc1Swenshuai.xi    * Resist a temptation to do
529*53ee8cc1Swenshuai.xi    *    if (!is_page_busy(bpp, page->bitmap)) pool_free_page(pool, page);
530*53ee8cc1Swenshuai.xi    * it is not interrupt safe. Better have empty pages hang around.
531*53ee8cc1Swenshuai.xi    */
532*53ee8cc1Swenshuai.xi   spin_unlock_irqrestore (&pool->lock, flags);
533*53ee8cc1Swenshuai.xi   return TRUE;
534*53ee8cc1Swenshuai.xi }
535*53ee8cc1Swenshuai.xi /* ============================================== End of PCI Memory Management Porting ============================================== */
536*53ee8cc1Swenshuai.xi 
537