diff options
Diffstat (limited to 'drivers/net/ethernet')
| -rw-r--r-- | drivers/net/ethernet/jme.c | 28 | ||||
| -rw-r--r-- | drivers/net/ethernet/micrel/ksz884x.c | 16 | ||||
| -rw-r--r-- | drivers/net/ethernet/smsc/smsc911x.c | 17 | ||||
| -rw-r--r-- | drivers/net/ethernet/tile/tilegx.c | 2 | ||||
| -rw-r--r-- | drivers/net/ethernet/xilinx/xilinx_axienet_main.c | 12 | 
5 files changed, 34 insertions, 41 deletions
diff --git a/drivers/net/ethernet/jme.c b/drivers/net/ethernet/jme.c index 92317e9c0f7..60ac46f4ac0 100644 --- a/drivers/net/ethernet/jme.c +++ b/drivers/net/ethernet/jme.c @@ -1860,10 +1860,14 @@ jme_open(struct net_device *netdev)  	jme_clear_pm(jme);  	JME_NAPI_ENABLE(jme); -	tasklet_enable(&jme->linkch_task); -	tasklet_enable(&jme->txclean_task); -	tasklet_hi_enable(&jme->rxclean_task); -	tasklet_hi_enable(&jme->rxempty_task); +	tasklet_init(&jme->linkch_task, jme_link_change_tasklet, +		     (unsigned long) jme); +	tasklet_init(&jme->txclean_task, jme_tx_clean_tasklet, +		     (unsigned long) jme); +	tasklet_init(&jme->rxclean_task, jme_rx_clean_tasklet, +		     (unsigned long) jme); +	tasklet_init(&jme->rxempty_task, jme_rx_empty_tasklet, +		     (unsigned long) jme);  	rc = jme_request_irq(jme);  	if (rc) @@ -3079,22 +3083,6 @@ jme_init_one(struct pci_dev *pdev,  	tasklet_init(&jme->pcc_task,  		     jme_pcc_tasklet,  		     (unsigned long) jme); -	tasklet_init(&jme->linkch_task, -		     jme_link_change_tasklet, -		     (unsigned long) jme); -	tasklet_init(&jme->txclean_task, -		     jme_tx_clean_tasklet, -		     (unsigned long) jme); -	tasklet_init(&jme->rxclean_task, -		     jme_rx_clean_tasklet, -		     (unsigned long) jme); -	tasklet_init(&jme->rxempty_task, -		     jme_rx_empty_tasklet, -		     (unsigned long) jme); -	tasklet_disable_nosync(&jme->linkch_task); -	tasklet_disable_nosync(&jme->txclean_task); -	tasklet_disable_nosync(&jme->rxclean_task); -	tasklet_disable_nosync(&jme->rxempty_task);  	jme->dpi.cur = PCC_P1;  	jme->reg_ghc = 0; diff --git a/drivers/net/ethernet/micrel/ksz884x.c b/drivers/net/ethernet/micrel/ksz884x.c index e558edd1cb6..69e01977a1d 100644 --- a/drivers/net/ethernet/micrel/ksz884x.c +++ b/drivers/net/ethernet/micrel/ksz884x.c @@ -5459,8 +5459,10 @@ static int prepare_hardware(struct net_device *dev)  	rc = request_irq(dev->irq, netdev_intr, IRQF_SHARED, dev->name, dev);  	if (rc)  		return rc; -	tasklet_enable(&hw_priv->rx_tasklet); -	tasklet_enable(&hw_priv->tx_tasklet); +	tasklet_init(&hw_priv->rx_tasklet, rx_proc_task, +		     (unsigned long) hw_priv); +	tasklet_init(&hw_priv->tx_tasklet, tx_proc_task, +		     (unsigned long) hw_priv);  	hw->promiscuous = 0;  	hw->all_multi = 0; @@ -7033,16 +7035,6 @@ static int __devinit pcidev_init(struct pci_dev *pdev,  	spin_lock_init(&hw_priv->hwlock);  	mutex_init(&hw_priv->lock); -	/* tasklet is enabled. */ -	tasklet_init(&hw_priv->rx_tasklet, rx_proc_task, -		(unsigned long) hw_priv); -	tasklet_init(&hw_priv->tx_tasklet, tx_proc_task, -		(unsigned long) hw_priv); - -	/* tasklet_enable will decrement the atomic counter. */ -	tasklet_disable(&hw_priv->rx_tasklet); -	tasklet_disable(&hw_priv->tx_tasklet); -  	for (i = 0; i < TOTAL_PORT_NUM; i++)  		init_waitqueue_head(&hw_priv->counter[i].counter); diff --git a/drivers/net/ethernet/smsc/smsc911x.c b/drivers/net/ethernet/smsc/smsc911x.c index 62d1baf111e..c53c0f4e2ce 100644 --- a/drivers/net/ethernet/smsc/smsc911x.c +++ b/drivers/net/ethernet/smsc/smsc911x.c @@ -2110,7 +2110,7 @@ static void __devinit smsc911x_read_mac_address(struct net_device *dev)  static int __devinit smsc911x_init(struct net_device *dev)  {  	struct smsc911x_data *pdata = netdev_priv(dev); -	unsigned int byte_test; +	unsigned int byte_test, mask;  	unsigned int to = 100;  	SMSC_TRACE(pdata, probe, "Driver Parameters:"); @@ -2130,9 +2130,22 @@ static int __devinit smsc911x_init(struct net_device *dev)  	/*  	 * poll the READY bit in PMT_CTRL. Any other access to the device is  	 * forbidden while this bit isn't set. Try for 100ms +	 * +	 * Note that this test is done before the WORD_SWAP register is +	 * programmed. So in some configurations the READY bit is at 16 before +	 * WORD_SWAP is written to. This issue is worked around by waiting +	 * until either bit 0 or bit 16 gets set in PMT_CTRL. +	 * +	 * SMSC has confirmed that checking bit 16 (marked as reserved in +	 * the datasheet) is fine since these bits "will either never be set +	 * or can only go high after READY does (so also indicate the device +	 * is ready)".  	 */ -	while (!(smsc911x_reg_read(pdata, PMT_CTRL) & PMT_CTRL_READY_) && --to) + +	mask = PMT_CTRL_READY_ | swahw32(PMT_CTRL_READY_); +	while (!(smsc911x_reg_read(pdata, PMT_CTRL) & mask) && --to)  		udelay(1000); +  	if (to == 0) {  		pr_err("Device not READY in 100ms aborting\n");  		return -ENODEV; diff --git a/drivers/net/ethernet/tile/tilegx.c b/drivers/net/ethernet/tile/tilegx.c index 4e981001385..66e025ad5df 100644 --- a/drivers/net/ethernet/tile/tilegx.c +++ b/drivers/net/ethernet/tile/tilegx.c @@ -917,7 +917,7 @@ static int tile_net_setup_interrupts(struct net_device *dev)  	ingress_irq = rc;  	tile_irq_activate(ingress_irq, TILE_IRQ_PERCPU);  	rc = request_irq(ingress_irq, tile_net_handle_ingress_irq, -			 0, NULL, NULL); +			 0, "tile_net", NULL);  	if (rc != 0) {  		netdev_err(dev, "request_irq failed: %d\n", rc);  		destroy_irq(ingress_irq); diff --git a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c index 1d04754a663..77e6db9dcfe 100644 --- a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c +++ b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c @@ -942,6 +942,10 @@ static int axienet_open(struct net_device *ndev)  		phy_start(lp->phy_dev);  	} +	/* Enable tasklets for Axi DMA error handling */ +	tasklet_init(&lp->dma_err_tasklet, axienet_dma_err_handler, +		     (unsigned long) lp); +  	/* Enable interrupts for Axi DMA Tx */  	ret = request_irq(lp->tx_irq, axienet_tx_irq, 0, ndev->name, ndev);  	if (ret) @@ -950,8 +954,7 @@ static int axienet_open(struct net_device *ndev)  	ret = request_irq(lp->rx_irq, axienet_rx_irq, 0, ndev->name, ndev);  	if (ret)  		goto err_rx_irq; -	/* Enable tasklets for Axi DMA error handling */ -	tasklet_enable(&lp->dma_err_tasklet); +  	return 0;  err_rx_irq: @@ -960,6 +963,7 @@ err_tx_irq:  	if (lp->phy_dev)  		phy_disconnect(lp->phy_dev);  	lp->phy_dev = NULL; +	tasklet_kill(&lp->dma_err_tasklet);  	dev_err(lp->dev, "request_irq() failed\n");  	return ret;  } @@ -1613,10 +1617,6 @@ static int __devinit axienet_of_probe(struct platform_device *op)  		goto err_iounmap_2;  	} -	tasklet_init(&lp->dma_err_tasklet, axienet_dma_err_handler, -		     (unsigned long) lp); -	tasklet_disable(&lp->dma_err_tasklet); -  	return 0;  err_iounmap_2:  |