[dpdk-dev] [PATCH] i40e: Fix the endian issue for the i40e read&write registers functions

Wu, Jingjing jingjing.wu at intel.com
Wed Jul 15 03:01:31 CEST 2015



> -----Original Message-----
> From: Tao, Zhe
> Sent: Tuesday, July 14, 2015 6:37 PM
> To: dev at dpdk.org
> Cc: Tao, Zhe; Wu, Jingjing
> Subject: [PATCH] i40e: Fix the endian issue for the i40e read&write registers
> functions
> 
> Linux kernel uses the writel and readl related functions to perform the PCI
> memory access via ioremap region, those functions will handle the big little
> endian properly by doing the conversion between little and big endian if
> necessary, so Add this conversion in the read&write registers functions for
> i40e.
> 
> Signed-off-by: Zhe Tao <zhe.tao at intel.com>
> ---
>  drivers/net/i40e/base/i40e_osdep.h | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/net/i40e/base/i40e_osdep.h
> b/drivers/net/i40e/base/i40e_osdep.h
> index 3ce8057..d35c494 100644
> --- a/drivers/net/i40e/base/i40e_osdep.h
> +++ b/drivers/net/i40e/base/i40e_osdep.h
> @@ -122,10 +122,10 @@ do {                                                            \
>  	((volatile uint32_t *)((char *)(a)->hw_addr + (reg)))  static inline
> uint32_t i40e_read_addr(volatile void *addr)  {
> -	return I40E_PCI_REG(addr);
> +	return rte_cpu_to_le_32(I40E_PCI_REG(addr));

I think we need use rte_le_to_cpu_32 but not rte_cpu_to_le_32 for reading.

>  }
>  #define I40E_PCI_REG_WRITE(reg, value) \
> -	do {I40E_PCI_REG((reg)) = (value);} while(0)
> +	do { I40E_PCI_REG((reg)) = rte_cpu_to_le_32(value); } while (0)
> 
>  #define I40E_WRITE_FLUSH(a) I40E_READ_REG(a, I40E_GLGEN_STAT)
> #define I40EVF_WRITE_FLUSH(a) I40E_READ_REG(a, I40E_VFGEN_RSTAT)
> --
> 1.9.3



More information about the dev mailing list