Discussion:
1394 Can't Read CSR From Attached Nodes
(too old to reply)
Freddie Witherden
2010-12-31 22:36:02 UTC
Permalink
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).
Cedric Schmeits
2011-01-09 12:13:42 UTC
Permalink
Post by Freddie Witherden
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).
You are trying to read the config rom which for most devices is
handled in link layer, the TI devices normaly only accept quadlet
reads and not block reads.
So try reading at one quadlet at a time might do the trick.

Loading...