Files
m241Neelima/components/ip_net2-6.9/ipwlan/src/ipwlan_cmd_broadcom.c
T
2026-07-30 11:19:44 +05:30

549 lines
16 KiB
C

/*
******************************************************************************
* INTERPEAK SOURCE FILE
*
* Document no: @(#) $Name: VXWORKS_ITER40_2019102207 $ $RCSfile: ipwlan_cmd_broadcom.c,v $ $Revision: 1.7.16.3 $
* $Source: /home/interpeak/CVSRoot/ipwlan/src/ipwlan_cmd_broadcom.c,v $
* $Author: hxu4 $
* $State: Exp $ $: $
*
* Copyright 2000-2005 Interpeak AB (http://www.interpeak.se). All rights reserved.
******************************************************************************
*/
/*
****************************************************************************
* 1 DESCRIPTION
****************************************************************************
*/
/*
****************************************************************************
* 2 CONFIGURATION
****************************************************************************
*/
/*
****************************************************************************
* 3 INCLUDE FILES
****************************************************************************
*/
#define IPCOM_USE_CLIB_PROTO
#include <stdarg.h>
#include <ipcom_type.h>
#include <ipcom_cstyle.h>
#include <ipcom_err.h>
#include <ipcom_sock.h>
#include <ipcom_clib.h>
#include <ipcom_syslog.h>
#include <ipcom_errno.h>
#include <ipcom_sysvar.h>
#include <ipcom_os.h>
#include <ipcom_time.h>
#include <ipcom_netif.h>
#include <ipwlan_wlan.h>
#include <ipcom_shell.h>
#include <ipwlan_broadcom.h>
/*
****************************************************************************
* 4 DEFINES
****************************************************************************
*/
#ifdef IPCOM_SYSLOG_FACILITY
#undef IPCOM_SYSLOG_FACILITY
#endif
#define IPCOM_SYSLOG_FACILITY IPCOM_LOG_WLAN
#ifdef IPCOM_SYSLOG_PRIORITY
#undef IPCOM_SYSLOG_PRIORITY
#endif
#if defined(_WRS_CONFIG_IPWLAN_SYSLOG_PRIORITY)
#define IPCOM_SYSLOG_PRIORITY _WRS_CONFIG_IPWLAN_SYSLOG_PRIORITY
#else
#define IPCOM_SYSLOG_PRIORITY IPCOM_LOG_WARNING
#endif
/*
****************************************************************************
* 5 TYPES
****************************************************************************
*/
/*
****************************************************************************
* 6 EXTERN PROTOTYPES
****************************************************************************
*/
IP_EXTERN int ipcom_vprintf(const char *format, va_list ap);
IP_EXTERN int vsnprintf(char *, int, const char *, va_list);
IP_EXTERN Ip_err ipwlan_broadcom_start(void);
IP_EXTERN int ipwlan_broadcom_ioctl_if(void *netif, Ip_u32 cmd, Ipcom_iwreq *iw);
IP_EXTERN int ipwlan_cmd_wlan_silent(int argc, char **argv);
IP_EXTERN int wl(char *cmd_line);
IP_EXTERN int wl_set(void *, int, void *, int);
IP_EXTERN int wl_get(void *, int, void *, int);
/*
****************************************************************************
* 7 LOCAL PROTOTYPES
****************************************************************************
*/
IP_STATIC void ipwlan_broadcom_print_usage(int en);
IP_STATIC int ipwlan_broadcom_printf(int enabled, const char *format, ...);
IP_STATIC int ipwlan_broadcom_cmd_broadcom_en(int en, int argc, char **argv);
IP_STATIC int ipwlan_broadcom_run_boot_cmd(const char *conf[], int len);
IP_PUBLIC int ipwlan_broadcom_cmd_prism(int argc, char **argv);
IP_PUBLIC int ipwlan_broadcom_boot(void);
IP_STATIC int ipwlan_broadcom_cmd_info(int en,char *if_name);
IP_EXTERN Ip_err ipcom_drv_eth_init(const char *drvname, Ip_u32 drvunit,
const char *ifname);
/*
****************************************************************************
* 8 DATA
****************************************************************************
*/
IP_EXTERN const char *ipwlan_broadcom_default_if;
IP_EXTERN const char *ipwlan_broadcom_attach[];
IP_EXTERN const char *ipwlan_broadcom_config[];
IP_EXTERN const int ipwlan_broadcom_config_len;
/*
****************************************************************************
* 9 STATIC FUNCTIONS
****************************************************************************
*/
/*
*===========================================================================
* ipwlan_broadcom_printf
*===========================================================================
* Description: Prints to console
* Parameters: 'enabled' == 0 => printout is suppressed
* Returns: 0
*/
IP_STATIC int
ipwlan_broadcom_printf(int enabled, const char *format, ...)
{
va_list ptr;
char text[MAX_TEXT_LEN];
va_start(ptr, format);
if (enabled)
{
vsnprintf(text, MAX_TEXT_LEN - 1, format, ptr);
ipcom_printf("%s", text);
}
va_end(ptr);
return 0;
}
/*
*===========================================================================
* ipwlan_broadcom_run_boot_cmd
*===========================================================================
* Description: Executes the shell commands in 'conf'
* Allowed commands are 'bcm' and 'wifi'
* Parameters: 'conf': List of commands
* 'len' : Number of commands in 'conf'
* Returns: 0
*
*/
IP_STATIC int
ipwlan_broadcom_run_boot_cmd(const char *conf[], int len)
{
int i;
int argc;
char *argv[20];
char *conf_ram;
char *conf_free;
ipcom_millisleep(500);
for (i = 0; i < len; i++)
{
conf_free = conf_ram = ipcom_strdup(conf[i]);
if(conf_ram == IP_NULL)
{
return 0;
}
for (argc = 0; *conf_ram;)
{
conf_ram += ipcom_strspn(conf_ram, " \t");
argv[argc++] = conf_ram;
conf_ram += ipcom_strcspn(conf_ram, " \t");
if (*conf_ram == '\0')
{
break;
}
*conf_ram++ = '\0';
}
ipcom_millisleep(500);
if (!ipcom_strcmp(argv[0], "wifi_bcm"))
{
ipwlan_broadcom_cmd_broadcom_en(0, argc, argv);
}
else
{
ipwlan_cmd_wlan_silent(argc, argv);
}
ipcom_free(conf_free);
}
return 0;
}
/*
*===========================================================================
* ipwlan_broadcom_print_usage
*===========================================================================
* Description: Lists shell commands available
* Parameters: 'en' == 0 => No printout to console
* Returns: <void>
*/
IP_STATIC void
ipwlan_broadcom_print_usage(int en)
{
ipwlan_broadcom_printf(en, "Usage:"IP_LF);
ipwlan_broadcom_printf(en, " wifi_bcm <iface> attach Attach BCM4318 ioctl translator"IP_LF);
ipwlan_broadcom_printf(en, " debug [<bitmap>] Set/Get debug bitmap"IP_LF);
ipwlan_broadcom_printf(en, " info Read device information"IP_LF);
ipwlan_broadcom_printf(en, " phy Read device phy status"IP_LF);
ipwlan_broadcom_printf(en, " reset Reset device"IP_LF);
ipwlan_broadcom_printf(en, " statistics Read device statistics"IP_LF);
ipwlan_broadcom_printf(en, " status Read current device status"IP_LF);
ipwlan_broadcom_printf(en, " wl cmds List broadcom commands"IP_LF);
ipwlan_broadcom_printf(en, " wl <cmd> Issue broadcom command"IP_LF);
}
/*
*===========================================================================
* ipwlan_broadcom_cmd_broadcom
*===========================================================================
* Description: Parses and executes shell commands.
* Parameters: 'en' == 0 => Do not print to console,
* Returns: 0 on success
*/
IP_STATIC int
ipwlan_broadcom_cmd_broadcom_en(int en, int argc, char **argv)
{
int i;
int k;
char *c;
Ip_fd fd;
Ip_u32 value;
Ip_u32 adebug;
Ip_u32 sdebug;
char *endp;
Ipcom_iwreq iwreq;
char text[MAX_TEXT_LEN];
char *if_name;
Ip_err ret = IPCOM_SUCCESS;
if (argc < 3)
{
/* To few arguments */
ipwlan_broadcom_print_usage(en);
return ret;
}
#ifdef IPCOM_USE_INET
fd = ipcom_socket(IP_AF_INET, IP_SOCK_DGRAM, 0);
#else
fd = ipcom_socket(IP_AF_INET6, IP_SOCK_DGRAM, 0);
#endif
if (fd == IP_SOCKERR)
{
ipwlan_broadcom_printf(en, "Error: unable to create command socket"IP_LF);
return IPCOM_ERR_FAILED;
}
#ifndef IP_PORT_LAS
/* Attach */
if (!ipcom_strcmp(argv[2], "attach"))
{
ipcom_sprintf(iwreq.if_name, "%.*s", IP_IFNAMSIZ - 1, argv[1]);
iwreq.u.data.pointer = (void *)ipwlan_broadcom_ioctl_if;
i = atoi(argv[1]+strlen(argv[1])-1);
if_name = ipcom_strtok(argv[1],"0123456789");
if (if_name == IP_NULL || strlen(if_name) > IP_IFNAMSIZ)
{
ipwlan_broadcom_printf(en, "Error: Could not attach: bad interface name"IP_LF);
goto error;
}
if (ipcom_socketioctl(fd, IP_SIOCSIWATTACHFUNC, &iwreq) < 0)
{
ipwlan_broadcom_printf(en, "Error: could not attach ioctl translator"IP_LF);
goto error;
}
ipwlan_broadcom_printf(en, "successfully attached broadcom ioctl translator"IP_LF);
goto done;
}
#endif
/* Verify interface existance */
ipcom_sprintf(iwreq.if_name, "%.*s", IP_IFNAMSIZ - 1, argv[1]);
if(ipcom_if_nametoindex(iwreq.if_name) < 1)
{
ipwlan_broadcom_printf(en, "Error: Interface '%s' does not exist"IP_LF, iwreq.if_name);
goto error;
}
/* Set debug level */
if (!ipcom_strcmp(argv[2], "debug"))
{
if (argc < 4)
{
(void)wl_get(iwreq.if_name, WLC_GET_MSGLEVEL, &value, sizeof(Ip_u32));
ipwlan_broadcom_printf(en, "debug: %X"IP_LF, value);
goto done;
}
adebug = 0;
ret = wl_get(iwreq.if_name, WLC_GET_MSGLEVEL, &value, sizeof(Ip_u32));
if (ret < 0)
{
goto error;
}
c = argv[3];
if (*c == '+' || *c == '-')
{
sdebug = ~0;
adebug = ipcom_strtol(c + 1, &endp, 0);
if (*endp != '\0')
{
ipwlan_broadcom_printf(en, "Error: bad argument (\'%s\')"IP_LF, c);
goto error;
}
if (*c == '-')
{
sdebug = adebug;
adebug = 0;
}
value = (value | adebug) & sdebug;
}
else
{
value = ipcom_strtol(c, &endp, 0);
if (*endp != '\0')
{
ipwlan_broadcom_printf(en, "Error: bad argument (\'%s\')"IP_LF, c);
goto error;
}
}
ret = wl_set(iwreq.if_name, WLC_SET_MSGLEVEL, &value, sizeof(Ip_u32));
if (ret < 0)
{
goto error;
}
goto done;
}
/* BroadCom WL command */
if (!ipcom_strcmp(argv[2], "wl"))
{
for (i = 3, k = 0; i < argc && k < (MAX_TEXT_LEN-3); i++)
{
k += ipcom_sprintf(text + k, " %.*s", MAX_TEXT_LEN - k - 2, argv[i]);
}
if (wl(text + 1) < 0)
{
ipwlan_broadcom_printf(en, "Error: Command failed"IP_LF);
}
goto done;
}
/* Get device information/configuration */
if (!ipcom_strcmp(argv[2], "phy"))
{
goto done;
}
/* Get device information/configuration */
if (!ipcom_strcmp(argv[2], "info"))
{
if (ipwlan_broadcom_cmd_info(en,iwreq.if_name) != IPCOM_SUCCESS)
{
goto error;
}
goto done;
}
if (!ipcom_strcmp(argv[2], "statistics"))
{
for (i = 2, k = 0; i < argc && k < (MAX_TEXT_LEN-3); i++)
{
k += ipcom_sprintf(text + k, " %.*s", MAX_TEXT_LEN - k - 2, "counters");
}
if (wl(text + 1) < 0)
{
goto error;
}
goto done;
}
/* Get driver status */
if (!ipcom_strcmp(argv[2], "status"))
{
for (i = 2, k = 0; i < argc && k < (MAX_TEXT_LEN-3); i++)
{
k += ipcom_sprintf(text + k, " %.*s", MAX_TEXT_LEN - k - 2, argv[i]);
}
if (wl(text + 1) < 0)
{
goto error;
}
goto done;
}
error:
ipwlan_broadcom_printf(en, "Error: command %s failed"IP_LF, argv[2]);
ret = -1; /* IPCOM_ERR_FAILED; */
done:
(void)ipcom_socketclose(fd);
return ret;
}
IP_STATIC int
ipwlan_broadcom_cmd_info(int en,char *if_name)
{
Ip_err ret = IPCOM_SUCCESS;
wlc_rev_info_t revinfo;
ret = wl_get(if_name, WLC_GET_REVINFO, &revinfo, sizeof(revinfo));
if (ret < 0) {
return ret;
}
ipwlan_broadcom_printf(en,"vendorid 0x%x\n", revinfo.vendorid);
ipwlan_broadcom_printf(en,"deviceid 0x%x\n", revinfo.deviceid);
ipwlan_broadcom_printf(en,"radiorev 0x%x\n", revinfo.radiorev);
ipwlan_broadcom_printf(en,"chipnum 0x%x\n", revinfo.chipnum);
ipwlan_broadcom_printf(en,"chiprev 0x%x\n", revinfo.chiprev);
ipwlan_broadcom_printf(en,"corerev 0x%x\n", revinfo.corerev);
ipwlan_broadcom_printf(en,"boardid 0x%x\n", revinfo.boardid);
ipwlan_broadcom_printf(en,"boardvendor 0x%x\n", revinfo.boardvendor);
ipwlan_broadcom_printf(en,"boardrev 0x%x\n", revinfo.boardrev);
ipwlan_broadcom_printf(en,"driverrev 0x%x\n", revinfo.driverrev);
ipwlan_broadcom_printf(en,"ucoderev 0x%x\n", revinfo.ucoderev);
ipwlan_broadcom_printf(en,"bus 0x%x\n", revinfo.bus);
return IPCOM_SUCCESS;
}
#if NOT_USED
IP_STATIC int
ipwlan_broadcom_cmd_status(int en,char *if_name)
{
Ip_err ret = IPCOM_SUCCESS;
return IPCOM_SUCCESS;
}
IP_STATIC int
ipwlan_broadcom_cmd_status2(int en,char *if_name)
{
Ip_err ret = IPCOM_SUCCESS;
int i,k;
return IPCOM_SUCCESS;
}
#endif
/*
****************************************************************************
* 10 GLOBAL FUNCTIONS
****************************************************************************
*/
/*
****************************************************************************
* 11 PUBLIC FUNCTIONS
****************************************************************************
*/
/*
*===========================================================================
* ipwlan_broadcom_cmd_broadcom
*===========================================================================
* Description: Executes shell commands. Prints output to console
* Parameters:
* Returns: Non-zero on failure
*/
IP_PUBLIC int
ipwlan_broadcom_cmd_broadcom(int argc, char **argv)
{
return ipwlan_broadcom_cmd_broadcom_en(1, argc, argv);
}
/*
*===========================================================================
* ipwlan_broadcom_boot
*===========================================================================
* Description: Executes the embedded IPWLAN_BROADCOM configuration
* Parameters:
* Returns: 0
*/
IP_PUBLIC int
ipwlan_broadcom_boot(void)
{
char ifname[IP_IFNAMSIZ];
int unit;
char *name;
if (strlen(ipwlan_broadcom_default_if) >= IP_IFNAMSIZ) {
ipwlan_broadcom_printf(1, "ipwlan_broadcom_boot :: Failed to init interface %s (name >= %d characters)\n",
ipwlan_broadcom_default_if, IP_IFNAMSIZ);
return IPCOM_ERR_FAILED;
}
/* Make sure the interface is initialized in the stack */
strncpy(ifname, ipwlan_broadcom_default_if, IP_IFNAMSIZ);
name = ipcom_strtok(ifname,"0123456789");
/* coverity[dereference] : FALSE */
unit = ipcom_atoi(ipwlan_broadcom_default_if+strlen(name));
if (ipcom_drv_eth_init(name, unit, IP_NULL) != IPCOM_SUCCESS) {
ipwlan_broadcom_printf(1, "ipwlan_broadcom_boot :: Failed to init interface %s%d\n", name, unit);
return IPCOM_ERR_FAILED;
}
ipwlan_broadcom_printf(1, "ipwlan_broadcom_boot :: Successfully init interface %s%d\n", name, unit);
ipwlan_broadcom_run_boot_cmd(ipwlan_broadcom_attach, 1);
ipwlan_broadcom_run_boot_cmd(ipwlan_broadcom_config, ipwlan_broadcom_config_len);
return 0;
}
/*
****************************************************************************
* END OF FILE
****************************************************************************
*/