diff options
Diffstat (limited to 'drivers/net/wireless/ath/carl9170/cmd.h')
-rw-r--r-- | drivers/net/wireless/ath/carl9170/cmd.h | 173 |
1 files changed, 173 insertions, 0 deletions
diff --git a/drivers/net/wireless/ath/carl9170/cmd.h b/drivers/net/wireless/ath/carl9170/cmd.h new file mode 100644 index 000000000000..568174c71b94 --- /dev/null +++ b/drivers/net/wireless/ath/carl9170/cmd.h | |||
@@ -0,0 +1,173 @@ | |||
1 | /* | ||
2 | * Atheros CARL9170 driver | ||
3 | * | ||
4 | * Basic HW register/memory/command access functions | ||
5 | * | ||
6 | * Copyright 2008, Johannes Berg <johannes@sipsolutions.net> | ||
7 | * Copyright 2010, Christian Lamparter <chunkeey@googlemail.com> | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify | ||
10 | * it under the terms of the GNU General Public License as published by | ||
11 | * the Free Software Foundation; either version 2 of the License, or | ||
12 | * (at your option) any later version. | ||
13 | * | ||
14 | * This program is distributed in the hope that it will be useful, | ||
15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
17 | * GNU General Public License for more details. | ||
18 | * | ||
19 | * You should have received a copy of the GNU General Public License | ||
20 | * along with this program; see the file COPYING. If not, see | ||
21 | * http://www.gnu.org/licenses/. | ||
22 | * | ||
23 | * This file incorporates work covered by the following copyright and | ||
24 | * permission notice: | ||
25 | * Copyright (c) 2007-2008 Atheros Communications, Inc. | ||
26 | * | ||
27 | * Permission to use, copy, modify, and/or distribute this software for any | ||
28 | * purpose with or without fee is hereby granted, provided that the above | ||
29 | * copyright notice and this permission notice appear in all copies. | ||
30 | * | ||
31 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||
32 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||
33 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||
34 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||
35 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||
36 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | ||
37 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||
38 | */ | ||
39 | #ifndef __CMD_H | ||
40 | #define __CMD_H | ||
41 | |||
42 | #include "carl9170.h" | ||
43 | |||
44 | /* basic HW access */ | ||
45 | int carl9170_write_reg(struct ar9170 *ar, const u32 reg, const u32 val); | ||
46 | int carl9170_read_reg(struct ar9170 *ar, const u32 reg, u32 *val); | ||
47 | int carl9170_read_mreg(struct ar9170 *ar, const int nregs, | ||
48 | const u32 *regs, u32 *out); | ||
49 | int carl9170_echo_test(struct ar9170 *ar, u32 v); | ||
50 | int carl9170_reboot(struct ar9170 *ar); | ||
51 | int carl9170_mac_reset(struct ar9170 *ar); | ||
52 | int carl9170_powersave(struct ar9170 *ar, const bool power_on); | ||
53 | int carl9170_bcn_ctrl(struct ar9170 *ar, const unsigned int vif_id, | ||
54 | const u32 mode, const u32 addr, const u32 len); | ||
55 | |||
56 | static inline int carl9170_flush_cab(struct ar9170 *ar, | ||
57 | const unsigned int vif_id) | ||
58 | { | ||
59 | return carl9170_bcn_ctrl(ar, vif_id, CARL9170_BCN_CTRL_DRAIN, 0, 0); | ||
60 | } | ||
61 | |||
62 | static inline int carl9170_rx_filter(struct ar9170 *ar, | ||
63 | const unsigned int _rx_filter) | ||
64 | { | ||
65 | __le32 rx_filter = cpu_to_le32(_rx_filter); | ||
66 | |||
67 | return carl9170_exec_cmd(ar, CARL9170_CMD_RX_FILTER, | ||
68 | sizeof(rx_filter), (u8 *)&rx_filter, | ||
69 | 0, NULL); | ||
70 | } | ||
71 | |||
72 | struct carl9170_cmd *carl9170_cmd_buf(struct ar9170 *ar, | ||
73 | const enum carl9170_cmd_oids cmd, const unsigned int len); | ||
74 | |||
75 | /* | ||
76 | * Macros to facilitate writing multiple registers in a single | ||
77 | * write-combining USB command. Note that when the first group | ||
78 | * fails the whole thing will fail without any others attempted, | ||
79 | * but you won't know which write in the group failed. | ||
80 | */ | ||
81 | #define carl9170_regwrite_begin(ar) \ | ||
82 | do { \ | ||
83 | int __nreg = 0, __err = 0; \ | ||
84 | struct ar9170 *__ar = ar; | ||
85 | |||
86 | #define carl9170_regwrite(r, v) do { \ | ||
87 | __ar->cmd_buf[2 * __nreg + 1] = cpu_to_le32(r); \ | ||
88 | __ar->cmd_buf[2 * __nreg + 2] = cpu_to_le32(v); \ | ||
89 | __nreg++; \ | ||
90 | if ((__nreg >= PAYLOAD_MAX/2)) { \ | ||
91 | if (IS_ACCEPTING_CMD(__ar)) \ | ||
92 | __err = carl9170_exec_cmd(__ar, \ | ||
93 | CARL9170_CMD_WREG, 8 * __nreg, \ | ||
94 | (u8 *) &__ar->cmd_buf[1], 0, NULL); \ | ||
95 | else \ | ||
96 | goto __regwrite_out; \ | ||
97 | \ | ||
98 | __nreg = 0; \ | ||
99 | if (__err) \ | ||
100 | goto __regwrite_out; \ | ||
101 | } \ | ||
102 | } while (0) | ||
103 | |||
104 | #define carl9170_regwrite_finish() \ | ||
105 | __regwrite_out : \ | ||
106 | if (__err == 0 && __nreg) { \ | ||
107 | if (IS_ACCEPTING_CMD(__ar)) \ | ||
108 | __err = carl9170_exec_cmd(__ar, \ | ||
109 | CARL9170_CMD_WREG, 8 * __nreg, \ | ||
110 | (u8 *) &__ar->cmd_buf[1], 0, NULL); \ | ||
111 | __nreg = 0; \ | ||
112 | } | ||
113 | |||
114 | #define carl9170_regwrite_result() \ | ||
115 | __err; \ | ||
116 | } while (0); | ||
117 | |||
118 | |||
119 | #define carl9170_async_regwrite_get_buf() \ | ||
120 | do { \ | ||
121 | __nreg = 0; \ | ||
122 | __cmd = carl9170_cmd_buf(__carl, CARL9170_CMD_WREG_ASYNC, \ | ||
123 | CARL9170_MAX_CMD_PAYLOAD_LEN); \ | ||
124 | if (__cmd == NULL) { \ | ||
125 | __err = -ENOMEM; \ | ||
126 | goto __async_regwrite_out; \ | ||
127 | } \ | ||
128 | } while (0); | ||
129 | |||
130 | #define carl9170_async_regwrite_begin(carl) \ | ||
131 | do { \ | ||
132 | struct ar9170 *__carl = carl; \ | ||
133 | struct carl9170_cmd *__cmd; \ | ||
134 | unsigned int __nreg; \ | ||
135 | int __err = 0; \ | ||
136 | carl9170_async_regwrite_get_buf(); \ | ||
137 | |||
138 | #define carl9170_async_regwrite_flush() \ | ||
139 | do { \ | ||
140 | if (__cmd == NULL || __nreg == 0) \ | ||
141 | break; \ | ||
142 | \ | ||
143 | if (IS_ACCEPTING_CMD(__carl) && __nreg) { \ | ||
144 | __cmd->hdr.len = 8 * __nreg; \ | ||
145 | __err = __carl9170_exec_cmd(__carl, __cmd, true); \ | ||
146 | __cmd = NULL; \ | ||
147 | break; \ | ||
148 | } \ | ||
149 | goto __async_regwrite_out; \ | ||
150 | } while (0) | ||
151 | |||
152 | #define carl9170_async_regwrite(r, v) do { \ | ||
153 | if (__cmd == NULL) \ | ||
154 | carl9170_async_regwrite_get_buf(); \ | ||
155 | __cmd->wreg.regs[__nreg].addr = cpu_to_le32(r); \ | ||
156 | __cmd->wreg.regs[__nreg].val = cpu_to_le32(v); \ | ||
157 | __nreg++; \ | ||
158 | if ((__nreg >= PAYLOAD_MAX / 2)) \ | ||
159 | carl9170_async_regwrite_flush(); \ | ||
160 | } while (0) | ||
161 | |||
162 | #define carl9170_async_regwrite_finish() do { \ | ||
163 | __async_regwrite_out : \ | ||
164 | if (__cmd != NULL && __err == 0) \ | ||
165 | carl9170_async_regwrite_flush(); \ | ||
166 | kfree(__cmd); \ | ||
167 | } while (0) \ | ||
168 | |||
169 | #define carl9170_async_regwrite_result() \ | ||
170 | __err; \ | ||
171 | } while (0); | ||
172 | |||
173 | #endif /* __CMD_H */ | ||