If I understand you correctly, you are referring to the PHYSICAL_ADDRESS
field in the SCATTER_GATHER_ELEMENTs that constitute the SCATTER_GATHER_LIST
array. The assumption is NOT that you can pass the SCATTER_GATHER_LIST
unmodified to your hardware for processing, but that you take the contents
of the SCATTER_GATHER_LIST and use it to program, in a device dependant
manner, the DMA operation(s) of your device. So for example you might have
an array of shared memory on your device that is the device-dependent SGL,
which might be structured as an array of 32-bit-address,32-bit length
value-pairs. You program your device by copying each SCATTER_GATHER_ELEMENT
into your hardware shared memory array, translating 64-bit physical
addresses into 32-bit physical addresses (by lopping off the upper 32-bits.)
This is exactly what you have to do with MapTransfer, as MapTransfer also
returns PHYSICAL_ADDRESS values (64-bit) which have to be translated to
32-bit values for 32-bit hardware.
Note also that 64-bit PCI is a reality and DAC devices do exist, so 64-bit
operations are entirely possible on some platforms for some devices.
Mark Roddy
xxxxx@hollistech.com
www.hollistech.com
WindowsNT Windows 2000 Consulting Services
-----Original Message-----
From: Gary Little [mailto:xxxxx@Broadstor.com]
Sent: Monday, January 22, 2001 1:18 PM
To: NT Developers Interest List
Subject: [ntdev] RE: Problems with IoMapTransfer()
Mark,
Using GetScatterGatherList, however, generates a 64 bit
scatter/gather list.
If you have a device that expects a 32 bit scatter/gather
list, your only
option, that I am aware of, is to use IoMapTransfer.
Gary
-----Original Message-----
From: Roddy, Mark [mailto:xxxxx@stratus.com]
Sent: Monday, January 22, 2001 9:59 AM
To: NT Developers Interest List
Subject: [ntdev] RE: Problems with
IoMapTransfer()
-
The zero value for MapRegisterBase is normal
for 32-bit
busmaster
scatter/gather devices.
-
The return value of zero for length is unusual, but
perhaps you set this
value on the way in?
-
DmaWidth16Bits is I think WRONG for PCI
devices, but it
is probably
ignored for these devices as well.
-
For windows 2000 you should use the
GetScatterGatherList
interface
instead of the MapTransfer interface. Much
better interface
for a lot of
reasons, number one being that it hides all of
this internal
crapola that
MapTransfer exposes.
Mark Roddy
xxxxx@hollistech.com
www.hollistech.com
WindowsNT Windows 2000 Consulting Services
> -----Original Message-----
> From: xxxxx@cix.co.uk
[mailto:xxxxx@cix.co.uk]
> Sent: Monday, January 22, 2001 12:38 PM
> To: NT Developers Interest List
> Cc: xxxxx@cix.co.uk
> Subject: [ntdev] Problems with IoMapTransfer()
>
>
> I am building a driver to run on Win2000 that
communicates
with a
> BusMaster DMA device that has Scatter/Gather
capabilities.
>
> When I examine the value of map_registers_base that is
passed to the
> AdapterControl callback routine, I find that
it is set to
> 0x00000000. This
> appears to be an erroneous value. What could
be causing
this?
> If I change the value of the ScatterGather
field in the
> DeviceDescription,
> from TRUE to FALSE, the value of
map_registers_base passed
to the
> AdapterControl callback routine is then
0x85811BC9 (much
nicer).
> For both values of ScatterGather,
IoMapTransfer seems to
> return a sensible
> value for the physical address, but the value
of Length
gets
> set to 0,
> which is clearly wrong. What might cause this?
> I have made a call to MmGetMdlByteCount() to
verify that
the
> Mdl that I am
> passing is as expected and has the expected
length (1000
> bytes). I have
> verified that there should be map registers available
> (NumberOfMapRegisters = 33).
>
> It seems possible that the problem lies with
the values
that
> I am using to
> populate the DeviceDescription (even though I
pass NULL to
> IoMapTransfer
> as the value for AdapterObject). I have found
it hard to
find
> detailed
> descriptions of these fields. After a call to
RtlZeroMemory(), I’m
> currently making the following assignments.
> DeviceDescription.Version =
DEVICE_DESCRIPTION_VERSION;
> DeviceDescription.Master = TRUE;
> DeviceDescription.ScatterGather = TRUE;
*See
above*
> DeviceDescription.DemandMode = FALSE;
> DeviceDescription.AutoInitialize = FALSE;
> DeviceDescription.Dma32BitAddresses = TRUE;
> DeviceDescription.IgnoreCount = FALSE;
> DeviceDescription.Reserved1 = FALSE;
> DeviceDescription.Reserved2 = FALSE;
> DeviceDescription.BusNumber =
pUnit->BusNumber;
> DeviceDescription.InterfaceType
= PCIBus;
> DeviceDescription.DmaWidth = Width16Bits;
> DeviceDescription.MaximumLength = 128 *
1024;
>
> Are any of these incorrect or are there any
significant
> fields missing?
> Where should I look for detailed documentation on the
fields of the
> DEVICE_DESCRIPTION structure (the NT DDK and
Viscarola/Mason
> text do not
> go into much detail)?
>
> I have been able to perform transfers to and
from buffers
that were
> created using HalAllocateCommonBuffer() but
obviously that
does not
> require a Length variable to be set by
IoMapTransfer().
>
> Questions remain:
> 1. Why does setting
DeviceDescription.ScatterGather = TRUE
> cause a value
> for map_registers_base of 0x00000000 to be
passed to the
> AdapterControl
> callback routine?
> 2. Why does IoMapTransfer() set the Length
parameter to 0?
>
>
> Any help would be much appreciated,
> Richard
>
> —
> You are currently subscribed to ntdev as:
xxxxx@stratus.com
> To unsubscribe send a blank email to
leave-ntdev-$subst(‘Recip.MemberIDChar’)@lists.osr.com
>
You are currently subscribed to ntdev as:
xxxxx@delphieng.com
To unsubscribe send a blank email to
leave-ntdev-$subst(‘Recip.MemberIDChar’)@lists.osr.com
You are currently subscribed to ntdev as: xxxxx@stratus.com
To unsubscribe send a blank email to leave-ntdev-$subst(‘Recip.MemberIDChar’)@lists.osr.com
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