svn commit: r221637 - head/sys/dev/iwn
Bernhard Schmidt
bschmidt at FreeBSD.org
Sun May 8 10:35:17 UTC 2011
Author: bschmidt
Date: Sun May 8 10:35:16 2011
New Revision: 221637
URL: http://svn.freebsd.org/changeset/base/221637
Log:
Use the enhanced TX power information availabe on newer EEPROMs.
Modified:
head/sys/dev/iwn/if_iwn.c
head/sys/dev/iwn/if_iwnreg.h
head/sys/dev/iwn/if_iwnvar.h
Modified: head/sys/dev/iwn/if_iwn.c
==============================================================================
--- head/sys/dev/iwn/if_iwn.c Sun May 8 10:31:22 2011 (r221636)
+++ head/sys/dev/iwn/if_iwn.c Sun May 8 10:35:16 2011 (r221637)
@@ -2033,18 +2033,22 @@ static void
iwn_read_eeprom_enhinfo(struct iwn_softc *sc)
{
struct iwn_eeprom_enhinfo enhinfo[35];
+ struct ifnet *ifp = sc->sc_ifp;
+ struct ieee80211com *ic = ifp->if_l2com;
+ struct ieee80211_channel *c;
uint16_t val, base;
int8_t maxpwr;
- int i;
+ uint8_t flags;
+ int i, j;
iwn_read_prom_data(sc, IWN5000_EEPROM_REG, &val, 2);
base = le16toh(val);
iwn_read_prom_data(sc, base + IWN6000_EEPROM_ENHINFO,
enhinfo, sizeof enhinfo);
- memset(sc->enh_maxpwr, 0, sizeof sc->enh_maxpwr);
for (i = 0; i < nitems(enhinfo); i++) {
- if (enhinfo[i].chan == 0 || enhinfo[i].reserved != 0)
+ flags = enhinfo[i].flags;
+ if (!(flags & IWN_ENHINFO_VALID))
continue; /* Skip invalid entries. */
maxpwr = 0;
@@ -2058,11 +2062,34 @@ iwn_read_eeprom_enhinfo(struct iwn_softc
maxpwr = MAX(maxpwr, enhinfo[i].mimo2);
else if (sc->ntxchains == 3)
maxpwr = MAX(maxpwr, enhinfo[i].mimo3);
- maxpwr /= 2; /* Convert half-dBm to dBm. */
- DPRINTF(sc, IWN_DEBUG_RESET, "enhinfo %d, maxpwr=%d\n", i,
- maxpwr);
- sc->enh_maxpwr[i] = maxpwr;
+ for (j = 0; j < ic->ic_nchans; j++) {
+ c = &ic->ic_channels[j];
+ if ((flags & IWN_ENHINFO_5GHZ)) {
+ if (!IEEE80211_IS_CHAN_A(c))
+ continue;
+ } else if ((flags & IWN_ENHINFO_OFDM)) {
+ if (!IEEE80211_IS_CHAN_G(c))
+ continue;
+ } else if (!IEEE80211_IS_CHAN_B(c))
+ continue;
+ if ((flags & IWN_ENHINFO_HT40)) {
+ if (!IEEE80211_IS_CHAN_HT40(c))
+ continue;
+ } else {
+ if (IEEE80211_IS_CHAN_HT40(c))
+ continue;
+ }
+ if (enhinfo[i].chan != 0 &&
+ enhinfo[i].chan != c->ic_ieee)
+ continue;
+
+ DPRINTF(sc, IWN_DEBUG_RESET,
+ "channel %d(%x), maxpwr %d\n", c->ic_ieee,
+ c->ic_flags, maxpwr / 2);
+ c->ic_maxregpower = maxpwr / 2;
+ c->ic_maxpower = maxpwr;
+ }
}
}
Modified: head/sys/dev/iwn/if_iwnreg.h
==============================================================================
--- head/sys/dev/iwn/if_iwnreg.h Sun May 8 10:31:22 2011 (r221636)
+++ head/sys/dev/iwn/if_iwnreg.h Sun May 8 10:35:16 2011 (r221637)
@@ -1433,7 +1433,17 @@ struct iwn_eeprom_chan {
} __packed;
struct iwn_eeprom_enhinfo {
- uint16_t chan;
+ uint8_t flags;
+#define IWN_ENHINFO_VALID 0x01
+#define IWN_ENHINFO_5GHZ 0x02
+#define IWN_ENHINFO_OFDM 0x04
+#define IWN_ENHINFO_HT40 0x08
+#define IWN_ENHINFO_HTAP 0x10
+#define IWN_ENHINFO_RES1 0x20
+#define IWN_ENHINFO_RES2 0x40
+#define IWN_ENHINFO_COMMON 0x80
+
+ uint8_t chan;
int8_t chain[3]; /* max power in half-dBm */
uint8_t reserved;
int8_t mimo2; /* max power in half-dBm */
Modified: head/sys/dev/iwn/if_iwnvar.h
==============================================================================
--- head/sys/dev/iwn/if_iwnvar.h Sun May 8 10:31:22 2011 (r221636)
+++ head/sys/dev/iwn/if_iwnvar.h Sun May 8 10:35:16 2011 (r221637)
@@ -295,7 +295,6 @@ struct iwn_softc {
int8_t maxpwr2GHz;
int8_t maxpwr5GHz;
int8_t maxpwr[IEEE80211_CHAN_MAX];
- int8_t enh_maxpwr[35];
int32_t temp_off;
uint32_t int_mask;
More information about the svn-src-head
mailing list