]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/infiniband/hw/ipath/ipath_file_ops.c
IB/ipath: Force PIOAvail update entry point
[linux-2.6-omap-h63xx.git] / drivers / infiniband / hw / ipath / ipath_file_ops.c
index bb53bde80ee8a9ec12908766ebc0190cdb6f6261..9ca582b65fe98dd420a4e4e21d8fccb400cd897e 100644 (file)
@@ -2047,6 +2047,17 @@ static int ipath_get_slave_info(struct ipath_portdata *pd,
        return ret;
 }
 
+static int ipath_force_pio_avail_update(struct ipath_devdata *dd)
+{
+       u64 reg = dd->ipath_sendctrl;
+
+       clear_bit(IPATH_S_PIOBUFAVAILUPD, &reg);
+       ipath_write_kreg(dd, dd->ipath_kregs->kr_sendctrl, reg);
+       ipath_write_kreg(dd, dd->ipath_kregs->kr_sendctrl, dd->ipath_sendctrl);
+
+       return 0;
+}
+
 static ssize_t ipath_write(struct file *fp, const char __user *data,
                           size_t count, loff_t *off)
 {
@@ -2106,22 +2117,30 @@ static ssize_t ipath_write(struct file *fp, const char __user *data,
                dest = &cmd.cmd.slave_mask_addr;
                src = &ucmd->cmd.slave_mask_addr;
                break;
+       case IPATH_CMD_PIOAVAILUPD:     // force an update of PIOAvail reg
+               copy = 0;
+               src = NULL;
+               dest = NULL;
+               break;
        default:
                ret = -EINVAL;
                goto bail;
        }
 
-       if ((count - consumed) < copy) {
-               ret = -EINVAL;
-               goto bail;
-       }
+       if (copy) {
+               if ((count - consumed) < copy) {
+                       ret = -EINVAL;
+                       goto bail;
+               }
 
-       if (copy_from_user(dest, src, copy)) {
-               ret = -EFAULT;
-               goto bail;
+               if (copy_from_user(dest, src, copy)) {
+                       ret = -EFAULT;
+                       goto bail;
+               }
+
+               consumed += copy;
        }
 
-       consumed += copy;
        pd = port_fp(fp);
        if (!pd && cmd.type != __IPATH_CMD_USER_INIT &&
                cmd.type != IPATH_CMD_ASSIGN_PORT) {
@@ -2172,6 +2191,9 @@ static ssize_t ipath_write(struct file *fp, const char __user *data,
                                           (void __user *) (unsigned long)
                                           cmd.cmd.slave_mask_addr);
                break;
+       case IPATH_CMD_PIOAVAILUPD:
+               ret = ipath_force_pio_avail_update(pd->port_dd);
+               break;
        }
 
        if (ret >= 0)