2 * carl9170user - userspace testing utility for ar9170 devices
6 * Copyright 2009, 2010 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.
43 err("This is an error.\n");
44 warn("This is a warnig.\n");
45 info("This is an informative message.\n");
46 dbg("This is just utter useless babble.\n");
49 void carlu_frame_test(struct carlu *ar)
53 frame = carlu_alloc_frame(ar, 0x40);
54 frame_reserve(frame, 0x10);
56 memset(frame_put(frame, 0x10), 0x11, 0x10);
57 memset(frame_put(frame, 0x10), 0x22, 0x10);
58 memset(frame_push(frame, 0x10), 0x33, 0x10);
59 memset(frame_put(frame, 0x10), 0x44, 0x10);
61 print_hex_dump_bytes(INFO, "DATA:", frame->data, frame->len);
63 print_hex_dump_bytes(INFO, "PAYLOAD:", frame->payload, frame->alloced);
68 static void carlu_loopback_tx_cb(struct carlu *ar __unused,
69 struct frame *frame __unused)
73 static int carlu_loopback_cmd(struct carlu *ar __unused,
74 struct carl9170_rsp *cmd, void *buf __unused,
75 unsigned int len __unused)
79 switch (cmd->hdr.cmd) {
80 case CARL9170_RSP_TXCOMP:
82 dbg("received tx feedback (%d).\n", n);
84 for (i = 0; i < n; i++) {
85 dbg("cookie:%x success:%d rix:%d tries:%d queue:%d\n",
86 cmd->tx_status[i].cookie,
87 cmd->tx_status[i].success,
88 cmd->tx_status[i].rix,
89 cmd->tx_status[i].tries,
90 cmd->tx_status[i].queue);
99 static void carlu_loopback_rx(struct carlu *ar,
100 void *buf __unused, unsigned int len)
103 ar->rx_octets += len;
106 static void carlu_loopback_mark_tx_frames(struct frame *frame)
110 for (i = 0; i < frame->len; i++)
111 frame->data[i] = (uint8_t) i;
114 void carlu_loopback_test(struct carlu *ar, const unsigned int total_runs,
115 const unsigned int interval, const unsigned int min_len, const unsigned int max_len)
118 uint32_t start_time, total_time = 0;
119 float moctets, dtime;
120 unsigned int runs = 0, i = 0, j = 0, len;
123 if (min_len > max_len) {
124 err("stresstest: invalid parameters => min_len:%d > max_len:%d",
130 err("stresstest: invalid parameters => min_len is smaller than 4");
135 frame = carlu_alloc_frame(ar, len);
136 frame_put(frame, len);
138 carlu_loopback_mark_tx_frames(frame);
140 ar->rx_cb = carlu_loopback_rx;
141 ar->cmd_cb = carlu_loopback_cmd;
142 ar->tx_cb = carlu_loopback_tx_cb;
144 start_time = SDL_GetTicks();
145 while (runs <= total_runs) {
146 if (frame && carlu_tx(ar, frame) == 0) {
155 frame = carlu_alloc_frame(ar, len);
156 frame_put(frame, len);
158 carlu_loopback_mark_tx_frames(frame);
161 total_time = SDL_GetTicks() - start_time;
163 if (total_time >= interval) {
164 moctets = ((float)ar->tx_octets) / (1024.0f * 1024.0f);
165 dtime = ((float)total_time) / 1000;
166 info("%d: tx %d of %d => %.2f MiB in %.2f secs => %.4f MBits/s\n",
167 runs, i, j, moctets, dtime, (moctets * 8.0f) / dtime);
169 moctets = ((float)ar->rx_octets) / (1024.0f * 1024.0f);
170 info("%d: rx %d of %d => %.2f MiB in %.2f secs => %.4f MBits/s\n",
171 runs, ar->rxed, i, moctets, dtime, (moctets * 8.0f) / dtime);
173 if ((ar->rxed == 0 && i) || !i) {
174 ret = carlu_cmd_echo(ar, 0xdeadbeef);
176 warn("firmware crashed... echo_cmd: (%d)\n", ret);
187 start_time = SDL_GetTicks();