1108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan/* 2e7eacd36865ae0707f5efae8e4dda421ffcd1b66Ralph Campbell * Copyright (c) 2006, 2007, 2008 QLogic Corporation. All rights reserved. 3108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * Copyright (c) 2003, 2004, 2005, 2006 PathScale, Inc. All rights reserved. 4108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * 5108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * This software is available to you under a choice of one of two 6108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * licenses. You may choose to be licensed under the terms of the GNU 7108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * General Public License (GPL) Version 2, available from the file 8108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * COPYING in the main directory of this source tree, or the 9108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * OpenIB.org BSD license below: 10108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * 11108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * Redistribution and use in source and binary forms, with or 12108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * without modification, are permitted provided that the following 13108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * conditions are met: 14108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * 15108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * - Redistributions of source code must retain the above 16108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * copyright notice, this list of conditions and the following 17108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * disclaimer. 18108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * 19108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * - Redistributions in binary form must reproduce the above 20108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * copyright notice, this list of conditions and the following 21108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * disclaimer in the documentation and/or other materials 22108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * provided with the distribution. 23108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * 24108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 25108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 26108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 27108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 28108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 29108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 30108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 31108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * SOFTWARE. 32108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan */ 33108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan 34108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan#include "ipath_kernel.h" 35108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan 36108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivanstruct infinipath_stats ipath_stats; 37108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan 38108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan/** 39108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * ipath_snap_cntr - snapshot a chip counter 40108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * @dd: the infinipath device 41108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * @creg: the counter to snapshot 42108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * 43108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * called from add_timer and user counter read calls, to deal with 44108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * counters that wrap in "human time". The words sent and received, and 45108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * the packets sent and received are all that we worry about. For now, 46108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * at least, we don't worry about error counters, because if they wrap 47108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * that quickly, we probably don't care. We may eventually just make this 48108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * handle all the counters. word counters can wrap in about 20 seconds 49108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * of full bandwidth traffic, packet counters in a few hours. 50108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan */ 51108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan 52108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivanu64 ipath_snap_cntr(struct ipath_devdata *dd, ipath_creg creg) 53108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan{ 54108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan u32 val, reg64 = 0; 55108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan u64 val64; 56108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan unsigned long t0, t1; 57108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan u64 ret; 58108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan 59108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan t0 = jiffies; 60108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan /* If fast increment counters are only 32 bits, snapshot them, 61108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * and maintain them as 64bit values in the driver */ 62108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan if (!(dd->ipath_flags & IPATH_32BITCOUNTERS) && 63108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan (creg == dd->ipath_cregs->cr_wordsendcnt || 64108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan creg == dd->ipath_cregs->cr_wordrcvcnt || 65108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan creg == dd->ipath_cregs->cr_pktsendcnt || 66108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan creg == dd->ipath_cregs->cr_pktrcvcnt)) { 67108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan val64 = ipath_read_creg(dd, creg); 68108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan val = val64 == ~0ULL ? ~0U : 0; 69108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan reg64 = 1; 70108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan } else /* val64 just to keep gcc quiet... */ 71108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan val64 = val = ipath_read_creg32(dd, creg); 72108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan /* 73108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * See if a second has passed. This is just a way to detect things 74108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * that are quite broken. Normally this should take just a few 75108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * cycles (the check is for long enough that we don't care if we get 76108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * pre-empted.) An Opteron HT O read timeout is 4 seconds with 77108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * normal NB values 78108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan */ 79108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan t1 = jiffies; 80108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan if (time_before(t0 + HZ, t1) && val == -1) { 81108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan ipath_dev_err(dd, "Error! Read counter 0x%x timed out\n", 82108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan creg); 83108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan ret = 0ULL; 84108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan goto bail; 85108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan } 86108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan if (reg64) { 87108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan ret = val64; 88108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan goto bail; 89108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan } 90108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan 91108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan if (creg == dd->ipath_cregs->cr_wordsendcnt) { 92108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan if (val != dd->ipath_lastsword) { 93108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan dd->ipath_sword += val - dd->ipath_lastsword; 94108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan dd->ipath_lastsword = val; 95108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan } 96108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan val64 = dd->ipath_sword; 97108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan } else if (creg == dd->ipath_cregs->cr_wordrcvcnt) { 98108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan if (val != dd->ipath_lastrword) { 99108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan dd->ipath_rword += val - dd->ipath_lastrword; 100108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan dd->ipath_lastrword = val; 101108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan } 102108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan val64 = dd->ipath_rword; 103108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan } else if (creg == dd->ipath_cregs->cr_pktsendcnt) { 104108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan if (val != dd->ipath_lastspkts) { 105108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan dd->ipath_spkts += val - dd->ipath_lastspkts; 106108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan dd->ipath_lastspkts = val; 107108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan } 108108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan val64 = dd->ipath_spkts; 109108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan } else if (creg == dd->ipath_cregs->cr_pktrcvcnt) { 110108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan if (val != dd->ipath_lastrpkts) { 111108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan dd->ipath_rpkts += val - dd->ipath_lastrpkts; 112108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan dd->ipath_lastrpkts = val; 113108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan } 114108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan val64 = dd->ipath_rpkts; 11560e845035a066e81af1a29047530088d59150d8bDave Olson } else if (creg == dd->ipath_cregs->cr_ibsymbolerrcnt) { 11660e845035a066e81af1a29047530088d59150d8bDave Olson if (dd->ibdeltainprog) 11760e845035a066e81af1a29047530088d59150d8bDave Olson val64 -= val64 - dd->ibsymsnap; 11860e845035a066e81af1a29047530088d59150d8bDave Olson val64 -= dd->ibsymdelta; 11960e845035a066e81af1a29047530088d59150d8bDave Olson } else if (creg == dd->ipath_cregs->cr_iblinkerrrecovcnt) { 12060e845035a066e81af1a29047530088d59150d8bDave Olson if (dd->ibdeltainprog) 12160e845035a066e81af1a29047530088d59150d8bDave Olson val64 -= val64 - dd->iblnkerrsnap; 12260e845035a066e81af1a29047530088d59150d8bDave Olson val64 -= dd->iblnkerrdelta; 123108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan } else 124108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan val64 = (u64) val; 125108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan 126108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan ret = val64; 127108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan 128108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivanbail: 129108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan return ret; 130108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan} 131108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan 132108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan/** 133108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * ipath_qcheck - print delta of egrfull/hdrqfull errors for kernel ports 134108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * @dd: the infinipath device 135108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * 136108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * print the delta of egrfull/hdrqfull errors for kernel ports no more than 137108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * every 5 seconds. User processes are printed at close, but kernel doesn't 138108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * close, so... Separate routine so may call from other places someday, and 139108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * so function name when printed by _IPATH_INFO is meaningfull 140108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan */ 141108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivanstatic void ipath_qcheck(struct ipath_devdata *dd) 142108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan{ 143108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan static u64 last_tot_hdrqfull; 144c59a80aca0bfc491d90534ed5606d5493eca24a3Ralph Campbell struct ipath_portdata *pd = dd->ipath_pd[0]; 145108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan size_t blen = 0; 146108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan char buf[128]; 1479355fb6a064723c71e80e9c78de3140b43bfb52dRalph Campbell u32 hdrqtail; 148108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan 149108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan *buf = 0; 150c59a80aca0bfc491d90534ed5606d5493eca24a3Ralph Campbell if (pd->port_hdrqfull != dd->ipath_p0_hdrqfull) { 151108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan blen = snprintf(buf, sizeof buf, "port 0 hdrqfull %u", 152c59a80aca0bfc491d90534ed5606d5493eca24a3Ralph Campbell pd->port_hdrqfull - 153108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan dd->ipath_p0_hdrqfull); 154c59a80aca0bfc491d90534ed5606d5493eca24a3Ralph Campbell dd->ipath_p0_hdrqfull = pd->port_hdrqfull; 155108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan } 156108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan if (ipath_stats.sps_etidfull != dd->ipath_last_tidfull) { 157108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan blen += snprintf(buf + blen, sizeof buf - blen, 158108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan "%srcvegrfull %llu", 159108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan blen ? ", " : "", 160108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan (unsigned long long) 161108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan (ipath_stats.sps_etidfull - 162108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan dd->ipath_last_tidfull)); 163108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan dd->ipath_last_tidfull = ipath_stats.sps_etidfull; 164108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan } 165108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan 166108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan /* 167108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * this is actually the number of hdrq full interrupts, not actual 168108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * events, but at the moment that's mostly what I'm interested in. 169108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * Actual count, etc. is in the counters, if needed. For production 170108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * users this won't ordinarily be printed. 171108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan */ 172108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan 173108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan if ((ipath_debug & (__IPATH_PKTDBG | __IPATH_DBG)) && 174108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan ipath_stats.sps_hdrqfull != last_tot_hdrqfull) { 175108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan blen += snprintf(buf + blen, sizeof buf - blen, 176108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan "%shdrqfull %llu (all ports)", 177108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan blen ? ", " : "", 178108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan (unsigned long long) 179108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan (ipath_stats.sps_hdrqfull - 180108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan last_tot_hdrqfull)); 181108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan last_tot_hdrqfull = ipath_stats.sps_hdrqfull; 182108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan } 183108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan if (blen) 184108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan ipath_dbg("%s\n", buf); 185108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan 1869355fb6a064723c71e80e9c78de3140b43bfb52dRalph Campbell hdrqtail = ipath_get_hdrqtail(pd); 1879355fb6a064723c71e80e9c78de3140b43bfb52dRalph Campbell if (pd->port_head != hdrqtail) { 188108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan if (dd->ipath_lastport0rcv_cnt == 189108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan ipath_stats.sps_port0pkts) { 190108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan ipath_cdbg(PKT, "missing rcv interrupts? " 1919355fb6a064723c71e80e9c78de3140b43bfb52dRalph Campbell "port0 hd=%x tl=%x; port0pkts %llx; write" 1929355fb6a064723c71e80e9c78de3140b43bfb52dRalph Campbell " hd (w/intr)\n", 1939355fb6a064723c71e80e9c78de3140b43bfb52dRalph Campbell pd->port_head, hdrqtail, 194108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan (unsigned long long) 195108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan ipath_stats.sps_port0pkts); 1969355fb6a064723c71e80e9c78de3140b43bfb52dRalph Campbell ipath_write_ureg(dd, ur_rcvhdrhead, hdrqtail | 1979355fb6a064723c71e80e9c78de3140b43bfb52dRalph Campbell dd->ipath_rhdrhead_intr_off, pd->port_port); 198108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan } 199108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan dd->ipath_lastport0rcv_cnt = ipath_stats.sps_port0pkts; 200108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan } 201108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan} 202108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan 20378d1e02fac0595a8aa8a5064d1bd0c0ea55b22b0Dave Olsonstatic void ipath_chk_errormask(struct ipath_devdata *dd) 20478d1e02fac0595a8aa8a5064d1bd0c0ea55b22b0Dave Olson{ 20578d1e02fac0595a8aa8a5064d1bd0c0ea55b22b0Dave Olson static u32 fixed; 20678d1e02fac0595a8aa8a5064d1bd0c0ea55b22b0Dave Olson u32 ctrl; 20778d1e02fac0595a8aa8a5064d1bd0c0ea55b22b0Dave Olson unsigned long errormask; 20878d1e02fac0595a8aa8a5064d1bd0c0ea55b22b0Dave Olson unsigned long hwerrs; 20978d1e02fac0595a8aa8a5064d1bd0c0ea55b22b0Dave Olson 21078d1e02fac0595a8aa8a5064d1bd0c0ea55b22b0Dave Olson if (!dd->ipath_errormask || !(dd->ipath_flags & IPATH_INITTED)) 21178d1e02fac0595a8aa8a5064d1bd0c0ea55b22b0Dave Olson return; 21278d1e02fac0595a8aa8a5064d1bd0c0ea55b22b0Dave Olson 21378d1e02fac0595a8aa8a5064d1bd0c0ea55b22b0Dave Olson errormask = ipath_read_kreg64(dd, dd->ipath_kregs->kr_errormask); 21478d1e02fac0595a8aa8a5064d1bd0c0ea55b22b0Dave Olson 21578d1e02fac0595a8aa8a5064d1bd0c0ea55b22b0Dave Olson if (errormask == dd->ipath_errormask) 21678d1e02fac0595a8aa8a5064d1bd0c0ea55b22b0Dave Olson return; 21778d1e02fac0595a8aa8a5064d1bd0c0ea55b22b0Dave Olson fixed++; 21878d1e02fac0595a8aa8a5064d1bd0c0ea55b22b0Dave Olson 21978d1e02fac0595a8aa8a5064d1bd0c0ea55b22b0Dave Olson hwerrs = ipath_read_kreg64(dd, dd->ipath_kregs->kr_hwerrstatus); 22078d1e02fac0595a8aa8a5064d1bd0c0ea55b22b0Dave Olson ctrl = ipath_read_kreg32(dd, dd->ipath_kregs->kr_control); 22178d1e02fac0595a8aa8a5064d1bd0c0ea55b22b0Dave Olson 22278d1e02fac0595a8aa8a5064d1bd0c0ea55b22b0Dave Olson ipath_write_kreg(dd, dd->ipath_kregs->kr_errormask, 22378d1e02fac0595a8aa8a5064d1bd0c0ea55b22b0Dave Olson dd->ipath_errormask); 22478d1e02fac0595a8aa8a5064d1bd0c0ea55b22b0Dave Olson 22578d1e02fac0595a8aa8a5064d1bd0c0ea55b22b0Dave Olson if ((hwerrs & dd->ipath_hwerrmask) || 22678d1e02fac0595a8aa8a5064d1bd0c0ea55b22b0Dave Olson (ctrl & INFINIPATH_C_FREEZEMODE)) { 22778d1e02fac0595a8aa8a5064d1bd0c0ea55b22b0Dave Olson /* force re-interrupt of pending events, just in case */ 22878d1e02fac0595a8aa8a5064d1bd0c0ea55b22b0Dave Olson ipath_write_kreg(dd, dd->ipath_kregs->kr_hwerrclear, 0ULL); 22978d1e02fac0595a8aa8a5064d1bd0c0ea55b22b0Dave Olson ipath_write_kreg(dd, dd->ipath_kregs->kr_errorclear, 0ULL); 23078d1e02fac0595a8aa8a5064d1bd0c0ea55b22b0Dave Olson ipath_write_kreg(dd, dd->ipath_kregs->kr_intclear, 0ULL); 23178d1e02fac0595a8aa8a5064d1bd0c0ea55b22b0Dave Olson dev_info(&dd->pcidev->dev, 23278d1e02fac0595a8aa8a5064d1bd0c0ea55b22b0Dave Olson "errormask fixed(%u) %lx -> %lx, ctrl %x hwerr %lx\n", 23378d1e02fac0595a8aa8a5064d1bd0c0ea55b22b0Dave Olson fixed, errormask, (unsigned long)dd->ipath_errormask, 23478d1e02fac0595a8aa8a5064d1bd0c0ea55b22b0Dave Olson ctrl, hwerrs); 23578d1e02fac0595a8aa8a5064d1bd0c0ea55b22b0Dave Olson } else 23678d1e02fac0595a8aa8a5064d1bd0c0ea55b22b0Dave Olson ipath_dbg("errormask fixed(%u) %lx -> %lx, no freeze\n", 23778d1e02fac0595a8aa8a5064d1bd0c0ea55b22b0Dave Olson fixed, errormask, 23878d1e02fac0595a8aa8a5064d1bd0c0ea55b22b0Dave Olson (unsigned long)dd->ipath_errormask); 23978d1e02fac0595a8aa8a5064d1bd0c0ea55b22b0Dave Olson} 24078d1e02fac0595a8aa8a5064d1bd0c0ea55b22b0Dave Olson 24178d1e02fac0595a8aa8a5064d1bd0c0ea55b22b0Dave Olson 242108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan/** 243108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * ipath_get_faststats - get word counters from chip before they overflow 244108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * @opaque - contains a pointer to the infinipath device ipath_devdata 245108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * 246108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * called from add_timer 247108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan */ 248108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivanvoid ipath_get_faststats(unsigned long opaque) 249108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan{ 250108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan struct ipath_devdata *dd = (struct ipath_devdata *) opaque; 251755807a296f77ca7c31dc000afdfe1e5172bbf72Dave Olson int i; 252108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan static unsigned cnt; 253aecd3b5ab19624ca9644b9df9c61615282d8923fMichael Albaugh unsigned long flags; 254192594d5230f447ef2df8de9d7902ac90d11c118Michael Albaugh u64 traffic_wds; 255108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan 256108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan /* 257108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * don't access the chip while running diags, or memory diags can 258108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * fail 259108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan */ 26027b044a815df7d4530bc68560796680ed588070cMichael Albaugh if (!dd->ipath_kregbase || !(dd->ipath_flags & IPATH_INITTED) || 261108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan ipath_diag_inuse) 262108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan /* but re-arm the timer, for diags case; won't hurt other */ 263108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan goto done; 264108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan 265aecd3b5ab19624ca9644b9df9c61615282d8923fMichael Albaugh /* 266aecd3b5ab19624ca9644b9df9c61615282d8923fMichael Albaugh * We now try to maintain a "active timer", based on traffic 267aecd3b5ab19624ca9644b9df9c61615282d8923fMichael Albaugh * exceeding a threshold, so we need to check the word-counts 268aecd3b5ab19624ca9644b9df9c61615282d8923fMichael Albaugh * even if they are 64-bit. 269aecd3b5ab19624ca9644b9df9c61615282d8923fMichael Albaugh */ 270192594d5230f447ef2df8de9d7902ac90d11c118Michael Albaugh traffic_wds = ipath_snap_cntr(dd, dd->ipath_cregs->cr_wordsendcnt) + 271192594d5230f447ef2df8de9d7902ac90d11c118Michael Albaugh ipath_snap_cntr(dd, dd->ipath_cregs->cr_wordrcvcnt); 272aecd3b5ab19624ca9644b9df9c61615282d8923fMichael Albaugh spin_lock_irqsave(&dd->ipath_eep_st_lock, flags); 273192594d5230f447ef2df8de9d7902ac90d11c118Michael Albaugh traffic_wds -= dd->ipath_traffic_wds; 274192594d5230f447ef2df8de9d7902ac90d11c118Michael Albaugh dd->ipath_traffic_wds += traffic_wds; 275192594d5230f447ef2df8de9d7902ac90d11c118Michael Albaugh if (traffic_wds >= IPATH_TRAFFIC_ACTIVE_THRESHOLD) 276aecd3b5ab19624ca9644b9df9c61615282d8923fMichael Albaugh atomic_add(5, &dd->ipath_active_time); /* S/B #define */ 277aecd3b5ab19624ca9644b9df9c61615282d8923fMichael Albaugh spin_unlock_irqrestore(&dd->ipath_eep_st_lock, flags); 278aecd3b5ab19624ca9644b9df9c61615282d8923fMichael Albaugh 279108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan if (dd->ipath_flags & IPATH_32BITCOUNTERS) { 280108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan ipath_snap_cntr(dd, dd->ipath_cregs->cr_pktsendcnt); 281108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan ipath_snap_cntr(dd, dd->ipath_cregs->cr_pktrcvcnt); 282108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan } 283108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan 284108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan ipath_qcheck(dd); 285108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan 286108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan /* 287108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * deal with repeat error suppression. Doesn't really matter if 288108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * last error was almost a full interval ago, or just a few usecs 289108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * ago; still won't get more than 2 per interval. We may want 290108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * longer intervals for this eventually, could do with mod, counter 291108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * or separate timer. Also see code in ipath_handle_errors() and 292108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * ipath_handle_hwerrors(). 293108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan */ 294108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan 295108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan if (dd->ipath_lasterror) 296108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan dd->ipath_lasterror = 0; 297108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan if (dd->ipath_lasthwerror) 298108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan dd->ipath_lasthwerror = 0; 29978d1e02fac0595a8aa8a5064d1bd0c0ea55b22b0Dave Olson if (dd->ipath_maskederrs 300108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan && time_after(jiffies, dd->ipath_unmasktime)) { 301108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan char ebuf[256]; 3028ec1077b35359c973f4b1de7c516be570a6df495Bryan O'Sullivan int iserr; 303124b4dcb1dd3a6fb80051f1785117a732d785f70Dave Olson iserr = ipath_decode_err(dd, ebuf, sizeof ebuf, 304124b4dcb1dd3a6fb80051f1785117a732d785f70Dave Olson dd->ipath_maskederrs); 30578d1e02fac0595a8aa8a5064d1bd0c0ea55b22b0Dave Olson if (dd->ipath_maskederrs & 3062ba3f56eb402672ff83601b5990b219d39577636Ralph Campbell ~(INFINIPATH_E_RRCVEGRFULL | INFINIPATH_E_RRCVHDRFULL | 3072ba3f56eb402672ff83601b5990b219d39577636Ralph Campbell INFINIPATH_E_PKTERRS)) 308108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan ipath_dev_err(dd, "Re-enabling masked errors " 309108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan "(%s)\n", ebuf); 310108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan else { 311108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan /* 312108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * rcvegrfull and rcvhdrqfull are "normal", for some 313108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * types of processes (mostly benchmarks) that send 314108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * huge numbers of messages, while not processing 315108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * them. So only complain about these at debug 316108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan * level. 317108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan */ 3188ec1077b35359c973f4b1de7c516be570a6df495Bryan O'Sullivan if (iserr) 3192ba3f56eb402672ff83601b5990b219d39577636Ralph Campbell ipath_dbg( 3202ba3f56eb402672ff83601b5990b219d39577636Ralph Campbell "Re-enabling queue full errors (%s)\n", 3212ba3f56eb402672ff83601b5990b219d39577636Ralph Campbell ebuf); 3228ec1077b35359c973f4b1de7c516be570a6df495Bryan O'Sullivan else 3238ec1077b35359c973f4b1de7c516be570a6df495Bryan O'Sullivan ipath_cdbg(ERRPKT, "Re-enabling packet" 3242ba3f56eb402672ff83601b5990b219d39577636Ralph Campbell " problem interrupt (%s)\n", ebuf); 325108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan } 32678d1e02fac0595a8aa8a5064d1bd0c0ea55b22b0Dave Olson 32778d1e02fac0595a8aa8a5064d1bd0c0ea55b22b0Dave Olson /* re-enable masked errors */ 32878d1e02fac0595a8aa8a5064d1bd0c0ea55b22b0Dave Olson dd->ipath_errormask |= dd->ipath_maskederrs; 329108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan ipath_write_kreg(dd, dd->ipath_kregs->kr_errormask, 3302ba3f56eb402672ff83601b5990b219d39577636Ralph Campbell dd->ipath_errormask); 33178d1e02fac0595a8aa8a5064d1bd0c0ea55b22b0Dave Olson dd->ipath_maskederrs = 0; 332108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan } 333108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan 334108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan /* limit qfull messages to ~one per minute per port */ 335108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan if ((++cnt & 0x10)) { 336755807a296f77ca7c31dc000afdfe1e5172bbf72Dave Olson for (i = (int) dd->ipath_cfgports; --i >= 0; ) { 337755807a296f77ca7c31dc000afdfe1e5172bbf72Dave Olson struct ipath_portdata *pd = dd->ipath_pd[i]; 338755807a296f77ca7c31dc000afdfe1e5172bbf72Dave Olson 339755807a296f77ca7c31dc000afdfe1e5172bbf72Dave Olson if (pd && pd->port_lastrcvhdrqtail != -1) 340755807a296f77ca7c31dc000afdfe1e5172bbf72Dave Olson pd->port_lastrcvhdrqtail = -1; 341108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan } 342108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan } 343108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan 34478d1e02fac0595a8aa8a5064d1bd0c0ea55b22b0Dave Olson ipath_chk_errormask(dd); 345108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivandone: 346108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan mod_timer(&dd->ipath_stats_timer, jiffies + HZ * 5); 347108ecf0d90655055d5a7db8d3a7239133b4d52b7Bryan O'Sullivan} 348