isp1362-hcd: use bitmap_find_next_zero_area
authorAkinobu Mita <akinobu.mita@gmail.com>
Wed, 16 Dec 2009 00:48:28 +0000 (16:48 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 16 Dec 2009 15:20:18 +0000 (07:20 -0800)
Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com>
Cc: Greg Kroah-Hartman <gregkh@suse.de>
Cc: Lothar Wassmann <LW@KARO-electronics.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
drivers/usb/host/isp1362-hcd.c

index 5c774ab..73352f3 100644 (file)
@@ -80,7 +80,7 @@
 #include <linux/platform_device.h>
 #include <linux/pm.h>
 #include <linux/io.h>
-#include <linux/bitops.h>
+#include <linux/bitmap.h>
 
 #include <asm/irq.h>
 #include <asm/system.h>
@@ -190,10 +190,8 @@ static int claim_ptd_buffers(struct isp1362_ep_queue *epq,
                             struct isp1362_ep *ep, u16 len)
 {
        int ptd_offset = -EINVAL;
-       int index;
        int num_ptds = ((len + PTD_HEADER_SIZE - 1) / epq->blk_size) + 1;
-       int found = -1;
-       int last = -1;
+       int found;
 
        BUG_ON(len > epq->buf_size);
 
@@ -205,20 +203,9 @@ static int claim_ptd_buffers(struct isp1362_ep_queue *epq,
                    epq->name, len, epq->blk_size, num_ptds, epq->buf_map, epq->skip_map);
        BUG_ON(ep->num_ptds != 0);
 
-       for (index = 0; index <= epq->buf_count - num_ptds; index++) {
-               if (test_bit(index, &epq->buf_map))
-                       continue;
-               found = index;
-               for (last = index + 1; last < index + num_ptds; last++) {
-                       if (test_bit(last, &epq->buf_map)) {
-                               found = -1;
-                               break;
-                       }
-               }
-               if (found >= 0)
-                       break;
-       }
-       if (found < 0)
+       found = bitmap_find_next_zero_area(&epq->buf_map, epq->buf_count, 0,
+                                               num_ptds, 0);
+       if (found >= epq->buf_count)
                return -EOVERFLOW;
 
        DBG(1, "%s: Found %d PTDs[%d] for %d/%d byte\n", __func__,
@@ -230,8 +217,7 @@ static int claim_ptd_buffers(struct isp1362_ep_queue *epq,
        epq->buf_avail -= num_ptds;
        BUG_ON(epq->buf_avail > epq->buf_count);
        ep->ptd_index = found;
-       for (index = found; index < last; index++)
-               __set_bit(index, &epq->buf_map);
+       bitmap_set(&epq->buf_map, found, num_ptds);
        DBG(1, "%s: Done %s PTD[%d] $%04x, avail %d count %d claimed %d %08lx:%08lx\n",
            __func__, epq->name, ep->ptd_index, ep->ptd_offset,
            epq->buf_avail, epq->buf_count, num_ptds, epq->buf_map, epq->skip_map);