826c45e6b2742e3ae97c8e174310a15c63ae0282
[pandora-kernel.git] / drivers / net / wireless / ath / ar9170 / cmd.h
1 /*
2  * Atheros AR9170 driver
3  *
4  * Basic HW register/memory/command access functions
5  *
6  * Copyright 2008, Johannes Berg <johannes@sipsolutions.net>
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; see the file COPYING.  If not, see
20  * http://www.gnu.org/licenses/.
21  *
22  * This file incorporates work covered by the following copyright and
23  * permission notice:
24  *    Copyright (c) 2007-2008 Atheros Communications, Inc.
25  *
26  *    Permission to use, copy, modify, and/or distribute this software for any
27  *    purpose with or without fee is hereby granted, provided that the above
28  *    copyright notice and this permission notice appear in all copies.
29  *
30  *    THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
31  *    WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
32  *    MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
33  *    ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
34  *    WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
35  *    ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
36  *    OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
37  */
38 #ifndef __CMD_H
39 #define __CMD_H
40
41 #include "ar9170.h"
42
43 /* basic HW access */
44 int ar9170_write_mem(struct ar9170 *ar, const __le32 *data, size_t len);
45 int ar9170_write_reg(struct ar9170 *ar, const u32 reg, const u32 val);
46 int ar9170_read_reg(struct ar9170 *ar, u32 reg, u32 *val);
47 int ar9170_read_mreg(struct ar9170 *ar, int nregs, const u32 *regs, u32 *out);
48 int ar9170_echo_test(struct ar9170 *ar, u32 v);
49
50 /*
51  * Macros to facilitate writing multiple registers in a single
52  * write-combining USB command. Note that when the first group
53  * fails the whole thing will fail without any others attempted,
54  * but you won't know which write in the group failed.
55  */
56 #define ar9170_regwrite_begin(ar)                                       \
57 do {                                                                    \
58         int __nreg = 0, __err = 0;                                      \
59         struct ar9170 *__ar = ar;
60
61 #define ar9170_regwrite(r, v) do {                                      \
62         __ar->cmdbuf[2 * __nreg + 1] = cpu_to_le32(r);                  \
63         __ar->cmdbuf[2 * __nreg + 2] = cpu_to_le32(v);                  \
64         __nreg++;                                                       \
65         if ((__nreg >= PAYLOAD_MAX/2)) {                                \
66                 if (IS_ACCEPTING_CMD(__ar))                             \
67                         __err = ar->exec_cmd(__ar, AR9170_CMD_WREG,     \
68                                              8 * __nreg,                \
69                                              (u8 *) &__ar->cmdbuf[1],   \
70                                              0, NULL);                  \
71                 __nreg = 0;                                             \
72                 if (__err)                                              \
73                         goto __regwrite_out;                            \
74         }                                                               \
75 } while (0)
76
77 #define ar9170_regwrite_finish()                                        \
78 __regwrite_out :                                                        \
79         if (__nreg) {                                                   \
80                 if (IS_ACCEPTING_CMD(__ar))                             \
81                         __err = ar->exec_cmd(__ar, AR9170_CMD_WREG,     \
82                                              8 * __nreg,                \
83                                              (u8 *) &__ar->cmdbuf[1],   \
84                                              0, NULL);                  \
85                 __nreg = 0;                                             \
86         }
87
88 #define ar9170_regwrite_result()                                        \
89         __err;                                                          \
90 } while (0);
91
92 #endif /* __CMD_H */