From: Ryder Lee <ryder.lee@mediatek.com>
To: Lorenzo Bianconi <lorenzo@kernel.org>
Cc: <nbd@nbd.name>, <lorenzo.bianconi@redhat.com>,
<linux-wireless@vger.kernel.org>, <royluo@google.com>
Subject: Re: [RFC 12/17] mt7615: mcu: do not use function pointer whenever possible
Date: Thu, 2 May 2019 10:27:42 +0800 [thread overview]
Message-ID: <1556764062.12176.2.camel@mtkswgap22> (raw)
In-Reply-To: <0feb5dd8f162e2c8bdb8629b6c8cac96e3f3b515.1556726268.git.lorenzo@kernel.org>
On Wed, 2019-05-01 at 18:07 +0200, Lorenzo Bianconi wrote:
> Remove function pointer in mt7615_mcu_set_bss_info and run function
> directly. Moreover remove __mt7615_mcu_set_bss_info since it is run just
> by mt7615_mcu_set_bss_info and remove duplicated istructions
>
> Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
> ---
> .../net/wireless/mediatek/mt76/mt7615/mcu.c | 220 +++++++++---------
> 1 file changed, 105 insertions(+), 115 deletions(-)
>
> diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7615/mcu.c
> index c90ae77db22b..b3fb3d731129 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt7615/mcu.c
> +++ b/drivers/net/wireless/mediatek/mt76/mt7615/mcu.c
> @@ -676,154 +676,107 @@ int mt7615_mcu_set_dev_info(struct mt7615_dev *dev,
> return mt7615_mcu_msg_send(dev, skb, MCU_EXT_CMD_DEV_INFO_UPDATE);
> }
>
> -static void bss_info_omac_handler (struct mt7615_dev *dev,
> - struct bss_info *bss_info,
> - struct sk_buff *skb)
> +static void
> +mt7615_mcu_bss_info_omac_header(struct mt7615_vif *mvif, u8 *data,
> + u32 conn_type)
> {
> - struct bss_info_omac tlv = {0};
> -
> - tlv.tag = cpu_to_le16(BSS_INFO_OMAC);
> - tlv.len = cpu_to_le16(sizeof(tlv));
> - tlv.hw_bss_idx = (bss_info->omac_idx > EXT_BSSID_START) ?
> - HW_BSSID_0 : bss_info->omac_idx;
> - tlv.omac_idx = bss_info->omac_idx;
> - tlv.band_idx = bss_info->band_idx;
> - tlv.conn_type = cpu_to_le32(bss_info->conn_type);
> -
> - memcpy(skb_put(skb, sizeof(tlv)), &tlv, sizeof(tlv));
> + struct bss_info_omac *hdr = (struct bss_info_omac *)data;
> + u8 idx;
> +
> + idx = mvif->omac_idx > EXT_BSSID_START ? HW_BSSID_0 : mvif->omac_idx;
> + hdr->tag = cpu_to_le16(BSS_INFO_OMAC);
> + hdr->len = cpu_to_le16(sizeof(struct bss_info_omac));
> + hdr->hw_bss_idx = idx;
> + hdr->omac_idx = mvif->omac_idx;
> + hdr->band_idx = mvif->band_idx;
> + hdr->conn_type = cpu_to_le32(conn_type);
> }
>
> -static void bss_info_basic_handler (struct mt7615_dev *dev,
> - struct bss_info *bss_info,
> - struct sk_buff *skb)
> +static void
> +mt7615_mcu_bss_info_basic_header(struct ieee80211_vif *vif, u8 *data,
> + u32 net_type, u8 tx_wlan_idx,
> + bool enable)
> {
> - struct bss_info_basic tlv = {0};
> -
> - tlv.tag = cpu_to_le16(BSS_INFO_BASIC);
> - tlv.len = cpu_to_le16(sizeof(tlv));
> - tlv.network_type = cpu_to_le32(bss_info->network_type);
> - tlv.active = bss_info->enable;
> - tlv.bcn_interval = cpu_to_le16(bss_info->bcn_interval);
> - memcpy(tlv.bssid, bss_info->bssid, ETH_ALEN);
> - tlv.wmm_idx = bss_info->wmm_idx;
> - tlv.dtim_period = bss_info->dtim_period;
> - tlv.bmc_tx_wlan_idx = bss_info->bmc_tx_wlan_idx;
> -
> - memcpy(skb_put(skb, sizeof(tlv)), &tlv, sizeof(tlv));
> + struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
> + struct bss_info_basic *hdr = (struct bss_info_basic *)data;
> +
> + hdr->tag = cpu_to_le16(BSS_INFO_BASIC);
> + hdr->len = cpu_to_le16(sizeof(struct bss_info_basic));
> + hdr->network_type = cpu_to_le32(net_type);
If I read this patch correctly, it seems nobody sets the net_type?
> + hdr->active = enable;
> + hdr->bcn_interval = cpu_to_le16(vif->bss_conf.beacon_int);
> + memcpy(hdr->bssid, vif->bss_conf.bssid, ETH_ALEN);
> + hdr->wmm_idx = mvif->wmm_idx;
> + hdr->dtim_period = vif->bss_conf.dtim_period;
> + hdr->bmc_tx_wlan_idx = tx_wlan_idx;
> }
>
> -static void bss_info_ext_bss_handler (struct mt7615_dev *dev,
> - struct bss_info *bss_info,
> - struct sk_buff *skb)
> +static void
> +mt7615_mcu_bss_info_ext_header(struct mt7615_vif *mvif, u8 *data)
> {
> /* SIFS 20us + 512 byte beacon tranmitted by 1Mbps (3906us) */
> #define BCN_TX_ESTIMATE_TIME (4096 + 20)
> - struct bss_info_ext_bss tlv = {0};
> + struct bss_info_ext_bss *hdr = (struct bss_info_ext_bss *)data;
> int ext_bss_idx;
>
> - ext_bss_idx = bss_info->omac_idx - EXT_BSSID_START;
> -
> + ext_bss_idx = mvif->omac_idx - EXT_BSSID_START;
> if (ext_bss_idx < 0)
> return;
>
> - tlv.tag = cpu_to_le16(BSS_INFO_EXT_BSS);
> - tlv.len = cpu_to_le16(sizeof(tlv));
> - tlv.mbss_tsf_offset = ext_bss_idx * BCN_TX_ESTIMATE_TIME;
> -
> - memcpy(skb_put(skb, sizeof(tlv)), &tlv, sizeof(tlv));
> + hdr->tag = cpu_to_le16(BSS_INFO_EXT_BSS);
> + hdr->len = cpu_to_le16(sizeof(struct bss_info_ext_bss));
> + hdr->mbss_tsf_offset = ext_bss_idx * BCN_TX_ESTIMATE_TIME;
> }
>
> -static struct bss_info_tag_handler bss_info_tag_handler[] = {
> - {BSS_INFO_OMAC, sizeof(struct bss_info_omac), bss_info_omac_handler},
> - {BSS_INFO_BASIC, sizeof(struct bss_info_basic), bss_info_basic_handler},
> - {BSS_INFO_RF_CH, sizeof(struct bss_info_rf_ch), NULL},
> - {BSS_INFO_PM, 0, NULL},
> - {BSS_INFO_UAPSD, 0, NULL},
> - {BSS_INFO_ROAM_DETECTION, 0, NULL},
> - {BSS_INFO_LQ_RM, 0, NULL},
> - {BSS_INFO_EXT_BSS, sizeof(struct bss_info_ext_bss), bss_info_ext_bss_handler},
> - {BSS_INFO_BMC_INFO, 0, NULL},
> - {BSS_INFO_SYNC_MODE, 0, NULL},
> - {BSS_INFO_RA, 0, NULL},
> - {BSS_INFO_MAX_NUM, 0, NULL},
> -};
> -
> -static int __mt7615_mcu_set_bss_info(struct mt7615_dev *dev,
> - struct bss_info *bss_info)
> +int mt7615_mcu_set_bss_info(struct mt7615_dev *dev,
> + struct ieee80211_vif *vif, int en)
> {
> + struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
> struct req_hdr {
> u8 bss_idx;
> u8 rsv0;
> __le16 tlv_num;
> u8 is_tlv_append;
> u8 rsv1[3];
> - } __packed req_hdr = {0};
> + } __packed;
> + int len = sizeof(struct req_hdr) + sizeof(struct bss_info_basic);
> + int ret, i, features = BIT(BSS_INFO_BASIC), ntlv = 1;
> + u32 conn_type = NETWORK_INFRA, net_type = 0;
> + u8 *buf, *data, tx_wlan_idx = 0;
> + struct req_hdr *hdr;
> struct sk_buff *skb;
> - u16 tlv_num = 0;
> - u32 size = 0;
> - int i;
>
> - for (i = 0; i < BSS_INFO_MAX_NUM; i++)
> - if ((BIT(bss_info_tag_handler[i].tag) & bss_info->feature) &&
> - bss_info_tag_handler[i].handler) {
> - tlv_num++;
> - size += bss_info_tag_handler[i].len;
> + if (en) {
> + len += sizeof(struct bss_info_omac);
> + features |= BIT(BSS_INFO_OMAC);
> + if (mvif->omac_idx > EXT_BSSID_START) {
> + len += sizeof(struct bss_info_ext_bss);
> + features |= BIT(BSS_INFO_EXT_BSS);
> + ntlv++;
> }
> -
> - skb = mt7615_mcu_msg_alloc(NULL, sizeof(req_hdr) + size);
> -
> - req_hdr.bss_idx = bss_info->bss_idx;
> - req_hdr.tlv_num = cpu_to_le16(tlv_num);
> - req_hdr.is_tlv_append = tlv_num ? 1 : 0;
> -
> - memcpy(skb_put(skb, sizeof(req_hdr)), &req_hdr, sizeof(req_hdr));
> -
> - for (i = 0; i < BSS_INFO_MAX_NUM; i++)
> - if ((BIT(bss_info_tag_handler[i].tag) & bss_info->feature) &&
> - bss_info_tag_handler[i].handler)
> - bss_info_tag_handler[i].handler(dev, bss_info, skb);
> -
> - return mt7615_mcu_msg_send(dev, skb, MCU_EXT_CMD_BSS_INFO_UPDATE);
> -}
> -
> -int mt7615_mcu_set_bss_info(struct mt7615_dev *dev,
> - struct ieee80211_vif *vif, int en)
> -{
> - struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
> - struct bss_info bss_info = {
> - .bss_idx = mvif->idx,
> - .omac_idx = mvif->omac_idx,
> - .band_idx = mvif->band_idx,
> - .bcn_interval = vif->bss_conf.beacon_int,
> - .dtim_period = vif->bss_conf.dtim_period,
> - .enable = en,
> - .feature = BIT(BSS_INFO_BASIC),
> - .wmm_idx = mvif->wmm_idx,
> - };
> + ntlv++;
> + }
>
> switch (vif->type) {
> case NL80211_IFTYPE_AP:
> - bss_info.bmc_tx_wlan_idx = mvif->sta.wcid.idx;
> - bss_info.network_type = NETWORK_INFRA;
> - bss_info.conn_type = CONNECTION_INFRA_AP;
> + tx_wlan_idx = mvif->sta.wcid.idx;
> + conn_type = CONNECTION_INFRA_AP;
> break;
> case NL80211_IFTYPE_STATION: {
> - /* find the unicast entry for sta mode bmc tx */
> - struct ieee80211_sta *ap_sta;
> + struct ieee80211_sta *sta;
> struct mt7615_sta *msta;
>
> rcu_read_lock();
>
> - ap_sta = ieee80211_find_sta(vif, vif->bss_conf.bssid);
> - if (!ap_sta) {
> + sta = ieee80211_find_sta(vif, vif->bss_conf.bssid);
> + if (!sta) {
> rcu_read_unlock();
> return -EINVAL;
> }
>
> - msta = (struct mt7615_sta *)ap_sta->drv_priv;
> - bss_info.bmc_tx_wlan_idx = msta->wcid.idx;
> - bss_info.network_type = NETWORK_INFRA;
> - bss_info.conn_type = CONNECTION_INFRA_STA;
> + msta = (struct mt7615_sta *)sta->drv_priv;
> + tx_wlan_idx = msta->wcid.idx;
> + conn_type = CONNECTION_INFRA_STA;
>
> rcu_read_unlock();
> break;
> @@ -832,15 +785,52 @@ int mt7615_mcu_set_bss_info(struct mt7615_dev *dev,
> WARN_ON(1);
> break;
> }
> - memcpy(bss_info.bssid, vif->bss_conf.bssid, ETH_ALEN);
>
> - if (en) {
> - bss_info.feature |= BIT(BSS_INFO_OMAC);
> - if (mvif->omac_idx > EXT_BSSID_START)
> - bss_info.feature |= BIT(BSS_INFO_EXT_BSS);
> + buf = kzalloc(len, GFP_KERNEL);
> + if (!buf)
> + return -ENOMEM;
> +
> + hdr = (struct req_hdr *)buf;
> + hdr->bss_idx = mvif->idx;
> + hdr->tlv_num = cpu_to_le16(ntlv);
> + hdr->is_tlv_append = 1;
> +
> + data = buf + sizeof(*hdr);
> + for (i = 0; i < BSS_INFO_MAX_NUM; i++) {
> + int tag = ffs(features & BIT(i)) - 1;
> +
> + switch (tag) {
> + case BSS_INFO_OMAC:
> + mt7615_mcu_bss_info_omac_header(mvif, data,
> + conn_type);
> + data += sizeof(struct bss_info_omac);
> + break;
> + case BSS_INFO_BASIC:
> + mt7615_mcu_bss_info_basic_header(vif, data, net_type,
> + tx_wlan_idx, en);
> + data += sizeof(struct bss_info_basic);
> + break;
> + case BSS_INFO_EXT_BSS:
> + mt7615_mcu_bss_info_ext_header(mvif, data);
> + data += sizeof(struct bss_info_ext_bss);
> + break;
> + default:
> + break;
> + }
> + }
> +
> + skb = mt7615_mcu_msg_alloc(buf, len);
> + if (!skb) {
> + ret = -ENOMEM;
> + goto out;
> }
>
> - return __mt7615_mcu_set_bss_info(dev, &bss_info);
> + ret = mt7615_mcu_msg_send(dev, skb, MCU_EXT_CMD_BSS_INFO_UPDATE);
> +
> +out:
> + kfree(buf);
> +
> + return ret;
> }
>
> static int
next prev parent reply other threads:[~2019-05-02 2:27 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-05-01 16:07 [RFC 00/17] use standard signature for mt7615 mcu api Lorenzo Bianconi
2019-05-01 16:07 ` [RFC 01/17] mt7615: mcu: simplify __mt7615_mcu_set_wtbl Lorenzo Bianconi
2019-05-01 16:07 ` [RFC 02/17] mt7615: mcu: simplify __mt7615_mcu_set_sta_rec Lorenzo Bianconi
2019-05-01 16:07 ` [RFC 03/17] mt7615: mcu: remove bss_info_convert_vif_type routine Lorenzo Bianconi
2019-05-01 16:07 ` [RFC 04/17] mt7615: mcu: use proper msg size in mt7615_mcu_add_wtbl_bmc Lorenzo Bianconi
2019-05-01 16:07 ` [RFC 05/17] mt7615: mcu: use proper msg size in mt7615_mcu_add_wtbl Lorenzo Bianconi
2019-05-01 16:07 ` [RFC 06/17] mt7615: mcu: unify mt7615_mcu_add_wtbl_bmc and mt7615_mcu_del_wtbl_bmc Lorenzo Bianconi
2019-05-01 16:07 ` [RFC 07/17] mt7615: mcu: remove unused paramter in mt7615_mcu_del_wtbl Lorenzo Bianconi
2019-05-01 16:07 ` [RFC 08/17] mt7615: remove query from mt7615_mcu_msg_send signature Lorenzo Bianconi
2019-05-02 9:01 ` Kalle Valo
2019-05-01 16:07 ` [RFC 09/17] mt7615: remove dest " Lorenzo Bianconi
2019-05-01 16:07 ` [RFC 10/17] mt7615: mcu: remove skb_ret from mt7615_mcu_msg_send Lorenzo Bianconi
[not found] ` <CA+zupgzQTzQyihC_UskHD=63Ag3AnQcD4_pcas7VdaehyoCE1w@mail.gmail.com>
2019-05-02 15:31 ` Lorenzo Bianconi
[not found] ` <CA+zupgxPj_oziDiSkztE3zLxZ9BXMAbQ3Vb4eEWSJ4JrSE41=A@mail.gmail.com>
2019-05-03 9:27 ` Lorenzo Bianconi
2019-05-01 16:07 ` [RFC 11/17] mt7615: mcu: unify __mt7615_mcu_set_dev_info and mt7615_mcu_set_dev_info Lorenzo Bianconi
2019-05-01 16:07 ` [RFC 12/17] mt7615: mcu: do not use function pointer whenever possible Lorenzo Bianconi
2019-05-02 2:27 ` Ryder Lee [this message]
2019-05-02 8:24 ` Lorenzo Bianconi
2019-05-01 16:07 ` [RFC 13/17] mt7615: mcu: remove unused structure in mcu.h Lorenzo Bianconi
2019-05-01 16:07 ` [RFC 14/17] mt7615: mcu: use standard signature for mt7615_mcu_msg_send Lorenzo Bianconi
2019-05-01 16:07 ` [RFC 15/17] mt7615: initialize mt76_mcu_ops data structure Lorenzo Bianconi
2019-05-01 16:07 ` [RFC 16/17] mt7615: mcu: init mcu_restart function pointer Lorenzo Bianconi
2019-05-01 16:07 ` [RFC 17/17] mt7615: mcu: run __mt76_mcu_send_msg in mt7615_mcu_send_firmware Lorenzo Bianconi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1556764062.12176.2.camel@mtkswgap22 \
--to=ryder.lee@mediatek.com \
--cc=linux-wireless@vger.kernel.org \
--cc=lorenzo.bianconi@redhat.com \
--cc=lorenzo@kernel.org \
--cc=nbd@nbd.name \
--cc=royluo@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).