/* ****************************************************************************** * 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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* **************************************************************************** * 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: */ IP_STATIC void ipwlan_broadcom_print_usage(int en) { ipwlan_broadcom_printf(en, "Usage:"IP_LF); ipwlan_broadcom_printf(en, " wifi_bcm attach Attach BCM4318 ioctl translator"IP_LF); ipwlan_broadcom_printf(en, " debug [] 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 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 **************************************************************************** */