Annotation of sys/dev/pci/ixgb_hw.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_hw.c,v 1.2 2006/06/22 04:50:31 brad Exp $ */
35:
36: /* ixgb_hw.c
37: * Shared functions for accessing and configuring the adapter
38: */
39:
40: #include <sys/param.h>
41: #include <sys/systm.h>
42: #include <sys/sockio.h>
43: #include <sys/mbuf.h>
44: #include <sys/malloc.h>
45: #include <sys/kernel.h>
46: #include <sys/device.h>
47: #include <sys/socket.h>
48:
49: #include <net/if.h>
50: #include <net/if_dl.h>
51: #include <net/if_media.h>
52:
53: #ifdef INET
54: #include <netinet/in.h>
55: #include <netinet/in_systm.h>
56: #include <netinet/in_var.h>
57: #include <netinet/ip.h>
58: #include <netinet/if_ether.h>
59: #endif
60:
61: #include <uvm/uvm_extern.h>
62:
63: #include <dev/pci/pcireg.h>
64: #include <dev/pci/pcivar.h>
65: #include <dev/pci/pcidevs.h>
66:
67: #include <dev/pci/ixgb_hw.h>
68: #include <dev/pci/ixgb_ids.h>
69:
70: /* Local function prototypes */
71:
72: static uint32_t ixgb_hash_mc_addr(struct ixgb_hw *hw, uint8_t *mc_addr);
73:
74: static void ixgb_mta_set(struct ixgb_hw *hw, uint32_t hash_value);
75:
76: static void ixgb_get_bus_info(struct ixgb_hw *hw);
77:
78: static boolean_t ixgb_link_reset(struct ixgb_hw *hw);
79:
80: static void ixgb_optics_reset(struct ixgb_hw *hw);
81:
82: static ixgb_phy_type ixgb_identify_phy(struct ixgb_hw *hw);
83:
84: uint32_t ixgb_mac_reset(struct ixgb_hw *hw);
85:
86: uint32_t
87: ixgb_mac_reset(struct ixgb_hw *hw)
88: {
89: uint32_t ctrl_reg;
90:
91: ctrl_reg = IXGB_CTRL0_RST |
92: IXGB_CTRL0_SDP3_DIR | /* All pins are Output=1 */
93: IXGB_CTRL0_SDP2_DIR |
94: IXGB_CTRL0_SDP1_DIR |
95: IXGB_CTRL0_SDP0_DIR |
96: IXGB_CTRL0_SDP3 | /* Initial value 1101 */
97: IXGB_CTRL0_SDP2 |
98: IXGB_CTRL0_SDP0;
99:
100: #ifdef HP_ZX1
101: /* Workaround for 82597EX reset errata */
102: IXGB_WRITE_REG_IO(hw, CTRL0, ctrl_reg);
103: #else
104: IXGB_WRITE_REG(hw, CTRL0, ctrl_reg);
105: #endif
106:
107: /* Delay a few ms just to allow the reset to complete */
108: msec_delay(IXGB_DELAY_AFTER_RESET);
109: ctrl_reg = IXGB_READ_REG(hw, CTRL0);
110: #ifdef DBG
111: /* Make sure the self-clearing global reset bit did self clear */
112: ASSERT(!(ctrl_reg & IXGB_CTRL0_RST));
113: #endif
114:
115: if(hw->phy_type == ixgb_phy_type_txn17401) {
116: ixgb_optics_reset(hw);
117: }
118:
119: return ctrl_reg;
120: }
121:
122: /******************************************************************************
123: * Reset the transmit and receive units; mask and clear all interrupts.
124: *
125: * hw - Struct containing variables accessed by shared code
126: *****************************************************************************/
127: boolean_t
128: ixgb_adapter_stop(struct ixgb_hw *hw)
129: {
130: uint32_t ctrl_reg;
131: uint32_t icr_reg;
132:
133: DEBUGFUNC("ixgb_adapter_stop");
134:
135: /* If we are stopped or resetting exit gracefully and wait to be
136: * started again before accessing the hardware. */
137: if(hw->adapter_stopped) {
138: DEBUGOUT("Exiting because the adapter is already stopped!!!\n");
139: return FALSE;
140: }
141:
142: /* Set the Adapter Stopped flag so other driver functions stop touching
143: * the Hardware. */
144: hw->adapter_stopped = TRUE;
145:
146: /* Clear interrupt mask to stop board from generating interrupts */
147: DEBUGOUT("Masking off all interrupts\n");
148: IXGB_WRITE_REG(hw, IMC, 0xFFFFFFFF);
149:
150: /* Disable the Transmit and Receive units. Then delay to allow any
151: * pending transactions to complete before we hit the MAC with the
152: * global reset. */
153: IXGB_WRITE_REG(hw, RCTL, IXGB_READ_REG(hw, RCTL) & ~IXGB_RCTL_RXEN);
154: IXGB_WRITE_REG(hw, TCTL, IXGB_READ_REG(hw, TCTL) & ~IXGB_TCTL_TXEN);
155: msec_delay(IXGB_DELAY_BEFORE_RESET);
156:
157: /* Issue a global reset to the MAC. This will reset the chip's
158: * transmit, receive, DMA, and link units. It will not effect the
159: * current PCI configuration. The global reset bit is self- clearing,
160: * and should clear within a microsecond. */
161: DEBUGOUT("Issuing a global reset to MAC\n");
162:
163: ctrl_reg = ixgb_mac_reset(hw);
164:
165: /* Clear interrupt mask to stop board from generating interrupts */
166: DEBUGOUT("Masking off all interrupts\n");
167: IXGB_WRITE_REG(hw, IMC, 0xffffffff);
168:
169: /* Clear any pending interrupt events. */
170: icr_reg = IXGB_READ_REG(hw, ICR);
171:
172: return (ctrl_reg & IXGB_CTRL0_RST);
173: }
174:
175: /******************************************************************************
176: * Identifies the vendor of the optics module on the adapter. The SR adapters
177: * support two different types of XPAK optics, so it is necessary to determine
178: * which optics are present before applying any optics-specific workarounds.
179: *
180: * hw - Struct containing variables accessed by shared code.
181: *
182: * Returns: the vendor of the XPAK optics module.
183: *****************************************************************************/
184: static ixgb_xpak_vendor
185: ixgb_identify_xpak_vendor(struct ixgb_hw *hw)
186: {
187: uint32_t i;
188: uint16_t vendor_name[5];
189: ixgb_xpak_vendor xpak_vendor;
190:
191: DEBUGFUNC("ixgb_identify_xpak_vendor");
192:
193: /* Read the first few bytes of the vendor string from the XPAK NVR
194: * registers. These are standard XENPAK/XPAK registers, so all XPAK
195: * devices should implement them. */
196: for(i = 0; i < 5; i++) {
197: vendor_name[i] =
198: ixgb_read_phy_reg(hw, MDIO_PMA_PMD_XPAK_VENDOR_NAME + i,
199: IXGB_PHY_ADDRESS, MDIO_PMA_PMD_DID);
200: }
201:
202: /* Determine the actual vendor */
203: if (vendor_name[0] == 'I' &&
204: vendor_name[1] == 'N' &&
205: vendor_name[2] == 'T' &&
206: vendor_name[3] == 'E' &&
207: vendor_name[4] == 'L') {
208: xpak_vendor = ixgb_xpak_vendor_intel;
209: }
210: else {
211: xpak_vendor = ixgb_xpak_vendor_infineon;
212: }
213: return (xpak_vendor);
214: }
215:
216: /******************************************************************************
217: * Determine the physical layer module on the adapter.
218: *
219: * hw - Struct containing variables accessed by shared code. The device_id
220: * field must be (correctly) populated before calling this routine.
221: *
222: * Returns: the phy type of the adapter.
223: *****************************************************************************/
224: static ixgb_phy_type
225: ixgb_identify_phy(struct ixgb_hw *hw)
226: {
227: ixgb_phy_type phy_type;
228: ixgb_xpak_vendor xpak_vendor;
229:
230: DEBUGFUNC("ixgb_identify_phy");
231:
232: /* Infer the transceiver/phy type from the device id */
233: switch(hw->device_id) {
234: case IXGB_DEVICE_ID_82597EX:
235: DEBUGOUT("Identified TXN17401 optics\n");
236: phy_type = ixgb_phy_type_txn17401;
237: break;
238:
239: case IXGB_DEVICE_ID_82597EX_SR:
240: /* The SR adapters carry two different types of XPAK optics
241: * modules; read the vendor identifier to determine the exact
242: * type of optics. */
243: xpak_vendor = ixgb_identify_xpak_vendor(hw);
244: if(xpak_vendor == ixgb_xpak_vendor_intel) {
245: DEBUGOUT("Identified TXN17201 optics\n");
246: phy_type = ixgb_phy_type_txn17201;
247: } else {
248: DEBUGOUT("Identified G6005 optics\n");
249: phy_type = ixgb_phy_type_g6005;
250: }
251: break;
252:
253: case IXGB_DEVICE_ID_82597EX_LR:
254: DEBUGOUT("Identified G6104 optics\n");
255: phy_type = ixgb_phy_type_g6104;
256: break;
257:
258: case IXGB_DEVICE_ID_82597EX_CX4:
259: DEBUGOUT("Identified CX4\n");
260: xpak_vendor = ixgb_identify_xpak_vendor(hw);
261: if(xpak_vendor == ixgb_xpak_vendor_intel) {
262: DEBUGOUT("Identified TXN17201 optics\n");
263: phy_type = ixgb_phy_type_txn17201;
264: } else {
265: DEBUGOUT("Identified G6005 optics\n");
266: phy_type = ixgb_phy_type_g6005;
267: }
268: break;
269:
270: default:
271: DEBUGOUT("Unknown physical layer module\n");
272: phy_type = ixgb_phy_type_unknown;
273: break;
274: }
275:
276: return (phy_type);
277: }
278:
279: /******************************************************************************
280: * Performs basic configuration of the adapter.
281: *
282: * hw - Struct containing variables accessed by shared code
283: *
284: * Resets the controller.
285: * Reads and validates the EEPROM.
286: * Initializes the receive address registers.
287: * Initializes the multicast table.
288: * Clears all on-chip counters.
289: * Calls routine to setup flow control settings.
290: * Leaves the transmit and receive units disabled and uninitialized.
291: *
292: * Returns:
293: * TRUE if successful,
294: * FALSE if unrecoverable problems were encountered.
295: *****************************************************************************/
296: boolean_t
297: ixgb_init_hw(struct ixgb_hw *hw)
298: {
299: uint32_t i;
300: uint32_t ctrl_reg;
301: boolean_t status;
302:
303: DEBUGFUNC("ixgb_init_hw");
304:
305: /* Issue a global reset to the MAC. This will reset the chip's
306: * transmit, receive, DMA, and link units. It will not effect the
307: * current PCI configuration. The global reset bit is self- clearing,
308: * and should clear within a microsecond. */
309: DEBUGOUT("Issuing a global reset to MAC\n");
310:
311: ctrl_reg = ixgb_mac_reset(hw);
312:
313: DEBUGOUT("Issuing an EE reset to MAC\n");
314: #ifdef HP_ZX1
315: /* Workaround for 82597EX reset errata */
316: IXGB_WRITE_REG_IO(hw, CTRL1, IXGB_CTRL1_EE_RST);
317: #else
318: IXGB_WRITE_REG(hw, CTRL1, IXGB_CTRL1_EE_RST);
319: #endif
320:
321: /* Delay a few ms just to allow the reset to complete */
322: msec_delay(IXGB_DELAY_AFTER_EE_RESET);
323:
324: if(ixgb_get_eeprom_data(hw) == FALSE) {
325: return (FALSE);
326: }
327:
328: /* Use the device id to determine the type of phy/transceiver. */
329: hw->device_id = ixgb_get_ee_device_id(hw);
330: hw->phy_type = ixgb_identify_phy(hw);
331:
332: /* Setup the receive addresses. Receive Address Registers (RARs 0 -
333: * 15). */
334: ixgb_init_rx_addrs(hw);
335:
336: /*
337: * Check that a valid MAC address has been set.
338: * If it is not valid, we fail hardware init.
339: */
340: if(!mac_addr_valid(hw->curr_mac_addr)) {
341: DEBUGOUT("MAC address invalid after ixgb_init_rx_addrs\n");
342: return (FALSE);
343: }
344:
345: /* tell the routines in this file they can access hardware again */
346: hw->adapter_stopped = FALSE;
347:
348: /* Fill in the bus_info structure */
349: ixgb_get_bus_info(hw);
350:
351: /* Zero out the Multicast HASH table */
352: DEBUGOUT("Zeroing the MTA\n");
353: for(i = 0; i < IXGB_MC_TBL_SIZE; i++)
354: IXGB_WRITE_REG_ARRAY(hw, MTA, i, 0);
355:
356: /* Zero out the VLAN Filter Table Array */
357: ixgb_clear_vfta(hw);
358:
359: /* Zero all of the hardware counters */
360: ixgb_clear_hw_cntrs(hw);
361:
362: /* Call a subroutine to setup flow control. */
363: status = ixgb_setup_fc(hw);
364:
365: /* 82597EX errata: Call check-for-link in case lane deskew is locked */
366: ixgb_check_for_link(hw);
367:
368: return (status);
369: }
370:
371: /******************************************************************************
372: * Initializes receive address filters.
373: *
374: * hw - Struct containing variables accessed by shared code
375: *
376: * Places the MAC address in receive address register 0 and clears the rest
377: * of the receive addresss registers. Clears the multicast table. Assumes
378: * the receiver is in reset when the routine is called.
379: *****************************************************************************/
380: void
381: ixgb_init_rx_addrs(struct ixgb_hw *hw)
382: {
383: uint32_t i;
384:
385: DEBUGFUNC("ixgb_init_rx_addrs");
386:
387: /*
388: * If the current mac address is valid, assume it is a software override
389: * to the permanent address.
390: * Otherwise, use the permanent address from the eeprom.
391: */
392: if(!mac_addr_valid(hw->curr_mac_addr)) {
393:
394: /* Get the MAC address from the eeprom for later reference */
395: ixgb_get_ee_mac_addr(hw, hw->curr_mac_addr);
396:
397: DEBUGOUT3(" Keeping Permanent MAC Addr =%.2X %.2X %.2X ",
398: hw->curr_mac_addr[0], hw->curr_mac_addr[1],
399: hw->curr_mac_addr[2]);
400: DEBUGOUT3("%.2X %.2X %.2X\n", hw->curr_mac_addr[3],
401: hw->curr_mac_addr[4], hw->curr_mac_addr[5]);
402: } else {
403:
404: /* Setup the receive address. */
405: DEBUGOUT("Overriding MAC Address in RAR[0]\n");
406: DEBUGOUT3(" New MAC Addr =%.2X %.2X %.2X ",
407: hw->curr_mac_addr[0], hw->curr_mac_addr[1],
408: hw->curr_mac_addr[2]);
409: DEBUGOUT3("%.2X %.2X %.2X\n", hw->curr_mac_addr[3],
410: hw->curr_mac_addr[4], hw->curr_mac_addr[5]);
411:
412: ixgb_rar_set(hw, hw->curr_mac_addr, 0);
413: }
414:
415: /* Zero out the other 15 receive addresses. */
416: DEBUGOUT("Clearing RAR[1-15]\n");
417: for(i = 1; i < IXGB_RAR_ENTRIES; i++) {
418: IXGB_WRITE_REG_ARRAY(hw, RA, (i << 1), 0);
419: IXGB_WRITE_REG_ARRAY(hw, RA, ((i << 1) + 1), 0);
420: }
421:
422: return;
423: }
424:
425: /******************************************************************************
426: * Updates the MAC's list of multicast addresses.
427: *
428: * hw - Struct containing variables accessed by shared code
429: * mc_addr_list - the list of new multicast addresses
430: * mc_addr_count - number of addresses
431: * pad - number of bytes between addresses in the list
432: *
433: * The given list replaces any existing list. Clears the last 15 receive
434: * address registers and the multicast table. Uses receive address registers
435: * for the first 15 multicast addresses, and hashes the rest into the
436: * multicast table.
437: *****************************************************************************/
438: void
439: ixgb_mc_addr_list_update(struct ixgb_hw *hw, uint8_t *mc_addr_list,
440: uint32_t mc_addr_count, uint32_t pad)
441: {
442: uint32_t hash_value;
443: uint32_t i;
444: uint32_t rar_used_count = 1; /* RAR[0] is used for our MAC address */
445:
446: DEBUGFUNC("ixgb_mc_addr_list_update");
447:
448: /* Set the new number of MC addresses that we are being requested to
449: * use. */
450: hw->num_mc_addrs = mc_addr_count;
451:
452: /* Clear RAR[1-15] */
453: DEBUGOUT(" Clearing RAR[1-15]\n");
454: for(i = rar_used_count; i < IXGB_RAR_ENTRIES; i++) {
455: IXGB_WRITE_REG_ARRAY(hw, RA, (i << 1), 0);
456: IXGB_WRITE_REG_ARRAY(hw, RA, ((i << 1) + 1), 0);
457: }
458:
459: /* Clear the MTA */
460: DEBUGOUT(" Clearing MTA\n");
461: for(i = 0; i < IXGB_MC_TBL_SIZE; i++) {
462: IXGB_WRITE_REG_ARRAY(hw, MTA, i, 0);
463: }
464:
465: /* Add the new addresses */
466: for(i = 0; i < mc_addr_count; i++) {
467: DEBUGOUT(" Adding the multicast addresses:\n");
468: DEBUGOUT7(" MC Addr #%d =%.2X %.2X %.2X %.2X %.2X %.2X\n", i,
469: mc_addr_list[i * (IXGB_ETH_LENGTH_OF_ADDRESS + pad)],
470: mc_addr_list[i * (IXGB_ETH_LENGTH_OF_ADDRESS + pad) + 1],
471: mc_addr_list[i * (IXGB_ETH_LENGTH_OF_ADDRESS + pad) + 2],
472: mc_addr_list[i * (IXGB_ETH_LENGTH_OF_ADDRESS + pad) + 3],
473: mc_addr_list[i * (IXGB_ETH_LENGTH_OF_ADDRESS + pad) + 4],
474: mc_addr_list[i * (IXGB_ETH_LENGTH_OF_ADDRESS + pad) + 5]);
475:
476: /* Place this multicast address in the RAR if there is room, *
477: * else put it in the MTA */
478: if(rar_used_count < IXGB_RAR_ENTRIES) {
479: ixgb_rar_set(hw,
480: mc_addr_list +
481: (i * (IXGB_ETH_LENGTH_OF_ADDRESS + pad)),
482: rar_used_count);
483: DEBUGOUT1("Added a multicast address to RAR[%d]\n", i);
484: rar_used_count++;
485: } else {
486: hash_value =
487: ixgb_hash_mc_addr(hw,
488: mc_addr_list +
489: (i *
490: (IXGB_ETH_LENGTH_OF_ADDRESS +
491: pad)));
492:
493: DEBUGOUT1(" Hash value = 0x%03X\n", hash_value);
494:
495: ixgb_mta_set(hw, hash_value);
496: }
497: }
498:
499: DEBUGOUT("MC Update Complete\n");
500: return;
501: }
502:
503: /******************************************************************************
504: * Hashes an address to determine its location in the multicast table
505: *
506: * hw - Struct containing variables accessed by shared code
507: * mc_addr - the multicast address to hash
508: *
509: * Returns:
510: * The hash value
511: *****************************************************************************/
512: static uint32_t
513: ixgb_hash_mc_addr(struct ixgb_hw *hw, uint8_t *mc_addr)
514: {
515: uint32_t hash_value = 0;
516:
517: DEBUGFUNC("ixgb_hash_mc_addr");
518:
519: /* The portion of the address that is used for the hash table is
520: * determined by the mc_filter_type setting. */
521: switch(hw->mc_filter_type) {
522: /* [0] [1] [2] [3] [4] [5] 01 AA 00 12 34 56 LSB MSB -
523: * According to H/W docs */
524: case 0:
525: /* [47:36] i.e. 0x563 for above example address */
526: hash_value =
527: ((mc_addr[4] >> 4) | (((uint16_t)mc_addr[5]) << 4));
528: break;
529: case 1: /* [46:35] i.e. 0xAC6 for above
530: * example address */
531: hash_value =
532: ((mc_addr[4] >> 3) | (((uint16_t)mc_addr[5]) << 5));
533: break;
534: case 2: /* [45:34] i.e. 0x5D8 for above
535: * example address */
536: hash_value =
537: ((mc_addr[4] >> 2) | (((uint16_t)mc_addr[5]) << 6));
538: break;
539: case 3: /* [43:32] i.e. 0x634 for above
540: * example address */
541: hash_value = ((mc_addr[4]) | (((uint16_t)mc_addr[5]) << 8));
542: break;
543: default:
544: /* Invalid mc_filter_type, what should we do? */
545: DEBUGOUT("MC filter type param set incorrectly\n");
546: ASSERT(0);
547: break;
548: }
549:
550: hash_value &= 0xFFF;
551: return (hash_value);
552: }
553:
554: /******************************************************************************
555: * Sets the bit in the multicast table corresponding to the hash value.
556: *
557: * hw - Struct containing variables accessed by shared code
558: * hash_value - Multicast address hash value
559: *****************************************************************************/
560: static void
561: ixgb_mta_set(struct ixgb_hw *hw, uint32_t hash_value)
562: {
563: uint32_t hash_bit, hash_reg;
564: uint32_t mta_reg;
565:
566: /* The MTA is a register array of 128 32-bit registers. It is treated
567: * like an array of 4096 bits. We want to set bit
568: * BitArray[hash_value]. So we figure out what register the bit is in,
569: * read it, OR in the new bit, then write back the new value. The
570: * register is determined by the upper 7 bits of the hash value and the
571: * bit within that register are determined by the lower 5 bits of the
572: * value. */
573: hash_reg = (hash_value >> 5) & 0x7F;
574: hash_bit = hash_value & 0x1F;
575: mta_reg = IXGB_READ_REG_ARRAY(hw, MTA, hash_reg);
576: mta_reg |= (1 << hash_bit);
577: IXGB_WRITE_REG_ARRAY(hw, MTA, hash_reg, mta_reg);
578: return;
579: }
580:
581: /******************************************************************************
582: * Puts an ethernet address into a receive address register.
583: *
584: * hw - Struct containing variables accessed by shared code
585: * addr - Address to put into receive address register
586: * index - Receive address register to write
587: *****************************************************************************/
588: void
589: ixgb_rar_set(struct ixgb_hw *hw, uint8_t *addr, uint32_t index)
590: {
591: uint32_t rar_low, rar_high;
592:
593: DEBUGFUNC("ixgb_rar_set");
594:
595: /* HW expects these in little endian so we reverse the byte order from
596: * network order (big endian) to little endian */
597: rar_low = ((uint32_t)addr[0] |
598: ((uint32_t)addr[1] << 8) |
599: ((uint32_t)addr[2] << 16) |
600: ((uint32_t)addr[3] << 24));
601:
602: rar_high = ((uint32_t)addr[4] |
603: ((uint32_t)addr[5] << 8) |
604: IXGB_RAH_AV);
605:
606: IXGB_WRITE_REG_ARRAY(hw, RA, (index << 1), rar_low);
607: IXGB_WRITE_REG_ARRAY(hw, RA, ((index << 1) + 1), rar_high);
608: return;
609: }
610:
611: /******************************************************************************
612: * Writes a value to the specified offset in the VLAN filter table.
613: *
614: * hw - Struct containing variables accessed by shared code
615: * offset - Offset in VLAN filer table to write
616: * value - Value to write into VLAN filter table
617: *****************************************************************************/
618: void
619: ixgb_write_vfta(struct ixgb_hw *hw, uint32_t offset, uint32_t value)
620: {
621: IXGB_WRITE_REG_ARRAY(hw, VFTA, offset, value);
622: return;
623: }
624:
625: /******************************************************************************
626: * Clears the VLAN filer table
627: *
628: * hw - Struct containing variables accessed by shared code
629: *****************************************************************************/
630: void
631: ixgb_clear_vfta(struct ixgb_hw *hw)
632: {
633: uint32_t offset;
634:
635: for(offset = 0; offset < IXGB_VLAN_FILTER_TBL_SIZE; offset++)
636: IXGB_WRITE_REG_ARRAY(hw, VFTA, offset, 0);
637: return;
638: }
639:
640: /******************************************************************************
641: * Configures the flow control settings based on SW configuration.
642: *
643: * hw - Struct containing variables accessed by shared code
644: *****************************************************************************/
645:
646: boolean_t
647: ixgb_setup_fc(struct ixgb_hw *hw)
648: {
649: uint32_t ctrl_reg;
650: uint32_t pap_reg = 0; /* by default, assume no pause time */
651: boolean_t status = TRUE;
652:
653: DEBUGFUNC("ixgb_setup_fc");
654:
655: /* Get the current control reg 0 settings */
656: ctrl_reg = IXGB_READ_REG(hw, CTRL0);
657:
658: /* Clear the Receive Pause Enable and Transmit Pause Enable bits */
659: ctrl_reg &= ~(IXGB_CTRL0_RPE | IXGB_CTRL0_TPE);
660:
661: /* The possible values of the "flow_control" parameter are:
662: * 0: Flow control is completely disabled
663: * 1: Rx flow control is enabled (we can receive pause frames but not send
664: * pause frames).
665: * 2: Tx flow control is enabled (we can send pause frames but we do not
666: * support receiving pause frames)
667: * 3: Both Rx and TX flow control (symmetric) are enabled.
668: * other: Invalid. */
669: switch(hw->fc.type) {
670: case ixgb_fc_none: /* 0 */
671: /* Set CMDC bit to disable Rx Flow control */
672: ctrl_reg |= (IXGB_CTRL0_CMDC);
673: break;
674: case ixgb_fc_rx_pause: /* 1 */
675: /* RX Flow control is enabled, and TX Flow control is disabled. */
676: ctrl_reg |= (IXGB_CTRL0_RPE);
677: break;
678: case ixgb_fc_tx_pause: /* 2 */
679: /* TX Flow control is enabled, and RX Flow control is disabled,
680: * by a software over-ride. */
681: ctrl_reg |= (IXGB_CTRL0_TPE);
682: pap_reg = hw->fc.pause_time;
683: break;
684: case ixgb_fc_full: /* 3 */
685: /* Flow control (both RX and TX) is enabled by a software
686: * over-ride. */
687: ctrl_reg |= (IXGB_CTRL0_RPE | IXGB_CTRL0_TPE);
688: pap_reg = hw->fc.pause_time;
689: break;
690: default:
691: /* We should never get here. The value should be 0-3. */
692: DEBUGOUT("Flow control param set incorrectly\n");
693: ASSERT(0);
694: break;
695: }
696:
697: /* Write the new settings */
698: IXGB_WRITE_REG(hw, CTRL0, ctrl_reg);
699:
700: if(pap_reg != 0) {
701: IXGB_WRITE_REG(hw, PAP, pap_reg);
702: }
703:
704: /* Set the flow control receive threshold registers. Normally, these
705: * registers will be set to a default threshold that may be adjusted
706: * later by the driver's runtime code. However, if the ability to
707: * transmit pause frames in not enabled, then these registers will be
708: * set to 0. */
709: if(!(hw->fc.type & ixgb_fc_tx_pause)) {
710: IXGB_WRITE_REG(hw, FCRTL, 0);
711: IXGB_WRITE_REG(hw, FCRTH, 0);
712: } else {
713: /* We need to set up the Receive Threshold high and low water
714: * marks as well as (optionally) enabling the transmission of
715: * XON frames. */
716: if(hw->fc.send_xon) {
717: IXGB_WRITE_REG(hw, FCRTL,
718: (hw->fc.low_water | IXGB_FCRTL_XONE));
719: } else {
720: IXGB_WRITE_REG(hw, FCRTL, hw->fc.low_water);
721: }
722: IXGB_WRITE_REG(hw, FCRTH, hw->fc.high_water);
723: }
724: return (status);
725: }
726:
727: /******************************************************************************
728: * Reads a word from a device over the Management Data Interface (MDI) bus.
729: * This interface is used to manage Physical layer devices.
730: *
731: * hw - Struct containing variables accessed by hw code
732: * reg_address - Offset of device register being read.
733: * phy_address - Address of device on MDI.
734: *
735: * Returns: Data word (16 bits) from MDI device.
736: *
737: * The 82597EX has support for several MDI access methods. This routine
738: * uses the new protocol MDI Single Command and Address Operation.
739: * This requires that first an address cycle command is sent, followed by a
740: * read command.
741: *****************************************************************************/
742: uint16_t
743: ixgb_read_phy_reg(struct ixgb_hw *hw, uint32_t reg_address,
744: uint32_t phy_address, uint32_t device_type)
745: {
746: uint32_t i;
747: uint32_t data;
748: uint32_t command = 0;
749:
750: ASSERT(reg_address <= IXGB_MAX_PHY_REG_ADDRESS);
751: ASSERT(phy_address <= IXGB_MAX_PHY_ADDRESS);
752: ASSERT(device_type <= IXGB_MAX_PHY_DEV_TYPE);
753:
754: /* Setup and write the address cycle command */
755: command = ((reg_address << IXGB_MSCA_NP_ADDR_SHIFT) |
756: (device_type << IXGB_MSCA_DEV_TYPE_SHIFT) |
757: (phy_address << IXGB_MSCA_PHY_ADDR_SHIFT) |
758: (IXGB_MSCA_ADDR_CYCLE | IXGB_MSCA_MDI_COMMAND));
759:
760: IXGB_WRITE_REG(hw, MSCA, command);
761:
762: /**************************************************************
763: ** Check every 10 usec to see if the address cycle completed
764: ** The COMMAND bit will clear when the operation is complete.
765: ** This may take as long as 64 usecs (we'll wait 100 usecs max)
766: ** from the CPU Write to the Ready bit assertion.
767: **************************************************************/
768:
769: for(i = 0; i < 10; i++) {
770: usec_delay(10);
771:
772: command = IXGB_READ_REG(hw, MSCA);
773:
774: if((command & IXGB_MSCA_MDI_COMMAND) == 0)
775: break;
776: }
777:
778: ASSERT((command & IXGB_MSCA_MDI_COMMAND) == 0);
779:
780: /* Address cycle complete, setup and write the read command */
781: command = ((reg_address << IXGB_MSCA_NP_ADDR_SHIFT) |
782: (device_type << IXGB_MSCA_DEV_TYPE_SHIFT) |
783: (phy_address << IXGB_MSCA_PHY_ADDR_SHIFT) |
784: (IXGB_MSCA_READ | IXGB_MSCA_MDI_COMMAND));
785:
786: IXGB_WRITE_REG(hw, MSCA, command);
787:
788: /**************************************************************
789: ** Check every 10 usec to see if the read command completed
790: ** The COMMAND bit will clear when the operation is complete.
791: ** The read may take as long as 64 usecs (we'll wait 100 usecs max)
792: ** from the CPU Write to the Ready bit assertion.
793: **************************************************************/
794:
795: for(i = 0; i < 10; i++) {
796: usec_delay(10);
797:
798: command = IXGB_READ_REG(hw, MSCA);
799:
800: if((command & IXGB_MSCA_MDI_COMMAND) == 0)
801: break;
802: }
803:
804: ASSERT((command & IXGB_MSCA_MDI_COMMAND) == 0);
805:
806: /* Operation is complete, get the data from the MDIO Read/Write Data
807: * register and return. */
808: data = IXGB_READ_REG(hw, MSRWD);
809: data >>= IXGB_MSRWD_READ_DATA_SHIFT;
810: return ((uint16_t)data);
811: }
812:
813: /******************************************************************************
814: * Writes a word to a device over the Management Data Interface (MDI) bus.
815: * This interface is used to manage Physical layer devices.
816: *
817: * hw - Struct containing variables accessed by hw code
818: * reg_address - Offset of device register being read.
819: * phy_address - Address of device on MDI.
820: * device_type - Also known as the Device ID or DID.
821: * data - 16-bit value to be written
822: *
823: * Returns: void.
824: *
825: * The 82597EX has support for several MDI access methods. This routine
826: * uses the new protocol MDI Single Command and Address Operation.
827: * This requires that first an address cycle command is sent, followed by a
828: * write command.
829: *****************************************************************************/
830: void
831: ixgb_write_phy_reg(struct ixgb_hw *hw, uint32_t reg_address,
832: uint32_t phy_address, uint32_t device_type, uint16_t data)
833: {
834: uint32_t i;
835: uint32_t command = 0;
836:
837: ASSERT(reg_address <= IXGB_MAX_PHY_REG_ADDRESS);
838: ASSERT(phy_address <= IXGB_MAX_PHY_ADDRESS);
839: ASSERT(device_type <= IXGB_MAX_PHY_DEV_TYPE);
840:
841: /* Put the data in the MDIO Read/Write Data register */
842: IXGB_WRITE_REG(hw, MSRWD, (uint32_t)data);
843:
844: /* Setup and write the address cycle command */
845: command = ((reg_address << IXGB_MSCA_NP_ADDR_SHIFT) |
846: (device_type << IXGB_MSCA_DEV_TYPE_SHIFT) |
847: (phy_address << IXGB_MSCA_PHY_ADDR_SHIFT) |
848: (IXGB_MSCA_ADDR_CYCLE | IXGB_MSCA_MDI_COMMAND));
849:
850: IXGB_WRITE_REG(hw, MSCA, command);
851:
852: /**************************************************************
853: ** Check every 10 usec to see if the address cycle completed
854: ** The COMMAND bit will clear when the operation is complete.
855: ** This may take as long as 64 usecs (we'll wait 100 usecs max)
856: ** from the CPU Write to the Ready bit assertion.
857: **************************************************************/
858:
859: for(i = 0; i < 10; i++) {
860: usec_delay(10);
861:
862: command = IXGB_READ_REG(hw, MSCA);
863:
864: if((command & IXGB_MSCA_MDI_COMMAND) == 0)
865: break;
866: }
867:
868: ASSERT((command & IXGB_MSCA_MDI_COMMAND) == 0);
869:
870: /* Address cycle complete, setup and write the write command */
871: command = ((reg_address << IXGB_MSCA_NP_ADDR_SHIFT) |
872: (device_type << IXGB_MSCA_DEV_TYPE_SHIFT) |
873: (phy_address << IXGB_MSCA_PHY_ADDR_SHIFT) |
874: (IXGB_MSCA_WRITE | IXGB_MSCA_MDI_COMMAND));
875:
876: IXGB_WRITE_REG(hw, MSCA, command);
877:
878: /**************************************************************
879: ** Check every 10 usec to see if the read command completed
880: ** The COMMAND bit will clear when the operation is complete.
881: ** The write may take as long as 64 usecs (we'll wait 100 usecs max)
882: ** from the CPU Write to the Ready bit assertion.
883: **************************************************************/
884:
885: for(i = 0; i < 10; i++) {
886: usec_delay(10);
887:
888: command = IXGB_READ_REG(hw, MSCA);
889:
890: if((command & IXGB_MSCA_MDI_COMMAND) == 0)
891: break;
892: }
893:
894: ASSERT((command & IXGB_MSCA_MDI_COMMAND) == 0);
895:
896: /* Operation is complete, return. */
897: }
898:
899: /******************************************************************************
900: * Checks to see if the link status of the hardware has changed.
901: *
902: * hw - Struct containing variables accessed by hw code
903: *
904: * Called by any function that needs to check the link status of the adapter.
905: *****************************************************************************/
906: void
907: ixgb_check_for_link(struct ixgb_hw *hw)
908: {
909: uint32_t status_reg;
910: uint32_t xpcss_reg;
911:
912: DEBUGFUNC("ixgb_check_for_link");
913:
914: xpcss_reg = IXGB_READ_REG(hw, XPCSS);
915: status_reg = IXGB_READ_REG(hw, STATUS);
916:
917: if((xpcss_reg & IXGB_XPCSS_ALIGN_STATUS) &&
918: (status_reg & IXGB_STATUS_LU)) {
919: hw->link_up = TRUE;
920: } else if(!(xpcss_reg & IXGB_XPCSS_ALIGN_STATUS) &&
921: (status_reg & IXGB_STATUS_LU)) {
922: DEBUGOUT("XPCSS Not Aligned while Status:LU is set.\n");
923: hw->link_up = ixgb_link_reset(hw);
924: } else {
925: /*
926: * 82597EX errata. Since the lane deskew problem may prevent
927: * link, reset the link before reporting link down.
928: */
929: hw->link_up = ixgb_link_reset(hw);
930: }
931: /* Anything else for 10 Gig?? */
932: }
933:
934: /******************************************************************************
935: * Check for a bad link condition that may have occured.
936: * The indication is that the RFC / LFC registers may be incrementing
937: * continually. A full adapter reset is required to recover.
938: *
939: * hw - Struct containing variables accessed by hw code
940: *
941: * Called by any function that needs to check the link status of the adapter.
942: *****************************************************************************/
943: boolean_t
944: ixgb_check_for_bad_link(struct ixgb_hw *hw)
945: {
946: uint32_t newLFC, newRFC;
947: boolean_t bad_link_returncode = FALSE;
948:
949: if(hw->phy_type == ixgb_phy_type_txn17401) {
950: newLFC = IXGB_READ_REG(hw, LFC);
951: newRFC = IXGB_READ_REG(hw, RFC);
952: if((hw->lastLFC + 250 < newLFC) || (hw->lastRFC + 250 < newRFC)) {
953: DEBUGOUT("BAD LINK! too many LFC/RFC since last check\n");
954: bad_link_returncode = TRUE;
955: }
956: hw->lastLFC = newLFC;
957: hw->lastRFC = newRFC;
958: }
959:
960: return bad_link_returncode;
961: }
962:
963: /******************************************************************************
964: * Clears all hardware statistics counters.
965: *
966: * hw - Struct containing variables accessed by shared code
967: *****************************************************************************/
968: void
969: ixgb_clear_hw_cntrs(struct ixgb_hw *hw)
970: {
971: volatile uint32_t temp_reg;
972:
973: DEBUGFUNC("ixgb_clear_hw_cntrs");
974:
975: /* if we are stopped or resetting exit gracefully */
976: if(hw->adapter_stopped) {
977: DEBUGOUT("Exiting because the adapter is stopped!!!\n");
978: return;
979: }
980:
981: temp_reg = IXGB_READ_REG(hw, TPRL);
982: temp_reg = IXGB_READ_REG(hw, TPRH);
983: temp_reg = IXGB_READ_REG(hw, GPRCL);
984: temp_reg = IXGB_READ_REG(hw, GPRCH);
985: temp_reg = IXGB_READ_REG(hw, BPRCL);
986: temp_reg = IXGB_READ_REG(hw, BPRCH);
987: temp_reg = IXGB_READ_REG(hw, MPRCL);
988: temp_reg = IXGB_READ_REG(hw, MPRCH);
989: temp_reg = IXGB_READ_REG(hw, UPRCL);
990: temp_reg = IXGB_READ_REG(hw, UPRCH);
991: temp_reg = IXGB_READ_REG(hw, VPRCL);
992: temp_reg = IXGB_READ_REG(hw, VPRCH);
993: temp_reg = IXGB_READ_REG(hw, JPRCL);
994: temp_reg = IXGB_READ_REG(hw, JPRCH);
995: temp_reg = IXGB_READ_REG(hw, GORCL);
996: temp_reg = IXGB_READ_REG(hw, GORCH);
997: temp_reg = IXGB_READ_REG(hw, TORL);
998: temp_reg = IXGB_READ_REG(hw, TORH);
999: temp_reg = IXGB_READ_REG(hw, RNBC);
1000: temp_reg = IXGB_READ_REG(hw, RUC);
1001: temp_reg = IXGB_READ_REG(hw, ROC);
1002: temp_reg = IXGB_READ_REG(hw, RLEC);
1003: temp_reg = IXGB_READ_REG(hw, CRCERRS);
1004: temp_reg = IXGB_READ_REG(hw, ICBC);
1005: temp_reg = IXGB_READ_REG(hw, ECBC);
1006: temp_reg = IXGB_READ_REG(hw, MPC);
1007: temp_reg = IXGB_READ_REG(hw, TPTL);
1008: temp_reg = IXGB_READ_REG(hw, TPTH);
1009: temp_reg = IXGB_READ_REG(hw, GPTCL);
1010: temp_reg = IXGB_READ_REG(hw, GPTCH);
1011: temp_reg = IXGB_READ_REG(hw, BPTCL);
1012: temp_reg = IXGB_READ_REG(hw, BPTCH);
1013: temp_reg = IXGB_READ_REG(hw, MPTCL);
1014: temp_reg = IXGB_READ_REG(hw, MPTCH);
1015: temp_reg = IXGB_READ_REG(hw, UPTCL);
1016: temp_reg = IXGB_READ_REG(hw, UPTCH);
1017: temp_reg = IXGB_READ_REG(hw, VPTCL);
1018: temp_reg = IXGB_READ_REG(hw, VPTCH);
1019: temp_reg = IXGB_READ_REG(hw, JPTCL);
1020: temp_reg = IXGB_READ_REG(hw, JPTCH);
1021: temp_reg = IXGB_READ_REG(hw, GOTCL);
1022: temp_reg = IXGB_READ_REG(hw, GOTCH);
1023: temp_reg = IXGB_READ_REG(hw, TOTL);
1024: temp_reg = IXGB_READ_REG(hw, TOTH);
1025: temp_reg = IXGB_READ_REG(hw, DC);
1026: temp_reg = IXGB_READ_REG(hw, PLT64C);
1027: temp_reg = IXGB_READ_REG(hw, TSCTC);
1028: temp_reg = IXGB_READ_REG(hw, TSCTFC);
1029: temp_reg = IXGB_READ_REG(hw, IBIC);
1030: temp_reg = IXGB_READ_REG(hw, RFC);
1031: temp_reg = IXGB_READ_REG(hw, LFC);
1032: temp_reg = IXGB_READ_REG(hw, PFRC);
1033: temp_reg = IXGB_READ_REG(hw, PFTC);
1034: temp_reg = IXGB_READ_REG(hw, MCFRC);
1035: temp_reg = IXGB_READ_REG(hw, MCFTC);
1036: temp_reg = IXGB_READ_REG(hw, XONRXC);
1037: temp_reg = IXGB_READ_REG(hw, XONTXC);
1038: temp_reg = IXGB_READ_REG(hw, XOFFRXC);
1039: temp_reg = IXGB_READ_REG(hw, XOFFTXC);
1040: temp_reg = IXGB_READ_REG(hw, RJC);
1041: return;
1042: }
1043:
1044: /******************************************************************************
1045: * Turns on the software controllable LED
1046: *
1047: * hw - Struct containing variables accessed by shared code
1048: *****************************************************************************/
1049: void
1050: ixgb_led_on(struct ixgb_hw *hw)
1051: {
1052: uint32_t ctrl0_reg = IXGB_READ_REG(hw, CTRL0);
1053:
1054: /* To turn on the LED, clear software-definable pin 0 (SDP0). */
1055: ctrl0_reg &= ~IXGB_CTRL0_SDP0;
1056: IXGB_WRITE_REG(hw, CTRL0, ctrl0_reg);
1057: return;
1058: }
1059:
1060: /******************************************************************************
1061: * Turns off the software controllable LED
1062: *
1063: * hw - Struct containing variables accessed by shared code
1064: *****************************************************************************/
1065: void
1066: ixgb_led_off(struct ixgb_hw *hw)
1067: {
1068: uint32_t ctrl0_reg = IXGB_READ_REG(hw, CTRL0);
1069:
1070: /* To turn off the LED, set software-definable pin 0 (SDP0). */
1071: ctrl0_reg |= IXGB_CTRL0_SDP0;
1072: IXGB_WRITE_REG(hw, CTRL0, ctrl0_reg);
1073: return;
1074: }
1075:
1076: /******************************************************************************
1077: * Gets the current PCI bus type, speed, and width of the hardware
1078: *
1079: * hw - Struct containing variables accessed by shared code
1080: *****************************************************************************/
1081: static void
1082: ixgb_get_bus_info(struct ixgb_hw *hw)
1083: {
1084: uint32_t status_reg;
1085:
1086: status_reg = IXGB_READ_REG(hw, STATUS);
1087:
1088: hw->bus.type =
1089: (status_reg & IXGB_STATUS_PCIX_MODE) ? ixgb_bus_type_pcix :
1090: ixgb_bus_type_pci;
1091:
1092: if(hw->bus.type == ixgb_bus_type_pci) {
1093: hw->bus.speed =
1094: (status_reg & IXGB_STATUS_PCI_SPD) ? ixgb_bus_speed_66 :
1095: ixgb_bus_speed_33;
1096: } else {
1097: switch(status_reg & IXGB_STATUS_PCIX_SPD_MASK) {
1098: case IXGB_STATUS_PCIX_SPD_66:
1099: hw->bus.speed = ixgb_bus_speed_66;
1100: break;
1101: case IXGB_STATUS_PCIX_SPD_100:
1102: hw->bus.speed = ixgb_bus_speed_100;
1103: break;
1104: case IXGB_STATUS_PCIX_SPD_133:
1105: hw->bus.speed = ixgb_bus_speed_133;
1106: break;
1107: default:
1108: hw->bus.speed = ixgb_bus_speed_reserved;
1109: break;
1110: }
1111: }
1112:
1113: hw->bus.width =
1114: (status_reg & IXGB_STATUS_BUS64) ? ixgb_bus_width_64 :
1115: ixgb_bus_width_32;
1116:
1117: return;
1118: }
1119:
1120: /******************************************************************************
1121: * Tests a MAC address to ensure it is a valid Individual Address
1122: *
1123: * mac_addr - pointer to MAC address.
1124: *
1125: *****************************************************************************/
1126: boolean_t
1127: mac_addr_valid(uint8_t *mac_addr)
1128: {
1129: boolean_t is_valid = TRUE;
1130:
1131: DEBUGFUNC("mac_addr_valid");
1132:
1133: /* Make sure it is not a multicast address */
1134: if(IS_MULTICAST(mac_addr)) {
1135: DEBUGOUT("MAC address is multicast\n");
1136: is_valid = FALSE;
1137: }
1138: /* Not a broadcast address */
1139: else if(IS_BROADCAST(mac_addr)) {
1140: DEBUGOUT("MAC address is broadcast\n");
1141: is_valid = FALSE;
1142: }
1143: /* Reject the zero address */
1144: else if (mac_addr[0] == 0 &&
1145: mac_addr[1] == 0 &&
1146: mac_addr[2] == 0 &&
1147: mac_addr[3] == 0 &&
1148: mac_addr[4] == 0 &&
1149: mac_addr[5] == 0) {
1150: DEBUGOUT("MAC address is all zeros\n");
1151: is_valid = FALSE;
1152: }
1153: return (is_valid);
1154: }
1155:
1156: /******************************************************************************
1157: * Resets the 10GbE link. Waits the settle time and returns the state of
1158: * the link.
1159: *
1160: * hw - Struct containing variables accessed by shared code
1161: *****************************************************************************/
1162: boolean_t
1163: ixgb_link_reset(struct ixgb_hw *hw)
1164: {
1165: boolean_t link_status = FALSE;
1166: uint8_t wait_retries = MAX_RESET_ITERATIONS;
1167: uint8_t lrst_retries = MAX_RESET_ITERATIONS;
1168:
1169: do {
1170: /* Reset the link */
1171: IXGB_WRITE_REG(hw, CTRL0,
1172: IXGB_READ_REG(hw, CTRL0) | IXGB_CTRL0_LRST);
1173:
1174: /* Wait for link-up and lane re-alignment */
1175: do {
1176: usec_delay(IXGB_DELAY_USECS_AFTER_LINK_RESET);
1177: link_status =
1178: ((IXGB_READ_REG(hw, STATUS) & IXGB_STATUS_LU) &&
1179: (IXGB_READ_REG(hw, XPCSS) &
1180: IXGB_XPCSS_ALIGN_STATUS)) ? TRUE : FALSE;
1181: } while(!link_status && --wait_retries);
1182:
1183: } while(!link_status && --lrst_retries);
1184:
1185: return link_status;
1186: }
1187:
1188: /******************************************************************************
1189: * Resets the 10GbE optics module.
1190: *
1191: * hw - Struct containing variables accessed by shared code
1192: *****************************************************************************/
1193: void
1194: ixgb_optics_reset(struct ixgb_hw *hw)
1195: {
1196: if(hw->phy_type == ixgb_phy_type_txn17401) {
1197: uint16_t mdio_reg;
1198:
1199: ixgb_write_phy_reg(hw,
1200: MDIO_PMA_PMD_CR1,
1201: IXGB_PHY_ADDRESS,
1202: MDIO_PMA_PMD_DID,
1203: MDIO_PMA_PMD_CR1_RESET);
1204:
1205: mdio_reg = ixgb_read_phy_reg(hw,
1206: MDIO_PMA_PMD_CR1,
1207: IXGB_PHY_ADDRESS,
1208: MDIO_PMA_PMD_DID);
1209: }
1210:
1211: return;
1212: }
CVSweb