blob: e7b59fae3351633cb64d53b46fb54c0a9b05be88 [file] [log] [blame]
/*
<:copyright-BRCM:2016:DUAL/GPL:standard
Broadcom Proprietary and Confidential.(c) 2016 Broadcom
All Rights Reserved
Unless you and Broadcom execute a separate written software license
agreement governing use of this software, this software is licensed
to you under the terms of the GNU General Public License version 2
(the "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
with the following added to such license:
As a special exception, the copyright holders of this software give
you permission to link this software with independent modules, and
to copy and distribute the resulting executable under terms of your
choice, provided that you also meet, for each linked independent
module, the terms and conditions of the license of that module.
An independent module is a module which is not derived from this
software. The special exception does not apply to any modifications
of the software.
Not withstanding the above, under no circumstances may you combine
this software in any way with any other Broadcom software provided
under a license other than the GPL, without Broadcom's express prior
written consent.
:>
*/
#include <bcmcli.h>
#include "bcmolt_board.h"
#include "bcmolt_board_cli.h"
#include <arpa/inet.h>
#define BCM_I2C_DEV_ADDR_START static bcmcli_enum_val bcm_i2c_dev_addr_table[] = {
#define BCM_I2C_DEV_ADDR(name, desc, val) {desc, val},
#define BCM_I2C_DEV_ADDR_END BCMCLI_ENUM_LAST};
#include <bcmolt_i2c_devs_addr.h>
static bcmos_errno bcm_board_cli_dev_change(bcmcli_session *session, const bcmcli_cmd_parm parm[], uint16_t n_parms)
{
uint32_t addr = bcmcli_find_named_parm(session, "dev")->value.unumber;
return bcm_board_dev_change(addr);
}
static bcmos_errno bcm_board_cli_dev_write(bcmcli_session *session, const bcmcli_cmd_parm parm[], uint16_t n_parms)
{
uint32_t count = bcmcli_find_named_parm(session, "width")->value.unumber;
uint32_t addr = bcmcli_find_named_parm(session, "addr")->value.unumber;
uint32_t val = bcmcli_find_named_parm(session, "val")->value.unumber;
switch (count)
{
case 8:
case 16:
case 32:
break;
default:
bcmcli_session_print(session, "Count can be 8|16|32\n");
return BCM_ERR_PARM;
}
return bcm_board_dev_write(count, addr, val);
}
static bcmos_errno bcm_board_cli_dev_read(bcmcli_session *session, const bcmcli_cmd_parm parm[], uint16_t n_parms)
{
uint32_t count = bcmcli_find_named_parm(session, "width")->value.unumber;
uint32_t addr = bcmcli_find_named_parm(session, "addr")->value.unumber;
uint32_t val;
bcmos_errno rc;
switch (count)
{
case 8:
case 16:
case 32:
break;
default:
bcmcli_session_print(session, "Count can be 8|16|32\n");
return BCM_ERR_PARM;
}
rc = bcm_board_dev_read(count, addr, &val);
BCMOS_TRACE_CHECK_RETURN(rc, rc, "bcm_board_dev_read() failed\n");
bcmcli_session_print(session, "0x%x\n", val);
return BCM_ERR_OK;
}
static bcmos_errno bcm_board_cli_switch_write(bcmcli_session *session, const bcmcli_cmd_parm parm[], uint16_t n_parms)
{
uint32_t val = bcmcli_find_named_parm(session, "val")->value.unumber;
return bcm_board_switch_write(val);
}
static bcmos_errno bcm_board_cli_switch_read(bcmcli_session *session, const bcmcli_cmd_parm parm[], uint16_t n_parms)
{
uint32_t val;
bcmos_errno rc;
rc = bcm_board_switch_read(&val);
BCMOS_TRACE_CHECK_RETURN(rc, rc, "bcm_board_switch_read() failed\n");
bcmcli_session_print(session, "0x%x\n", val);
return BCM_ERR_OK;
}
static bcmos_errno bcm_board_cli_fpga_write(bcmcli_session *session, const bcmcli_cmd_parm parm[], uint16_t n_parms)
{
uint32_t addr = bcmcli_find_named_parm(session, "addr")->value.unumber;
uint32_t val = bcmcli_find_named_parm(session, "val")->value.unumber;
return bcm_board_fpga_write(addr, val);
}
static bcmos_errno bcm_board_cli_fpga_read(bcmcli_session *session, const bcmcli_cmd_parm parm[], uint16_t n_parms)
{
uint32_t addr = bcmcli_find_named_parm(session, "addr")->value.unumber;
uint32_t val;
bcmos_errno rc;
rc = bcm_board_fpga_read(addr, &val);
BCMOS_TRACE_CHECK_RETURN(rc, rc, "bcm_board_fpga_read() failed\n");
bcmcli_session_print(session, "0x%x\n", val);
return BCM_ERR_OK;
}
static bcmos_errno bcm_board_cli_fpga_version(bcmcli_session *session, const bcmcli_cmd_parm parm[], uint16_t n_parms)
{
uint32_t version;
bcmos_errno rc;
rc = bcm_board_fpga_version_get(&version);
bcmcli_session_print(session, "0x%x\n", version);
return rc;
}
static bcmos_errno bcm_board_cli_fpga_set_gpio_dir(bcmcli_session *session, const bcmcli_cmd_parm parm[], uint16_t n_parms)
{
bcmolt_gpio_pin gpio_pin = bcmcli_find_named_parm(session, "gpio_pin")->value.unumber;
bcm_fpga_gpio_dir dir = bcmcli_find_named_parm(session, "dir")->value.unumber;
return bcm_board_fpga_set_gpio_dir(gpio_pin, dir);
}
static bcmos_errno bcm_board_cli_fpga_get_gpio_dir(bcmcli_session *session, const bcmcli_cmd_parm parm[], uint16_t n_parms)
{
bcmolt_gpio_pin gpio_pin = bcmcli_find_named_parm(session, "gpio_pin")->value.unumber;
bcm_fpga_gpio_dir dir;
bcmos_errno rc;
rc = bcm_board_fpga_get_gpio_dir(gpio_pin, &dir);
bcmcli_session_print(session, "%s\n", dir == BCM_FPGA_GPIO_DIR_INPUT ? "input" : "output");
return rc;
}
static bcmos_errno bcm_board_cli_fpga_write_gpio(bcmcli_session *session, const bcmcli_cmd_parm parm[], uint16_t n_parms)
{
bcmolt_gpio_pin gpio_pin = bcmcli_find_named_parm(session, "gpio_pin")->value.unumber;
uint32_t val = bcmcli_find_named_parm(session, "val")->value.unumber;
return bcm_board_fpga_write_gpio(gpio_pin, val);
}
static bcmos_errno bcm_board_cli_fpga_read_gpio(bcmcli_session *session, const bcmcli_cmd_parm parm[], uint16_t n_parms)
{
bcmolt_gpio_pin gpio_pin = bcmcli_find_named_parm(session, "gpio_pin")->value.unumber;
uint32_t val;
bcmos_errno rc;
rc = bcm_board_fpga_read_gpio(gpio_pin, &val);
bcmcli_session_print(session, "0x%x\n", val);
return rc;
}
static bcmos_errno bcm_board_cli_fpga_gen_gpio_irq(bcmcli_session *session, const bcmcli_cmd_parm parm[], uint16_t n_parms)
{
bcmolt_ext_irq ext_irq = bcmcli_find_named_parm(session, "irq")->value.unumber;
return bcm_board_fpga_gen_gpio_irq(ext_irq);
}
static bcmos_errno bcm_board_cli_trx_enable(bcmcli_session *session, const bcmcli_cmd_parm parm[], uint16_t n_parms)
{
uint8_t pon_id = bcmcli_find_named_parm(session, "pon_id")->value.unumber;
return bcm_board_trx_enable(pon_id, BCMOS_TRUE);
}
static bcmos_errno bcm_board_cli_trx_disable(bcmcli_session *session, const bcmcli_cmd_parm parm[], uint16_t n_parms)
{
uint8_t pon_id = bcmcli_find_named_parm(session, "pon_id")->value.unumber;
return bcm_board_trx_enable(pon_id, BCMOS_FALSE);
}
static bcmos_errno bcm_board_cli_device_reset(bcmcli_session *session, const bcmcli_cmd_parm parm[], uint16_t n_parms)
{
return bcm_board_device_reset();
}
static bcmos_errno bcm_board_cli_device_on(bcmcli_session *session, const bcmcli_cmd_parm parm[], uint16_t n_parms)
{
return bcm_board_device_on();
}
static bcmos_errno bcm_board_cli_device_off(bcmcli_session *session, const bcmcli_cmd_parm parm[], uint16_t n_parms)
{
return bcm_board_device_off();
}
static bcmos_errno bcm_board_cli_kt2_on(bcmcli_session *session, const bcmcli_cmd_parm parm[], uint16_t n_parms)
{
return bcm_board_kt2_device_on();
}
static bcmos_errno bcm_board_cli_kt2_off(bcmcli_session *session, const bcmcli_cmd_parm parm[], uint16_t n_parms)
{
return bcm_board_kt2_device_off();
}
static bcmos_errno bcm_board_cli_fpga_reg_read(bcmcli_session *session, const bcmcli_cmd_parm parm[], uint16_t n_parms)
{
uint32_t addr = bcmcli_find_named_parm(session, "addr")->value.unumber;
uint32_t val;
bcmos_errno rc;
rc = bcm_board_fpga_reg_read(addr, &val);
BCMOS_TRACE_CHECK_RETURN(rc, rc, "bcm_board_fpga_reg_read() failed\n");
bcmcli_session_print(session, "0x%x\n", val);
return BCM_ERR_OK;
}
static bcmos_errno bcm_board_cli_fpga_reg_write(bcmcli_session *session, const bcmcli_cmd_parm parm[], uint16_t n_parms)
{
uint32_t addr = bcmcli_find_named_parm(session, "addr")->value.unumber;
uint32_t val = bcmcli_find_named_parm(session, "val")->value.unumber;
return bcm_board_fpga_reg_write(addr, val);
}
static bcmos_errno bcm_board_cli_burn_dpll(bcmcli_session *session, const bcmcli_cmd_parm parm[], uint16_t n_parms)
{
bcmos_errno rc;
uint32_t dev = bcmcli_find_named_parm(session, "device")->value.unumber;
rc = bcm_board_burn_pon_dpll(dev);
BCMOS_TRACE_CHECK_RETURN(rc, rc, "bcm_board_burn_pon_dpll() failed\n");
return BCM_ERR_OK;
}
static bcmos_errno bcm_board_cli_dpll_write(bcmcli_session *session, const bcmcli_cmd_parm parm[], uint16_t n_parms)
{
uint32_t page = bcmcli_find_named_parm(session, "page")->value.unumber;
uint32_t addr = bcmcli_find_named_parm(session, "addr")->value.unumber;
uint32_t val = bcmcli_find_named_parm(session, "val")->value.unumber;
return bcm_board_write_dpll(page, addr, val);
}
static bcmos_errno bcm_board_cli_dpll_read(bcmcli_session *session, const bcmcli_cmd_parm parm[], uint16_t n_parms)
{
uint32_t page = bcmcli_find_named_parm(session, "page")->value.unumber;
uint32_t addr = bcmcli_find_named_parm(session, "addr")->value.unumber;
uint32_t val;
bcmos_errno rc;
rc = bcm_board_read_dpll(page, addr, &val);
BCMOS_TRACE_CHECK_RETURN(rc, rc, "bcm_board_dpll_read() failed\n");
bcmcli_session_print(session, "0x%x\n", val);
return BCM_ERR_OK;
}
/* LUK_MAX_DATA_SIZE (2*1024) */
#define SWITCH_RECEIVE_BUFFER_LENGTH (2*1024)
static int switch_socket = -1;
static char *switch_buffer = NULL;
static bcmos_bool switch_first_connection = BCMOS_TRUE;
static void switch_response(bcmcli_session *session)
{
int len;
char *prompt = NULL;
while (1)
{
len = read(switch_socket, switch_buffer, SWITCH_RECEIVE_BUFFER_LENGTH-1);
if (len > 0)
{
switch_buffer[len] = '\0';
bcmcli_print(session, "%s", switch_buffer);
prompt = strstr(switch_buffer, "BCM");
while (prompt)
{
len = strlen(prompt);
if (len >= 6)
{
if ((prompt[3] == '>') || ((prompt[3] == '.') && (prompt[5] == '>')))
return;
}
else if (len >= 4)
{
if (prompt[3] == '>')
return;
}
prompt = strstr(&prompt[2], "BCM");
}
}
else
break;
}
}
static bcmos_errno kt2_conn(bcmcli_session *session, const bcmcli_cmd_parm parm[], uint16_t n_parms)
{
struct sockaddr_in server;
if (switch_socket != -1)
{
bcmcli_print(session, "A connection already exists\n");
return BCM_ERR_ALREADY;
}
switch_buffer = bcmos_alloc(SWITCH_RECEIVE_BUFFER_LENGTH);
if (!switch_buffer)
{
bcmcli_print(session, "Failed to allocate buffer\n");
return BCM_ERR_NOMEM;
}
memset((void *)&server, 0, sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(parm[0].value.number);
server.sin_addr.s_addr = inet_addr("127.0.0.1");
switch_socket = socket(AF_INET, SOCK_STREAM, 0);
if (switch_socket < 0)
{
bcmcli_print(session, "Can't open client socket\n");
goto exit;
}
if (connect(switch_socket, (struct sockaddr *)&server, sizeof(server)) == -1)
{
close(switch_socket);
bcmcli_print(session, "Failed to connect\n");
goto exit;
}
if (switch_first_connection)
{
switch_first_connection = BCMOS_FALSE;
switch_response(session);
}
return BCM_ERR_OK;
exit:
bcmos_free(switch_buffer);
return BCM_ERR_COMM_FAIL;
}
static bcmos_errno kt2_disconn(bcmcli_session *session, const bcmcli_cmd_parm parm[], uint16_t n_parms)
{
if (switch_socket != -1)
{
bcmcli_print(session, "Send 'exit'\n");
if (write(switch_socket, "exit\r", strlen("exit\r")) < 0)
bcmcli_print(session, "Send 'exit' to switch failed\n");
fsync(switch_socket);
}
bcmos_usleep(1000);
if (switch_socket != -1)
close(switch_socket);
if (switch_buffer)
bcmos_free(switch_buffer);
/* set socket and buffer with initial values */
switch_socket = -1;
switch_buffer = NULL;
return BCM_ERR_OK;
}
static bcmos_errno kt2_cmd(bcmcli_session *session, const bcmcli_cmd_parm parm[], uint16_t n_parms)
{
int len, sent_len;
char *str;
if ((switch_socket == -1) || (!switch_buffer))
{
bcmcli_print(session, "Connection or buffer do not exist\n");
return BCM_ERR_NORES;
}
/* switch user space application receives thru _fd_input_cb and
send to kernel thru _kernel_proxy_output_cb */
len = (int)strlen(parm[0].value.string);
{
/* dirty - just to avoid error : cast discards '__attribute__((const))' qualifier if useing strcat */
unsigned long strp = (unsigned long)&parm[0].value.string;
str = *(char **)strp;
}
str[len++] = '\r';
str[len] = '\0';
sent_len = 0;
do
{
sent_len = write(switch_socket, str + sent_len , len - sent_len);
if (sent_len == -1 || ((sent_len == 0) && errno))
{
bcmcli_print(session, "Send command to switch failed (write to socket error: %d)\n", errno);
return BCM_ERR_COMM_FAIL;
}
fsync(switch_socket);
} while(len - sent_len);
/* switch kernel send thru _kernel_proxy_input_cb
to switch user space application thru _fd_outout_cb */
switch_response(session);
return BCM_ERR_OK;
}
bcmos_errno bcm_board_cli_init(bcmcli_entry *top_dir)
{
bcmcli_entry *board_dir, *i2c_dir;
bcmos_errno rc;
bcm_board_svk_board_id board_id;
bcmcli_entry *dir;
static bcmcli_enum_val fpga_gpio_pin_table[] =
{
{"pin4", BCMOLT_GPIO_PIN_PIN4},
{"pin5", BCMOLT_GPIO_PIN_PIN5},
{"pin6", BCMOLT_GPIO_PIN_PIN6},
{"pin7", BCMOLT_GPIO_PIN_PIN7},
{"pin8", BCMOLT_GPIO_PIN_PIN8},
{"pin9", BCMOLT_GPIO_PIN_PIN9},
{"pin10", BCMOLT_GPIO_PIN_PIN10},
{"pin11", BCMOLT_GPIO_PIN_PIN11},
{"pin12", BCMOLT_GPIO_PIN_PIN12},
{"pin13", BCMOLT_GPIO_PIN_PIN13},
{"pin14", BCMOLT_GPIO_PIN_PIN14},
{"pin15", BCMOLT_GPIO_PIN_PIN15},
{"pin16", BCMOLT_GPIO_PIN_PIN16},
{"pin17", BCMOLT_GPIO_PIN_PIN17},
{"pin18", BCMOLT_GPIO_PIN_PIN18},
{"pin19", BCMOLT_GPIO_PIN_PIN19},
{"pin20", BCMOLT_GPIO_PIN_PIN20},
{"pin21", BCMOLT_GPIO_PIN_PIN21},
{"pin22", BCMOLT_GPIO_PIN_PIN22},
{"pin23", BCMOLT_GPIO_PIN_PIN23},
{"pin24", BCMOLT_GPIO_PIN_PIN24},
{"pin25", BCMOLT_GPIO_PIN_PIN25},
{"pin26", BCMOLT_GPIO_PIN_PIN26},
{"pin27", BCMOLT_GPIO_PIN_PIN27},
{"pin28", BCMOLT_GPIO_PIN_PIN28},
{"pin29", BCMOLT_GPIO_PIN_PIN29},
{"pin30", BCMOLT_GPIO_PIN_PIN30},
{"pin31", BCMOLT_GPIO_PIN_PIN31},
BCMCLI_ENUM_LAST
};
static bcmcli_enum_val fpga_ext_irq_table[] =
{
{"ext_irq0", BCMOLT_EXT_IRQ_EXT_IRQ0},
{"ext_irq1", BCMOLT_EXT_IRQ_EXT_IRQ1},
{"ext_irq2", BCMOLT_EXT_IRQ_EXT_IRQ2},
{"ext_irq3", BCMOLT_EXT_IRQ_EXT_IRQ3},
{"ext_irq4", BCMOLT_EXT_IRQ_EXT_IRQ4},
{"ext_irq5", BCMOLT_EXT_IRQ_EXT_IRQ5},
BCMCLI_ENUM_LAST
};
static bcmcli_enum_val fpga_gpio_dir_table[] =
{
{"input", BCM_FPGA_GPIO_DIR_INPUT},
{"output", BCM_FPGA_GPIO_DIR_OUTPUT},
BCMCLI_ENUM_LAST
};
static bcmcli_enum_val dpll_devices[] = {
{ .name="gpon", .val=GPON_DPLL},
{ .name="epon", .val=EPON_DPLL},
{ .name="synce", .val=GPON_SYNCE},
BCMCLI_ENUM_LAST
};
board_dir = bcmcli_dir_add(top_dir, "board", "Board", BCMCLI_ACCESS_GUEST, NULL);
BCMOS_CHECK_RETURN_ERROR(!board_dir, BCM_ERR_INTERNAL);
i2c_dir = bcmcli_dir_add(board_dir, "i2c", "i2c", BCMCLI_ACCESS_GUEST, NULL);
BCMOS_CHECK_RETURN_ERROR(!i2c_dir, BCM_ERR_INTERNAL);
BCMCLI_MAKE_CMD(i2c_dir, "dev_change", "Change current device", bcm_board_cli_dev_change,
BCMCLI_MAKE_PARM_ENUM("dev", "device", bcm_i2c_dev_addr_table, 0));
BCMCLI_MAKE_CMD(i2c_dir, "dev_write", "Write to current i2c device", bcm_board_cli_dev_write,
BCMCLI_MAKE_PARM("width", "Width of register in bits (8|16|32)", BCMCLI_PARM_NUMBER, 0),
BCMCLI_MAKE_PARM("addr", "address", BCMCLI_PARM_HEX, 0),
BCMCLI_MAKE_PARM("val", "value", BCMCLI_PARM_HEX, 0));
BCMCLI_MAKE_CMD(i2c_dir, "dev_read", "Read from current i2c device", bcm_board_cli_dev_read,
BCMCLI_MAKE_PARM("width", "Width of register in bits (8|16|32)", BCMCLI_PARM_NUMBER, 0),
BCMCLI_MAKE_PARM("addr", "address", BCMCLI_PARM_HEX, 0));
BCMCLI_MAKE_CMD(i2c_dir, "switch_write", "Write to switch", bcm_board_cli_switch_write,
BCMCLI_MAKE_PARM_RANGE("val", "value", BCMCLI_PARM_HEX, 0, 0, UCHAR_MAX));
BCMCLI_MAKE_CMD_NOPARM(i2c_dir, "switch_read", "Read from switch", bcm_board_cli_switch_read);
BCMCLI_MAKE_CMD(i2c_dir, "fpga_write", "Write to FPGA", bcm_board_cli_fpga_write,
BCMCLI_MAKE_PARM("addr", "address", BCMCLI_PARM_HEX, 0),
BCMCLI_MAKE_PARM("val", "value", BCMCLI_PARM_HEX, 0));
BCMCLI_MAKE_CMD(i2c_dir, "fpga_read", "Read from FPGA", bcm_board_cli_fpga_read,
BCMCLI_MAKE_PARM("addr", "address", BCMCLI_PARM_HEX, 0));
BCMCLI_MAKE_CMD_NOPARM(board_dir, "fpga_version", "FPGA version", bcm_board_cli_fpga_version);
BCMCLI_MAKE_CMD(board_dir, "fpga_set_gpio_dir", "Set GPIO direction", bcm_board_cli_fpga_set_gpio_dir,
BCMCLI_MAKE_PARM_ENUM("gpio_pin", "GPIO pin", fpga_gpio_pin_table, 0),
BCMCLI_MAKE_PARM_ENUM("dir", "Direction", fpga_gpio_dir_table, 0));
BCMCLI_MAKE_CMD(board_dir, "fpga_get_gpio_dir", "Get GPIO direction", bcm_board_cli_fpga_get_gpio_dir,
BCMCLI_MAKE_PARM_ENUM("gpio_pin", "GPIO pin", fpga_gpio_pin_table, 0));
BCMCLI_MAKE_CMD(board_dir, "fpga_write_gpio", "Write to GPIO pin", bcm_board_cli_fpga_write_gpio,
BCMCLI_MAKE_PARM_ENUM("gpio_pin", "GPIO pin", fpga_gpio_pin_table, 0),
BCMCLI_MAKE_PARM("val", "Value", BCMCLI_PARM_HEX, 0));
BCMCLI_MAKE_CMD(board_dir, "fpga_read_gpio", "Read from GPIO pin", bcm_board_cli_fpga_read_gpio,
BCMCLI_MAKE_PARM_ENUM("gpio_pin", "GPIO pin", fpga_gpio_pin_table, 0));
BCMCLI_MAKE_CMD(board_dir, "fpga_gen_irq", "Generate GPIO IRQ", bcm_board_cli_fpga_gen_gpio_irq,
BCMCLI_MAKE_PARM_ENUM("irq", "IRQ", fpga_ext_irq_table, 0));
BCMCLI_MAKE_CMD(board_dir, "trx_enable", "Enable transceiver", bcm_board_cli_trx_enable,
BCMCLI_MAKE_PARM("pon_id", "pon_id", BCMCLI_PARM_UDECIMAL, 0));
BCMCLI_MAKE_CMD(board_dir, "trx_disable", "Disable transceiver", bcm_board_cli_trx_disable,
BCMCLI_MAKE_PARM("pon_id", "pon_id", BCMCLI_PARM_UDECIMAL, 0));
BCMCLI_MAKE_CMD_NOPARM(board_dir, "device_reset", "Reset the device - clears the reset bit and then set it on", bcm_board_cli_device_reset);
BCMCLI_MAKE_CMD_NOPARM(board_dir, "device_on", "Keeps the device with reset bit on", bcm_board_cli_device_on);
BCMCLI_MAKE_CMD_NOPARM(board_dir, "device_off", "Keeps the device with reset bit off", bcm_board_cli_device_off);
BCMCLI_MAKE_CMD(board_dir, "fpga_reg_read", "Read data from an FPGA register", bcm_board_cli_fpga_reg_read,
BCMCLI_MAKE_PARM("addr", "address", BCMCLI_PARM_HEX, 0));
BCMCLI_MAKE_CMD(board_dir, "fpga_reg_write", "Write data to an FPGA register", bcm_board_cli_fpga_reg_write,
BCMCLI_MAKE_PARM("addr", "address", BCMCLI_PARM_HEX, 0),
BCMCLI_MAKE_PARM("val", "value", BCMCLI_PARM_HEX, 0));
BCMCLI_MAKE_CMD(board_dir, "dpll", "Burn DPLL", bcm_board_cli_burn_dpll,
BCMCLI_MAKE_PARM_ENUM("device", "Device", dpll_devices, 0));
BCMCLI_MAKE_CMD(board_dir, "dpll_write", "Write to DPLL", bcm_board_cli_dpll_write,
BCMCLI_MAKE_PARM("page", "page", BCMCLI_PARM_HEX, 0),
BCMCLI_MAKE_PARM("addr", "address", BCMCLI_PARM_HEX, 0),
BCMCLI_MAKE_PARM("val", "value", BCMCLI_PARM_HEX, 0));
BCMCLI_MAKE_CMD(board_dir, "dpll_read", "Read from DPLL", bcm_board_cli_dpll_read,
BCMCLI_MAKE_PARM("page", "page", BCMCLI_PARM_HEX, 0),
BCMCLI_MAKE_PARM("addr", "address", BCMCLI_PARM_HEX, 0));
rc = bcm_board_get_board_id(&board_id);
BCMOS_CHECK_RETURN(rc, rc, rc);
/* check if the board is SVK#3 */
if (board_id == SVK_3)
{
BCMCLI_MAKE_CMD_NOPARM(board_dir, "kt2_on", "Keeps the Katana2 with reset bit on", bcm_board_cli_kt2_on);
BCMCLI_MAKE_CMD_NOPARM(board_dir, "kt2_off", "Keeps the Katana2 with reset bit off", bcm_board_cli_kt2_off);
dir = bcmcli_dir_add(board_dir, "switch", "Switch", BCMCLI_ACCESS_ADMIN, NULL);
BCMOS_CHECK_RETURN_ERROR(!dir, BCM_ERR_NOMEM);
BCMCLI_MAKE_CMD(dir, "conn", "connect to switch daemon", kt2_conn,
BCMCLI_MAKE_PARM("port", "connection port on localhost", BCMCLI_PARM_NUMBER, 0));
BCMCLI_MAKE_CMD_NOPARM(dir, "disconn", "disconnect from switch daemon", kt2_disconn);
BCMCLI_MAKE_CMD(dir, "cmd", "command to switch - string between quotes", kt2_cmd,
BCMCLI_MAKE_PARM("", "", BCMCLI_PARM_STRING, 0));
}
return BCM_ERR_OK;
}