⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 linux内核源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * Copyright (c) 2006, 2007 Cisco Systems, Inc. All rights reserved. * * This software is available to you under a choice of one of two * licenses.  You may choose to be licensed under the terms of the GNU * General Public License (GPL) Version 2, available from the file * COPYING in the main directory of this source tree, or the * OpenIB.org BSD license below: * *     Redistribution and use in source and binary forms, with or *     without modification, are permitted provided that the following *     conditions are met: * *      - Redistributions of source code must retain the above *        copyright notice, this list of conditions and the following *        disclaimer. * *      - Redistributions in binary form must reproduce the above *        copyright notice, this list of conditions and the following *        disclaimer in the documentation and/or other materials *        provided with the distribution. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */#include <linux/module.h>#include <linux/init.h>#include <linux/errno.h>#include <rdma/ib_smi.h>#include <rdma/ib_user_verbs.h>#include <linux/mlx4/driver.h>#include <linux/mlx4/cmd.h>#include "mlx4_ib.h"#include "user.h"#define DRV_NAME	"mlx4_ib"#define DRV_VERSION	"0.01"#define DRV_RELDATE	"May 1, 2006"MODULE_AUTHOR("Roland Dreier");MODULE_DESCRIPTION("Mellanox ConnectX HCA InfiniBand driver");MODULE_LICENSE("Dual BSD/GPL");MODULE_VERSION(DRV_VERSION);static const char mlx4_ib_version[] __devinitdata =	DRV_NAME ": Mellanox ConnectX InfiniBand driver v"	DRV_VERSION " (" DRV_RELDATE ")\n";static void init_query_mad(struct ib_smp *mad){	mad->base_version  = 1;	mad->mgmt_class    = IB_MGMT_CLASS_SUBN_LID_ROUTED;	mad->class_version = 1;	mad->method	   = IB_MGMT_METHOD_GET;}static int mlx4_ib_query_device(struct ib_device *ibdev,				struct ib_device_attr *props){	struct mlx4_ib_dev *dev = to_mdev(ibdev);	struct ib_smp *in_mad  = NULL;	struct ib_smp *out_mad = NULL;	int err = -ENOMEM;	in_mad  = kzalloc(sizeof *in_mad, GFP_KERNEL);	out_mad = kmalloc(sizeof *out_mad, GFP_KERNEL);	if (!in_mad || !out_mad)		goto out;	init_query_mad(in_mad);	in_mad->attr_id = IB_SMP_ATTR_NODE_INFO;	err = mlx4_MAD_IFC(to_mdev(ibdev), 1, 1, 1, NULL, NULL, in_mad, out_mad);	if (err)		goto out;	memset(props, 0, sizeof *props);	props->fw_ver = dev->dev->caps.fw_ver;	props->device_cap_flags    = IB_DEVICE_CHANGE_PHY_PORT |		IB_DEVICE_PORT_ACTIVE_EVENT		|		IB_DEVICE_SYS_IMAGE_GUID		|		IB_DEVICE_RC_RNR_NAK_GEN;	if (dev->dev->caps.flags & MLX4_DEV_CAP_FLAG_BAD_PKEY_CNTR)		props->device_cap_flags |= IB_DEVICE_BAD_PKEY_CNTR;	if (dev->dev->caps.flags & MLX4_DEV_CAP_FLAG_BAD_QKEY_CNTR)		props->device_cap_flags |= IB_DEVICE_BAD_QKEY_CNTR;	if (dev->dev->caps.flags & MLX4_DEV_CAP_FLAG_APM)		props->device_cap_flags |= IB_DEVICE_AUTO_PATH_MIG;	if (dev->dev->caps.flags & MLX4_DEV_CAP_FLAG_UD_AV_PORT)		props->device_cap_flags |= IB_DEVICE_UD_AV_PORT_ENFORCE;	props->vendor_id	   = be32_to_cpup((__be32 *) (out_mad->data + 36)) &		0xffffff;	props->vendor_part_id	   = be16_to_cpup((__be16 *) (out_mad->data + 30));	props->hw_ver		   = be32_to_cpup((__be32 *) (out_mad->data + 32));	memcpy(&props->sys_image_guid, out_mad->data +	4, 8);	props->max_mr_size	   = ~0ull;	props->page_size_cap	   = dev->dev->caps.page_size_cap;	props->max_qp		   = dev->dev->caps.num_qps - dev->dev->caps.reserved_qps;	props->max_qp_wr	   = dev->dev->caps.max_wqes;	props->max_sge		   = min(dev->dev->caps.max_sq_sg,					 dev->dev->caps.max_rq_sg);	props->max_cq		   = dev->dev->caps.num_cqs - dev->dev->caps.reserved_cqs;	props->max_cqe		   = dev->dev->caps.max_cqes;	props->max_mr		   = dev->dev->caps.num_mpts - dev->dev->caps.reserved_mrws;	props->max_pd		   = dev->dev->caps.num_pds - dev->dev->caps.reserved_pds;	props->max_qp_rd_atom	   = dev->dev->caps.max_qp_dest_rdma;	props->max_qp_init_rd_atom = dev->dev->caps.max_qp_init_rdma;	props->max_res_rd_atom	   = props->max_qp_rd_atom * props->max_qp;	props->max_srq		   = dev->dev->caps.num_srqs - dev->dev->caps.reserved_srqs;	props->max_srq_wr	   = dev->dev->caps.max_srq_wqes - 1;	props->max_srq_sge	   = dev->dev->caps.max_srq_sge;	props->local_ca_ack_delay  = dev->dev->caps.local_ca_ack_delay;	props->atomic_cap	   = dev->dev->caps.flags & MLX4_DEV_CAP_FLAG_ATOMIC ?		IB_ATOMIC_HCA : IB_ATOMIC_NONE;	props->max_pkeys	   = dev->dev->caps.pkey_table_len[1];	props->max_mcast_grp	   = dev->dev->caps.num_mgms + dev->dev->caps.num_amgms;	props->max_mcast_qp_attach = dev->dev->caps.num_qp_per_mgm;	props->max_total_mcast_qp_attach = props->max_mcast_qp_attach *					   props->max_mcast_grp;	props->max_map_per_fmr = (1 << (32 - ilog2(dev->dev->caps.num_mpts))) - 1;out:	kfree(in_mad);	kfree(out_mad);	return err;}static int mlx4_ib_query_port(struct ib_device *ibdev, u8 port,			      struct ib_port_attr *props){	struct ib_smp *in_mad  = NULL;	struct ib_smp *out_mad = NULL;	int err = -ENOMEM;	in_mad  = kzalloc(sizeof *in_mad, GFP_KERNEL);	out_mad = kmalloc(sizeof *out_mad, GFP_KERNEL);	if (!in_mad || !out_mad)		goto out;	memset(props, 0, sizeof *props);	init_query_mad(in_mad);	in_mad->attr_id  = IB_SMP_ATTR_PORT_INFO;	in_mad->attr_mod = cpu_to_be32(port);	err = mlx4_MAD_IFC(to_mdev(ibdev), 1, 1, port, NULL, NULL, in_mad, out_mad);	if (err)		goto out;	props->lid		= be16_to_cpup((__be16 *) (out_mad->data + 16));	props->lmc		= out_mad->data[34] & 0x7;	props->sm_lid		= be16_to_cpup((__be16 *) (out_mad->data + 18));	props->sm_sl		= out_mad->data[36] & 0xf;	props->state		= out_mad->data[32] & 0xf;	props->phys_state	= out_mad->data[33] >> 4;	props->port_cap_flags	= be32_to_cpup((__be32 *) (out_mad->data + 20));	props->gid_tbl_len	= to_mdev(ibdev)->dev->caps.gid_table_len[port];	props->max_msg_sz	= to_mdev(ibdev)->dev->caps.max_msg_sz;	props->pkey_tbl_len	= to_mdev(ibdev)->dev->caps.pkey_table_len[port];	props->bad_pkey_cntr	= be16_to_cpup((__be16 *) (out_mad->data + 46));	props->qkey_viol_cntr	= be16_to_cpup((__be16 *) (out_mad->data + 48));	props->active_width	= out_mad->data[31] & 0xf;	props->active_speed	= out_mad->data[35] >> 4;	props->max_mtu		= out_mad->data[41] & 0xf;	props->active_mtu	= out_mad->data[36] >> 4;	props->subnet_timeout	= out_mad->data[51] & 0x1f;	props->max_vl_num	= out_mad->data[37] >> 4;	props->init_type_reply	= out_mad->data[41] >> 4;out:	kfree(in_mad);	kfree(out_mad);	return err;}static int mlx4_ib_query_gid(struct ib_device *ibdev, u8 port, int index,			     union ib_gid *gid){	struct ib_smp *in_mad  = NULL;	struct ib_smp *out_mad = NULL;	int err = -ENOMEM;	in_mad  = kzalloc(sizeof *in_mad, GFP_KERNEL);	out_mad = kmalloc(sizeof *out_mad, GFP_KERNEL);	if (!in_mad || !out_mad)		goto out;	init_query_mad(in_mad);	in_mad->attr_id  = IB_SMP_ATTR_PORT_INFO;	in_mad->attr_mod = cpu_to_be32(port);	err = mlx4_MAD_IFC(to_mdev(ibdev), 1, 1, port, NULL, NULL, in_mad, out_mad);	if (err)		goto out;	memcpy(gid->raw, out_mad->data + 8, 8);	init_query_mad(in_mad);	in_mad->attr_id  = IB_SMP_ATTR_GUID_INFO;	in_mad->attr_mod = cpu_to_be32(index / 8);	err = mlx4_MAD_IFC(to_mdev(ibdev), 1, 1, port, NULL, NULL, in_mad, out_mad);	if (err)		goto out;	memcpy(gid->raw + 8, out_mad->data + (index % 8) * 8, 8);out:	kfree(in_mad);	kfree(out_mad);	return err;}static int mlx4_ib_query_pkey(struct ib_device *ibdev, u8 port, u16 index,			      u16 *pkey){	struct ib_smp *in_mad  = NULL;	struct ib_smp *out_mad = NULL;	int err = -ENOMEM;	in_mad  = kzalloc(sizeof *in_mad, GFP_KERNEL);	out_mad = kmalloc(sizeof *out_mad, GFP_KERNEL);	if (!in_mad || !out_mad)		goto out;	init_query_mad(in_mad);	in_mad->attr_id  = IB_SMP_ATTR_PKEY_TABLE;	in_mad->attr_mod = cpu_to_be32(index / 32);	err = mlx4_MAD_IFC(to_mdev(ibdev), 1, 1, port, NULL, NULL, in_mad, out_mad);	if (err)		goto out;	*pkey = be16_to_cpu(((__be16 *) out_mad->data)[index % 32]);out:	kfree(in_mad);	kfree(out_mad);	return err;}static int mlx4_ib_modify_device(struct ib_device *ibdev, int mask,				 struct ib_device_modify *props){	if (mask & ~IB_DEVICE_MODIFY_NODE_DESC)		return -EOPNOTSUPP;	if (mask & IB_DEVICE_MODIFY_NODE_DESC) {		spin_lock(&to_mdev(ibdev)->sm_lock);		memcpy(ibdev->node_desc, props->node_desc, 64);		spin_unlock(&to_mdev(ibdev)->sm_lock);	}	return 0;}static int mlx4_SET_PORT(struct mlx4_ib_dev *dev, u8 port, int reset_qkey_viols,			 u32 cap_mask){	struct mlx4_cmd_mailbox *mailbox;	int err;	mailbox = mlx4_alloc_cmd_mailbox(dev->dev);	if (IS_ERR(mailbox))		return PTR_ERR(mailbox);	memset(mailbox->buf, 0, 256);	if (dev->dev->flags & MLX4_FLAG_OLD_PORT_CMDS) {		*(u8 *) mailbox->buf	     = !!reset_qkey_viols << 6;		((__be32 *) mailbox->buf)[2] = cpu_to_be32(cap_mask);	} else {		((u8 *) mailbox->buf)[3]     = !!reset_qkey_viols;		((__be32 *) mailbox->buf)[1] = cpu_to_be32(cap_mask);	}	err = mlx4_cmd(dev->dev, mailbox->dma, port, 0, MLX4_CMD_SET_PORT,		       MLX4_CMD_TIME_CLASS_B);	mlx4_free_cmd_mailbox(dev->dev, mailbox);	return err;}static int mlx4_ib_modify_port(struct ib_device *ibdev, u8 port, int mask,			       struct ib_port_modify *props){	struct ib_port_attr attr;	u32 cap_mask;	int err;	mutex_lock(&to_mdev(ibdev)->cap_mask_mutex);	err = mlx4_ib_query_port(ibdev, port, &attr);	if (err)		goto out;	cap_mask = (attr.port_cap_flags | props->set_port_cap_mask) &		~props->clr_port_cap_mask;	err = mlx4_SET_PORT(to_mdev(ibdev), port,			    !!(mask & IB_PORT_RESET_QKEY_CNTR),			    cap_mask);out:	mutex_unlock(&to_mdev(ibdev)->cap_mask_mutex);	return err;}static struct ib_ucontext *mlx4_ib_alloc_ucontext(struct ib_device *ibdev,						  struct ib_udata *udata){	struct mlx4_ib_dev *dev = to_mdev(ibdev);	struct mlx4_ib_ucontext *context;	struct mlx4_ib_alloc_ucontext_resp resp;	int err;	resp.qp_tab_size      = dev->dev->caps.num_qps;	resp.bf_reg_size      = dev->dev->caps.bf_reg_size;	resp.bf_regs_per_page = dev->dev->caps.bf_regs_per_page;	context = kmalloc(sizeof *context, GFP_KERNEL);	if (!context)		return ERR_PTR(-ENOMEM);	err = mlx4_uar_alloc(to_mdev(ibdev)->dev, &context->uar);	if (err) {		kfree(context);		return ERR_PTR(err);	}	INIT_LIST_HEAD(&context->db_page_list);	mutex_init(&context->db_page_mutex);	err = ib_copy_to_udata(udata, &resp, sizeof resp);	if (err) {		mlx4_uar_free(to_mdev(ibdev)->dev, &context->uar);		kfree(context);		return ERR_PTR(-EFAULT);	}	return &context->ibucontext;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -