Print this page
Import some changes from FreeBSD (details later, this is quick-n-dirty for now).
        
@@ -1,8 +1,8 @@
 /******************************************************************************
 
-  Copyright (c) 2001-2012, Intel Corporation 
+  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,10 +45,12 @@
 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,10 +71,11 @@
         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,18 +567,16 @@
 
 /**
  *  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);
+        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,13 +974,11 @@
 
         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)
+        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,30 +988,24 @@
         } 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)
+                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_ERR_SWFW_SYNC ||
-                    status == IXGBE_ERR_I2C ||
-                    status == IXGBE_ERR_SFP_NOT_PRESENT)
+                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_ERR_SWFW_SYNC ||
-                    status == IXGBE_ERR_I2C ||
-                    status == IXGBE_ERR_SFP_NOT_PRESENT)
+                if (status != IXGBE_SUCCESS)
                         goto err_read_i2c_eeprom;
 
                  /* ID Module
                   * =========
                   * 0   SFP_DA_CU
@@ -1106,31 +1099,25 @@
                         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)
+                        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_ERR_SWFW_SYNC ||
-                            status == IXGBE_ERR_I2C ||
-                            status == IXGBE_ERR_SFP_NOT_PRESENT)
+                        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_ERR_SWFW_SYNC ||
-                            status == IXGBE_ERR_I2C ||
-                            status == IXGBE_ERR_SFP_NOT_PRESENT)
+                        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,10 +1325,26 @@
                                          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,13 +1433,13 @@
 
                 ixgbe_i2c_stop(hw);
                 break;
 
 fail:
+                ixgbe_i2c_bus_clear(hw);
                 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");