Replace two ioread32 with ioread64_lo_hi non_atomic
Hi, in this patch: [PATCH 4/5] staging: vt6655: Replace two VNSvInPortD with ioread64_lo_hi I tried to combine two reads in one. if (ww == W_MAX_TIMEOUT) return false; - VNSvInPortD(iobase + MAC_REG_TSFCNTR, (u32 *)pqwCurrTSF); - VNSvInPortD(iobase + MAC_REG_TSFCNTR + 4, (u32 *)pqwCurrTSF + 1); + *pqwCurrTSF = ioread64_lo_hi(iobase + MAC_REG_TSFCNTR); return true; } works fine on 64 bit machines but fails on 32 bit machines. Which of the following ways is the preferred one: Adding #include <linux/io-64-nonatomic-lo-hi.h> before #include "asm/io.h" But it seems that this has never been used in a driver before? Switch back to two reads with ioread32? Or another proposal? Thanks for your support. Bye Philipp
On Mon, Apr 25, 2022 at 1:32 PM Philipp Hortmann < philipp.g.hortmann@gmail.com> wrote:
Hi,
in this patch: [PATCH 4/5] staging: vt6655: Replace two VNSvInPortD with ioread64_lo_hi
I tried to combine two reads in one.
if (ww == W_MAX_TIMEOUT) return false; - VNSvInPortD(iobase + MAC_REG_TSFCNTR, (u32 *)pqwCurrTSF); - VNSvInPortD(iobase + MAC_REG_TSFCNTR + 4, (u32 *)pqwCurrTSF + 1); + *pqwCurrTSF = ioread64_lo_hi(iobase + MAC_REG_TSFCNTR);
return true; }
works fine on 64 bit machines but fails on 32 bit machines.
Which of the following ways is the preferred one:
How about #ifdef for 32/64 bit CPU.
Adding #include <linux/io-64-nonatomic-lo-hi.h> before #include "asm/io.h" But it seems that this has never been used in a driver before?
Switch back to two reads with ioread32?
Or another proposal?
Thanks for your support.
Bye Philipp
_______________________________________________ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org https://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
Hello, since you called ioread64_lo_hi, you may have a problem with 32-bit, but have you looked at 32-bit arch calls for ioread in the kernel? VNSvIPortD is macro right? On Tue, Apr 26, 2022 at 12:32 AM Philipp Hortmann < philipp.g.hortmann@gmail.com> wrote:
Hi,
in this patch: [PATCH 4/5] staging: vt6655: Replace two VNSvInPortD with ioread64_lo_hi
I tried to combine two reads in one.
if (ww == W_MAX_TIMEOUT) return false; - VNSvInPortD(iobase + MAC_REG_TSFCNTR, (u32 *)pqwCurrTSF); - VNSvInPortD(iobase + MAC_REG_TSFCNTR + 4, (u32 *)pqwCurrTSF + 1); + *pqwCurrTSF = ioread64_lo_hi(iobase + MAC_REG_TSFCNTR);
return true; }
works fine on 64 bit machines but fails on 32 bit machines.
Which of the following ways is the preferred one:
Adding #include <linux/io-64-nonatomic-lo-hi.h> before #include "asm/io.h" But it seems that this has never been used in a driver before?
Switch back to two reads with ioread32?
Or another proposal?
Thanks for your support.
Bye Philipp
_______________________________________________ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org https://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
-- Ozgur Kara Linux Kernel Developer ozgurk@ieee.org
participants (3)
-
Abu Rasheda -
Ozgur Karatas -
Philipp Hortmann