|
@@ -62,7 +62,7 @@ int t3_wait_op_done_val(struct adapter *adapter, int reg, u32 mask,
|
|
|
return 0;
|
|
|
}
|
|
|
if (--attempts == 0)
|
|
|
- return -EAGAIN;
|
|
|
+ return -EAGAIN;
|
|
|
if (delay)
|
|
|
udelay(delay);
|
|
|
}
|
|
@@ -1263,7 +1263,13 @@ static int t3_handle_intr_status(struct adapter *adapter, unsigned int reg,
|
|
|
return fatal;
|
|
|
}
|
|
|
|
|
|
-#define SGE_INTR_MASK (F_RSPQDISABLED)
|
|
|
+#define SGE_INTR_MASK (F_RSPQDISABLED | \
|
|
|
+ F_UC_REQ_FRAMINGERROR | F_R_REQ_FRAMINGERROR | \
|
|
|
+ F_CPPARITYERROR | F_OCPARITYERROR | F_RCPARITYERROR | \
|
|
|
+ F_IRPARITYERROR | V_ITPARITYERROR(M_ITPARITYERROR) | \
|
|
|
+ V_FLPARITYERROR(M_FLPARITYERROR) | F_LODRBPARITYERROR | \
|
|
|
+ F_HIDRBPARITYERROR | F_LORCQPARITYERROR | \
|
|
|
+ F_HIRCQPARITYERROR)
|
|
|
#define MC5_INTR_MASK (F_PARITYERR | F_ACTRGNFULL | F_UNKNOWNCMD | \
|
|
|
F_REQQPARERR | F_DISPQPARERR | F_DELACTEMPTY | \
|
|
|
F_NFASRCHFAIL)
|
|
@@ -1280,16 +1286,23 @@ static int t3_handle_intr_status(struct adapter *adapter, unsigned int reg,
|
|
|
#define PCIE_INTR_MASK (F_UNXSPLCPLERRR | F_UNXSPLCPLERRC | F_PCIE_PIOPARERR |\
|
|
|
F_PCIE_WFPARERR | F_PCIE_RFPARERR | F_PCIE_CFPARERR | \
|
|
|
/* V_PCIE_MSIXPARERR(M_PCIE_MSIXPARERR) | */ \
|
|
|
- V_BISTERR(M_BISTERR))
|
|
|
-#define ULPRX_INTR_MASK F_PARERR
|
|
|
-#define ULPTX_INTR_MASK 0
|
|
|
-#define CPLSW_INTR_MASK (F_TP_FRAMING_ERROR | \
|
|
|
+ F_RETRYBUFPARERR | F_RETRYLUTPARERR | F_RXPARERR | \
|
|
|
+ F_TXPARERR | V_BISTERR(M_BISTERR))
|
|
|
+#define ULPRX_INTR_MASK (F_PARERRDATA | F_PARERRPCMD | F_ARBPF1PERR | \
|
|
|
+ F_ARBPF0PERR | F_ARBFPERR | F_PCMDMUXPERR | \
|
|
|
+ F_DATASELFRAMEERR1 | F_DATASELFRAMEERR0)
|
|
|
+#define ULPTX_INTR_MASK 0xfc
|
|
|
+#define CPLSW_INTR_MASK (F_CIM_OP_MAP_PERR | F_TP_FRAMING_ERROR | \
|
|
|
F_SGE_FRAMING_ERROR | F_CIM_FRAMING_ERROR | \
|
|
|
F_ZERO_SWITCH_ERROR)
|
|
|
#define CIM_INTR_MASK (F_BLKWRPLINT | F_BLKRDPLINT | F_BLKWRCTLINT | \
|
|
|
F_BLKRDCTLINT | F_BLKWRFLASHINT | F_BLKRDFLASHINT | \
|
|
|
F_SGLWRFLASHINT | F_WRBLKFLASHINT | F_BLKWRBOOTINT | \
|
|
|
- F_FLASHRANGEINT | F_SDRAMRANGEINT | F_RSVDSPACEINT)
|
|
|
+ F_FLASHRANGEINT | F_SDRAMRANGEINT | F_RSVDSPACEINT | \
|
|
|
+ F_DRAMPARERR | F_ICACHEPARERR | F_DCACHEPARERR | \
|
|
|
+ F_OBQSGEPARERR | F_OBQULPHIPARERR | F_OBQULPLOPARERR | \
|
|
|
+ F_IBQSGELOPARERR | F_IBQSGEHIPARERR | F_IBQULPPARERR | \
|
|
|
+ F_IBQTPPARERR | F_ITAGPARERR | F_DTAGPARERR)
|
|
|
#define PMTX_INTR_MASK (F_ZERO_C_CMD_ERROR | ICSPI_FRM_ERR | OESPI_FRM_ERR | \
|
|
|
V_ICSPI_PAR_ERROR(M_ICSPI_PAR_ERROR) | \
|
|
|
V_OESPI_PAR_ERROR(M_OESPI_PAR_ERROR))
|
|
@@ -1358,6 +1371,10 @@ static void pcie_intr_handler(struct adapter *adapter)
|
|
|
{F_PCIE_CFPARERR, "PCI command FIFO parity error", -1, 1},
|
|
|
{V_PCIE_MSIXPARERR(M_PCIE_MSIXPARERR),
|
|
|
"PCI MSI-X table/PBA parity error", -1, 1},
|
|
|
+ {F_RETRYBUFPARERR, "PCI retry buffer parity error", -1, 1},
|
|
|
+ {F_RETRYLUTPARERR, "PCI retry LUT parity error", -1, 1},
|
|
|
+ {F_RXPARERR, "PCI Rx parity error", -1, 1},
|
|
|
+ {F_TXPARERR, "PCI Tx parity error", -1, 1},
|
|
|
{V_BISTERR(M_BISTERR), "PCI BIST error", -1, 1},
|
|
|
{0}
|
|
|
};
|
|
@@ -1384,15 +1401,15 @@ static void tp_intr_handler(struct adapter *adapter)
|
|
|
};
|
|
|
|
|
|
static struct intr_info tp_intr_info_t3c[] = {
|
|
|
- { 0x1ffffff, "TP parity error", -1, 1 },
|
|
|
- { F_FLMRXFLSTEMPTY, "TP out of Rx pages", -1, 1 },
|
|
|
- { F_FLMTXFLSTEMPTY, "TP out of Tx pages", -1, 1 },
|
|
|
- { 0 }
|
|
|
+ {0x1fffffff, "TP parity error", -1, 1},
|
|
|
+ {F_FLMRXFLSTEMPTY, "TP out of Rx pages", -1, 1},
|
|
|
+ {F_FLMTXFLSTEMPTY, "TP out of Tx pages", -1, 1},
|
|
|
+ {0}
|
|
|
};
|
|
|
|
|
|
if (t3_handle_intr_status(adapter, A_TP_INT_CAUSE, 0xffffffff,
|
|
|
adapter->params.rev < T3_REV_C ?
|
|
|
- tp_intr_info : tp_intr_info_t3c, NULL))
|
|
|
+ tp_intr_info : tp_intr_info_t3c, NULL))
|
|
|
t3_fatal_err(adapter);
|
|
|
}
|
|
|
|
|
@@ -1414,6 +1431,18 @@ static void cim_intr_handler(struct adapter *adapter)
|
|
|
{F_BLKWRCTLINT, "CIM block write to CTL space", -1, 1},
|
|
|
{F_BLKRDPLINT, "CIM block read from PL space", -1, 1},
|
|
|
{F_BLKWRPLINT, "CIM block write to PL space", -1, 1},
|
|
|
+ {F_DRAMPARERR, "CIM DRAM parity error", -1, 1},
|
|
|
+ {F_ICACHEPARERR, "CIM icache parity error", -1, 1},
|
|
|
+ {F_DCACHEPARERR, "CIM dcache parity error", -1, 1},
|
|
|
+ {F_OBQSGEPARERR, "CIM OBQ SGE parity error", -1, 1},
|
|
|
+ {F_OBQULPHIPARERR, "CIM OBQ ULPHI parity error", -1, 1},
|
|
|
+ {F_OBQULPLOPARERR, "CIM OBQ ULPLO parity error", -1, 1},
|
|
|
+ {F_IBQSGELOPARERR, "CIM IBQ SGELO parity error", -1, 1},
|
|
|
+ {F_IBQSGEHIPARERR, "CIM IBQ SGEHI parity error", -1, 1},
|
|
|
+ {F_IBQULPPARERR, "CIM IBQ ULP parity error", -1, 1},
|
|
|
+ {F_IBQTPPARERR, "CIM IBQ TP parity error", -1, 1},
|
|
|
+ {F_ITAGPARERR, "CIM itag parity error", -1, 1},
|
|
|
+ {F_DTAGPARERR, "CIM dtag parity error", -1, 1},
|
|
|
{0}
|
|
|
};
|
|
|
|
|
@@ -1428,7 +1457,14 @@ static void cim_intr_handler(struct adapter *adapter)
|
|
|
static void ulprx_intr_handler(struct adapter *adapter)
|
|
|
{
|
|
|
static const struct intr_info ulprx_intr_info[] = {
|
|
|
- {F_PARERR, "ULP RX parity error", -1, 1},
|
|
|
+ {F_PARERRDATA, "ULP RX data parity error", -1, 1},
|
|
|
+ {F_PARERRPCMD, "ULP RX command parity error", -1, 1},
|
|
|
+ {F_ARBPF1PERR, "ULP RX ArbPF1 parity error", -1, 1},
|
|
|
+ {F_ARBPF0PERR, "ULP RX ArbPF0 parity error", -1, 1},
|
|
|
+ {F_ARBFPERR, "ULP RX ArbF parity error", -1, 1},
|
|
|
+ {F_PCMDMUXPERR, "ULP RX PCMDMUX parity error", -1, 1},
|
|
|
+ {F_DATASELFRAMEERR1, "ULP RX frame error", -1, 1},
|
|
|
+ {F_DATASELFRAMEERR0, "ULP RX frame error", -1, 1},
|
|
|
{0}
|
|
|
};
|
|
|
|
|
@@ -1447,6 +1483,7 @@ static void ulptx_intr_handler(struct adapter *adapter)
|
|
|
STAT_ULP_CH0_PBL_OOB, 0},
|
|
|
{F_PBL_BOUND_ERR_CH1, "ULP TX channel 1 PBL out of bounds",
|
|
|
STAT_ULP_CH1_PBL_OOB, 0},
|
|
|
+ {0xfc, "ULP TX parity error", -1, 1},
|
|
|
{0}
|
|
|
};
|
|
|
|
|
@@ -1521,7 +1558,8 @@ static void pmrx_intr_handler(struct adapter *adapter)
|
|
|
static void cplsw_intr_handler(struct adapter *adapter)
|
|
|
{
|
|
|
static const struct intr_info cplsw_intr_info[] = {
|
|
|
-/* { F_CIM_OVFL_ERROR, "CPL switch CIM overflow", -1, 1 }, */
|
|
|
+ {F_CIM_OP_MAP_PERR, "CPL switch CIM parity error", -1, 1},
|
|
|
+ {F_CIM_OVFL_ERROR, "CPL switch CIM overflow", -1, 1},
|
|
|
{F_TP_FRAMING_ERROR, "CPL switch TP framing error", -1, 1},
|
|
|
{F_SGE_FRAMING_ERROR, "CPL switch SGE framing error", -1, 1},
|
|
|
{F_CIM_FRAMING_ERROR, "CPL switch CIM framing error", -1, 1},
|
|
@@ -1907,6 +1945,16 @@ static int t3_sge_write_context(struct adapter *adapter, unsigned int id,
|
|
|
0, SG_CONTEXT_CMD_ATTEMPTS, 1);
|
|
|
}
|
|
|
|
|
|
+static int clear_sge_ctxt(struct adapter *adap, unsigned int id,
|
|
|
+ unsigned int type)
|
|
|
+{
|
|
|
+ t3_write_reg(adap, A_SG_CONTEXT_DATA0, 0);
|
|
|
+ t3_write_reg(adap, A_SG_CONTEXT_DATA1, 0);
|
|
|
+ t3_write_reg(adap, A_SG_CONTEXT_DATA2, 0);
|
|
|
+ t3_write_reg(adap, A_SG_CONTEXT_DATA3, 0);
|
|
|
+ return t3_sge_write_context(adap, id, type);
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* t3_sge_init_ecntxt - initialize an SGE egress context
|
|
|
* @adapter: the adapter to configure
|
|
@@ -2408,7 +2456,7 @@ static inline unsigned int pm_num_pages(unsigned int mem_size,
|
|
|
t3_write_reg((adap), A_ ## reg, (start)); \
|
|
|
start += size
|
|
|
|
|
|
-/*
|
|
|
+/**
|
|
|
* partition_mem - partition memory and configure TP memory settings
|
|
|
* @adap: the adapter
|
|
|
* @p: the TP parameters
|
|
@@ -2493,7 +2541,7 @@ static void tp_config(struct adapter *adap, const struct tp_params *p)
|
|
|
V_AUTOSTATE2(1) | V_AUTOSTATE1(0) |
|
|
|
V_BYTETHRESHOLD(16384) | V_MSSTHRESHOLD(2) |
|
|
|
F_AUTOCAREFUL | F_AUTOENABLE | V_DACK_MODE(1));
|
|
|
- t3_set_reg_field(adap, A_TP_IN_CONFIG, F_IPV6ENABLE | F_NICMODE,
|
|
|
+ t3_set_reg_field(adap, A_TP_IN_CONFIG, F_RXFBARBPRIO | F_TXFBARBPRIO,
|
|
|
F_IPV6ENABLE | F_NICMODE);
|
|
|
t3_write_reg(adap, A_TP_TX_RESOURCE_LIMIT, 0x18141814);
|
|
|
t3_write_reg(adap, A_TP_PARA_REG4, 0x5050105);
|
|
@@ -2505,7 +2553,9 @@ static void tp_config(struct adapter *adap, const struct tp_params *p)
|
|
|
F_ENABLEEPCMDAFULL,
|
|
|
F_ENABLEOCSPIFULL |F_TXDEFERENABLE | F_HEARBEATDACK |
|
|
|
F_TXCONGESTIONMODE | F_RXCONGESTIONMODE);
|
|
|
- t3_set_reg_field(adap, A_TP_PC_CONFIG2, F_CHDRAFULL, 0);
|
|
|
+ t3_set_reg_field(adap, A_TP_PC_CONFIG2, F_CHDRAFULL,
|
|
|
+ F_ENABLEIPV6RSS | F_ENABLENONOFDTNLSYN |
|
|
|
+ F_ENABLEARPMISS | F_DISBLEDAPARBIT0);
|
|
|
t3_write_reg(adap, A_TP_PROXY_FLOW_CNTL, 1080);
|
|
|
t3_write_reg(adap, A_TP_PROXY_FLOW_CNTL, 1000);
|
|
|
|
|
@@ -3212,7 +3262,8 @@ static void config_pcie(struct adapter *adap)
|
|
|
V_REPLAYLMT(rpllmt));
|
|
|
|
|
|
t3_write_reg(adap, A_PCIE_PEX_ERR, 0xffffffff);
|
|
|
- t3_set_reg_field(adap, A_PCIE_CFG, F_PCIE_CLIDECEN, F_PCIE_CLIDECEN);
|
|
|
+ t3_set_reg_field(adap, A_PCIE_CFG, 0,
|
|
|
+ F_PCIE_DMASTOPEN | F_PCIE_CLIDECEN);
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -3225,7 +3276,7 @@ static void config_pcie(struct adapter *adap)
|
|
|
*/
|
|
|
int t3_init_hw(struct adapter *adapter, u32 fw_params)
|
|
|
{
|
|
|
- int err = -EIO, attempts = 100;
|
|
|
+ int err = -EIO, attempts, i;
|
|
|
const struct vpd_params *vpd = &adapter->params.vpd;
|
|
|
|
|
|
if (adapter->params.rev > 0)
|
|
@@ -3243,6 +3294,10 @@ int t3_init_hw(struct adapter *adapter, u32 fw_params)
|
|
|
adapter->params.mc5.nfilters,
|
|
|
adapter->params.mc5.nroutes))
|
|
|
goto out_err;
|
|
|
+
|
|
|
+ for (i = 0; i < 32; i++)
|
|
|
+ if (clear_sge_ctxt(adapter, i, F_CQ))
|
|
|
+ goto out_err;
|
|
|
}
|
|
|
|
|
|
if (tp_init(adapter, &adapter->params.tp))
|
|
@@ -3258,7 +3313,8 @@ int t3_init_hw(struct adapter *adapter, u32 fw_params)
|
|
|
if (is_pcie(adapter))
|
|
|
config_pcie(adapter);
|
|
|
else
|
|
|
- t3_set_reg_field(adapter, A_PCIX_CFG, 0, F_CLIDECEN);
|
|
|
+ t3_set_reg_field(adapter, A_PCIX_CFG, 0,
|
|
|
+ F_DMASTOPEN | F_CLIDECEN);
|
|
|
|
|
|
if (adapter->params.rev == T3_REV_C)
|
|
|
t3_set_reg_field(adapter, A_ULPTX_CONFIG, 0,
|
|
@@ -3275,6 +3331,7 @@ int t3_init_hw(struct adapter *adapter, u32 fw_params)
|
|
|
V_BOOTADDR(FW_FLASH_BOOT_ADDR >> 2));
|
|
|
t3_read_reg(adapter, A_CIM_BOOT_CFG); /* flush */
|
|
|
|
|
|
+ attempts = 100;
|
|
|
do { /* wait for uP to initialize */
|
|
|
msleep(20);
|
|
|
} while (t3_read_reg(adapter, A_CIM_HOST_ACC_DATA) && --attempts);
|
|
@@ -3409,6 +3466,7 @@ void early_hw_init(struct adapter *adapter, const struct adapter_info *ai)
|
|
|
t3_write_reg(adapter, A_T3DBG_GPIO_EN,
|
|
|
ai->gpio_out | F_GPIO0_OEN | F_GPIO0_OUT_VAL);
|
|
|
t3_write_reg(adapter, A_MC5_DB_SERVER_INDEX, 0);
|
|
|
+ t3_write_reg(adapter, A_SG_OCO_BASE, V_BASE1(0xfff));
|
|
|
|
|
|
if (adapter->params.rev == 0 || !uses_xaui(adapter))
|
|
|
val |= F_ENRGMII;
|
|
@@ -3458,6 +3516,36 @@ static int t3_reset_adapter(struct adapter *adapter)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static int __devinit init_parity(struct adapter *adap)
|
|
|
+{
|
|
|
+ int i, err, addr;
|
|
|
+
|
|
|
+ if (t3_read_reg(adap, A_SG_CONTEXT_CMD) & F_CONTEXT_CMD_BUSY)
|
|
|
+ return -EBUSY;
|
|
|
+
|
|
|
+ for (err = i = 0; !err && i < 16; i++)
|
|
|
+ err = clear_sge_ctxt(adap, i, F_EGRESS);
|
|
|
+ for (i = 0xfff0; !err && i <= 0xffff; i++)
|
|
|
+ err = clear_sge_ctxt(adap, i, F_EGRESS);
|
|
|
+ for (i = 0; !err && i < SGE_QSETS; i++)
|
|
|
+ err = clear_sge_ctxt(adap, i, F_RESPONSEQ);
|
|
|
+ if (err)
|
|
|
+ return err;
|
|
|
+
|
|
|
+ t3_write_reg(adap, A_CIM_IBQ_DBG_DATA, 0);
|
|
|
+ for (i = 0; i < 4; i++)
|
|
|
+ for (addr = 0; addr <= M_IBQDBGADDR; addr++) {
|
|
|
+ t3_write_reg(adap, A_CIM_IBQ_DBG_CFG, F_IBQDBGEN |
|
|
|
+ F_IBQDBGWR | V_IBQDBGQID(i) |
|
|
|
+ V_IBQDBGADDR(addr));
|
|
|
+ err = t3_wait_op_done(adap, A_CIM_IBQ_DBG_CFG,
|
|
|
+ F_IBQDBGBUSY, 0, 2, 1);
|
|
|
+ if (err)
|
|
|
+ return err;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Initialize adapter SW state for the various HW modules, set initial values
|
|
|
* for some adapter tunables, take PHYs out of reset, and initialize the MDIO
|
|
@@ -3525,6 +3613,9 @@ int __devinit t3_prep_adapter(struct adapter *adapter,
|
|
|
}
|
|
|
|
|
|
early_hw_init(adapter, ai);
|
|
|
+ ret = init_parity(adapter);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
|
|
|
for_each_port(adapter, i) {
|
|
|
u8 hw_addr[6];
|