Freddie Witherden
2010-12-31 22:36:02 UTC
Hi all,
I am having problems with the REQUEST_ASYNC_READ function number in
the IEEE 1394 stack. My 1394 'virtual' device needs to read the
configuration ROMs of all attached nodes. Now, getting the list of
nodes is not difficult and the location of the ROM is easy to come by.
The problem is that reading the ROM just does not work. However,
weirdly, reading other (lower) addresses does. The return from
WdfIoTargetSendInternalIoctlSynchronously is status c000009c. This
error is: STATUS_DEVICE_DATA_ERROR.
ioAddress.IA_Destination_Offset.Off_High =
INITIAL_REGISTER_SPACE_HI;
ioAddress.IA_Destination_Offset.Off_Low = CONFIG_ROM_LOCATION;
The ->nLength field is 1024 (for a device with a known MAX_REC of 2048
bytes). ->nBlockSize does not seem to have an effect. If I set
Off_High to 0 and Off_Low to say, 5*1024*1024, the request succeeds
(so requests do work, it is just high ones).
Hence my questions are, firstly, why reading from the ROM register
space does not work? Every other (Mac OS X and Linux) stack treats it
no differently to any other async read. And, secondly, how can I go
about reading the CSR *of an arbitrary node number*. Clearly it must
be possible, as Windows seems to have no trouble reading the CSR of my
devices (as device manager shows).
I am having problems with the REQUEST_ASYNC_READ function number in
the IEEE 1394 stack. My 1394 'virtual' device needs to read the
configuration ROMs of all attached nodes. Now, getting the list of
nodes is not difficult and the location of the ROM is easy to come by.
The problem is that reading the ROM just does not work. However,
weirdly, reading other (lower) addresses does. The return from
WdfIoTargetSendInternalIoctlSynchronously is status c000009c. This
error is: STATUS_DEVICE_DATA_ERROR.
ioAddress.IA_Destination_Offset.Off_High =
INITIAL_REGISTER_SPACE_HI;
ioAddress.IA_Destination_Offset.Off_Low = CONFIG_ROM_LOCATION;
The ->nLength field is 1024 (for a device with a known MAX_REC of 2048
bytes). ->nBlockSize does not seem to have an effect. If I set
Off_High to 0 and Off_Low to say, 5*1024*1024, the request succeeds
(so requests do work, it is just high ones).
Hence my questions are, firstly, why reading from the ROM register
space does not work? Every other (Mac OS X and Linux) stack treats it
no differently to any other async read. And, secondly, how can I go
about reading the CSR *of an arbitrary node number*. Clearly it must
be possible, as Windows seems to have no trouble reading the CSR of my
devices (as device manager shows).