diff mbox

[v3] ath10k: set MAC timestamp in management Rx frame

Message ID 4c705dc7a2c0aa857da4e6eaf6e8ed47c354b9ea.1456351768.git.poh@qca.qualcomm.com (mailing list archive)
State Changes Requested
Headers show

Commit Message

Peter Oh Feb. 24, 2016, 10:18 p.m. UTC
Check and set Rx MAC timestamp when firmware indicates it.
Firmware adds it in Rx beacon frame only at this moment.
Driver and mac80211 may utilize it to detect such clockdrift
or beacon collision and use the result for beacon collision
avoidance.

Signed-off-by: Peter Oh <poh@qca.qualcomm.com>
---

v2:
	- fix kbuild test robot warning, left shift count >= width of type,
	at __le32_to_cpu(arg.ext_info.rx_mac_timestamp_u32) << 32
v3:
	- correct ext_info to start 4-byte aligned
	- make struct wmi_mgmt_rx_ext_info 4-byte aligned to comply FW's intention.

 drivers/net/wireless/ath/ath10k/wmi.c | 14 ++++++++++++++
 drivers/net/wireless/ath/ath10k/wmi.h |  8 ++++++++
 2 files changed, 22 insertions(+)

Comments

Kalle Valo Feb. 25, 2016, 4:34 p.m. UTC | #1
Peter Oh <poh@qca.qualcomm.com> writes:

> Check and set Rx MAC timestamp when firmware indicates it.
> Firmware adds it in Rx beacon frame only at this moment.
> Driver and mac80211 may utilize it to detect such clockdrift
> or beacon collision and use the result for beacon collision
> avoidance.
>
> Signed-off-by: Peter Oh <poh@qca.qualcomm.com>
> ---
>
> v2:
> 	- fix kbuild test robot warning, left shift count >= width of type,
> 	at __le32_to_cpu(arg.ext_info.rx_mac_timestamp_u32) << 32
> v3:
> 	- correct ext_info to start 4-byte aligned
> 	- make struct wmi_mgmt_rx_ext_info 4-byte aligned to comply FW's intention.

I see new warnings:

drivers/net/wireless/ath/ath10k/wmi.c:2199:16: warning: restricted __le32 degrades to integer
drivers/net/wireless/ath/ath10k/wmi.c:2201:41: warning: restricted __le32 degrades to integer
drivers/net/wireless/ath/ath10k/wmi.c:2201:41: warning: cast to restricted __le32
drivers/net/wireless/ath/ath10k/wmi.c:2201:41: warning: restricted __le32 degrades to integer
Peter Oh Feb. 25, 2016, 6:53 p.m. UTC | #2
Hi,

On 02/25/2016 08:34 AM, Valo, Kalle wrote:
> Peter Oh <poh@qca.qualcomm.com> writes:
>
>> Check and set Rx MAC timestamp when firmware indicates it.
>> Firmware adds it in Rx beacon frame only at this moment.
>> Driver and mac80211 may utilize it to detect such clockdrift
>> or beacon collision and use the result for beacon collision
>> avoidance.
>>
>> Signed-off-by: Peter Oh <poh@qca.qualcomm.com>
>> ---
>>
>> v2:
>> 	- fix kbuild test robot warning, left shift count >= width of
> type,
>> 	at __le32_to_cpu(arg.ext_info.rx_mac_timestamp_u32) << 32
>> v3:
>> 	- correct ext_info to start 4-byte aligned
>> 	- make struct wmi_mgmt_rx_ext_info 4-byte aligned to comply FW's
> intention.
>
> I see new warnings:
>
> drivers/net/wireless/ath/ath10k/wmi.c:2199:16: warning: restricted __le32
> degrades to integer
> drivers/net/wireless/ath/ath10k/wmi.c:2201:41: warning: restricted __le32
> degrades to integer
> drivers/net/wireless/ath/ath10k/wmi.c:2201:41: warning: cast to restricted
> __le32
> drivers/net/wireless/ath/ath10k/wmi.c:2201:41: warning: restricted __le32
> degrades to integer
>
Do I have a way to run this check before submitting a patch such as 
checkpatch.pl?

Thanks,
Peter
Sven Eckelmann Feb. 25, 2016, 7:32 p.m. UTC | #3
On Thursday 25 February 2016 10:53:23 Peter Oh wrote:
> > I see new warnings:
> > 
> > drivers/net/wireless/ath/ath10k/wmi.c:2199:16: warning: restricted __le32
> > degrades to integer
> > drivers/net/wireless/ath/ath10k/wmi.c:2201:41: warning: restricted __le32
> > degrades to integer
> > drivers/net/wireless/ath/ath10k/wmi.c:2201:41: warning: cast to restricted
> > __le32
> > drivers/net/wireless/ath/ath10k/wmi.c:2201:41: warning: restricted __le32
> > degrades to integer
> 
> Do I have a way to run this check before submitting a patch such as
> checkpatch.pl?

Looks like sparse with -D__CHECK_ENDIAN__ [1]

You may also try smatch [2]

Kind regards,
	Sven

[1] https://www.kernel.org/doc/Documentation/sparse.txt
[2] http://smatch.sourceforge.net/
Peter Oh Feb. 25, 2016, 7:49 p.m. UTC | #4
Thank you!

On 02/25/2016 11:32 AM, Sven Eckelmann wrote:
> On Thursday 25 February 2016 10:53:23 Peter Oh wrote:
>>> I see new warnings:
>>>
>>> drivers/net/wireless/ath/ath10k/wmi.c:2199:16: warning: restricted
> __le32
>>> degrades to integer
>>> drivers/net/wireless/ath/ath10k/wmi.c:2201:41: warning: restricted
> __le32
>>> degrades to integer
>>> drivers/net/wireless/ath/ath10k/wmi.c:2201:41: warning: cast to
> restricted
>>> __le32
>>> drivers/net/wireless/ath/ath10k/wmi.c:2201:41: warning: restricted
> __le32
>>> degrades to integer
>> Do I have a way to run this check before submitting a patch such as
>> checkpatch.pl?
> Looks like sparse with -D__CHECK_ENDIAN__ [1]
>
> You may also try smatch [2]
>
> Kind regards,
> 	Sven
>
> [1] https://www.kernel.org/doc/Documentation/sparse.txt
> [2] http://smatch.sourceforge.net/
Kalle Valo Feb. 26, 2016, 10 a.m. UTC | #5
Peter Oh <poh@codeaurora.org> writes:

>> I see new warnings:
>>
>> drivers/net/wireless/ath/ath10k/wmi.c:2199:16: warning: restricted __le32
>> degrades to integer
>> drivers/net/wireless/ath/ath10k/wmi.c:2201:41: warning: restricted __le32
>> degrades to integer
>> drivers/net/wireless/ath/ath10k/wmi.c:2201:41: warning: cast to restricted
>> __le32
>> drivers/net/wireless/ath/ath10k/wmi.c:2201:41: warning: restricted __le32
>> degrades to integer
>>
> Do I have a way to run this check before submitting a patch such as
> checkpatch.pl?

I use this script to run checks on ath10k before I apply a patch to
pending branch:

https://github.com/qca/qca-swiss-army-knife/blob/master/tools/scripts/ath10k/ath10k-check

You need to install sparse separately, better to take the latest version
from git:

https://sparse.wiki.kernel.org/index.php/Main_Page
diff mbox

Patch

diff --git a/drivers/net/wireless/ath/ath10k/wmi.c b/drivers/net/wireless/ath/ath10k/wmi.c
index 0f01a8d..c1ed015 100644
--- a/drivers/net/wireless/ath/ath10k/wmi.c
+++ b/drivers/net/wireless/ath/ath10k/wmi.c
@@ -2167,6 +2167,7 @@  static int ath10k_wmi_op_pull_mgmt_rx_ev(struct ath10k *ar, struct sk_buff *skb,
 	struct wmi_mgmt_rx_event_v1 *ev_v1;
 	struct wmi_mgmt_rx_event_v2 *ev_v2;
 	struct wmi_mgmt_rx_hdr_v1 *ev_hdr;
+	struct wmi_mgmt_rx_ext_info *ext_info;
 	size_t pull_len;
 	u32 msdu_len;
 
@@ -2195,6 +2196,12 @@  static int ath10k_wmi_op_pull_mgmt_rx_ev(struct ath10k *ar, struct sk_buff *skb,
 	if (skb->len < msdu_len)
 		return -EPROTO;
 
+	if (arg->status & WMI_RX_STATUS_EXT_INFO) {
+		ext_info = (struct wmi_mgmt_rx_ext_info *)
+			   (skb->data + round_up(arg->buf_len, sizeof(u32)));
+		memcpy(&arg->ext_info, ext_info,
+		       sizeof(struct wmi_mgmt_rx_ext_info));
+	}
 	/* the WMI buffer might've ended up being padded to 4 bytes due to HTC
 	 * trailer with credit update. Trim the excess garbage.
 	 */
@@ -2281,6 +2288,13 @@  int ath10k_wmi_event_mgmt_rx(struct ath10k *ar, struct sk_buff *skb)
 	if (rx_status & WMI_RX_STATUS_ERR_MIC)
 		status->flag |= RX_FLAG_MMIC_ERROR;
 
+	if (rx_status & WMI_RX_STATUS_EXT_INFO) {
+		status->mactime =
+			__le32_to_cpu(arg.ext_info.rx_mac_timestamp_l32) |
+			(u64)__le32_to_cpu(arg.ext_info.rx_mac_timestamp_u32)
+			<< 32;
+		status->flag |= RX_FLAG_MACTIME_END;
+	}
 	/* Hardware can Rx CCK rates on 5GHz. In that case phy_mode is set to
 	 * MODE_11B. This means phy_mode is not a reliable source for the band
 	 * of mgmt rx.
diff --git a/drivers/net/wireless/ath/ath10k/wmi.h b/drivers/net/wireless/ath/ath10k/wmi.h
index 806d4bb..6595ce9 100644
--- a/drivers/net/wireless/ath/ath10k/wmi.h
+++ b/drivers/net/wireless/ath/ath10k/wmi.h
@@ -3025,11 +3025,18 @@  struct wmi_10_4_mgmt_rx_event {
 	u8 buf[0];
 } __packed;
 
+struct wmi_mgmt_rx_ext_info {
+	__le32 rx_mac_timestamp_l32;
+	__le32 rx_mac_timestamp_u32;
+} __packed __aligned(4);
+
 #define WMI_RX_STATUS_OK			0x00
 #define WMI_RX_STATUS_ERR_CRC			0x01
 #define WMI_RX_STATUS_ERR_DECRYPT		0x08
 #define WMI_RX_STATUS_ERR_MIC			0x10
 #define WMI_RX_STATUS_ERR_KEY_CACHE_MISS	0x20
+/* Extension data at the end of mgmt frame */
+#define WMI_RX_STATUS_EXT_INFO		0x40
 
 #define PHY_ERROR_GEN_SPECTRAL_SCAN		0x26
 #define PHY_ERROR_GEN_FALSE_RADAR_EXT		0x24
@@ -6076,6 +6083,7 @@  struct wmi_mgmt_rx_ev_arg {
 	__le32 phy_mode;
 	__le32 buf_len;
 	__le32 status; /* %WMI_RX_STATUS_ */
+	struct wmi_mgmt_rx_ext_info ext_info;
 };
 
 struct wmi_ch_info_ev_arg {