aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorStanislaw Gruszka <sgruszka@redhat.com>2012-03-07 12:52:25 -0500
committerJohn W. Linville <linville@tuxdriver.com>2012-03-08 13:59:50 -0500
commit3a73a30049f20a0ff3ef1c5c10170a9c5539e042 (patch)
treeb14185ec9195512e1372d861f6b3382551ad6b7f /drivers
parentbfe4b80e9f7385f34986736cdc094be56782109a (diff)
iwlwifi: cleanup/fix memory barriers
wmb(), rmb() are not needed when writel(), readl() are used as accessors for MMIO. We use them indirectly via iowrite32(), ioread32(). What is needed mmiowb(), for synchronizing writes coming from different CPUs on PCIe bridge (see in patch comments). This fortunately is not needed on x86, where mmiowb() is just defined as compiler barrier. As iwlwifi devices are most likely not used on anything other than x86, this is not so important fix. Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-agn.c1
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-io.c12
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-trans-pcie-rx.c1
3 files changed, 7 insertions, 7 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c
index ce9ebeb89e4c..64bc2859dd1b 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn.c
@@ -334,7 +334,6 @@ static void iwl_print_cont_event_trace(struct iwl_priv *priv, u32 base,
334 334
335 /* Set starting address; reads will auto-increment */ 335 /* Set starting address; reads will auto-increment */
336 iwl_write32(trans(priv), HBUS_TARG_MEM_RADDR, ptr); 336 iwl_write32(trans(priv), HBUS_TARG_MEM_RADDR, ptr);
337 rmb();
338 337
339 /* 338 /*
340 * Refuse to read more than would have fit into the log from 339 * Refuse to read more than would have fit into the log from
diff --git a/drivers/net/wireless/iwlwifi/iwl-io.c b/drivers/net/wireless/iwlwifi/iwl-io.c
index fa69845954cf..081dd34d2387 100644
--- a/drivers/net/wireless/iwlwifi/iwl-io.c
+++ b/drivers/net/wireless/iwlwifi/iwl-io.c
@@ -136,6 +136,13 @@ void iwl_release_nic_access(struct iwl_trans *trans)
136 lockdep_assert_held(&trans->reg_lock); 136 lockdep_assert_held(&trans->reg_lock);
137 __iwl_clear_bit(trans, CSR_GP_CNTRL, 137 __iwl_clear_bit(trans, CSR_GP_CNTRL,
138 CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ); 138 CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ);
139 /*
140 * Above we read the CSR_GP_CNTRL register, which will flush
141 * any previous writes, but we need the write that clears the
142 * MAC_ACCESS_REQ bit to be performed before any other writes
143 * scheduled on different CPUs (after we drop reg_lock).
144 */
145 mmiowb();
139} 146}
140 147
141u32 iwl_read_direct32(struct iwl_trans *trans, u32 reg) 148u32 iwl_read_direct32(struct iwl_trans *trans, u32 reg)
@@ -182,7 +189,6 @@ int iwl_poll_direct_bit(struct iwl_trans *trans, u32 addr, u32 mask,
182static inline u32 __iwl_read_prph(struct iwl_trans *trans, u32 reg) 189static inline u32 __iwl_read_prph(struct iwl_trans *trans, u32 reg)
183{ 190{
184 iwl_write32(trans, HBUS_TARG_PRPH_RADDR, reg | (3 << 24)); 191 iwl_write32(trans, HBUS_TARG_PRPH_RADDR, reg | (3 << 24));
185 rmb();
186 return iwl_read32(trans, HBUS_TARG_PRPH_RDAT); 192 return iwl_read32(trans, HBUS_TARG_PRPH_RDAT);
187} 193}
188 194
@@ -190,7 +196,6 @@ static inline void __iwl_write_prph(struct iwl_trans *trans, u32 addr, u32 val)
190{ 196{
191 iwl_write32(trans, HBUS_TARG_PRPH_WADDR, 197 iwl_write32(trans, HBUS_TARG_PRPH_WADDR,
192 ((addr & 0x0000FFFF) | (3 << 24))); 198 ((addr & 0x0000FFFF) | (3 << 24)));
193 wmb();
194 iwl_write32(trans, HBUS_TARG_PRPH_WDAT, val); 199 iwl_write32(trans, HBUS_TARG_PRPH_WDAT, val);
195} 200}
196 201
@@ -270,7 +275,6 @@ void _iwl_read_targ_mem_words(struct iwl_trans *trans, u32 addr,
270 spin_lock_irqsave(&trans->reg_lock, flags); 275 spin_lock_irqsave(&trans->reg_lock, flags);
271 if (likely(iwl_grab_nic_access(trans))) { 276 if (likely(iwl_grab_nic_access(trans))) {
272 iwl_write32(trans, HBUS_TARG_MEM_RADDR, addr); 277 iwl_write32(trans, HBUS_TARG_MEM_RADDR, addr);
273 rmb();
274 for (offs = 0; offs < words; offs++) 278 for (offs = 0; offs < words; offs++)
275 vals[offs] = iwl_read32(trans, HBUS_TARG_MEM_RDAT); 279 vals[offs] = iwl_read32(trans, HBUS_TARG_MEM_RDAT);
276 iwl_release_nic_access(trans); 280 iwl_release_nic_access(trans);
@@ -297,8 +301,6 @@ int _iwl_write_targ_mem_words(struct iwl_trans *trans, u32 addr,
297 spin_lock_irqsave(&trans->reg_lock, flags); 301 spin_lock_irqsave(&trans->reg_lock, flags);
298 if (likely(iwl_grab_nic_access(trans))) { 302 if (likely(iwl_grab_nic_access(trans))) {
299 iwl_write32(trans, HBUS_TARG_MEM_WADDR, addr); 303 iwl_write32(trans, HBUS_TARG_MEM_WADDR, addr);
300 wmb();
301
302 for (offs = 0; offs < words; offs++) 304 for (offs = 0; offs < words; offs++)
303 iwl_write32(trans, HBUS_TARG_MEM_WDAT, vals[offs]); 305 iwl_write32(trans, HBUS_TARG_MEM_WDAT, vals[offs]);
304 iwl_release_nic_access(trans); 306 iwl_release_nic_access(trans);
diff --git a/drivers/net/wireless/iwlwifi/iwl-trans-pcie-rx.c b/drivers/net/wireless/iwlwifi/iwl-trans-pcie-rx.c
index 5d1fc7b1b0a3..787229b352f6 100644
--- a/drivers/net/wireless/iwlwifi/iwl-trans-pcie-rx.c
+++ b/drivers/net/wireless/iwlwifi/iwl-trans-pcie-rx.c
@@ -750,7 +750,6 @@ static int iwl_print_event_log(struct iwl_trans *trans, u32 start_idx,
750 750
751 /* Set starting address; reads will auto-increment */ 751 /* Set starting address; reads will auto-increment */
752 iwl_write32(trans, HBUS_TARG_MEM_RADDR, ptr); 752 iwl_write32(trans, HBUS_TARG_MEM_RADDR, ptr);
753 rmb();
754 753
755 /* "time" is actually "data" for mode 0 (no timestamp). 754 /* "time" is actually "data" for mode 0 (no timestamp).
756 * place event id # at far right for easier visual parsing. */ 755 * place event id # at far right for easier visual parsing. */