summaryrefslogtreecommitdiffstats
path: root/sys/dev/xl
diff options
context:
space:
mode:
authoryongari <yongari@FreeBSD.org>2011-05-06 22:45:13 +0000
committeryongari <yongari@FreeBSD.org>2011-05-06 22:45:13 +0000
commit6356409dba298549e32431a1880412217b1987b3 (patch)
treed3cfedaafc3f9b881aea977500b6b332e78f15b1 /sys/dev/xl
parent40c60ef59e2a4337e6082e8c49afb410014aaebe (diff)
downloadFreeBSD-src-6356409dba298549e32431a1880412217b1987b3.zip
FreeBSD-src-6356409dba298549e32431a1880412217b1987b3.tar.gz
Updating status word should be the last operation of UPD structure
renewal. Disable instruction reordering by adding volatile to xl_list_onefrag structure.
Diffstat (limited to 'sys/dev/xl')
-rw-r--r--sys/dev/xl/if_xl.c2
-rw-r--r--sys/dev/xl/if_xlreg.h4
2 files changed, 3 insertions, 3 deletions
diff --git a/sys/dev/xl/if_xl.c b/sys/dev/xl/if_xl.c
index d3d522f..88a7ba8 100644
--- a/sys/dev/xl/if_xl.c
+++ b/sys/dev/xl/if_xl.c
@@ -1904,8 +1904,8 @@ xl_newbuf(struct xl_softc *sc, struct xl_chain_onefrag *c)
sc->xl_tmpmap = map;
c->xl_mbuf = m_new;
c->xl_ptr->xl_frag.xl_len = htole32(m_new->m_len | XL_LAST_FRAG);
- c->xl_ptr->xl_status = 0;
c->xl_ptr->xl_frag.xl_addr = htole32(segs->ds_addr);
+ c->xl_ptr->xl_status = 0;
bus_dmamap_sync(sc->xl_mtag, c->xl_map, BUS_DMASYNC_PREREAD);
return (0);
}
diff --git a/sys/dev/xl/if_xlreg.h b/sys/dev/xl/if_xlreg.h
index 2685c44..5c1c60c 100644
--- a/sys/dev/xl/if_xlreg.h
+++ b/sys/dev/xl/if_xlreg.h
@@ -468,8 +468,8 @@ struct xl_list {
struct xl_list_onefrag {
u_int32_t xl_next; /* final entry has 0 nextptr */
- u_int32_t xl_status;
- struct xl_frag xl_frag;
+ volatile u_int32_t xl_status;
+ volatile struct xl_frag xl_frag;
};
struct xl_list_data {
OpenPOWER on IntegriCloud