blob: 610b17e7dce7df5587a3f81273f86ee610ca0bb5 [file] [log] [blame]
/************************************************************************
* Copyright (C) 2010, Marvell Technology Group Ltd.
* All Rights Reserved.
*
* This is UNPUBLISHED PROPRIETARY SOURCE CODE of Marvell Technology Group;
* the contents of this file may not be disclosed to third parties, copied
* or duplicated in any form, in whole or in part, without the prior
* written permission of Marvell Technology Group.
*
*********************************************************************************
* Marvell GPL License Option
*
* If you received this File from Marvell, you may opt to use, redistribute and/or
* modify this File in accordance with the terms and conditions of the General
* Public License Version 2, June 1991 (the "GPL License"), a copy of which is
* available along with the File in the license.txt file or by writing to the Free
* Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 or
* on the worldwide web at http://www.gnu.org/licenses/gpl.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 GPL License provides additional details about this warranty
* disclaimer.
*
*********************************************************************************
* mv_mac_learn_sysfsc.c
*
* DESCRIPTION:
*
*
*******************************************************************************/
#include "tpm_common.h"
#include "tpm_header.h"
#include "mv_mac_learn_header.h"
/*******************************************************************************
* sys_mac_learn_parse_addr
*
* DESCRIPTION:
* This function parses MAC address
* INPUTS:
* buf - buffer with parameter string
*
* OUTPUTS:
NONE.
*
* RETURNS:
* bool
*******************************************************************************/
static bool sys_mac_learn_parse_addr (char *buf, uint32_t *macaddr_parts)
{
if (6 == sscanf(buf, "%x:%x:%x:%x:%x:%x", &macaddr_parts[0], &macaddr_parts[1], &macaddr_parts[2], &macaddr_parts[3],
&macaddr_parts[4], &macaddr_parts[5])) {
if (macaddr_parts[0] <= 255 && macaddr_parts[1] <= 255 && macaddr_parts[2] <= 255 && macaddr_parts[3] <= 255 &&
macaddr_parts[4] <= 255 && macaddr_parts[5] <= 255)
return true;
}
return false;
}
/*******************************************************************************
* sys_mac_learn_count_para
*
* DESCRIPTION:
* This function get the number of input parameters
* INPUTS:
* buf - buffer with parameter string
*
* OUTPUTS:
NONE.
*
* RETURNS:
* int, number of input para
*******************************************************************************/
static int sys_mac_learn_count_para (const char *buf)
{
char bufcopy[513];
char **ap, *argv[20];
char *inputstring = bufcopy;
int numparms = 0;
strcpy(bufcopy, buf);
for (ap = argv; ap < &argv[15] && (*ap = strsep(&inputstring, " \t")) != NULL;) {
if (**ap != '\0') {
ap++;
numparms++;
}
}
return numparms;
}
/***********************************************************************************
**
** sfs_help_mac_learn_cfg_all - help for mac learn sysfs commands under cfg folder
**
************************************************************************************/
int sfs_help_mac_learn_cfg_all(char *buf)
{
int off = 0;
off += sprintf(buf+off, "\necho [src_mac] > mac_learn_static_entry_add - add one static MAC learn entry\n");
off += sprintf(buf+off, "\necho [src_mac] > mac_learn_static_entry_del - del one static MAC learn entry\n");
off += sprintf(buf+off, "\tsrc_mac (str)aa:bb:cc:dd:ee:ff where each part is hexadecimal in range 0..FF\n");
off += sprintf(buf+off, "\n");
off += sprintf(buf+off, "\necho [enable] > mac_learn_enable - enable/disable MAC learning\n");
off += sprintf(buf+off, "\necho [enable] > mac_learn_overwrite_enable - enable/disable non-static MAC entry overwrite when FDB full\n");
off += sprintf(buf+off, "\tenable (dec)0: disable, 1: enable\n");
off += sprintf(buf+off, "\n");
off += sprintf(buf+off, "\necho [max_count] > mac_learn_max_count_set - Set max count of MAC learning \n");
off += sprintf(buf+off, "\tmax_count (dec)Should not greater than PNC range size\n");
off += sprintf(buf+off, "\n");
off += sprintf(buf+off, "\necho [expired_time] > mac_learn_expired_time_set - Set expired time for non-static MAC learning entry\n");
off += sprintf(buf+off, "\texpired_time (dec)unit: second\n");
off += sprintf(buf+off, "\n");
off += sprintf(buf+off, "\necho [trace_level] > mac_learn_trace_level - Set trace level for print info\n");
off += sprintf(buf+off, "\ttrace_level (dec)0: no trace, 1: debug level, 2: warn level\n");
off += sprintf(buf+off, "\n");
return(off);
}
/*******************************************************************************
* sfs_mac_learn_static_entry_add
*
* DESCRIPTION:
* This function adds static MAC address as MAC learn entry
*
*
*******************************************************************************/
void sfs_mac_learn_static_entry_add(const char *buf, size_t len)
{
typedef enum {
mac_learn_static_mac, mac_learn_static_max
} l2_mac_rule_parm_indx_t;
uint32_t sa[6];
char temp_sa[30];
int numparms;
char src_mac[6];
int parsedargs;
numparms = sys_mac_learn_count_para(buf);
if (numparms != mac_learn_static_max) {
MVMACLEARN_ERR_PRINT("Parameter number not right");
} else {
/* Get parameters */
parsedargs = sscanf(buf, "%s", temp_sa);
if (sys_mac_learn_parse_addr(temp_sa, sa) == false) {
MVMACLEARN_ERR_PRINT("Invalid SA [%s]\n", temp_sa);
} else {
src_mac[0] = (char)sa[0];
src_mac[1] = (char)sa[1];
src_mac[2] = (char)sa[2];
src_mac[3] = (char)sa[3];
src_mac[4] = (char)sa[4];
src_mac[5] = (char)sa[5];
if (mv_mac_learn_static_entry_add(src_mac))
MVMACLEARN_ERR_PRINT("Faild to add static MAC entry");
else
printk("OK.\n");
}
}
}
/*******************************************************************************
* sfs_mac_learn_static_entry_del
*
* DESCRIPTION:
* This function deletes static MAC address as MAC learn entry
*
*
*******************************************************************************/
void sfs_mac_learn_static_entry_del(const char *buf, size_t len)
{
typedef enum {
mac_learn_static_mac, mac_learn_static_max
} l2_mac_rule_parm_indx_t;
uint32_t sa[6];
char temp_sa[30];
int numparms;
char src_mac[6];
int parsedargs;
numparms = sys_mac_learn_count_para(buf);
if (numparms != mac_learn_static_max) {
MVMACLEARN_ERR_PRINT("Parameter number not right");
} else {
/* Get parameters */
parsedargs = sscanf(buf, "%s", temp_sa);
if (sys_mac_learn_parse_addr(temp_sa, sa) == false) {
MVMACLEARN_ERR_PRINT("Invalid SA [%s]\n", temp_sa);
} else {
src_mac[0] = (char)sa[0];
src_mac[1] = (char)sa[1];
src_mac[2] = (char)sa[2];
src_mac[3] = (char)sa[3];
src_mac[4] = (char)sa[4];
src_mac[5] = (char)sa[5];
if (mv_mac_learn_static_entry_del(src_mac))
MVMACLEARN_ERR_PRINT("Faild to del static MAC entry");
else
printk("OK.\n");
}
}
}
/*******************************************************************************
* sfs_mac_learn_enable_cfg
*
* DESCRIPTION:
* This function enable or disable MAC learning
* INPUTS:
* buf - Shell parameters as char buffer
* len - Number of characters in buffer
*
*******************************************************************************/
void sfs_mac_learn_enable_cfg(const char *buf, size_t len)
{
typedef enum
{
mac_leanr_enable_bool, mac_leanr_enable_max
} mac_learn_enable_t;
uint32_t mac_learn_enable;
int parsedargs;
int numparms;
bool enable_para;
numparms = sys_mac_learn_count_para(buf);
if (numparms != mac_leanr_enable_max) {
MVMACLEARN_ERR_PRINT("Parameter number not right");
} else {
/* Get parameters */
parsedargs = sscanf(buf, "%d", &mac_learn_enable);
if (parsedargs != numparms) {
printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
} else {
if (mac_learn_enable)
enable_para = true;
else
enable_para = false;
if (mv_mac_learn_enable_set(enable_para))
MVMACLEARN_ERR_PRINT("Faild to enable/diable MAC learning\n");
}
}
}
/*******************************************************************************
* sfs_mac_learn_overwrite_enable_cfg
*
* DESCRIPTION:
* This function enable or disable MAC learning overwrite when FDB full
* INPUTS:
* buf - Shell parameters as char buffer
* len - Number of characters in buffer
*
*******************************************************************************/
void sfs_mac_learn_overwrite_enable_cfg(const char *buf, size_t len)
{
typedef enum
{
mac_learn_overwrite_bool, mac_learn_overwrite_max
} mac_learn_overwrite_t;
uint32_t mac_learn_overwrite;
int parsedargs;
int numparms;
bool enable_para;
numparms = sys_mac_learn_count_para(buf);
if (numparms != mac_learn_overwrite_max) {
MVMACLEARN_ERR_PRINT("Parameter number not right");
} else {
/* Get parameters */
parsedargs = sscanf(buf, "%d", &mac_learn_overwrite);
if (parsedargs != numparms) {
printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
} else {
if (mac_learn_overwrite)
enable_para = true;
else
enable_para = false;
if (mv_mac_learn_overwrite_enable_set(enable_para))
MVMACLEARN_ERR_PRINT("Faild to enable/diable MAC learning overwrite function\n");
}
}
}
/*******************************************************************************
* sfs_mac_learn_max_count_cfg
*
* DESCRIPTION:
* This function set the max count of mac leanr entry
* INPUTS:
* buf - Shell parameters as char buffer
* len - Number of characters in buffer
*
*******************************************************************************/
void sfs_mac_learn_max_count_cfg(const char *buf, size_t len)
{
typedef enum
{
mac_learn_max_count, mac_learn_max_count_max
} mac_learn_max_count_t;
uint32_t max_count;
int parsedargs;
int numparms;
int temp;
numparms = sys_mac_learn_count_para(buf);
if (numparms != mac_learn_max_count_max) {
MVMACLEARN_ERR_PRINT("Parameter number not right");
} else {
/* Get parameters */
parsedargs = sscanf(buf, "%d", &temp);
if (temp < 0) {
printk(KERN_INFO "ERROR: Negative Input(%d) can not be accepted\n", temp);
return;
}
max_count = temp;
if (parsedargs != numparms) {
printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
} else {
if (mv_mac_learn_max_count_set(max_count))
MVMACLEARN_ERR_PRINT("Faild to cfg MAC learning max count\n");
}
}
}
/*******************************************************************************
* sfs_mac_learn_expire_time_cfg
*
* DESCRIPTION:
* This function set the expired time of non-static mac leanr entry
* INPUTS:
* buf - Shell parameters as char buffer
* len - Number of characters in buffer
*
*******************************************************************************/
void sfs_mac_learn_expired_time_cfg(const char *buf, size_t len)
{
typedef enum
{
mac_learn_expire_time, mac_learn_expire_time_max
} mac_learn_expire_time_t;
uint32_t expire_time;
int parsedargs;
int numparms;
int temp;
numparms = sys_mac_learn_count_para(buf);
if (numparms != mac_learn_expire_time_max) {
MVMACLEARN_ERR_PRINT("Parameter number not right");
} else {
/* Get parameters */
parsedargs = sscanf(buf, "%d", &temp);
if (temp < 0) {
printk(KERN_INFO "ERROR: Negative Input(%d) can not be accepted\n", temp);
return;
}
expire_time = temp;
if (parsedargs != numparms) {
printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
} else {
if (mv_mac_learn_expire_time_set(expire_time))
MVMACLEARN_ERR_PRINT("Faild to cfg MAC learning expired time\n");
}
}
}
/*******************************************************************************
* sfs_mac_learn_trace_level_cfg
*
* DESCRIPTION:
* This function set the trace level of print info
* INPUTS:
* buf - Shell parameters as char buffer
* len - Number of characters in buffer
*
*******************************************************************************/
void sfs_mac_learn_trace_level_cfg(const char *buf, size_t len)
{
typedef enum
{
mac_learn_trace_level, mac_learn_trace_level_max
} mac_learn_trace_level_t;
uint32_t trace_level;
int parsedargs;
int numparms;
numparms = sys_mac_learn_count_para(buf);
if (numparms != mac_learn_trace_level_max) {
MVMACLEARN_ERR_PRINT("Parameter number not right");
} else {
/* Get parameters */
parsedargs = sscanf(buf, "%d", &trace_level);
if (parsedargs != numparms) {
printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
} else {
if (mv_mac_learn_op_trace_level_set(trace_level))
MVMACLEARN_ERR_PRINT("Faild to cfg MAC learning expired time\n");
}
}
}
/***********************************************************************************
**
** sfs_help_mac_learn_show_all - help for mac learn sysfs commands under show folder
**
************************************************************************************/
int sfs_help_mac_learn_show_all(char *buf)
{
int off = 0;
off += sprintf(buf+off, "\ncat show_mac_learn_enable - show mac learn enable state\n");
off += sprintf(buf+off, "\ncat show_mac_learn_overwrite_enable - show mac learn non-static entry overwrite enable state when FDB full\n");
off += sprintf(buf+off, "\ncat show_mac_learn_max_count - show mac learn max entry count\n");
off += sprintf(buf+off, "\ncat show_mac_learn_expire_time - show mac learn non-static entry expired time\n");
off += sprintf(buf+off, "\ncat show_mac_learn_fdb_entry - show mac learn entries in FDB\n");
off += sprintf(buf+off, "\n");
return(off);
}
/*******************************************************************************
* sfs_mac_learn_enable_get
*
* DESCRIPTION:
* This function show mac learn enable state
*******************************************************************************/
int sfs_mac_learn_enable_get(char *buf)
{
int off = 0;
char result[9];
bool mac_learn_enable;
if (mv_mac_learn_enable_get(&mac_learn_enable)) {
memcpy(result, "failed", strlen("failed")+1);
} else {
if (true == mac_learn_enable)
memcpy(result, "enable", strlen("enable")+1);
else
memcpy(result, "disable", strlen("disable")+1);
}
off += sprintf(buf+off, "\nmac learn enable get: %s\n", result);
return off;
}
/*******************************************************************************
* sfs_mac_learn_overwrite_enable_get
*
* DESCRIPTION:
* This function show mac learn overwrite enable state when FDB full
*******************************************************************************/
int sfs_mac_learn_overwrite_enable_get(char *buf)
{
int off = 0;
char result[8];
bool mac_learn_enable;
if (mv_mac_learn_overwrite_enable_get(&mac_learn_enable)) {
memcpy(result, "failed", strlen("failed")+1);
} else {
if (true == mac_learn_enable)
memcpy(result, "enable", strlen("enable")+1);
else
memcpy(result, "disable", strlen("disable")+1);
}
off += sprintf(buf+off, "\nmac learn overwrite enable get: %s\n", result);
return off;
}
/*******************************************************************************
* sfs_mac_learn_max_count_get
*
* DESCRIPTION:
* This function show mac learn MAX entry count configured
*******************************************************************************/
int sfs_mac_learn_max_count_get(char *buf)
{
int off = 0;
char result[8];
uint32_t max_count;
if (mv_mac_learn_max_count_get(&max_count)) {
memcpy(result, "failed", strlen("failed")+1);
off += sprintf(buf+off, "\nmac learn max count get: %s\n", result);
} else {
off += sprintf(buf+off, "\nmac learn max count get: %d\n", max_count);
}
return off;
}
/**************************************************************************************
* sfs_mac_learn_expired_time_get
*
* DESCRIPTION:
* This function show mac learn expired time configured for non-static entry
***************************************************************************************/
int sfs_mac_learn_expired_time_get(char *buf)
{
int off = 0;
char result[8];
uint32_t expire_time;
if (mv_mac_learn_expire_time_get(&expire_time)) {
memcpy(result, "failed", strlen("failed")+1);
off += sprintf(buf+off, "\nmac learn expire time get: %s\n", result);
} else {
off += sprintf(buf+off, "\nmac learn expire time get: %d(s)\n", expire_time);
}
return off;
}
/**************************************************************************************
* sfs_mac_learn_entry_print
*
* DESCRIPTION:
* This function print the MAC learning entries learned
***************************************************************************************/
int sfs_mac_learn_entry_print(char *buf)
{
int off = 0;
mac_learn_db_valid_print();
return off;
}
static mac_learn_store_sysfs_func_t mac_learn_sysfs_func_ara[] =
{
{"mac_learn_static_entry_add", sfs_mac_learn_static_entry_add},
{"mac_learn_static_entry_del", sfs_mac_learn_static_entry_del},
{"mac_learn_enable", sfs_mac_learn_enable_cfg},
{"mac_learn_overwrite_enable", sfs_mac_learn_overwrite_enable_cfg},
{"mac_learn_max_count_set", sfs_mac_learn_max_count_cfg},
{"mac_learn_expired_time_set", sfs_mac_learn_expired_time_cfg},
{"mac_learn_trace_level", sfs_mac_learn_trace_level_cfg},
};
static int mac_learn_num_store = sizeof(mac_learn_sysfs_func_ara)/sizeof(mac_learn_sysfs_func_ara[0]);
static ssize_t mac_learn_cfg_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t len)
{
const char *name = attr->attr.name;
mac_learn_store_sysfs_func_t *pnamefunc;
int indx;
bool found = false;
if (!capable(CAP_NET_ADMIN))
return -EPERM;
for (indx = 0; indx < mac_learn_num_store; indx++){
pnamefunc = &mac_learn_sysfs_func_ara[indx];
if (!strcmp(name, pnamefunc->sysfs_name)) {
found = true;
(pnamefunc->sysfs_func)(buf, len);
break;
}
}
if (found == false){
printk("%s: operation <%s> not found\n", __FUNCTION__, attr->attr.name);
}
return(len);
}
static mac_learn_show_sysfs_func_t mac_learn_show_sysfs_func_ara[] =
{
{"help_mac_learn_cfg", sfs_help_mac_learn_cfg_all},
{"help_mac_learn_show", sfs_help_mac_learn_show_all},
{"show_mac_learn_enable", sfs_mac_learn_enable_get},
{"show_mac_learn_overwrite_enable", sfs_mac_learn_overwrite_enable_get},
{"show_mac_learn_max_count", sfs_mac_learn_max_count_get},
{"show_mac_learn_expire_time", sfs_mac_learn_expired_time_get},
{"show_mac_learn_fdb_entry", sfs_mac_learn_entry_print},
};
static int mac_learn_num_show = sizeof(mac_learn_show_sysfs_func_ara)/sizeof(mac_learn_show_sysfs_func_ara[0]);
static ssize_t mac_learn_cfg_show(struct device *dev, struct device_attribute *attr, char *buf)
{
const char *name = attr->attr.name;
mac_learn_show_sysfs_func_t *pnamefunc;
int indx;
bool found = false;
int buflen = 0;
if (!capable(CAP_NET_ADMIN))
return -EPERM;
for (indx = 0; indx < mac_learn_num_show; indx++){
pnamefunc = &mac_learn_show_sysfs_func_ara[indx];
if (!strcmp(name, pnamefunc->sysfs_name)) {
found = true;
buflen = (pnamefunc->sysfs_func)(buf);
break;
}
}
if (found == false){
printk("%s: operation <%s> not found\n", __FUNCTION__, attr->attr.name);
}
return buflen;
}
/*store attr*/
static DEVICE_ATTR(mac_learn_static_entry_add, S_IWUSR, mac_learn_cfg_show, mac_learn_cfg_store);
static DEVICE_ATTR(mac_learn_static_entry_del, S_IWUSR, mac_learn_cfg_show, mac_learn_cfg_store);
static DEVICE_ATTR(mac_learn_enable, S_IWUSR, mac_learn_cfg_show, mac_learn_cfg_store);
static DEVICE_ATTR(mac_learn_overwrite_enable, S_IWUSR, mac_learn_cfg_show, mac_learn_cfg_store);
static DEVICE_ATTR(mac_learn_max_count_set, S_IWUSR, mac_learn_cfg_show, mac_learn_cfg_store);
static DEVICE_ATTR(mac_learn_expired_time_set, S_IWUSR, mac_learn_cfg_show, mac_learn_cfg_store);
static DEVICE_ATTR(mac_learn_trace_level, S_IWUSR, mac_learn_cfg_show, mac_learn_cfg_store);
/*show attr*/
static DEVICE_ATTR(help_mac_learn_cfg, S_IRUSR, mac_learn_cfg_show, mac_learn_cfg_store);
static DEVICE_ATTR(help_mac_learn_show, S_IRUSR, mac_learn_cfg_show, mac_learn_cfg_store);
static DEVICE_ATTR(show_mac_learn_enable, S_IRUSR, mac_learn_cfg_show, mac_learn_cfg_store);
static DEVICE_ATTR(show_mac_learn_overwrite_enable, S_IRUSR, mac_learn_cfg_show, mac_learn_cfg_store);
static DEVICE_ATTR(show_mac_learn_max_count, S_IRUSR, mac_learn_cfg_show, mac_learn_cfg_store);
static DEVICE_ATTR(show_mac_learn_expire_time, S_IRUSR, mac_learn_cfg_show, mac_learn_cfg_store);
static DEVICE_ATTR(show_mac_learn_fdb_entry, S_IRUSR, mac_learn_cfg_show, mac_learn_cfg_store);
static struct attribute *mac_learn_cfg_attrs[] =
{
&dev_attr_help_mac_learn_cfg.attr,
&dev_attr_mac_learn_static_entry_add.attr,
&dev_attr_mac_learn_static_entry_del.attr,
&dev_attr_mac_learn_enable.attr,
&dev_attr_mac_learn_overwrite_enable.attr,
&dev_attr_mac_learn_max_count_set.attr,
&dev_attr_mac_learn_expired_time_set.attr,
&dev_attr_mac_learn_trace_level.attr,
NULL
};
static struct attribute *mac_learn_show_attrs[] =
{
&dev_attr_help_mac_learn_show.attr,
&dev_attr_show_mac_learn_enable.attr,
&dev_attr_show_mac_learn_overwrite_enable.attr,
&dev_attr_show_mac_learn_max_count.attr,
&dev_attr_show_mac_learn_expire_time.attr,
&dev_attr_show_mac_learn_fdb_entry.attr,
NULL
};
static struct attribute_group mac_learn_cfg_group =
{
.name = "mac_learn_cfg",
.attrs = mac_learn_cfg_attrs
};
static struct attribute_group mac_learn_show_group =
{
.name = "mac_learn_show",
.attrs = mac_learn_show_attrs
};
static mv_attr_group_pair_t mac_learn_attr_group_pair[] =
{
{"mac_learn_cfg", &mac_learn_cfg_group},
{"mac_learn_show", &mac_learn_show_group},
};
static int num_attr_group_pairs = sizeof(mac_learn_attr_group_pair)/sizeof(mac_learn_attr_group_pair[0]);
/*******************************************************************************
* mv_mac_learn_sysfs_init()
*
* DESCRIPTION: Finish all initialization for sysfs.
*
* INPUTS:
* None
*
* OUTPUTS:
* None
*
* RETURNS:
* int, success--0; failed--non-zero
*******************************************************************************/
int mv_mac_learn_sysfs_init(void)
{
int err;
struct device *pd;
int indx;
pd = bus_find_device_by_name(&platform_bus_type, NULL, "mc_mac_learn");
if (!pd) {
platform_device_register_simple("mc_mac_learn", -1, NULL, 0);
pd = bus_find_device_by_name(&platform_bus_type, NULL, "mc_mac_learn");
}
if (!pd) {
printk(KERN_ERR"%s: cannot find mc_mac_learn device\n", __FUNCTION__);
pd = &platform_bus;
}
for (indx = 0; indx < num_attr_group_pairs; indx++) {
mv_attr_group_pair_t *ppair;
ppair = &mac_learn_attr_group_pair[indx];
err = sysfs_create_group(&pd->kobj, ppair->pattrgroup);
if (err) {
printk(KERN_INFO "sysfs_create_group failed for %s, err = %d\n", ppair->folder_name, err);
goto out;
}
}
printk(KERN_INFO "= MC MAC LEARN Module SYS FS Init ended successfully =\n");
out:
return err;
}
/*******************************************************************************
* mv_mac_learn_sysfs_exit()
*
* DESCRIPTION: unregister sysfs if exit
*
* INPUTS:
* None
*
* OUTPUTS:
* None
*
* RETURNS:
* None
*******************************************************************************/
void mv_mac_learn_sysfs_exit(void)
{
struct device *pd;
int indx;
pd = bus_find_device_by_name(&platform_bus_type, NULL, "mc_mac_learn");
if (!pd) {
printk(KERN_ERR"%s: cannot find mc_mac_learn device\n", __FUNCTION__);
return;
}
for (indx = 0; indx < num_attr_group_pairs; indx++) {
mv_attr_group_pair_t *ppair;
ppair = &mac_learn_attr_group_pair[indx];
sysfs_remove_group(&pd->kobj, ppair->pattrgroup);
}
printk(KERN_INFO "= MC MAC LEARN Module SYS FS Remove ended successfully =\n");
}