34 #include <linux/pci.h>
36 #include <linux/sched.h>
50 unsigned long sbuf[4];
57 sbuf[0] = ipath_read_kreg64(
59 sbuf[1] = ipath_read_kreg64(
62 sbuf[2] = ipath_read_kreg64(
65 sbuf[3] = ipath_read_kreg64(
70 if (sbuf[0] || sbuf[1] || (piobcnt > 128 && (sbuf[2] || sbuf[3]))) {
75 "SendbufErrs %lx %lx", sbuf[0],
78 printk(
" %lx %lx ", sbuf[2], sbuf[3]);
82 for (i = 0; i < piobcnt; i++)
92 #define E_SUM_PKTERRS \
93 (INFINIPATH_E_RHDRLEN | INFINIPATH_E_RBADTID | \
94 INFINIPATH_E_RBADVERSION | INFINIPATH_E_RHDR | \
95 INFINIPATH_E_RLONGPKTLEN | INFINIPATH_E_RSHORTPKTLEN | \
96 INFINIPATH_E_RMAXPKTLEN | INFINIPATH_E_RMINPKTLEN | \
97 INFINIPATH_E_RFORMATERR | INFINIPATH_E_RUNSUPVL | \
98 INFINIPATH_E_RUNEXPCHAR | INFINIPATH_E_REBP)
102 (INFINIPATH_E_SPIOARMLAUNCH | INFINIPATH_E_SUNEXPERRPKTNUM | \
103 INFINIPATH_E_SDROPPEDDATAPKT | INFINIPATH_E_SDROPPEDSMPPKT | \
104 INFINIPATH_E_SMAXPKTLEN | INFINIPATH_E_SUNSUPVL | \
105 INFINIPATH_E_SMINPKTLEN | INFINIPATH_E_SPKTLEN | \
106 INFINIPATH_E_INVALIDADDR)
114 #define E_SPKT_ERRS_IGNORE \
115 (INFINIPATH_E_SDROPPEDDATAPKT | INFINIPATH_E_SDROPPEDSMPPKT | \
116 INFINIPATH_E_SMAXPKTLEN | INFINIPATH_E_SMINPKTLEN | \
117 INFINIPATH_E_SPKTLEN)
125 #define E_SUM_LINK_PKTERRS \
126 (INFINIPATH_E_SDROPPEDDATAPKT | INFINIPATH_E_SDROPPEDSMPPKT | \
127 INFINIPATH_E_SMINPKTLEN | INFINIPATH_E_SPKTLEN | \
128 INFINIPATH_E_RSHORTPKTLEN | INFINIPATH_E_RMINPKTLEN | \
129 INFINIPATH_E_RUNEXPCHAR)
133 u64 ignore_this_time = 0;
145 ipath_dbg(
"Ignoring packet errors %llx, because link not "
146 "ACTIVE\n", (
unsigned long long) errs);
150 return ignore_this_time;
154 #define INFINIPATH_HWE_TXEMEMPARITYERR_MSG(a) \
156 .mask = ( INFINIPATH_HWE_TXEMEMPARITYERR_##a << \
157 INFINIPATH_HWE_TXEMEMPARITYERR_SHIFT ), \
158 .msg = "TXE " #a " Memory Parity" \
160 #define INFINIPATH_HWE_RXEMEMPARITYERR_MSG(a) \
162 .mask = ( INFINIPATH_HWE_RXEMEMPARITYERR_##a << \
163 INFINIPATH_HWE_RXEMEMPARITYERR_SHIFT ), \
164 .msg = "RXE " #a " Memory Parity" \
190 static void ipath_format_hwmsg(
char *
msg,
size_t msgl,
const char *hwmsg)
208 char *
msg,
size_t msgl)
214 for (i=0; i<glen; i++) {
215 if (hwerrs & ipath_generic_hwerror_msgs[i].
mask) {
216 ipath_format_hwmsg(msg, msgl,
217 ipath_generic_hwerror_msgs[i].msg);
221 for (i=0; i<nhwerrmsgs; i++) {
222 if (hwerrs & hwerrmsgs[i].
mask) {
223 ipath_format_hwmsg(msg, msgl, hwerrmsgs[i].msg);
234 state = ipath_ib_state(dd, ibcs);
237 else if (state == dd->
ib_arm)
251 event.element.port_num = 1;
256 static void handle_e_ibstatuschanged(
struct ipath_devdata *dd,
259 u32 ltstate, lstate, ibstate, lastlstate;
263 const u64 ibcs = ipath_read_kreg64(dd, dd->
ipath_kregs->kr_ibcstatus);
265 lstate = ipath_ib_linkstate(dd, ibcs);
266 ibstate = ipath_ib_state(dd, ibcs);
269 ltstate = ipath_ib_linktrstate(dd, ibcs);
295 ipath_cdbg(LINKVERB,
"LinkUp handled, skipped\n");
306 ipath_cdbg(LINKVERB,
"LinkDown handled, skipped\n");
316 if ((ibstate != arm && ibstate != active) &&
320 "ARM" :
"ACTIVE", ib_linkstate(dd, ibcs));
344 ipath_cdbg(LINKVERB,
"POLL change to %s (%x)\n",
358 ipath_dbg(
"IB linkrecov up %Lx (%s %s) recov %Lu\n",
359 (
unsigned long long) ibcs,
360 ib_linkstate(dd, ibcs),
362 (
unsigned long long) linkrecov);
370 if (ibstate == init || ibstate == arm || ibstate == active) {
372 if (ibstate == init || ibstate == arm) {
377 if (ibstate == arm) {
383 }
else if (ibstate == init) {
416 if (lstate == lastlstate)
417 ipath_cdbg(LINKVERB,
"Unchanged from last: %s "
418 "(%x)\n", ib_linkstate(dd, ibcs), ibstate);
435 "(state 0x%x), from %s\n",
439 ipath_cdbg(LINKVERB,
"Unit %u link state changed "
440 "to %s (0x%x) from down (%x)\n",
443 ibstate, lastlstate);
453 unsigned supp_msgs,
char *
msg,
u32 msgsz)
475 "fast-repeating errors (%s) (%llx)\n",
488 ipath_dbg(
"Suppressed %u messages for %s\n",
492 "Suppressed %u messages for %s\n",
498 static unsigned handle_frequent_errors(
struct ipath_devdata *dd,
500 u32 msgsz,
int *noprint)
503 static unsigned long nextmsg_time;
504 static unsigned nmsgs, supp_msgs;
516 nextmsg_time = nc +
HZ * 3;
518 else if (supp_msgs) {
519 handle_supp_msgs(dd, supp_msgs, msg, msgsz);
524 else if (!nmsgs++ ||
time_after(nc, nextmsg_time))
525 nextmsg_time = nc +
HZ / 2;
539 ipath_dbg(
"errors %lx (%s)\n", (
unsigned long)errs, msg);
542 unsigned long tl, hd,
status, lengen;
543 tl = ipath_read_kreg64(dd, dd->
ipath_kregs->kr_senddmatail);
544 hd = ipath_read_kreg64(dd, dd->
ipath_kregs->kr_senddmahead);
545 status = ipath_read_kreg64(dd
547 lengen = ipath_read_kreg64(dd,
550 "lengen 0x%lx\n", tl, hd, status, lengen);
574 expected ?
"expected" :
"unexpected");
601 if (pd->
port_head != ipath_get_hdrqtail(pd))
602 chkerrpkts |= 1 <<
i;
614 tl = ipath_get_rcvhdrtail(pd);
634 u64 ignore_this_time = 0;
636 int chkerrpkts = 0, noprint = 0;
647 supp_msgs = handle_frequent_errors(dd, errs, msg, (
u32)
sizeof msg,
664 handle_sdma_errors(dd, errs);
668 "%llx set\n", (
unsigned long long)
672 ignore_this_time = handle_e_sum_errs(dd, errs);
682 ipath_dbg(
"Ignoring packet errors %llx, because link not "
683 "ACTIVE\n", (
unsigned long long) errs);
687 if (supp_msgs == 250000) {
698 ipath_write_kreg(dd, dd->
ipath_kregs->kr_errormask,
707 "error(s) %llx reporting; too frequent (%s)\n",
719 ipath_dbg(
"Temporarily disabling reporting "
720 "too frequent queue full errors (%s)\n",
724 "Temporarily disabling reporting too"
725 " frequent packet errors (%s)\n",
739 ipath_write_kreg(dd, dd->
ipath_kregs->kr_errorclear, errs);
740 if (ignore_this_time)
741 errs &= ~ignore_this_time;
746 ~(INFINIPATH_E_HARDWARE |
761 "Suppressed %s error (%llx) after sendbuf cancel\n",
763 "armlaunch" :
"sendpktlen", (
unsigned long long)errs);
794 if (errs & E_SUM_ERRS)
812 chkerrpkts |= handle_hdrq_full(dd);
823 if (pd->
port_head != ipath_get_hdrqtail(pd))
843 ipath_dbg(
"Lost link, link now down (%s)\n",
848 handle_e_ibstatuschanged(dd, errs);
853 "(unload and reload driver)\n");
860 if (!noprint && *msg) {
890 ipath_write_kreg(dd, dd->
ipath_kregs->kr_errormask, 0ULL);
893 ipath_write_kreg(dd, dd->
ipath_kregs->kr_intmask, 0ULL);
900 ipath_read_kreg64(dd, dd->
ipath_kregs->kr_scratch);
911 ipath_write_kreg(dd, dd->
ipath_kregs->kr_hwerrclear, 0ULL);
912 ipath_write_kreg(dd, dd->
ipath_kregs->kr_errorclear,
914 ipath_write_kreg(dd, dd->
ipath_kregs->kr_errormask,
917 ipath_write_kreg(dd, dd->
ipath_kregs->kr_intclear, 0ULL);
932 if (++*unexpectp > 100) {
933 if (++*unexpectp > 105) {
943 "interrupts, unregistering "
944 "interrupt handler\n",
951 if (ipath_read_ireg(dd, dd->
ipath_kregs->kr_intmask)) {
953 "disabling interrupts completely\n",
961 }
else if (*unexpectp > 1)
962 ipath_dbg(
"Interrupt when not ready, should not happen, "
977 "Read of interrupt status failed (all bits set)\n");
980 ipath_write_kreg(dd, dd->
ipath_kregs->kr_intmask, 0ULL);
983 "unregistering interrupt\n");
985 }
else if (allbits > 2) {
986 if ((allbits % 10000) == 0)
990 "multiple errors\n");
1007 ipath_write_kreg(dd, dd->
ipath_kregs->kr_sendctrl,
1009 ipath_read_kreg64(dd, dd->
ipath_kregs->kr_scratch);
1041 if (portr & (1 << i) && pd && pd->
port_cnt) {
1068 u64 istat, chk0rcv = 0;
1071 static unsigned unexpected = 0;
1097 ipath_bad_intr(dd, &unexpected);
1102 istat = ipath_read_ireg(dd, dd->
ipath_kregs->kr_intstatus);
1110 ipath_bad_regread(dd);
1121 "interrupt with unknown interrupts %Lx set\n",
1122 (
unsigned long long)
1126 (
unsigned long long) istat);
1130 estat = ipath_read_kreg64(dd,
1134 "but no error bits set!\n",
1135 (
unsigned long long) istat);
1136 else if (estat == -1
LL)
1142 "(all bits set); ignoring\n");
1144 chk0rcv |= handle_errors(dd, estat);
1160 gpiostatus = ipath_read_kreg32(
1177 ipath_dbg(
"Overrun Threshold exceeded\n");
1181 ipath_dbg(
"Local Link Integrity error\n");
1184 gpiostatus &= ~IPATH_GPIO_ERRINTR_MASK;
1209 if (mask & gpiostatus) {
1210 ipath_dbg(
"Unexpected GPIO IRQ bits %x\n",
1212 to_clear |= (gpiostatus &
mask);
1214 ipath_write_kreg(dd,
1220 ipath_write_kreg(dd, dd->
ipath_kregs->kr_gpio_clear,
1233 ipath_write_kreg(dd, dd->
ipath_kregs->kr_intclear, istat);
1243 if (chk0rcv || (istat & kportrbits)) {
1244 istat &= ~kportrbits;
1250 handle_urcv(dd, istat);
1252 if (istat & (INFINIPATH_I_SDMAINT | INFINIPATH_I_SDMADISABLED))
1253 handle_sdma_intr(dd, istat);
1256 unsigned long flags;
1260 ipath_write_kreg(dd, dd->
ipath_kregs->kr_sendctrl,
1262 ipath_read_kreg64(dd, dd->
ipath_kregs->kr_scratch);
1266 handle_layer_pioavail(dd);