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

📄 iwch_provider.c

📁 linux内核源码
💻 C
📖 第 1 页 / 共 3 页
字号:
	PDBG("%s wqsize %d sqsize %d rqsize %d\n", __FUNCTION__,	     wqsize, sqsize, rqsize);	qhp = kzalloc(sizeof(*qhp), GFP_KERNEL);	if (!qhp)		return ERR_PTR(-ENOMEM);	qhp->wq.size_log2 = ilog2(wqsize);	qhp->wq.rq_size_log2 = ilog2(rqsize);	qhp->wq.sq_size_log2 = ilog2(sqsize);	ucontext = pd->uobject ? to_iwch_ucontext(pd->uobject->context) : NULL;	if (cxio_create_qp(&rhp->rdev, !udata, &qhp->wq,			   ucontext ? &ucontext->uctx : &rhp->rdev.uctx)) {		kfree(qhp);		return ERR_PTR(-ENOMEM);	}	attrs->cap.max_recv_wr = rqsize - 1;	attrs->cap.max_send_wr = sqsize;	qhp->rhp = rhp;	qhp->attr.pd = php->pdid;	qhp->attr.scq = ((struct iwch_cq *) attrs->send_cq)->cq.cqid;	qhp->attr.rcq = ((struct iwch_cq *) attrs->recv_cq)->cq.cqid;	qhp->attr.sq_num_entries = attrs->cap.max_send_wr;	qhp->attr.rq_num_entries = attrs->cap.max_recv_wr;	qhp->attr.sq_max_sges = attrs->cap.max_send_sge;	qhp->attr.sq_max_sges_rdma_write = attrs->cap.max_send_sge;	qhp->attr.rq_max_sges = attrs->cap.max_recv_sge;	qhp->attr.state = IWCH_QP_STATE_IDLE;	qhp->attr.next_state = IWCH_QP_STATE_IDLE;	/*	 * XXX - These don't get passed in from the openib user	 * at create time.  The CM sets them via a QP modify.	 * Need to fix...  I think the CM should	 */	qhp->attr.enable_rdma_read = 1;	qhp->attr.enable_rdma_write = 1;	qhp->attr.enable_bind = 1;	qhp->attr.max_ord = 1;	qhp->attr.max_ird = 1;	spin_lock_init(&qhp->lock);	init_waitqueue_head(&qhp->wait);	atomic_set(&qhp->refcnt, 1);	insert_handle(rhp, &rhp->qpidr, qhp, qhp->wq.qpid);	if (udata) {		struct iwch_mm_entry *mm1, *mm2;		mm1 = kmalloc(sizeof *mm1, GFP_KERNEL);		if (!mm1) {			iwch_destroy_qp(&qhp->ibqp);			return ERR_PTR(-ENOMEM);		}		mm2 = kmalloc(sizeof *mm2, GFP_KERNEL);		if (!mm2) {			kfree(mm1);			iwch_destroy_qp(&qhp->ibqp);			return ERR_PTR(-ENOMEM);		}		uresp.qpid = qhp->wq.qpid;		uresp.size_log2 = qhp->wq.size_log2;		uresp.sq_size_log2 = qhp->wq.sq_size_log2;		uresp.rq_size_log2 = qhp->wq.rq_size_log2;		spin_lock(&ucontext->mmap_lock);		uresp.key = ucontext->key;		ucontext->key += PAGE_SIZE;		uresp.db_key = ucontext->key;		ucontext->key += PAGE_SIZE;		spin_unlock(&ucontext->mmap_lock);		if (ib_copy_to_udata(udata, &uresp, sizeof (uresp))) {			kfree(mm1);			kfree(mm2);			iwch_destroy_qp(&qhp->ibqp);			return ERR_PTR(-EFAULT);		}		mm1->key = uresp.key;		mm1->addr = virt_to_phys(qhp->wq.queue);		mm1->len = PAGE_ALIGN(wqsize * sizeof (union t3_wr));		insert_mmap(ucontext, mm1);		mm2->key = uresp.db_key;		mm2->addr = qhp->wq.udb & PAGE_MASK;		mm2->len = PAGE_SIZE;		insert_mmap(ucontext, mm2);	}	qhp->ibqp.qp_num = qhp->wq.qpid;	init_timer(&(qhp->timer));	PDBG("%s sq_num_entries %d, rq_num_entries %d "	     "qpid 0x%0x qhp %p dma_addr 0x%llx size %d\n",	     __FUNCTION__, qhp->attr.sq_num_entries, qhp->attr.rq_num_entries,	     qhp->wq.qpid, qhp, (unsigned long long) qhp->wq.dma_addr,	     1 << qhp->wq.size_log2);	return &qhp->ibqp;}static int iwch_ib_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,		      int attr_mask, struct ib_udata *udata){	struct iwch_dev *rhp;	struct iwch_qp *qhp;	enum iwch_qp_attr_mask mask = 0;	struct iwch_qp_attributes attrs;	PDBG("%s ib_qp %p\n", __FUNCTION__, ibqp);	/* iwarp does not support the RTR state */	if ((attr_mask & IB_QP_STATE) && (attr->qp_state == IB_QPS_RTR))		attr_mask &= ~IB_QP_STATE;	/* Make sure we still have something left to do */	if (!attr_mask)		return 0;	memset(&attrs, 0, sizeof attrs);	qhp = to_iwch_qp(ibqp);	rhp = qhp->rhp;	attrs.next_state = iwch_convert_state(attr->qp_state);	attrs.enable_rdma_read = (attr->qp_access_flags &			       IB_ACCESS_REMOTE_READ) ?  1 : 0;	attrs.enable_rdma_write = (attr->qp_access_flags &				IB_ACCESS_REMOTE_WRITE) ? 1 : 0;	attrs.enable_bind = (attr->qp_access_flags & IB_ACCESS_MW_BIND) ? 1 : 0;	mask |= (attr_mask & IB_QP_STATE) ? IWCH_QP_ATTR_NEXT_STATE : 0;	mask |= (attr_mask & IB_QP_ACCESS_FLAGS) ?			(IWCH_QP_ATTR_ENABLE_RDMA_READ |			 IWCH_QP_ATTR_ENABLE_RDMA_WRITE |			 IWCH_QP_ATTR_ENABLE_RDMA_BIND) : 0;	return iwch_modify_qp(rhp, qhp, mask, &attrs, 0);}void iwch_qp_add_ref(struct ib_qp *qp){	PDBG("%s ib_qp %p\n", __FUNCTION__, qp);	atomic_inc(&(to_iwch_qp(qp)->refcnt));}void iwch_qp_rem_ref(struct ib_qp *qp){	PDBG("%s ib_qp %p\n", __FUNCTION__, qp);	if (atomic_dec_and_test(&(to_iwch_qp(qp)->refcnt)))	        wake_up(&(to_iwch_qp(qp)->wait));}static struct ib_qp *iwch_get_qp(struct ib_device *dev, int qpn){	PDBG("%s ib_dev %p qpn 0x%x\n", __FUNCTION__, dev, qpn);	return (struct ib_qp *)get_qhp(to_iwch_dev(dev), qpn);}static int iwch_query_pkey(struct ib_device *ibdev,			   u8 port, u16 index, u16 * pkey){	PDBG("%s ibdev %p\n", __FUNCTION__, ibdev);	*pkey = 0;	return 0;}static int iwch_query_gid(struct ib_device *ibdev, u8 port,			  int index, union ib_gid *gid){	struct iwch_dev *dev;	PDBG("%s ibdev %p, port %d, index %d, gid %p\n",	       __FUNCTION__, ibdev, port, index, gid);	dev = to_iwch_dev(ibdev);	BUG_ON(port == 0 || port > 2);	memset(&(gid->raw[0]), 0, sizeof(gid->raw));	memcpy(&(gid->raw[0]), dev->rdev.port_info.lldevs[port-1]->dev_addr, 6);	return 0;}static int iwch_query_device(struct ib_device *ibdev,			     struct ib_device_attr *props){	struct iwch_dev *dev;	PDBG("%s ibdev %p\n", __FUNCTION__, ibdev);	dev = to_iwch_dev(ibdev);	memset(props, 0, sizeof *props);	memcpy(&props->sys_image_guid, dev->rdev.t3cdev_p->lldev->dev_addr, 6);	props->device_cap_flags = dev->device_cap_flags;	props->vendor_id = (u32)dev->rdev.rnic_info.pdev->vendor;	props->vendor_part_id = (u32)dev->rdev.rnic_info.pdev->device;	props->max_mr_size = ~0ull;	props->max_qp = dev->attr.max_qps;	props->max_qp_wr = dev->attr.max_wrs;	props->max_sge = dev->attr.max_sge_per_wr;	props->max_sge_rd = 1;	props->max_qp_rd_atom = dev->attr.max_rdma_reads_per_qp;	props->max_qp_init_rd_atom = dev->attr.max_rdma_reads_per_qp;	props->max_cq = dev->attr.max_cqs;	props->max_cqe = dev->attr.max_cqes_per_cq;	props->max_mr = dev->attr.max_mem_regs;	props->max_pd = dev->attr.max_pds;	props->local_ca_ack_delay = 0;	return 0;}static int iwch_query_port(struct ib_device *ibdev,			   u8 port, struct ib_port_attr *props){	PDBG("%s ibdev %p\n", __FUNCTION__, ibdev);	props->max_mtu = IB_MTU_4096;	props->lid = 0;	props->lmc = 0;	props->sm_lid = 0;	props->sm_sl = 0;	props->state = IB_PORT_ACTIVE;	props->phys_state = 0;	props->port_cap_flags =	    IB_PORT_CM_SUP |	    IB_PORT_SNMP_TUNNEL_SUP |	    IB_PORT_REINIT_SUP |	    IB_PORT_DEVICE_MGMT_SUP |	    IB_PORT_VENDOR_CLASS_SUP | IB_PORT_BOOT_MGMT_SUP;	props->gid_tbl_len = 1;	props->pkey_tbl_len = 1;	props->qkey_viol_cntr = 0;	props->active_width = 2;	props->active_speed = 2;	props->max_msg_sz = -1;	return 0;}static ssize_t show_rev(struct class_device *cdev, char *buf){	struct iwch_dev *dev = container_of(cdev, struct iwch_dev,					    ibdev.class_dev);	PDBG("%s class dev 0x%p\n", __FUNCTION__, cdev);	return sprintf(buf, "%d\n", dev->rdev.t3cdev_p->type);}static ssize_t show_fw_ver(struct class_device *cdev, char *buf){	struct iwch_dev *dev = container_of(cdev, struct iwch_dev,					    ibdev.class_dev);	struct ethtool_drvinfo info;	struct net_device *lldev = dev->rdev.t3cdev_p->lldev;	PDBG("%s class dev 0x%p\n", __FUNCTION__, cdev);	lldev->ethtool_ops->get_drvinfo(lldev, &info);	return sprintf(buf, "%s\n", info.fw_version);}static ssize_t show_hca(struct class_device *cdev, char *buf){	struct iwch_dev *dev = container_of(cdev, struct iwch_dev,					    ibdev.class_dev);	struct ethtool_drvinfo info;	struct net_device *lldev = dev->rdev.t3cdev_p->lldev;	PDBG("%s class dev 0x%p\n", __FUNCTION__, cdev);	lldev->ethtool_ops->get_drvinfo(lldev, &info);	return sprintf(buf, "%s\n", info.driver);}static ssize_t show_board(struct class_device *cdev, char *buf){	struct iwch_dev *dev = container_of(cdev, struct iwch_dev,					    ibdev.class_dev);	PDBG("%s class dev 0x%p\n", __FUNCTION__, dev);	return sprintf(buf, "%x.%x\n", dev->rdev.rnic_info.pdev->vendor,		                       dev->rdev.rnic_info.pdev->device);}static CLASS_DEVICE_ATTR(hw_rev, S_IRUGO, show_rev, NULL);static CLASS_DEVICE_ATTR(fw_ver, S_IRUGO, show_fw_ver, NULL);static CLASS_DEVICE_ATTR(hca_type, S_IRUGO, show_hca, NULL);static CLASS_DEVICE_ATTR(board_id, S_IRUGO, show_board, NULL);static struct class_device_attribute *iwch_class_attributes[] = {	&class_device_attr_hw_rev,	&class_device_attr_fw_ver,	&class_device_attr_hca_type,	&class_device_attr_board_id};int iwch_register_device(struct iwch_dev *dev){	int ret;	int i;	PDBG("%s iwch_dev %p\n", __FUNCTION__, dev);	strlcpy(dev->ibdev.name, "cxgb3_%d", IB_DEVICE_NAME_MAX);	memset(&dev->ibdev.node_guid, 0, sizeof(dev->ibdev.node_guid));	memcpy(&dev->ibdev.node_guid, dev->rdev.t3cdev_p->lldev->dev_addr, 6);	dev->ibdev.owner = THIS_MODULE;	dev->device_cap_flags =	    (IB_DEVICE_ZERO_STAG |	     IB_DEVICE_SEND_W_INV | IB_DEVICE_MEM_WINDOW);	dev->ibdev.uverbs_cmd_mask =	    (1ull << IB_USER_VERBS_CMD_GET_CONTEXT) |	    (1ull << IB_USER_VERBS_CMD_QUERY_DEVICE) |	    (1ull << IB_USER_VERBS_CMD_QUERY_PORT) |	    (1ull << IB_USER_VERBS_CMD_ALLOC_PD) |	    (1ull << IB_USER_VERBS_CMD_DEALLOC_PD) |	    (1ull << IB_USER_VERBS_CMD_REG_MR) |	    (1ull << IB_USER_VERBS_CMD_DEREG_MR) |	    (1ull << IB_USER_VERBS_CMD_CREATE_COMP_CHANNEL) |	    (1ull << IB_USER_VERBS_CMD_CREATE_CQ) |	    (1ull << IB_USER_VERBS_CMD_DESTROY_CQ) |	    (1ull << IB_USER_VERBS_CMD_REQ_NOTIFY_CQ) |	    (1ull << IB_USER_VERBS_CMD_CREATE_QP) |	    (1ull << IB_USER_VERBS_CMD_MODIFY_QP) |	    (1ull << IB_USER_VERBS_CMD_POLL_CQ) |	    (1ull << IB_USER_VERBS_CMD_DESTROY_QP) |	    (1ull << IB_USER_VERBS_CMD_POST_SEND) |	    (1ull << IB_USER_VERBS_CMD_POST_RECV);	dev->ibdev.node_type = RDMA_NODE_RNIC;	memcpy(dev->ibdev.node_desc, IWCH_NODE_DESC, sizeof(IWCH_NODE_DESC));	dev->ibdev.phys_port_cnt = dev->rdev.port_info.nports;	dev->ibdev.num_comp_vectors = 1;	dev->ibdev.dma_device = &(dev->rdev.rnic_info.pdev->dev);	dev->ibdev.query_device = iwch_query_device;	dev->ibdev.query_port = iwch_query_port;	dev->ibdev.modify_port = iwch_modify_port;	dev->ibdev.query_pkey = iwch_query_pkey;	dev->ibdev.query_gid = iwch_query_gid;	dev->ibdev.alloc_ucontext = iwch_alloc_ucontext;	dev->ibdev.dealloc_ucontext = iwch_dealloc_ucontext;	dev->ibdev.mmap = iwch_mmap;	dev->ibdev.alloc_pd = iwch_allocate_pd;	dev->ibdev.dealloc_pd = iwch_deallocate_pd;	dev->ibdev.create_ah = iwch_ah_create;	dev->ibdev.destroy_ah = iwch_ah_destroy;	dev->ibdev.create_qp = iwch_create_qp;	dev->ibdev.modify_qp = iwch_ib_modify_qp;	dev->ibdev.destroy_qp = iwch_destroy_qp;	dev->ibdev.create_cq = iwch_create_cq;	dev->ibdev.destroy_cq = iwch_destroy_cq;	dev->ibdev.resize_cq = iwch_resize_cq;	dev->ibdev.poll_cq = iwch_poll_cq;	dev->ibdev.get_dma_mr = iwch_get_dma_mr;	dev->ibdev.reg_phys_mr = iwch_register_phys_mem;	dev->ibdev.rereg_phys_mr = iwch_reregister_phys_mem;	dev->ibdev.reg_user_mr = iwch_reg_user_mr;	dev->ibdev.dereg_mr = iwch_dereg_mr;	dev->ibdev.alloc_mw = iwch_alloc_mw;	dev->ibdev.bind_mw = iwch_bind_mw;	dev->ibdev.dealloc_mw = iwch_dealloc_mw;	dev->ibdev.attach_mcast = iwch_multicast_attach;	dev->ibdev.detach_mcast = iwch_multicast_detach;	dev->ibdev.process_mad = iwch_process_mad;	dev->ibdev.req_notify_cq = iwch_arm_cq;	dev->ibdev.post_send = iwch_post_send;	dev->ibdev.post_recv = iwch_post_receive;	dev->ibdev.iwcm = kmalloc(sizeof(struct iw_cm_verbs), GFP_KERNEL);	if (!dev->ibdev.iwcm)		return -ENOMEM;	dev->ibdev.iwcm->connect = iwch_connect;	dev->ibdev.iwcm->accept = iwch_accept_cr;	dev->ibdev.iwcm->reject = iwch_reject_cr;	dev->ibdev.iwcm->create_listen = iwch_create_listen;	dev->ibdev.iwcm->destroy_listen = iwch_destroy_listen;	dev->ibdev.iwcm->add_ref = iwch_qp_add_ref;	dev->ibdev.iwcm->rem_ref = iwch_qp_rem_ref;	dev->ibdev.iwcm->get_qp = iwch_get_qp;	ret = ib_register_device(&dev->ibdev);	if (ret)		goto bail1;	for (i = 0; i < ARRAY_SIZE(iwch_class_attributes); ++i) {		ret = class_device_create_file(&dev->ibdev.class_dev,					       iwch_class_attributes[i]);		if (ret) {			goto bail2;		}	}	return 0;bail2:	ib_unregister_device(&dev->ibdev);bail1:	return ret;}void iwch_unregister_device(struct iwch_dev *dev){	int i;	PDBG("%s iwch_dev %p\n", __FUNCTION__, dev);	for (i = 0; i < ARRAY_SIZE(iwch_class_attributes); ++i)		class_device_remove_file(&dev->ibdev.class_dev,					 iwch_class_attributes[i]);	ib_unregister_device(&dev->ibdev);	return;}

⌨️ 快捷键说明

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