summaryrefslogtreecommitdiffstats
path: root/sys/dev/cardbus/cardbus_cis.c
diff options
context:
space:
mode:
authorimp <imp@FreeBSD.org>2002-03-13 05:38:19 +0000
committerimp <imp@FreeBSD.org>2002-03-13 05:38:19 +0000
commit9da090c4c4e01cebac8f160360e4c554031fcc13 (patch)
treeea06bc105155e989b8efd66c2fa6c07b9b1bca83 /sys/dev/cardbus/cardbus_cis.c
parentd1cc9702802bd1f9ad5498ae22ff5bc83da497c7 (diff)
downloadFreeBSD-src-9da090c4c4e01cebac8f160360e4c554031fcc13.zip
FreeBSD-src-9da090c4c4e01cebac8f160360e4c554031fcc13.tar.gz
Cleanup the recent cardbus cleanups. This fixes some of the panics
that I introduced with -v. However, other problems still remain (including the loss of interrupts).
Diffstat (limited to 'sys/dev/cardbus/cardbus_cis.c')
-rw-r--r--sys/dev/cardbus/cardbus_cis.c36
1 files changed, 20 insertions, 16 deletions
diff --git a/sys/dev/cardbus/cardbus_cis.c b/sys/dev/cardbus/cardbus_cis.c
index 7061acc..162b166 100644
--- a/sys/dev/cardbus/cardbus_cis.c
+++ b/sys/dev/cardbus/cardbus_cis.c
@@ -595,23 +595,24 @@ cardbus_alloc_resources(device_t cbdev, device_t child)
{
struct cardbus_devinfo *dinfo = device_get_ivars(child);
int count;
+ struct resource_list *rl = &dinfo->pci.resources;
struct resource_list_entry *rle;
struct resource_list_entry **barlist;
int tmp;
u_int32_t mem_psize = 0, mem_nsize = 0, io_size = 0;
struct resource *res;
- u_int32_t start,end;
- int rid, flags;
+ u_int32_t start, end;
+ int rid, flags, irq;
count = 0;
- SLIST_FOREACH(rle, &dinfo->pci.resources, link)
+ SLIST_FOREACH(rle, rl, link)
count++;
if (count == 0)
return (0);
barlist = malloc(sizeof(struct resource_list_entry*) * count, M_DEVBUF,
M_WAITOK);
count = 0;
- SLIST_FOREACH(rle, &dinfo->pci.resources, link) {
+ SLIST_FOREACH(rle, rl, link) {
barlist[count] = rle;
if (rle->type == SYS_RES_IOPORT) {
io_size += rle->count;
@@ -840,10 +841,11 @@ cardbus_alloc_resources(device_t cbdev, device_t child)
device_printf(cbdev, "Unable to allocate IRQ\n");
return (ENOMEM);
}
- resource_list_add(&dinfo->pci.resources, SYS_RES_IRQ, rid,
- rman_get_start(res), rman_get_end(res), 1);
- dinfo->pci.cfg.intline = rman_get_start(res);
- pci_write_config(child, PCIR_INTLINE, rman_get_start(res), 1);
+ irq = rman_get_start(res);
+ resource_list_add(rl, SYS_RES_IRQ, rid, irq, irq, 1);
+ dinfo->pci.cfg.intline = irq;
+ pci_write_config(child, PCIR_INTLINE, irq, 1);
+ printf("Allocating IRQ %d\n", irq);
bus_release_resource(cbdev, SYS_RES_IRQ, rid, res);
return (0);
@@ -857,15 +859,17 @@ static void
cardbus_add_map(device_t cbdev, device_t child, int reg)
{
struct cardbus_devinfo *dinfo = device_get_ivars(child);
- struct resource_list_entry *rle;
+ struct resource_list *rl = &dinfo->pci.resources;
u_int32_t size;
u_int32_t testval;
int type;
- SLIST_FOREACH(rle, &dinfo->pci.resources, link) {
- if (rle->rid == reg)
- return;
- }
+ testval = pci_read_config(child, reg, 4);
+ type = (testval & 1) ? SYS_RES_IOPORT : SYS_RES_MEMORY;
+ if (resource_list_find(rl, type, reg) != NULL)
+ return;
+
+ /* XXX Should just be able to use pci_add_map */
if (reg == CARDBUS_ROM_REG)
testval = CARDBUS_ROM_ADDRMASK;
@@ -884,9 +888,9 @@ cardbus_add_map(device_t cbdev, device_t child, int reg)
type = SYS_RES_IOPORT;
size = CARDBUS_MAPREG_MEM_SIZE(testval);
- device_printf(cbdev, "Resource not specified in CIS: id=%x, size=%x\n",
- reg, size);
- resource_list_add(&dinfo->pci.resources, type, reg, 0UL, ~0UL, size);
+ device_printf(cbdev, "BAR not in CIS: type = %d, id=%x, size=%x\n",
+ type, reg, size);
+ resource_list_add(rl, type, reg, 0UL, ~0UL, size);
}
static void
OpenPOWER on IntegriCloud