mt7615: add BIP_CMAC_128 hw support
Subsystems (2)
Lorenzo Bianconi
maintainercover mt7615: add BIP_CMAC_128 hw support
Introduce mt7615_mac_wtbl_set_key routine to configure wtbl key parameter directly from host cpu.
Introduce mt76_mmio_read_copy routine and related function pointer Enable hw support for BIP_CMAC_128 cipher
The series has been tested using aircrack-ng deauthentication attack Please note this series is based on:
'mac80211: add IEEE80211_KEY_FLAG_PUT_MMIE_SPACE to ieee80211_key_flags'
https://patchwork.kernel.org/patch/11043031/
Lorenzo Bianconi (7):
mt76: mt7615: move mt7615_mac_get_key_info in mac.c
mt76: mt7615: add mt7615_mac_wtbl_addr routine
mt76: mt7615: introduce mt7615_mac_wtbl_set_key routine
mt76: mt7615: remove wtbl_sec_key definition
mt76: mt7615: add set_key_cmd and mt76_wcid to mt7615_mac_wtbl_set_key
signature
mt76: intorduce mt76_mmio_read_copy routine
mt76: mt7615: add BIP_CMAC_128 cipher support
drivers/net/wireless/mediatek/mt76/mac80211.c | 5 +- drivers/net/wireless/mediatek/mt76/mmio.c | 13 +- drivers/net/wireless/mediatek/mt76/mt76.h | 13 +- .../net/wireless/mediatek/mt76/mt7615/mac.c | 190 +++++++++++++++++- .../net/wireless/mediatek/mt76/mt7615/mac.h | 15 ++ .../net/wireless/mediatek/mt76/mt7615/main.c | 15 +- .../net/wireless/mediatek/mt76/mt7615/mcu.c | 72 ------- .../net/wireless/mediatek/mt76/mt7615/mcu.h | 29 --- .../wireless/mediatek/mt76/mt7615/mt7615.h | 6 +- .../net/wireless/mediatek/mt76/mt7615/regs.h | 10 + drivers/net/wireless/mediatek/mt76/usb.c | 2 +- 11 files changed, 242 insertions(+), 128 deletions(-)
Signature · 1 line
2.21.0
Lorenzo Bianconi
maintainerPATCH 1/7 mt76: mt7615: move mt7615_mac_get_key_info in mac.c
This is a preliminary patch to update wtbl key directly from host processor
--- .../net/wireless/mediatek/mt76/mt7615/mac.c | 35 +++++++++++++++++++ .../net/wireless/mediatek/mt76/mt7615/mac.h | 19 ++++++++++ .../net/wireless/mediatek/mt76/mt7615/mcu.c | 35 +------------------ .../net/wireless/mediatek/mt76/mt7615/mcu.h | 15 -------- 4 files changed, 55 insertions(+), 49 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7615/mac.c +35 -0
@@ -586,6 +586,41 @@ void mt7615_mac_set_rates(struct mt7615_dev *dev, struct mt7615_sta *sta, sta->rate_count =2 *MT7615_RATE_RETRY * n_rates; sta->wcid.tx_info |=MT_WCID_TX_INFO_SET ; } + +enum mt7615_cipher_type +mt7615_mac_get_key_info (struct ieee80211_key_conf *key, +u8 *key_data) +{ +if (!key || key->keylen >32 ) +return MT_CIPHER_NONE ; + +memcpy (key_data, key->key, key->keylen); + +switch (key->cipher) { +case WLAN_CIPHER_SUITE_WEP40 : +return MT_CIPHER_WEP40 ; +case WLAN_CIPHER_SUITE_WEP104 : +return MT_CIPHER_WEP104 ; +case WLAN_CIPHER_SUITE_TKIP : +/* Rx/Tx MIC keys are swapped */ +memcpy (key_data +16 , key->key +24 ,8 ); +memcpy (key_data +24 , key->key +16 ,8 ); +return MT_CIPHER_TKIP ; +case WLAN_CIPHER_SUITE_CCMP : +return MT_CIPHER_AES_CCMP ; +case WLAN_CIPHER_SUITE_CCMP_256 : +return MT_CIPHER_CCMP_256 ; +case WLAN_CIPHER_SUITE_GCMP : +return MT_CIPHER_GCMP ; +case WLAN_CIPHER_SUITE_GCMP_256 : +return MT_CIPHER_GCMP_256 ; +case WLAN_CIPHER_SUITE_SMS4 : +return MT_CIPHER_WAPI ; +default : +return MT_CIPHER_NONE ; + } +} + int mt7615_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr, enum mt76_txq_id qid, struct mt76_wcid *wcid, struct ieee80211_sta *sta,
drivers/net/wireless/mediatek/mt76/mt7615/mac.h +19 -0
@@ -302,4 +302,23 @@ struct mt7615_tx_free {#define MT_TXS6_F1_RCPI_1 GENMASK(15, 8)#define MT_TXS6_F1_RCPI_0 GENMASK(7, 0) +enum mt7615_cipher_type { +MT_CIPHER_NONE , +MT_CIPHER_WEP40 , +MT_CIPHER_TKIP , +MT_CIPHER_TKIP_NO_MIC , +MT_CIPHER_AES_CCMP , +MT_CIPHER_WEP104 , +MT_CIPHER_BIP_CMAC_128 , +MT_CIPHER_WEP128 , +MT_CIPHER_WAPI , +MT_CIPHER_CCMP_256 =10 , +MT_CIPHER_GCMP , +MT_CIPHER_GCMP_256 , +}; + +enum mt7615_cipher_type +mt7615_mac_get_key_info (struct ieee80211_key_conf *key, +u8 *key_data); +#endif
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c +1 -34
@@ -877,39 +877,6 @@ int mt7615_mcu_set_bss_info(struct mt7615_dev *dev,return ret; } -static enum mt7615_cipher_type -mt7615_get_key_info (struct ieee80211_key_conf *key,u8 *key_data) -{ -if (!key || key->keylen >32 ) -return MT_CIPHER_NONE ; - -memcpy (key_data, key->key, key->keylen); - -switch (key->cipher) { -case WLAN_CIPHER_SUITE_WEP40 : -return MT_CIPHER_WEP40 ; -case WLAN_CIPHER_SUITE_WEP104 : -return MT_CIPHER_WEP104 ; -case WLAN_CIPHER_SUITE_TKIP : -/* Rx/Tx MIC keys are swapped */ -memcpy (key_data +16 , key->key +24 ,8 ); -memcpy (key_data +24 , key->key +16 ,8 ); -return MT_CIPHER_TKIP ; -case WLAN_CIPHER_SUITE_CCMP : -return MT_CIPHER_AES_CCMP ; -case WLAN_CIPHER_SUITE_CCMP_256 : -return MT_CIPHER_CCMP_256 ; -case WLAN_CIPHER_SUITE_GCMP : -return MT_CIPHER_GCMP ; -case WLAN_CIPHER_SUITE_GCMP_256 : -return MT_CIPHER_GCMP_256 ; -case WLAN_CIPHER_SUITE_SMS4 : -return MT_CIPHER_WAPI ; -default : -return MT_CIPHER_NONE ; - } -} -int mt7615_mcu_set_wtbl_key (struct mt7615_dev *dev,int wcid,struct ieee80211_key_conf *key,enum set_key_cmd cmd)
@@ -933,7 +900,7 @@ int mt7615_mcu_set_wtbl_key(struct mt7615_dev *dev, int wcid,if (cmd ==SET_KEY ) {u8 cipher; - cipher =mt7615_get_key_info (key, req.key.key_material); + cipher =mt7615_mac_get_key_info (key, req.key.key_material);if (cipher ==MT_CIPHER_NONE )return -EOPNOTSUPP ;
drivers/net/wireless/mediatek/mt76/mt7615/mcu.h +0 -15
@@ -288,21 +288,6 @@ struct wtbl_hdr_trans {u8 rsv; } __packed; -enum mt7615_cipher_type { -MT_CIPHER_NONE , -MT_CIPHER_WEP40 , -MT_CIPHER_TKIP , -MT_CIPHER_TKIP_NO_MIC , -MT_CIPHER_AES_CCMP , -MT_CIPHER_WEP104 , -MT_CIPHER_BIP_CMAC_128 , -MT_CIPHER_WEP128 , -MT_CIPHER_WAPI , -MT_CIPHER_CCMP_256 =10 , -MT_CIPHER_GCMP , -MT_CIPHER_GCMP_256 , -}; -struct wtbl_sec_key {__le16 tag;__le16 len;
Signature · 1 line
2.21.0
Lorenzo Bianconi
maintainerPATCH 2/7 mt76: mt7615: add mt7615_mac_wtbl_addr routine
In reply to Lorenzo BianconiIntroduce mt7615_mac_wtbl_addr rouinte to compute sta wtbl address. This is a preliminary patch to update wtbl key directly from host processor
--- drivers/net/wireless/mediatek/mt76/mt7615/mac.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
drivers/net/wireless/mediatek/mt76/mt7615/mac.c +6 -1
@@ -449,13 +449,18 @@ void mt7615_txp_skb_unmap(struct mt76_dev *dev, le16_to_cpu(txp->len[i]), DMA_TO_DEVICE); } +static u32 mt7615_mac_wtbl_addr (int wcid) +{ +return MT_WTBL_BASE + wcid *MT_WTBL_ENTRY_SIZE ; +} +void mt7615_mac_set_rates (struct mt7615_dev *dev,struct mt7615_sta *sta,struct ieee80211_tx_rate *probe_rate,struct ieee80211_tx_rate *rates) {struct ieee80211_tx_rate *ref;int wcid = sta->wcid.idx; -u32 addr =MT_WTBL_BASE + wcid *MT_WTBL_ENTRY_SIZE ; +u32 addr =mt7615_mac_wtbl_addr (wcid);bool stbc = false;int n_rates = sta->n_rates;u8 bw, bw_prev, bw_idx =0 ;
Signature · 1 line
2.21.0
Lorenzo Bianconi
maintainerPATCH 3/7 mt76: mt7615: introduce mt7615_mac_wtbl_set_key routine
In reply to Lorenzo BianconiAdd mt7615_mac_wtbl_set_key routine to configure wtbl key parameter directly from host cpu. This is a preliminary patch to add BIP_CMAC_128 hw support. Moreover add static qualifier to mt7615_mac_get_key_info routine
--- .../net/wireless/mediatek/mt76/mt7615/mac.c | 51 ++++++++++++++++++- .../net/wireless/mediatek/mt76/mt7615/mac.h | 4 -- .../net/wireless/mediatek/mt76/mt7615/main.c | 2 +- .../net/wireless/mediatek/mt76/mt7615/mcu.c | 39 -------------- .../wireless/mediatek/mt76/mt7615/mt7615.h | 5 +- .../net/wireless/mediatek/mt76/mt7615/regs.h | 10 ++++ 6 files changed, 63 insertions(+), 48 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7615/mac.c +50 -1
@@ -592,7 +592,7 @@ void mt7615_mac_set_rates(struct mt7615_dev *dev, struct mt7615_sta *sta, sta->wcid.tx_info |=MT_WCID_TX_INFO_SET ; } -enum mt7615_cipher_type +static enum mt7615_cipher_type mt7615_mac_get_key_info (struct ieee80211_key_conf *key,u8 *key_data) {
@@ -626,6 +626,55 @@ mt7615_mac_get_key_info(struct ieee80211_key_conf *key, } } +int mt7615_mac_wtbl_set_key (struct mt7615_dev *dev,int wcid, +struct ieee80211_key_conf *key) +{ +enum mt7615_cipher_type cipher; +u8 key_data[32 ] = {}; +u32 addr, w0, w1; +int err =0 ; + +spin_lock_bh (&dev->mt76.lock); +if (!mt76_poll (dev,MT_WTBL_UPDATE ,MT_WTBL_UPDATE_BUSY ,0 ,5000 )) { + err = -ETIMEDOUT ; + goto out; + } + + cipher =mt7615_mac_get_key_info (key, key_data); +if (cipher ==MT_CIPHER_NONE && key) { + err = -EOPNOTSUPP ; + goto out; + } + + addr =mt7615_mac_wtbl_addr (wcid); + +mt76_wr_copy (dev, addr +30 *4 , key_data,sizeof (key_data)); + +mt76_rmw (dev, addr +2 *4 ,MT_WTBL_W2_KEY_TYPE , +FIELD_PREP (MT_WTBL_W2_KEY_TYPE , cipher)); + + w0 =mt76_rr (dev, addr); + w1 =mt76_rr (dev, addr +4 ); + w0 &= ~(MT_WTBL_W0_KEY_IDX |MT_WTBL_W0_RX_KEY_VALID ); +if (key) + w0 |=FIELD_PREP (MT_WTBL_W0_KEY_IDX , key->keyidx) | +MT_WTBL_W0_RX_KEY_VALID ; +mt76_wr (dev,MT_WTBL_RICR0 , w0); +mt76_wr (dev,MT_WTBL_RICR1 , w1); + +mt76_wr (dev,MT_WTBL_UPDATE , +FIELD_PREP (MT_WTBL_UPDATE_WLAN_IDX , wcid) | +MT_WTBL_UPDATE_RXINFO_UPDATE ); + +if (!mt76_poll (dev,MT_WTBL_UPDATE ,MT_WTBL_UPDATE_BUSY ,0 ,5000 )) + err = -ETIMEDOUT ; + +out: +spin_unlock_bh (&dev->mt76.lock); + +return err; +} + int mt7615_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr, enum mt76_txq_id qid, struct mt76_wcid *wcid, struct ieee80211_sta *sta,
drivers/net/wireless/mediatek/mt76/mt7615/mac.h +0 -4
@@ -317,8 +317,4 @@ enum mt7615_cipher_type { MT_CIPHER_GCMP_256, }; -enum mt7615_cipher_type -mt7615_mac_get_key_info (struct ieee80211_key_conf *key, -u8 *key_data); -#endif
drivers/net/wireless/mediatek/mt76/mt7615/main.c +1 -1
@@ -204,7 +204,7 @@ static int mt7615_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd, }mt76_wcid_key_setup (&dev->mt76, wcid, key); -return mt7615_mcu_set_wtbl_key (dev, wcid->idx, key, cmd); +return mt7615_mac_wtbl_set_key (dev, wcid->idx, key); }static int mt7615_config (struct ieee80211_hw *hw,u32 changed)
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c +0 -39
@@ -877,45 +877,6 @@ int mt7615_mcu_set_bss_info(struct mt7615_dev *dev,return ret; } -int mt7615_mcu_set_wtbl_key (struct mt7615_dev *dev,int wcid, -struct ieee80211_key_conf *key, -enum set_key_cmd cmd) -{ -struct { -struct wtbl_req_hdr hdr; -struct wtbl_sec_key key; - } req = { - .hdr = { - .wlan_idx = wcid, - .operation =WTBL_SET , - .tlv_num =cpu_to_le16 (1 ), - }, - .key = { - .tag =cpu_to_le16 (WTBL_SEC_KEY ), - .len =cpu_to_le16 (sizeof (struct wtbl_sec_key )), - .add = cmd, - }, - }; - -if (cmd ==SET_KEY ) { -u8 cipher; - - cipher =mt7615_mac_get_key_info (key, req.key.key_material); -if (cipher ==MT_CIPHER_NONE ) -return -EOPNOTSUPP ; - - req.key.rkv =1 ; - req.key.cipher_id = cipher; - req.key.key_id = key->keyidx; - req.key.key_len = key->keylen; - }else { - req.key.key_len =sizeof (req.key.key_material); - } - -return __mt76_mcu_send_msg (&dev->mt76,MCU_EXT_CMD_WTBL_UPDATE , - &req,sizeof (req), true); -} -static int mt7615_mcu_add_wtbl_bmc (struct mt7615_dev *dev,struct mt7615_vif *mvif)
drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h +2 -3
@@ -157,9 +157,6 @@ int mt7615_mcu_set_dev_info(struct mt7615_dev *dev, struct ieee80211_vif *vif, bool enable);int mt7615_mcu_set_bss_info (struct mt7615_dev *dev,struct ieee80211_vif *vif,int en); -int mt7615_mcu_set_wtbl_key (struct mt7615_dev *dev,int wcid, -struct ieee80211_key_conf *key, -enum set_key_cmd cmd);void mt7615_mac_set_rates (struct mt7615_dev *dev,struct mt7615_sta *sta,struct ieee80211_tx_rate *probe_rate,struct ieee80211_tx_rate *rates);
@@ -222,6 +219,8 @@ int mt7615_mac_write_txwi(struct mt7615_dev *dev, __le32 *txwi,int mt7615_mac_fill_rx (struct mt7615_dev *dev,struct sk_buff *skb);void mt7615_mac_add_txs (struct mt7615_dev *dev,void *data);void mt7615_mac_tx_free (struct mt7615_dev *dev,struct sk_buff *skb); +int mt7615_mac_wtbl_set_key (struct mt7615_dev *dev,int wcid, +struct ieee80211_key_conf *key);int mt7615_mcu_set_eeprom (struct mt7615_dev *dev);int mt7615_mcu_init_mac (struct mt7615_dev *dev);
drivers/net/wireless/mediatek/mt76/mt7615/regs.h +10 -0
@@ -148,8 +148,15 @@#define MT_WTBL_OFF_BASE 0x23400#define MT_WTBL_OFF (n) (MT_WTBL_OFF_BASE + (n)) +#define MT_WTBL_W0_KEY_IDX GENMASK(24, 23) +#define MT_WTBL_W0_RX_KEY_VALID BIT(26) +#define MT_WTBL_W0_RX_IK_VALID BIT(27) + +#define MT_WTBL_W2_KEY_TYPE GENMASK(7, 4) +#define MT_WTBL_UPDATE MT_WTBL_OFF(0x030)#define MT_WTBL_UPDATE_WLAN_IDX GENMASK(7, 0) +#define MT_WTBL_UPDATE_RXINFO_UPDATE BIT(11)#define MT_WTBL_UPDATE_RATE_UPDATE BIT(13)#define MT_WTBL_UPDATE_TX_COUNT_CLEAR BIT(14)#define MT_WTBL_UPDATE_BUSY BIT(31)
@@ -157,6 +164,9 @@#define MT_WTBL_ON_BASE 0x23000#define MT_WTBL_ON (_n) (MT_WTBL_ON_BASE + (_n)) +#define MT_WTBL_RICR0 MT_WTBL_ON(0x010) +#define MT_WTBL_RICR1 MT_WTBL_ON(0x014) +#define MT_WTBL_RIUCR0 MT_WTBL_ON(0x020)#define MT_WTBL_RIUCR1 MT_WTBL_ON(0x024)
Signature · 1 line
2.21.0
Lorenzo Bianconi
maintainerPATCH 4/7 mt76: mt7615: remove wtbl_sec_key definition
In reply to Lorenzo BianconiGet rid of wtbl_sec_key definition since it is no longer used
--- drivers/net/wireless/mediatek/mt76/mt7615/mcu.h | 14 -------------- 1 file changed, 14 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7615/mcu.h +0 -14
@@ -288,19 +288,6 @@ struct wtbl_hdr_trans {u8 rsv; } __packed; -struct wtbl_sec_key { -__le16 tag; -__le16 len; -u8 add;/* 0: add, 1: remove */ -u8 rkv; -u8 ikv; -u8 cipher_id; -u8 key_id; -u8 key_len; -u8 rsv[2 ]; -u8 key_material[32 ]; -} __packed; -enum {MT_BA_TYPE_INVALID ,MT_BA_TYPE_ORIGINATOR ,
@@ -384,7 +371,6 @@ struct wtbl_raw {sizeof (struct wtbl_vht ) + \sizeof (struct wtbl_tx_ps ) + \sizeof (struct wtbl_hdr_trans ) + \ -sizeof (struct wtbl_sec_key ) + \sizeof (struct wtbl_ba ) + \sizeof (struct wtbl_bf ) + \ sizeof(struct wtbl_smps) + \
Signature · 1 line
2.21.0
Lorenzo Bianconi
maintainerPATCH 5/7 mt76: mt7615: add set_key_cmd and mt76_wcid to mt7615_mac_wtbl_set_key signature
In reply to Lorenzo BianconiIntroduce set_key_cmd and mt76_wcid pointer to mt7615_mac_wtbl_set_key signature and do not set key to NULL if cmd is DISABLE_KEY. This is a preliminary patch to add BIP_CMAC_128 hw support to mt7615 driver
--- .../net/wireless/mediatek/mt76/mt7615/mac.c | 22 +++++++++++-------- .../net/wireless/mediatek/mt76/mt7615/main.c | 12 +++++----- .../wireless/mediatek/mt76/mt7615/mt7615.h | 5 +++-- 3 files changed, 21 insertions(+), 18 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7615/mac.c +13 -9
@@ -594,9 +594,12 @@ void mt7615_mac_set_rates(struct mt7615_dev *dev, struct mt7615_sta *sta,static enum mt7615_cipher_type mt7615_mac_get_key_info (struct ieee80211_key_conf *key, -u8 *key_data) +u8 *key_data,enum set_key_cmd cmd) { -if (!key || key->keylen >32 ) +if (cmd ==DISABLE_KEY ) +return MT_CIPHER_NONE ; + +if (key->keylen >32 )return MT_CIPHER_NONE ;memcpy (key_data, key->key, key->keylen);
@@ -626,8 +629,9 @@ mt7615_mac_get_key_info(struct ieee80211_key_conf *key, } } -int mt7615_mac_wtbl_set_key (struct mt7615_dev *dev,int wcid, -struct ieee80211_key_conf *key) +int mt7615_mac_wtbl_set_key (struct mt7615_dev *dev,struct mt76_wcid *wcid, +struct ieee80211_key_conf *key, +enum set_key_cmd cmd) {enum mt7615_cipher_type cipher;u8 key_data[32 ] = {};
@@ -640,13 +644,13 @@ int mt7615_mac_wtbl_set_key(struct mt7615_dev *dev, int wcid, goto out; } - cipher =mt7615_mac_get_key_info (key, key_data); -if (cipher ==MT_CIPHER_NONE && key) { + cipher =mt7615_mac_get_key_info (key, key_data, cmd); +if (cipher ==MT_CIPHER_NONE && cmd ==SET_KEY ) { err = -EOPNOTSUPP ; goto out; } - addr =mt7615_mac_wtbl_addr (wcid); + addr =mt7615_mac_wtbl_addr (wcid->idx);mt76_wr_copy (dev, addr +30 *4 , key_data,sizeof (key_data));
@@ -656,14 +660,14 @@ int mt7615_mac_wtbl_set_key(struct mt7615_dev *dev, int wcid, w0 =mt76_rr (dev, addr); w1 =mt76_rr (dev, addr +4 ); w0 &= ~(MT_WTBL_W0_KEY_IDX |MT_WTBL_W0_RX_KEY_VALID ); -if (key) +if (cmd ==SET_KEY ) w0 |=FIELD_PREP (MT_WTBL_W0_KEY_IDX , key->keyidx) |MT_WTBL_W0_RX_KEY_VALID ;mt76_wr (dev,MT_WTBL_RICR0 , w0);mt76_wr (dev,MT_WTBL_RICR1 , w1);mt76_wr (dev,MT_WTBL_UPDATE , -FIELD_PREP (MT_WTBL_UPDATE_WLAN_IDX , wcid) | +FIELD_PREP (MT_WTBL_UPDATE_WLAN_IDX , wcid->idx) |MT_WTBL_UPDATE_RXINFO_UPDATE );if (!mt76_poll (dev,MT_WTBL_UPDATE ,MT_WTBL_UPDATE_BUSY ,0 ,5000 ))
drivers/net/wireless/mediatek/mt76/mt7615/main.c +5 -7
@@ -196,15 +196,13 @@ static int mt7615_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,if (cmd ==SET_KEY ) { key->hw_key_idx = wcid->idx; wcid->hw_key_idx = idx; - }else { -if (idx == wcid->hw_key_idx) - wcid->hw_key_idx =-1 ; - - key =NULL ; + }else if (idx == wcid->hw_key_idx) { + wcid->hw_key_idx =-1 ; } -mt76_wcid_key_setup (&dev->mt76, wcid, key); +mt76_wcid_key_setup (&dev->mt76, wcid, + cmd ==SET_KEY ? key :NULL ); -return mt7615_mac_wtbl_set_key (dev, wcid->idx, key); +return mt7615_mac_wtbl_set_key (dev, wcid, key, cmd); }static int mt7615_config (struct ieee80211_hw *hw,u32 changed)
drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h +3 -2
@@ -219,8 +219,9 @@ int mt7615_mac_write_txwi(struct mt7615_dev *dev, __le32 *txwi,int mt7615_mac_fill_rx (struct mt7615_dev *dev,struct sk_buff *skb);void mt7615_mac_add_txs (struct mt7615_dev *dev,void *data);void mt7615_mac_tx_free (struct mt7615_dev *dev,struct sk_buff *skb); -int mt7615_mac_wtbl_set_key (struct mt7615_dev *dev,int wcid, -struct ieee80211_key_conf *key); +int mt7615_mac_wtbl_set_key (struct mt7615_dev *dev,struct mt76_wcid *wcid, +struct ieee80211_key_conf *key, +enum set_key_cmd cmd);int mt7615_mcu_set_eeprom (struct mt7615_dev *dev);int mt7615_mcu_init_mac (struct mt7615_dev *dev);
Signature · 1 line
2.21.0
Lorenzo Bianconi
maintainerPATCH 6/7 mt76: intorduce mt76_mmio_read_copy routine
In reply to Lorenzo BianconiAdd mt76_mmio_read_copy routine and the related function pointer in mt76_bus_ops data structure. mt76_mmio_read_copy will be used to add BIP_CMAC_128 cipher hw support to mt7615 driver
--- drivers/net/wireless/mediatek/mt76/mmio.c | 13 ++++++++++--- drivers/net/wireless/mediatek/mt76/mt76.h | 12 ++++++++---- drivers/net/wireless/mediatek/mt76/usb.c | 2 +- 3 files changed, 19 insertions(+), 8 deletions(-)
drivers/net/wireless/mediatek/mt76/mmio.c +10 -3
@@ -40,12 +40,18 @@ static u32 mt76_mmio_rmw(struct mt76_dev *dev, u32 offset, u32 mask, u32 val)return val; } -static void mt76_mmio_copy (struct mt76_dev *dev,u32 offset,const void *data, -int len) +static void mt76_mmio_write_copy (struct mt76_dev *dev,u32 offset, +const void *data,int len) {__iowrite32_copy (dev->mmio.regs + offset, data,DIV_ROUND_UP (len,4 )); } +static void mt76_mmio_read_copy (struct mt76_dev *dev,u32 offset, +void *data,int len) +{ +__ioread32_copy (data, dev->mmio.regs + offset,DIV_ROUND_UP (len,4 )); +} +static int mt76_mmio_wr_rp (struct mt76_dev *dev,u32 base,const struct mt76_reg_pair *data,int len) {
@@ -89,7 +95,8 @@ void mt76_mmio_init(struct mt76_dev *dev, void __iomem *regs) .rr = mt76_mmio_rr, .rmw = mt76_mmio_rmw, .wr = mt76_mmio_wr, - .copy = mt76_mmio_copy, + .write_copy = mt76_mmio_write_copy, + .read_copy = mt76_mmio_read_copy, .wr_rp = mt76_mmio_wr_rp, .rd_rp = mt76_mmio_rd_rp, .type = MT76_BUS_MMIO,
drivers/net/wireless/mediatek/mt76/mt76.h +8 -4
@@ -48,8 +48,10 @@ struct mt76_bus_ops {u32 (*rr)(struct mt76_dev *dev,u32 offset);void (*wr)(struct mt76_dev *dev,u32 offset,u32 val);u32 (*rmw)(struct mt76_dev *dev,u32 offset,u32 mask,u32 val); -void (*copy)(struct mt76_dev *dev,u32 offset,const void *data, -int len); +void (*write_copy)(struct mt76_dev *dev,u32 offset,const void *data, +int len); +void (*read_copy)(struct mt76_dev *dev,u32 offset,void *data, +int len);int (*wr_rp)(struct mt76_dev *dev,u32 base,const struct mt76_reg_pair *rp,int len); int (*rd_rp)(struct mt76_dev *dev, u32 base,
@@ -540,7 +542,8 @@ struct mt76_rx_status {#define __mt76_rr (dev, ...) (dev)->bus->rr((dev), __VA_ARGS__)#define __mt76_wr (dev, ...) (dev)->bus->wr((dev), __VA_ARGS__)#define __mt76_rmw (dev, ...) (dev)->bus->rmw((dev), __VA_ARGS__) -#define __mt76_wr_copy (dev, ...) (dev)->bus->copy((dev), __VA_ARGS__) +#define __mt76_wr_copy (dev, ...) (dev)->bus->write_copy((dev), __VA_ARGS__) +#define __mt76_rr_copy (dev, ...) (dev)->bus->read_copy((dev), __VA_ARGS__)#define __mt76_set (dev, offset, val) __mt76_rmw(dev, offset, 0, val)#define __mt76_clear (dev, offset, val) __mt76_rmw(dev, offset, val, 0)
@@ -548,7 +551,8 @@ struct mt76_rx_status {#define mt76_rr (dev, ...) (dev)->mt76.bus->rr(&((dev)->mt76), __VA_ARGS__)#define mt76_wr (dev, ...) (dev)->mt76.bus->wr(&((dev)->mt76), __VA_ARGS__)#define mt76_rmw (dev, ...) (dev)->mt76.bus->rmw(&((dev)->mt76), __VA_ARGS__) -#define mt76_wr_copy (dev, ...) (dev)->mt76.bus->copy(&((dev)->mt76), __VA_ARGS__) +#define mt76_wr_copy (dev, ...) (dev)->mt76.bus->write_copy(&((dev)->mt76), __VA_ARGS__) +#define mt76_rr_copy (dev, ...) (dev)->mt76.bus->read_copy(&((dev)->mt76), __VA_ARGS__)#define mt76_wr_rp (dev, ...) (dev)->mt76.bus->wr_rp(&((dev)->mt76), __VA_ARGS__)#define mt76_rd_rp (dev, ...) (dev)->mt76.bus->rd_rp(&((dev)->mt76), __VA_ARGS__)
drivers/net/wireless/mediatek/mt76/usb.c +1 -1
@@ -929,7 +929,7 @@ int mt76u_init(struct mt76_dev *dev, .rr = mt76u_rr, .wr = mt76u_wr, .rmw = mt76u_rmw, - .copy = mt76u_copy, + .write_copy = mt76u_copy, .wr_rp = mt76u_wr_rp, .rd_rp = mt76u_rd_rp, .type = MT76_BUS_USB,
Signature · 1 line
2.21.0
Lorenzo Bianconi
maintainerPATCH 7/7 mt76: mt7615: add BIP_CMAC_128 cipher support
In reply to Lorenzo BianconiRefactor mt7615_mac_wtbl_set_key and introduce the following routines in order to configure wtbl entries and properly add hw support to BIP_CMAC_128 cipher:
- mt7615_mac_wtbl_update_cipher
- mt7615_mac_wtbl_update_pk
- mt7615_mac_wtbl_update_key
--- drivers/net/wireless/mediatek/mt76/mac80211.c | 5 +- drivers/net/wireless/mediatek/mt76/mt76.h | 1 + .../net/wireless/mediatek/mt76/mt7615/mac.c | 173 +++++++++++++----- .../net/wireless/mediatek/mt76/mt7615/main.c | 3 + 4 files changed, 135 insertions(+), 47 deletions(-)
drivers/net/wireless/mediatek/mt76/mac80211.c +3 -2
@@ -487,9 +487,10 @@ void mt76_wcid_key_setup(struct mt76_dev *dev, struct mt76_wcid *wcid,if (!key)return ; -if (key->cipher ==WLAN_CIPHER_SUITE_CCMP ) - wcid->rx_check_pn = true; +if (key->cipher !=WLAN_CIPHER_SUITE_CCMP ) +return ; + wcid->rx_check_pn = true;for (i =0 ; i <IEEE80211_NUM_TIDS ; i++) {ieee80211_get_key_rx_seq (key, i, &seq);memcpy (wcid->rx_key_pn[i], seq.ccmp.pn,sizeof (seq.ccmp.pn));
drivers/net/wireless/mediatek/mt76/mt76.h +1 -0
@@ -214,6 +214,7 @@ struct mt76_wcid {u8 rx_check_pn;u8 rx_key_pn[IEEE80211_NUM_TIDS ][6 ]; +u16 cipher;u32 tx_info;bool sw_iv;
drivers/net/wireless/mediatek/mt76/mt7615/mac.c +128 -45
230 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7615/main.c +3 -0
@@ -180,6 +180,9 @@ static int mt7615_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,/* fall back to sw encryption for unsupported ciphers */ switch (key->cipher) { +case WLAN_CIPHER_SUITE_AES_CMAC : + key->flags |=IEEE80211_KEY_FLAG_PUT_MMIE_SPACE ; +break ;case WLAN_CIPHER_SUITE_WEP40 :case WLAN_CIPHER_SUITE_WEP104 :case WLAN_CIPHER_SUITE_TKIP :
Signature · 1 line
2.21.0