svn commit: r223250 - stable/8/sys/dev/iwn
Bernhard Schmidt
bschmidt at FreeBSD.org
Sat Jun 18 12:07:07 UTC 2011
Author: bschmidt
Date: Sat Jun 18 12:07:06 2011
New Revision: 223250
URL: http://svn.freebsd.org/changeset/base/223250
Log:
MFC r220729:
Add some new features:
- 6000 series devices need enhanced sensitivity calibration.
- 6000 series devices need a different setting for the shadow reg.
- set the IWN_FLAG_HAS_11N bit if the EEPROM says the device has 11n
support.
Obtained from: OpenBSD
Modified:
stable/8/sys/dev/iwn/if_iwn.c
stable/8/sys/dev/iwn/if_iwnreg.h
stable/8/sys/dev/iwn/if_iwnvar.h
Directory Properties:
stable/8/sys/ (props changed)
stable/8/sys/amd64/include/xen/ (props changed)
stable/8/sys/cddl/contrib/opensolaris/ (props changed)
stable/8/sys/contrib/dev/acpica/ (props changed)
stable/8/sys/contrib/pf/ (props changed)
Modified: stable/8/sys/dev/iwn/if_iwn.c
==============================================================================
--- stable/8/sys/dev/iwn/if_iwn.c Sat Jun 18 12:03:30 2011 (r223249)
+++ stable/8/sys/dev/iwn/if_iwn.c Sat Jun 18 12:07:06 2011 (r223250)
@@ -1653,6 +1653,12 @@ iwn_read_eeprom(struct iwn_softc *sc, ui
}
}
+ iwn_read_prom_data(sc, IWN_EEPROM_SKU_CAP, &val, 2);
+ DPRINTF(sc, IWN_DEBUG_RESET, "SKU capabilities=0x%04x\n", le16toh(val));
+ /* Check if HT support is bonded out. */
+ if (val & htole16(IWN_EEPROM_SKU_CAP_11N))
+ sc->sc_flags |= IWN_FLAG_HAS_11N;
+
iwn_read_prom_data(sc, IWN_EEPROM_RFCFG, &val, 2);
sc->rfcfg = le16toh(val);
DPRINTF(sc, IWN_DEBUG_RESET, "radio config=0x%04x\n", sc->rfcfg);
@@ -4595,9 +4601,11 @@ static int
iwn_send_sensitivity(struct iwn_softc *sc)
{
struct iwn_calib_state *calib = &sc->calib;
- struct iwn_sensitivity_cmd cmd;
+ struct iwn_enhanced_sensitivity_cmd cmd;
+ int len;
memset(&cmd, 0, sizeof cmd);
+ len = sizeof (struct iwn_sensitivity_cmd);
cmd.which = IWN_SENSITIVITY_WORKTBL;
/* OFDM modulation. */
cmd.corr_ofdm_x1 = htole16(calib->ofdm_x1);
@@ -4619,7 +4627,21 @@ iwn_send_sensitivity(struct iwn_softc *s
calib->ofdm_x1, calib->ofdm_mrc_x1, calib->ofdm_x4,
calib->ofdm_mrc_x4, calib->cck_x4,
calib->cck_mrc_x4, calib->energy_cck);
- return iwn_cmd(sc, IWN_CMD_SET_SENSITIVITY, &cmd, sizeof cmd, 1);
+
+ if (!(sc->sc_flags & IWN_FLAG_ENH_SENS))
+ goto send;
+ /* Enhanced sensitivity settings. */
+ len = sizeof (struct iwn_enhanced_sensitivity_cmd);
+ cmd.ofdm_det_slope_mrc = htole16(668);
+ cmd.ofdm_det_icept_mrc = htole16(4);
+ cmd.ofdm_det_slope = htole16(486);
+ cmd.ofdm_det_icept = htole16(37);
+ cmd.cck_det_slope_mrc = htole16(853);
+ cmd.cck_det_icept_mrc = htole16(4);
+ cmd.cck_det_slope = htole16(476);
+ cmd.cck_det_icept = htole16(99);
+send:
+ return iwn_cmd(sc, IWN_CMD_SET_SENSITIVITY, &cmd, len, 1);
}
/*
@@ -6175,6 +6197,8 @@ iwn5000_nic_config(struct iwn_softc *sc)
/* Indicate that ROM calibration version is >=6. */
IWN_SETBITS(sc, IWN_GP_DRIVER, IWN_GP_DRIVER_CALIB_VER6);
}
+ if (sc->hw_type == IWN_HW_REV_TYPE_6005)
+ IWN_SETBITS(sc, IWN_GP_DRIVER, IWN_GP_DRIVER_6050_1X2);
return 0;
}
@@ -6304,6 +6328,10 @@ iwn_hw_init(struct iwn_softc *sc)
IWN_WRITE(sc, IWN_UCODE_GP1_CLR, IWN_UCODE_GP1_RFKILL);
IWN_WRITE(sc, IWN_UCODE_GP1_CLR, IWN_UCODE_GP1_RFKILL);
+ /* Enable shadow registers. */
+ if (sc->hw_type >= IWN_HW_REV_TYPE_6000)
+ IWN_SETBITS(sc, IWN_SHADOW_REG_CTRL, 0x800fffff);
+
if ((error = ops->load_firmware(sc)) != 0) {
device_printf(sc->sc_dev,
"%s: could not load firmware, error %d\n", __func__,
Modified: stable/8/sys/dev/iwn/if_iwnreg.h
==============================================================================
--- stable/8/sys/dev/iwn/if_iwnreg.h Sat Jun 18 12:03:30 2011 (r223249)
+++ stable/8/sys/dev/iwn/if_iwnreg.h Sat Jun 18 12:07:06 2011 (r223250)
@@ -70,6 +70,7 @@
#define IWN_UCODE_GP1_CLR 0x05c
#define IWN_LED 0x094
#define IWN_DRAM_INT_TBL 0x0a0
+#define IWN_SHADOW_REG_CTRL 0x0a8
#define IWN_GIO_CHICKEN 0x100
#define IWN_ANA_PLL 0x20c
#define IWN_HW_REV_WA 0x22c
@@ -215,6 +216,7 @@
#define IWN_GP_DRIVER_RADIO_2X2_HYB (1 << 0)
#define IWN_GP_DRIVER_RADIO_2X2_IPA (2 << 0)
#define IWN_GP_DRIVER_CALIB_VER6 (1 << 2)
+#define IWN_GP_DRIVER_6050_1X2 (1 << 3)
/* Possible flags for register IWN_UCODE_GP1_CLR. */
#define IWN_UCODE_GP1_RFKILL (1 << 1)
@@ -856,7 +858,7 @@ struct iwn_critical_temp {
#define IWN_CTOMUK(c) (((c) * 1000000) + 273150000)
} __packed;
-/* Structure for command IWN_CMD_SET_SENSITIVITY. */
+/* Structures for command IWN_CMD_SET_SENSITIVITY. */
struct iwn_sensitivity_cmd {
uint16_t which;
#define IWN_SENSITIVITY_DEFAULTTBL 0
@@ -875,6 +877,34 @@ struct iwn_sensitivity_cmd {
uint16_t energy_ofdm_th;
} __packed;
+struct iwn_enhanced_sensitivity_cmd {
+ uint16_t which;
+ uint16_t energy_cck;
+ uint16_t energy_ofdm;
+ uint16_t corr_ofdm_x1;
+ uint16_t corr_ofdm_mrc_x1;
+ uint16_t corr_cck_mrc_x4;
+ uint16_t corr_ofdm_x4;
+ uint16_t corr_ofdm_mrc_x4;
+ uint16_t corr_barker;
+ uint16_t corr_barker_mrc;
+ uint16_t corr_cck_x4;
+ uint16_t energy_ofdm_th;
+ /* "Enhanced" part. */
+ uint16_t ina_det_ofdm;
+ uint16_t ina_det_cck;
+ uint16_t corr_11_9_en;
+ uint16_t ofdm_det_slope_mrc;
+ uint16_t ofdm_det_icept_mrc;
+ uint16_t ofdm_det_slope;
+ uint16_t ofdm_det_icept;
+ uint16_t cck_det_slope_mrc;
+ uint16_t cck_det_icept_mrc;
+ uint16_t cck_det_slope;
+ uint16_t cck_det_icept;
+ uint16_t reserved;
+} __packed;
+
/* Structures for command IWN_CMD_PHY_CALIB. */
struct iwn_phy_calib {
uint8_t code;
@@ -1309,6 +1339,7 @@ struct iwn_fw_tlv {
* Offsets into EEPROM.
*/
#define IWN_EEPROM_MAC 0x015
+#define IWN_EEPROM_SKU_CAP 0x045
#define IWN_EEPROM_RFCFG 0x048
#define IWN4965_EEPROM_DOMAIN 0x060
#define IWN4965_EEPROM_BAND1 0x063
@@ -1337,6 +1368,11 @@ struct iwn_fw_tlv {
#define IWN5000_EEPROM_TEMP 0x12a
#define IWN5000_EEPROM_VOLT 0x12b
+/* Possible flags for IWN_EEPROM_SKU_CAP. */
+#define IWN_EEPROM_SKU_CAP_11N (1 << 6)
+#define IWN_EEPROM_SKU_CAP_AMT (1 << 7)
+#define IWN_EEPROM_SKU_CAP_IPAN (1 << 8)
+
/* Possible flags for IWN_EEPROM_RFCFG. */
#define IWN_RFCFG_TYPE(x) (((x) >> 0) & 0x3)
#define IWN_RFCFG_STEP(x) (((x) >> 2) & 0x3)
Modified: stable/8/sys/dev/iwn/if_iwnvar.h
==============================================================================
--- stable/8/sys/dev/iwn/if_iwnvar.h Sat Jun 18 12:03:30 2011 (r223249)
+++ stable/8/sys/dev/iwn/if_iwnvar.h Sat Jun 18 12:07:06 2011 (r223250)
@@ -204,6 +204,8 @@ struct iwn_softc {
#define IWN_FLAG_CALIB_DONE (1 << 2)
#define IWN_FLAG_USE_ICT (1 << 3)
#define IWN_FLAG_INTERNAL_PA (1 << 4)
+#define IWN_FLAG_HAS_11N (1 << 6)
+#define IWN_FLAG_ENH_SENS (1 << 7)
uint8_t hw_type;
More information about the svn-src-all
mailing list