143 lines
3.8 KiB
C
143 lines
3.8 KiB
C
/* Marvell wireless LAN device driver: sysfs
|
|
*
|
|
* Copyright (C) 2015, 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 "main.h"
|
|
|
|
bool mfg_mode;
|
|
char mfg_firmware[32];
|
|
|
|
static ssize_t
|
|
mwifiex_sysfs_get_mfg_mode(struct device *dev, struct device_attribute *attr,
|
|
char *buf)
|
|
{
|
|
struct mwifiex_private *priv = to_net_dev(dev)->ml_priv;
|
|
|
|
return snprintf(buf, PAGE_SIZE, "%d\n", priv->adapter->mfg_mode);
|
|
}
|
|
|
|
static ssize_t
|
|
mwifiex_sysfs_set_mfg_mode(struct device *dev, struct device_attribute *attr,
|
|
const char *buf, size_t count)
|
|
{
|
|
bool res;
|
|
|
|
if (strtobool(buf, &res))
|
|
return -EINVAL;
|
|
|
|
mfg_mode = res;
|
|
|
|
return count;
|
|
}
|
|
|
|
static DEVICE_ATTR(mfg_mode, S_IRUGO | S_IWUSR,
|
|
mwifiex_sysfs_get_mfg_mode,
|
|
mwifiex_sysfs_set_mfg_mode);
|
|
|
|
static ssize_t mwifiex_sysfs_show_mfg_firmware(struct device *dev,
|
|
struct device_attribute *attr,
|
|
char *buf)
|
|
{
|
|
return snprintf(buf, PAGE_SIZE, "%s\n", mfg_firmware);
|
|
}
|
|
|
|
static ssize_t mwifiex_sysfs_store_mfg_firmware(struct device *dev,
|
|
struct device_attribute *attr,
|
|
const char *buf, size_t count)
|
|
{
|
|
int len;
|
|
|
|
len = strlen(buf);
|
|
if (len > sizeof(mfg_firmware))
|
|
return -EINVAL;
|
|
|
|
strcpy(mfg_firmware, buf);
|
|
mfg_firmware[len - 1] = '\0';
|
|
|
|
return count;
|
|
}
|
|
static DEVICE_ATTR(mfg_firmware, S_IRUGO | S_IWUSR,
|
|
mwifiex_sysfs_show_mfg_firmware,
|
|
mwifiex_sysfs_store_mfg_firmware);
|
|
|
|
static ssize_t
|
|
mwifiex_sysfs_get_led_support(struct device *dev, struct device_attribute *attr,
|
|
char *buf)
|
|
{
|
|
struct mwifiex_private *priv = to_net_dev(dev)->ml_priv;
|
|
|
|
return snprintf(buf, 10, "%d\n", priv->adapter->led_support);
|
|
}
|
|
|
|
static ssize_t
|
|
mwifiex_sysfs_set_led_support(struct device *dev, struct device_attribute *attr,
|
|
const char *buf, size_t count)
|
|
{
|
|
struct mwifiex_private *priv = to_net_dev(dev)->ml_priv;
|
|
bool res;
|
|
|
|
if (strtobool(buf, &res))
|
|
return -EINVAL;
|
|
|
|
priv->adapter->led_support = !!res;
|
|
|
|
if (priv->netdev->flags & IFF_UP) {
|
|
if (priv->adapter->led_support)
|
|
mwifiex_set_led(priv->adapter, MWIFIEX_LED_ON);
|
|
else
|
|
mwifiex_set_led(priv->adapter, MWIFIEX_LED_OFF);
|
|
}
|
|
|
|
return count;
|
|
}
|
|
|
|
static DEVICE_ATTR(led, S_IRUGO | S_IWUSR,
|
|
mwifiex_sysfs_get_led_support,
|
|
mwifiex_sysfs_set_led_support);
|
|
|
|
int mwifiex_sysfs_register(struct mwifiex_private *priv)
|
|
{
|
|
int ret;
|
|
|
|
/* Create sysfs file to control manufacturing mode feature*/
|
|
ret = device_create_file(&priv->netdev->dev, &dev_attr_mfg_mode);
|
|
if (ret)
|
|
mwifiex_dbg(priv->adapter, ERROR,
|
|
"failed to create sysfs file mfg_mode\n");
|
|
|
|
/* Create sysfs file for manufacturing firmware name */
|
|
ret = device_create_file(&priv->netdev->dev, &dev_attr_mfg_firmware);
|
|
if (ret)
|
|
mwifiex_dbg(priv->adapter, ERROR,
|
|
"failed to create sysfs file mfg_firmware\n");
|
|
|
|
/* Create sysfs file to control LED feature */
|
|
ret = device_create_file(&priv->netdev->dev, &dev_attr_led);
|
|
if (ret)
|
|
mwifiex_dbg(priv->adapter, ERROR,
|
|
"failed to create sysfs file rf_led\n");
|
|
|
|
return ret;
|
|
}
|
|
|
|
void mwifiex_sysfs_unregister(struct mwifiex_private *priv)
|
|
{
|
|
device_remove_file(&priv->netdev->dev, &dev_attr_mfg_mode);
|
|
device_remove_file(&priv->netdev->dev, &dev_attr_mfg_firmware);
|
|
device_remove_file(&priv->netdev->dev, &dev_attr_led);
|
|
}
|
|
|