summaryrefslogtreecommitdiffstats
path: root/bsps/shared/grlib/net/greth.c
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 /bsps/shared/grlib/net/greth.c
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.
Diffstat (limited to 'bsps/shared/grlib/net/greth.c')
-rw-r--r--bsps/shared/grlib/net/greth.c22
1 files changed, 15 insertions, 7 deletions
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);