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

📄 mthca_cmd.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 4 页
字号:
	MTHCA_PUT(inbox, param->gid_cap,   INIT_IB_MAX_GID_OFFSET);	MTHCA_PUT(inbox, param->pkey_cap,  INIT_IB_MAX_PKEY_OFFSET);	MTHCA_PUT(inbox, param->guid0,     INIT_IB_GUID0_OFFSET);	MTHCA_PUT(inbox, param->node_guid, INIT_IB_NODE_GUID_OFFSET);	MTHCA_PUT(inbox, param->si_guid,   INIT_IB_SI_GUID_OFFSET);	err = mthca_cmd(dev, mailbox->dma, port, 0, CMD_INIT_IB,			CMD_TIME_CLASS_A, status);	mthca_free_mailbox(dev, mailbox);	return err;}int mthca_CLOSE_IB(struct mthca_dev *dev, int port, u8 *status){	return mthca_cmd(dev, 0, port, 0, CMD_CLOSE_IB, HZ, status);}int mthca_CLOSE_HCA(struct mthca_dev *dev, int panic, u8 *status){	return mthca_cmd(dev, 0, 0, panic, CMD_CLOSE_HCA, HZ, status);}int mthca_SET_IB(struct mthca_dev *dev, struct mthca_set_ib_param *param,		 int port, u8 *status){	struct mthca_mailbox *mailbox;	u32 *inbox;	int err;	u32 flags = 0;#define SET_IB_IN_SIZE         0x40#define SET_IB_FLAGS_OFFSET    0x00#define SET_IB_FLAG_SIG        (1 << 18)#define SET_IB_FLAG_RQK        (1 <<  0)#define SET_IB_CAP_MASK_OFFSET 0x04#define SET_IB_SI_GUID_OFFSET  0x08	mailbox = mthca_alloc_mailbox(dev, GFP_KERNEL);	if (IS_ERR(mailbox))		return PTR_ERR(mailbox);	inbox = mailbox->buf;	memset(inbox, 0, SET_IB_IN_SIZE);	flags |= param->set_si_guid     ? SET_IB_FLAG_SIG : 0;	flags |= param->reset_qkey_viol ? SET_IB_FLAG_RQK : 0;	MTHCA_PUT(inbox, flags, SET_IB_FLAGS_OFFSET);	MTHCA_PUT(inbox, param->cap_mask, SET_IB_CAP_MASK_OFFSET);	MTHCA_PUT(inbox, param->si_guid,  SET_IB_SI_GUID_OFFSET);	err = mthca_cmd(dev, mailbox->dma, port, 0, CMD_SET_IB,			CMD_TIME_CLASS_B, status);	mthca_free_mailbox(dev, mailbox);	return err;}int mthca_MAP_ICM(struct mthca_dev *dev, struct mthca_icm *icm, u64 virt, u8 *status){	return mthca_map_cmd(dev, CMD_MAP_ICM, icm, virt, status);}int mthca_MAP_ICM_page(struct mthca_dev *dev, u64 dma_addr, u64 virt, u8 *status){	struct mthca_mailbox *mailbox;	__be64 *inbox;	int err;	mailbox = mthca_alloc_mailbox(dev, GFP_KERNEL);	if (IS_ERR(mailbox))		return PTR_ERR(mailbox);	inbox = mailbox->buf;	inbox[0] = cpu_to_be64(virt);	inbox[1] = cpu_to_be64(dma_addr);	err = mthca_cmd(dev, mailbox->dma, 1, 0, CMD_MAP_ICM,			CMD_TIME_CLASS_B, status);	mthca_free_mailbox(dev, mailbox);	if (!err)		mthca_dbg(dev, "Mapped page at %llx to %llx for ICM.\n",			  (unsigned long long) dma_addr, (unsigned long long) virt);	return err;}int mthca_UNMAP_ICM(struct mthca_dev *dev, u64 virt, u32 page_count, u8 *status){	mthca_dbg(dev, "Unmapping %d pages at %llx from ICM.\n",		  page_count, (unsigned long long) virt);	return mthca_cmd(dev, virt, page_count, 0, CMD_UNMAP_ICM, CMD_TIME_CLASS_B, status);}int mthca_MAP_ICM_AUX(struct mthca_dev *dev, struct mthca_icm *icm, u8 *status){	return mthca_map_cmd(dev, CMD_MAP_ICM_AUX, icm, -1, status);}int mthca_UNMAP_ICM_AUX(struct mthca_dev *dev, u8 *status){	return mthca_cmd(dev, 0, 0, 0, CMD_UNMAP_ICM_AUX, CMD_TIME_CLASS_B, status);}int mthca_SET_ICM_SIZE(struct mthca_dev *dev, u64 icm_size, u64 *aux_pages,		       u8 *status){	int ret = mthca_cmd_imm(dev, icm_size, aux_pages, 0, 0, CMD_SET_ICM_SIZE,				CMD_TIME_CLASS_A, status);	if (ret || status)		return ret;	/*	 * Arbel page size is always 4 KB; round up number of system	 * pages needed.	 */	*aux_pages = (*aux_pages + (1 << (PAGE_SHIFT - 12)) - 1) >> (PAGE_SHIFT - 12);	return 0;}int mthca_SW2HW_MPT(struct mthca_dev *dev, struct mthca_mailbox *mailbox,		    int mpt_index, u8 *status){	return mthca_cmd(dev, mailbox->dma, mpt_index, 0, CMD_SW2HW_MPT,			 CMD_TIME_CLASS_B, status);}int mthca_HW2SW_MPT(struct mthca_dev *dev, struct mthca_mailbox *mailbox,		    int mpt_index, u8 *status){	return mthca_cmd_box(dev, 0, mailbox ? mailbox->dma : 0, mpt_index,			     !mailbox, CMD_HW2SW_MPT,			     CMD_TIME_CLASS_B, status);}int mthca_WRITE_MTT(struct mthca_dev *dev, struct mthca_mailbox *mailbox,		    int num_mtt, u8 *status){	return mthca_cmd(dev, mailbox->dma, num_mtt, 0, CMD_WRITE_MTT,			 CMD_TIME_CLASS_B, status);}int mthca_SYNC_TPT(struct mthca_dev *dev, u8 *status){	return mthca_cmd(dev, 0, 0, 0, CMD_SYNC_TPT, CMD_TIME_CLASS_B, status);}int mthca_MAP_EQ(struct mthca_dev *dev, u64 event_mask, int unmap,		 int eq_num, u8 *status){	mthca_dbg(dev, "%s mask %016llx for eqn %d\n",		  unmap ? "Clearing" : "Setting",		  (unsigned long long) event_mask, eq_num);	return mthca_cmd(dev, event_mask, (unmap << 31) | eq_num,			 0, CMD_MAP_EQ, CMD_TIME_CLASS_B, status);}int mthca_SW2HW_EQ(struct mthca_dev *dev, struct mthca_mailbox *mailbox,		   int eq_num, u8 *status){	return mthca_cmd(dev, mailbox->dma, eq_num, 0, CMD_SW2HW_EQ,			 CMD_TIME_CLASS_A, status);}int mthca_HW2SW_EQ(struct mthca_dev *dev, struct mthca_mailbox *mailbox,		   int eq_num, u8 *status){	return mthca_cmd_box(dev, 0, mailbox->dma, eq_num, 0,			     CMD_HW2SW_EQ,			     CMD_TIME_CLASS_A, status);}int mthca_SW2HW_CQ(struct mthca_dev *dev, struct mthca_mailbox *mailbox,		   int cq_num, u8 *status){	return mthca_cmd(dev, mailbox->dma, cq_num, 0, CMD_SW2HW_CQ,			CMD_TIME_CLASS_A, status);}int mthca_HW2SW_CQ(struct mthca_dev *dev, struct mthca_mailbox *mailbox,		   int cq_num, u8 *status){	return mthca_cmd_box(dev, 0, mailbox->dma, cq_num, 0,			     CMD_HW2SW_CQ,			     CMD_TIME_CLASS_A, status);}int mthca_SW2HW_SRQ(struct mthca_dev *dev, struct mthca_mailbox *mailbox,		    int srq_num, u8 *status){	return mthca_cmd(dev, mailbox->dma, srq_num, 0, CMD_SW2HW_SRQ,			CMD_TIME_CLASS_A, status);}int mthca_HW2SW_SRQ(struct mthca_dev *dev, struct mthca_mailbox *mailbox,		    int srq_num, u8 *status){	return mthca_cmd_box(dev, 0, mailbox->dma, srq_num, 0,			     CMD_HW2SW_SRQ,			     CMD_TIME_CLASS_A, status);}int mthca_ARM_SRQ(struct mthca_dev *dev, int srq_num, int limit, u8 *status){	return mthca_cmd(dev, limit, srq_num, 0, CMD_ARM_SRQ,			 CMD_TIME_CLASS_B, status);}int mthca_MODIFY_QP(struct mthca_dev *dev, int trans, u32 num,		    int is_ee, struct mthca_mailbox *mailbox, u32 optmask,		    u8 *status){	static const u16 op[] = {		[MTHCA_TRANS_RST2INIT]  = CMD_RST2INIT_QPEE,		[MTHCA_TRANS_INIT2INIT] = CMD_INIT2INIT_QPEE,		[MTHCA_TRANS_INIT2RTR]  = CMD_INIT2RTR_QPEE,		[MTHCA_TRANS_RTR2RTS]   = CMD_RTR2RTS_QPEE,		[MTHCA_TRANS_RTS2RTS]   = CMD_RTS2RTS_QPEE,		[MTHCA_TRANS_SQERR2RTS] = CMD_SQERR2RTS_QPEE,		[MTHCA_TRANS_ANY2ERR]   = CMD_2ERR_QPEE,		[MTHCA_TRANS_RTS2SQD]   = CMD_RTS2SQD_QPEE,		[MTHCA_TRANS_SQD2SQD]   = CMD_SQD2SQD_QPEE,		[MTHCA_TRANS_SQD2RTS]   = CMD_SQD2RTS_QPEE,		[MTHCA_TRANS_ANY2RST]   = CMD_ERR2RST_QPEE	};	u8 op_mod = 0;	int my_mailbox = 0;	int err;	if (trans < 0 || trans >= ARRAY_SIZE(op))		return -EINVAL;	if (trans == MTHCA_TRANS_ANY2RST) {		op_mod = 3;	/* don't write outbox, any->reset */		/* For debugging */		if (!mailbox) {			mailbox = mthca_alloc_mailbox(dev, GFP_KERNEL);			if (!IS_ERR(mailbox)) {				my_mailbox = 1;				op_mod     = 2;	/* write outbox, any->reset */			} else				mailbox = NULL;		}	} else {		if (0) {			int i;			mthca_dbg(dev, "Dumping QP context:\n");			printk("  opt param mask: %08x\n", be32_to_cpup(mailbox->buf));			for (i = 0; i < 0x100 / 4; ++i) {				if (i % 8 == 0)					printk("  [%02x] ", i * 4);				printk(" %08x",				       be32_to_cpu(((__be32 *) mailbox->buf)[i + 2]));				if ((i + 1) % 8 == 0)					printk("\n");			}		}	}	if (trans == MTHCA_TRANS_ANY2RST) {		err = mthca_cmd_box(dev, 0, mailbox ? mailbox->dma : 0,				    (!!is_ee << 24) | num, op_mod,				    op[trans], CMD_TIME_CLASS_C, status);		if (0 && mailbox) {			int i;			mthca_dbg(dev, "Dumping QP context:\n");			printk(" %08x\n", be32_to_cpup(mailbox->buf));			for (i = 0; i < 0x100 / 4; ++i) {				if (i % 8 == 0)					printk("[%02x] ", i * 4);				printk(" %08x",				       be32_to_cpu(((__be32 *) mailbox->buf)[i + 2]));				if ((i + 1) % 8 == 0)					printk("\n");			}		}	} else		err = mthca_cmd(dev, mailbox->dma, (!!is_ee << 24) | num,				op_mod, op[trans], CMD_TIME_CLASS_C, status);	if (my_mailbox)		mthca_free_mailbox(dev, mailbox);	return err;}int mthca_QUERY_QP(struct mthca_dev *dev, u32 num, int is_ee,		   struct mthca_mailbox *mailbox, u8 *status){	return mthca_cmd_box(dev, 0, mailbox->dma, (!!is_ee << 24) | num, 0,			     CMD_QUERY_QPEE, CMD_TIME_CLASS_A, status);}int mthca_CONF_SPECIAL_QP(struct mthca_dev *dev, int type, u32 qpn,			  u8 *status){	u8 op_mod;	switch (type) {	case IB_QPT_SMI:		op_mod = 0;		break;	case IB_QPT_GSI:		op_mod = 1;		break;	case IB_QPT_RAW_IPV6:		op_mod = 2;		break;	case IB_QPT_RAW_ETY:		op_mod = 3;		break;	default:		return -EINVAL;	}	return mthca_cmd(dev, 0, qpn, op_mod, CMD_CONF_SPECIAL_QP,			 CMD_TIME_CLASS_B, status);}int mthca_MAD_IFC(struct mthca_dev *dev, int ignore_mkey, int ignore_bkey,		  int port, struct ib_wc *in_wc, struct ib_grh *in_grh,		  void *in_mad, void *response_mad, u8 *status){	struct mthca_mailbox *inmailbox, *outmailbox;	void *inbox;	int err;	u32 in_modifier = port;	u8 op_modifier = 0;#define MAD_IFC_BOX_SIZE      0x400#define MAD_IFC_MY_QPN_OFFSET 0x100#define MAD_IFC_RQPN_OFFSET   0x104#define MAD_IFC_SL_OFFSET     0x108#define MAD_IFC_G_PATH_OFFSET 0x109#define MAD_IFC_RLID_OFFSET   0x10a#define MAD_IFC_PKEY_OFFSET   0x10e#define MAD_IFC_GRH_OFFSET    0x140	inmailbox = mthca_alloc_mailbox(dev, GFP_KERNEL);	if (IS_ERR(inmailbox))		return PTR_ERR(inmailbox);	inbox = inmailbox->buf;	outmailbox = mthca_alloc_mailbox(dev, GFP_KERNEL);	if (IS_ERR(outmailbox)) {		mthca_free_mailbox(dev, inmailbox);		return PTR_ERR(outmailbox);	}	memcpy(inbox, in_mad, 256);	/*	 * Key check traps can't be generated unless we have in_wc to	 * tell us where to send the trap.	 */	if (ignore_mkey || !in_wc)		op_modifier |= 0x1;	if (ignore_bkey || !in_wc)		op_modifier |= 0x2;	if (in_wc) {		u8 val;		memset(inbox + 256, 0, 256);		MTHCA_PUT(inbox, in_wc->qp_num,     MAD_IFC_MY_QPN_OFFSET);		MTHCA_PUT(inbox, in_wc->src_qp,     MAD_IFC_RQPN_OFFSET);		val = in_wc->sl << 4;		MTHCA_PUT(inbox, val,               MAD_IFC_SL_OFFSET);		val = in_wc->dlid_path_bits |			(in_wc->wc_flags & IB_WC_GRH ? 0x80 : 0);		MTHCA_PUT(inbox, val,               MAD_IFC_GRH_OFFSET);		MTHCA_PUT(inbox, in_wc->slid,       MAD_IFC_RLID_OFFSET);		MTHCA_PUT(inbox, in_wc->pkey_index, MAD_IFC_PKEY_OFFSET);		if (in_grh)			memcpy(inbox + MAD_IFC_GRH_OFFSET, in_grh, 40);		op_modifier |= 0x10;		in_modifier |= in_wc->slid << 16;	}	err = mthca_cmd_box(dev, inmailbox->dma, outmailbox->dma,			    in_modifier, op_modifier,			    CMD_MAD_IFC, CMD_TIME_CLASS_C, status);	if (!err && !*status)		memcpy(response_mad, outmailbox->buf, 256);	mthca_free_mailbox(dev, inmailbox);	mthca_free_mailbox(dev, outmailbox);	return err;}int mthca_READ_MGM(struct mthca_dev *dev, int index,		   struct mthca_mailbox *mailbox, u8 *status){	return mthca_cmd_box(dev, 0, mailbox->dma, index, 0,			     CMD_READ_MGM, CMD_TIME_CLASS_A, status);}int mthca_WRITE_MGM(struct mthca_dev *dev, int index,		    struct mthca_mailbox *mailbox, u8 *status){	return mthca_cmd(dev, mailbox->dma, index, 0, CMD_WRITE_MGM,			 CMD_TIME_CLASS_A, status);}int mthca_MGID_HASH(struct mthca_dev *dev, struct mthca_mailbox *mailbox,		    u16 *hash, u8 *status){	u64 imm;	int err;	err = mthca_cmd_imm(dev, mailbox->dma, &imm, 0, 0, CMD_MGID_HASH,			    CMD_TIME_CLASS_A, status);	*hash = imm;	return err;}int mthca_NOP(struct mthca_dev *dev, u8 *status){	return mthca_cmd(dev, 0, 0x1f, 0, CMD_NOP, msecs_to_jiffies(100), status);}

⌨️ 快捷键说明

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