[dpdk-kmods v2] windows/netuio: fix BAR parsing
Pallavi Kadam
pallavi.kadam at intel.com
Fri Aug 12 00:17:23 CEST 2022
Current code was always checking the 'prev_bar & PCI_TYPE_64BIT'
though only the first BAR slot of a 64-bit BAR contains flags.
Also for certain PCIe devices, BAR values were not continuous.
This patch fixes this incorrectness and maps the BAR addresses
correctly.
Reported-by: Qiao Liu <qiao.liu at intel.com>
Suggested-by: Dmitry Kozlyuk <dmitry.kozliuk at gmail.com>
Signed-off-by: Dmitry Kozlyuk <dmitry.kozliuk at gmail.com>
Tested-by: Pallavi Kadam <pallavi.kadam at intel.com>
---
windows/netuio/netuio_dev.c | 13 ++++++++-----
1 file changed, 8 insertions(+), 5 deletions(-)
diff --git a/windows/netuio/netuio_dev.c b/windows/netuio/netuio_dev.c
index b2deb10..073fac8 100644
--- a/windows/netuio/netuio_dev.c
+++ b/windows/netuio/netuio_dev.c
@@ -170,8 +170,6 @@ netuio_map_hw_resources(WDFDEVICE Device, WDFCMRESLIST Resources, WDFCMRESLIST R
PCM_PARTIAL_RESOURCE_DESCRIPTOR descriptor;
ULONG next_descriptor = 0;
- ULONG curr_bar = 0;
- ULONG prev_bar = 0;
/*
* ResourcesTranslated report MMIO BARs in the correct order, but their
@@ -195,9 +193,9 @@ netuio_map_hw_resources(WDFDEVICE Device, WDFCMRESLIST Resources, WDFCMRESLIST R
* searching for the next MMIO resource each time.
*/
for (INT bar_index = 0; bar_index < PCI_MAX_BAR; bar_index++) {
- prev_bar = curr_bar;
- curr_bar = pci_config.u.type0.BaseAddresses[bar_index];
- if (curr_bar == 0 || (prev_bar & PCI_TYPE_64BIT)) {
+ ULONG bar_value = pci_config.u.type0.BaseAddresses[bar_index];
+
+ if (bar_value == 0) {
continue;
}
@@ -236,6 +234,11 @@ netuio_map_hw_resources(WDFDEVICE Device, WDFCMRESLIST Resources, WDFCMRESLIST R
}
ctx->dpdk_hw[bar_index].mem.size = ctx->bar[bar_index].size;
+
+ // Skip the next BAR slot used by the current 64-bit address.
+ if (bar_value & PCI_TYPE_64BIT) {
+ bar_index++;
+ }
} // for bar_index
status = STATUS_SUCCESS;
--
2.31.1.windows.1
More information about the dev
mailing list