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