cvs commit: src/sys/dev/fxp if_fxp.c
M. Warner Losh
imp at bsdimp.com
Tue Apr 15 07:27:56 PDT 2003
In message: <20030414124016.O39446 at sasami.jurai.net>
"Matthew N. Dodd" <mdodd at FreeBSD.org> writes:
: On Mon, 14 Apr 2003, M. Warner Losh wrote:
: > In message: <200304140945.h3E9jPCe005099 at repoman.freebsd.org>
: > Maxim Sobolev <sobomax at FreeBSD.org> writes:
: > : Before attaching device set PCIM_CMD_PORTEN in addition to
: > : PCIM_CMD_MEMEN and PCIM_CMD_BUSMASTEREN, becaise some braindead
: > : BIOSes (such as one found in my vprmatrix notebook) forget
: > : to initialize it properly resulting in attachment failure.
: >
: > Actually, code like this should be the pci bus, since all driver have
: > this issue...
:
: Likely this could be added to the bus_alloc_resource() path... Doing a
: sanity check on requests and then enabling the resource seems like the
: correct solution.
Yup. Here's the patch I came up with. Care to review?
Index: pci.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/pci/pci.c,v
retrieving revision 1.212
diff -u -r1.212 pci.c
--- pci.c 19 Feb 2003 05:47:09 -0000 1.212
+++ pci.c 15 Apr 2003 14:23:03 -0000
@@ -1301,21 +1301,33 @@
* XXX add support here for SYS_RES_IOPORT and SYS_RES_MEMORY
*/
if (device_get_parent(child) == dev) {
- /*
- * If the child device doesn't have an interrupt routed
- * and is deserving of an interrupt, try to assign it one.
- */
- if ((type == SYS_RES_IRQ) &&
- !PCI_INTERRUPT_VALID(cfg->intline) &&
- (cfg->intpin != 0)) {
- cfg->intline = PCIB_ROUTE_INTERRUPT(
- device_get_parent(dev), child, cfg->intpin);
- if (PCI_INTERRUPT_VALID(cfg->intline)) {
- pci_write_config(child, PCIR_INTLINE,
- cfg->intline, 1);
- resource_list_add(rl, SYS_RES_IRQ, 0,
- cfg->intline, cfg->intline, 1);
+ switch (type) {
+ case SYS_RES_IRQ:
+ /*
+ * If the child device doesn't have an
+ * interrupt routed and is deserving of an
+ * interrupt, try to assign it one.
+ */
+ if (!PCI_INTERRUPT_VALID(cfg->intline) &&
+ (cfg->intpin != 0)) {
+ cfg->intline = PCIB_ROUTE_INTERRUPT(
+ device_get_parent(dev), child, cfg->intpin);
+ if (PCI_INTERRUPT_VALID(cfg->intline)) {
+ pci_write_config(child, PCIR_INTLINE,
+ cfg->intline, 1);
+ resource_list_add(rl, SYS_RES_IRQ, 0,
+ cfg->intline, cfg->intline, 1);
+ }
}
+ break;
+ case SYS_RES_IOPORT:
+ case SYS_RES_MEMORY:
+ /*
+ * Enable the I/O mode. We should also be allocating
+ * resources too. XXX
+ */
+ pci_enable_io_method(dev, child, type);
+ break;
}
}
More information about the cvs-src
mailing list