These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / net / ethernet / xilinx / xilinx_axienet_main.c
index 28b7e7d..4684644 100644 (file)
@@ -117,7 +117,7 @@ static struct axienet_option axienet_options[] = {
  * @lp:                Pointer to axienet local structure
  * @reg:       Address offset from the base address of the Axi DMA core
  *
- * returns: The contents of the Axi DMA register
+ * Return: The contents of the Axi DMA register
  *
  * This function returns the contents of the corresponding Axi DMA register.
  */
@@ -179,8 +179,7 @@ static void axienet_dma_bd_release(struct net_device *ndev)
  * axienet_dma_bd_init - Setup buffer descriptor rings for Axi DMA
  * @ndev:      Pointer to the net_device structure
  *
- * returns: 0, on success
- *         -ENOMEM, on failure
+ * Return: 0, on success -ENOMEM, on failure
  *
  * This function is called to initialize the Rx and Tx DMA descriptor
  * rings. This initializes the descriptors with required default values
@@ -198,9 +197,7 @@ static int axienet_dma_bd_init(struct net_device *ndev)
        lp->tx_bd_tail = 0;
        lp->rx_bd_ci = 0;
 
-       /*
-        * Allocate the Tx and Rx buffer descriptors.
-        */
+       /* Allocate the Tx and Rx buffer descriptors. */
        lp->tx_bd_v = dma_zalloc_coherent(ndev->dev.parent,
                                          sizeof(*lp->tx_bd_v) * TX_BD_NUM,
                                          &lp->tx_bd_p, GFP_KERNEL);
@@ -263,7 +260,8 @@ static int axienet_dma_bd_init(struct net_device *ndev)
        axienet_dma_out32(lp, XAXIDMA_TX_CR_OFFSET, cr);
 
        /* Populate the tail pointer and bring the Rx Axi DMA engine out of
-        * halted state. This will make the Rx side ready for reception.*/
+        * halted state. This will make the Rx side ready for reception.
+        */
        axienet_dma_out32(lp, XAXIDMA_RX_CDESC_OFFSET, lp->rx_bd_p);
        cr = axienet_dma_in32(lp, XAXIDMA_RX_CR_OFFSET);
        axienet_dma_out32(lp, XAXIDMA_RX_CR_OFFSET,
@@ -273,7 +271,8 @@ static int axienet_dma_bd_init(struct net_device *ndev)
 
        /* Write to the RS (Run-stop) bit in the Tx channel control register.
         * Tx channel is now ready to run. But only after we write to the
-        * tail pointer register that the Tx channel will start transmitting */
+        * tail pointer register that the Tx channel will start transmitting.
+        */
        axienet_dma_out32(lp, XAXIDMA_TX_CDESC_OFFSET, lp->tx_bd_p);
        cr = axienet_dma_in32(lp, XAXIDMA_TX_CR_OFFSET);
        axienet_dma_out32(lp, XAXIDMA_TX_CR_OFFSET,
@@ -320,7 +319,7 @@ static void axienet_set_mac_address(struct net_device *ndev, void *address)
  * @ndev:      Pointer to the net_device structure
  * @p:         6 byte Address to be written as MAC address
  *
- * returns: 0 for all conditions. Presently, there is no failure case.
+ * Return: 0 for all conditions. Presently, there is no failure case.
  *
  * This function is called to initialize the MAC address of the Axi Ethernet
  * core. It calls the core specific axienet_set_mac_address. This is the
@@ -354,7 +353,8 @@ static void axienet_set_multicast_list(struct net_device *ndev)
            netdev_mc_count(ndev) > XAE_MULTICAST_CAM_TABLE_NUM) {
                /* We must make the kernel realize we had to move into
                 * promiscuous mode. If it was a promiscuous mode request
-                * the flag is already set. If not we set it. */
+                * the flag is already set. If not we set it.
+                */
                ndev->flags |= IFF_PROMISC;
                reg = axienet_ior(lp, XAE_FMI_OFFSET);
                reg |= XAE_FMI_PM_MASK;
@@ -438,14 +438,15 @@ static void __axienet_device_reset(struct axienet_local *lp,
        /* Reset Axi DMA. This would reset Axi Ethernet core as well. The reset
         * process of Axi DMA takes a while to complete as all pending
         * commands/transfers will be flushed or completed during this
-        * reset process. */
+        * reset process.
+        */
        axienet_dma_out32(lp, offset, XAXIDMA_CR_RESET_MASK);
        timeout = DELAY_OF_ONE_MILLISEC;
        while (axienet_dma_in32(lp, offset) & XAXIDMA_CR_RESET_MASK) {
                udelay(1);
                if (--timeout == 0) {
-                       dev_err(dev, "axienet_device_reset DMA "
-                               "reset timeout!\n");
+                       netdev_err(lp->ndev, "%s: DMA reset timeout!\n",
+                                  __func__);
                        break;
                }
        }
@@ -471,19 +472,21 @@ static void axienet_device_reset(struct net_device *ndev)
        __axienet_device_reset(lp, &ndev->dev, XAXIDMA_RX_CR_OFFSET);
 
        lp->max_frm_size = XAE_MAX_VLAN_FRAME_SIZE;
+       lp->options |= XAE_OPTION_VLAN;
        lp->options &= (~XAE_OPTION_JUMBO);
 
        if ((ndev->mtu > XAE_MTU) &&
-           (ndev->mtu <= XAE_JUMBO_MTU) &&
-           (lp->jumbo_support)) {
-               lp->max_frm_size = ndev->mtu + XAE_HDR_VLAN_SIZE +
-                                  XAE_TRL_SIZE;
-               lp->options |= XAE_OPTION_JUMBO;
+               (ndev->mtu <= XAE_JUMBO_MTU)) {
+               lp->max_frm_size = ndev->mtu + VLAN_ETH_HLEN +
+                                       XAE_TRL_SIZE;
+
+               if (lp->max_frm_size <= lp->rxmem)
+                       lp->options |= XAE_OPTION_JUMBO;
        }
 
        if (axienet_dma_bd_init(ndev)) {
-               dev_err(&ndev->dev, "axienet_device_reset descriptor "
-                       "allocation failed\n");
+               netdev_err(ndev, "%s: descriptor allocation failed\n",
+                          __func__);
        }
 
        axienet_status = axienet_ior(lp, XAE_RCW1_OFFSET);
@@ -497,7 +500,8 @@ static void axienet_device_reset(struct net_device *ndev)
        axienet_iow(lp, XAE_FCC_OFFSET, XAE_FCC_FCRX_MASK);
 
        /* Sync default options with HW but leave receiver and
-        * transmitter disabled.*/
+        * transmitter disabled.
+        */
        axienet_setoptions(ndev, lp->options &
                           ~(XAE_OPTION_TXEN | XAE_OPTION_RXEN));
        axienet_set_mac_address(ndev, NULL);
@@ -558,8 +562,8 @@ static void axienet_adjust_link(struct net_device *ndev)
                        lp->last_link = link_state;
                        phy_print_status(phy);
                } else {
-                       dev_err(&ndev->dev, "Error setting Axi Ethernet "
-                               "mac speed\n");
+                       netdev_err(ndev,
+                                  "Error setting Axi Ethernet mac speed\n");
                }
        }
 }
@@ -617,7 +621,7 @@ static void axienet_start_xmit_done(struct net_device *ndev)
  * @lp:                Pointer to the axienet_local structure
  * @num_frag:  The number of BDs to check for
  *
- * returns: 0, on success
+ * Return: 0, on success
  *         NETDEV_TX_BUSY, if any of the descriptors are not free
  *
  * This function is invoked before BDs are allocated and transmission starts.
@@ -640,7 +644,7 @@ static inline int axienet_check_tx_bd_space(struct axienet_local *lp,
  * @skb:       sk_buff pointer that contains data to be Txed.
  * @ndev:      Pointer to net_device structure.
  *
- * returns: NETDEV_TX_OK, on success
+ * Return: NETDEV_TX_OK, on success
  *         NETDEV_TX_BUSY, if any of the descriptors are not free
  *
  * This function is invoked from upper layers to initiate transmission. The
@@ -726,15 +730,15 @@ static void axienet_recv(struct net_device *ndev)
        u32 csumstatus;
        u32 size = 0;
        u32 packets = 0;
-       dma_addr_t tail_p;
+       dma_addr_t tail_p = 0;
        struct axienet_local *lp = netdev_priv(ndev);
        struct sk_buff *skb, *new_skb;
        struct axidma_bd *cur_p;
 
-       tail_p = lp->rx_bd_p + sizeof(*lp->rx_bd_v) * lp->rx_bd_ci;
        cur_p = &lp->rx_bd_v[lp->rx_bd_ci];
 
        while ((cur_p->status & XAXIDMA_BD_STS_COMPLETE_MASK)) {
+               tail_p = lp->rx_bd_p + sizeof(*lp->rx_bd_v) * lp->rx_bd_ci;
                skb = (struct sk_buff *) (cur_p->sw_id_offset);
                length = cur_p->app4 & 0x0000FFFF;
 
@@ -786,7 +790,8 @@ static void axienet_recv(struct net_device *ndev)
        ndev->stats.rx_packets += packets;
        ndev->stats.rx_bytes += size;
 
-       axienet_dma_out32(lp, XAXIDMA_RX_TDESC_OFFSET, tail_p);
+       if (tail_p)
+               axienet_dma_out32(lp, XAXIDMA_RX_TDESC_OFFSET, tail_p);
 }
 
 /**
@@ -794,7 +799,7 @@ static void axienet_recv(struct net_device *ndev)
  * @irq:       irq number
  * @_ndev:     net_device pointer
  *
- * returns: IRQ_HANDLED for all cases.
+ * Return: IRQ_HANDLED for all cases.
  *
  * This is the Axi DMA Tx done Isr. It invokes "axienet_start_xmit_done"
  * to complete the BD processing.
@@ -808,6 +813,7 @@ static irqreturn_t axienet_tx_irq(int irq, void *_ndev)
 
        status = axienet_dma_in32(lp, XAXIDMA_TX_SR_OFFSET);
        if (status & (XAXIDMA_IRQ_IOC_MASK | XAXIDMA_IRQ_DELAY_MASK)) {
+               axienet_dma_out32(lp, XAXIDMA_TX_SR_OFFSET, status);
                axienet_start_xmit_done(lp->ndev);
                goto out;
        }
@@ -831,9 +837,9 @@ static irqreturn_t axienet_tx_irq(int irq, void *_ndev)
                axienet_dma_out32(lp, XAXIDMA_RX_CR_OFFSET, cr);
 
                tasklet_schedule(&lp->dma_err_tasklet);
+               axienet_dma_out32(lp, XAXIDMA_TX_SR_OFFSET, status);
        }
 out:
-       axienet_dma_out32(lp, XAXIDMA_TX_SR_OFFSET, status);
        return IRQ_HANDLED;
 }
 
@@ -842,7 +848,7 @@ out:
  * @irq:       irq number
  * @_ndev:     net_device pointer
  *
- * returns: IRQ_HANDLED for all cases.
+ * Return: IRQ_HANDLED for all cases.
  *
  * This is the Axi DMA Rx Isr. It invokes "axienet_recv" to complete the BD
  * processing.
@@ -856,6 +862,7 @@ static irqreturn_t axienet_rx_irq(int irq, void *_ndev)
 
        status = axienet_dma_in32(lp, XAXIDMA_RX_SR_OFFSET);
        if (status & (XAXIDMA_IRQ_IOC_MASK | XAXIDMA_IRQ_DELAY_MASK)) {
+               axienet_dma_out32(lp, XAXIDMA_RX_SR_OFFSET, status);
                axienet_recv(lp->ndev);
                goto out;
        }
@@ -879,9 +886,9 @@ static irqreturn_t axienet_rx_irq(int irq, void *_ndev)
                axienet_dma_out32(lp, XAXIDMA_RX_CR_OFFSET, cr);
 
                tasklet_schedule(&lp->dma_err_tasklet);
+               axienet_dma_out32(lp, XAXIDMA_RX_SR_OFFSET, status);
        }
 out:
-       axienet_dma_out32(lp, XAXIDMA_RX_SR_OFFSET, status);
        return IRQ_HANDLED;
 }
 
@@ -891,7 +898,7 @@ static void axienet_dma_err_handler(unsigned long data);
  * axienet_open - Driver open routine.
  * @ndev:      Pointer to net_device structure
  *
- * returns: 0, on success.
+ * Return: 0, on success.
  *         -ENODEV, if PHY cannot be connected to
  *         non-zero error value on failure
  *
@@ -914,7 +921,8 @@ static int axienet_open(struct net_device *ndev)
        /* Disable the MDIO interface till Axi Ethernet Reset is completed.
         * When we do an Axi Ethernet reset, it resets the complete core
         * including the MDIO. If MDIO is not disabled when the reset
-        * process is started, MDIO will be broken afterwards. */
+        * process is started, MDIO will be broken afterwards.
+        */
        axienet_iow(lp, XAE_MDIO_MC_OFFSET,
                    (mdio_mcreg & (~XAE_MDIO_MC_MDIOEN_MASK)));
        axienet_device_reset(ndev);
@@ -925,14 +933,20 @@ static int axienet_open(struct net_device *ndev)
                return ret;
 
        if (lp->phy_node) {
-               lp->phy_dev = of_phy_connect(lp->ndev, lp->phy_node,
+               if (lp->phy_type == XAE_PHY_TYPE_GMII) {
+                       lp->phy_dev = of_phy_connect(lp->ndev, lp->phy_node,
                                             axienet_adjust_link, 0,
                                             PHY_INTERFACE_MODE_GMII);
-               if (!lp->phy_dev) {
-                       dev_err(lp->dev, "of_phy_connect() failed\n");
-                       return -ENODEV;
+               } else if (lp->phy_type == XAE_PHY_TYPE_RGMII_2_0) {
+                       lp->phy_dev = of_phy_connect(lp->ndev, lp->phy_node,
+                                            axienet_adjust_link, 0,
+                                            PHY_INTERFACE_MODE_RGMII_ID);
                }
-               phy_start(lp->phy_dev);
+
+               if (!lp->phy_dev)
+                       dev_err(lp->dev, "of_phy_connect() failed\n");
+               else
+                       phy_start(lp->phy_dev);
        }
 
        /* Enable tasklets for Axi DMA error handling */
@@ -965,7 +979,7 @@ err_tx_irq:
  * axienet_stop - Driver stop routine.
  * @ndev:      Pointer to net_device structure
  *
- * returns: 0, on success.
+ * Return: 0, on success.
  *
  * This is the driver stop routine. It calls phy_disconnect to stop the PHY
  * device. It also removes the interrupt handlers and disables the interrupts.
@@ -1005,7 +1019,7 @@ static int axienet_stop(struct net_device *ndev)
  * @ndev:      Pointer to net_device structure
  * @new_mtu:   New mtu value to be applied
  *
- * returns: Always returns 0 (success).
+ * Return: Always returns 0 (success).
  *
  * This is the change mtu driver routine. It checks if the Axi Ethernet
  * hardware supports jumbo frames before changing the mtu. This can be
@@ -1017,15 +1031,15 @@ static int axienet_change_mtu(struct net_device *ndev, int new_mtu)
 
        if (netif_running(ndev))
                return -EBUSY;
-       if (lp->jumbo_support) {
-               if ((new_mtu > XAE_JUMBO_MTU) || (new_mtu < 64))
-                       return -EINVAL;
-               ndev->mtu = new_mtu;
-       } else {
-               if ((new_mtu > XAE_MTU) || (new_mtu < 64))
-                       return -EINVAL;
-               ndev->mtu = new_mtu;
-       }
+
+       if ((new_mtu + VLAN_ETH_HLEN +
+               XAE_TRL_SIZE) > lp->rxmem)
+               return -EINVAL;
+
+       if ((new_mtu > XAE_JUMBO_MTU) || (new_mtu < 64))
+               return -EINVAL;
+
+       ndev->mtu = new_mtu;
 
        return 0;
 }
@@ -1072,6 +1086,8 @@ static const struct net_device_ops axienet_netdev_ops = {
  * not be found, the function returns -ENODEV. This function calls the
  * relevant PHY ethtool API to get the PHY settings.
  * Issue "ethtool ethX" under linux prompt to execute this function.
+ *
+ * Return: 0 on success, -ENODEV if PHY doesn't exist
  */
 static int axienet_ethtools_get_settings(struct net_device *ndev,
                                         struct ethtool_cmd *ecmd)
@@ -1093,6 +1109,8 @@ static int axienet_ethtools_get_settings(struct net_device *ndev,
  * relevant PHY ethtool API to set the PHY.
  * Issue e.g. "ethtool -s ethX speed 1000" under linux prompt to execute this
  * function.
+ *
+ * Return: 0 on success, -ENODEV if PHY doesn't exist
  */
 static int axienet_ethtools_set_settings(struct net_device *ndev,
                                         struct ethtool_cmd *ecmd)
@@ -1117,7 +1135,6 @@ static void axienet_ethtools_get_drvinfo(struct net_device *ndev,
 {
        strlcpy(ed->driver, DRIVER_NAME, sizeof(ed->driver));
        strlcpy(ed->version, DRIVER_VERSION, sizeof(ed->version));
-       ed->regdump_len = sizeof(u32) * AXIENET_REGS_N;
 }
 
 /**
@@ -1127,6 +1144,8 @@ static void axienet_ethtools_get_drvinfo(struct net_device *ndev,
  *
  * This implements ethtool command for getting the total register length
  * information.
+ *
+ * Return: the total regs length
  */
 static int axienet_ethtools_get_regs_len(struct net_device *ndev)
 {
@@ -1213,11 +1232,13 @@ axienet_ethtools_get_pauseparam(struct net_device *ndev,
  * axienet_ethtools_set_pauseparam - Set device pause parameter(flow control)
  *                                  settings.
  * @ndev:      Pointer to net_device structure
- * @epauseparam:Pointer to ethtool_pauseparam structure
+ * @epauseparm:Pointer to ethtool_pauseparam structure
  *
  * This implements ethtool command for enabling flow control on Rx and Tx
  * paths. Issue "ethtool -A ethX tx on|off" under linux prompt to execute this
  * function.
+ *
+ * Return: 0 on success, -EFAULT if device is running
  */
 static int
 axienet_ethtools_set_pauseparam(struct net_device *ndev,
@@ -1227,8 +1248,8 @@ axienet_ethtools_set_pauseparam(struct net_device *ndev,
        struct axienet_local *lp = netdev_priv(ndev);
 
        if (netif_running(ndev)) {
-               printk(KERN_ERR "%s: Please stop netif before applying "
-                      "configruation\n", ndev->name);
+               netdev_err(ndev,
+                          "Please stop netif before applying configuration\n");
                return -EFAULT;
        }
 
@@ -1254,6 +1275,8 @@ axienet_ethtools_set_pauseparam(struct net_device *ndev,
  * This implements ethtool command for getting the DMA interrupt coalescing
  * count on Tx and Rx paths. Issue "ethtool -c ethX" under linux prompt to
  * execute this function.
+ *
+ * Return: 0 always
  */
 static int axienet_ethtools_get_coalesce(struct net_device *ndev,
                                         struct ethtool_coalesce *ecoalesce)
@@ -1277,6 +1300,8 @@ static int axienet_ethtools_get_coalesce(struct net_device *ndev,
  * This implements ethtool command for setting the DMA interrupt coalescing
  * count on Tx and Rx paths. Issue "ethtool -C ethX rx-frames 5" under linux
  * prompt to execute this function.
+ *
+ * Return: 0, on success, Non-zero error value on failure.
  */
 static int axienet_ethtools_set_coalesce(struct net_device *ndev,
                                         struct ethtool_coalesce *ecoalesce)
@@ -1284,8 +1309,8 @@ static int axienet_ethtools_set_coalesce(struct net_device *ndev,
        struct axienet_local *lp = netdev_priv(ndev);
 
        if (netif_running(ndev)) {
-               printk(KERN_ERR "%s: Please stop netif before applying "
-                      "configruation\n", ndev->name);
+               netdev_err(ndev,
+                          "Please stop netif before applying configuration\n");
                return -EFAULT;
        }
 
@@ -1354,7 +1379,8 @@ static void axienet_dma_err_handler(unsigned long data)
        /* Disable the MDIO interface till Axi Ethernet Reset is completed.
         * When we do an Axi Ethernet reset, it resets the complete core
         * including the MDIO. So if MDIO is not disabled when the reset
-        * process is started, MDIO will be broken afterwards. */
+        * process is started, MDIO will be broken afterwards.
+        */
        axienet_iow(lp, XAE_MDIO_MC_OFFSET, (mdio_mcreg &
                    ~XAE_MDIO_MC_MDIOEN_MASK));
 
@@ -1425,7 +1451,8 @@ static void axienet_dma_err_handler(unsigned long data)
        axienet_dma_out32(lp, XAXIDMA_TX_CR_OFFSET, cr);
 
        /* Populate the tail pointer and bring the Rx Axi DMA engine out of
-        * halted state. This will make the Rx side ready for reception.*/
+        * halted state. This will make the Rx side ready for reception.
+        */
        axienet_dma_out32(lp, XAXIDMA_RX_CDESC_OFFSET, lp->rx_bd_p);
        cr = axienet_dma_in32(lp, XAXIDMA_RX_CR_OFFSET);
        axienet_dma_out32(lp, XAXIDMA_RX_CR_OFFSET,
@@ -1435,7 +1462,8 @@ static void axienet_dma_err_handler(unsigned long data)
 
        /* Write to the RS (Run-stop) bit in the Tx channel control register.
         * Tx channel is now ready to run. But only after we write to the
-        * tail pointer register that the Tx channel will start transmitting */
+        * tail pointer register that the Tx channel will start transmitting
+        */
        axienet_dma_out32(lp, XAXIDMA_TX_CDESC_OFFSET, lp->tx_bd_p);
        cr = axienet_dma_in32(lp, XAXIDMA_TX_CR_OFFSET);
        axienet_dma_out32(lp, XAXIDMA_TX_CR_OFFSET,
@@ -1451,7 +1479,8 @@ static void axienet_dma_err_handler(unsigned long data)
        axienet_iow(lp, XAE_FCC_OFFSET, XAE_FCC_FCRX_MASK);
 
        /* Sync default options with HW but leave receiver and
-        * transmitter disabled.*/
+        * transmitter disabled.
+        */
        axienet_setoptions(ndev, lp->options &
                           ~(XAE_OPTION_TXEN | XAE_OPTION_RXEN));
        axienet_set_mac_address(ndev, NULL);
@@ -1460,11 +1489,10 @@ static void axienet_dma_err_handler(unsigned long data)
 }
 
 /**
- * axienet_of_probe - Axi Ethernet probe function.
- * @op:                Pointer to platform device structure.
- * @match:     Pointer to device id structure
+ * axienet_probe - Axi Ethernet probe function.
+ * @pdev:      Pointer to platform device structure.
  *
- * returns: 0, on success
+ * Return: 0, on success
  *         Non-zero error value on failure.
  *
  * This is the probe routine for Axi Ethernet driver. This is called before
@@ -1472,22 +1500,23 @@ static void axienet_dma_err_handler(unsigned long data)
  * device. Parses through device tree and populates fields of
  * axienet_local. It registers the Ethernet device.
  */
-static int axienet_of_probe(struct platform_device *op)
+static int axienet_probe(struct platform_device *pdev)
 {
-       __be32 *p;
-       int size, ret = 0;
+       int ret;
        struct device_node *np;
        struct axienet_local *lp;
        struct net_device *ndev;
-       const void *addr;
+       u8 mac_addr[6];
+       struct resource *ethres, dmares;
+       u32 value;
 
        ndev = alloc_etherdev(sizeof(*lp));
        if (!ndev)
                return -ENOMEM;
 
-       platform_set_drvdata(op, ndev);
+       platform_set_drvdata(pdev, ndev);
 
-       SET_NETDEV_DEV(ndev, &op->dev);
+       SET_NETDEV_DEV(ndev, &pdev->dev);
        ndev->flags &= ~IFF_MULTICAST;  /* clear multicast */
        ndev->features = NETIF_F_SG;
        ndev->netdev_ops = &axienet_netdev_ops;
@@ -1495,21 +1524,23 @@ static int axienet_of_probe(struct platform_device *op)
 
        lp = netdev_priv(ndev);
        lp->ndev = ndev;
-       lp->dev = &op->dev;
+       lp->dev = &pdev->dev;
        lp->options = XAE_OPTION_DEFAULTS;
        /* Map device registers */
-       lp->regs = of_iomap(op->dev.of_node, 0);
-       if (!lp->regs) {
-               dev_err(&op->dev, "could not map Axi Ethernet regs.\n");
-               ret = -ENOMEM;
-               goto nodev;
+       ethres = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       lp->regs = devm_ioremap_resource(&pdev->dev, ethres);
+       if (IS_ERR(lp->regs)) {
+               dev_err(&pdev->dev, "could not map Axi Ethernet regs.\n");
+               ret = PTR_ERR(lp->regs);
+               goto free_netdev;
        }
+
        /* Setup checksum offload, but default to off if not specified */
        lp->features = 0;
 
-       p = (__be32 *) of_get_property(op->dev.of_node, "xlnx,txcsum", NULL);
-       if (p) {
-               switch (be32_to_cpup(p)) {
+       ret = of_property_read_u32(pdev->dev.of_node, "xlnx,txcsum", &value);
+       if (!ret) {
+               switch (value) {
                case 1:
                        lp->csum_offload_on_tx_path =
                                XAE_FEATURE_PARTIAL_TX_CSUM;
@@ -1528,9 +1559,9 @@ static int axienet_of_probe(struct platform_device *op)
                        lp->csum_offload_on_tx_path = XAE_NO_CSUM_OFFLOAD;
                }
        }
-       p = (__be32 *) of_get_property(op->dev.of_node, "xlnx,rxcsum", NULL);
-       if (p) {
-               switch (be32_to_cpup(p)) {
+       ret = of_property_read_u32(pdev->dev.of_node, "xlnx,rxcsum", &value);
+       if (!ret) {
+               switch (value) {
                case 1:
                        lp->csum_offload_on_rx_path =
                                XAE_FEATURE_PARTIAL_RX_CSUM;
@@ -1546,82 +1577,77 @@ static int axienet_of_probe(struct platform_device *op)
                }
        }
        /* For supporting jumbo frames, the Axi Ethernet hardware must have
-        * a larger Rx/Tx Memory. Typically, the size must be more than or
-        * equal to 16384 bytes, so that we can enable jumbo option and start
-        * supporting jumbo frames. Here we check for memory allocated for
-        * Rx/Tx in the hardware from the device-tree and accordingly set
-        * flags. */
-       p = (__be32 *) of_get_property(op->dev.of_node, "xlnx,rxmem", NULL);
-       if (p) {
-               if ((be32_to_cpup(p)) >= 0x4000)
-                       lp->jumbo_support = 1;
-       }
-       p = (__be32 *) of_get_property(op->dev.of_node, "xlnx,phy-type", NULL);
-       if (p)
-               lp->phy_type = be32_to_cpup(p);
+        * a larger Rx/Tx Memory. Typically, the size must be large so that
+        * we can enable jumbo option and start supporting jumbo frames.
+        * Here we check for memory allocated for Rx/Tx in the hardware from
+        * the device-tree and accordingly set flags.
+        */
+       of_property_read_u32(pdev->dev.of_node, "xlnx,rxmem", &lp->rxmem);
+       of_property_read_u32(pdev->dev.of_node, "xlnx,phy-type", &lp->phy_type);
 
        /* Find the DMA node, map the DMA registers, and decode the DMA IRQs */
-       np = of_parse_phandle(op->dev.of_node, "axistream-connected", 0);
-       if (!np) {
-               dev_err(&op->dev, "could not find DMA node\n");
-               ret = -ENODEV;
-               goto err_iounmap;
+       np = of_parse_phandle(pdev->dev.of_node, "axistream-connected", 0);
+       if (IS_ERR(np)) {
+               dev_err(&pdev->dev, "could not find DMA node\n");
+               ret = PTR_ERR(np);
+               goto free_netdev;
        }
-       lp->dma_regs = of_iomap(np, 0);
-       if (lp->dma_regs) {
-               dev_dbg(&op->dev, "MEM base: %p\n", lp->dma_regs);
-       } else {
-               dev_err(&op->dev, "unable to map DMA registers\n");
-               of_node_put(np);
+       ret = of_address_to_resource(np, 0, &dmares);
+       if (ret) {
+               dev_err(&pdev->dev, "unable to get DMA resource\n");
+               goto free_netdev;
+       }
+       lp->dma_regs = devm_ioremap_resource(&pdev->dev, &dmares);
+       if (IS_ERR(lp->dma_regs)) {
+               dev_err(&pdev->dev, "could not map DMA regs\n");
+               ret = PTR_ERR(lp->dma_regs);
+               goto free_netdev;
        }
        lp->rx_irq = irq_of_parse_and_map(np, 1);
        lp->tx_irq = irq_of_parse_and_map(np, 0);
        of_node_put(np);
        if ((lp->rx_irq <= 0) || (lp->tx_irq <= 0)) {
-               dev_err(&op->dev, "could not determine irqs\n");
+               dev_err(&pdev->dev, "could not determine irqs\n");
                ret = -ENOMEM;
-               goto err_iounmap_2;
+               goto free_netdev;
        }
 
        /* Retrieve the MAC address */
-       addr = of_get_property(op->dev.of_node, "local-mac-address", &size);
-       if ((!addr) || (size != 6)) {
-               dev_err(&op->dev, "could not find MAC address\n");
-               ret = -ENODEV;
-               goto err_iounmap_2;
+       ret = of_property_read_u8_array(pdev->dev.of_node,
+                                       "local-mac-address", mac_addr, 6);
+       if (ret) {
+               dev_err(&pdev->dev, "could not find MAC address\n");
+               goto free_netdev;
        }
-       axienet_set_mac_address(ndev, (void *) addr);
+       axienet_set_mac_address(ndev, (void *)mac_addr);
 
        lp->coalesce_count_rx = XAXIDMA_DFT_RX_THRESHOLD;
        lp->coalesce_count_tx = XAXIDMA_DFT_TX_THRESHOLD;
 
-       lp->phy_node = of_parse_phandle(op->dev.of_node, "phy-handle", 0);
-       ret = axienet_mdio_setup(lp, op->dev.of_node);
-       if (ret)
-               dev_warn(&op->dev, "error registering MDIO bus\n");
+       lp->phy_node = of_parse_phandle(pdev->dev.of_node, "phy-handle", 0);
+       if (lp->phy_node) {
+               ret = axienet_mdio_setup(lp, pdev->dev.of_node);
+               if (ret)
+                       dev_warn(&pdev->dev, "error registering MDIO bus\n");
+       }
 
        ret = register_netdev(lp->ndev);
        if (ret) {
                dev_err(lp->dev, "register_netdev() error (%i)\n", ret);
-               goto err_iounmap_2;
+               goto free_netdev;
        }
 
        return 0;
 
-err_iounmap_2:
-       if (lp->dma_regs)
-               iounmap(lp->dma_regs);
-err_iounmap:
-       iounmap(lp->regs);
-nodev:
+free_netdev:
        free_netdev(ndev);
-       ndev = NULL;
+
        return ret;
 }
 
-static int axienet_of_remove(struct platform_device *op)
+static int axienet_remove(struct platform_device *pdev)
 {
-       struct net_device *ndev = platform_get_drvdata(op);
+       struct net_device *ndev = platform_get_drvdata(pdev);
        struct axienet_local *lp = netdev_priv(ndev);
 
        axienet_mdio_teardown(lp);
@@ -1630,24 +1656,21 @@ static int axienet_of_remove(struct platform_device *op)
        of_node_put(lp->phy_node);
        lp->phy_node = NULL;
 
-       iounmap(lp->regs);
-       if (lp->dma_regs)
-               iounmap(lp->dma_regs);
        free_netdev(ndev);
 
        return 0;
 }
 
-static struct platform_driver axienet_of_driver = {
-       .probe = axienet_of_probe,
-       .remove = axienet_of_remove,
+static struct platform_driver axienet_driver = {
+       .probe = axienet_probe,
+       .remove = axienet_remove,
        .driver = {
                 .name = "xilinx_axienet",
                 .of_match_table = axienet_of_match,
        },
 };
 
-module_platform_driver(axienet_of_driver);
+module_platform_driver(axienet_driver);
 
 MODULE_DESCRIPTION("Xilinx Axi Ethernet driver");
 MODULE_AUTHOR("Xilinx");