2 * carlu - userspace testing utility for ar9170 devices
6 * Copyright 2009-2011 Christian Lamparter <chunkeey@googlemail.com>
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.
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.
18 * You should have received a copy of the GNU General Public License along
19 * with this program; if not, write to the Free Software Foundation, Inc.,
20 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
44 err("This is an error.\n");
45 warn("This is a warnig.\n");
46 info("This is an informative message.\n");
47 dbg("This is just utter useless babble.\n");
50 void carlu_frame_test(struct carlu *ar)
54 frame = carlu_alloc_frame(ar, 0x40);
55 frame_reserve(frame, 0x10);
57 memset(frame_put(frame, 0x10), 0x11, 0x10);
58 memset(frame_put(frame, 0x10), 0x22, 0x10);
59 memset(frame_push(frame, 0x10), 0x33, 0x10);
60 memset(frame_put(frame, 0x10), 0x44, 0x10);
62 print_hex_dump_bytes(INFO, "DATA:", frame->data, frame->len);
64 print_hex_dump_bytes(INFO, "PAYLOAD:", frame->payload, frame->alloced);
69 static void carlu_loopback_tx_cb(struct carlu *ar __unused,
70 struct frame *frame __unused)
74 static int carlu_loopback_cmd(struct carlu *ar __unused,
75 struct carl9170_rsp *cmd, void *buf __unused,
76 unsigned int len __unused)
80 switch (cmd->hdr.cmd) {
81 case CARL9170_RSP_TXCOMP:
83 dbg("received tx feedback (%d).\n", n);
85 for (i = 0; i < n; i++) {
86 dbg("cookie:%x info:%x\n",
87 cmd->_tx_status[i].cookie,
88 cmd->_tx_status[i].info);
97 static void carlu_loopback_rx(struct carlu *ar,
98 void *buf __unused, unsigned int len)
101 ar->rx_octets += len;
104 static void carlu_loopback_mark_tx_frames(struct frame *frame)
108 for (i = 0; i < frame->len; i++)
109 frame->data[i] = (uint8_t) i;
112 void carlu_loopback_test(struct carlu *ar, const unsigned int total_runs,
113 const unsigned int interval, const unsigned int min_len, const unsigned int max_len)
116 uint32_t start_time, total_time = 0;
117 float moctets, dtime;
118 unsigned int runs = 0, i = 0, j = 0, len;
121 if (min_len > max_len) {
122 err("stresstest: invalid parameters => min_len:%d > max_len:%d",
128 err("stresstest: invalid parameters => min_len is smaller than 4");
133 frame = carlu_alloc_frame(ar, len);
134 frame_put(frame, len);
136 carlu_loopback_mark_tx_frames(frame);
138 ar->rx_cb = carlu_loopback_rx;
139 ar->cmd_cb = carlu_loopback_cmd;
140 ar->tx_cb = carlu_loopback_tx_cb;
142 start_time = SDL_GetTicks();
143 while (runs <= total_runs) {
144 if (frame && carlu_tx(ar, frame) == 0) {
153 frame = carlu_alloc_frame(ar, len);
154 frame_put(frame, len);
156 carlu_loopback_mark_tx_frames(frame);
159 total_time = SDL_GetTicks() - start_time;
161 if (total_time >= interval) {
162 moctets = ((float)ar->tx_octets) / (1024.0f * 1024.0f);
163 dtime = ((float)total_time) / 1000;
164 info("%d: tx %d of %d => %.2f MiB in %.2f secs => %.4f MBits/s\n",
165 runs, i, j, moctets, dtime, (moctets * 8.0f) / dtime);
167 moctets = ((float)ar->rx_octets) / (1024.0f * 1024.0f);
168 info("%d: rx %d of %d => %.2f MiB in %.2f secs => %.4f MBits/s\n",
169 runs, ar->rxed, i, moctets, dtime, (moctets * 8.0f) / dtime);
171 if ((ar->rxed == 0 && i) || !i) {
172 ret = carlu_cmd_echo(ar, 0xdeadbeef);
174 warn("firmware crashed... echo_cmd: (%d)\n", ret);
185 start_time = SDL_GetTicks();
194 int carlu_gpio_test(struct carlu *ar)
205 CHK(carlu_cmd_read_mem(ar, AR9170_GPIO_REG_PORT_DATA, &gpio));
206 info("GPIO state:%x\n", gpio);
208 /* turn both LEDs on */
209 CHK(carlu_cmd_write_mem(ar, AR9170_GPIO_REG_PORT_DATA,
210 AR9170_GPIO_PORT_LED_0 | AR9170_GPIO_PORT_LED_1));
214 CHK(carlu_cmd_read_mem(ar, AR9170_GPIO_REG_PORT_DATA, &gpio));
215 info("GPIO state:%x\n", gpio);
217 /* turn LEDs off everything */
218 CHK(carlu_cmd_write_mem(ar, AR9170_GPIO_REG_PORT_DATA, 0));
220 CHK(carlu_cmd_read_mem(ar, AR9170_GPIO_REG_PORT_DATA, &gpio));
221 info("GPIO state:%x\n", gpio);
224 int carlu_random_test(struct carlu *ar)
229 err = carlu_cmd_mem_watch(ar, AR9170_RAND_REG_NUM, sizeof(buf), buf);
233 for (i = 0; i < ARRAY_SIZE(buf); i++)
234 info("%.2x %.2x ", buf[i] & 0xff, buf[i] >> 8);