On 14 December 2016 at 09:55, Jerin Jacob <jerin.ja...@caviumnetworks.com> wrote: > From: Santosh Shukla <santosh.shu...@caviumnetworks.com> > > Replace the raw I/O device memory read/write access with eal > abstraction for I/O device memory read/write access to fix > portability issues across different architectures. > > Signed-off-by: Santosh Shukla <santosh.shu...@caviumnetworks.com> > Signed-off-by: Jerin Jacob <jerin.ja...@caviumnetworks.com> > CC: Helin Zhang <helin.zh...@intel.com> > CC: Konstantin Ananyev <konstantin.anan...@intel.com> > --- > drivers/net/ixgbe/base/ixgbe_osdep.h | 13 +++++++++---- > 1 file changed, 9 insertions(+), 4 deletions(-) > > diff --git a/drivers/net/ixgbe/base/ixgbe_osdep.h > b/drivers/net/ixgbe/base/ixgbe_osdep.h > index 77f0af5..9d16c21 100644 > --- a/drivers/net/ixgbe/base/ixgbe_osdep.h > +++ b/drivers/net/ixgbe/base/ixgbe_osdep.h > @@ -44,6 +44,7 @@ > #include <rte_cycles.h> > #include <rte_log.h> > #include <rte_byteorder.h> > +#include <rte_io.h> > > #include "../ixgbe_logs.h" > #include "../ixgbe_bypass_defines.h" > @@ -121,16 +122,20 @@ typedef int bool; > > #define prefetch(x) rte_prefetch0(x) > > -#define IXGBE_PCI_REG(reg) (*((volatile uint32_t *)(reg))) > +#define IXGBE_PCI_REG(reg) ({ \ > + uint32_t __val; \ > + __val = rte_readl(reg); \ > + __val; \ > +}) > > static inline uint32_t ixgbe_read_addr(volatile void* addr) > { > return rte_le_to_cpu_32(IXGBE_PCI_REG(addr)); > } > > -#define IXGBE_PCI_REG_WRITE(reg, value) do { \ > - IXGBE_PCI_REG((reg)) = (rte_cpu_to_le_32(value)); \ > -} while(0) > +#define IXGBE_PCI_REG_WRITE(reg, value) ({ \ > + rte_writel(rte_cpu_to_le_32(value), reg); \ > +}) >
memory barrier operation is put inside IXGBE_PCI_REG_READ/WRITE in your change, but I found rte_*mb is called before these macros in some places. Can you remove all these redundant calls? And please do the same checking for other drivers. > #define IXGBE_PCI_REG_ADDR(hw, reg) \ > ((volatile uint32_t *)((char *)(hw)->hw_addr + (reg))) > -- > 2.5.5 >