mirror of
https://github.com/torvalds/linux.git
synced 2026-09-22 04:34:03 +02:00
net: ethernet: oa_tc6: add OA_TC6_BROKEN_PHY quirk flag
Some MAC-PHY devices need custom MDIO bus access functions to work around hardware issues. Add the OA_TC6_BROKEN_PHY quirk flag so drivers can opt in to skip oa_tc6's internal PHY init and manage the PHY themselves. When the flag is set, oa_tc6 skips MDIO bus registration, PHY discovery and PHY connection, leaving these to the driver. Drivers that do not set the flag retain the existing behavior. Update lan865x and the framework documentation accordingly. Signed-off-by: Ciprian Regus <ciprian.regus@analog.com> Link: https://patch.msgid.link/20260708-adin1140-driver-v5-3-4aca7b51a58b@analog.com Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
parent
7d0e4c4b8c
commit
1d030cdd52
|
|
@ -454,7 +454,8 @@ Device drivers API
|
|||
The include/linux/oa_tc6.h defines the following functions:
|
||||
|
||||
.. c:function:: struct oa_tc6 *oa_tc6_init(struct spi_device *spi, \
|
||||
struct net_device *netdev)
|
||||
struct net_device *netdev, \
|
||||
struct oa_tc6_quirks *quirks)
|
||||
|
||||
Initialize OA TC6 lib.
|
||||
|
||||
|
|
|
|||
|
|
@ -346,7 +346,7 @@ static int lan865x_probe(struct spi_device *spi)
|
|||
spi_set_drvdata(spi, priv);
|
||||
INIT_WORK(&priv->multicast_work, lan865x_multicast_work_handler);
|
||||
|
||||
priv->tc6 = oa_tc6_init(spi, netdev);
|
||||
priv->tc6 = oa_tc6_init(spi, netdev, NULL);
|
||||
if (!priv->tc6) {
|
||||
ret = -ENODEV;
|
||||
goto free_netdev;
|
||||
|
|
|
|||
|
|
@ -135,6 +135,7 @@ struct oa_tc6 {
|
|||
bool int_flag;
|
||||
bool disable_traffic;
|
||||
bool prot_ctrl;
|
||||
enum oa_tc6_quirk_flag quirk_flags;
|
||||
};
|
||||
|
||||
enum oa_tc6_header_type {
|
||||
|
|
@ -581,6 +582,9 @@ static int oa_tc6_phy_init(struct oa_tc6 *tc6)
|
|||
{
|
||||
int ret;
|
||||
|
||||
if (tc6->quirk_flags & OA_TC6_BROKEN_PHY)
|
||||
return 0;
|
||||
|
||||
ret = oa_tc6_check_phy_reg_direct_access_capability(tc6);
|
||||
if (ret) {
|
||||
netdev_err(tc6->netdev,
|
||||
|
|
@ -617,6 +621,9 @@ static int oa_tc6_phy_init(struct oa_tc6 *tc6)
|
|||
|
||||
static void oa_tc6_phy_exit(struct oa_tc6 *tc6)
|
||||
{
|
||||
if (tc6->quirk_flags & OA_TC6_BROKEN_PHY)
|
||||
return;
|
||||
|
||||
phy_disconnect(tc6->phydev);
|
||||
oa_tc6_mdiobus_unregister(tc6);
|
||||
}
|
||||
|
|
@ -1327,11 +1334,13 @@ static int oa_tc6_check_ctrl_protection(struct oa_tc6 *tc6)
|
|||
* oa_tc6_init - allocates and initializes oa_tc6 structure.
|
||||
* @spi: device with which data will be exchanged.
|
||||
* @netdev: network device interface structure.
|
||||
* @quirks: device specific modifiers for the OA TC6 protocol.
|
||||
*
|
||||
* Return: pointer reference to the oa_tc6 structure if the MAC-PHY
|
||||
* initialization is successful otherwise NULL.
|
||||
*/
|
||||
struct oa_tc6 *oa_tc6_init(struct spi_device *spi, struct net_device *netdev)
|
||||
struct oa_tc6 *oa_tc6_init(struct spi_device *spi, struct net_device *netdev,
|
||||
struct oa_tc6_quirks *quirks)
|
||||
{
|
||||
struct oa_tc6 *tc6;
|
||||
int ret;
|
||||
|
|
@ -1346,6 +1355,9 @@ struct oa_tc6 *oa_tc6_init(struct spi_device *spi, struct net_device *netdev)
|
|||
mutex_init(&tc6->spi_ctrl_lock);
|
||||
spin_lock_init(&tc6->tx_skb_lock);
|
||||
|
||||
if (quirks)
|
||||
tc6->quirk_flags = quirks->quirk_flags;
|
||||
|
||||
/* Set the SPI controller to pump at realtime priority */
|
||||
tc6->spi->rt = true;
|
||||
if (spi_setup(tc6->spi) < 0)
|
||||
|
|
|
|||
|
|
@ -12,7 +12,16 @@
|
|||
|
||||
struct oa_tc6;
|
||||
|
||||
struct oa_tc6 *oa_tc6_init(struct spi_device *spi, struct net_device *netdev);
|
||||
enum oa_tc6_quirk_flag {
|
||||
OA_TC6_BROKEN_PHY = BIT(0),
|
||||
};
|
||||
|
||||
struct oa_tc6_quirks {
|
||||
enum oa_tc6_quirk_flag quirk_flags;
|
||||
};
|
||||
|
||||
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_registers(struct oa_tc6 *tc6, u32 address, u32 value[],
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user