diff options
Diffstat (limited to 'drivers/net/ethernet/renesas/ravb_main.c')
| -rw-r--r-- | drivers/net/ethernet/renesas/ravb_main.c | 62 | 
1 files changed, 32 insertions, 30 deletions
| diff --git a/drivers/net/ethernet/renesas/ravb_main.c b/drivers/net/ethernet/renesas/ravb_main.c index eb0c03bdb12d..4afff320dfd0 100644 --- a/drivers/net/ethernet/renesas/ravb_main.c +++ b/drivers/net/ethernet/renesas/ravb_main.c @@ -109,11 +109,13 @@ static void ravb_set_buffer_align(struct sk_buff *skb)   * Ethernet AVB device doesn't have ROM for MAC address.   * This function gets the MAC address that was used by a bootloader.   */ -static void ravb_read_mac_address(struct net_device *ndev, const u8 *mac) +static void ravb_read_mac_address(struct device_node *np, +				  struct net_device *ndev)  { -	if (!IS_ERR(mac)) { -		ether_addr_copy(ndev->dev_addr, mac); -	} else { +	int ret; + +	ret = of_get_mac_address(np, ndev->dev_addr); +	if (ret) {  		u32 mahr = ravb_read(ndev, MAHR);  		u32 malr = ravb_read(ndev, MALR); @@ -911,31 +913,20 @@ static int ravb_poll(struct napi_struct *napi, int budget)  	int q = napi - priv->napi;  	int mask = BIT(q);  	int quota = budget; -	u32 ris0, tis; -	for (;;) { -		tis = ravb_read(ndev, TIS); -		ris0 = ravb_read(ndev, RIS0); -		if (!((ris0 & mask) || (tis & mask))) -			break; +	/* Processing RX Descriptor Ring */ +	/* Clear RX interrupt */ +	ravb_write(ndev, ~(mask | RIS0_RESERVED), RIS0); +	if (ravb_rx(ndev, "a, q)) +		goto out; -		/* Processing RX Descriptor Ring */ -		if (ris0 & mask) { -			/* Clear RX interrupt */ -			ravb_write(ndev, ~(mask | RIS0_RESERVED), RIS0); -			if (ravb_rx(ndev, "a, q)) -				goto out; -		} -		/* Processing TX Descriptor Ring */ -		if (tis & mask) { -			spin_lock_irqsave(&priv->lock, flags); -			/* Clear TX interrupt */ -			ravb_write(ndev, ~(mask | TIS_RESERVED), TIS); -			ravb_tx_free(ndev, q, true); -			netif_wake_subqueue(ndev, q); -			spin_unlock_irqrestore(&priv->lock, flags); -		} -	} +	/* Processing RX Descriptor Ring */ +	spin_lock_irqsave(&priv->lock, flags); +	/* Clear TX interrupt */ +	ravb_write(ndev, ~(mask | TIS_RESERVED), TIS); +	ravb_tx_free(ndev, q, true); +	netif_wake_subqueue(ndev, q); +	spin_unlock_irqrestore(&priv->lock, flags);  	napi_complete(napi); @@ -2148,6 +2139,13 @@ static int ravb_probe(struct platform_device *pdev)  		goto out_release;  	} +	priv->refclk = devm_clk_get_optional(&pdev->dev, "refclk"); +	if (IS_ERR(priv->refclk)) { +		error = PTR_ERR(priv->refclk); +		goto out_release; +	} +	clk_prepare_enable(priv->refclk); +  	ndev->max_mtu = 2048 - (ETH_HLEN + VLAN_HLEN + ETH_FCS_LEN);  	ndev->min_mtu = ETH_MIN_MTU; @@ -2164,7 +2162,7 @@ static int ravb_probe(struct platform_device *pdev)  	/* Set GTI value */  	error = ravb_set_gti(ndev);  	if (error) -		goto out_release; +		goto out_disable_refclk;  	/* Request GTI loading */  	ravb_modify(ndev, GCCR, GCCR_LTI, GCCR_LTI); @@ -2183,7 +2181,7 @@ static int ravb_probe(struct platform_device *pdev)  			"Cannot allocate desc base address table (size %d bytes)\n",  			priv->desc_bat_size);  		error = -ENOMEM; -		goto out_release; +		goto out_disable_refclk;  	}  	for (q = RAVB_BE; q < DBAT_ENTRY_NUM; q++)  		priv->desc_bat[q].die_dt = DT_EOS; @@ -2200,7 +2198,7 @@ static int ravb_probe(struct platform_device *pdev)  	priv->msg_enable = RAVB_DEF_MSG_ENABLE;  	/* Read and set MAC address */ -	ravb_read_mac_address(ndev, of_get_mac_address(np)); +	ravb_read_mac_address(np, ndev);  	if (!is_valid_ether_addr(ndev->dev_addr)) {  		dev_warn(&pdev->dev,  			 "no valid MAC address supplied, using a random one\n"); @@ -2243,6 +2241,8 @@ out_dma_free:  	/* Stop PTP Clock driver */  	if (chip_id != RCAR_GEN2)  		ravb_ptp_stop(ndev); +out_disable_refclk: +	clk_disable_unprepare(priv->refclk);  out_release:  	free_netdev(ndev); @@ -2260,6 +2260,8 @@ static int ravb_remove(struct platform_device *pdev)  	if (priv->chip_id != RCAR_GEN2)  		ravb_ptp_stop(ndev); +	clk_disable_unprepare(priv->refclk); +  	dma_free_coherent(ndev->dev.parent, priv->desc_bat_size, priv->desc_bat,  			  priv->desc_bat_dma);  	/* Set reset mode */ | 
