staging: octeon-ethernet: consolidate ndo_open functions
ndo_open for rgmii, sgmii and xaui are almost identical. Put the common code in a single function. Signed-off-by: Aaro Koskinen <aaro.koskinen@iki.fi> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
32b249b0f5
commit
9e3ae4f9ae
|
@ -298,37 +298,7 @@ static irqreturn_t cvm_oct_rgmii_rml_interrupt(int cpl, void *dev_id)
|
||||||
|
|
||||||
int cvm_oct_rgmii_open(struct net_device *dev)
|
int cvm_oct_rgmii_open(struct net_device *dev)
|
||||||
{
|
{
|
||||||
union cvmx_gmxx_prtx_cfg gmx_cfg;
|
return cvm_oct_common_open(dev, cvm_oct_rgmii_poll, false);
|
||||||
struct octeon_ethernet *priv = netdev_priv(dev);
|
|
||||||
int interface = INTERFACE(priv->port);
|
|
||||||
int index = INDEX(priv->port);
|
|
||||||
cvmx_helper_link_info_t link_info;
|
|
||||||
int rv;
|
|
||||||
|
|
||||||
rv = cvm_oct_phy_setup_device(dev);
|
|
||||||
if (rv)
|
|
||||||
return rv;
|
|
||||||
|
|
||||||
gmx_cfg.u64 = cvmx_read_csr(CVMX_GMXX_PRTX_CFG(index, interface));
|
|
||||||
gmx_cfg.s.en = 1;
|
|
||||||
cvmx_write_csr(CVMX_GMXX_PRTX_CFG(index, interface), gmx_cfg.u64);
|
|
||||||
|
|
||||||
if (!octeon_is_simulation()) {
|
|
||||||
if (priv->phydev) {
|
|
||||||
int r = phy_read_status(priv->phydev);
|
|
||||||
|
|
||||||
if (r == 0 && priv->phydev->link == 0)
|
|
||||||
netif_carrier_off(dev);
|
|
||||||
cvm_oct_adjust_link(dev);
|
|
||||||
} else {
|
|
||||||
link_info = cvmx_helper_link_get(priv->port);
|
|
||||||
if (!link_info.s.link_up)
|
|
||||||
netif_carrier_off(dev);
|
|
||||||
priv->poll = cvm_oct_rgmii_poll;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int cvm_oct_rgmii_stop(struct net_device *dev)
|
int cvm_oct_rgmii_stop(struct net_device *dev)
|
||||||
|
|
|
@ -79,38 +79,7 @@ static void cvm_oct_sgmii_poll(struct net_device *dev)
|
||||||
|
|
||||||
int cvm_oct_sgmii_open(struct net_device *dev)
|
int cvm_oct_sgmii_open(struct net_device *dev)
|
||||||
{
|
{
|
||||||
union cvmx_gmxx_prtx_cfg gmx_cfg;
|
return cvm_oct_common_open(dev, cvm_oct_sgmii_poll, true);
|
||||||
struct octeon_ethernet *priv = netdev_priv(dev);
|
|
||||||
int interface = INTERFACE(priv->port);
|
|
||||||
int index = INDEX(priv->port);
|
|
||||||
cvmx_helper_link_info_t link_info;
|
|
||||||
int rv;
|
|
||||||
|
|
||||||
rv = cvm_oct_phy_setup_device(dev);
|
|
||||||
if (rv)
|
|
||||||
return rv;
|
|
||||||
|
|
||||||
gmx_cfg.u64 = cvmx_read_csr(CVMX_GMXX_PRTX_CFG(index, interface));
|
|
||||||
gmx_cfg.s.en = 1;
|
|
||||||
cvmx_write_csr(CVMX_GMXX_PRTX_CFG(index, interface), gmx_cfg.u64);
|
|
||||||
|
|
||||||
if (octeon_is_simulation())
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (priv->phydev) {
|
|
||||||
int r = phy_read_status(priv->phydev);
|
|
||||||
|
|
||||||
if (r == 0 && priv->phydev->link == 0)
|
|
||||||
netif_carrier_off(dev);
|
|
||||||
cvm_oct_adjust_link(dev);
|
|
||||||
} else {
|
|
||||||
link_info = cvmx_helper_link_get(priv->port);
|
|
||||||
if (!link_info.s.link_up)
|
|
||||||
netif_carrier_off(dev);
|
|
||||||
priv->poll = cvm_oct_sgmii_poll;
|
|
||||||
cvm_oct_sgmii_poll(dev);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int cvm_oct_sgmii_stop(struct net_device *dev)
|
int cvm_oct_sgmii_stop(struct net_device *dev)
|
||||||
|
|
|
@ -79,38 +79,7 @@ static void cvm_oct_xaui_poll(struct net_device *dev)
|
||||||
|
|
||||||
int cvm_oct_xaui_open(struct net_device *dev)
|
int cvm_oct_xaui_open(struct net_device *dev)
|
||||||
{
|
{
|
||||||
union cvmx_gmxx_prtx_cfg gmx_cfg;
|
return cvm_oct_common_open(dev, cvm_oct_xaui_poll, true);
|
||||||
struct octeon_ethernet *priv = netdev_priv(dev);
|
|
||||||
int interface = INTERFACE(priv->port);
|
|
||||||
int index = INDEX(priv->port);
|
|
||||||
cvmx_helper_link_info_t link_info;
|
|
||||||
int rv;
|
|
||||||
|
|
||||||
rv = cvm_oct_phy_setup_device(dev);
|
|
||||||
if (rv)
|
|
||||||
return rv;
|
|
||||||
|
|
||||||
gmx_cfg.u64 = cvmx_read_csr(CVMX_GMXX_PRTX_CFG(index, interface));
|
|
||||||
gmx_cfg.s.en = 1;
|
|
||||||
cvmx_write_csr(CVMX_GMXX_PRTX_CFG(index, interface), gmx_cfg.u64);
|
|
||||||
|
|
||||||
if (octeon_is_simulation())
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (priv->phydev) {
|
|
||||||
int r = phy_read_status(priv->phydev);
|
|
||||||
|
|
||||||
if (r == 0 && priv->phydev->link == 0)
|
|
||||||
netif_carrier_off(dev);
|
|
||||||
cvm_oct_adjust_link(dev);
|
|
||||||
} else {
|
|
||||||
link_info = cvmx_helper_link_get(priv->port);
|
|
||||||
if (!link_info.s.link_up)
|
|
||||||
netif_carrier_off(dev);
|
|
||||||
priv->poll = cvm_oct_xaui_poll;
|
|
||||||
cvm_oct_xaui_poll(dev);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int cvm_oct_xaui_stop(struct net_device *dev)
|
int cvm_oct_xaui_stop(struct net_device *dev)
|
||||||
|
|
|
@ -499,6 +499,45 @@ void cvm_oct_common_uninit(struct net_device *dev)
|
||||||
phy_disconnect(priv->phydev);
|
phy_disconnect(priv->phydev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int cvm_oct_common_open(struct net_device *dev,
|
||||||
|
void (*link_poll)(struct net_device *), bool poll_now)
|
||||||
|
{
|
||||||
|
union cvmx_gmxx_prtx_cfg gmx_cfg;
|
||||||
|
struct octeon_ethernet *priv = netdev_priv(dev);
|
||||||
|
int interface = INTERFACE(priv->port);
|
||||||
|
int index = INDEX(priv->port);
|
||||||
|
cvmx_helper_link_info_t link_info;
|
||||||
|
int rv;
|
||||||
|
|
||||||
|
rv = cvm_oct_phy_setup_device(dev);
|
||||||
|
if (rv)
|
||||||
|
return rv;
|
||||||
|
|
||||||
|
gmx_cfg.u64 = cvmx_read_csr(CVMX_GMXX_PRTX_CFG(index, interface));
|
||||||
|
gmx_cfg.s.en = 1;
|
||||||
|
cvmx_write_csr(CVMX_GMXX_PRTX_CFG(index, interface), gmx_cfg.u64);
|
||||||
|
|
||||||
|
if (octeon_is_simulation())
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (priv->phydev) {
|
||||||
|
int r = phy_read_status(priv->phydev);
|
||||||
|
|
||||||
|
if (r == 0 && priv->phydev->link == 0)
|
||||||
|
netif_carrier_off(dev);
|
||||||
|
cvm_oct_adjust_link(dev);
|
||||||
|
} else {
|
||||||
|
link_info = cvmx_helper_link_get(priv->port);
|
||||||
|
if (!link_info.s.link_up)
|
||||||
|
netif_carrier_off(dev);
|
||||||
|
priv->poll = link_poll;
|
||||||
|
if (poll_now)
|
||||||
|
link_poll(dev);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static const struct net_device_ops cvm_oct_npi_netdev_ops = {
|
static const struct net_device_ops cvm_oct_npi_netdev_ops = {
|
||||||
.ndo_init = cvm_oct_common_init,
|
.ndo_init = cvm_oct_common_init,
|
||||||
.ndo_uninit = cvm_oct_common_uninit,
|
.ndo_uninit = cvm_oct_common_uninit,
|
||||||
|
|
|
@ -89,6 +89,8 @@ extern int cvm_oct_common_init(struct net_device *dev);
|
||||||
extern void cvm_oct_common_uninit(struct net_device *dev);
|
extern void cvm_oct_common_uninit(struct net_device *dev);
|
||||||
void cvm_oct_adjust_link(struct net_device *dev);
|
void cvm_oct_adjust_link(struct net_device *dev);
|
||||||
int cvm_oct_common_stop(struct net_device *dev);
|
int cvm_oct_common_stop(struct net_device *dev);
|
||||||
|
int cvm_oct_common_open(struct net_device *dev,
|
||||||
|
void (*link_poll)(struct net_device *), bool poll_now);
|
||||||
|
|
||||||
extern int always_use_pow;
|
extern int always_use_pow;
|
||||||
extern int pow_send_group;
|
extern int pow_send_group;
|
||||||
|
|
Loading…
Reference in New Issue