On 23 December 2017 at 15:01, Jassi Brar <jassisinghbrar@xxxxxxxxx> wrote: > On Sat, Dec 23, 2017 at 4:09 PM, Ard Biesheuvel > <ard.biesheuvel@xxxxxxxxxx> wrote: >> On 23 December 2017 at 05:45, <jassisinghbrar@xxxxxxxxx> wrote: >>> From: Jassi Brar <jaswinder.singh@xxxxxxxxxx> >>> >>> This driver adds support for Socionext "netsec" IP Gigabit >>> Ethernet + PHY IP used in the Synquacer SC2A11 SoC. >>> >>> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@xxxxxxxxxx> >>> Signed-off-by: Jassi Brar <jaswinder.singh@xxxxxxxxxx> >>> --- >>> drivers/net/ethernet/Kconfig | 1 + >>> drivers/net/ethernet/Makefile | 1 + >>> drivers/net/ethernet/socionext/Kconfig | 29 + >>> drivers/net/ethernet/socionext/Makefile | 1 + >>> drivers/net/ethernet/socionext/netsec.c | 1844 +++++++++++++++++++++++++++++++ >>> 5 files changed, 1876 insertions(+) >>> create mode 100644 drivers/net/ethernet/socionext/Kconfig >>> create mode 100644 drivers/net/ethernet/socionext/Makefile >>> create mode 100644 drivers/net/ethernet/socionext/netsec.c >>> >> ... >>> diff --git a/drivers/net/ethernet/socionext/netsec.c b/drivers/net/ethernet/socionext/netsec.c >>> new file mode 100644 >>> index 0000000..6af047b >>> --- /dev/null >>> +++ b/drivers/net/ethernet/socionext/netsec.c >> ... >>> +static int netsec_netdev_load_ucode_region(struct netsec_priv *priv, u32 reg, >>> + u32 addr_h, u32 addr_l, u32 size) >>> +{ >>> + u64 base = (u64)addr_h << 32 | addr_l; >>> + void __iomem *ucode; >>> + u32 i; >>> + >>> + ucode = ioremap(base, size * sizeof(u32)); >>> + if (!ucode) >>> + return -ENOMEM; >>> + >>> + for (i = 0; i < size; i++) >>> + netsec_write(priv, reg, readl(ucode + i)); >>> + >> >> This is incorrect. The microcode is written one u32 word at a time, >> and indexing ucode like this results in byte indexing, not u32 >> indexing. >> > Ouch! careless mistake. I was too eager to get done with netsec before > I leave for holidays. > >> I changed the ucode declaration locally to >> >> u32 __iomem *ucode; >> >> and now everything works fine again. >> > Or we keep the void pointer but do readl(ucode + i * 4) ? > Whichever you prefer. > >> >>> + iounmap(ucode); >>> + return 0; >>> +} >>> + >> ... >>> +static int netsec_register_mdio(struct netsec_priv *priv, u32 phy_addr) >>> +{ >>> + struct mii_bus *bus; >>> + int ret; >>> + >>> + bus = devm_mdiobus_alloc(priv->dev); >>> + if (!bus) >>> + return -ENOMEM; >>> + >>> + snprintf(bus->id, MII_BUS_ID_SIZE, "%s", dev_name(priv->dev)); >>> + bus->priv = priv; >>> + bus->name = "SNI NETSEC MDIO"; >>> + bus->read = netsec_phy_read; >>> + bus->write = netsec_phy_write; >>> + bus->parent = priv->dev; >>> + priv->mii_bus = bus; >>> + >>> + if (dev_of_node(priv->dev)) { >>> + struct device_node *mdio_node, *parent = dev_of_node(priv->dev); >>> + >>> + mdio_node = of_get_child_by_name(parent, "mdio"); >>> + if (mdio_node) { >>> + parent = mdio_node; >>> + } else { >>> + /* older f/w doesn't populate the mdio subnode, >>> + * allow relaxed upgrade of f/w in due time. >>> + */ >>> + dev_err(priv->dev, "Upgrade f/w for mdio subnode!\n"); >> >> I wouldn't mind if you dropped this fallback altogether, and would >> simply stick with the new binding only. However, if you prefer to keep >> it, could you change this to dev_info()? It is not really an error >> condition, and dev_err/dev_warns have the annoying tendency to pierce >> through 'quiet' boot splashes. >> > Yes, it should have been dev_info. But I would like to keep it, > atleast for a couple months. For example, my board needs jtag to > upgrade f/w. > Fair enough. > Thanks. Likewise! And happy holidays. -- 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