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