diff options
Diffstat (limited to 'drivers/net/wireless/iwlwifi/iwl-6000.c')
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-6000.c | 108 | 
1 files changed, 77 insertions, 31 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-6000.c b/drivers/net/wireless/iwlwifi/iwl-6000.c index dd03384432f..7acef703253 100644 --- a/drivers/net/wireless/iwlwifi/iwl-6000.c +++ b/drivers/net/wireless/iwlwifi/iwl-6000.c @@ -47,17 +47,19 @@  #include "iwl-agn-hw.h"  #include "iwl-6000-hw.h"  #include "iwl-agn-led.h" +#include "iwl-agn-debugfs.h"  /* Highest firmware API version supported */  #define IWL6000_UCODE_API_MAX 4  #define IWL6050_UCODE_API_MAX 4 +#define IWL6000G2_UCODE_API_MAX 4  /* Lowest firmware API version supported */  #define IWL6000_UCODE_API_MIN 4  #define IWL6050_UCODE_API_MIN 4 +#define IWL6000G2_UCODE_API_MIN 4  #define IWL6000_FW_PRE "iwlwifi-6000-" -#define IWL6000_G2_FW_PRE "iwlwifi-6005-"  #define _IWL6000_MODULE_FIRMWARE(api) IWL6000_FW_PRE #api ".ucode"  #define IWL6000_MODULE_FIRMWARE(api) _IWL6000_MODULE_FIRMWARE(api) @@ -65,6 +67,10 @@  #define _IWL6050_MODULE_FIRMWARE(api) IWL6050_FW_PRE #api ".ucode"  #define IWL6050_MODULE_FIRMWARE(api) _IWL6050_MODULE_FIRMWARE(api) +#define IWL6000G2_FW_PRE "iwlwifi-6005-" +#define _IWL6000G2_MODULE_FIRMWARE(api) IWL6000G2_FW_PRE #api ".ucode" +#define IWL6000G2_MODULE_FIRMWARE(api) _IWL6000G2_MODULE_FIRMWARE(api) +  static void iwl6000_set_ct_threshold(struct iwl_priv *priv)  {  	/* want Celsius */ @@ -170,24 +176,56 @@ static int iwl6000_hw_set_hw_params(struct iwl_priv *priv)  	/* Set initial sensitivity parameters */  	/* Set initial calibration set */  	priv->hw_params.sens = &iwl6000_sensitivity; -	switch (priv->hw_rev & CSR_HW_REV_TYPE_MSK) { -	case CSR_HW_REV_TYPE_6x50: -		priv->hw_params.calib_init_cfg = -			BIT(IWL_CALIB_XTAL)		| -			BIT(IWL_CALIB_DC)		| -			BIT(IWL_CALIB_LO)		| -			BIT(IWL_CALIB_TX_IQ) 		| -			BIT(IWL_CALIB_BASE_BAND); +	priv->hw_params.calib_init_cfg = +		BIT(IWL_CALIB_XTAL)		| +		BIT(IWL_CALIB_LO)		| +		BIT(IWL_CALIB_TX_IQ)		| +		BIT(IWL_CALIB_BASE_BAND); -		break; -	default: -		priv->hw_params.calib_init_cfg = -			BIT(IWL_CALIB_XTAL)		| -			BIT(IWL_CALIB_LO)		| -			BIT(IWL_CALIB_TX_IQ) 		| -			BIT(IWL_CALIB_BASE_BAND); -		break; -	} +	return 0; +} + +static int iwl6050_hw_set_hw_params(struct iwl_priv *priv) +{ +	if (priv->cfg->mod_params->num_of_queues >= IWL_MIN_NUM_QUEUES && +	    priv->cfg->mod_params->num_of_queues <= IWLAGN_NUM_QUEUES) +		priv->cfg->num_of_queues = +			priv->cfg->mod_params->num_of_queues; + +	priv->hw_params.max_txq_num = priv->cfg->num_of_queues; +	priv->hw_params.dma_chnl_num = FH50_TCSR_CHNL_NUM; +	priv->hw_params.scd_bc_tbls_size = +			priv->cfg->num_of_queues * +			sizeof(struct iwlagn_scd_bc_tbl); +	priv->hw_params.tfd_size = sizeof(struct iwl_tfd); +	priv->hw_params.max_stations = IWL5000_STATION_COUNT; +	priv->hw_params.bcast_sta_id = IWL5000_BROADCAST_ID; + +	priv->hw_params.max_data_size = IWL60_RTC_DATA_SIZE; +	priv->hw_params.max_inst_size = IWL60_RTC_INST_SIZE; + +	priv->hw_params.max_bsm_size = 0; +	priv->hw_params.ht40_channel =  BIT(IEEE80211_BAND_2GHZ) | +					BIT(IEEE80211_BAND_5GHZ); +	priv->hw_params.rx_wrt_ptr_reg = FH_RSCSR_CHNL0_WPTR; + +	priv->hw_params.tx_chains_num = num_of_ant(priv->cfg->valid_tx_ant); +	priv->hw_params.rx_chains_num = num_of_ant(priv->cfg->valid_rx_ant); +	priv->hw_params.valid_tx_ant = priv->cfg->valid_tx_ant; +	priv->hw_params.valid_rx_ant = priv->cfg->valid_rx_ant; + +	if (priv->cfg->ops->lib->temp_ops.set_ct_kill) +		priv->cfg->ops->lib->temp_ops.set_ct_kill(priv); + +	/* Set initial sensitivity parameters */ +	/* Set initial calibration set */ +	priv->hw_params.sens = &iwl6000_sensitivity; +	priv->hw_params.calib_init_cfg = +		BIT(IWL_CALIB_XTAL)		| +		BIT(IWL_CALIB_DC)		| +		BIT(IWL_CALIB_LO)		| +		BIT(IWL_CALIB_TX_IQ)		| +		BIT(IWL_CALIB_BASE_BAND);  	return 0;  } @@ -261,7 +299,7 @@ static struct iwl_lib_ops iwl6000_lib = {  			EEPROM_REG_BAND_3_CHANNELS,  			EEPROM_REG_BAND_4_CHANNELS,  			EEPROM_REG_BAND_5_CHANNELS, -			EEPROM_REG_BAND_24_HT40_CHANNELS, +			EEPROM_6000_REG_BAND_24_HT40_CHANNELS,  			EEPROM_REG_BAND_52_HT40_CHANNELS  		},  		.verify_signature  = iwlcore_eeprom_verify_signature, @@ -279,6 +317,11 @@ static struct iwl_lib_ops iwl6000_lib = {  		.set_ct_kill = iwl6000_set_ct_threshold,  	 },  	.add_bcast_station = iwl_add_bcast_station, +	.debugfs_ops = { +		.rx_stats_read = iwl_ucode_rx_stats_read, +		.tx_stats_read = iwl_ucode_tx_stats_read, +		.general_stats_read = iwl_ucode_general_stats_read, +	},  	.recover_from_tx_stall = iwl_bg_monitor_recover,  	.check_plcp_health = iwl_good_plcp_health,  	.check_ack_health = iwl_good_ack_health, @@ -293,7 +336,7 @@ static const struct iwl_ops iwl6000_ops = {  };  static struct iwl_lib_ops iwl6050_lib = { -	.set_hw_params = iwl6000_hw_set_hw_params, +	.set_hw_params = iwl6050_hw_set_hw_params,  	.txq_update_byte_cnt_tbl = iwlagn_txq_update_byte_cnt_tbl,  	.txq_inval_byte_cnt_tbl = iwlagn_txq_inval_byte_cnt_tbl,  	.txq_set_sched = iwlagn_txq_set_sched, @@ -328,7 +371,7 @@ static struct iwl_lib_ops iwl6050_lib = {  			EEPROM_REG_BAND_3_CHANNELS,  			EEPROM_REG_BAND_4_CHANNELS,  			EEPROM_REG_BAND_5_CHANNELS, -			EEPROM_REG_BAND_24_HT40_CHANNELS, +			EEPROM_6000_REG_BAND_24_HT40_CHANNELS,  			EEPROM_REG_BAND_52_HT40_CHANNELS  		},  		.verify_signature  = iwlcore_eeprom_verify_signature, @@ -347,6 +390,11 @@ static struct iwl_lib_ops iwl6050_lib = {  		.set_calib_version = iwl6050_set_calib_version,  	 },  	.add_bcast_station = iwl_add_bcast_station, +	.debugfs_ops = { +		.rx_stats_read = iwl_ucode_rx_stats_read, +		.tx_stats_read = iwl_ucode_tx_stats_read, +		.general_stats_read = iwl_ucode_general_stats_read, +	},  	.recover_from_tx_stall = iwl_bg_monitor_recover,  	.check_plcp_health = iwl_good_plcp_health,  	.check_ack_health = iwl_good_ack_health, @@ -363,16 +411,16 @@ static const struct iwl_ops iwl6050_ops = {  /*   * "i": Internal configuration, use internal Power Amplifier   */ -struct iwl_cfg iwl6000i_g2_2agn_cfg = { +struct iwl_cfg iwl6000g2_2agn_cfg = {  	.name = "6000 Series 2x2 AGN Gen2", -	.fw_name_pre = IWL6000_G2_FW_PRE, -	.ucode_api_max = IWL6000_UCODE_API_MAX, -	.ucode_api_min = IWL6000_UCODE_API_MIN, +	.fw_name_pre = IWL6000G2_FW_PRE, +	.ucode_api_max = IWL6000G2_UCODE_API_MAX, +	.ucode_api_min = IWL6000G2_UCODE_API_MIN,  	.sku = IWL_SKU_A|IWL_SKU_G|IWL_SKU_N,  	.ops = &iwl6000_ops,  	.eeprom_size = OTP_LOW_IMAGE_SIZE, -	.eeprom_ver = EEPROM_6000_EEPROM_VERSION, -	.eeprom_calib_ver = EEPROM_6000_TX_POWER_VERSION, +	.eeprom_ver = EEPROM_6000G2_EEPROM_VERSION, +	.eeprom_calib_ver = EEPROM_6000G2_TX_POWER_VERSION,  	.num_of_queues = IWLAGN_NUM_QUEUES,  	.num_of_ampdu_queues = IWLAGN_NUM_AMPDU_QUEUES,  	.mod_params = &iwlagn_mod_params, @@ -381,7 +429,7 @@ struct iwl_cfg iwl6000i_g2_2agn_cfg = {  	.pll_cfg_val = 0,  	.set_l0s = true,  	.use_bsm = false, -	.pa_type = IWL_PA_INTERNAL, +	.pa_type = IWL_PA_SYSTEM,  	.max_ll_items = OTP_MAX_LL_ITEMS_6x00,  	.shadow_ram_support = true,  	.ht_greenfield_support = true, @@ -452,7 +500,6 @@ struct iwl_cfg iwl6000i_2abg_cfg = {  	.pa_type = IWL_PA_INTERNAL,  	.max_ll_items = OTP_MAX_LL_ITEMS_6x00,  	.shadow_ram_support = true, -	.ht_greenfield_support = true,  	.led_compensation = 51,  	.chain_noise_num_beacons = IWL_CAL_NUM_BEACONS,  	.supports_idle = true, @@ -485,7 +532,6 @@ struct iwl_cfg iwl6000i_2bg_cfg = {  	.pa_type = IWL_PA_INTERNAL,  	.max_ll_items = OTP_MAX_LL_ITEMS_6x00,  	.shadow_ram_support = true, -	.ht_greenfield_support = true,  	.led_compensation = 51,  	.chain_noise_num_beacons = IWL_CAL_NUM_BEACONS,  	.supports_idle = true, @@ -552,7 +598,6 @@ struct iwl_cfg iwl6050_2abg_cfg = {  	.pa_type = IWL_PA_SYSTEM,  	.max_ll_items = OTP_MAX_LL_ITEMS_6x50,  	.shadow_ram_support = true, -	.ht_greenfield_support = true,  	.led_compensation = 51,  	.chain_noise_num_beacons = IWL_CAL_NUM_BEACONS,  	.supports_idle = true, @@ -600,3 +645,4 @@ struct iwl_cfg iwl6000_3agn_cfg = {  MODULE_FIRMWARE(IWL6000_MODULE_FIRMWARE(IWL6000_UCODE_API_MAX));  MODULE_FIRMWARE(IWL6050_MODULE_FIRMWARE(IWL6050_UCODE_API_MAX)); +MODULE_FIRMWARE(IWL6000G2_MODULE_FIRMWARE(IWL6000G2_UCODE_API_MAX));  |