diff options
| author | Akeem G. Abodunrin <akeem.g.abodunrin@intel.com> | 2013-01-29 05:15:00 -0500 |
|---|---|---|
| committer | Jeff Kirsher <jeffrey.t.kirsher@intel.com> | 2013-02-15 04:40:25 -0500 |
| commit | 56d8c27f6f406f2d232caedb1e60f28eafc8c9d7 (patch) | |
| tree | e06e3edc974636ba6df0a03f6d6f3480f772e64b | |
| parent | 73bfcd9a2d38cc4b0a482ce8cbdf67b0fc85aa46 (diff) | |
igb: Initialize NVM function pointers
This patch initializes NVM function pointers for device configuration.
Signed-off-by: Akeem G Abodunrin <akeem.g.abodunrin@intel.com>
Tested-by: Aaron Brown <aaron.f.brown@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
| -rw-r--r-- | drivers/net/ethernet/intel/igb/e1000_82575.c | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/drivers/net/ethernet/intel/igb/e1000_82575.c b/drivers/net/ethernet/intel/igb/e1000_82575.c index fc69414f8250..e59fc9bb9955 100644 --- a/drivers/net/ethernet/intel/igb/e1000_82575.c +++ b/drivers/net/ethernet/intel/igb/e1000_82575.c | |||
| @@ -223,6 +223,115 @@ out: | |||
| 223 | return ret_val; | 223 | return ret_val; |
| 224 | } | 224 | } |
| 225 | 225 | ||
| 226 | /** | ||
| 227 | * igb_init_nvm_params_82575 - Init NVM func ptrs. | ||
| 228 | * @hw: pointer to the HW structure | ||
| 229 | **/ | ||
| 230 | s32 igb_init_nvm_params_82575(struct e1000_hw *hw) | ||
| 231 | { | ||
| 232 | struct e1000_nvm_info *nvm = &hw->nvm; | ||
| 233 | u32 eecd = rd32(E1000_EECD); | ||
| 234 | u16 size; | ||
| 235 | |||
| 236 | size = (u16)((eecd & E1000_EECD_SIZE_EX_MASK) >> | ||
| 237 | E1000_EECD_SIZE_EX_SHIFT); | ||
| 238 | /* Added to a constant, "size" becomes the left-shift value | ||
| 239 | * for setting word_size. | ||
| 240 | */ | ||
| 241 | size += NVM_WORD_SIZE_BASE_SHIFT; | ||
| 242 | |||
| 243 | /* Just in case size is out of range, cap it to the largest | ||
| 244 | * EEPROM size supported | ||
| 245 | */ | ||
| 246 | if (size > 15) | ||
| 247 | size = 15; | ||
| 248 | |||
| 249 | nvm->word_size = 1 << size; | ||
| 250 | if (hw->mac.type < e1000_i210) { | ||
| 251 | nvm->opcode_bits = 8; | ||
| 252 | nvm->delay_usec = 1; | ||
| 253 | |||
| 254 | switch (nvm->override) { | ||
| 255 | case e1000_nvm_override_spi_large: | ||
| 256 | nvm->page_size = 32; | ||
| 257 | nvm->address_bits = 16; | ||
| 258 | break; | ||
| 259 | case e1000_nvm_override_spi_small: | ||
| 260 | nvm->page_size = 8; | ||
| 261 | nvm->address_bits = 8; | ||
| 262 | break; | ||
| 263 | default: | ||
| 264 | nvm->page_size = eecd & E1000_EECD_ADDR_BITS ? 32 : 8; | ||
| 265 | nvm->address_bits = eecd & E1000_EECD_ADDR_BITS ? | ||
| 266 | 16 : 8; | ||
| 267 | break; | ||
| 268 | } | ||
| 269 | if (nvm->word_size == (1 << 15)) | ||
| 270 | nvm->page_size = 128; | ||
| 271 | |||
| 272 | nvm->type = e1000_nvm_eeprom_spi; | ||
| 273 | } else { | ||
| 274 | nvm->type = e1000_nvm_flash_hw; | ||
| 275 | } | ||
| 276 | |||
| 277 | /* NVM Function Pointers */ | ||
| 278 | switch (hw->mac.type) { | ||
| 279 | case e1000_82580: | ||
| 280 | nvm->ops.validate = igb_validate_nvm_checksum_82580; | ||
| 281 | nvm->ops.update = igb_update_nvm_checksum_82580; | ||
| 282 | nvm->ops.acquire = igb_acquire_nvm_82575; | ||
| 283 | nvm->ops.release = igb_release_nvm_82575; | ||
| 284 | if (nvm->word_size < (1 << 15)) | ||
| 285 | nvm->ops.read = igb_read_nvm_eerd; | ||
| 286 | else | ||
| 287 | nvm->ops.read = igb_read_nvm_spi; | ||
| 288 | nvm->ops.write = igb_write_nvm_spi; | ||
| 289 | break; | ||
| 290 | case e1000_i350: | ||
| 291 | nvm->ops.validate = igb_validate_nvm_checksum_i350; | ||
| 292 | nvm->ops.update = igb_update_nvm_checksum_i350; | ||
| 293 | nvm->ops.acquire = igb_acquire_nvm_82575; | ||
| 294 | nvm->ops.release = igb_release_nvm_82575; | ||
| 295 | if (nvm->word_size < (1 << 15)) | ||
| 296 | nvm->ops.read = igb_read_nvm_eerd; | ||
| 297 | else | ||
| 298 | nvm->ops.read = igb_read_nvm_spi; | ||
| 299 | nvm->ops.write = igb_write_nvm_spi; | ||
| 300 | break; | ||
| 301 | case e1000_i210: | ||
| 302 | nvm->ops.validate = igb_validate_nvm_checksum_i210; | ||
| 303 | nvm->ops.update = igb_update_nvm_checksum_i210; | ||
| 304 | nvm->ops.acquire = igb_acquire_nvm_i210; | ||
| 305 | nvm->ops.release = igb_release_nvm_i210; | ||
| 306 | nvm->ops.read = igb_read_nvm_srrd_i210; | ||
| 307 | nvm->ops.write = igb_write_nvm_srwr_i210; | ||
| 308 | nvm->ops.valid_led_default = igb_valid_led_default_i210; | ||
| 309 | break; | ||
| 310 | case e1000_i211: | ||
| 311 | nvm->ops.acquire = igb_acquire_nvm_i210; | ||
| 312 | nvm->ops.release = igb_release_nvm_i210; | ||
| 313 | nvm->ops.read = igb_read_nvm_i211; | ||
| 314 | nvm->ops.valid_led_default = igb_valid_led_default_i210; | ||
| 315 | nvm->ops.validate = NULL; | ||
| 316 | nvm->ops.update = NULL; | ||
| 317 | nvm->ops.write = NULL; | ||
| 318 | break; | ||
| 319 | default: | ||
| 320 | nvm->ops.validate = igb_validate_nvm_checksum; | ||
| 321 | nvm->ops.update = igb_update_nvm_checksum; | ||
| 322 | nvm->ops.acquire = igb_acquire_nvm_82575; | ||
| 323 | nvm->ops.release = igb_release_nvm_82575; | ||
| 324 | if (nvm->word_size < (1 << 15)) | ||
| 325 | nvm->ops.read = igb_read_nvm_eerd; | ||
| 326 | else | ||
| 327 | nvm->ops.read = igb_read_nvm_spi; | ||
| 328 | nvm->ops.write = igb_write_nvm_spi; | ||
| 329 | break; | ||
| 330 | } | ||
| 331 | |||
| 332 | return 0; | ||
| 333 | } | ||
| 334 | |||
| 226 | static s32 igb_get_invariants_82575(struct e1000_hw *hw) | 335 | static s32 igb_get_invariants_82575(struct e1000_hw *hw) |
| 227 | { | 336 | { |
| 228 | struct e1000_phy_info *phy = &hw->phy; | 337 | struct e1000_phy_info *phy = &hw->phy; |
