|
@@ -28,12 +28,8 @@
|
|
|
https://bugzilla.stlinux.com/
|
|
|
*******************************************************************************/
|
|
|
|
|
|
-#include <linux/module.h>
|
|
|
-#include <linux/init.h>
|
|
|
#include <linux/kernel.h>
|
|
|
#include <linux/interrupt.h>
|
|
|
-#include <linux/etherdevice.h>
|
|
|
-#include <linux/platform_device.h>
|
|
|
#include <linux/ip.h>
|
|
|
#include <linux/tcp.h>
|
|
|
#include <linux/skbuff.h>
|
|
@@ -52,8 +48,6 @@
|
|
|
#endif
|
|
|
#include "stmmac.h"
|
|
|
|
|
|
-#define STMMAC_RESOURCE_NAME "stmmaceth"
|
|
|
-
|
|
|
#undef STMMAC_DEBUG
|
|
|
/*#define STMMAC_DEBUG*/
|
|
|
#ifdef STMMAC_DEBUG
|
|
@@ -93,7 +87,7 @@ static int debug = -1; /* -1: default, 0: no output, 16: all */
|
|
|
module_param(debug, int, S_IRUGO | S_IWUSR);
|
|
|
MODULE_PARM_DESC(debug, "Message Level (0: no output, 16: all)");
|
|
|
|
|
|
-static int phyaddr = -1;
|
|
|
+int phyaddr = -1;
|
|
|
module_param(phyaddr, int, S_IRUGO);
|
|
|
MODULE_PARM_DESC(phyaddr, "Physical device address");
|
|
|
|
|
@@ -141,6 +135,11 @@ static const u32 default_msg_level = (NETIF_MSG_DRV | NETIF_MSG_PROBE |
|
|
|
|
|
|
static irqreturn_t stmmac_interrupt(int irq, void *dev_id);
|
|
|
|
|
|
+#ifdef CONFIG_STMMAC_DEBUG_FS
|
|
|
+static int stmmac_init_fs(struct net_device *dev);
|
|
|
+static void stmmac_exit_fs(void);
|
|
|
+#endif
|
|
|
+
|
|
|
/**
|
|
|
* stmmac_verify_args - verify the driver parameters.
|
|
|
* Description: it verifies if some wrong parameter is passed to the driver.
|
|
@@ -345,22 +344,6 @@ static int stmmac_init_phy(struct net_device *dev)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static inline void stmmac_enable_mac(void __iomem *ioaddr)
|
|
|
-{
|
|
|
- u32 value = readl(ioaddr + MAC_CTRL_REG);
|
|
|
-
|
|
|
- value |= MAC_RNABLE_RX | MAC_ENABLE_TX;
|
|
|
- writel(value, ioaddr + MAC_CTRL_REG);
|
|
|
-}
|
|
|
-
|
|
|
-static inline void stmmac_disable_mac(void __iomem *ioaddr)
|
|
|
-{
|
|
|
- u32 value = readl(ioaddr + MAC_CTRL_REG);
|
|
|
-
|
|
|
- value &= ~(MAC_ENABLE_TX | MAC_RNABLE_RX);
|
|
|
- writel(value, ioaddr + MAC_CTRL_REG);
|
|
|
-}
|
|
|
-
|
|
|
/**
|
|
|
* display_ring
|
|
|
* @p: pointer to the ring.
|
|
@@ -886,6 +869,53 @@ static int stmmac_get_hw_features(struct stmmac_priv *priv)
|
|
|
return hw_cap;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * stmmac_mac_device_setup
|
|
|
+ * @dev : device pointer
|
|
|
+ * Description: this is to attach the GMAC or MAC 10/100
|
|
|
+ * main core structures that will be completed during the
|
|
|
+ * open step.
|
|
|
+ */
|
|
|
+static int stmmac_mac_device_setup(struct net_device *dev)
|
|
|
+{
|
|
|
+ struct stmmac_priv *priv = netdev_priv(dev);
|
|
|
+
|
|
|
+ struct mac_device_info *device;
|
|
|
+
|
|
|
+ if (priv->plat->has_gmac)
|
|
|
+ device = dwmac1000_setup(priv->ioaddr);
|
|
|
+ else
|
|
|
+ device = dwmac100_setup(priv->ioaddr);
|
|
|
+
|
|
|
+ if (!device)
|
|
|
+ return -ENOMEM;
|
|
|
+
|
|
|
+ priv->hw = device;
|
|
|
+ priv->hw->ring = &ring_mode_ops;
|
|
|
+
|
|
|
+ if (device_can_wakeup(priv->device)) {
|
|
|
+ priv->wolopts = WAKE_MAGIC; /* Magic Frame as default */
|
|
|
+ enable_irq_wake(priv->wol_irq);
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static void stmmac_check_ether_addr(struct stmmac_priv *priv)
|
|
|
+{
|
|
|
+ /* verify if the MAC address is valid, in case of failures it
|
|
|
+ * generates a random MAC address */
|
|
|
+ if (!is_valid_ether_addr(priv->dev->dev_addr)) {
|
|
|
+ priv->hw->mac->get_umac_addr((void __iomem *)
|
|
|
+ priv->dev->base_addr,
|
|
|
+ priv->dev->dev_addr, 0);
|
|
|
+ if (!is_valid_ether_addr(priv->dev->dev_addr))
|
|
|
+ random_ether_addr(priv->dev->dev_addr);
|
|
|
+ }
|
|
|
+ pr_warning("%s: device MAC address %pM\n", priv->dev->name,
|
|
|
+ priv->dev->dev_addr);
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* stmmac_open - open entry point of the driver
|
|
|
* @dev : pointer to the device structure.
|
|
@@ -900,18 +930,28 @@ static int stmmac_open(struct net_device *dev)
|
|
|
struct stmmac_priv *priv = netdev_priv(dev);
|
|
|
int ret;
|
|
|
|
|
|
- /* Check that the MAC address is valid. If its not, refuse
|
|
|
- * to bring the device up. The user must specify an
|
|
|
- * address using the following linux command:
|
|
|
- * ifconfig eth0 hw ether xx:xx:xx:xx:xx:xx */
|
|
|
- if (!is_valid_ether_addr(dev->dev_addr)) {
|
|
|
- random_ether_addr(dev->dev_addr);
|
|
|
- pr_warning("%s: generated random MAC address %pM\n", dev->name,
|
|
|
- dev->dev_addr);
|
|
|
- }
|
|
|
+ /* MAC HW device setup */
|
|
|
+ ret = stmmac_mac_device_setup(dev);
|
|
|
+ if (ret < 0)
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ stmmac_check_ether_addr(priv);
|
|
|
|
|
|
stmmac_verify_args();
|
|
|
|
|
|
+ /* Override with kernel parameters if supplied XXX CRS XXX
|
|
|
+ * this needs to have multiple instances */
|
|
|
+ if ((phyaddr >= 0) && (phyaddr <= 31))
|
|
|
+ priv->plat->phy_addr = phyaddr;
|
|
|
+
|
|
|
+ /* MDIO bus Registration */
|
|
|
+ ret = stmmac_mdio_register(dev);
|
|
|
+ if (ret < 0) {
|
|
|
+ pr_debug("%s: MDIO bus (id: %d) registration failed",
|
|
|
+ __func__, priv->plat->bus_id);
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+
|
|
|
#ifdef CONFIG_STMMAC_TIMER
|
|
|
priv->tm = kzalloc(sizeof(struct stmmac_timer *), GFP_KERNEL);
|
|
|
if (unlikely(priv->tm == NULL)) {
|
|
@@ -1008,7 +1048,7 @@ static int stmmac_open(struct net_device *dev)
|
|
|
}
|
|
|
|
|
|
/* Enable the MAC Rx/Tx */
|
|
|
- stmmac_enable_mac(priv->ioaddr);
|
|
|
+ stmmac_set_mac(priv->ioaddr, true);
|
|
|
|
|
|
/* Set the HW DMA mode and the COE */
|
|
|
stmmac_dma_operation_mode(priv);
|
|
@@ -1019,6 +1059,11 @@ static int stmmac_open(struct net_device *dev)
|
|
|
|
|
|
stmmac_mmc_setup(priv);
|
|
|
|
|
|
+#ifdef CONFIG_STMMAC_DEBUG_FS
|
|
|
+ ret = stmmac_init_fs(dev);
|
|
|
+ if (ret < 0)
|
|
|
+ pr_warning("\tFailed debugFS registration");
|
|
|
+#endif
|
|
|
/* Start the ball rolling... */
|
|
|
DBG(probe, DEBUG, "%s: DMA RX/TX processes started...\n", dev->name);
|
|
|
priv->hw->dma->start_tx(priv->ioaddr);
|
|
@@ -1091,10 +1136,15 @@ static int stmmac_release(struct net_device *dev)
|
|
|
free_dma_desc_resources(priv);
|
|
|
|
|
|
/* Disable the MAC Rx/Tx */
|
|
|
- stmmac_disable_mac(priv->ioaddr);
|
|
|
+ stmmac_set_mac(priv->ioaddr, false);
|
|
|
|
|
|
netif_carrier_off(dev);
|
|
|
|
|
|
+#ifdef CONFIG_STMMAC_DEBUG_FS
|
|
|
+ stmmac_exit_fs();
|
|
|
+#endif
|
|
|
+ stmmac_mdio_unregister(dev);
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -1739,28 +1789,41 @@ static const struct net_device_ops stmmac_netdev_ops = {
|
|
|
};
|
|
|
|
|
|
/**
|
|
|
- * stmmac_probe - Initialization of the adapter .
|
|
|
- * @dev : device pointer
|
|
|
- * Description: The function initializes the network device structure for
|
|
|
- * the STMMAC driver. It also calls the low level routines
|
|
|
- * in order to init the HW (i.e. the DMA engine)
|
|
|
+ * stmmac_dvr_probe
|
|
|
+ * @device: device pointer
|
|
|
+ * Description: this is the main probe function used to
|
|
|
+ * call the alloc_etherdev, allocate the priv structure.
|
|
|
*/
|
|
|
-static int stmmac_probe(struct net_device *dev)
|
|
|
+struct stmmac_priv *stmmac_dvr_probe(struct device *device,
|
|
|
+ struct plat_stmmacenet_data *plat_dat)
|
|
|
{
|
|
|
int ret = 0;
|
|
|
- struct stmmac_priv *priv = netdev_priv(dev);
|
|
|
+ struct net_device *ndev = NULL;
|
|
|
+ struct stmmac_priv *priv;
|
|
|
|
|
|
- ether_setup(dev);
|
|
|
+ ndev = alloc_etherdev(sizeof(struct stmmac_priv));
|
|
|
+ if (!ndev) {
|
|
|
+ pr_err("%s: ERROR: allocating the device\n", __func__);
|
|
|
+ return NULL;
|
|
|
+ }
|
|
|
+
|
|
|
+ SET_NETDEV_DEV(ndev, device);
|
|
|
+
|
|
|
+ priv = netdev_priv(ndev);
|
|
|
+ priv->device = device;
|
|
|
+ priv->dev = ndev;
|
|
|
|
|
|
- dev->netdev_ops = &stmmac_netdev_ops;
|
|
|
- stmmac_set_ethtool_ops(dev);
|
|
|
+ ether_setup(ndev);
|
|
|
|
|
|
- dev->hw_features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;
|
|
|
- dev->features |= dev->hw_features | NETIF_F_HIGHDMA;
|
|
|
- dev->watchdog_timeo = msecs_to_jiffies(watchdog);
|
|
|
+ ndev->netdev_ops = &stmmac_netdev_ops;
|
|
|
+ stmmac_set_ethtool_ops(ndev);
|
|
|
+
|
|
|
+ ndev->hw_features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;
|
|
|
+ ndev->features |= ndev->hw_features | NETIF_F_HIGHDMA;
|
|
|
+ ndev->watchdog_timeo = msecs_to_jiffies(watchdog);
|
|
|
#ifdef STMMAC_VLAN_TAG_USED
|
|
|
/* Both mac100 and gmac support receive VLAN tag detection */
|
|
|
- dev->features |= NETIF_F_HW_VLAN_RX;
|
|
|
+ ndev->features |= NETIF_F_HW_VLAN_RX;
|
|
|
#endif
|
|
|
priv->msg_enable = netif_msg_init(debug, default_msg_level);
|
|
|
|
|
@@ -1768,248 +1831,60 @@ static int stmmac_probe(struct net_device *dev)
|
|
|
priv->flow_ctrl = FLOW_AUTO; /* RX/TX pause on */
|
|
|
|
|
|
priv->pause = pause;
|
|
|
- netif_napi_add(dev, &priv->napi, stmmac_poll, 64);
|
|
|
-
|
|
|
- /* Get the MAC address */
|
|
|
- priv->hw->mac->get_umac_addr((void __iomem *) dev->base_addr,
|
|
|
- dev->dev_addr, 0);
|
|
|
-
|
|
|
- if (!is_valid_ether_addr(dev->dev_addr))
|
|
|
- pr_warning("\tno valid MAC address;"
|
|
|
- "please, use ifconfig or nwhwconfig!\n");
|
|
|
+ priv->plat = plat_dat;
|
|
|
+ netif_napi_add(ndev, &priv->napi, stmmac_poll, 64);
|
|
|
|
|
|
spin_lock_init(&priv->lock);
|
|
|
spin_lock_init(&priv->tx_lock);
|
|
|
|
|
|
- ret = register_netdev(dev);
|
|
|
+ ret = register_netdev(ndev);
|
|
|
if (ret) {
|
|
|
pr_err("%s: ERROR %i registering the device\n",
|
|
|
__func__, ret);
|
|
|
- return -ENODEV;
|
|
|
+ goto error;
|
|
|
}
|
|
|
|
|
|
DBG(probe, DEBUG, "%s: Scatter/Gather: %s - HW checksums: %s\n",
|
|
|
- dev->name, (dev->features & NETIF_F_SG) ? "on" : "off",
|
|
|
- (dev->features & NETIF_F_IP_CSUM) ? "on" : "off");
|
|
|
+ ndev->name, (ndev->features & NETIF_F_SG) ? "on" : "off",
|
|
|
+ (ndev->features & NETIF_F_IP_CSUM) ? "on" : "off");
|
|
|
|
|
|
- return ret;
|
|
|
-}
|
|
|
+ return priv;
|
|
|
|
|
|
-/**
|
|
|
- * stmmac_mac_device_setup
|
|
|
- * @dev : device pointer
|
|
|
- * Description: select and initialise the mac device (mac100 or Gmac).
|
|
|
- */
|
|
|
-static int stmmac_mac_device_setup(struct net_device *dev)
|
|
|
-{
|
|
|
- struct stmmac_priv *priv = netdev_priv(dev);
|
|
|
+error:
|
|
|
+ netif_napi_del(&priv->napi);
|
|
|
|
|
|
- struct mac_device_info *device;
|
|
|
-
|
|
|
- if (priv->plat->has_gmac) {
|
|
|
- dev->priv_flags |= IFF_UNICAST_FLT;
|
|
|
- device = dwmac1000_setup(priv->ioaddr);
|
|
|
- } else {
|
|
|
- device = dwmac100_setup(priv->ioaddr);
|
|
|
- }
|
|
|
-
|
|
|
- if (!device)
|
|
|
- return -ENOMEM;
|
|
|
-
|
|
|
- priv->hw = device;
|
|
|
- priv->hw->ring = &ring_mode_ops;
|
|
|
-
|
|
|
- if (device_can_wakeup(priv->device)) {
|
|
|
- priv->wolopts = WAKE_MAGIC; /* Magic Frame as default */
|
|
|
- enable_irq_wake(priv->wol_irq);
|
|
|
- }
|
|
|
-
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
-/**
|
|
|
- * stmmac_dvr_probe
|
|
|
- * @pdev: platform device pointer
|
|
|
- * Description: the driver is initialized through platform_device.
|
|
|
- */
|
|
|
-static int stmmac_dvr_probe(struct platform_device *pdev)
|
|
|
-{
|
|
|
- int ret = 0;
|
|
|
- struct resource *res;
|
|
|
- void __iomem *addr = NULL;
|
|
|
- struct net_device *ndev = NULL;
|
|
|
- struct stmmac_priv *priv = NULL;
|
|
|
- struct plat_stmmacenet_data *plat_dat;
|
|
|
-
|
|
|
- pr_info("STMMAC driver:\n\tplatform registration... ");
|
|
|
- res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
|
|
- if (!res)
|
|
|
- return -ENODEV;
|
|
|
- pr_info("\tdone!\n");
|
|
|
-
|
|
|
- if (!request_mem_region(res->start, resource_size(res),
|
|
|
- pdev->name)) {
|
|
|
- pr_err("%s: ERROR: memory allocation failed"
|
|
|
- "cannot get the I/O addr 0x%x\n",
|
|
|
- __func__, (unsigned int)res->start);
|
|
|
- return -EBUSY;
|
|
|
- }
|
|
|
-
|
|
|
- addr = ioremap(res->start, resource_size(res));
|
|
|
- if (!addr) {
|
|
|
- pr_err("%s: ERROR: memory mapping failed\n", __func__);
|
|
|
- ret = -ENOMEM;
|
|
|
- goto out_release_region;
|
|
|
- }
|
|
|
-
|
|
|
- ndev = alloc_etherdev(sizeof(struct stmmac_priv));
|
|
|
- if (!ndev) {
|
|
|
- pr_err("%s: ERROR: allocating the device\n", __func__);
|
|
|
- ret = -ENOMEM;
|
|
|
- goto out_unmap;
|
|
|
- }
|
|
|
-
|
|
|
- SET_NETDEV_DEV(ndev, &pdev->dev);
|
|
|
-
|
|
|
- /* Get the MAC information */
|
|
|
- ndev->irq = platform_get_irq_byname(pdev, "macirq");
|
|
|
- if (ndev->irq == -ENXIO) {
|
|
|
- pr_err("%s: ERROR: MAC IRQ configuration "
|
|
|
- "information not found\n", __func__);
|
|
|
- ret = -ENXIO;
|
|
|
- goto out_free_ndev;
|
|
|
- }
|
|
|
-
|
|
|
- priv = netdev_priv(ndev);
|
|
|
- priv->device = &(pdev->dev);
|
|
|
- priv->dev = ndev;
|
|
|
- plat_dat = pdev->dev.platform_data;
|
|
|
-
|
|
|
- priv->plat = plat_dat;
|
|
|
-
|
|
|
- priv->ioaddr = addr;
|
|
|
-
|
|
|
- /*
|
|
|
- * On some platforms e.g. SPEAr the wake up irq differs from the mac irq
|
|
|
- * The external wake up irq can be passed through the platform code
|
|
|
- * named as "eth_wake_irq"
|
|
|
- *
|
|
|
- * In case the wake up interrupt is not passed from the platform
|
|
|
- * so the driver will continue to use the mac irq (ndev->irq)
|
|
|
- */
|
|
|
- priv->wol_irq = platform_get_irq_byname(pdev, "eth_wake_irq");
|
|
|
- if (priv->wol_irq == -ENXIO)
|
|
|
- priv->wol_irq = ndev->irq;
|
|
|
-
|
|
|
- platform_set_drvdata(pdev, ndev);
|
|
|
-
|
|
|
- /* Set the I/O base addr */
|
|
|
- ndev->base_addr = (unsigned long)addr;
|
|
|
-
|
|
|
- /* Custom initialisation */
|
|
|
- if (priv->plat->init) {
|
|
|
- ret = priv->plat->init(pdev);
|
|
|
- if (unlikely(ret))
|
|
|
- goto out_free_ndev;
|
|
|
- }
|
|
|
-
|
|
|
- /* MAC HW device detection */
|
|
|
- ret = stmmac_mac_device_setup(ndev);
|
|
|
- if (ret < 0)
|
|
|
- goto out_plat_exit;
|
|
|
-
|
|
|
- /* Network Device Registration */
|
|
|
- ret = stmmac_probe(ndev);
|
|
|
- if (ret < 0)
|
|
|
- goto out_plat_exit;
|
|
|
-
|
|
|
- /* Override with kernel parameters if supplied XXX CRS XXX
|
|
|
- * this needs to have multiple instances */
|
|
|
- if ((phyaddr >= 0) && (phyaddr <= 31))
|
|
|
- priv->plat->phy_addr = phyaddr;
|
|
|
-
|
|
|
- pr_info("\t%s - (dev. name: %s - id: %d, IRQ #%d\n"
|
|
|
- "\tIO base addr: 0x%p)\n", ndev->name, pdev->name,
|
|
|
- pdev->id, ndev->irq, addr);
|
|
|
-
|
|
|
- /* MDIO bus Registration */
|
|
|
- pr_debug("\tMDIO bus (id: %d)...", priv->plat->bus_id);
|
|
|
- ret = stmmac_mdio_register(ndev);
|
|
|
- if (ret < 0)
|
|
|
- goto out_unregister;
|
|
|
- pr_debug("registered!\n");
|
|
|
-
|
|
|
-#ifdef CONFIG_STMMAC_DEBUG_FS
|
|
|
- ret = stmmac_init_fs(ndev);
|
|
|
- if (ret < 0)
|
|
|
- pr_warning("\tFailed debugFS registration");
|
|
|
-#endif
|
|
|
-
|
|
|
- return 0;
|
|
|
-
|
|
|
-out_unregister:
|
|
|
unregister_netdev(ndev);
|
|
|
-out_plat_exit:
|
|
|
- if (priv->plat->exit)
|
|
|
- priv->plat->exit(pdev);
|
|
|
-out_free_ndev:
|
|
|
free_netdev(ndev);
|
|
|
- platform_set_drvdata(pdev, NULL);
|
|
|
-out_unmap:
|
|
|
- iounmap(addr);
|
|
|
-out_release_region:
|
|
|
- release_mem_region(res->start, resource_size(res));
|
|
|
|
|
|
- return ret;
|
|
|
+ return NULL;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* stmmac_dvr_remove
|
|
|
- * @pdev: platform device pointer
|
|
|
+ * @ndev: net device pointer
|
|
|
* Description: this function resets the TX/RX processes, disables the MAC RX/TX
|
|
|
- * changes the link status, releases the DMA descriptor rings,
|
|
|
- * unregisters the MDIO bus and unmaps the allocated memory.
|
|
|
+ * changes the link status, releases the DMA descriptor rings.
|
|
|
*/
|
|
|
-static int stmmac_dvr_remove(struct platform_device *pdev)
|
|
|
+int stmmac_dvr_remove(struct net_device *ndev)
|
|
|
{
|
|
|
- struct net_device *ndev = platform_get_drvdata(pdev);
|
|
|
struct stmmac_priv *priv = netdev_priv(ndev);
|
|
|
- struct resource *res;
|
|
|
|
|
|
pr_info("%s:\n\tremoving driver", __func__);
|
|
|
|
|
|
priv->hw->dma->stop_rx(priv->ioaddr);
|
|
|
priv->hw->dma->stop_tx(priv->ioaddr);
|
|
|
|
|
|
- stmmac_disable_mac(priv->ioaddr);
|
|
|
-
|
|
|
+ stmmac_set_mac(priv->ioaddr, false);
|
|
|
netif_carrier_off(ndev);
|
|
|
-
|
|
|
- stmmac_mdio_unregister(ndev);
|
|
|
-
|
|
|
- if (priv->plat->exit)
|
|
|
- priv->plat->exit(pdev);
|
|
|
-
|
|
|
- platform_set_drvdata(pdev, NULL);
|
|
|
unregister_netdev(ndev);
|
|
|
-
|
|
|
- iounmap((void *)priv->ioaddr);
|
|
|
- res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
|
|
- release_mem_region(res->start, resource_size(res));
|
|
|
-
|
|
|
-#ifdef CONFIG_STMMAC_DEBUG_FS
|
|
|
- stmmac_exit_fs();
|
|
|
-#endif
|
|
|
-
|
|
|
free_netdev(ndev);
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_PM
|
|
|
-static int stmmac_suspend(struct device *dev)
|
|
|
+int stmmac_suspend(struct net_device *ndev)
|
|
|
{
|
|
|
- struct net_device *ndev = dev_get_drvdata(dev);
|
|
|
struct stmmac_priv *priv = netdev_priv(ndev);
|
|
|
int dis_ic = 0;
|
|
|
|
|
@@ -2043,15 +1918,14 @@ static int stmmac_suspend(struct device *dev)
|
|
|
if (device_may_wakeup(priv->device))
|
|
|
priv->hw->mac->pmt(priv->ioaddr, priv->wolopts);
|
|
|
else
|
|
|
- stmmac_disable_mac(priv->ioaddr);
|
|
|
+ stmmac_set_mac(priv->ioaddr, false);
|
|
|
|
|
|
spin_unlock(&priv->lock);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int stmmac_resume(struct device *dev)
|
|
|
+int stmmac_resume(struct net_device *ndev)
|
|
|
{
|
|
|
- struct net_device *ndev = dev_get_drvdata(dev);
|
|
|
struct stmmac_priv *priv = netdev_priv(ndev);
|
|
|
|
|
|
if (!netif_running(ndev))
|
|
@@ -2070,7 +1944,7 @@ static int stmmac_resume(struct device *dev)
|
|
|
netif_device_attach(ndev);
|
|
|
|
|
|
/* Enable the MAC and DMA */
|
|
|
- stmmac_enable_mac(priv->ioaddr);
|
|
|
+ stmmac_set_mac(priv->ioaddr, true);
|
|
|
priv->hw->dma->start_tx(priv->ioaddr);
|
|
|
priv->hw->dma->start_rx(priv->ioaddr);
|
|
|
|
|
@@ -2090,47 +1964,23 @@ static int stmmac_resume(struct device *dev)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int stmmac_freeze(struct device *dev)
|
|
|
+int stmmac_freeze(struct net_device *ndev)
|
|
|
{
|
|
|
- struct net_device *ndev = dev_get_drvdata(dev);
|
|
|
-
|
|
|
if (!ndev || !netif_running(ndev))
|
|
|
return 0;
|
|
|
|
|
|
return stmmac_release(ndev);
|
|
|
}
|
|
|
|
|
|
-static int stmmac_restore(struct device *dev)
|
|
|
+int stmmac_restore(struct net_device *ndev)
|
|
|
{
|
|
|
- struct net_device *ndev = dev_get_drvdata(dev);
|
|
|
-
|
|
|
if (!ndev || !netif_running(ndev))
|
|
|
return 0;
|
|
|
|
|
|
return stmmac_open(ndev);
|
|
|
}
|
|
|
-
|
|
|
-static const struct dev_pm_ops stmmac_pm_ops = {
|
|
|
- .suspend = stmmac_suspend,
|
|
|
- .resume = stmmac_resume,
|
|
|
- .freeze = stmmac_freeze,
|
|
|
- .thaw = stmmac_restore,
|
|
|
- .restore = stmmac_restore,
|
|
|
-};
|
|
|
-#else
|
|
|
-static const struct dev_pm_ops stmmac_pm_ops;
|
|
|
#endif /* CONFIG_PM */
|
|
|
|
|
|
-static struct platform_driver stmmac_driver = {
|
|
|
- .probe = stmmac_dvr_probe,
|
|
|
- .remove = stmmac_dvr_remove,
|
|
|
- .driver = {
|
|
|
- .name = STMMAC_RESOURCE_NAME,
|
|
|
- .owner = THIS_MODULE,
|
|
|
- .pm = &stmmac_pm_ops,
|
|
|
- },
|
|
|
-};
|
|
|
-
|
|
|
#ifndef MODULE
|
|
|
static int __init stmmac_cmdline_opt(char *str)
|
|
|
{
|
|
@@ -2189,9 +2039,3 @@ err:
|
|
|
|
|
|
__setup("stmmaceth=", stmmac_cmdline_opt);
|
|
|
#endif
|
|
|
-
|
|
|
-module_platform_driver(stmmac_driver);
|
|
|
-
|
|
|
-MODULE_DESCRIPTION("STMMAC 10/100/1000 Ethernet driver");
|
|
|
-MODULE_AUTHOR("Giuseppe Cavallaro <peppe.cavallaro@st.com>");
|
|
|
-MODULE_LICENSE("GPL");
|