Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/dev/cardbus KNF the code and fix three bugs:



details:   https://anonhg.NetBSD.org/src/rev/185884bd4248
branches:  trunk
changeset: 485891:185884bd4248
user:      augustss <augustss%NetBSD.org@localhost>
date:      Mon May 08 14:00:05 2000 +0000

description:
KNF the code and fix three bugs:
 * If a non-zero addr was given to rbus_space_alloc_subregion() it would
   claim to have allocated region when in fact it just failed.
 * If a non-zero addr was given to rbus_space_alloc_subregion() allocation
   often (always?) failed when it shouldn't.
 * One part of rbus_space_alloc_subregion() used an alignment that always
   made the kernel panic.
I'm not sure if my change is correct, because I don't know what this code
is supposed to do.  But now I can use a 3c562 card.

diffstat:

 sys/dev/cardbus/rbus.c |  408 +++++++++++++++++++++++-------------------------
 1 files changed, 197 insertions(+), 211 deletions(-)

diffs (truncated from 510 to 300 lines):

diff -r e270667609a2 -r 185884bd4248 sys/dev/cardbus/rbus.c
--- a/sys/dev/cardbus/rbus.c    Mon May 08 13:53:32 2000 +0000
+++ b/sys/dev/cardbus/rbus.c    Mon May 08 14:00:05 2000 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: rbus.c,v 1.3 1999/11/06 06:20:53 soren Exp $   */
+/*     $NetBSD: rbus.c,v 1.4 2000/05/08 14:00:05 augustss Exp $        */
 /*
  * Copyright (c) 1999
  *     HAYAKAWA Koichi.  All rights reserved.
@@ -42,7 +42,7 @@
 
 #include <dev/cardbus/rbus.h>
 
-/* #define RBUS_DEBUG */
+/*#define RBUS_DEBUG*/
 
 #if defined RBUS_DEBUG
 #define STATIC
@@ -63,16 +63,16 @@
 
 int
 rbus_space_alloc(rbt, addr, size, mask, align, flags, addrp, bshp)
-     rbus_tag_t rbt;
-     bus_addr_t addr;
-     bus_size_t size;
-     bus_addr_t mask, align;
-     int flags;
-     bus_addr_t *addrp;
-     bus_space_handle_t *bshp;
+       rbus_tag_t rbt;
+       bus_addr_t addr;
+       bus_size_t size;
+       bus_addr_t mask, align;
+       int flags;
+       bus_addr_t *addrp;
+       bus_space_handle_t *bshp;
 {
-  return rbus_space_alloc_subregion(rbt, rbt->rb_start, rbt->rb_end, addr,
-                                   size, mask, align, flags, addrp, bshp);
+       return rbus_space_alloc_subregion(rbt, rbt->rb_start, rbt->rb_end,
+                  addr, size, mask, align, flags, addrp, bshp);
 }
 
 
@@ -80,129 +80,118 @@
 
 int
 rbus_space_alloc_subregion(rbt, substart, subend, addr, size, mask, align, flags, addrp, bshp)
-     rbus_tag_t rbt;
-     bus_addr_t addr;
-     bus_addr_t substart;
-     bus_addr_t subend;
-     bus_size_t size;
-     bus_addr_t mask, align;
-     int flags;
-     bus_addr_t *addrp;
-     bus_space_handle_t *bshp;
+       rbus_tag_t rbt;
+       bus_addr_t addr;
+       bus_addr_t substart;
+       bus_addr_t subend;
+       bus_size_t size;
+       bus_addr_t mask, align;
+       int flags;
+       bus_addr_t *addrp;
+       bus_space_handle_t *bshp;
 {
-  bus_addr_t decodesize = mask + 1;
-  bus_addr_t boundary, search_addr;
-  int val = 0;
-  bus_addr_t result;
-  int exflags = EX_FAST | EX_NOWAIT;
+       bus_addr_t decodesize = mask + 1;
+       bus_addr_t boundary, search_addr;
+       int val;
+       bus_addr_t result;
+       u_long ures;
+       int exflags = EX_FAST | EX_NOWAIT;
 
-  DPRINTF(("rbus_space_alloc: addr %lx, size %lx, mask %lx, align %lx\n",
-          addr, size, mask, align));
+       DPRINTF(("rbus_space_alloc: addr 0x%lx, size 0x%lx, mask 0x%lx, "
+                "align 0x%lx, substart 0x%lx, subend 0x%lx\n",
+                addr, size, mask, align, substart, subend));
 
-  addr += rbt->rb_offset;
+       addr += rbt->rb_offset;
 
-  if (mask == 0) {
-    /* FULL Decode */
-    decodesize = 0;
-  }
+       if (mask == 0)
+               /* FULL Decode */
+               decodesize = 0;
+
+       if (rbt->rb_flags == RBUS_SPACE_ASK_PARENT)
+               return rbus_space_alloc(rbt->rb_parent, addr, size, mask,
+                          align, flags, addrp, bshp);
 
-  if (rbt->rb_flags == RBUS_SPACE_ASK_PARENT) {
-    return rbus_space_alloc(rbt->rb_parent, addr, size, mask, align, flags,
-                           addrp, bshp);
-  } else if (rbt->rb_flags == RBUS_SPACE_SHARE ||
-            rbt->rb_flags == RBUS_SPACE_DEDICATE) {
-    /* rbt has its own sh_extent */
+       if (rbt->rb_flags != RBUS_SPACE_SHARE &&
+           rbt->rb_flags != RBUS_SPACE_DEDICATE)
+               return 1;
 
-    /* sanity check: the subregion [substart, subend] should be
-       smaller than the region included in sh_extent */
-    if (substart < rbt->rb_ext->ex_start || subend > rbt->rb_ext->ex_end) {
-      return 1;
-    }
+       /* rbt has its own sh_extent */
+
+       /* sanity check: the subregion [substart, subend] should be
+          smaller than the region included in sh_extent */
+       if (substart < rbt->rb_ext->ex_start || subend > rbt->rb_ext->ex_end)
+               return 1;
 
-    if (decodesize == align) {
-      if(extent_alloc_subregion(rbt->rb_ext, substart, subend, size, align, 0,
-                               exflags, (u_long *)&result)) {
-       return 1;
-      }
-    } else if (decodesize == 0) {
-      /* maybe, the resister is overflowed. */
-      
-      if (extent_alloc_subregion(rbt->rb_ext, addr, addr + size, size,
-                                0, 0, exflags, (u_long *)&result)) {
-       return 1;
-      }
-    } else {
+       if (decodesize == align) {
+               if (extent_alloc_subregion(rbt->rb_ext, substart, subend,
+                       size, align, 0, exflags, &ures)) {
+                       return 1;
+               }
+       } else if (decodesize == 0 || addr != 0) {
+               /* maybe, the register is overflowed. */
+               if (extent_alloc_subregion(rbt->rb_ext, addr, addr + size,
+                       size, 1, 0, exflags, &ures)) {
+                       return 1;
+               }
+       } else {
+               boundary = decodesize > align ? decodesize : align;
+               search_addr = (substart & ~(boundary - 1)) + addr;
 
-      boundary = decodesize > align ? decodesize : align;
-
-      search_addr = (substart & ~(boundary - 1)) + addr;
-
-      if (search_addr < substart) {
-       search_addr += boundary;
-      }
+               if (search_addr < substart)
+                       search_addr += boundary;
 
-      for (; search_addr + size <= subend; search_addr += boundary) {
-       val = extent_alloc_subregion(rbt->rb_ext,search_addr, search_addr+size,
-                               size, align, 0, exflags, (u_long *)&result);
-       if (val == 0) {
-         break;
+               val = 1; 
+               for (; search_addr + size <= subend; search_addr += boundary) {
+                       val = extent_alloc_subregion(rbt->rb_ext, search_addr,
+                                 search_addr + size, size, align, 0, exflags,
+                                 &ures);
+                       if (val == 0)
+                               break;
+               }
+               if (val)
+                       return 1;
        }
-      }
-      if (val) {
-       return 1;
-      }
-    }
+       result = (bus_addr_t)ures;
 
-    if(md_space_map(rbt->rb_bt, result, size, flags, bshp)) {
-      /* map failed */
-      extent_free(rbt->rb_ext, result, size, exflags);
-      return 1;
-    }
+       if (md_space_map(rbt->rb_bt, result, size, flags, bshp)) {
+               /* map failed */
+               extent_free(rbt->rb_ext, result, size, exflags);
+               return 1;
+       }
 
-    if (addrp != NULL) {
-      *addrp = result + rbt->rb_offset;
-    }
-    return 0;
-
-  } else {
-    /* error!! */
-    return 1;
-  }
-  return 1;
+       if (addrp != NULL)
+               *addrp = result + rbt->rb_offset;
+       return 0;
 }
 
 
-
-
-
 int
 rbus_space_free(rbt, bsh, size, addrp)
-     rbus_tag_t rbt;
-     bus_space_handle_t bsh;
-     bus_size_t size;
-     bus_addr_t *addrp;
+       rbus_tag_t rbt;
+       bus_space_handle_t bsh;
+       bus_size_t size;
+       bus_addr_t *addrp;
 {
-  int exflags = EX_FAST | EX_NOWAIT;
-  bus_addr_t addr;
-  int status = 1;
+       int exflags = EX_FAST | EX_NOWAIT;
+       bus_addr_t addr;
+       int status = 1;
 
-  if (rbt->rb_flags == RBUS_SPACE_ASK_PARENT) {
-    status = rbus_space_free(rbt->rb_parent, bsh, size, &addr);
-  } else if (rbt->rb_flags == RBUS_SPACE_SHARE ||
-            rbt->rb_flags == RBUS_SPACE_DEDICATE) {
-    md_space_unmap(rbt->rb_bt, bsh, size, &addr);
+       if (rbt->rb_flags == RBUS_SPACE_ASK_PARENT) {
+               status = rbus_space_free(rbt->rb_parent, bsh, size, &addr);
+       } else if (rbt->rb_flags == RBUS_SPACE_SHARE ||
+                  rbt->rb_flags == RBUS_SPACE_DEDICATE) {
+               md_space_unmap(rbt->rb_bt, bsh, size, &addr);
 
-    extent_free(rbt->rb_ext, addr, size, exflags);
+               extent_free(rbt->rb_ext, addr, size, exflags);
 
-    status = 0;
-  } else {
-    /* error. INVALID rbustag */
-    status = 1;
-  }
-  if (addrp != NULL) {
-    *addrp = addr;
-  }
-  return status;
+               status = 0;
+       } else {
+               /* error. INVALID rbustag */
+               status = 1;
+       }
+       if (addrp != NULL)
+               *addrp = addr;
+       return status;
 }
 
 
@@ -216,43 +205,42 @@
  */
 static rbus_tag_t
 rbus_new_body(bt, parent, ex, start, end, offset, flags)
-     bus_space_tag_t bt;
-     rbus_tag_t parent;
-     struct extent *ex;
-     bus_addr_t start, end, offset;
-     int flags;
+       bus_space_tag_t bt;
+       rbus_tag_t parent;
+       struct extent *ex;
+       bus_addr_t start, end, offset;
+       int flags;
 {
-  rbus_tag_t rb;
+       rbus_tag_t rb;
 
-  /* sanity check */
-  if (parent != NULL) {
-    if (start < parent->rb_start || end > parent->rb_end) {
-      /* out of range: [start, size] should be containd in parent space */
-      return 0;
-      /* Should I invoke panic? */
-    }
-  }
+       /* sanity check */
+       if (parent != NULL) {
+               if (start < parent->rb_start || end > parent->rb_end) {
+                       /* out of range: [start, size] should be containd in parent space */
+                       return 0;
+                       /* Should I invoke panic? */
+               }
+       }
 



Home | Main Index | Thread Index | Old Index