@@ -806,7 +806,7 @@ static irqreturn_t axienet_tx_irq(int irq, void *_ndev)
806
806
/* Write to the Rx channel control register */
807
807
axienet_dma_out32 (lp , XAXIDMA_RX_CR_OFFSET , cr );
808
808
809
- tasklet_schedule (& lp -> dma_err_tasklet );
809
+ schedule_work (& lp -> dma_err_task );
810
810
axienet_dma_out32 (lp , XAXIDMA_TX_SR_OFFSET , status );
811
811
}
812
812
out :
@@ -855,7 +855,7 @@ static irqreturn_t axienet_rx_irq(int irq, void *_ndev)
855
855
/* write to the Rx channel control register */
856
856
axienet_dma_out32 (lp , XAXIDMA_RX_CR_OFFSET , cr );
857
857
858
- tasklet_schedule (& lp -> dma_err_tasklet );
858
+ schedule_work (& lp -> dma_err_task );
859
859
axienet_dma_out32 (lp , XAXIDMA_RX_SR_OFFSET , status );
860
860
}
861
861
out :
@@ -891,7 +891,7 @@ static irqreturn_t axienet_eth_irq(int irq, void *_ndev)
891
891
return IRQ_HANDLED ;
892
892
}
893
893
894
- static void axienet_dma_err_handler (unsigned long data );
894
+ static void axienet_dma_err_handler (struct work_struct * work );
895
895
896
896
/**
897
897
* axienet_open - Driver open routine.
@@ -935,9 +935,8 @@ static int axienet_open(struct net_device *ndev)
935
935
936
936
phylink_start (lp -> phylink );
937
937
938
- /* Enable tasklets for Axi DMA error handling */
939
- tasklet_init (& lp -> dma_err_tasklet , axienet_dma_err_handler ,
940
- (unsigned long ) lp );
938
+ /* Enable worker thread for Axi DMA error handling */
939
+ INIT_WORK (& lp -> dma_err_task , axienet_dma_err_handler );
941
940
942
941
/* Enable interrupts for Axi DMA Tx */
943
942
ret = request_irq (lp -> tx_irq , axienet_tx_irq , IRQF_SHARED ,
@@ -966,7 +965,7 @@ static int axienet_open(struct net_device *ndev)
966
965
err_tx_irq :
967
966
phylink_stop (lp -> phylink );
968
967
phylink_disconnect_phy (lp -> phylink );
969
- tasklet_kill (& lp -> dma_err_tasklet );
968
+ cancel_work_sync (& lp -> dma_err_task );
970
969
dev_err (lp -> dev , "request_irq() failed\n" );
971
970
return ret ;
972
971
}
@@ -1025,7 +1024,7 @@ static int axienet_stop(struct net_device *ndev)
1025
1024
axienet_mdio_enable (lp );
1026
1025
mutex_unlock (& lp -> mii_bus -> mdio_lock );
1027
1026
1028
- tasklet_kill (& lp -> dma_err_tasklet );
1027
+ cancel_work_sync (& lp -> dma_err_task );
1029
1028
1030
1029
if (lp -> eth_irq > 0 )
1031
1030
free_irq (lp -> eth_irq , ndev );
@@ -1505,17 +1504,18 @@ static const struct phylink_mac_ops axienet_phylink_ops = {
1505
1504
};
1506
1505
1507
1506
/**
1508
- * axienet_dma_err_handler - Tasklet handler for Axi DMA Error
1509
- * @data: Data passed
1507
+ * axienet_dma_err_handler - Work queue task for Axi DMA Error
1508
+ * @work: pointer to work_struct
1510
1509
*
1511
1510
* Resets the Axi DMA and Axi Ethernet devices, and reconfigures the
1512
1511
* Tx/Rx BDs.
1513
1512
*/
1514
- static void axienet_dma_err_handler (unsigned long data )
1513
+ static void axienet_dma_err_handler (struct work_struct * work )
1515
1514
{
1516
1515
u32 axienet_status ;
1517
1516
u32 cr , i ;
1518
- struct axienet_local * lp = (struct axienet_local * ) data ;
1517
+ struct axienet_local * lp = container_of (work , struct axienet_local ,
1518
+ dma_err_task );
1519
1519
struct net_device * ndev = lp -> ndev ;
1520
1520
struct axidma_bd * cur_p ;
1521
1521
0 commit comments