rtw89: configure security CAM for V1 chip
authorPing-Ke Shih <pkshih@realtek.com>
Wed, 13 Apr 2022 01:08:03 +0000 (09:08 +0800)
committerKalle Valo <kvalo@kernel.org>
Wed, 13 Apr 2022 06:26:52 +0000 (09:26 +0300)
Add to configure security CAM while mac80211 calls set_key and del_key.

Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Signed-off-by: Kalle Valo <kvalo@kernel.org>
Link: https://lore.kernel.org/r/20220413010804.8941-4-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/cam.c
drivers/net/wireless/realtek/rtw89/core.h
drivers/net/wireless/realtek/rtw89/rtw8852a.c
drivers/net/wireless/realtek/rtw89/rtw8852c.c

index 08b9779..8a26ade 100644 (file)
@@ -244,6 +244,12 @@ static int rtw89_cam_attach_sec_cam(struct rtw89_dev *rtwdev,
        addr_cam->sec_ent[key_idx] = sec_cam->sec_cam_idx;
        addr_cam->sec_entries[key_idx] = sec_cam;
        set_bit(key_idx, addr_cam->sec_cam_map);
+       ret = rtw89_chip_h2c_dctl_sec_cam(rtwdev, rtwvif, rtwsta);
+       if (ret) {
+               rtw89_err(rtwdev, "failed to update dctl cam sec entry: %d\n",
+                         ret);
+               return ret;
+       }
        ret = rtw89_fw_h2c_cam(rtwdev, rtwvif, rtwsta, NULL);
        if (ret) {
                rtw89_err(rtwdev, "failed to update addr cam sec entry: %d\n",
@@ -398,6 +404,9 @@ int rtw89_cam_sec_key_del(struct rtw89_dev *rtwdev,
        clear_bit(key_idx, addr_cam->sec_cam_map);
        addr_cam->sec_entries[key_idx] = NULL;
        if (inform_fw) {
+               ret = rtw89_chip_h2c_dctl_sec_cam(rtwdev, rtwvif, rtwsta);
+               if (ret)
+                       rtw89_err(rtwdev, "failed to update dctl cam del key: %d\n", ret);
                ret = rtw89_fw_h2c_cam(rtwdev, rtwvif, rtwsta, NULL);
                if (ret)
                        rtw89_err(rtwdev, "failed to update cam del key: %d\n", ret);
index 2715dc1..090d416 100644 (file)
@@ -2106,6 +2106,9 @@ struct rtw89_chip_ops {
        int (*stop_sch_tx)(struct rtw89_dev *rtwdev, u8 mac_idx,
                           u32 *tx_en, enum rtw89_sch_tx_sel sel);
        int (*resume_sch_tx)(struct rtw89_dev *rtwdev, u8 mac_idx, u32 tx_en);
+       int (*h2c_dctl_sec_cam)(struct rtw89_dev *rtwdev,
+                               struct rtw89_vif *rtwvif,
+                               struct rtw89_sta *rtwsta);
 
        void (*btc_set_rfe)(struct rtw89_dev *rtwdev);
        void (*btc_init_cfg)(struct rtw89_dev *rtwdev);
@@ -3634,6 +3637,18 @@ int rtw89_chip_resume_sch_tx(struct rtw89_dev *rtwdev, u8 mac_idx, u32 tx_en)
        return chip->ops->resume_sch_tx(rtwdev, mac_idx, tx_en);
 }
 
+static inline
+int rtw89_chip_h2c_dctl_sec_cam(struct rtw89_dev *rtwdev,
+                               struct rtw89_vif *rtwvif,
+                               struct rtw89_sta *rtwsta)
+{
+       const struct rtw89_chip_info *chip = rtwdev->chip;
+
+       if (!chip->ops->h2c_dctl_sec_cam)
+               return 0;
+       return chip->ops->h2c_dctl_sec_cam(rtwdev, rtwvif, rtwsta);
+}
+
 static inline u8 *get_hdr_bssid(struct ieee80211_hdr *hdr)
 {
        __le16 fc = hdr->frame_control;
index 6371bbf..975c504 100644 (file)
@@ -2075,6 +2075,7 @@ static const struct rtw89_chip_ops rtw8852a_chip_ops = {
        .mac_cfg_gnt            = rtw89_mac_cfg_gnt,
        .stop_sch_tx            = rtw89_mac_stop_sch_tx,
        .resume_sch_tx          = rtw89_mac_resume_sch_tx,
+       .h2c_dctl_sec_cam       = NULL,
 
        .btc_set_rfe            = rtw8852a_btc_set_rfe,
        .btc_init_cfg           = rtw8852a_btc_init_cfg,
index d900129..d56d656 100644 (file)
@@ -645,6 +645,7 @@ static const struct rtw89_chip_ops rtw8852c_chip_ops = {
        .mac_cfg_gnt            = rtw89_mac_cfg_gnt_v1,
        .stop_sch_tx            = rtw89_mac_stop_sch_tx_v1,
        .resume_sch_tx          = rtw89_mac_resume_sch_tx_v1,
+       .h2c_dctl_sec_cam       = rtw89_fw_h2c_dctl_sec_cam_v1,
 
        .btc_init_cfg           = rtw8852c_btc_init_cfg,
 };