From owner-svn-src-all@FreeBSD.ORG Mon Apr 20 01:19:59 2009 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id EF384106566B; Mon, 20 Apr 2009 01:19:59 +0000 (UTC) (envelope-from imp@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id D25818FC13; Mon, 20 Apr 2009 01:19:59 +0000 (UTC) (envelope-from imp@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n3K1Jx48027104; Mon, 20 Apr 2009 01:19:59 GMT (envelope-from imp@svn.freebsd.org) Received: (from imp@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n3K1JxnX027100; Mon, 20 Apr 2009 01:19:59 GMT (envelope-from imp@svn.freebsd.org) Message-Id: <200904200119.n3K1JxnX027100@svn.freebsd.org> From: Warner Losh Date: Mon, 20 Apr 2009 01:19:59 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r191299 - head/sys/dev/ed X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 20 Apr 2009 01:20:00 -0000 Author: imp Date: Mon Apr 20 01:19:59 2009 New Revision: 191299 URL: http://svn.freebsd.org/changeset/base/191299 Log: Cleanup resource allocation code a bit. Store the rids on the resources rather than on the softc. When we allocate resources for PC Card, if we only get 16 ports, try again to get the others. Modified: head/sys/dev/ed/if_ed.c head/sys/dev/ed/if_ed_cbus.c head/sys/dev/ed/if_ed_isa.c head/sys/dev/ed/if_ed_pccard.c head/sys/dev/ed/if_edvar.h Modified: head/sys/dev/ed/if_ed.c ============================================================================== --- head/sys/dev/ed/if_ed.c Sun Apr 19 23:34:52 2009 (r191298) +++ head/sys/dev/ed/if_ed.c Mon Apr 20 01:19:59 2009 (r191299) @@ -164,7 +164,6 @@ ed_alloc_port(device_t dev, int rid, int res = bus_alloc_resource(dev, SYS_RES_IOPORT, &rid, 0ul, ~0ul, size, RF_ACTIVE); if (res) { - sc->port_rid = rid; sc->port_res = res; sc->port_used = size; sc->port_bst = rman_get_bustag(res); @@ -186,7 +185,6 @@ ed_alloc_memory(device_t dev, int rid, i res = bus_alloc_resource(dev, SYS_RES_MEMORY, &rid, 0ul, ~0ul, size, RF_ACTIVE); if (res) { - sc->mem_rid = rid; sc->mem_res = res; sc->mem_used = size; sc->mem_bst = rman_get_bustag(res); @@ -207,7 +205,6 @@ ed_alloc_irq(device_t dev, int rid, int res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, RF_ACTIVE | flags); if (res) { - sc->irq_rid = rid; sc->irq_res = res; return (0); } @@ -222,21 +219,18 @@ ed_release_resources(device_t dev) { struct ed_softc *sc = device_get_softc(dev); - if (sc->port_res) { - bus_release_resource(dev, SYS_RES_IOPORT, - sc->port_rid, sc->port_res); - sc->port_res = 0; - } - if (sc->mem_res) { - bus_release_resource(dev, SYS_RES_MEMORY, - sc->mem_rid, sc->mem_res); - sc->mem_res = 0; - } - if (sc->irq_res) { - bus_release_resource(dev, SYS_RES_IRQ, - sc->irq_rid, sc->irq_res); - sc->irq_res = 0; - } + if (sc->port_res) + bus_free_resource(dev, SYS_RES_IOPORT, sc->port_res); + if (sc->port_res2) + bus_free_resource(dev, SYS_RES_IOPORT, sc->port_res2); + if (sc->mem_res) + bus_free_resource(dev, SYS_RES_MEMORY, sc->mem_res); + if (sc->irq_res) + bus_free_resource(dev, SYS_RES_IRQ, sc->irq_res); + sc->port_res = 0; + sc->port_res2 = 0; + sc->mem_res = 0; + sc->irq_res = 0; if (sc->ifp) if_free(sc->ifp); } Modified: head/sys/dev/ed/if_ed_cbus.c ============================================================================== --- head/sys/dev/ed/if_ed_cbus.c Sun Apr 19 23:34:52 2009 (r191298) +++ head/sys/dev/ed/if_ed_cbus.c Mon Apr 20 01:19:59 2009 (r191299) @@ -233,14 +233,14 @@ ed_cbus_attach(dev) if (sc->port_used > 0) { if (ED_TYPE98(flags) == ED_TYPE98_GENERIC) - ed_alloc_port(dev, sc->port_rid, sc->port_used); + ed_alloc_port(dev, 0, sc->port_used); else - ed98_alloc_port(dev, sc->port_rid); + ed98_alloc_port(dev, 0); } if (sc->mem_used) - ed_alloc_memory(dev, sc->mem_rid, sc->mem_used); + ed_alloc_memory(dev, 0, sc->mem_used); - ed_alloc_irq(dev, sc->irq_rid, 0); + ed_alloc_irq(dev, 0, 0); if (sc->sc_media_ioctl == NULL) ed_gen_ifmedia_init(sc); @@ -541,7 +541,6 @@ ed98_alloc_port(device_t dev, int rid) if (!res) return (ENOENT); - sc->port_rid = rid; sc->port_res = res; sc->port_used = n; sc->port_bst = rman_get_bustag(res); Modified: head/sys/dev/ed/if_ed_isa.c ============================================================================== --- head/sys/dev/ed/if_ed_isa.c Sun Apr 19 23:34:52 2009 (r191298) +++ head/sys/dev/ed/if_ed_isa.c Mon Apr 20 01:19:59 2009 (r191299) @@ -163,11 +163,10 @@ ed_isa_attach(device_t dev) int error; if (sc->port_used > 0) - ed_alloc_port(dev, sc->port_rid, sc->port_used); + ed_alloc_port(dev, 0, sc->port_used); if (sc->mem_used) - ed_alloc_memory(dev, sc->mem_rid, sc->mem_used); - - ed_alloc_irq(dev, sc->irq_rid, 0); + ed_alloc_memory(dev, 0, sc->mem_used); + ed_alloc_irq(dev, 0, 0); if (sc->sc_media_ioctl == NULL) ed_gen_ifmedia_init(sc); Modified: head/sys/dev/ed/if_ed_pccard.c ============================================================================== --- head/sys/dev/ed/if_ed_pccard.c Sun Apr 19 23:34:52 2009 (r191298) +++ head/sys/dev/ed/if_ed_pccard.c Mon Apr 20 01:19:59 2009 (r191299) @@ -383,10 +383,7 @@ ed_pccard_rom_mac(device_t dev, uint8_t static int ed_pccard_add_modem(device_t dev) { - struct ed_softc *sc = device_get_softc(dev); - - device_printf(dev, "Need to write this code: modem rid is %d\n", - sc->modem_rid); + device_printf(dev, "Need to write this code\n"); return 0; } @@ -439,7 +436,7 @@ ed_pccard_attach(device_t dev) u_char sum; u_char enaddr[ETHER_ADDR_LEN]; const struct ed_product *pp; - int error, i, flags; + int error, i, flags, port_rid, modem_rid; struct ed_softc *sc = device_get_softc(dev); u_long size; static uint16_t *intr_vals[] = {NULL, NULL}; @@ -447,29 +444,42 @@ ed_pccard_attach(device_t dev) sc->dev = dev; if ((pp = (const struct ed_product *) pccard_product_lookup(dev, (const struct pccard_product *) ed_pccard_products, - sizeof(ed_pccard_products[0]), NULL)) == NULL) + sizeof(ed_pccard_products[0]), NULL)) == NULL) { + printf("Can't find\n"); return (ENXIO); - sc->modem_rid = -1; + } + modem_rid = port_rid = -1; if (pp->flags & NE2000DVF_MODEM) { - sc->port_rid = -1; for (i = 0; i < 4; i++) { size = bus_get_resource_count(dev, SYS_RES_IOPORT, i); if (size == ED_NOVELL_IO_PORTS) - sc->port_rid = i; + port_rid = i; else if (size == 8) - sc->modem_rid = i; + modem_rid = i; } - if (sc->port_rid == -1) { + if (port_rid == -1) { device_printf(dev, "Cannot locate my ports!\n"); return (ENXIO); } } else { - sc->port_rid = 0; + port_rid = 0; } /* Allocate the port resource during setup. */ - error = ed_alloc_port(dev, sc->port_rid, ED_NOVELL_IO_PORTS); - if (error) + error = ed_alloc_port(dev, port_rid, ED_NOVELL_IO_PORTS); + if (error) { + printf("alloc_port failed\n"); return (error); + } + if (rman_get_size(sc->port_res) == ED_NOVELL_IO_PORTS / 2) { + port_rid++; + sc->port_res2 = bus_alloc_resource(dev, SYS_RES_IOPORT, + &port_rid, 0ul, ~0ul, 1, RF_ACTIVE); + if (sc->port_res2 == NULL || + rman_get_size(sc->port_res2) != ED_NOVELL_IO_PORTS / 2) { + error = ENXIO; + goto bad; + } + } error = ed_alloc_irq(dev, 0, 0); if (error) goto bad; @@ -489,8 +499,10 @@ ed_pccard_attach(device_t dev) error = ed_pccard_ax88x90(dev, pp); if (error != 0) error = ed_pccard_tc5299j(dev, pp); - if (error != 0) + if (error != 0) { error = ed_probe_Novell_generic(dev, flags); + printf("Novell probe generic %d\n", error); + } if (error != 0 && (pp->flags & NE2000DVF_TOSHIBA)) { flags |= ED_FLAGS_TOSH_ETHER; flags |= ED_FLAGS_PCCARD; @@ -586,7 +598,7 @@ ed_pccard_attach(device_t dev) } else { ed_gen_ifmedia_init(sc); } - if (sc->modem_rid != -1) + if (modem_rid != -1) ed_pccard_add_modem(dev); error = bus_setup_intr(dev, sc->irq_res, INTR_TYPE_NET | INTR_MPSAFE, Modified: head/sys/dev/ed/if_edvar.h ============================================================================== --- head/sys/dev/ed/if_edvar.h Sun Apr 19 23:34:52 2009 (r191298) +++ head/sys/dev/ed/if_edvar.h Mon Apr 20 01:19:59 2009 (r191299) @@ -47,20 +47,17 @@ struct ed_softc { u_char xmit_busy; /* transmitter is busy */ u_char enaddr[6]; - int port_rid; /* resource id for port range */ int port_used; /* nonzero if ports used */ struct resource* port_res; /* resource for port range */ + struct resource* port_res2; /* resource for port range */ bus_space_tag_t port_bst; bus_space_handle_t port_bsh; - int mem_rid; /* resource id for memory range */ int mem_used; /* nonzero if memory used */ struct resource* mem_res; /* resource for memory range */ bus_space_tag_t mem_bst; bus_space_handle_t mem_bsh; - int irq_rid; /* resource id for irq */ struct resource* irq_res; /* resource for irq */ void* irq_handle; /* handle for irq handler */ - int modem_rid; /* resource ID for modem part of device */ int (*sc_media_ioctl)(struct ed_softc *sc, struct ifreq *ifr, u_long command); void (*sc_mediachg)(struct ed_softc *);