summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Hellstrom <daniel@gaisler.com>2019-04-26 15:18:11 +0200
committerDaniel Hellstrom <daniel@gaisler.com>2021-03-07 16:08:25 +0100
commitc13205f6916544c6f8bb2ade7ed5f2959ae6f173 (patch)
tree99cdd69b874307d62dd9b4d750c912d285bd673e
parent23cc5a6090a4610b96cc593e2d11a6b3c028b41a (diff)
downloadrtems-c13205f6916544c6f8bb2ade7ed5f2959ae6f173.tar.bz2
leon,greth: added support for variable sized descriptor table sizes
The descriptor table size is equal to its alignment and set when configuring the HW IP through VHDL generics. This SW patch simply probes the HW how large the RX/TX descriptor tables are and adjusts accordingly. The number of descriptors actual used are controlled by other settings (rxDescs and txDescs) controlled by the user. Update #4308.
-rw-r--r--bsps/include/grlib/greth.h1
-rw-r--r--bsps/shared/grlib/net/greth.c22
2 files changed, 16 insertions, 7 deletions
diff --git a/bsps/include/grlib/greth.h b/bsps/include/grlib/greth.h
index 1c42c99ddc..e7970a79f7 100644
--- a/bsps/include/grlib/greth.h
+++ b/bsps/include/grlib/greth.h
@@ -100,6 +100,7 @@ typedef struct _greth_regs {
#define GRETH_STATUS_TXIRQ 0x00000008 /* Transmit Error IRQ */
#define GRETH_STATUS_RXAHBERR 0x00000010 /* Receiver AHB Error */
#define GRETH_STATUS_TXAHBERR 0x00000020 /* Transmitter AHB Error */
+#define GRETH_STATUS_NRD 0x0f000000 /* Number of descriptors */
/* MDIO Control */
#define GRETH_MDIO_WRITE 0x00000001 /* MDIO Write */
diff --git a/bsps/shared/grlib/net/greth.c b/bsps/shared/grlib/net/greth.c
index bc4d3cc40f..09cfb325ba 100644
--- a/bsps/shared/grlib/net/greth.c
+++ b/bsps/shared/grlib/net/greth.c
@@ -186,6 +186,7 @@ struct greth_softc
unsigned int advmodes; /* advertise ethernet speed modes. 0 = all modes. */
struct timespec auto_neg_time;
int mc_available;
+ int num_descs;
/*
* Statistics
@@ -422,7 +423,7 @@ greth_initialize_hardware (struct greth_softc *sc)
int tmp2;
struct timespec tstart, tnow;
greth_regs *regs;
- unsigned int advmodes, speed;
+ unsigned int advmodes, speed, tabsize;
regs = sc->regs;
@@ -616,8 +617,9 @@ auto_neg_done:
/* Initialize rx/tx descriptor table pointers. Due to alignment we
* always allocate maximum table size.
*/
- sc->txdesc = (greth_rxtxdesc *) almalloc(0x800, 0x400);
- sc->rxdesc = (greth_rxtxdesc *) &sc->txdesc[128];
+ tabsize = sc->num_descs * 8;
+ sc->txdesc = (greth_rxtxdesc *) almalloc(tabsize * 2, tabsize);
+ sc->rxdesc = (greth_rxtxdesc *) (tabsize + (void *)sc->txdesc);
sc->tx_ptr = 0;
sc->tx_dptr = 0;
sc->tx_cnt = 0;
@@ -631,8 +633,8 @@ auto_neg_done:
CPUMEM_TO_DMA,
(void *)sc->txdesc,
(void **)&sc->txdesc_remote,
- 0x800);
- sc->rxdesc_remote = sc->txdesc_remote + 0x400;
+ tabsize * 2);
+ sc->rxdesc_remote = sc->txdesc_remote + tabsize;
regs->txdesc = (int) sc->txdesc_remote;
regs->rxdesc = (int) sc->rxdesc_remote;
@@ -1555,6 +1557,7 @@ int greth_device_init(struct greth_softc *sc)
struct ambapp_core *pnpinfo;
union drvmgr_key_value *value;
unsigned int speed;
+ int i, nrd;
/* Get device information from AMBA PnP information */
ambadev = (struct amba_dev_info *)sc->dev->businfo;
@@ -1608,12 +1611,17 @@ int greth_device_init(struct greth_softc *sc)
sc->rxbufs = 32;
sc->phyaddr = -1;
+ /* Probe the number of descriptors available the */
+ nrd = (sc->regs->status & GRETH_STATUS_NRD) >> 24;
+ for (sc->num_descs = 128, i = 0; i < nrd; i++)
+ sc->num_descs = sc->num_descs * 2;
+
value = drvmgr_dev_key_get(sc->dev, "txDescs", DRVMGR_KT_INT);
- if ( value && (value->i <= 128) )
+ if ( value && (value->i <= sc->num_descs) )
sc->txbufs = value->i;
value = drvmgr_dev_key_get(sc->dev, "rxDescs", DRVMGR_KT_INT);
- if ( value && (value->i <= 128) )
+ if ( value && (value->i <= sc->num_descs) )
sc->rxbufs = value->i;
value = drvmgr_dev_key_get(sc->dev, "phyAdr", DRVMGR_KT_INT);