diff options
Diffstat (limited to 'drivers/net/wireless/iwlwifi/iwl-eeprom.c')
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-eeprom.c | 50 |
1 files changed, 24 insertions, 26 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-eeprom.c b/drivers/net/wireless/iwlwifi/iwl-eeprom.c index 833194a2c63..859b94a1229 100644 --- a/drivers/net/wireless/iwlwifi/iwl-eeprom.c +++ b/drivers/net/wireless/iwlwifi/iwl-eeprom.c | |||
@@ -5,7 +5,7 @@ | |||
5 | * | 5 | * |
6 | * GPL LICENSE SUMMARY | 6 | * GPL LICENSE SUMMARY |
7 | * | 7 | * |
8 | * Copyright(c) 2008 - 2010 Intel Corporation. All rights reserved. | 8 | * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved. |
9 | * | 9 | * |
10 | * This program is free software; you can redistribute it and/or modify | 10 | * This program is free software; you can redistribute it and/or modify |
11 | * it under the terms of version 2 of the GNU General Public License as | 11 | * it under the terms of version 2 of the GNU General Public License as |
@@ -30,7 +30,7 @@ | |||
30 | * | 30 | * |
31 | * BSD LICENSE | 31 | * BSD LICENSE |
32 | * | 32 | * |
33 | * Copyright(c) 2005 - 2010 Intel Corporation. All rights reserved. | 33 | * Copyright(c) 2005 - 2011 Intel Corporation. All rights reserved. |
34 | * All rights reserved. | 34 | * All rights reserved. |
35 | * | 35 | * |
36 | * Redistribution and use in source and binary forms, with or without | 36 | * Redistribution and use in source and binary forms, with or without |
@@ -188,18 +188,16 @@ static void iwl_set_otp_access(struct iwl_priv *priv, enum iwl_access_mode mode) | |||
188 | CSR_OTP_GP_REG_OTP_ACCESS_MODE); | 188 | CSR_OTP_GP_REG_OTP_ACCESS_MODE); |
189 | } | 189 | } |
190 | 190 | ||
191 | static int iwlcore_get_nvm_type(struct iwl_priv *priv) | 191 | static int iwlcore_get_nvm_type(struct iwl_priv *priv, u32 hw_rev) |
192 | { | 192 | { |
193 | u32 otpgp; | 193 | u32 otpgp; |
194 | int nvm_type; | 194 | int nvm_type; |
195 | 195 | ||
196 | /* OTP only valid for CP/PP and after */ | 196 | /* OTP only valid for CP/PP and after */ |
197 | switch (priv->hw_rev & CSR_HW_REV_TYPE_MSK) { | 197 | switch (hw_rev & CSR_HW_REV_TYPE_MSK) { |
198 | case CSR_HW_REV_TYPE_NONE: | 198 | case CSR_HW_REV_TYPE_NONE: |
199 | IWL_ERR(priv, "Unknown hardware type\n"); | 199 | IWL_ERR(priv, "Unknown hardware type\n"); |
200 | return -ENOENT; | 200 | return -ENOENT; |
201 | case CSR_HW_REV_TYPE_3945: | ||
202 | case CSR_HW_REV_TYPE_4965: | ||
203 | case CSR_HW_REV_TYPE_5300: | 201 | case CSR_HW_REV_TYPE_5300: |
204 | case CSR_HW_REV_TYPE_5350: | 202 | case CSR_HW_REV_TYPE_5350: |
205 | case CSR_HW_REV_TYPE_5100: | 203 | case CSR_HW_REV_TYPE_5100: |
@@ -228,15 +226,15 @@ static int iwl_init_otp_access(struct iwl_priv *priv) | |||
228 | int ret; | 226 | int ret; |
229 | 227 | ||
230 | /* Enable 40MHz radio clock */ | 228 | /* Enable 40MHz radio clock */ |
231 | _iwl_write32(priv, CSR_GP_CNTRL, | 229 | iwl_write32(priv, CSR_GP_CNTRL, |
232 | _iwl_read32(priv, CSR_GP_CNTRL) | | 230 | iwl_read32(priv, CSR_GP_CNTRL) | |
233 | CSR_GP_CNTRL_REG_FLAG_INIT_DONE); | 231 | CSR_GP_CNTRL_REG_FLAG_INIT_DONE); |
234 | 232 | ||
235 | /* wait for clock to be ready */ | 233 | /* wait for clock to be ready */ |
236 | ret = iwl_poll_bit(priv, CSR_GP_CNTRL, | 234 | ret = iwl_poll_bit(priv, CSR_GP_CNTRL, |
237 | CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY, | 235 | CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY, |
238 | CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY, | 236 | CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY, |
239 | 25000); | 237 | 25000); |
240 | if (ret < 0) | 238 | if (ret < 0) |
241 | IWL_ERR(priv, "Time out access OTP\n"); | 239 | IWL_ERR(priv, "Time out access OTP\n"); |
242 | else { | 240 | else { |
@@ -263,17 +261,17 @@ static int iwl_read_otp_word(struct iwl_priv *priv, u16 addr, __le16 *eeprom_dat | |||
263 | u32 r; | 261 | u32 r; |
264 | u32 otpgp; | 262 | u32 otpgp; |
265 | 263 | ||
266 | _iwl_write32(priv, CSR_EEPROM_REG, | 264 | iwl_write32(priv, CSR_EEPROM_REG, |
267 | CSR_EEPROM_REG_MSK_ADDR & (addr << 1)); | 265 | CSR_EEPROM_REG_MSK_ADDR & (addr << 1)); |
268 | ret = iwl_poll_bit(priv, CSR_EEPROM_REG, | 266 | ret = iwl_poll_bit(priv, CSR_EEPROM_REG, |
269 | CSR_EEPROM_REG_READ_VALID_MSK, | 267 | CSR_EEPROM_REG_READ_VALID_MSK, |
270 | CSR_EEPROM_REG_READ_VALID_MSK, | 268 | CSR_EEPROM_REG_READ_VALID_MSK, |
271 | IWL_EEPROM_ACCESS_TIMEOUT); | 269 | IWL_EEPROM_ACCESS_TIMEOUT); |
272 | if (ret < 0) { | 270 | if (ret < 0) { |
273 | IWL_ERR(priv, "Time out reading OTP[%d]\n", addr); | 271 | IWL_ERR(priv, "Time out reading OTP[%d]\n", addr); |
274 | return ret; | 272 | return ret; |
275 | } | 273 | } |
276 | r = _iwl_read_direct32(priv, CSR_EEPROM_REG); | 274 | r = iwl_read32(priv, CSR_EEPROM_REG); |
277 | /* check for ECC errors: */ | 275 | /* check for ECC errors: */ |
278 | otpgp = iwl_read32(priv, CSR_OTP_GP_REG); | 276 | otpgp = iwl_read32(priv, CSR_OTP_GP_REG); |
279 | if (otpgp & CSR_OTP_GP_REG_ECC_UNCORR_STATUS_MSK) { | 277 | if (otpgp & CSR_OTP_GP_REG_ECC_UNCORR_STATUS_MSK) { |
@@ -396,7 +394,7 @@ u16 iwl_eeprom_query16(const struct iwl_priv *priv, size_t offset) | |||
396 | * | 394 | * |
397 | * NOTE: This routine uses the non-debug IO access functions. | 395 | * NOTE: This routine uses the non-debug IO access functions. |
398 | */ | 396 | */ |
399 | int iwl_eeprom_init(struct iwl_priv *priv) | 397 | int iwl_eeprom_init(struct iwl_priv *priv, u32 hw_rev) |
400 | { | 398 | { |
401 | __le16 *e; | 399 | __le16 *e; |
402 | u32 gp = iwl_read32(priv, CSR_EEPROM_GP); | 400 | u32 gp = iwl_read32(priv, CSR_EEPROM_GP); |
@@ -406,7 +404,7 @@ int iwl_eeprom_init(struct iwl_priv *priv) | |||
406 | u16 validblockaddr = 0; | 404 | u16 validblockaddr = 0; |
407 | u16 cache_addr = 0; | 405 | u16 cache_addr = 0; |
408 | 406 | ||
409 | priv->nvm_device_type = iwlcore_get_nvm_type(priv); | 407 | priv->nvm_device_type = iwlcore_get_nvm_type(priv, hw_rev); |
410 | if (priv->nvm_device_type == -ENOENT) | 408 | if (priv->nvm_device_type == -ENOENT) |
411 | return -ENOENT; | 409 | return -ENOENT; |
412 | /* allocate eeprom */ | 410 | /* allocate eeprom */ |
@@ -444,9 +442,9 @@ int iwl_eeprom_init(struct iwl_priv *priv) | |||
444 | ret = -ENOENT; | 442 | ret = -ENOENT; |
445 | goto done; | 443 | goto done; |
446 | } | 444 | } |
447 | _iwl_write32(priv, CSR_EEPROM_GP, | 445 | iwl_write32(priv, CSR_EEPROM_GP, |
448 | iwl_read32(priv, CSR_EEPROM_GP) & | 446 | iwl_read32(priv, CSR_EEPROM_GP) & |
449 | ~CSR_EEPROM_GP_IF_OWNER_MSK); | 447 | ~CSR_EEPROM_GP_IF_OWNER_MSK); |
450 | 448 | ||
451 | iwl_set_bit(priv, CSR_OTP_GP_REG, | 449 | iwl_set_bit(priv, CSR_OTP_GP_REG, |
452 | CSR_OTP_GP_REG_ECC_CORR_STATUS_MSK | | 450 | CSR_OTP_GP_REG_ECC_CORR_STATUS_MSK | |
@@ -473,8 +471,8 @@ int iwl_eeprom_init(struct iwl_priv *priv) | |||
473 | for (addr = 0; addr < sz; addr += sizeof(u16)) { | 471 | for (addr = 0; addr < sz; addr += sizeof(u16)) { |
474 | u32 r; | 472 | u32 r; |
475 | 473 | ||
476 | _iwl_write32(priv, CSR_EEPROM_REG, | 474 | iwl_write32(priv, CSR_EEPROM_REG, |
477 | CSR_EEPROM_REG_MSK_ADDR & (addr << 1)); | 475 | CSR_EEPROM_REG_MSK_ADDR & (addr << 1)); |
478 | 476 | ||
479 | ret = iwl_poll_bit(priv, CSR_EEPROM_REG, | 477 | ret = iwl_poll_bit(priv, CSR_EEPROM_REG, |
480 | CSR_EEPROM_REG_READ_VALID_MSK, | 478 | CSR_EEPROM_REG_READ_VALID_MSK, |
@@ -484,7 +482,7 @@ int iwl_eeprom_init(struct iwl_priv *priv) | |||
484 | IWL_ERR(priv, "Time out reading EEPROM[%d]\n", addr); | 482 | IWL_ERR(priv, "Time out reading EEPROM[%d]\n", addr); |
485 | goto done; | 483 | goto done; |
486 | } | 484 | } |
487 | r = _iwl_read_direct32(priv, CSR_EEPROM_REG); | 485 | r = iwl_read32(priv, CSR_EEPROM_REG); |
488 | e[addr / 2] = cpu_to_le16(r >> 16); | 486 | e[addr / 2] = cpu_to_le16(r >> 16); |
489 | } | 487 | } |
490 | } | 488 | } |