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__ */ -- 1.8.1.4 -- 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