IoAllocateAdapterChannel() return STATUS_INSUFFICIENT_RESOURCES?

Hi,

I get a question when I am writing driver for a hypothetical DMA device.

the description of the device is:

DeviceDescription->Version = DEVICE_DESCRIPTION_VERSION;
DeviceDescription->Master = TRUE; // bus master.
DeviceDescription->ScatterGather = FALSE; // no scatter/gather for slave
DeviceDescription->Dma32BitAddresses = TRUE; // capable of decoding 32-bit DMA
DeviceDescription->BusNumber = 0;
DeviceDescription->InterfaceType = PCIBus;
DeviceDescription->MaximumLength = 102400;

I get the Adapter object using HalGetAdapter( ), and the NmberOfMaxRgister returns 8.

Later in the StartIo routine, I call IoAllocateAdapterChannel( ) with the NumberOfMapRegistersNeeded = 3. But IoAllocateAdapterChannel() return STATUS_INSUFFICIENT_RESOURCES. However, the Callback rouine, usually known Adapter control rouine, is called.
No any other rouine is calling IoAllocateAdapterChannel() at same time.

Quoted from DDK Document:
“IoAllocateAdapterChannel prepares the system for a DMA operation on behalf of the target device object. As soon as the appropriate DMA channel and/or any necessary map registers are available, IoAllocateAdapterChannel calls a driver-supplied routine to carry out an I/O operation through the system DMA controller or a busmaster adapter.”

Because the NumberOfMapRegistersNeeded is less than NmberOfMaxRgister renturned by HalGetAdapter(), the IoAllocateAdapterChannel() should not return STATUS_INSUFFICIENT_RESOURCES.

And, if the the IoAllocateAdapterChannel() fail, the Adapter control rouine should not be called. But in my case, it is called.

Could any one give me some hits what is happend inside when IoAllocateAdapterChannel() was called.

Thanks very much.

Jian


You are currently subscribed to ntdev as: $subst(‘Recip.EmailAddr’)
To unsubscribe send a blank email to leave-ntdev-$subst(‘Recip.MemberIDChar’)@lists.osr.com