Commit a8ec42c1 authored by Zhu, Yi's avatar Zhu, Yi Committed by John W. Linville

iwlwifi: use rmb/wmb to protect indirect mmio operation

This patch protects iwlwifi indirect mmio operations with rmb() and
wmb(). It makes sure CPU reordering won't affect our indirect mmio
access.
Signed-off-by: default avatarZhu Yi <yi.zhu@intel.com>
Signed-off-by: default avatarReinette Chatre <reinette.chatre@intel.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 73d7b5ac
...@@ -298,6 +298,7 @@ static inline int __iwl3945_poll_direct_bit(const char *f, u32 l, ...@@ -298,6 +298,7 @@ static inline int __iwl3945_poll_direct_bit(const char *f, u32 l,
static inline u32 _iwl3945_read_prph(struct iwl3945_priv *priv, u32 reg) static inline u32 _iwl3945_read_prph(struct iwl3945_priv *priv, u32 reg)
{ {
_iwl3945_write_direct32(priv, HBUS_TARG_PRPH_RADDR, reg | (3 << 24)); _iwl3945_write_direct32(priv, HBUS_TARG_PRPH_RADDR, reg | (3 << 24));
rmb();
return _iwl3945_read_direct32(priv, HBUS_TARG_PRPH_RDAT); return _iwl3945_read_direct32(priv, HBUS_TARG_PRPH_RDAT);
} }
#ifdef CONFIG_IWL3945_DEBUG #ifdef CONFIG_IWL3945_DEBUG
...@@ -319,6 +320,7 @@ static inline void _iwl3945_write_prph(struct iwl3945_priv *priv, ...@@ -319,6 +320,7 @@ static inline void _iwl3945_write_prph(struct iwl3945_priv *priv,
{ {
_iwl3945_write_direct32(priv, HBUS_TARG_PRPH_WADDR, _iwl3945_write_direct32(priv, HBUS_TARG_PRPH_WADDR,
((addr & 0x0000FFFF) | (3 << 24))); ((addr & 0x0000FFFF) | (3 << 24)));
wmb();
_iwl3945_write_direct32(priv, HBUS_TARG_PRPH_WDAT, val); _iwl3945_write_direct32(priv, HBUS_TARG_PRPH_WDAT, val);
} }
#ifdef CONFIG_IWL3945_DEBUG #ifdef CONFIG_IWL3945_DEBUG
...@@ -380,12 +382,14 @@ static inline void iwl3945_clear_bits_prph(struct iwl3945_priv ...@@ -380,12 +382,14 @@ static inline void iwl3945_clear_bits_prph(struct iwl3945_priv
static inline u32 iwl3945_read_targ_mem(struct iwl3945_priv *priv, u32 addr) static inline u32 iwl3945_read_targ_mem(struct iwl3945_priv *priv, u32 addr)
{ {
iwl3945_write_direct32(priv, HBUS_TARG_MEM_RADDR, addr); iwl3945_write_direct32(priv, HBUS_TARG_MEM_RADDR, addr);
rmb();
return iwl3945_read_direct32(priv, HBUS_TARG_MEM_RDAT); return iwl3945_read_direct32(priv, HBUS_TARG_MEM_RDAT);
} }
static inline void iwl3945_write_targ_mem(struct iwl3945_priv *priv, u32 addr, u32 val) static inline void iwl3945_write_targ_mem(struct iwl3945_priv *priv, u32 addr, u32 val)
{ {
iwl3945_write_direct32(priv, HBUS_TARG_MEM_WADDR, addr); iwl3945_write_direct32(priv, HBUS_TARG_MEM_WADDR, addr);
wmb();
iwl3945_write_direct32(priv, HBUS_TARG_MEM_WDAT, val); iwl3945_write_direct32(priv, HBUS_TARG_MEM_WDAT, val);
} }
...@@ -393,6 +397,7 @@ static inline void iwl3945_write_targ_mem_buf(struct iwl3945_priv *priv, u32 add ...@@ -393,6 +397,7 @@ static inline void iwl3945_write_targ_mem_buf(struct iwl3945_priv *priv, u32 add
u32 len, u32 *values) u32 len, u32 *values)
{ {
iwl3945_write_direct32(priv, HBUS_TARG_MEM_WADDR, addr); iwl3945_write_direct32(priv, HBUS_TARG_MEM_WADDR, addr);
wmb();
for (; 0 < len; len -= sizeof(u32), values++) for (; 0 < len; len -= sizeof(u32), values++)
iwl3945_write_direct32(priv, HBUS_TARG_MEM_WDAT, *values); iwl3945_write_direct32(priv, HBUS_TARG_MEM_WDAT, *values);
} }
......
...@@ -299,6 +299,7 @@ static inline int __iwl_poll_direct_bit(const char *f, u32 l, ...@@ -299,6 +299,7 @@ static inline int __iwl_poll_direct_bit(const char *f, u32 l,
static inline u32 _iwl_read_prph(struct iwl_priv *priv, u32 reg) static inline u32 _iwl_read_prph(struct iwl_priv *priv, u32 reg)
{ {
_iwl_write_direct32(priv, HBUS_TARG_PRPH_RADDR, reg | (3 << 24)); _iwl_write_direct32(priv, HBUS_TARG_PRPH_RADDR, reg | (3 << 24));
rmb();
return _iwl_read_direct32(priv, HBUS_TARG_PRPH_RDAT); return _iwl_read_direct32(priv, HBUS_TARG_PRPH_RDAT);
} }
#ifdef CONFIG_IWLWIFI_DEBUG #ifdef CONFIG_IWLWIFI_DEBUG
...@@ -321,6 +322,7 @@ static inline void _iwl_write_prph(struct iwl_priv *priv, ...@@ -321,6 +322,7 @@ static inline void _iwl_write_prph(struct iwl_priv *priv,
{ {
_iwl_write_direct32(priv, HBUS_TARG_PRPH_WADDR, _iwl_write_direct32(priv, HBUS_TARG_PRPH_WADDR,
((addr & 0x0000FFFF) | (3 << 24))); ((addr & 0x0000FFFF) | (3 << 24)));
wmb();
_iwl_write_direct32(priv, HBUS_TARG_PRPH_WDAT, val); _iwl_write_direct32(priv, HBUS_TARG_PRPH_WDAT, val);
} }
#ifdef CONFIG_IWLWIFI_DEBUG #ifdef CONFIG_IWLWIFI_DEBUG
...@@ -383,12 +385,14 @@ static inline void iwl_clear_bits_prph(struct iwl_priv ...@@ -383,12 +385,14 @@ static inline void iwl_clear_bits_prph(struct iwl_priv
static inline u32 iwl_read_targ_mem(struct iwl_priv *priv, u32 addr) static inline u32 iwl_read_targ_mem(struct iwl_priv *priv, u32 addr)
{ {
iwl_write_direct32(priv, HBUS_TARG_MEM_RADDR, addr); iwl_write_direct32(priv, HBUS_TARG_MEM_RADDR, addr);
rmb();
return iwl_read_direct32(priv, HBUS_TARG_MEM_RDAT); return iwl_read_direct32(priv, HBUS_TARG_MEM_RDAT);
} }
static inline void iwl_write_targ_mem(struct iwl_priv *priv, u32 addr, u32 val) static inline void iwl_write_targ_mem(struct iwl_priv *priv, u32 addr, u32 val)
{ {
iwl_write_direct32(priv, HBUS_TARG_MEM_WADDR, addr); iwl_write_direct32(priv, HBUS_TARG_MEM_WADDR, addr);
wmb();
iwl_write_direct32(priv, HBUS_TARG_MEM_WDAT, val); iwl_write_direct32(priv, HBUS_TARG_MEM_WDAT, val);
} }
...@@ -396,6 +400,7 @@ static inline void iwl_write_targ_mem_buf(struct iwl_priv *priv, u32 addr, ...@@ -396,6 +400,7 @@ static inline void iwl_write_targ_mem_buf(struct iwl_priv *priv, u32 addr,
u32 len, u32 *values) u32 len, u32 *values)
{ {
iwl_write_direct32(priv, HBUS_TARG_MEM_WADDR, addr); iwl_write_direct32(priv, HBUS_TARG_MEM_WADDR, addr);
wmb();
for (; 0 < len; len -= sizeof(u32), values++) for (; 0 < len; len -= sizeof(u32), values++)
iwl_write_direct32(priv, HBUS_TARG_MEM_WDAT, *values); iwl_write_direct32(priv, HBUS_TARG_MEM_WDAT, *values);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment