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

📄 mthca_cmd.c

📁 h内核
💻 C
📖 第 1 页 / 共 4 页
字号:
	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, void *mpt_entry,		    int mpt_index, u8 *status){	dma_addr_t indma;	int err;	indma = pci_map_single(dev->pdev, mpt_entry,			       MTHCA_MPT_ENTRY_SIZE,			       PCI_DMA_TODEVICE);	if (pci_dma_mapping_error(indma))		return -ENOMEM;	err = mthca_cmd(dev, indma, mpt_index, 0, CMD_SW2HW_MPT,			CMD_TIME_CLASS_B, status);	pci_unmap_single(dev->pdev, indma,			 MTHCA_MPT_ENTRY_SIZE, PCI_DMA_TODEVICE);	return err;}int mthca_HW2SW_MPT(struct mthca_dev *dev, void *mpt_entry,		    int mpt_index, u8 *status){	dma_addr_t outdma = 0;	int err;	if (mpt_entry) {		outdma = pci_map_single(dev->pdev, mpt_entry,					MTHCA_MPT_ENTRY_SIZE,					PCI_DMA_FROMDEVICE);		if (pci_dma_mapping_error(outdma))			return -ENOMEM;	}	err = mthca_cmd_box(dev, 0, outdma, mpt_index, !mpt_entry,			    CMD_HW2SW_MPT,			    CMD_TIME_CLASS_B, status);	if (mpt_entry)		pci_unmap_single(dev->pdev, outdma,				 MTHCA_MPT_ENTRY_SIZE,				 PCI_DMA_FROMDEVICE);	return err;}int mthca_WRITE_MTT(struct mthca_dev *dev, u64 *mtt_entry,		    int num_mtt, u8 *status){	dma_addr_t indma;	int err;	indma = pci_map_single(dev->pdev, mtt_entry,			       (num_mtt + 2) * 8,			       PCI_DMA_TODEVICE);	if (pci_dma_mapping_error(indma))		return -ENOMEM;	err = mthca_cmd(dev, indma, num_mtt, 0, CMD_WRITE_MTT,			CMD_TIME_CLASS_B, status);	pci_unmap_single(dev->pdev, indma,			 (num_mtt + 2) * 8, PCI_DMA_TODEVICE);	return err;}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, void *eq_context,		   int eq_num, u8 *status){	dma_addr_t indma;	int err;	indma = pci_map_single(dev->pdev, eq_context,			       MTHCA_EQ_CONTEXT_SIZE,			       PCI_DMA_TODEVICE);	if (pci_dma_mapping_error(indma))		return -ENOMEM;	err = mthca_cmd(dev, indma, eq_num, 0, CMD_SW2HW_EQ,			CMD_TIME_CLASS_A, status);	pci_unmap_single(dev->pdev, indma,			 MTHCA_EQ_CONTEXT_SIZE, PCI_DMA_TODEVICE);	return err;}int mthca_HW2SW_EQ(struct mthca_dev *dev, void *eq_context,		   int eq_num, u8 *status){	dma_addr_t outdma = 0;	int err;	outdma = pci_map_single(dev->pdev, eq_context,				MTHCA_EQ_CONTEXT_SIZE,				PCI_DMA_FROMDEVICE);	if (pci_dma_mapping_error(outdma))		return -ENOMEM;	err = mthca_cmd_box(dev, 0, outdma, eq_num, 0,			    CMD_HW2SW_EQ,			    CMD_TIME_CLASS_A, status);	pci_unmap_single(dev->pdev, outdma,			 MTHCA_EQ_CONTEXT_SIZE,			 PCI_DMA_FROMDEVICE);	return err;}int mthca_SW2HW_CQ(struct mthca_dev *dev, void *cq_context,		   int cq_num, u8 *status){	dma_addr_t indma;	int err;	indma = pci_map_single(dev->pdev, cq_context,			       MTHCA_CQ_CONTEXT_SIZE,			       PCI_DMA_TODEVICE);	if (pci_dma_mapping_error(indma))		return -ENOMEM;	err = mthca_cmd(dev, indma, cq_num, 0, CMD_SW2HW_CQ,			CMD_TIME_CLASS_A, status);	pci_unmap_single(dev->pdev, indma,			 MTHCA_CQ_CONTEXT_SIZE, PCI_DMA_TODEVICE);	return err;}int mthca_HW2SW_CQ(struct mthca_dev *dev, void *cq_context,		   int cq_num, u8 *status){	dma_addr_t outdma = 0;	int err;	outdma = pci_map_single(dev->pdev, cq_context,				MTHCA_CQ_CONTEXT_SIZE,				PCI_DMA_FROMDEVICE);	if (pci_dma_mapping_error(outdma))		return -ENOMEM;	err = mthca_cmd_box(dev, 0, outdma, cq_num, 0,			    CMD_HW2SW_CQ,			    CMD_TIME_CLASS_A, status);	pci_unmap_single(dev->pdev, outdma,			 MTHCA_CQ_CONTEXT_SIZE,			 PCI_DMA_FROMDEVICE);	return err;}int mthca_MODIFY_QP(struct mthca_dev *dev, int trans, u32 num,		    int is_ee, void *qp_context, 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;	dma_addr_t indma;	int err;	if (trans < 0 || trans >= ARRAY_SIZE(op))		return -EINVAL;	if (trans == MTHCA_TRANS_ANY2RST) {		indma  = 0;		op_mod = 3;	/* don't write outbox, any->reset */		/* For debugging */		qp_context = pci_alloc_consistent(dev->pdev, MTHCA_QP_CONTEXT_SIZE,						  &indma);		op_mod = 2;	/* write outbox, any->reset */	} else {		indma = pci_map_single(dev->pdev, qp_context,				       MTHCA_QP_CONTEXT_SIZE,				       PCI_DMA_TODEVICE);		if (pci_dma_mapping_error(indma))			return -ENOMEM;		if (0) {			int i;			mthca_dbg(dev, "Dumping QP context:\n");			printk(" %08x\n", be32_to_cpup(qp_context));			for (i = 0; i < 0x100 / 4; ++i) {				if (i % 8 == 0)					printk("[%02x] ", i * 4);				printk(" %08x", be32_to_cpu(((u32 *) qp_context)[i + 2]));				if ((i + 1) % 8 == 0)					printk("\n");			}		}	}	if (trans == MTHCA_TRANS_ANY2RST) {		err = mthca_cmd_box(dev, 0, indma, (!!is_ee << 24) | num,				    op_mod, op[trans], CMD_TIME_CLASS_C, status);		if (0) {			int i;			mthca_dbg(dev, "Dumping QP context:\n");			printk(" %08x\n", be32_to_cpup(qp_context));			for (i = 0; i < 0x100 / 4; ++i) {				if (i % 8 == 0)					printk("[%02x] ", i * 4);				printk(" %08x", be32_to_cpu(((u32 *) qp_context)[i + 2]));				if ((i + 1) % 8 == 0)					printk("\n");			}		}	} else		err = mthca_cmd(dev, indma, (!!is_ee << 24) | num,				op_mod, op[trans], CMD_TIME_CLASS_C, status);	if (trans != MTHCA_TRANS_ANY2RST)		pci_unmap_single(dev->pdev, indma,				 MTHCA_QP_CONTEXT_SIZE, PCI_DMA_TODEVICE);	else		pci_free_consistent(dev->pdev, MTHCA_QP_CONTEXT_SIZE,				    qp_context, indma);	return err;}int mthca_QUERY_QP(struct mthca_dev *dev, u32 num, int is_ee,		   void *qp_context, u8 *status){	dma_addr_t outdma = 0;	int err;	outdma = pci_map_single(dev->pdev, qp_context,				MTHCA_QP_CONTEXT_SIZE,				PCI_DMA_FROMDEVICE);	if (pci_dma_mapping_error(outdma))		return -ENOMEM;	err = mthca_cmd_box(dev, 0, outdma, (!!is_ee << 24) | num, 0,			    CMD_QUERY_QPEE,			    CMD_TIME_CLASS_A, status);	pci_unmap_single(dev->pdev, outdma,			 MTHCA_QP_CONTEXT_SIZE,			 PCI_DMA_FROMDEVICE);	return err;}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){	void *box;	dma_addr_t dma;	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	box = pci_alloc_consistent(dev->pdev, MAD_IFC_BOX_SIZE, &dma);	if (!box)		return -ENOMEM;	memcpy(box, 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(box + 256, 0, 256);		MTHCA_PUT(box, in_wc->qp_num, 	  MAD_IFC_MY_QPN_OFFSET);		MTHCA_PUT(box, in_wc->src_qp, 	  MAD_IFC_RQPN_OFFSET);		val = in_wc->sl << 4;		MTHCA_PUT(box, val,               MAD_IFC_SL_OFFSET);		val = in_wc->dlid_path_bits |			(in_wc->wc_flags & IB_WC_GRH ? 0x80 : 0);		MTHCA_PUT(box, val,               MAD_IFC_GRH_OFFSET);		MTHCA_PUT(box, in_wc->slid,       MAD_IFC_RLID_OFFSET);		MTHCA_PUT(box, in_wc->pkey_index, MAD_IFC_PKEY_OFFSET);		if (in_grh)			memcpy((u8 *) box + MAD_IFC_GRH_OFFSET, in_grh, 40);		op_modifier |= 0x10;		in_modifier |= in_wc->slid << 16;	}	err = mthca_cmd_box(dev, dma, dma + 512, in_modifier, op_modifier,			    CMD_MAD_IFC, CMD_TIME_CLASS_C, status);	if (!err && !*status)		memcpy(response_mad, box + 512, 256);	pci_free_consistent(dev->pdev, MAD_IFC_BOX_SIZE, box, dma);	return err;}int mthca_READ_MGM(struct mthca_dev *dev, int index, void *mgm,		   u8 *status){	dma_addr_t outdma = 0;	int err;	outdma = pci_map_single(dev->pdev, mgm,				MTHCA_MGM_ENTRY_SIZE,				PCI_DMA_FROMDEVICE);	if (pci_dma_mapping_error(outdma))		return -ENOMEM;	err = mthca_cmd_box(dev, 0, outdma, index, 0,			    CMD_READ_MGM,			    CMD_TIME_CLASS_A, status);	pci_unmap_single(dev->pdev, outdma,			 MTHCA_MGM_ENTRY_SIZE,			 PCI_DMA_FROMDEVICE);	return err;}int mthca_WRITE_MGM(struct mthca_dev *dev, int index, void *mgm,		    u8 *status){	dma_addr_t indma;	int err;	indma = pci_map_single(dev->pdev, mgm,			       MTHCA_MGM_ENTRY_SIZE,			       PCI_DMA_TODEVICE);	if (pci_dma_mapping_error(indma))		return -ENOMEM;	err = mthca_cmd(dev, indma, index, 0, CMD_WRITE_MGM,			CMD_TIME_CLASS_A, status);	pci_unmap_single(dev->pdev, indma,			 MTHCA_MGM_ENTRY_SIZE, PCI_DMA_TODEVICE);	return err;}int mthca_MGID_HASH(struct mthca_dev *dev, void *gid, u16 *hash,		    u8 *status){	dma_addr_t indma;	u64 imm;	int err;	indma = pci_map_single(dev->pdev, gid, 16, PCI_DMA_TODEVICE);	if (pci_dma_mapping_error(indma))		return -ENOMEM;	err = mthca_cmd_imm(dev, indma, &imm, 0, 0, CMD_MGID_HASH,			    CMD_TIME_CLASS_A, status);	*hash = imm;	pci_unmap_single(dev->pdev, indma, 16, PCI_DMA_TODEVICE);	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 + -