diff options
Diffstat (limited to 'drivers/net/ethernet/xilinx/xilinx_axienet_main.c')
| -rw-r--r-- | drivers/net/ethernet/xilinx/xilinx_axienet_main.c | 288 | 
1 files changed, 156 insertions, 132 deletions
diff --git a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c index 28b7e7d9c272..4208dd7ef101 100644 --- a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c +++ b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c @@ -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) @@ -1127,6 +1145,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 +1233,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 +1249,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 +1276,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 +1301,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 +1310,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 +1380,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 +1452,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 +1463,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 +1480,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 +1490,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 +1501,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 +1525,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); +	ethres = platform_get_resource(pdev, IORESOURCE_MEM, 0); +	lp->regs = devm_ioremap_resource(&pdev->dev, ethres);  	if (!lp->regs) { -		dev_err(&op->dev, "could not map Axi Ethernet regs.\n"); +		dev_err(&pdev->dev, "could not map Axi Ethernet regs.\n");  		ret = -ENOMEM; -		goto nodev; +		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 +1560,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 +1578,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 (!lp->dma_regs) { +		dev_err(&pdev->dev, "could not map DMA regs\n"); +		ret = -ENOMEM; +		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 +1657,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");  |