/******************************************************************************/
/*                                                                            */
/* bypass library, Copyright (c) 2004 Silicom, Ltd                            */
/* Corporation.                                                               */
/*                                                                            */
/* This program is free software; you can redistribute it and/or modify       */
/* it under the terms of the GNU General Public License as published by       */
/* the Free Software Foundation, located in the file LICENSE.                 */
/*                                                                            */
/* Ver 1.0.0                                                                  */
/*                                                                            */
/* libbypass.h                                                                */
/*                                                                            */
/******************************************************************************/

#define BP_CAP                   0x01	/* BIT_0 */
#define BP_STATUS_CAP            0x02
#define BP_STATUS_CHANGE_CAP     0x04
#define SW_CTL_CAP               0x08
#define BP_DIS_CAP               0x10
#define BP_DIS_STATUS_CAP        0x20
#define STD_NIC_CAP              0x40
#define BP_PWOFF_ON_CAP          0x80
#define BP_PWOFF_OFF_CAP         0x0100
#define BP_PWOFF_CTL_CAP         0x0200
#define BP_PWUP_ON_CAP           0x0400
#define BP_PWUP_OFF_CAP          0x0800
#define BP_PWUP_CTL_CAP          0x1000
#define WD_CTL_CAP               0x2000
#define WD_STATUS_CAP            0x4000
#define WD_TIMEOUT_CAP           0x8000
#define TX_CTL_CAP               0x10000
#define TX_STATUS_CAP            0x20000
#define TAP_CAP                  0x40000
#define TAP_STATUS_CAP           0x80000
#define TAP_STATUS_CHANGE_CAP    0x100000
#define TAP_DIS_CAP              0x200000
#define TAP_DIS_STATUS_CAP       0x400000
#define TAP_PWUP_ON_CAP          0x800000
#define TAP_PWUP_OFF_CAP         0x1000000
#define TAP_PWUP_CTL_CAP         0x2000000
#define NIC_CAP_NEG              0x4000000	/* BIT 26 */

#define WD_MIN_TIME_GET(desc)   (desc & 0xf)
#define WDT_STEP_TIME           0x10

struct bp_info {
	char prod_name[14];
	unsigned char fw_ver;
};

/**
 * is_bypass - check if device is a Bypass controlling device
 * @if_index: network device index
 *
 * Output:
 *  1 -  if device is bypass controlling device,
 *  0 -  if device is bypass slave device
 * -1 -  device not support Bypass
 **/
int is_bypass_sd(int if_index);

/**
 * get_bypass_slave - get second port participate in the Bypass pair
 * @if_index: network device index
 *
 * Output:
 *  network device index of the slave device
 * -1 - on failure (device not support Bypass or it's a slave device)
 **/
int get_bypass_slave_sd(int if_index);

/**
 * get_bypass_caps - get second port participate in the Bypass pair
 * @if_index: network device index
 *
 * Output:
 * flags word on success;flag word is a 32-bit mask word with each bit defines different
 * capability as described bellow.
 * Value of 1 for supporting this feature. 0 for not supporting this feature.
 * -1 - on failure (if the device is not capable of the operation or not a Bypass device)
 * Bit	feature	                description
 *
 * 0	BP_CAP	                The interface is Bypass capable in general
 *
 * 1	BP_STATUS_CAP	        The interface can report of the current Bypass mode
 *
 * 2	BP_STATUS_CHANGE_CAP	The interface can report on a change to bypass mode from
 *                              the last time the mode was defined
 *
 * 3	SW_CTL_CAP	            The interface is Software controlled capable for bypass/non bypass modes.
 *
 * 4	BP_DIS_CAP	            The interface is capable of disabling the Bypass mode at all times.
 *                              This mode will retain its mode even during power loss and also after
 *                              power recovery. This will overcome on any bypass operation due to
 *                              watchdog timeout or set bypass command.
 *
 * 5	BP_DIS_STATUS_CAP	    The interface can report of the current DIS_BP_CAP
 *
 * 6	STD_NIC_CAP	            The interface is capable to be configured to operate as standard, non Bypass,
 *                              NIC interface (have direct connection to interfaces at all power modes)
 *
 * 7	BP_PWOFF_NO_CAP	        The interface can be in Bypass mode at power off state
 *
 * 8	BP_PWOFF_OFF_CAP	    The interface can disconnect the Bypass mode at power off state without
 *                              effecting all the other states of operation
 *
 * 9	BP_PWOFF_CTL_CAP	    The behavior of the Bypass mode at Power-off state can be controlled by
 *                              software without effecting any other state
 *
 *10    BP_PWUP_ON_CAP	        The interface can be in Bypass mode when power is turned on
 *                              (until the system take control of the bypass functionality)
 *
 *11	BP_PWUP_OFF_CAP	        The interface can disconnect from Bypass mode when power is turned on
 *                              (until the system take control of the bypass functionality)
 *
 *12	BP_PWUP_CTL_CAP	        The behavior of the Bypass mode at Power-up can be controlled by software
 *
 *13	WD_CTL_CAP	            The interface has watchdog capabilities to turn to Bypass mode when not reset
 *                              for defined period of time.
 *
 *14	WD_STATUS_CAP	        The interface can report on the watchdog status (Active/inactive)
 *
 *15	WD_TIMEOUT_CAP	        The interface can report the time left till watchdog triggers to Bypass mode.
 *
 *16-31 RESERVED
 *
 * **/
int get_bypass_caps_sd(int if_index);

/**
 * get_wd_set_caps - Obtain watchdog timer setting capabilities
 * @if_index: network device index
 *
 * Output:
 *
 * Set of numbers defining the various parameters of the watchdog capable
 * to be set to as described bellow.
 * -1 - on failure (device not support Bypass or it's a slave device)
 *
 * Bit	feature	        description
 *
 * 0-3	WD_MIN_TIME	    The interface WD minimal time period  in 100mS units
 *
 * 4	WD_STEP_TIME	The steps of the WD timer in
 *                      0 - for linear steps (WD_MIN_TIME * X)
 *                      1 - for multiply by 2 from previous step (WD_MIN_TIME * 2^X)
 *
 * 5-8	WD_STEP_COUNT	Number of steps the WD timer supports in 2^X
 *                      (X bit available for defining the value)
 *
 *
 *
 **/
int get_wd_set_caps_sd(int if_index);

/**
 * set_bypass - set Bypass state
 * @if_index: network device index of the controlling device
 * @bypass_mode:  bypass mode (1=on, 0=off)
 * Output:
 *  0 - on success
 * -1 - on failure (device not support Bypass or it's a slave device)
 **/
int set_bypass_sd(int if_index, int bypass_mode);

/**
 * get_bypass - Get Bypass mode state
 * @if_index: network device index of the controlling device
 * Output:
 *  0/1 - (off/on) on success
 * -1 - on failure (device not support Bypass or it's a slave device)
 **/
int get_bypass_sd(int if_index);

/**
 * get_bypass_change - Get change of Bypass mode state from last status check
 * @if_index: network device index of the controlling device
 * Output:
 *  0/1 - (off/on) on success
 * -1 - on failure (device not support Bypass or it's a slave device)
 **/
int get_bypass_change_sd(int if_index);

/**
 * set_dis_bypass - Set Disable Bypass mode
 * @if_index: network device index of the controlling device
 * @dis_bypass: disable bypass(1=dis, 0=en)
 * Output:
 *  0 - on success
 * -1 - on failure (device is not capable of the operation ordevice not support Bypass
 *                  or it's a slave device)
 **/
int set_dis_bypass_sd(int if_index, int dis_bypass);

/**
 * get_dis_bypass - Get Disable Bypass mode state
 * @if_index: network device index of the controlling device
 * Output:
 *  0/1 - on success (normal Bypass mode/ Disable bypass)
 * -1 - on failure (device is not capable of the operation ordevice not support Bypass
 *                  or it's a slave device)
 **/
int get_dis_bypass_sd(int if_index);

/**
 * set_bypass_pwoff - Set Bypass mode at power-off state
 * @if_index: network device index of the controlling device
 * @bypass_mode: bypass mode setting at power off state (1=BP en, 0=BP Dis)
 * Output:
 *  0 - on success
 * -1 - on failure (device is not capable of the operation ordevice not support Bypass
 *                  or it's a slave device)
 **/
int set_bypass_pwoff_sd(int if_index, int bypass_mode);

/**
 * get_bypass_pwoff - Get Bypass mode state at power-off state
 * @if_index: network device index of the controlling device
 * Output:
 *  0/1 - on success (Disable bypass at power off state / normal Bypass mode)
 * -1 - on failure (device is not capable of the operation ordevice not support Bypass
 *                  or it's a slave device)
 **/
int get_bypass_pwoff_sd(int if_index);

/**
 * set_bypass_pwup - Set Bypass mode at power-up state
 * @if_index: network device index of the controlling device
 * @bypass_mode: bypass mode setting at power up state (1=BP en, 0=BP Dis)
 * Output:
 *  0 - on success
 * -1 - on failure (device is not capable of the operation ordevice not support Bypass
 *                  or it's a slave device)
 **/
int set_bypass_pwup_sd(int if_index, int bypass_mode);

/**
 * get_bypass_pwup - Get Bypass mode state at power-up state
 * @if_index: network device index of the controlling device
 * Output:
 *  0/1 - on success (Disable bypass at power up state / normal Bypass mode)
 * -1 - on failure (device is not capable of the operation ordevice not support Bypass
 *                  or it's a slave device)
 **/
int get_bypass_pwup_sd(int if_index);

/**
 * set_bypass_wd - Set watchdog state
 * @if_index: network device index of the controlling device
 * @ms_timeout: requested timeout (in ms units), 0 for disabling the watchdog timer
 * @ms_timeout_set(output): requested timeout (in ms units),
 *                          that the adapter supports and will be used by the watchdog
 * Output:
 * 0  - on success
 * -1 - on failure (device is not capable of the operation ordevice not support Bypass
 *                  or it's a slave device)
 **/
int set_bypass_wd_sd(int if_index, int ms_timeout, int *ms_timeout_set);

/**
 * get_bypass_wd - Get watchdog state
 * @if_index: network device index of the controlling device
 * @ms_timeout (output): WDT timeout (in ms units),
 *                       -1 for unknown wdt status
 *                        0 if WDT is disabled
 * Output:
 * 0  - on success
 * -1 - on failure (device is not capable of the operation ordevice not support Bypass
 *                  or it's a slave device)
 **/
int get_bypass_wd_sd(int if_index, int *ms_timeout_set);

/**
 * get_wd_expire_time - Get watchdog expire
 * @if_index: network device index of the controlling device
 * @ms_time_left (output): time left till watchdog time expire,
 *                       -1 if WDT has expired
 *                       0  if WDT is disabled
 * Output:
 * 0  - on success
 * -1 - on failure (device is not capable of the operation ordevice not support Bypass
 *                  or it's a slave device or unknown wdt status)
 **/
int get_wd_expire_time_sd(int if_index, int *ms_time_left);

/**
 * reset_bypass_wd_timer - Reset watchdog timer
 * @if_index: network device index of the controlling device
 *
 * Output:
 * 1  - on success
 * 0 - watchdog is not configured
 * -1 - on failure (device is not capable of the operation ordevice not support Bypass
 *                  or it's a slave device or unknown wdt status)
 **/
int reset_bypass_wd_timer_sd(int if_index);

/**
 * set_std_nic - Standard NIC mode of operation
 * @if_index: network device index of the controlling device
 * @nic_mode: 0/1 (Default Bypass mode / Standard NIC mode)
 *
 * Output:
 * 0  - on success
 * -1 - on failure (device is not capable of the operation ordevice not support Bypass
 *                  or it's a slave device)
 **/
int set_std_nic_sd(int if_index, int nic_mode);

/**
 * get_std_nic - Get Standard NIC mode setting
 * @if_index: network device index of the controlling device
 *
 * Output:
 * 0/1 (Default Bypass mode / Standard NIC mode) on success
 * -1 - on failure (device is not capable of the operation ordevice not support Bypass
 *                  or it's a slave device)
 **/
int get_std_nic_sd(int if_index);

/**
 * set_tx - set transmitter enable/disable
 * @if_index: network device index of the controlling device
 * @tx_state: 0/1 (Transmit Disable / Transmit Enable)
 *
 * Output:
 * 0  - on success
 * -1 - on failure (device is not capable of the operation )
 **/
int set_tx_sd(int if_index, int tx_state);

/**
 * get_tx - get transmitter state (disable / enable)
 * @if_index: network device index of the controlling device
 *
 * Output:
 * 0/1 (ransmit Disable / Transmit Enable) on success
 * -1 - on failure (device is not capable of the operation ordevice not support Bypass)
 **/
int get_tx_sd(int if_index);

/**
 * set_tpl - set TPL enable/disable
 * @if_index: network device index of the controlling device
 * @tx_state: 0/1 (TPL Disable / TPL Enable)
 *
 * Output:
 * 0  - on success
 * -1 - on failure (device is not capable of the operation )
 **/
int set_tpl_sd(int if_index, int tpl_state);

/**
 * get_tpl - get TPL state (disable / enable)
 * @if_index: network device index of the controlling device
 *
 * Output:
 * 0/1 (TPL Disable / TPL Enable) on success
 * -1 - on failure (device is not capable of the operation)
 **/
int get_tpl_sd(int if_index);

int get_bp_hw_reset_sd(int if_index);

int set_bp_hw_reset_sd(int if_index, int status);

/**
 * set_tap - set TAP state
 * @if_index: network device index of the controlling device
 * @tap_mode: 1 tap mode , 0 normal nic mode
 * Output:
 *  0 - on success
 * -1 - on failure (device not support TAP or it's a slave device)
 **/
int set_tap_sd(int if_index, int tap_mode);

/**
 * get_tap - Get TAP mode state
 * @if_index: network device index of the controlling device
 * Output:
 *  0/1 - (off/on) on success
 * -1 - on failure (device not support TAP or it's a slave device)
 **/
int get_tap_sd(int if_index);

/**
 * get_tap_change - Get change of TAP mode state from last status check
 * @if_index: network device index of the controlling device
 * Output:
 *  0/1 - (off/on) on success
 * -1 - on failure (device not support TAP or it's a slave device)
 **/
int get_tap_change_sd(int if_index);

/**
 * set_dis_tap - Set Disable TAP mode
 * @if_index: network device index of the controlling device
 * @dis_tap: disable tap(1=dis, 0=en)
 * Output:
 *  0 - on success
 * -1 - on failure (device is not capable of the operation ordevice not support TAP
 *                  or it's a slave device)
 **/
int set_dis_tap_sd(int if_index, int dis_tap);

/**
 * get_dis_tap - Get Disable TAP mode state
 * @if_index: network device index of the controlling device
 * Output:
 *  0/1 - on success (normal TAP mode/ Disable TAP)
 * -1 - on failure (device is not capable of the operation ordevice not support TAP
 *                  or it's a slave device)
 **/
int get_dis_tap_sd(int if_index);

/**
 * set_tap_pwup - Set TAP mode at power-up state
 * @if_index: network device index of the controlling device
 * @bypass_mode: tap mode setting at power up state (1=TAP en, 0=TAP Dis)
 * Output:
 *  0 - on success
 * -1 - on failure (device is not capable of the operation ordevice not support TAP
 *                  or it's a slave device)
 **/
int set_tap_pwup_sd(int if_index, int tap_mode);

/**
 * get_tap_pwup - Get TAP mode state at power-up state
 * @if_index: network device index of the controlling device
 * Output:
 *  0/1 - on success (Disable TAP at power up state / normal TAP mode)
 * -1 - on failure (device is not capable of the operation ordevice not support TAP
 *                  or it's a slave device)
 **/
int get_tap_pwup_sd(int if_index);

/**
 * set_wd_exp_mode - Set adapter state when WDT expired.
 * @if_index: network device index of the controlling device
 * @bypass_mode:  adapter mode (1=tap mode, 0=bypass mode)
 * Output:
 *  0 - on success
 * -1 - on failure (device not support Bypass or it's a slave device)
 **/
int set_wd_exp_mode_sd(int if_index, int bypass_mode);

/**
 * get_wd_exp_mode - Get adapter state when WDT expired.
 * @if_index: network device index of the controlling device
 * Output:
 *  0/1 - (bypass/tap) on success
 * -1 - on failure (device not support Bypass or it's a slave device)
 **/
int get_wd_exp_mode_sd(int if_index);

/**
 * set_wd_autoreset - reset WDT periodically.
 * @if_index: network device index of the controlling device
 * @bypass_mode:  adapter mode (1=tap mode, 0=bypass mode)
 * Output:
 * 1  - on success
 * -1 - on failure (device is not capable of the operation ordevice not support Bypass
 *                  or it's a slave device or unknown wdt status)
 **/
int set_wd_autoreset_sd(int if_index, int time);

/**
 * set_wd_autoreset - reset WDT periodically.
 * @if_index: network device index of the controlling device
 * @bypass_mode:  adapter mode (1=tap mode, 0=bypass mode)
 * Output:
 * 1  - on success
 * -1 - on failure (device is not capable of the operation ordevice not support Bypass
 *                  or it's a slave device or unknown wdt status)
 **/
int get_wd_autoreset_sd(int if_index);
/**
 * set_disc - set DISC state
 * @if_index: network device index of the controlling device
 * @tap_mode: 1 DISC mode , 0 normal nic mode
 * Output:
 *  0 - on success
 * -1 - on failure (device not support disconnect or it's a slave device)
 **/
int set_bp_disc_sd(int if_index, int disc_mode);

/**
 * get_disc - Get disc mode state
 * @if_index: network device index of the controlling device
 * Output:
 *  0/1 - (off/on) on success
 * -1 - on failure (device not support disconnect or it's a slave device)
 **/
int get_bp_disc_sd(int if_index);

/**
 * get_disc_change - Get change of DISC mode state from last status check
 * @if_index: network device index of the controlling device
 * Output:
 *  0/1 - (off/on) on success
 * -1 - on failure (device not support disconnect or it's a slave device)
 **/
int get_bp_disc_change_sd(int if_index);

/**
 * set_dis_disc - Set Disable DISC mode
 * @if_index: network device index of the controlling device
 * @dis_disc: disable disconnect(1=dis, 0=en)
 * Output:
 *  0 - on success
 * -1 - on failure (device is not capable of the operation ordevice not support DISC
 *                  or it's a slave device)
 **/
int set_bp_dis_disc_sd(int if_index, int dis_disc);

/**
 * get_dis_disc - Get Disable DISC mode state
 * @if_index: network device index of the controlling device
 * Output:
 *  0/1 - on success (normal DISC mode/ Disable DISC)
 * -1 - on failure (device is not capable of the operation ordevice not support TAP
 *                  or it's a slave device)
 **/
int get_bp_dis_disc_sd(int if_index);

/**
 * set_disc_pwup - Set DISC mode at power-up state
 * @if_index: network device index of the controlling device
 * @disc_mode: DISC mode setting at power up state (1= en, 0= Dis)
 * Output:
 *  0 - on success
 * -1 - on failure (device is not capable of the operation ordevice not support DISC
 *                  or it's a slave device)
 **/
int set_bp_disc_pwup_sd(int if_index, int disc_mode);

/**
 * get_disc_pwup - Get DISC mode state at power-up state
 * @if_index: network device index of the controlling device
 * Output:
 *  0/1 - on success (Disable DISC at power up state / normal DISC mode)
 * -1 - on failure (device is not capable of the operation ordevice not support DISC
 *                  or it's a slave device)
 **/
int get_bp_disc_pwup_sd(int if_index);

int get_bypass_info_sd(int if_index, struct bp_info *bp_info);
int bp_if_scan_sd(void);
/*int get_dev_num_sd(void);*/