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