original files of m241
This commit is contained in:
@@ -0,0 +1,548 @@
|
||||
/*
|
||||
******************************************************************************
|
||||
* 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
|
||||
****************************************************************************
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user