Use the speed and duplex information from the device tree fixed link node accessing the status structure parsed by of_phy_parse_fixed_link(). Signed-off-by: Madalin Bucur <madalin.bucur@xxxxxxxxxxxxx> --- .../ethernet/freescale/fman/flib/fsl_fman_memac.h | 6 ++-- drivers/net/ethernet/freescale/fman/inc/mac.h | 2 +- drivers/net/ethernet/freescale/fman/mac/fm_memac.c | 42 ++++++++++++++++------ drivers/net/ethernet/freescale/fman/mac/fm_memac.h | 3 +- drivers/net/ethernet/freescale/fman/mac/mac.c | 18 +++++++--- 5 files changed, 52 insertions(+), 19 deletions(-) diff --git a/drivers/net/ethernet/freescale/fman/flib/fsl_fman_memac.h b/drivers/net/ethernet/freescale/fman/flib/fsl_fman_memac.h index ebf7989..50bed14 100644 --- a/drivers/net/ethernet/freescale/fman/flib/fsl_fman_memac.h +++ b/drivers/net/ethernet/freescale/fman/flib/fsl_fman_memac.h @@ -33,8 +33,10 @@ #define __FSL_FMAN_MEMAC_H #include <linux/io.h> - +#include <linux/netdevice.h> +#include <linux/phy_fixed.h> #include "fsl_enet.h" + /* Num of additional exact match MAC adr regs */ #define MEMAC_NUM_OF_PADDRS 7 @@ -373,7 +375,7 @@ struct memac_cfg { bool tx_pbl_fwd; bool debug_mode; bool wake_on_lan; - bool fixed_link; + struct fixed_phy_status *fixed_link; u16 max_frame_length; u16 pause_quanta; u32 tx_ipg_length; diff --git a/drivers/net/ethernet/freescale/fman/inc/mac.h b/drivers/net/ethernet/freescale/fman/inc/mac.h index f86d0bc..fbeb957 100644 --- a/drivers/net/ethernet/freescale/fman/inc/mac.h +++ b/drivers/net/ethernet/freescale/fman/inc/mac.h @@ -62,7 +62,7 @@ struct mac_device { phy_interface_t phy_if; u32 if_support; bool link; - bool fixed_link; + struct fixed_phy_status *fixed_link; u16 speed; u16 max_speed; struct device_node *phy_node; diff --git a/drivers/net/ethernet/freescale/fman/mac/fm_memac.c b/drivers/net/ethernet/freescale/fman/mac/fm_memac.c index becbb88..3d5ede3 100644 --- a/drivers/net/ethernet/freescale/fman/mac/fm_memac.c +++ b/drivers/net/ethernet/freescale/fman/mac/fm_memac.c @@ -71,9 +71,10 @@ static int memac_mii_write_phy_reg(struct memac_t *memac, u8 phy_addr, } static void setup_sgmii_internal_phy(struct memac_t *memac, u8 phy_addr, - bool fixed_link) + struct fixed_phy_status *fixed_link) { u16 tmp_reg16; + enum ethernet_interface enet_if; enum e_enet_mode enet_mode; /* In case the higher MACs are used (i.e. the MACs that should @@ -81,20 +82,37 @@ static void setup_sgmii_internal_phy(struct memac_t *memac, u8 phy_addr, * Temporary modify enet mode to 1G one, so MII functions can * work correctly. */ + enet_if = ENET_INTERFACE_FROM_MODE(memac->enet_mode); enet_mode = memac->enet_mode; - memac->enet_mode = - MAKE_ENET_MODE(ENET_INTERFACE_FROM_MODE(memac->enet_mode), - ENET_SPEED_1000); + memac->enet_mode = MAKE_ENET_MODE(enet_if, ENET_SPEED_1000); /* SGMII mode */ tmp_reg16 = PHY_SGMII_IF_MODE_SGMII; if (!fixed_link) /* AN enable */ tmp_reg16 |= PHY_SGMII_IF_MODE_AN; - else - /* Fixed link 1Gb FD */ - tmp_reg16 |= PHY_SGMII_IF_MODE_SPEED_GB | - PHY_SGMII_IF_MODE_DUPLEX_FULL; + else { + switch (fixed_link->speed) { + case 10: + tmp_reg16 |= PHY_SGMII_IF_MODE_SPEED_10M; + memac->enet_mode = MAKE_ENET_MODE(enet_if, + ENET_SPEED_10); + break; + case 100: + tmp_reg16 |= PHY_SGMII_IF_MODE_SPEED_100M; + memac->enet_mode = MAKE_ENET_MODE(enet_if, + ENET_SPEED_100); + break; + case 1000: /* fallthrough */ + default: + tmp_reg16 |= PHY_SGMII_IF_MODE_SPEED_GB; + break; + } + if (fixed_link->duplex) + tmp_reg16 |= PHY_SGMII_IF_MODE_DUPLEX_FULL; + else + tmp_reg16 |= PHY_SGMII_IF_MODE_DUPLEX_HALF; + } memac_mii_write_phy_reg(memac, phy_addr, 0x14, tmp_reg16); /* Device ability according to SGMII specification */ @@ -120,6 +138,7 @@ static void setup_sgmii_internal_phy(struct memac_t *memac, u8 phy_addr, /* Restart AN */ tmp_reg16 = PHY_SGMII_CR_DEF_VAL | PHY_SGMII_CR_RESET_AN; else + /* AN disabled */ tmp_reg16 = PHY_SGMII_CR_DEF_VAL & ~PHY_SGMII_CR_AN_ENABLE; memac_mii_write_phy_reg(memac, phy_addr, 0x0, tmp_reg16); @@ -370,14 +389,15 @@ int memac_cfg_reset_on_init(struct fm_mac_dev *fm_mac_dev, bool enable) return 0; } -int memac_cfg_fixed_link(struct fm_mac_dev *fm_mac_dev, bool enable) +int memac_cfg_fixed_link(struct fm_mac_dev *fm_mac_dev, + struct fixed_phy_status *fixed_link) { struct memac_t *memac = (struct memac_t *)fm_mac_dev; if (is_init_done(memac->memac_drv_param)) return -EINVAL; - memac->memac_drv_param->fixed_link = enable; + memac->memac_drv_param->fixed_link = fixed_link; return 0; } @@ -524,7 +544,7 @@ int memac_init(struct fm_mac_dev *fm_mac_dev) enet_addr_t eth_addr; enum fm_mac_type port_type; bool slow_10g_if = false; - bool fixed_link; + struct fixed_phy_status *fixed_link; int err; u32 reg32 = 0; diff --git a/drivers/net/ethernet/freescale/fman/mac/fm_memac.h b/drivers/net/ethernet/freescale/fman/mac/fm_memac.h index 8fcbd64..7c13706 100644 --- a/drivers/net/ethernet/freescale/fman/mac/fm_memac.h +++ b/drivers/net/ethernet/freescale/fman/mac/fm_memac.h @@ -104,7 +104,8 @@ int memac_adjust_link(struct fm_mac_dev *fm_mac_dev, enum ethernet_speed speed); int memac_cfg_max_frame_len(struct fm_mac_dev *fm_mac_dev, u16 new_val); int memac_cfg_reset_on_init(struct fm_mac_dev *fm_mac_dev, bool enable); -int memac_cfg_fixed_link(struct fm_mac_dev *fm_mac_dev, bool enable); +int memac_cfg_fixed_link(struct fm_mac_dev *fm_mac_dev, + struct fixed_phy_status *fixed_link); int memac_enable(struct fm_mac_dev *fm_mac_dev, enum comm_mode mode); int memac_disable(struct fm_mac_dev *fm_mac_dev, enum comm_mode mode); int memac_init(struct fm_mac_dev *fm_mac_dev); diff --git a/drivers/net/ethernet/freescale/fman/mac/mac.c b/drivers/net/ethernet/freescale/fman/mac/mac.c index c44544b..4a0ab7e 100644 --- a/drivers/net/ethernet/freescale/fman/mac/mac.c +++ b/drivers/net/ethernet/freescale/fman/mac/mac.c @@ -39,6 +39,8 @@ #include <linux/of_mdio.h> #include <linux/device.h> #include <linux/phy.h> +#include <linux/netdevice.h> +#include <linux/phy_fixed.h> #include "mac.h" @@ -363,7 +365,6 @@ static int mac_probe(struct platform_device *_of_dev) } mac_dev->link = false; - mac_dev->fixed_link = false; mac_dev->speed = phy2speed[mac_dev->phy_if]; mac_dev->max_speed = mac_dev->speed; mac_dev->if_support = DTSEC_SUPPORTED; @@ -383,10 +384,18 @@ static int mac_probe(struct platform_device *_of_dev) /* Get the rest of the PHY information */ mac_dev->phy_node = of_parse_phandle(mac_node, "phy-handle", 0); if (!mac_dev->phy_node && of_phy_is_fixed_link(mac_node)) { - err = of_phy_register_fixed_link(mac_node); - if (err) + struct phy_device *phy; + + mac_dev->fixed_link = kzalloc(sizeof(*mac_dev->fixed_link), + GFP_KERNEL); + if (of_phy_parse_fixed_link(mac_node, mac_dev->fixed_link)) + goto _return_dev_set_drvdata; + + phy = fixed_phy_register(PHY_POLL, mac_dev->fixed_link, + mac_node); + if (IS_ERR(phy)) goto _return_dev_set_drvdata; - mac_dev->fixed_link = true; + mac_dev->phy_node = of_node_get(mac_node); } @@ -429,6 +438,7 @@ static int mac_probe(struct platform_device *_of_dev) _return_of_node_put: of_node_put(dev_node); _return_dev_set_drvdata: + kfree(mac_dev->fixed_link); dev_set_drvdata(dev, NULL); _return: return err; -- 1.7.11.7 -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html