[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <53E79C9D.2090102@gmail.com>
Date: Sun, 10 Aug 2014 18:23:57 +0200
From: Romain Perier <romain.perier@...il.com>
To: Heiko Stübner <heiko@...ech.de>
CC: davem@...emloft.net, max.schwarz@...ine.de, b.galvani@...il.com,
eric.dumazet@...il.com, netdev@...r.kernel.org, arnd@...db.de
Subject: Re: [PATCH 1/2] ethernet: arc: Add support for specific SoC glue
layer device tree bindings
Arnd pointed out a problem (on IRC). To make this device driver work
with loadable module I need to use EXPORT_GPL_SYMBOL. And when you do
that, emac_drv_probe() is not a unique identifier... (many other drivers
already use it...)
That's a good argument :/
In this case... I am agree.
Le 10/08/2014 18:14, Romain Perier a écrit :
> Hi Heiko,
>
> Le 10/08/2014 14:03, Heiko Stübner a écrit :
>> Hi Romain,
>>
>> [I've added Arnd, because he seemed interested in this when we talked
>> about it
>> in IRC]
>>
>> Am Freitag, 8. August 2014, 12:27:54 schrieb Romain Perier:
>>> Some platforms have special bank registers which might be used to
>>> select
>>> the correct clock or the right mode for Media Indepent Interface
>>> controllers. Sometimes, it is also required to activate vcc
>>> regulators in
>>> the right order to supply the ethernet controller at the right time.
>>> This
>>> patch is a refactoring of the arc-emac device driver, it adds a new
>>> software architecture design which allows to add specific platform glue
>>> layer. Each platform has now its own module which performs custom
>>> initialization and remove for the target and then calls to the core
>>> driver.
>>>
>>> Signed-off-by: Romain Perier <romain.perier@...il.com>
>> mixing functional changes with general renames makes everything
>> really hard to
>> review. At most, you should have them separated into two patches.
> Mhhh... yeah, I will split this into different patches.
>
>>
>> I'm not sure how I personally feel about renaming all the core
>> functions for
>> this. In my mind they could also simply keep their current naming, as
>> the
>> whole IP is supposed to not have to many implementations except the
>> arc (and
>> Rockchip one).
>
> it would be really confusing... I don't want to put the arc logic into
> emac_main.c. So we would have emac_arc.c module containing
> "emac_arc_<foo>" functions or "arc_<foo>" and the core emac_main.c
> which would contain "arc_emac_<foo>" functions ?
> That's important to have a consistency naming, imho.
>
>
>>
>>
>> [...]
>>
>>> diff --git a/drivers/net/ethernet/arc/emac_arc.c
>>> b/drivers/net/ethernet/arc/emac_arc.c new file mode 100644
>>> index 0000000..80ebb52
>>> --- /dev/null
>>> +++ b/drivers/net/ethernet/arc/emac_arc.c
>>> @@ -0,0 +1,79 @@
>>> +/**
>>> + * emac_arc.c - ARC EMAC specific glue layer
>>> + *
>>> + * Copyright (C) 2014 Romain Perier
>>> + *
>>> + * Romain Perier <romain.perier@...il.com>
>>> + *
>>> + * This program is free software; you can redistribute it and/or
>>> modify
>>> + * it under the terms of the GNU General Public License as
>>> published by
>>> + * the Free Software Foundation; either version 2 of the License, or
>>> + * (at your option) any later version.
>>> + *
>>> + * This program is distributed in the hope that it will be useful,
>>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
>>> + * GNU General Public License for more details.
>>> + */
>>> +
>>> +#include "emac.h"
>>> +#include <linux/of_net.h>
>>> +#include <linux/platform_device.h>
>>> +#include <linux/module.h>
>>> +#include <linux/clk.h>
>>> +
>>> +#define DRV_NAME "arc_emac"
>>> +#define DRV_VERSION "1.0"
>>> +
>>> +static int arc_emac_probe(struct platform_device *pdev)
>>> +{
>>> + struct emac_platform_data *emac_plat_data = NULL;
>>> + struct device *dev = &pdev->dev;
>>> + int ret = 0;
>>> +
>>> + emac_plat_data = devm_kzalloc(dev, sizeof(*emac_plat_data),
>>> GFP_KERNEL);
>>> + if (!emac_plat_data)
>>> + return -ENOMEM;
>>> + emac_plat_data->name = DRV_NAME;
>>> + emac_plat_data->version = DRV_VERSION;
>>> + emac_plat_data->set_mac_speed = NULL;
>>> + emac_plat_data->priv = emac;
>>> +
>>> + emac_plat_data->interface = of_get_phy_mode(dev->of_node);
>> the original probe function, had an unconditional default value of
>> PHY_INTERFACE_MODE_MII . So you should handle the of_get_phy_mode
>> value as
>> optional to keep compatibility:
>>
>> emac_plat_data->interface = of_get_phy_mode(dev->of_node);
>> if (emac_plat_data->interface < 0)
>> emac_plat_data->interface = PHY_INTERFACE_MODE_MII;
> Ok noted, thanks.
>
> Romain
>
>>
>>
>> Heiko
>>
>>> +
>>> + emac_plat_data->clk = of_clk_get(dev->of_node, 0);
>>> + if (IS_ERR(emac_plat_data->clk)) {
>>> + dev_err(dev, "failed to retrieve clock from device tree\n");
>>> + return PTR_ERR_OR_ZERO(emac_plat_data->clk);
>>> + }
>>> +
>>> + return emac_drv_probe(dev, emac_plat_data);
>>> +}
>>> +
>>> +static int arc_emac_remove(struct platform_device *pdev)
>>> +{
>>> + struct net_device *ndev = dev_get_drvdata(&pdev->dev);
>>> +
>>> + return emac_drv_remove(ndev);
>>> +}
>>> +
>>> +static const struct of_device_id arc_emac_dt_ids[] = {
>>> + { .compatible = "snps,arc-emac" },
>>> + { /* Sentinel */ }
>>> +};
>>> +
>>> +static struct platform_driver arc_emac_driver = {
>>> + .probe = arc_emac_probe,
>>> + .remove = arc_emac_remove,
>>> + .driver = {
>>> + .name = DRV_NAME,
>>> + .owner = THIS_MODULE,
>>> + .of_match_table = arc_emac_dt_ids,
>>> + },
>>> +};
>>> +
>>> +module_platform_driver(arc_emac_driver);
>>> +
>>> +MODULE_AUTHOR("Romain Perier <romain.perier@...il.com>");
>>> +MODULE_DESCRIPTION("ARC EMAC driver");
>>> +MODULE_LICENSE("GPL");
>>> diff --git a/drivers/net/ethernet/arc/emac_main.c
>>> b/drivers/net/ethernet/arc/emac_main.c index 18e2fac..ce04890 100644
>>> --- a/drivers/net/ethernet/arc/emac_main.c
>>> +++ b/drivers/net/ethernet/arc/emac_main.c
>>> @@ -11,6 +11,7 @@
>>> * Amit Bhor
>>> * Sameer Dhavale
>>> * Vineet Gupta
>>> + * Romain Perier
>>> */
>>>
>>> #include <linux/crc32.h>
>>> @@ -26,19 +27,17 @@
>>>
>>> #include "emac.h"
>>>
>>> -#define DRV_NAME "arc_emac"
>>> -#define DRV_VERSION "1.0"
>>>
>>> /**
>>> - * arc_emac_adjust_link - Adjust the PHY link duplex.
>>> + * emac_adjust_link - Adjust the PHY link duplex.
>>> * @ndev: Pointer to the net_device structure.
>>> *
>>> * This function is called to change the duplex setting after auto
>>> negotiation * is done by the PHY.
>>> */
>>> -static void arc_emac_adjust_link(struct net_device *ndev)
>>> +static void emac_adjust_link(struct net_device *ndev)
>>> {
>>> - struct arc_emac_priv *priv = netdev_priv(ndev);
>>> + struct emac_priv *priv = netdev_priv(ndev);
>>> struct phy_device *phy_dev = priv->phy_dev;
>>> unsigned int reg, state_changed = 0;
>>>
>>> @@ -50,17 +49,19 @@ static void arc_emac_adjust_link(struct net_device
>>> *ndev) if (priv->speed != phy_dev->speed) {
>>> priv->speed = phy_dev->speed;
>>> state_changed = 1;
>>> + if (priv->plat_data->set_mac_speed)
>>> + priv->plat_data->set_mac_speed(priv->plat_data->priv, priv-
>>> speed);
>>> }
>>>
>>> if (priv->duplex != phy_dev->duplex) {
>>> - reg = arc_reg_get(priv, R_CTRL);
>>> + reg = emac_reg_get(priv, R_CTRL);
>>>
>>> if (DUPLEX_FULL == phy_dev->duplex)
>>> reg |= ENFL_MASK;
>>> else
>>> reg &= ~ENFL_MASK;
>>>
>>> - arc_reg_set(priv, R_CTRL, reg);
>>> + emac_reg_set(priv, R_CTRL, reg);
>>> priv->duplex = phy_dev->duplex;
>>> state_changed = 1;
>>> }
>>> @@ -70,7 +71,7 @@ static void arc_emac_adjust_link(struct net_device
>>> *ndev)
>>> }
>>>
>>> /**
>>> - * arc_emac_get_settings - Get PHY settings.
>>> + * emac_get_settings - Get PHY settings.
>>> * @ndev: Pointer to net_device structure.
>>> * @cmd: Pointer to ethtool_cmd structure.
>>> *
>>> @@ -79,16 +80,16 @@ static void arc_emac_adjust_link(struct net_device
>>> *ndev) * relevant PHY ethtool API to get the PHY settings.
>>> * Issue "ethtool ethX" under linux prompt to execute this function.
>>> */
>>> -static int arc_emac_get_settings(struct net_device *ndev,
>>> +static int emac_get_settings(struct net_device *ndev,
>>> struct ethtool_cmd *cmd)
>>> {
>>> - struct arc_emac_priv *priv = netdev_priv(ndev);
>>> + struct emac_priv *priv = netdev_priv(ndev);
>>>
>>> return phy_ethtool_gset(priv->phy_dev, cmd);
>>> }
>>>
>>> /**
>>> - * arc_emac_set_settings - Set PHY settings as passed in the argument.
>>> + * emac_set_settings - Set PHY settings as passed in the argument.
>>> * @ndev: Pointer to net_device structure.
>>> * @cmd: Pointer to ethtool_cmd structure.
>>> *
>>> @@ -98,10 +99,10 @@ static int arc_emac_get_settings(struct net_device
>>> *ndev, * Issue e.g. "ethtool -s ethX speed 1000" under linux prompt to
>>> execute this * function.
>>> */
>>> -static int arc_emac_set_settings(struct net_device *ndev,
>>> - struct ethtool_cmd *cmd)
>>> +static int emac_set_settings(struct net_device *ndev,
>>> + struct ethtool_cmd *cmd)
>>> {
>>> - struct arc_emac_priv *priv = netdev_priv(ndev);
>>> + struct emac_priv *priv = netdev_priv(ndev);
>>>
>>> if (!capable(CAP_NET_ADMIN))
>>> return -EPERM;
>>> @@ -110,42 +111,44 @@ static int arc_emac_set_settings(struct
>>> net_device
>>> *ndev, }
>>>
>>> /**
>>> - * arc_emac_get_drvinfo - Get EMAC driver information.
>>> + * emac_get_drvinfo - Get EMAC driver information.
>>> * @ndev: Pointer to net_device structure.
>>> * @info: Pointer to ethtool_drvinfo structure.
>>> *
>>> * This implements ethtool command for getting the driver
>>> information.
>>> * Issue "ethtool -i ethX" under linux prompt to execute this
>>> function.
>>> */
>>> -static void arc_emac_get_drvinfo(struct net_device *ndev,
>>> +static void emac_get_drvinfo(struct net_device *ndev,
>>> struct ethtool_drvinfo *info)
>>> {
>>> - strlcpy(info->driver, DRV_NAME, sizeof(info->driver));
>>> - strlcpy(info->version, DRV_VERSION, sizeof(info->version));
>>> + struct emac_priv *priv = netdev_priv(ndev);
>>> +
>>> + strlcpy(info->driver, priv->plat_data->name,
>>> sizeof(info->driver));
>>> + strlcpy(info->version, priv->plat_data->version,
>>> sizeof(info->version));
>>> }
>>>
>>> -static const struct ethtool_ops arc_emac_ethtool_ops = {
>>> - .get_settings = arc_emac_get_settings,
>>> - .set_settings = arc_emac_set_settings,
>>> - .get_drvinfo = arc_emac_get_drvinfo,
>>> +static const struct ethtool_ops emac_ethtool_ops = {
>>> + .get_settings = emac_get_settings,
>>> + .set_settings = emac_set_settings,
>>> + .get_drvinfo = emac_get_drvinfo,
>>> .get_link = ethtool_op_get_link,
>>> };
>>>
>>> #define FIRST_OR_LAST_MASK (FIRST_MASK | LAST_MASK)
>>>
>>> /**
>>> - * arc_emac_tx_clean - clears processed by EMAC Tx BDs.
>>> + * emac_tx_clean - clears processed by EMAC Tx BDs.
>>> * @ndev: Pointer to the network device.
>>> */
>>> -static void arc_emac_tx_clean(struct net_device *ndev)
>>> +static void emac_tx_clean(struct net_device *ndev)
>>> {
>>> - struct arc_emac_priv *priv = netdev_priv(ndev);
>>> + struct emac_priv *priv = netdev_priv(ndev);
>>> struct net_device_stats *stats = &priv->stats;
>>> unsigned int i;
>>>
>>> for (i = 0; i < TX_BD_NUM; i++) {
>>> unsigned int *txbd_dirty = &priv->txbd_dirty;
>>> - struct arc_emac_bd *txbd = &priv->txbd[*txbd_dirty];
>>> + struct emac_bd *txbd = &priv->txbd[*txbd_dirty];
>>> struct buffer_state *tx_buff = &priv->tx_buff[*txbd_dirty];
>>> struct sk_buff *skb = tx_buff->skb;
>>> unsigned int info = le32_to_cpu(txbd->info);
>>> @@ -187,7 +190,7 @@ static void arc_emac_tx_clean(struct net_device
>>> *ndev)
>>> }
>>>
>>> /**
>>> - * arc_emac_rx - processing of Rx packets.
>>> + * emac_rx - processing of Rx packets.
>>> * @ndev: Pointer to the network device.
>>> * @budget: How many BDs to process on 1 call.
>>> *
>>> @@ -195,16 +198,16 @@ static void arc_emac_tx_clean(struct
>>> net_device *ndev)
>>> *
>>> * Iterate through Rx BDs and deliver received packages to upper
>>> layer.
>>> */
>>> -static int arc_emac_rx(struct net_device *ndev, int budget)
>>> +static int emac_rx(struct net_device *ndev, int budget)
>>> {
>>> - struct arc_emac_priv *priv = netdev_priv(ndev);
>>> + struct emac_priv *priv = netdev_priv(ndev);
>>> unsigned int work_done;
>>>
>>> for (work_done = 0; work_done < budget; work_done++) {
>>> unsigned int *last_rx_bd = &priv->last_rx_bd;
>>> struct net_device_stats *stats = &priv->stats;
>>> struct buffer_state *rx_buff = &priv->rx_buff[*last_rx_bd];
>>> - struct arc_emac_bd *rxbd = &priv->rxbd[*last_rx_bd];
>>> + struct emac_bd *rxbd = &priv->rxbd[*last_rx_bd];
>>> unsigned int pktlen, info = le32_to_cpu(rxbd->info);
>>> struct sk_buff *skb;
>>> dma_addr_t addr;
>>> @@ -281,55 +284,55 @@ static int arc_emac_rx(struct net_device
>>> *ndev, int
>>> budget) }
>>>
>>> /**
>>> - * arc_emac_poll - NAPI poll handler.
>>> + * emac_poll - NAPI poll handler.
>>> * @napi: Pointer to napi_struct structure.
>>> * @budget: How many BDs to process on 1 call.
>>> *
>>> * returns: Number of processed BDs
>>> */
>>> -static int arc_emac_poll(struct napi_struct *napi, int budget)
>>> +static int emac_poll(struct napi_struct *napi, int budget)
>>> {
>>> struct net_device *ndev = napi->dev;
>>> - struct arc_emac_priv *priv = netdev_priv(ndev);
>>> + struct emac_priv *priv = netdev_priv(ndev);
>>> unsigned int work_done;
>>>
>>> - arc_emac_tx_clean(ndev);
>>> + emac_tx_clean(ndev);
>>>
>>> - work_done = arc_emac_rx(ndev, budget);
>>> + work_done = emac_rx(ndev, budget);
>>> if (work_done < budget) {
>>> napi_complete(napi);
>>> - arc_reg_or(priv, R_ENABLE, RXINT_MASK);
>>> + emac_reg_or(priv, R_ENABLE, RXINT_MASK);
>>> }
>>>
>>> return work_done;
>>> }
>>>
>>> /**
>>> - * arc_emac_intr - Global interrupt handler for EMAC.
>>> + * emac_intr - Global interrupt handler for EMAC.
>>> * @irq: irq number.
>>> * @dev_instance: device instance.
>>> *
>>> * returns: IRQ_HANDLED for all cases.
>>> *
>>> - * ARC EMAC has only 1 interrupt line, and depending on bits raised in
>>> + * EMAC has only 1 interrupt line, and depending on bits raised in
>>> * STATUS register we may tell what is a reason for interrupt to
>>> fire.
>>> */
>>> -static irqreturn_t arc_emac_intr(int irq, void *dev_instance)
>>> +static irqreturn_t emac_intr(int irq, void *dev_instance)
>>> {
>>> struct net_device *ndev = dev_instance;
>>> - struct arc_emac_priv *priv = netdev_priv(ndev);
>>> + struct emac_priv *priv = netdev_priv(ndev);
>>> struct net_device_stats *stats = &priv->stats;
>>> unsigned int status;
>>>
>>> - status = arc_reg_get(priv, R_STATUS);
>>> + status = emac_reg_get(priv, R_STATUS);
>>> status &= ~MDIO_MASK;
>>>
>>> /* Reset all flags except "MDIO complete" */
>>> - arc_reg_set(priv, R_STATUS, status);
>>> + emac_reg_set(priv, R_STATUS, status);
>>>
>>> if (status & RXINT_MASK) {
>>> if (likely(napi_schedule_prep(&priv->napi))) {
>>> - arc_reg_clr(priv, R_ENABLE, RXINT_MASK);
>>> + emac_reg_clr(priv, R_ENABLE, RXINT_MASK);
>>> __napi_schedule(&priv->napi);
>>> }
>>> }
>>> @@ -364,16 +367,16 @@ static irqreturn_t arc_emac_intr(int irq, void
>>> *dev_instance) }
>>>
>>> #ifdef CONFIG_NET_POLL_CONTROLLER
>>> -static void arc_emac_poll_controller(struct net_device *dev)
>>> +static void emac_poll_controller(struct net_device *dev)
>>> {
>>> disable_irq(dev->irq);
>>> - arc_emac_intr(dev->irq, dev);
>>> + emac_intr(dev->irq, dev);
>>> enable_irq(dev->irq);
>>> }
>>> #endif
>>>
>>> /**
>>> - * arc_emac_open - Open the network device.
>>> + * emac_open - Open the network device.
>>> * @ndev: Pointer to the network device.
>>> *
>>> * returns: 0, on success or non-zero error value on failure.
>>> @@ -382,9 +385,9 @@ static void arc_emac_poll_controller(struct
>>> net_device
>>> *dev) * for the EMAC device and starts the Tx queue.
>>> * It also connects to the phy device.
>>> */
>>> -static int arc_emac_open(struct net_device *ndev)
>>> +static int emac_open(struct net_device *ndev)
>>> {
>>> - struct arc_emac_priv *priv = netdev_priv(ndev);
>>> + struct emac_priv *priv = netdev_priv(ndev);
>>> struct phy_device *phy_dev = priv->phy_dev;
>>> int i;
>>>
>>> @@ -399,7 +402,7 @@ static int arc_emac_open(struct net_device *ndev)
>>> for (i = 0; i < RX_BD_NUM; i++) {
>>> dma_addr_t addr;
>>> unsigned int *last_rx_bd = &priv->last_rx_bd;
>>> - struct arc_emac_bd *rxbd = &priv->rxbd[*last_rx_bd];
>>> + struct emac_bd *rxbd = &priv->rxbd[*last_rx_bd];
>>> struct buffer_state *rx_buff = &priv->rx_buff[*last_rx_bd];
>>>
>>> rx_buff->skb = netdev_alloc_skb_ip_align(ndev,
>>> @@ -432,18 +435,18 @@ static int arc_emac_open(struct net_device *ndev)
>>> memset(priv->txbd, 0, TX_RING_SZ);
>>>
>>> /* Initialize logical address filter */
>>> - arc_reg_set(priv, R_LAFL, 0);
>>> - arc_reg_set(priv, R_LAFH, 0);
>>> + emac_reg_set(priv, R_LAFL, 0);
>>> + emac_reg_set(priv, R_LAFH, 0);
>>>
>>> /* Set BD ring pointers for device side */
>>> - arc_reg_set(priv, R_RX_RING, (unsigned int)priv->rxbd_dma);
>>> - arc_reg_set(priv, R_TX_RING, (unsigned int)priv->txbd_dma);
>>> + emac_reg_set(priv, R_RX_RING, (unsigned int)priv->rxbd_dma);
>>> + emac_reg_set(priv, R_TX_RING, (unsigned int)priv->txbd_dma);
>>>
>>> /* Enable interrupts */
>>> - arc_reg_set(priv, R_ENABLE, RXINT_MASK | ERR_MASK);
>>> + emac_reg_set(priv, R_ENABLE, RXINT_MASK | ERR_MASK);
>>>
>>> /* Set CONTROL */
>>> - arc_reg_set(priv, R_CTRL,
>>> + emac_reg_set(priv, R_CTRL,
>>> (RX_BD_NUM << 24) | /* RX BD table length */
>>> (TX_BD_NUM << 16) | /* TX BD table length */
>>> TXRN_MASK | RXRN_MASK);
>>> @@ -451,7 +454,7 @@ static int arc_emac_open(struct net_device *ndev)
>>> napi_enable(&priv->napi);
>>>
>>> /* Enable EMAC */
>>> - arc_reg_or(priv, R_CTRL, EN_MASK);
>>> + emac_reg_or(priv, R_CTRL, EN_MASK);
>>>
>>> phy_start_aneg(priv->phy_dev);
>>>
>>> @@ -461,24 +464,24 @@ static int arc_emac_open(struct net_device *ndev)
>>> }
>>>
>>> /**
>>> - * arc_emac_set_rx_mode - Change the receive filtering mode.
>>> + * emac_set_rx_mode - Change the receive filtering mode.
>>> * @ndev: Pointer to the network device.
>>> *
>>> * This function enables/disables promiscuous or all-multicast mode
>>> * and updates the multicast filtering list of the network device.
>>> */
>>> -static void arc_emac_set_rx_mode(struct net_device *ndev)
>>> +static void emac_set_rx_mode(struct net_device *ndev)
>>> {
>>> - struct arc_emac_priv *priv = netdev_priv(ndev);
>>> + struct emac_priv *priv = netdev_priv(ndev);
>>>
>>> if (ndev->flags & IFF_PROMISC) {
>>> - arc_reg_or(priv, R_CTRL, PROM_MASK);
>>> + emac_reg_or(priv, R_CTRL, PROM_MASK);
>>> } else {
>>> - arc_reg_clr(priv, R_CTRL, PROM_MASK);
>>> + emac_reg_clr(priv, R_CTRL, PROM_MASK);
>>>
>>> if (ndev->flags & IFF_ALLMULTI) {
>>> - arc_reg_set(priv, R_LAFL, ~0);
>>> - arc_reg_set(priv, R_LAFH, ~0);
>>> + emac_reg_set(priv, R_LAFL, ~0);
>>> + emac_reg_set(priv, R_LAFH, ~0);
>>> } else {
>>> struct netdev_hw_addr *ha;
>>> unsigned int filter[2] = { 0, 0 };
>>> @@ -489,52 +492,52 @@ static void arc_emac_set_rx_mode(struct
>>> net_device
>>> *ndev) filter[bit >> 5] |= 1 << (bit & 31);
>>> }
>>>
>>> - arc_reg_set(priv, R_LAFL, filter[0]);
>>> - arc_reg_set(priv, R_LAFH, filter[1]);
>>> + emac_reg_set(priv, R_LAFL, filter[0]);
>>> + emac_reg_set(priv, R_LAFH, filter[1]);
>>> }
>>> }
>>> }
>>>
>>> /**
>>> - * arc_emac_stop - Close the network device.
>>> + * emac_stop - Close the network device.
>>> * @ndev: Pointer to the network device.
>>> *
>>> * This function stops the Tx queue, disables interrupts and frees
>>> the IRQ
>>> for * the EMAC device.
>>> * It also disconnects the PHY device associated with the EMAC
>>> device.
>>> */
>>> -static int arc_emac_stop(struct net_device *ndev)
>>> +static int emac_stop(struct net_device *ndev)
>>> {
>>> - struct arc_emac_priv *priv = netdev_priv(ndev);
>>> + struct emac_priv *priv = netdev_priv(ndev);
>>>
>>> napi_disable(&priv->napi);
>>> netif_stop_queue(ndev);
>>>
>>> /* Disable interrupts */
>>> - arc_reg_clr(priv, R_ENABLE, RXINT_MASK | ERR_MASK);
>>> + emac_reg_clr(priv, R_ENABLE, RXINT_MASK | ERR_MASK);
>>>
>>> /* Disable EMAC */
>>> - arc_reg_clr(priv, R_CTRL, EN_MASK);
>>> + emac_reg_clr(priv, R_CTRL, EN_MASK);
>>>
>>> return 0;
>>> }
>>>
>>> /**
>>> - * arc_emac_stats - Get system network statistics.
>>> + * emac_stats - Get system network statistics.
>>> * @ndev: Pointer to net_device structure.
>>> *
>>> * Returns the address of the device statistics structure.
>>> * Statistics are updated in interrupt handler.
>>> */
>>> -static struct net_device_stats *arc_emac_stats(struct net_device
>>> *ndev)
>>> +static struct net_device_stats *emac_stats(struct net_device *ndev)
>>> {
>>> - struct arc_emac_priv *priv = netdev_priv(ndev);
>>> + struct emac_priv *priv = netdev_priv(ndev);
>>> struct net_device_stats *stats = &priv->stats;
>>> unsigned long miss, rxerr;
>>> u8 rxcrc, rxfram, rxoflow;
>>>
>>> - rxerr = arc_reg_get(priv, R_RXERR);
>>> - miss = arc_reg_get(priv, R_MISS);
>>> + rxerr = emac_reg_get(priv, R_RXERR);
>>> + miss = emac_reg_get(priv, R_MISS);
>>>
>>> rxcrc = rxerr;
>>> rxfram = rxerr >> 8;
>>> @@ -552,7 +555,7 @@ static struct net_device_stats
>>> *arc_emac_stats(struct
>>> net_device *ndev) }
>>>
>>> /**
>>> - * arc_emac_tx - Starts the data transmission.
>>> + * emac_tx - Starts the data transmission.
>>> * @skb: sk_buff pointer that contains data to be Transmitted.
>>> * @ndev: Pointer to net_device structure.
>>> *
>>> @@ -561,9 +564,9 @@ static struct net_device_stats
>>> *arc_emac_stats(struct
>>> net_device *ndev) *
>>> * This function is invoked from upper layers to initiate
>>> transmission.
>>> */
>>> -static int arc_emac_tx(struct sk_buff *skb, struct net_device *ndev)
>>> +static int emac_tx(struct sk_buff *skb, struct net_device *ndev)
>>> {
>>> - struct arc_emac_priv *priv = netdev_priv(ndev);
>>> + struct emac_priv *priv = netdev_priv(ndev);
>>> unsigned int len, *txbd_curr = &priv->txbd_curr;
>>> struct net_device_stats *stats = &priv->stats;
>>> __le32 *info = &priv->txbd[*txbd_curr].info;
>>> @@ -614,25 +617,25 @@ static int arc_emac_tx(struct sk_buff *skb,
>>> struct
>>> net_device *ndev) if (unlikely((le32_to_cpu(*info) & OWN_MASK) ==
>>> FOR_EMAC))
>>> netif_stop_queue(ndev);
>>>
>>> - arc_reg_set(priv, R_STATUS, TXPL_MASK);
>>> + emac_reg_set(priv, R_STATUS, TXPL_MASK);
>>>
>>> return NETDEV_TX_OK;
>>> }
>>>
>>> -static void arc_emac_set_address_internal(struct net_device *ndev)
>>> +static void emac_set_address_internal(struct net_device *ndev)
>>> {
>>> - struct arc_emac_priv *priv = netdev_priv(ndev);
>>> + struct emac_priv *priv = netdev_priv(ndev);
>>> unsigned int addr_low, addr_hi;
>>>
>>> addr_low = le32_to_cpu(*(__le32 *) &ndev->dev_addr[0]);
>>> addr_hi = le16_to_cpu(*(__le16 *) &ndev->dev_addr[4]);
>>>
>>> - arc_reg_set(priv, R_ADDRL, addr_low);
>>> - arc_reg_set(priv, R_ADDRH, addr_hi);
>>> + emac_reg_set(priv, R_ADDRL, addr_low);
>>> + emac_reg_set(priv, R_ADDRH, addr_hi);
>>> }
>>>
>>> /**
>>> - * arc_emac_set_address - Set the MAC address for this device.
>>> + * emac_set_address - Set the MAC address for this device.
>>> * @ndev: Pointer to net_device structure.
>>> * @p: 6 byte Address to be written as MAC address.
>>> *
>>> @@ -642,7 +645,7 @@ static void arc_emac_set_address_internal(struct
>>> net_device *ndev) * returns: -EBUSY if the net device is busy or
>>> 0 if the
>>> address is set * successfully.
>>> */
>>> -static int arc_emac_set_address(struct net_device *ndev, void *p)
>>> +static int emac_set_address(struct net_device *ndev, void *p)
>>> {
>>> struct sockaddr *addr = p;
>>>
>>> @@ -654,141 +657,129 @@ static int arc_emac_set_address(struct
>>> net_device
>>> *ndev, void *p)
>>>
>>> memcpy(ndev->dev_addr, addr->sa_data, ndev->addr_len);
>>>
>>> - arc_emac_set_address_internal(ndev);
>>> + emac_set_address_internal(ndev);
>>>
>>> return 0;
>>> }
>>>
>>> -static const struct net_device_ops arc_emac_netdev_ops = {
>>> - .ndo_open = arc_emac_open,
>>> - .ndo_stop = arc_emac_stop,
>>> - .ndo_start_xmit = arc_emac_tx,
>>> - .ndo_set_mac_address = arc_emac_set_address,
>>> - .ndo_get_stats = arc_emac_stats,
>>> - .ndo_set_rx_mode = arc_emac_set_rx_mode,
>>> +static const struct net_device_ops emac_netdev_ops = {
>>> + .ndo_open = emac_open,
>>> + .ndo_stop = emac_stop,
>>> + .ndo_start_xmit = emac_tx,
>>> + .ndo_set_mac_address = emac_set_address,
>>> + .ndo_get_stats = emac_stats,
>>> + .ndo_set_rx_mode = emac_set_rx_mode,
>>> #ifdef CONFIG_NET_POLL_CONTROLLER
>>> - .ndo_poll_controller = arc_emac_poll_controller,
>>> + .ndo_poll_controller = emac_poll_controller,
>>> #endif
>>> };
>>>
>>> -static int arc_emac_probe(struct platform_device *pdev)
>>> +int emac_drv_probe(struct device *dev, const struct emac_platform_data
>>> *plat_data) {
>>> struct resource res_regs;
>>> struct device_node *phy_node;
>>> - struct arc_emac_priv *priv;
>>> + struct emac_priv *priv;
>>> struct net_device *ndev;
>>> const char *mac_addr;
>>> unsigned int id, clock_frequency, irq;
>>> int err;
>>>
>>> - if (!pdev->dev.of_node)
>>> - return -ENODEV;
>>> -
>>> /* Get PHY from device tree */
>>> - phy_node = of_parse_phandle(pdev->dev.of_node, "phy", 0);
>>> + phy_node = of_parse_phandle(dev->of_node, "phy", 0);
>>> if (!phy_node) {
>>> - dev_err(&pdev->dev, "failed to retrieve phy description
>>> from device
>>> tree\n"); + dev_err(dev, "failed to retrieve phy description
>>> from
>> device
>>> tree\n"); return -ENODEV;
>>> }
>>>
>>> /* Get EMAC registers base address from device tree */
>>> - err = of_address_to_resource(pdev->dev.of_node, 0, &res_regs);
>>> + err = of_address_to_resource(dev->of_node, 0, &res_regs);
>>> if (err) {
>>> - dev_err(&pdev->dev, "failed to retrieve registers base from
>>> device
>>> tree\n"); + dev_err(dev, "failed to retrieve registers base from
>> device
>>> tree\n"); return -ENODEV;
>>> }
>>>
>>> /* Get IRQ from device tree */
>>> - irq = irq_of_parse_and_map(pdev->dev.of_node, 0);
>>> + irq = irq_of_parse_and_map(dev->of_node, 0);
>>> if (!irq) {
>>> - dev_err(&pdev->dev, "failed to retrieve <irq> value from
>>> device
>> tree\n");
>>> + dev_err(dev, "failed to retrieve <irq> value from device
>>> tree\n");
>>> return -ENODEV;
>>> }
>>>
>>> - ndev = alloc_etherdev(sizeof(struct arc_emac_priv));
>>> + ndev = alloc_etherdev(sizeof(struct emac_priv));
>>> if (!ndev)
>>> return -ENOMEM;
>>>
>>> - platform_set_drvdata(pdev, ndev);
>>> - SET_NETDEV_DEV(ndev, &pdev->dev);
>>> + dev_set_drvdata(dev, ndev);
>>> + SET_NETDEV_DEV(ndev, dev);
>>>
>>> - ndev->netdev_ops = &arc_emac_netdev_ops;
>>> - ndev->ethtool_ops = &arc_emac_ethtool_ops;
>>> + ndev->netdev_ops = &emac_netdev_ops;
>>> + ndev->ethtool_ops = &emac_ethtool_ops;
>>> ndev->watchdog_timeo = TX_TIMEOUT;
>>> /* FIXME :: no multicast support yet */
>>> ndev->flags &= ~IFF_MULTICAST;
>>>
>>> priv = netdev_priv(ndev);
>>> - priv->dev = &pdev->dev;
>>> + priv->dev = dev;
>>> priv->ndev = ndev;
>>> + priv->plat_data = plat_data;
>>>
>>> - priv->regs = devm_ioremap_resource(&pdev->dev, &res_regs);
>>> + priv->regs = devm_ioremap_resource(dev, &res_regs);
>>> if (IS_ERR(priv->regs)) {
>>> err = PTR_ERR(priv->regs);
>>> goto out_netdev;
>>> }
>>> - dev_dbg(&pdev->dev, "Registers base address is 0x%p\n",
>>> priv->regs);
>>> -
>>> - priv->clk = of_clk_get(pdev->dev.of_node, 0);
>>> - if (IS_ERR(priv->clk)) {
>>> - /* Get CPU clock frequency from device tree */
>>> - if (of_property_read_u32(pdev->dev.of_node, "clock-frequency",
>>> - &clock_frequency)) {
>>> - dev_err(&pdev->dev, "failed to retrieve
>>> <clock-frequency> from
>> device
>>> tree\n"); - err = -EINVAL;
>>> - goto out_netdev;
>>> - }
>>> - } else {
>>> - err = clk_prepare_enable(priv->clk);
>>> + dev_dbg(dev, "Registers base address is 0x%p\n", priv->regs);
>>> +
>>> + if (plat_data->clk) {
>>> + err = clk_prepare_enable(plat_data->clk);
>>> if (err) {
>>> - dev_err(&pdev->dev, "failed to enable clock\n");
>>> + dev_err(dev, "failed to enable clock\n");
>>> goto out_clkget;
>>> }
>>> -
>>> - clock_frequency = clk_get_rate(priv->clk);
>>> + clock_frequency = clk_get_rate(plat_data->clk);
>>> }
>>>
>>> - id = arc_reg_get(priv, R_ID);
>>> + id = emac_reg_get(priv, R_ID);
>>>
>>> /* Check for EMAC revision 5 or 7, magic number */
>>> if (!(id == 0x0005fd02 || id == 0x0007fd02)) {
>>> - dev_err(&pdev->dev, "ARC EMAC not detected, id=0x%x\n", id);
>>> + dev_err(dev, "EMAC not detected, id=0x%x\n", id);
>>> err = -ENODEV;
>>> goto out_clken;
>>> }
>>> - dev_info(&pdev->dev, "ARC EMAC detected with id: 0x%x\n", id);
>>> + dev_info(dev, "EMAC detected with id: 0x%x\n", id);
>>>
>>> /* Set poll rate so that it polls every 1 ms */
>>> - arc_reg_set(priv, R_POLLRATE, clock_frequency / 1000000);
>>> + emac_reg_set(priv, R_POLLRATE, clock_frequency / 1000000);
>>>
>>> ndev->irq = irq;
>>> - dev_info(&pdev->dev, "IRQ is %d\n", ndev->irq);
>>> + dev_dbg(dev, "IRQ is %d\n", ndev->irq);
>>>
>>> /* Register interrupt handler for device */
>>> - err = devm_request_irq(&pdev->dev, ndev->irq, arc_emac_intr, 0,
>>> + err = devm_request_irq(dev, ndev->irq, emac_intr, 0,
>>> ndev->name, ndev);
>>> if (err) {
>>> - dev_err(&pdev->dev, "could not allocate IRQ\n");
>>> + dev_err(dev, "could not allocate IRQ\n");
>>> goto out_clken;
>>> }
>>>
>>> /* Get MAC address from device tree */
>>> - mac_addr = of_get_mac_address(pdev->dev.of_node);
>>> + mac_addr = of_get_mac_address(dev->of_node);
>>>
>>> if (mac_addr)
>>> memcpy(ndev->dev_addr, mac_addr, ETH_ALEN);
>>> else
>>> eth_hw_addr_random(ndev);
>>>
>>> - arc_emac_set_address_internal(ndev);
>>> - dev_info(&pdev->dev, "MAC address is now %pM\n", ndev->dev_addr);
>>> + emac_set_address_internal(ndev);
>>> + dev_info(dev, "MAC address is now %pM\n", ndev->dev_addr);
>>>
>>> /* Do 1 allocation instead of 2 separate ones for Rx and Tx BD
>>> rings */
>>> - priv->rxbd = dmam_alloc_coherent(&pdev->dev, RX_RING_SZ +
>>> TX_RING_SZ,
>>> + priv->rxbd = dmam_alloc_coherent(dev, RX_RING_SZ + TX_RING_SZ,
>>> &priv->rxbd_dma, GFP_KERNEL);
>>>
>>> if (!priv->rxbd) {
>>> - dev_err(&pdev->dev, "failed to allocate data buffers\n");
>>> + dev_err(dev, "failed to allocate data buffers\n");
>>> err = -ENOMEM;
>>> goto out_clken;
>>> }
>>> @@ -796,31 +787,31 @@ static int arc_emac_probe(struct platform_device
>>> *pdev) priv->txbd = priv->rxbd + RX_BD_NUM;
>>>
>>> priv->txbd_dma = priv->rxbd_dma + RX_RING_SZ;
>>> - dev_dbg(&pdev->dev, "EMAC Device addr: Rx Ring [0x%x], Tx
>>> Ring[%x]\n",
>>> + dev_dbg(dev, "EMAC Device addr: Rx Ring [0x%x], Tx Ring[%x]\n",
>>> (unsigned int)priv->rxbd_dma, (unsigned int)priv->txbd_dma);
>>>
>>> - err = arc_mdio_probe(pdev, priv);
>>> + err = emac_mdio_probe(priv);
>>> if (err) {
>>> - dev_err(&pdev->dev, "failed to probe MII bus\n");
>>> + dev_err(dev, "failed to probe MII bus\n");
>>> goto out_clken;
>>> }
>>>
>>> - priv->phy_dev = of_phy_connect(ndev, phy_node,
>>> arc_emac_adjust_link, 0,
>>> - PHY_INTERFACE_MODE_MII);
>>> + priv->phy_dev = of_phy_connect(ndev, phy_node,
>>> emac_adjust_link, 0,
>>> + plat_data->interface);
>>> if (!priv->phy_dev) {
>>> - dev_err(&pdev->dev, "of_phy_connect() failed\n");
>>> + dev_err(dev, "of_phy_connect() failed\n");
>>> err = -ENODEV;
>>> goto out_mdio;
>>> }
>>>
>>> - dev_info(&pdev->dev, "connected to %s phy with id 0x%x\n",
>>> + dev_info(dev, "connected to %s phy with id 0x%x\n",
>>> priv->phy_dev->drv->name, priv->phy_dev->phy_id);
>>>
>>> - netif_napi_add(ndev, &priv->napi, arc_emac_poll,
>>> ARC_EMAC_NAPI_WEIGHT);
>>> + netif_napi_add(ndev, &priv->napi, emac_poll, EMAC_NAPI_WEIGHT);
>>>
>>> err = register_netdev(ndev);
>>> if (err) {
>>> - dev_err(&pdev->dev, "failed to register network device\n");
>>> + dev_err(dev, "failed to register network device\n");
>>> goto out_netif_api;
>>> }
>>>
>>> @@ -831,32 +822,31 @@ out_netif_api:
>>> phy_disconnect(priv->phy_dev);
>>> priv->phy_dev = NULL;
>>> out_mdio:
>>> - arc_mdio_remove(priv);
>>> + emac_mdio_remove(priv);
>>> out_clken:
>>> - if (!IS_ERR(priv->clk))
>>> - clk_disable_unprepare(priv->clk);
>>> + if (!IS_ERR(plat_data->clk))
>>> + clk_disable_unprepare(plat_data->clk);
>>> out_clkget:
>>> - if (!IS_ERR(priv->clk))
>>> - clk_put(priv->clk);
>>> + if (!IS_ERR(plat_data->clk))
>>> + clk_put(plat_data->clk);
>>> out_netdev:
>>> free_netdev(ndev);
>>> return err;
>>> }
>>>
>>> -static int arc_emac_remove(struct platform_device *pdev)
>>> +int emac_drv_remove(struct net_device *ndev)
>>> {
>>> - struct net_device *ndev = platform_get_drvdata(pdev);
>>> - struct arc_emac_priv *priv = netdev_priv(ndev);
>>> + struct emac_priv *priv = netdev_priv(ndev);
>>>
>>> phy_disconnect(priv->phy_dev);
>>> priv->phy_dev = NULL;
>>> - arc_mdio_remove(priv);
>>> + emac_mdio_remove(priv);
>>> unregister_netdev(ndev);
>>> netif_napi_del(&priv->napi);
>>>
>>> - if (!IS_ERR(priv->clk)) {
>>> - clk_disable_unprepare(priv->clk);
>>> - clk_put(priv->clk);
>>> + if (priv->plat_data->clk) {
>>> + clk_disable_unprepare(priv->plat_data->clk);
>>> + clk_put(priv->plat_data->clk);
>>> }
>>>
>>> free_netdev(ndev);
>>> @@ -864,24 +854,6 @@ static int arc_emac_remove(struct platform_device
>>> *pdev) return 0;
>>> }
>>>
>>> -static const struct of_device_id arc_emac_dt_ids[] = {
>>> - { .compatible = "snps,arc-emac" },
>>> - { /* Sentinel */ }
>>> -};
>>> -MODULE_DEVICE_TABLE(of, arc_emac_dt_ids);
>>> -
>>> -static struct platform_driver arc_emac_driver = {
>>> - .probe = arc_emac_probe,
>>> - .remove = arc_emac_remove,
>>> - .driver = {
>>> - .name = DRV_NAME,
>>> - .owner = THIS_MODULE,
>>> - .of_match_table = arc_emac_dt_ids,
>>> - },
>>> -};
>>> -
>>> -module_platform_driver(arc_emac_driver);
>>> -
>>> MODULE_AUTHOR("Alexey Brodkin <abrodkin@...opsys.com>");
>>> -MODULE_DESCRIPTION("ARC EMAC driver");
>>> +MODULE_DESCRIPTION("EMAC driver");
>>> MODULE_LICENSE("GPL");
>>> diff --git a/drivers/net/ethernet/arc/emac_mdio.c
>>> b/drivers/net/ethernet/arc/emac_mdio.c index 26ba242..b1397ea 100644
>>> --- a/drivers/net/ethernet/arc/emac_mdio.c
>>> +++ b/drivers/net/ethernet/arc/emac_mdio.c
>>> @@ -1,7 +1,7 @@
>>> /*
>>> * Copyright (C) 2004-2013 Synopsys, Inc. (www.synopsys.com)
>>> *
>>> - * MDIO implementation for ARC EMAC
>>> + * MDIO implementation for EMAC
>>> */
>>>
>>> #include <linux/delay.h>
>>> @@ -11,26 +11,26 @@
>>> #include "emac.h"
>>>
>>> /* Number of seconds we wait for "MDIO complete" flag to appear */
>>> -#define ARC_MDIO_COMPLETE_POLL_COUNT 1
>>> +#define EMAC_MDIO_COMPLETE_POLL_COUNT 1
>>>
>>> /**
>>> - * arc_mdio_complete_wait - Waits until MDIO transaction is completed.
>>> - * @priv: Pointer to ARC EMAC private data structure.
>>> + * emac_mdio_complete_wait - Waits until MDIO transaction is
>>> completed.
>>> + * @priv: Pointer to EMAC private data structure.
>>> *
>>> * returns: 0 on success, -ETIMEDOUT on a timeout.
>>> */
>>> -static int arc_mdio_complete_wait(struct arc_emac_priv *priv)
>>> +static int emac_mdio_complete_wait(struct emac_priv *priv)
>>> {
>>> unsigned int i;
>>>
>>> - for (i = 0; i < ARC_MDIO_COMPLETE_POLL_COUNT * 40; i++) {
>>> - unsigned int status = arc_reg_get(priv, R_STATUS);
>>> + for (i = 0; i < EMAC_MDIO_COMPLETE_POLL_COUNT * 40; i++) {
>>> + unsigned int status = emac_reg_get(priv, R_STATUS);
>>>
>>> status &= MDIO_MASK;
>>>
>>> if (status) {
>>> /* Reset "MDIO complete" flag */
>>> - arc_reg_set(priv, R_STATUS, status);
>>> + emac_reg_set(priv, R_STATUS, status);
>>> return 0;
>>> }
>>>
>>> @@ -41,7 +41,7 @@ static int arc_mdio_complete_wait(struct
>>> arc_emac_priv
>>> *priv) }
>>>
>>> /**
>>> - * arc_mdio_read - MDIO interface read function.
>>> + * emac_mdio_read - MDIO interface read function.
>>> * @bus: Pointer to MII bus structure.
>>> * @phy_addr: Address of the PHY device.
>>> * @reg_num: PHY register to read.
>>> @@ -51,29 +51,29 @@ static int arc_mdio_complete_wait(struct
>>> arc_emac_priv
>>> *priv) * Reads the contents of the requested register from the
>>> requested
>>> PHY * address.
>>> */
>>> -static int arc_mdio_read(struct mii_bus *bus, int phy_addr, int
>>> reg_num)
>>> +static int emac_mdio_read(struct mii_bus *bus, int phy_addr, int
>>> reg_num)
>>> {
>>> - struct arc_emac_priv *priv = bus->priv;
>>> + struct emac_priv *priv = bus->priv;
>>> unsigned int value;
>>> int error;
>>>
>>> - arc_reg_set(priv, R_MDIO,
>>> + emac_reg_set(priv, R_MDIO,
>>> 0x60020000 | (phy_addr << 23) | (reg_num << 18));
>>>
>>> - error = arc_mdio_complete_wait(priv);
>>> + error = emac_mdio_complete_wait(priv);
>>> if (error < 0)
>>> return error;
>>>
>>> - value = arc_reg_get(priv, R_MDIO) & 0xffff;
>>> + value = emac_reg_get(priv, R_MDIO) & 0xffff;
>>>
>>> - dev_dbg(priv->dev, "arc_mdio_read(phy_addr=%i, reg_num=%x) =
>>> %x\n",
>>> + dev_dbg(priv->dev, "emac_mdio_read(phy_addr=%i, reg_num=%x) =
>>> %x\n",
>>> phy_addr, reg_num, value);
>>>
>>> return value;
>>> }
>>>
>>> /**
>>> - * arc_mdio_write - MDIO interface write function.
>>> + * emac_mdio_write - MDIO interface write function.
>>> * @bus: Pointer to MII bus structure.
>>> * @phy_addr: Address of the PHY device.
>>> * @reg_num: PHY register to write to.
>>> @@ -83,32 +83,32 @@ static int arc_mdio_read(struct mii_bus *bus, int
>>> phy_addr, int reg_num) *
>>> * Writes the value to the requested register.
>>> */
>>> -static int arc_mdio_write(struct mii_bus *bus, int phy_addr,
>>> +static int emac_mdio_write(struct mii_bus *bus, int phy_addr,
>>> int reg_num, u16 value)
>>> {
>>> - struct arc_emac_priv *priv = bus->priv;
>>> + struct emac_priv *priv = bus->priv;
>>>
>>> dev_dbg(priv->dev,
>>> - "arc_mdio_write(phy_addr=%i, reg_num=%x, value=%x)\n",
>>> + "emac_mdio_write(phy_addr=%i, reg_num=%x, value=%x)\n",
>>> phy_addr, reg_num, value);
>>>
>>> - arc_reg_set(priv, R_MDIO,
>>> + emac_reg_set(priv, R_MDIO,
>>> 0x50020000 | (phy_addr << 23) | (reg_num << 18) |
>>> value);
>>>
>>> - return arc_mdio_complete_wait(priv);
>>> + return emac_mdio_complete_wait(priv);
>>> }
>>>
>>> /**
>>> - * arc_mdio_probe - MDIO probe function.
>>> + * emac_mdio_probe - MDIO probe function.
>>> * @pdev: Pointer to platform device.
>>> - * @priv: Pointer to ARC EMAC private data structure.
>>> + * @priv: Pointer to EMAC private data structure.
>>> *
>>> * returns: 0 on success, -ENOMEM when mdiobus_alloc
>>> * (to allocate memory for MII bus structure) fails.
>>> *
>>> * Sets up and registers the MDIO interface.
>>> */
>>> -int arc_mdio_probe(struct platform_device *pdev, struct arc_emac_priv
>>> *priv) +int emac_mdio_probe(struct emac_priv *priv)
>>> {
>>> struct mii_bus *bus;
>>> int error;
>>> @@ -121,12 +121,12 @@ int arc_mdio_probe(struct platform_device *pdev,
>>> struct arc_emac_priv *priv) bus->priv = priv;
>>> bus->parent = priv->dev;
>>> bus->name = "Synopsys MII Bus",
>>> - bus->read = &arc_mdio_read;
>>> - bus->write = &arc_mdio_write;
>>> + bus->read = &emac_mdio_read;
>>> + bus->write = &emac_mdio_write;
>>>
>>> - snprintf(bus->id, MII_BUS_ID_SIZE, "%s", pdev->name);
>>> + snprintf(bus->id, MII_BUS_ID_SIZE, "%s", bus->name);
>>>
>>> - error = of_mdiobus_register(bus, pdev->dev.of_node);
>>> + error = of_mdiobus_register(bus, priv->dev->of_node);
>>> if (error) {
>>> dev_err(priv->dev, "cannot register MDIO bus %s\n",
>>> bus->name);
>>> mdiobus_free(bus);
>>> @@ -137,12 +137,12 @@ int arc_mdio_probe(struct platform_device *pdev,
>>> struct arc_emac_priv *priv) }
>>>
>>> /**
>>> - * arc_mdio_remove - MDIO remove function.
>>> - * @priv: Pointer to ARC EMAC private data structure.
>>> + * emac_mdio_remove - MDIO remove function.
>>> + * @priv: Pointer to EMAC private data structure.
>>> *
>>> * Unregisters the MDIO and frees any associate memory for MII bus.
>>> */
>>> -int arc_mdio_remove(struct arc_emac_priv *priv)
>>> +int emac_mdio_remove(struct emac_priv *priv)
>>> {
>>> mdiobus_unregister(priv->bus);
>>> mdiobus_free(priv->bus);
>
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Powered by blists - more mailing lists