All of lore.kernel.org
 help / color / mirror / Atom feed
From: Brian Norris <briannorris@chromium.org>
To: Amitkumar Karwar <akarwar@marvell.com>
Cc: linux-wireless@vger.kernel.org, Cathy Luo <cluo@marvell.com>,
	Nishant Sarmukadam <nishants@marvell.com>,
	Xinming Hu <huxm@marvell.com>
Subject: Re: [v4,2/2] mwifiex: add cfg80211 testmode support
Date: Wed, 31 Aug 2016 12:40:05 -0700	[thread overview]
Message-ID: <20160831194003.GA31478@localhost> (raw)
In-Reply-To: <1469525960-6643-2-git-send-email-akarwar@marvell.com>

On Tue, Jul 26, 2016 at 03:09:20PM +0530, Amitkumar Karwar wrote:
> From: Xinming Hu <huxm@marvell.com>
> 
> This patch adds cfg80211 testmode support so that userspace tools can
> download necessary commands to firmware during manufacturing mode tests.
> 
> Signed-off-by: Xinming <huxm@marvell.com>
> Signed-off-by: Amitkumar Karwar <akarwar@marvell.com>
> ---
> v4: Used cfg80211 testmode interface instead of wext in 2/2 patch.(Kalle Valo)
> v3: Add "select WIRELESS_EXT" in Kconfig to resolve kbuild test robot errors.
>     WEXT_PRIV seems to have a dependency with WIRELESS_EXT.
> v2: 1) Sequence of these two patches are changed to resolve compilation
>     error seen if only 1/2 is applied.
>     2) Add "select WEXT_PRIV" in Kconfig to resolve warnings reported by
>     kbuild test robot.
> ---
>  drivers/net/wireless/marvell/mwifiex/cfg80211.c | 83 +++++++++++++++++++++++++
>  1 file changed, 83 insertions(+)
> 
> diff --git a/drivers/net/wireless/marvell/mwifiex/cfg80211.c b/drivers/net/wireless/marvell/mwifiex/cfg80211.c
> index 235fb39..86b31b1 100644
> --- a/drivers/net/wireless/marvell/mwifiex/cfg80211.c
> +++ b/drivers/net/wireless/marvell/mwifiex/cfg80211.c
> @@ -3919,6 +3919,88 @@ static int mwifiex_cfg80211_get_channel(struct wiphy *wiphy,
>  	return ret;
>  }
>  
> +#ifdef CONFIG_NL80211_TESTMODE
> +
> +enum mwifiex_tm_attr {
> +	__MWIFIEX_TM_ATTR_INVALID	= 0,
> +	MWIFIEX_TM_ATTR_CMD		= 1,
> +	MWIFIEX_TM_ATTR_DATA		= 2,
> +
> +	/* keep last */
> +	__MWIFIEX_TM_ATTR_AFTER_LAST,
> +	MWIFIEX_TM_ATTR_MAX		= __MWIFIEX_TM_ATTR_AFTER_LAST - 1,
> +};
> +
> +static const struct nla_policy mwifiex_tm_policy[MWIFIEX_TM_ATTR_MAX + 1] = {
> +	[MWIFIEX_TM_ATTR_CMD]		= { .type = NLA_U32 },
> +	[MWIFIEX_TM_ATTR_DATA]		= { .type = NLA_BINARY,
> +					    .len = MWIFIEX_SIZE_OF_CMD_BUFFER },
> +};
> +
> +enum mwifiex_tm_cmd {
> +	MWIFIEX_TM_CMD_HOSTCMD	= 0,
> +};
> +
> +int mwifiex_tm_cmd(struct wiphy *wiphy, struct wireless_dev *wdev,

This function should be static, no?

Brian

> +		   void *data, int len)
> +{
> +	struct mwifiex_private *priv = mwifiex_netdev_get_priv(wdev->netdev);
> +	struct mwifiex_ds_misc_cmd *hostcmd;
> +	struct nlattr *tb[MWIFIEX_TM_ATTR_MAX + 1];
> +	struct mwifiex_adapter *adapter;
> +	struct sk_buff *skb;
> +	int err;
> +
> +	if (!priv)
> +		return -EINVAL;
> +	adapter = priv->adapter;
> +
> +	err = nla_parse(tb, MWIFIEX_TM_ATTR_MAX, data, len,
> +			mwifiex_tm_policy);
> +	if (err)
> +		return err;
> +
> +	if (!tb[MWIFIEX_TM_ATTR_CMD])
> +		return -EINVAL;
> +
> +	switch (nla_get_u32(tb[MWIFIEX_TM_ATTR_CMD])) {
> +	case MWIFIEX_TM_CMD_HOSTCMD:
> +		if (!tb[MWIFIEX_TM_ATTR_DATA])
> +			return -EINVAL;
> +
> +		hostcmd = kzalloc(sizeof(*hostcmd), GFP_KERNEL);
> +		if (!hostcmd)
> +			return -ENOMEM;
> +
> +		hostcmd->len = nla_len(tb[MWIFIEX_TM_ATTR_DATA]);
> +		memcpy(hostcmd->cmd, nla_data(tb[MWIFIEX_TM_ATTR_DATA]),
> +		       hostcmd->len);
> +
> +		if (mwifiex_send_cmd(priv, 0, 0, 0, hostcmd, true)) {
> +			dev_err(priv->adapter->dev, "Failed to process hostcmd\n");
> +			return -EFAULT;
> +		}
> +
> +		/* process hostcmd response*/
> +		skb = cfg80211_testmode_alloc_reply_skb(wiphy, hostcmd->len);
> +		if (!skb)
> +			return -ENOMEM;
> +		err = nla_put(skb, MWIFIEX_TM_ATTR_DATA,
> +			      hostcmd->len, hostcmd->cmd);
> +		if (err) {
> +			kfree_skb(skb);
> +			return -EMSGSIZE;
> +		}
> +
> +		err = cfg80211_testmode_reply(skb);
> +		kfree(hostcmd);
> +		return err;
> +	default:
> +		return -EOPNOTSUPP;
> +	}
> +}
> +#endif
> +
>  static int
>  mwifiex_cfg80211_start_radar_detection(struct wiphy *wiphy,
>  				       struct net_device *dev,
> @@ -4031,6 +4113,7 @@ static struct cfg80211_ops mwifiex_cfg80211_ops = {
>  	.tdls_cancel_channel_switch = mwifiex_cfg80211_tdls_cancel_chan_switch,
>  	.add_station = mwifiex_cfg80211_add_station,
>  	.change_station = mwifiex_cfg80211_change_station,
> +	CFG80211_TESTMODE_CMD(mwifiex_tm_cmd)
>  	.get_channel = mwifiex_cfg80211_get_channel,
>  	.start_radar_detection = mwifiex_cfg80211_start_radar_detection,
>  	.channel_switch = mwifiex_cfg80211_channel_switch,

  reply	other threads:[~2016-08-31 19:40 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-07-26  9:39 [PATCH v4 1/2] mwifiex: add manufacturing mode support Amitkumar Karwar
2016-07-26  9:39 ` [PATCH v4 2/2] mwifiex: add cfg80211 testmode support Amitkumar Karwar
2016-08-31 19:40   ` Brian Norris [this message]
2016-09-02  7:40     ` [v4,2/2] " Amitkumar Karwar
2016-08-31 19:34 ` [v4,1/2] mwifiex: add manufacturing mode support Brian Norris
2016-09-02  7:39   ` Amitkumar Karwar

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=20160831194003.GA31478@localhost \
    --to=briannorris@chromium.org \
    --cc=akarwar@marvell.com \
    --cc=cluo@marvell.com \
    --cc=huxm@marvell.com \
    --cc=linux-wireless@vger.kernel.org \
    --cc=nishants@marvell.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.