cvs commit: src/sys/dev/netif/ipw if_ipw.c if_ipwvar.h

Johannes Hofmann Johannes.Hofmann at gmx.de
Tue Nov 29 11:35:20 PST 2005


Matthew Dillon <dillon at xxxxxxxxxxxxxxxxxxxx> wrote:
> 
> :Thanks, this fixes the panic, but the firmware loading no longer works. I get:
> :
> :Nov 29 19:06:45 blob kernel: ipw0: timeout waiting for firmware initialization to complete
> :Nov 29 19:06:45 blob kernel: ipw0: could not load firmware
> :
> :Regards,
> : Johannes
> 
>    Ugh.  ipw is so badly written.  Sigh.  Try this patch.
> 
>                                        -Matt
>                                        Matthew Dillon 
>                                        <dillon at xxxxxxxxxxxxx>
> 

Yes, that fixes it! I am posting this via the ipw interface :-)

Thanks a lot,
Johannes
> 
> Index: dev/netif/ipw/if_ipw.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/netif/ipw/if_ipw.c,v
> retrieving revision 1.11
> diff -u -r1.11 if_ipw.c
> --- dev/netif/ipw/if_ipw.c      29 Nov 2005 17:15:56 -0000      1.11
> +++ dev/netif/ipw/if_ipw.c      29 Nov 2005 19:13:55 -0000
> @@ -1268,6 +1268,7 @@
> static int
> ipw_cmd(struct ipw_softc *sc, u_int32_t type, void *data, u_int32_t len)
> {
> +       struct ifnet *ifp = &sc->sc_ic.ic_if;
>        struct ipw_soft_bd *sbd;
>        bus_addr_t physaddr;
>        int error;
> @@ -1301,12 +1302,16 @@
> 
>        sc->txcur = (sc->txcur + 1) % IPW_NTBD;
>        sc->txfree--;
> -       CSR_WRITE_4(sc, IPW_CSR_TX_WRITE_INDEX, sc->txcur);
> -
> -       DPRINTFN(2, ("TX!CMD!%u!%u!%u!%u\n", type, 0, 0, len));
> 
> +       crit_enter();
> +       tsleep_interlock(sc);
> +       CSR_WRITE_4(sc, IPW_CSR_TX_WRITE_INDEX, sc->txcur);
> +       lwkt_serialize_exit(ifp->if_serializer);
>        /* wait at most one second for command to complete */
> -       return tsleep(sc, 0, "ipwcmd", hz);
> +       error = tsleep(sc, 0, "ipwcmd", hz);
> +       crit_exit();
> +       lwkt_serialize_enter(ifp->if_serializer);
> +       return (error);
> }
> 
> static int
> @@ -1706,6 +1711,7 @@
> static int
> ipw_load_firmware(struct ipw_softc *sc, u_char *fw, int size)
> {
> +       struct ifnet *ifp = &sc->sc_ic.ic_if;
>        u_char *p, *end;
>        u_int32_t dst;
>        u_int16_t len;
> @@ -1734,12 +1740,18 @@
>        CSR_WRITE_4(sc, IPW_CSR_INTR_MASK, IPW_INTR_MASK);
> 
>        /* Tell the adapter to initialize the firmware */
> +       crit_enter();
>        CSR_WRITE_4(sc, IPW_CSR_RST, 0);
>        CSR_WRITE_4(sc, IPW_CSR_CTL, CSR_READ_4(sc, IPW_CSR_CTL) |
>            IPW_CTL_ALLOW_STANDBY);
> 
>        /* Wait at most one second for firmware initialization to complete */
> -       if ((error = tsleep(sc, 0, "ipwinit", hz)) != 0) {
> +       tsleep_interlock(sc);
> +       lwkt_serialize_exit(ifp->if_serializer);
> +       error = tsleep(sc, 0, "ipwinit", hz);
> +       crit_exit();
> +       lwkt_serialize_enter(ifp->if_serializer);
> +       if (error) {
>                if_printf(&sc->sc_ic.ic_if, "timeout waiting for firmware "
>                    "initialization to complete\n");
>                return error;





More information about the Commits mailing list