diff options
Diffstat (limited to 'drivers/net/cxgb3')
-rw-r--r-- | drivers/net/cxgb3/adapter.h | 1 | ||||
-rw-r--r-- | drivers/net/cxgb3/cxgb3_main.c | 82 | ||||
-rw-r--r-- | drivers/net/cxgb3/cxgb3_offload.c | 15 | ||||
-rw-r--r-- | drivers/net/cxgb3/regs.h | 248 | ||||
-rw-r--r-- | drivers/net/cxgb3/sge.c | 24 | ||||
-rw-r--r-- | drivers/net/cxgb3/t3_hw.c | 131 |
6 files changed, 472 insertions, 29 deletions
diff --git a/drivers/net/cxgb3/adapter.h b/drivers/net/cxgb3/adapter.h index 60a62f510db7..eb305a0895fc 100644 --- a/drivers/net/cxgb3/adapter.h +++ b/drivers/net/cxgb3/adapter.h | |||
@@ -71,6 +71,7 @@ enum { /* adapter flags */ | |||
71 | USING_MSI = (1 << 1), | 71 | USING_MSI = (1 << 1), |
72 | USING_MSIX = (1 << 2), | 72 | USING_MSIX = (1 << 2), |
73 | QUEUES_BOUND = (1 << 3), | 73 | QUEUES_BOUND = (1 << 3), |
74 | TP_PARITY_INIT = (1 << 4), | ||
74 | }; | 75 | }; |
75 | 76 | ||
76 | struct fl_pg_chunk { | 77 | struct fl_pg_chunk { |
diff --git a/drivers/net/cxgb3/cxgb3_main.c b/drivers/net/cxgb3/cxgb3_main.c index 944423c497d2..d1aa7779796e 100644 --- a/drivers/net/cxgb3/cxgb3_main.c +++ b/drivers/net/cxgb3/cxgb3_main.c | |||
@@ -306,6 +306,77 @@ static int request_msix_data_irqs(struct adapter *adap) | |||
306 | return 0; | 306 | return 0; |
307 | } | 307 | } |
308 | 308 | ||
309 | static int await_mgmt_replies(struct adapter *adap, unsigned long init_cnt, | ||
310 | unsigned long n) | ||
311 | { | ||
312 | int attempts = 5; | ||
313 | |||
314 | while (adap->sge.qs[0].rspq.offload_pkts < init_cnt + n) { | ||
315 | if (!--attempts) | ||
316 | return -ETIMEDOUT; | ||
317 | msleep(10); | ||
318 | } | ||
319 | return 0; | ||
320 | } | ||
321 | |||
322 | static int init_tp_parity(struct adapter *adap) | ||
323 | { | ||
324 | int i; | ||
325 | struct sk_buff *skb; | ||
326 | struct cpl_set_tcb_field *greq; | ||
327 | unsigned long cnt = adap->sge.qs[0].rspq.offload_pkts; | ||
328 | |||
329 | t3_tp_set_offload_mode(adap, 1); | ||
330 | |||
331 | for (i = 0; i < 16; i++) { | ||
332 | struct cpl_smt_write_req *req; | ||
333 | |||
334 | skb = alloc_skb(sizeof(*req), GFP_KERNEL | __GFP_NOFAIL); | ||
335 | req = (struct cpl_smt_write_req *)__skb_put(skb, sizeof(*req)); | ||
336 | memset(req, 0, sizeof(*req)); | ||
337 | req->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD)); | ||
338 | OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_SMT_WRITE_REQ, i)); | ||
339 | req->iff = i; | ||
340 | t3_mgmt_tx(adap, skb); | ||
341 | } | ||
342 | |||
343 | for (i = 0; i < 2048; i++) { | ||
344 | struct cpl_l2t_write_req *req; | ||
345 | |||
346 | skb = alloc_skb(sizeof(*req), GFP_KERNEL | __GFP_NOFAIL); | ||
347 | req = (struct cpl_l2t_write_req *)__skb_put(skb, sizeof(*req)); | ||
348 | memset(req, 0, sizeof(*req)); | ||
349 | req->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD)); | ||
350 | OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_L2T_WRITE_REQ, i)); | ||
351 | req->params = htonl(V_L2T_W_IDX(i)); | ||
352 | t3_mgmt_tx(adap, skb); | ||
353 | } | ||
354 | |||
355 | for (i = 0; i < 2048; i++) { | ||
356 | struct cpl_rte_write_req *req; | ||
357 | |||
358 | skb = alloc_skb(sizeof(*req), GFP_KERNEL | __GFP_NOFAIL); | ||
359 | req = (struct cpl_rte_write_req *)__skb_put(skb, sizeof(*req)); | ||
360 | memset(req, 0, sizeof(*req)); | ||
361 | req->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD)); | ||
362 | OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_RTE_WRITE_REQ, i)); | ||
363 | req->l2t_idx = htonl(V_L2T_W_IDX(i)); | ||
364 | t3_mgmt_tx(adap, skb); | ||
365 | } | ||
366 | |||
367 | skb = alloc_skb(sizeof(*greq), GFP_KERNEL | __GFP_NOFAIL); | ||
368 | greq = (struct cpl_set_tcb_field *)__skb_put(skb, sizeof(*greq)); | ||
369 | memset(greq, 0, sizeof(*greq)); | ||
370 | greq->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD)); | ||
371 | OPCODE_TID(greq) = htonl(MK_OPCODE_TID(CPL_SET_TCB_FIELD, 0)); | ||
372 | greq->mask = cpu_to_be64(1); | ||
373 | t3_mgmt_tx(adap, skb); | ||
374 | |||
375 | i = await_mgmt_replies(adap, cnt, 16 + 2048 + 2048 + 1); | ||
376 | t3_tp_set_offload_mode(adap, 0); | ||
377 | return i; | ||
378 | } | ||
379 | |||
309 | /** | 380 | /** |
310 | * setup_rss - configure RSS | 381 | * setup_rss - configure RSS |
311 | * @adap: the adapter | 382 | * @adap: the adapter |
@@ -817,6 +888,7 @@ static int cxgb_up(struct adapter *adap) | |||
817 | if (err) | 888 | if (err) |
818 | goto out; | 889 | goto out; |
819 | 890 | ||
891 | t3_set_reg_field(adap, A_TP_PARA_REG5, 0, F_RXDDPOFFINIT); | ||
820 | t3_write_reg(adap, A_ULPRX_TDDP_PSZ, V_HPZ0(PAGE_SHIFT - 12)); | 892 | t3_write_reg(adap, A_ULPRX_TDDP_PSZ, V_HPZ0(PAGE_SHIFT - 12)); |
821 | 893 | ||
822 | err = setup_sge_qsets(adap); | 894 | err = setup_sge_qsets(adap); |
@@ -856,6 +928,16 @@ static int cxgb_up(struct adapter *adap) | |||
856 | t3_sge_start(adap); | 928 | t3_sge_start(adap); |
857 | t3_intr_enable(adap); | 929 | t3_intr_enable(adap); |
858 | 930 | ||
931 | if (adap->params.rev >= T3_REV_C && !(adap->flags & TP_PARITY_INIT) && | ||
932 | is_offload(adap) && init_tp_parity(adap) == 0) | ||
933 | adap->flags |= TP_PARITY_INIT; | ||
934 | |||
935 | if (adap->flags & TP_PARITY_INIT) { | ||
936 | t3_write_reg(adap, A_TP_INT_CAUSE, | ||
937 | F_CMCACHEPERR | F_ARPLUTPERR); | ||
938 | t3_write_reg(adap, A_TP_INT_ENABLE, 0x7fbfffff); | ||
939 | } | ||
940 | |||
859 | if ((adap->flags & (USING_MSIX | QUEUES_BOUND)) == USING_MSIX) | 941 | if ((adap->flags & (USING_MSIX | QUEUES_BOUND)) == USING_MSIX) |
860 | bind_qsets(adap); | 942 | bind_qsets(adap); |
861 | adap->flags |= QUEUES_BOUND; | 943 | adap->flags |= QUEUES_BOUND; |
diff --git a/drivers/net/cxgb3/cxgb3_offload.c b/drivers/net/cxgb3/cxgb3_offload.c index 7e5892f1a9db..d48c396bdabb 100644 --- a/drivers/net/cxgb3/cxgb3_offload.c +++ b/drivers/net/cxgb3/cxgb3_offload.c | |||
@@ -403,8 +403,6 @@ static int cxgb_offload_ctl(struct t3cdev *tdev, unsigned int req, void *data) | |||
403 | static int rx_offload_blackhole(struct t3cdev *dev, struct sk_buff **skbs, | 403 | static int rx_offload_blackhole(struct t3cdev *dev, struct sk_buff **skbs, |
404 | int n) | 404 | int n) |
405 | { | 405 | { |
406 | CH_ERR(tdev2adap(dev), "%d unexpected offload packets, first data %u\n", | ||
407 | n, ntohl(*(__be32 *)skbs[0]->data)); | ||
408 | while (n--) | 406 | while (n--) |
409 | dev_kfree_skb_any(skbs[n]); | 407 | dev_kfree_skb_any(skbs[n]); |
410 | return 0; | 408 | return 0; |
@@ -634,6 +632,18 @@ static int do_l2t_write_rpl(struct t3cdev *dev, struct sk_buff *skb) | |||
634 | return CPL_RET_BUF_DONE; | 632 | return CPL_RET_BUF_DONE; |
635 | } | 633 | } |
636 | 634 | ||
635 | static int do_rte_write_rpl(struct t3cdev *dev, struct sk_buff *skb) | ||
636 | { | ||
637 | struct cpl_rte_write_rpl *rpl = cplhdr(skb); | ||
638 | |||
639 | if (rpl->status != CPL_ERR_NONE) | ||
640 | printk(KERN_ERR | ||
641 | "Unexpected RTE_WRITE_RPL status %u for entry %u\n", | ||
642 | rpl->status, GET_TID(rpl)); | ||
643 | |||
644 | return CPL_RET_BUF_DONE; | ||
645 | } | ||
646 | |||
637 | static int do_act_open_rpl(struct t3cdev *dev, struct sk_buff *skb) | 647 | static int do_act_open_rpl(struct t3cdev *dev, struct sk_buff *skb) |
638 | { | 648 | { |
639 | struct cpl_act_open_rpl *rpl = cplhdr(skb); | 649 | struct cpl_act_open_rpl *rpl = cplhdr(skb); |
@@ -1257,6 +1267,7 @@ void __init cxgb3_offload_init(void) | |||
1257 | 1267 | ||
1258 | t3_register_cpl_handler(CPL_SMT_WRITE_RPL, do_smt_write_rpl); | 1268 | t3_register_cpl_handler(CPL_SMT_WRITE_RPL, do_smt_write_rpl); |
1259 | t3_register_cpl_handler(CPL_L2T_WRITE_RPL, do_l2t_write_rpl); | 1269 | t3_register_cpl_handler(CPL_L2T_WRITE_RPL, do_l2t_write_rpl); |
1270 | t3_register_cpl_handler(CPL_RTE_WRITE_RPL, do_rte_write_rpl); | ||
1260 | t3_register_cpl_handler(CPL_PASS_OPEN_RPL, do_stid_rpl); | 1271 | t3_register_cpl_handler(CPL_PASS_OPEN_RPL, do_stid_rpl); |
1261 | t3_register_cpl_handler(CPL_CLOSE_LISTSRV_RPL, do_stid_rpl); | 1272 | t3_register_cpl_handler(CPL_CLOSE_LISTSRV_RPL, do_stid_rpl); |
1262 | t3_register_cpl_handler(CPL_PASS_ACCEPT_REQ, do_cr); | 1273 | t3_register_cpl_handler(CPL_PASS_ACCEPT_REQ, do_cr); |
diff --git a/drivers/net/cxgb3/regs.h b/drivers/net/cxgb3/regs.h index 70e1961acee1..02dbbb300929 100644 --- a/drivers/net/cxgb3/regs.h +++ b/drivers/net/cxgb3/regs.h | |||
@@ -1,5 +1,17 @@ | |||
1 | #define A_SG_CONTROL 0x0 | 1 | #define A_SG_CONTROL 0x0 |
2 | 2 | ||
3 | #define S_CONGMODE 29 | ||
4 | #define V_CONGMODE(x) ((x) << S_CONGMODE) | ||
5 | #define F_CONGMODE V_CONGMODE(1U) | ||
6 | |||
7 | #define S_TNLFLMODE 28 | ||
8 | #define V_TNLFLMODE(x) ((x) << S_TNLFLMODE) | ||
9 | #define F_TNLFLMODE V_TNLFLMODE(1U) | ||
10 | |||
11 | #define S_FATLPERREN 27 | ||
12 | #define V_FATLPERREN(x) ((x) << S_FATLPERREN) | ||
13 | #define F_FATLPERREN V_FATLPERREN(1U) | ||
14 | |||
3 | #define S_DROPPKT 20 | 15 | #define S_DROPPKT 20 |
4 | #define V_DROPPKT(x) ((x) << S_DROPPKT) | 16 | #define V_DROPPKT(x) ((x) << S_DROPPKT) |
5 | #define F_DROPPKT V_DROPPKT(1U) | 17 | #define F_DROPPKT V_DROPPKT(1U) |
@@ -172,6 +184,64 @@ | |||
172 | 184 | ||
173 | #define A_SG_INT_CAUSE 0x5c | 185 | #define A_SG_INT_CAUSE 0x5c |
174 | 186 | ||
187 | #define S_HIRCQPARITYERROR 31 | ||
188 | #define V_HIRCQPARITYERROR(x) ((x) << S_HIRCQPARITYERROR) | ||
189 | #define F_HIRCQPARITYERROR V_HIRCQPARITYERROR(1U) | ||
190 | |||
191 | #define S_LORCQPARITYERROR 30 | ||
192 | #define V_LORCQPARITYERROR(x) ((x) << S_LORCQPARITYERROR) | ||
193 | #define F_LORCQPARITYERROR V_LORCQPARITYERROR(1U) | ||
194 | |||
195 | #define S_HIDRBPARITYERROR 29 | ||
196 | #define V_HIDRBPARITYERROR(x) ((x) << S_HIDRBPARITYERROR) | ||
197 | #define F_HIDRBPARITYERROR V_HIDRBPARITYERROR(1U) | ||
198 | |||
199 | #define S_LODRBPARITYERROR 28 | ||
200 | #define V_LODRBPARITYERROR(x) ((x) << S_LODRBPARITYERROR) | ||
201 | #define F_LODRBPARITYERROR V_LODRBPARITYERROR(1U) | ||
202 | |||
203 | #define S_FLPARITYERROR 22 | ||
204 | #define M_FLPARITYERROR 0x3f | ||
205 | #define V_FLPARITYERROR(x) ((x) << S_FLPARITYERROR) | ||
206 | #define G_FLPARITYERROR(x) (((x) >> S_FLPARITYERROR) & M_FLPARITYERROR) | ||
207 | |||
208 | #define S_ITPARITYERROR 20 | ||
209 | #define M_ITPARITYERROR 0x3 | ||
210 | #define V_ITPARITYERROR(x) ((x) << S_ITPARITYERROR) | ||
211 | #define G_ITPARITYERROR(x) (((x) >> S_ITPARITYERROR) & M_ITPARITYERROR) | ||
212 | |||
213 | #define S_IRPARITYERROR 19 | ||
214 | #define V_IRPARITYERROR(x) ((x) << S_IRPARITYERROR) | ||
215 | #define F_IRPARITYERROR V_IRPARITYERROR(1U) | ||
216 | |||
217 | #define S_RCPARITYERROR 18 | ||
218 | #define V_RCPARITYERROR(x) ((x) << S_RCPARITYERROR) | ||
219 | #define F_RCPARITYERROR V_RCPARITYERROR(1U) | ||
220 | |||
221 | #define S_OCPARITYERROR 17 | ||
222 | #define V_OCPARITYERROR(x) ((x) << S_OCPARITYERROR) | ||
223 | #define F_OCPARITYERROR V_OCPARITYERROR(1U) | ||
224 | |||
225 | #define S_CPPARITYERROR 16 | ||
226 | #define V_CPPARITYERROR(x) ((x) << S_CPPARITYERROR) | ||
227 | #define F_CPPARITYERROR V_CPPARITYERROR(1U) | ||
228 | |||
229 | #define S_R_REQ_FRAMINGERROR 15 | ||
230 | #define V_R_REQ_FRAMINGERROR(x) ((x) << S_R_REQ_FRAMINGERROR) | ||
231 | #define F_R_REQ_FRAMINGERROR V_R_REQ_FRAMINGERROR(1U) | ||
232 | |||
233 | #define S_UC_REQ_FRAMINGERROR 14 | ||
234 | #define V_UC_REQ_FRAMINGERROR(x) ((x) << S_UC_REQ_FRAMINGERROR) | ||
235 | #define F_UC_REQ_FRAMINGERROR V_UC_REQ_FRAMINGERROR(1U) | ||
236 | |||
237 | #define S_HICTLDRBDROPERR 13 | ||
238 | #define V_HICTLDRBDROPERR(x) ((x) << S_HICTLDRBDROPERR) | ||
239 | #define F_HICTLDRBDROPERR V_HICTLDRBDROPERR(1U) | ||
240 | |||
241 | #define S_LOCTLDRBDROPERR 12 | ||
242 | #define V_LOCTLDRBDROPERR(x) ((x) << S_LOCTLDRBDROPERR) | ||
243 | #define F_LOCTLDRBDROPERR V_LOCTLDRBDROPERR(1U) | ||
244 | |||
175 | #define S_HIPIODRBDROPERR 11 | 245 | #define S_HIPIODRBDROPERR 11 |
176 | #define V_HIPIODRBDROPERR(x) ((x) << S_HIPIODRBDROPERR) | 246 | #define V_HIPIODRBDROPERR(x) ((x) << S_HIPIODRBDROPERR) |
177 | #define F_HIPIODRBDROPERR V_HIPIODRBDROPERR(1U) | 247 | #define F_HIPIODRBDROPERR V_HIPIODRBDROPERR(1U) |
@@ -286,6 +356,10 @@ | |||
286 | 356 | ||
287 | #define A_PCIX_CFG 0x88 | 357 | #define A_PCIX_CFG 0x88 |
288 | 358 | ||
359 | #define S_DMASTOPEN 19 | ||
360 | #define V_DMASTOPEN(x) ((x) << S_DMASTOPEN) | ||
361 | #define F_DMASTOPEN V_DMASTOPEN(1U) | ||
362 | |||
289 | #define S_CLIDECEN 18 | 363 | #define S_CLIDECEN 18 |
290 | #define V_CLIDECEN(x) ((x) << S_CLIDECEN) | 364 | #define V_CLIDECEN(x) ((x) << S_CLIDECEN) |
291 | #define F_CLIDECEN V_CLIDECEN(1U) | 365 | #define F_CLIDECEN V_CLIDECEN(1U) |
@@ -313,6 +387,22 @@ | |||
313 | 387 | ||
314 | #define V_BISTERR(x) ((x) << S_BISTERR) | 388 | #define V_BISTERR(x) ((x) << S_BISTERR) |
315 | 389 | ||
390 | #define S_TXPARERR 18 | ||
391 | #define V_TXPARERR(x) ((x) << S_TXPARERR) | ||
392 | #define F_TXPARERR V_TXPARERR(1U) | ||
393 | |||
394 | #define S_RXPARERR 17 | ||
395 | #define V_RXPARERR(x) ((x) << S_RXPARERR) | ||
396 | #define F_RXPARERR V_RXPARERR(1U) | ||
397 | |||
398 | #define S_RETRYLUTPARERR 16 | ||
399 | #define V_RETRYLUTPARERR(x) ((x) << S_RETRYLUTPARERR) | ||
400 | #define F_RETRYLUTPARERR V_RETRYLUTPARERR(1U) | ||
401 | |||
402 | #define S_RETRYBUFPARERR 15 | ||
403 | #define V_RETRYBUFPARERR(x) ((x) << S_RETRYBUFPARERR) | ||
404 | #define F_RETRYBUFPARERR V_RETRYBUFPARERR(1U) | ||
405 | |||
316 | #define S_PCIE_MSIXPARERR 12 | 406 | #define S_PCIE_MSIXPARERR 12 |
317 | #define M_PCIE_MSIXPARERR 0x7 | 407 | #define M_PCIE_MSIXPARERR 0x7 |
318 | 408 | ||
@@ -348,6 +438,10 @@ | |||
348 | 438 | ||
349 | #define A_PCIE_INT_CAUSE 0x84 | 439 | #define A_PCIE_INT_CAUSE 0x84 |
350 | 440 | ||
441 | #define S_PCIE_DMASTOPEN 24 | ||
442 | #define V_PCIE_DMASTOPEN(x) ((x) << S_PCIE_DMASTOPEN) | ||
443 | #define F_PCIE_DMASTOPEN V_PCIE_DMASTOPEN(1U) | ||
444 | |||
351 | #define A_PCIE_CFG 0x88 | 445 | #define A_PCIE_CFG 0x88 |
352 | 446 | ||
353 | #define S_PCIE_CLIDECEN 16 | 447 | #define S_PCIE_CLIDECEN 16 |
@@ -741,6 +835,54 @@ | |||
741 | 835 | ||
742 | #define A_CIM_HOST_INT_ENABLE 0x298 | 836 | #define A_CIM_HOST_INT_ENABLE 0x298 |
743 | 837 | ||
838 | #define S_DTAGPARERR 28 | ||
839 | #define V_DTAGPARERR(x) ((x) << S_DTAGPARERR) | ||
840 | #define F_DTAGPARERR V_DTAGPARERR(1U) | ||
841 | |||
842 | #define S_ITAGPARERR 27 | ||
843 | #define V_ITAGPARERR(x) ((x) << S_ITAGPARERR) | ||
844 | #define F_ITAGPARERR V_ITAGPARERR(1U) | ||
845 | |||
846 | #define S_IBQTPPARERR 26 | ||
847 | #define V_IBQTPPARERR(x) ((x) << S_IBQTPPARERR) | ||
848 | #define F_IBQTPPARERR V_IBQTPPARERR(1U) | ||
849 | |||
850 | #define S_IBQULPPARERR 25 | ||
851 | #define V_IBQULPPARERR(x) ((x) << S_IBQULPPARERR) | ||
852 | #define F_IBQULPPARERR V_IBQULPPARERR(1U) | ||
853 | |||
854 | #define S_IBQSGEHIPARERR 24 | ||
855 | #define V_IBQSGEHIPARERR(x) ((x) << S_IBQSGEHIPARERR) | ||
856 | #define F_IBQSGEHIPARERR V_IBQSGEHIPARERR(1U) | ||
857 | |||
858 | #define S_IBQSGELOPARERR 23 | ||
859 | #define V_IBQSGELOPARERR(x) ((x) << S_IBQSGELOPARERR) | ||
860 | #define F_IBQSGELOPARERR V_IBQSGELOPARERR(1U) | ||
861 | |||
862 | #define S_OBQULPLOPARERR 22 | ||
863 | #define V_OBQULPLOPARERR(x) ((x) << S_OBQULPLOPARERR) | ||
864 | #define F_OBQULPLOPARERR V_OBQULPLOPARERR(1U) | ||
865 | |||
866 | #define S_OBQULPHIPARERR 21 | ||
867 | #define V_OBQULPHIPARERR(x) ((x) << S_OBQULPHIPARERR) | ||
868 | #define F_OBQULPHIPARERR V_OBQULPHIPARERR(1U) | ||
869 | |||
870 | #define S_OBQSGEPARERR 20 | ||
871 | #define V_OBQSGEPARERR(x) ((x) << S_OBQSGEPARERR) | ||
872 | #define F_OBQSGEPARERR V_OBQSGEPARERR(1U) | ||
873 | |||
874 | #define S_DCACHEPARERR 19 | ||
875 | #define V_DCACHEPARERR(x) ((x) << S_DCACHEPARERR) | ||
876 | #define F_DCACHEPARERR V_DCACHEPARERR(1U) | ||
877 | |||
878 | #define S_ICACHEPARERR 18 | ||
879 | #define V_ICACHEPARERR(x) ((x) << S_ICACHEPARERR) | ||
880 | #define F_ICACHEPARERR V_ICACHEPARERR(1U) | ||
881 | |||
882 | #define S_DRAMPARERR 17 | ||
883 | #define V_DRAMPARERR(x) ((x) << S_DRAMPARERR) | ||
884 | #define F_DRAMPARERR V_DRAMPARERR(1U) | ||
885 | |||
744 | #define A_CIM_HOST_INT_CAUSE 0x29c | 886 | #define A_CIM_HOST_INT_CAUSE 0x29c |
745 | 887 | ||
746 | #define S_BLKWRPLINT 12 | 888 | #define S_BLKWRPLINT 12 |
@@ -799,8 +941,42 @@ | |||
799 | 941 | ||
800 | #define A_CIM_HOST_ACC_DATA 0x2b4 | 942 | #define A_CIM_HOST_ACC_DATA 0x2b4 |
801 | 943 | ||
944 | #define A_CIM_IBQ_DBG_CFG 0x2c0 | ||
945 | |||
946 | #define S_IBQDBGADDR 16 | ||
947 | #define M_IBQDBGADDR 0x1ff | ||
948 | #define V_IBQDBGADDR(x) ((x) << S_IBQDBGADDR) | ||
949 | #define G_IBQDBGADDR(x) (((x) >> S_IBQDBGADDR) & M_IBQDBGADDR) | ||
950 | |||
951 | #define S_IBQDBGQID 3 | ||
952 | #define M_IBQDBGQID 0x3 | ||
953 | #define V_IBQDBGQID(x) ((x) << S_IBQDBGQID) | ||
954 | #define G_IBQDBGQID(x) (((x) >> S_IBQDBGQID) & M_IBQDBGQID) | ||
955 | |||
956 | #define S_IBQDBGWR 2 | ||
957 | #define V_IBQDBGWR(x) ((x) << S_IBQDBGWR) | ||
958 | #define F_IBQDBGWR V_IBQDBGWR(1U) | ||
959 | |||
960 | #define S_IBQDBGBUSY 1 | ||
961 | #define V_IBQDBGBUSY(x) ((x) << S_IBQDBGBUSY) | ||
962 | #define F_IBQDBGBUSY V_IBQDBGBUSY(1U) | ||
963 | |||
964 | #define S_IBQDBGEN 0 | ||
965 | #define V_IBQDBGEN(x) ((x) << S_IBQDBGEN) | ||
966 | #define F_IBQDBGEN V_IBQDBGEN(1U) | ||
967 | |||
968 | #define A_CIM_IBQ_DBG_DATA 0x2c8 | ||
969 | |||
802 | #define A_TP_IN_CONFIG 0x300 | 970 | #define A_TP_IN_CONFIG 0x300 |
803 | 971 | ||
972 | #define S_RXFBARBPRIO 25 | ||
973 | #define V_RXFBARBPRIO(x) ((x) << S_RXFBARBPRIO) | ||
974 | #define F_RXFBARBPRIO V_RXFBARBPRIO(1U) | ||
975 | |||
976 | #define S_TXFBARBPRIO 24 | ||
977 | #define V_TXFBARBPRIO(x) ((x) << S_TXFBARBPRIO) | ||
978 | #define F_TXFBARBPRIO V_TXFBARBPRIO(1U) | ||
979 | |||
804 | #define S_NICMODE 14 | 980 | #define S_NICMODE 14 |
805 | #define V_NICMODE(x) ((x) << S_NICMODE) | 981 | #define V_NICMODE(x) ((x) << S_NICMODE) |
806 | #define F_NICMODE V_NICMODE(1U) | 982 | #define F_NICMODE V_NICMODE(1U) |
@@ -973,6 +1149,22 @@ | |||
973 | 1149 | ||
974 | #define A_TP_PC_CONFIG2 0x34c | 1150 | #define A_TP_PC_CONFIG2 0x34c |
975 | 1151 | ||
1152 | #define S_DISBLEDAPARBIT0 15 | ||
1153 | #define V_DISBLEDAPARBIT0(x) ((x) << S_DISBLEDAPARBIT0) | ||
1154 | #define F_DISBLEDAPARBIT0 V_DISBLEDAPARBIT0(1U) | ||
1155 | |||
1156 | #define S_ENABLEARPMISS 13 | ||
1157 | #define V_ENABLEARPMISS(x) ((x) << S_ENABLEARPMISS) | ||
1158 | #define F_ENABLEARPMISS V_ENABLEARPMISS(1U) | ||
1159 | |||
1160 | #define S_ENABLENONOFDTNLSYN 12 | ||
1161 | #define V_ENABLENONOFDTNLSYN(x) ((x) << S_ENABLENONOFDTNLSYN) | ||
1162 | #define F_ENABLENONOFDTNLSYN V_ENABLENONOFDTNLSYN(1U) | ||
1163 | |||
1164 | #define S_ENABLEIPV6RSS 11 | ||
1165 | #define V_ENABLEIPV6RSS(x) ((x) << S_ENABLEIPV6RSS) | ||
1166 | #define F_ENABLEIPV6RSS V_ENABLEIPV6RSS(1U) | ||
1167 | |||
976 | #define S_CHDRAFULL 4 | 1168 | #define S_CHDRAFULL 4 |
977 | #define V_CHDRAFULL(x) ((x) << S_CHDRAFULL) | 1169 | #define V_CHDRAFULL(x) ((x) << S_CHDRAFULL) |
978 | #define F_CHDRAFULL V_CHDRAFULL(1U) | 1170 | #define F_CHDRAFULL V_CHDRAFULL(1U) |
@@ -1024,6 +1216,12 @@ | |||
1024 | 1216 | ||
1025 | #define A_TP_PARA_REG4 0x370 | 1217 | #define A_TP_PARA_REG4 0x370 |
1026 | 1218 | ||
1219 | #define A_TP_PARA_REG5 0x374 | ||
1220 | |||
1221 | #define S_RXDDPOFFINIT 3 | ||
1222 | #define V_RXDDPOFFINIT(x) ((x) << S_RXDDPOFFINIT) | ||
1223 | #define F_RXDDPOFFINIT V_RXDDPOFFINIT(1U) | ||
1224 | |||
1027 | #define A_TP_PARA_REG6 0x378 | 1225 | #define A_TP_PARA_REG6 0x378 |
1028 | 1226 | ||
1029 | #define S_T3A_ENABLEESND 13 | 1227 | #define S_T3A_ENABLEESND 13 |
@@ -1144,6 +1342,10 @@ | |||
1144 | #define V_TNLLKPEN(x) ((x) << S_TNLLKPEN) | 1342 | #define V_TNLLKPEN(x) ((x) << S_TNLLKPEN) |
1145 | #define F_TNLLKPEN V_TNLLKPEN(1U) | 1343 | #define F_TNLLKPEN V_TNLLKPEN(1U) |
1146 | 1344 | ||
1345 | #define S_RRCPLMAPEN 7 | ||
1346 | #define V_RRCPLMAPEN(x) ((x) << S_RRCPLMAPEN) | ||
1347 | #define F_RRCPLMAPEN V_RRCPLMAPEN(1U) | ||
1348 | |||
1147 | #define S_RRCPLCPUSIZE 4 | 1349 | #define S_RRCPLCPUSIZE 4 |
1148 | #define M_RRCPLCPUSIZE 0x7 | 1350 | #define M_RRCPLCPUSIZE 0x7 |
1149 | #define V_RRCPLCPUSIZE(x) ((x) << S_RRCPLCPUSIZE) | 1351 | #define V_RRCPLCPUSIZE(x) ((x) << S_RRCPLCPUSIZE) |
@@ -1216,6 +1418,14 @@ | |||
1216 | #define V_FLMRXFLSTEMPTY(x) ((x) << S_FLMRXFLSTEMPTY) | 1418 | #define V_FLMRXFLSTEMPTY(x) ((x) << S_FLMRXFLSTEMPTY) |
1217 | #define F_FLMRXFLSTEMPTY V_FLMRXFLSTEMPTY(1U) | 1419 | #define F_FLMRXFLSTEMPTY V_FLMRXFLSTEMPTY(1U) |
1218 | 1420 | ||
1421 | #define S_ARPLUTPERR 26 | ||
1422 | #define V_ARPLUTPERR(x) ((x) << S_ARPLUTPERR) | ||
1423 | #define F_ARPLUTPERR V_ARPLUTPERR(1U) | ||
1424 | |||
1425 | #define S_CMCACHEPERR 24 | ||
1426 | #define V_CMCACHEPERR(x) ((x) << S_CMCACHEPERR) | ||
1427 | #define F_CMCACHEPERR V_CMCACHEPERR(1U) | ||
1428 | |||
1219 | #define A_TP_INT_CAUSE 0x474 | 1429 | #define A_TP_INT_CAUSE 0x474 |
1220 | 1430 | ||
1221 | #define A_TP_TX_MOD_Q1_Q0_RATE_LIMIT 0x8 | 1431 | #define A_TP_TX_MOD_Q1_Q0_RATE_LIMIT 0x8 |
@@ -1259,9 +1469,37 @@ | |||
1259 | 1469 | ||
1260 | #define A_ULPRX_INT_ENABLE 0x504 | 1470 | #define A_ULPRX_INT_ENABLE 0x504 |
1261 | 1471 | ||
1262 | #define S_PARERR 0 | 1472 | #define S_DATASELFRAMEERR0 7 |
1263 | #define V_PARERR(x) ((x) << S_PARERR) | 1473 | #define V_DATASELFRAMEERR0(x) ((x) << S_DATASELFRAMEERR0) |
1264 | #define F_PARERR V_PARERR(1U) | 1474 | #define F_DATASELFRAMEERR0 V_DATASELFRAMEERR0(1U) |
1475 | |||
1476 | #define S_DATASELFRAMEERR1 6 | ||
1477 | #define V_DATASELFRAMEERR1(x) ((x) << S_DATASELFRAMEERR1) | ||
1478 | #define F_DATASELFRAMEERR1 V_DATASELFRAMEERR1(1U) | ||
1479 | |||
1480 | #define S_PCMDMUXPERR 5 | ||
1481 | #define V_PCMDMUXPERR(x) ((x) << S_PCMDMUXPERR) | ||
1482 | #define F_PCMDMUXPERR V_PCMDMUXPERR(1U) | ||
1483 | |||
1484 | #define S_ARBFPERR 4 | ||
1485 | #define V_ARBFPERR(x) ((x) << S_ARBFPERR) | ||
1486 | #define F_ARBFPERR V_ARBFPERR(1U) | ||
1487 | |||
1488 | #define S_ARBPF0PERR 3 | ||
1489 | #define V_ARBPF0PERR(x) ((x) << S_ARBPF0PERR) | ||
1490 | #define F_ARBPF0PERR V_ARBPF0PERR(1U) | ||
1491 | |||
1492 | #define S_ARBPF1PERR 2 | ||
1493 | #define V_ARBPF1PERR(x) ((x) << S_ARBPF1PERR) | ||
1494 | #define F_ARBPF1PERR V_ARBPF1PERR(1U) | ||
1495 | |||
1496 | #define S_PARERRPCMD 1 | ||
1497 | #define V_PARERRPCMD(x) ((x) << S_PARERRPCMD) | ||
1498 | #define F_PARERRPCMD V_PARERRPCMD(1U) | ||
1499 | |||
1500 | #define S_PARERRDATA 0 | ||
1501 | #define V_PARERRDATA(x) ((x) << S_PARERRDATA) | ||
1502 | #define F_PARERRDATA V_PARERRDATA(1U) | ||
1265 | 1503 | ||
1266 | #define A_ULPRX_INT_CAUSE 0x508 | 1504 | #define A_ULPRX_INT_CAUSE 0x508 |
1267 | 1505 | ||
@@ -1559,6 +1797,10 @@ | |||
1559 | 1797 | ||
1560 | #define A_CPL_INTR_ENABLE 0x650 | 1798 | #define A_CPL_INTR_ENABLE 0x650 |
1561 | 1799 | ||
1800 | #define S_CIM_OP_MAP_PERR 5 | ||
1801 | #define V_CIM_OP_MAP_PERR(x) ((x) << S_CIM_OP_MAP_PERR) | ||
1802 | #define F_CIM_OP_MAP_PERR V_CIM_OP_MAP_PERR(1U) | ||
1803 | |||
1562 | #define S_CIM_OVFL_ERROR 4 | 1804 | #define S_CIM_OVFL_ERROR 4 |
1563 | #define V_CIM_OVFL_ERROR(x) ((x) << S_CIM_OVFL_ERROR) | 1805 | #define V_CIM_OVFL_ERROR(x) ((x) << S_CIM_OVFL_ERROR) |
1564 | #define F_CIM_OVFL_ERROR V_CIM_OVFL_ERROR(1U) | 1806 | #define F_CIM_OVFL_ERROR V_CIM_OVFL_ERROR(1U) |
diff --git a/drivers/net/cxgb3/sge.c b/drivers/net/cxgb3/sge.c index 666c317dc6d6..cef153d1d32c 100644 --- a/drivers/net/cxgb3/sge.c +++ b/drivers/net/cxgb3/sge.c | |||
@@ -2443,6 +2443,15 @@ irq_handler_t t3_intr_handler(struct adapter *adap, int polling) | |||
2443 | return t3_intr; | 2443 | return t3_intr; |
2444 | } | 2444 | } |
2445 | 2445 | ||
2446 | #define SGE_PARERR (F_CPPARITYERROR | F_OCPARITYERROR | F_RCPARITYERROR | \ | ||
2447 | F_IRPARITYERROR | V_ITPARITYERROR(M_ITPARITYERROR) | \ | ||
2448 | V_FLPARITYERROR(M_FLPARITYERROR) | F_LODRBPARITYERROR | \ | ||
2449 | F_HIDRBPARITYERROR | F_LORCQPARITYERROR | \ | ||
2450 | F_HIRCQPARITYERROR) | ||
2451 | #define SGE_FRAMINGERR (F_UC_REQ_FRAMINGERROR | F_R_REQ_FRAMINGERROR) | ||
2452 | #define SGE_FATALERR (SGE_PARERR | SGE_FRAMINGERR | F_RSPQCREDITOVERFOW | \ | ||
2453 | F_RSPQDISABLED) | ||
2454 | |||
2446 | /** | 2455 | /** |
2447 | * t3_sge_err_intr_handler - SGE async event interrupt handler | 2456 | * t3_sge_err_intr_handler - SGE async event interrupt handler |
2448 | * @adapter: the adapter | 2457 | * @adapter: the adapter |
@@ -2453,6 +2462,13 @@ void t3_sge_err_intr_handler(struct adapter *adapter) | |||
2453 | { | 2462 | { |
2454 | unsigned int v, status = t3_read_reg(adapter, A_SG_INT_CAUSE); | 2463 | unsigned int v, status = t3_read_reg(adapter, A_SG_INT_CAUSE); |
2455 | 2464 | ||
2465 | if (status & SGE_PARERR) | ||
2466 | CH_ALERT(adapter, "SGE parity error (0x%x)\n", | ||
2467 | status & SGE_PARERR); | ||
2468 | if (status & SGE_FRAMINGERR) | ||
2469 | CH_ALERT(adapter, "SGE framing error (0x%x)\n", | ||
2470 | status & SGE_FRAMINGERR); | ||
2471 | |||
2456 | if (status & F_RSPQCREDITOVERFOW) | 2472 | if (status & F_RSPQCREDITOVERFOW) |
2457 | CH_ALERT(adapter, "SGE response queue credit overflow\n"); | 2473 | CH_ALERT(adapter, "SGE response queue credit overflow\n"); |
2458 | 2474 | ||
@@ -2469,7 +2485,7 @@ void t3_sge_err_intr_handler(struct adapter *adapter) | |||
2469 | status & F_HIPIODRBDROPERR ? "high" : "lo"); | 2485 | status & F_HIPIODRBDROPERR ? "high" : "lo"); |
2470 | 2486 | ||
2471 | t3_write_reg(adapter, A_SG_INT_CAUSE, status); | 2487 | t3_write_reg(adapter, A_SG_INT_CAUSE, status); |
2472 | if (status & (F_RSPQCREDITOVERFOW | F_RSPQDISABLED)) | 2488 | if (status & SGE_FATALERR) |
2473 | t3_fatal_err(adapter); | 2489 | t3_fatal_err(adapter); |
2474 | } | 2490 | } |
2475 | 2491 | ||
@@ -2781,7 +2797,7 @@ void t3_sge_init(struct adapter *adap, struct sge_params *p) | |||
2781 | unsigned int ctrl, ups = ffs(pci_resource_len(adap->pdev, 2) >> 12); | 2797 | unsigned int ctrl, ups = ffs(pci_resource_len(adap->pdev, 2) >> 12); |
2782 | 2798 | ||
2783 | ctrl = F_DROPPKT | V_PKTSHIFT(2) | F_FLMODE | F_AVOIDCQOVFL | | 2799 | ctrl = F_DROPPKT | V_PKTSHIFT(2) | F_FLMODE | F_AVOIDCQOVFL | |
2784 | F_CQCRDTCTRL | | 2800 | F_CQCRDTCTRL | F_CONGMODE | F_TNLFLMODE | F_FATLPERREN | |
2785 | V_HOSTPAGESIZE(PAGE_SHIFT - 11) | F_BIGENDIANINGRESS | | 2801 | V_HOSTPAGESIZE(PAGE_SHIFT - 11) | F_BIGENDIANINGRESS | |
2786 | V_USERSPACESIZE(ups ? ups - 1 : 0) | F_ISCSICOALESCING; | 2802 | V_USERSPACESIZE(ups ? ups - 1 : 0) | F_ISCSICOALESCING; |
2787 | #if SGE_NUM_GENBITS == 1 | 2803 | #if SGE_NUM_GENBITS == 1 |
@@ -2790,7 +2806,6 @@ void t3_sge_init(struct adapter *adap, struct sge_params *p) | |||
2790 | if (adap->params.rev > 0) { | 2806 | if (adap->params.rev > 0) { |
2791 | if (!(adap->flags & (USING_MSIX | USING_MSI))) | 2807 | if (!(adap->flags & (USING_MSIX | USING_MSI))) |
2792 | ctrl |= F_ONEINTMULTQ | F_OPTONEINTMULTQ; | 2808 | ctrl |= F_ONEINTMULTQ | F_OPTONEINTMULTQ; |
2793 | ctrl |= F_CQCRDTCTRL | F_AVOIDCQOVFL; | ||
2794 | } | 2809 | } |
2795 | t3_write_reg(adap, A_SG_CONTROL, ctrl); | 2810 | t3_write_reg(adap, A_SG_CONTROL, ctrl); |
2796 | t3_write_reg(adap, A_SG_EGR_RCQ_DRB_THRSH, V_HIRCQDRBTHRSH(512) | | 2811 | t3_write_reg(adap, A_SG_EGR_RCQ_DRB_THRSH, V_HIRCQDRBTHRSH(512) | |
@@ -2798,7 +2813,8 @@ void t3_sge_init(struct adapter *adap, struct sge_params *p) | |||
2798 | t3_write_reg(adap, A_SG_TIMER_TICK, core_ticks_per_usec(adap) / 10); | 2813 | t3_write_reg(adap, A_SG_TIMER_TICK, core_ticks_per_usec(adap) / 10); |
2799 | t3_write_reg(adap, A_SG_CMDQ_CREDIT_TH, V_THRESHOLD(32) | | 2814 | t3_write_reg(adap, A_SG_CMDQ_CREDIT_TH, V_THRESHOLD(32) | |
2800 | V_TIMEOUT(200 * core_ticks_per_usec(adap))); | 2815 | V_TIMEOUT(200 * core_ticks_per_usec(adap))); |
2801 | t3_write_reg(adap, A_SG_HI_DRB_HI_THRSH, 1000); | 2816 | t3_write_reg(adap, A_SG_HI_DRB_HI_THRSH, |
2817 | adap->params.rev < T3_REV_C ? 1000 : 500); | ||
2802 | t3_write_reg(adap, A_SG_HI_DRB_LO_THRSH, 256); | 2818 | t3_write_reg(adap, A_SG_HI_DRB_LO_THRSH, 256); |
2803 | t3_write_reg(adap, A_SG_LO_DRB_HI_THRSH, 1000); | 2819 | t3_write_reg(adap, A_SG_LO_DRB_HI_THRSH, 1000); |
2804 | t3_write_reg(adap, A_SG_LO_DRB_LO_THRSH, 256); | 2820 | t3_write_reg(adap, A_SG_LO_DRB_LO_THRSH, 256); |
diff --git a/drivers/net/cxgb3/t3_hw.c b/drivers/net/cxgb3/t3_hw.c index dfdda4735bd8..6e5b4992f17e 100644 --- a/drivers/net/cxgb3/t3_hw.c +++ b/drivers/net/cxgb3/t3_hw.c | |||
@@ -62,7 +62,7 @@ int t3_wait_op_done_val(struct adapter *adapter, int reg, u32 mask, | |||
62 | return 0; | 62 | return 0; |
63 | } | 63 | } |
64 | if (--attempts == 0) | 64 | if (--attempts == 0) |
65 | return -EAGAIN; | 65 | return -EAGAIN; |
66 | if (delay) | 66 | if (delay) |
67 | udelay(delay); | 67 | udelay(delay); |
68 | } | 68 | } |
@@ -1263,7 +1263,13 @@ static int t3_handle_intr_status(struct adapter *adapter, unsigned int reg, | |||
1263 | return fatal; | 1263 | return fatal; |
1264 | } | 1264 | } |
1265 | 1265 | ||
1266 | #define SGE_INTR_MASK (F_RSPQDISABLED) | 1266 | #define SGE_INTR_MASK (F_RSPQDISABLED | \ |
1267 | F_UC_REQ_FRAMINGERROR | F_R_REQ_FRAMINGERROR | \ | ||
1268 | F_CPPARITYERROR | F_OCPARITYERROR | F_RCPARITYERROR | \ | ||
1269 | F_IRPARITYERROR | V_ITPARITYERROR(M_ITPARITYERROR) | \ | ||
1270 | V_FLPARITYERROR(M_FLPARITYERROR) | F_LODRBPARITYERROR | \ | ||
1271 | F_HIDRBPARITYERROR | F_LORCQPARITYERROR | \ | ||
1272 | F_HIRCQPARITYERROR) | ||
1267 | #define MC5_INTR_MASK (F_PARITYERR | F_ACTRGNFULL | F_UNKNOWNCMD | \ | 1273 | #define MC5_INTR_MASK (F_PARITYERR | F_ACTRGNFULL | F_UNKNOWNCMD | \ |
1268 | F_REQQPARERR | F_DISPQPARERR | F_DELACTEMPTY | \ | 1274 | F_REQQPARERR | F_DISPQPARERR | F_DELACTEMPTY | \ |
1269 | F_NFASRCHFAIL) | 1275 | F_NFASRCHFAIL) |
@@ -1280,16 +1286,23 @@ static int t3_handle_intr_status(struct adapter *adapter, unsigned int reg, | |||
1280 | #define PCIE_INTR_MASK (F_UNXSPLCPLERRR | F_UNXSPLCPLERRC | F_PCIE_PIOPARERR |\ | 1286 | #define PCIE_INTR_MASK (F_UNXSPLCPLERRR | F_UNXSPLCPLERRC | F_PCIE_PIOPARERR |\ |
1281 | F_PCIE_WFPARERR | F_PCIE_RFPARERR | F_PCIE_CFPARERR | \ | 1287 | F_PCIE_WFPARERR | F_PCIE_RFPARERR | F_PCIE_CFPARERR | \ |
1282 | /* V_PCIE_MSIXPARERR(M_PCIE_MSIXPARERR) | */ \ | 1288 | /* V_PCIE_MSIXPARERR(M_PCIE_MSIXPARERR) | */ \ |
1283 | V_BISTERR(M_BISTERR)) | 1289 | F_RETRYBUFPARERR | F_RETRYLUTPARERR | F_RXPARERR | \ |
1284 | #define ULPRX_INTR_MASK F_PARERR | 1290 | F_TXPARERR | V_BISTERR(M_BISTERR)) |
1285 | #define ULPTX_INTR_MASK 0 | 1291 | #define ULPRX_INTR_MASK (F_PARERRDATA | F_PARERRPCMD | F_ARBPF1PERR | \ |
1286 | #define CPLSW_INTR_MASK (F_TP_FRAMING_ERROR | \ | 1292 | F_ARBPF0PERR | F_ARBFPERR | F_PCMDMUXPERR | \ |
1293 | F_DATASELFRAMEERR1 | F_DATASELFRAMEERR0) | ||
1294 | #define ULPTX_INTR_MASK 0xfc | ||
1295 | #define CPLSW_INTR_MASK (F_CIM_OP_MAP_PERR | F_TP_FRAMING_ERROR | \ | ||
1287 | F_SGE_FRAMING_ERROR | F_CIM_FRAMING_ERROR | \ | 1296 | F_SGE_FRAMING_ERROR | F_CIM_FRAMING_ERROR | \ |
1288 | F_ZERO_SWITCH_ERROR) | 1297 | F_ZERO_SWITCH_ERROR) |
1289 | #define CIM_INTR_MASK (F_BLKWRPLINT | F_BLKRDPLINT | F_BLKWRCTLINT | \ | 1298 | #define CIM_INTR_MASK (F_BLKWRPLINT | F_BLKRDPLINT | F_BLKWRCTLINT | \ |
1290 | F_BLKRDCTLINT | F_BLKWRFLASHINT | F_BLKRDFLASHINT | \ | 1299 | F_BLKRDCTLINT | F_BLKWRFLASHINT | F_BLKRDFLASHINT | \ |
1291 | F_SGLWRFLASHINT | F_WRBLKFLASHINT | F_BLKWRBOOTINT | \ | 1300 | F_SGLWRFLASHINT | F_WRBLKFLASHINT | F_BLKWRBOOTINT | \ |
1292 | F_FLASHRANGEINT | F_SDRAMRANGEINT | F_RSVDSPACEINT) | 1301 | F_FLASHRANGEINT | F_SDRAMRANGEINT | F_RSVDSPACEINT | \ |
1302 | F_DRAMPARERR | F_ICACHEPARERR | F_DCACHEPARERR | \ | ||
1303 | F_OBQSGEPARERR | F_OBQULPHIPARERR | F_OBQULPLOPARERR | \ | ||
1304 | F_IBQSGELOPARERR | F_IBQSGEHIPARERR | F_IBQULPPARERR | \ | ||
1305 | F_IBQTPPARERR | F_ITAGPARERR | F_DTAGPARERR) | ||
1293 | #define PMTX_INTR_MASK (F_ZERO_C_CMD_ERROR | ICSPI_FRM_ERR | OESPI_FRM_ERR | \ | 1306 | #define PMTX_INTR_MASK (F_ZERO_C_CMD_ERROR | ICSPI_FRM_ERR | OESPI_FRM_ERR | \ |
1294 | V_ICSPI_PAR_ERROR(M_ICSPI_PAR_ERROR) | \ | 1307 | V_ICSPI_PAR_ERROR(M_ICSPI_PAR_ERROR) | \ |
1295 | V_OESPI_PAR_ERROR(M_OESPI_PAR_ERROR)) | 1308 | V_OESPI_PAR_ERROR(M_OESPI_PAR_ERROR)) |
@@ -1358,6 +1371,10 @@ static void pcie_intr_handler(struct adapter *adapter) | |||
1358 | {F_PCIE_CFPARERR, "PCI command FIFO parity error", -1, 1}, | 1371 | {F_PCIE_CFPARERR, "PCI command FIFO parity error", -1, 1}, |
1359 | {V_PCIE_MSIXPARERR(M_PCIE_MSIXPARERR), | 1372 | {V_PCIE_MSIXPARERR(M_PCIE_MSIXPARERR), |
1360 | "PCI MSI-X table/PBA parity error", -1, 1}, | 1373 | "PCI MSI-X table/PBA parity error", -1, 1}, |
1374 | {F_RETRYBUFPARERR, "PCI retry buffer parity error", -1, 1}, | ||
1375 | {F_RETRYLUTPARERR, "PCI retry LUT parity error", -1, 1}, | ||
1376 | {F_RXPARERR, "PCI Rx parity error", -1, 1}, | ||
1377 | {F_TXPARERR, "PCI Tx parity error", -1, 1}, | ||
1361 | {V_BISTERR(M_BISTERR), "PCI BIST error", -1, 1}, | 1378 | {V_BISTERR(M_BISTERR), "PCI BIST error", -1, 1}, |
1362 | {0} | 1379 | {0} |
1363 | }; | 1380 | }; |
@@ -1384,15 +1401,15 @@ static void tp_intr_handler(struct adapter *adapter) | |||
1384 | }; | 1401 | }; |
1385 | 1402 | ||
1386 | static struct intr_info tp_intr_info_t3c[] = { | 1403 | static struct intr_info tp_intr_info_t3c[] = { |
1387 | { 0x1ffffff, "TP parity error", -1, 1 }, | 1404 | {0x1fffffff, "TP parity error", -1, 1}, |
1388 | { F_FLMRXFLSTEMPTY, "TP out of Rx pages", -1, 1 }, | 1405 | {F_FLMRXFLSTEMPTY, "TP out of Rx pages", -1, 1}, |
1389 | { F_FLMTXFLSTEMPTY, "TP out of Tx pages", -1, 1 }, | 1406 | {F_FLMTXFLSTEMPTY, "TP out of Tx pages", -1, 1}, |
1390 | { 0 } | 1407 | {0} |
1391 | }; | 1408 | }; |
1392 | 1409 | ||
1393 | if (t3_handle_intr_status(adapter, A_TP_INT_CAUSE, 0xffffffff, | 1410 | if (t3_handle_intr_status(adapter, A_TP_INT_CAUSE, 0xffffffff, |
1394 | adapter->params.rev < T3_REV_C ? | 1411 | adapter->params.rev < T3_REV_C ? |
1395 | tp_intr_info : tp_intr_info_t3c, NULL)) | 1412 | tp_intr_info : tp_intr_info_t3c, NULL)) |
1396 | t3_fatal_err(adapter); | 1413 | t3_fatal_err(adapter); |
1397 | } | 1414 | } |
1398 | 1415 | ||
@@ -1414,6 +1431,18 @@ static void cim_intr_handler(struct adapter *adapter) | |||
1414 | {F_BLKWRCTLINT, "CIM block write to CTL space", -1, 1}, | 1431 | {F_BLKWRCTLINT, "CIM block write to CTL space", -1, 1}, |
1415 | {F_BLKRDPLINT, "CIM block read from PL space", -1, 1}, | 1432 | {F_BLKRDPLINT, "CIM block read from PL space", -1, 1}, |
1416 | {F_BLKWRPLINT, "CIM block write to PL space", -1, 1}, | 1433 | {F_BLKWRPLINT, "CIM block write to PL space", -1, 1}, |
1434 | {F_DRAMPARERR, "CIM DRAM parity error", -1, 1}, | ||
1435 | {F_ICACHEPARERR, "CIM icache parity error", -1, 1}, | ||
1436 | {F_DCACHEPARERR, "CIM dcache parity error", -1, 1}, | ||
1437 | {F_OBQSGEPARERR, "CIM OBQ SGE parity error", -1, 1}, | ||
1438 | {F_OBQULPHIPARERR, "CIM OBQ ULPHI parity error", -1, 1}, | ||
1439 | {F_OBQULPLOPARERR, "CIM OBQ ULPLO parity error", -1, 1}, | ||
1440 | {F_IBQSGELOPARERR, "CIM IBQ SGELO parity error", -1, 1}, | ||
1441 | {F_IBQSGEHIPARERR, "CIM IBQ SGEHI parity error", -1, 1}, | ||
1442 | {F_IBQULPPARERR, "CIM IBQ ULP parity error", -1, 1}, | ||
1443 | {F_IBQTPPARERR, "CIM IBQ TP parity error", -1, 1}, | ||
1444 | {F_ITAGPARERR, "CIM itag parity error", -1, 1}, | ||
1445 | {F_DTAGPARERR, "CIM dtag parity error", -1, 1}, | ||
1417 | {0} | 1446 | {0} |
1418 | }; | 1447 | }; |
1419 | 1448 | ||
@@ -1428,7 +1457,14 @@ static void cim_intr_handler(struct adapter *adapter) | |||
1428 | static void ulprx_intr_handler(struct adapter *adapter) | 1457 | static void ulprx_intr_handler(struct adapter *adapter) |
1429 | { | 1458 | { |
1430 | static const struct intr_info ulprx_intr_info[] = { | 1459 | static const struct intr_info ulprx_intr_info[] = { |
1431 | {F_PARERR, "ULP RX parity error", -1, 1}, | 1460 | {F_PARERRDATA, "ULP RX data parity error", -1, 1}, |
1461 | {F_PARERRPCMD, "ULP RX command parity error", -1, 1}, | ||
1462 | {F_ARBPF1PERR, "ULP RX ArbPF1 parity error", -1, 1}, | ||
1463 | {F_ARBPF0PERR, "ULP RX ArbPF0 parity error", -1, 1}, | ||
1464 | {F_ARBFPERR, "ULP RX ArbF parity error", -1, 1}, | ||
1465 | {F_PCMDMUXPERR, "ULP RX PCMDMUX parity error", -1, 1}, | ||
1466 | {F_DATASELFRAMEERR1, "ULP RX frame error", -1, 1}, | ||
1467 | {F_DATASELFRAMEERR0, "ULP RX frame error", -1, 1}, | ||
1432 | {0} | 1468 | {0} |
1433 | }; | 1469 | }; |
1434 | 1470 | ||
@@ -1447,6 +1483,7 @@ static void ulptx_intr_handler(struct adapter *adapter) | |||
1447 | STAT_ULP_CH0_PBL_OOB, 0}, | 1483 | STAT_ULP_CH0_PBL_OOB, 0}, |
1448 | {F_PBL_BOUND_ERR_CH1, "ULP TX channel 1 PBL out of bounds", | 1484 | {F_PBL_BOUND_ERR_CH1, "ULP TX channel 1 PBL out of bounds", |
1449 | STAT_ULP_CH1_PBL_OOB, 0}, | 1485 | STAT_ULP_CH1_PBL_OOB, 0}, |
1486 | {0xfc, "ULP TX parity error", -1, 1}, | ||
1450 | {0} | 1487 | {0} |
1451 | }; | 1488 | }; |
1452 | 1489 | ||
@@ -1521,7 +1558,8 @@ static void pmrx_intr_handler(struct adapter *adapter) | |||
1521 | static void cplsw_intr_handler(struct adapter *adapter) | 1558 | static void cplsw_intr_handler(struct adapter *adapter) |
1522 | { | 1559 | { |
1523 | static const struct intr_info cplsw_intr_info[] = { | 1560 | static const struct intr_info cplsw_intr_info[] = { |
1524 | /* { F_CIM_OVFL_ERROR, "CPL switch CIM overflow", -1, 1 }, */ | 1561 | {F_CIM_OP_MAP_PERR, "CPL switch CIM parity error", -1, 1}, |
1562 | {F_CIM_OVFL_ERROR, "CPL switch CIM overflow", -1, 1}, | ||
1525 | {F_TP_FRAMING_ERROR, "CPL switch TP framing error", -1, 1}, | 1563 | {F_TP_FRAMING_ERROR, "CPL switch TP framing error", -1, 1}, |
1526 | {F_SGE_FRAMING_ERROR, "CPL switch SGE framing error", -1, 1}, | 1564 | {F_SGE_FRAMING_ERROR, "CPL switch SGE framing error", -1, 1}, |
1527 | {F_CIM_FRAMING_ERROR, "CPL switch CIM framing error", -1, 1}, | 1565 | {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, | |||
1907 | 0, SG_CONTEXT_CMD_ATTEMPTS, 1); | 1945 | 0, SG_CONTEXT_CMD_ATTEMPTS, 1); |
1908 | } | 1946 | } |
1909 | 1947 | ||
1948 | static int clear_sge_ctxt(struct adapter *adap, unsigned int id, | ||
1949 | unsigned int type) | ||
1950 | { | ||
1951 | t3_write_reg(adap, A_SG_CONTEXT_DATA0, 0); | ||
1952 | t3_write_reg(adap, A_SG_CONTEXT_DATA1, 0); | ||
1953 | t3_write_reg(adap, A_SG_CONTEXT_DATA2, 0); | ||
1954 | t3_write_reg(adap, A_SG_CONTEXT_DATA3, 0); | ||
1955 | return t3_sge_write_context(adap, id, type); | ||
1956 | } | ||
1957 | |||
1910 | /** | 1958 | /** |
1911 | * t3_sge_init_ecntxt - initialize an SGE egress context | 1959 | * t3_sge_init_ecntxt - initialize an SGE egress context |
1912 | * @adapter: the adapter to configure | 1960 | * @adapter: the adapter to configure |
@@ -2408,7 +2456,7 @@ static inline unsigned int pm_num_pages(unsigned int mem_size, | |||
2408 | t3_write_reg((adap), A_ ## reg, (start)); \ | 2456 | t3_write_reg((adap), A_ ## reg, (start)); \ |
2409 | start += size | 2457 | start += size |
2410 | 2458 | ||
2411 | /* | 2459 | /** |
2412 | * partition_mem - partition memory and configure TP memory settings | 2460 | * partition_mem - partition memory and configure TP memory settings |
2413 | * @adap: the adapter | 2461 | * @adap: the adapter |
2414 | * @p: the TP parameters | 2462 | * @p: the TP parameters |
@@ -2493,7 +2541,7 @@ static void tp_config(struct adapter *adap, const struct tp_params *p) | |||
2493 | V_AUTOSTATE2(1) | V_AUTOSTATE1(0) | | 2541 | V_AUTOSTATE2(1) | V_AUTOSTATE1(0) | |
2494 | V_BYTETHRESHOLD(16384) | V_MSSTHRESHOLD(2) | | 2542 | V_BYTETHRESHOLD(16384) | V_MSSTHRESHOLD(2) | |
2495 | F_AUTOCAREFUL | F_AUTOENABLE | V_DACK_MODE(1)); | 2543 | F_AUTOCAREFUL | F_AUTOENABLE | V_DACK_MODE(1)); |
2496 | t3_set_reg_field(adap, A_TP_IN_CONFIG, F_IPV6ENABLE | F_NICMODE, | 2544 | t3_set_reg_field(adap, A_TP_IN_CONFIG, F_RXFBARBPRIO | F_TXFBARBPRIO, |
2497 | F_IPV6ENABLE | F_NICMODE); | 2545 | F_IPV6ENABLE | F_NICMODE); |
2498 | t3_write_reg(adap, A_TP_TX_RESOURCE_LIMIT, 0x18141814); | 2546 | t3_write_reg(adap, A_TP_TX_RESOURCE_LIMIT, 0x18141814); |
2499 | t3_write_reg(adap, A_TP_PARA_REG4, 0x5050105); | 2547 | 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) | |||
2505 | F_ENABLEEPCMDAFULL, | 2553 | F_ENABLEEPCMDAFULL, |
2506 | F_ENABLEOCSPIFULL |F_TXDEFERENABLE | F_HEARBEATDACK | | 2554 | F_ENABLEOCSPIFULL |F_TXDEFERENABLE | F_HEARBEATDACK | |
2507 | F_TXCONGESTIONMODE | F_RXCONGESTIONMODE); | 2555 | F_TXCONGESTIONMODE | F_RXCONGESTIONMODE); |
2508 | t3_set_reg_field(adap, A_TP_PC_CONFIG2, F_CHDRAFULL, 0); | 2556 | t3_set_reg_field(adap, A_TP_PC_CONFIG2, F_CHDRAFULL, |
2557 | F_ENABLEIPV6RSS | F_ENABLENONOFDTNLSYN | | ||
2558 | F_ENABLEARPMISS | F_DISBLEDAPARBIT0); | ||
2509 | t3_write_reg(adap, A_TP_PROXY_FLOW_CNTL, 1080); | 2559 | t3_write_reg(adap, A_TP_PROXY_FLOW_CNTL, 1080); |
2510 | t3_write_reg(adap, A_TP_PROXY_FLOW_CNTL, 1000); | 2560 | t3_write_reg(adap, A_TP_PROXY_FLOW_CNTL, 1000); |
2511 | 2561 | ||
@@ -3212,7 +3262,8 @@ static void config_pcie(struct adapter *adap) | |||
3212 | V_REPLAYLMT(rpllmt)); | 3262 | V_REPLAYLMT(rpllmt)); |
3213 | 3263 | ||
3214 | t3_write_reg(adap, A_PCIE_PEX_ERR, 0xffffffff); | 3264 | t3_write_reg(adap, A_PCIE_PEX_ERR, 0xffffffff); |
3215 | t3_set_reg_field(adap, A_PCIE_CFG, F_PCIE_CLIDECEN, F_PCIE_CLIDECEN); | 3265 | t3_set_reg_field(adap, A_PCIE_CFG, 0, |
3266 | F_PCIE_DMASTOPEN | F_PCIE_CLIDECEN); | ||
3216 | } | 3267 | } |
3217 | 3268 | ||
3218 | /* | 3269 | /* |
@@ -3225,7 +3276,7 @@ static void config_pcie(struct adapter *adap) | |||
3225 | */ | 3276 | */ |
3226 | int t3_init_hw(struct adapter *adapter, u32 fw_params) | 3277 | int t3_init_hw(struct adapter *adapter, u32 fw_params) |
3227 | { | 3278 | { |
3228 | int err = -EIO, attempts = 100; | 3279 | int err = -EIO, attempts, i; |
3229 | const struct vpd_params *vpd = &adapter->params.vpd; | 3280 | const struct vpd_params *vpd = &adapter->params.vpd; |
3230 | 3281 | ||
3231 | if (adapter->params.rev > 0) | 3282 | if (adapter->params.rev > 0) |
@@ -3243,6 +3294,10 @@ int t3_init_hw(struct adapter *adapter, u32 fw_params) | |||
3243 | adapter->params.mc5.nfilters, | 3294 | adapter->params.mc5.nfilters, |
3244 | adapter->params.mc5.nroutes)) | 3295 | adapter->params.mc5.nroutes)) |
3245 | goto out_err; | 3296 | goto out_err; |
3297 | |||
3298 | for (i = 0; i < 32; i++) | ||
3299 | if (clear_sge_ctxt(adapter, i, F_CQ)) | ||
3300 | goto out_err; | ||
3246 | } | 3301 | } |
3247 | 3302 | ||
3248 | if (tp_init(adapter, &adapter->params.tp)) | 3303 | if (tp_init(adapter, &adapter->params.tp)) |
@@ -3258,7 +3313,8 @@ int t3_init_hw(struct adapter *adapter, u32 fw_params) | |||
3258 | if (is_pcie(adapter)) | 3313 | if (is_pcie(adapter)) |
3259 | config_pcie(adapter); | 3314 | config_pcie(adapter); |
3260 | else | 3315 | else |
3261 | t3_set_reg_field(adapter, A_PCIX_CFG, 0, F_CLIDECEN); | 3316 | t3_set_reg_field(adapter, A_PCIX_CFG, 0, |
3317 | F_DMASTOPEN | F_CLIDECEN); | ||
3262 | 3318 | ||
3263 | if (adapter->params.rev == T3_REV_C) | 3319 | if (adapter->params.rev == T3_REV_C) |
3264 | t3_set_reg_field(adapter, A_ULPTX_CONFIG, 0, | 3320 | t3_set_reg_field(adapter, A_ULPTX_CONFIG, 0, |
@@ -3275,6 +3331,7 @@ int t3_init_hw(struct adapter *adapter, u32 fw_params) | |||
3275 | V_BOOTADDR(FW_FLASH_BOOT_ADDR >> 2)); | 3331 | V_BOOTADDR(FW_FLASH_BOOT_ADDR >> 2)); |
3276 | t3_read_reg(adapter, A_CIM_BOOT_CFG); /* flush */ | 3332 | t3_read_reg(adapter, A_CIM_BOOT_CFG); /* flush */ |
3277 | 3333 | ||
3334 | attempts = 100; | ||
3278 | do { /* wait for uP to initialize */ | 3335 | do { /* wait for uP to initialize */ |
3279 | msleep(20); | 3336 | msleep(20); |
3280 | } while (t3_read_reg(adapter, A_CIM_HOST_ACC_DATA) && --attempts); | 3337 | } 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) | |||
3409 | t3_write_reg(adapter, A_T3DBG_GPIO_EN, | 3466 | t3_write_reg(adapter, A_T3DBG_GPIO_EN, |
3410 | ai->gpio_out | F_GPIO0_OEN | F_GPIO0_OUT_VAL); | 3467 | ai->gpio_out | F_GPIO0_OEN | F_GPIO0_OUT_VAL); |
3411 | t3_write_reg(adapter, A_MC5_DB_SERVER_INDEX, 0); | 3468 | t3_write_reg(adapter, A_MC5_DB_SERVER_INDEX, 0); |
3469 | t3_write_reg(adapter, A_SG_OCO_BASE, V_BASE1(0xfff)); | ||
3412 | 3470 | ||
3413 | if (adapter->params.rev == 0 || !uses_xaui(adapter)) | 3471 | if (adapter->params.rev == 0 || !uses_xaui(adapter)) |
3414 | val |= F_ENRGMII; | 3472 | val |= F_ENRGMII; |
@@ -3458,6 +3516,36 @@ static int t3_reset_adapter(struct adapter *adapter) | |||
3458 | return 0; | 3516 | return 0; |
3459 | } | 3517 | } |
3460 | 3518 | ||
3519 | static int __devinit init_parity(struct adapter *adap) | ||
3520 | { | ||
3521 | int i, err, addr; | ||
3522 | |||
3523 | if (t3_read_reg(adap, A_SG_CONTEXT_CMD) & F_CONTEXT_CMD_BUSY) | ||
3524 | return -EBUSY; | ||
3525 | |||
3526 | for (err = i = 0; !err && i < 16; i++) | ||
3527 | err = clear_sge_ctxt(adap, i, F_EGRESS); | ||
3528 | for (i = 0xfff0; !err && i <= 0xffff; i++) | ||
3529 | err = clear_sge_ctxt(adap, i, F_EGRESS); | ||
3530 | for (i = 0; !err && i < SGE_QSETS; i++) | ||
3531 | err = clear_sge_ctxt(adap, i, F_RESPONSEQ); | ||
3532 | if (err) | ||
3533 | return err; | ||
3534 | |||
3535 | t3_write_reg(adap, A_CIM_IBQ_DBG_DATA, 0); | ||
3536 | for (i = 0; i < 4; i++) | ||
3537 | for (addr = 0; addr <= M_IBQDBGADDR; addr++) { | ||
3538 | t3_write_reg(adap, A_CIM_IBQ_DBG_CFG, F_IBQDBGEN | | ||
3539 | F_IBQDBGWR | V_IBQDBGQID(i) | | ||
3540 | V_IBQDBGADDR(addr)); | ||
3541 | err = t3_wait_op_done(adap, A_CIM_IBQ_DBG_CFG, | ||
3542 | F_IBQDBGBUSY, 0, 2, 1); | ||
3543 | if (err) | ||
3544 | return err; | ||
3545 | } | ||
3546 | return 0; | ||
3547 | } | ||
3548 | |||
3461 | /* | 3549 | /* |
3462 | * Initialize adapter SW state for the various HW modules, set initial values | 3550 | * Initialize adapter SW state for the various HW modules, set initial values |
3463 | * for some adapter tunables, take PHYs out of reset, and initialize the MDIO | 3551 | * 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, | |||
3525 | } | 3613 | } |
3526 | 3614 | ||
3527 | early_hw_init(adapter, ai); | 3615 | early_hw_init(adapter, ai); |
3616 | ret = init_parity(adapter); | ||
3617 | if (ret) | ||
3618 | return ret; | ||
3528 | 3619 | ||
3529 | for_each_port(adapter, i) { | 3620 | for_each_port(adapter, i) { |
3530 | u8 hw_addr[6]; | 3621 | u8 hw_addr[6]; |