From owner-p4-projects@FreeBSD.ORG Tue Jan 2 01:34:04 2007 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 488D316A415; Tue, 2 Jan 2007 01:34:04 +0000 (UTC) X-Original-To: perforce@freebsd.org Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 0C09816A407 for ; Tue, 2 Jan 2007 01:34:04 +0000 (UTC) (envelope-from kmacy@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [69.147.83.41]) by mx1.freebsd.org (Postfix) with ESMTP id F135313C457 for ; Tue, 2 Jan 2007 01:34:03 +0000 (UTC) (envelope-from kmacy@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.6/8.13.6) with ESMTP id l021Y3Dh059886 for ; Tue, 2 Jan 2007 01:34:03 GMT (envelope-from kmacy@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.6/8.13.4/Submit) id l021Y3Mb059883 for perforce@freebsd.org; Tue, 2 Jan 2007 01:34:03 GMT (envelope-from kmacy@freebsd.org) Date: Tue, 2 Jan 2007 01:34:03 GMT Message-Id: <200701020134.l021Y3Mb059883@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to kmacy@freebsd.org using -f From: Kip Macy To: Perforce Change Reviews Cc: Subject: PERFORCE change 112407 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 02 Jan 2007 01:34:04 -0000 http://perforce.freebsd.org/chv.cgi?CH=112407 Change 112407 by kmacy@kmacy_serendipity:sam_wifi on 2007/01/02 01:33:30 - convert channel initialization to packed format - getting a firmware error kicks the device restart task which can race with unload, only restart if the interface is up - still need to track down and fix the source of the firmware error Affected files ... .. //depot/projects/wifi/sys/dev/iwi/if_iwi.c#16 edit Differences ... ==== //depot/projects/wifi/sys/dev/iwi/if_iwi.c#16 (text+ko) ==== @@ -259,7 +259,7 @@ struct ieee80211com *ic = &sc->sc_ic; struct ieee80211_channel *c; uint16_t val; - int error, i; + int error, i, j; sc->sc_dev = dev; @@ -269,12 +269,12 @@ sc->sc_unr = new_unrhdr(1, IWI_MAX_IBSSNODE-1, &sc->sc_mtx); #if __FreeBSD_version >= 700000 - sc->sc_tq = taskqueue_create("iwi_taskq", M_NOWAIT, + sc->sc_tq = taskqueue_create("iwi_taskq", M_NOWAIT | M_ZERO, taskqueue_thread_enqueue, &sc->sc_tq); taskqueue_start_threads(&sc->sc_tq, 1, PI_NET, "%s taskq", device_get_nameunit(dev)); #else - sc->sc_tq = taskqueue_create("iwi_taskq", M_NOWAIT, + sc->sc_tq = taskqueue_create("iwi_taskq", M_NOWAIT | M_ZERO, taskqueue_thread_enqueue, &sc->sc_tq, &sc->sc_tqproc); kthread_create(taskqueue_thread_loop, &sc->sc_tq, &sc->sc_tqproc, 0, 0, "%s taskq", device_get_nameunit(dev)); @@ -408,38 +408,43 @@ val = iwi_read_prom_word(sc, IWI_EEPROM_MAC + 2); ic->ic_myaddr[4] = val & 0xff; ic->ic_myaddr[5] = val >> 8; + + /* set supported .11b and .11g channels (1 through 14) */ + for (j = 0, i = 1; i <= 14; i++) { + c = &ic->ic_channels[j++]; + c->ic_freq = ieee80211_ieee2mhz(i, IEEE80211_CHAN_2GHZ); + c->ic_flags = IEEE80211_CHAN_B; + c->ic_ieee = i; + c = &ic->ic_channels[j++]; + c->ic_freq = ieee80211_ieee2mhz(i, IEEE80211_CHAN_2GHZ); + c->ic_flags = IEEE80211_CHAN_G; + c->ic_ieee = i; + } if (pci_get_device(dev) >= 0x4223) { /* set supported .11a rates (2915ABG only) */ ic->ic_sup_rates[IEEE80211_MODE_11A] = iwi_rateset_11a; /* set supported .11a channels */ - for (i = 36; i <= 64; i += 4) { - ic->ic_channels[i].ic_freq = + for (i = 36; i <= 64; i += 4, j++) { + ic->ic_channels[j].ic_freq = ieee80211_ieee2mhz(i, IEEE80211_CHAN_5GHZ); - ic->ic_channels[i].ic_flags = IEEE80211_CHAN_A; + ic->ic_channels[j].ic_flags = IEEE80211_CHAN_A; + ic->ic_channels[j].ic_ieee = i; } - for (i = 149; i <= 165; i += 4) { - ic->ic_channels[i].ic_freq = + for (i = 149; i <= 165; i += 4, j++) { + ic->ic_channels[j].ic_freq = ieee80211_ieee2mhz(i, IEEE80211_CHAN_5GHZ); - ic->ic_channels[i].ic_flags = IEEE80211_CHAN_A; + ic->ic_channels[j].ic_flags = IEEE80211_CHAN_A; + ic->ic_channels[j].ic_ieee = i; } } /* set supported .11b and .11g rates */ ic->ic_sup_rates[IEEE80211_MODE_11B] = iwi_rateset_11b; ic->ic_sup_rates[IEEE80211_MODE_11G] = iwi_rateset_11g; + ic->ic_nchans = j; - /* set supported .11b and .11g channels (1 through 14) */ - for (i = 1; i <= 14; i++) { - c = &ic->ic_channels[ic->ic_nchans++]; - c->ic_freq = ieee80211_ieee2mhz(i, IEEE80211_CHAN_2GHZ); - c->ic_flags = - IEEE80211_CHAN_CCK | IEEE80211_CHAN_OFDM | - IEEE80211_CHAN_DYN | IEEE80211_CHAN_2GHZ; - c->ic_ieee = i; - } - ieee80211_ifattach(ic); ic->ic_bmissthreshold = 10; /* override default */ /* override default methods */ @@ -1667,7 +1672,9 @@ if (r & IWI_INTR_FATAL_ERROR) { device_printf(sc->sc_dev, "firmware error\n"); - taskqueue_enqueue(sc->sc_tq, &sc->sc_restarttask); + /* don't restart if the interface isn't up */ + if (sc->sc_ifp->if_flags & IFF_DRV_RUNNING) + taskqueue_enqueue(sc->sc_tq, &sc->sc_restarttask); } if (r & IWI_INTR_FW_INITED) { @@ -2818,9 +2825,6 @@ * in the list. */ if (sc->flags & IWI_FLAG_SCANNING) { -#if 0 - ieee80211_begin_scan(ic, 1); -#endif if (iwi_scan(sc) != 0) { /* XXX should not happen */ sc->flags &= ~IWI_FLAG_SCANNING;