mt7921: enable rx offloads
Subsystems (2)
Lorenzo Bianconi
maintainercover mt7921: enable rx offloads
Enable the following rx offloads:
- hw rx de-amsdu offload
- rx header traslation offload
- rx csum offload
Lorenzo Bianconi (4):
mt76: mt7921: enable rx hw de-amsdu
mt76: connac: add missing configuration in
mt76_connac_mcu_wtbl_hdr_trans_tlv
mt76: mt7921: enable rx header traslation offload
mt76: mt7921: enable rx csum offload
.../net/wireless/mediatek/mt76/mt7615/mcu.c | 8 +-- .../wireless/mediatek/mt76/mt76_connac_mcu.c | 40 +++++++++++ .../wireless/mediatek/mt76/mt76_connac_mcu.h | 4 ++ .../net/wireless/mediatek/mt76/mt7921/init.c | 9 ++- .../net/wireless/mediatek/mt76/mt7921/mac.c | 70 +++++++++++++++---- .../net/wireless/mediatek/mt76/mt7921/mac.h | 14 ++++ .../net/wireless/mediatek/mt76/mt7921/main.c | 18 +++++ 7 files changed, 141 insertions(+), 22 deletions(-)
Signature · 1 line
2.30.2
Lorenzo Bianconi
maintainerPATCH 1/4 mt76: mt7921: enable rx hw de-amsdu
Enable hw rx-amsdu de-aggregation support available in 7921 devices. This is a preliminary patch to enable rx checksum offload.
--- drivers/net/wireless/mediatek/mt76/mt7921/init.c | 4 ++-- drivers/net/wireless/mediatek/mt76/mt7921/mac.c | 16 +++++++++++++++- drivers/net/wireless/mediatek/mt76/mt7921/mac.h | 3 +++ 3 files changed, 20 insertions(+), 3 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7921/init.c +2 -2
@@ -125,8 +125,8 @@ void mt7921_mac_init(struct mt7921_dev *dev)int i;mt76_rmw_field (dev,MT_MDP_DCR1 ,MT_MDP_DCR1_MAX_RX_LEN ,1536 ); -/* disable hardware de-agg */ -mt76_clear (dev,MT_MDP_DCR0 ,MT_MDP_DCR0_DAMSDU_EN ); +/* enable hardware de-agg */ +mt76_set (dev,MT_MDP_DCR0 ,MT_MDP_DCR0_DAMSDU_EN );mt76_clear (dev,MT_MDP_DCR0 ,MT_MDP_DCR0_RX_HDR_TRANS_EN );for (i =0 ; i <MT7921_WTBL_SIZE ; i++)
drivers/net/wireless/mediatek/mt76/mt7921/mac.c +15 -1
@@ -319,8 +319,9 @@ int mt7921_mac_fill_rx(struct mt7921_dev *dev, struct sk_buff *skb)u32 rxd1 =le32_to_cpu (rxd[1 ]);u32 rxd2 =le32_to_cpu (rxd[2 ]);u32 rxd3 =le32_to_cpu (rxd[3 ]); +u32 rxd4 =le32_to_cpu (rxd[4 ]);bool unicast, insert_ccmp_hdr = false; -u8 remove_pad; +u8 remove_pad, amsdu_info;int i, idx;u8 chfreq;
@@ -332,6 +333,9 @@ int mt7921_mac_fill_rx(struct mt7921_dev *dev, struct sk_buff *skb)if (!test_bit (MT76_STATE_RUNNING , &mphy->state))return -EINVAL ; +if (rxd2 &MT_RXD2_NORMAL_AMSDU_ERR ) +return -EINVAL ; + chfreq =FIELD_GET (MT_RXD3_NORMAL_CH_FREQ , rxd3); unicast =FIELD_GET (MT_RXD3_NORMAL_ADDR_TYPE , rxd3) ==MT_RXD3_NORMAL_U2M ; idx =FIELD_GET (MT_RXD1_NORMAL_WLAN_IDX , rxd1);
@@ -540,6 +544,16 @@ int mt7921_mac_fill_rx(struct mt7921_dev *dev, struct sk_buff *skb)skb_pull (skb, (u8 *)rxd - skb->data +2 * remove_pad); + amsdu_info =FIELD_GET (MT_RXD4_NORMAL_PAYLOAD_FORMAT , rxd4); + status->amsdu = !!amsdu_info; +if (status->amsdu) { + status->first_amsdu = amsdu_info ==MT_RXD4_FIRST_AMSDU_FRAME ; + status->last_amsdu = amsdu_info ==MT_RXD4_LAST_AMSDU_FRAME ; +memmove (skb->data +2 , skb->data, +ieee80211_get_hdrlen_from_skb (skb)); +skb_pull (skb,2 ); + } +if (insert_ccmp_hdr) {u8 key_id =FIELD_GET (MT_RXD1_NORMAL_KEY_ID , rxd1);
drivers/net/wireless/mediatek/mt76/mt7921/mac.h +3 -0
@@ -88,6 +88,9 @@ enum rx_pkt_type {/* RXD DW4 */ #define MT_RXD4_NORMAL_PAYLOAD_FORMAT GENMASK(1, 0) +#define MT_RXD4_FIRST_AMSDU_FRAME GENMASK(1, 0) +#define MT_RXD4_MID_AMSDU_FRAME BIT(1) +#define MT_RXD4_LAST_AMSDU_FRAME BIT(0)#define MT_RXD4_NORMAL_PATTERN_DROP BIT(9)#define MT_RXD4_NORMAL_CLS BIT(10)#define MT_RXD4_NORMAL_OFLD GENMASK(12, 11)
Signature · 1 line
2.30.2
Lorenzo Bianconi
maintainerPATCH 2/4 mt76: connac: add missing configuration in mt76_connac_mcu_wtbl_hdr_trans_tlv
In reply to Lorenzo BianconiAdd missing configuration parameters in mt76_connac_mcu_wtbl_hdr_trans_tlv routine
--- drivers/net/wireless/mediatek/mt76/mt7615/mcu.c | 8 ++++---- drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c | 11 +++++++++++ drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h | 1 + 3 files changed, 16 insertions(+), 4 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c +4 -4
@@ -1037,8 +1037,8 @@ mt7615_mcu_wtbl_sta_add(struct mt7615_phy *phy, struct ieee80211_vif *vif,if (sta)mt76_connac_mcu_wtbl_ht_tlv (&dev->mt76, wskb, sta,NULL , wtbl_hdr); -mt76_connac_mcu_wtbl_hdr_trans_tlv (wskb, &msta->wcid,NULL , - wtbl_hdr); +mt76_connac_mcu_wtbl_hdr_trans_tlv (wskb, vif, &msta->wcid, +NULL , wtbl_hdr); } cmd = enable ?MCU_EXT_CMD_WTBL_UPDATE :MCU_EXT_CMD_STA_REC_UPDATE ;
@@ -1167,8 +1167,8 @@ int mt7615_mcu_sta_update_hdr_trans(struct mt7615_dev *dev,if (IS_ERR (wtbl_hdr))return PTR_ERR (wtbl_hdr); -mt76_connac_mcu_wtbl_hdr_trans_tlv (skb, &msta->wcid,NULL , wtbl_hdr); - +mt76_connac_mcu_wtbl_hdr_trans_tlv (skb, vif, &msta->wcid,NULL , + wtbl_hdr);return mt76_mcu_skb_send_msg (&dev->mt76, skb,MCU_EXT_CMD_WTBL_UPDATE , true); }
drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c +11 -0
@@ -393,6 +393,7 @@ mt76_connac_mcu_sta_uapsd(struct sk_buff *skb, struct ieee80211_vif *vif, }void mt76_connac_mcu_wtbl_hdr_trans_tlv (struct sk_buff *skb, +struct ieee80211_vif *vif,struct mt76_wcid *wcid,void *sta_wtbl,void *wtbl_tlv) {
@@ -404,6 +405,16 @@ void mt76_connac_mcu_wtbl_hdr_trans_tlv(struct sk_buff *skb, wtbl_tlv, sta_wtbl); htr = (struct wtbl_hdr_trans *)tlv; htr->no_rx_trans = !test_bit (MT_WCID_FLAG_HDR_TRANS , &wcid->flags); + +if (vif->type ==NL80211_IFTYPE_STATION ) + htr->to_ds = true; +else + htr->from_ds = true; + +if (test_bit (MT_WCID_FLAG_4ADDR , &wcid->flags)) { + htr->to_ds = true; + htr->from_ds = true; + } }EXPORT_SYMBOL_GPL (mt76_connac_mcu_wtbl_hdr_trans_tlv);
drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h +1 -0
@@ -969,6 +969,7 @@ void mt76_connac_mcu_wtbl_generic_tlv(struct mt76_dev *dev, struct sk_buff *skb, struct ieee80211_sta *sta, void *sta_wtbl, void *wtbl_tlv);void mt76_connac_mcu_wtbl_hdr_trans_tlv (struct sk_buff *skb, +struct ieee80211_vif *vif,struct mt76_wcid *wcid,void *sta_wtbl,void *wtbl_tlv); void mt76_connac_mcu_sta_tlv(struct mt76_phy *mphy, struct sk_buff *skb,
Signature · 1 line
2.30.2
Lorenzo Bianconi
maintainerPATCH 3/4 mt76: mt7921: enable rx header traslation offload
In reply to Lorenzo BianconiAs already done for mt7615 and mt7915, enable rx header translation offload for mt7921 in order to reduce cpu load in the rx path.
--- .../wireless/mediatek/mt76/mt76_connac_mcu.c | 29 +++++++++++ .../wireless/mediatek/mt76/mt76_connac_mcu.h | 3 ++ .../net/wireless/mediatek/mt76/mt7921/init.c | 4 +- .../net/wireless/mediatek/mt76/mt7921/mac.c | 52 +++++++++++++------ .../net/wireless/mediatek/mt76/mt7921/mac.h | 11 ++++ .../net/wireless/mediatek/mt76/mt7921/main.c | 18 +++++++ 6 files changed, 101 insertions(+), 16 deletions(-)
drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c +29 -0
@@ -418,6 +418,33 @@ void mt76_connac_mcu_wtbl_hdr_trans_tlv(struct sk_buff *skb, }EXPORT_SYMBOL_GPL (mt76_connac_mcu_wtbl_hdr_trans_tlv); +int mt76_connac_mcu_sta_update_hdr_trans (struct mt76_dev *dev, +struct ieee80211_vif *vif, +struct mt76_wcid *wcid,int cmd) +{ +struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv; +struct wtbl_req_hdr *wtbl_hdr; +struct tlv *sta_wtbl; +struct sk_buff *skb; + + skb =mt76_connac_mcu_alloc_sta_req (dev, mvif, wcid); +if (IS_ERR (skb)) +return PTR_ERR (skb); + + sta_wtbl =mt76_connac_mcu_add_tlv (skb,STA_REC_WTBL , +sizeof (struct tlv )); + + wtbl_hdr =mt76_connac_mcu_alloc_wtbl_req (dev, wcid,WTBL_SET , + sta_wtbl, &skb); +if (IS_ERR (wtbl_hdr)) +return PTR_ERR (wtbl_hdr); + +mt76_connac_mcu_wtbl_hdr_trans_tlv (skb, vif, wcid, sta_wtbl, wtbl_hdr); + +return mt76_mcu_skb_send_msg (dev, skb, cmd, true); +} +EXPORT_SYMBOL_GPL (mt76_connac_mcu_sta_update_hdr_trans); + void mt76_connac_mcu_wtbl_generic_tlv(struct mt76_dev *dev, struct sk_buff *skb, struct ieee80211_vif *vif,
@@ -866,6 +893,8 @@ int mt76_connac_mcu_add_sta_cmd(struct mt76_phy *phy,mt76_connac_mcu_wtbl_generic_tlv (dev, skb, info->vif, info->sta, sta_wtbl, wtbl_hdr); +mt76_connac_mcu_wtbl_hdr_trans_tlv (skb, info->vif, info->wcid, + sta_wtbl, wtbl_hdr);if (info->sta)mt76_connac_mcu_wtbl_ht_tlv (dev, skb, info->sta, sta_wtbl, wtbl_hdr);
drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h +3 -0
@@ -972,6 +972,9 @@ void mt76_connac_mcu_wtbl_hdr_trans_tlv(struct sk_buff *skb,struct ieee80211_vif *vif, struct mt76_wcid *wcid, void *sta_wtbl, void *wtbl_tlv); +int mt76_connac_mcu_sta_update_hdr_trans (struct mt76_dev *dev, +struct ieee80211_vif *vif, +struct mt76_wcid *wcid,int cmd); void mt76_connac_mcu_sta_tlv(struct mt76_phy *mphy, struct sk_buff *skb, struct ieee80211_sta *sta, struct ieee80211_vif *vif,
drivers/net/wireless/mediatek/mt76/mt7921/init.c +3 -1
@@ -78,6 +78,7 @@ mt7921_init_wiphy(struct ieee80211_hw *hw)ieee80211_hw_set (hw,SINGLE_SCAN_ON_ALL_BANDS );ieee80211_hw_set (hw,HAS_RATE_CONTROL );ieee80211_hw_set (hw,SUPPORTS_TX_ENCAP_OFFLOAD ); +ieee80211_hw_set (hw,SUPPORTS_RX_DECAP_OFFLOAD );ieee80211_hw_set (hw,WANT_MONITOR_VIF );ieee80211_hw_set (hw,SUPPORTS_PS );ieee80211_hw_set (hw,SUPPORTS_DYNAMIC_PS );
@@ -127,7 +128,8 @@ void mt7921_mac_init(struct mt7921_dev *dev)mt76_rmw_field (dev,MT_MDP_DCR1 ,MT_MDP_DCR1_MAX_RX_LEN ,1536 );/* enable hardware de-agg */ mt76_set (dev,MT_MDP_DCR0 ,MT_MDP_DCR0_DAMSDU_EN ); -mt76_clear (dev,MT_MDP_DCR0 ,MT_MDP_DCR0_RX_HDR_TRANS_EN ); +/* enable hardware rx header translation */ +mt76_set (dev,MT_MDP_DCR0 ,MT_MDP_DCR0_RX_HDR_TRANS_EN );for (i =0 ; i <MT7921_WTBL_SIZE ; i++) mt7921_mac_wtbl_update(dev, i,
drivers/net/wireless/mediatek/mt76/mt7921/mac.c +37 -15
94 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7921/mac.h +11 -0
@@ -100,6 +100,17 @@ enum rx_pkt_type {#define MT_RXD3_NORMAL_PF_MODE BIT(29)#define MT_RXD3_NORMAL_PF_STS GENMASK(31, 30) +/* RXD GROUP4 */ +#define MT_RXD6_FRAME_CONTROL GENMASK(15, 0) +#define MT_RXD6_TA_LO GENMASK(31, 16) + +#define MT_RXD7_TA_HI GENMASK(31, 0) + +#define MT_RXD8_SEQ_CTRL GENMASK(15, 0) +#define MT_RXD8_QOS_CTL GENMASK(31, 16) + +#define MT_RXD9_HT_CONTROL GENMASK(31, 0) +/* P-RXV DW0 */ #define MT_PRXV_TX_RATE GENMASK(6, 0)#define MT_PRXV_TX_DCM BIT(4)
drivers/net/wireless/mediatek/mt76/mt7921/main.c +18 -0
@@ -1164,6 +1164,23 @@ static void mt7921_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif, HZ / 2); } +static void mt7921_sta_set_decap_offload (struct ieee80211_hw *hw, +struct ieee80211_vif *vif, +struct ieee80211_sta *sta, +bool enabled) +{ +struct mt7921_sta *msta = (struct mt7921_sta *)sta->drv_priv; +struct mt7921_dev *dev =mt7921_hw_dev (hw); + +if (enabled) +set_bit (MT_WCID_FLAG_HDR_TRANS , &msta->wcid.flags); +else +clear_bit (MT_WCID_FLAG_HDR_TRANS , &msta->wcid.flags); + +mt76_connac_mcu_sta_update_hdr_trans (&dev->mt76, vif, &msta->wcid, +MCU_UNI_CMD_STA_REC_UPDATE ); +} +const struct ieee80211_ops mt7921_ops = { .tx = mt7921_tx, .start = mt7921_start,
@@ -1178,6 +1195,7 @@ const struct ieee80211_ops mt7921_ops = { .sta_remove = mt7921_sta_remove, .sta_pre_rcu_remove = mt76_sta_pre_rcu_remove, .set_key = mt7921_set_key, + .sta_set_decap_offload = mt7921_sta_set_decap_offload, .ampdu_action = mt7921_ampdu_action, .set_rts_threshold = mt7921_set_rts_threshold, .wake_tx_queue = mt76_wake_tx_queue,
Signature · 1 line
2.30.2
Lorenzo Bianconi
maintainerPATCH 4/4 mt76: mt7921: enable rx csum offload
In reply to Lorenzo BianconiAs already done for mt7615 and mt7915, enable hw rx checksum offload.
--- drivers/net/wireless/mediatek/mt76/mt7921/init.c | 1 + drivers/net/wireless/mediatek/mt76/mt7921/mac.c | 10 +++++++--- 2 files changed, 8 insertions(+), 3 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7921/init.c +1 -0
@@ -50,6 +50,7 @@ mt7921_init_wiphy(struct ieee80211_hw *hw) hw->queues =4 ; hw->max_rx_aggregation_subframes =IEEE80211_MAX_AMPDU_BUF ; hw->max_tx_aggregation_subframes =IEEE80211_MAX_AMPDU_BUF ; + hw->netdev_features =NETIF_F_RXCSUM ; hw->radiotap_timestamp.units_pos =IEEE80211_RADIOTAP_TIMESTAMP_UNIT_US ;
drivers/net/wireless/mediatek/mt76/mt7921/mac.c +7 -3
@@ -308,22 +308,23 @@ mt7921_mac_assoc_rssi(struct mt7921_dev *dev, struct sk_buff *skb)int mt7921_mac_fill_rx (struct mt7921_dev *dev,struct sk_buff *skb) { +u32 csum_mask =MT_RXD0_NORMAL_IP_SUM |MT_RXD0_NORMAL_UDP_TCP_SUM ;struct mt76_rx_status *status = (struct mt76_rx_status *)skb->cb;bool hdr_trans, unicast, insert_ccmp_hdr = false;u8 chfreq, qos_ctl =0 , remove_pad, amsdu_info; +__le32 *rxv =NULL , *rxd = (__le32 *)skb->data;struct mt76_phy *mphy = &dev->mt76.phy;struct mt7921_phy *phy = &dev->phy;struct ieee80211_supported_band *sband;struct ieee80211_hdr *hdr; -__le32 *rxd = (__le32 *)skb->data; -__le32 *rxv =NULL ; -u32 mode =0 ; +u32 rxd0 =le32_to_cpu (rxd[0 ]);u32 rxd1 =le32_to_cpu (rxd[1 ]);u32 rxd2 =le32_to_cpu (rxd[2 ]);u32 rxd3 =le32_to_cpu (rxd[3 ]);u32 rxd4 =le32_to_cpu (rxd[4 ]);u16 seq_ctrl =0 ;__le16 fc =0 ; +u32 mode =0 ;int i, idx;memset (status,0 ,sizeof (*status));
@@ -363,6 +364,9 @@ int mt7921_mac_fill_rx(struct mt7921_dev *dev, struct sk_buff *skb)if (!sband->channels)return -EINVAL ; +if ((rxd0 & csum_mask) == csum_mask) + skb->ip_summed =CHECKSUM_UNNECESSARY ; +if (rxd1 &MT_RXD1_NORMAL_FCS_ERR ) status->flag |=RX_FLAG_FAILED_FCS_CRC ;
Signature · 1 line
2.30.2