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:
Hans Petter Selasky 2016-03-29 10:47:14 +00:00
parent 998e1ef11f
commit 288edd19d7
1 changed files with 16 additions and 11 deletions

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) {