altera_tse: Add support for dedicated descriptor memory
authorJoachim Foerster <joachim.foerster@missinglinkelectronics.com>
Mon, 17 Oct 2011 05:24:44 +0000 (05:24 +0000)
committerWolfgang Denk <wd@denx.de>
Wed, 26 Oct 2011 19:27:37 +0000 (21:27 +0200)
Signed-off-by: Joachim Foerster <joachim.foerster@missinglinkelectronics.com>
board/altera/nios2-generic/nios2-generic.c
drivers/net/altera_tse.c
include/netdev.h

index 220a4c44a4d191c713b6970e9f48448f1a115b0d..49ef80de96dd36b494b960f8aa7c42908d10c979 100644 (file)
@@ -74,7 +74,15 @@ int board_eth_init(bd_t *bis)
        rc += altera_tse_initialize(0,
                                    CONFIG_SYS_ALTERA_TSE_MAC_BASE,
                                    CONFIG_SYS_ALTERA_TSE_SGDMA_RX_BASE,
-                                   CONFIG_SYS_ALTERA_TSE_SGDMA_TX_BASE);
+                                   CONFIG_SYS_ALTERA_TSE_SGDMA_TX_BASE,
+#if defined(CONFIG_SYS_ALTERA_TSE_SGDMA_DESC_BASE) && \
+       (CONFIG_SYS_ALTERA_TSE_SGDMA_DESC_SIZE > 0)
+                                   CONFIG_SYS_ALTERA_TSE_SGDMA_DESC_BASE,
+                                   CONFIG_SYS_ALTERA_TSE_SGDMA_DESC_SIZE);
+#else
+                                   0,
+                                   0);
+#endif
 #endif
 #ifdef CONFIG_ETHOC
        rc += ethoc_initialize(0, CONFIG_SYS_ETHOC_BASE);
index 47b57616d91051877bae969618fde724a1e6455c..afd8e3126c4020069100c50060f9343408792df2 100644 (file)
@@ -882,7 +882,8 @@ static int tse_eth_init(struct eth_device *dev, bd_t * bd)
 
 /* TSE init code */
 int altera_tse_initialize(u8 dev_num, int mac_base,
-                         int sgdma_rx_base, int sgdma_tx_base)
+                         int sgdma_rx_base, int sgdma_tx_base,
+                         u32 sgdma_desc_base, u32 sgdma_desc_size)
 {
        struct altera_tse_priv *priv;
        struct eth_device *dev;
@@ -903,8 +904,20 @@ int altera_tse_initialize(u8 dev_num, int mac_base,
                free(dev);
                return 0;
        }
-       tx_desc = dma_alloc_coherent(sizeof(*tx_desc) * (3 + PKTBUFSRX),
-                                    &dma_handle);
+       if (sgdma_desc_size) {
+               if (sgdma_desc_size < (sizeof(*tx_desc) * (3 + PKTBUFSRX))) {
+                       printf("ALTERA_TSE-%hu: "
+                              "descriptor memory is too small\n", dev_num);
+                       free(priv);
+                       free(dev);
+                       return 0;
+               }
+               tx_desc = (struct alt_sgdma_descriptor *)sgdma_desc_base;
+       } else {
+               tx_desc = dma_alloc_coherent(sizeof(*tx_desc) * (3 + PKTBUFSRX),
+                                            &dma_handle);
+       }
+
        rx_desc = tx_desc + 2;
        debug("tx desc: address = 0x%x\n", (unsigned int)tx_desc);
        debug("rx desc: address = 0x%x\n", (unsigned int)rx_desc);
index 54b52a51df27e01c16c0dd25d589508b17c11e9b..04d9f75b771d36b422539523285a20520cf9dc8d 100644 (file)
@@ -42,7 +42,8 @@ int cpu_eth_init(bd_t *bis);
 
 /* Driver initialization prototypes */
 int altera_tse_initialize(u8 dev_num, int mac_base,
-                         int sgdma_rx_base, int sgdma_tx_base);
+                         int sgdma_rx_base, int sgdma_tx_base,
+                         u32 sgdma_desc_base, u32 sgdma_desc_size);
 int at91emac_register(bd_t *bis, unsigned long iobase);
 int au1x00_enet_initialize(bd_t*);
 int ax88180_initialize(bd_t *bis);