diff options
-rw-r--r-- | drivers/net/wireless/iwlwifi/dvm/main.c | 4 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/dvm/tt.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-io.c | 28 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-test.c | 44 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-trans.h | 12 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/pcie/trans.c | 4 |
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 | ||
102 | u32 iwl_read_direct32(struct iwl_trans *trans, u32 reg) | 102 | u32 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) | |||
159 | u32 iwl_read_prph(struct iwl_trans *trans, u32 ofs) | 160 | u32 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 | ||
737 | static 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 | ||
743 | static inline void iwl_trans_release_nic_access(struct iwl_trans *trans) | 741 | static inline void __releases(nic_access) |
742 | iwl_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]); |