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; }
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); }
/** * @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; } }