summaryrefslogtreecommitdiffstats
path: root/sys/mips/nlm/dev/net/nae.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/mips/nlm/dev/net/nae.c')
-rw-r--r--sys/mips/nlm/dev/net/nae.c142
1 files changed, 36 insertions, 106 deletions
diff --git a/sys/mips/nlm/dev/net/nae.c b/sys/mips/nlm/dev/net/nae.c
index d97b290..9f06372 100644
--- a/sys/mips/nlm/dev/net/nae.c
+++ b/sys/mips/nlm/dev/net/nae.c
@@ -59,31 +59,17 @@ nlm_nae_flush_free_fifo(uint64_t nae_base, int nblocks)
}
void
-nlm_program_nae_parser_seq_fifo(uint64_t nae_base, int nblock,
+nlm_program_nae_parser_seq_fifo(uint64_t nae_base, int maxports,
struct nae_port_config *cfg)
{
uint32_t val;
- int start = 0, size, i, j;
-
- for (i = 0; i < nblock; i++) {
- for (j = 0; j < PORTS_PER_CMPLX; j++) {
- if ((i == 4) && (j > 1))
- size = 0;
- else
- size = cfg[(i*4)+j].pseq_fifo_size;
- start += size;
- }
- }
-
- for (j = 0; j < PORTS_PER_CMPLX; j++) {
- if ((i == 4) && (j > 1))
- size = 0;
- else
- size = cfg[(i*4)+j].pseq_fifo_size;
+ int start = 0, size, i;
+ for (i = 0; i < maxports; i++) {
+ size = cfg[i].pseq_fifo_size;
val = (((size & 0x1fff) << 17) |
((start & 0xfff) << 5) |
- (((i * 4) + j) & 0x1f));
+ (i & 0x1f));
nlm_write_nae_reg(nae_base, NAE_PARSER_SEQ_FIFO_CFG, val);
start += size;
}
@@ -255,105 +241,66 @@ nlm_setup_flow_crc_poly(uint64_t nae_base, uint32_t poly)
}
void
-nlm_setup_iface_fifo_cfg(uint64_t nae_base, int nblock,
+nlm_setup_iface_fifo_cfg(uint64_t nae_base, int maxports,
struct nae_port_config *cfg)
{
uint32_t reg;
int fifo_xoff_thresh = 12;
- int i, size, j;
+ int i, size;
int cur_iface_start = 0;
- for (i = 0; i < nblock; i++) {
- for (j = 0; j < PORTS_PER_CMPLX; j++) {
- if ((i == 4) && (j > 1))
- size = 0;
- else
- size = cfg[(i*4)+j].iface_fifo_size;
- cur_iface_start += size;
- }
- }
-
- for (j = 0; j < PORTS_PER_CMPLX; j++) {
- if ((i == 4) && (j > 1))
- size = 0;
- else
- size = cfg[(i*4)+j].iface_fifo_size;
+ for (i = 0; i < maxports; i++) {
+ size = cfg[i].iface_fifo_size;
reg = ((fifo_xoff_thresh << 25) |
((size & 0x1ff) << 16) |
((cur_iface_start & 0xff) << 8) |
- (((i * 4) + j) & 0x1f));
+ (i & 0x1f));
nlm_write_nae_reg(nae_base, NAE_IFACE_FIFO_CFG, reg);
cur_iface_start += size;
}
}
void
-nlm_setup_rx_base_config(uint64_t nae_base, int nblock,
+nlm_setup_rx_base_config(uint64_t nae_base, int maxports,
struct nae_port_config *cfg)
{
- uint32_t val, nc;
int base = 0;
- int i, j;
+ uint32_t val;
+ int i;
int id;
- for (i = 0; i < nblock; i++) {
- for (j = 0; j < (PORTS_PER_CMPLX/2); j++) {
- base += cfg[(i*4)+(2*j)].num_channels;
- base += cfg[(i*4)+(2*j + 1)].num_channels;
- }
- }
-
- id = 0x12 + (i * 2); /* RX_IF_BASE_CONFIG0 */
+ for (i = 0; i < (maxports/2); i++) {
+ id = 0x12 + i; /* RX_IF_BASE_CONFIG0 */
- for (j = 0; j < (PORTS_PER_CMPLX/2); j++) {
val = (base & 0x3ff);
- nc = cfg[(i*4)+(2*j)].num_channels;
- base += nc;
+ base += cfg[(i * 2)].num_channels;
val |= ((base & 0x3ff) << 16);
- nc = cfg[(i*4)+(2*j + 1)].num_channels;
- base += nc;
+ base += cfg[(i * 2) + 1].num_channels;
- nlm_write_nae_reg(nae_base, NAE_REG(7, 0, (id+j)), val);
+ nlm_write_nae_reg(nae_base, NAE_REG(7, 0, id), val);
}
}
void
-nlm_setup_rx_buf_config(uint64_t nae_base, int nblock,
+nlm_setup_rx_buf_config(uint64_t nae_base, int maxports,
struct nae_port_config *cfg)
{
uint32_t val;
- int i, sz, j, k;
+ int i, sz, k;
int context = 0;
int base = 0;
- int nc = 0;
- for (i = 0; i < nblock; i++) {
- for (j = 0; j < PORTS_PER_CMPLX; j++) {
- if ((i == 4) && (j > 1))
- nc = 0;
- else
- nc = cfg[(i*4)+j].num_channels;
- for (k = 0; k < nc; k++) {
- sz = cfg[(i*4)+j].rxbuf_size;
- base += sz;
- }
- context += nc;
- }
- }
-
- for (j = 0; j < PORTS_PER_CMPLX; j++) {
- if ((i == 4) && (j > 1))
- nc = 0;
- else
- nc = cfg[(i*4)+j].num_channels;
- for (k = 0; k < nc; k++) {
+ for (i = 0; i < maxports; i++) {
+ if (cfg[i].type == UNKNOWN)
+ continue;
+ for (k = 0; k < cfg[i].num_channels; k++) {
/* write index (context num) */
nlm_write_nae_reg(nae_base, NAE_RXBUF_BASE_DPTH_ADDR,
(context+k));
/* write value (rx buf sizes) */
- sz = cfg[(i*4)+j].rxbuf_size;
+ sz = cfg[i].rxbuf_size;
val = 0x80000000 | ((base << 2) & 0x3fff); /* base */
val |= (((sz << 2) & 0x3fff) << 16); /* size */
@@ -362,46 +309,29 @@ nlm_setup_rx_buf_config(uint64_t nae_base, int nblock,
(0x7fffffff & val));
base += sz;
}
- context += nc;
+ context += cfg[i].num_channels;
}
}
void
-nlm_setup_freein_fifo_cfg(uint64_t nae_base, int nblock,
- struct nae_port_config *cfg)
+nlm_setup_freein_fifo_cfg(uint64_t nae_base, struct nae_port_config *cfg)
{
- int size, i, cp = 0;
+ int size, i;
uint32_t reg;
- int start = 0;
-
- for (cp = 0 ; cp < nblock; cp++ ) {
- for (i = 0; i < PORTS_PER_CMPLX; i++) { /* 4 interfaces */
- if ((cp == 4) && (i > 1))
- size = 0;
- else {
- /* Each entry represents 2 descs; hence division by 2 */
- size = cfg[(cp*4)+i].num_free_descs / 2;
- }
- if (size == 0)
- size = 8;
- start += size;
- }
- }
+ int start = 0, maxbufpool;
- for (i = 0; i < PORTS_PER_CMPLX; i++) { /* 4 interfaces */
- if ((cp == 4) && (i > 1))
- size = 0;
- else {
- /* Each entry represents 2 descs; hence division by 2 */
- size = cfg[(cp*4)+i].num_free_descs / 2;
- }
+ if (nlm_is_xlp8xx())
+ maxbufpool = MAX_FREE_FIFO_POOL_8XX;
+ else
+ maxbufpool = MAX_FREE_FIFO_POOL_3XX;
+ for (i = 0; i < maxbufpool; i++) {
/* Each entry represents 2 descs; hence division by 2 */
+ size = (cfg[i].num_free_descs / 2);
if (size == 0)
size = 8;
-
reg = ((size & 0x3ff ) << 20) | /* fcSize */
((start & 0x1ff) << 8) | /* fcStart */
- (((cp * 4) + i) & 0x1f);
+ (i & 0x1f);
nlm_write_nae_reg(nae_base, NAE_FREE_IN_FIFO_CFG, reg);
start += size;
OpenPOWER on IntegriCloud