Annotation of sys/dev/pci/ixgb_ee.c, Revision 1.1.1.1
1.1 nbrk 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:
CVSweb