i40e: move to drivers/net/
[dpdk.git] / lib / librte_pmd_ixgbe / ixgbe / ixgbe_82598.c
index edbec95..4e06550 100644 (file)
@@ -1,6 +1,6 @@
 /*******************************************************************************
 
-Copyright (c) 2001-2012, Intel Corporation
+Copyright (c) 2001-2014, Intel Corporation
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
@@ -36,7 +36,6 @@ POSSIBILITY OF SUCH DAMAGE.
 #include "ixgbe_api.h"
 #include "ixgbe_common.h"
 #include "ixgbe_phy.h"
-#ident "$Id: ixgbe_82598.c,v 1.194 2012/03/28 00:54:08 jtkirshe Exp $"
 
 #define IXGBE_82598_MAX_TX_QUEUES 32
 #define IXGBE_82598_MAX_RX_QUEUES 64
@@ -65,7 +64,8 @@ STATIC s32 ixgbe_clear_vmdq_82598(struct ixgbe_hw *hw, u32 rar, u32 vmdq);
 STATIC s32 ixgbe_clear_vfta_82598(struct ixgbe_hw *hw);
 STATIC void ixgbe_set_rxpba_82598(struct ixgbe_hw *hw, int num_pb,
                                  u32 headroom, int strategy);
-
+STATIC s32 ixgbe_read_i2c_sff8472_82598(struct ixgbe_hw *hw, u8 byte_offset,
+                                       u8 *sff8472_data);
 /**
  *  ixgbe_set_pcie_completion_timeout - set pci-e completion timeout
  *  @hw: pointer to the HW structure
@@ -127,29 +127,29 @@ s32 ixgbe_init_ops_82598(struct ixgbe_hw *hw)
        ret_val = ixgbe_init_ops_generic(hw);
 
        /* PHY */
-       phy->ops.init = &ixgbe_init_phy_ops_82598;
+       phy->ops.init = ixgbe_init_phy_ops_82598;
 
        /* MAC */
-       mac->ops.start_hw = &ixgbe_start_hw_82598;
-       mac->ops.enable_relaxed_ordering = &ixgbe_enable_relaxed_ordering_82598;
-       mac->ops.reset_hw = &ixgbe_reset_hw_82598;
-       mac->ops.get_media_type = &ixgbe_get_media_type_82598;
+       mac->ops.start_hw = ixgbe_start_hw_82598;
+       mac->ops.enable_relaxed_ordering = ixgbe_enable_relaxed_ordering_82598;
+       mac->ops.reset_hw = ixgbe_reset_hw_82598;
+       mac->ops.get_media_type = ixgbe_get_media_type_82598;
        mac->ops.get_supported_physical_layer =
-                               &ixgbe_get_supported_physical_layer_82598;
-       mac->ops.read_analog_reg8 = &ixgbe_read_analog_reg8_82598;
-       mac->ops.write_analog_reg8 = &ixgbe_write_analog_reg8_82598;
-       mac->ops.set_lan_id = &ixgbe_set_lan_id_multi_port_pcie_82598;
-       mac->ops.enable_rx_dma = &ixgbe_enable_rx_dma_82598;
+                               ixgbe_get_supported_physical_layer_82598;
+       mac->ops.read_analog_reg8 = ixgbe_read_analog_reg8_82598;
+       mac->ops.write_analog_reg8 = ixgbe_write_analog_reg8_82598;
+       mac->ops.set_lan_id = ixgbe_set_lan_id_multi_port_pcie_82598;
+       mac->ops.enable_rx_dma = ixgbe_enable_rx_dma_82598;
 
        /* RAR, Multicast, VLAN */
-       mac->ops.set_vmdq = &ixgbe_set_vmdq_82598;
-       mac->ops.clear_vmdq = &ixgbe_clear_vmdq_82598;
-       mac->ops.set_vfta = &ixgbe_set_vfta_82598;
+       mac->ops.set_vmdq = ixgbe_set_vmdq_82598;
+       mac->ops.clear_vmdq = ixgbe_clear_vmdq_82598;
+       mac->ops.set_vfta = ixgbe_set_vfta_82598;
        mac->ops.set_vlvf = NULL;
-       mac->ops.clear_vfta = &ixgbe_clear_vfta_82598;
+       mac->ops.clear_vfta = ixgbe_clear_vfta_82598;
 
        /* Flow Control */
-       mac->ops.fc_enable = &ixgbe_fc_enable_82598;
+       mac->ops.fc_enable = ixgbe_fc_enable_82598;
 
        mac->mcft_size          = IXGBE_82598_MC_TBL_SIZE;
        mac->vft_size           = IXGBE_82598_VFT_TBL_SIZE;
@@ -160,14 +160,15 @@ s32 ixgbe_init_ops_82598(struct ixgbe_hw *hw)
        mac->max_msix_vectors   = ixgbe_get_pcie_msix_count_generic(hw);
 
        /* SFP+ Module */
-       phy->ops.read_i2c_eeprom = &ixgbe_read_i2c_eeprom_82598;
+       phy->ops.read_i2c_eeprom = ixgbe_read_i2c_eeprom_82598;
+       phy->ops.read_i2c_sff8472 = ixgbe_read_i2c_sff8472_82598;
 
        /* Link */
-       mac->ops.check_link = &ixgbe_check_mac_link_82598;
-       mac->ops.setup_link = &ixgbe_setup_mac_link_82598;
+       mac->ops.check_link = ixgbe_check_mac_link_82598;
+       mac->ops.setup_link = ixgbe_setup_mac_link_82598;
        mac->ops.flap_tx_laser = NULL;
-       mac->ops.get_link_capabilities = &ixgbe_get_link_capabilities_82598;
-       mac->ops.setup_rxpba = &ixgbe_set_rxpba_82598;
+       mac->ops.get_link_capabilities = ixgbe_get_link_capabilities_82598;
+       mac->ops.setup_rxpba = ixgbe_set_rxpba_82598;
 
        /* Manageability interface */
        mac->ops.set_fw_drv_ver = NULL;
@@ -200,20 +201,20 @@ s32 ixgbe_init_phy_ops_82598(struct ixgbe_hw *hw)
 
        /* Overwrite the link function pointers if copper PHY */
        if (mac->ops.get_media_type(hw) == ixgbe_media_type_copper) {
-               mac->ops.setup_link = &ixgbe_setup_copper_link_82598;
+               mac->ops.setup_link = ixgbe_setup_copper_link_82598;
                mac->ops.get_link_capabilities =
-                               &ixgbe_get_copper_link_capabilities_generic;
+                               ixgbe_get_copper_link_capabilities_generic;
        }
 
        switch (hw->phy.type) {
        case ixgbe_phy_tn:
-               phy->ops.setup_link = &ixgbe_setup_phy_link_tnx;
-               phy->ops.check_link = &ixgbe_check_phy_link_tnx;
+               phy->ops.setup_link = ixgbe_setup_phy_link_tnx;
+               phy->ops.check_link = ixgbe_check_phy_link_tnx;
                phy->ops.get_firmware_version =
-                                       &ixgbe_get_phy_firmware_version_tnx;
+                                       ixgbe_get_phy_firmware_version_tnx;
                break;
        case ixgbe_phy_nl:
-               phy->ops.reset = &ixgbe_reset_phy_nl;
+               phy->ops.reset = ixgbe_reset_phy_nl;
 
                /* Call SFP+ identify routine to get the SFP+ module type */
                ret_val = phy->ops.identify_sfp(hw);
@@ -1108,15 +1109,16 @@ s32 ixgbe_write_analog_reg8_82598(struct ixgbe_hw *hw, u32 reg, u8 val)
 }
 
 /**
- *  ixgbe_read_i2c_eeprom_82598 - Reads 8 bit word over I2C interface.
+ *  ixgbe_read_i2c_phy_82598 - Reads 8 bit word over I2C interface.
  *  @hw: pointer to hardware structure
- *  @byte_offset: EEPROM byte offset to read
+ *  @dev_addr: address to read from
+ *  @byte_offset: byte offset to read from dev_addr
  *  @eeprom_data: value read
  *
  *  Performs 8 byte read operation to SFP module's EEPROM over I2C interface.
  **/
-s32 ixgbe_read_i2c_eeprom_82598(struct ixgbe_hw *hw, u8 byte_offset,
-                               u8 *eeprom_data)
+STATIC s32 ixgbe_read_i2c_phy_82598(struct ixgbe_hw *hw, u8 dev_addr,
+                                   u8 byte_offset, u8 *eeprom_data)
 {
        s32 status = IXGBE_SUCCESS;
        u16 sfp_addr = 0;
@@ -1125,7 +1127,7 @@ s32 ixgbe_read_i2c_eeprom_82598(struct ixgbe_hw *hw, u8 byte_offset,
        u16 gssr;
        u32 i;
 
-       DEBUGFUNC("ixgbe_read_i2c_eeprom_82598");
+       DEBUGFUNC("ixgbe_read_i2c_phy_82598");
 
        if (IXGBE_READ_REG(hw, IXGBE_STATUS) & IXGBE_STATUS_LAN_ID_1)
                gssr = IXGBE_GSSR_PHY1_SM;
@@ -1141,19 +1143,19 @@ s32 ixgbe_read_i2c_eeprom_82598(struct ixgbe_hw *hw, u8 byte_offset,
                 * 0xC30D. These registers are used to talk to the SFP+
                 * module's EEPROM through the SDA/SCL (I2C) interface.
                 */
-               sfp_addr = (IXGBE_I2C_EEPROM_DEV_ADDR << 8) + byte_offset;
+               sfp_addr = (dev_addr << 8) + byte_offset;
                sfp_addr = (sfp_addr | IXGBE_I2C_EEPROM_READ_MASK);
-               hw->phy.ops.write_reg(hw,
-                                     IXGBE_MDIO_PMA_PMD_SDA_SCL_ADDR,
-                                     IXGBE_MDIO_PMA_PMD_DEV_TYPE,
-                                     sfp_addr);
+               hw->phy.ops.write_reg_mdi(hw,
+                                         IXGBE_MDIO_PMA_PMD_SDA_SCL_ADDR,
+                                         IXGBE_MDIO_PMA_PMD_DEV_TYPE,
+                                         sfp_addr);
 
                /* Poll status */
                for (i = 0; i < 100; i++) {
-                       hw->phy.ops.read_reg(hw,
-                                            IXGBE_MDIO_PMA_PMD_SDA_SCL_STAT,
-                                            IXGBE_MDIO_PMA_PMD_DEV_TYPE,
-                                            &sfp_stat);
+                       hw->phy.ops.read_reg_mdi(hw,
+                                               IXGBE_MDIO_PMA_PMD_SDA_SCL_STAT,
+                                               IXGBE_MDIO_PMA_PMD_DEV_TYPE,
+                                               &sfp_stat);
                        sfp_stat = sfp_stat & IXGBE_I2C_EEPROM_STATUS_MASK;
                        if (sfp_stat != IXGBE_I2C_EEPROM_STATUS_IN_PROGRESS)
                                break;
@@ -1167,13 +1169,12 @@ s32 ixgbe_read_i2c_eeprom_82598(struct ixgbe_hw *hw, u8 byte_offset,
                }
 
                /* Read data */
-               hw->phy.ops.read_reg(hw, IXGBE_MDIO_PMA_PMD_SDA_SCL_DATA,
-                                    IXGBE_MDIO_PMA_PMD_DEV_TYPE, &sfp_data);
+               hw->phy.ops.read_reg_mdi(hw, IXGBE_MDIO_PMA_PMD_SDA_SCL_DATA,
+                                       IXGBE_MDIO_PMA_PMD_DEV_TYPE, &sfp_data);
 
                *eeprom_data = (u8)(sfp_data >> 8);
        } else {
                status = IXGBE_ERR_PHY;
-               goto out;
        }
 
 out:
@@ -1181,6 +1182,36 @@ out:
        return status;
 }
 
+/**
+ *  ixgbe_read_i2c_eeprom_82598 - Reads 8 bit word over I2C interface.
+ *  @hw: pointer to hardware structure
+ *  @byte_offset: EEPROM byte offset to read
+ *  @eeprom_data: value read
+ *
+ *  Performs 8 byte read operation to SFP module's EEPROM over I2C interface.
+ **/
+s32 ixgbe_read_i2c_eeprom_82598(struct ixgbe_hw *hw, u8 byte_offset,
+                               u8 *eeprom_data)
+{
+       return ixgbe_read_i2c_phy_82598(hw, IXGBE_I2C_EEPROM_DEV_ADDR,
+                                       byte_offset, eeprom_data);
+}
+
+/**
+ *  ixgbe_read_i2c_sff8472_82598 - Reads 8 bit word over I2C interface.
+ *  @hw: pointer to hardware structure
+ *  @byte_offset: byte offset at address 0xA2
+ *  @eeprom_data: value read
+ *
+ *  Performs 8 byte read operation to SFP module's SFF-8472 data over I2C
+ **/
+STATIC s32 ixgbe_read_i2c_sff8472_82598(struct ixgbe_hw *hw, u8 byte_offset,
+                                       u8 *sff8472_data)
+{
+       return ixgbe_read_i2c_phy_82598(hw, IXGBE_I2C_EEPROM_DEV_ADDR2,
+                                       byte_offset, sff8472_data);
+}
+
 /**
  *  ixgbe_get_supported_physical_layer_82598 - Returns physical layer type
  *  @hw: pointer to hardware structure
@@ -1385,8 +1416,6 @@ STATIC void ixgbe_set_rxpba_82598(struct ixgbe_hw *hw, int num_pb,
        /* Setup Tx packet buffer sizes */
        for (i = 0; i < IXGBE_MAX_PACKET_BUFFERS; i++)
                IXGBE_WRITE_REG(hw, IXGBE_TXPBSIZE(i), IXGBE_TXPBSIZE_40KB);
-
-       return;
 }
 
 /**