/* * Still use devCtx->MemStats cause it points to non-paged pool, * for virtio/host that access stats via physical memory. */ VOID StatWorkItemWorker( IN WDFWORKITEM WorkItem ) { WDFDEVICE Device = WdfWorkItemGetParentObject(WorkItem); PDEVICE_CONTEXT devCtx = GetDeviceContext(Device); NTSTATUS status = STATUS_SUCCESS; do { TraceEvents(TRACE_LEVEL_INFORMATION, DBG_HW_ACCESS, "StatWorkItemWorker Called! \n"); status = GatherKernelStats(devCtx->MemStats); if (NT_SUCCESS(status)) { #if 0 size_t i; for (i = 0; i < VIRTIO_BALLOON_S_NR; ++i) { TraceEvents(TRACE_LEVEL_INFORMATION, DBG_HW_ACCESS, "st=%x tag = %d, value = %08I64X \n\n", status, devCtx->MemStats[i].tag, devCtx->MemStats[i].val); } #endif } else { RtlFillMemory (devCtx->MemStats, sizeof (BALLOON_STAT) * VIRTIO_BALLOON_S_NR, -1); } BalloonMemStats(Device); } while(InterlockedDecrement(&devCtx->WorkCount)); return; }
VOID SimSensorTemperatureInterruptWorker ( _In_ WDFWORKITEM WorkItem ) /*++ Routine Description: This routine is invoked to call into the device to notify it of a temperature change. Arguments: WorkItem - Supplies a handle to this work item. Return Value: None. --*/ { PFDO_DATA DevExt; WDFDEVICE Device; Device = (WDFDEVICE)WdfWorkItemGetParentObject(WorkItem); DevExt = GetDeviceExtension(Device); WdfWaitLockAcquire(DevExt->QueueLock, NULL); SimSensorScanPendingQueue(Device); WdfWaitLockRelease(DevExt->QueueLock); return; }
VOID CyapaBootWorkItem( IN WDFWORKITEM WorkItem ) { WDFDEVICE Device = (WDFDEVICE)WdfWorkItemGetParentObject(WorkItem); PDEVICE_CONTEXT pDevice = GetDeviceContext(Device); cyapa_boot_regs boot; csgesture_softc *sc = &pDevice->sc; if (!sc->infoSetup) { struct cyapa_cap cap; SpbReadDataSynchronously(&pDevice->I2CContext, CMD_QUERY_CAPABILITIES, &cap, sizeof(cap)); if (strncmp((const char *)cap.prod_ida, "CYTRA", 5) != 0) { CyapaPrint(DEBUG_LEVEL_ERROR, DBG_PNP, "[cyapainit] Product ID \"%5.5s\" mismatch\n", cap.prod_ida); SpbReadDataSynchronously(&pDevice->I2CContext, CMD_QUERY_CAPABILITIES, &cap, sizeof(cap)); } sc->resx = ((cap.max_abs_xy_high << 4) & 0x0F00) | cap.max_abs_x_low; sc->resy = ((cap.max_abs_xy_high << 8) & 0x0F00) | cap.max_abs_y_low; sc->phyx = ((cap.phy_siz_xy_high << 4) & 0x0F00) | cap.phy_siz_x_low; sc->phyy = ((cap.phy_siz_xy_high << 8) & 0x0F00) | cap.phy_siz_y_low; CyapaPrint(DEBUG_LEVEL_INFO, DBG_PNP, "[cyapainit] %5.5s-%6.6s-%2.2s buttons=%c%c%c res=%dx%d\n", cap.prod_ida, cap.prod_idb, cap.prod_idc, ((cap.buttons & CYAPA_FNGR_LEFT) ? 'L' : '-'), ((cap.buttons & CYAPA_FNGR_MIDDLE) ? 'M' : '-'), ((cap.buttons & CYAPA_FNGR_RIGHT) ? 'R' : '-'), sc->resx, sc->resy); for (int i = 0; i < 5; i++) { sc->product_id[i] = cap.prod_ida[i]; } sc->product_id[5] = '-'; for (int i = 0; i < 6; i++) { sc->product_id[i + 6] = cap.prod_idb[i]; } sc->product_id[12] = '-'; for (int i = 0; i < 2; i++) { sc->product_id[i + 13] = cap.prod_idc[i]; } sc->product_id[15] = '\0'; sprintf(sc->firmware_version, "%d.%d", cap.fw_maj_ver, cap.fw_min_ver); sc->infoSetup = true; } cyapa_set_power_mode(pDevice, CMD_POWER_MODE_FULL); SpbReadDataSynchronously(&pDevice->I2CContext, CMD_BOOT_STATUS, &boot, sizeof(boot)); WdfObjectDelete(WorkItem); }
VOID kmdf1394_BusResetRoutineWorkItem ( IN WDFWORKITEM WorkItem) { WDFDEVICE Device= WdfWorkItemGetParentObject (WorkItem); kmdf1394_UpdateGenerationCount (Device); WdfObjectDelete (WorkItem); }