|
@@ -135,6 +135,14 @@ static struct mlx5_cmd_layout *get_inst(struct mlx5_cmd *cmd, int idx)
|
|
|
return cmd->cmd_buf + (idx << cmd->log_stride);
|
|
|
}
|
|
|
|
|
|
+static int mlx5_calc_cmd_blocks(struct mlx5_cmd_msg *msg)
|
|
|
+{
|
|
|
+ int size = msg->len;
|
|
|
+ int blen = size - min_t(int, sizeof(msg->first.data), size);
|
|
|
+
|
|
|
+ return DIV_ROUND_UP(blen, MLX5_CMD_DATA_BLOCK_SIZE);
|
|
|
+}
|
|
|
+
|
|
|
static u8 xor8_buf(void *buf, size_t offset, int len)
|
|
|
{
|
|
|
u8 *ptr = buf;
|
|
@@ -174,10 +182,7 @@ static void calc_block_sig(struct mlx5_cmd_prot_block *block)
|
|
|
static void calc_chain_sig(struct mlx5_cmd_msg *msg)
|
|
|
{
|
|
|
struct mlx5_cmd_mailbox *next = msg->next;
|
|
|
- int size = msg->len;
|
|
|
- int blen = size - min_t(int, sizeof(msg->first.data), size);
|
|
|
- int n = (blen + MLX5_CMD_DATA_BLOCK_SIZE - 1)
|
|
|
- / MLX5_CMD_DATA_BLOCK_SIZE;
|
|
|
+ int n = mlx5_calc_cmd_blocks(msg);
|
|
|
int i = 0;
|
|
|
|
|
|
for (i = 0; i < n && next; i++) {
|
|
@@ -220,12 +225,9 @@ static void free_cmd(struct mlx5_cmd_work_ent *ent)
|
|
|
static int verify_signature(struct mlx5_cmd_work_ent *ent)
|
|
|
{
|
|
|
struct mlx5_cmd_mailbox *next = ent->out->next;
|
|
|
+ int n = mlx5_calc_cmd_blocks(ent->out);
|
|
|
int err;
|
|
|
u8 sig;
|
|
|
- int size = ent->out->len;
|
|
|
- int blen = size - min_t(int, sizeof(ent->out->first.data), size);
|
|
|
- int n = (blen + MLX5_CMD_DATA_BLOCK_SIZE - 1)
|
|
|
- / MLX5_CMD_DATA_BLOCK_SIZE;
|
|
|
int i = 0;
|
|
|
|
|
|
sig = xor8_buf(ent->lay, 0, sizeof(*ent->lay));
|
|
@@ -720,9 +722,11 @@ static void dump_command(struct mlx5_core_dev *dev,
|
|
|
struct mlx5_cmd_msg *msg = input ? ent->in : ent->out;
|
|
|
u16 op = MLX5_GET(mbox_in, ent->lay->in, opcode);
|
|
|
struct mlx5_cmd_mailbox *next = msg->next;
|
|
|
+ int n = mlx5_calc_cmd_blocks(msg);
|
|
|
int data_only;
|
|
|
u32 offset = 0;
|
|
|
int dump_len;
|
|
|
+ int i;
|
|
|
|
|
|
data_only = !!(mlx5_core_debug_mask & (1 << MLX5_CMD_DATA));
|
|
|
|
|
@@ -749,7 +753,7 @@ static void dump_command(struct mlx5_core_dev *dev,
|
|
|
offset += sizeof(*ent->lay);
|
|
|
}
|
|
|
|
|
|
- while (next && offset < msg->len) {
|
|
|
+ for (i = 0; i < n && next; i++) {
|
|
|
if (data_only) {
|
|
|
dump_len = min_t(int, MLX5_CMD_DATA_BLOCK_SIZE, msg->len - offset);
|
|
|
dump_buf(next->buf, dump_len, 1, offset);
|
|
@@ -1137,7 +1141,6 @@ static struct mlx5_cmd_msg *mlx5_alloc_cmd_msg(struct mlx5_core_dev *dev,
|
|
|
struct mlx5_cmd_mailbox *tmp, *head = NULL;
|
|
|
struct mlx5_cmd_prot_block *block;
|
|
|
struct mlx5_cmd_msg *msg;
|
|
|
- int blen;
|
|
|
int err;
|
|
|
int n;
|
|
|
int i;
|
|
@@ -1146,8 +1149,8 @@ static struct mlx5_cmd_msg *mlx5_alloc_cmd_msg(struct mlx5_core_dev *dev,
|
|
|
if (!msg)
|
|
|
return ERR_PTR(-ENOMEM);
|
|
|
|
|
|
- blen = size - min_t(int, sizeof(msg->first.data), size);
|
|
|
- n = (blen + MLX5_CMD_DATA_BLOCK_SIZE - 1) / MLX5_CMD_DATA_BLOCK_SIZE;
|
|
|
+ msg->len = size;
|
|
|
+ n = mlx5_calc_cmd_blocks(msg);
|
|
|
|
|
|
for (i = 0; i < n; i++) {
|
|
|
tmp = alloc_cmd_box(dev, flags);
|
|
@@ -1165,7 +1168,6 @@ static struct mlx5_cmd_msg *mlx5_alloc_cmd_msg(struct mlx5_core_dev *dev,
|
|
|
head = tmp;
|
|
|
}
|
|
|
msg->next = head;
|
|
|
- msg->len = size;
|
|
|
return msg;
|
|
|
|
|
|
err_alloc:
|