|
@@ -1340,43 +1340,29 @@ static int cq_res_start_move_to(struct mlx4_dev *dev, int slave, int cqn,
|
|
|
|
|
|
spin_lock_irq(mlx4_tlock(dev));
|
|
|
r = res_tracker_lookup(&tracker->res_tree[RES_CQ], cqn);
|
|
|
- if (!r)
|
|
|
+ if (!r) {
|
|
|
err = -ENOENT;
|
|
|
- else if (r->com.owner != slave)
|
|
|
+ } else if (r->com.owner != slave) {
|
|
|
err = -EPERM;
|
|
|
- else {
|
|
|
- switch (state) {
|
|
|
- case RES_CQ_BUSY:
|
|
|
- err = -EBUSY;
|
|
|
- break;
|
|
|
-
|
|
|
- case RES_CQ_ALLOCATED:
|
|
|
- if (r->com.state != RES_CQ_HW)
|
|
|
- err = -EINVAL;
|
|
|
- else if (atomic_read(&r->ref_count))
|
|
|
- err = -EBUSY;
|
|
|
- else
|
|
|
- err = 0;
|
|
|
- break;
|
|
|
-
|
|
|
- case RES_CQ_HW:
|
|
|
- if (r->com.state != RES_CQ_ALLOCATED)
|
|
|
- err = -EINVAL;
|
|
|
- else
|
|
|
- err = 0;
|
|
|
- break;
|
|
|
-
|
|
|
- default:
|
|
|
+ } else if (state == RES_CQ_ALLOCATED) {
|
|
|
+ if (r->com.state != RES_CQ_HW)
|
|
|
err = -EINVAL;
|
|
|
- }
|
|
|
+ else if (atomic_read(&r->ref_count))
|
|
|
+ err = -EBUSY;
|
|
|
+ else
|
|
|
+ err = 0;
|
|
|
+ } else if (state != RES_CQ_HW || r->com.state != RES_CQ_ALLOCATED) {
|
|
|
+ err = -EINVAL;
|
|
|
+ } else {
|
|
|
+ err = 0;
|
|
|
+ }
|
|
|
|
|
|
- if (!err) {
|
|
|
- r->com.from_state = r->com.state;
|
|
|
- r->com.to_state = state;
|
|
|
- r->com.state = RES_CQ_BUSY;
|
|
|
- if (cq)
|
|
|
- *cq = r;
|
|
|
- }
|
|
|
+ if (!err) {
|
|
|
+ r->com.from_state = r->com.state;
|
|
|
+ r->com.to_state = state;
|
|
|
+ r->com.state = RES_CQ_BUSY;
|
|
|
+ if (cq)
|
|
|
+ *cq = r;
|
|
|
}
|
|
|
|
|
|
spin_unlock_irq(mlx4_tlock(dev));
|