Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=569b87b47f906d65ee35d6ecc4767f20a6390b9b
Commit:     569b87b47f906d65ee35d6ecc4767f20a6390b9b
Parent:     7b196e2ff3953063b656212ff517f6115a1477b2
Author:     Arthur Jones <[EMAIL PROTECTED]>
AuthorDate: Thu Mar 15 14:45:05 2007 -0700
Committer:  Roland Dreier <[EMAIL PROTECTED]>
CommitDate: Wed Apr 18 20:20:58 2007 -0700

    IB/ipath: Force PIOAvail update entry point
    
    Due to a chip bug, the PIOAvail register is not always updated to
    memory.  This patch allows userspace to force an update.
    
    Signed-off-by: Bryan O'Sullivan <[EMAIL PROTECTED]>
    Signed-off-by: Roland Dreier <[EMAIL PROTECTED]>
---
 drivers/infiniband/hw/ipath/ipath_common.h   |    7 +++-
 drivers/infiniband/hw/ipath/ipath_file_ops.c |   38 ++++++++++++++++++++-----
 2 files changed, 35 insertions(+), 10 deletions(-)

diff --git a/drivers/infiniband/hw/ipath/ipath_common.h 
b/drivers/infiniband/hw/ipath/ipath_common.h
index 048b928..10c008f 100644
--- a/drivers/infiniband/hw/ipath/ipath_common.h
+++ b/drivers/infiniband/hw/ipath/ipath_common.h
@@ -352,7 +352,7 @@ struct ipath_base_info {
  * may not be implemented; the user code must deal with this if it
  * cares, or it must abort after initialization reports the difference.
  */
-#define IPATH_USER_SWMINOR 4
+#define IPATH_USER_SWMINOR 5
 
 #define IPATH_USER_SWVERSION ((IPATH_USER_SWMAJOR<<16) | IPATH_USER_SWMINOR)
 
@@ -429,8 +429,11 @@ struct ipath_user_info {
 #define __IPATH_CMD_SLAVE_INFO 22      /* return info on slave processes (for 
old user code) */
 #define IPATH_CMD_ASSIGN_PORT  23      /* allocate HCA and port */
 #define IPATH_CMD_USER_INIT    24      /* set up userspace */
+#define IPATH_CMD_UNUSED_1     25
+#define IPATH_CMD_UNUSED_2     26
+#define IPATH_CMD_PIOAVAILUPD  27      /* force an update of PIOAvail reg */
 
-#define IPATH_CMD_MAX          24
+#define IPATH_CMD_MAX          27
 
 struct ipath_port_info {
        __u32 num_active;       /* number of active units */
diff --git a/drivers/infiniband/hw/ipath/ipath_file_ops.c 
b/drivers/infiniband/hw/ipath/ipath_file_ops.c
index bb53bde..9ca582b 100644
--- a/drivers/infiniband/hw/ipath/ipath_file_ops.c
+++ b/drivers/infiniband/hw/ipath/ipath_file_ops.c
@@ -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)
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to