mirror of
https://github.com/reactos/reactos.git
synced 2024-09-15 15:19:37 +00:00
- Set the MAP_BASE_SW_SG flag for map registers in IoFreeMapRegisters.
- Fix address calculation in HalpCopyBufferMap. - Correctly set the map register counter in IoMapTransfer if dealing with MAP_BASE_SW_SG map registers. svn path=/trunk/; revision=17629
This commit is contained in:
parent
adb5d8466f
commit
3a10e56852
|
@ -1402,6 +1402,13 @@ IoFreeMapRegisters(
|
||||||
|
|
||||||
AdapterObject->MapRegisterBase =
|
AdapterObject->MapRegisterBase =
|
||||||
MasterAdapter->MapRegisterBase + Index;
|
MasterAdapter->MapRegisterBase + Index;
|
||||||
|
if (!AdapterObject->ScatterGather)
|
||||||
|
{
|
||||||
|
AdapterObject->MapRegisterBase =
|
||||||
|
(PMAP_REGISTER_ENTRY)(
|
||||||
|
(ULONG_PTR)AdapterObject->MapRegisterBase |
|
||||||
|
MAP_BASE_SW_SG);
|
||||||
|
}
|
||||||
|
|
||||||
Result = ((PDRIVER_CONTROL)AdapterObject->CurrentWcb->DeviceRoutine)(
|
Result = ((PDRIVER_CONTROL)AdapterObject->CurrentWcb->DeviceRoutine)(
|
||||||
AdapterObject->CurrentWcb->DeviceObject,
|
AdapterObject->CurrentWcb->DeviceObject,
|
||||||
|
@ -1471,7 +1478,8 @@ HalpCopyBufferMap(
|
||||||
KEBUGCHECK(0);
|
KEBUGCHECK(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
CurrentAddress = (ULONG_PTR)CurrentVa -
|
CurrentAddress = (ULONG_PTR)VirtualAddress +
|
||||||
|
(ULONG_PTR)CurrentVa -
|
||||||
(ULONG_PTR)MmGetMdlVirtualAddress(Mdl);
|
(ULONG_PTR)MmGetMdlVirtualAddress(Mdl);
|
||||||
|
|
||||||
while (Length > 0)
|
while (Length > 0)
|
||||||
|
@ -1583,7 +1591,7 @@ IoFlushAdapterBuffers(
|
||||||
Length -= HalReadDmaCounter(AdapterObject);
|
Length -= HalReadDmaCounter(AdapterObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
HalpCopyBufferMap(Mdl, RealMapRegisterBase, CurrentVa, Length, 0);
|
HalpCopyBufferMap(Mdl, RealMapRegisterBase, CurrentVa, Length, FALSE);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1763,7 +1771,7 @@ IoMapTransfer(
|
||||||
RealMapRegisterBase->Counter += BYTES_TO_PAGES(ByteOffset + TransferLength);
|
RealMapRegisterBase->Counter += BYTES_TO_PAGES(ByteOffset + TransferLength);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check if the buffer doesn't exceed the highest phisical address
|
* Check if the buffer doesn't exceed the highest physical address
|
||||||
* limit of the device. In that case we must use the map registers to
|
* limit of the device. In that case we must use the map registers to
|
||||||
* store the data.
|
* store the data.
|
||||||
*/
|
*/
|
||||||
|
@ -1775,6 +1783,10 @@ IoMapTransfer(
|
||||||
UseMapRegisters = TRUE;
|
UseMapRegisters = TRUE;
|
||||||
PhysicalAddress = RealMapRegisterBase->PhysicalAddress;
|
PhysicalAddress = RealMapRegisterBase->PhysicalAddress;
|
||||||
PhysicalAddress.QuadPart += ByteOffset;
|
PhysicalAddress.QuadPart += ByteOffset;
|
||||||
|
if ((ULONG_PTR)MapRegisterBase & MAP_BASE_SW_SG)
|
||||||
|
{
|
||||||
|
RealMapRegisterBase->Counter = ~0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue