All of lore.kernel.org
 help / color / mirror / Atom feed
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



  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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.