IB/qib: Display correct value for number of contexts
authorMitko Haralanov <mitko.haralanov@intel.com>
Mon, 7 May 2012 18:03:02 +0000 (14:03 -0400)
committerRoland Dreier <roland@purestorage.com>
Mon, 14 May 2012 19:39:04 +0000 (12:39 -0700)
A "fix" for a bug with the number of contexts on a single-port board
caused the calculation to be off by one, which causes problems with
the upper layers.  The same problem exists for number of free
contexts, which is also fixed here.

Signed-off-by: Mitko Haralanov <mitko.haralanov@intel.com>
Signed-off-by: Mike Marciniszyn <mike.marciniszyn@intel.com>
Signed-off-by: Roland Dreier <roland@purestorage.com>
drivers/infiniband/hw/qib/qib_init.c
drivers/infiniband/hw/qib/qib_sysfs.c

index cf0cd30adc8d07667956eb1244cd2b06f9e00cf1..dc14e100a7f1a560a86ea82ab38929eadccd3cc4 100644 (file)
@@ -102,6 +102,8 @@ void qib_set_ctxtcnt(struct qib_devdata *dd)
                dd->cfgctxts = qib_cfgctxts;
        else
                dd->cfgctxts = dd->ctxtcnt;
+       dd->freectxts = (dd->first_user_ctxt > dd->cfgctxts) ? 0 :
+               dd->cfgctxts - dd->first_user_ctxt;
 }
 
 /*
@@ -402,7 +404,6 @@ static void enable_chip(struct qib_devdata *dd)
                if (rcd)
                        dd->f_rcvctrl(rcd->ppd, rcvmask, i);
        }
-       dd->freectxts = dd->cfgctxts - dd->first_user_ctxt;
 }
 
 static void verify_interrupt(unsigned long opaque)
index dae51604cfcd24f287790467892d9960884905e0..dd9cd49d097927bf8816c5aedc836c3f31e4b5ea 100644 (file)
@@ -503,8 +503,11 @@ static ssize_t show_nctxts(struct device *device,
        struct qib_devdata *dd = dd_from_dev(dev);
 
        /* Return the number of user ports (contexts) available. */
-       return scnprintf(buf, PAGE_SIZE, "%u\n", dd->cfgctxts -
-               dd->first_user_ctxt);
+       /* The calculation below deals with a special case where
+        * cfgctxts is set to 1 on a single-port board. */
+       return scnprintf(buf, PAGE_SIZE, "%u\n",
+                       (dd->first_user_ctxt > dd->cfgctxts) ? 0 :
+                       (dd->cfgctxts - dd->first_user_ctxt));
 }
 
 static ssize_t show_nfreectxts(struct device *device,