diff options
Diffstat (limited to 'drivers/net/ethernet/intel/igb/e1000_82575.c')
-rw-r--r-- | drivers/net/ethernet/intel/igb/e1000_82575.c | 106 |
1 files changed, 41 insertions, 65 deletions
diff --git a/drivers/net/ethernet/intel/igb/e1000_82575.c b/drivers/net/ethernet/intel/igb/e1000_82575.c index 9057d10a698a..8d79face0717 100644 --- a/drivers/net/ethernet/intel/igb/e1000_82575.c +++ b/drivers/net/ethernet/intel/igb/e1000_82575.c | |||
@@ -238,6 +238,7 @@ static s32 igb_init_nvm_params_82575(struct e1000_hw *hw) | |||
238 | 238 | ||
239 | size = (u16)((eecd & E1000_EECD_SIZE_EX_MASK) >> | 239 | size = (u16)((eecd & E1000_EECD_SIZE_EX_MASK) >> |
240 | E1000_EECD_SIZE_EX_SHIFT); | 240 | E1000_EECD_SIZE_EX_SHIFT); |
241 | |||
241 | /* Added to a constant, "size" becomes the left-shift value | 242 | /* Added to a constant, "size" becomes the left-shift value |
242 | * for setting word_size. | 243 | * for setting word_size. |
243 | */ | 244 | */ |
@@ -250,86 +251,52 @@ static s32 igb_init_nvm_params_82575(struct e1000_hw *hw) | |||
250 | size = 15; | 251 | size = 15; |
251 | 252 | ||
252 | nvm->word_size = 1 << size; | 253 | nvm->word_size = 1 << size; |
253 | if (hw->mac.type < e1000_i210) { | 254 | nvm->opcode_bits = 8; |
254 | nvm->opcode_bits = 8; | 255 | nvm->delay_usec = 1; |
255 | nvm->delay_usec = 1; | ||
256 | |||
257 | switch (nvm->override) { | ||
258 | case e1000_nvm_override_spi_large: | ||
259 | nvm->page_size = 32; | ||
260 | nvm->address_bits = 16; | ||
261 | break; | ||
262 | case e1000_nvm_override_spi_small: | ||
263 | nvm->page_size = 8; | ||
264 | nvm->address_bits = 8; | ||
265 | break; | ||
266 | default: | ||
267 | nvm->page_size = eecd & E1000_EECD_ADDR_BITS ? 32 : 8; | ||
268 | nvm->address_bits = eecd & E1000_EECD_ADDR_BITS ? | ||
269 | 16 : 8; | ||
270 | break; | ||
271 | } | ||
272 | if (nvm->word_size == (1 << 15)) | ||
273 | nvm->page_size = 128; | ||
274 | 256 | ||
275 | nvm->type = e1000_nvm_eeprom_spi; | 257 | switch (nvm->override) { |
276 | } else { | 258 | case e1000_nvm_override_spi_large: |
277 | nvm->type = e1000_nvm_flash_hw; | 259 | nvm->page_size = 32; |
260 | nvm->address_bits = 16; | ||
261 | break; | ||
262 | case e1000_nvm_override_spi_small: | ||
263 | nvm->page_size = 8; | ||
264 | nvm->address_bits = 8; | ||
265 | break; | ||
266 | default: | ||
267 | nvm->page_size = eecd & E1000_EECD_ADDR_BITS ? 32 : 8; | ||
268 | nvm->address_bits = eecd & E1000_EECD_ADDR_BITS ? | ||
269 | 16 : 8; | ||
270 | break; | ||
278 | } | 271 | } |
272 | if (nvm->word_size == (1 << 15)) | ||
273 | nvm->page_size = 128; | ||
274 | |||
275 | nvm->type = e1000_nvm_eeprom_spi; | ||
279 | 276 | ||
280 | /* NVM Function Pointers */ | 277 | /* NVM Function Pointers */ |
278 | nvm->ops.acquire = igb_acquire_nvm_82575; | ||
279 | nvm->ops.release = igb_release_nvm_82575; | ||
280 | nvm->ops.write = igb_write_nvm_spi; | ||
281 | nvm->ops.validate = igb_validate_nvm_checksum; | ||
282 | nvm->ops.update = igb_update_nvm_checksum; | ||
283 | if (nvm->word_size < (1 << 15)) | ||
284 | nvm->ops.read = igb_read_nvm_eerd; | ||
285 | else | ||
286 | nvm->ops.read = igb_read_nvm_spi; | ||
287 | |||
288 | /* override generic family function pointers for specific descendants */ | ||
281 | switch (hw->mac.type) { | 289 | switch (hw->mac.type) { |
282 | case e1000_82580: | 290 | case e1000_82580: |
283 | nvm->ops.validate = igb_validate_nvm_checksum_82580; | 291 | nvm->ops.validate = igb_validate_nvm_checksum_82580; |
284 | nvm->ops.update = igb_update_nvm_checksum_82580; | 292 | nvm->ops.update = igb_update_nvm_checksum_82580; |
285 | nvm->ops.acquire = igb_acquire_nvm_82575; | ||
286 | nvm->ops.release = igb_release_nvm_82575; | ||
287 | if (nvm->word_size < (1 << 15)) | ||
288 | nvm->ops.read = igb_read_nvm_eerd; | ||
289 | else | ||
290 | nvm->ops.read = igb_read_nvm_spi; | ||
291 | nvm->ops.write = igb_write_nvm_spi; | ||
292 | break; | 293 | break; |
293 | case e1000_i354: | 294 | case e1000_i354: |
294 | case e1000_i350: | 295 | case e1000_i350: |
295 | nvm->ops.validate = igb_validate_nvm_checksum_i350; | 296 | nvm->ops.validate = igb_validate_nvm_checksum_i350; |
296 | nvm->ops.update = igb_update_nvm_checksum_i350; | 297 | nvm->ops.update = igb_update_nvm_checksum_i350; |
297 | nvm->ops.acquire = igb_acquire_nvm_82575; | ||
298 | nvm->ops.release = igb_release_nvm_82575; | ||
299 | if (nvm->word_size < (1 << 15)) | ||
300 | nvm->ops.read = igb_read_nvm_eerd; | ||
301 | else | ||
302 | nvm->ops.read = igb_read_nvm_spi; | ||
303 | nvm->ops.write = igb_write_nvm_spi; | ||
304 | break; | ||
305 | case e1000_i210: | ||
306 | nvm->ops.validate = igb_validate_nvm_checksum_i210; | ||
307 | nvm->ops.update = igb_update_nvm_checksum_i210; | ||
308 | nvm->ops.acquire = igb_acquire_nvm_i210; | ||
309 | nvm->ops.release = igb_release_nvm_i210; | ||
310 | nvm->ops.read = igb_read_nvm_srrd_i210; | ||
311 | nvm->ops.write = igb_write_nvm_srwr_i210; | ||
312 | nvm->ops.valid_led_default = igb_valid_led_default_i210; | ||
313 | break; | ||
314 | case e1000_i211: | ||
315 | nvm->ops.acquire = igb_acquire_nvm_i210; | ||
316 | nvm->ops.release = igb_release_nvm_i210; | ||
317 | nvm->ops.read = igb_read_nvm_i211; | ||
318 | nvm->ops.valid_led_default = igb_valid_led_default_i210; | ||
319 | nvm->ops.validate = NULL; | ||
320 | nvm->ops.update = NULL; | ||
321 | nvm->ops.write = NULL; | ||
322 | break; | 298 | break; |
323 | default: | 299 | default: |
324 | nvm->ops.validate = igb_validate_nvm_checksum; | ||
325 | nvm->ops.update = igb_update_nvm_checksum; | ||
326 | nvm->ops.acquire = igb_acquire_nvm_82575; | ||
327 | nvm->ops.release = igb_release_nvm_82575; | ||
328 | if (nvm->word_size < (1 << 15)) | ||
329 | nvm->ops.read = igb_read_nvm_eerd; | ||
330 | else | ||
331 | nvm->ops.read = igb_read_nvm_spi; | ||
332 | nvm->ops.write = igb_write_nvm_spi; | ||
333 | break; | 300 | break; |
334 | } | 301 | } |
335 | 302 | ||
@@ -601,6 +568,15 @@ static s32 igb_get_invariants_82575(struct e1000_hw *hw) | |||
601 | 568 | ||
602 | /* NVM initialization */ | 569 | /* NVM initialization */ |
603 | ret_val = igb_init_nvm_params_82575(hw); | 570 | ret_val = igb_init_nvm_params_82575(hw); |
571 | switch (hw->mac.type) { | ||
572 | case e1000_i210: | ||
573 | case e1000_i211: | ||
574 | ret_val = igb_init_nvm_params_i210(hw); | ||
575 | break; | ||
576 | default: | ||
577 | break; | ||
578 | } | ||
579 | |||
604 | if (ret_val) | 580 | if (ret_val) |
605 | goto out; | 581 | goto out; |
606 | 582 | ||