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;
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to