1 /*****************************************************************************
3 (c) Cambridge Silicon Radio Limited 2011
4 All rights reserved and confidential information of CSR
6 Refer to LICENSE.txt included with this source for details
9 *****************************************************************************/
12 * ---------------------------------------------------------------------------
13 * FILE: csr_wifi_hip_card_udi.c
16 * Maintain a list of callbacks to log UniFi exchanges to one or more
17 * debug/monitoring client applications.
20 * Just call the UDI driver log fn directly for now.
21 * When done properly, each open() on the UDI device will install
22 * a log function. We will call all log fns whenever a signal is written
23 * to or read form the UniFi.
25 * ---------------------------------------------------------------------------
27 #include "csr_wifi_hip_unifi.h"
28 #include "csr_wifi_hip_card.h"
32 * ---------------------------------------------------------------------------
35 * Print status info to given character buffer.
42 * ---------------------------------------------------------------------------
44 s32 unifi_print_status(card_t *card, char *str, s32 *remain)
47 sdio_config_data_t *cfg;
49 s32 remaining = *remain;
51 #ifdef CSR_UNSAFE_SDIO_ACCESS
54 static const char *const states[] = {
55 "AWAKE", "DROWSY", "TORPID"
57 #define SHARED_READ_RETRY_LIMIT 10
67 written = scnprintf(p, remaining, "Chip ID %u\n",
69 UNIFI_SNPRINTF_RET(p, remaining, written);
70 written = scnprintf(p, remaining, "Chip Version %04X\n",
72 UNIFI_SNPRINTF_RET(p, remaining, written);
73 written = scnprintf(p, remaining, "HIP v%u.%u\n",
74 (card->config_data.version >> 8) & 0xFF,
75 card->config_data.version & 0xFF);
76 UNIFI_SNPRINTF_RET(p, remaining, written);
77 written = scnprintf(p, remaining, "Build %u: %s\n",
78 card->build_id, card->build_id_string);
79 UNIFI_SNPRINTF_RET(p, remaining, written);
81 cfg = &card->config_data;
83 written = scnprintf(p, remaining, "sdio ctrl offset %u\n",
84 cfg->sdio_ctrl_offset);
85 UNIFI_SNPRINTF_RET(p, remaining, written);
86 written = scnprintf(p, remaining, "fromhost sigbuf handle %u\n",
87 cfg->fromhost_sigbuf_handle);
88 UNIFI_SNPRINTF_RET(p, remaining, written);
89 written = scnprintf(p, remaining, "tohost_sigbuf_handle %u\n",
90 cfg->tohost_sigbuf_handle);
91 UNIFI_SNPRINTF_RET(p, remaining, written);
92 written = scnprintf(p, remaining, "num_fromhost_sig_frags %u\n",
93 cfg->num_fromhost_sig_frags);
94 UNIFI_SNPRINTF_RET(p, remaining, written);
95 written = scnprintf(p, remaining, "num_tohost_sig_frags %u\n",
96 cfg->num_tohost_sig_frags);
97 UNIFI_SNPRINTF_RET(p, remaining, written);
98 written = scnprintf(p, remaining, "num_fromhost_data_slots %u\n",
99 cfg->num_fromhost_data_slots);
100 UNIFI_SNPRINTF_RET(p, remaining, written);
101 written = scnprintf(p, remaining, "num_tohost_data_slots %u\n",
102 cfg->num_tohost_data_slots);
103 UNIFI_SNPRINTF_RET(p, remaining, written);
104 written = scnprintf(p, remaining, "data_slot_size %u\n",
105 cfg->data_slot_size);
106 UNIFI_SNPRINTF_RET(p, remaining, written);
108 /* Added by protocol version 0x0001 */
109 written = scnprintf(p, remaining, "overlay_size %u\n",
110 (u16)cfg->overlay_size);
111 UNIFI_SNPRINTF_RET(p, remaining, written);
113 /* Added by protocol version 0x0300 */
114 written = scnprintf(p, remaining, "data_slot_round %u\n",
115 cfg->data_slot_round);
116 UNIFI_SNPRINTF_RET(p, remaining, written);
117 written = scnprintf(p, remaining, "sig_frag_size %u\n",
119 UNIFI_SNPRINTF_RET(p, remaining, written);
121 /* Added by protocol version 0x0300 */
122 written = scnprintf(p, remaining, "tohost_sig_pad %u\n",
123 cfg->tohost_signal_padding);
124 UNIFI_SNPRINTF_RET(p, remaining, written);
126 written = scnprintf(p, remaining, "\nInternal state:\n");
127 UNIFI_SNPRINTF_RET(p, remaining, written);
129 written = scnprintf(p, remaining, "Last PHY PANIC: %04x:%04x\n",
130 card->last_phy_panic_code, card->last_phy_panic_arg);
131 UNIFI_SNPRINTF_RET(p, remaining, written);
132 written = scnprintf(p, remaining, "Last MAC PANIC: %04x:%04x\n",
133 card->last_mac_panic_code, card->last_mac_panic_arg);
134 UNIFI_SNPRINTF_RET(p, remaining, written);
136 written = scnprintf(p, remaining, "fhsr: %u\n",
137 (u16)card->from_host_signals_r);
138 UNIFI_SNPRINTF_RET(p, remaining, written);
139 written = scnprintf(p, remaining, "fhsw: %u\n",
140 (u16)card->from_host_signals_w);
141 UNIFI_SNPRINTF_RET(p, remaining, written);
142 written = scnprintf(p, remaining, "thsr: %u\n",
143 (u16)card->to_host_signals_r);
144 UNIFI_SNPRINTF_RET(p, remaining, written);
145 written = scnprintf(p, remaining, "thsw: %u\n",
146 (u16)card->to_host_signals_w);
147 UNIFI_SNPRINTF_RET(p, remaining, written);
148 written = scnprintf(p, remaining,
149 "fh buffer contains: %d signals, %td bytes\n",
150 card->fh_buffer.count,
151 card->fh_buffer.ptr - card->fh_buffer.buf);
152 UNIFI_SNPRINTF_RET(p, remaining, written);
154 written = scnprintf(p, remaining, "paused: ");
155 UNIFI_SNPRINTF_RET(p, remaining, written);
156 for (i = 0; i < sizeof(card->tx_q_paused_flag) / sizeof(card->tx_q_paused_flag[0]); i++)
158 written = scnprintf(p, remaining, card->tx_q_paused_flag[i]?"1" : "0");
159 UNIFI_SNPRINTF_RET(p, remaining, written);
161 written = scnprintf(p, remaining, "\n");
162 UNIFI_SNPRINTF_RET(p, remaining, written);
164 written = scnprintf(p, remaining,
165 "fh command q: %u waiting, %u free of %u:\n",
166 CSR_WIFI_HIP_Q_SLOTS_USED(&card->fh_command_queue),
167 CSR_WIFI_HIP_Q_SLOTS_FREE(&card->fh_command_queue),
168 UNIFI_SOFT_COMMAND_Q_LENGTH);
169 UNIFI_SNPRINTF_RET(p, remaining, written);
170 for (i = 0; i < UNIFI_NO_OF_TX_QS; i++)
172 written = scnprintf(p, remaining,
173 "fh traffic q[%u]: %u waiting, %u free of %u:\n",
175 CSR_WIFI_HIP_Q_SLOTS_USED(&card->fh_traffic_queue[i]),
176 CSR_WIFI_HIP_Q_SLOTS_FREE(&card->fh_traffic_queue[i]),
177 UNIFI_SOFT_TRAFFIC_Q_LENGTH);
178 UNIFI_SNPRINTF_RET(p, remaining, written);
181 written = scnprintf(p, remaining, "fh data slots free: %u\n",
182 card->from_host_data?CardGetFreeFromHostDataSlots(card) : 0);
183 UNIFI_SNPRINTF_RET(p, remaining, written);
186 written = scnprintf(p, remaining, "From host data slots:");
187 UNIFI_SNPRINTF_RET(p, remaining, written);
188 n = card->config_data.num_fromhost_data_slots;
189 for (i = 0; i < n && card->from_host_data; i++)
191 written = scnprintf(p, remaining, " %u",
192 (u16)card->from_host_data[i].bd.data_length);
193 UNIFI_SNPRINTF_RET(p, remaining, written);
195 written = scnprintf(p, remaining, "\n");
196 UNIFI_SNPRINTF_RET(p, remaining, written);
198 written = scnprintf(p, remaining, "To host data slots:");
199 UNIFI_SNPRINTF_RET(p, remaining, written);
200 n = card->config_data.num_tohost_data_slots;
201 for (i = 0; i < n && card->to_host_data; i++)
203 written = scnprintf(p, remaining, " %u",
204 (u16)card->to_host_data[i].data_length);
205 UNIFI_SNPRINTF_RET(p, remaining, written);
208 written = scnprintf(p, remaining, "\n");
209 UNIFI_SNPRINTF_RET(p, remaining, written);
211 #ifdef CSR_UNSAFE_SDIO_ACCESS
212 written = scnprintf(p, remaining, "Host State: %s\n", states[card->host_state]);
213 UNIFI_SNPRINTF_RET(p, remaining, written);
215 r = unifi_check_io_status(card, &iostate);
218 written = scnprintf(p, remaining, "I/O Check: F1 disabled\n");
219 UNIFI_SNPRINTF_RET(p, remaining, written);
225 written = scnprintf(p, remaining, "I/O Check: pending interrupt\n");
226 UNIFI_SNPRINTF_RET(p, remaining, written);
229 written = scnprintf(p, remaining, "BH reason interrupt = %d\n",
230 card->bh_reason_unifi);
231 UNIFI_SNPRINTF_RET(p, remaining, written);
232 written = scnprintf(p, remaining, "BH reason host = %d\n",
233 card->bh_reason_host);
234 UNIFI_SNPRINTF_RET(p, remaining, written);
236 for (i = 0; i < SHARED_READ_RETRY_LIMIT; i++)
238 r = unifi_read_8_or_16(card, card->sdio_ctrl_addr + 2, &b);
239 if ((r == CSR_RESULT_SUCCESS) && (!(b & 0x80)))
241 written = scnprintf(p, remaining, "fhsr: %u (driver thinks is %u)\n",
242 b, card->from_host_signals_r);
243 UNIFI_SNPRINTF_RET(p, remaining, written);
247 iostate = unifi_read_shared_count(card, card->sdio_ctrl_addr + 4);
248 written = scnprintf(p, remaining, "thsw: %u (driver thinks is %u)\n",
249 iostate, card->to_host_signals_w);
250 UNIFI_SNPRINTF_RET(p, remaining, written);
254 written = scnprintf(p, remaining, "\nStats:\n");
255 UNIFI_SNPRINTF_RET(p, remaining, written);
256 written = scnprintf(p, remaining, "Total SDIO bytes: R=%u W=%u\n",
257 card->sdio_bytes_read, card->sdio_bytes_written);
259 UNIFI_SNPRINTF_RET(p, remaining, written);
260 written = scnprintf(p, remaining, "Interrupts generated on card: %u\n",
261 card->unifi_interrupt_seq);
262 UNIFI_SNPRINTF_RET(p, remaining, written);
266 } /* unifi_print_status() */