diff options
Diffstat (limited to 'drivers/net/fec_imx.c')
-rw-r--r-- | drivers/net/fec_imx.c | 66 |
1 files changed, 46 insertions, 20 deletions
diff --git a/drivers/net/fec_imx.c b/drivers/net/fec_imx.c index 673555a48a..75a6596282 100644 --- a/drivers/net/fec_imx.c +++ b/drivers/net/fec_imx.c @@ -25,6 +25,22 @@ #include "fec_imx.h" +static int fec_set_promisc(struct eth_device *edev, bool enable) +{ + struct fec_priv *fec = (struct fec_priv *)edev->priv; + u32 rcntl; + + rcntl = readl(fec->regs + FEC_R_CNTRL); + + if (enable) + rcntl |= FEC_R_CNTRL_PROMISC; + else + rcntl &= ~FEC_R_CNTRL_PROMISC; + + writel(rcntl, fec->regs + FEC_R_CNTRL); + + return 0; +} /* * MII-interface related functions @@ -257,10 +273,15 @@ static int fec_init(struct eth_device *dev) */ writel(0x00000000, fec->regs + FEC_IMASK); + rcntl = readl(fec->regs + FEC_R_CNTRL); + + /* Keep promisc setting */ + rcntl &= FEC_R_CNTRL_PROMISC; + /* * Set FEC-Lite receive control register(R_CNTRL): */ - rcntl = FEC_R_CNTRL_MAX_FL(1518); + rcntl |= FEC_R_CNTRL_MAX_FL(1518); rcntl |= FEC_R_CNTRL_MII_MODE; /* @@ -568,7 +589,7 @@ static int fec_recv(struct eth_device *dev) * fixup and net_receive below would get * proper data */ - dma_sync_single_for_cpu((unsigned long)frame, + dma_sync_single_for_cpu(fec->dev, (unsigned long)frame, data_length, DMA_FROM_DEVICE); if (fec_is_imx28(fec)) @@ -580,7 +601,7 @@ static int fec_recv(struct eth_device *dev) */ len = data_length - 4; net_receive(dev, frame, len); - dma_sync_single_for_device((unsigned long)frame, + dma_sync_single_for_device(fec->dev, (unsigned long)frame, data_length, DMA_FROM_DEVICE); } @@ -631,25 +652,25 @@ static void fec_free_receive_packets(struct fec_priv *fec, int count, int size) } #ifdef CONFIG_OFDEVICE -static int fec_probe_dt(struct device_d *dev, struct fec_priv *fec) +static int fec_probe_dt(struct device *dev, struct fec_priv *fec) { struct device_node *mdiobus; int ret; - ret = of_get_phy_mode(dev->device_node); + ret = of_get_phy_mode(dev->of_node); if (ret < 0) fec->interface = PHY_INTERFACE_MODE_MII; else fec->interface = ret; - mdiobus = of_get_child_by_name(dev->device_node, "mdio"); + mdiobus = of_get_child_by_name(dev->of_node, "mdio"); if (mdiobus) - fec->miibus.dev.device_node = mdiobus; + fec->miibus.dev.of_node = mdiobus; return 0; } #else -static int fec_probe_dt(struct device_d *dev, struct fec_priv *fec) +static int fec_probe_dt(struct device *dev, struct fec_priv *fec) { return -ENODEV; } @@ -736,7 +757,7 @@ static int fec_clk_get(struct fec_priv *fec) return err; } -static int fec_probe(struct device_d *dev) +static int fec_probe(struct device *dev) { struct resource *iores; struct fec_platform_data *pdata = (struct fec_platform_data *)dev->platform_data; @@ -768,6 +789,7 @@ static int fec_probe(struct device_d *dev) edev->halt = fec_halt; edev->get_ethaddr = fec_get_hwaddr; edev->set_ethaddr = fec_set_hwaddr; + edev->set_promisc = fec_set_promisc; edev->parent = dev; dma_set_mask(dev, DMA_BIT_MASK(32)); @@ -803,10 +825,11 @@ static int fec_probe(struct device_d *dev) goto release_res; } - phy_reset = of_get_named_gpio(dev->device_node, "phy-reset-gpios", 0); + phy_reset = of_get_named_gpio(dev->of_node, "phy-reset-gpios", 0); if (gpio_is_valid(phy_reset)) { - of_property_read_u32(dev->device_node, "phy-reset-duration", &msec); - of_property_read_u32(dev->device_node, "phy-reset-post-delay", + of_property_read_u32(dev->of_node, "phy-reset-duration", + &msec); + of_property_read_u32(dev->of_node, "phy-reset-post-delay", &phy_post_delay); /* valid reset duration should be less than 1s */ if (phy_post_delay > 1000) @@ -834,6 +857,8 @@ static int fec_probe(struct device_d *dev) if (ret) goto free_gpio; + fec_set_promisc(edev, false); + /* * reserve memory for both buffer descriptor chains at once * Datasheet forces the startaddress of each chain is 16 byte aligned @@ -849,7 +874,7 @@ static int fec_probe(struct device_d *dev) if (ret < 0) goto free_xbd; - if (dev->device_node) { + if (dev->of_node) { ret = fec_probe_dt(dev, fec); fec->phy_addr = -1; } else if (pdata) { @@ -870,18 +895,18 @@ static int fec_probe(struct device_d *dev) fec->miibus.priv = fec; fec->miibus.parent = dev; - ret = mdiobus_register(&fec->miibus); + ret = eth_register(edev); if (ret) goto free_receive_packets; - ret = eth_register(edev); + ret = mdiobus_register(&fec->miibus); if (ret) - goto unregister_mdio; + goto unregister_eth; return 0; -unregister_mdio: - mdiobus_unregister(&fec->miibus); +unregister_eth: + eth_unregister(edev); free_receive_packets: fec_free_receive_packets(fec, FEC_RBD_NUM, FEC_MAX_PKT_SIZE); free_xbd: @@ -903,7 +928,7 @@ err_free: return ret; } -static void fec_remove(struct device_d *dev) +static void fec_remove(struct device *dev) { struct fec_priv *fec = dev->priv; @@ -936,6 +961,7 @@ static __maybe_unused struct of_device_id imx_fec_dt_ids[] = { /* sentinel */ } }; +MODULE_DEVICE_TABLE(of, imx_fec_dt_ids); static struct platform_device_id imx_fec_ids[] = { { @@ -955,7 +981,7 @@ static struct platform_device_id imx_fec_ids[] = { /** * Driver description for registering */ -static struct driver_d fec_driver = { +static struct driver fec_driver = { .name = "fec_imx", .probe = fec_probe, .remove = fec_remove, |