aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/ed
diff options
context:
space:
mode:
authorPyun YongHyeon <yongari@FreeBSD.org>2011-12-05 18:10:43 +0000
committerPyun YongHyeon <yongari@FreeBSD.org>2011-12-05 18:10:43 +0000
commite9d7727e6b8bba6485fb9295ecef65541741615b (patch)
treebab26854516bf71590ccefd7d0bc5ca8cb44152c /sys/dev/ed
parent782ed6d3d76dbd15289f090068502fe201b2ba97 (diff)
Notes
Diffstat (limited to 'sys/dev/ed')
-rw-r--r--sys/dev/ed/if_ed.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/sys/dev/ed/if_ed.c b/sys/dev/ed/if_ed.c
index b0e1c0c0660a..80446a6fe120 100644
--- a/sys/dev/ed/if_ed.c
+++ b/sys/dev/ed/if_ed.c
@@ -1709,12 +1709,19 @@ ed_shmem_write_mbufs(struct ed_softc *sc, struct mbuf *m, bus_size_t dst)
break;
}
}
- for (len = 0; m != 0; m = m->m_next) {
- if (sc->isa16bit)
- bus_space_write_region_2(sc->mem_bst,
- sc->mem_bsh, dst,
- mtod(m, uint16_t *), (m->m_len + 1)/ 2);
- else
+ for (len = 0; m != NULL; m = m->m_next) {
+ if (m->m_len == 0)
+ continue;
+ if (sc->isa16bit) {
+ if (m->m_len > 1)
+ bus_space_write_region_2(sc->mem_bst,
+ sc->mem_bsh, dst,
+ mtod(m, uint16_t *), m->m_len / 2);
+ if ((m->m_len & 1) != 0)
+ bus_space_write_1(sc->mem_bst, sc->mem_bsh,
+ dst + m->m_len - 1,
+ *(mtod(m, uint8_t *) + m->m_len - 1));
+ } else
bus_space_write_region_1(sc->mem_bst,
sc->mem_bsh, dst,
mtod(m, uint8_t *), m->m_len);