2016-06-30 15:29:37

by Amitkumar Karwar

[permalink] [raw]
Subject: [PATCH 0/2] mwifiex: manufacturing mode

This patch series adds support for loading the driver in manufacturing
mode. It's needed to perform certain factory tests.

Amitkumar Karwar (1):
mwifiex: add manufacturing mode support

Xinming Hu (1):
mwifiex: add hostcmd wext ioctl support

drivers/net/wireless/marvell/mwifiex/cmdevt.c | 67 ++++++++++++++++++++++++
drivers/net/wireless/marvell/mwifiex/init.c | 22 +++++---
drivers/net/wireless/marvell/mwifiex/main.c | 73 +++++++++++++++++++++++++--
drivers/net/wireless/marvell/mwifiex/main.h | 13 ++++-
drivers/net/wireless/marvell/mwifiex/pcie.c | 2 +-
drivers/net/wireless/marvell/mwifiex/sdio.c | 2 +-
drivers/net/wireless/marvell/mwifiex/usb.c | 2 +-
7 files changed, 166 insertions(+), 15 deletions(-)

--
1.9.1



2016-06-30 15:04:46

by Amitkumar Karwar

[permalink] [raw]
Subject: [PATCH 1/2] mwifiex: add hostcmd wext ioctl support

From: Xinming Hu <[email protected]>

This patch adds ndo_ioctl support to mwifiex netdev handlers.
This will be used to download hostcmds to firmware from userspace.
This is needed for manufacturing mode support in mwifiex. ndo_ioctl
is allowed only when mfg mode is enabled via module load parameters.

Signed-off-by: Xinming Hu <[email protected]>
Signed-off-by: Amitkumar Karwar <[email protected]>
---
drivers/net/wireless/marvell/mwifiex/cmdevt.c | 59 +++++++++++++++++++++++++++
drivers/net/wireless/marvell/mwifiex/main.c | 38 +++++++++++++++++
drivers/net/wireless/marvell/mwifiex/main.h | 9 +++-
3 files changed, 105 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/marvell/mwifiex/cmdevt.c b/drivers/net/wireless/marvell/mwifiex/cmdevt.c
index c29f26d..fcfe556 100644
--- a/drivers/net/wireless/marvell/mwifiex/cmdevt.c
+++ b/drivers/net/wireless/marvell/mwifiex/cmdevt.c
@@ -818,6 +818,8 @@ int mwifiex_process_cmdresp(struct mwifiex_adapter *adapter)
hostcmd = adapter->curr_cmd->data_buf;
hostcmd->len = size;
memcpy(hostcmd->cmd, resp, size);
+ adapter->hostcmd_resp_data.len = size;
+ memcpy(adapter->hostcmd_resp_data.cmd, resp, size);
}
}
orig_cmdresp_no = le16_to_cpu(resp->command);
@@ -1200,6 +1202,63 @@ mwifiex_process_hs_config(struct mwifiex_adapter *adapter)
false);
}
EXPORT_SYMBOL_GPL(mwifiex_process_hs_config);
+/* This function get hostcmd data from userspace and construct a cmd
+ * to be download to FW.
+ */
+int mwifiex_process_host_command(struct mwifiex_private *priv,
+ struct iwreq *wrq)
+{
+ struct mwifiex_ds_misc_cmd *hostcmd_buf;
+ struct host_cmd_ds_command *cmd;
+ struct mwifiex_adapter *adapter = priv->adapter;
+ int ret;
+
+ hostcmd_buf = kzalloc(sizeof(*hostcmd_buf), GFP_KERNEL);
+ if (!hostcmd_buf)
+ return -ENOMEM;
+
+ cmd = (void *)hostcmd_buf->cmd;
+
+ if (copy_from_user(cmd, wrq->u.data.pointer,
+ sizeof(cmd->command) + sizeof(cmd->size))) {
+ ret = -EFAULT;
+ goto done;
+ }
+
+ hostcmd_buf->len = le16_to_cpu(cmd->size);
+ if (hostcmd_buf->len > MWIFIEX_SIZE_OF_CMD_BUFFER) {
+ ret = -EINVAL;
+ goto done;
+ }
+
+ if (copy_from_user(cmd, wrq->u.data.pointer, hostcmd_buf->len)) {
+ ret = -EFAULT;
+ goto done;
+ }
+
+ if (mwifiex_send_cmd(priv, 0, 0, 0, hostcmd_buf, true)) {
+ dev_err(priv->adapter->dev, "Failed to process hostcmd\n");
+ ret = -EFAULT;
+ goto done;
+ }
+
+ if (adapter->hostcmd_resp_data.len > hostcmd_buf->len) {
+ ret = -EFBIG;
+ goto done;
+ }
+
+ if (copy_to_user(wrq->u.data.pointer, adapter->hostcmd_resp_data.cmd,
+ adapter->hostcmd_resp_data.len)) {
+ ret = -EFAULT;
+ goto done;
+ }
+ wrq->u.data.length = adapter->hostcmd_resp_data.len;
+
+ ret = 0;
+done:
+ kfree(hostcmd_buf);
+ return ret;
+}

/*
* This function handles the command response of a sleep confirm command.
diff --git a/drivers/net/wireless/marvell/mwifiex/main.c b/drivers/net/wireless/marvell/mwifiex/main.c
index 0e280f8..8b06d1d 100644
--- a/drivers/net/wireless/marvell/mwifiex/main.c
+++ b/drivers/net/wireless/marvell/mwifiex/main.c
@@ -1211,17 +1211,54 @@ mwifiex_netdev_select_wmm_queue(struct net_device *dev, struct sk_buff *skb,
return mwifiex_1d_to_wmm_queue[skb->priority];
}

+static int mwifiex_do_ioctl(struct net_device *dev, struct ifreq *req, int cmd)
+{
+ struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
+ struct iwreq *wrq = (struct iwreq *)req;
+ int ret;
+
+ if (!priv->adapter->mfg_mode)
+ return -EINVAL;
+
+ dev_dbg(priv->adapter->dev, "ioctl cmd = 0x%x\n", cmd);
+
+ switch (cmd) {
+ case MWIFIEX_HOSTCMD_IOCTL:
+ ret = mwifiex_process_host_command(priv, wrq);
+ break;
+ default:
+ ret = -EINVAL;
+ break;
+ }
+
+ return ret;
+}
+
/* Network device handlers */
static const struct net_device_ops mwifiex_netdev_ops = {
.ndo_open = mwifiex_open,
.ndo_stop = mwifiex_close,
.ndo_start_xmit = mwifiex_hard_start_xmit,
.ndo_set_mac_address = mwifiex_set_mac_address,
+ .ndo_do_ioctl = mwifiex_do_ioctl,
.ndo_validate_addr = eth_validate_addr,
.ndo_tx_timeout = mwifiex_tx_timeout,
.ndo_get_stats = mwifiex_get_stats,
.ndo_set_rx_mode = mwifiex_set_multicast_list,
.ndo_select_queue = mwifiex_netdev_select_wmm_queue,
+ };
+
+static const struct iw_priv_args mwifiex_iwpriv_args[] = {
+ { MWIFIEX_HOSTCMD_IOCTL,
+ IW_PRIV_TYPE_BYTE | 2047,
+ IW_PRIV_TYPE_BYTE | 2047,
+ "hostcmd"
+ },
+};
+
+static struct iw_handler_def mwifiex_iwpriv_handler_def = {
+ .num_private_args = ARRAY_SIZE(mwifiex_iwpriv_args),
+ .private_args = (struct iw_priv_args *)mwifiex_iwpriv_args,
};

/*
@@ -1249,6 +1286,7 @@ void mwifiex_init_priv_params(struct mwifiex_private *priv,
{
dev->netdev_ops = &mwifiex_netdev_ops;
dev->destructor = free_netdev;
+ dev->wireless_handlers = &mwifiex_iwpriv_handler_def;
/* Initialize private structure */
priv->current_key_index = 0;
priv->media_connected = false;
diff --git a/drivers/net/wireless/marvell/mwifiex/main.h b/drivers/net/wireless/marvell/mwifiex/main.h
index 9f6bb40..23532cf 100644
--- a/drivers/net/wireless/marvell/mwifiex/main.h
+++ b/drivers/net/wireless/marvell/mwifiex/main.h
@@ -48,6 +48,8 @@
#include <linux/pm_runtime.h>
#include <linux/slab.h>
#include <linux/of_irq.h>
+#include <linux/wireless.h>
+#include <net/iw_handler.h>

#include "decl.h"
#include "ioctl.h"
@@ -157,6 +159,9 @@ enum {
/* Threshold for tx_timeout_cnt before we trigger a card reset */
#define TX_TIMEOUT_THRESHOLD 6

+/* IOCTL number used for hostcmd process*/
+#define MWIFIEX_HOSTCMD_IOCTL (SIOCIWFIRSTPRIV + 17)
+
#define MWIFIEX_DRV_INFO_SIZE_MAX 0x40000

/* Address alignment */
@@ -892,6 +897,7 @@ struct mwifiex_adapter {
u8 event_received;
u8 data_received;
u16 seq_num;
+ struct mwifiex_ds_misc_cmd hostcmd_resp_data;
struct cmd_ctrl_node *cmd_pool;
struct cmd_ctrl_node *curr_cmd;
/* spin lock for command */
@@ -1553,7 +1559,8 @@ bool mwifiex_is_bss_in_11ac_mode(struct mwifiex_private *priv);
u8 mwifiex_get_center_freq_index(struct mwifiex_private *priv, u8 band,
u32 pri_chan, u8 chan_bw);
int mwifiex_init_channel_scan_gap(struct mwifiex_adapter *adapter);
-
+int mwifiex_process_host_command(struct mwifiex_private *priv,
+ struct iwreq *wrq);
int mwifiex_tdls_check_tx(struct mwifiex_private *priv, struct sk_buff *skb);
void mwifiex_flush_auto_tdls_list(struct mwifiex_private *priv);
void mwifiex_auto_tdls_update_peer_status(struct mwifiex_private *priv,
--
1.9.1


2016-06-30 18:02:46

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH 1/2] mwifiex: add hostcmd wext ioctl support

Hi,

[auto build test ERROR on wireless-drivers-next/master]
[also build test ERROR on v4.7-rc5 next-20160630]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url: https://github.com/0day-ci/linux/commits/Amitkumar-Karwar/mwifiex-add-hostcmd-wext-ioctl-support/20160630-231444
base: https://git.kernel.org/pub/scm/linux/kernel/git/kvalo/wireless-drivers-next.git master
config: arm-exynos_defconfig (attached as .config)
compiler: arm-linux-gnueabi-gcc (Debian 5.3.1-8) 5.3.1 20160205
reproduce:
wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
make.cross ARCH=arm

All errors (new ones prefixed by >>):

drivers/net/wireless/marvell/mwifiex/main.c: In function 'mwifiex_do_ioctl':
drivers/net/wireless/marvell/mwifiex/main.c:1220:20: error: 'struct mwifiex_adapter' has no member named 'mfg_mode'
if (!priv->adapter->mfg_mode)
^
drivers/net/wireless/marvell/mwifiex/main.c: At top level:
drivers/net/wireless/marvell/mwifiex/main.c:1260:2: error: unknown field 'num_private_args' specified in initializer
.num_private_args = ARRAY_SIZE(mwifiex_iwpriv_args),
^
In file included from drivers/net/wireless/marvell/mwifiex/main.h:23:0,
from drivers/net/wireless/marvell/mwifiex/main.c:20:
include/linux/kernel.h:54:25: warning: initialization makes pointer from integer without a cast [-Wint-conversion]
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr))
^
drivers/net/wireless/marvell/mwifiex/main.c:1260:22: note: in expansion of macro 'ARRAY_SIZE'
.num_private_args = ARRAY_SIZE(mwifiex_iwpriv_args),
^
include/linux/kernel.h:54:25: note: (near initialization for 'mwifiex_iwpriv_handler_def.standard')
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr))
^
drivers/net/wireless/marvell/mwifiex/main.c:1260:22: note: in expansion of macro 'ARRAY_SIZE'
.num_private_args = ARRAY_SIZE(mwifiex_iwpriv_args),
^
drivers/net/wireless/marvell/mwifiex/main.c:1261:2: error: unknown field 'private_args' specified in initializer
.private_args = (struct iw_priv_args *)mwifiex_iwpriv_args,
^
drivers/net/wireless/marvell/mwifiex/main.c:1261:18: warning: initialization makes integer from pointer without a cast [-Wint-conversion]
.private_args = (struct iw_priv_args *)mwifiex_iwpriv_args,
^
drivers/net/wireless/marvell/mwifiex/main.c:1261:18: note: (near initialization for 'mwifiex_iwpriv_handler_def.num_standard')
drivers/net/wireless/marvell/mwifiex/main.c:1261:18: error: initializer element is not computable at load time
drivers/net/wireless/marvell/mwifiex/main.c:1261:18: note: (near initialization for 'mwifiex_iwpriv_handler_def.num_standard')
drivers/net/wireless/marvell/mwifiex/main.c: In function 'mwifiex_init_priv_params':
>> drivers/net/wireless/marvell/mwifiex/main.c:1289:5: error: 'struct net_device' has no member named 'wireless_handlers'
dev->wireless_handlers = &mwifiex_iwpriv_handler_def;
^

vim +1289 drivers/net/wireless/marvell/mwifiex/main.c

1255 "hostcmd"
1256 },
1257 };
1258
1259 static struct iw_handler_def mwifiex_iwpriv_handler_def = {
1260 .num_private_args = ARRAY_SIZE(mwifiex_iwpriv_args),
> 1261 .private_args = (struct iw_priv_args *)mwifiex_iwpriv_args,
1262 };
1263
1264 /*
1265 * This function initializes the private structure parameters.
1266 *
1267 * The following wait queues are initialized -
1268 * - IOCTL wait queue
1269 * - Command wait queue
1270 * - Statistics wait queue
1271 *
1272 * ...and the following default parameters are set -
1273 * - Current key index : Set to 0
1274 * - Rate index : Set to auto
1275 * - Media connected : Set to disconnected
1276 * - Adhoc link sensed : Set to false
1277 * - Nick name : Set to null
1278 * - Number of Tx timeout : Set to 0
1279 * - Device address : Set to current address
1280 * - Rx histogram statistc : Set to 0
1281 *
1282 * In addition, the CFG80211 work queue is also created.
1283 */
1284 void mwifiex_init_priv_params(struct mwifiex_private *priv,
1285 struct net_device *dev)
1286 {
1287 dev->netdev_ops = &mwifiex_netdev_ops;
1288 dev->destructor = free_netdev;
> 1289 dev->wireless_handlers = &mwifiex_iwpriv_handler_def;
1290 /* Initialize private structure */
1291 priv->current_key_index = 0;
1292 priv->media_connected = false;

---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation


Attachments:
(No filename) (4.95 kB)
.config.gz (24.38 kB)
Download all attachments

2016-06-30 15:04:58

by Amitkumar Karwar

[permalink] [raw]
Subject: [PATCH 2/2] mwifiex: add manufacturing mode support

By default normal mode is chosen when driver is loaded. This patch adds
a provision to choose manufacturing mode via module parameters.

Command to load driver in manufacturing mode
insmod mwifiex.ko mfg_mode=1 and mfg_firmware=mrvl/firmware.

Tested-by: chunfan chen <[email protected]>
Signed-off-by: Amitkumar Karwar <[email protected]>
---
drivers/net/wireless/marvell/mwifiex/cmdevt.c | 8 ++++++
drivers/net/wireless/marvell/mwifiex/init.c | 22 +++++++++++------
drivers/net/wireless/marvell/mwifiex/main.c | 35 ++++++++++++++++++++++++---
drivers/net/wireless/marvell/mwifiex/main.h | 4 +++
drivers/net/wireless/marvell/mwifiex/pcie.c | 2 +-
drivers/net/wireless/marvell/mwifiex/sdio.c | 2 +-
drivers/net/wireless/marvell/mwifiex/usb.c | 2 +-
7 files changed, 61 insertions(+), 14 deletions(-)

diff --git a/drivers/net/wireless/marvell/mwifiex/cmdevt.c b/drivers/net/wireless/marvell/mwifiex/cmdevt.c
index fcfe556..d961305 100644
--- a/drivers/net/wireless/marvell/mwifiex/cmdevt.c
+++ b/drivers/net/wireless/marvell/mwifiex/cmdevt.c
@@ -581,6 +581,14 @@ int mwifiex_send_cmd(struct mwifiex_private *priv, u16 cmd_no,
return -1;
}
}
+ /* We don't expect commands in manufacturing mode. They are cooked
+ * in application and ready to download buffer is passed to the driver
+ */
+ if (adapter->mfg_mode && cmd_no) {
+ dev_dbg(adapter->dev, "Ignoring commands in manufacturing mode\n");
+ return -1;
+ }
+

/* Get a new command node */
cmd_node = mwifiex_get_cmd_node(adapter);
diff --git a/drivers/net/wireless/marvell/mwifiex/init.c b/drivers/net/wireless/marvell/mwifiex/init.c
index 1489c90..82839d9 100644
--- a/drivers/net/wireless/marvell/mwifiex/init.c
+++ b/drivers/net/wireless/marvell/mwifiex/init.c
@@ -298,6 +298,7 @@ static void mwifiex_init_adapter(struct mwifiex_adapter *adapter)
memset(&adapter->arp_filter, 0, sizeof(adapter->arp_filter));
adapter->arp_filter_size = 0;
adapter->max_mgmt_ie_index = MAX_MGMT_IE_INDEX;
+ adapter->mfg_mode = mfg_mode;
adapter->key_api_major_ver = 0;
adapter->key_api_minor_ver = 0;
eth_broadcast_addr(adapter->perm_addr);
@@ -553,15 +554,22 @@ int mwifiex_init_fw(struct mwifiex_adapter *adapter)
return -1;
}
}
+ if (adapter->mfg_mode) {
+ adapter->hw_status = MWIFIEX_HW_STATUS_READY;
+ ret = -EINPROGRESS;
+ } else {
+ for (i = 0; i < adapter->priv_num; i++) {
+ if (adapter->priv[i]) {
+ ret = mwifiex_sta_init_cmd(adapter->priv[i],
+ first_sta, true);
+ if (ret == -1)
+ return -1;
+
+ first_sta = false;
+ }
+

- for (i = 0; i < adapter->priv_num; i++) {
- if (adapter->priv[i]) {
- ret = mwifiex_sta_init_cmd(adapter->priv[i], first_sta,
- true);
- if (ret == -1)
- return -1;

- first_sta = false;
}
}

diff --git a/drivers/net/wireless/marvell/mwifiex/main.c b/drivers/net/wireless/marvell/mwifiex/main.c
index 8b06d1d..e3e1fe9 100644
--- a/drivers/net/wireless/marvell/mwifiex/main.c
+++ b/drivers/net/wireless/marvell/mwifiex/main.c
@@ -36,6 +36,14 @@ static unsigned short driver_mode;
module_param(driver_mode, ushort, 0);
MODULE_PARM_DESC(driver_mode,
"station=0x1(default), ap-sta=0x3, station-p2p=0x5, ap-sta-p2p=0x7");
+bool mfg_mode;
+module_param(mfg_mode, bool, 0);
+MODULE_PARM_DESC(mfg_mode, "0:disable 1:enable (bool)");
+
+char *mfg_firmware = "";
+module_param(mfg_firmware, charp, 0);
+MODULE_PARM_DESC(mfg_firmware, "firmware path");
+

/*
* This function registers the device and performs all the necessary
@@ -559,10 +567,12 @@ static void mwifiex_fw_dpc(const struct firmware *firmware, void *context)
goto done;
}
/* Wait for mwifiex_init to complete */
- wait_event_interruptible(adapter->init_wait_q,
- adapter->init_wait_q_woken);
- if (adapter->hw_status != MWIFIEX_HW_STATUS_READY)
- goto err_init_fw;
+ if (!adapter->mfg_mode) {
+ wait_event_interruptible(adapter->init_wait_q,
+ adapter->init_wait_q_woken);
+ if (adapter->hw_status != MWIFIEX_HW_STATUS_READY)
+ goto err_init_fw;
+ }

priv = adapter->priv[MWIFIEX_BSS_ROLE_STA];
if (mwifiex_register_cfg80211(adapter)) {
@@ -666,6 +676,23 @@ static int mwifiex_init_hw_fw(struct mwifiex_adapter *adapter)
{
int ret;

+ if (mfg_mode && !strlen(mfg_firmware)) {
+ pr_err("%s: mfg firmware missing. Ignoring manufacturing mode\n",
+ __func__);
+ mfg_mode = false;
+ }
+
+ /* Override default firmware with manufacturing one if
+ * manufacturing mode is enabled
+ */
+ if (mfg_mode) {
+ if (strlcpy(adapter->fw_name, mfg_firmware,
+ sizeof(adapter->fw_name)) >=
+ sizeof(adapter->fw_name)) {
+ pr_err("%s: fw_name too long!\n", __func__);
+ return -1;
+ }
+ }
ret = request_firmware_nowait(THIS_MODULE, 1, adapter->fw_name,
adapter->dev, GFP_KERNEL, adapter,
mwifiex_fw_dpc);
diff --git a/drivers/net/wireless/marvell/mwifiex/main.h b/drivers/net/wireless/marvell/mwifiex/main.h
index 23532cf..5713fe5 100644
--- a/drivers/net/wireless/marvell/mwifiex/main.h
+++ b/drivers/net/wireless/marvell/mwifiex/main.h
@@ -60,6 +60,9 @@
#include "sdio.h"

extern const char driver_version[];
+extern bool mfg_mode;
+extern char *mfg_firmware;
+

struct mwifiex_adapter;
struct mwifiex_private;
@@ -995,6 +998,7 @@ struct mwifiex_adapter {
u32 drv_info_size;
bool scan_chan_gap_enabled;
struct sk_buff_head rx_data_q;
+ bool mfg_mode;
struct mwifiex_chan_stats *chan_stats;
u32 num_in_chan_stats;
int survey_idx;
diff --git a/drivers/net/wireless/marvell/mwifiex/pcie.c b/drivers/net/wireless/marvell/mwifiex/pcie.c
index 1b1e266..e15c483 100644
--- a/drivers/net/wireless/marvell/mwifiex/pcie.c
+++ b/drivers/net/wireless/marvell/mwifiex/pcie.c
@@ -226,7 +226,7 @@ static void mwifiex_pcie_remove(struct pci_dev *pdev)
if (!adapter || !adapter->priv_num)
return;

- if (user_rmmod) {
+ if (user_rmmod && !adapter->mfg_mode) {
#ifdef CONFIG_PM_SLEEP
if (adapter->is_suspended)
mwifiex_pcie_resume(&pdev->dev);
diff --git a/drivers/net/wireless/marvell/mwifiex/sdio.c b/drivers/net/wireless/marvell/mwifiex/sdio.c
index d3e1561..6dba409 100644
--- a/drivers/net/wireless/marvell/mwifiex/sdio.c
+++ b/drivers/net/wireless/marvell/mwifiex/sdio.c
@@ -289,7 +289,7 @@ mwifiex_sdio_remove(struct sdio_func *func)

mwifiex_dbg(adapter, INFO, "info: SDIO func num=%d\n", func->num);

- if (user_rmmod) {
+ if (user_rmmod && !adapter->mfg_mode) {
if (adapter->is_suspended)
mwifiex_sdio_resume(adapter->dev);

diff --git a/drivers/net/wireless/marvell/mwifiex/usb.c b/drivers/net/wireless/marvell/mwifiex/usb.c
index 0857575..ba616ec 100644
--- a/drivers/net/wireless/marvell/mwifiex/usb.c
+++ b/drivers/net/wireless/marvell/mwifiex/usb.c
@@ -611,7 +611,7 @@ static void mwifiex_usb_disconnect(struct usb_interface *intf)
if (!adapter->priv_num)
return;

- if (user_rmmod) {
+ if (user_rmmod && !adapter->mfg_mode) {
#ifdef CONFIG_PM
if (adapter->is_suspended)
mwifiex_usb_resume(intf);
--
1.9.1


2016-06-30 17:51:35

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH 1/2] mwifiex: add hostcmd wext ioctl support

Hi,

[auto build test ERROR on wireless-drivers-next/master]
[also build test ERROR on v4.7-rc5 next-20160630]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url: https://github.com/0day-ci/linux/commits/Amitkumar-Karwar/mwifiex-add-hostcmd-wext-ioctl-support/20160630-231444
base: https://git.kernel.org/pub/scm/linux/kernel/git/kvalo/wireless-drivers-next.git master
config: arm-at91_dt_defconfig (attached as .config)
compiler: arm-linux-gnueabi-gcc (Debian 5.3.1-8) 5.3.1 20160205
reproduce:
wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
make.cross ARCH=arm

All error/warnings (new ones prefixed by >>):

drivers/net/wireless/marvell/mwifiex/main.c: In function 'mwifiex_do_ioctl':
drivers/net/wireless/marvell/mwifiex/main.c:1220:20: error: 'struct mwifiex_adapter' has no member named 'mfg_mode'
if (!priv->adapter->mfg_mode)
^
drivers/net/wireless/marvell/mwifiex/main.c: At top level:
>> drivers/net/wireless/marvell/mwifiex/main.c:1260:2: error: unknown field 'num_private_args' specified in initializer
.num_private_args = ARRAY_SIZE(mwifiex_iwpriv_args),
^
In file included from drivers/net/wireless/marvell/mwifiex/main.h:23:0,
from drivers/net/wireless/marvell/mwifiex/main.c:20:
>> include/linux/kernel.h:54:25: warning: initialization makes pointer from integer without a cast [-Wint-conversion]
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr))
^
>> drivers/net/wireless/marvell/mwifiex/main.c:1260:22: note: in expansion of macro 'ARRAY_SIZE'
.num_private_args = ARRAY_SIZE(mwifiex_iwpriv_args),
^
include/linux/kernel.h:54:25: note: (near initialization for 'mwifiex_iwpriv_handler_def.standard')
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr))
^
>> drivers/net/wireless/marvell/mwifiex/main.c:1260:22: note: in expansion of macro 'ARRAY_SIZE'
.num_private_args = ARRAY_SIZE(mwifiex_iwpriv_args),
^
>> drivers/net/wireless/marvell/mwifiex/main.c:1261:2: error: unknown field 'private_args' specified in initializer
.private_args = (struct iw_priv_args *)mwifiex_iwpriv_args,
^
>> drivers/net/wireless/marvell/mwifiex/main.c:1261:18: warning: initialization makes integer from pointer without a cast [-Wint-conversion]
.private_args = (struct iw_priv_args *)mwifiex_iwpriv_args,
^
drivers/net/wireless/marvell/mwifiex/main.c:1261:18: note: (near initialization for 'mwifiex_iwpriv_handler_def.num_standard')
>> drivers/net/wireless/marvell/mwifiex/main.c:1261:18: error: initializer element is not computable at load time
drivers/net/wireless/marvell/mwifiex/main.c:1261:18: note: (near initialization for 'mwifiex_iwpriv_handler_def.num_standard')

vim +/num_private_args +1260 drivers/net/wireless/marvell/mwifiex/main.c

1214 static int mwifiex_do_ioctl(struct net_device *dev, struct ifreq *req, int cmd)
1215 {
1216 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
1217 struct iwreq *wrq = (struct iwreq *)req;
1218 int ret;
1219
> 1220 if (!priv->adapter->mfg_mode)
1221 return -EINVAL;
1222
1223 dev_dbg(priv->adapter->dev, "ioctl cmd = 0x%x\n", cmd);
1224
1225 switch (cmd) {
1226 case MWIFIEX_HOSTCMD_IOCTL:
1227 ret = mwifiex_process_host_command(priv, wrq);
1228 break;
1229 default:
1230 ret = -EINVAL;
1231 break;
1232 }
1233
1234 return ret;
1235 }
1236
1237 /* Network device handlers */
1238 static const struct net_device_ops mwifiex_netdev_ops = {
1239 .ndo_open = mwifiex_open,
1240 .ndo_stop = mwifiex_close,
1241 .ndo_start_xmit = mwifiex_hard_start_xmit,
1242 .ndo_set_mac_address = mwifiex_set_mac_address,
1243 .ndo_do_ioctl = mwifiex_do_ioctl,
1244 .ndo_validate_addr = eth_validate_addr,
1245 .ndo_tx_timeout = mwifiex_tx_timeout,
1246 .ndo_get_stats = mwifiex_get_stats,
1247 .ndo_set_rx_mode = mwifiex_set_multicast_list,
1248 .ndo_select_queue = mwifiex_netdev_select_wmm_queue,
1249 };
1250
1251 static const struct iw_priv_args mwifiex_iwpriv_args[] = {
1252 { MWIFIEX_HOSTCMD_IOCTL,
1253 IW_PRIV_TYPE_BYTE | 2047,
1254 IW_PRIV_TYPE_BYTE | 2047,
1255 "hostcmd"
1256 },
1257 };
1258
1259 static struct iw_handler_def mwifiex_iwpriv_handler_def = {
> 1260 .num_private_args = ARRAY_SIZE(mwifiex_iwpriv_args),
> 1261 .private_args = (struct iw_priv_args *)mwifiex_iwpriv_args,
1262 };
1263
1264 /*

---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation


Attachments:
(No filename) (4.88 kB)
.config.gz (20.84 kB)
Download all attachments