ixgbe_api.c revision 13740cb230f19fcbf1a6468d1a6a0ba9a0a09c22
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * CDDL HEADER START
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Copyright(c) 2007-2008 Intel Corporation. All rights reserved.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * The contents of this file are subject to the terms of the
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Common Development and Distribution License (the "License").
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * You may not use this file except in compliance with the License.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * You can obtain a copy of the license at:
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * See the License for the specific language governing permissions
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * and limitations under the License.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * When using or redistributing this file, you may do so under the
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * License only. No other modification of this header is permitted.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * If applicable, add the following below this CDDL HEADER, with the
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * fields enclosed by brackets "[]" replaced with your own identifying
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * information: Portions Copyright [yyyy] [name of copyright owner]
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * CDDL HEADER END
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Use is subject to license terms of the CDDL.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll/* IntelVersion: 1.99 v2008-09-12 */
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll#ident "$Id: ixgbe_api.c,v 1.99 2008/08/22 16:30:26 mrchilak Exp $"
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersollextern s32 ixgbe_init_ops_82598(struct ixgbe_hw *hw);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * ixgbe_init_shared_code - Initialize the shared code
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * @hw: pointer to hardware structure
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * This will assign function pointers and assign the MAC type and PHY code.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Does not touch the hardware. This function must be called prior to any
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * other function in the shared code. The ixgbe_hw structure should be
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * memset to 0 prior to calling this function. The following fields in
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * hw structure should be filled in prior to calling this function:
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * hw_addr, back, device_id, vendor_id, subsystem_device_id,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * subsystem_vendor_id, and revision_id
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Set the mac type
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * ixgbe_set_mac_type - Sets MAC type
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * @hw: pointer to the HW structure
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * This function sets the mac type of the adapter based on the
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * vendor ID and device ID stored in the hw structure.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (hw->vendor_id == IXGBE_INTEL_VENDOR_ID) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll DEBUGOUT2("ixgbe_set_mac_type found mac: %d, returns: %d\n",
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * ixgbe_init_hw - Initialize the hardware
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * @hw: pointer to hardware structure
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Initialize the hardware by resetting and then starting the hardware
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return ixgbe_call_func(hw, hw->mac.ops.init_hw, (hw),
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * ixgbe_reset_hw - Performs a hardware reset
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * @hw: pointer to hardware structure
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Resets the hardware by resetting the transmit and receive units, masks and
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * clears all interrupts, performs a PHY reset, and performs a MAC reset
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return ixgbe_call_func(hw, hw->mac.ops.reset_hw, (hw),
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * ixgbe_start_hw - Prepares hardware for Rx/Tx
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * @hw: pointer to hardware structure
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Starts the hardware by filling the bus info structure and media type,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * clears all on chip counters, initializes receive address registers,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * multicast table, VLAN filter table, calls routine to setup link and
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * flow control settings, and leaves transmit and receive units disabled
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * and uninitialized.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return ixgbe_call_func(hw, hw->mac.ops.start_hw, (hw),
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * ixgbe_clear_hw_cntrs - Clear hardware counters
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * @hw: pointer to hardware structure
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Clears all hardware statistics counters by reading them from the hardware
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Statistics counters are clear on read.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return ixgbe_call_func(hw, hw->mac.ops.clear_hw_cntrs, (hw),
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * ixgbe_get_media_type - Get media type
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * @hw: pointer to hardware structure
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Returns the media type (fiber, copper, backplane)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return ixgbe_call_func(hw, hw->mac.ops.get_media_type, (hw),
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * ixgbe_get_mac_addr - Get MAC address
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * @hw: pointer to hardware structure
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * @mac_addr: Adapter MAC address
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Reads the adapter's MAC address from the first Receive Address Register
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * (RAR0) A reset of the adapter must have been performed prior to calling
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * this function in order for the MAC address to have been loaded from the
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * EEPROM into RAR0
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersollixgbe_get_mac_addr(struct ixgbe_hw *hw, u8 *mac_addr)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return ixgbe_call_func(hw, hw->mac.ops.get_mac_addr,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * ixgbe_get_bus_info - Set PCI bus info
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * @hw: pointer to hardware structure
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Sets the PCI bus info (speed, width, type) within the ixgbe_hw structure
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return ixgbe_call_func(hw, hw->mac.ops.get_bus_info, (hw),
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * ixgbe_get_num_of_tx_queues - Get Tx queues
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * @hw: pointer to hardware structure
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Returns the number of transmit queues for the given adapter.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersollixgbe_get_num_of_tx_queues(struct ixgbe_hw *hw)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * ixgbe_get_num_of_rx_queues - Get Rx queues
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * @hw: pointer to hardware structure
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Returns the number of receive queues for the given adapter.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersollixgbe_get_num_of_rx_queues(struct ixgbe_hw *hw)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * ixgbe_stop_adapter - Disable Rx/Tx units
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * @hw: pointer to hardware structure
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Sets the adapter_stopped flag within ixgbe_hw struct. Clears interrupts,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * disables transmit and receive units. The adapter_stopped flag is used by
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * the shared code and drivers to determine if the adapter is in a stopped
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * state and should not touch the hardware.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return ixgbe_call_func(hw, hw->mac.ops.stop_adapter, (hw),
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * ixgbe_read_pba_num - Reads part number from EEPROM
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * @hw: pointer to hardware structure
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * @pba_num: stores the part number from the EEPROM
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Reads the part number from the EEPROM.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersollixgbe_read_pba_num(struct ixgbe_hw *hw, u32 *pba_num)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (ixgbe_read_pba_num_generic(hw, pba_num));
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * ixgbe_identify_phy - Get PHY type
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * @hw: pointer to hardware structure
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Determines the physical layer module found on the current adapter.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * ixgbe_reset_phy - Perform a PHY reset
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * @hw: pointer to hardware structure
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (ixgbe_identify_phy(hw) != IXGBE_SUCCESS) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll status = ixgbe_call_func(hw, hw->phy.ops.reset, (hw),
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * ixgbe_get_phy_firmware_version -
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * @hw: pointer to hardware structure
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * @firmware_version: pointer to firmware version
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersollixgbe_get_phy_firmware_version(struct ixgbe_hw *hw, u16 *firmware_version)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll status = ixgbe_call_func(hw, hw->phy.ops.get_firmware_version,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll (hw, firmware_version), IXGBE_NOT_IMPLEMENTED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * ixgbe_read_phy_reg - Read PHY register
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * @hw: pointer to hardware structure
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * @reg_addr: 32 bit address of PHY register to read
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * @phy_data: Pointer to read data from PHY register
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Reads a value from a specified PHY register
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersollixgbe_read_phy_reg(struct ixgbe_hw *hw, u32 reg_addr, u32 device_type,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return ixgbe_call_func(hw, hw->phy.ops.read_reg, (hw, reg_addr,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll device_type, phy_data), IXGBE_NOT_IMPLEMENTED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * ixgbe_write_phy_reg - Write PHY register
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * @hw: pointer to hardware structure
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * @reg_addr: 32 bit PHY register to write
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * @phy_data: Data to write to the PHY register
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Writes a value to specified PHY register
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersolls32 ixgbe_write_phy_reg(struct ixgbe_hw *hw, u32 reg_addr, u32 device_type,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return ixgbe_call_func(hw, hw->phy.ops.write_reg, (hw, reg_addr,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll device_type, phy_data), IXGBE_NOT_IMPLEMENTED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * ixgbe_setup_phy_link - Restart PHY autoneg
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * @hw: pointer to hardware structure
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Restart autonegotiation and PHY and waits for completion.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return ixgbe_call_func(hw, hw->phy.ops.setup_link, (hw),
bool *link_up)
bool autoneg,
bool autoneg_wait_to_complete)
bool autoneg,
bool autoneg_wait_to_complete)
bool *autoneg)