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; }
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; }
/** * @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(¶m); vas->Mapped = do_vme_mapping(vas, ¶m); 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; }