implement MFC links properly (and I think long links too). This make

the sprint wireless card try to attach.  Sadly, the pci code at the
bridge keeps this from happening.

Bug w/o PR: jhb :-)
This commit is contained in:
Warner Losh 2001-12-04 13:48:16 +00:00
parent 0d23d04625
commit d29f1aafa9

View File

@ -168,7 +168,6 @@ pccard_scan_cis(device_t dev, int (*fct)(struct pccard_tuple *, void *),
ret = 1;
goto done;
}
ret = 1; goto done; /* XXX IMP XXX */
tuple.ptr++;
break;
}
@ -314,6 +313,7 @@ pccard_scan_cis(device_t dev, int (*fct)(struct pccard_tuple *, void *),
if ((i % 16) == 13)
DPRINTF(("\n"));
}
if ((i % 16) != 14)
DPRINTF(("\n"));
}
@ -322,10 +322,6 @@ pccard_scan_cis(device_t dev, int (*fct)(struct pccard_tuple *, void *),
tuple.ptr += 2 + tuple.length;
}
#ifdef XXX /* I'm not up to this tonight, need to implement new API */
/* to deal with moving windows and such. At least that's */
/* what it appears at this instant */
/*
* the chain is done. Clean up and move onto the next one,
* if any. The loop is here in the case that there is an MFC
@ -335,29 +331,10 @@ pccard_scan_cis(device_t dev, int (*fct)(struct pccard_tuple *, void *),
*/
while (1) {
pccard_chip_mem_unmap(pct, pch, window);
if (longlink_present) {
/*
* if the longlink is to attribute memory,
* then it is unindexed. That is, if the
* link value is 0x100, then the actual
* memory address is 0x200. This means that
* we need to multiply by 2 before calling
* mem_map, and then divide the resulting ptr
* by 2 after.
*/
if (!longlink_common)
longlink_addr *= 2;
pccard_chip_mem_map(pct, pch, longlink_common ?
PCCARD_MEM_COMMON : PCCARD_MEM_ATTR,
longlink_addr, PCCARD_CIS_SIZE,
&pcmh, &tuple.ptr, &window);
if (!longlink_common)
tuple.ptr /= 2;
CARD_SET_RES_FLAGS(device_get_parent(dev), dev,
SYS_RES_MEMORY, rid, longlink_common ?
PCCARD_A_MEM_ATTR : PCCARD_A_MEM_ATTR);
DPRINTF(("cis mem map %x\n",
(unsigned int) tuple.memh));
tuple.mult = longlink_common ? 1 : 2;
@ -365,23 +342,13 @@ pccard_scan_cis(device_t dev, int (*fct)(struct pccard_tuple *, void *),
longlink_common = 1;
longlink_addr = 0;
} else if (mfc_count && (mfc_index < mfc_count)) {
if (!mfc[mfc_index].common)
mfc[mfc_index].addr *= 2;
pccard_chip_mem_map(pct, pch,
mfc[mfc_index].common ?
PCCARD_MEM_COMMON : PCCARD_MEM_ATTR,
mfc[mfc_index].addr, PCCARD_CIS_SIZE,
&pcmh, &tuple.ptr, &window);
if (!mfc[mfc_index].common)
tuple.ptr /= 2;
CARD_SET_RES_FLAGS(device_get_parent(dev), dev,
SYS_RES_MEMORY, rid, mfc[mfc_index].common
? PCCARD_A_MEM_ATTR : PCCARD_A_MEM_ATTR);
DPRINTF(("cis mem map %x\n",
(unsigned int) tuple.memh));
/* set parse state, and point at the next one */
tuple.mult = mfc[mfc_index].common ? 1 : 2;
mfc_index++;
} else {
goto done;
@ -411,10 +378,8 @@ pccard_scan_cis(device_t dev, int (*fct)(struct pccard_tuple *, void *),
continue;
}
tuple.ptr += 2 + tuple.length;
break;
}
#endif /* XXX */
}
done: