Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/dev/usb Make zyd(4) use config_mountroot(9) to complete ...



details:   https://anonhg.NetBSD.org/src/rev/7de8a32c8957
branches:  trunk
changeset: 756037:7de8a32c8957
user:      tsutsui <tsutsui%NetBSD.org@localhost>
date:      Sun Jul 04 15:38:27 2010 +0000

description:
Make zyd(4) use config_mountroot(9) to complete device initialization
(which requires firmload(9)) right after mountroot.

Now it's attached on boot as following:
---
uhub4 at usb4: vendor 0x1033 EHCI root hub, class 9/0, rev 2.00/1.00, addr 1
uhub4: 5 ports with 5 removable, self powered
 :
zyd0 at uhub4 port 4
zyd0: PCI PCI GW-US54GXS, rev 2.00/48.10, addr 3
 :
boot device: wd0
root on wd0a dumps on wd0b
root file system type: ffs
zyd0: HMAC ZD1211B, FW 47.25, RF AL2230, PA 0, address 00:22:cf:xx:xx:xx
zyd0: 11b rates: 1Mbps 2Mbps 5.5Mbps 11Mbps
zyd0: 11g rates: 1Mbps 2Mbps 5.5Mbps 11Mbps 6Mbps 9Mbps 12Mbps 18Mbps 24Mbps 36Mbps 48Mbps 54Mbps
 :
---

Should close PR kern/43125, no particular objections in that PR.

diffstat:

 sys/dev/usb/if_zyd.c |  40 +++++++++++++++-------------------------
 1 files changed, 15 insertions(+), 25 deletions(-)

diffs (136 lines):

diff -r d64649a5063a -r 7de8a32c8957 sys/dev/usb/if_zyd.c
--- a/sys/dev/usb/if_zyd.c      Sun Jul 04 15:31:04 2010 +0000
+++ b/sys/dev/usb/if_zyd.c      Sun Jul 04 15:38:27 2010 +0000
@@ -1,5 +1,5 @@
 /*     $OpenBSD: if_zyd.c,v 1.52 2007/02/11 00:08:04 jsg Exp $ */
-/*     $NetBSD: if_zyd.c,v 1.25 2010/04/05 07:21:49 joerg Exp $        */
+/*     $NetBSD: if_zyd.c,v 1.26 2010/07/04 15:38:27 tsutsui Exp $      */
 
 /*-
  * Copyright (c) 2006 by Damien Bergamini <damien.bergamini%free.fr@localhost>
@@ -22,7 +22,7 @@
  * ZyDAS ZD1211/ZD1211B USB WLAN driver.
  */
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_zyd.c,v 1.25 2010/04/05 07:21:49 joerg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_zyd.c,v 1.26 2010/07/04 15:38:27 tsutsui Exp $");
 
 
 #include <sys/param.h>
@@ -156,7 +156,7 @@
 CFATTACH_DECL_NEW(zyd, sizeof(struct zyd_softc), zyd_match,
     zyd_attach, zyd_detach, zyd_activate);
 
-Static int     zyd_attachhook(void *);
+Static void    zyd_attachhook(device_t);
 Static int     zyd_complete_attach(struct zyd_softc *);
 Static int     zyd_open_pipes(struct zyd_softc *);
 Static void    zyd_close_pipes(struct zyd_softc *);
@@ -245,10 +245,10 @@
            UMATCH_VENDOR_PRODUCT : UMATCH_NONE;
 }
 
-Static int
-zyd_attachhook(void *xsc)
+Static void
+zyd_attachhook(device_t self)
 {
-       struct zyd_softc *sc = xsc;
+       struct zyd_softc *sc = device_private(self);
        firmware_handle_t fwh;
        const char *fwname;
        u_char *fw;
@@ -259,7 +259,7 @@
        if ((error = firmware_open("zyd", fwname, &fwh)) != 0) {
                aprint_error_dev(sc->sc_dev,
                    "failed to open firmware %s (error=%d)\n", fwname, error);
-               return error;
+               return;
        }
        size = firmware_get_size(fwh);
        fw = firmware_malloc(size);
@@ -267,7 +267,7 @@
                aprint_error_dev(sc->sc_dev,
                    "failed to allocate firmware memory\n");
                firmware_close(fwh);
-               return ENOMEM;
+               return;
        }
        error = firmware_read(fwh, 0, fw, size);
        firmware_close(fwh);
@@ -275,7 +275,7 @@
                aprint_error_dev(sc->sc_dev,
                    "failed to read firmware (error %d)\n", error);
                firmware_free(fw, 0);
-               return error;
+               return;
        }
 
        error = zyd_loadfirmware(sc, fw, size);
@@ -283,7 +283,7 @@
                aprint_error_dev(sc->sc_dev,
                    "could not load firmware (error=%d)\n", error);
                firmware_free(fw, 0);
-               return ENXIO;
+               return;
        }
 
        firmware_free(fw, 0);
@@ -292,7 +292,7 @@
        /* complete the attach process */
        if ((error = zyd_complete_attach(sc)) == 0)
                sc->attached = 1;
-       return error;
+       return;
 }
 
 void
@@ -334,13 +334,10 @@
        IFQ_SET_READY(&ifp->if_snd);
        memcpy(ifp->if_xname, device_xname(sc->sc_dev), IFNAMSIZ);
 
-       if_attach(ifp);
-       /* XXXX: alloc temporarily until the layer2 can be configured. */
-       if_alloc_sadl(ifp);
-
        SIMPLEQ_INIT(&sc->sc_rqh);
 
-       return;
+       /* defer configrations after file system is ready to load firmware */
+       config_mountroot(self, zyd_attachhook);
 }
 
 Static int
@@ -424,7 +421,7 @@
                    IEEE80211_CHAN_DYN | IEEE80211_CHAN_2GHZ;
        }
 
-       if_free_sadl(ifp);
+       if_attach(ifp);
        ieee80211_ifattach(ic);
        ic->ic_node_alloc = zyd_node_alloc;
        ic->ic_newassoc = zyd_newassoc;
@@ -461,11 +458,8 @@
        struct ifnet *ifp = &sc->sc_if;
        int s;
 
-       if (!sc->attached) {
-               if_free_sadl(ifp);
-               if_detach(ifp);
+       if (!sc->attached)
                return 0;
-       }
 
        s = splusb();
 
@@ -2450,10 +2444,6 @@
        struct ieee80211com *ic = &sc->sc_ic;
        int i, error;
 
-       if ((sc->sc_flags & ZD1211_FWLOADED) == 0)
-               if ((error = zyd_attachhook(sc)) != 0)
-                       return error;
-
        zyd_stop(ifp, 0);
 
        IEEE80211_ADDR_COPY(ic->ic_myaddr, CLLADDR(ifp->if_sadl));



Home | Main Index | Thread Index | Old Index