Exemplo n.º 1
0
/*----------------------------------------------------------------------------*/
NDIS_STATUS windowsFindAdapter(IN P_GLUE_INFO_T prGlueInfo, IN NDIS_HANDLE rWrapperConfigurationContext)
{
	NDIS_HANDLE rMiniportAdapterHandle;
	PDEVICE_EXTENSION prDevExt;
	NDIS_STATUS rStatus;
	INT i;
	UCHAR ucTmp;
	SDBUS_INTERFACE_PARAMETERS rInterfaceParameters = { 0 };

	DEBUGFUNC("windowsFindAdapter");
	DBGLOG1(INIT, TRACE, "\n");

	ASSERT(prGlueInfo);

	INITLOG(("windowsFindAdapter\n"));

	rMiniportAdapterHandle = prGlueInfo->rMiniportAdapterHandle;

	prDevExt = &prGlueInfo->rHifInfo.dx;

	NdisMGetDeviceProperty(rMiniportAdapterHandle,
			       &prDevExt->PhysicalDeviceObject,
			       &prDevExt->FunctionalDeviceObject, &prDevExt->NextLowerDriverObject, NULL, NULL);

	rStatus = SdBusOpenInterface(prDevExt->PhysicalDeviceObject,
				     &prDevExt->BusInterface,
				     sizeof(SDBUS_INTERFACE_STANDARD), SDBUS_INTERFACE_VERSION);

	INITLOG(("SdBusOpenInterface: (status=0x%x)\n", rStatus));
	INITLOG(("Size: (0x%x)\n", prDevExt->BusInterface.Size));
	INITLOG(("Version: (0x%x)\n", prDevExt->BusInterface.Version));
	INITLOG(("Context: (0x%x)\n", prDevExt->BusInterface.Context));
	INITLOG(("InterfaceReference: (0x%x)\n", prDevExt->BusInterface.InterfaceReference));
	INITLOG(("InterfaceDereference: (0x%x)\n", prDevExt->BusInterface.InterfaceDereference));
	INITLOG(("InitializeInterface: (0x%x)\n", prDevExt->BusInterface.InitializeInterface));
	INITLOG(("AcknowledgeInterrupt: (0x%x)\n", prDevExt->BusInterface.AcknowledgeInterrupt));

	if (NT_SUCCESS(rStatus)) {
		rInterfaceParameters.Size = sizeof(SDBUS_INTERFACE_PARAMETERS);
		rInterfaceParameters.TargetObject = prDevExt->NextLowerDriverObject;

		/* INTerrupt callback function */
		rInterfaceParameters.DeviceGeneratesInterrupts = TRUE;
		rInterfaceParameters.CallbackAtDpcLevel = FALSE;	/* passive level for synchronous I/O */
		rInterfaceParameters.CallbackRoutine = sdioINTerruptCallback;
		rInterfaceParameters.CallbackRoutineContext = prGlueInfo;
		rStatus = STATUS_UNSUCCESSFUL;

		if (prDevExt->BusInterface.InitializeInterface) {
			INITLOG(("pDevExt->BusINTerface.InitializeINTerface exists\n"));
			rStatus = (prDevExt->BusInterface.InitializeInterface)
			    (prDevExt->BusInterface.Context, &rInterfaceParameters);
		}
		/* dump sdbus parameter */

		/* dump sdbus INTerface standard after init */

		if (NT_SUCCESS(rStatus)) {
			INITLOG(("INTial SD-bus INTerface OK!!\n"));
			prDevExt->busInited = TRUE;
		} else {
			ERRORLOG(("INTial SD-bus INTerface fail,status:%x\n", rStatus));
			if (prDevExt->BusInterface.InterfaceDereference) {
				(prDevExt->BusInterface.InterfaceDereference) (prDevExt->BusInterface.Context);
				RtlZeroMemory(&prDevExt->BusInterface, sizeof(SDBUS_INTERFACE_STANDARD));
			}
			return rStatus;
		}

	} else {		/* open SD-bus INTerface fail */
		ERRORLOG(("open SD-bus INTerface fail, status:%x\n", rStatus));
		return rStatus;
	}

	rStatus = sdioSetupCardFeature(prGlueInfo, prDevExt);

	return rStatus;

}				/* end of windowsFindAdapter() */
Exemplo n.º 2
0
NTSTATUS
MarsEvtDeviceAdd(
                IN WDFDRIVER Driver,
                IN PWDFDEVICE_INIT DeviceInit
                )
/*++
Routine Description:

    EvtDeviceAdd is called by the framework in response to AddDevice
    call from the PnP manager.

Arguments:

    Driver - Handle to a framework driver object created in DriverEntry

    DeviceInit - Pointer to a framework-allocated WDFDEVICE_INIT structure.

Return Value:

    NTSTATUS

--*/
{
    NTSTATUS                status = STATUS_SUCCESS;
    PFDO_DATA                fdoData;
    WDF_IO_QUEUE_CONFIG        queueConfig;
    WDF_OBJECT_ATTRIBUTES    fdoAttributes;
    WDFDEVICE                device;
    WDF_PNPPOWER_EVENT_CALLBACKS          pnpPowerCallbacks;
    SDBUS_INTERFACE_PARAMETERS interfaceParameters = {0};

    UNREFERENCED_PARAMETER(Driver);

    PAGED_CODE();

    WdfDeviceInitSetPowerPageable(DeviceInit);

    WdfDeviceInitSetIoType(DeviceInit, WdfDeviceIoBuffered);

    WDF_PNPPOWER_EVENT_CALLBACKS_INIT(&pnpPowerCallbacks);

    //
    // Register PNP callbacks.
    //
    pnpPowerCallbacks.EvtDevicePrepareHardware = MarsEvtDevicePrepareHardware;
    pnpPowerCallbacks.EvtDeviceReleaseHardware = MarsEvtDeviceReleaseHardware;

    WdfDeviceInitSetPnpPowerEventCallbacks(DeviceInit, &pnpPowerCallbacks);

    WDF_OBJECT_ATTRIBUTES_INIT(&fdoAttributes);
    WDF_OBJECT_ATTRIBUTES_SET_CONTEXT_TYPE(&fdoAttributes, FDO_DATA);

    status = WdfDeviceCreate(&DeviceInit, &fdoAttributes, &device);
    if (!NT_SUCCESS(status)) {
        return status;
    }

    fdoData = MarsFdoGetData(device); //Gets device context

    //
    // Open an interface to the SD bus driver
    //
    status = SdBusOpenInterface(WdfDeviceWdmGetPhysicalDevice (device),
                                &fdoData->BusInterface,
                                sizeof(SDBUS_INTERFACE_STANDARD),
                                SDBUS_INTERFACE_VERSION);

    if (!NT_SUCCESS(status)) {
        return status;
    }

    interfaceParameters.Size                        = sizeof(SDBUS_INTERFACE_PARAMETERS);
    interfaceParameters.TargetObject                = WdfDeviceWdmGetAttachedDevice(device);
    interfaceParameters.DeviceGeneratesInterrupts   = TRUE;    //change to true eventually
    interfaceParameters.CallbackRoutine             = MarsEventCallback;
    interfaceParameters.CallbackRoutineContext      = fdoData;

    status = STATUS_UNSUCCESSFUL;
    if (fdoData->BusInterface.InitializeInterface) {
        status = (fdoData->BusInterface.InitializeInterface)(fdoData->BusInterface.Context,
                                                             &interfaceParameters);
    }

    if (!NT_SUCCESS(status)) {
        return status;
    }

    //
    //    Register New device
    //

    status = WdfDeviceCreateDeviceInterface(device,
                                            (LPGUID) &GUID_DEVINTERFACE_MARS,
                                            NULL
                                           );
    if (!NT_SUCCESS(status)) {
        return status;
    }

    fdoData->WdfDevice = device;

    WDF_IO_QUEUE_CONFIG_INIT_DEFAULT_QUEUE(&queueConfig,  WdfIoQueueDispatchSequential);

    queueConfig.EvtIoRead = MarsEvtIoRead;
    queueConfig.EvtIoWrite = MarsEvtIoWrite;
    queueConfig.EvtIoDeviceControl = MarsEvtIoDeviceControl;

    status = WdfIoQueueCreate(device,
                              &queueConfig,
                              WDF_NO_OBJECT_ATTRIBUTES,
                              &fdoData->IoctlQueue
                             );

    return status;
}