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

📄 mthca_main.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 3 页
字号:
	mdev->qp_table.qp_table = mthca_alloc_icm_table(mdev, init_hca->qpc_base,							dev_lim->qpc_entry_sz,							mdev->limits.num_qps,							mdev->limits.reserved_qps, 0);	if (!mdev->qp_table.qp_table) {		mthca_err(mdev, "Failed to map QP context memory, aborting.\n");		err = -ENOMEM;		goto err_unmap_mpt;	}	mdev->qp_table.eqp_table = mthca_alloc_icm_table(mdev, init_hca->eqpc_base,							 dev_lim->eqpc_entry_sz,							 mdev->limits.num_qps,							 mdev->limits.reserved_qps, 0);	if (!mdev->qp_table.eqp_table) {		mthca_err(mdev, "Failed to map EQP context memory, aborting.\n");		err = -ENOMEM;		goto err_unmap_qp;	}	mdev->qp_table.rdb_table = mthca_alloc_icm_table(mdev, init_hca->rdb_base,							 MTHCA_RDB_ENTRY_SIZE,							 mdev->limits.num_qps <<							 mdev->qp_table.rdb_shift,							 0, 0);	if (!mdev->qp_table.rdb_table) {		mthca_err(mdev, "Failed to map RDB context memory, aborting\n");		err = -ENOMEM;		goto err_unmap_eqp;	}       mdev->cq_table.table = mthca_alloc_icm_table(mdev, init_hca->cqc_base,						    dev_lim->cqc_entry_sz,						    mdev->limits.num_cqs,						    mdev->limits.reserved_cqs, 0);	if (!mdev->cq_table.table) {		mthca_err(mdev, "Failed to map CQ context memory, aborting.\n");		err = -ENOMEM;		goto err_unmap_rdb;	}	if (mdev->mthca_flags & MTHCA_FLAG_SRQ) {		mdev->srq_table.table =			mthca_alloc_icm_table(mdev, init_hca->srqc_base,					      dev_lim->srq_entry_sz,					      mdev->limits.num_srqs,					      mdev->limits.reserved_srqs, 0);		if (!mdev->srq_table.table) {			mthca_err(mdev, "Failed to map SRQ context memory, "				  "aborting.\n");			err = -ENOMEM;			goto err_unmap_cq;		}	}	/*	 * It's not strictly required, but for simplicity just map the	 * whole multicast group table now.  The table isn't very big	 * and it's a lot easier than trying to track ref counts.	 */	mdev->mcg_table.table = mthca_alloc_icm_table(mdev, init_hca->mc_base,						      MTHCA_MGM_ENTRY_SIZE,						      mdev->limits.num_mgms +						      mdev->limits.num_amgms,						      mdev->limits.num_mgms +						      mdev->limits.num_amgms,						      0);	if (!mdev->mcg_table.table) {		mthca_err(mdev, "Failed to map MCG context memory, aborting.\n");		err = -ENOMEM;		goto err_unmap_srq;	}	return 0;err_unmap_srq:	if (mdev->mthca_flags & MTHCA_FLAG_SRQ)		mthca_free_icm_table(mdev, mdev->srq_table.table);err_unmap_cq:	mthca_free_icm_table(mdev, mdev->cq_table.table);err_unmap_rdb:	mthca_free_icm_table(mdev, mdev->qp_table.rdb_table);err_unmap_eqp:	mthca_free_icm_table(mdev, mdev->qp_table.eqp_table);err_unmap_qp:	mthca_free_icm_table(mdev, mdev->qp_table.qp_table);err_unmap_mpt:	mthca_free_icm_table(mdev, mdev->mr_table.mpt_table);err_unmap_mtt:	mthca_free_icm_table(mdev, mdev->mr_table.mtt_table);err_unmap_eq:	mthca_unmap_eq_icm(mdev);err_unmap_aux:	mthca_UNMAP_ICM_AUX(mdev, &status);err_free_aux:	mthca_free_icm(mdev, mdev->fw.arbel.aux_icm);	return err;}static void mthca_free_icms(struct mthca_dev *mdev){	u8 status;	mthca_free_icm_table(mdev, mdev->mcg_table.table);	if (mdev->mthca_flags & MTHCA_FLAG_SRQ)		mthca_free_icm_table(mdev, mdev->srq_table.table);	mthca_free_icm_table(mdev, mdev->cq_table.table);	mthca_free_icm_table(mdev, mdev->qp_table.rdb_table);	mthca_free_icm_table(mdev, mdev->qp_table.eqp_table);	mthca_free_icm_table(mdev, mdev->qp_table.qp_table);	mthca_free_icm_table(mdev, mdev->mr_table.mpt_table);	mthca_free_icm_table(mdev, mdev->mr_table.mtt_table);	mthca_unmap_eq_icm(mdev);	mthca_UNMAP_ICM_AUX(mdev, &status);	mthca_free_icm(mdev, mdev->fw.arbel.aux_icm);}static int __devinit mthca_init_arbel(struct mthca_dev *mdev){	struct mthca_dev_lim        dev_lim;	struct mthca_profile        profile;	struct mthca_init_hca_param init_hca;	u64 icm_size;	u8 status;	int err;	err = mthca_QUERY_FW(mdev, &status);	if (err) {		mthca_err(mdev, "QUERY_FW command failed, aborting.\n");		return err;	}	if (status) {		mthca_err(mdev, "QUERY_FW returned status 0x%02x, "			  "aborting.\n", status);		return -EINVAL;	}	err = mthca_ENABLE_LAM(mdev, &status);	if (err) {		mthca_err(mdev, "ENABLE_LAM command failed, aborting.\n");		return err;	}	if (status == MTHCA_CMD_STAT_LAM_NOT_PRE) {		mthca_dbg(mdev, "No HCA-attached memory (running in MemFree mode)\n");		mdev->mthca_flags |= MTHCA_FLAG_NO_LAM;	} else if (status) {		mthca_err(mdev, "ENABLE_LAM returned status 0x%02x, "			  "aborting.\n", status);		return -EINVAL;	}	err = mthca_load_fw(mdev);	if (err) {		mthca_err(mdev, "Failed to start FW, aborting.\n");		goto err_disable;	}	err = mthca_dev_lim(mdev, &dev_lim);	if (err) {		mthca_err(mdev, "QUERY_DEV_LIM command failed, aborting.\n");		goto err_stop_fw;	}	profile = default_profile;	profile.num_uar  = dev_lim.uar_size / PAGE_SIZE;	profile.num_udav = 0;	if (mdev->mthca_flags & MTHCA_FLAG_SRQ)		profile.num_srq = dev_lim.max_srqs;	icm_size = mthca_make_profile(mdev, &profile, &dev_lim, &init_hca);	if ((int) icm_size < 0) {		err = icm_size;		goto err_stop_fw;	}	err = mthca_init_icm(mdev, &dev_lim, &init_hca, icm_size);	if (err)		goto err_stop_fw;	err = mthca_INIT_HCA(mdev, &init_hca, &status);	if (err) {		mthca_err(mdev, "INIT_HCA command failed, aborting.\n");		goto err_free_icm;	}	if (status) {		mthca_err(mdev, "INIT_HCA returned status 0x%02x, "			  "aborting.\n", status);		err = -EINVAL;		goto err_free_icm;	}	return 0;err_free_icm:	mthca_free_icms(mdev);err_stop_fw:	mthca_UNMAP_FA(mdev, &status);	mthca_free_icm(mdev, mdev->fw.arbel.fw_icm);err_disable:	if (!(mdev->mthca_flags & MTHCA_FLAG_NO_LAM))		mthca_DISABLE_LAM(mdev, &status);	return err;}static void mthca_close_hca(struct mthca_dev *mdev){	u8 status;	mthca_CLOSE_HCA(mdev, 0, &status);	if (mthca_is_memfree(mdev)) {		mthca_free_icms(mdev);		mthca_UNMAP_FA(mdev, &status);		mthca_free_icm(mdev, mdev->fw.arbel.fw_icm);		if (!(mdev->mthca_flags & MTHCA_FLAG_NO_LAM))			mthca_DISABLE_LAM(mdev, &status);	} else		mthca_SYS_DIS(mdev, &status);}static int __devinit mthca_init_hca(struct mthca_dev *mdev){	u8 status;	int err;	struct mthca_adapter adapter;	if (mthca_is_memfree(mdev))		err = mthca_init_arbel(mdev);	else		err = mthca_init_tavor(mdev);	if (err)		return err;	err = mthca_QUERY_ADAPTER(mdev, &adapter, &status);	if (err) {		mthca_err(mdev, "QUERY_ADAPTER command failed, aborting.\n");		goto err_close;	}	if (status) {		mthca_err(mdev, "QUERY_ADAPTER returned status 0x%02x, "			  "aborting.\n", status);		err = -EINVAL;		goto err_close;	}	mdev->eq_table.inta_pin = adapter.inta_pin;	mdev->rev_id            = adapter.revision_id;	memcpy(mdev->board_id, adapter.board_id, sizeof mdev->board_id);	return 0;err_close:	mthca_close_hca(mdev);	return err;}static int __devinit mthca_setup_hca(struct mthca_dev *dev){	int err;	u8 status;	MTHCA_INIT_DOORBELL_LOCK(&dev->doorbell_lock);	err = mthca_init_uar_table(dev);	if (err) {		mthca_err(dev, "Failed to initialize "			  "user access region table, aborting.\n");		return err;	}	err = mthca_uar_alloc(dev, &dev->driver_uar);	if (err) {		mthca_err(dev, "Failed to allocate driver access region, "			  "aborting.\n");		goto err_uar_table_free;	}	dev->kar = ioremap(dev->driver_uar.pfn << PAGE_SHIFT, PAGE_SIZE);	if (!dev->kar) {		mthca_err(dev, "Couldn't map kernel access region, "			  "aborting.\n");		err = -ENOMEM;		goto err_uar_free;	}	err = mthca_init_pd_table(dev);	if (err) {		mthca_err(dev, "Failed to initialize "			  "protection domain table, aborting.\n");		goto err_kar_unmap;	}	err = mthca_init_mr_table(dev);	if (err) {		mthca_err(dev, "Failed to initialize "			  "memory region table, aborting.\n");		goto err_pd_table_free;	}	err = mthca_pd_alloc(dev, 1, &dev->driver_pd);	if (err) {		mthca_err(dev, "Failed to create driver PD, "			  "aborting.\n");		goto err_mr_table_free;	}	err = mthca_init_eq_table(dev);	if (err) {		mthca_err(dev, "Failed to initialize "			  "event queue table, aborting.\n");		goto err_pd_free;	}	err = mthca_cmd_use_events(dev);	if (err) {		mthca_err(dev, "Failed to switch to event-driven "			  "firmware commands, aborting.\n");		goto err_eq_table_free;	}	err = mthca_NOP(dev, &status);	if (err || status) {		mthca_err(dev, "NOP command failed to generate interrupt (IRQ %d), aborting.\n",			  dev->mthca_flags & MTHCA_FLAG_MSI_X ?			  dev->eq_table.eq[MTHCA_EQ_CMD].msi_x_vector :			  dev->pdev->irq);		if (dev->mthca_flags & (MTHCA_FLAG_MSI | MTHCA_FLAG_MSI_X))			mthca_err(dev, "Try again with MSI/MSI-X disabled.\n");		else			mthca_err(dev, "BIOS or ACPI interrupt routing problem?\n");		goto err_cmd_poll;	}	mthca_dbg(dev, "NOP command IRQ test passed\n");	err = mthca_init_cq_table(dev);	if (err) {		mthca_err(dev, "Failed to initialize "			  "completion queue table, aborting.\n");		goto err_cmd_poll;	}	err = mthca_init_srq_table(dev);	if (err) {		mthca_err(dev, "Failed to initialize "			  "shared receive queue table, aborting.\n");		goto err_cq_table_free;	}	err = mthca_init_qp_table(dev);	if (err) {		mthca_err(dev, "Failed to initialize "			  "queue pair table, aborting.\n");		goto err_srq_table_free;	}	err = mthca_init_av_table(dev);	if (err) {		mthca_err(dev, "Failed to initialize "			  "address vector table, aborting.\n");		goto err_qp_table_free;	}	err = mthca_init_mcg_table(dev);	if (err) {		mthca_err(dev, "Failed to initialize "			  "multicast group table, aborting.\n");		goto err_av_table_free;	}	return 0;err_av_table_free:	mthca_cleanup_av_table(dev);err_qp_table_free:	mthca_cleanup_qp_table(dev);err_srq_table_free:	mthca_cleanup_srq_table(dev);err_cq_table_free:	mthca_cleanup_cq_table(dev);err_cmd_poll:	mthca_cmd_use_polling(dev);err_eq_table_free:

⌨️ 快捷键说明

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