MLX4_INIT_DOORBELL_LOCK(&ibdev->uar_lock);
 
        ibdev->dev = dev;
+       ibdev->bond_next_port   = 0;
 
        strlcpy(ibdev->ib_dev.name, "mlx4_%d", IB_DEVICE_NAME_MAX);
        ibdev->ib_dev.owner             = THIS_MODULE;
 
        struct mlx4_ib_qp      *qp1_proxy[MLX4_MAX_PORTS];
        /* lock when destroying qp1_proxy and getting netdev events */
        struct mutex            qp1_proxy_lock[MLX4_MAX_PORTS];
+       u8                      bond_next_port;
 };
 
 struct ib_event_work {
        return container_of(ibah, struct mlx4_ib_ah, ibah);
 }
 
+static inline u8 mlx4_ib_bond_next_port(struct mlx4_ib_dev *dev)
+{
+       dev->bond_next_port = (dev->bond_next_port + 1) % dev->num_ports;
+
+       return dev->bond_next_port + 1;
+}
+
 int mlx4_ib_init_sriov(struct mlx4_ib_dev *dev);
 void mlx4_ib_close_sriov(struct mlx4_ib_dev *dev);
 
 
                goto out;
        }
 
+       if (mlx4_is_bonded(dev->dev) && (attr_mask & IB_QP_PORT)) {
+               if ((cur_state == IB_QPS_RESET) && (new_state == IB_QPS_INIT)) {
+                       if ((ibqp->qp_type == IB_QPT_RC) ||
+                           (ibqp->qp_type == IB_QPT_UD) ||
+                           (ibqp->qp_type == IB_QPT_UC) ||
+                           (ibqp->qp_type == IB_QPT_RAW_PACKET) ||
+                           (ibqp->qp_type == IB_QPT_XRC_INI)) {
+                               attr->port_num = mlx4_ib_bond_next_port(dev);
+                       }
+               } else {
+                       /* no sense in changing port_num
+                        * when ports are bonded */
+                       attr_mask &= ~IB_QP_PORT;
+               }
+       }
+
        if ((attr_mask & IB_QP_PORT) &&
            (attr->port_num == 0 || attr->port_num > dev->num_ports)) {
                pr_debug("qpn 0x%x: invalid port number (%d) specified "
 
        err = __mlx4_ib_modify_qp(ibqp, attr, attr_mask, cur_state, new_state);
 
+       if (mlx4_is_bonded(dev->dev) && (attr_mask & IB_QP_PORT))
+               attr->port_num = 1;
+
 out:
        mutex_unlock(&qp->mutex);
        return err;