drivers/net/ethernet/mellanox/mlx4/cmd.c

Source file repositories/reference/linux-study-clean/drivers/net/ethernet/mellanox/mlx4/cmd.c

File Facts

System
Linux kernel
Corpus path
drivers/net/ethernet/mellanox/mlx4/cmd.c
Extension
.c
Size
93133 bytes
Lines
3423
Domain
Driver Families
Bucket
drivers/net
Inferred role
Driver Families: exported/initcall integration point
Status
integration implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

struct mlx4_cmd_context {
	struct completion	done;
	int			result;
	int			next;
	u64			out_param;
	u16			token;
	u8			fw_status;
};

static int mlx4_master_process_vhcr(struct mlx4_dev *dev, int slave,
				    struct mlx4_vhcr_cmd *in_vhcr);

static int mlx4_status_to_errno(u8 status)
{
	static const int trans_table[] = {
		[CMD_STAT_INTERNAL_ERR]	  = -EIO,
		[CMD_STAT_BAD_OP]	  = -EPERM,
		[CMD_STAT_BAD_PARAM]	  = -EINVAL,
		[CMD_STAT_BAD_SYS_STATE]  = -ENXIO,
		[CMD_STAT_BAD_RESOURCE]	  = -EBADF,
		[CMD_STAT_RESOURCE_BUSY]  = -EBUSY,
		[CMD_STAT_EXCEED_LIM]	  = -ENOMEM,
		[CMD_STAT_BAD_RES_STATE]  = -EBADF,
		[CMD_STAT_BAD_INDEX]	  = -EBADF,
		[CMD_STAT_BAD_NVMEM]	  = -EFAULT,
		[CMD_STAT_ICM_ERROR]	  = -ENFILE,
		[CMD_STAT_BAD_QP_STATE]   = -EINVAL,
		[CMD_STAT_BAD_SEG_PARAM]  = -EFAULT,
		[CMD_STAT_REG_BOUND]	  = -EBUSY,
		[CMD_STAT_LAM_NOT_PRE]	  = -EAGAIN,
		[CMD_STAT_BAD_PKT]	  = -EINVAL,
		[CMD_STAT_BAD_SIZE]	  = -ENOMEM,
		[CMD_STAT_MULTI_FUNC_REQ] = -EACCES,
	};

	if (status >= ARRAY_SIZE(trans_table) ||
	    (status != CMD_STAT_OK && trans_table[status] == 0))
		return -EIO;

	return trans_table[status];
}

static u8 mlx4_errno_to_status(int errno)
{
	switch (errno) {
	case -EPERM:
		return CMD_STAT_BAD_OP;
	case -EINVAL:
		return CMD_STAT_BAD_PARAM;
	case -ENXIO:
		return CMD_STAT_BAD_SYS_STATE;
	case -EBUSY:
		return CMD_STAT_RESOURCE_BUSY;
	case -ENOMEM:
		return CMD_STAT_EXCEED_LIM;
	case -ENFILE:
		return CMD_STAT_ICM_ERROR;
	default:
		return CMD_STAT_INTERNAL_ERR;
	}
}

static int mlx4_internal_err_ret_value(struct mlx4_dev *dev, u16 op,
				       u8 op_modifier)
{
	switch (op) {
	case MLX4_CMD_UNMAP_ICM:
	case MLX4_CMD_UNMAP_ICM_AUX:
	case MLX4_CMD_UNMAP_FA:
	case MLX4_CMD_2RST_QP:
	case MLX4_CMD_HW2SW_EQ:
	case MLX4_CMD_HW2SW_CQ:
	case MLX4_CMD_HW2SW_SRQ:
	case MLX4_CMD_HW2SW_MPT:
	case MLX4_CMD_CLOSE_HCA:
	case MLX4_QP_FLOW_STEERING_DETACH:
	case MLX4_CMD_FREE_RES:
	case MLX4_CMD_CLOSE_PORT:
		return CMD_STAT_OK;

	case MLX4_CMD_QP_ATTACH:
		/* On Detach case return success */
		if (op_modifier == 0)
			return CMD_STAT_OK;
		return mlx4_status_to_errno(CMD_STAT_INTERNAL_ERR);

	default:
		return mlx4_status_to_errno(CMD_STAT_INTERNAL_ERR);
	}
}

Annotation

Implementation Notes