diff options
-rw-r--r-- | drivers/net/ethernet/xilinx/ll_temac.h | 4 | ||||
-rw-r--r-- | drivers/net/ethernet/xilinx/ll_temac_main.c | 40 | ||||
-rw-r--r-- | include/linux/platform_data/xilinx-ll-temac.h | 5 |
3 files changed, 37 insertions, 12 deletions
diff --git a/drivers/net/ethernet/xilinx/ll_temac.h b/drivers/net/ethernet/xilinx/ll_temac.h index 990f9ed151b2..1aeda084b8f1 100644 --- a/drivers/net/ethernet/xilinx/ll_temac.h +++ b/drivers/net/ethernet/xilinx/ll_temac.h | |||
@@ -375,6 +375,10 @@ struct temac_local { | |||
375 | int tx_bd_next; | 375 | int tx_bd_next; |
376 | int tx_bd_tail; | 376 | int tx_bd_tail; |
377 | int rx_bd_ci; | 377 | int rx_bd_ci; |
378 | |||
379 | /* DMA channel control setup */ | ||
380 | u32 tx_chnl_ctrl; | ||
381 | u32 rx_chnl_ctrl; | ||
378 | }; | 382 | }; |
379 | 383 | ||
380 | /* Wrappers for temac_ior()/temac_iow() function pointers above */ | 384 | /* Wrappers for temac_ior()/temac_iow() function pointers above */ |
diff --git a/drivers/net/ethernet/xilinx/ll_temac_main.c b/drivers/net/ethernet/xilinx/ll_temac_main.c index fec8e4c22944..bccef30bf64e 100644 --- a/drivers/net/ethernet/xilinx/ll_temac_main.c +++ b/drivers/net/ethernet/xilinx/ll_temac_main.c | |||
@@ -304,18 +304,15 @@ static int temac_dma_bd_init(struct net_device *ndev) | |||
304 | lp->rx_bd_v[i].app0 = cpu_to_be32(STS_CTRL_APP0_IRQONEND); | 304 | lp->rx_bd_v[i].app0 = cpu_to_be32(STS_CTRL_APP0_IRQONEND); |
305 | } | 305 | } |
306 | 306 | ||
307 | lp->dma_out(lp, TX_CHNL_CTRL, 0x10220400 | | 307 | /* Configure DMA channel (irq setup) */ |
308 | CHNL_CTRL_IRQ_EN | | 308 | lp->dma_out(lp, TX_CHNL_CTRL, lp->tx_chnl_ctrl | |
309 | CHNL_CTRL_IRQ_DLY_EN | | 309 | 0x00000400 | // Use 1 Bit Wide Counters. Currently Not Used! |
310 | CHNL_CTRL_IRQ_COAL_EN); | 310 | CHNL_CTRL_IRQ_EN | CHNL_CTRL_IRQ_ERR_EN | |
311 | /* 0x10220483 */ | 311 | CHNL_CTRL_IRQ_DLY_EN | CHNL_CTRL_IRQ_COAL_EN); |
312 | /* 0x00100483 */ | 312 | lp->dma_out(lp, RX_CHNL_CTRL, lp->rx_chnl_ctrl | |
313 | lp->dma_out(lp, RX_CHNL_CTRL, 0xff070000 | | 313 | CHNL_CTRL_IRQ_IOE | |
314 | CHNL_CTRL_IRQ_EN | | 314 | CHNL_CTRL_IRQ_EN | CHNL_CTRL_IRQ_ERR_EN | |
315 | CHNL_CTRL_IRQ_DLY_EN | | 315 | CHNL_CTRL_IRQ_DLY_EN | CHNL_CTRL_IRQ_COAL_EN); |
316 | CHNL_CTRL_IRQ_COAL_EN | | ||
317 | CHNL_CTRL_IRQ_IOE); | ||
318 | /* 0xff010283 */ | ||
319 | 316 | ||
320 | lp->dma_out(lp, RX_CURDESC_PTR, lp->rx_bd_p); | 317 | lp->dma_out(lp, RX_CURDESC_PTR, lp->rx_bd_p); |
321 | lp->dma_out(lp, RX_TAILDESC_PTR, | 318 | lp->dma_out(lp, RX_TAILDESC_PTR, |
@@ -1191,6 +1188,13 @@ static int temac_probe(struct platform_device *pdev) | |||
1191 | lp->rx_irq = irq_of_parse_and_map(dma_np, 0); | 1188 | lp->rx_irq = irq_of_parse_and_map(dma_np, 0); |
1192 | lp->tx_irq = irq_of_parse_and_map(dma_np, 1); | 1189 | lp->tx_irq = irq_of_parse_and_map(dma_np, 1); |
1193 | 1190 | ||
1191 | /* Use defaults for IRQ delay/coalescing setup. These | ||
1192 | * are configuration values, so does not belong in | ||
1193 | * device-tree. | ||
1194 | */ | ||
1195 | lp->tx_chnl_ctrl = 0x10220000; | ||
1196 | lp->rx_chnl_ctrl = 0xff070000; | ||
1197 | |||
1194 | /* Finished with the DMA node; drop the reference */ | 1198 | /* Finished with the DMA node; drop the reference */ |
1195 | of_node_put(dma_np); | 1199 | of_node_put(dma_np); |
1196 | } else if (pdata) { | 1200 | } else if (pdata) { |
@@ -1214,6 +1218,18 @@ static int temac_probe(struct platform_device *pdev) | |||
1214 | /* Get DMA RX and TX interrupts */ | 1218 | /* Get DMA RX and TX interrupts */ |
1215 | lp->rx_irq = platform_get_irq(pdev, 0); | 1219 | lp->rx_irq = platform_get_irq(pdev, 0); |
1216 | lp->tx_irq = platform_get_irq(pdev, 1); | 1220 | lp->tx_irq = platform_get_irq(pdev, 1); |
1221 | |||
1222 | /* IRQ delay/coalescing setup */ | ||
1223 | if (pdata->tx_irq_timeout || pdata->tx_irq_count) | ||
1224 | lp->tx_chnl_ctrl = (pdata->tx_irq_timeout << 24) | | ||
1225 | (pdata->tx_irq_count << 16); | ||
1226 | else | ||
1227 | lp->tx_chnl_ctrl = 0x10220000; | ||
1228 | if (pdata->rx_irq_timeout || pdata->rx_irq_count) | ||
1229 | lp->rx_chnl_ctrl = (pdata->rx_irq_timeout << 24) | | ||
1230 | (pdata->rx_irq_count << 16); | ||
1231 | else | ||
1232 | lp->rx_chnl_ctrl = 0xff070000; | ||
1217 | } | 1233 | } |
1218 | 1234 | ||
1219 | /* Error handle returned DMA RX and TX interrupts */ | 1235 | /* Error handle returned DMA RX and TX interrupts */ |
diff --git a/include/linux/platform_data/xilinx-ll-temac.h b/include/linux/platform_data/xilinx-ll-temac.h index b0b8238a9b7d..368530f98176 100644 --- a/include/linux/platform_data/xilinx-ll-temac.h +++ b/include/linux/platform_data/xilinx-ll-temac.h | |||
@@ -22,6 +22,11 @@ struct ll_temac_platform_data { | |||
22 | * they share the same DCR bus bridge. | 22 | * they share the same DCR bus bridge. |
23 | */ | 23 | */ |
24 | struct mutex *indirect_mutex; | 24 | struct mutex *indirect_mutex; |
25 | /* DMA channel control setup */ | ||
26 | u8 tx_irq_timeout; /* TX Interrupt Delay Time-out */ | ||
27 | u8 tx_irq_count; /* TX Interrupt Coalescing Threshold Count */ | ||
28 | u8 rx_irq_timeout; /* RX Interrupt Delay Time-out */ | ||
29 | u8 rx_irq_count; /* RX Interrupt Coalescing Threshold Count */ | ||
25 | }; | 30 | }; |
26 | 31 | ||
27 | #endif /* __LINUX_XILINX_LL_TEMAC_H */ | 32 | #endif /* __LINUX_XILINX_LL_TEMAC_H */ |