Print this page
Import some changes from FreeBSD (details later, this is quick-n-dirty for now).
        
*** 1,8 ****
  /******************************************************************************
  
!   Copyright (c) 2001-2012, Intel Corporation 
    All rights reserved.
    
    Redistribution and use in source and binary forms, with or without 
    modification, are permitted provided that the following conditions are met:
    
--- 1,8 ----
  /******************************************************************************
  
!   Copyright (c) 2001-2013, Intel Corporation 
    All rights reserved.
    
    Redistribution and use in source and binary forms, with or without 
    modification, are permitted provided that the following conditions are met:
    
*** 45,54 ****
--- 45,56 ----
  static s32 ixgbe_clock_out_i2c_bit(struct ixgbe_hw *hw, bool data);
  static void ixgbe_raise_i2c_clk(struct ixgbe_hw *hw, u32 *i2cctl);
  static void ixgbe_lower_i2c_clk(struct ixgbe_hw *hw, u32 *i2cctl);
  static s32 ixgbe_set_i2c_data(struct ixgbe_hw *hw, u32 *i2cctl, bool data);
  static bool ixgbe_get_i2c_data(u32 *i2cctl);
+ static s32 ixgbe_read_i2c_sff8472_generic(struct ixgbe_hw *hw, u8 byte_offset,
+                                           u8 *sff8472_data);
  
  /**
   *  ixgbe_init_phy_ops_generic - Inits PHY function ptrs
   *  @hw: pointer to the hardware structure
   *
*** 69,78 ****
--- 71,81 ----
          phy->ops.setup_link_speed = &ixgbe_setup_phy_link_speed_generic;
          phy->ops.check_link = NULL;
          phy->ops.get_firmware_version = ixgbe_get_phy_firmware_version_generic;
          phy->ops.read_i2c_byte = &ixgbe_read_i2c_byte_generic;
          phy->ops.write_i2c_byte = &ixgbe_write_i2c_byte_generic;
+         phy->ops.read_i2c_sff8472 = &ixgbe_read_i2c_sff8472_generic;
          phy->ops.read_i2c_eeprom = &ixgbe_read_i2c_eeprom_generic;
          phy->ops.write_i2c_eeprom = &ixgbe_write_i2c_eeprom_generic;
          phy->ops.i2c_bus_clear = &ixgbe_i2c_bus_clear;
          phy->ops.identify_sfp = &ixgbe_identify_module_generic;
          phy->sfp_type = ixgbe_sfp_type_unknown;
*** 564,581 ****
  
  /**
   *  ixgbe_setup_phy_link_speed_generic - Sets the auto advertised capabilities
   *  @hw: pointer to hardware structure
   *  @speed: new link speed
-  *  @autoneg: TRUE if autonegotiation enabled
   **/
  s32 ixgbe_setup_phy_link_speed_generic(struct ixgbe_hw *hw,
                                         ixgbe_link_speed speed,
-                                        bool autoneg,
                                         bool autoneg_wait_to_complete)
  {
!         UNREFERENCED_2PARAMETER(autoneg, autoneg_wait_to_complete);
  
          DEBUGFUNC("ixgbe_setup_phy_link_speed_generic");
  
          /*
           * Clear autoneg_advertised and set new values based on input link
--- 567,582 ----
  
  /**
   *  ixgbe_setup_phy_link_speed_generic - Sets the auto advertised capabilities
   *  @hw: pointer to hardware structure
   *  @speed: new link speed
   **/
  s32 ixgbe_setup_phy_link_speed_generic(struct ixgbe_hw *hw,
                                         ixgbe_link_speed speed,
                                         bool autoneg_wait_to_complete)
  {
!         UNREFERENCED_1PARAMETER(autoneg_wait_to_complete);
  
          DEBUGFUNC("ixgbe_setup_phy_link_speed_generic");
  
          /*
           * Clear autoneg_advertised and set new values based on input link
*** 973,985 ****
  
          status = hw->phy.ops.read_i2c_eeprom(hw,
                                               IXGBE_SFF_IDENTIFIER,
                                               &identifier);
  
!         if (status == IXGBE_ERR_SWFW_SYNC ||
!             status == IXGBE_ERR_I2C ||
!             status == IXGBE_ERR_SFP_NOT_PRESENT)
                  goto err_read_i2c_eeprom;
  
          /* LAN ID is needed for sfp_type determination */
          hw->mac.ops.set_lan_id(hw);
  
--- 974,984 ----
  
          status = hw->phy.ops.read_i2c_eeprom(hw,
                                               IXGBE_SFF_IDENTIFIER,
                                               &identifier);
  
!         if (status != IXGBE_SUCCESS)
                  goto err_read_i2c_eeprom;
  
          /* LAN ID is needed for sfp_type determination */
          hw->mac.ops.set_lan_id(hw);
  
*** 989,1018 ****
          } else {
                  status = hw->phy.ops.read_i2c_eeprom(hw,
                                                       IXGBE_SFF_1GBE_COMP_CODES,
                                                       &comp_codes_1g);
  
!                 if (status == IXGBE_ERR_SWFW_SYNC ||
!                     status == IXGBE_ERR_I2C ||
!                     status == IXGBE_ERR_SFP_NOT_PRESENT)
                          goto err_read_i2c_eeprom;
  
                  status = hw->phy.ops.read_i2c_eeprom(hw,
                                                       IXGBE_SFF_10GBE_COMP_CODES,
                                                       &comp_codes_10g);
  
!                 if (status == IXGBE_ERR_SWFW_SYNC ||
!                     status == IXGBE_ERR_I2C ||
!                     status == IXGBE_ERR_SFP_NOT_PRESENT)
                          goto err_read_i2c_eeprom;
                  status = hw->phy.ops.read_i2c_eeprom(hw,
                                                       IXGBE_SFF_CABLE_TECHNOLOGY,
                                                       &cable_tech);
  
!                 if (status == IXGBE_ERR_SWFW_SYNC ||
!                     status == IXGBE_ERR_I2C ||
!                     status == IXGBE_ERR_SFP_NOT_PRESENT)
                          goto err_read_i2c_eeprom;
  
                   /* ID Module
                    * =========
                    * 0   SFP_DA_CU
--- 988,1011 ----
          } else {
                  status = hw->phy.ops.read_i2c_eeprom(hw,
                                                       IXGBE_SFF_1GBE_COMP_CODES,
                                                       &comp_codes_1g);
  
!                 if (status != IXGBE_SUCCESS)
                          goto err_read_i2c_eeprom;
  
                  status = hw->phy.ops.read_i2c_eeprom(hw,
                                                       IXGBE_SFF_10GBE_COMP_CODES,
                                                       &comp_codes_10g);
  
!                 if (status != IXGBE_SUCCESS)
                          goto err_read_i2c_eeprom;
                  status = hw->phy.ops.read_i2c_eeprom(hw,
                                                       IXGBE_SFF_CABLE_TECHNOLOGY,
                                                       &cable_tech);
  
!                 if (status != IXGBE_SUCCESS)
                          goto err_read_i2c_eeprom;
  
                   /* ID Module
                    * =========
                    * 0   SFP_DA_CU
*** 1106,1136 ****
                          hw->phy.id = identifier;
                          status = hw->phy.ops.read_i2c_eeprom(hw,
                                                      IXGBE_SFF_VENDOR_OUI_BYTE0,
                                                      &oui_bytes[0]);
  
!                         if (status == IXGBE_ERR_SWFW_SYNC ||
!                             status == IXGBE_ERR_I2C ||
!                             status == IXGBE_ERR_SFP_NOT_PRESENT)
                                  goto err_read_i2c_eeprom;
  
                          status = hw->phy.ops.read_i2c_eeprom(hw,
                                                      IXGBE_SFF_VENDOR_OUI_BYTE1,
                                                      &oui_bytes[1]);
  
!                         if (status == IXGBE_ERR_SWFW_SYNC ||
!                             status == IXGBE_ERR_I2C ||
!                             status == IXGBE_ERR_SFP_NOT_PRESENT)
                                  goto err_read_i2c_eeprom;
  
                          status = hw->phy.ops.read_i2c_eeprom(hw,
                                                      IXGBE_SFF_VENDOR_OUI_BYTE2,
                                                      &oui_bytes[2]);
  
!                         if (status == IXGBE_ERR_SWFW_SYNC ||
!                             status == IXGBE_ERR_I2C ||
!                             status == IXGBE_ERR_SFP_NOT_PRESENT)
                                  goto err_read_i2c_eeprom;
  
                          vendor_oui =
                            ((oui_bytes[0] << IXGBE_SFF_VENDOR_OUI_BYTE0_SHIFT) |
                             (oui_bytes[1] << IXGBE_SFF_VENDOR_OUI_BYTE1_SHIFT) |
--- 1099,1123 ----
                          hw->phy.id = identifier;
                          status = hw->phy.ops.read_i2c_eeprom(hw,
                                                      IXGBE_SFF_VENDOR_OUI_BYTE0,
                                                      &oui_bytes[0]);
  
!                         if (status != IXGBE_SUCCESS)
                                  goto err_read_i2c_eeprom;
  
                          status = hw->phy.ops.read_i2c_eeprom(hw,
                                                      IXGBE_SFF_VENDOR_OUI_BYTE1,
                                                      &oui_bytes[1]);
  
!                         if (status != IXGBE_SUCCESS)
                                  goto err_read_i2c_eeprom;
  
                          status = hw->phy.ops.read_i2c_eeprom(hw,
                                                      IXGBE_SFF_VENDOR_OUI_BYTE2,
                                                      &oui_bytes[2]);
  
!                         if (status != IXGBE_SUCCESS)
                                  goto err_read_i2c_eeprom;
  
                          vendor_oui =
                            ((oui_bytes[0] << IXGBE_SFF_VENDOR_OUI_BYTE0_SHIFT) |
                             (oui_bytes[1] << IXGBE_SFF_VENDOR_OUI_BYTE1_SHIFT) |
*** 1338,1347 ****
--- 1325,1350 ----
                                           IXGBE_I2C_EEPROM_DEV_ADDR,
                                           eeprom_data);
  }
  
  /**
+  *  ixgbe_read_i2c_sff8472_generic - Reads 8 bit word over I2C interface
+  *  @hw: pointer to hardware structure
+  *  @byte_offset: byte offset at address 0xA2
+  *  @eeprom_data: value read
+  *
+  *  Performs byte read operation to SFP module's SFF-8472 data over I2C
+  **/
+ static s32 ixgbe_read_i2c_sff8472_generic(struct ixgbe_hw *hw, u8 byte_offset,
+                                           u8 *sff8472_data)
+ {
+         return hw->phy.ops.read_i2c_byte(hw, byte_offset,
+                                          IXGBE_I2C_EEPROM_DEV_ADDR2,
+                                          sff8472_data);
+ }
+ 
+ /**
   *  ixgbe_write_i2c_eeprom_generic - Writes 8 bit EEPROM word over I2C interface
   *  @hw: pointer to hardware structure
   *  @byte_offset: EEPROM byte offset to write
   *  @eeprom_data: value to write
   *
*** 1430,1442 ****
  
                  ixgbe_i2c_stop(hw);
                  break;
  
  fail:
                  hw->mac.ops.release_swfw_sync(hw, swfw_mask);
                  msec_delay(100);
-                 ixgbe_i2c_bus_clear(hw);
                  retry++;
                  if (retry < max_retry)
                          DEBUGOUT("I2C byte read error - Retrying.\n");
                  else
                          DEBUGOUT("I2C byte read error.\n");
--- 1433,1445 ----
  
                  ixgbe_i2c_stop(hw);
                  break;
  
  fail:
+                 ixgbe_i2c_bus_clear(hw);
                  hw->mac.ops.release_swfw_sync(hw, swfw_mask);
                  msec_delay(100);
                  retry++;
                  if (retry < max_retry)
                          DEBUGOUT("I2C byte read error - Retrying.\n");
                  else
                          DEBUGOUT("I2C byte read error.\n");