int mt7615_mac_fill_rx(struct mt7615_dev *dev, struct sk_buff *skb)
{
struct mt76_rx_status *status = (struct mt76_rx_status *)skb->cb;
+ struct mt76_phy *mphy = &dev->mt76.phy;
+ struct mt7615_phy *phy = &dev->phy;
struct ieee80211_supported_band *sband;
struct ieee80211_hdr *hdr;
__le32 *rxd = (__le32 *)skb->data;
u32 rxd2 = le32_to_cpu(rxd[2]);
bool unicast, remove_pad, insert_ccmp_hdr = false;
int i, idx;
+ u8 chfreq;
+
+ memset(status, 0, sizeof(*status));
- if (!test_bit(MT76_STATE_RUNNING, &dev->mphy.state))
+ chfreq = FIELD_GET(MT_RXD1_NORMAL_CH_FREQ, rxd1);
+ if (!(chfreq & MT_CHFREQ_VALID))
return -EINVAL;
- memset(status, 0, sizeof(*status));
+ if (chfreq & MT_CHFREQ_DBDC_IDX) {
+ mphy = dev->mt76.phy2;
+ if (!mphy)
+ return -EINVAL;
+
+ phy = mphy->priv;
+ status->ext_phy = true;
+ }
+
+ if ((chfreq & MT_CHFREQ_SEQ) != phy->chfreq_seq)
+ return -EINVAL;
+
+ if (!test_bit(MT76_STATE_RUNNING, &mphy->state))
+ return -EINVAL;
unicast = (rxd1 & MT_RXD1_NORMAL_ADDR_TYPE) == MT_RXD1_NORMAL_U2M;
idx = FIELD_GET(MT_RXD2_NORMAL_WLAN_IDX, rxd2);
spin_unlock_bh(&dev->sta_poll_lock);
}
- /* TODO: properly support DBDC */
- status->freq = dev->mphy.chandef.chan->center_freq;
- status->band = dev->mphy.chandef.chan->band;
+ status->freq = mphy->chandef.chan->center_freq;
+ status->band = mphy->chandef.chan->band;
if (status->band == NL80211_BAND_5GHZ)
- sband = &dev->mphy.sband_5g.sband;
+ sband = &mphy->sband_5g.sband;
else
- sband = &dev->mphy.sband_2g.sband;
+ sband = &mphy->sband_2g.sband;
if (rxd2 & MT_RXD2_NORMAL_FCS_ERR)
status->flag |= RX_FLAG_FAILED_FCS_CRC;
status->flag |= RX_FLAG_AMPDU_DETAILS;
/* all subframes of an A-MPDU have the same timestamp */
- if (dev->rx_ampdu_ts != rxd[12]) {
- if (!++dev->ampdu_ref)
- dev->ampdu_ref++;
+ if (phy->rx_ampdu_ts != rxd[12]) {
+ if (!++phy->ampdu_ref)
+ phy->ampdu_ref++;
}
- dev->rx_ampdu_ts = rxd[12];
+ phy->rx_ampdu_ts = rxd[12];
- status->ampdu_ref = dev->ampdu_ref;
+ status->ampdu_ref = phy->ampdu_ref;
}
remove_pad = rxd1 & MT_RXD1_NORMAL_HDR_OFFSET;
static int mt7615_set_channel(struct mt7615_phy *phy)
{
struct mt7615_dev *dev = phy->dev;
+ bool ext_phy = phy != &dev->phy;
int ret;
cancel_delayed_work_sync(&dev->mt76.mac_work);
mutex_lock(&dev->mt76.mutex);
set_bit(MT76_RESET, &phy->mt76->state);
+ phy->chfreq_seq = (phy->chfreq_seq + 1) & MT_CHFREQ_SEQ;
phy->dfs_state = -1;
mt76_set_channel(phy->mt76);
if (ret)
goto out;
+ mt76_wr(dev, MT_CHFREQ(ext_phy),
+ MT_CHFREQ_VALID |
+ (ext_phy * MT_CHFREQ_DBDC_IDX) |
+ phy->chfreq_seq);
+
ret = mt7615_dfs_init_radar_detector(phy);
mt7615_mac_cca_stats_reset(phy);