|
@@ -277,23 +277,41 @@ struct RxDesc {
|
|
|
u32 buf_Haddr;
|
|
|
};
|
|
|
|
|
|
-/* Define the TX Descriptor */
|
|
|
-static u8 tx_ring[NUM_TX_DESC * sizeof(struct TxDesc) + 256];
|
|
|
-/* __attribute__ ((aligned(256))); */
|
|
|
+#define RTL8169_DESC_SIZE 16
|
|
|
|
|
|
-/* Create a static buffer of size RX_BUF_SZ for each
|
|
|
-TX Descriptor. All descriptors point to a
|
|
|
-part of this buffer */
|
|
|
-static unsigned char txb[NUM_TX_DESC * RX_BUF_SIZE];
|
|
|
+#if ARCH_DMA_MINALIGN > 256
|
|
|
+# define RTL8169_ALIGN ARCH_DMA_MINALIGN
|
|
|
+#else
|
|
|
+# define RTL8169_ALIGN 256
|
|
|
+#endif
|
|
|
+
|
|
|
+/*
|
|
|
+ * Warn if the cache-line size is larger than the descriptor size. In such
|
|
|
+ * cases the driver will likely fail because the CPU needs to flush the cache
|
|
|
+ * when requeuing RX buffers, therefore descriptors written by the hardware
|
|
|
+ * may be discarded.
|
|
|
+ */
|
|
|
+#if RTL8169_DESC_SIZE < ARCH_DMA_MINALIGN
|
|
|
+#warning cache-line size is larger than descriptor size
|
|
|
+#endif
|
|
|
+
|
|
|
+/* Define the TX Descriptor */
|
|
|
+DEFINE_ALIGN_BUFFER(struct TxDesc, tx_ring, NUM_TX_DESC, RTL8169_ALIGN);
|
|
|
|
|
|
/* Define the RX Descriptor */
|
|
|
-static u8 rx_ring[NUM_RX_DESC * sizeof(struct TxDesc) + 256];
|
|
|
- /* __attribute__ ((aligned(256))); */
|
|
|
+DEFINE_ALIGN_BUFFER(struct RxDesc, rx_ring, NUM_RX_DESC, RTL8169_ALIGN);
|
|
|
|
|
|
-/* Create a static buffer of size RX_BUF_SZ for each
|
|
|
-RX Descriptor All descriptors point to a
|
|
|
-part of this buffer */
|
|
|
-static unsigned char rxb[NUM_RX_DESC * RX_BUF_SIZE];
|
|
|
+/*
|
|
|
+ * Create a static buffer of size RX_BUF_SZ for each TX Descriptor. All
|
|
|
+ * descriptors point to a part of this buffer.
|
|
|
+ */
|
|
|
+DEFINE_ALIGN_BUFFER(u8, txb, NUM_TX_DESC * RX_BUF_SIZE, RTL8169_ALIGN);
|
|
|
+
|
|
|
+/*
|
|
|
+ * Create a static buffer of size RX_BUF_SZ for each RX Descriptor. All
|
|
|
+ * descriptors point to a part of this buffer.
|
|
|
+ */
|
|
|
+DEFINE_ALIGN_BUFFER(u8, rxb, NUM_RX_DESC * RX_BUF_SIZE, RTL8169_ALIGN);
|
|
|
|
|
|
struct rtl8169_private {
|
|
|
void *mmio_addr; /* memory map physical address */
|
|
@@ -301,8 +319,6 @@ struct rtl8169_private {
|
|
|
unsigned long cur_rx; /* Index into the Rx descriptor buffer of next Rx pkt. */
|
|
|
unsigned long cur_tx; /* Index into the Tx descriptor buffer of next Rx pkt. */
|
|
|
unsigned long dirty_tx;
|
|
|
- unsigned char *TxDescArrays; /* Index of Tx Descriptor buffer */
|
|
|
- unsigned char *RxDescArrays; /* Index of Rx Descriptor buffer */
|
|
|
struct TxDesc *TxDescArray; /* Index of 256-alignment Tx Descriptor buffer */
|
|
|
struct RxDesc *RxDescArray; /* Index of 256-alignment Rx Descriptor buffer */
|
|
|
unsigned char *RxBufferRings; /* Index of Rx Buffer */
|
|
@@ -711,16 +727,6 @@ static int rtl_reset(struct eth_device *dev, bd_t *bis)
|
|
|
printf ("%s\n", __FUNCTION__);
|
|
|
#endif
|
|
|
|
|
|
- tpc->TxDescArrays = tx_ring;
|
|
|
- /* Tx Desscriptor needs 256 bytes alignment; */
|
|
|
- tpc->TxDescArray = (struct TxDesc *) ((unsigned long)(tpc->TxDescArrays +
|
|
|
- 255) & ~255);
|
|
|
-
|
|
|
- tpc->RxDescArrays = rx_ring;
|
|
|
- /* Rx Desscriptor needs 256 bytes alignment; */
|
|
|
- tpc->RxDescArray = (struct RxDesc *) ((unsigned long)(tpc->RxDescArrays +
|
|
|
- 255) & ~255);
|
|
|
-
|
|
|
rtl8169_init_ring(dev);
|
|
|
rtl8169_hw_start(dev);
|
|
|
/* Construct a perfect filter frame with the mac address as first match
|
|
@@ -762,10 +768,6 @@ static void rtl_halt(struct eth_device *dev)
|
|
|
|
|
|
RTL_W32(RxMissed, 0);
|
|
|
|
|
|
- tpc->TxDescArrays = NULL;
|
|
|
- tpc->RxDescArrays = NULL;
|
|
|
- tpc->TxDescArray = NULL;
|
|
|
- tpc->RxDescArray = NULL;
|
|
|
for (i = 0; i < NUM_RX_DESC; i++) {
|
|
|
tpc->RxBufferRing[i] = NULL;
|
|
|
}
|
|
@@ -910,6 +912,9 @@ static int rtl_init(struct eth_device *dev, bd_t *bis)
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
+ tpc->TxDescArray = tx_ring;
|
|
|
+ tpc->RxDescArray = rx_ring;
|
|
|
+
|
|
|
return 1;
|
|
|
}
|
|
|
|