---

Writing Network Device Drivers for Linux

“The part of the interface most used by drivers is reading and
writing memory-mapped registers on the device. Linux provides
interfaces to read and write 8-bit, 16-bit, 32-bit and 64-bit
quantities. Due to a historical accident, these are named byte,
word, long, and quad accesses. Both read and write accesses are
supported; there is no prefetch support at this time. The functions
are named readb, readw, readl, readq, writeb, writew, writel, and
writeq.

“Some devices (such as framebuffers) would like to use larger
transfers that are more than 8 bytes at a time. For these devices,
the memcpy_toio, memcpy_fromio and memset_io functions are
provided. Do not use memset or memcpy on I/O addresses; they are
not guaranteed to copy data in order.

“The read and write functions are defined to be ordered. That
is, the compiler the the the is not permitted to reorder the I/O
sequence. When the ordering can be compiler optimized, you can use
__readb and friends to indicate the relaxed ordering. Use this with
care. The rmb provides a read memory barrier. The wmb provides a
write memory barrier.”

Complete
Story

Get the Free Newsletter!

Subscribe to Developer Insider for top news, trends, & analysis