summaryrefslogtreecommitdiffstats
path: root/sys/dev/cxgb/common/cxgb_vsc7323.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/cxgb/common/cxgb_vsc7323.c')
-rw-r--r--sys/dev/cxgb/common/cxgb_vsc7323.c34
1 files changed, 26 insertions, 8 deletions
diff --git a/sys/dev/cxgb/common/cxgb_vsc7323.c b/sys/dev/cxgb/common/cxgb_vsc7323.c
index 4efd24e..ded8261 100644
--- a/sys/dev/cxgb/common/cxgb_vsc7323.c
+++ b/sys/dev/cxgb/common/cxgb_vsc7323.c
@@ -43,6 +43,11 @@ enum {
ELMR_DATA_LO = 2,
ELMR_DATA_HI = 3,
+ ELMR_THRES0 = 0xe000,
+ ELMR_BW = 0xe00c,
+ ELMR_FIFO_SZ = 0xe00d,
+ ELMR_STATS = 0xf000,
+
ELMR_MDIO_ADDR = 10
};
@@ -74,7 +79,7 @@ static int elmr_write(adapter_t *adap, int addr, u32 val)
int t3_elmr_blk_read(adapter_t *adap, int start, u32 *vals, int n)
{
- int ret;
+ int i, ret;
unsigned int v;
const struct mdio_ops *mo = adapter_info(adap)->mdio_ops;
@@ -83,9 +88,15 @@ int t3_elmr_blk_read(adapter_t *adap, int start, u32 *vals, int n)
ret = mo->write(adap, ELMR_MDIO_ADDR, 0, ELMR_ADDR, start);
if (ret)
goto out;
- ret = mo->read(adap, ELMR_MDIO_ADDR, 0, ELMR_STAT, &v);
- if (ret)
- goto out;
+
+ for (i = 0; i < 5; i++) {
+ ret = mo->read(adap, ELMR_MDIO_ADDR, 0, ELMR_STAT, &v);
+ if (ret)
+ goto out;
+ if (v == 1)
+ break;
+ udelay(5);
+ }
if (v != 1) {
ret = -ETIMEDOUT;
goto out;
@@ -148,7 +159,7 @@ int t3_vsc7323_init(adapter_t *adap, int nports)
(ret = elmr_write(adap, VSC_REG(2, 0, 0x10 + i),
((ing_bot + ing_step) << 16) | ing_bot)) ||
(ret = elmr_write(adap, VSC_REG(2, 0, 0x40 + i),
- 0x6000a00)) ||
+ 0x6000bc0)) ||
(ret = elmr_write(adap, VSC_REG(2, 0, 0x50 + i), 1)) ||
(ret = elmr_write(adap, VSC_REG(2, 1, 0x10 + i),
((egr_bot + egr_step) << 16) | egr_bot)) ||
@@ -175,8 +186,13 @@ int t3_vsc7323_init(adapter_t *adap, int nports)
(ret = elmr_write(adap, VSC_REG(1, i, 5),
(i << 12) | 0x63)) ||
(ret = elmr_write(adap, VSC_REG(1, i, 0xb), 0x96)) ||
- (ret = elmr_write(adap, VSC_REG(1, i, 0x15), 0x21)))
+ (ret = elmr_write(adap, VSC_REG(1, i, 0x15), 0x21)) ||
+ (ret = elmr_write(adap, ELMR_THRES0 + i, 768)))
return ret;
+
+ if ((ret = elmr_write(adap, ELMR_BW, 7)))
+ return ret;
+
return ret;
}
@@ -269,6 +285,8 @@ int t3_vsc7323_disable(adapter_t *adap, int port, int which)
#define NSTATS0 (0x1d - STATS0_START + 1)
#define NSTATS1 (0x2a - STATS1_START + 1)
+#define ELMR_STAT(port, reg) (ELMR_STATS + port * 0x40 + reg)
+
const struct mac_stats *t3_vsc7323_update_stats(struct cmac *mac)
{
int ret;
@@ -276,11 +294,11 @@ const struct mac_stats *t3_vsc7323_update_stats(struct cmac *mac)
u32 stats0[NSTATS0], stats1[NSTATS1];
ret = t3_elmr_blk_read(mac->adapter,
- VSC_REG(4, mac->ext_port, STATS0_START),
+ ELMR_STAT(mac->ext_port, STATS0_START),
stats0, NSTATS0);
if (!ret)
ret = t3_elmr_blk_read(mac->adapter,
- VSC_REG(4, mac->ext_port, STATS1_START),
+ ELMR_STAT(mac->ext_port, STATS1_START),
stats1, NSTATS1);
if (ret)
goto out;
OpenPOWER on IntegriCloud