xref: /openbsd-src/sys/dev/pci/ixgb_ee.c (revision a28daedfc357b214be5c701aa8ba8adb29a7f1c2)
1 /*******************************************************************************
2 
3   Copyright (c) 2001-2005, Intel Corporation
4   All rights reserved.
5 
6   Redistribution and use in source and binary forms, with or without
7   modification, are permitted provided that the following conditions are met:
8 
9    1. Redistributions of source code must retain the above copyright notice,
10       this list of conditions and the following disclaimer.
11 
12    2. Redistributions in binary form must reproduce the above copyright
13       notice, this list of conditions and the following disclaimer in the
14       documentation and/or other materials provided with the distribution.
15 
16    3. Neither the name of the Intel Corporation nor the names of its
17       contributors may be used to endorse or promote products derived from
18       this software without specific prior written permission.
19 
20   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23   ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30   POSSIBILITY OF SUCH DAMAGE.
31 
32 *******************************************************************************/
33 
34 /* $OpenBSD: ixgb_ee.c,v 1.2 2007/06/26 10:30:05 tom Exp $ */
35 
36 #include <sys/param.h>
37 #include <sys/systm.h>
38 #include <sys/sockio.h>
39 #include <sys/mbuf.h>
40 #include <sys/malloc.h>
41 #include <sys/kernel.h>
42 #include <sys/device.h>
43 #include <sys/socket.h>
44 
45 #include <net/if.h>
46 #include <net/if_dl.h>
47 #include <net/if_media.h>
48 
49 #ifdef INET
50 #include <netinet/in.h>
51 #include <netinet/in_systm.h>
52 #include <netinet/in_var.h>
53 #include <netinet/ip.h>
54 #include <netinet/if_ether.h>
55 #endif
56 
57 #include <uvm/uvm_extern.h>
58 
59 #include <dev/pci/pcireg.h>
60 #include <dev/pci/pcivar.h>
61 #include <dev/pci/pcidevs.h>
62 
63 #include <dev/pci/ixgb_hw.h>
64 #include <dev/pci/ixgb_ee.h>
65 
66 /* Local prototypes */
67 static uint16_t ixgb_shift_in_bits(struct ixgb_hw *hw);
68 
69 static void ixgb_shift_out_bits(struct ixgb_hw *hw, uint16_t data,
70                                 uint16_t count);
71 static void ixgb_standby_eeprom(struct ixgb_hw *hw);
72 
73 static boolean_t ixgb_wait_eeprom_command(struct ixgb_hw *hw);
74 
75 static void ixgb_cleanup_eeprom(struct ixgb_hw *hw);
76 
77 /******************************************************************************
78  * Raises the EEPROM's clock input.
79  *
80  * hw - Struct containing variables accessed by shared code
81  * eecd_reg - EECD's current value
82  *****************************************************************************/
83 static void
84 ixgb_raise_clock(struct ixgb_hw *hw, uint32_t *eecd_reg)
85 {
86 	/* Raise the clock input to the EEPROM (by setting the SK bit), and
87 	 * then wait 50 microseconds. */
88 	*eecd_reg = *eecd_reg | IXGB_EECD_SK;
89 	IXGB_WRITE_REG(hw, EECD, *eecd_reg);
90 	usec_delay(50);
91 	return;
92 }
93 
94 /******************************************************************************
95  * Lowers the EEPROM's clock input.
96  *
97  * hw - Struct containing variables accessed by shared code
98  * eecd_reg - EECD's current value
99  *****************************************************************************/
100 static void
101 ixgb_lower_clock(struct ixgb_hw *hw, uint32_t *eecd_reg)
102 {
103 	/* Lower the clock input to the EEPROM (by clearing the SK bit), and
104 	 * then wait 50 microseconds. */
105 	*eecd_reg = *eecd_reg & ~IXGB_EECD_SK;
106 	IXGB_WRITE_REG(hw, EECD, *eecd_reg);
107 	usec_delay(50);
108 	return;
109 }
110 
111 /******************************************************************************
112  * Shift data bits out to the EEPROM.
113  *
114  * hw - Struct containing variables accessed by shared code
115  * data - data to send to the EEPROM
116  * count - number of bits to shift out
117  *****************************************************************************/
118 static void
119 ixgb_shift_out_bits(struct ixgb_hw *hw, uint16_t data, uint16_t count)
120 {
121 	uint32_t eecd_reg;
122 	uint32_t mask;
123 
124 	/* We need to shift "count" bits out to the EEPROM. So, value in the
125 	 * "data" parameter will be shifted out to the EEPROM one bit at a
126 	 * time. In order to do this, "data" must be broken down into bits. */
127 	mask = 0x01 << (count - 1);
128 	eecd_reg = IXGB_READ_REG(hw, EECD);
129 	eecd_reg &= ~(IXGB_EECD_DO | IXGB_EECD_DI);
130 	do {
131 		/* A "1" is shifted out to the EEPROM by setting bit "DI" to a
132 		 * "1", and then raising and then lowering the clock (the SK
133 		 * bit controls the clock input to the EEPROM).  A "0" is
134 		 * shifted out to the EEPROM by setting "DI" to "0" and then
135 		 * raising and then lowering the clock. */
136 		eecd_reg &= ~IXGB_EECD_DI;
137 
138 		if(data & mask)
139 			eecd_reg |= IXGB_EECD_DI;
140 
141 		IXGB_WRITE_REG(hw, EECD, eecd_reg);
142 
143 		usec_delay(50);
144 
145 		ixgb_raise_clock(hw, &eecd_reg);
146 		ixgb_lower_clock(hw, &eecd_reg);
147 
148 		mask = mask >> 1;
149 
150 	} while(mask);
151 
152 	/* We leave the "DI" bit set to "0" when we leave this routine. */
153 	eecd_reg &= ~IXGB_EECD_DI;
154 	IXGB_WRITE_REG(hw, EECD, eecd_reg);
155 	return;
156 }
157 
158 /******************************************************************************
159  * Shift data bits in from the EEPROM
160  *
161  * hw - Struct containing variables accessed by shared code
162  *****************************************************************************/
163 static uint16_t
164 ixgb_shift_in_bits(struct ixgb_hw *hw)
165 {
166 	uint32_t eecd_reg;
167 	uint32_t i;
168 	uint16_t data;
169 
170 	/* In order to read a register from the EEPROM, we need to shift 16
171 	 * bits in from the EEPROM. Bits are "shifted in" by raising the clock
172 	 * input to the EEPROM (setting the SK bit), and then reading the value
173 	 * of the "DO" bit.  During this "shifting in" process the "DI" bit
174 	 * should always be clear.. */
175 
176 	eecd_reg = IXGB_READ_REG(hw, EECD);
177 
178 	eecd_reg &= ~(IXGB_EECD_DO | IXGB_EECD_DI);
179 	data = 0;
180 
181 	for(i = 0; i < 16; i++) {
182 		data = data << 1;
183 		ixgb_raise_clock(hw, &eecd_reg);
184 
185 		eecd_reg = IXGB_READ_REG(hw, EECD);
186 
187 		eecd_reg &= ~(IXGB_EECD_DI);
188 		if(eecd_reg & IXGB_EECD_DO)
189 			data |= 1;
190 
191 		ixgb_lower_clock(hw, &eecd_reg);
192 	}
193 
194 	return data;
195 }
196 
197 /******************************************************************************
198  * Prepares EEPROM for access
199  *
200  * hw - Struct containing variables accessed by shared code
201  *
202  * Lowers EEPROM clock. Clears input pin. Sets the chip select pin. This
203  * function should be called before issuing a command to the EEPROM.
204  *****************************************************************************/
205 static void
206 ixgb_setup_eeprom(struct ixgb_hw *hw)
207 {
208 	uint32_t eecd_reg;
209 
210 	eecd_reg = IXGB_READ_REG(hw, EECD);
211 
212 	/* Clear SK and DI */
213 	eecd_reg &= ~(IXGB_EECD_SK | IXGB_EECD_DI);
214 	IXGB_WRITE_REG(hw, EECD, eecd_reg);
215 
216 	/* Set CS */
217 	eecd_reg |= IXGB_EECD_CS;
218 	IXGB_WRITE_REG(hw, EECD, eecd_reg);
219 	return;
220 }
221 
222 /******************************************************************************
223  * Returns EEPROM to a "standby" state
224  *
225  * hw - Struct containing variables accessed by shared code
226  *****************************************************************************/
227 static void
228 ixgb_standby_eeprom(struct ixgb_hw *hw)
229 {
230 	uint32_t eecd_reg;
231 
232 	eecd_reg = IXGB_READ_REG(hw, EECD);
233 
234 	/* Deselct EEPROM */
235 	eecd_reg &= ~(IXGB_EECD_CS | IXGB_EECD_SK);
236 	IXGB_WRITE_REG(hw, EECD, eecd_reg);
237 	usec_delay(50);
238 
239 	/* Clock high */
240 	eecd_reg |= IXGB_EECD_SK;
241 	IXGB_WRITE_REG(hw, EECD, eecd_reg);
242 	usec_delay(50);
243 
244 	/* Select EEPROM */
245 	eecd_reg |= IXGB_EECD_CS;
246 	IXGB_WRITE_REG(hw, EECD, eecd_reg);
247 	usec_delay(50);
248 
249 	/* Clock low */
250 	eecd_reg &= ~IXGB_EECD_SK;
251 	IXGB_WRITE_REG(hw, EECD, eecd_reg);
252 	usec_delay(50);
253 	return;
254 }
255 
256 /******************************************************************************
257  * Raises then lowers the EEPROM's clock pin
258  *
259  * hw - Struct containing variables accessed by shared code
260  *****************************************************************************/
261 static void
262 ixgb_clock_eeprom(struct ixgb_hw *hw)
263 {
264 	uint32_t eecd_reg;
265 
266 	eecd_reg = IXGB_READ_REG(hw, EECD);
267 
268 	/* Rising edge of clock */
269 	eecd_reg |= IXGB_EECD_SK;
270 	IXGB_WRITE_REG(hw, EECD, eecd_reg);
271 	usec_delay(50);
272 
273 	/* Falling edge of clock */
274 	eecd_reg &= ~IXGB_EECD_SK;
275 	IXGB_WRITE_REG(hw, EECD, eecd_reg);
276 	usec_delay(50);
277 	return;
278 }
279 
280 /******************************************************************************
281  * Terminates a command by lowering the EEPROM's chip select pin
282  *
283  * hw - Struct containing variables accessed by shared code
284  *****************************************************************************/
285 static void
286 ixgb_cleanup_eeprom(struct ixgb_hw *hw)
287 {
288 	uint32_t eecd_reg;
289 
290 	eecd_reg = IXGB_READ_REG(hw, EECD);
291 
292 	eecd_reg &= ~(IXGB_EECD_CS | IXGB_EECD_DI);
293 
294 	IXGB_WRITE_REG(hw, EECD, eecd_reg);
295 
296 	ixgb_clock_eeprom(hw);
297 	return;
298 }
299 
300 /******************************************************************************
301  * Waits for the EEPROM to finish the current command.
302  *
303  * hw - Struct containing variables accessed by shared code
304  *
305  * The command is done when the EEPROM's data out pin goes high.
306  *
307  * Returns:
308  *      TRUE: EEPROM data pin is high before timeout.
309  *      FALSE:  Time expired.
310  *****************************************************************************/
311 static boolean_t
312 ixgb_wait_eeprom_command(struct ixgb_hw *hw)
313 {
314 	uint32_t eecd_reg;
315 	uint32_t i;
316 
317 	/* Toggle the CS line.  This in effect tells to EEPROM to actually
318 	 * execute the command in question. */
319 	ixgb_standby_eeprom(hw);
320 
321 	/* Now read DO repeatedly until is high (equal to '1').  The EEEPROM
322 	 * will signal that the command has been completed by raising the DO
323 	 * signal. If DO does not go high in 10 milliseconds, then error out. */
324 	for(i = 0; i < 200; i++) {
325 		eecd_reg = IXGB_READ_REG(hw, EECD);
326 
327 		if(eecd_reg & IXGB_EECD_DO)
328 			return (TRUE);
329 
330 		usec_delay(50);
331 	}
332 	ASSERT(0);
333 	return (FALSE);
334 }
335 
336 /******************************************************************************
337  * Verifies that the EEPROM has a valid checksum
338  *
339  * hw - Struct containing variables accessed by shared code
340  *
341  * Reads the first 64 16 bit words of the EEPROM and sums the values read.
342  * If the sum of the 64 16 bit words is 0xBABA, the EEPROM's checksum is
343  * valid.
344  *
345  * Returns:
346  *  TRUE: Checksum is valid
347  *  FALSE: Checksum is not valid.
348  *****************************************************************************/
349 boolean_t
350 ixgb_validate_eeprom_checksum(struct ixgb_hw *hw)
351 {
352 	uint16_t checksum = 0;
353 	uint16_t i;
354 
355 	for(i = 0; i < (EEPROM_CHECKSUM_REG + 1); i++)
356 		checksum += ixgb_read_eeprom(hw, i);
357 
358 	if(checksum == (uint16_t)EEPROM_SUM)
359 		return (TRUE);
360 	else
361 		return (FALSE);
362 }
363 
364 /******************************************************************************
365  * Calculates the EEPROM checksum and writes it to the EEPROM
366  *
367  * hw - Struct containing variables accessed by shared code
368  *
369  * Sums the first 63 16 bit words of the EEPROM. Subtracts the sum from 0xBABA.
370  * Writes the difference to word offset 63 of the EEPROM.
371  *****************************************************************************/
372 void
373 ixgb_update_eeprom_checksum(struct ixgb_hw *hw)
374 {
375 	uint16_t checksum = 0;
376 	uint16_t i;
377 
378 	for(i = 0; i < EEPROM_CHECKSUM_REG; i++)
379 		checksum += ixgb_read_eeprom(hw, i);
380 
381 	checksum = (uint16_t)EEPROM_SUM - checksum;
382 
383 	ixgb_write_eeprom(hw, EEPROM_CHECKSUM_REG, checksum);
384 	return;
385 }
386 
387 /******************************************************************************
388  * Writes a 16 bit word to a given offset in the EEPROM.
389  *
390  * hw - Struct containing variables accessed by shared code
391  * reg - offset within the EEPROM to be written to
392  * data - 16 bit word to be writen to the EEPROM
393  *
394  * If ixgb_update_eeprom_checksum is not called after this function, the
395  * EEPROM will most likely contain an invalid checksum.
396  *
397  *****************************************************************************/
398 void
399 ixgb_write_eeprom(struct ixgb_hw *hw, uint16_t offset, uint16_t data)
400 {
401 	struct ixgb_ee_map_type *ee_map = (struct ixgb_ee_map_type *)hw->eeprom;
402 
403 	/* Prepare the EEPROM for writing */
404 	ixgb_setup_eeprom(hw);
405 
406 	/* Send the 9-bit EWEN (write enable) command to the EEPROM (5-bit
407 	 * opcode plus 4-bit dummy).  This puts the EEPROM into write/erase
408 	 * mode. */
409 	ixgb_shift_out_bits(hw, EEPROM_EWEN_OPCODE, 5);
410 	ixgb_shift_out_bits(hw, 0, 4);
411 
412 	/* Prepare the EEPROM */
413 	ixgb_standby_eeprom(hw);
414 
415 	/* Send the Write command (3-bit opcode + 6-bit addr) */
416 	ixgb_shift_out_bits(hw, EEPROM_WRITE_OPCODE, 3);
417 	ixgb_shift_out_bits(hw, offset, 6);
418 
419 	/* Send the data */
420 	ixgb_shift_out_bits(hw, data, 16);
421 
422 	ixgb_wait_eeprom_command(hw);
423 
424 	/* Recover from write */
425 	ixgb_standby_eeprom(hw);
426 
427 	/* Send the 9-bit EWDS (write disable) command to the EEPROM (5-bit
428 	 * opcode plus 4-bit dummy).  This takes the EEPROM out of write/erase
429 	 * mode. */
430 	ixgb_shift_out_bits(hw, EEPROM_EWDS_OPCODE, 5);
431 	ixgb_shift_out_bits(hw, 0, 4);
432 
433 	/* Done with writing */
434 	ixgb_cleanup_eeprom(hw);
435 
436 	/* clear the init_ctrl_reg_1 to signify that the cache is invalidated */
437 	ee_map->init_ctrl_reg_1 = le16_to_cpu(EEPROM_ICW1_SIGNATURE_CLEAR);
438 
439 	return;
440 }
441 
442 /******************************************************************************
443  * Reads a 16 bit word from the EEPROM.
444  *
445  * hw - Struct containing variables accessed by shared code
446  * offset - offset of 16 bit word in the EEPROM to read
447  *
448  * Returns:
449  *  The 16-bit value read from the eeprom
450  *****************************************************************************/
451 uint16_t
452 ixgb_read_eeprom(struct ixgb_hw *hw, uint16_t offset)
453 {
454 	uint16_t data;
455 
456 	/* Prepare the EEPROM for reading */
457 	ixgb_setup_eeprom(hw);
458 
459 	/* Send the READ command (opcode + addr) */
460 	ixgb_shift_out_bits(hw, EEPROM_READ_OPCODE, 3);
461 	/*
462 	 * We have a 64 word EEPROM, there are 6 address bits
463 	 */
464 	ixgb_shift_out_bits(hw, offset, 6);
465 
466 	/* Read the data */
467 	data = ixgb_shift_in_bits(hw);
468 
469 	/* End this read operation */
470 	ixgb_standby_eeprom(hw);
471 
472 	return (data);
473 }
474 
475 /******************************************************************************
476  * Reads eeprom and stores data in shared structure.
477  * Validates eeprom checksum and eeprom signature.
478  *
479  * hw - Struct containing variables accessed by shared code
480  *
481  * Returns:
482  *      TRUE: if eeprom read is successful
483  *      FALSE: otherwise.
484  *****************************************************************************/
485 boolean_t
486 ixgb_get_eeprom_data(struct ixgb_hw *hw)
487 {
488 	uint16_t i;
489 	uint16_t checksum = 0;
490 	struct ixgb_ee_map_type *ee_map;
491 
492 	DEBUGFUNC("ixgb_get_eeprom_data");
493 
494 	ee_map = (struct ixgb_ee_map_type *)hw->eeprom;
495 
496 	DEBUGOUT("ixgb_ee: Reading eeprom data\n");
497 	for(i = 0; i < IXGB_EEPROM_SIZE; i++) {
498 		uint16_t ee_data;
499 
500 		ee_data = ixgb_read_eeprom(hw, i);
501 		checksum += ee_data;
502 		hw->eeprom[i] = le16_to_cpu(ee_data);
503 	}
504 
505 	if(checksum != (uint16_t)EEPROM_SUM) {
506 		DEBUGOUT("ixgb_ee: Checksum invalid.\n");
507 		/* clear the init_ctrl_reg_1 to signify that the cache is
508 		 * invalidated */
509 		ee_map->init_ctrl_reg_1 = le16_to_cpu(EEPROM_ICW1_SIGNATURE_CLEAR);
510 		return (FALSE);
511 	}
512 
513 	if((ee_map->init_ctrl_reg_1 & le16_to_cpu(EEPROM_ICW1_SIGNATURE_MASK))
514 	   != le16_to_cpu(EEPROM_ICW1_SIGNATURE_VALID)) {
515 		DEBUGOUT("ixgb_ee: Signature invalid.\n");
516 		return (FALSE);
517 	}
518 
519 	return (TRUE);
520 }
521 
522 /******************************************************************************
523  * Local function to check if the eeprom signature is good
524  * If the eeprom signature is good, calls ixgb)get_eeprom_data.
525  *
526  * hw - Struct containing variables accessed by shared code
527  *
528  * Returns:
529  *      TRUE: eeprom signature was good and the eeprom read was successful
530  *      FALSE: otherwise.
531  ******************************************************************************/
532 static boolean_t
533 ixgb_check_and_get_eeprom_data(struct ixgb_hw *hw)
534 {
535 	struct ixgb_ee_map_type *ee_map = (struct ixgb_ee_map_type *)hw->eeprom;
536 
537 	if((ee_map->init_ctrl_reg_1 & le16_to_cpu(EEPROM_ICW1_SIGNATURE_MASK))
538 	   == le16_to_cpu(EEPROM_ICW1_SIGNATURE_VALID)) {
539 		return (TRUE);
540 	} else {
541 		return ixgb_get_eeprom_data(hw);
542 	}
543 }
544 
545 /******************************************************************************
546  * return a word from the eeprom
547  *
548  * hw - Struct containing variables accessed by shared code
549  * index - Offset of eeprom word
550  *
551  * Returns:
552  *          Word at indexed offset in eeprom, if valid, 0 otherwise.
553  ******************************************************************************/
554 uint16_t
555 ixgb_get_eeprom_word(struct ixgb_hw *hw, uint16_t index)
556 {
557 
558 	if((index < IXGB_EEPROM_SIZE) &&
559 	   (ixgb_check_and_get_eeprom_data(hw) == TRUE)) {
560 		return (hw->eeprom[index]);
561 	}
562 
563 	return (0);
564 }
565 
566 /******************************************************************************
567  * return the mac address from EEPROM
568  *
569  * hw       - Struct containing variables accessed by shared code
570  * mac_addr - Ethernet Address if EEPROM contents are valid, 0 otherwise
571  *
572  * Returns: None.
573  ******************************************************************************/
574 void
575 ixgb_get_ee_mac_addr(struct ixgb_hw *hw, uint8_t *mac_addr)
576 {
577 	int i;
578 	struct ixgb_ee_map_type *ee_map = (struct ixgb_ee_map_type *)hw->eeprom;
579 
580 	DEBUGFUNC("ixgb_get_ee_mac_addr");
581 
582 	if(ixgb_check_and_get_eeprom_data(hw) == TRUE) {
583 		for(i = 0; i < IXGB_ETH_LENGTH_OF_ADDRESS; i++) {
584 			mac_addr[i] = ee_map->mac_addr[i];
585 			DEBUGOUT2("mac(%d) = %.2X\n", i, mac_addr[i]);
586 		}
587 	}
588 }
589 
590 
591 /******************************************************************************
592  * return the Printed Board Assembly number from EEPROM
593  *
594  * hw - Struct containing variables accessed by shared code
595  *
596  * Returns:
597  *          PBA number if EEPROM contents are valid, 0 otherwise
598  ******************************************************************************/
599 uint32_t
600 ixgb_get_ee_pba_number(struct ixgb_hw *hw)
601 {
602 	if(ixgb_check_and_get_eeprom_data(hw) == TRUE)
603 		return (le16_to_cpu(hw->eeprom[EEPROM_PBA_1_2_REG])
604 			| (le16_to_cpu(hw->eeprom[EEPROM_PBA_3_4_REG]) << 16));
605 
606 	return (0);
607 }
608 
609 
610 /******************************************************************************
611  * return the Device Id from EEPROM
612  *
613  * hw - Struct containing variables accessed by shared code
614  *
615  * Returns:
616  *          Device Id if EEPROM contents are valid, 0 otherwise
617  ******************************************************************************/
618 uint16_t
619 ixgb_get_ee_device_id(struct ixgb_hw *hw)
620 {
621 	struct ixgb_ee_map_type *ee_map = (struct ixgb_ee_map_type *)hw->eeprom;
622 
623 	if(ixgb_check_and_get_eeprom_data(hw) == TRUE)
624 		return (le16_to_cpu(ee_map->device_id));
625 
626 	return (0);
627 }
628 
629