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

📄 mthca_provider.c

📁 h内核
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * Copyright (c) 2004, 2005 Topspin Communications.  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. * * $Id: mthca_provider.c 1397 2004-12-28 05:09:00Z roland $ */#include <ib_smi.h>#include "mthca_dev.h"#include "mthca_cmd.h"static int mthca_query_device(struct ib_device *ibdev,			      struct ib_device_attr *props){	struct ib_smp *in_mad  = NULL;	struct ib_smp *out_mad = NULL;	int err = -ENOMEM;	u8 status;	in_mad  = kmalloc(sizeof *in_mad, GFP_KERNEL);	out_mad = kmalloc(sizeof *out_mad, GFP_KERNEL);	if (!in_mad || !out_mad)		goto out;	props->fw_ver        = to_mdev(ibdev)->fw_ver;	memset(in_mad, 0, sizeof *in_mad);	in_mad->base_version       = 1;	in_mad->mgmt_class     	   = IB_MGMT_CLASS_SUBN_LID_ROUTED;	in_mad->class_version  	   = 1;	in_mad->method         	   = IB_MGMT_METHOD_GET;	in_mad->attr_id   	   = IB_SMP_ATTR_NODE_INFO;	err = mthca_MAD_IFC(to_mdev(ibdev), 1, 1,			    1, NULL, NULL, in_mad, out_mad,			    &status);	if (err)		goto out;	if (status) {		err = -EINVAL;		goto out;	}	props->vendor_id      = be32_to_cpup((u32 *) (out_mad->data + 36)) &		0xffffff;	props->vendor_part_id = be16_to_cpup((u16 *) (out_mad->data + 30));	props->hw_ver         = be16_to_cpup((u16 *) (out_mad->data + 32));	memcpy(&props->sys_image_guid, out_mad->data +  4, 8);	memcpy(&props->node_guid,      out_mad->data + 12, 8);	err = 0; out:	kfree(in_mad);	kfree(out_mad);	return err;}static int mthca_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;	u8 status;	in_mad  = kmalloc(sizeof *in_mad, GFP_KERNEL);	out_mad = kmalloc(sizeof *out_mad, GFP_KERNEL);	if (!in_mad || !out_mad)		goto out;	memset(in_mad, 0, sizeof *in_mad);	in_mad->base_version       = 1;	in_mad->mgmt_class     	   = IB_MGMT_CLASS_SUBN_LID_ROUTED;	in_mad->class_version  	   = 1;	in_mad->method         	   = IB_MGMT_METHOD_GET;	in_mad->attr_id   	   = IB_SMP_ATTR_PORT_INFO;	in_mad->attr_mod           = cpu_to_be32(port);	err = mthca_MAD_IFC(to_mdev(ibdev), 1, 1,			    port, NULL, NULL, in_mad, out_mad,			    &status);	if (err)		goto out;	if (status) {		err = -EINVAL;		goto out;	}	props->lid               = be16_to_cpup((u16 *) (out_mad->data + 16));	props->lmc               = out_mad->data[34] & 0x7;	props->sm_lid            = be16_to_cpup((u16 *) (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((u32 *) (out_mad->data + 20));	props->gid_tbl_len       = to_mdev(ibdev)->limits.gid_table_len;	props->pkey_tbl_len      = to_mdev(ibdev)->limits.pkey_table_len;	props->qkey_viol_cntr    = be16_to_cpup((u16 *) (out_mad->data + 48));	props->active_width      = out_mad->data[31] & 0xf;	props->active_speed      = out_mad->data[35] >> 4; out:	kfree(in_mad);	kfree(out_mad);	return err;}static int mthca_modify_port(struct ib_device *ibdev,			     u8 port, int port_modify_mask,			     struct ib_port_modify *props){	struct mthca_set_ib_param set_ib;	struct ib_port_attr attr;	int err;	u8 status;	if (down_interruptible(&to_mdev(ibdev)->cap_mask_mutex))		return -ERESTARTSYS;	err = mthca_query_port(ibdev, port, &attr);	if (err)		goto out;	set_ib.set_si_guid     = 0;	set_ib.reset_qkey_viol = !!(port_modify_mask & IB_PORT_RESET_QKEY_CNTR);	set_ib.cap_mask = (attr.port_cap_flags | props->set_port_cap_mask) &		~props->clr_port_cap_mask;	err = mthca_SET_IB(to_mdev(ibdev), &set_ib, port, &status);	if (err)		goto out;	if (status) {		err = -EINVAL;		goto out;	}out:	up(&to_mdev(ibdev)->cap_mask_mutex);	return err;}static int mthca_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;	u8 status;	in_mad  = kmalloc(sizeof *in_mad, GFP_KERNEL);	out_mad = kmalloc(sizeof *out_mad, GFP_KERNEL);	if (!in_mad || !out_mad)		goto out;	memset(in_mad, 0, sizeof *in_mad);	in_mad->base_version       = 1;	in_mad->mgmt_class     	   = IB_MGMT_CLASS_SUBN_LID_ROUTED;	in_mad->class_version  	   = 1;	in_mad->method         	   = IB_MGMT_METHOD_GET;	in_mad->attr_id   	   = IB_SMP_ATTR_PKEY_TABLE;	in_mad->attr_mod           = cpu_to_be32(index / 32);	err = mthca_MAD_IFC(to_mdev(ibdev), 1, 1,			    port, NULL, NULL, in_mad, out_mad,			    &status);	if (err)		goto out;	if (status) {		err = -EINVAL;		goto out;	}	*pkey = be16_to_cpu(((u16 *) out_mad->data)[index % 32]); out:	kfree(in_mad);	kfree(out_mad);	return err;}static int mthca_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;	u8 status;	in_mad  = kmalloc(sizeof *in_mad, GFP_KERNEL);	out_mad = kmalloc(sizeof *out_mad, GFP_KERNEL);	if (!in_mad || !out_mad)		goto out;	memset(in_mad, 0, sizeof *in_mad);	in_mad->base_version       = 1;	in_mad->mgmt_class     	   = IB_MGMT_CLASS_SUBN_LID_ROUTED;	in_mad->class_version  	   = 1;	in_mad->method         	   = IB_MGMT_METHOD_GET;	in_mad->attr_id   	   = IB_SMP_ATTR_PORT_INFO;	in_mad->attr_mod           = cpu_to_be32(port);	err = mthca_MAD_IFC(to_mdev(ibdev), 1, 1,			    port, NULL, NULL, in_mad, out_mad,			    &status);	if (err)		goto out;	if (status) {		err = -EINVAL;		goto out;	}	memcpy(gid->raw, out_mad->data + 8, 8);	memset(in_mad, 0, sizeof *in_mad);	in_mad->base_version       = 1;	in_mad->mgmt_class     	   = IB_MGMT_CLASS_SUBN_LID_ROUTED;	in_mad->class_version  	   = 1;	in_mad->method         	   = IB_MGMT_METHOD_GET;	in_mad->attr_id   	   = IB_SMP_ATTR_GUID_INFO;	in_mad->attr_mod           = cpu_to_be32(index / 8);	err = mthca_MAD_IFC(to_mdev(ibdev), 1, 1,			    port, NULL, NULL, in_mad, out_mad,			    &status);	if (err)		goto out;	if (status) {		err = -EINVAL;		goto out;	}	memcpy(gid->raw + 8, out_mad->data + (index % 8) * 16, 8); out:	kfree(in_mad);	kfree(out_mad);	return err;}static struct ib_pd *mthca_alloc_pd(struct ib_device *ibdev){	struct mthca_pd *pd;	int err;	pd = kmalloc(sizeof *pd, GFP_KERNEL);	if (!pd)		return ERR_PTR(-ENOMEM);	err = mthca_pd_alloc(to_mdev(ibdev), pd);	if (err) {		kfree(pd);		return ERR_PTR(err);	}	return &pd->ibpd;}static int mthca_dealloc_pd(struct ib_pd *pd){	mthca_pd_free(to_mdev(pd->device), to_mpd(pd));	kfree(pd);	return 0;}static struct ib_ah *mthca_ah_create(struct ib_pd *pd,				     struct ib_ah_attr *ah_attr){	int err;	struct mthca_ah *ah;	ah = kmalloc(sizeof *ah, GFP_KERNEL);	if (!ah)		return ERR_PTR(-ENOMEM);	err = mthca_create_ah(to_mdev(pd->device), to_mpd(pd), ah_attr, ah);	if (err) {		kfree(ah);		return ERR_PTR(err);	}	return &ah->ibah;}static int mthca_ah_destroy(struct ib_ah *ah){	mthca_destroy_ah(to_mdev(ah->device), to_mah(ah));	kfree(ah);	return 0;}static struct ib_qp *mthca_create_qp(struct ib_pd *pd,				     struct ib_qp_init_attr *init_attr){	struct mthca_qp *qp;	int err;	switch (init_attr->qp_type) {	case IB_QPT_RC:	case IB_QPT_UC:

⌨️ 快捷键说明

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