aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/wireless/iwlwifi/dvm/main.c4
-rw-r--r--drivers/net/wireless/iwlwifi/dvm/tt.c2
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-io.c28
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-test.c44
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-trans.h12
-rw-r--r--drivers/net/wireless/iwlwifi/pcie/trans.c4
6 files changed, 51 insertions, 43 deletions
diff --git a/drivers/net/wireless/iwlwifi/dvm/main.c b/drivers/net/wireless/iwlwifi/dvm/main.c
index 517d7ae549d3..a64f361e341c 100644
--- a/drivers/net/wireless/iwlwifi/dvm/main.c
+++ b/drivers/net/wireless/iwlwifi/dvm/main.c
@@ -354,7 +354,7 @@ static void iwl_print_cont_event_trace(struct iwl_priv *priv, u32 base,
354 354
355 /* Make sure device is powered up for SRAM reads */ 355 /* Make sure device is powered up for SRAM reads */
356 spin_lock_irqsave(&priv->trans->reg_lock, reg_flags); 356 spin_lock_irqsave(&priv->trans->reg_lock, reg_flags);
357 if (unlikely(!iwl_trans_grab_nic_access(priv->trans, false))) { 357 if (!iwl_trans_grab_nic_access(priv->trans, false)) {
358 spin_unlock_irqrestore(&priv->trans->reg_lock, reg_flags); 358 spin_unlock_irqrestore(&priv->trans->reg_lock, reg_flags);
359 return; 359 return;
360 } 360 }
@@ -1718,7 +1718,7 @@ static int iwl_print_event_log(struct iwl_priv *priv, u32 start_idx,
1718 1718
1719 /* Make sure device is powered up for SRAM reads */ 1719 /* Make sure device is powered up for SRAM reads */
1720 spin_lock_irqsave(&trans->reg_lock, reg_flags); 1720 spin_lock_irqsave(&trans->reg_lock, reg_flags);
1721 if (unlikely(!iwl_trans_grab_nic_access(trans, false))) 1721 if (!iwl_trans_grab_nic_access(trans, false))
1722 goto out_unlock; 1722 goto out_unlock;
1723 1723
1724 /* Set starting address; reads will auto-increment */ 1724 /* Set starting address; reads will auto-increment */
diff --git a/drivers/net/wireless/iwlwifi/dvm/tt.c b/drivers/net/wireless/iwlwifi/dvm/tt.c
index a8ae51307db4..b28cfc8553d7 100644
--- a/drivers/net/wireless/iwlwifi/dvm/tt.c
+++ b/drivers/net/wireless/iwlwifi/dvm/tt.c
@@ -186,7 +186,7 @@ static void iwl_tt_check_exit_ct_kill(unsigned long data)
186 } 186 }
187 iwl_read32(priv->trans, CSR_UCODE_DRV_GP1); 187 iwl_read32(priv->trans, CSR_UCODE_DRV_GP1);
188 spin_lock_irqsave(&priv->trans->reg_lock, flags); 188 spin_lock_irqsave(&priv->trans->reg_lock, flags);
189 if (likely(iwl_trans_grab_nic_access(priv->trans, false))) 189 if (iwl_trans_grab_nic_access(priv->trans, false))
190 iwl_trans_release_nic_access(priv->trans); 190 iwl_trans_release_nic_access(priv->trans);
191 spin_unlock_irqrestore(&priv->trans->reg_lock, flags); 191 spin_unlock_irqrestore(&priv->trans->reg_lock, flags);
192 192
diff --git a/drivers/net/wireless/iwlwifi/iwl-io.c b/drivers/net/wireless/iwlwifi/iwl-io.c
index 2bd84adbb5ae..bff3ac96c00b 100644
--- a/drivers/net/wireless/iwlwifi/iwl-io.c
+++ b/drivers/net/wireless/iwlwifi/iwl-io.c
@@ -101,13 +101,14 @@ EXPORT_SYMBOL_GPL(iwl_poll_bit);
101 101
102u32 iwl_read_direct32(struct iwl_trans *trans, u32 reg) 102u32 iwl_read_direct32(struct iwl_trans *trans, u32 reg)
103{ 103{
104 u32 value; 104 u32 value = 0x5a5a5a5a;
105 unsigned long flags; 105 unsigned long flags;
106 106
107 spin_lock_irqsave(&trans->reg_lock, flags); 107 spin_lock_irqsave(&trans->reg_lock, flags);
108 iwl_trans_grab_nic_access(trans, false); 108 if (iwl_trans_grab_nic_access(trans, false)) {
109 value = iwl_read32(trans, reg); 109 value = iwl_read32(trans, reg);
110 iwl_trans_release_nic_access(trans); 110 iwl_trans_release_nic_access(trans);
111 }
111 spin_unlock_irqrestore(&trans->reg_lock, flags); 112 spin_unlock_irqrestore(&trans->reg_lock, flags);
112 113
113 return value; 114 return value;
@@ -119,7 +120,7 @@ void iwl_write_direct32(struct iwl_trans *trans, u32 reg, u32 value)
119 unsigned long flags; 120 unsigned long flags;
120 121
121 spin_lock_irqsave(&trans->reg_lock, flags); 122 spin_lock_irqsave(&trans->reg_lock, flags);
122 if (likely(iwl_trans_grab_nic_access(trans, false))) { 123 if (iwl_trans_grab_nic_access(trans, false)) {
123 iwl_write32(trans, reg, value); 124 iwl_write32(trans, reg, value);
124 iwl_trans_release_nic_access(trans); 125 iwl_trans_release_nic_access(trans);
125 } 126 }
@@ -159,12 +160,13 @@ static inline void __iwl_write_prph(struct iwl_trans *trans, u32 ofs, u32 val)
159u32 iwl_read_prph(struct iwl_trans *trans, u32 ofs) 160u32 iwl_read_prph(struct iwl_trans *trans, u32 ofs)
160{ 161{
161 unsigned long flags; 162 unsigned long flags;
162 u32 val; 163 u32 val = 0x5a5a5a5a;
163 164
164 spin_lock_irqsave(&trans->reg_lock, flags); 165 spin_lock_irqsave(&trans->reg_lock, flags);
165 iwl_trans_grab_nic_access(trans, false); 166 if (iwl_trans_grab_nic_access(trans, false)) {
166 val = __iwl_read_prph(trans, ofs); 167 val = __iwl_read_prph(trans, ofs);
167 iwl_trans_release_nic_access(trans); 168 iwl_trans_release_nic_access(trans);
169 }
168 spin_unlock_irqrestore(&trans->reg_lock, flags); 170 spin_unlock_irqrestore(&trans->reg_lock, flags);
169 return val; 171 return val;
170} 172}
@@ -175,7 +177,7 @@ void iwl_write_prph(struct iwl_trans *trans, u32 ofs, u32 val)
175 unsigned long flags; 177 unsigned long flags;
176 178
177 spin_lock_irqsave(&trans->reg_lock, flags); 179 spin_lock_irqsave(&trans->reg_lock, flags);
178 if (likely(iwl_trans_grab_nic_access(trans, false))) { 180 if (iwl_trans_grab_nic_access(trans, false)) {
179 __iwl_write_prph(trans, ofs, val); 181 __iwl_write_prph(trans, ofs, val);
180 iwl_trans_release_nic_access(trans); 182 iwl_trans_release_nic_access(trans);
181 } 183 }
@@ -188,7 +190,7 @@ void iwl_set_bits_prph(struct iwl_trans *trans, u32 ofs, u32 mask)
188 unsigned long flags; 190 unsigned long flags;
189 191
190 spin_lock_irqsave(&trans->reg_lock, flags); 192 spin_lock_irqsave(&trans->reg_lock, flags);
191 if (likely(iwl_trans_grab_nic_access(trans, false))) { 193 if (iwl_trans_grab_nic_access(trans, false)) {
192 __iwl_write_prph(trans, ofs, 194 __iwl_write_prph(trans, ofs,
193 __iwl_read_prph(trans, ofs) | mask); 195 __iwl_read_prph(trans, ofs) | mask);
194 iwl_trans_release_nic_access(trans); 196 iwl_trans_release_nic_access(trans);
@@ -203,7 +205,7 @@ void iwl_set_bits_mask_prph(struct iwl_trans *trans, u32 ofs,
203 unsigned long flags; 205 unsigned long flags;
204 206
205 spin_lock_irqsave(&trans->reg_lock, flags); 207 spin_lock_irqsave(&trans->reg_lock, flags);
206 if (likely(iwl_trans_grab_nic_access(trans, false))) { 208 if (iwl_trans_grab_nic_access(trans, false)) {
207 __iwl_write_prph(trans, ofs, 209 __iwl_write_prph(trans, ofs,
208 (__iwl_read_prph(trans, ofs) & mask) | bits); 210 (__iwl_read_prph(trans, ofs) & mask) | bits);
209 iwl_trans_release_nic_access(trans); 211 iwl_trans_release_nic_access(trans);
@@ -218,7 +220,7 @@ void iwl_clear_bits_prph(struct iwl_trans *trans, u32 ofs, u32 mask)
218 u32 val; 220 u32 val;
219 221
220 spin_lock_irqsave(&trans->reg_lock, flags); 222 spin_lock_irqsave(&trans->reg_lock, flags);
221 if (likely(iwl_trans_grab_nic_access(trans, false))) { 223 if (iwl_trans_grab_nic_access(trans, false)) {
222 val = __iwl_read_prph(trans, ofs); 224 val = __iwl_read_prph(trans, ofs);
223 __iwl_write_prph(trans, ofs, (val & ~mask)); 225 __iwl_write_prph(trans, ofs, (val & ~mask));
224 iwl_trans_release_nic_access(trans); 226 iwl_trans_release_nic_access(trans);
diff --git a/drivers/net/wireless/iwlwifi/iwl-test.c b/drivers/net/wireless/iwlwifi/iwl-test.c
index f8d8df8f96c3..1a226114fe73 100644
--- a/drivers/net/wireless/iwlwifi/iwl-test.c
+++ b/drivers/net/wireless/iwlwifi/iwl-test.c
@@ -467,7 +467,10 @@ static int iwl_test_indirect_read(struct iwl_test *tst, u32 addr, u32 size)
467 if (IWL_ABS_PRPH_START <= addr && 467 if (IWL_ABS_PRPH_START <= addr &&
468 addr < IWL_ABS_PRPH_START + PRPH_END) { 468 addr < IWL_ABS_PRPH_START + PRPH_END) {
469 spin_lock_irqsave(&trans->reg_lock, flags); 469 spin_lock_irqsave(&trans->reg_lock, flags);
470 iwl_trans_grab_nic_access(trans, false); 470 if (!iwl_trans_grab_nic_access(trans, false)) {
471 spin_unlock_irqrestore(&trans->reg_lock, flags);
472 return -EIO;
473 }
471 iwl_write32(trans, HBUS_TARG_PRPH_RADDR, 474 iwl_write32(trans, HBUS_TARG_PRPH_RADDR,
472 addr | (3 << 24)); 475 addr | (3 << 24));
473 for (i = 0; i < size; i += 4) 476 for (i = 0; i < size; i += 4)
@@ -500,26 +503,29 @@ static int iwl_test_indirect_write(struct iwl_test *tst, u32 addr,
500 503
501 if (IWL_ABS_PRPH_START <= addr && 504 if (IWL_ABS_PRPH_START <= addr &&
502 addr < IWL_ABS_PRPH_START + PRPH_END) { 505 addr < IWL_ABS_PRPH_START + PRPH_END) {
503 /* Periphery writes can be 1-3 bytes long, or DWORDs */ 506 /* Periphery writes can be 1-3 bytes long, or DWORDs */
504 if (size < 4) { 507 if (size < 4) {
505 memcpy(&val, buf, size); 508 memcpy(&val, buf, size);
506 spin_lock_irqsave(&trans->reg_lock, flags); 509 spin_lock_irqsave(&trans->reg_lock, flags);
507 iwl_trans_grab_nic_access(trans, false); 510 if (!iwl_trans_grab_nic_access(trans, false)) {
508 iwl_write32(trans, HBUS_TARG_PRPH_WADDR,
509 (addr & 0x0000FFFF) |
510 ((size - 1) << 24));
511 iwl_write32(trans, HBUS_TARG_PRPH_WDAT, val);
512 iwl_trans_release_nic_access(trans);
513 /* needed after consecutive writes w/o read */
514 mmiowb();
515 spin_unlock_irqrestore(&trans->reg_lock, flags); 511 spin_unlock_irqrestore(&trans->reg_lock, flags);
516 } else { 512 return -EIO;
517 if (size % 4)
518 return -EINVAL;
519 for (i = 0; i < size; i += 4)
520 iwl_write_prph(trans, addr+i,
521 *(u32 *)(buf+i));
522 } 513 }
514 iwl_write32(trans, HBUS_TARG_PRPH_WADDR,
515 (addr & 0x0000FFFF) |
516 ((size - 1) << 24));
517 iwl_write32(trans, HBUS_TARG_PRPH_WDAT, val);
518 iwl_trans_release_nic_access(trans);
519 /* needed after consecutive writes w/o read */
520 mmiowb();
521 spin_unlock_irqrestore(&trans->reg_lock, flags);
522 } else {
523 if (size % 4)
524 return -EINVAL;
525 for (i = 0; i < size; i += 4)
526 iwl_write_prph(trans, addr+i,
527 *(u32 *)(buf+i));
528 }
523 } else if (iwl_test_valid_hw_addr(tst, addr)) { 529 } else if (iwl_test_valid_hw_addr(tst, addr)) {
524 iwl_trans_write_mem(trans, addr, buf, size / 4); 530 iwl_trans_write_mem(trans, addr, buf, size / 4);
525 } else { 531 } else {
diff --git a/drivers/net/wireless/iwlwifi/iwl-trans.h b/drivers/net/wireless/iwlwifi/iwl-trans.h
index 7584d5522f15..b0d5c715ca1e 100644
--- a/drivers/net/wireless/iwlwifi/iwl-trans.h
+++ b/drivers/net/wireless/iwlwifi/iwl-trans.h
@@ -734,15 +734,15 @@ static inline void iwl_trans_set_pmi(struct iwl_trans *trans, bool state)
734 trans->ops->set_pmi(trans, state); 734 trans->ops->set_pmi(trans, state);
735} 735}
736 736
737static inline bool iwl_trans_grab_nic_access(struct iwl_trans *trans, 737#define iwl_trans_grab_nic_access(trans, silent) \
738 bool silent) 738 __cond_lock(nic_access, \
739{ 739 likely((trans)->ops->grab_nic_access(trans, silent)))
740 return trans->ops->grab_nic_access(trans, silent);
741}
742 740
743static inline void iwl_trans_release_nic_access(struct iwl_trans *trans) 741static inline void __releases(nic_access)
742iwl_trans_release_nic_access(struct iwl_trans *trans)
744{ 743{
745 trans->ops->release_nic_access(trans); 744 trans->ops->release_nic_access(trans);
745 __release(nic_access);
746} 746}
747 747
748/***************************************************** 748/*****************************************************
diff --git a/drivers/net/wireless/iwlwifi/pcie/trans.c b/drivers/net/wireless/iwlwifi/pcie/trans.c
index bca620363037..db3b0552b2eb 100644
--- a/drivers/net/wireless/iwlwifi/pcie/trans.c
+++ b/drivers/net/wireless/iwlwifi/pcie/trans.c
@@ -795,7 +795,7 @@ static int iwl_trans_pcie_read_mem(struct iwl_trans *trans, u32 addr,
795 u32 *vals = buf; 795 u32 *vals = buf;
796 796
797 spin_lock_irqsave(&trans->reg_lock, flags); 797 spin_lock_irqsave(&trans->reg_lock, flags);
798 if (likely(iwl_trans_grab_nic_access(trans, false))) { 798 if (iwl_trans_grab_nic_access(trans, false)) {
799 iwl_write32(trans, HBUS_TARG_MEM_RADDR, addr); 799 iwl_write32(trans, HBUS_TARG_MEM_RADDR, addr);
800 for (offs = 0; offs < dwords; offs++) 800 for (offs = 0; offs < dwords; offs++)
801 vals[offs] = iwl_read32(trans, HBUS_TARG_MEM_RDAT); 801 vals[offs] = iwl_read32(trans, HBUS_TARG_MEM_RDAT);
@@ -815,7 +815,7 @@ static int iwl_trans_pcie_write_mem(struct iwl_trans *trans, u32 addr,
815 u32 *vals = buf; 815 u32 *vals = buf;
816 816
817 spin_lock_irqsave(&trans->reg_lock, flags); 817 spin_lock_irqsave(&trans->reg_lock, flags);
818 if (likely(iwl_trans_grab_nic_access(trans, false))) { 818 if (iwl_trans_grab_nic_access(trans, false)) {
819 iwl_write32(trans, HBUS_TARG_MEM_WADDR, addr); 819 iwl_write32(trans, HBUS_TARG_MEM_WADDR, addr);
820 for (offs = 0; offs < dwords; offs++) 820 for (offs = 0; offs < dwords; offs++)
821 iwl_write32(trans, HBUS_TARG_MEM_WDAT, vals[offs]); 821 iwl_write32(trans, HBUS_TARG_MEM_WDAT, vals[offs]);