Search Linux Wireless

RE: [PATCH] mwifiex: handle edmac vendor command

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Kalle,
	
> From: Amitkumar Karwar [mailto:akarwar@xxxxxxxxxxx]
> Sent: Friday, April 29, 2016 9:28 PM
> To: linux-wireless@xxxxxxxxxxxxxxx
> Cc: Jeff CF Chen; Amitkumar Karwar
> Subject: [PATCH] mwifiex: handle edmac vendor command
> 
> From: chunfan chen <jeffc@xxxxxxxxxxx>
> 
> Userspace can configure edmac values through a custom vendor command.
> They will be used by hardware for adaptivity.
> 
> Signed-off-by: chunfan chen <jeffc@xxxxxxxxxxx>
> Signed-off-by: Amitkumar Karwar <akarwar@xxxxxxxxxxx>
> ---
>  drivers/net/wireless/marvell/mwifiex/Makefile   |  1 +
>  drivers/net/wireless/marvell/mwifiex/cfg80211.c |  2 +
>  drivers/net/wireless/marvell/mwifiex/main.h     |  4 ++
>  drivers/net/wireless/marvell/mwifiex/sta_cmd.c  | 20 ++++++---
>  drivers/net/wireless/marvell/mwifiex/vendor.c   | 59
> +++++++++++++++++++++++++
>  drivers/net/wireless/marvell/mwifiex/vendor.h   | 27 +++++++++++
>  6 files changed, 108 insertions(+), 5 deletions(-)  create mode 100644
> drivers/net/wireless/marvell/mwifiex/vendor.c
>  create mode 100644 drivers/net/wireless/marvell/mwifiex/vendor.h
> 
> diff --git a/drivers/net/wireless/marvell/mwifiex/Makefile
> b/drivers/net/wireless/marvell/mwifiex/Makefile
> index fdfd9bf..8b34ce9 100644
> --- a/drivers/net/wireless/marvell/mwifiex/Makefile
> +++ b/drivers/net/wireless/marvell/mwifiex/Makefile
> @@ -42,6 +42,7 @@ mwifiex-y += cfg80211.o  mwifiex-y += ethtool.o
> mwifiex-y += 11h.o  mwifiex-y += tdls.o
> +mwifiex-y += vendor.o
>  mwifiex-$(CONFIG_DEBUG_FS) += debugfs.o
>  obj-$(CONFIG_MWIFIEX) += mwifiex.o
> 
> diff --git a/drivers/net/wireless/marvell/mwifiex/cfg80211.c
> b/drivers/net/wireless/marvell/mwifiex/cfg80211.c
> index ff948a9..00aca7e 100644
> --- a/drivers/net/wireless/marvell/mwifiex/cfg80211.c
> +++ b/drivers/net/wireless/marvell/mwifiex/cfg80211.c
> @@ -4118,6 +4118,8 @@ int mwifiex_register_cfg80211(struct
> mwifiex_adapter *adapter)
>  	if (adapter->fw_api_ver == MWIFIEX_FW_V15)
>  		wiphy->features |= NL80211_FEATURE_SK_TX_STATUS;
> 
> +	marvell_set_vendor_commands(wiphy);
> +
>  	/* Reserve space for mwifiex specific private data for BSS */
>  	wiphy->bss_priv_size = sizeof(struct mwifiex_bss_priv);
> 
> diff --git a/drivers/net/wireless/marvell/mwifiex/main.h
> b/drivers/net/wireless/marvell/mwifiex/main.h
> index 0207af0..66ba5c0 100644
> --- a/drivers/net/wireless/marvell/mwifiex/main.h
> +++ b/drivers/net/wireless/marvell/mwifiex/main.h
> @@ -1002,6 +1002,8 @@ struct mwifiex_adapter {
>  	bool usb_mc_status;
>  	bool usb_mc_setup;
>  	struct cfg80211_wowlan_nd_info *nd_info;
> +	u8 *cfg_data;
> +	int cfg_len;
>  };
> 
>  void mwifiex_process_tx_queue(struct mwifiex_adapter *adapter); @@ -
> 1614,6 +1616,8 @@ void mwifiex_process_multi_chan_event(struct
> mwifiex_private *priv,
>  				      struct sk_buff *event_skb);
>  void mwifiex_multi_chan_resync(struct mwifiex_adapter *adapter);
> 
> +void marvell_set_vendor_commands(struct wiphy *wiphy);
> +
>  #ifdef CONFIG_DEBUG_FS
>  void mwifiex_debugfs_init(void);
>  void mwifiex_debugfs_remove(void);
> diff --git a/drivers/net/wireless/marvell/mwifiex/sta_cmd.c
> b/drivers/net/wireless/marvell/mwifiex/sta_cmd.c
> index e436574..6b8cc39 100644
> --- a/drivers/net/wireless/marvell/mwifiex/sta_cmd.c
> +++ b/drivers/net/wireless/marvell/mwifiex/sta_cmd.c
> @@ -1487,9 +1487,10 @@ static int mwifiex_cmd_cfg_data(struct
> mwifiex_private *priv,  {
>  	struct mwifiex_adapter *adapter = priv->adapter;
>  	struct property *prop = data_buf;
> -	u32 len;
> +	u32 len = 0;
>  	u8 *data = (u8 *)cmd + S_DS_GEN;
>  	int ret;
> +	const struct firmware *cal_data = adapter->cal_data;
> 
>  	if (prop) {
>  		len = prop->length;
> @@ -1500,11 +1501,20 @@ static int mwifiex_cmd_cfg_data(struct
> mwifiex_private *priv,
>  		mwifiex_dbg(adapter, INFO,
>  			    "download cfg_data from device tree: %s\n",
>  			    prop->name);
> -	} else if (adapter->cal_data->data && adapter->cal_data->size > 0)
> {
> -		len = mwifiex_parse_cal_cfg((u8 *)adapter->cal_data->data,
> -					    adapter->cal_data->size, data);
> +	} else if (cal_data) {
> +		if (cal_data->data && cal_data->size > 0) {
> +			len = mwifiex_parse_cal_cfg((u8 *)cal_data->data,
> +						    cal_data->size, data);
> +			mwifiex_dbg(adapter, INFO,
> +				    "download cfg_data from config file\n");
> +		} else {
> +			return -1;
> +		}
> +	} else if (adapter->cfg_data && adapter->cfg_len > 0) {
> +		len = mwifiex_parse_cal_cfg(adapter->cfg_data,
> +					    adapter->cfg_len, data);
>  		mwifiex_dbg(adapter, INFO,
> -			    "download cfg_data from config file\n");
> +			    "download cfg_data from iw vendor command\n");
>  	} else {
>  		return -1;
>  	}
> diff --git a/drivers/net/wireless/marvell/mwifiex/vendor.c
> b/drivers/net/wireless/marvell/mwifiex/vendor.c
> new file mode 100644
> index 0000000..ecdc10c
> --- /dev/null
> +++ b/drivers/net/wireless/marvell/mwifiex/vendor.c
> @@ -0,0 +1,59 @@
> +/* Marvell Wireless LAN device driver: TDLS handling
> + *
> + * Copyright (C) 2014, Marvell International Ltd.
> + *
> + * This software file (the "File") is distributed by Marvell
> +International
> + * Ltd. under the terms of the GNU General Public License Version 2,
> +June 1991
> + * (the "License").  You may use, redistribute and/or modify this File
> +in
> + * accordance with the terms and conditions of the License, a copy of
> +which
> + * is available on the worldwide web at
> + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
> + *
> + * THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR
> +PURPOSE
> + * ARE EXPRESSLY DISCLAIMED.  The License provides additional details
> +about
> + * this warranty disclaimer.
> + */
> +
> +#include <net/mac80211.h>
> +#include <net/netlink.h>
> +#include "vendor.h"
> +#include "main.h"
> +
> +static int
> +mwifiex_vendor_cmd_set_edmac_data(struct wiphy *wiphy,
> +				  struct wireless_dev *wdev,
> +				  const void *data, int data_len)
> +{
> +	struct mwifiex_private *priv = mwifiex_netdev_get_priv(wdev-
> >netdev);
> +	int ret;
> +
> +	priv->adapter->cfg_data = (u8 *)data;
> +	priv->adapter->cfg_len = data_len;
> +
> +	ret = mwifiex_send_cmd(priv, HostCmd_CMD_CFG_DATA,
> +			       HostCmd_ACT_GEN_SET, 0, NULL, true);
> +
> +	priv->adapter->cfg_data = NULL;
> +	priv->adapter->cfg_len = 0;
> +
> +	return 0;
> +}
> +
> +static const struct wiphy_vendor_command marvell_vendor_commands[] = {
> +	{
> +		.info = {
> +			.vendor_id = MARVELL_OUI,
> +			.subcmd = MARVELL_VENDOR_CMD_SET_EDMAC_DATA,
> +		},
> +		.flags = WIPHY_VENDOR_CMD_NEED_NETDEV |
> +			 WIPHY_VENDOR_CMD_NEED_RUNNING,
> +		.doit = mwifiex_vendor_cmd_set_edmac_data,
> +	},
> +};
> +
> +void marvell_set_vendor_commands(struct wiphy *wiphy) {
> +	wiphy->vendor_commands = marvell_vendor_commands;
> +	wiphy->n_vendor_commands = ARRAY_SIZE(marvell_vendor_commands);
> +}
> diff --git a/drivers/net/wireless/marvell/mwifiex/vendor.h
> b/drivers/net/wireless/marvell/mwifiex/vendor.h
> new file mode 100644
> index 0000000..e5d6fe8
> --- /dev/null
> +++ b/drivers/net/wireless/marvell/mwifiex/vendor.h
> @@ -0,0 +1,27 @@
> +/* Marvell Wireless LAN device driver: TDLS handling
> + *
> + * Copyright (C) 2014, Marvell International Ltd.
> + *
> + * This software file (the "File") is distributed by Marvell
> +International
> + * Ltd. under the terms of the GNU General Public License Version 2,
> +June 1991
> + * (the "License").  You may use, redistribute and/or modify this File
> +in
> + * accordance with the terms and conditions of the License, a copy of
> +which
> + * is available on the worldwide web at
> + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
> + *
> + * THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR
> +PURPOSE
> + * ARE EXPRESSLY DISCLAIMED.  The License provides additional details
> +about
> + * this warranty disclaimer.
> + */
> +
> +#ifndef __MARVELL_VENDOR_H__
> +#define __MARVELL_VENDOR_H__
> +
> +#define MARVELL_OUI	0x005043
> +
> +enum marvell_vendor_commands {
> +	MARVELL_VENDOR_CMD_SET_EDMAC_DATA,
> +};
> +
> +#endif /* __MARVELL_VENDOR_H__ */
> --

This patch seems to have deferred.
We basically want a way to download a vendor specific configuration to our firmware.
Do you have any suggestions on how can achieve this in better way?

I can see below iw command suits our requirement.

iw dev <devname> vendor send <oui> <subcmd> <filename|-|hex data>

Please guide.

Regards,
Amitkumar
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Wireless Personal Area Network]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite Hiking]     [MIPS Linux]     [ARM Linux]     [Linux RAID]

  Powered by Linux