ath10k: implement diag event
authorMichal Kazior <michal.kazior@tieto.com>
Sat, 24 Jan 2015 10:14:47 +0000 (12:14 +0200)
committerKalle Valo <kvalo@qca.qualcomm.com>
Tue, 27 Jan 2015 13:50:59 +0000 (15:50 +0200)
Some firmware revisions may report this event as
part of their diagnostics.

This avoids `unknown event` warnings and adds
tracing for the event.

Signed-off-by: Michal Kazior <michal.kazior@tieto.com>
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
drivers/net/wireless/ath/ath10k/trace.h
drivers/net/wireless/ath/ath10k/wmi-tlv.c

index 1c541f73370ddc5d13dd96386ba465f5caea656c..5407887380abe71a91a9570d3e23b063f67e59d3 100644 (file)
@@ -494,6 +494,33 @@ TRACE_EVENT(ath10k_wmi_diag_container,
        )
 );
 
+TRACE_EVENT(ath10k_wmi_diag,
+           TP_PROTO(struct ath10k *ar, const void *data, size_t len),
+
+       TP_ARGS(ar, data, len),
+
+       TP_STRUCT__entry(
+               __string(device, dev_name(ar->dev))
+               __string(driver, dev_driver_string(ar->dev))
+               __field(u16, len)
+               __dynamic_array(u8, data, len)
+       ),
+
+       TP_fast_assign(
+               __assign_str(device, dev_name(ar->dev));
+               __assign_str(driver, dev_driver_string(ar->dev));
+               __entry->len = len;
+               memcpy(__get_dynamic_array(data), data, len);
+       ),
+
+       TP_printk(
+               "%s %s tlv diag len %d",
+               __get_str(driver),
+               __get_str(device),
+               __entry->len
+       )
+);
+
 #endif /* _TRACE_H_ || TRACE_HEADER_MULTI_READ*/
 
 /* we don't want to use include/trace/events */
index 56cd51d0ac937f3405af49df61b116e52d6baf66..a6c634a585ddb3f0682c9fdbefb3b5c3a82ec386 100644 (file)
@@ -268,6 +268,34 @@ static int ath10k_wmi_tlv_event_diag_data(struct ath10k *ar,
        return 0;
 }
 
+static int ath10k_wmi_tlv_event_diag(struct ath10k *ar,
+                                    struct sk_buff *skb)
+{
+       const void **tb;
+       const void *data;
+       int ret, len;
+
+       tb = ath10k_wmi_tlv_parse_alloc(ar, skb->data, skb->len, GFP_ATOMIC);
+       if (IS_ERR(tb)) {
+               ret = PTR_ERR(tb);
+               ath10k_warn(ar, "failed to parse tlv: %d\n", ret);
+               return ret;
+       }
+
+       data = tb[WMI_TLV_TAG_ARRAY_BYTE];
+       if (!data) {
+               kfree(tb);
+               return -EPROTO;
+       }
+       len = ath10k_wmi_tlv_len(data);
+
+       ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi tlv diag event len %d\n", len);
+       trace_ath10k_wmi_diag(ar, data, len);
+
+       kfree(tb);
+       return 0;
+}
+
 /***********/
 /* TLV ops */
 /***********/
@@ -386,6 +414,9 @@ static void ath10k_wmi_tlv_op_rx(struct ath10k *ar, struct sk_buff *skb)
        case WMI_TLV_DIAG_DATA_CONTAINER_EVENTID:
                ath10k_wmi_tlv_event_diag_data(ar, skb);
                break;
+       case WMI_TLV_DIAG_EVENTID:
+               ath10k_wmi_tlv_event_diag(ar, skb);
+               break;
        default:
                ath10k_warn(ar, "Unknown eventid: %d\n", id);
                break;