Merge branch 'i2c-for-linus' of git://jdelvare.pck.nerim.net/jdelvare-2.6
[linux-2.6] / drivers / net / wireless / 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_echo_test(struct ar9170 *ar, u32 v);
48
49 /*
50  * Macros to facilitate writing multiple registers in a single
51  * write-combining USB command. Note that when the first group
52  * fails the whole thing will fail without any others attempted,
53  * but you won't know which write in the group failed.
54  */
55 #define ar9170_regwrite_begin(ar)                                       \
56 do {                                                                    \
57         int __nreg = 0, __err = 0;                                      \
58         struct ar9170 *__ar = ar;
59
60 #define ar9170_regwrite(r, v) do {                                      \
61         __ar->cmdbuf[2 * __nreg + 1] = cpu_to_le32(r);                  \
62         __ar->cmdbuf[2 * __nreg + 2] = cpu_to_le32(v);                  \
63         __nreg++;                                                       \
64         if ((__nreg >= PAYLOAD_MAX/2)) {                                \
65                 if (IS_ACCEPTING_CMD(__ar))                             \
66                         __err = ar->exec_cmd(__ar, AR9170_CMD_WREG,     \
67                                              8 * __nreg,                \
68                                              (u8 *) &__ar->cmdbuf[1],   \
69                                              0, NULL);                  \
70                 __nreg = 0;                                             \
71                 if (__err)                                              \
72                         goto __regwrite_out;                            \
73         }                                                               \
74 } while (0)
75
76 #define ar9170_regwrite_finish()                                        \
77 __regwrite_out :                                                        \
78         if (__nreg) {                                                   \
79                 if (IS_ACCEPTING_CMD(__ar))                             \
80                         __err = ar->exec_cmd(__ar, AR9170_CMD_WREG,     \
81                                              8 * __nreg,                \
82                                              (u8 *) &__ar->cmdbuf[1],   \
83                                              0, NULL);                  \
84                 __nreg = 0;                                             \
85         }
86
87 #define ar9170_regwrite_result()                                        \
88         __err;                                                          \
89 } while (0);
90
91 #endif /* __CMD_H */