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