Many, many issues DESC_ARRAY represent number of descriptor on array on Tx and Rx and is fit with TxDesc and RxDesc structure, MAX_DESCRIPTORS is 1024 on Rx and Tx wich is included 256 Descriptors from chip on Rx and Tx. DESC_ARRAY * NUM_ARRAYS_MAX must fit with MAX_DESCRIPTORS 256 from chip and rest from memory. DESC_ARRAY * NUM_ARRAY_MIN is hardware descriptors from chip. On doc RTL 8101/8102 and RTL 8169 report same number of descriptors 1024.
Signed-off-by: Corcodel Marian <corcodel.mar...@gmail.com> diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c index bf78f94..8bf8c3f 100644 --- a/drivers/net/ethernet/realtek/r8169.c +++ b/drivers/net/ethernet/realtek/r8169.c @@ -74,7 +74,7 @@ (NETIF_MSG_DRV | NETIF_MSG_PROBE | NETIF_MSG_IFUP | NETIF_MSG_IFDOWN) #define TX_SLOTS_AVAIL(tp) \ - (tp->dirty_tx + NUM_TX_DESC - tp->cur_tx) + (tp->dirty_tx + NUM_ARRAYS_MAX - tp->cur_tx) /* A skbuff with nr_frags needs nr_frags+1 entries in the tx queue */ #define TX_FRAGS_READY_FOR(tp,nr_frags) \ @@ -87,13 +87,17 @@ static const int multicast_filter_limit = 32; #define MAX_READ_REQUEST_SHIFT 12 #define TX_DMA_BURST 7 /* Maximum PCI burst, '7' is unlimited */ #define InterFrameGap 0x03 /* 3 means InterFrameGap = the shortest one */ +#define DESC_ARRAY 16 /* Number of descriptors on array to Rx and Tx */ +#define NUM_ARRAYS_MAX 64 /* Number of arrays descriptors maximum on Rx and Tx */ +#define NUM_ARRAYS_MIN 16 /* Number of arrays descriptors minimum on Rx and Tx */ +#define MAX_DESCRIPTORS 1024 /* Number of descriptors total and maximum on Rx and Tx */ #define R8169_REGS_SIZE 256 #define R8169_NAPI_WEIGHT 64 #define NUM_TX_DESC 64 /* Number of Tx descriptor registers */ #define NUM_RX_DESC 256U /* Number of Rx descriptor registers */ -#define R8169_TX_RING_BYTES (NUM_TX_DESC * sizeof(struct TxDesc)) -#define R8169_RX_RING_BYTES (NUM_RX_DESC * sizeof(struct RxDesc)) +#define R8169_TX_RING_BYTES (NUM_ARRAYS_MAX * sizeof(struct TxDesc)) /* here sizeof not reporting correct */ +#define R8169_RX_RING_BYTES (NUM_ARRAYS_MAX * sizeof(struct RxDesc)) /* here sizeof not reporting correct */ #define RTL8169_TX_TIMEOUT (6*HZ) #define RTL8169_PHY_TIMEOUT (10*HZ) @@ -778,8 +782,8 @@ struct rtl8169_private { struct RxDesc *RxDescArray; /* 256-aligned Rx descriptor ring */ dma_addr_t TxPhyAddr; dma_addr_t RxPhyAddr; - void *Rx_databuff[NUM_RX_DESC]; /* Rx data buffers */ - struct ring_info tx_skb[NUM_TX_DESC]; /* Tx data buffers */ + void *Rx_databuff[NUM_ARRAYS_MAX]; /* Rx data buffers */ + struct ring_info tx_skb[NUM_ARRAYS_MAX]; /* Tx data buffers */ struct timer_list timer; u16 cp_cmd; @@ -6679,7 +6683,7 @@ static void rtl8169_rx_clear(struct rtl8169_private *tp) { unsigned int i; - for (i = 0; i < NUM_RX_DESC; i++) { + for (i = 0; i < NUM_ARRAYS_MAX; i++) { if (tp->Rx_databuff[i]) { rtl8169_free_rx_databuff(tp, tp->Rx_databuff + i, tp->RxDescArray + i); @@ -6696,7 +6700,7 @@ static int rtl8169_rx_fill(struct rtl8169_private *tp) { unsigned int i; - for (i = 0; i < NUM_RX_DESC; i++) { + for (i = 0; i < NUM_ARRAYS_MAX; i++) { void *data; if (tp->Rx_databuff[i]) @@ -6710,7 +6714,7 @@ static int rtl8169_rx_fill(struct rtl8169_private *tp) tp->Rx_databuff[i] = data; } - rtl8169_mark_as_last_descriptor(tp->RxDescArray + NUM_RX_DESC - 1); + rtl8169_mark_as_last_descriptor(tp->RxDescArray + NUM_ARRAYS_MAX - 1); return 0; err_out: @@ -6724,8 +6728,8 @@ static int rtl8169_init_ring(struct net_device *dev) rtl8169_init_ring_indexes(tp); - memset(tp->tx_skb, 0x0, NUM_TX_DESC * sizeof(struct ring_info)); - memset(tp->Rx_databuff, 0x0, NUM_RX_DESC * sizeof(void *)); + memset(tp->tx_skb, 0x0, DESC_ARRAY * NUM_ARRAYS_MIN); + memset(tp->Rx_databuff, 0x0, DESC_ARRAY * NUM_ARRAYS_MIN); return rtl8169_rx_fill(tp); } @@ -6749,7 +6753,7 @@ static void rtl8169_tx_clear_range(struct rtl8169_private *tp, u32 start, unsigned int i; for (i = 0; i < n; i++) { - unsigned int entry = (start + i) % NUM_TX_DESC; + unsigned int entry = (start + i) % NUM_ARRAYS_MAX; struct ring_info *tx_skb = tp->tx_skb + entry; unsigned int len = tx_skb->len; @@ -6769,7 +6773,7 @@ static void rtl8169_tx_clear_range(struct rtl8169_private *tp, u32 start, static void rtl8169_tx_clear(struct rtl8169_private *tp) { - rtl8169_tx_clear_range(tp, tp->dirty_tx, NUM_TX_DESC); + rtl8169_tx_clear_range(tp, tp->dirty_tx, NUM_ARRAYS_MAX); tp->cur_tx = tp->dirty_tx = 0; } @@ -6784,7 +6788,7 @@ static void rtl_reset_work(struct rtl8169_private *tp) rtl8169_hw_reset(tp); - for (i = 0; i < NUM_RX_DESC; i++) + for (i = 0; i < NUM_ARRAYS_MAX; i++) rtl8169_mark_to_asic(tp->RxDescArray + i, rx_buf_sz); rtl8169_tx_clear(tp); @@ -6818,7 +6822,7 @@ static int rtl8169_xmit_frags(struct rtl8169_private *tp, struct sk_buff *skb, u32 status, len; void *addr; - entry = (entry + 1) % NUM_TX_DESC; + entry = (entry + 1) % NUM_ARRAYS_MAX; txd = tp->TxDescArray + entry; len = skb_frag_size(frag); @@ -6833,7 +6837,7 @@ static int rtl8169_xmit_frags(struct rtl8169_private *tp, struct sk_buff *skb, /* Anti gcc 2.95.3 bugware (sic) */ status = opts[0] | len | - (RingEnd * !((entry + 1) % NUM_TX_DESC)); + (RingEnd * !((entry + 1) % NUM_ARRAYS_MAX)); txd->opts1 = cpu_to_le32(status); txd->opts2 = cpu_to_le32(opts[1]); @@ -7039,7 +7043,7 @@ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb, struct net_device *dev) { struct rtl8169_private *tp = netdev_priv(dev); - unsigned int entry = tp->cur_tx % NUM_TX_DESC; + unsigned int entry = tp->cur_tx % NUM_ARRAYS_MAX; struct TxDesc *txd = tp->TxDescArray + entry; void __iomem *ioaddr = tp->mmio_addr; struct device *d = &tp->pci_dev->dev; @@ -7093,7 +7097,7 @@ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb, dma_wmb(); /* Anti gcc 2.95.3 bugware (sic) */ - status = opts[0] | len | (RingEnd * !((entry + 1) % NUM_TX_DESC)); + status = opts[0] | len | (RingEnd * !((entry + 1) % NUM_ARRAYS_MAX)); txd->opts1 = cpu_to_le32(status); /* Force all memory writes to complete before notifying device */ @@ -7194,7 +7198,7 @@ static void rtl_tx(struct net_device *dev, struct rtl8169_private *tp) tx_left = tp->cur_tx - dirty_tx; while (tx_left > 0) { - unsigned int entry = dirty_tx % NUM_TX_DESC; + unsigned int entry = dirty_tx % NUM_ARRAYS_MAX; struct ring_info *tx_skb = tp->tx_skb + entry; u32 status; @@ -7292,8 +7296,8 @@ static int rtl_rx(struct net_device *dev, struct rtl8169_private *tp, u32 budget cur_rx = tp->cur_rx; - for (rx_left = min(budget, NUM_RX_DESC); rx_left > 0; rx_left--, cur_rx++) { - unsigned int entry = cur_rx % NUM_RX_DESC; + for (rx_left = min(budget, NUM_ARRAYS_MAX); rx_left > 0; rx_left--, cur_rx++) { + unsigned int entry = cur_rx % NUM_ARRAYS_MAX; struct RxDesc *desc = tp->RxDescArray + entry; u32 status; @@ -7555,9 +7559,9 @@ static int rtl8169_close(struct net_device *dev) free_irq(pdev->irq, dev); - dma_free_coherent(&pdev->dev, R8169_RX_RING_BYTES, tp->RxDescArray, + dma_free_coherent(&pdev->dev, (DESC_ARRAY * NUM_ARRAYS_MAX) , tp->RxDescArray, tp->RxPhyAddr); - dma_free_coherent(&pdev->dev, R8169_TX_RING_BYTES, tp->TxDescArray, + dma_free_coherent(&pdev->dev, (DESC_ARRAY * NUM_ARRAYS_MAX), tp->TxDescArray, tp->TxPhyAddr); tp->TxDescArray = NULL; tp->RxDescArray = NULL; @@ -7589,12 +7593,12 @@ static int rtl_open(struct net_device *dev) * Rx and Tx descriptors needs 256 bytes alignment. * dma_alloc_coherent provides more. */ - tp->TxDescArray = dma_zalloc_coherent(&pdev->dev, R8169_TX_RING_BYTES, + tp->TxDescArray = dma_zalloc_coherent(&pdev->dev, (DESC_ARRAY * NUM_ARRAYS_MAX), &tp->TxPhyAddr, GFP_KERNEL); if (!tp->TxDescArray) goto err_pm_runtime_put; - tp->RxDescArray = dma_alloc_coherent(&pdev->dev, R8169_RX_RING_BYTES, + tp->RxDescArray = dma_alloc_coherent(&pdev->dev, (DESC_ARRAY * NUM_ARRAYS_MAX), &tp->RxPhyAddr, GFP_KERNEL); if (!tp->RxDescArray) goto err_free_tx_0; @@ -7644,11 +7648,11 @@ err_release_fw_2: rtl_release_firmware(tp); rtl8169_rx_clear(tp); err_free_rx_1: - dma_free_coherent(&pdev->dev, R8169_RX_RING_BYTES, tp->RxDescArray, + dma_free_coherent(&pdev->dev, (DESC_ARRAY * NUM_ARRAYS_MAX), tp->RxDescArray, tp->RxPhyAddr); tp->RxDescArray = NULL; err_free_tx_0: - dma_free_coherent(&pdev->dev, R8169_TX_RING_BYTES, tp->TxDescArray, + dma_free_coherent(&pdev->dev, (DESC_ARRAY * NUM_ARRAYS_MAX), tp->TxDescArray, tp->TxPhyAddr); tp->TxDescArray = NULL; err_pm_runtime_put: -- 2.1.4 -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html