Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f0832f13 authored by Emmanuel Grumbach's avatar Emmanuel Grumbach Committed by John W. Linville
Browse files

iwlwifi: HW dependent run time calibration



This patch does several things:

1) rename CONFIG_IWL4965_SENSITIVITY to IWL4965_RUN_TIME_CALIB which is
   better semantic
2) move all the run time calibration to a new file: iwl-calib.c
3) simplify the sensitivity calibration flow and make it HW dependent
4) make the chain noise calibration flow HW dependent

Signed-off-by: default avatarEmmanuel Grumbach <emmanuel.grumbach@intel.com>
Signed-off-by: default avatarTomas Winkler <tomas.winkler@intel.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent a7ca0268
Loading
Loading
Loading
Loading
+15 −4
Original line number Diff line number Diff line
@@ -15,6 +15,15 @@ config IWLWIFI_LEDS
	bool
	default n

config IWLWIFI_RUN_TIME_CALIB
	bool
	depends on IWLCORE
	default n
	---help---
	  This option will enable run time calibration for the iwlwifi driver.
	  These calibrations are Sensitivity and Chain Noise.


config IWLWIFI_RFKILL
	boolean "IWLWIFI RF kill support"
	depends on IWLCORE
@@ -68,12 +77,14 @@ config IWL4965_SPECTRUM_MEASUREMENT
	---help---
	  This option will enable spectrum measurement for the iwl4965 driver.

config IWL4965_SENSITIVITY
	bool "Enable Sensitivity Calibration in iwl4965 driver"
config IWL4965_RUN_TIME_CALIB
	bool "Enable run time Calibration for 4965 NIC"
	select IWLWIFI_RUN_TIME_CALIB
	depends on IWL4965
	default y
	---help---
	  This option will enable sensitivity calibration for the iwl4965
	  driver.
	  This option will enable run time calibration for the iwl4965 driver.
	  These calibrations are Sensitivity and Chain Noise. If unsure, say yes

config IWLWIFI_DEBUG
	bool "Enable full debugging output in iwl4965 driver"
+1 −0
Original line number Diff line number Diff line
@@ -3,6 +3,7 @@ iwlcore-objs := iwl-core.o iwl-eeprom.o iwl-hcmd.o
iwlcore-$(CONFIG_IWLWIFI_DEBUGFS) += iwl-debugfs.o
iwlcore-$(CONFIG_IWLWIFI_LEDS) += iwl-led.o
iwlcore-$(CONFIG_IWLWIFI_RFKILL) += iwl-rfkill.o
iwlcore-$(CONFIG_IWLWIFI_RUN_TIME_CALIB) += iwl-calib.o

obj-$(CONFIG_IWL3945)	+= iwl3945.o
iwl3945-objs		:= iwl3945-base.o iwl-3945.o iwl-3945-rs.o
+4 −4
Original line number Diff line number Diff line
@@ -2559,7 +2559,7 @@ struct iwl4965_missed_beacon_notif {
 */

/*
 * Table entries in SENSITIVITY_CMD (struct iwl4965_sensitivity_cmd)
 * Table entries in SENSITIVITY_CMD (struct iwl_sensitivity_cmd)
 */
#define HD_TABLE_SIZE  (11)	/* number of entries */
#define HD_MIN_ENERGY_CCK_DET_INDEX                 (0)	/* table indexes */
@@ -2574,18 +2574,18 @@ struct iwl4965_missed_beacon_notif {
#define HD_AUTO_CORR40_X4_TH_ADD_MIN_INDEX          (9)
#define HD_OFDM_ENERGY_TH_IN_INDEX                  (10)

/* Control field in struct iwl4965_sensitivity_cmd */
/* Control field in struct iwl_sensitivity_cmd */
#define SENSITIVITY_CMD_CONTROL_DEFAULT_TABLE	__constant_cpu_to_le16(0)
#define SENSITIVITY_CMD_CONTROL_WORK_TABLE	__constant_cpu_to_le16(1)

/**
 * struct iwl4965_sensitivity_cmd
 * struct iwl_sensitivity_cmd
 * @control:  (1) updates working table, (0) updates default table
 * @table:  energy threshold values, use HD_* as index into table
 *
 * Always use "1" in "control" to update uCode's working table and DSP.
 */
struct iwl4965_sensitivity_cmd {
struct iwl_sensitivity_cmd {
	__le16 control;			/* always use "1" */
	__le16 table[HD_TABLE_SIZE];	/* use HD_* as index */
} __attribute__ ((packed));
+106 −764

File changed.

Preview size limit exceeded, changes collapsed.

+36 −32
Original line number Diff line number Diff line
@@ -566,6 +566,29 @@ struct iwl4965_ibss_seq {
	struct list_head list;
};

struct iwl_sensitivity_ranges {
	u16 min_nrg_cck;
	u16 max_nrg_cck;

	u16 nrg_th_cck;
	u16 nrg_th_ofdm;

	u16 auto_corr_min_ofdm;
	u16 auto_corr_min_ofdm_mrc;
	u16 auto_corr_min_ofdm_x1;
	u16 auto_corr_min_ofdm_mrc_x1;

	u16 auto_corr_max_ofdm;
	u16 auto_corr_max_ofdm_mrc;
	u16 auto_corr_max_ofdm_x1;
	u16 auto_corr_max_ofdm_mrc_x1;

	u16 auto_corr_max_cck;
	u16 auto_corr_max_cck_mrc;
	u16 auto_corr_min_cck;
	u16 auto_corr_min_cck_mrc;
};

/**
 * struct iwl_hw_params
 * @max_txq_num: Max # Tx queues supported
@@ -576,6 +599,7 @@ struct iwl4965_ibss_seq {
 * @max_rxq_log: Log-base-2 of max_rxq_size
 * @max_stations:
 * @bcast_sta_id:
 * @struct iwl_sensitivity_ranges: range of sensitivity values
 */
struct iwl_hw_params {
	u16 max_txq_num;
@@ -590,6 +614,9 @@ struct iwl_hw_params {
	u32 max_pkt_size;
	u8  max_stations;
	u8  bcast_sta_id;
#ifdef CONFIG_IWLWIFI_RUN_TIME_CALIB
	const struct iwl_sensitivity_ranges *sens;
#endif
};

#define HT_SHORT_GI_20MHZ_ONLY          (1 << 0)
@@ -732,9 +759,6 @@ extern void iwl4965_add_station(struct iwl_priv *priv, const u8 *addr,
extern void iwl4965_set_rxon_chain(struct iwl_priv *priv);
extern int iwl4965_alive_notify(struct iwl_priv *priv);
extern void iwl4965_update_rate_scaling(struct iwl_priv *priv, u8 mode);
extern void iwl4965_chain_noise_reset(struct iwl_priv *priv);
extern void iwl4965_init_sensitivity(struct iwl_priv *priv, u8 flags,
				     u8 force);
extern void iwl4965_rf_kill_ct_config(struct iwl_priv *priv);
extern void iwl4965_hwrate_to_tx_control(struct iwl_priv *priv,
					 u32 rate_n_flags,
@@ -818,23 +842,8 @@ struct iwl4965_lq_mngr {
#define MAX_FA_CCK   50
#define MIN_FA_CCK   5

#define NRG_MIN_CCK  97
#define NRG_MAX_CCK  0

#define AUTO_CORR_MIN_OFDM        85
#define AUTO_CORR_MIN_OFDM_MRC    170
#define AUTO_CORR_MIN_OFDM_X1     105
#define AUTO_CORR_MIN_OFDM_MRC_X1 220
#define AUTO_CORR_MAX_OFDM        120
#define AUTO_CORR_MAX_OFDM_MRC    210
#define AUTO_CORR_MAX_OFDM_X1     140
#define AUTO_CORR_MAX_OFDM_MRC_X1 270
#define AUTO_CORR_STEP_OFDM       1

#define AUTO_CORR_MIN_CCK      (125)
#define AUTO_CORR_MAX_CCK      (200)
#define AUTO_CORR_MIN_CCK_MRC  200
#define AUTO_CORR_MAX_CCK_MRC  400
#define AUTO_CORR_STEP_CCK     3
#define AUTO_CORR_MAX_TH_CCK   160

@@ -865,11 +874,6 @@ enum iwl4965_chain_noise_state {
	IWL_CHAIN_NOISE_CALIBRATED = 2,
};

enum iwl4965_sensitivity_state {
	IWL_SENS_CALIB_ALLOWED = 0,
	IWL_SENS_CALIB_NEED_REINIT = 1,
};

enum iwl4965_calib_enabled_state {
	IWL_CALIB_DISABLED = 0,  /* must be 0 */
	IWL_CALIB_ENABLED = 1,
@@ -884,8 +888,9 @@ struct statistics_general_data {
	u32 beacon_energy_c;
};

#ifdef CONFIG_IWLWIFI_RUN_TIME_CALIB
/* Sensitivity calib data */
struct iwl4965_sensitivity_data {
struct iwl_sensitivity_data {
	u32 auto_corr_ofdm;
	u32 auto_corr_ofdm_mrc;
	u32 auto_corr_ofdm_x1;
@@ -909,12 +914,10 @@ struct iwl4965_sensitivity_data {
	s32 nrg_auto_corr_silence_diff;
	u32 num_in_cck_no_fa;
	u32 nrg_th_ofdm;

	u8 state;
};

/* Chain noise (differential Rx gain) calib data */
struct iwl4965_chain_noise_data {
struct iwl_chain_noise_data {
	u8 state;
	u16 beacon_count;
	u32 chain_noise_a;
@@ -927,6 +930,7 @@ struct iwl4965_chain_noise_data {
	u8 delta_gain_code[NUM_RX_CHAINS];
	u8 radio_write;
};
#endif /* CONFIG_IWLWIFI_RUN_TIME_CALIB */

#define	EEPROM_SEM_TIMEOUT 10		/* milliseconds */
#define EEPROM_SEM_RETRY_LIMIT 1000	/* number of attempts (not time) */
@@ -1051,12 +1055,12 @@ struct iwl_priv {
	u8 assoc_station_added;
	u8 use_ant_b_for_management_frame;	/* Tx antenna selection */
	u8 valid_antenna;	/* Bit mask of antennas actually connected */
#ifdef CONFIG_IWL4965_SENSITIVITY
	struct iwl4965_sensitivity_data sensitivity_data;
	struct iwl4965_chain_noise_data chain_noise_data;
	u8 start_calib;
#ifdef CONFIG_IWLWIFI_RUN_TIME_CALIB
	struct iwl_sensitivity_data sensitivity_data;
	struct iwl_chain_noise_data chain_noise_data;
	__le16 sensitivity_tbl[HD_TABLE_SIZE];
#endif /*CONFIG_IWL4965_SENSITIVITY*/
#endif /*CONFIG_IWLWIFI_RUN_TIME_CALIB*/

#ifdef CONFIG_IWL4965_HT
	struct iwl_ht_info current_ht_config;
@@ -1206,7 +1210,7 @@ struct iwl_priv {
#endif /* CONFIG_IWLWIFI_DEBUG */

	struct work_struct txpower_work;
#ifdef CONFIG_IWL4965_SENSITIVITY
#ifdef CONFIG_IWL4965_RUN_TIME_CALIB
	struct work_struct sensitivity_work;
#endif
	struct timer_list statistics_periodic;
Loading