From owner-svn-src-all@freebsd.org Sun May 1 22:00:42 2016 Return-Path: Delivered-To: svn-src-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 19D72B2954C; Sun, 1 May 2016 22:00:42 +0000 (UTC) (envelope-from avos@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id D0B2D124B; Sun, 1 May 2016 22:00:41 +0000 (UTC) (envelope-from avos@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id u41M0fPi019380; Sun, 1 May 2016 22:00:41 GMT (envelope-from avos@FreeBSD.org) Received: (from avos@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id u41M0fnL019379; Sun, 1 May 2016 22:00:41 GMT (envelope-from avos@FreeBSD.org) Message-Id: <201605012200.u41M0fnL019379@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: avos set sender to avos@FreeBSD.org using -f From: Andriy Voskoboinyk Date: Sun, 1 May 2016 22:00:41 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r298903 - head/sys/dev/iwn X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.22 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: Sun, 01 May 2016 22:00:42 -0000 Author: avos Date: Sun May 1 22:00:40 2016 New Revision: 298903 URL: https://svnweb.freebsd.org/changeset/base/298903 Log: iwn: switch to ieee80211_add_channel*() Switch to add_channel / add_channel_ht40 + pass channel's TX power for the last. Tested by: dhw Reviewed by: adrian Differential Revision: https://reviews.freebsd.org/D6141 Modified: head/sys/dev/iwn/if_iwn.c Modified: head/sys/dev/iwn/if_iwn.c ============================================================================== --- head/sys/dev/iwn/if_iwn.c Sun May 1 21:48:55 2016 (r298902) +++ head/sys/dev/iwn/if_iwn.c Sun May 1 22:00:40 2016 (r298903) @@ -2381,12 +2381,24 @@ iwn_read_eeprom_band(struct iwn_softc *s { struct iwn_eeprom_chan *channels = sc->eeprom_channels[n]; const struct iwn_chan_band *band = &iwn_bands[n]; - struct ieee80211_channel *c; + uint8_t bands[IEEE80211_MODE_BYTES]; uint8_t chan; - int i, nflags; + int i, error, nflags; DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__); + memset(bands, 0, sizeof(bands)); + if (n == 0) { + setbit(bands, IEEE80211_MODE_11B); + setbit(bands, IEEE80211_MODE_11G); + if (sc->sc_flags & IWN_FLAG_HAS_11N) + setbit(bands, IEEE80211_MODE_11NG); + } else { + setbit(bands, IEEE80211_MODE_11A); + if (sc->sc_flags & IWN_FLAG_HAS_11N) + setbit(bands, IEEE80211_MODE_11NA); + } + for (i = 0; i < band->nchan; i++) { if (!(channels[i].flags & IWN_EEPROM_CHAN_VALID)) { DPRINTF(sc, IWN_DEBUG_RESET, @@ -2396,49 +2408,20 @@ iwn_read_eeprom_band(struct iwn_softc *s continue; } - if (*nchans >= maxchans) - break; - chan = band->chan[i]; nflags = iwn_eeprom_channel_flags(&channels[i]); - - c = &chans[(*nchans)++]; - c->ic_ieee = chan; - c->ic_maxregpower = channels[i].maxpwr; - c->ic_maxpower = 2*c->ic_maxregpower; - - if (n == 0) { /* 2GHz band */ - c->ic_freq = ieee80211_ieee2mhz(chan, IEEE80211_CHAN_G); - /* G =>'s B is supported */ - c->ic_flags = IEEE80211_CHAN_B | nflags; - - if (*nchans >= maxchans) - break; - - c = &chans[(*nchans)++]; - c[0] = c[-1]; - c->ic_flags = IEEE80211_CHAN_G | nflags; - } else { /* 5GHz band */ - c->ic_freq = ieee80211_ieee2mhz(chan, IEEE80211_CHAN_A); - c->ic_flags = IEEE80211_CHAN_A | nflags; - } + error = ieee80211_add_channel(chans, maxchans, nchans, + chan, 0, channels[i].maxpwr, nflags, bands); + if (error != 0) + break; /* Save maximum allowed TX power for this channel. */ + /* XXX wrong */ sc->maxpwr[chan] = channels[i].maxpwr; DPRINTF(sc, IWN_DEBUG_RESET, "add chan %d flags 0x%x maxpwr %d\n", chan, channels[i].flags, channels[i].maxpwr); - - if (sc->sc_flags & IWN_FLAG_HAS_11N) { - if (*nchans >= maxchans) - break; - - /* add HT20, HT40 added separately */ - c = &chans[(*nchans)++]; - c[0] = c[-1]; - c->ic_flags |= IEEE80211_CHAN_HT20; - } } DPRINTF(sc, IWN_DEBUG_TRACE, "->%s end\n", __func__); @@ -2449,12 +2432,10 @@ static void iwn_read_eeprom_ht40(struct iwn_softc *sc, int n, int maxchans, int *nchans, struct ieee80211_channel chans[]) { - struct ieee80211com *ic = &sc->sc_ic; struct iwn_eeprom_chan *channels = sc->eeprom_channels[n]; const struct iwn_chan_band *band = &iwn_bands[n]; - struct ieee80211_channel *c, *cent, *extc; uint8_t chan; - int i, nflags; + int i, error, nflags; DPRINTF(sc, IWN_DEBUG_TRACE, "->%s start\n", __func__); @@ -2472,46 +2453,33 @@ iwn_read_eeprom_ht40(struct iwn_softc *s continue; } - if (*nchans + 1 >= maxchans) - break; - chan = band->chan[i]; nflags = iwn_eeprom_channel_flags(&channels[i]); - - /* - * Each entry defines an HT40 channel pair; find the - * center channel, then the extension channel above. - */ - cent = ieee80211_find_channel_byieee(ic, chan, - (n == 5 ? IEEE80211_CHAN_G : IEEE80211_CHAN_A)); - if (cent == NULL) { /* XXX shouldn't happen */ + nflags |= (n == 5 ? IEEE80211_CHAN_G : IEEE80211_CHAN_A); + error = ieee80211_add_channel_ht40(chans, maxchans, nchans, + chan, channels[i].maxpwr, nflags); + switch (error) { + case EINVAL: device_printf(sc->sc_dev, "%s: no entry for channel %d\n", __func__, chan); continue; - } - extc = ieee80211_find_channel(ic, cent->ic_freq+20, - (n == 5 ? IEEE80211_CHAN_G : IEEE80211_CHAN_A)); - if (extc == NULL) { + case ENOENT: DPRINTF(sc, IWN_DEBUG_RESET, "%s: skip chan %d, extension channel not found\n", __func__, chan); continue; + case ENOBUFS: + device_printf(sc->sc_dev, + "%s: channel table is full!\n", __func__); + break; + case 0: + DPRINTF(sc, IWN_DEBUG_RESET, + "add ht40 chan %d flags 0x%x maxpwr %d\n", + chan, channels[i].flags, channels[i].maxpwr); + /* FALLTHROUGH */ + default: + break; } - - DPRINTF(sc, IWN_DEBUG_RESET, - "add ht40 chan %d flags 0x%x maxpwr %d\n", - chan, channels[i].flags, channels[i].maxpwr); - - c = &chans[(*nchans)++]; - c[0] = cent[0]; - c->ic_extieee = extc->ic_ieee; - c->ic_flags &= ~IEEE80211_CHAN_HT; - c->ic_flags |= IEEE80211_CHAN_HT40U | nflags; - c = &chans[(*nchans)++]; - c[0] = extc[0]; - c->ic_extieee = cent->ic_ieee; - c->ic_flags &= ~IEEE80211_CHAN_HT; - c->ic_flags |= IEEE80211_CHAN_HT40D | nflags; } DPRINTF(sc, IWN_DEBUG_TRACE, "->%s end\n", __func__);