Merge git://git.kernel.org/pub/scm/linux/kernel/git/sfrench/cifs-2.6
[pandora-kernel.git] / drivers / infiniband / hw / ipath / ipath_stats.c
index bae4f56..d2725cd 100644 (file)
@@ -55,7 +55,6 @@ u64 ipath_snap_cntr(struct ipath_devdata *dd, ipath_creg creg)
        u64 val64;
        unsigned long t0, t1;
        u64 ret;
-       unsigned long flags;
 
        t0 = jiffies;
        /* If fast increment counters are only 32 bits, snapshot them,
@@ -92,18 +91,12 @@ u64 ipath_snap_cntr(struct ipath_devdata *dd, ipath_creg creg)
        if (creg == dd->ipath_cregs->cr_wordsendcnt) {
                if (val != dd->ipath_lastsword) {
                        dd->ipath_sword += val - dd->ipath_lastsword;
-                       spin_lock_irqsave(&dd->ipath_eep_st_lock, flags);
-                       dd->ipath_traffic_wds += val - dd->ipath_lastsword;
-                       spin_unlock_irqrestore(&dd->ipath_eep_st_lock, flags);
                        dd->ipath_lastsword = val;
                }
                val64 = dd->ipath_sword;
        } else if (creg == dd->ipath_cregs->cr_wordrcvcnt) {
                if (val != dd->ipath_lastrword) {
                        dd->ipath_rword += val - dd->ipath_lastrword;
-                       spin_lock_irqsave(&dd->ipath_eep_st_lock, flags);
-                       dd->ipath_traffic_wds += val - dd->ipath_lastrword;
-                       spin_unlock_irqrestore(&dd->ipath_eep_st_lock, flags);
                        dd->ipath_lastrword = val;
                }
                val64 = dd->ipath_rword;
@@ -140,15 +133,16 @@ bail:
 static void ipath_qcheck(struct ipath_devdata *dd)
 {
        static u64 last_tot_hdrqfull;
+       struct ipath_portdata *pd = dd->ipath_pd[0];
        size_t blen = 0;
        char buf[128];
 
        *buf = 0;
-       if (dd->ipath_pd[0]->port_hdrqfull != dd->ipath_p0_hdrqfull) {
+       if (pd->port_hdrqfull != dd->ipath_p0_hdrqfull) {
                blen = snprintf(buf, sizeof buf, "port 0 hdrqfull %u",
-                               dd->ipath_pd[0]->port_hdrqfull -
+                               pd->port_hdrqfull -
                                dd->ipath_p0_hdrqfull);
-               dd->ipath_p0_hdrqfull = dd->ipath_pd[0]->port_hdrqfull;
+               dd->ipath_p0_hdrqfull = pd->port_hdrqfull;
        }
        if (ipath_stats.sps_etidfull != dd->ipath_last_tidfull) {
                blen += snprintf(buf + blen, sizeof buf - blen,
@@ -180,7 +174,7 @@ static void ipath_qcheck(struct ipath_devdata *dd)
        if (blen)
                ipath_dbg("%s\n", buf);
 
-       if (dd->ipath_port0head != (u32)
+       if (pd->port_head != (u32)
            le64_to_cpu(*dd->ipath_hdrqtailptr)) {
                if (dd->ipath_lastport0rcv_cnt ==
                    ipath_stats.sps_port0pkts) {
@@ -188,7 +182,7 @@ static void ipath_qcheck(struct ipath_devdata *dd)
                                   "port0 hd=%llx tl=%x; port0pkts %llx\n",
                                   (unsigned long long)
                                   le64_to_cpu(*dd->ipath_hdrqtailptr),
-                                  dd->ipath_port0head,
+                                  pd->port_head,
                                   (unsigned long long)
                                   ipath_stats.sps_port0pkts);
                }
@@ -244,9 +238,10 @@ static void ipath_chk_errormask(struct ipath_devdata *dd)
 void ipath_get_faststats(unsigned long opaque)
 {
        struct ipath_devdata *dd = (struct ipath_devdata *) opaque;
-       u32 val;
+       int i;
        static unsigned cnt;
        unsigned long flags;
+       u64 traffic_wds;
 
        /*
         * don't access the chip while running diags, or memory diags can
@@ -262,12 +257,13 @@ void ipath_get_faststats(unsigned long opaque)
         * exceeding a threshold, so we need to check the word-counts
         * even if they are 64-bit.
         */
-       ipath_snap_cntr(dd, dd->ipath_cregs->cr_wordsendcnt);
-       ipath_snap_cntr(dd, dd->ipath_cregs->cr_wordrcvcnt);
+       traffic_wds = ipath_snap_cntr(dd, dd->ipath_cregs->cr_wordsendcnt) +
+               ipath_snap_cntr(dd, dd->ipath_cregs->cr_wordrcvcnt);
        spin_lock_irqsave(&dd->ipath_eep_st_lock, flags);
-       if (dd->ipath_traffic_wds  >= IPATH_TRAFFIC_ACTIVE_THRESHOLD)
+       traffic_wds -= dd->ipath_traffic_wds;
+       dd->ipath_traffic_wds += traffic_wds;
+       if (traffic_wds  >= IPATH_TRAFFIC_ACTIVE_THRESHOLD)
                atomic_add(5, &dd->ipath_active_time); /* S/B #define */
-       dd->ipath_traffic_wds = 0;
        spin_unlock_irqrestore(&dd->ipath_eep_st_lock, flags);
 
        if (dd->ipath_flags & IPATH_32BITCOUNTERS) {
@@ -326,12 +322,11 @@ void ipath_get_faststats(unsigned long opaque)
 
        /* limit qfull messages to ~one per minute per port */
        if ((++cnt & 0x10)) {
-               for (val = dd->ipath_cfgports - 1; ((int)val) >= 0;
-                    val--) {
-                       if (dd->ipath_lastegrheads[val] != -1)
-                               dd->ipath_lastegrheads[val] = -1;
-                       if (dd->ipath_lastrcvhdrqtails[val] != -1)
-                               dd->ipath_lastrcvhdrqtails[val] = -1;
+               for (i = (int) dd->ipath_cfgports; --i >= 0; ) {
+                       struct ipath_portdata *pd = dd->ipath_pd[i];
+
+                       if (pd && pd->port_lastrcvhdrqtail != -1)
+                               pd->port_lastrcvhdrqtail = -1;
                }
        }