/*
 * 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;
}
Exemple #3
0
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);
}
Exemple #4
0
VOID
kmdf1394_BusResetRoutineWorkItem (
                                 IN WDFWORKITEM  WorkItem)
{
    WDFDEVICE Device= WdfWorkItemGetParentObject (WorkItem);

    kmdf1394_UpdateGenerationCount (Device);

    WdfObjectDelete (WorkItem);
}