Exemplo n.º 1
0
SkelUserReturn SkelUserModuleInit(SkelDrvrModuleContext *mcon)
{
	struct udata *udata;

	udata = (void *)sysbrk(sizeof(struct udata));
	if (udata == NULL) {
		report_module(mcon, SkelDrvrDebugFlagASSERTION,
			"Not enough memory for the module's data");
		pseterr(ENOMEM);
		return SkelUserReturnFAILED;
	}

	bzero((void *)udata, sizeof(struct udata));
	mcon->UserData = udata;

	/* initialise the iomap address */
	udata->iomap = get_vmemap_addr(mcon, 0x39, 32);
	if (!udata->iomap) {
		SK_WARN("Could not find VME address space (0x39, 32)");
		goto out_free;
	}

	/* initialise the jtag address */
	udata->jtag = get_vmemap_addr(mcon, 0x29, 16);
	if (!udata->jtag) {
		SK_WARN("Could not find VME address space (0x29, 16)");
		goto out_free;
	}

	/* initialise locking fields */
	cdcm_spin_lock_init(&udata->iolock);
	cdcm_mutex_init(&udata->lock);

	/* initialise the tasks */
	mtt_tasks_init(udata);

	/* module software reset */
	SkelUserHardwareReset(mcon);

	return SkelUserReturnOK;
out_free:
	sysfree((void*)udata, sizeof(struct udata));
	return SkelUserReturnFAILED;
}
Exemplo n.º 2
0
static void RemoveVmeModule(SkelDrvrModuleContext * mcon)
{
	InsLibIntrDesc *intrd = mcon->Modld->Isr;

	/* check for registered ISR */
	if (!(mcon->StandardStatus & SkelDrvrStandardStatusNO_ISR)) {
		int interr;

		interr = vme_intclr(intrd->Vector, NULL);
		if (interr)
			SK_WARN("VME intclr: returned %d", interr);
		else
			mcon->StandardStatus |=
			    SkelDrvrStandardStatusNO_ISR;
	}
	/* unmap VME mappings (if any) */
	unmap_vmeas(mcon, 1);
}
Exemplo n.º 3
0
/**
 * @brief clear mappings of a VME module
 *
 * @param mcon - module context
 * @param force - force the unmapping
 *
 * With force set to 0, only mappings with FreeModifierFlag set are cleared.
 * Otherwise, all the mappings which belong to the module are cleared.
 */
static void unmap_vmeas(SkelDrvrModuleContext * mcon, int force)
{
	InsLibVmeAddressSpace *vas;
	InsLibVmeModuleAddress *vma;

	vma = mcon->Modld->ModuleAddress;
	if (!vma)
		return;

	vas = vma->VmeAddressSpace;
	while (vas) {
		if (vas->Mapped && (force || vas->FreeModifierFlag)) {
			unsigned long laddr = (unsigned long) vas->Mapped;

			if (!return_controller(laddr, vas->WindowSize))
				vas->Mapped = NULL;
			else
				SK_WARN("return_controller failed.");
		}
		vas = vas->Next;
	}
}