Author: bschmidt
Date: Fri Apr 15 20:35:15 2011
New Revision: 220676
URL: http://svn.freebsd.org/changeset/base/220676

Log:
  The 6005 series devices need additional temperature offset calibration
  as well as the IWN_GP_DRIVER_CALIB_VER6 bit set.
  
  Obtained from:        OpenBSD

Modified:
  head/sys/dev/iwn/if_iwn.c
  head/sys/dev/iwn/if_iwnreg.h

Modified: head/sys/dev/iwn/if_iwn.c
==============================================================================
--- head/sys/dev/iwn/if_iwn.c   Fri Apr 15 20:32:17 2011        (r220675)
+++ head/sys/dev/iwn/if_iwn.c   Fri Apr 15 20:35:15 2011        (r220676)
@@ -222,6 +222,7 @@ static void iwn5000_ampdu_tx_stop(struct
 static int     iwn5000_query_calibration(struct iwn_softc *);
 static int     iwn5000_send_calibration(struct iwn_softc *);
 static int     iwn5000_send_wimax_coex(struct iwn_softc *);
+static int     iwn5000_temp_offset_calib(struct iwn_softc *);
 static int     iwn5000_crystal_calib(struct iwn_softc *);
 static int     iwn4965_post_alive(struct iwn_softc *);
 static int     iwn5000_post_alive(struct iwn_softc *);
@@ -4539,6 +4540,16 @@ iwn_config(struct iwn_softc *sc)
        int error;
        uint16_t rxchain;
 
+       if (sc->hw_type == IWN_HW_REV_TYPE_6005) {
+               /* Set radio temperature sensor offset. */
+               error = iwn5000_temp_offset_calib(sc);
+               if (error != 0) {
+                       device_printf(sc->sc_dev,
+                           "%s: could not set temperature offset\n", __func__);
+                       return error;
+               }
+       }
+
        /* Configure valid TX chains for 5000 Series. */
        if (sc->hw_type != IWN_HW_REV_TYPE_4965) {
                txmask = htole32(sc->txchainmask);
@@ -5326,6 +5337,24 @@ iwn5000_crystal_calib(struct iwn_softc *
        return iwn_cmd(sc, IWN_CMD_PHY_CALIB, &cmd, sizeof cmd, 0);
 }
 
+static int
+iwn5000_temp_offset_calib(struct iwn_softc *sc)
+{
+       struct iwn5000_phy_calib_temp_offset cmd;
+
+       memset(&cmd, 0, sizeof cmd);
+       cmd.code = IWN5000_PHY_CALIB_TEMP_OFFSET;
+       cmd.ngroups = 1;
+       cmd.isvalid = 1;
+       if (sc->eeprom_temp != 0)
+               cmd.offset = htole16(sc->eeprom_temp);
+       else
+               cmd.offset = htole16(IWN_DEFAULT_TEMP_OFFSET);
+       DPRINTF(sc, IWN_DEBUG_CALIBRATE, "setting radio sensor offset to %d\n",
+           le16toh(cmd.offset));
+       return iwn_cmd(sc, IWN_CMD_PHY_CALIB, &cmd, sizeof cmd, 0);
+}
+
 /*
  * This function is called after the runtime firmware notifies us of its
  * readiness (called in a process context.)
@@ -6028,7 +6057,8 @@ iwn5000_nic_config(struct iwn_softc *sc)
                /* Use internal power amplifier only. */
                IWN_WRITE(sc, IWN_GP_DRIVER, IWN_GP_DRIVER_RADIO_2X2_IPA);
        }
-       if (sc->hw_type == IWN_HW_REV_TYPE_6050 && sc->calib_ver >= 6) {
+       if ((sc->hw_type == IWN_HW_REV_TYPE_6050 ||
+            sc->hw_type == IWN_HW_REV_TYPE_6005) && sc->calib_ver >= 6) {
                /* Indicate that ROM calibration version is >=6. */
                IWN_SETBITS(sc, IWN_GP_DRIVER, IWN_GP_DRIVER_CALIB_VER6);
        }

Modified: head/sys/dev/iwn/if_iwnreg.h
==============================================================================
--- head/sys/dev/iwn/if_iwnreg.h        Fri Apr 15 20:32:17 2011        
(r220675)
+++ head/sys/dev/iwn/if_iwnreg.h        Fri Apr 15 20:35:15 2011        
(r220676)
@@ -885,6 +885,8 @@ struct iwn_phy_calib {
 #define IWN5000_PHY_CALIB_CRYSTAL              15
 #define IWN5000_PHY_CALIB_BASE_BAND            16
 #define IWN5000_PHY_CALIB_TX_IQ_PERIODIC       17
+#define IWN5000_PHY_CALIB_TEMP_OFFSET          18
+
 #define IWN5000_PHY_CALIB_RESET_NOISE_GAIN     18
 #define IWN5000_PHY_CALIB_NOISE_GAIN           19
 
@@ -903,6 +905,17 @@ struct iwn5000_phy_calib_crystal {
        uint8_t reserved[2];
 } __packed;
 
+struct iwn5000_phy_calib_temp_offset {
+       uint8_t         code;
+       uint8_t         group;
+       uint8_t         ngroups;
+       uint8_t         isvalid;
+       int16_t         offset;
+#define IWN_DEFAULT_TEMP_OFFSET        2700
+
+       uint16_t        reserved;
+} __packed;
+
 struct iwn_phy_calib_gain {
        uint8_t code;
        uint8_t group;
_______________________________________________
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