diff options
Diffstat (limited to 'drivers/net/wireless/iwlwifi/dvm/ucode.c')
| -rw-r--r-- | drivers/net/wireless/iwlwifi/dvm/ucode.c | 112 | 
1 files changed, 9 insertions, 103 deletions
diff --git a/drivers/net/wireless/iwlwifi/dvm/ucode.c b/drivers/net/wireless/iwlwifi/dvm/ucode.c index 2cb1efbc5ed..736fe9bb140 100644 --- a/drivers/net/wireless/iwlwifi/dvm/ucode.c +++ b/drivers/net/wireless/iwlwifi/dvm/ucode.c @@ -2,7 +2,7 @@   *   * GPL LICENSE SUMMARY   * - * Copyright(c) 2008 - 2012 Intel Corporation. All rights reserved. + * Copyright(c) 2008 - 2013 Intel Corporation. All rights reserved.   *   * This program is free software; you can redistribute it and/or modify   * it under the terms of version 2 of the GNU General Public License as @@ -61,7 +61,7 @@ iwl_get_ucode_image(struct iwl_priv *priv, enum iwl_ucode_type ucode_type)  static int iwl_set_Xtal_calib(struct iwl_priv *priv)  {  	struct iwl_calib_xtal_freq_cmd cmd; -	__le16 *xtal_calib = priv->eeprom_data->xtal_calib; +	__le16 *xtal_calib = priv->nvm_data->xtal_calib;  	iwl_set_calib_hdr(&cmd.hdr, IWL_PHY_CALIBRATE_CRYSTAL_FRQ_CMD);  	cmd.cap_pin1 = le16_to_cpu(xtal_calib[0]); @@ -75,7 +75,7 @@ static int iwl_set_temperature_offset_calib(struct iwl_priv *priv)  	memset(&cmd, 0, sizeof(cmd));  	iwl_set_calib_hdr(&cmd.hdr, IWL_PHY_CALIBRATE_TEMP_OFFSET_CMD); -	cmd.radio_sensor_offset = priv->eeprom_data->raw_temperature; +	cmd.radio_sensor_offset = priv->nvm_data->raw_temperature;  	if (!(cmd.radio_sensor_offset))  		cmd.radio_sensor_offset = DEFAULT_RADIO_SENSOR_OFFSET; @@ -90,14 +90,14 @@ static int iwl_set_temperature_offset_calib_v2(struct iwl_priv *priv)  	memset(&cmd, 0, sizeof(cmd));  	iwl_set_calib_hdr(&cmd.hdr, IWL_PHY_CALIBRATE_TEMP_OFFSET_CMD); -	cmd.radio_sensor_offset_high = priv->eeprom_data->kelvin_temperature; -	cmd.radio_sensor_offset_low = priv->eeprom_data->raw_temperature; +	cmd.radio_sensor_offset_high = priv->nvm_data->kelvin_temperature; +	cmd.radio_sensor_offset_low = priv->nvm_data->raw_temperature;  	if (!cmd.radio_sensor_offset_low) {  		IWL_DEBUG_CALIB(priv, "no info in EEPROM, use default\n");  		cmd.radio_sensor_offset_low = DEFAULT_RADIO_SENSOR_OFFSET;  		cmd.radio_sensor_offset_high = DEFAULT_RADIO_SENSOR_OFFSET;  	} -	cmd.burntVoltageRef = priv->eeprom_data->calib_voltage; +	cmd.burntVoltageRef = priv->nvm_data->calib_voltage;  	IWL_DEBUG_CALIB(priv, "Radio sensor offset high: %d\n",  			le16_to_cpu(cmd.radio_sensor_offset_high)); @@ -254,10 +254,10 @@ static int iwl_alive_notify(struct iwl_priv *priv)  	int ret;  	int i; -	iwl_trans_fw_alive(priv->trans); +	iwl_trans_fw_alive(priv->trans, 0);  	if (priv->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_PAN && -	    priv->eeprom_data->sku & EEPROM_SKU_CAP_IPAN_ENABLE) { +	    priv->nvm_data->sku_cap_ipan_enable) {  		n_queues = ARRAY_SIZE(iwlagn_ipan_queue_to_tx_fifo);  		queue_to_txf = iwlagn_ipan_queue_to_tx_fifo;  	} else { @@ -286,89 +286,6 @@ static int iwl_alive_notify(struct iwl_priv *priv)  	return iwl_send_calib_results(priv);  } - -/** - * iwl_verify_inst_sparse - verify runtime uCode image in card vs. host, - *   using sample data 100 bytes apart.  If these sample points are good, - *   it's a pretty good bet that everything between them is good, too. - */ -static int iwl_verify_sec_sparse(struct iwl_priv *priv, -				  const struct fw_desc *fw_desc) -{ -	__le32 *image = (__le32 *)fw_desc->data; -	u32 len = fw_desc->len; -	u32 val; -	u32 i; - -	IWL_DEBUG_FW(priv, "ucode inst image size is %u\n", len); - -	for (i = 0; i < len; i += 100, image += 100/sizeof(u32)) { -		/* read data comes through single port, auto-incr addr */ -		/* NOTE: Use the debugless read so we don't flood kernel log -		 * if IWL_DL_IO is set */ -		iwl_write_direct32(priv->trans, HBUS_TARG_MEM_RADDR, -			i + fw_desc->offset); -		val = iwl_read32(priv->trans, HBUS_TARG_MEM_RDAT); -		if (val != le32_to_cpu(*image)) -			return -EIO; -	} - -	return 0; -} - -static void iwl_print_mismatch_sec(struct iwl_priv *priv, -				    const struct fw_desc *fw_desc) -{ -	__le32 *image = (__le32 *)fw_desc->data; -	u32 len = fw_desc->len; -	u32 val; -	u32 offs; -	int errors = 0; - -	IWL_DEBUG_FW(priv, "ucode inst image size is %u\n", len); - -	iwl_write_direct32(priv->trans, HBUS_TARG_MEM_RADDR, -				fw_desc->offset); - -	for (offs = 0; -	     offs < len && errors < 20; -	     offs += sizeof(u32), image++) { -		/* read data comes through single port, auto-incr addr */ -		val = iwl_read32(priv->trans, HBUS_TARG_MEM_RDAT); -		if (val != le32_to_cpu(*image)) { -			IWL_ERR(priv, "uCode INST section at " -				"offset 0x%x, is 0x%x, s/b 0x%x\n", -				offs, val, le32_to_cpu(*image)); -			errors++; -		} -	} -} - -/** - * iwl_verify_ucode - determine which instruction image is in SRAM, - *    and verify its contents - */ -static int iwl_verify_ucode(struct iwl_priv *priv, -			    enum iwl_ucode_type ucode_type) -{ -	const struct fw_img *img = iwl_get_ucode_image(priv, ucode_type); - -	if (!img) { -		IWL_ERR(priv, "Invalid ucode requested (%d)\n", ucode_type); -		return -EINVAL; -	} - -	if (!iwl_verify_sec_sparse(priv, &img->sec[IWL_UCODE_SECTION_INST])) { -		IWL_DEBUG_FW(priv, "uCode is good in inst SRAM\n"); -		return 0; -	} - -	IWL_ERR(priv, "UCODE IMAGE IN INSTRUCTION SRAM NOT VALID!!\n"); - -	iwl_print_mismatch_sec(priv, &img->sec[IWL_UCODE_SECTION_INST]); -	return -EIO; -} -  struct iwl_alive_data {  	bool valid;  	u8 subtype; @@ -426,7 +343,7 @@ int iwl_load_ucode_wait_alive(struct iwl_priv *priv,  				   alive_cmd, ARRAY_SIZE(alive_cmd),  				   iwl_alive_fn, &alive_data); -	ret = iwl_trans_start_fw(priv->trans, fw); +	ret = iwl_trans_start_fw(priv->trans, fw, false);  	if (ret) {  		priv->cur_ucode = old_type;  		iwl_remove_notification(&priv->notif_wait, &alive_wait); @@ -450,18 +367,7 @@ int iwl_load_ucode_wait_alive(struct iwl_priv *priv,  		return -EIO;  	} -	/* -	 * This step takes a long time (60-80ms!!) and -	 * WoWLAN image should be loaded quickly, so -	 * skip it for WoWLAN. -	 */  	if (ucode_type != IWL_UCODE_WOWLAN) { -		ret = iwl_verify_ucode(priv, ucode_type); -		if (ret) { -			priv->cur_ucode = old_type; -			return ret; -		} -  		/* delay a bit to give rfkill time to run */  		msleep(5);  	}  |