Page MenuHomeFreeBSD

D32208.diff
No OneTemporary

D32208.diff

diff --git a/sys/dev/usb/usb_busdma.h b/sys/dev/usb/usb_busdma.h
--- a/sys/dev/usb/usb_busdma.h
+++ b/sys/dev/usb/usb_busdma.h
@@ -101,6 +101,7 @@
* from the memory. Else write. */
uint8_t ismultiseg:1; /* set if we can have multiple
* segments */
+ uint8_t isloaded:1; /* Set if map is currently loaded. */
#endif
};
diff --git a/sys/dev/usb/usb_busdma.c b/sys/dev/usb/usb_busdma.c
--- a/sys/dev/usb/usb_busdma.c
+++ b/sys/dev/usb/usb_busdma.c
@@ -600,6 +600,7 @@
bus_dmamem_free(utag->tag, ptr, map);
goto error;
}
+ pc->isloaded = 1;
memset(ptr, 0, size);
usb_pc_cpu_flush(pc);
@@ -612,6 +613,7 @@
pc->page_start = NULL;
pc->page_offset_buf = 0;
pc->page_offset_end = 0;
+ pc->isloaded = 0;
pc->map = NULL;
pc->tag = NULL;
return (1);
@@ -626,11 +628,13 @@
usb_pc_free_mem(struct usb_page_cache *pc)
{
if (pc && pc->buffer) {
- bus_dmamap_unload(pc->tag, pc->map);
+ if (pc->isloaded)
+ bus_dmamap_unload(pc->tag, pc->map);
bus_dmamem_free(pc->tag, pc->buffer, pc->map);
pc->buffer = NULL;
+ pc->isloaded = 0;
}
}
@@ -662,7 +666,8 @@
* We have to unload the previous loaded DMA
* pages before trying to load a new one!
*/
- bus_dmamap_unload(pc->tag, pc->map);
+ if (pc->isloaded)
+ bus_dmamap_unload(pc->tag, pc->map);
/*
* Try to load memory into DMA.
@@ -675,6 +680,7 @@
err = 0;
}
if (err || uptag->dma_error) {
+ pc->isloaded = 0;
return (1);
}
} else {
@@ -682,7 +688,8 @@
* We have to unload the previous loaded DMA
* pages before trying to load a new one!
*/
- bus_dmamap_unload(pc->tag, pc->map);
+ if (pc->isloaded)
+ bus_dmamap_unload(pc->tag, pc->map);
/*
* Try to load memory into DMA. The callback
@@ -693,6 +700,7 @@
&usb_pc_load_mem_cb, pc, BUS_DMA_WAITOK)) {
}
}
+ pc->isloaded = 1;
} else {
if (!sync) {
/*
@@ -785,6 +793,8 @@
usb_pc_dmamap_destroy(struct usb_page_cache *pc)
{
if (pc && pc->tag) {
+ if (pc->isloaded)
+ bus_dmamap_unload(pc->tag, pc->map);
bus_dmamap_destroy(pc->tag, pc->map);
pc->tag = NULL;
pc->map = NULL;

File Metadata

Mime Type
text/plain
Expires
Mon, Jan 27, 1:51 PM (4 h, 50 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
16198638
Default Alt Text
D32208.diff (2 KB)

Event Timeline