diff options
Diffstat (limited to 'drivers/net/wireless/iwlwifi/iwl-6000.c')
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-6000.c | 538 | 
1 files changed, 411 insertions, 127 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-6000.c b/drivers/net/wireless/iwlwifi/iwl-6000.c index 9fbf54cd3e1..58270529a0e 100644 --- a/drivers/net/wireless/iwlwifi/iwl-6000.c +++ b/drivers/net/wireless/iwlwifi/iwl-6000.c @@ -71,6 +71,10 @@  #define _IWL6000G2A_MODULE_FIRMWARE(api) IWL6000G2A_FW_PRE #api ".ucode"  #define IWL6000G2A_MODULE_FIRMWARE(api) _IWL6000G2A_MODULE_FIRMWARE(api) +#define IWL6000G2B_FW_PRE "iwlwifi-6000g2b-" +#define _IWL6000G2B_MODULE_FIRMWARE(api) IWL6000G2B_FW_PRE #api ".ucode" +#define IWL6000G2B_MODULE_FIRMWARE(api) _IWL6000G2B_MODULE_FIRMWARE(api) +  static void iwl6000_set_ct_threshold(struct iwl_priv *priv)  { @@ -80,9 +84,10 @@ static void iwl6000_set_ct_threshold(struct iwl_priv *priv)  }  /* Indicate calibration version to uCode. */ -static void iwl6050_set_calib_version(struct iwl_priv *priv) +static void iwl6000_set_calib_version(struct iwl_priv *priv)  { -	if (priv->cfg->ops->lib->eeprom_ops.calib_version(priv) >= 6) +	if (priv->cfg->need_dc_calib && +	    (priv->cfg->ops->lib->eeprom_ops.calib_version(priv) >= 6))  		iwl_set_bit(priv, CSR_GP_DRIVER_REG,  				CSR_GP_DRIVER_REG_BIT_CALIB_VERSION6);  } @@ -155,8 +160,8 @@ static int iwl6000_hw_set_hw_params(struct iwl_priv *priv)  			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_stations = IWLAGN_STATION_COUNT; +	priv->hw_params.bcast_sta_id = IWLAGN_BROADCAST_ID;  	priv->hw_params.max_data_size = IWL60_RTC_DATA_SIZE;  	priv->hw_params.max_inst_size = IWL60_RTC_INST_SIZE; @@ -182,83 +187,77 @@ static int iwl6000_hw_set_hw_params(struct iwl_priv *priv)  		BIT(IWL_CALIB_LO)		|  		BIT(IWL_CALIB_TX_IQ)		|  		BIT(IWL_CALIB_BASE_BAND); +	if (priv->cfg->need_dc_calib) +		priv->hw_params.calib_init_cfg |= BIT(IWL_CALIB_DC); -	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); +	priv->hw_params.beacon_time_tsf_bits = IWLAGN_EXT_BEACON_TIME_POS;  	return 0;  } -static int iwl6000_hw_channel_switch(struct iwl_priv *priv, u16 channel) +static int iwl6000_hw_channel_switch(struct iwl_priv *priv, +				     struct ieee80211_channel_switch *ch_switch)  {  	struct iwl6000_channel_switch_cmd cmd;  	const struct iwl_channel_info *ch_info; +	u32 switch_time_in_usec, ucode_switch_time; +	u16 ch; +	u32 tsf_low; +	u8 switch_count; +	u16 beacon_interval = le16_to_cpu(priv->rxon_timing.beacon_interval); +	struct ieee80211_vif *vif = priv->vif;  	struct iwl_host_cmd hcmd = {  		.id = REPLY_CHANNEL_SWITCH,  		.len = sizeof(cmd), -		.flags = CMD_SIZE_HUGE, +		.flags = CMD_SYNC,  		.data = &cmd,  	}; -	IWL_DEBUG_11H(priv, "channel switch from %d to %d\n", -		priv->active_rxon.channel, channel); -  	cmd.band = priv->band == IEEE80211_BAND_2GHZ; -	cmd.channel = cpu_to_le16(channel); +	ch = ieee80211_frequency_to_channel(ch_switch->channel->center_freq); +	IWL_DEBUG_11H(priv, "channel switch from %u to %u\n", +		      priv->active_rxon.channel, ch); +	cmd.channel = cpu_to_le16(ch);  	cmd.rxon_flags = priv->staging_rxon.flags;  	cmd.rxon_filter_flags = priv->staging_rxon.filter_flags; -	cmd.switch_time = cpu_to_le32(priv->ucode_beacon_time); -	ch_info = iwl_get_channel_info(priv, priv->band, channel); +	switch_count = ch_switch->count; +	tsf_low = ch_switch->timestamp & 0x0ffffffff; +	/* +	 * calculate the ucode channel switch time +	 * adding TSF as one of the factor for when to switch +	 */ +	if ((priv->ucode_beacon_time > tsf_low) && beacon_interval) { +		if (switch_count > ((priv->ucode_beacon_time - tsf_low) / +		    beacon_interval)) { +			switch_count -= (priv->ucode_beacon_time - +				tsf_low) / beacon_interval; +		} else +			switch_count = 0; +	} +	if (switch_count <= 1) +		cmd.switch_time = cpu_to_le32(priv->ucode_beacon_time); +	else { +		switch_time_in_usec = +			vif->bss_conf.beacon_int * switch_count * TIME_UNIT; +		ucode_switch_time = iwl_usecs_to_beacons(priv, +							 switch_time_in_usec, +							 beacon_interval); +		cmd.switch_time = iwl_add_beacon_time(priv, +						      priv->ucode_beacon_time, +						      ucode_switch_time, +						      beacon_interval); +	} +	IWL_DEBUG_11H(priv, "uCode time for the switch is 0x%x\n", +		      cmd.switch_time); +	ch_info = iwl_get_channel_info(priv, priv->band, ch);  	if (ch_info)  		cmd.expect_beacon = is_channel_radar(ch_info);  	else {  		IWL_ERR(priv, "invalid channel switch from %u to %u\n", -			priv->active_rxon.channel, channel); +			priv->active_rxon.channel, ch);  		return -EFAULT;  	} -	priv->switch_rxon.channel = cpu_to_le16(channel); +	priv->switch_rxon.channel = cmd.channel;  	priv->switch_rxon.switch_in_progress = true;  	return iwl_send_cmd_sync(priv, &hcmd); @@ -316,16 +315,21 @@ static struct iwl_lib_ops iwl6000_lib = {  	.temp_ops = {  		.temperature = iwlagn_temperature,  		.set_ct_kill = iwl6000_set_ct_threshold, +		.set_calib_version = iwl6000_set_calib_version,  	 },  	.manage_ibss_station = iwlagn_manage_ibss_station, +	.update_bcast_station = iwl_update_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, +		.bt_stats_read = iwl_ucode_bt_stats_read,  	},  	.recover_from_tx_stall = iwl_bg_monitor_recover,  	.check_plcp_health = iwl_good_plcp_health,  	.check_ack_health = iwl_good_ack_health, +	.txfifo_flush = iwlagn_txfifo_flush, +	.dev_txfifo_flush = iwlagn_dev_txfifo_flush,  };  static const struct iwl_ops iwl6000_ops = { @@ -335,79 +339,25 @@ static const struct iwl_ops iwl6000_ops = {  	.led = &iwlagn_led_ops,  }; -static struct iwl_lib_ops iwl6050_lib = { -	.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, -	.txq_agg_enable = iwlagn_txq_agg_enable, -	.txq_agg_disable = iwlagn_txq_agg_disable, -	.txq_attach_buf_to_tfd = iwl_hw_txq_attach_buf_to_tfd, -	.txq_free_tfd = iwl_hw_txq_free_tfd, -	.txq_init = iwl_hw_tx_queue_init, -	.rx_handler_setup = iwlagn_rx_handler_setup, -	.setup_deferred_work = iwlagn_setup_deferred_work, -	.is_valid_rtc_data_addr = iwlagn_hw_valid_rtc_data_addr, -	.load_ucode = iwlagn_load_ucode, -	.dump_nic_event_log = iwl_dump_nic_event_log, -	.dump_nic_error_log = iwl_dump_nic_error_log, -	.dump_csr = iwl_dump_csr, -	.dump_fh = iwl_dump_fh, -	.init_alive_start = iwlagn_init_alive_start, -	.alive_notify = iwlagn_alive_notify, -	.send_tx_power = iwlagn_send_tx_power, -	.update_chain_flags = iwl_update_chain_flags, -	.set_channel_switch = iwl6000_hw_channel_switch, -	.apm_ops = { -		.init = iwl_apm_init, -		.stop = iwl_apm_stop, -		.config = iwl6000_nic_config, -		.set_pwr_src = iwl_set_pwr_src, -	}, -	.eeprom_ops = { -		.regulatory_bands = { -			EEPROM_REG_BAND_1_CHANNELS, -			EEPROM_REG_BAND_2_CHANNELS, -			EEPROM_REG_BAND_3_CHANNELS, -			EEPROM_REG_BAND_4_CHANNELS, -			EEPROM_REG_BAND_5_CHANNELS, -			EEPROM_6000_REG_BAND_24_HT40_CHANNELS, -			EEPROM_REG_BAND_52_HT40_CHANNELS -		}, -		.verify_signature  = iwlcore_eeprom_verify_signature, -		.acquire_semaphore = iwlcore_eeprom_acquire_semaphore, -		.release_semaphore = iwlcore_eeprom_release_semaphore, -		.calib_version	= iwlagn_eeprom_calib_version, -		.query_addr = iwlagn_eeprom_query_addr, -		.update_enhanced_txpower = iwlcore_eeprom_enhanced_txpower, -	}, -	.post_associate = iwl_post_associate, -	.isr = iwl_isr_ict, -	.config_ap = iwl_config_ap, -	.temp_ops = { -		.temperature = iwlagn_temperature, -		.set_ct_kill = iwl6000_set_ct_threshold, -		.set_calib_version = iwl6050_set_calib_version, -	 }, -	.manage_ibss_station = iwlagn_manage_ibss_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, +static void do_not_send_bt_config(struct iwl_priv *priv) +{ +} + +static struct iwl_hcmd_ops iwl6000g2b_hcmd = { +	.rxon_assoc = iwlagn_send_rxon_assoc, +	.commit_rxon = iwl_commit_rxon, +	.set_rxon_chain = iwl_set_rxon_chain, +	.set_tx_ant = iwlagn_send_tx_ant_config, +	.send_bt_config = do_not_send_bt_config,  }; -static const struct iwl_ops iwl6050_ops = { -	.lib = &iwl6050_lib, -	.hcmd = &iwlagn_hcmd, +static const struct iwl_ops iwl6000g2b_ops = { +	.lib = &iwl6000_lib, +	.hcmd = &iwl6000g2b_hcmd,  	.utils = &iwlagn_hcmd_utils,  	.led = &iwlagn_led_ops,  }; -  struct iwl_cfg iwl6000g2a_2agn_cfg = {  	.name = "6000 Series 2x2 AGN Gen2a",  	.fw_name_pre = IWL6000G2A_FW_PRE, @@ -443,6 +393,299 @@ struct iwl_cfg iwl6000g2a_2agn_cfg = {  	.ucode_tracing = true,  	.sensitivity_calib_by_driver = true,  	.chain_noise_calib_by_driver = true, +	.need_dc_calib = true, +}; + +struct iwl_cfg iwl6000g2a_2abg_cfg = { +	.name = "6000 Series 2x2 ABG Gen2a", +	.fw_name_pre = IWL6000G2A_FW_PRE, +	.ucode_api_max = IWL6000G2_UCODE_API_MAX, +	.ucode_api_min = IWL6000G2_UCODE_API_MIN, +	.sku = IWL_SKU_A|IWL_SKU_G, +	.ops = &iwl6000_ops, +	.eeprom_size = OTP_LOW_IMAGE_SIZE, +	.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, +	.valid_tx_ant = ANT_AB, +	.valid_rx_ant = ANT_AB, +	.pll_cfg_val = 0, +	.set_l0s = true, +	.use_bsm = false, +	.pa_type = IWL_PA_SYSTEM, +	.max_ll_items = OTP_MAX_LL_ITEMS_6x00, +	.shadow_ram_support = true, +	.led_compensation = 51, +	.chain_noise_num_beacons = IWL_CAL_NUM_BEACONS, +	.supports_idle = true, +	.adv_thermal_throttle = true, +	.support_ct_kill_exit = true, +	.plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF, +	.chain_noise_scale = 1000, +	.monitor_recover_period = IWL_MONITORING_PERIOD, +	.max_event_log_size = 512, +	.sensitivity_calib_by_driver = true, +	.chain_noise_calib_by_driver = true, +	.need_dc_calib = true, +}; + +struct iwl_cfg iwl6000g2a_2bg_cfg = { +	.name = "6000 Series 2x2 BG Gen2a", +	.fw_name_pre = IWL6000G2A_FW_PRE, +	.ucode_api_max = IWL6000G2_UCODE_API_MAX, +	.ucode_api_min = IWL6000G2_UCODE_API_MIN, +	.sku = IWL_SKU_G, +	.ops = &iwl6000_ops, +	.eeprom_size = OTP_LOW_IMAGE_SIZE, +	.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, +	.valid_tx_ant = ANT_AB, +	.valid_rx_ant = ANT_AB, +	.pll_cfg_val = 0, +	.set_l0s = true, +	.use_bsm = false, +	.pa_type = IWL_PA_SYSTEM, +	.max_ll_items = OTP_MAX_LL_ITEMS_6x00, +	.shadow_ram_support = true, +	.led_compensation = 51, +	.chain_noise_num_beacons = IWL_CAL_NUM_BEACONS, +	.supports_idle = true, +	.adv_thermal_throttle = true, +	.support_ct_kill_exit = true, +	.plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF, +	.chain_noise_scale = 1000, +	.monitor_recover_period = IWL_MONITORING_PERIOD, +	.max_event_log_size = 512, +	.sensitivity_calib_by_driver = true, +	.chain_noise_calib_by_driver = true, +	.need_dc_calib = true, +}; + +struct iwl_cfg iwl6000g2b_2agn_cfg = { +	.name = "6000 Series 2x2 AGN Gen2b", +	.fw_name_pre = IWL6000G2B_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 = &iwl6000g2b_ops, +	.eeprom_size = OTP_LOW_IMAGE_SIZE, +	.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, +	.valid_tx_ant = ANT_AB, +	.valid_rx_ant = ANT_AB, +	.pll_cfg_val = 0, +	.set_l0s = true, +	.use_bsm = false, +	.pa_type = IWL_PA_SYSTEM, +	.max_ll_items = OTP_MAX_LL_ITEMS_6x00, +	.shadow_ram_support = true, +	.ht_greenfield_support = true, +	.led_compensation = 51, +	.use_rts_for_ht = true, /* use rts/cts protection */ +	.chain_noise_num_beacons = IWL_CAL_NUM_BEACONS, +	.supports_idle = true, +	.adv_thermal_throttle = true, +	.support_ct_kill_exit = true, +	.plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF, +	.chain_noise_scale = 1000, +	.monitor_recover_period = IWL_MONITORING_PERIOD, +	.max_event_log_size = 512, +	.sensitivity_calib_by_driver = true, +	.chain_noise_calib_by_driver = true, +	.need_dc_calib = true, +	.bt_statistics = true, +}; + +struct iwl_cfg iwl6000g2b_2abg_cfg = { +	.name = "6000 Series 2x2 ABG Gen2b", +	.fw_name_pre = IWL6000G2B_FW_PRE, +	.ucode_api_max = IWL6000G2_UCODE_API_MAX, +	.ucode_api_min = IWL6000G2_UCODE_API_MIN, +	.sku = IWL_SKU_A|IWL_SKU_G, +	.ops = &iwl6000g2b_ops, +	.eeprom_size = OTP_LOW_IMAGE_SIZE, +	.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, +	.valid_tx_ant = ANT_AB, +	.valid_rx_ant = ANT_AB, +	.pll_cfg_val = 0, +	.set_l0s = true, +	.use_bsm = false, +	.pa_type = IWL_PA_SYSTEM, +	.max_ll_items = OTP_MAX_LL_ITEMS_6x00, +	.shadow_ram_support = true, +	.led_compensation = 51, +	.chain_noise_num_beacons = IWL_CAL_NUM_BEACONS, +	.supports_idle = true, +	.adv_thermal_throttle = true, +	.support_ct_kill_exit = true, +	.plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF, +	.chain_noise_scale = 1000, +	.monitor_recover_period = IWL_MONITORING_PERIOD, +	.max_event_log_size = 512, +	.sensitivity_calib_by_driver = true, +	.chain_noise_calib_by_driver = true, +	.need_dc_calib = true, +	.bt_statistics = true, +}; + +struct iwl_cfg iwl6000g2b_2bgn_cfg = { +	.name = "6000 Series 2x2 BGN Gen2b", +	.fw_name_pre = IWL6000G2B_FW_PRE, +	.ucode_api_max = IWL6000G2_UCODE_API_MAX, +	.ucode_api_min = IWL6000G2_UCODE_API_MIN, +	.sku = IWL_SKU_G|IWL_SKU_N, +	.ops = &iwl6000g2b_ops, +	.eeprom_size = OTP_LOW_IMAGE_SIZE, +	.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, +	.valid_tx_ant = ANT_AB, +	.valid_rx_ant = ANT_AB, +	.pll_cfg_val = 0, +	.set_l0s = true, +	.use_bsm = false, +	.pa_type = IWL_PA_SYSTEM, +	.max_ll_items = OTP_MAX_LL_ITEMS_6x00, +	.shadow_ram_support = true, +	.ht_greenfield_support = true, +	.led_compensation = 51, +	.use_rts_for_ht = true, /* use rts/cts protection */ +	.chain_noise_num_beacons = IWL_CAL_NUM_BEACONS, +	.supports_idle = true, +	.adv_thermal_throttle = true, +	.support_ct_kill_exit = true, +	.plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF, +	.chain_noise_scale = 1000, +	.monitor_recover_period = IWL_MONITORING_PERIOD, +	.max_event_log_size = 512, +	.sensitivity_calib_by_driver = true, +	.chain_noise_calib_by_driver = true, +	.need_dc_calib = true, +	.bt_statistics = true, +}; + +struct iwl_cfg iwl6000g2b_2bg_cfg = { +	.name = "6000 Series 2x2 BG Gen2b", +	.fw_name_pre = IWL6000G2B_FW_PRE, +	.ucode_api_max = IWL6000G2_UCODE_API_MAX, +	.ucode_api_min = IWL6000G2_UCODE_API_MIN, +	.sku = IWL_SKU_G, +	.ops = &iwl6000g2b_ops, +	.eeprom_size = OTP_LOW_IMAGE_SIZE, +	.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, +	.valid_tx_ant = ANT_AB, +	.valid_rx_ant = ANT_AB, +	.pll_cfg_val = 0, +	.set_l0s = true, +	.use_bsm = false, +	.pa_type = IWL_PA_SYSTEM, +	.max_ll_items = OTP_MAX_LL_ITEMS_6x00, +	.shadow_ram_support = true, +	.led_compensation = 51, +	.chain_noise_num_beacons = IWL_CAL_NUM_BEACONS, +	.supports_idle = true, +	.adv_thermal_throttle = true, +	.support_ct_kill_exit = true, +	.plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF, +	.chain_noise_scale = 1000, +	.monitor_recover_period = IWL_MONITORING_PERIOD, +	.max_event_log_size = 512, +	.sensitivity_calib_by_driver = true, +	.chain_noise_calib_by_driver = true, +	.need_dc_calib = true, +	.bt_statistics = true, +}; + +struct iwl_cfg iwl6000g2b_bgn_cfg = { +	.name = "6000 Series 1x2 BGN Gen2b", +	.fw_name_pre = IWL6000G2B_FW_PRE, +	.ucode_api_max = IWL6000G2_UCODE_API_MAX, +	.ucode_api_min = IWL6000G2_UCODE_API_MIN, +	.sku = IWL_SKU_G|IWL_SKU_N, +	.ops = &iwl6000g2b_ops, +	.eeprom_size = OTP_LOW_IMAGE_SIZE, +	.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, +	.valid_tx_ant = ANT_A, +	.valid_rx_ant = ANT_AB, +	.pll_cfg_val = 0, +	.set_l0s = true, +	.use_bsm = false, +	.pa_type = IWL_PA_SYSTEM, +	.max_ll_items = OTP_MAX_LL_ITEMS_6x00, +	.shadow_ram_support = true, +	.ht_greenfield_support = true, +	.led_compensation = 51, +	.use_rts_for_ht = true, /* use rts/cts protection */ +	.chain_noise_num_beacons = IWL_CAL_NUM_BEACONS, +	.supports_idle = true, +	.adv_thermal_throttle = true, +	.support_ct_kill_exit = true, +	.plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF, +	.chain_noise_scale = 1000, +	.monitor_recover_period = IWL_MONITORING_PERIOD, +	.max_event_log_size = 512, +	.sensitivity_calib_by_driver = true, +	.chain_noise_calib_by_driver = true, +	.need_dc_calib = true, +	.bt_statistics = true, +}; + +struct iwl_cfg iwl6000g2b_bg_cfg = { +	.name = "6000 Series 1x2 BG Gen2b", +	.fw_name_pre = IWL6000G2B_FW_PRE, +	.ucode_api_max = IWL6000G2_UCODE_API_MAX, +	.ucode_api_min = IWL6000G2_UCODE_API_MIN, +	.sku = IWL_SKU_G, +	.ops = &iwl6000g2b_ops, +	.eeprom_size = OTP_LOW_IMAGE_SIZE, +	.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, +	.valid_tx_ant = ANT_A, +	.valid_rx_ant = ANT_AB, +	.pll_cfg_val = 0, +	.set_l0s = true, +	.use_bsm = false, +	.pa_type = IWL_PA_SYSTEM, +	.max_ll_items = OTP_MAX_LL_ITEMS_6x00, +	.shadow_ram_support = true, +	.led_compensation = 51, +	.chain_noise_num_beacons = IWL_CAL_NUM_BEACONS, +	.supports_idle = true, +	.adv_thermal_throttle = true, +	.support_ct_kill_exit = true, +	.plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF, +	.chain_noise_scale = 1000, +	.monitor_recover_period = IWL_MONITORING_PERIOD, +	.max_event_log_size = 512, +	.sensitivity_calib_by_driver = true, +	.chain_noise_calib_by_driver = true, +	.need_dc_calib = true, +	.bt_statistics = true,  };  /* @@ -561,7 +804,7 @@ struct iwl_cfg iwl6050_2agn_cfg = {  	.ucode_api_max = IWL6050_UCODE_API_MAX,  	.ucode_api_min = IWL6050_UCODE_API_MIN,  	.sku = IWL_SKU_A|IWL_SKU_G|IWL_SKU_N, -	.ops = &iwl6050_ops, +	.ops = &iwl6000_ops,  	.eeprom_size = OTP_LOW_IMAGE_SIZE,  	.eeprom_ver = EEPROM_6050_EEPROM_VERSION,  	.eeprom_calib_ver = EEPROM_6050_TX_POWER_VERSION, @@ -590,6 +833,45 @@ struct iwl_cfg iwl6050_2agn_cfg = {  	.ucode_tracing = true,  	.sensitivity_calib_by_driver = true,  	.chain_noise_calib_by_driver = true, +	.need_dc_calib = true, +}; + +struct iwl_cfg iwl6050g2_bgn_cfg = { +	.name = "6050 Series 1x2 BGN Gen2", +	.fw_name_pre = IWL6050_FW_PRE, +	.ucode_api_max = IWL6050_UCODE_API_MAX, +	.ucode_api_min = IWL6050_UCODE_API_MIN, +	.sku = IWL_SKU_G|IWL_SKU_N, +	.ops = &iwl6000_ops, +	.eeprom_size = OTP_LOW_IMAGE_SIZE, +	.eeprom_ver = EEPROM_6050G2_EEPROM_VERSION, +	.eeprom_calib_ver = EEPROM_6050G2_TX_POWER_VERSION, +	.num_of_queues = IWLAGN_NUM_QUEUES, +	.num_of_ampdu_queues = IWLAGN_NUM_AMPDU_QUEUES, +	.mod_params = &iwlagn_mod_params, +	.valid_tx_ant = ANT_A, +	.valid_rx_ant = ANT_AB, +	.pll_cfg_val = 0, +	.set_l0s = true, +	.use_bsm = false, +	.pa_type = IWL_PA_SYSTEM, +	.max_ll_items = OTP_MAX_LL_ITEMS_6x50, +	.shadow_ram_support = true, +	.ht_greenfield_support = true, +	.led_compensation = 51, +	.use_rts_for_ht = true, /* use rts/cts protection */ +	.chain_noise_num_beacons = IWL_CAL_NUM_BEACONS, +	.supports_idle = true, +	.adv_thermal_throttle = true, +	.support_ct_kill_exit = true, +	.plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF, +	.chain_noise_scale = 1500, +	.monitor_recover_period = IWL_MONITORING_PERIOD, +	.max_event_log_size = 1024, +	.ucode_tracing = true, +	.sensitivity_calib_by_driver = true, +	.chain_noise_calib_by_driver = true, +	.need_dc_calib = true,  };  struct iwl_cfg iwl6050_2abg_cfg = { @@ -598,7 +880,7 @@ struct iwl_cfg iwl6050_2abg_cfg = {  	.ucode_api_max = IWL6050_UCODE_API_MAX,  	.ucode_api_min = IWL6050_UCODE_API_MIN,  	.sku = IWL_SKU_A|IWL_SKU_G, -	.ops = &iwl6050_ops, +	.ops = &iwl6000_ops,  	.eeprom_size = OTP_LOW_IMAGE_SIZE,  	.eeprom_ver = EEPROM_6050_EEPROM_VERSION,  	.eeprom_calib_ver = EEPROM_6050_TX_POWER_VERSION, @@ -625,6 +907,7 @@ struct iwl_cfg iwl6050_2abg_cfg = {  	.ucode_tracing = true,  	.sensitivity_calib_by_driver = true,  	.chain_noise_calib_by_driver = true, +	.need_dc_calib = true,  };  struct iwl_cfg iwl6000_3agn_cfg = { @@ -667,3 +950,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(IWL6000G2A_MODULE_FIRMWARE(IWL6000G2_UCODE_API_MAX)); +MODULE_FIRMWARE(IWL6000G2B_MODULE_FIRMWARE(IWL6000G2_UCODE_API_MAX));  |