mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-26 19:00:25 +00:00
![Stas Sergeev](/assets/img/avatar_default.png)
Currently fixed_phy uses a callback to periodically poll the link state. This patch adds the fixed_phy_update_state() API. It solves the following problems: - On link state interrupt, MAC driver can't update status. Instead it needs to provide the callback to periodically query the HW about the link state. It is more efficient to update status after interrupt. - The callback needs to be unregistered before phy_disconnect(), or otherwise it will be called with net_dev==NULL. phy_disconnect() does not have enough info to unregister the callback automatically. - The callback needs to be registered before of_phy_connect() to avoid running with outdated state, but of_phy_connect() returns the phy_device pointer, which is needed to register the callback. Registering it before of_phy_connect() will therefore require a hack to get the pointer earlier. Overall, this addition makes the subsequent patch that implements SGMII link status for mvneta, much cleaner. CC: Florian Fainelli <f.fainelli@gmail.com> CC: netdev@vger.kernel.org CC: linux-kernel@vger.kernel.org Signed-off-by: Stas Sergeev <stsp@users.sourceforge.net> Signed-off-by: David S. Miller <davem@davemloft.net>
57 lines
1.5 KiB
C
57 lines
1.5 KiB
C
#ifndef __PHY_FIXED_H
|
|
#define __PHY_FIXED_H
|
|
|
|
struct fixed_phy_status {
|
|
int link;
|
|
int speed;
|
|
int duplex;
|
|
int pause;
|
|
int asym_pause;
|
|
};
|
|
|
|
struct device_node;
|
|
|
|
#if IS_ENABLED(CONFIG_FIXED_PHY)
|
|
extern int fixed_phy_add(unsigned int irq, int phy_id,
|
|
struct fixed_phy_status *status);
|
|
extern struct phy_device *fixed_phy_register(unsigned int irq,
|
|
struct fixed_phy_status *status,
|
|
struct device_node *np);
|
|
extern void fixed_phy_del(int phy_addr);
|
|
extern int fixed_phy_set_link_update(struct phy_device *phydev,
|
|
int (*link_update)(struct net_device *,
|
|
struct fixed_phy_status *));
|
|
extern int fixed_phy_update_state(struct phy_device *phydev,
|
|
const struct fixed_phy_status *status,
|
|
const struct fixed_phy_status *changed);
|
|
#else
|
|
static inline int fixed_phy_add(unsigned int irq, int phy_id,
|
|
struct fixed_phy_status *status)
|
|
{
|
|
return -ENODEV;
|
|
}
|
|
static inline struct phy_device *fixed_phy_register(unsigned int irq,
|
|
struct fixed_phy_status *status,
|
|
struct device_node *np)
|
|
{
|
|
return ERR_PTR(-ENODEV);
|
|
}
|
|
static inline int fixed_phy_del(int phy_addr)
|
|
{
|
|
return -ENODEV;
|
|
}
|
|
static inline int fixed_phy_set_link_update(struct phy_device *phydev,
|
|
int (*link_update)(struct net_device *,
|
|
struct fixed_phy_status *))
|
|
{
|
|
return -ENODEV;
|
|
}
|
|
static inline int fixed_phy_update_state(struct phy_device *phydev,
|
|
const struct fixed_phy_status *status,
|
|
const struct fixed_phy_status *changed)
|
|
{
|
|
return -ENODEV;
|
|
}
|
|
#endif /* CONFIG_FIXED_PHY */
|
|
|
|
#endif /* __PHY_FIXED_H */
|