Beispiel #1
0
static int AddVmeModule(SkelDrvrModuleContext * mcon)
{
	InsLibModlDesc *modld = mcon->Modld;
	InsLibVmeModuleAddress *vmema;
	InsLibVmeAddressSpace *vmeas;
	InsLibIntrDesc *intrd;
	int cc;

	/* set-up the mappings */
	vmema = modld->ModuleAddress;
	if (vmema) {
		vmeas = vmema->VmeAddressSpace;
		while (vmeas) {
			cc = map_vmeas(mcon, vmeas);
			if (!cc && !mcon->Modld->IgnoreErrors)
				goto out_err;
			vmeas = vmeas->Next;
		}
	}
	/* ISR, if any */
	intrd = modld->Isr;
	if (intrd && intrd->IsrFlag) {
		cc = vme_intset(intrd->Vector, skel_isr, (char *) mcon,
				NULL);
		if (cc < 0) {

			SK_ERROR
			    ("module#%d: ISR not installed. retval = %d",
			     mcon->ModuleNumber, cc);

			if (!mcon->Modld->IgnoreErrors)
				goto out_err;
			else
				goto out;
		}
		/* ISR installed successfully */
		mcon->StandardStatus &= ~SkelDrvrStandardStatusNO_ISR;

		SK_INFO("VME interrupt 0x%x for module#%d registered OK",
			intrd->Vector, mcon->ModuleNumber);
	}
      out:
	return 1;

      out_err:						   /* abort the installation of the module */
	RemoveVmeModule(mcon);
	return 0;
}
Beispiel #2
0
static SkelUserReturn
mtt_gs_program(struct udata *udata, MttDrvrInstruction *u_prog,
	MttDrvrInstruction *io_prog, unsigned int elems, int set)
{
	void *bounce;
	ssize_t size = elems * sizeof(MttDrvrInstruction);

	bounce = (void *)sysbrk(size);
	if (bounce == NULL) {
		SK_ERROR("%s: -ENOMEM", __FUNCTION__);
		pseterr(ENOMEM);
		goto out_err;
	}

	if (set) {
		if (cdcm_copy_from_user(bounce, u_prog, size)) {
			pseterr(EFAULT);
			goto out_err;
		}

		cdcm_mutex_lock(&udata->lock);
		__mtt_set_program(udata, io_prog, bounce, elems);
		cdcm_mutex_unlock(&udata->lock);

	} else {

		cdcm_mutex_lock(&udata->lock);
		__mtt_get_program(udata, bounce, io_prog, elems);
		cdcm_mutex_unlock(&udata->lock);

		if (cdcm_copy_to_user(u_prog, bounce, size)) {
			pseterr(EFAULT);
			goto out_err;
		}
	}
	sysfree(bounce, size);
	return SkelUserReturnOK;

 out_err:
	if (bounce)
		sysfree(bounce, size);
	return SkelUserReturnFAILED;
}
Beispiel #3
0
/**
 * @brief map a VME address space
 *
 * @param mcon - module context
 * @param vas - vme address space
 *
 * @return 0 - on failure
 * @return 1 - on success
 */
static int map_vmeas(SkelDrvrModuleContext * mcon,
		     InsLibVmeAddressSpace * vas)
{
	struct pdparam_master param;

	vas->Endian = InsLibEndianBIG;			   /* all vme modules are BE */

	/* emulation mode */
	if (mcon->StandardStatus & SkelDrvrStandardStatusEMULATION) {
		vas->Mapped = NULL;
		mcon->StandardStatus |= SkelDrvrStandardStatusNO_HARDWARE;

		SK_INFO("module #%d -- emulation ON", mcon->ModuleNumber);

		return 1;
	}

	/*
	 * For regions described as blocks, we don't need to map anything,
	 * since we can use DMA.
	 */
	if (region_is_a_block(vas))
		return 1;

	set_pdparam_defaults(&param);
	vas->Mapped = do_vme_mapping(vas, &param);

	if (vas->Mapped == (void *) (-1)) {
		vas->Mapped = NULL;
		SK_ERROR
		    ("VME mapping failed while mapping 0x%x for module#%d",
		     (unsigned int) vas->BaseAddress, mcon->ModuleNumber);
		return 0;
	}

	/* mapping successful */
	SK_INFO("VME mapping OK of 0x%x (-->virt %p) for module #%d",
		vas->BaseAddress, vas->Mapped, mcon->ModuleNumber);

	return 1;
}