blob: 1daa3f05a7757f5e4e960f584d6dad28ca1e0200 [file] [log] [blame]
Zhu Yib481de92007-09-25 17:54:57 -07001/******************************************************************************
2 *
Reinette Chatreeb7ae892008-03-11 16:17:17 -07003 * Copyright(c) 2003 - 2008 Intel Corporation. All rights reserved.
Zhu Yib481de92007-09-25 17:54:57 -07004 *
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 * James P. Ketrenos <ipw2100-admin@linux.intel.com>
25 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
26 *
27 *****************************************************************************/
28
Christoph Hellwigbb8c0932008-01-27 16:41:47 -080029#ifndef __iwl3945_io_h__
30#define __iwl3945_io_h__
Zhu Yib481de92007-09-25 17:54:57 -070031
32#include <linux/io.h>
33
Christoph Hellwig5d08cd12007-10-25 17:15:50 +080034#include "iwl-3945-debug.h"
Zhu Yib481de92007-09-25 17:54:57 -070035
36/*
37 * IO, register, and NIC memory access functions
38 *
39 * NOTE on naming convention and macro usage for these
40 *
41 * A single _ prefix before a an access function means that no state
42 * check or debug information is printed when that function is called.
43 *
44 * A double __ prefix before an access function means that state is checked
Tomas Winklerac17a942007-10-25 17:15:37 +080045 * and the current line number is printed in addition to any other debug output.
Zhu Yib481de92007-09-25 17:54:57 -070046 *
47 * The non-prefixed name is the #define that maps the caller into a
48 * #define that provides the caller's __LINE__ to the double prefix version.
49 *
50 * If you wish to call the function without any debug or state checking,
51 * you should use the single _ prefix version (as is used by dependent IO
Christoph Hellwigbb8c0932008-01-27 16:41:47 -080052 * routines, for example _iwl3945_read_direct32 calls the non-check version of
53 * _iwl3945_read32.)
Zhu Yib481de92007-09-25 17:54:57 -070054 *
55 * These declarations are *extremely* useful in quickly isolating code deltas
Tomas Winklera96a27f2008-10-23 23:48:56 -070056 * which result in misconfiguration of the hardware I/O. In combination with
Zhu Yib481de92007-09-25 17:54:57 -070057 * git-bisect and the IO debug level you can quickly determine the specific
58 * commit which breaks the IO sequence to the hardware.
59 *
60 */
61
Tomas Winklerf5efde32008-09-03 11:26:34 +080062#define _iwl3945_write32(priv, ofs, val) iowrite32((val), (priv)->hw_base + (ofs))
Christoph Hellwigc8b0e6e2007-10-25 17:15:51 +080063#ifdef CONFIG_IWL3945_DEBUG
Tomas Winkler5c1b0952008-02-13 11:32:30 -080064static inline void __iwl3945_write32(const char *f, u32 l, struct iwl3945_priv *priv,
Zhu Yib481de92007-09-25 17:54:57 -070065 u32 ofs, u32 val)
66{
Tomas Winklerac17a942007-10-25 17:15:37 +080067 IWL_DEBUG_IO("write32(0x%08X, 0x%08X) - %s %d\n", ofs, val, f, l);
Tomas Winkler5c1b0952008-02-13 11:32:30 -080068 _iwl3945_write32(priv, ofs, val);
Zhu Yib481de92007-09-25 17:54:57 -070069}
Tomas Winkler5c1b0952008-02-13 11:32:30 -080070#define iwl3945_write32(priv, ofs, val) \
71 __iwl3945_write32(__FILE__, __LINE__, priv, ofs, val)
Zhu Yib481de92007-09-25 17:54:57 -070072#else
Tomas Winkler5c1b0952008-02-13 11:32:30 -080073#define iwl3945_write32(priv, ofs, val) _iwl3945_write32(priv, ofs, val)
Zhu Yib481de92007-09-25 17:54:57 -070074#endif
75
Tomas Winklerf5efde32008-09-03 11:26:34 +080076#define _iwl3945_read32(priv, ofs) ioread32((priv)->hw_base + (ofs))
Christoph Hellwigc8b0e6e2007-10-25 17:15:51 +080077#ifdef CONFIG_IWL3945_DEBUG
Tomas Winkler5c1b0952008-02-13 11:32:30 -080078static inline u32 __iwl3945_read32(char *f, u32 l, struct iwl3945_priv *priv, u32 ofs)
Zhu Yib481de92007-09-25 17:54:57 -070079{
80 IWL_DEBUG_IO("read_direct32(0x%08X) - %s %d\n", ofs, f, l);
Tomas Winkler5c1b0952008-02-13 11:32:30 -080081 return _iwl3945_read32(priv, ofs);
Zhu Yib481de92007-09-25 17:54:57 -070082}
Tomas Winklerf5efde32008-09-03 11:26:34 +080083#define iwl3945_read32(priv, ofs)__iwl3945_read32(__FILE__, __LINE__, priv, ofs)
Zhu Yib481de92007-09-25 17:54:57 -070084#else
Christoph Hellwigbb8c0932008-01-27 16:41:47 -080085#define iwl3945_read32(p, o) _iwl3945_read32(p, o)
Zhu Yib481de92007-09-25 17:54:57 -070086#endif
87
Christoph Hellwigbb8c0932008-01-27 16:41:47 -080088static inline int _iwl3945_poll_bit(struct iwl3945_priv *priv, u32 addr,
Zhu Yib481de92007-09-25 17:54:57 -070089 u32 bits, u32 mask, int timeout)
90{
91 int i = 0;
92
93 do {
Christoph Hellwigbb8c0932008-01-27 16:41:47 -080094 if ((_iwl3945_read32(priv, addr) & mask) == (bits & mask))
Zhu Yib481de92007-09-25 17:54:57 -070095 return i;
96 mdelay(10);
97 i += 10;
98 } while (i < timeout);
99
100 return -ETIMEDOUT;
101}
Christoph Hellwigc8b0e6e2007-10-25 17:15:51 +0800102#ifdef CONFIG_IWL3945_DEBUG
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800103static inline int __iwl3945_poll_bit(const char *f, u32 l,
104 struct iwl3945_priv *priv, u32 addr,
Zhu Yib481de92007-09-25 17:54:57 -0700105 u32 bits, u32 mask, int timeout)
106{
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800107 int ret = _iwl3945_poll_bit(priv, addr, bits, mask, timeout);
Tomas Winkler5c1b0952008-02-13 11:32:30 -0800108 IWL_DEBUG_IO("poll_bit(0x%08X, 0x%08X, 0x%08X) - %s- %s %d\n",
109 addr, bits, mask,
110 unlikely(ret == -ETIMEDOUT)?"timeout":"", f, l);
Tomas Winklerac17a942007-10-25 17:15:37 +0800111 return ret;
Zhu Yib481de92007-09-25 17:54:57 -0700112}
Tomas Winkler5c1b0952008-02-13 11:32:30 -0800113#define iwl3945_poll_bit(priv, addr, bits, mask, timeout) \
114 __iwl3945_poll_bit(__FILE__, __LINE__, priv, addr, bits, mask, timeout)
Zhu Yib481de92007-09-25 17:54:57 -0700115#else
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800116#define iwl3945_poll_bit(p, a, b, m, t) _iwl3945_poll_bit(p, a, b, m, t)
Zhu Yib481de92007-09-25 17:54:57 -0700117#endif
118
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800119static inline void _iwl3945_set_bit(struct iwl3945_priv *priv, u32 reg, u32 mask)
Zhu Yib481de92007-09-25 17:54:57 -0700120{
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800121 _iwl3945_write32(priv, reg, _iwl3945_read32(priv, reg) | mask);
Zhu Yib481de92007-09-25 17:54:57 -0700122}
Christoph Hellwigc8b0e6e2007-10-25 17:15:51 +0800123#ifdef CONFIG_IWL3945_DEBUG
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800124static inline void __iwl3945_set_bit(const char *f, u32 l,
125 struct iwl3945_priv *priv, u32 reg, u32 mask)
Zhu Yib481de92007-09-25 17:54:57 -0700126{
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800127 u32 val = _iwl3945_read32(priv, reg) | mask;
Zhu Yib481de92007-09-25 17:54:57 -0700128 IWL_DEBUG_IO("set_bit(0x%08X, 0x%08X) = 0x%08X\n", reg, mask, val);
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800129 _iwl3945_write32(priv, reg, val);
Zhu Yib481de92007-09-25 17:54:57 -0700130}
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800131#define iwl3945_set_bit(p, r, m) __iwl3945_set_bit(__FILE__, __LINE__, p, r, m)
Zhu Yib481de92007-09-25 17:54:57 -0700132#else
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800133#define iwl3945_set_bit(p, r, m) _iwl3945_set_bit(p, r, m)
Zhu Yib481de92007-09-25 17:54:57 -0700134#endif
135
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800136static inline void _iwl3945_clear_bit(struct iwl3945_priv *priv, u32 reg, u32 mask)
Zhu Yib481de92007-09-25 17:54:57 -0700137{
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800138 _iwl3945_write32(priv, reg, _iwl3945_read32(priv, reg) & ~mask);
Zhu Yib481de92007-09-25 17:54:57 -0700139}
Christoph Hellwigc8b0e6e2007-10-25 17:15:51 +0800140#ifdef CONFIG_IWL3945_DEBUG
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800141static inline void __iwl3945_clear_bit(const char *f, u32 l,
142 struct iwl3945_priv *priv, u32 reg, u32 mask)
Zhu Yib481de92007-09-25 17:54:57 -0700143{
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800144 u32 val = _iwl3945_read32(priv, reg) & ~mask;
Zhu Yib481de92007-09-25 17:54:57 -0700145 IWL_DEBUG_IO("clear_bit(0x%08X, 0x%08X) = 0x%08X\n", reg, mask, val);
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800146 _iwl3945_write32(priv, reg, val);
Zhu Yib481de92007-09-25 17:54:57 -0700147}
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800148#define iwl3945_clear_bit(p, r, m) __iwl3945_clear_bit(__FILE__, __LINE__, p, r, m)
Zhu Yib481de92007-09-25 17:54:57 -0700149#else
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800150#define iwl3945_clear_bit(p, r, m) _iwl3945_clear_bit(p, r, m)
Zhu Yib481de92007-09-25 17:54:57 -0700151#endif
152
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800153static inline int _iwl3945_grab_nic_access(struct iwl3945_priv *priv)
Zhu Yib481de92007-09-25 17:54:57 -0700154{
Tomas Winklerac17a942007-10-25 17:15:37 +0800155 int ret;
Christoph Hellwigc8b0e6e2007-10-25 17:15:51 +0800156#ifdef CONFIG_IWL3945_DEBUG
Zhu Yib481de92007-09-25 17:54:57 -0700157 if (atomic_read(&priv->restrict_refcnt))
158 return 0;
159#endif
Zhu Yib481de92007-09-25 17:54:57 -0700160 /* this bit wakes up the NIC */
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800161 _iwl3945_set_bit(priv, CSR_GP_CNTRL, CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ);
162 ret = _iwl3945_poll_bit(priv, CSR_GP_CNTRL,
Zhu Yib481de92007-09-25 17:54:57 -0700163 CSR_GP_CNTRL_REG_VAL_MAC_ACCESS_EN,
164 (CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY |
165 CSR_GP_CNTRL_REG_FLAG_GOING_TO_SLEEP), 50);
Tomas Winklerac17a942007-10-25 17:15:37 +0800166 if (ret < 0) {
Zhu Yib481de92007-09-25 17:54:57 -0700167 IWL_ERROR("MAC is in deep sleep!\n");
168 return -EIO;
169 }
170
Christoph Hellwigc8b0e6e2007-10-25 17:15:51 +0800171#ifdef CONFIG_IWL3945_DEBUG
Zhu Yib481de92007-09-25 17:54:57 -0700172 atomic_inc(&priv->restrict_refcnt);
173#endif
174 return 0;
175}
176
Christoph Hellwigc8b0e6e2007-10-25 17:15:51 +0800177#ifdef CONFIG_IWL3945_DEBUG
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800178static inline int __iwl3945_grab_nic_access(const char *f, u32 l,
179 struct iwl3945_priv *priv)
Zhu Yib481de92007-09-25 17:54:57 -0700180{
181 if (atomic_read(&priv->restrict_refcnt))
182 IWL_DEBUG_INFO("Grabbing access while already held at "
183 "line %d.\n", l);
184
Tomas Winklerac17a942007-10-25 17:15:37 +0800185 IWL_DEBUG_IO("grabbing nic access - %s %d\n", f, l);
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800186 return _iwl3945_grab_nic_access(priv);
Zhu Yib481de92007-09-25 17:54:57 -0700187}
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800188#define iwl3945_grab_nic_access(priv) \
189 __iwl3945_grab_nic_access(__FILE__, __LINE__, priv)
Zhu Yib481de92007-09-25 17:54:57 -0700190#else
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800191#define iwl3945_grab_nic_access(priv) \
192 _iwl3945_grab_nic_access(priv)
Zhu Yib481de92007-09-25 17:54:57 -0700193#endif
194
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800195static inline void _iwl3945_release_nic_access(struct iwl3945_priv *priv)
Zhu Yib481de92007-09-25 17:54:57 -0700196{
Christoph Hellwigc8b0e6e2007-10-25 17:15:51 +0800197#ifdef CONFIG_IWL3945_DEBUG
Zhu Yib481de92007-09-25 17:54:57 -0700198 if (atomic_dec_and_test(&priv->restrict_refcnt))
199#endif
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800200 _iwl3945_clear_bit(priv, CSR_GP_CNTRL,
Zhu Yib481de92007-09-25 17:54:57 -0700201 CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ);
202}
Christoph Hellwigc8b0e6e2007-10-25 17:15:51 +0800203#ifdef CONFIG_IWL3945_DEBUG
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800204static inline void __iwl3945_release_nic_access(const char *f, u32 l,
205 struct iwl3945_priv *priv)
Zhu Yib481de92007-09-25 17:54:57 -0700206{
207 if (atomic_read(&priv->restrict_refcnt) <= 0)
Tomas Winklerac17a942007-10-25 17:15:37 +0800208 IWL_ERROR("Release unheld nic access at line %d.\n", l);
Zhu Yib481de92007-09-25 17:54:57 -0700209
Tomas Winklerac17a942007-10-25 17:15:37 +0800210 IWL_DEBUG_IO("releasing nic access - %s %d\n", f, l);
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800211 _iwl3945_release_nic_access(priv);
Zhu Yib481de92007-09-25 17:54:57 -0700212}
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800213#define iwl3945_release_nic_access(priv) \
214 __iwl3945_release_nic_access(__FILE__, __LINE__, priv)
Zhu Yib481de92007-09-25 17:54:57 -0700215#else
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800216#define iwl3945_release_nic_access(priv) \
217 _iwl3945_release_nic_access(priv)
Zhu Yib481de92007-09-25 17:54:57 -0700218#endif
219
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800220static inline u32 _iwl3945_read_direct32(struct iwl3945_priv *priv, u32 reg)
Zhu Yib481de92007-09-25 17:54:57 -0700221{
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800222 return _iwl3945_read32(priv, reg);
Zhu Yib481de92007-09-25 17:54:57 -0700223}
Christoph Hellwigc8b0e6e2007-10-25 17:15:51 +0800224#ifdef CONFIG_IWL3945_DEBUG
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800225static inline u32 __iwl3945_read_direct32(const char *f, u32 l,
226 struct iwl3945_priv *priv, u32 reg)
Zhu Yib481de92007-09-25 17:54:57 -0700227{
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800228 u32 value = _iwl3945_read_direct32(priv, reg);
Zhu Yib481de92007-09-25 17:54:57 -0700229 if (!atomic_read(&priv->restrict_refcnt))
Tomas Winklerac17a942007-10-25 17:15:37 +0800230 IWL_ERROR("Nic access not held from %s %d\n", f, l);
231 IWL_DEBUG_IO("read_direct32(0x%4X) = 0x%08x - %s %d \n", reg, value,
Zhu Yib481de92007-09-25 17:54:57 -0700232 f, l);
233 return value;
234}
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800235#define iwl3945_read_direct32(priv, reg) \
236 __iwl3945_read_direct32(__FILE__, __LINE__, priv, reg)
Zhu Yib481de92007-09-25 17:54:57 -0700237#else
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800238#define iwl3945_read_direct32 _iwl3945_read_direct32
Zhu Yib481de92007-09-25 17:54:57 -0700239#endif
240
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800241static inline void _iwl3945_write_direct32(struct iwl3945_priv *priv,
Zhu Yib481de92007-09-25 17:54:57 -0700242 u32 reg, u32 value)
243{
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800244 _iwl3945_write32(priv, reg, value);
Zhu Yib481de92007-09-25 17:54:57 -0700245}
Christoph Hellwigc8b0e6e2007-10-25 17:15:51 +0800246#ifdef CONFIG_IWL3945_DEBUG
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800247static void __iwl3945_write_direct32(u32 line,
248 struct iwl3945_priv *priv, u32 reg, u32 value)
Zhu Yib481de92007-09-25 17:54:57 -0700249{
250 if (!atomic_read(&priv->restrict_refcnt))
Tomas Winklerac17a942007-10-25 17:15:37 +0800251 IWL_ERROR("Nic access not held from line %d\n", line);
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800252 _iwl3945_write_direct32(priv, reg, value);
Zhu Yib481de92007-09-25 17:54:57 -0700253}
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800254#define iwl3945_write_direct32(priv, reg, value) \
255 __iwl3945_write_direct32(__LINE__, priv, reg, value)
Zhu Yib481de92007-09-25 17:54:57 -0700256#else
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800257#define iwl3945_write_direct32 _iwl3945_write_direct32
Zhu Yib481de92007-09-25 17:54:57 -0700258#endif
259
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800260static inline void iwl3945_write_reg_buf(struct iwl3945_priv *priv,
Zhu Yib481de92007-09-25 17:54:57 -0700261 u32 reg, u32 len, u32 *values)
262{
263 u32 count = sizeof(u32);
264
265 if ((priv != NULL) && (values != NULL)) {
266 for (; 0 < len; len -= count, reg += count, values++)
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800267 _iwl3945_write_direct32(priv, reg, *values);
Zhu Yib481de92007-09-25 17:54:57 -0700268 }
269}
270
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800271static inline int _iwl3945_poll_direct_bit(struct iwl3945_priv *priv,
Zhu Yib481de92007-09-25 17:54:57 -0700272 u32 addr, u32 mask, int timeout)
273{
274 int i = 0;
275
276 do {
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800277 if ((_iwl3945_read_direct32(priv, addr) & mask) == mask)
Zhu Yib481de92007-09-25 17:54:57 -0700278 return i;
279 mdelay(10);
280 i += 10;
281 } while (i < timeout);
282
283 return -ETIMEDOUT;
284}
285
Christoph Hellwigc8b0e6e2007-10-25 17:15:51 +0800286#ifdef CONFIG_IWL3945_DEBUG
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800287static inline int __iwl3945_poll_direct_bit(const char *f, u32 l,
288 struct iwl3945_priv *priv,
Zhu Yib481de92007-09-25 17:54:57 -0700289 u32 addr, u32 mask, int timeout)
290{
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800291 int ret = _iwl3945_poll_direct_bit(priv, addr, mask, timeout);
Zhu Yib481de92007-09-25 17:54:57 -0700292
Tomas Winklerac17a942007-10-25 17:15:37 +0800293 if (unlikely(ret == -ETIMEDOUT))
294 IWL_DEBUG_IO("poll_direct_bit(0x%08X, 0x%08X) - "
Zhu Yib481de92007-09-25 17:54:57 -0700295 "timedout - %s %d\n", addr, mask, f, l);
296 else
Tomas Winklerac17a942007-10-25 17:15:37 +0800297 IWL_DEBUG_IO("poll_direct_bit(0x%08X, 0x%08X) = 0x%08X "
298 "- %s %d\n", addr, mask, ret, f, l);
299 return ret;
Zhu Yib481de92007-09-25 17:54:57 -0700300}
Tomas Winkler5c1b0952008-02-13 11:32:30 -0800301#define iwl3945_poll_direct_bit(priv, addr, mask, timeout) \
302 __iwl3945_poll_direct_bit(__FILE__, __LINE__, priv, addr, mask, timeout)
Zhu Yib481de92007-09-25 17:54:57 -0700303#else
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800304#define iwl3945_poll_direct_bit _iwl3945_poll_direct_bit
Zhu Yib481de92007-09-25 17:54:57 -0700305#endif
306
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800307static inline u32 _iwl3945_read_prph(struct iwl3945_priv *priv, u32 reg)
Zhu Yib481de92007-09-25 17:54:57 -0700308{
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800309 _iwl3945_write_direct32(priv, HBUS_TARG_PRPH_RADDR, reg | (3 << 24));
310 return _iwl3945_read_direct32(priv, HBUS_TARG_PRPH_RDAT);
Zhu Yib481de92007-09-25 17:54:57 -0700311}
Christoph Hellwigc8b0e6e2007-10-25 17:15:51 +0800312#ifdef CONFIG_IWL3945_DEBUG
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800313static inline u32 __iwl3945_read_prph(u32 line, struct iwl3945_priv *priv, u32 reg)
Zhu Yib481de92007-09-25 17:54:57 -0700314{
315 if (!atomic_read(&priv->restrict_refcnt))
Tomas Winklerac17a942007-10-25 17:15:37 +0800316 IWL_ERROR("Nic access not held from line %d\n", line);
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800317 return _iwl3945_read_prph(priv, reg);
Zhu Yib481de92007-09-25 17:54:57 -0700318}
319
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800320#define iwl3945_read_prph(priv, reg) \
321 __iwl3945_read_prph(__LINE__, priv, reg)
Zhu Yib481de92007-09-25 17:54:57 -0700322#else
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800323#define iwl3945_read_prph _iwl3945_read_prph
Zhu Yib481de92007-09-25 17:54:57 -0700324#endif
325
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800326static inline void _iwl3945_write_prph(struct iwl3945_priv *priv,
Zhu Yib481de92007-09-25 17:54:57 -0700327 u32 addr, u32 val)
328{
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800329 _iwl3945_write_direct32(priv, HBUS_TARG_PRPH_WADDR,
Zhu Yib481de92007-09-25 17:54:57 -0700330 ((addr & 0x0000FFFF) | (3 << 24)));
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800331 _iwl3945_write_direct32(priv, HBUS_TARG_PRPH_WDAT, val);
Zhu Yib481de92007-09-25 17:54:57 -0700332}
Christoph Hellwigc8b0e6e2007-10-25 17:15:51 +0800333#ifdef CONFIG_IWL3945_DEBUG
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800334static inline void __iwl3945_write_prph(u32 line, struct iwl3945_priv *priv,
Zhu Yib481de92007-09-25 17:54:57 -0700335 u32 addr, u32 val)
336{
337 if (!atomic_read(&priv->restrict_refcnt))
Tomas Winklerac17a942007-10-25 17:15:37 +0800338 IWL_ERROR("Nic access from line %d\n", line);
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800339 _iwl3945_write_prph(priv, addr, val);
Zhu Yib481de92007-09-25 17:54:57 -0700340}
341
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800342#define iwl3945_write_prph(priv, addr, val) \
343 __iwl3945_write_prph(__LINE__, priv, addr, val);
Zhu Yib481de92007-09-25 17:54:57 -0700344#else
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800345#define iwl3945_write_prph _iwl3945_write_prph
Zhu Yib481de92007-09-25 17:54:57 -0700346#endif
347
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800348#define _iwl3945_set_bits_prph(priv, reg, mask) \
349 _iwl3945_write_prph(priv, reg, (_iwl3945_read_prph(priv, reg) | mask))
Christoph Hellwigc8b0e6e2007-10-25 17:15:51 +0800350#ifdef CONFIG_IWL3945_DEBUG
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800351static inline void __iwl3945_set_bits_prph(u32 line, struct iwl3945_priv *priv,
Tomas Winklerd8609652007-10-25 17:15:35 +0800352 u32 reg, u32 mask)
Zhu Yib481de92007-09-25 17:54:57 -0700353{
354 if (!atomic_read(&priv->restrict_refcnt))
Tomas Winklerac17a942007-10-25 17:15:37 +0800355 IWL_ERROR("Nic access not held from line %d\n", line);
356
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800357 _iwl3945_set_bits_prph(priv, reg, mask);
Zhu Yib481de92007-09-25 17:54:57 -0700358}
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800359#define iwl3945_set_bits_prph(priv, reg, mask) \
360 __iwl3945_set_bits_prph(__LINE__, priv, reg, mask)
Zhu Yib481de92007-09-25 17:54:57 -0700361#else
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800362#define iwl3945_set_bits_prph _iwl3945_set_bits_prph
Zhu Yib481de92007-09-25 17:54:57 -0700363#endif
364
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800365#define _iwl3945_set_bits_mask_prph(priv, reg, bits, mask) \
366 _iwl3945_write_prph(priv, reg, ((_iwl3945_read_prph(priv, reg) & mask) | bits))
Tomas Winklerd8609652007-10-25 17:15:35 +0800367
Christoph Hellwigc8b0e6e2007-10-25 17:15:51 +0800368#ifdef CONFIG_IWL3945_DEBUG
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800369static inline void __iwl3945_set_bits_mask_prph(u32 line,
370 struct iwl3945_priv *priv, u32 reg, u32 bits, u32 mask)
Zhu Yib481de92007-09-25 17:54:57 -0700371{
372 if (!atomic_read(&priv->restrict_refcnt))
Tomas Winklerac17a942007-10-25 17:15:37 +0800373 IWL_ERROR("Nic access not held from line %d\n", line);
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800374 _iwl3945_set_bits_mask_prph(priv, reg, bits, mask);
Zhu Yib481de92007-09-25 17:54:57 -0700375}
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800376#define iwl3945_set_bits_mask_prph(priv, reg, bits, mask) \
377 __iwl3945_set_bits_mask_prph(__LINE__, priv, reg, bits, mask)
Zhu Yib481de92007-09-25 17:54:57 -0700378#else
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800379#define iwl3945_set_bits_mask_prph _iwl3945_set_bits_mask_prph
Zhu Yib481de92007-09-25 17:54:57 -0700380#endif
381
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800382static inline void iwl3945_clear_bits_prph(struct iwl3945_priv
Zhu Yib481de92007-09-25 17:54:57 -0700383 *priv, u32 reg, u32 mask)
384{
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800385 u32 val = _iwl3945_read_prph(priv, reg);
386 _iwl3945_write_prph(priv, reg, (val & ~mask));
Zhu Yib481de92007-09-25 17:54:57 -0700387}
388
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800389static inline u32 iwl3945_read_targ_mem(struct iwl3945_priv *priv, u32 addr)
Zhu Yib481de92007-09-25 17:54:57 -0700390{
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800391 iwl3945_write_direct32(priv, HBUS_TARG_MEM_RADDR, addr);
392 return iwl3945_read_direct32(priv, HBUS_TARG_MEM_RDAT);
Zhu Yib481de92007-09-25 17:54:57 -0700393}
394
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800395static inline void iwl3945_write_targ_mem(struct iwl3945_priv *priv, u32 addr, u32 val)
Zhu Yib481de92007-09-25 17:54:57 -0700396{
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800397 iwl3945_write_direct32(priv, HBUS_TARG_MEM_WADDR, addr);
398 iwl3945_write_direct32(priv, HBUS_TARG_MEM_WDAT, val);
Zhu Yib481de92007-09-25 17:54:57 -0700399}
400
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800401static inline void iwl3945_write_targ_mem_buf(struct iwl3945_priv *priv, u32 addr,
Tomas Winkleraf7cca22007-10-25 17:15:36 +0800402 u32 len, u32 *values)
Zhu Yib481de92007-09-25 17:54:57 -0700403{
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800404 iwl3945_write_direct32(priv, HBUS_TARG_MEM_WADDR, addr);
Zhu Yib481de92007-09-25 17:54:57 -0700405 for (; 0 < len; len -= sizeof(u32), values++)
Christoph Hellwigbb8c0932008-01-27 16:41:47 -0800406 iwl3945_write_direct32(priv, HBUS_TARG_MEM_WDAT, *values);
Zhu Yib481de92007-09-25 17:54:57 -0700407}
Zhu Yib481de92007-09-25 17:54:57 -0700408#endif