On Sun, Feb 09, 2014 at 10:40:57AM -0500, Brad Smith wrote:
> On Sun, Feb 09, 2014 at 02:23:18PM +0100, Fabian Raetz wrote:
> > >
> > > Hmm, my cleanup was based on the version you send out on December
> > > 31st. Can you send me the latest version of your diff?
> > >
> >
> > On Tue, Jan 07, 2014 at 12:08:02PM +0100, Martin Pieuchot wrote:
> > > On 03/01/14(Fri) 14:24, Fabian Raetz wrote:
> > > > Hi tech@,
> > > >
> > > > here is an updated patch.
> > > >
> > > > it seems like Intel Centrino Wireless-N 2030 and
> > > > Intel Centrino Wireless-N 2230 have the same pciids...
> > > >
> > > > this makes patch apply again with newest pcidevs changes.
> > >
> > > Please also make sure to use tab and not space when appropriate ;) You
> > > can check style(9) if in doubt !
> > >
> > ups :)
> > attached is a diff
> > - which follows style(9) (hopefully) and
> > - fixes a firmware error by handling IWN_FW_TLV_ENH_SENS and
> > IWN_FW_TLV_PHY_CALIB in iwn_read_firmware_tlv().
> >
> > @mike, only style changes since the last patch i send you.
> >
> > Regards,
> > Fabian
>
> Post the diff again but remove the pcidevs change.
>
Index: if_iwn.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/if_iwn.c,v
retrieving revision 1.127
diff -u -p -r1.127 if_iwn.c
--- if_iwn.c 6 Dec 2013 21:03:04 -0000 1.127
+++ if_iwn.c 9 Feb 2014 16:41:10 -0000
@@ -94,6 +94,8 @@ static const struct pci_matchid iwn_devi
{ PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_WL_130_2 },
{ PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_WL_6235_1 },
{ PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_WL_6235_2 },
+ { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_WL_2030_1 },
+ { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_WL_2030_2 },
};
int iwn_match(struct device *, void *, void *);
@@ -244,6 +246,7 @@ int iwn5000_send_calibration(struct iwn
int iwn5000_send_wimax_coex(struct iwn_softc *);
int iwn5000_crystal_calib(struct iwn_softc *);
int iwn5000_temp_offset_calib(struct iwn_softc *);
+int iwn5000_temp_offset_calibv2(struct iwn_softc *);
int iwn4965_post_alive(struct iwn_softc *);
int iwn5000_post_alive(struct iwn_softc *);
int iwn4965_load_bootcode(struct iwn_softc *, const uint8_t *,
@@ -605,6 +608,8 @@ iwn5000_attach(struct iwn_softc *sc, pci
sc->fw_data_maxsz = IWN5000_FW_DATA_MAXSZ;
sc->fwsz = IWN5000_FWSZ;
sc->sched_txfact_addr = IWN5000_SCHED_TXFACT;
+ sc->reset_noise_gain = IWN5000_PHY_CALIB_RESET_NOISE_GAIN;
+ sc->noise_gain = IWN5000_PHY_CALIB_NOISE_GAIN;
switch (sc->hw_type) {
case IWN_HW_REV_TYPE_5100:
@@ -651,6 +656,11 @@ iwn5000_attach(struct iwn_softc *sc, pci
} else
sc->fwname = "iwn-6005";
break;
+ case IWN_HW_REV_TYPE_2030:
+ sc->limits = &iwn2030_sensitivity_limits;
+ sc->fwname = "iwn-2030";
+ sc->sc_flags |= IWN_FLAG_ADV_BT_COEX;
+ break;
default:
printf(": adapter type %d not supported\n", sc->hw_type);
return ENOTSUP;
@@ -1529,6 +1539,14 @@ iwn5000_read_eeprom(struct iwn_softc *sc
hdr.version, hdr.pa_type, letoh16(hdr.volt)));
sc->calib_ver = hdr.version;
+ if (sc->hw_type == IWN_HW_REV_TYPE_2030) {
+ sc->eeprom_voltage = letoh16(hdr.volt);
+ iwn_read_prom_data(sc, base + IWN5000_EEPROM_TEMP, &val, 2);
+ sc->eeprom_temp_high = letoh16(val);
+ iwn_read_prom_data(sc, base + IWN5000_EEPROM_VOLT, &val, 2);
+ sc->eeprom_temp = letoh16(val);
+ }
+
if (sc->hw_type == IWN_HW_REV_TYPE_5150) {
/* Compute temperature offset. */
iwn_read_prom_data(sc, base + IWN5000_EEPROM_TEMP, &val, 2);
@@ -2095,7 +2113,8 @@ iwn5000_rx_calib_results(struct iwn_soft
switch (calib->code) {
case IWN5000_PHY_CALIB_DC:
- if (sc->hw_type == IWN_HW_REV_TYPE_5150)
+ if (sc->hw_type == IWN_HW_REV_TYPE_5150 ||
+ sc->hw_type == IWN_HW_REV_TYPE_2030)
idx = 0;
break;
case IWN5000_PHY_CALIB_LO:
@@ -3822,7 +3841,7 @@ iwn5000_init_gains(struct iwn_softc *sc)
struct iwn_phy_calib cmd;
memset(&cmd, 0, sizeof cmd);
- cmd.code = IWN5000_PHY_CALIB_RESET_NOISE_GAIN;
+ cmd.code = sc->reset_noise_gain;
cmd.ngroups = 1;
cmd.isvalid = 1;
DPRINTF(("setting initial differential gains\n"));
@@ -3872,7 +3891,7 @@ iwn5000_set_gains(struct iwn_softc *sc)
div = (sc->hw_type == IWN_HW_REV_TYPE_6050) ? 20 : 30;
memset(&cmd, 0, sizeof cmd);
- cmd.code = IWN5000_PHY_CALIB_NOISE_GAIN;
+ cmd.code = sc->noise_gain;
cmd.ngroups = 1;
cmd.isvalid = 1;
/* Get first available RX antenna as referential. */
@@ -4161,28 +4180,51 @@ iwn_send_advanced_btcoex(struct iwn_soft
0xc0004000, 0x00004000, 0xf0005000, 0xf0005000,
};
struct iwn6000_btcoex_config btconfig;
+ struct iwn2000_btcoex_config btconfig2k;
struct iwn_btcoex_priotable btprio;
struct iwn_btcoex_prot btprot;
int error, i;
memset(&btconfig, 0, sizeof btconfig);
- btconfig.flags = IWN_BT_FLAG_COEX6000_CHAN_INHIBITION |
- (IWN_BT_FLAG_COEX6000_MODE_3W << IWN_BT_FLAG_COEX6000_MODE_SHIFT) |
- IWN_BT_FLAG_SYNC_2_BT_DISABLE;
- btconfig.max_kill = 5;
- btconfig.bt3_t7_timer = 1;
- btconfig.kill_ack = htole32(0xffff0000);
- btconfig.kill_cts = htole32(0xffff0000);
- btconfig.sample_time = 2;
- btconfig.bt3_t2_timer = 0xc;
- for (i = 0; i < 12; i++)
- btconfig.lookup_table[i] = htole32(btcoex_3wire[i]);
- btconfig.valid = htole16(0xff);
- btconfig.prio_boost = 0xf0;
- DPRINTF(("configuring advanced bluetooth coexistence\n"));
- error = iwn_cmd(sc, IWN_CMD_BT_COEX, &btconfig, sizeof(btconfig), 1);
- if (error != 0)
- return (error);
+ memset(&btconfig2k, 0, sizeof btconfig2k);
+
+ if (sc->hw_type == IWN_HW_REV_TYPE_2030) {
+ btconfig2k.flags = IWN_BT_FLAG_COEX6000_CHAN_INHIBITION |
+ (IWN_BT_FLAG_COEX6000_MODE_3W <<
IWN_BT_FLAG_COEX6000_MODE_SHIFT) |
+ IWN_BT_FLAG_SYNC_2_BT_DISABLE;
+ btconfig2k.max_kill = 5;
+ btconfig2k.bt3_t7_timer = 1;
+ btconfig2k.kill_ack = htole32(0xffff0000);
+ btconfig2k.kill_cts = htole32(0xffff0000);
+ btconfig2k.sample_time = 2;
+ btconfig2k.bt3_t2_timer = 0xc;
+ for (i = 0; i < 12; i++)
+ btconfig2k.lookup_table[i] = htole32(btcoex_3wire[i]);
+ btconfig2k.valid = htole16(0xff);
+ btconfig2k.prio_boost = htole32(0xf0);
+ DPRINTF(("configuring advanced bluetooth coexistence\n"));
+ error = iwn_cmd(sc, IWN_CMD_BT_COEX, &btconfig2k,
sizeof(btconfig2k), 1);
+ if (error != 0)
+ return (error);
+ } else {
+ btconfig.flags = IWN_BT_FLAG_COEX6000_CHAN_INHIBITION |
+ (IWN_BT_FLAG_COEX6000_MODE_3W <<
IWN_BT_FLAG_COEX6000_MODE_SHIFT) |
+ IWN_BT_FLAG_SYNC_2_BT_DISABLE;
+ btconfig.max_kill = 5;
+ btconfig.bt3_t7_timer = 1;
+ btconfig.kill_ack = htole32(0xffff0000);
+ btconfig.kill_cts = htole32(0xffff0000);
+ btconfig.sample_time = 2;
+ btconfig.bt3_t2_timer = 0xc;
+ for (i = 0; i < 12; i++)
+ btconfig.lookup_table[i] = htole32(btcoex_3wire[i]);
+ btconfig.valid = htole16(0xff);
+ btconfig.prio_boost = 0xf0;
+ DPRINTF(("configuring advanced bluetooth coexistence\n"));
+ error = iwn_cmd(sc, IWN_CMD_BT_COEX, &btconfig,
sizeof(btconfig), 1);
+ if (error != 0)
+ return (error);
+ }
memset(&btprio, 0, sizeof btprio);
btprio.calib_init1 = 0x6;
@@ -4233,14 +4275,21 @@ iwn_config(struct iwn_softc *sc)
uint16_t rxchain;
int error;
+ /* Set radio temperature sensor offset. */
if (sc->hw_type == IWN_HW_REV_TYPE_6005) {
- /* Set radio temperature sensor offset. */
error = iwn5000_temp_offset_calib(sc);
if (error != 0) {
printf("%s: could not set temperature offset\n",
sc->sc_dev.dv_xname);
return error;
}
+ } else if (sc->hw_type == IWN_HW_REV_TYPE_2030) {
+ error = iwn5000_temp_offset_calibv2(sc);
+ if (error != 0) {
+ printf("%s: could not set temperature offset v2\n",
+ sc->sc_dev.dv_xname);
+ return error;
+ }
}
if (sc->hw_type == IWN_HW_REV_TYPE_6050 ||
@@ -5005,6 +5054,33 @@ iwn5000_temp_offset_calib(struct iwn_sof
return iwn_cmd(sc, IWN_CMD_PHY_CALIB, &cmd, sizeof cmd, 0);
}
+int
+iwn5000_temp_offset_calibv2(struct iwn_softc *sc)
+{
+ struct iwn5000_phy_calib_temp_offsetv2 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_low = htole16(sc->eeprom_temp);
+ cmd.offset_high = htole16(sc->eeprom_temp_high);
+ }
+ else {
+ cmd.offset_low = htole16(IWN_DEFAULT_TEMP_OFFSET);
+ cmd.offset_high = htole16(IWN_DEFAULT_TEMP_OFFSET);
+ }
+ cmd.burnt_voltage_ref = htole16(sc->eeprom_voltage);
+
+ DPRINTF(("setting radio sensor low offset to %d, high offset to %d,
voltage to %d\n",
+ letoh16(cmd.offset_low),
+ letoh16(cmd.offset_high),
+ letoh16(cmd.burnt_voltage_ref)));
+
+ 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).
@@ -5394,7 +5470,7 @@ iwn_read_firmware_tlv(struct iwn_softc *
const struct iwn_fw_tlv *tlv;
const uint8_t *ptr, *end;
uint64_t altmask;
- uint32_t len;
+ uint32_t len, tmp;
if (fw->size < sizeof (*hdr)) {
printf("%s: firmware too short: %zu bytes\n",
@@ -5458,6 +5534,17 @@ iwn_read_firmware_tlv(struct iwn_softc *
fw->boot.text = ptr;
fw->boot.textsz = len;
break;
+ case IWN_FW_TLV_ENH_SENS:
+ if (!len)
+ sc->sc_flags |= IWN_FLAG_ENH_SENS;
+ break;
+ case IWN_FW_TLV_PHY_CALIB:
+ tmp = letoh32(*ptr);
+ if (tmp < 253) {
+ sc->reset_noise_gain = tmp;
+ sc->noise_gain = tmp + 1;
+ }
+ break;
default:
DPRINTF(("TLV type %d not handled\n",
letoh16(tlv->type)));
@@ -5681,6 +5768,9 @@ iwn5000_nic_config(struct iwn_softc *sc)
}
if (sc->hw_type == IWN_HW_REV_TYPE_6005)
IWN_SETBITS(sc, IWN_GP_DRIVER, IWN_GP_DRIVER_6050_1X2);
+
+ if (sc->hw_type == IWN_HW_REV_TYPE_2030)
+ IWN_SETBITS(sc, IWN_GP_DRIVER,
IWN_GP_DRIVER_REG_BIT_RADIO_IQ_INVERT);
return 0;
}
Index: if_iwnreg.h
===================================================================
RCS file: /cvs/src/sys/dev/pci/if_iwnreg.h,v
retrieving revision 1.45
diff -u -p -r1.45 if_iwnreg.h
--- if_iwnreg.h 26 Nov 2013 20:33:17 -0000 1.45
+++ if_iwnreg.h 9 Feb 2014 16:41:10 -0000
@@ -205,6 +205,7 @@
#define IWN_HW_REV_TYPE_6000 7
#define IWN_HW_REV_TYPE_6050 8
#define IWN_HW_REV_TYPE_6005 11
+#define IWN_HW_REV_TYPE_2030 12
/* Possible flags for register IWN_GIO_CHICKEN. */
#define IWN_GIO_CHICKEN_L1A_NO_L0S_RX (1 << 23)
@@ -219,6 +220,7 @@
#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)
+#define IWN_GP_DRIVER_REG_BIT_RADIO_IQ_INVERT (0x00000080)
/* Possible flags for register IWN_UCODE_GP1_CLR. */
#define IWN_UCODE_GP1_RFKILL (1 << 1)
@@ -878,6 +880,28 @@ struct iwn6000_btcoex_config {
uint16_t rx_prio_boost;
} __packed;
+/* Structure for enhanced command IWN_CMD_BLUETOOTH for 2000 Series. */
+struct iwn2000_btcoex_config {
+ uint8_t flags; /* Cf Flags in iwn6000_btcoex_config */
+ uint8_t lead_time;
+ uint8_t max_kill;
+ uint8_t bt3_t7_timer;
+ uint32_t kill_ack;
+ uint32_t kill_cts;
+ uint8_t sample_time;
+ uint8_t bt3_t2_timer;
+ uint16_t bt4_reaction;
+ uint32_t lookup_table[12];
+ uint16_t bt4_decision;
+ uint16_t valid;
+
+ uint32_t prio_boost; /* size change prior to
iwn6000_btcoex_config */
+ uint8_t reserved; /* added prior to iwn6000_btcoex_config */
+
+ uint8_t tx_prio_boost;
+ uint16_t rx_prio_boost;
+} __packed;
+
/* Structure for command IWN_CMD_BT_COEX_PRIOTABLE */
struct iwn_btcoex_priotable {
uint8_t calib_init1;
@@ -998,6 +1022,17 @@ struct iwn5000_phy_calib_temp_offset {
uint16_t reserved;
} __packed;
+struct iwn5000_phy_calib_temp_offsetv2 {
+ uint8_t code;
+ uint8_t group;
+ uint8_t ngroups;
+ uint8_t isvalid;
+ int16_t offset_high;
+ int16_t offset_low;
+ int16_t burnt_voltage_ref;
+ int16_t reserved;
+} __packed;
+
struct iwn_phy_calib_gain {
uint8_t code;
uint8_t group;
@@ -1366,6 +1401,8 @@ struct iwn_fw_tlv {
#define IWN_FW_TLV_INIT_DATA 4
#define IWN_FW_TLV_BOOT_TEXT 5
#define IWN_FW_TLV_PBREQ_MAXLEN 6
+#define IWN_FW_TLV_ENH_SENS 14
+#define IWN_FW_TLV_PHY_CALIB 15
uint16_t alt;
uint32_t len;
@@ -1717,6 +1754,19 @@ static const struct iwn_sensitivity_limi
97,
97,
100
+};
+
+/* Get value from linux kernel 3.2.+ in
Drivers/net/wireless/iwlwifi/iwl-2000.c */
+static const struct iwn_sensitivity_limits iwn2030_sensitivity_limits = {
+ 105, 110,
+ 128, 232,
+ 80, 145,
+ 128, 232,
+ 125, 175,
+ 160, 310,
+ 97,
+ 97,
+ 110
};
/* Map TID to TX scheduler's FIFO. */
Index: if_iwnvar.h
===================================================================
RCS file: /cvs/src/sys/dev/pci/if_iwnvar.h,v
retrieving revision 1.26
diff -u -p -r1.26 if_iwnvar.h
--- if_iwnvar.h 30 Nov 2013 19:41:21 -0000 1.26
+++ if_iwnvar.h 9 Feb 2014 16:41:10 -0000
@@ -218,6 +218,8 @@ struct iwn_softc {
uint32_t fw_data_maxsz;
uint32_t fwsz;
bus_size_t sched_txfact_addr;
+ uint32_t reset_noise_gain;
+ uint32_t noise_gain;
/* TX scheduler rings. */
struct iwn_dma_info sched_dma;
@@ -274,6 +276,7 @@ struct iwn_softc {
char eeprom_domain[4];
uint32_t eeprom_crystal;
int16_t eeprom_temp;
+ int16_t eeprom_temp_high;
int16_t eeprom_voltage;
int8_t maxpwr2GHz;
int8_t maxpwr5GHz;