Verify that all segments in the loaded segment list are back to back

with regard to the page offset, and not only the two first ones.
This commit is contained in:
hselasky 2016-03-29 10:47:14 +00:00
parent 5881096850
commit 4685650399

View File

@ -472,17 +472,22 @@ usb_pc_common_mem_cb(void *arg, bus_dma_segment_t *segs,
pc->page_offset_buf = rem;
pc->page_offset_end += rem;
#ifdef USB_DEBUG
if (nseg > 1 &&
((segs->ds_addr + segs->ds_len) & (USB_PAGE_SIZE - 1)) !=
((segs + 1)->ds_addr & (USB_PAGE_SIZE - 1))) {
/*
* This check verifies there is no page offset hole
* between the first and second segment. See the
* BUS_DMA_KEEP_PG_OFFSET flag.
*/
DPRINTFN(0, "Page offset was not preserved\n");
error = 1;
goto done;
if (nseg > 1) {
int x;
for (x = 0; x != nseg - 1; x++) {
if (((segs[x].ds_addr + segs[x].ds_len) & (USB_PAGE_SIZE - 1)) ==
((segs[x + 1].ds_addr & (USB_PAGE_SIZE - 1))))
continue;
/*
* This check verifies there is no page offset
* hole between any of the segments. See the
* BUS_DMA_KEEP_PG_OFFSET flag.
*/
DPRINTFN(0, "Page offset was not preserved\n");
error = 1;
goto done;
}
}
#endif
while (pc->ismultiseg) {