Index: bus_dma.c =================================================================== RCS file: /cvs/src/sys/arch/landisk/landisk/bus_dma.c,v retrieving revision 1.12 diff -u -p -r1.12 bus_dma.c --- bus_dma.c 16 Nov 2014 12:30:57 -0000 1.12 +++ bus_dma.c 22 Jan 2015 00:32:12 -0000 @@ -379,20 +379,42 @@ _bus_dmamap_load_mbuf(bus_dma_tag_t t, b continue; vaddr = (vaddr_t)(m->m_data); - paddr = (paddr_t)(SH3_P1SEG_TO_PHYS(vaddr)); - size = m->m_len; + if ((vaddr >= SH3_P1SEG_BASE) && + (vaddr + m->m_len <= SH3_P2SEG_END)) { + paddr = SH3_P1SEG_TO_PHYS(vaddr); + size = m->m_len; + } else { + vaddr_t next, end; + + end = vaddr + m->m_len; + for (next = (vaddr + PAGE_SIZE) & ~PAGE_MASK; + next < end; next += PAGE_SIZE) { + pmap_extract(pmap_kernel(), vaddr, &paddr); + error = _bus_dmamap_load_paddr(t, map, + paddr, vaddr, next - vaddr, + &seg, &lastaddr, first); + if (error != 0) + return (error); + + first = 0; + vaddr = next; + } + + pmap_extract(pmap_kernel(), vaddr, &paddr); + size = end - vaddr; + } + error = _bus_dmamap_load_paddr(t, map, paddr, vaddr, size, &seg, &lastaddr, first); - first = 0; - } + if (error != 0) + return (error); - if (error == 0) { - map->dm_nsegs = seg + 1; - map->dm_mapsize = m0->m_pkthdr.len; - return (0); + first = 0; } - return (error); + map->dm_nsegs = seg + 1; + map->dm_mapsize = m0->m_pkthdr.len; + return (0); } /*