blob: 8cb924d1e264d90ce90d8bff6c81b29671863304 [file] [log] [blame]
Wey-Yi Guybe663ab2011-02-21 11:27:26 -08001/******************************************************************************
2 *
3 * Copyright(c) 2003 - 2011 Intel Corporation. All rights reserved.
4 *
5 * Portions of this file are derived from the ipw3945 project.
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of version 2 of the GNU General Public License as
9 * published by the Free Software Foundation.
10 *
11 * This program is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * more details.
15 *
16 * You should have received a copy of the GNU General Public License along with
17 * this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
19 *
20 * The full GNU General Public License is included in this distribution in the
21 * file called LICENSE.
22 *
23 * Contact Information:
24 * Intel Linux Wireless <ilw@linux.intel.com>
25 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
26 *
27 *****************************************************************************/
28
Stanislaw Gruszkae2ebc832011-10-24 15:41:30 +020029#ifndef __il_io_h__
30#define __il_io_h__
Wey-Yi Guybe663ab2011-02-21 11:27:26 -080031
32#include <linux/io.h>
33
34#include "iwl-dev.h"
35#include "iwl-debug.h"
Wey-Yi Guybe663ab2011-02-21 11:27:26 -080036
Stanislaw Gruszka46bc8d42011-10-24 16:49:25 +020037static inline void _il_write8(struct il_priv *il, u32 ofs, u8 val)
Wey-Yi Guybe663ab2011-02-21 11:27:26 -080038{
Stanislaw Gruszka46bc8d42011-10-24 16:49:25 +020039 iowrite8(val, il->hw_base + ofs);
Wey-Yi Guybe663ab2011-02-21 11:27:26 -080040}
Stanislaw Gruszka46bc8d42011-10-24 16:49:25 +020041#define il_write8(il, ofs, val) _il_write8(il, ofs, val)
Wey-Yi Guybe663ab2011-02-21 11:27:26 -080042
Stanislaw Gruszka841b2cc2011-08-24 15:14:03 +020043static inline void _il_wr(struct il_priv *il, u32 ofs, u32 val)
Wey-Yi Guybe663ab2011-02-21 11:27:26 -080044{
Stanislaw Gruszka46bc8d42011-10-24 16:49:25 +020045 iowrite32(val, il->hw_base + ofs);
Wey-Yi Guybe663ab2011-02-21 11:27:26 -080046}
Wey-Yi Guybe663ab2011-02-21 11:27:26 -080047
Stanislaw Gruszka841b2cc2011-08-24 15:14:03 +020048static inline u32 _il_rd(struct il_priv *il, u32 ofs)
Wey-Yi Guybe663ab2011-02-21 11:27:26 -080049{
Stanislaw Gruszka841b2cc2011-08-24 15:14:03 +020050 return ioread32(il->hw_base + ofs);
Wey-Yi Guybe663ab2011-02-21 11:27:26 -080051}
Wey-Yi Guybe663ab2011-02-21 11:27:26 -080052
Stanislaw Gruszkae2ebc832011-10-24 15:41:30 +020053#define IL_POLL_INTERVAL 10 /* microseconds */
Wey-Yi Guybe663ab2011-02-21 11:27:26 -080054static inline int
Stanislaw Gruszka46bc8d42011-10-24 16:49:25 +020055_il_poll_bit(struct il_priv *il, u32 addr,
Wey-Yi Guybe663ab2011-02-21 11:27:26 -080056 u32 bits, u32 mask, int timeout)
57{
58 int t = 0;
59
60 do {
Stanislaw Gruszka841b2cc2011-08-24 15:14:03 +020061 if ((_il_rd(il, addr) & mask) == (bits & mask))
Wey-Yi Guybe663ab2011-02-21 11:27:26 -080062 return t;
Stanislaw Gruszkae2ebc832011-10-24 15:41:30 +020063 udelay(IL_POLL_INTERVAL);
64 t += IL_POLL_INTERVAL;
Wey-Yi Guybe663ab2011-02-21 11:27:26 -080065 } while (t < timeout);
66
67 return -ETIMEDOUT;
68}
Wey-Yi Guybe663ab2011-02-21 11:27:26 -080069
Stanislaw Gruszka46bc8d42011-10-24 16:49:25 +020070static inline void _il_set_bit(struct il_priv *il, u32 reg, u32 mask)
Wey-Yi Guybe663ab2011-02-21 11:27:26 -080071{
Stanislaw Gruszka841b2cc2011-08-24 15:14:03 +020072 _il_wr(il, reg, _il_rd(il, reg) | mask);
Wey-Yi Guybe663ab2011-02-21 11:27:26 -080073}
Wey-Yi Guybe663ab2011-02-21 11:27:26 -080074
Stanislaw Gruszkae2ebc832011-10-24 15:41:30 +020075static inline void il_set_bit(struct il_priv *p, u32 r, u32 m)
Wey-Yi Guybe663ab2011-02-21 11:27:26 -080076{
77 unsigned long reg_flags;
78
79 spin_lock_irqsave(&p->reg_lock, reg_flags);
Stanislaw Gruszkae2ebc832011-10-24 15:41:30 +020080 _il_set_bit(p, r, m);
Wey-Yi Guybe663ab2011-02-21 11:27:26 -080081 spin_unlock_irqrestore(&p->reg_lock, reg_flags);
82}
Wey-Yi Guybe663ab2011-02-21 11:27:26 -080083
84static inline void
Stanislaw Gruszka46bc8d42011-10-24 16:49:25 +020085_il_clear_bit(struct il_priv *il, u32 reg, u32 mask)
Wey-Yi Guybe663ab2011-02-21 11:27:26 -080086{
Stanislaw Gruszka841b2cc2011-08-24 15:14:03 +020087 _il_wr(il, reg, _il_rd(il, reg) & ~mask);
Wey-Yi Guybe663ab2011-02-21 11:27:26 -080088}
Wey-Yi Guybe663ab2011-02-21 11:27:26 -080089
Stanislaw Gruszkae2ebc832011-10-24 15:41:30 +020090static inline void il_clear_bit(struct il_priv *p, u32 r, u32 m)
Wey-Yi Guybe663ab2011-02-21 11:27:26 -080091{
92 unsigned long reg_flags;
93
94 spin_lock_irqsave(&p->reg_lock, reg_flags);
Stanislaw Gruszkae2ebc832011-10-24 15:41:30 +020095 _il_clear_bit(p, r, m);
Wey-Yi Guybe663ab2011-02-21 11:27:26 -080096 spin_unlock_irqrestore(&p->reg_lock, reg_flags);
97}
Wey-Yi Guybe663ab2011-02-21 11:27:26 -080098
Stanislaw Gruszka46bc8d42011-10-24 16:49:25 +020099static inline int _il_grab_nic_access(struct il_priv *il)
Wey-Yi Guybe663ab2011-02-21 11:27:26 -0800100{
101 int ret;
102 u32 val;
103
104 /* this bit wakes up the NIC */
Stanislaw Gruszka46bc8d42011-10-24 16:49:25 +0200105 _il_set_bit(il, CSR_GP_CNTRL,
Wey-Yi Guybe663ab2011-02-21 11:27:26 -0800106 CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ);
107
108 /*
109 * These bits say the device is running, and should keep running for
110 * at least a short while (at least as long as MAC_ACCESS_REQ stays 1),
111 * but they do not indicate that embedded SRAM is restored yet;
112 * 3945 and 4965 have volatile SRAM, and must save/restore contents
113 * to/from host DRAM when sleeping/waking for power-saving.
114 * Each direction takes approximately 1/4 millisecond; with this
115 * overhead, it's a good idea to grab and hold MAC_ACCESS_REQUEST if a
116 * series of register accesses are expected (e.g. reading Event Log),
117 * to keep device from sleeping.
118 *
119 * CSR_UCODE_DRV_GP1 register bit MAC_SLEEP == 0 indicates that
120 * SRAM is okay/restored. We don't check that here because this call
121 * is just for hardware register access; but GP1 MAC_SLEEP check is a
122 * good idea before accessing 3945/4965 SRAM (e.g. reading Event Log).
123 *
124 */
Stanislaw Gruszka46bc8d42011-10-24 16:49:25 +0200125 ret = _il_poll_bit(il, CSR_GP_CNTRL,
Wey-Yi Guybe663ab2011-02-21 11:27:26 -0800126 CSR_GP_CNTRL_REG_VAL_MAC_ACCESS_EN,
127 (CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY |
128 CSR_GP_CNTRL_REG_FLAG_GOING_TO_SLEEP), 15000);
129 if (ret < 0) {
Stanislaw Gruszka841b2cc2011-08-24 15:14:03 +0200130 val = _il_rd(il, CSR_GP_CNTRL);
Stanislaw Gruszka9406f792011-08-18 22:07:57 +0200131 IL_ERR(
Wey-Yi Guybe663ab2011-02-21 11:27:26 -0800132 "MAC is in deep sleep!. CSR_GP_CNTRL = 0x%08X\n", val);
Stanislaw Gruszka841b2cc2011-08-24 15:14:03 +0200133 _il_wr(il, CSR_RESET,
Wey-Yi Guybe663ab2011-02-21 11:27:26 -0800134 CSR_RESET_REG_FLAG_FORCE_NMI);
135 return -EIO;
136 }
137
138 return 0;
139}
Wey-Yi Guybe663ab2011-02-21 11:27:26 -0800140
Stanislaw Gruszka46bc8d42011-10-24 16:49:25 +0200141static inline void _il_release_nic_access(struct il_priv *il)
Wey-Yi Guybe663ab2011-02-21 11:27:26 -0800142{
Stanislaw Gruszka46bc8d42011-10-24 16:49:25 +0200143 _il_clear_bit(il, CSR_GP_CNTRL,
Wey-Yi Guybe663ab2011-02-21 11:27:26 -0800144 CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ);
145}
Wey-Yi Guybe663ab2011-02-21 11:27:26 -0800146
Stanislaw Gruszka0c1a94e2011-08-24 17:37:16 +0200147static inline u32 il_rd(struct il_priv *il, u32 reg)
Wey-Yi Guybe663ab2011-02-21 11:27:26 -0800148{
149 u32 value;
150 unsigned long reg_flags;
151
Stanislaw Gruszka46bc8d42011-10-24 16:49:25 +0200152 spin_lock_irqsave(&il->reg_lock, reg_flags);
Stanislaw Gruszka13882262011-08-24 15:39:23 +0200153 _il_grab_nic_access(il);
Stanislaw Gruszka1c8cae52011-08-24 15:46:03 +0200154 value = _il_rd(il, reg);
Stanislaw Gruszka13882262011-08-24 15:39:23 +0200155 _il_release_nic_access(il);
Stanislaw Gruszka46bc8d42011-10-24 16:49:25 +0200156 spin_unlock_irqrestore(&il->reg_lock, reg_flags);
Wey-Yi Guybe663ab2011-02-21 11:27:26 -0800157 return value;
158
159}
Wey-Yi Guybe663ab2011-02-21 11:27:26 -0800160
Wey-Yi Guybe663ab2011-02-21 11:27:26 -0800161static inline void
Stanislaw Gruszka0c1a94e2011-08-24 17:37:16 +0200162il_wr(struct il_priv *il, u32 reg, u32 value)
Wey-Yi Guybe663ab2011-02-21 11:27:26 -0800163{
164 unsigned long reg_flags;
165
Stanislaw Gruszka46bc8d42011-10-24 16:49:25 +0200166 spin_lock_irqsave(&il->reg_lock, reg_flags);
Stanislaw Gruszka13882262011-08-24 15:39:23 +0200167 if (!_il_grab_nic_access(il)) {
Stanislaw Gruszka1c8cae52011-08-24 15:46:03 +0200168 _il_wr(il, reg, value);
Stanislaw Gruszka13882262011-08-24 15:39:23 +0200169 _il_release_nic_access(il);
Wey-Yi Guybe663ab2011-02-21 11:27:26 -0800170 }
Stanislaw Gruszka46bc8d42011-10-24 16:49:25 +0200171 spin_unlock_irqrestore(&il->reg_lock, reg_flags);
Wey-Yi Guybe663ab2011-02-21 11:27:26 -0800172}
173
Stanislaw Gruszka46bc8d42011-10-24 16:49:25 +0200174static inline void il_write_reg_buf(struct il_priv *il,
Wey-Yi Guybe663ab2011-02-21 11:27:26 -0800175 u32 reg, u32 len, u32 *values)
176{
177 u32 count = sizeof(u32);
178
Stanislaw Gruszka46bc8d42011-10-24 16:49:25 +0200179 if ((il != NULL) && (values != NULL)) {
Wey-Yi Guybe663ab2011-02-21 11:27:26 -0800180 for (; 0 < len; len -= count, reg += count, values++)
Stanislaw Gruszka0c1a94e2011-08-24 17:37:16 +0200181 il_wr(il, reg, *values);
Wey-Yi Guybe663ab2011-02-21 11:27:26 -0800182 }
183}
184
Stanislaw Gruszka0c1a94e2011-08-24 17:37:16 +0200185static inline int il_poll_bit(struct il_priv *il, u32 addr,
Wey-Yi Guybe663ab2011-02-21 11:27:26 -0800186 u32 mask, int timeout)
187{
188 int t = 0;
189
190 do {
Stanislaw Gruszka0c1a94e2011-08-24 17:37:16 +0200191 if ((il_rd(il, addr) & mask) == mask)
Wey-Yi Guybe663ab2011-02-21 11:27:26 -0800192 return t;
Stanislaw Gruszkae2ebc832011-10-24 15:41:30 +0200193 udelay(IL_POLL_INTERVAL);
194 t += IL_POLL_INTERVAL;
Wey-Yi Guybe663ab2011-02-21 11:27:26 -0800195 } while (t < timeout);
196
197 return -ETIMEDOUT;
198}
Wey-Yi Guybe663ab2011-02-21 11:27:26 -0800199
Stanislaw Gruszkadb54eb52011-08-24 21:06:33 +0200200static inline u32 _il_rd_prph(struct il_priv *il, u32 reg)
Wey-Yi Guybe663ab2011-02-21 11:27:26 -0800201{
Stanislaw Gruszka1c8cae52011-08-24 15:46:03 +0200202 _il_wr(il, HBUS_TARG_PRPH_RADDR, reg | (3 << 24));
Wey-Yi Guybe663ab2011-02-21 11:27:26 -0800203 rmb();
Stanislaw Gruszka1c8cae52011-08-24 15:46:03 +0200204 return _il_rd(il, HBUS_TARG_PRPH_RDAT);
Wey-Yi Guybe663ab2011-02-21 11:27:26 -0800205}
Stanislaw Gruszkadb54eb52011-08-24 21:06:33 +0200206
207static inline u32 il_rd_prph(struct il_priv *il, u32 reg)
Wey-Yi Guybe663ab2011-02-21 11:27:26 -0800208{
209 unsigned long reg_flags;
210 u32 val;
211
Stanislaw Gruszka46bc8d42011-10-24 16:49:25 +0200212 spin_lock_irqsave(&il->reg_lock, reg_flags);
Stanislaw Gruszka13882262011-08-24 15:39:23 +0200213 _il_grab_nic_access(il);
Stanislaw Gruszkadb54eb52011-08-24 21:06:33 +0200214 val = _il_rd_prph(il, reg);
Stanislaw Gruszka13882262011-08-24 15:39:23 +0200215 _il_release_nic_access(il);
Stanislaw Gruszka46bc8d42011-10-24 16:49:25 +0200216 spin_unlock_irqrestore(&il->reg_lock, reg_flags);
Wey-Yi Guybe663ab2011-02-21 11:27:26 -0800217 return val;
218}
219
Stanislaw Gruszkadb54eb52011-08-24 21:06:33 +0200220static inline void _il_wr_prph(struct il_priv *il,
Wey-Yi Guybe663ab2011-02-21 11:27:26 -0800221 u32 addr, u32 val)
222{
Stanislaw Gruszka1c8cae52011-08-24 15:46:03 +0200223 _il_wr(il, HBUS_TARG_PRPH_WADDR,
Wey-Yi Guybe663ab2011-02-21 11:27:26 -0800224 ((addr & 0x0000FFFF) | (3 << 24)));
225 wmb();
Stanislaw Gruszka1c8cae52011-08-24 15:46:03 +0200226 _il_wr(il, HBUS_TARG_PRPH_WDAT, val);
Wey-Yi Guybe663ab2011-02-21 11:27:26 -0800227}
228
229static inline void
Stanislaw Gruszkadb54eb52011-08-24 21:06:33 +0200230il_wr_prph(struct il_priv *il, u32 addr, u32 val)
Wey-Yi Guybe663ab2011-02-21 11:27:26 -0800231{
232 unsigned long reg_flags;
233
Stanislaw Gruszka46bc8d42011-10-24 16:49:25 +0200234 spin_lock_irqsave(&il->reg_lock, reg_flags);
Stanislaw Gruszka13882262011-08-24 15:39:23 +0200235 if (!_il_grab_nic_access(il)) {
Stanislaw Gruszkadb54eb52011-08-24 21:06:33 +0200236 _il_wr_prph(il, addr, val);
Stanislaw Gruszka13882262011-08-24 15:39:23 +0200237 _il_release_nic_access(il);
Wey-Yi Guybe663ab2011-02-21 11:27:26 -0800238 }
Stanislaw Gruszka46bc8d42011-10-24 16:49:25 +0200239 spin_unlock_irqrestore(&il->reg_lock, reg_flags);
Wey-Yi Guybe663ab2011-02-21 11:27:26 -0800240}
241
Stanislaw Gruszka46bc8d42011-10-24 16:49:25 +0200242#define _il_set_bits_prph(il, reg, mask) \
Stanislaw Gruszkadb54eb52011-08-24 21:06:33 +0200243_il_wr_prph(il, reg, (_il_rd_prph(il, reg) | mask))
Wey-Yi Guybe663ab2011-02-21 11:27:26 -0800244
245static inline void
Stanislaw Gruszka46bc8d42011-10-24 16:49:25 +0200246il_set_bits_prph(struct il_priv *il, u32 reg, u32 mask)
Wey-Yi Guybe663ab2011-02-21 11:27:26 -0800247{
248 unsigned long reg_flags;
249
Stanislaw Gruszka46bc8d42011-10-24 16:49:25 +0200250 spin_lock_irqsave(&il->reg_lock, reg_flags);
Stanislaw Gruszka13882262011-08-24 15:39:23 +0200251 _il_grab_nic_access(il);
Stanislaw Gruszka46bc8d42011-10-24 16:49:25 +0200252 _il_set_bits_prph(il, reg, mask);
Stanislaw Gruszka13882262011-08-24 15:39:23 +0200253 _il_release_nic_access(il);
Stanislaw Gruszka46bc8d42011-10-24 16:49:25 +0200254 spin_unlock_irqrestore(&il->reg_lock, reg_flags);
Wey-Yi Guybe663ab2011-02-21 11:27:26 -0800255}
256
Stanislaw Gruszka46bc8d42011-10-24 16:49:25 +0200257#define _il_set_bits_mask_prph(il, reg, bits, mask) \
Stanislaw Gruszkadb54eb52011-08-24 21:06:33 +0200258_il_wr_prph(il, reg, \
259 ((_il_rd_prph(il, reg) & mask) | bits))
Wey-Yi Guybe663ab2011-02-21 11:27:26 -0800260
Stanislaw Gruszka46bc8d42011-10-24 16:49:25 +0200261static inline void il_set_bits_mask_prph(struct il_priv *il, u32 reg,
Wey-Yi Guybe663ab2011-02-21 11:27:26 -0800262 u32 bits, u32 mask)
263{
264 unsigned long reg_flags;
265
Stanislaw Gruszka46bc8d42011-10-24 16:49:25 +0200266 spin_lock_irqsave(&il->reg_lock, reg_flags);
Stanislaw Gruszka13882262011-08-24 15:39:23 +0200267 _il_grab_nic_access(il);
Stanislaw Gruszka46bc8d42011-10-24 16:49:25 +0200268 _il_set_bits_mask_prph(il, reg, bits, mask);
Stanislaw Gruszka13882262011-08-24 15:39:23 +0200269 _il_release_nic_access(il);
Stanislaw Gruszka46bc8d42011-10-24 16:49:25 +0200270 spin_unlock_irqrestore(&il->reg_lock, reg_flags);
Wey-Yi Guybe663ab2011-02-21 11:27:26 -0800271}
272
Stanislaw Gruszkae2ebc832011-10-24 15:41:30 +0200273static inline void il_clear_bits_prph(struct il_priv
Stanislaw Gruszka46bc8d42011-10-24 16:49:25 +0200274 *il, u32 reg, u32 mask)
Wey-Yi Guybe663ab2011-02-21 11:27:26 -0800275{
276 unsigned long reg_flags;
277 u32 val;
278
Stanislaw Gruszka46bc8d42011-10-24 16:49:25 +0200279 spin_lock_irqsave(&il->reg_lock, reg_flags);
Stanislaw Gruszka13882262011-08-24 15:39:23 +0200280 _il_grab_nic_access(il);
Stanislaw Gruszkadb54eb52011-08-24 21:06:33 +0200281 val = _il_rd_prph(il, reg);
282 _il_wr_prph(il, reg, (val & ~mask));
Stanislaw Gruszka13882262011-08-24 15:39:23 +0200283 _il_release_nic_access(il);
Stanislaw Gruszka46bc8d42011-10-24 16:49:25 +0200284 spin_unlock_irqrestore(&il->reg_lock, reg_flags);
Wey-Yi Guybe663ab2011-02-21 11:27:26 -0800285}
286
Stanislaw Gruszka46bc8d42011-10-24 16:49:25 +0200287static inline u32 il_read_targ_mem(struct il_priv *il, u32 addr)
Wey-Yi Guybe663ab2011-02-21 11:27:26 -0800288{
289 unsigned long reg_flags;
290 u32 value;
291
Stanislaw Gruszka46bc8d42011-10-24 16:49:25 +0200292 spin_lock_irqsave(&il->reg_lock, reg_flags);
Stanislaw Gruszka13882262011-08-24 15:39:23 +0200293 _il_grab_nic_access(il);
Wey-Yi Guybe663ab2011-02-21 11:27:26 -0800294
Stanislaw Gruszka1c8cae52011-08-24 15:46:03 +0200295 _il_wr(il, HBUS_TARG_MEM_RADDR, addr);
Wey-Yi Guybe663ab2011-02-21 11:27:26 -0800296 rmb();
Stanislaw Gruszka1c8cae52011-08-24 15:46:03 +0200297 value = _il_rd(il, HBUS_TARG_MEM_RDAT);
Wey-Yi Guybe663ab2011-02-21 11:27:26 -0800298
Stanislaw Gruszka13882262011-08-24 15:39:23 +0200299 _il_release_nic_access(il);
Stanislaw Gruszka46bc8d42011-10-24 16:49:25 +0200300 spin_unlock_irqrestore(&il->reg_lock, reg_flags);
Wey-Yi Guybe663ab2011-02-21 11:27:26 -0800301 return value;
302}
303
304static inline void
Stanislaw Gruszka46bc8d42011-10-24 16:49:25 +0200305il_write_targ_mem(struct il_priv *il, u32 addr, u32 val)
Wey-Yi Guybe663ab2011-02-21 11:27:26 -0800306{
307 unsigned long reg_flags;
308
Stanislaw Gruszka46bc8d42011-10-24 16:49:25 +0200309 spin_lock_irqsave(&il->reg_lock, reg_flags);
Stanislaw Gruszka13882262011-08-24 15:39:23 +0200310 if (!_il_grab_nic_access(il)) {
Stanislaw Gruszka1c8cae52011-08-24 15:46:03 +0200311 _il_wr(il, HBUS_TARG_MEM_WADDR, addr);
Wey-Yi Guybe663ab2011-02-21 11:27:26 -0800312 wmb();
Stanislaw Gruszka1c8cae52011-08-24 15:46:03 +0200313 _il_wr(il, HBUS_TARG_MEM_WDAT, val);
Stanislaw Gruszka13882262011-08-24 15:39:23 +0200314 _il_release_nic_access(il);
Wey-Yi Guybe663ab2011-02-21 11:27:26 -0800315 }
Stanislaw Gruszka46bc8d42011-10-24 16:49:25 +0200316 spin_unlock_irqrestore(&il->reg_lock, reg_flags);
Wey-Yi Guybe663ab2011-02-21 11:27:26 -0800317}
318
319static inline void
Stanislaw Gruszka46bc8d42011-10-24 16:49:25 +0200320il_write_targ_mem_buf(struct il_priv *il, u32 addr,
Wey-Yi Guybe663ab2011-02-21 11:27:26 -0800321 u32 len, u32 *values)
322{
323 unsigned long reg_flags;
324
Stanislaw Gruszka46bc8d42011-10-24 16:49:25 +0200325 spin_lock_irqsave(&il->reg_lock, reg_flags);
Stanislaw Gruszka13882262011-08-24 15:39:23 +0200326 if (!_il_grab_nic_access(il)) {
Stanislaw Gruszka1c8cae52011-08-24 15:46:03 +0200327 _il_wr(il, HBUS_TARG_MEM_WADDR, addr);
Wey-Yi Guybe663ab2011-02-21 11:27:26 -0800328 wmb();
329 for (; 0 < len; len -= sizeof(u32), values++)
Stanislaw Gruszka1c8cae52011-08-24 15:46:03 +0200330 _il_wr(il,
Wey-Yi Guybe663ab2011-02-21 11:27:26 -0800331 HBUS_TARG_MEM_WDAT, *values);
332
Stanislaw Gruszka13882262011-08-24 15:39:23 +0200333 _il_release_nic_access(il);
Wey-Yi Guybe663ab2011-02-21 11:27:26 -0800334 }
Stanislaw Gruszka46bc8d42011-10-24 16:49:25 +0200335 spin_unlock_irqrestore(&il->reg_lock, reg_flags);
Wey-Yi Guybe663ab2011-02-21 11:27:26 -0800336}
337#endif