Annotation of sys/dev/pci/ixgb_hw.c, Revision 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