fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / drivers / infiniband / hw / mthca / mthca_cmd.c
index 798e13e..768df72 100644 (file)
@@ -34,7 +34,7 @@
  * $Id: mthca_cmd.c 1349 2004-12-16 21:09:43Z roland $
  */
 
-#include <linux/sched.h>
+#include <linux/completion.h>
 #include <linux/pci.h>
 #include <linux/errno.h>
 #include <asm/io.h>
@@ -174,7 +174,6 @@ enum {
 
 struct mthca_cmd_context {
        struct completion done;
-       struct timer_list timer;
        int               result;
        int               next;
        u64               out_param;
@@ -362,15 +361,6 @@ void mthca_cmd_event(struct mthca_dev *dev,
        complete(&context->done);
 }
 
-static void event_timeout(unsigned long context_ptr)
-{
-       struct mthca_cmd_context *context =
-               (struct mthca_cmd_context *) context_ptr;
-
-       context->result = -EBUSY;
-       complete(&context->done);
-}
-
 static int mthca_cmd_wait(struct mthca_dev *dev,
                          u64 in_param,
                          u64 *out_param,
@@ -401,11 +391,10 @@ static int mthca_cmd_wait(struct mthca_dev *dev,
        if (err)
                goto out;
 
-       context->timer.expires  = jiffies + timeout;
-       add_timer(&context->timer);
-
-       wait_for_completion(&context->done);
-       del_timer_sync(&context->timer);
+       if (!wait_for_completion_timeout(&context->done, timeout)) {
+               err = -EBUSY;
+               goto out;
+       }
 
        err = context->result;
        if (err)
@@ -535,10 +524,6 @@ int mthca_cmd_use_events(struct mthca_dev *dev)
        for (i = 0; i < dev->cmd.max_cmds; ++i) {
                dev->cmd.context[i].token = i;
                dev->cmd.context[i].next = i + 1;
-               init_timer(&dev->cmd.context[i].timer);
-               dev->cmd.context[i].timer.data     =
-                       (unsigned long) &dev->cmd.context[i];
-               dev->cmd.context[i].timer.function = event_timeout;
        }
 
        dev->cmd.context[dev->cmd.max_cmds - 1].next = -1;
@@ -793,11 +778,12 @@ int mthca_QUERY_FW(struct mthca_dev *dev, u8 *status)
                ((dev->fw_ver & 0xffff0000ull) >> 16) |
                ((dev->fw_ver & 0x0000ffffull) << 16);
 
+       MTHCA_GET(lg, outbox, QUERY_FW_MAX_CMD_OFFSET);
+       dev->cmd.max_cmds = 1 << lg;
+
        mthca_dbg(dev, "FW version %012llx, max commands %d\n",
                  (unsigned long long) dev->fw_ver, dev->cmd.max_cmds);
 
-       MTHCA_GET(lg, outbox, QUERY_FW_MAX_CMD_OFFSET);
-       dev->cmd.max_cmds = 1 << lg;
        MTHCA_GET(dev->catas_err.addr, outbox, QUERY_FW_ERR_START_OFFSET);
        MTHCA_GET(dev->catas_err.size, outbox, QUERY_FW_ERR_SIZE_OFFSET);
 
@@ -1834,11 +1820,11 @@ int mthca_MAD_IFC(struct mthca_dev *dev, int ignore_mkey, int ignore_bkey,
 
 #define MAD_IFC_BOX_SIZE      0x400
 #define MAD_IFC_MY_QPN_OFFSET 0x100
-#define MAD_IFC_RQPN_OFFSET   0x104
-#define MAD_IFC_SL_OFFSET     0x108
-#define MAD_IFC_G_PATH_OFFSET 0x109
-#define MAD_IFC_RLID_OFFSET   0x10a
-#define MAD_IFC_PKEY_OFFSET   0x10e
+#define MAD_IFC_RQPN_OFFSET   0x108
+#define MAD_IFC_SL_OFFSET     0x10c
+#define MAD_IFC_G_PATH_OFFSET 0x10d
+#define MAD_IFC_RLID_OFFSET   0x10e
+#define MAD_IFC_PKEY_OFFSET   0x112
 #define MAD_IFC_GRH_OFFSET    0x140
 
        inmailbox = mthca_alloc_mailbox(dev, GFP_KERNEL);
@@ -1876,7 +1862,7 @@ int mthca_MAD_IFC(struct mthca_dev *dev, int ignore_mkey, int ignore_bkey,
 
                val = in_wc->dlid_path_bits |
                        (in_wc->wc_flags & IB_WC_GRH ? 0x80 : 0);
-               MTHCA_PUT(inbox, val,               MAD_IFC_GRH_OFFSET);
+               MTHCA_PUT(inbox, val,               MAD_IFC_G_PATH_OFFSET);
 
                MTHCA_PUT(inbox, in_wc->slid,       MAD_IFC_RLID_OFFSET);
                MTHCA_PUT(inbox, in_wc->pkey_index, MAD_IFC_PKEY_OFFSET);
@@ -1884,7 +1870,7 @@ int mthca_MAD_IFC(struct mthca_dev *dev, int ignore_mkey, int ignore_bkey,
                if (in_grh)
                        memcpy(inbox + MAD_IFC_GRH_OFFSET, in_grh, 40);
 
-               op_modifier |= 0x10;
+               op_modifier |= 0x4;
 
                in_modifier |= in_wc->slid << 16;
        }