net: ethernet: oa_tc6: Add read_mms/write_mms register access functions

The Open Alliance TC6 standard defines multiple memory maps for the
MAC-PHY's register space. These are used to separate standard, vendor
and PHY MMD specific registers. Define register access functions that
allow the caller to specify the MMS.

Signed-off-by: Ciprian Regus <ciprian.regus@analog.com>
Link: https://patch.msgid.link/20260708-adin1140-driver-v5-7-4aca7b51a58b@analog.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
Ciprian Regus 2026-07-08 01:33:35 +03:00 committed by Paolo Abeni
parent 31bc75f17c
commit 6ad2501794
2 changed files with 48 additions and 0 deletions

View File

@ -62,6 +62,8 @@
#define STATUS0_RESETC_POLL_DELAY 1000
#define STATUS0_RESETC_POLL_TIMEOUT 1000000
#define OA_TC6_REG_MMS_MASK GENMASK(19, 16)
/* Internal structure for MAC-PHY drivers */
struct oa_tc6 {
struct net_device *netdev;
@ -343,6 +345,27 @@ int oa_tc6_read_register(struct oa_tc6 *tc6, u32 address, u32 *value)
}
EXPORT_SYMBOL_GPL(oa_tc6_read_register);
/**
* oa_tc6_read_register_mms - function for reading a MAC-PHY register in a
* specified memory map.
* @tc6: oa_tc6 struct.
* @mms: Memory map selector for the register.
* @address: register address of the MAC-PHY to be read.
* @value: value read from the @address register address of the MAC-PHY.
*
* Return: 0 on success or a negative error code on failure.
*/
int oa_tc6_read_register_mms(struct oa_tc6 *tc6, u8 mms, u16 address,
u32 *value)
{
u32 mms_reg;
mms_reg = FIELD_PREP(OA_TC6_REG_MMS_MASK, mms) | address;
return oa_tc6_read_registers(tc6, mms_reg, value, 1);
}
EXPORT_SYMBOL_GPL(oa_tc6_read_register_mms);
/**
* oa_tc6_write_registers - function for writing multiple consecutive registers.
* @tc6: oa_tc6 struct.
@ -387,6 +410,27 @@ int oa_tc6_write_register(struct oa_tc6 *tc6, u32 address, u32 value)
}
EXPORT_SYMBOL_GPL(oa_tc6_write_register);
/**
* oa_tc6_write_register_mms - function for writing a MAC-PHY register in a
* specified memory map.
* @tc6: oa_tc6 struct.
* @mms: Memory map selector for the register.
* @address: register address of the MAC-PHY to be written.
* @value: value to be written in the @address register address of the MAC-PHY.
*
* Return: 0 on success or a negative error code on failure.
*/
int oa_tc6_write_register_mms(struct oa_tc6 *tc6, u8 mms, u16 address,
u32 value)
{
u32 mms_reg;
mms_reg = FIELD_PREP(OA_TC6_REG_MMS_MASK, mms) | address;
return oa_tc6_write_registers(tc6, mms_reg, &value, 1);
}
EXPORT_SYMBOL_GPL(oa_tc6_write_register_mms);
static int oa_tc6_check_phy_reg_direct_access_capability(struct oa_tc6 *tc6)
{
u32 regval;

View File

@ -74,9 +74,13 @@ struct oa_tc6 *oa_tc6_init(struct spi_device *spi, struct net_device *netdev,
struct oa_tc6_quirks *quirks);
void oa_tc6_exit(struct oa_tc6 *tc6);
int oa_tc6_write_register(struct oa_tc6 *tc6, u32 address, u32 value);
int oa_tc6_write_register_mms(struct oa_tc6 *tc6, u8 mms, u16 address,
u32 value);
int oa_tc6_write_registers(struct oa_tc6 *tc6, u32 address, u32 value[],
u8 length);
int oa_tc6_read_register(struct oa_tc6 *tc6, u32 address, u32 *value);
int oa_tc6_read_register_mms(struct oa_tc6 *tc6, u8 mms, u16 address,
u32 *value);
int oa_tc6_read_registers(struct oa_tc6 *tc6, u32 address, u32 value[],
u8 length);
netdev_tx_t oa_tc6_start_xmit(struct oa_tc6 *tc6, struct sk_buff *skb);