Commit 4491c602 authored by Jiawen Wu's avatar Jiawen Wu Committed by David S. Miller

net: txgbe: use phylink bits added in libwx

Convert txgbe to use phylink and phylink_config added in libwx.
Signed-off-by: default avatarJiawen Wu <jiawenwu@trustnetic.com>
Reviewed-by: default avatarRussell King (Oracle) <rmk+kernel@armlinux.org.uk>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent e8e138cf
...@@ -10,35 +10,12 @@ ...@@ -10,35 +10,12 @@
#include "txgbe_type.h" #include "txgbe_type.h"
#include "txgbe_ethtool.h" #include "txgbe_ethtool.h"
static int txgbe_nway_reset(struct net_device *netdev)
{
struct txgbe *txgbe = netdev_to_txgbe(netdev);
return phylink_ethtool_nway_reset(txgbe->phylink);
}
static int txgbe_get_link_ksettings(struct net_device *netdev,
struct ethtool_link_ksettings *cmd)
{
struct txgbe *txgbe = netdev_to_txgbe(netdev);
return phylink_ethtool_ksettings_get(txgbe->phylink, cmd);
}
static int txgbe_set_link_ksettings(struct net_device *netdev,
const struct ethtool_link_ksettings *cmd)
{
struct txgbe *txgbe = netdev_to_txgbe(netdev);
return phylink_ethtool_ksettings_set(txgbe->phylink, cmd);
}
static const struct ethtool_ops txgbe_ethtool_ops = { static const struct ethtool_ops txgbe_ethtool_ops = {
.get_drvinfo = wx_get_drvinfo, .get_drvinfo = wx_get_drvinfo,
.nway_reset = txgbe_nway_reset, .nway_reset = wx_nway_reset,
.get_link = ethtool_op_get_link, .get_link = ethtool_op_get_link,
.get_link_ksettings = txgbe_get_link_ksettings, .get_link_ksettings = wx_get_link_ksettings,
.set_link_ksettings = txgbe_set_link_ksettings, .set_link_ksettings = wx_set_link_ksettings,
.get_sset_count = wx_get_sset_count, .get_sset_count = wx_get_sset_count,
.get_strings = wx_get_strings, .get_strings = wx_get_strings,
.get_ethtool_stats = wx_get_ethtool_stats, .get_ethtool_stats = wx_get_ethtool_stats,
......
...@@ -206,7 +206,6 @@ static int txgbe_request_irq(struct wx *wx) ...@@ -206,7 +206,6 @@ static int txgbe_request_irq(struct wx *wx)
static void txgbe_up_complete(struct wx *wx) static void txgbe_up_complete(struct wx *wx)
{ {
struct net_device *netdev = wx->netdev; struct net_device *netdev = wx->netdev;
struct txgbe *txgbe;
wx_control_hw(wx, true); wx_control_hw(wx, true);
wx_configure_vectors(wx); wx_configure_vectors(wx);
...@@ -215,8 +214,7 @@ static void txgbe_up_complete(struct wx *wx) ...@@ -215,8 +214,7 @@ static void txgbe_up_complete(struct wx *wx)
smp_mb__before_atomic(); smp_mb__before_atomic();
wx_napi_enable_all(wx); wx_napi_enable_all(wx);
txgbe = netdev_to_txgbe(netdev); phylink_start(wx->phylink);
phylink_start(txgbe->phylink);
/* clear any pending interrupts, may auto mask */ /* clear any pending interrupts, may auto mask */
rd32(wx, WX_PX_IC(0)); rd32(wx, WX_PX_IC(0));
...@@ -292,11 +290,9 @@ static void txgbe_disable_device(struct wx *wx) ...@@ -292,11 +290,9 @@ static void txgbe_disable_device(struct wx *wx)
static void txgbe_down(struct wx *wx) static void txgbe_down(struct wx *wx)
{ {
struct txgbe *txgbe = netdev_to_txgbe(wx->netdev);
txgbe_disable_device(wx); txgbe_disable_device(wx);
txgbe_reset(wx); txgbe_reset(wx);
phylink_stop(txgbe->phylink); phylink_stop(wx->phylink);
wx_clean_all_tx_rings(wx); wx_clean_all_tx_rings(wx);
wx_clean_all_rx_rings(wx); wx_clean_all_rx_rings(wx);
......
...@@ -159,7 +159,8 @@ static int txgbe_mdio_pcs_init(struct txgbe *txgbe) ...@@ -159,7 +159,8 @@ static int txgbe_mdio_pcs_init(struct txgbe *txgbe)
static struct phylink_pcs *txgbe_phylink_mac_select(struct phylink_config *config, static struct phylink_pcs *txgbe_phylink_mac_select(struct phylink_config *config,
phy_interface_t interface) phy_interface_t interface)
{ {
struct txgbe *txgbe = netdev_to_txgbe(to_net_dev(config->dev)); struct wx *wx = phylink_to_wx(config);
struct txgbe *txgbe = wx->priv;
if (interface == PHY_INTERFACE_MODE_10GBASER) if (interface == PHY_INTERFACE_MODE_10GBASER)
return &txgbe->xpcs->pcs; return &txgbe->xpcs->pcs;
...@@ -175,7 +176,7 @@ static void txgbe_mac_config(struct phylink_config *config, unsigned int mode, ...@@ -175,7 +176,7 @@ static void txgbe_mac_config(struct phylink_config *config, unsigned int mode,
static void txgbe_mac_link_down(struct phylink_config *config, static void txgbe_mac_link_down(struct phylink_config *config,
unsigned int mode, phy_interface_t interface) unsigned int mode, phy_interface_t interface)
{ {
struct wx *wx = netdev_priv(to_net_dev(config->dev)); struct wx *wx = phylink_to_wx(config);
wr32m(wx, WX_MAC_TX_CFG, WX_MAC_TX_CFG_TE, 0); wr32m(wx, WX_MAC_TX_CFG, WX_MAC_TX_CFG_TE, 0);
} }
...@@ -186,7 +187,7 @@ static void txgbe_mac_link_up(struct phylink_config *config, ...@@ -186,7 +187,7 @@ static void txgbe_mac_link_up(struct phylink_config *config,
int speed, int duplex, int speed, int duplex,
bool tx_pause, bool rx_pause) bool tx_pause, bool rx_pause)
{ {
struct wx *wx = netdev_priv(to_net_dev(config->dev)); struct wx *wx = phylink_to_wx(config);
u32 txcfg, wdg; u32 txcfg, wdg;
txcfg = rd32(wx, WX_MAC_TX_CFG); txcfg = rd32(wx, WX_MAC_TX_CFG);
...@@ -217,7 +218,7 @@ static void txgbe_mac_link_up(struct phylink_config *config, ...@@ -217,7 +218,7 @@ static void txgbe_mac_link_up(struct phylink_config *config,
static int txgbe_mac_prepare(struct phylink_config *config, unsigned int mode, static int txgbe_mac_prepare(struct phylink_config *config, unsigned int mode,
phy_interface_t interface) phy_interface_t interface)
{ {
struct wx *wx = netdev_priv(to_net_dev(config->dev)); struct wx *wx = phylink_to_wx(config);
wr32m(wx, WX_MAC_TX_CFG, WX_MAC_TX_CFG_TE, 0); wr32m(wx, WX_MAC_TX_CFG, WX_MAC_TX_CFG_TE, 0);
wr32m(wx, WX_MAC_RX_CFG, WX_MAC_RX_CFG_RE, 0); wr32m(wx, WX_MAC_RX_CFG, WX_MAC_RX_CFG_RE, 0);
...@@ -228,7 +229,7 @@ static int txgbe_mac_prepare(struct phylink_config *config, unsigned int mode, ...@@ -228,7 +229,7 @@ static int txgbe_mac_prepare(struct phylink_config *config, unsigned int mode,
static int txgbe_mac_finish(struct phylink_config *config, unsigned int mode, static int txgbe_mac_finish(struct phylink_config *config, unsigned int mode,
phy_interface_t interface) phy_interface_t interface)
{ {
struct wx *wx = netdev_priv(to_net_dev(config->dev)); struct wx *wx = phylink_to_wx(config);
txgbe_enable_sec_tx_path(wx); txgbe_enable_sec_tx_path(wx);
wr32m(wx, WX_MAC_RX_CFG, WX_MAC_RX_CFG_RE, WX_MAC_RX_CFG_RE); wr32m(wx, WX_MAC_RX_CFG, WX_MAC_RX_CFG_RE, WX_MAC_RX_CFG_RE);
...@@ -253,10 +254,7 @@ static int txgbe_phylink_init(struct txgbe *txgbe) ...@@ -253,10 +254,7 @@ static int txgbe_phylink_init(struct txgbe *txgbe)
phy_interface_t phy_mode; phy_interface_t phy_mode;
struct phylink *phylink; struct phylink *phylink;
config = devm_kzalloc(&wx->pdev->dev, sizeof(*config), GFP_KERNEL); config = &wx->phylink_config;
if (!config)
return -ENOMEM;
config->dev = &wx->netdev->dev; config->dev = &wx->netdev->dev;
config->type = PHYLINK_NETDEV; config->type = PHYLINK_NETDEV;
config->mac_capabilities = MAC_10000FD | MAC_1000FD | MAC_100FD | config->mac_capabilities = MAC_10000FD | MAC_1000FD | MAC_100FD |
...@@ -287,7 +285,7 @@ static int txgbe_phylink_init(struct txgbe *txgbe) ...@@ -287,7 +285,7 @@ static int txgbe_phylink_init(struct txgbe *txgbe)
} }
} }
txgbe->phylink = phylink; wx->phylink = phylink;
return 0; return 0;
} }
...@@ -483,7 +481,7 @@ static void txgbe_irq_handler(struct irq_desc *desc) ...@@ -483,7 +481,7 @@ static void txgbe_irq_handler(struct irq_desc *desc)
TXGBE_PX_MISC_ETH_AN)) { TXGBE_PX_MISC_ETH_AN)) {
u32 reg = rd32(wx, TXGBE_CFG_PORT_ST); u32 reg = rd32(wx, TXGBE_CFG_PORT_ST);
phylink_mac_change(txgbe->phylink, !!(reg & TXGBE_CFG_PORT_ST_LINK_UP)); phylink_mac_change(wx->phylink, !!(reg & TXGBE_CFG_PORT_ST_LINK_UP));
} }
/* unmask interrupt */ /* unmask interrupt */
...@@ -701,6 +699,7 @@ static int txgbe_ext_phy_init(struct txgbe *txgbe) ...@@ -701,6 +699,7 @@ static int txgbe_ext_phy_init(struct txgbe *txgbe)
int txgbe_init_phy(struct txgbe *txgbe) int txgbe_init_phy(struct txgbe *txgbe)
{ {
struct wx *wx = txgbe->wx;
int ret; int ret;
if (txgbe->wx->media_type == sp_media_copper) if (txgbe->wx->media_type == sp_media_copper)
...@@ -708,43 +707,43 @@ int txgbe_init_phy(struct txgbe *txgbe) ...@@ -708,43 +707,43 @@ int txgbe_init_phy(struct txgbe *txgbe)
ret = txgbe_swnodes_register(txgbe); ret = txgbe_swnodes_register(txgbe);
if (ret) { if (ret) {
wx_err(txgbe->wx, "failed to register software nodes\n"); wx_err(wx, "failed to register software nodes\n");
return ret; return ret;
} }
ret = txgbe_mdio_pcs_init(txgbe); ret = txgbe_mdio_pcs_init(txgbe);
if (ret) { if (ret) {
wx_err(txgbe->wx, "failed to init mdio pcs: %d\n", ret); wx_err(wx, "failed to init mdio pcs: %d\n", ret);
goto err_unregister_swnode; goto err_unregister_swnode;
} }
ret = txgbe_phylink_init(txgbe); ret = txgbe_phylink_init(txgbe);
if (ret) { if (ret) {
wx_err(txgbe->wx, "failed to init phylink\n"); wx_err(wx, "failed to init phylink\n");
goto err_destroy_xpcs; goto err_destroy_xpcs;
} }
ret = txgbe_gpio_init(txgbe); ret = txgbe_gpio_init(txgbe);
if (ret) { if (ret) {
wx_err(txgbe->wx, "failed to init gpio\n"); wx_err(wx, "failed to init gpio\n");
goto err_destroy_phylink; goto err_destroy_phylink;
} }
ret = txgbe_clock_register(txgbe); ret = txgbe_clock_register(txgbe);
if (ret) { if (ret) {
wx_err(txgbe->wx, "failed to register clock: %d\n", ret); wx_err(wx, "failed to register clock: %d\n", ret);
goto err_destroy_phylink; goto err_destroy_phylink;
} }
ret = txgbe_i2c_register(txgbe); ret = txgbe_i2c_register(txgbe);
if (ret) { if (ret) {
wx_err(txgbe->wx, "failed to init i2c interface: %d\n", ret); wx_err(wx, "failed to init i2c interface: %d\n", ret);
goto err_unregister_clk; goto err_unregister_clk;
} }
ret = txgbe_sfp_register(txgbe); ret = txgbe_sfp_register(txgbe);
if (ret) { if (ret) {
wx_err(txgbe->wx, "failed to register sfp\n"); wx_err(wx, "failed to register sfp\n");
goto err_unregister_i2c; goto err_unregister_i2c;
} }
...@@ -756,7 +755,7 @@ int txgbe_init_phy(struct txgbe *txgbe) ...@@ -756,7 +755,7 @@ int txgbe_init_phy(struct txgbe *txgbe)
clkdev_drop(txgbe->clock); clkdev_drop(txgbe->clock);
clk_unregister(txgbe->clk); clk_unregister(txgbe->clk);
err_destroy_phylink: err_destroy_phylink:
phylink_destroy(txgbe->phylink); phylink_destroy(wx->phylink);
err_destroy_xpcs: err_destroy_xpcs:
xpcs_destroy(txgbe->xpcs); xpcs_destroy(txgbe->xpcs);
err_unregister_swnode: err_unregister_swnode:
...@@ -768,8 +767,8 @@ int txgbe_init_phy(struct txgbe *txgbe) ...@@ -768,8 +767,8 @@ int txgbe_init_phy(struct txgbe *txgbe)
void txgbe_remove_phy(struct txgbe *txgbe) void txgbe_remove_phy(struct txgbe *txgbe)
{ {
if (txgbe->wx->media_type == sp_media_copper) { if (txgbe->wx->media_type == sp_media_copper) {
phylink_disconnect_phy(txgbe->phylink); phylink_disconnect_phy(txgbe->wx->phylink);
phylink_destroy(txgbe->phylink); phylink_destroy(txgbe->wx->phylink);
return; return;
} }
...@@ -777,7 +776,7 @@ void txgbe_remove_phy(struct txgbe *txgbe) ...@@ -777,7 +776,7 @@ void txgbe_remove_phy(struct txgbe *txgbe)
platform_device_unregister(txgbe->i2c_dev); platform_device_unregister(txgbe->i2c_dev);
clkdev_drop(txgbe->clock); clkdev_drop(txgbe->clock);
clk_unregister(txgbe->clk); clk_unregister(txgbe->clk);
phylink_destroy(txgbe->phylink); phylink_destroy(txgbe->wx->phylink);
xpcs_destroy(txgbe->xpcs); xpcs_destroy(txgbe->xpcs);
software_node_unregister_node_group(txgbe->nodes.group); software_node_unregister_node_group(txgbe->nodes.group);
} }
...@@ -129,13 +129,6 @@ ...@@ -129,13 +129,6 @@
extern char txgbe_driver_name[]; extern char txgbe_driver_name[];
static inline struct txgbe *netdev_to_txgbe(struct net_device *netdev)
{
struct wx *wx = netdev_priv(netdev);
return wx->priv;
}
#define NODE_PROP(_NAME, _PROP) \ #define NODE_PROP(_NAME, _PROP) \
(const struct software_node) { \ (const struct software_node) { \
.name = _NAME, \ .name = _NAME, \
...@@ -175,7 +168,6 @@ struct txgbe { ...@@ -175,7 +168,6 @@ struct txgbe {
struct wx *wx; struct wx *wx;
struct txgbe_nodes nodes; struct txgbe_nodes nodes;
struct dw_xpcs *xpcs; struct dw_xpcs *xpcs;
struct phylink *phylink;
struct platform_device *sfp_dev; struct platform_device *sfp_dev;
struct platform_device *i2c_dev; struct platform_device *i2c_dev;
struct clk_lookup *clock; struct clk_lookup *clock;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment