1 /*******************************************************************************
2 
3   Intel(R) Gigabit Ethernet Linux driver
4   Copyright(c) 2007-2012 Intel Corporation.
5 
6   This program is free software; you can redistribute it and/or modify it
7   under the terms and conditions of the GNU General Public License,
8   version 2, as published by the Free Software Foundation.
9 
10   This program is distributed in the hope it will be useful, but WITHOUT
11   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12   FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
13   more details.
14 
15   You should have received a copy of the GNU General Public License along with
16   this program; if not, write to the Free Software Foundation, Inc.,
17   51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
18 
19   The full GNU General Public License is included in this distribution in
20   the file called "COPYING".
21 
22   Contact Information:
23   e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
24   Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
25 
26 ******************************************************************************/
27 
28 /* e1000_i210
29  * e1000_i211
30  */
31 
32 #include <linux/types.h>
33 #include <linux/if_ether.h>
34 
35 #include "e1000_hw.h"
36 #include "e1000_i210.h"
37 
38 static s32 igb_get_hw_semaphore_i210(struct e1000_hw *hw);
39 static void igb_put_hw_semaphore_i210(struct e1000_hw *hw);
40 static s32 igb_write_nvm_srwr(struct e1000_hw *hw, u16 offset, u16 words,
41 				u16 *data);
42 static s32 igb_pool_flash_update_done_i210(struct e1000_hw *hw);
43 
44 /**
45  *  igb_acquire_nvm_i210 - Request for access to EEPROM
46  *  @hw: pointer to the HW structure
47  *
48  *  Acquire the necessary semaphores for exclusive access to the EEPROM.
49  *  Set the EEPROM access request bit and wait for EEPROM access grant bit.
50  *  Return successful if access grant bit set, else clear the request for
51  *  EEPROM access and return -E1000_ERR_NVM (-1).
52  **/
53 s32 igb_acquire_nvm_i210(struct e1000_hw *hw)
54 {
55 	return igb_acquire_swfw_sync_i210(hw, E1000_SWFW_EEP_SM);
56 }
57 
58 /**
59  *  igb_release_nvm_i210 - Release exclusive access to EEPROM
60  *  @hw: pointer to the HW structure
61  *
62  *  Stop any current commands to the EEPROM and clear the EEPROM request bit,
63  *  then release the semaphores acquired.
64  **/
65 void igb_release_nvm_i210(struct e1000_hw *hw)
66 {
67 	igb_release_swfw_sync_i210(hw, E1000_SWFW_EEP_SM);
68 }
69 
70 /**
71  *  igb_acquire_swfw_sync_i210 - Acquire SW/FW semaphore
72  *  @hw: pointer to the HW structure
73  *  @mask: specifies which semaphore to acquire
74  *
75  *  Acquire the SW/FW semaphore to access the PHY or NVM.  The mask
76  *  will also specify which port we're acquiring the lock for.
77  **/
78 s32 igb_acquire_swfw_sync_i210(struct e1000_hw *hw, u16 mask)
79 {
80 	u32 swfw_sync;
81 	u32 swmask = mask;
82 	u32 fwmask = mask << 16;
83 	s32 ret_val = E1000_SUCCESS;
84 	s32 i = 0, timeout = 200; /* FIXME: find real value to use here */
85 
86 	while (i < timeout) {
87 		if (igb_get_hw_semaphore_i210(hw)) {
88 			ret_val = -E1000_ERR_SWFW_SYNC;
89 			goto out;
90 		}
91 
92 		swfw_sync = rd32(E1000_SW_FW_SYNC);
93 		if (!(swfw_sync & fwmask))
94 			break;
95 
96 		/*
97 		 * Firmware currently using resource (fwmask)
98 		 */
99 		igb_put_hw_semaphore_i210(hw);
100 		mdelay(5);
101 		i++;
102 	}
103 
104 	if (i == timeout) {
105 		hw_dbg("Driver can't access resource, SW_FW_SYNC timeout.\n");
106 		ret_val = -E1000_ERR_SWFW_SYNC;
107 		goto out;
108 	}
109 
110 	swfw_sync |= swmask;
111 	wr32(E1000_SW_FW_SYNC, swfw_sync);
112 
113 	igb_put_hw_semaphore_i210(hw);
114 out:
115 	return ret_val;
116 }
117 
118 /**
119  *  igb_release_swfw_sync_i210 - Release SW/FW semaphore
120  *  @hw: pointer to the HW structure
121  *  @mask: specifies which semaphore to acquire
122  *
123  *  Release the SW/FW semaphore used to access the PHY or NVM.  The mask
124  *  will also specify which port we're releasing the lock for.
125  **/
126 void igb_release_swfw_sync_i210(struct e1000_hw *hw, u16 mask)
127 {
128 	u32 swfw_sync;
129 
130 	while (igb_get_hw_semaphore_i210(hw) != E1000_SUCCESS)
131 		; /* Empty */
132 
133 	swfw_sync = rd32(E1000_SW_FW_SYNC);
134 	swfw_sync &= ~mask;
135 	wr32(E1000_SW_FW_SYNC, swfw_sync);
136 
137 	igb_put_hw_semaphore_i210(hw);
138 }
139 
140 /**
141  *  igb_get_hw_semaphore_i210 - Acquire hardware semaphore
142  *  @hw: pointer to the HW structure
143  *
144  *  Acquire the HW semaphore to access the PHY or NVM
145  **/
146 static s32 igb_get_hw_semaphore_i210(struct e1000_hw *hw)
147 {
148 	u32 swsm;
149 	s32 ret_val = E1000_SUCCESS;
150 	s32 timeout = hw->nvm.word_size + 1;
151 	s32 i = 0;
152 
153 	/* Get the FW semaphore. */
154 	for (i = 0; i < timeout; i++) {
155 		swsm = rd32(E1000_SWSM);
156 		wr32(E1000_SWSM, swsm | E1000_SWSM_SWESMBI);
157 
158 		/* Semaphore acquired if bit latched */
159 		if (rd32(E1000_SWSM) & E1000_SWSM_SWESMBI)
160 			break;
161 
162 		udelay(50);
163 	}
164 
165 	if (i == timeout) {
166 		/* Release semaphores */
167 		igb_put_hw_semaphore(hw);
168 		hw_dbg("Driver can't access the NVM\n");
169 		ret_val = -E1000_ERR_NVM;
170 		goto out;
171 	}
172 
173 out:
174 	return ret_val;
175 }
176 
177 /**
178  *  igb_put_hw_semaphore_i210 - Release hardware semaphore
179  *  @hw: pointer to the HW structure
180  *
181  *  Release hardware semaphore used to access the PHY or NVM
182  **/
183 static void igb_put_hw_semaphore_i210(struct e1000_hw *hw)
184 {
185 	u32 swsm;
186 
187 	swsm = rd32(E1000_SWSM);
188 
189 	swsm &= ~E1000_SWSM_SWESMBI;
190 
191 	wr32(E1000_SWSM, swsm);
192 }
193 
194 /**
195  *  igb_read_nvm_srrd_i210 - Reads Shadow Ram using EERD register
196  *  @hw: pointer to the HW structure
197  *  @offset: offset of word in the Shadow Ram to read
198  *  @words: number of words to read
199  *  @data: word read from the Shadow Ram
200  *
201  *  Reads a 16 bit word from the Shadow Ram using the EERD register.
202  *  Uses necessary synchronization semaphores.
203  **/
204 s32 igb_read_nvm_srrd_i210(struct e1000_hw *hw, u16 offset, u16 words,
205 			     u16 *data)
206 {
207 	s32 status = E1000_SUCCESS;
208 	u16 i, count;
209 
210 	/* We cannot hold synchronization semaphores for too long,
211 	 * because of forceful takeover procedure. However it is more efficient
212 	 * to read in bursts than synchronizing access for each word. */
213 	for (i = 0; i < words; i += E1000_EERD_EEWR_MAX_COUNT) {
214 		count = (words - i) / E1000_EERD_EEWR_MAX_COUNT > 0 ?
215 			E1000_EERD_EEWR_MAX_COUNT : (words - i);
216 		if (hw->nvm.ops.acquire(hw) == E1000_SUCCESS) {
217 			status = igb_read_nvm_eerd(hw, offset, count,
218 						     data + i);
219 			hw->nvm.ops.release(hw);
220 		} else {
221 			status = E1000_ERR_SWFW_SYNC;
222 		}
223 
224 		if (status != E1000_SUCCESS)
225 			break;
226 	}
227 
228 	return status;
229 }
230 
231 /**
232  *  igb_write_nvm_srwr_i210 - Write to Shadow RAM using EEWR
233  *  @hw: pointer to the HW structure
234  *  @offset: offset within the Shadow RAM to be written to
235  *  @words: number of words to write
236  *  @data: 16 bit word(s) to be written to the Shadow RAM
237  *
238  *  Writes data to Shadow RAM at offset using EEWR register.
239  *
240  *  If e1000_update_nvm_checksum is not called after this function , the
241  *  data will not be committed to FLASH and also Shadow RAM will most likely
242  *  contain an invalid checksum.
243  *
244  *  If error code is returned, data and Shadow RAM may be inconsistent - buffer
245  *  partially written.
246  **/
247 s32 igb_write_nvm_srwr_i210(struct e1000_hw *hw, u16 offset, u16 words,
248 			      u16 *data)
249 {
250 	s32 status = E1000_SUCCESS;
251 	u16 i, count;
252 
253 	/* We cannot hold synchronization semaphores for too long,
254 	 * because of forceful takeover procedure. However it is more efficient
255 	 * to write in bursts than synchronizing access for each word. */
256 	for (i = 0; i < words; i += E1000_EERD_EEWR_MAX_COUNT) {
257 		count = (words - i) / E1000_EERD_EEWR_MAX_COUNT > 0 ?
258 			E1000_EERD_EEWR_MAX_COUNT : (words - i);
259 		if (hw->nvm.ops.acquire(hw) == E1000_SUCCESS) {
260 			status = igb_write_nvm_srwr(hw, offset, count,
261 						      data + i);
262 			hw->nvm.ops.release(hw);
263 		} else {
264 			status = E1000_ERR_SWFW_SYNC;
265 		}
266 
267 		if (status != E1000_SUCCESS)
268 			break;
269 	}
270 
271 	return status;
272 }
273 
274 /**
275  *  igb_write_nvm_srwr - Write to Shadow Ram using EEWR
276  *  @hw: pointer to the HW structure
277  *  @offset: offset within the Shadow Ram to be written to
278  *  @words: number of words to write
279  *  @data: 16 bit word(s) to be written to the Shadow Ram
280  *
281  *  Writes data to Shadow Ram at offset using EEWR register.
282  *
283  *  If igb_update_nvm_checksum is not called after this function , the
284  *  Shadow Ram will most likely contain an invalid checksum.
285  **/
286 static s32 igb_write_nvm_srwr(struct e1000_hw *hw, u16 offset, u16 words,
287 				u16 *data)
288 {
289 	struct e1000_nvm_info *nvm = &hw->nvm;
290 	u32 i, k, eewr = 0;
291 	u32 attempts = 100000;
292 	s32 ret_val = E1000_SUCCESS;
293 
294 	/*
295 	 * A check for invalid values:  offset too large, too many words,
296 	 * too many words for the offset, and not enough words.
297 	 */
298 	if ((offset >= nvm->word_size) || (words > (nvm->word_size - offset)) ||
299 	    (words == 0)) {
300 		hw_dbg("nvm parameter(s) out of bounds\n");
301 		ret_val = -E1000_ERR_NVM;
302 		goto out;
303 	}
304 
305 	for (i = 0; i < words; i++) {
306 		eewr = ((offset+i) << E1000_NVM_RW_ADDR_SHIFT) |
307 			(data[i] << E1000_NVM_RW_REG_DATA) |
308 			E1000_NVM_RW_REG_START;
309 
310 		wr32(E1000_SRWR, eewr);
311 
312 		for (k = 0; k < attempts; k++) {
313 			if (E1000_NVM_RW_REG_DONE &
314 			    rd32(E1000_SRWR)) {
315 				ret_val = E1000_SUCCESS;
316 				break;
317 			}
318 			udelay(5);
319 	}
320 
321 		if (ret_val != E1000_SUCCESS) {
322 			hw_dbg("Shadow RAM write EEWR timed out\n");
323 			break;
324 		}
325 	}
326 
327 out:
328 	return ret_val;
329 }
330 
331 /**
332  *  igb_read_nvm_i211 - Read NVM wrapper function for I211
333  *  @hw: pointer to the HW structure
334  *  @address: the word address (aka eeprom offset) to read
335  *  @data: pointer to the data read
336  *
337  *  Wrapper function to return data formerly found in the NVM.
338  **/
339 s32 igb_read_nvm_i211(struct e1000_hw *hw, u16 offset, u16 words,
340 			       u16 *data)
341 {
342 	s32 ret_val = E1000_SUCCESS;
343 
344 	/* Only the MAC addr is required to be present in the iNVM */
345 	switch (offset) {
346 	case NVM_MAC_ADDR:
347 		ret_val = igb_read_invm_i211(hw, offset, &data[0]);
348 		ret_val |= igb_read_invm_i211(hw, offset+1, &data[1]);
349 		ret_val |= igb_read_invm_i211(hw, offset+2, &data[2]);
350 		if (ret_val != E1000_SUCCESS)
351 			hw_dbg("MAC Addr not found in iNVM\n");
352 		break;
353 	case NVM_ID_LED_SETTINGS:
354 	case NVM_INIT_CTRL_2:
355 	case NVM_INIT_CTRL_4:
356 	case NVM_LED_1_CFG:
357 	case NVM_LED_0_2_CFG:
358 		igb_read_invm_i211(hw, offset, data);
359 		break;
360 	case NVM_COMPAT:
361 		*data = ID_LED_DEFAULT_I210;
362 		break;
363 	case NVM_SUB_DEV_ID:
364 		*data = hw->subsystem_device_id;
365 		break;
366 	case NVM_SUB_VEN_ID:
367 		*data = hw->subsystem_vendor_id;
368 		break;
369 	case NVM_DEV_ID:
370 		*data = hw->device_id;
371 		break;
372 	case NVM_VEN_ID:
373 		*data = hw->vendor_id;
374 		break;
375 	default:
376 		hw_dbg("NVM word 0x%02x is not mapped.\n", offset);
377 		*data = NVM_RESERVED_WORD;
378 		break;
379 	}
380 	return ret_val;
381 }
382 
383 /**
384  *  igb_read_invm_i211 - Reads OTP
385  *  @hw: pointer to the HW structure
386  *  @address: the word address (aka eeprom offset) to read
387  *  @data: pointer to the data read
388  *
389  *  Reads 16-bit words from the OTP. Return error when the word is not
390  *  stored in OTP.
391  **/
392 s32 igb_read_invm_i211(struct e1000_hw *hw, u16 address, u16 *data)
393 {
394 	s32 status = -E1000_ERR_INVM_VALUE_NOT_FOUND;
395 	u32 invm_dword;
396 	u16 i;
397 	u8 record_type, word_address;
398 
399 	for (i = 0; i < E1000_INVM_SIZE; i++) {
400 		invm_dword = rd32(E1000_INVM_DATA_REG(i));
401 		/* Get record type */
402 		record_type = INVM_DWORD_TO_RECORD_TYPE(invm_dword);
403 		if (record_type == E1000_INVM_UNINITIALIZED_STRUCTURE)
404 			break;
405 		if (record_type == E1000_INVM_CSR_AUTOLOAD_STRUCTURE)
406 			i += E1000_INVM_CSR_AUTOLOAD_DATA_SIZE_IN_DWORDS;
407 		if (record_type == E1000_INVM_RSA_KEY_SHA256_STRUCTURE)
408 			i += E1000_INVM_RSA_KEY_SHA256_DATA_SIZE_IN_DWORDS;
409 		if (record_type == E1000_INVM_WORD_AUTOLOAD_STRUCTURE) {
410 			word_address = INVM_DWORD_TO_WORD_ADDRESS(invm_dword);
411 			if (word_address == (u8)address) {
412 				*data = INVM_DWORD_TO_WORD_DATA(invm_dword);
413 				hw_dbg("Read INVM Word 0x%02x = %x",
414 					  address, *data);
415 				status = E1000_SUCCESS;
416 				break;
417 			}
418 		}
419 	}
420 	if (status != E1000_SUCCESS)
421 		hw_dbg("Requested word 0x%02x not found in OTP\n", address);
422 	return status;
423 }
424 
425 /**
426  *  igb_validate_nvm_checksum_i210 - Validate EEPROM checksum
427  *  @hw: pointer to the HW structure
428  *
429  *  Calculates the EEPROM checksum by reading/adding each word of the EEPROM
430  *  and then verifies that the sum of the EEPROM is equal to 0xBABA.
431  **/
432 s32 igb_validate_nvm_checksum_i210(struct e1000_hw *hw)
433 {
434 	s32 status = E1000_SUCCESS;
435 	s32 (*read_op_ptr)(struct e1000_hw *, u16, u16, u16 *);
436 
437 	if (hw->nvm.ops.acquire(hw) == E1000_SUCCESS) {
438 
439 		/*
440 		 * Replace the read function with semaphore grabbing with
441 		 * the one that skips this for a while.
442 		 * We have semaphore taken already here.
443 		 */
444 		read_op_ptr = hw->nvm.ops.read;
445 		hw->nvm.ops.read = igb_read_nvm_eerd;
446 
447 		status = igb_validate_nvm_checksum(hw);
448 
449 		/* Revert original read operation. */
450 		hw->nvm.ops.read = read_op_ptr;
451 
452 		hw->nvm.ops.release(hw);
453 	} else {
454 		status = E1000_ERR_SWFW_SYNC;
455 	}
456 
457 	return status;
458 }
459 
460 
461 /**
462  *  igb_update_nvm_checksum_i210 - Update EEPROM checksum
463  *  @hw: pointer to the HW structure
464  *
465  *  Updates the EEPROM checksum by reading/adding each word of the EEPROM
466  *  up to the checksum.  Then calculates the EEPROM checksum and writes the
467  *  value to the EEPROM. Next commit EEPROM data onto the Flash.
468  **/
469 s32 igb_update_nvm_checksum_i210(struct e1000_hw *hw)
470 {
471 	s32 ret_val = E1000_SUCCESS;
472 	u16 checksum = 0;
473 	u16 i, nvm_data;
474 
475 	/*
476 	 * Read the first word from the EEPROM. If this times out or fails, do
477 	 * not continue or we could be in for a very long wait while every
478 	 * EEPROM read fails
479 	 */
480 	ret_val = igb_read_nvm_eerd(hw, 0, 1, &nvm_data);
481 	if (ret_val != E1000_SUCCESS) {
482 		hw_dbg("EEPROM read failed\n");
483 		goto out;
484 	}
485 
486 	if (hw->nvm.ops.acquire(hw) == E1000_SUCCESS) {
487 		/*
488 		 * Do not use hw->nvm.ops.write, hw->nvm.ops.read
489 		 * because we do not want to take the synchronization
490 		 * semaphores twice here.
491 		 */
492 
493 		for (i = 0; i < NVM_CHECKSUM_REG; i++) {
494 			ret_val = igb_read_nvm_eerd(hw, i, 1, &nvm_data);
495 			if (ret_val) {
496 				hw->nvm.ops.release(hw);
497 				hw_dbg("NVM Read Error while updating checksum.\n");
498 				goto out;
499 			}
500 			checksum += nvm_data;
501 		}
502 		checksum = (u16) NVM_SUM - checksum;
503 		ret_val = igb_write_nvm_srwr(hw, NVM_CHECKSUM_REG, 1,
504 						&checksum);
505 		if (ret_val != E1000_SUCCESS) {
506 			hw->nvm.ops.release(hw);
507 			hw_dbg("NVM Write Error while updating checksum.\n");
508 			goto out;
509 		}
510 
511 		hw->nvm.ops.release(hw);
512 
513 		ret_val = igb_update_flash_i210(hw);
514 	} else {
515 		ret_val = -E1000_ERR_SWFW_SYNC;
516 	}
517 out:
518 	return ret_val;
519 }
520 
521 /**
522  *  igb_update_flash_i210 - Commit EEPROM to the flash
523  *  @hw: pointer to the HW structure
524  *
525  **/
526 s32 igb_update_flash_i210(struct e1000_hw *hw)
527 {
528 	s32 ret_val = E1000_SUCCESS;
529 	u32 flup;
530 
531 	ret_val = igb_pool_flash_update_done_i210(hw);
532 	if (ret_val == -E1000_ERR_NVM) {
533 		hw_dbg("Flash update time out\n");
534 		goto out;
535 	}
536 
537 	flup = rd32(E1000_EECD) | E1000_EECD_FLUPD_I210;
538 	wr32(E1000_EECD, flup);
539 
540 	ret_val = igb_pool_flash_update_done_i210(hw);
541 	if (ret_val == E1000_SUCCESS)
542 		hw_dbg("Flash update complete\n");
543 	else
544 		hw_dbg("Flash update time out\n");
545 
546 out:
547 	return ret_val;
548 }
549 
550 /**
551  *  igb_pool_flash_update_done_i210 - Pool FLUDONE status.
552  *  @hw: pointer to the HW structure
553  *
554  **/
555 s32 igb_pool_flash_update_done_i210(struct e1000_hw *hw)
556 {
557 	s32 ret_val = -E1000_ERR_NVM;
558 	u32 i, reg;
559 
560 	for (i = 0; i < E1000_FLUDONE_ATTEMPTS; i++) {
561 		reg = rd32(E1000_EECD);
562 		if (reg & E1000_EECD_FLUDONE_I210) {
563 			ret_val = E1000_SUCCESS;
564 			break;
565 		}
566 		udelay(5);
567 	}
568 
569 	return ret_val;
570 }
571 
572 /**
573  *  igb_valid_led_default_i210 - Verify a valid default LED config
574  *  @hw: pointer to the HW structure
575  *  @data: pointer to the NVM (EEPROM)
576  *
577  *  Read the EEPROM for the current default LED configuration.  If the
578  *  LED configuration is not valid, set to a valid LED configuration.
579  **/
580 s32 igb_valid_led_default_i210(struct e1000_hw *hw, u16 *data)
581 {
582 	s32 ret_val;
583 
584 	ret_val = hw->nvm.ops.read(hw, NVM_ID_LED_SETTINGS, 1, data);
585 	if (ret_val) {
586 		hw_dbg("NVM Read Error\n");
587 		goto out;
588 	}
589 
590 	if (*data == ID_LED_RESERVED_0000 || *data == ID_LED_RESERVED_FFFF) {
591 		switch (hw->phy.media_type) {
592 		case e1000_media_type_internal_serdes:
593 			*data = ID_LED_DEFAULT_I210_SERDES;
594 			break;
595 		case e1000_media_type_copper:
596 		default:
597 			*data = ID_LED_DEFAULT_I210;
598 			break;
599 		}
600 	}
601 out:
602 	return ret_val;
603 }
604