diff options
Diffstat (limited to 'drivers/net/ethernet/freescale/fec_main.c')
| -rw-r--r-- | drivers/net/ethernet/freescale/fec_main.c | 44 | 
1 files changed, 34 insertions, 10 deletions
diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c index 3dc2d771a222..a74300a4459c 100644 --- a/drivers/net/ethernet/freescale/fec_main.c +++ b/drivers/net/ethernet/freescale/fec_main.c @@ -818,6 +818,12 @@ static void fec_enet_bd_init(struct net_device *dev)  		for (i = 0; i < txq->bd.ring_size; i++) {  			/* Initialize the BD for every fragment in the page. */  			bdp->cbd_sc = cpu_to_fec16(0); +			if (bdp->cbd_bufaddr && +			    !IS_TSO_HEADER(txq, fec32_to_cpu(bdp->cbd_bufaddr))) +				dma_unmap_single(&fep->pdev->dev, +						 fec32_to_cpu(bdp->cbd_bufaddr), +						 fec16_to_cpu(bdp->cbd_datlen), +						 DMA_TO_DEVICE);  			if (txq->tx_skbuff[i]) {  				dev_kfree_skb_any(txq->tx_skbuff[i]);  				txq->tx_skbuff[i] = NULL; @@ -1602,10 +1608,6 @@ fec_enet_interrupt(int irq, void *dev_id)  		ret = IRQ_HANDLED;  		complete(&fep->mdio_done);  	} - -	if (fep->ptp_clock) -		if (fec_ptp_check_pps_event(fep)) -			ret = IRQ_HANDLED;  	return ret;  } @@ -3312,6 +3314,19 @@ fec_enet_get_queue_num(struct platform_device *pdev, int *num_tx, int *num_rx)  } +static int fec_enet_get_irq_cnt(struct platform_device *pdev) +{ +	int irq_cnt = platform_irq_count(pdev); + +	if (irq_cnt > FEC_IRQ_NUM) +		irq_cnt = FEC_IRQ_NUM;	/* last for pps */ +	else if (irq_cnt == 2) +		irq_cnt = 1;	/* last for pps */ +	else if (irq_cnt <= 0) +		irq_cnt = 1;	/* At least 1 irq is needed */ +	return irq_cnt; +} +  static int  fec_probe(struct platform_device *pdev)  { @@ -3325,6 +3340,8 @@ fec_probe(struct platform_device *pdev)  	struct device_node *np = pdev->dev.of_node, *phy_node;  	int num_tx_qs;  	int num_rx_qs; +	char irq_name[8]; +	int irq_cnt;  	fec_enet_get_queue_num(pdev, &num_tx_qs, &num_rx_qs); @@ -3452,6 +3469,10 @@ fec_probe(struct platform_device *pdev)  			goto failed_regulator;  		}  	} else { +		if (PTR_ERR(fep->reg_phy) == -EPROBE_DEFER) { +			ret = -EPROBE_DEFER; +			goto failed_regulator; +		}  		fep->reg_phy = NULL;  	} @@ -3465,18 +3486,20 @@ fec_probe(struct platform_device *pdev)  	if (ret)  		goto failed_reset; +	irq_cnt = fec_enet_get_irq_cnt(pdev);  	if (fep->bufdesc_ex) -		fec_ptp_init(pdev); +		fec_ptp_init(pdev, irq_cnt);  	ret = fec_enet_init(ndev);  	if (ret)  		goto failed_init; -	for (i = 0; i < FEC_IRQ_NUM; i++) { -		irq = platform_get_irq(pdev, i); +	for (i = 0; i < irq_cnt; i++) { +		sprintf(irq_name, "int%d", i); +		irq = platform_get_irq_byname(pdev, irq_name); +		if (irq < 0) +			irq = platform_get_irq(pdev, i);  		if (irq < 0) { -			if (i) -				break;  			ret = irq;  			goto failed_irq;  		} @@ -3533,8 +3556,9 @@ failed_clk_ipg:  failed_clk:  	if (of_phy_is_fixed_link(np))  		of_phy_deregister_fixed_link(np); -failed_phy:  	of_node_put(phy_node); +failed_phy: +	dev_id--;  failed_ioremap:  	free_netdev(ndev);  |