Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Minor conflicts in drivers/net/ethernet/mellanox/mlx5/core/en_rep.c, we had some overlapping changes: 1) In 'net' MLX5E_PARAMS_LOG_{SQ,RQ}_SIZE --> MLX5E_REP_PARAMS_LOG_{SQ,RQ}_SIZE 2) In 'net-next' params->log_rq_size is renamed to be params->log_rq_mtu_frames. 3) In 'net-next' params->hard_mtu is added. Signed-off-by: David S. Miller <davem@davemloft.net>
这个提交包含在:
@@ -833,7 +833,8 @@ static struct qedr_dev *qedr_add(struct qed_dev *cdev, struct pci_dev *pdev,
|
||||
|
||||
dev->num_cnq = dev->ops->rdma_get_min_cnq_msix(cdev);
|
||||
if (!dev->num_cnq) {
|
||||
DP_ERR(dev, "not enough CNQ resources.\n");
|
||||
DP_ERR(dev, "Failed. At least one CNQ is required.\n");
|
||||
rc = -ENOMEM;
|
||||
goto init_err;
|
||||
}
|
||||
|
||||
|
@@ -1841,14 +1841,15 @@ static void qedr_reset_qp_hwq_info(struct qedr_qp_hwq_info *qph)
|
||||
|
||||
static int qedr_update_qp_state(struct qedr_dev *dev,
|
||||
struct qedr_qp *qp,
|
||||
enum qed_roce_qp_state cur_state,
|
||||
enum qed_roce_qp_state new_state)
|
||||
{
|
||||
int status = 0;
|
||||
|
||||
if (new_state == qp->state)
|
||||
if (new_state == cur_state)
|
||||
return 0;
|
||||
|
||||
switch (qp->state) {
|
||||
switch (cur_state) {
|
||||
case QED_ROCE_QP_STATE_RESET:
|
||||
switch (new_state) {
|
||||
case QED_ROCE_QP_STATE_INIT:
|
||||
@@ -1955,6 +1956,7 @@ int qedr_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
|
||||
struct qedr_dev *dev = get_qedr_dev(&qp->dev->ibdev);
|
||||
const struct ib_global_route *grh = rdma_ah_read_grh(&attr->ah_attr);
|
||||
enum ib_qp_state old_qp_state, new_qp_state;
|
||||
enum qed_roce_qp_state cur_state;
|
||||
int rc = 0;
|
||||
|
||||
DP_DEBUG(dev, QEDR_MSG_QP,
|
||||
@@ -2086,18 +2088,23 @@ int qedr_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
|
||||
SET_FIELD(qp_params.modify_flags,
|
||||
QED_ROCE_MODIFY_QP_VALID_ACK_TIMEOUT, 1);
|
||||
|
||||
qp_params.ack_timeout = attr->timeout;
|
||||
if (attr->timeout) {
|
||||
u32 temp;
|
||||
|
||||
temp = 4096 * (1UL << attr->timeout) / 1000 / 1000;
|
||||
/* FW requires [msec] */
|
||||
qp_params.ack_timeout = temp;
|
||||
} else {
|
||||
/* Infinite */
|
||||
/* The received timeout value is an exponent used like this:
|
||||
* "12.7.34 LOCAL ACK TIMEOUT
|
||||
* Value representing the transport (ACK) timeout for use by
|
||||
* the remote, expressed as: 4.096 * 2^timeout [usec]"
|
||||
* The FW expects timeout in msec so we need to divide the usec
|
||||
* result by 1000. We'll approximate 1000~2^10, and 4.096 ~ 2^2,
|
||||
* so we get: 2^2 * 2^timeout / 2^10 = 2^(timeout - 8).
|
||||
* The value of zero means infinite so we use a 'max_t' to make
|
||||
* sure that sub 1 msec values will be configured as 1 msec.
|
||||
*/
|
||||
if (attr->timeout)
|
||||
qp_params.ack_timeout =
|
||||
1 << max_t(int, attr->timeout - 8, 0);
|
||||
else
|
||||
qp_params.ack_timeout = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (attr_mask & IB_QP_RETRY_CNT) {
|
||||
SET_FIELD(qp_params.modify_flags,
|
||||
QED_ROCE_MODIFY_QP_VALID_RETRY_CNT, 1);
|
||||
@@ -2170,13 +2177,25 @@ int qedr_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
|
||||
qp->dest_qp_num = attr->dest_qp_num;
|
||||
}
|
||||
|
||||
cur_state = qp->state;
|
||||
|
||||
/* Update the QP state before the actual ramrod to prevent a race with
|
||||
* fast path. Modifying the QP state to error will cause the device to
|
||||
* flush the CQEs and while polling the flushed CQEs will considered as
|
||||
* a potential issue if the QP isn't in error state.
|
||||
*/
|
||||
if ((attr_mask & IB_QP_STATE) && qp->qp_type != IB_QPT_GSI &&
|
||||
!udata && qp_params.new_state == QED_ROCE_QP_STATE_ERR)
|
||||
qp->state = QED_ROCE_QP_STATE_ERR;
|
||||
|
||||
if (qp->qp_type != IB_QPT_GSI)
|
||||
rc = dev->ops->rdma_modify_qp(dev->rdma_ctx,
|
||||
qp->qed_qp, &qp_params);
|
||||
|
||||
if (attr_mask & IB_QP_STATE) {
|
||||
if ((qp->qp_type != IB_QPT_GSI) && (!udata))
|
||||
rc = qedr_update_qp_state(dev, qp, qp_params.new_state);
|
||||
rc = qedr_update_qp_state(dev, qp, cur_state,
|
||||
qp_params.new_state);
|
||||
qp->state = qp_params.new_state;
|
||||
}
|
||||
|
||||
|
在新工单中引用
屏蔽一个用户