|
@@ -1723,8 +1723,8 @@ static void ath10k_wmi_event_tbttoffset_update(struct ath10k *ar,
|
|
|
}
|
|
|
|
|
|
static void ath10k_dfs_radar_report(struct ath10k *ar,
|
|
|
- struct wmi_single_phyerr_rx_event *event,
|
|
|
- struct phyerr_radar_report *rr,
|
|
|
+ const struct wmi_phyerr *phyerr,
|
|
|
+ const struct phyerr_radar_report *rr,
|
|
|
u64 tsf)
|
|
|
{
|
|
|
u32 reg0, reg1, tsf32l;
|
|
@@ -1757,12 +1757,12 @@ static void ath10k_dfs_radar_report(struct ath10k *ar,
|
|
|
return;
|
|
|
|
|
|
/* report event to DFS pattern detector */
|
|
|
- tsf32l = __le32_to_cpu(event->hdr.tsf_timestamp);
|
|
|
+ tsf32l = __le32_to_cpu(phyerr->tsf_timestamp);
|
|
|
tsf64 = tsf & (~0xFFFFFFFFULL);
|
|
|
tsf64 |= tsf32l;
|
|
|
|
|
|
width = MS(reg1, RADAR_REPORT_REG1_PULSE_DUR);
|
|
|
- rssi = event->hdr.rssi_combined;
|
|
|
+ rssi = phyerr->rssi_combined;
|
|
|
|
|
|
/* hardware store this as 8 bit signed value,
|
|
|
* set to zero if negative number
|
|
@@ -1801,8 +1801,8 @@ static void ath10k_dfs_radar_report(struct ath10k *ar,
|
|
|
}
|
|
|
|
|
|
static int ath10k_dfs_fft_report(struct ath10k *ar,
|
|
|
- struct wmi_single_phyerr_rx_event *event,
|
|
|
- struct phyerr_fft_report *fftr,
|
|
|
+ const struct wmi_phyerr *phyerr,
|
|
|
+ const struct phyerr_fft_report *fftr,
|
|
|
u64 tsf)
|
|
|
{
|
|
|
u32 reg0, reg1;
|
|
@@ -1810,7 +1810,7 @@ static int ath10k_dfs_fft_report(struct ath10k *ar,
|
|
|
|
|
|
reg0 = __le32_to_cpu(fftr->reg0);
|
|
|
reg1 = __le32_to_cpu(fftr->reg1);
|
|
|
- rssi = event->hdr.rssi_combined;
|
|
|
+ rssi = phyerr->rssi_combined;
|
|
|
|
|
|
ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
|
|
|
"wmi phyerr fft report total_gain_db %d base_pwr_db %d fft_chn_idx %d peak_sidx %d\n",
|
|
@@ -1839,20 +1839,20 @@ static int ath10k_dfs_fft_report(struct ath10k *ar,
|
|
|
}
|
|
|
|
|
|
static void ath10k_wmi_event_dfs(struct ath10k *ar,
|
|
|
- struct wmi_single_phyerr_rx_event *event,
|
|
|
+ const struct wmi_phyerr *phyerr,
|
|
|
u64 tsf)
|
|
|
{
|
|
|
int buf_len, tlv_len, res, i = 0;
|
|
|
- struct phyerr_tlv *tlv;
|
|
|
- struct phyerr_radar_report *rr;
|
|
|
- struct phyerr_fft_report *fftr;
|
|
|
- u8 *tlv_buf;
|
|
|
+ const struct phyerr_tlv *tlv;
|
|
|
+ const struct phyerr_radar_report *rr;
|
|
|
+ const struct phyerr_fft_report *fftr;
|
|
|
+ const u8 *tlv_buf;
|
|
|
|
|
|
- buf_len = __le32_to_cpu(event->hdr.buf_len);
|
|
|
+ buf_len = __le32_to_cpu(phyerr->buf_len);
|
|
|
ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
|
|
|
"wmi event dfs err_code %d rssi %d tsfl 0x%X tsf64 0x%llX len %d\n",
|
|
|
- event->hdr.phy_err_code, event->hdr.rssi_combined,
|
|
|
- __le32_to_cpu(event->hdr.tsf_timestamp), tsf, buf_len);
|
|
|
+ phyerr->phy_err_code, phyerr->rssi_combined,
|
|
|
+ __le32_to_cpu(phyerr->tsf_timestamp), tsf, buf_len);
|
|
|
|
|
|
/* Skip event if DFS disabled */
|
|
|
if (!config_enabled(CONFIG_ATH10K_DFS_CERTIFIED))
|
|
@@ -1867,9 +1867,9 @@ static void ath10k_wmi_event_dfs(struct ath10k *ar,
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- tlv = (struct phyerr_tlv *)&event->bufp[i];
|
|
|
+ tlv = (struct phyerr_tlv *)&phyerr->buf[i];
|
|
|
tlv_len = __le16_to_cpu(tlv->len);
|
|
|
- tlv_buf = &event->bufp[i + sizeof(*tlv)];
|
|
|
+ tlv_buf = &phyerr->buf[i + sizeof(*tlv)];
|
|
|
ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
|
|
|
"wmi event dfs tlv_len %d tlv_tag 0x%02X tlv_sig 0x%02X\n",
|
|
|
tlv_len, tlv->tag, tlv->sig);
|
|
@@ -1883,7 +1883,7 @@ static void ath10k_wmi_event_dfs(struct ath10k *ar,
|
|
|
}
|
|
|
|
|
|
rr = (struct phyerr_radar_report *)tlv_buf;
|
|
|
- ath10k_dfs_radar_report(ar, event, rr, tsf);
|
|
|
+ ath10k_dfs_radar_report(ar, phyerr, rr, tsf);
|
|
|
break;
|
|
|
case PHYERR_TLV_TAG_SEARCH_FFT_REPORT:
|
|
|
if (i + sizeof(*tlv) + sizeof(*fftr) > buf_len) {
|
|
@@ -1893,7 +1893,7 @@ static void ath10k_wmi_event_dfs(struct ath10k *ar,
|
|
|
}
|
|
|
|
|
|
fftr = (struct phyerr_fft_report *)tlv_buf;
|
|
|
- res = ath10k_dfs_fft_report(ar, event, fftr, tsf);
|
|
|
+ res = ath10k_dfs_fft_report(ar, phyerr, fftr, tsf);
|
|
|
if (res)
|
|
|
return;
|
|
|
break;
|
|
@@ -1905,16 +1905,16 @@ static void ath10k_wmi_event_dfs(struct ath10k *ar,
|
|
|
|
|
|
static void
|
|
|
ath10k_wmi_event_spectral_scan(struct ath10k *ar,
|
|
|
- struct wmi_single_phyerr_rx_event *event,
|
|
|
+ const struct wmi_phyerr *phyerr,
|
|
|
u64 tsf)
|
|
|
{
|
|
|
int buf_len, tlv_len, res, i = 0;
|
|
|
struct phyerr_tlv *tlv;
|
|
|
- u8 *tlv_buf;
|
|
|
- struct phyerr_fft_report *fftr;
|
|
|
+ const void *tlv_buf;
|
|
|
+ const struct phyerr_fft_report *fftr;
|
|
|
size_t fftr_len;
|
|
|
|
|
|
- buf_len = __le32_to_cpu(event->hdr.buf_len);
|
|
|
+ buf_len = __le32_to_cpu(phyerr->buf_len);
|
|
|
|
|
|
while (i < buf_len) {
|
|
|
if (i + sizeof(*tlv) > buf_len) {
|
|
@@ -1923,9 +1923,9 @@ ath10k_wmi_event_spectral_scan(struct ath10k *ar,
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- tlv = (struct phyerr_tlv *)&event->bufp[i];
|
|
|
+ tlv = (struct phyerr_tlv *)&phyerr->buf[i];
|
|
|
tlv_len = __le16_to_cpu(tlv->len);
|
|
|
- tlv_buf = &event->bufp[i + sizeof(*tlv)];
|
|
|
+ tlv_buf = &phyerr->buf[i + sizeof(*tlv)];
|
|
|
|
|
|
if (i + sizeof(*tlv) + tlv_len > buf_len) {
|
|
|
ath10k_warn(ar, "failed to parse phyerr tlv payload at byte %d\n",
|
|
@@ -1942,8 +1942,8 @@ ath10k_wmi_event_spectral_scan(struct ath10k *ar,
|
|
|
}
|
|
|
|
|
|
fftr_len = tlv_len - sizeof(*fftr);
|
|
|
- fftr = (struct phyerr_fft_report *)tlv_buf;
|
|
|
- res = ath10k_spectral_process_fft(ar, event,
|
|
|
+ fftr = tlv_buf;
|
|
|
+ res = ath10k_spectral_process_fft(ar, phyerr,
|
|
|
fftr, fftr_len,
|
|
|
tsf);
|
|
|
if (res < 0) {
|
|
@@ -1960,8 +1960,8 @@ ath10k_wmi_event_spectral_scan(struct ath10k *ar,
|
|
|
|
|
|
static void ath10k_wmi_event_phyerr(struct ath10k *ar, struct sk_buff *skb)
|
|
|
{
|
|
|
- struct wmi_comb_phyerr_rx_event *comb_event;
|
|
|
- struct wmi_single_phyerr_rx_event *event;
|
|
|
+ const struct wmi_phyerr_event *ev;
|
|
|
+ const struct wmi_phyerr *phyerr;
|
|
|
u32 count, i, buf_len, phy_err_code;
|
|
|
u64 tsf;
|
|
|
int left_len = skb->len;
|
|
@@ -1969,38 +1969,38 @@ static void ath10k_wmi_event_phyerr(struct ath10k *ar, struct sk_buff *skb)
|
|
|
ATH10K_DFS_STAT_INC(ar, phy_errors);
|
|
|
|
|
|
/* Check if combined event available */
|
|
|
- if (left_len < sizeof(*comb_event)) {
|
|
|
+ if (left_len < sizeof(*ev)) {
|
|
|
ath10k_warn(ar, "wmi phyerr combined event wrong len\n");
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- left_len -= sizeof(*comb_event);
|
|
|
+ left_len -= sizeof(*ev);
|
|
|
|
|
|
/* Check number of included events */
|
|
|
- comb_event = (struct wmi_comb_phyerr_rx_event *)skb->data;
|
|
|
- count = __le32_to_cpu(comb_event->hdr.num_phyerr_events);
|
|
|
+ ev = (const struct wmi_phyerr_event *)skb->data;
|
|
|
+ count = __le32_to_cpu(ev->num_phyerrs);
|
|
|
|
|
|
- tsf = __le32_to_cpu(comb_event->hdr.tsf_u32);
|
|
|
+ tsf = __le32_to_cpu(ev->tsf_u32);
|
|
|
tsf <<= 32;
|
|
|
- tsf |= __le32_to_cpu(comb_event->hdr.tsf_l32);
|
|
|
+ tsf |= __le32_to_cpu(ev->tsf_l32);
|
|
|
|
|
|
ath10k_dbg(ar, ATH10K_DBG_WMI,
|
|
|
"wmi event phyerr count %d tsf64 0x%llX\n",
|
|
|
count, tsf);
|
|
|
|
|
|
- event = (struct wmi_single_phyerr_rx_event *)comb_event->bufp;
|
|
|
+ phyerr = ev->phyerrs;
|
|
|
for (i = 0; i < count; i++) {
|
|
|
/* Check if we can read event header */
|
|
|
- if (left_len < sizeof(*event)) {
|
|
|
+ if (left_len < sizeof(*phyerr)) {
|
|
|
ath10k_warn(ar, "single event (%d) wrong head len\n",
|
|
|
i);
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- left_len -= sizeof(*event);
|
|
|
+ left_len -= sizeof(*phyerr);
|
|
|
|
|
|
- buf_len = __le32_to_cpu(event->hdr.buf_len);
|
|
|
- phy_err_code = event->hdr.phy_err_code;
|
|
|
+ buf_len = __le32_to_cpu(phyerr->buf_len);
|
|
|
+ phy_err_code = phyerr->phy_err_code;
|
|
|
|
|
|
if (left_len < buf_len) {
|
|
|
ath10k_warn(ar, "single event (%d) wrong buf len\n", i);
|
|
@@ -2011,20 +2011,20 @@ static void ath10k_wmi_event_phyerr(struct ath10k *ar, struct sk_buff *skb)
|
|
|
|
|
|
switch (phy_err_code) {
|
|
|
case PHY_ERROR_RADAR:
|
|
|
- ath10k_wmi_event_dfs(ar, event, tsf);
|
|
|
+ ath10k_wmi_event_dfs(ar, phyerr, tsf);
|
|
|
break;
|
|
|
case PHY_ERROR_SPECTRAL_SCAN:
|
|
|
- ath10k_wmi_event_spectral_scan(ar, event, tsf);
|
|
|
+ ath10k_wmi_event_spectral_scan(ar, phyerr, tsf);
|
|
|
break;
|
|
|
case PHY_ERROR_FALSE_RADAR_EXT:
|
|
|
- ath10k_wmi_event_dfs(ar, event, tsf);
|
|
|
- ath10k_wmi_event_spectral_scan(ar, event, tsf);
|
|
|
+ ath10k_wmi_event_dfs(ar, phyerr, tsf);
|
|
|
+ ath10k_wmi_event_spectral_scan(ar, phyerr, tsf);
|
|
|
break;
|
|
|
default:
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
- event += sizeof(*event) + buf_len;
|
|
|
+ phyerr = (void *)phyerr + sizeof(*phyerr) + buf_len;
|
|
|
}
|
|
|
}
|
|
|
|