305 u32 in_modifier,
306 u8 op_modifier,
307 u16 op,
308 unsigned long timeout,
309 u8 *status)
310{
311 int err = 0;
312 unsigned long end;
313
314 down(&dev->cmd.poll_sem);
315
316 err = mthca_cmd_post(dev, in_param,
317 out_param ? *out_param : 0,
318 in_modifier, op_modifier,
319 op, CMD_POLL_TOKEN, 0);
320 if (err)
321 goto out;
322
323 end = timeout + jiffies;
324 while (go_bit(dev) && time_before(jiffies, end)) {
325 set_current_state(TASK_RUNNING);
326 schedule();
327 }
328
329 if (go_bit(dev)) {
330 err = -EBUSY;
331 goto out;
332 }
333
334 if (out_is_imm)
335 *out_param =
336 (u64) be32_to_cpu((__force __be32)
337 __raw_readl(dev->hcr + HCR_OUT_PARAM_OFFSET)) << 32 |
338 (u64) be32_to_cpu((__force __be32)
339 __raw_readl(dev->hcr + HCR_OUT_PARAM_OFFSET + 4));
340
341 *status = be32_to_cpu((__force __be32) __raw_readl(dev->hcr + HCR_STATUS_OFFSET)) >> 24;
342
343out:
344 up(&dev->cmd.poll_sem);
345 return err;