|
@@ -708,3 +708,68 @@ s32 igb_valid_led_default_i210(struct e1000_hw *hw, u16 *data)
|
|
|
out:
|
|
|
return ret_val;
|
|
|
}
|
|
|
+
|
|
|
+/**
|
|
|
+ * __igb_access_xmdio_reg - Read/write XMDIO register
|
|
|
+ * @hw: pointer to the HW structure
|
|
|
+ * @address: XMDIO address to program
|
|
|
+ * @dev_addr: device address to program
|
|
|
+ * @data: pointer to value to read/write from/to the XMDIO address
|
|
|
+ * @read: boolean flag to indicate read or write
|
|
|
+ **/
|
|
|
+static s32 __igb_access_xmdio_reg(struct e1000_hw *hw, u16 address,
|
|
|
+ u8 dev_addr, u16 *data, bool read)
|
|
|
+{
|
|
|
+ s32 ret_val = E1000_SUCCESS;
|
|
|
+
|
|
|
+ ret_val = hw->phy.ops.write_reg(hw, E1000_MMDAC, dev_addr);
|
|
|
+ if (ret_val)
|
|
|
+ return ret_val;
|
|
|
+
|
|
|
+ ret_val = hw->phy.ops.write_reg(hw, E1000_MMDAAD, address);
|
|
|
+ if (ret_val)
|
|
|
+ return ret_val;
|
|
|
+
|
|
|
+ ret_val = hw->phy.ops.write_reg(hw, E1000_MMDAC, E1000_MMDAC_FUNC_DATA |
|
|
|
+ dev_addr);
|
|
|
+ if (ret_val)
|
|
|
+ return ret_val;
|
|
|
+
|
|
|
+ if (read)
|
|
|
+ ret_val = hw->phy.ops.read_reg(hw, E1000_MMDAAD, data);
|
|
|
+ else
|
|
|
+ ret_val = hw->phy.ops.write_reg(hw, E1000_MMDAAD, *data);
|
|
|
+ if (ret_val)
|
|
|
+ return ret_val;
|
|
|
+
|
|
|
+ /* Recalibrate the device back to 0 */
|
|
|
+ ret_val = hw->phy.ops.write_reg(hw, E1000_MMDAC, 0);
|
|
|
+ if (ret_val)
|
|
|
+ return ret_val;
|
|
|
+
|
|
|
+ return ret_val;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * igb_read_xmdio_reg - Read XMDIO register
|
|
|
+ * @hw: pointer to the HW structure
|
|
|
+ * @addr: XMDIO address to program
|
|
|
+ * @dev_addr: device address to program
|
|
|
+ * @data: value to be read from the EMI address
|
|
|
+ **/
|
|
|
+s32 igb_read_xmdio_reg(struct e1000_hw *hw, u16 addr, u8 dev_addr, u16 *data)
|
|
|
+{
|
|
|
+ return __igb_access_xmdio_reg(hw, addr, dev_addr, data, true);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * igb_write_xmdio_reg - Write XMDIO register
|
|
|
+ * @hw: pointer to the HW structure
|
|
|
+ * @addr: XMDIO address to program
|
|
|
+ * @dev_addr: device address to program
|
|
|
+ * @data: value to be written to the XMDIO address
|
|
|
+ **/
|
|
|
+s32 igb_write_xmdio_reg(struct e1000_hw *hw, u16 addr, u8 dev_addr, u16 data)
|
|
|
+{
|
|
|
+ return __igb_access_xmdio_reg(hw, addr, dev_addr, &data, false);
|
|
|
+}
|