static void sys_service_tick_handler() { unsigned char deviceId; unsigned long flags; vpapi_event *pEvent; #if !defined(ZARLINK_SLIC_VE792) bool eventStatus; #endif sigset_t mask; pthread_mutex_lock(&vp_lock); for(deviceId = 0; deviceId < MAX_DEVICES; deviceId++) { if(GET_DEV_STATUS(deviceId) == 0) continue; /* Check for free resources */ if(event_count >= MAX_EVENT_QUEUE_SIZE) goto timer_exit; #if !defined(ZARLINK_SLIC_VE792) if(VP_STATUS_SUCCESS == VpApiTick(&pDevCtx[deviceId], &eventStatus)) { if(eventStatus == TRUE) { #endif pEvent = &event_queue[next_event]; while(VpGetEvent(&pDevCtx[deviceId], &pEvent->vp_event) == TRUE) { if(pEvent->vp_event.status != VP_STATUS_SUCCESS) { printf("%s: bad status(%d)\n", __func__, pEvent->vp_event.status); break; } if(pEvent->vp_event.eventId == 0) { printf("%s: warning, empty event\n", __func__); break; } next_event++; if(next_event == MAX_EVENT_QUEUE_SIZE) { next_event = 0; } event_count++; if(pEvent->valid == 0) { pEvent->valid = 1; } else { printf("%s: error, event(%u) was overrided\n", __func__, next_event); break; } pEvent = &event_queue[next_event]; } #if !defined(ZARLINK_SLIC_VE792) } } #endif } pthread_mutex_unlock(&vp_lock); return; timer_exit: return; }
static void vpapi_tick_handler(unsigned long data) { u8 deviceId; unsigned long flags; vpapi_event *pEvent; #if !defined(CONFIG_ZARLINK_SLIC_VE792) bool eventStatus; #endif /* Check if events are already active and not processing IOCTL */ if((atomic_read(&vpapi_init) == 0) || (atomic_read(&vpapi_in_ioctl) == 1)) goto timer_exit; spin_lock_irqsave(&vpapi_lock, flags); for(deviceId = 0; deviceId < MAX_DEVICES; deviceId++) { if(GET_DEV_STATUS(deviceId) == 0) continue; /* Check for free resources */ if(atomic_read(&event_count) >= MAX_EVENT_QUEUE_SIZE) goto timer_exit; #if !defined(CONFIG_ZARLINK_SLIC_VE792) if(VP_STATUS_SUCCESS == VpApiTick(&pDevCtx[deviceId], &eventStatus)) { if(eventStatus == TRUE) { #endif pEvent = &event_queue[next_event]; while(VpGetEvent(&pDevCtx[deviceId], &pEvent->vp_event) == TRUE) { if(pEvent->vp_event.status != VP_STATUS_SUCCESS) { printk("%s: bad status(%d)\n", __func__, pEvent->vp_event.status); break; } if(pEvent->vp_event.eventId == 0) { printk("%s: warning, empty event\n", __func__); break; } next_event++; if(next_event == MAX_EVENT_QUEUE_SIZE) { next_event = 0; } atomic_inc(&event_count); if(pEvent->valid == 0) { pEvent->valid = 1; } else { printk("%s: error, event(%u) was overrided\n", __func__, next_event); break; } pEvent = &event_queue[next_event]; } #if !defined(CONFIG_ZARLINK_SLIC_VE792) } } #endif } spin_unlock_irqrestore(&vpapi_lock, flags); timer_exit: /* Checks if user application should be signaled */ if(atomic_read(&event_count) > 0) { wake_up_interruptible(&vpapi_wait); } /* Schedule next timer tick */ vpapi_timer.expires = jiffies + VPAPI_TICK_TIMER_PERIOD; add_timer(&vpapi_timer); }