korina.c (a2a12d3ae24d54c2488d06bd290e24e83eded22b) | korina.c (56e2e5de441a3a6590c94e70d071a6c1790c6124) |
---|---|
1/* | 1>/* |
2 * Driver for the IDT RC32434 (Korina) on-chip ethernet controller. 3 * 4 * Copyright 2004 IDT Inc. (rischelp@idt.com) 5 * Copyright 2006 Felix Fietkau <nbd@openwrt.org> 6 * Copyright 2008 Florian Fainelli <florian@openwrt.org> 7 * Copyright 2017 Roman Yeryomin <roman@advem.lv> 8 * 9 * This program is free software; you can redistribute it and/or modify it --- 308 unchanged lines hidden (view full) --- 318#define KORINA_TDS_MASK (KORINA_NUM_TDS - 1) 319#define RD_RING_SIZE (KORINA_NUM_RDS * sizeof(struct dma_desc)) 320#define TD_RING_SIZE (KORINA_NUM_TDS * sizeof(struct dma_desc)) 321 322#define TX_TIMEOUT (6000 * HZ / 1000) 323 324enum chain_status { 325 desc_filled, | 2 * Driver for the IDT RC32434 (Korina) on-chip ethernet controller. 3 * 4 * Copyright 2004 IDT Inc. (rischelp@idt.com) 5 * Copyright 2006 Felix Fietkau <nbd@openwrt.org> 6 * Copyright 2008 Florian Fainelli <florian@openwrt.org> 7 * Copyright 2017 Roman Yeryomin <roman@advem.lv> 8 * 9 * This program is free software; you can redistribute it and/or modify it --- 308 unchanged lines hidden (view full) --- 318#define KORINA_TDS_MASK (KORINA_NUM_TDS - 1) 319#define RD_RING_SIZE (KORINA_NUM_RDS * sizeof(struct dma_desc)) 320#define TD_RING_SIZE (KORINA_NUM_TDS * sizeof(struct dma_desc)) 321 322#define TX_TIMEOUT (6000 * HZ / 1000) 323 324enum chain_status { 325 desc_filled, |
326 desc_empty | 326 desc_is_empty |
327}; 328 329#define DMA_COUNT(count) ((count) & DMA_DESC_COUNT_MSK) 330#define IS_DMA_FINISHED(X) (((X) & (DMA_DESC_FINI)) != 0) 331#define IS_DMA_DONE(X) (((X) & (DMA_DESC_DONE)) != 0) 332#define RCVPKT_LENGTH(X) (((X) & ETH_RX_LEN) >> ETH_RX_LEN_BIT) 333 334/* Information that need to be kept for each board. */ --- 119 unchanged lines hidden (view full) --- 454 455 lp->tx_skb_dma[idx] = ca; 456 td->ca = ca; 457 458 chain_prev = (idx - 1) & KORINA_TDS_MASK; 459 chain_next = (idx + 1) & KORINA_TDS_MASK; 460 461 if (readl(&(lp->tx_dma_regs->dmandptr)) == 0) { | 327}; 328 329#define DMA_COUNT(count) ((count) & DMA_DESC_COUNT_MSK) 330#define IS_DMA_FINISHED(X) (((X) & (DMA_DESC_FINI)) != 0) 331#define IS_DMA_DONE(X) (((X) & (DMA_DESC_DONE)) != 0) 332#define RCVPKT_LENGTH(X) (((X) & ETH_RX_LEN) >> ETH_RX_LEN_BIT) 333 334/* Information that need to be kept for each board. */ --- 119 unchanged lines hidden (view full) --- 454 455 lp->tx_skb_dma[idx] = ca; 456 td->ca = ca; 457 458 chain_prev = (idx - 1) & KORINA_TDS_MASK; 459 chain_next = (idx + 1) & KORINA_TDS_MASK; 460 461 if (readl(&(lp->tx_dma_regs->dmandptr)) == 0) { |
462 if (lp->tx_chain_status == desc_empty) { | 462 if (lp->tx_chain_status == desc_is_empty) { |
463 /* Update tail */ 464 td->control = DMA_COUNT(length) | 465 DMA_DESC_COF | DMA_DESC_IOF; 466 /* Move tail */ 467 lp->tx_chain_tail = chain_next; 468 /* Write to NDPTR */ 469 writel(korina_tx_dma(lp, lp->tx_chain_head), 470 &lp->tx_dma_regs->dmandptr); --- 10 unchanged lines hidden (view full) --- 481 lp->td_ring[chain_prev].link = korina_tx_dma(lp, idx); 482 /* Move tail */ 483 lp->tx_chain_tail = chain_next; 484 /* Write to NDPTR */ 485 writel(korina_tx_dma(lp, lp->tx_chain_head), 486 &lp->tx_dma_regs->dmandptr); 487 /* Move head to tail */ 488 lp->tx_chain_head = lp->tx_chain_tail; | 463 /* Update tail */ 464 td->control = DMA_COUNT(length) | 465 DMA_DESC_COF | DMA_DESC_IOF; 466 /* Move tail */ 467 lp->tx_chain_tail = chain_next; 468 /* Write to NDPTR */ 469 writel(korina_tx_dma(lp, lp->tx_chain_head), 470 &lp->tx_dma_regs->dmandptr); --- 10 unchanged lines hidden (view full) --- 481 lp->td_ring[chain_prev].link = korina_tx_dma(lp, idx); 482 /* Move tail */ 483 lp->tx_chain_tail = chain_next; 484 /* Write to NDPTR */ 485 writel(korina_tx_dma(lp, lp->tx_chain_head), 486 &lp->tx_dma_regs->dmandptr); 487 /* Move head to tail */ 488 lp->tx_chain_head = lp->tx_chain_tail; |
489 lp->tx_chain_status = desc_empty; | 489 lp->tx_chain_status = desc_is_empty; |
490 } 491 } else { | 490 } 491 } else { |
492 if (lp->tx_chain_status == desc_empty) { | 492 if (lp->tx_chain_status == desc_is_empty) { |
493 /* Update tail */ 494 td->control = DMA_COUNT(length) | 495 DMA_DESC_COF | DMA_DESC_IOF; 496 /* Move tail */ 497 lp->tx_chain_tail = chain_next; 498 lp->tx_chain_status = desc_filled; 499 } else { 500 /* Update tail */ --- 362 unchanged lines hidden (view full) --- 863 &lp->tx_dma_regs->dmasm); 864 865 korina_tx(dev); 866 867 if (lp->tx_chain_status == desc_filled && 868 (readl(&(lp->tx_dma_regs->dmandptr)) == 0)) { 869 writel(korina_tx_dma(lp, lp->tx_chain_head), 870 &lp->tx_dma_regs->dmandptr); | 493 /* Update tail */ 494 td->control = DMA_COUNT(length) | 495 DMA_DESC_COF | DMA_DESC_IOF; 496 /* Move tail */ 497 lp->tx_chain_tail = chain_next; 498 lp->tx_chain_status = desc_filled; 499 } else { 500 /* Update tail */ --- 362 unchanged lines hidden (view full) --- 863 &lp->tx_dma_regs->dmasm); 864 865 korina_tx(dev); 866 867 if (lp->tx_chain_status == desc_filled && 868 (readl(&(lp->tx_dma_regs->dmandptr)) == 0)) { 869 writel(korina_tx_dma(lp, lp->tx_chain_head), 870 &lp->tx_dma_regs->dmandptr); |
871 lp->tx_chain_status = desc_empty; | 871 lp->tx_chain_status = desc_is_empty; |
872 lp->tx_chain_head = lp->tx_chain_tail; 873 netif_trans_update(dev); 874 } 875 if (dmas & DMA_STAT_ERR) 876 printk(KERN_ERR "%s: DMA error\n", dev->name); 877 878 retval = IRQ_HANDLED; 879 } else --- 114 unchanged lines hidden (view full) --- 994 for (i = 0; i < KORINA_NUM_TDS; i++) { 995 lp->td_ring[i].control = DMA_DESC_IOF; 996 lp->td_ring[i].devcs = ETH_TX_FD | ETH_TX_LD; 997 lp->td_ring[i].ca = 0; 998 lp->td_ring[i].link = 0; 999 } 1000 lp->tx_next_done = lp->tx_chain_head = lp->tx_chain_tail = 1001 lp->tx_full = lp->tx_count = 0; | 872 lp->tx_chain_head = lp->tx_chain_tail; 873 netif_trans_update(dev); 874 } 875 if (dmas & DMA_STAT_ERR) 876 printk(KERN_ERR "%s: DMA error\n", dev->name); 877 878 retval = IRQ_HANDLED; 879 } else --- 114 unchanged lines hidden (view full) --- 994 for (i = 0; i < KORINA_NUM_TDS; i++) { 995 lp->td_ring[i].control = DMA_DESC_IOF; 996 lp->td_ring[i].devcs = ETH_TX_FD | ETH_TX_LD; 997 lp->td_ring[i].ca = 0; 998 lp->td_ring[i].link = 0; 999 } 1000 lp->tx_next_done = lp->tx_chain_head = lp->tx_chain_tail = 1001 lp->tx_full = lp->tx_count = 0; |
1002 lp->tx_chain_status = desc_empty; | 1002 lp->tx_chain_status = desc_is_empty; |
1003 1004 /* Initialize the receive descriptors */ 1005 for (i = 0; i < KORINA_NUM_RDS; i++) { 1006 skb = netdev_alloc_skb_ip_align(dev, KORINA_RBSIZE); 1007 if (!skb) 1008 return -ENOMEM; 1009 lp->rx_skb[i] = skb; 1010 lp->rd_ring[i].control = DMA_DESC_IOD | --- 11 unchanged lines hidden (view full) --- 1022 /* loop back receive descriptors, so the last 1023 * descriptor points to the first one */ 1024 lp->rd_ring[i - 1].link = lp->rd_dma; 1025 lp->rd_ring[i - 1].control |= DMA_DESC_COD; 1026 1027 lp->rx_next_done = 0; 1028 lp->rx_chain_head = 0; 1029 lp->rx_chain_tail = 0; | 1003 1004 /* Initialize the receive descriptors */ 1005 for (i = 0; i < KORINA_NUM_RDS; i++) { 1006 skb = netdev_alloc_skb_ip_align(dev, KORINA_RBSIZE); 1007 if (!skb) 1008 return -ENOMEM; 1009 lp->rx_skb[i] = skb; 1010 lp->rd_ring[i].control = DMA_DESC_IOD | --- 11 unchanged lines hidden (view full) --- 1022 /* loop back receive descriptors, so the last 1023 * descriptor points to the first one */ 1024 lp->rd_ring[i - 1].link = lp->rd_dma; 1025 lp->rd_ring[i - 1].control |= DMA_DESC_COD; 1026 1027 lp->rx_next_done = 0; 1028 lp->rx_chain_head = 0; 1029 lp->rx_chain_tail = 0; |
1030 lp->rx_chain_status = desc_empty; | 1030 lp->rx_chain_status = desc_is_empty; |
1031 1032 return 0; 1033} 1034 1035static void korina_free_ring(struct net_device *dev) 1036{ 1037 struct korina_private *lp = netdev_priv(dev); 1038 int i; --- 380 unchanged lines hidden --- | 1031 1032 return 0; 1033} 1034 1035static void korina_free_ring(struct net_device *dev) 1036{ 1037 struct korina_private *lp = netdev_priv(dev); 1038 int i; --- 380 unchanged lines hidden --- |