|
@@ -819,6 +819,9 @@ s32 ixgbe_reset_hw_82599(struct ixgbe_hw *hw)
|
|
|
/* Store the permanent mac address */
|
|
|
hw->mac.ops.get_mac_addr(hw, hw->mac.perm_addr);
|
|
|
|
|
|
+ /* Store the permanent SAN mac address */
|
|
|
+ hw->mac.ops.get_san_mac_addr(hw, hw->mac.san_addr);
|
|
|
+
|
|
|
reset_hw_out:
|
|
|
return status;
|
|
|
}
|
|
@@ -1294,6 +1297,75 @@ s32 ixgbe_get_device_caps_82599(struct ixgbe_hw *hw, u16 *device_caps)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * ixgbe_get_san_mac_addr_offset_82599 - SAN MAC address offset for 82599
|
|
|
+ * @hw: pointer to hardware structure
|
|
|
+ * @san_mac_offset: SAN MAC address offset
|
|
|
+ *
|
|
|
+ * This function will read the EEPROM location for the SAN MAC address
|
|
|
+ * pointer, and returns the value at that location. This is used in both
|
|
|
+ * get and set mac_addr routines.
|
|
|
+ **/
|
|
|
+s32 ixgbe_get_san_mac_addr_offset_82599(struct ixgbe_hw *hw,
|
|
|
+ u16 *san_mac_offset)
|
|
|
+{
|
|
|
+ /*
|
|
|
+ * First read the EEPROM pointer to see if the MAC addresses are
|
|
|
+ * available.
|
|
|
+ */
|
|
|
+ hw->eeprom.ops.read(hw, IXGBE_SAN_MAC_ADDR_PTR, san_mac_offset);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * ixgbe_get_san_mac_addr_82599 - SAN MAC address retrieval for 82599
|
|
|
+ * @hw: pointer to hardware structure
|
|
|
+ * @san_mac_addr: SAN MAC address
|
|
|
+ *
|
|
|
+ * Reads the SAN MAC address from the EEPROM, if it's available. This is
|
|
|
+ * per-port, so set_lan_id() must be called before reading the addresses.
|
|
|
+ * set_lan_id() is called by identify_sfp(), but this cannot be relied
|
|
|
+ * upon for non-SFP connections, so we must call it here.
|
|
|
+ **/
|
|
|
+s32 ixgbe_get_san_mac_addr_82599(struct ixgbe_hw *hw, u8 *san_mac_addr)
|
|
|
+{
|
|
|
+ u16 san_mac_data, san_mac_offset;
|
|
|
+ u8 i;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * First read the EEPROM pointer to see if the MAC addresses are
|
|
|
+ * available. If they're not, no point in calling set_lan_id() here.
|
|
|
+ */
|
|
|
+ ixgbe_get_san_mac_addr_offset_82599(hw, &san_mac_offset);
|
|
|
+
|
|
|
+ if ((san_mac_offset == 0) || (san_mac_offset == 0xFFFF)) {
|
|
|
+ /*
|
|
|
+ * No addresses available in this EEPROM. It's not an
|
|
|
+ * error though, so just wipe the local address and return.
|
|
|
+ */
|
|
|
+ for (i = 0; i < 6; i++)
|
|
|
+ san_mac_addr[i] = 0xFF;
|
|
|
+
|
|
|
+ goto san_mac_addr_out;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* make sure we know which port we need to program */
|
|
|
+ hw->mac.ops.set_lan_id(hw);
|
|
|
+ /* apply the port offset to the address offset */
|
|
|
+ (hw->bus.func) ? (san_mac_offset += IXGBE_SAN_MAC_ADDR_PORT1_OFFSET) :
|
|
|
+ (san_mac_offset += IXGBE_SAN_MAC_ADDR_PORT0_OFFSET);
|
|
|
+ for (i = 0; i < 3; i++) {
|
|
|
+ hw->eeprom.ops.read(hw, san_mac_offset, &san_mac_data);
|
|
|
+ san_mac_addr[i * 2] = (u8)(san_mac_data);
|
|
|
+ san_mac_addr[i * 2 + 1] = (u8)(san_mac_data >> 8);
|
|
|
+ san_mac_offset++;
|
|
|
+ }
|
|
|
+
|
|
|
+san_mac_addr_out:
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
static struct ixgbe_mac_operations mac_ops_82599 = {
|
|
|
.init_hw = &ixgbe_init_hw_generic,
|
|
|
.reset_hw = &ixgbe_reset_hw_82599,
|
|
@@ -1303,6 +1375,7 @@ static struct ixgbe_mac_operations mac_ops_82599 = {
|
|
|
.get_supported_physical_layer = &ixgbe_get_supported_physical_layer_82599,
|
|
|
.enable_rx_dma = &ixgbe_enable_rx_dma_82599,
|
|
|
.get_mac_addr = &ixgbe_get_mac_addr_generic,
|
|
|
+ .get_san_mac_addr = &ixgbe_get_san_mac_addr_82599,
|
|
|
.get_device_caps = &ixgbe_get_device_caps_82599,
|
|
|
.stop_adapter = &ixgbe_stop_adapter_generic,
|
|
|
.get_bus_info = &ixgbe_get_bus_info_generic,
|