Commit 7040e556 authored by DanielC's avatar DanielC Committed by Greg Kroah-Hartman

staging: add Silicom Bypass driver

The Silicom Bypass Network Interface Cards (NICs) are network cards with
paired ports (2 or 4).  The pairs either act as a "wire" allowing the
network packets to pass or insert the device in between the two ports.
When paired with the on-board hardware watchdog or other failsafe, they
provide high availability for the network in the face of software
outages or maintenance.
Signed-off-by: default avatarDaniel Cotey <puff65537@bansheeslibrary.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 960cf811
......@@ -136,4 +136,6 @@ source "drivers/staging/omap-thermal/Kconfig"
source "drivers/staging/ramster/Kconfig"
source "drivers/staging/silicom/Kconfig"
endif # STAGING
......@@ -60,3 +60,4 @@ obj-$(CONFIG_WIMAX_GDM72XX) += gdm72xx/
obj-$(CONFIG_CSR_WIFI) += csr/
obj-$(CONFIG_OMAP_BANDGAP) += omap-thermal/
obj-$(CONFIG_ZCACHE2) += ramster/
obj-$(CONFIG_NET_VENDOR_SILICOM) += silicom/
#
# Silicom device configuration
#
config NET_VENDOR_SILICOM
bool "Silicom devices"
default y
depends on (SSB_POSSIBLE && HAS_DMA) || PCI
---help---
If you have a network card (Ethernet) belonging to this class,
say Y.
Note that the answer to this question does not directly affect
the kernel: saying N will just case the configurator to skip all
the questions regarding Silicom chipsets. If you say Y, you will be asked
for your specific chipset/driver in the following questions.
if NET_VENDOR_SILICOM
config SBYPASS
tristate "Silicom BypassCTL library support"
---help---
If you have a network (Ethernet) controller of this type, say Y
To compile this driver as a module, choose M here. The module
will be called bypass.
config BPCTL
tristate "Silicom BypassCTL net support"
depends on PCI
select SBYPASS
select NET_CORE
select MII
---help---
If you have a network (Ethernet) controller of this type, say Y
or M and read the Ethernet-HOWTO, available from
<http://www.tldp.org/docs.html#howto>.
To compile this driver as a module, choose M here. The module
will be called bpctl_mod.
endif # NET_VENDOR_SILICOM
#
# Makefile for the Bypass network device drivers.
#
obj-$(CONFIG_BPCTL) += bpctl_mod.o
obj-$(CONFIG_SBYPASS) += bypasslib/
bpctl_mod-objs := bp_mod.o bp_proc.o
Theory of Operation:
The Silicom Bypass Network Interface Cards (NICs) are network cards with paired ports (2 or 4).
The pairs either act as a "wire" allowing the network packets to pass or insert the device in
between the two ports. When paired with the on-board hardware watchdog or other failsafe,
they provide high availability for the network in the face of software outages or maintenance.
The software requirements are for a kernel level driver that interfaces with the bypass and watchdog,
as well as for control software. User control can be either the provided standalone executable
(/bin/bpctl) or the API exposed by the Silicom library.
TODO:
- checkpatch.pl cleanups
- locking audit
- single module with all functionality
- userland
/******************************************************************************/
/* */
/* Broadcom BCM5700 Linux Network Driver, Copyright (c) 2000 - 2004 Broadcom */
/* Corporation. */
/* All rights reserved. */
/* */
/* 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. */
/* */
/* History: */
/* 02/25/00 Hav Khauv Initial version. */
/******************************************************************************/
#ifndef BITS_H
#define BITS_H
/******************************************************************************/
/* Bit Mask definitions */
/******************************************************************************/
#define BIT_NONE 0x00
#define BIT_0 0x01
#define BIT_1 0x02
#define BIT_2 0x04
#define BIT_3 0x08
#define BIT_4 0x10
#define BIT_5 0x20
#define BIT_6 0x40
#define BIT_7 0x80
#define BIT_8 0x0100
#define BIT_9 0x0200
#define BIT_10 0x0400
#define BIT_11 0x0800
#define BIT_12 0x1000
#define BIT_13 0x2000
#define BIT_14 0x4000
#define BIT_15 0x8000
#define BIT_16 0x010000
#define BIT_17 0x020000
#define BIT_18 0x040000
#define BIT_19 0x080000
#define BIT_20 0x100000
#define BIT_21 0x200000
#define BIT_22 0x400000
#define BIT_23 0x800000
#define BIT_24 0x01000000
#define BIT_25 0x02000000
#define BIT_26 0x04000000
#define BIT_27 0x08000000
#define BIT_28 0x10000000
#define BIT_29 0x20000000
#define BIT_30 0x40000000
#define BIT_31 0x80000000
#endif /* BITS_H */
/******************************************************************************/
/* */
/* Silicom Bypass Control Utility, Copyright (c) 2005-2007 Silicom */
/* All rights reserved. */
/* */
/* 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. */
/* */
/* */
/******************************************************************************/
#ifndef BP_IOCTL_H
#define BP_IOCTL_H
#define BP_CAP 0x01 //BIT_0
#define BP_STATUS_CAP 0x02 //BIT_1
#define BP_STATUS_CHANGE_CAP 0x04 //BIT_2
#define SW_CTL_CAP 0x08 //BIT_3
#define BP_DIS_CAP 0x10 //BIT_4
#define BP_DIS_STATUS_CAP 0x20 //BIT_5
#define STD_NIC_CAP 0x40 //BIT_6
#define BP_PWOFF_ON_CAP 0x80 //BIT_7
#define BP_PWOFF_OFF_CAP 0x0100 //BIT_8
#define BP_PWOFF_CTL_CAP 0x0200 //BIT_9
#define BP_PWUP_ON_CAP 0x0400 //BIT_10
#define BP_PWUP_OFF_CAP 0x0800 //BIT_11
#define BP_PWUP_CTL_CAP 0x1000 //BIT_12
#define WD_CTL_CAP 0x2000 //BIT_13
#define WD_STATUS_CAP 0x4000 //BIT_14
#define WD_TIMEOUT_CAP 0x8000 //BIT_15
#define TX_CTL_CAP 0x10000 //BIT_16
#define TX_STATUS_CAP 0x20000 //BIT_17
#define TAP_CAP 0x40000 //BIT_18
#define TAP_STATUS_CAP 0x80000 //BIT_19
#define TAP_STATUS_CHANGE_CAP 0x100000 //BIT_20
#define TAP_DIS_CAP 0x200000 //BIT_21
#define TAP_DIS_STATUS_CAP 0x400000 //BIT_22
#define TAP_PWUP_ON_CAP 0x800000 //BIT_23
#define TAP_PWUP_OFF_CAP 0x1000000 //BIT 24
#define TAP_PWUP_CTL_CAP 0x2000000 //BIT 25
#define NIC_CAP_NEG 0x4000000 //BIT 26
#define TPL_CAP 0x8000000 //BIT 27
#define DISC_CAP 0x10000000 //BIT 28
#define DISC_DIS_CAP 0x20000000 //BIT 29
#define DISC_PWUP_CTL_CAP 0x40000000 //BIT 30
#define TPL2_CAP_EX 0x01
#define DISC_PORT_CAP_EX 0x02
#define WD_MIN_TIME_MASK(val) (val & 0xf)
#define WD_STEP_COUNT_MASK(val) ((val & 0xf) << 5)
#define WDT_STEP_TIME 0x10 //BIT_4
#define WD_MIN_TIME_GET(desc) (desc & 0xf)
#define WD_STEP_COUNT_GET(desc) (desc>>5) & 0xf
typedef enum {
IF_SCAN,
GET_DEV_NUM,
IS_BYPASS,
GET_BYPASS_SLAVE,
GET_BYPASS_CAPS,
GET_WD_SET_CAPS,
SET_BYPASS,
GET_BYPASS,
GET_BYPASS_CHANGE,
SET_BYPASS_WD,
GET_BYPASS_WD,
GET_WD_EXPIRE_TIME,
RESET_BYPASS_WD_TIMER,
SET_DIS_BYPASS,
GET_DIS_BYPASS,
SET_BYPASS_PWOFF,
GET_BYPASS_PWOFF,
SET_BYPASS_PWUP,
GET_BYPASS_PWUP,
SET_STD_NIC,
GET_STD_NIC,
SET_TX,
GET_TX,
SET_TAP,
GET_TAP,
GET_TAP_CHANGE,
SET_DIS_TAP,
GET_DIS_TAP,
SET_TAP_PWUP,
GET_TAP_PWUP,
SET_WD_EXP_MODE,
GET_WD_EXP_MODE,
SET_WD_AUTORESET,
GET_WD_AUTORESET,
SET_TPL,
GET_TPL,
SET_DISC,
GET_DISC,
GET_DISC_CHANGE,
SET_DIS_DISC,
GET_DIS_DISC,
SET_DISC_PWUP,
GET_DISC_PWUP,
GET_BYPASS_INFO = 100,
GET_BP_WAIT_AT_PWUP,
SET_BP_WAIT_AT_PWUP,
GET_BP_HW_RESET,
SET_BP_HW_RESET,
SET_DISC_PORT,
GET_DISC_PORT,
SET_DISC_PORT_PWUP,
GET_DISC_PORT_PWUP,
SET_BP_FORCE_LINK,
GET_BP_FORCE_LINK,
#ifdef BP_SELF_TEST
SET_BP_SELF_TEST = 200,
GET_BP_SELF_TEST,
#endif
} CMND_TYPE_SD;
/*
* The major device number. We can't rely on dynamic
* registration any more, because ioctls need to know
* it.
*/
#define MAGIC_NUM 'J'
/* for passing single values */
struct bpctl_cmd {
int status;
int data[8];
int in_param[8];
int out_param[8];
};
#define IOCTL_TX_MSG(cmd) _IOWR(MAGIC_NUM, cmd, struct bpctl_cmd)
#define DEVICE_NODE "/dev/bpctl0"
#define DEVICE_NAME "bpctl"
#endif
This source diff could not be displayed because it is too large. You can view the blob instead.
/******************************************************************************/
/* */
/* Bypass Control utility, Copyright (c) 2005 Silicom */
/* */
/* 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. */
/* */
/* */
/* bp_mod.h */
/* */
/******************************************************************************/
#ifndef BP_MOD_H
#define BP_MOD_H
#include "bits.h"
#define EXPORT_SYMBOL_NOVERS EXPORT_SYMBOL
#define usec_delay(x) udelay(x)
#ifndef msec_delay_bp
#define msec_delay_bp(x) do { \
int i; \
if(1) { \
for(i = 0; i < 1000; i++) \
{ \
udelay(x) ; \
} \
} else { \
msleep(x); \
} } while(0)
#endif
#include <linux/param.h>
#ifndef jiffies_to_msecs
#define jiffies_to_msecs(x) _kc_jiffies_to_msecs(x)
static inline unsigned int jiffies_to_msecs(const unsigned long j)
{
#if HZ <= 1000 && !(1000 % HZ)
return (1000 / HZ) * j;
#elif HZ > 1000 && !(HZ % 1000)
return (j + (HZ / 1000) - 1) / (HZ / 1000);
#else
return (j * 1000) / HZ;
#endif
}
#endif
#define SILICOM_VID 0x1374
#define SILICOM_SVID 0x1374
#define SILICOM_PXG2BPFI_SSID 0x0026
#define SILICOM_PXG2BPFILX_SSID 0x0027
#define SILICOM_PXGBPI_SSID 0x0028
#define SILICOM_PXGBPIG_SSID 0x0029
#define SILICOM_PXG2TBFI_SSID 0x002a
#define SILICOM_PXG4BPI_SSID 0x002c
#define SILICOM_PXG4BPFI_SSID 0x002d
#define SILICOM_PXG4BPFILX_SSID 0x002e
#define SILICOM_PXG2BPFIL_SSID 0x002F
#define SILICOM_PXG2BPFILLX_SSID 0x0030
#define SILICOM_PEG4BPI_SSID 0x0031
#define SILICOM_PEG2BPI_SSID 0x0037
#define SILICOM_PEG4BPIN_SSID 0x0038
#define SILICOM_PEG2BPFI_SSID 0x0039
#define SILICOM_PEG2BPFILX_SSID 0x003A
#define SILICOM_PMCXG2BPFI_SSID 0x003B
#define NOKIA_PMCXG2BPFIN_SSID 0x0510
#define NOKIA_PMCXG2BPIN_SSID 0x0513
#define NOKIA_PMCXG4BPIN_SSID 0x0514
#define NOKIA_PMCXG2BPFIN_SVID 0x13B8
#define NOKIA_PMCXG2BPIN2_SSID 0x0515
#define NOKIA_PMCXG4BPIN2_SSID 0x0516
#define SILICOM_PMCX2BPI_SSID 0x041
#define SILICOM_PMCX4BPI_SSID 0x042
#define SILICOM_PXG2BISC1_SSID 0x003d
#define SILICOM_PEG2TBFI_SSID 0x003E
#define SILICOM_PXG2TBI_SSID 0x003f
#define SILICOM_PXG4BPFID_SSID 0x0043
#define SILICOM_PEG4BPFI_SSID 0x0040
#define SILICOM_PEG4BPIPT_SSID 0x0044
#define SILICOM_PXG6BPI_SSID 0x0045
#define SILICOM_PEG4BPIL_SSID 0x0046
#define SILICOM_PEG2BPI5_SSID 0x0052
#define SILICOM_PEG6BPI_SSID 0x0053
#define SILICOM_PEG4BPFI5_SSID 0x0050
#define SILICOM_PEG4BPFI5LX_SSID 0x0051
#define SILICOM_PEG2BISC6_SSID 0x54
#define SILICOM_PEG6BPIFC_SSID 0x55
#define SILICOM_PEG2BPFI5_SSID 0x0056
#define SILICOM_PEG2BPFI5LX_SSID 0x0057
#define SILICOM_PXEG4BPFI_SSID 0x0058
#define SILICOM_PEG2BPFID_SSID 0x0047
#define SILICOM_PEG2BPFIDLX_SSID 0x004C
#define SILICOM_MEG2BPFILN_SSID 0x0048
#define SILICOM_MEG2BPFINX_SSID 0x0049
#define SILICOM_PEG4BPFILX_SSID 0x004A
#define SILICOM_MHIO8AD_SSID 0x004F
#define SILICOM_MEG2BPFILXLN_SSID 0x004b
#define SILICOM_PEG2BPIX1_SSID 0x004d
#define SILICOM_MEG2BPFILXNX_SSID 0x004e
#define SILICOM_PE10G2BPISR_SSID 0x0102
#define SILICOM_PE10G2BPILR_SSID 0x0103
#define SILICOM_PE10G2BPICX4_SSID 0x0101
#define SILICOM_XE10G2BPILR_SSID 0x0163
#define SILICOM_XE10G2BPISR_SSID 0x0162
#define SILICOM_XE10G2BPICX4_SSID 0x0161
#define SILICOM_XE10G2BPIT_SSID 0x0160
#define SILICOM_PE10GDBISR_SSID 0x0181
#define SILICOM_PE10GDBILR_SSID 0x0182
#define SILICOM_PE210G2DBi9SR_SSID 0x0188
#define SILICOM_PE210G2DBi9SRRB_SSID 0x0188
#define SILICOM_PE210G2DBi9LR_SSID 0x0189
#define SILICOM_PE210G2DBi9LRRB_SSID 0x0189
#define SILICOM_PE310G4DBi940SR_SSID 0x018C
#define SILICOM_PE310G4BPi9T_SSID 0x130
#define SILICOM_PE310G4BPi9SR_SSID 0x132
#define SILICOM_PE310G4BPi9LR_SSID 0x133
#define NOKIA_XE10G2BPIXR_SVID 0x13B8
#define NOKIA_XE10G2BPIXR_SSID 0x051C
#define INTEL_PEG4BPII_PID 0x10A0
#define INTEL_PEG4BPFII_PID 0x10A1
#define INTEL_PEG4BPII_SSID 0x11A0
#define INTEL_PEG4BPFII_SSID 0x11A1
#define INTEL_PEG4BPIIO_SSID 0x10A0
#define INTEL_PEG4BPIIO_PID 0x105e
#define BROADCOM_VID 0x14e4
#define BROADCOM_PE10G2_PID 0x164e
#define SILICOM_PE10G2BPTCX4_SSID 0x0141
#define SILICOM_PE10G2BPTSR_SSID 0x0142
#define SILICOM_PE10G2BPTLR_SSID 0x0143
#define SILICOM_PE10G2BPTT_SSID 0x0140
#define SILICOM_PEG4BPI6_SSID 0x0320
#define SILICOM_PEG4BPFI6_SSID 0x0321
#define SILICOM_PEG4BPFI6LX_SSID 0x0322
#define SILICOM_PEG4BPFI6ZX_SSID 0x0323
#define SILICOM_PEG2BPI6_SSID 0x0300
#define SILICOM_PEG2BPFI6_SSID 0x0301
#define SILICOM_PEG2BPFI6LX_SSID 0x0302
#define SILICOM_PEG2BPFI6ZX_SSID 0x0303
#define SILICOM_PEG2BPFI6FLXM_SSID 0x0304
#define SILICOM_PEG2DBI6_SSID 0x0308
#define SILICOM_PEG2DBFI6_SSID 0x0309
#define SILICOM_PEG2DBFI6LX_SSID 0x030A
#define SILICOM_PEG2DBFI6ZX_SSID 0x030B
#define SILICOM_MEG2BPI6_SSID 0x0310
#define SILICOM_XEG2BPI6_SSID 0x0318
#define SILICOM_PEG4BPI6FC_SSID 0x0328
#define SILICOM_PEG4BPFI6FC_SSID 0x0329
#define SILICOM_PEG4BPFI6FCLX_SSID 0x032A
#define SILICOM_PEG4BPFI6FCZX_SSID 0x032B
#define SILICOM_PEG6BPI6_SSID 0x0340
#define SILICOM_PEG2BPI6SC6_SSID 0x0360
#define SILICOM_MEG2BPI6_SSID 0x0310
#define SILICOM_XEG2BPI6_SSID 0x0318
#define SILICOM_MEG4BPI6_SSID 0x0330
#define SILICOM_PE2G4BPi80L_SSID 0x0380
#define SILICOM_M6E2G8BPi80A_SSID 0x0474
#define SILICOM_PE2G4BPi35_SSID 0x03d8
#define SILICOM_PE2G4BPFi80_SSID 0x0381
#define SILICOM_PE2G4BPFi80LX_SSID 0x0382
#define SILICOM_PE2G4BPFi80ZX_SSID 0x0383
#define SILICOM_PE2G4BPi80_SSID 0x0388
#define SILICOM_PE2G2BPi80_SSID 0x0390
#define SILICOM_PE2G2BPFi80_SSID 0x0391
#define SILICOM_PE2G2BPFi80LX_SSID 0x0392
#define SILICOM_PE2G2BPFi80ZX_SSID 0x0393
#define SILICOM_PE2G4BPi35L_SSID 0x03D0
#define SILICOM_PE2G4BPFi35_SSID 0x03D1
#define SILICOM_PE2G4BPFi35LX_SSID 0x03D2
#define SILICOM_PE2G4BPFi35ZX_SSID 0x03D3
#define SILICOM_PE2G2BPi35_SSID 0x03c0
#define SILICOM_PAC1200BPi35_SSID 0x03cc
#define SILICOM_PE2G2BPFi35_SSID 0x03C1
#define SILICOM_PE2G2BPFi35LX_SSID 0x03C2
#define SILICOM_PE2G2BPFi35ZX_SSID 0x03C3
#define SILICOM_PE2G6BPi35_SSID 0x03E0
#define SILICOM_PE2G6BPi35CX_SSID 0x0AA0
#define INTEL_PE210G2SPI9_SSID 0x00C
#define SILICOM_M1EG2BPI6_SSID 0x400
#define SILICOM_M1EG2BPFI6_SSID 0x0401
#define SILICOM_M1EG2BPFI6LX_SSID 0x0402
#define SILICOM_M1EG2BPFI6ZX_SSID 0x0403
#define SILICOM_M1EG4BPI6_SSID 0x0420
#define SILICOM_M1EG4BPFI6_SSID 0x0421
#define SILICOM_M1EG4BPFI6LX_SSID 0x0422
#define SILICOM_M1EG4BPFI6ZX_SSID 0x0423
#define SILICOM_M1EG6BPI6_SSID 0x0440
#define SILICOM_M1E2G4BPi80_SSID 0x0460
#define SILICOM_M1E2G4BPFi80_SSID 0x0461
#define SILICOM_M1E2G4BPFi80LX_SSID 0x0462
#define SILICOM_M1E2G4BPFi80ZX_SSID 0x0463
#define SILICOM_M6E2G8BPi80_SSID 0x0470
#define SILICOM_PE210G2BPi40_SSID 0x01a0
#define PEG540_IF_SERIES(pid) \
((pid==SILICOM_PE210G2BPi40_SSID))
#define OLD_IF_SERIES(pid) \
((pid==SILICOM_PXG2BPFI_SSID)|| \
(pid==SILICOM_PXG2BPFILX_SSID))
#define P2BPFI_IF_SERIES(pid) \
((pid==SILICOM_PXG2BPFI_SSID)|| \
(pid==SILICOM_PXG2BPFILX_SSID)|| \
(pid==SILICOM_PEG2BPFI_SSID)|| \
(pid==SILICOM_PEG2BPFID_SSID)|| \
(pid==SILICOM_PEG2BPFIDLX_SSID)|| \
(pid==SILICOM_MEG2BPFILN_SSID)|| \
(pid==SILICOM_MEG2BPFINX_SSID)|| \
(pid==SILICOM_PEG4BPFILX_SSID)|| \
(pid==SILICOM_PEG4BPFI_SSID)|| \
(pid==SILICOM_PXEG4BPFI_SSID)|| \
(pid==SILICOM_PXG4BPFID_SSID)|| \
(pid==SILICOM_PEG2TBFI_SSID)|| \
(pid==SILICOM_PE10G2BPISR_SSID)|| \
(pid==SILICOM_PE10G2BPILR_SSID)|| \
(pid==SILICOM_PEG2BPFILX_SSID)|| \
(pid==SILICOM_PMCXG2BPFI_SSID) || \
(pid==SILICOM_MHIO8AD_SSID) || \
(pid==SILICOM_PEG4BPFI5LX_SSID) || \
(pid==SILICOM_PEG4BPFI5_SSID) || \
(pid==SILICOM_PEG4BPFI6FC_SSID) || \
(pid==SILICOM_PEG4BPFI6FCLX_SSID) || \
(pid==SILICOM_PEG4BPFI6FCZX_SSID) || \
(pid==NOKIA_PMCXG2BPFIN_SSID)|| \
(pid==SILICOM_MEG2BPFILXLN_SSID)|| \
(pid==SILICOM_MEG2BPFILXNX_SSID)|| \
(pid==SILICOM_XE10G2BPIT_SSID)|| \
(pid==SILICOM_XE10G2BPICX4_SSID)|| \
(pid==SILICOM_XE10G2BPISR_SSID)|| \
(pid==NOKIA_XE10G2BPIXR_SSID)|| \
(pid==SILICOM_PE10GDBISR_SSID)|| \
(pid==SILICOM_PE10GDBILR_SSID)|| \
(pid==SILICOM_XE10G2BPILR_SSID))
#define INTEL_IF_SERIES(pid) \
((pid==INTEL_PEG4BPII_SSID)|| \
(pid==INTEL_PEG4BPIIO_SSID)|| \
(pid==INTEL_PEG4BPFII_SSID))
#define NOKIA_SERIES(pid) \
((pid==NOKIA_PMCXG2BPIN_SSID)|| \
(pid==NOKIA_PMCXG4BPIN_SSID)|| \
(pid==SILICOM_PMCX4BPI_SSID)|| \
(pid==NOKIA_PMCXG2BPFIN_SSID)|| \
(pid==SILICOM_PMCXG2BPFI_SSID)|| \
(pid==NOKIA_PMCXG2BPIN2_SSID)|| \
(pid==NOKIA_PMCXG4BPIN2_SSID)|| \
(pid==SILICOM_PMCX2BPI_SSID))
#define DISCF_IF_SERIES(pid) \
(pid==SILICOM_PEG2TBFI_SSID)
#define PEGF_IF_SERIES(pid) \
((pid==SILICOM_PEG2BPFI_SSID)|| \
(pid==SILICOM_PEG2BPFID_SSID)|| \
(pid==SILICOM_PEG2BPFIDLX_SSID)|| \
(pid==SILICOM_PEG2BPFILX_SSID)|| \
(pid==SILICOM_PEG4BPFI_SSID)|| \
(pid==SILICOM_PXEG4BPFI_SSID)|| \
(pid==SILICOM_MEG2BPFILN_SSID)|| \
(pid==SILICOM_MEG2BPFINX_SSID)|| \
(pid==SILICOM_PEG4BPFILX_SSID)|| \
(pid==SILICOM_PEG2TBFI_SSID)|| \
(pid==SILICOM_MEG2BPFILXLN_SSID)|| \
(pid==SILICOM_MEG2BPFILXNX_SSID))
#define TPL_IF_SERIES(pid) \
((pid==SILICOM_PXG2BPFIL_SSID)|| \
(pid==SILICOM_PXG2BPFILLX_SSID)|| \
(pid==SILICOM_PXG2TBFI_SSID)|| \
(pid==SILICOM_PXG4BPFID_SSID)|| \
(pid==SILICOM_PXG4BPFI_SSID))
#define BP10G_IF_SERIES(pid) \
((pid==SILICOM_PE10G2BPISR_SSID)|| \
(pid==SILICOM_PE10G2BPICX4_SSID)|| \
(pid==SILICOM_PE10G2BPILR_SSID)|| \
(pid==SILICOM_XE10G2BPIT_SSID)|| \
(pid==SILICOM_XE10G2BPICX4_SSID)|| \
(pid==SILICOM_XE10G2BPISR_SSID)|| \
(pid==NOKIA_XE10G2BPIXR_SSID)|| \
(pid==SILICOM_PE10GDBISR_SSID)|| \
(pid==SILICOM_PE10GDBILR_SSID)|| \
(pid==SILICOM_XE10G2BPILR_SSID))
#define BP10GB_IF_SERIES(pid) \
((pid==SILICOM_PE10G2BPTCX4_SSID)|| \
(pid==SILICOM_PE10G2BPTSR_SSID)|| \
(pid==SILICOM_PE10G2BPTLR_SSID)|| \
(pid==SILICOM_PE10G2BPTT_SSID))
#define BP10G_CX4_SERIES(pid) \
(pid==SILICOM_PE10G2BPICX4_SSID)
#define BP10GB_CX4_SERIES(pid) \
(pid==SILICOM_PE10G2BPTCX4_SSID)
#define SILICOM_M2EG2BPFI6_SSID 0x0501
#define SILICOM_M2EG2BPFI6LX_SSID 0x0502
#define SILICOM_M2EG2BPFI6ZX_SSID 0x0503
#define SILICOM_M2EG4BPI6_SSID 0x0520
#define SILICOM_M2EG4BPFI6_SSID 0x0521
#define SILICOM_M2EG4BPFI6LX_SSID 0x0522
#define SILICOM_M2EG4BPFI6ZX_SSID 0x0523
#define SILICOM_M2EG6BPI6_SSID 0x0540
#define SILICOM_M1E10G2BPI9CX4_SSID 0x481
#define SILICOM_M1E10G2BPI9SR_SSID 0x482
#define SILICOM_M1E10G2BPI9LR_SSID 0x483
#define SILICOM_M1E10G2BPI9T_SSID 0x480
#define SILICOM_M2E10G2BPI9CX4_SSID 0x581
#define SILICOM_M2E10G2BPI9SR_SSID 0x582
#define SILICOM_M2E10G2BPI9LR_SSID 0x583
#define SILICOM_M2E10G2BPI9T_SSID 0x580
#define SILICOM_PE210G2BPI9CX4_SSID 0x121
#define SILICOM_PE210G2BPI9SR_SSID 0x122
#define SILICOM_PE210G2BPI9LR_SSID 0x123
#define SILICOM_PE210G2BPI9T_SSID 0x120
#define DBI_IF_SERIES(pid) \
((pid==SILICOM_PE10GDBISR_SSID)|| \
(pid==SILICOM_PE10GDBILR_SSID)|| \
(pid==SILICOM_XE10G2BPILR_SSID)|| \
(pid==SILICOM_PE210G2DBi9LR_SSID))
#define PEGF5_IF_SERIES(pid) \
((pid==SILICOM_PEG2BPFI5_SSID)|| \
(pid==SILICOM_PEG2BPFI5LX_SSID)|| \
(pid==SILICOM_PEG4BPFI6_SSID)|| \
(pid==SILICOM_PEG4BPFI6LX_SSID)|| \
(pid==SILICOM_PEG4BPFI6ZX_SSID)|| \
(pid==SILICOM_PEG2BPFI6_SSID)|| \
(pid==SILICOM_PEG2BPFI6LX_SSID)|| \
(pid==SILICOM_PEG2BPFI6ZX_SSID)|| \
(pid==SILICOM_PEG2BPFI6FLXM_SSID)|| \
(pid==SILICOM_PEG2DBFI6_SSID)|| \
(pid==SILICOM_PEG2DBFI6LX_SSID)|| \
(pid==SILICOM_PEG2DBFI6ZX_SSID)|| \
(pid==SILICOM_PEG4BPI6FC_SSID)|| \
(pid==SILICOM_PEG4BPFI6FCLX_SSID)|| \
(pid==SILICOM_PEG4BPI6FC_SSID)|| \
(pid==SILICOM_M1EG2BPFI6_SSID)|| \
(pid==SILICOM_M1EG2BPFI6LX_SSID)|| \
(pid==SILICOM_M1EG2BPFI6ZX_SSID)|| \
(pid==SILICOM_M1EG4BPFI6_SSID)|| \
(pid==SILICOM_M1EG4BPFI6LX_SSID)|| \
(pid==SILICOM_M1EG4BPFI6ZX_SSID)|| \
(pid==SILICOM_M2EG2BPFI6_SSID)|| \
(pid==SILICOM_M2EG2BPFI6LX_SSID)|| \
(pid==SILICOM_M2EG2BPFI6ZX_SSID)|| \
(pid==SILICOM_M2EG4BPFI6_SSID)|| \
(pid==SILICOM_M2EG4BPFI6LX_SSID)|| \
(pid==SILICOM_M2EG4BPFI6ZX_SSID)|| \
(pid==SILICOM_PEG4BPFI6FCZX_SSID))
#define PEG5_IF_SERIES(pid) \
((pid==SILICOM_PEG4BPI6_SSID)|| \
(pid==SILICOM_PEG2BPI6_SSID)|| \
(pid==SILICOM_PEG4BPI6FC_SSID)|| \
(pid==SILICOM_PEG6BPI6_SSID)|| \
(pid==SILICOM_PEG2BPI6SC6_SSID)|| \
(pid==SILICOM_MEG2BPI6_SSID)|| \
(pid==SILICOM_XEG2BPI6_SSID)|| \
(pid==SILICOM_MEG4BPI6_SSID)|| \
(pid==SILICOM_M1EG2BPI6_SSID)|| \
(pid==SILICOM_M1EG4BPI6_SSID)|| \
(pid==SILICOM_M1EG6BPI6_SSID)|| \
(pid==SILICOM_PEG6BPI_SSID)|| \
(pid==SILICOM_PEG4BPIL_SSID)|| \
(pid==SILICOM_PEG2BISC6_SSID)|| \
(pid==SILICOM_PEG2BPI5_SSID))
#define PEG80_IF_SERIES(pid) \
((pid==SILICOM_M1E2G4BPi80_SSID)|| \
(pid==SILICOM_M6E2G8BPi80_SSID)|| \
(pid==SILICOM_PE2G4BPi80L_SSID)|| \
(pid==SILICOM_M6E2G8BPi80A_SSID)|| \
(pid==SILICOM_PE2G2BPi35_SSID)|| \
(pid==SILICOM_PAC1200BPi35_SSID)|| \
(pid==SILICOM_PE2G4BPi35_SSID)|| \
(pid==SILICOM_PE2G4BPi35L_SSID)|| \
(pid==SILICOM_PE2G6BPi35_SSID)|| \
(pid==SILICOM_PE2G2BPi80_SSID)|| \
(pid==SILICOM_PE2G4BPi80_SSID)|| \
(pid==SILICOM_PE2G4BPFi80_SSID)|| \
(pid==SILICOM_PE2G4BPFi80LX_SSID)|| \
(pid==SILICOM_PE2G4BPFi80ZX_SSID)|| \
(pid==SILICOM_PE2G4BPFi80ZX_SSID)|| \
(pid==SILICOM_PE2G2BPFi80_SSID)|| \
(pid==SILICOM_PE2G2BPFi80LX_SSID)|| \
(pid==SILICOM_PE2G2BPFi80ZX_SSID)|| \
(pid==SILICOM_PE2G2BPFi35_SSID)|| \
(pid==SILICOM_PE2G2BPFi35LX_SSID)|| \
(pid==SILICOM_PE2G2BPFi35ZX_SSID)|| \
(pid==SILICOM_PE2G4BPFi35_SSID)|| \
(pid==SILICOM_PE2G4BPFi35LX_SSID)|| \
(pid==SILICOM_PE2G4BPFi35ZX_SSID))
#define PEGF80_IF_SERIES(pid) \
((pid==SILICOM_PE2G4BPFi80_SSID)|| \
(pid==SILICOM_PE2G4BPFi80LX_SSID)|| \
(pid==SILICOM_PE2G4BPFi80ZX_SSID)|| \
(pid==SILICOM_PE2G4BPFi80ZX_SSID)|| \
(pid==SILICOM_M1E2G4BPFi80_SSID)|| \
(pid==SILICOM_M1E2G4BPFi80LX_SSID)|| \
(pid==SILICOM_M1E2G4BPFi80ZX_SSID)|| \
(pid==SILICOM_PE2G2BPFi80_SSID)|| \
(pid==SILICOM_PE2G2BPFi80LX_SSID)|| \
(pid==SILICOM_PE2G2BPFi80ZX_SSID)|| \
(pid==SILICOM_PE2G2BPFi35_SSID)|| \
(pid==SILICOM_PE2G2BPFi35LX_SSID)|| \
(pid==SILICOM_PE2G2BPFi35ZX_SSID)|| \
(pid==SILICOM_PE2G4BPFi35_SSID)|| \
(pid==SILICOM_PE2G4BPFi35LX_SSID)|| \
(pid==SILICOM_PE2G4BPFi35ZX_SSID))
#define BP10G9_IF_SERIES(pid) \
((pid==INTEL_PE210G2SPI9_SSID)|| \
(pid==SILICOM_M1E10G2BPI9CX4_SSID)|| \
(pid==SILICOM_M1E10G2BPI9SR_SSID)|| \
(pid==SILICOM_M1E10G2BPI9LR_SSID)|| \
(pid==SILICOM_M1E10G2BPI9T_SSID)|| \
(pid==SILICOM_M2E10G2BPI9CX4_SSID)|| \
(pid==SILICOM_M2E10G2BPI9SR_SSID)|| \
(pid==SILICOM_M2E10G2BPI9LR_SSID)|| \
(pid==SILICOM_M2E10G2BPI9T_SSID)|| \
(pid==SILICOM_PE210G2BPI9CX4_SSID)|| \
(pid==SILICOM_PE210G2BPI9SR_SSID)|| \
(pid==SILICOM_PE210G2BPI9LR_SSID)|| \
(pid==SILICOM_PE210G2DBi9SR_SSID)|| \
(pid==SILICOM_PE210G2DBi9SRRB_SSID)|| \
(pid==SILICOM_PE210G2DBi9LR_SSID)|| \
(pid==SILICOM_PE210G2DBi9LRRB_SSID)|| \
(pid==SILICOM_PE310G4DBi940SR_SSID)|| \
(pid==SILICOM_PEG2BISC6_SSID)|| \
(pid==SILICOM_PE310G4BPi9T_SSID)|| \
(pid==SILICOM_PE310G4BPi9SR_SSID)|| \
(pid==SILICOM_PE310G4BPi9LR_SSID)|| \
(pid==SILICOM_PE210G2BPI9T_SSID))
/*******************************************************/
/* 1G INTERFACE ****************************************/
/*******************************************************/
/* Intel Registers */
#define BPCTLI_CTRL 0x00000
#define BPCTLI_CTRL_SWDPIO0 0x00400000
#define BPCTLI_CTRL_SWDPIN0 0x00040000
#define BPCTLI_CTRL_EXT 0x00018 /* Extended Device Control - RW */
#define BPCTLI_STATUS 0x00008 /* Device Status - RO */
/* HW related */
#define BPCTLI_CTRL_EXT_SDP6_DATA 0x00000040 /* Value of SW Defineable Pin 6 */
#define BPCTLI_CTRL_EXT_SDP7_DATA 0x00000080 /* Value of SW Defineable Pin 7 */
#define BPCTLI_CTRL_SDP0_DATA 0x00040000 /* SWDPIN 0 value */
#define BPCTLI_CTRL_EXT_SDP6_DIR 0x00000400 /* Direction of SDP6 0=in 1=out */
#define BPCTLI_CTRL_EXT_SDP7_DIR 0x00000800 /* Direction of SDP7 0=in 1=out */
#define BPCTLI_CTRL_SDP0_DIR 0x00400000 /* SDP0 Input or output */
#define BPCTLI_CTRL_SWDPIN1 0x00080000
#define BPCTLI_CTRL_SDP1_DIR 0x00800000
#define BPCTLI_STATUS_LU 0x00000002 /* Link up.0=no,1=link */
#define BPCTLI_CTRL_SDP0_SHIFT 18
#define BPCTLI_CTRL_EXT_SDP6_SHIFT 6
#define BPCTLI_STATUS_TBIMODE 0x00000020
#define BPCTLI_CTRL_EXT_LINK_MODE_PCIE_SERDES 0x00C00000
#define BPCTLI_CTRL_EXT_LINK_MODE_MASK 0x00C00000
#define BPCTLI_CTRL_EXT_MCLK_DIR BPCTLI_CTRL_EXT_SDP7_DIR
#define BPCTLI_CTRL_EXT_MCLK_DATA BPCTLI_CTRL_EXT_SDP7_DATA
#define BPCTLI_CTRL_EXT_MDIO_DIR BPCTLI_CTRL_EXT_SDP6_DIR
#define BPCTLI_CTRL_EXT_MDIO_DATA BPCTLI_CTRL_EXT_SDP6_DATA
#define BPCTLI_CTRL_EXT_MCLK_DIR5 BPCTLI_CTRL_SDP1_DIR
#define BPCTLI_CTRL_EXT_MCLK_DATA5 BPCTLI_CTRL_SWDPIN1
#define BPCTLI_CTRL_EXT_MCLK_DIR80 BPCTLI_CTRL_EXT_SDP6_DIR
#define BPCTLI_CTRL_EXT_MCLK_DATA80 BPCTLI_CTRL_EXT_SDP6_DATA
#define BPCTLI_CTRL_EXT_MDIO_DIR5 BPCTLI_CTRL_SWDPIO0
#define BPCTLI_CTRL_EXT_MDIO_DATA5 BPCTLI_CTRL_SWDPIN0
#define BPCTLI_CTRL_EXT_MDIO_DIR80 BPCTLI_CTRL_SWDPIO0
#define BPCTLI_CTRL_EXT_MDIO_DATA80 BPCTLI_CTRL_SWDPIN0
#define BPCTL_WRITE_REG(a, reg, value) \
(writel((value), (void *)(((a)->mem_map) + BPCTLI_##reg)))
#define BPCTL_READ_REG(a, reg) ( \
readl((void *)((a)->mem_map) + BPCTLI_##reg))
#define BPCTL_WRITE_FLUSH(a) BPCTL_READ_REG(a, STATUS)
#define BPCTL_BP_WRITE_REG(a, reg, value) ({ \
BPCTL_WRITE_REG(a, reg, value); \
BPCTL_WRITE_FLUSH(a);})
/**************************************************************/
/************** 82575 Interface********************************/
/**************************************************************/
#define BPCTLI_MII_CR_POWER_DOWN 0x0800
#define BPCTLI_PHY_CONTROL 0x00 /* Control Register */
#define BPCTLI_MDIC 0x00020 /* MDI Control - RW */
#define BPCTLI_IGP01E1000_PHY_PAGE_SELECT 0x1F /* Page Select */
#define BPCTLI_MAX_PHY_REG_ADDRESS 0x1F /* 5 bit address bus (0-0x1F) */
#define BPCTLI_MDIC_DATA_MASK 0x0000FFFF
#define BPCTLI_MDIC_REG_MASK 0x001F0000
#define BPCTLI_MDIC_REG_SHIFT 16
#define BPCTLI_MDIC_PHY_MASK 0x03E00000
#define BPCTLI_MDIC_PHY_SHIFT 21
#define BPCTLI_MDIC_OP_WRITE 0x04000000
#define BPCTLI_MDIC_OP_READ 0x08000000
#define BPCTLI_MDIC_READY 0x10000000
#define BPCTLI_MDIC_INT_EN 0x20000000
#define BPCTLI_MDIC_ERROR 0x40000000
#define BPCTLI_SWFW_PHY0_SM 0x02
#define BPCTLI_SWFW_PHY1_SM 0x04
#define BPCTLI_SW_FW_SYNC 0x05B5C /* Software-Firmware Synchronization - RW */
#define BPCTLI_SWSM 0x05B50 /* SW Semaphore */
#define BPCTLI_FWSM 0x05B54 /* FW Semaphore */
#define BPCTLI_SWSM_SMBI 0x00000001 /* Driver Semaphore bit */
#define BPCTLI_SWSM_SWESMBI 0x00000002 /* FW Semaphore bit */
#define BPCTLI_MAX_PHY_MULTI_PAGE_REG 0xF
#define BPCTLI_GEN_POLL_TIMEOUT 640
/********************************************************/
/********************************************************/
/* 10G INTERFACE ****************************************/
/********************************************************/
#define BP10G_I2CCTL 0x28
/* I2CCTL Bit Masks */
#define BP10G_I2C_CLK_IN 0x00000001
#define BP10G_I2C_CLK_OUT 0x00000002
#define BP10G_I2C_DATA_IN 0x00000004
#define BP10G_I2C_DATA_OUT 0x00000008
#define BP10G_ESDP 0x20
#define BP10G_SDP0_DIR 0x100
#define BP10G_SDP1_DIR 0x200
#define BP10G_SDP3_DIR 0x800
#define BP10G_SDP4_DIR BIT_12
#define BP10G_SDP5_DIR 0x2000
#define BP10G_SDP0_DATA 0x001
#define BP10G_SDP1_DATA 0x002
#define BP10G_SDP3_DATA 0x008
#define BP10G_SDP4_DATA 0x010
#define BP10G_SDP5_DATA 0x020
#define BP10G_SDP2_DIR 0x400
#define BP10G_SDP2_DATA 0x4
#define BP10G_EODSDP 0x28
#define BP10G_SDP6_DATA_IN 0x001
#define BP10G_SDP6_DATA_OUT 0x002
#define BP10G_SDP7_DATA_IN 0x004
#define BP10G_SDP7_DATA_OUT 0x008
#define BP10G_MCLK_DATA_OUT BP10G_SDP7_DATA_OUT
#define BP10G_MDIO_DATA_OUT BP10G_SDP6_DATA_OUT
#define BP10G_MDIO_DATA_IN BP10G_SDP6_DATA_IN
#define BP10G_MDIO_DATA /*BP10G_SDP5_DATA*/ BP10G_SDP3_DATA
#define BP10G_MDIO_DIR /*BP10G_SDP5_DIR*/ BP10G_SDP3_DATA
/*#define BP10G_MCLK_DATA_OUT9 BP10G_I2C_CLK_OUT
#define BP10G_MDIO_DATA_OUT9 BP10G_I2C_DATA_OUT*/
/*#define BP10G_MCLK_DATA_OUT9*//*BP10G_I2C_DATA_OUT */
#define BP10G_MDIO_DATA_OUT9 BP10G_I2C_DATA_OUT /*BP10G_I2C_CLK_OUT */
/* VIA EOSDP ! */
#define BP10G_MCLK_DATA_OUT9 BP10G_SDP4_DATA
#define BP10G_MCLK_DIR_OUT9 BP10G_SDP4_DIR
/*#define BP10G_MDIO_DATA_IN9 BP10G_I2C_DATA_IN*/
#define BP10G_MDIO_DATA_IN9 BP10G_I2C_DATA_IN /*BP10G_I2C_CLK_IN */
#define BP540_MDIO_DATA /*BP10G_SDP5_DATA*/ BP10G_SDP0_DATA
#define BP540_MDIO_DIR /*BP10G_SDP5_DIR*/ BP10G_SDP0_DIR
#define BP540_MCLK_DATA BP10G_SDP2_DATA
#define BP540_MCLK_DIR BP10G_SDP2_DIR
#define BP10G_WRITE_REG(a, reg, value) \
(writel((value), (void *)(((a)->mem_map) + BP10G_##reg)))
#define BP10G_READ_REG(a, reg) ( \
readl((void *)((a)->mem_map) + BP10G_##reg))
/*****BROADCOM*******************************************/
#define BP10GB_MISC_REG_GPIO 0xa490
#define BP10GB_GPIO3_P0 BIT_3
#define BP10GB_GPIO3_P1 BIT_7
#define BP10GB_GPIO3_SET_P0 BIT_11
#define BP10GB_GPIO3_CLR_P0 BIT_19
#define BP10GB_GPIO3_OE_P0 BIT_27
#define BP10GB_GPIO3_SET_P1 BIT_15
#define BP10GB_GPIO3_CLR_P1 BIT_23
#define BP10GB_GPIO3_OE_P1 BIT_31
#define BP10GB_GPIO0_P1 0x10
#define BP10GB_GPIO0_P0 0x1
#define BP10GB_GPIO0_CLR_P0 0x10000
#define BP10GB_GPIO0_CLR_P1 0x100000
#define BP10GB_GPIO0_SET_P0 0x100
#define BP10GB_GPIO0_SET_P1 0x1000
#define BP10GB_GPIO0_OE_P1 0x10000000
#define BP10GB_GPIO0_OE_P0 0x1000000
#define BP10GB_MISC_REG_SPIO 0xa4fc
#define BP10GB_GPIO4_OE BIT_28
#define BP10GB_GPIO5_OE BIT_29
#define BP10GB_GPIO4_CLR BIT_20
#define BP10GB_GPIO5_CLR BIT_21
#define BP10GB_GPIO4_SET BIT_12
#define BP10GB_GPIO5_SET BIT_13
#define BP10GB_GPIO4 BIT_4
#define BP10GB_GPIO5 BIT_5
#define BP10GB_MCLK_DIR BP10GB_GPIO5_OE
#define BP10GB_MDIO_DIR BP10GB_GPIO4_OE
#define BP10GB_MCLK_DATA BP10GB_GPIO5
#define BP10GB_MDIO_DATA BP10GB_GPIO4
#define BP10GB_MCLK_SET BP10GB_GPIO5_SET
#define BP10GB_MDIO_SET BP10GB_GPIO4_SET
#define BP10GB_MCLK_CLR BP10GB_GPIO5_CLR
#define BP10GB_MDIO_CLR BP10GB_GPIO4_CLR
#define BP10GB_WRITE_REG(a, reg, value) \
(writel((value), (void *)(((a)->mem_map) + BP10GB_##reg)))
#define BP10GB_READ_REG(a, reg) ( \
readl((void *)((a)->mem_map) + BP10GB_##reg))
#endif
int bp_proc_create(void);
/******************************************************************************/
/* */
/* Copyright (c) 2004-2006 Silicom, Ltd */
/* All rights reserved. */
/* */
/* 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. */
/* */
/* */
/******************************************************************************/
#include <linux/version.h>
#if defined(CONFIG_SMP) && ! defined(__SMP__)
#define __SMP__
#endif
#include <linux/proc_fs.h>
#include <linux/netdevice.h>
#include <asm/uaccess.h>
//#include <linux/smp_lock.h>
#include "bp_mod.h"
#define BP_PROC_DIR "bypass"
//#define BYPASS_SUPPORT "bypass"
#ifdef BYPASS_SUPPORT
#define GPIO6_SET_ENTRY_SD "gpio6_set"
#define GPIO6_CLEAR_ENTRY_SD "gpio6_clear"
#define GPIO7_SET_ENTRY_SD "gpio7_set"
#define GPIO7_CLEAR_ENTRY_SD "gpio7_clear"
#define PULSE_SET_ENTRY_SD "pulse_set"
#define ZERO_SET_ENTRY_SD "zero_set"
#define PULSE_GET1_ENTRY_SD "pulse_get1"
#define PULSE_GET2_ENTRY_SD "pulse_get2"
#define CMND_ON_ENTRY_SD "cmnd_on"
#define CMND_OFF_ENTRY_SD "cmnd_off"
#define RESET_CONT_ENTRY_SD "reset_cont"
/*COMMANDS*/
#define BYPASS_INFO_ENTRY_SD "bypass_info"
#define BYPASS_SLAVE_ENTRY_SD "bypass_slave"
#define BYPASS_CAPS_ENTRY_SD "bypass_caps"
#define WD_SET_CAPS_ENTRY_SD "wd_set_caps"
#define BYPASS_ENTRY_SD "bypass"
#define BYPASS_CHANGE_ENTRY_SD "bypass_change"
#define BYPASS_WD_ENTRY_SD "bypass_wd"
#define WD_EXPIRE_TIME_ENTRY_SD "wd_expire_time"
#define RESET_BYPASS_WD_ENTRY_SD "reset_bypass_wd"
#define DIS_BYPASS_ENTRY_SD "dis_bypass"
#define BYPASS_PWUP_ENTRY_SD "bypass_pwup"
#define BYPASS_PWOFF_ENTRY_SD "bypass_pwoff"
#define STD_NIC_ENTRY_SD "std_nic"
#define STD_NIC_ENTRY_SD "std_nic"
#define TAP_ENTRY_SD "tap"
#define TAP_CHANGE_ENTRY_SD "tap_change"
#define DIS_TAP_ENTRY_SD "dis_tap"
#define TAP_PWUP_ENTRY_SD "tap_pwup"
#define TWO_PORT_LINK_ENTRY_SD "two_port_link"
#define WD_EXP_MODE_ENTRY_SD "wd_exp_mode"
#define WD_AUTORESET_ENTRY_SD "wd_autoreset"
#define TPL_ENTRY_SD "tpl"
#define WAIT_AT_PWUP_ENTRY_SD "wait_at_pwup"
#define HW_RESET_ENTRY_SD "hw_reset"
#define DISC_ENTRY_SD "disc"
#define DISC_CHANGE_ENTRY_SD "disc_change"
#define DIS_DISC_ENTRY_SD "dis_disc"
#define DISC_PWUP_ENTRY_SD "disc_pwup"
#endif //bypass_support
static struct proc_dir_entry *bp_procfs_dir;
static struct proc_dir_entry *proc_getdir(char *name,
struct proc_dir_entry *proc_dir)
{
struct proc_dir_entry *pde = proc_dir;
for (pde = pde->subdir; pde; pde = pde->next) {
if (pde->namelen && (strcmp(name, pde->name) == 0)) {
/* directory exists */
break;
}
}
if (pde == (struct proc_dir_entry *)0) {
/* create the directory */
pde = create_proc_entry(name, S_IFDIR, proc_dir);
if (pde == (struct proc_dir_entry *)0) {
return (pde);
}
}
return (pde);
}
#ifdef BYPASS_SUPPORT
int
bypass_proc_create_entry_sd(struct pfs_unit *pfs_unit_curr,
char *proc_name,
write_proc_t * write_proc,
read_proc_t * read_proc,
struct proc_dir_entry *parent_pfs, void *data)
{
strcpy(pfs_unit_curr->proc_name, proc_name);
pfs_unit_curr->proc_entry = create_proc_entry(pfs_unit_curr->proc_name,
S_IFREG | S_IRUSR |
S_IWUSR | S_IRGRP |
S_IWGRP | S_IROTH |
S_IWOTH, parent_pfs);
if (pfs_unit_curr->proc_entry == 0) {
return -1;
}
pfs_unit_curr->proc_entry->read_proc = read_proc;
pfs_unit_curr->proc_entry->write_proc = write_proc;
pfs_unit_curr->proc_entry->data = data;
return 0;
}
int
get_bypass_info_pfs(char *page, char **start, off_t off, int count,
int *eof, void *data)
{
bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
int len = 0;
len += sprintf(page, "Name\t\t\t%s\n", pbp_device_block->bp_name);
len +=
sprintf(page + len, "Firmware version\t0x%x\n",
pbp_device_block->bp_fw_ver);
*eof = 1;
return len;
}
int
get_bypass_slave_pfs(char *page, char **start, off_t off, int count,
int *eof, void *data)
{
bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
struct pci_dev *pci_slave_dev = pbp_device_block->bp_slave;
struct net_device *net_slave_dev;
int len = 0;
if (is_bypass_fn(pbp_device_block)) {
net_slave_dev = pci_get_drvdata(pci_slave_dev);
if (net_slave_dev)
len = sprintf(page, "%s\n", net_slave_dev->name);
else
len = sprintf(page, "fail\n");
} else
len = sprintf(page, "fail\n");
*eof = 1;
return len;
}
int
get_bypass_caps_pfs(char *page, char **start, off_t off, int count,
int *eof, void *data)
{
bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
int len = 0, ret = 0;
ret = get_bypass_caps_fn(pbp_device_block);
if (ret == BP_NOT_CAP)
len = sprintf(page, "-1\n");
else
len = sprintf(page, "0x%x\n", ret);
*eof = 1;
return len;
}
int
get_wd_set_caps_pfs(char *page, char **start, off_t off, int count,
int *eof, void *data)
{
bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
int len = 0, ret = 0;
ret = get_wd_set_caps_fn(pbp_device_block);
if (ret == BP_NOT_CAP)
len = sprintf(page, "-1\n");
else
len = sprintf(page, "0x%x\n", ret);
*eof = 1;
return len;
}
int
set_bypass_pfs(struct file *file, const char *buffer,
unsigned long count, void *data)
{
char kbuf[256];
bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
int bypass_param = 0, length = 0;
if (count > (sizeof(kbuf) - 1))
return -1;
if (copy_from_user(&kbuf, buffer, count)) {
return -1;
}
kbuf[count] = '\0';
length = strlen(kbuf);
if (kbuf[length - 1] == '\n')
kbuf[--length] = '\0';
if (strcmp(kbuf, "on") == 0)
bypass_param = 1;
else if (strcmp(kbuf, "off") == 0)
bypass_param = 0;
set_bypass_fn(pbp_device_block, bypass_param);
return count;
}
int
set_tap_pfs(struct file *file, const char *buffer,
unsigned long count, void *data)
{
char kbuf[256];
bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
int tap_param = 0, length = 0;
if (count > (sizeof(kbuf) - 1))
return -1;
if (copy_from_user(&kbuf, buffer, count)) {
return -1;
}
kbuf[count] = '\0';
length = strlen(kbuf);
if (kbuf[length - 1] == '\n')
kbuf[--length] = '\0';
if (strcmp(kbuf, "on") == 0)
tap_param = 1;
else if (strcmp(kbuf, "off") == 0)
tap_param = 0;
set_tap_fn(pbp_device_block, tap_param);
return count;
}
int
set_disc_pfs(struct file *file, const char *buffer,
unsigned long count, void *data)
{
char kbuf[256];
bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
int tap_param = 0, length = 0;
if (count > (sizeof(kbuf) - 1))
return -1;
if (copy_from_user(&kbuf, buffer, count)) {
return -1;
}
kbuf[count] = '\0';
length = strlen(kbuf);
if (kbuf[length - 1] == '\n')
kbuf[--length] = '\0';
if (strcmp(kbuf, "on") == 0)
tap_param = 1;
else if (strcmp(kbuf, "off") == 0)
tap_param = 0;
set_disc_fn(pbp_device_block, tap_param);
return count;
}
int
get_bypass_pfs(char *page, char **start, off_t off, int count,
int *eof, void *data)
{
bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
int len = 0, ret = 0;
ret = get_bypass_fn(pbp_device_block);
if (ret == BP_NOT_CAP)
len = sprintf(page, "fail\n");
else if (ret == 1)
len = sprintf(page, "on\n");
else if (ret == 0)
len = sprintf(page, "off\n");
*eof = 1;
return len;
}
int
get_tap_pfs(char *page, char **start, off_t off, int count,
int *eof, void *data)
{
bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
int len = 0, ret = 0;
ret = get_tap_fn(pbp_device_block);
if (ret == BP_NOT_CAP)
len = sprintf(page, "fail\n");
else if (ret == 1)
len = sprintf(page, "on\n");
else if (ret == 0)
len = sprintf(page, "off\n");
*eof = 1;
return len;
}
int
get_disc_pfs(char *page, char **start, off_t off, int count,
int *eof, void *data)
{
bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
int len = 0, ret = 0;
ret = get_disc_fn(pbp_device_block);
if (ret == BP_NOT_CAP)
len = sprintf(page, "fail\n");
else if (ret == 1)
len = sprintf(page, "on\n");
else if (ret == 0)
len = sprintf(page, "off\n");
*eof = 1;
return len;
}
int
get_bypass_change_pfs(char *page, char **start, off_t off, int count,
int *eof, void *data)
{
bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
int len = 0, ret = 0;
ret = get_bypass_change_fn(pbp_device_block);
if (ret == 1)
len = sprintf(page, "on\n");
else if (ret == 0)
len = sprintf(page, "off\n");
else
len = sprintf(page, "fail\n");
*eof = 1;
return len;
}
int
get_tap_change_pfs(char *page, char **start, off_t off, int count,
int *eof, void *data)
{
bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
int len = 0, ret = 0;
ret = get_tap_change_fn(pbp_device_block);
if (ret == 1)
len = sprintf(page, "on\n");
else if (ret == 0)
len = sprintf(page, "off\n");
else
len = sprintf(page, "fail\n");
*eof = 1;
return len;
}
int
get_disc_change_pfs(char *page, char **start, off_t off, int count,
int *eof, void *data)
{
bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
int len = 0, ret = 0;
ret = get_disc_change_fn(pbp_device_block);
if (ret == 1)
len = sprintf(page, "on\n");
else if (ret == 0)
len = sprintf(page, "off\n");
else
len = sprintf(page, "fail\n");
*eof = 1;
return len;
}
int
set_bypass_wd_pfs(struct file *file, const char *buffer,
unsigned long count, void *data)
{
char kbuf[256];
bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
unsigned int timeout = 0;
char *timeout_ptr = kbuf;
if (copy_from_user(&kbuf, buffer, count)) {
return -1;
}
timeout_ptr = kbuf;
timeout = atoi(&timeout_ptr);
set_bypass_wd_fn(pbp_device_block, timeout);
return count;
}
int
get_bypass_wd_pfs(char *page, char **start, off_t off, int count,
int *eof, void *data)
{
bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
int len = 0, ret = 0, timeout = 0;
ret = get_bypass_wd_fn(pbp_device_block, &timeout);
if (ret == BP_NOT_CAP)
len = sprintf(page, "fail\n");
else if (timeout == -1)
len = sprintf(page, "unknown\n");
else if (timeout == 0)
len = sprintf(page, "disable\n");
else
len = sprintf(page, "%d\n", timeout);
*eof = 1;
return len;
}
int
get_wd_expire_time_pfs(char *page, char **start, off_t off, int count,
int *eof, void *data)
{
bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
int len = 0, ret = 0, timeout = 0;
ret = get_wd_expire_time_fn(pbp_device_block, &timeout);
if (ret == BP_NOT_CAP)
len = sprintf(page, "fail\n");
else if (timeout == -1)
len = sprintf(page, "expire\n");
else if (timeout == 0)
len = sprintf(page, "disable\n");
else
len = sprintf(page, "%d\n", timeout);
*eof = 1;
return len;
}
int
get_tpl_pfs(char *page, char **start, off_t off, int count,
int *eof, void *data)
{
bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
int len = 0, ret = 0;
ret = get_tpl_fn(pbp_device_block);
if (ret == BP_NOT_CAP)
len = sprintf(page, "fail\n");
else if (ret == 1)
len = sprintf(page, "on\n");
else if (ret == 0)
len = sprintf(page, "off\n");
*eof = 1;
return len;
}
#ifdef PMC_FIX_FLAG
int
get_wait_at_pwup_pfs(char *page, char **start, off_t off, int count,
int *eof, void *data)
{
bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
int len = 0, ret = 0;
ret = get_bp_wait_at_pwup_fn(pbp_device_block);
if (ret == BP_NOT_CAP)
len = sprintf(page, "fail\n");
else if (ret == 1)
len = sprintf(page, "on\n");
else if (ret == 0)
len = sprintf(page, "off\n");
*eof = 1;
return len;
}
int
get_hw_reset_pfs(char *page, char **start, off_t off, int count,
int *eof, void *data)
{
bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
int len = 0, ret = 0;
ret = get_bp_hw_reset_fn(pbp_device_block);
if (ret == BP_NOT_CAP)
len = sprintf(page, "fail\n");
else if (ret == 1)
len = sprintf(page, "on\n");
else if (ret == 0)
len = sprintf(page, "off\n");
*eof = 1;
return len;
}
#endif /*PMC_WAIT_FLAG */
int
reset_bypass_wd_pfs(char *page, char **start, off_t off, int count,
int *eof, void *data)
{
bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
int len = 0, ret = 0;
ret = reset_bypass_wd_timer_fn(pbp_device_block);
if (ret == BP_NOT_CAP)
len = sprintf(page, "fail\n");
else if (ret == 0)
len = sprintf(page, "disable\n");
else if (ret == 1)
len = sprintf(page, "success\n");
*eof = 1;
return len;
}
int
set_dis_bypass_pfs(struct file *file, const char *buffer,
unsigned long count, void *data)
{
char kbuf[256];
bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
int bypass_param = 0, length = 0;
if (copy_from_user(&kbuf, buffer, count)) {
return -1;
}
kbuf[count] = '\0';
length = strlen(kbuf);
if (kbuf[length - 1] == '\n')
kbuf[--length] = '\0';
if (strcmp(kbuf, "on") == 0)
bypass_param = 1;
else if (strcmp(kbuf, "off") == 0)
bypass_param = 0;
set_dis_bypass_fn(pbp_device_block, bypass_param);
return count;
}
int
set_dis_tap_pfs(struct file *file, const char *buffer,
unsigned long count, void *data)
{
char kbuf[256];
bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
int tap_param = 0, length = 0;
if (copy_from_user(&kbuf, buffer, count)) {
return -1;
}
kbuf[count] = '\0';
length = strlen(kbuf);
if (kbuf[length - 1] == '\n')
kbuf[--length] = '\0';
if (strcmp(kbuf, "on") == 0)
tap_param = 1;
else if (strcmp(kbuf, "off") == 0)
tap_param = 0;
set_dis_tap_fn(pbp_device_block, tap_param);
return count;
}
int
set_dis_disc_pfs(struct file *file, const char *buffer,
unsigned long count, void *data)
{
char kbuf[256];
bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
int tap_param = 0, length = 0;
if (copy_from_user(&kbuf, buffer, count)) {
return -1;
}
kbuf[count] = '\0';
length = strlen(kbuf);
if (kbuf[length - 1] == '\n')
kbuf[--length] = '\0';
if (strcmp(kbuf, "on") == 0)
tap_param = 1;
else if (strcmp(kbuf, "off") == 0)
tap_param = 0;
set_dis_disc_fn(pbp_device_block, tap_param);
return count;
}
int
get_dis_bypass_pfs(char *page, char **start, off_t off, int count,
int *eof, void *data)
{
bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
int len = 0, ret = 0;
ret = get_dis_bypass_fn(pbp_device_block);
if (ret == BP_NOT_CAP)
len = sprintf(page, "fail\n");
else if (ret == 0)
len = sprintf(page, "off\n");
else
len = sprintf(page, "on\n");
*eof = 1;
return len;
}
int
get_dis_tap_pfs(char *page, char **start, off_t off, int count,
int *eof, void *data)
{
bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
int len = 0, ret = 0;
ret = get_dis_tap_fn(pbp_device_block);
if (ret == BP_NOT_CAP)
len = sprintf(page, "fail\n");
else if (ret == 0)
len = sprintf(page, "off\n");
else
len = sprintf(page, "on\n");
*eof = 1;
return len;
}
int
get_dis_disc_pfs(char *page, char **start, off_t off, int count,
int *eof, void *data)
{
bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
int len = 0, ret = 0;
ret = get_dis_disc_fn(pbp_device_block);
if (ret == BP_NOT_CAP)
len = sprintf(page, "fail\n");
else if (ret == 0)
len = sprintf(page, "off\n");
else
len = sprintf(page, "on\n");
*eof = 1;
return len;
}
int
set_bypass_pwup_pfs(struct file *file, const char *buffer,
unsigned long count, void *data)
{
char kbuf[256];
bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
int bypass_param = 0, length = 0;
if (copy_from_user(&kbuf, buffer, count)) {
return -1;
}
kbuf[count] = '\0';
length = strlen(kbuf);
if (kbuf[length - 1] == '\n')
kbuf[--length] = '\0';
if (strcmp(kbuf, "on") == 0)
bypass_param = 1;
else if (strcmp(kbuf, "off") == 0)
bypass_param = 0;
set_bypass_pwup_fn(pbp_device_block, bypass_param);
return count;
}
int
set_bypass_pwoff_pfs(struct file *file, const char *buffer,
unsigned long count, void *data)
{
char kbuf[256];
bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
int bypass_param = 0, length = 0;
if (copy_from_user(&kbuf, buffer, count)) {
return -1;
}
kbuf[count] = '\0';
length = strlen(kbuf);
if (kbuf[length - 1] == '\n')
kbuf[--length] = '\0';
if (strcmp(kbuf, "on") == 0)
bypass_param = 1;
else if (strcmp(kbuf, "off") == 0)
bypass_param = 0;
set_bypass_pwoff_fn(pbp_device_block, bypass_param);
return count;
}
int
set_tap_pwup_pfs(struct file *file, const char *buffer,
unsigned long count, void *data)
{
char kbuf[256];
bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
int tap_param = 0, length = 0;
if (copy_from_user(&kbuf, buffer, count)) {
return -1;
}
kbuf[count] = '\0';
length = strlen(kbuf);
if (kbuf[length - 1] == '\n')
kbuf[--length] = '\0';
if (strcmp(kbuf, "on") == 0)
tap_param = 1;
else if (strcmp(kbuf, "off") == 0)
tap_param = 0;
set_tap_pwup_fn(pbp_device_block, tap_param);
return count;
}
int
set_disc_pwup_pfs(struct file *file, const char *buffer,
unsigned long count, void *data)
{
char kbuf[256];
bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
int tap_param = 0, length = 0;
if (copy_from_user(&kbuf, buffer, count)) {
return -1;
}
kbuf[count] = '\0';
length = strlen(kbuf);
if (kbuf[length - 1] == '\n')
kbuf[--length] = '\0';
if (strcmp(kbuf, "on") == 0)
tap_param = 1;
else if (strcmp(kbuf, "off") == 0)
tap_param = 0;
set_disc_pwup_fn(pbp_device_block, tap_param);
return count;
}
int
get_bypass_pwup_pfs(char *page, char **start, off_t off, int count,
int *eof, void *data)
{
bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
int len = 0, ret = 0;
ret = get_bypass_pwup_fn(pbp_device_block);
if (ret == BP_NOT_CAP)
len = sprintf(page, "fail\n");
else if (ret == 0)
len = sprintf(page, "off\n");
else
len = sprintf(page, "on\n");
*eof = 1;
return len;
}
int
get_bypass_pwoff_pfs(char *page, char **start, off_t off, int count,
int *eof, void *data)
{
bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
int len = 0, ret = 0;
ret = get_bypass_pwoff_fn(pbp_device_block);
if (ret == BP_NOT_CAP)
len = sprintf(page, "fail\n");
else if (ret == 0)
len = sprintf(page, "off\n");
else
len = sprintf(page, "on\n");
*eof = 1;
return len;
}
int
get_tap_pwup_pfs(char *page, char **start, off_t off, int count,
int *eof, void *data)
{
bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
int len = 0, ret = 0;
ret = get_tap_pwup_fn(pbp_device_block);
if (ret == BP_NOT_CAP)
len = sprintf(page, "fail\n");
else if (ret == 0)
len = sprintf(page, "off\n");
else
len = sprintf(page, "on\n");
*eof = 1;
return len;
}
int
get_disc_pwup_pfs(char *page, char **start, off_t off, int count,
int *eof, void *data)
{
bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
int len = 0, ret = 0;
ret = get_disc_pwup_fn(pbp_device_block);
if (ret == BP_NOT_CAP)
len = sprintf(page, "fail\n");
else if (ret == 0)
len = sprintf(page, "off\n");
else
len = sprintf(page, "on\n");
*eof = 1;
return len;
}
int
set_std_nic_pfs(struct file *file, const char *buffer,
unsigned long count, void *data)
{
char kbuf[256];
bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
int bypass_param = 0, length = 0;
if (copy_from_user(&kbuf, buffer, count)) {
return -1;
}
kbuf[count] = '\0';
length = strlen(kbuf);
if (kbuf[length - 1] == '\n')
kbuf[--length] = '\0';
if (strcmp(kbuf, "on") == 0)
bypass_param = 1;
else if (strcmp(kbuf, "off") == 0)
bypass_param = 0;
set_std_nic_fn(pbp_device_block, bypass_param);
return count;
}
int
get_std_nic_pfs(char *page, char **start, off_t off, int count,
int *eof, void *data)
{
bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
int len = 0, ret = 0;
ret = get_std_nic_fn(pbp_device_block);
if (ret == BP_NOT_CAP)
len = sprintf(page, "fail\n");
else if (ret == 0)
len = sprintf(page, "off\n");
else
len = sprintf(page, "on\n");
*eof = 1;
return len;
}
int
get_wd_exp_mode_pfs(char *page, char **start, off_t off, int count,
int *eof, void *data)
{
bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
int len = 0, ret = 0;
ret = get_wd_exp_mode_fn(pbp_device_block);
if (ret == 1)
len = sprintf(page, "tap\n");
else if (ret == 0)
len = sprintf(page, "bypass\n");
else if (ret == 2)
len = sprintf(page, "disc\n");
else
len = sprintf(page, "fail\n");
*eof = 1;
return len;
}
int
set_wd_exp_mode_pfs(struct file *file, const char *buffer,
unsigned long count, void *data)
{
char kbuf[256];
bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
int bypass_param = 0, length = 0;
if (count > (sizeof(kbuf) - 1))
return -1;
if (copy_from_user(&kbuf, buffer, count)) {
return -1;
}
kbuf[count] = '\0';
length = strlen(kbuf);
if (kbuf[length - 1] == '\n')
kbuf[--length] = '\0';
if (strcmp(kbuf, "tap") == 0)
bypass_param = 1;
else if (strcmp(kbuf, "bypass") == 0)
bypass_param = 0;
else if (strcmp(kbuf, "disc") == 0)
bypass_param = 2;
set_wd_exp_mode_fn(pbp_device_block, bypass_param);
return count;
}
int
get_wd_autoreset_pfs(char *page, char **start, off_t off, int count,
int *eof, void *data)
{
bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
int len = 0, ret = 0;
ret = get_wd_autoreset_fn(pbp_device_block);
if (ret >= 0)
len = sprintf(page, "%d\n", ret);
else
len = sprintf(page, "fail\n");
*eof = 1;
return len;
}
int
set_wd_autoreset_pfs(struct file *file, const char *buffer,
unsigned long count, void *data)
{
char kbuf[256];
bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
u32 timeout = 0;
char *timeout_ptr = kbuf;
if (copy_from_user(&kbuf, buffer, count)) {
return -1;
}
timeout_ptr = kbuf;
timeout = atoi(&timeout_ptr);
set_wd_autoreset_fn(pbp_device_block, timeout);
return count;
}
int
set_tpl_pfs(struct file *file, const char *buffer,
unsigned long count, void *data)
{
char kbuf[256];
bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
int tpl_param = 0, length = 0;
if (count > (sizeof(kbuf) - 1))
return -1;
if (copy_from_user(&kbuf, buffer, count)) {
return -1;
}
kbuf[count] = '\0';
length = strlen(kbuf);
if (kbuf[length - 1] == '\n')
kbuf[--length] = '\0';
if (strcmp(kbuf, "on") == 0)
tpl_param = 1;
else if (strcmp(kbuf, "off") == 0)
tpl_param = 0;
set_tpl_fn(pbp_device_block, tpl_param);
return count;
}
#ifdef PMC_FIX_FLAG
int
set_wait_at_pwup_pfs(struct file *file, const char *buffer,
unsigned long count, void *data)
{
char kbuf[256];
bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
int tpl_param = 0, length = 0;
if (count > (sizeof(kbuf) - 1))
return -1;
if (copy_from_user(&kbuf, buffer, count)) {
return -1;
}
kbuf[count] = '\0';
length = strlen(kbuf);
if (kbuf[length - 1] == '\n')
kbuf[--length] = '\0';
if (strcmp(kbuf, "on") == 0)
tpl_param = 1;
else if (strcmp(kbuf, "off") == 0)
tpl_param = 0;
set_bp_wait_at_pwup_fn(pbp_device_block, tpl_param);
return count;
}
int
set_hw_reset_pfs(struct file *file, const char *buffer,
unsigned long count, void *data)
{
char kbuf[256];
bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
int tpl_param = 0, length = 0;
if (count > (sizeof(kbuf) - 1))
return -1;
if (copy_from_user(&kbuf, buffer, count)) {
return -1;
}
kbuf[count] = '\0';
length = strlen(kbuf);
if (kbuf[length - 1] == '\n')
kbuf[--length] = '\0';
if (strcmp(kbuf, "on") == 0)
tpl_param = 1;
else if (strcmp(kbuf, "off") == 0)
tpl_param = 0;
set_bp_hw_reset_fn(pbp_device_block, tpl_param);
return count;
}
#endif /*PMC_FIX_FLAG */
int bypass_proc_create_dev_sd(bpctl_dev_t * pbp_device_block)
{
struct bypass_pfs_sd *current_pfs = &(pbp_device_block->bypass_pfs_set);
static struct proc_dir_entry *procfs_dir = NULL;
int ret = 0;
sprintf(current_pfs->dir_name, "bypass_%s", dev->name);
if (!bp_procfs_dir)
return -1;
/* create device proc dir */
procfs_dir = proc_getdir(current_pfs->dir_name, bp_procfs_dir);
if (procfs_dir == 0) {
printk(KERN_DEBUG "Could not create procfs directory %s\n",
current_pfs->dir_name);
return -1;
}
current_pfs->bypass_entry = procfs_dir;
if (bypass_proc_create_entry(&(current_pfs->bypass_info), BYPASS_INFO_ENTRY_SD, NULL, /* write */
get_bypass_info_pfs, /* read */
procfs_dir, pbp_device_block))
ret = -1;
if (pbp_device_block->bp_caps & SW_CTL_CAP) {
/* Create set param proc's */
if (bypass_proc_create_entry_sd(&(current_pfs->bypass_slave), BYPASS_SLAVE_ENTRY_SD, NULL, /* write */
get_bypass_slave_pfs, /* read */
procfs_dir, pbp_device_block))
ret = -1;
if (bypass_proc_create_entry_sd(&(current_pfs->bypass_caps), BYPASS_CAPS_ENTRY_SD, NULL, /* write */
get_bypass_caps_pfs, /* read */
procfs_dir, pbp_device_block))
ret = -1;
if (bypass_proc_create_entry_sd(&(current_pfs->wd_set_caps), WD_SET_CAPS_ENTRY_SD, NULL, /* write */
get_wd_set_caps_pfs, /* read */
procfs_dir, pbp_device_block))
ret = -1;
if (bypass_proc_create_entry_sd(&(current_pfs->bypass_wd), BYPASS_WD_ENTRY_SD, set_bypass_wd_pfs, /* write */
get_bypass_wd_pfs, /* read */
procfs_dir, pbp_device_block))
ret = -1;
if (bypass_proc_create_entry_sd(&(current_pfs->wd_expire_time), WD_EXPIRE_TIME_ENTRY_SD, NULL, /* write */
get_wd_expire_time_pfs, /* read */
procfs_dir, pbp_device_block))
ret = -1;
if (bypass_proc_create_entry_sd(&(current_pfs->reset_bypass_wd), RESET_BYPASS_WD_ENTRY_SD, NULL, /* write */
reset_bypass_wd_pfs, /* read */
procfs_dir, pbp_device_block))
ret = -1;
if (bypass_proc_create_entry_sd(&(current_pfs->std_nic), STD_NIC_ENTRY_SD, set_std_nic_pfs, /* write */
get_std_nic_pfs, /* read */
procfs_dir, pbp_device_block))
ret = -1;
if (pbp_device_block->bp_caps & BP_CAP) {
if (bypass_proc_create_entry_sd(&(current_pfs->bypass), BYPASS_ENTRY_SD, set_bypass_pfs, /* write */
get_bypass_pfs, /* read */
procfs_dir,
pbp_device_block))
ret = -1;
if (bypass_proc_create_entry_sd(&(current_pfs->dis_bypass), DIS_BYPASS_ENTRY_SD, set_dis_bypass_pfs, /* write */
get_dis_bypass_pfs, /* read */
procfs_dir,
pbp_device_block))
ret = -1;
if (bypass_proc_create_entry_sd(&(current_pfs->bypass_pwup), BYPASS_PWUP_ENTRY_SD, set_bypass_pwup_pfs, /* write */
get_bypass_pwup_pfs, /* read */
procfs_dir,
pbp_device_block))
ret = -1;
if (bypass_proc_create_entry_sd(&(current_pfs->bypass_pwoff), BYPASS_PWOFF_ENTRY_SD, set_bypass_pwoff_pfs, /* write */
get_bypass_pwoff_pfs, /* read */
procfs_dir,
pbp_device_block))
ret = -1;
if (bypass_proc_create_entry_sd(&(current_pfs->bypass_change), BYPASS_CHANGE_ENTRY_SD, NULL, /* write */
get_bypass_change_pfs, /* read */
procfs_dir,
pbp_device_block))
ret = -1;
}
if (pbp_device_block->bp_caps & TAP_CAP) {
if (bypass_proc_create_entry_sd(&(current_pfs->tap), TAP_ENTRY_SD, set_tap_pfs, /* write */
get_tap_pfs, /* read */
procfs_dir,
pbp_device_block))
ret = -1;
if (bypass_proc_create_entry_sd(&(current_pfs->dis_tap), DIS_TAP_ENTRY_SD, set_dis_tap_pfs, /* write */
get_dis_tap_pfs, /* read */
procfs_dir,
pbp_device_block))
ret = -1;
if (bypass_proc_create_entry_sd(&(current_pfs->tap_pwup), TAP_PWUP_ENTRY_SD, set_tap_pwup_pfs, /* write */
get_tap_pwup_pfs, /* read */
procfs_dir,
pbp_device_block))
ret = -1;
if (bypass_proc_create_entry_sd(&(current_pfs->tap_change), TAP_CHANGE_ENTRY_SD, NULL, /* write */
get_tap_change_pfs, /* read */
procfs_dir,
pbp_device_block))
ret = -1;
}
if (pbp_device_block->bp_caps & DISC_CAP) {
if (bypass_proc_create_entry_sd(&(current_pfs->tap), DISC_ENTRY_SD, set_disc_pfs, /* write */
get_disc_pfs, /* read */
procfs_dir,
pbp_device_block))
ret = -1;
#if 1
if (bypass_proc_create_entry_sd(&(current_pfs->dis_tap), DIS_DISC_ENTRY_SD, set_dis_disc_pfs, /* write */
get_dis_disc_pfs, /* read */
procfs_dir,
pbp_device_block))
ret = -1;
#endif
if (bypass_proc_create_entry_sd(&(current_pfs->tap_pwup), DISC_PWUP_ENTRY_SD, set_disc_pwup_pfs, /* write */
get_disc_pwup_pfs, /* read */
procfs_dir,
pbp_device_block))
ret = -1;
if (bypass_proc_create_entry_sd(&(current_pfs->tap_change), DISC_CHANGE_ENTRY_SD, NULL, /* write */
get_disc_change_pfs, /* read */
procfs_dir,
pbp_device_block))
ret = -1;
}
if (bypass_proc_create_entry_sd(&(current_pfs->wd_exp_mode), WD_EXP_MODE_ENTRY_SD, set_wd_exp_mode_pfs, /* write */
get_wd_exp_mode_pfs, /* read */
procfs_dir, pbp_device_block))
ret = -1;
if (bypass_proc_create_entry_sd(&(current_pfs->wd_autoreset), WD_AUTORESET_ENTRY_SD, set_wd_autoreset_pfs, /* write */
get_wd_autoreset_pfs, /* read */
procfs_dir, pbp_device_block))
ret = -1;
if (bypass_proc_create_entry_sd(&(current_pfs->tpl), TPL_ENTRY_SD, set_tpl_pfs, /* write */
get_tpl_pfs, /* read */
procfs_dir, pbp_device_block))
ret = -1;
#ifdef PMC_FIX_FLAG
if (bypass_proc_create_entry_sd(&(current_pfs->tpl), WAIT_AT_PWUP_ENTRY_SD, set_wait_at_pwup_pfs, /* write */
get_wait_at_pwup_pfs, /* read */
procfs_dir, pbp_device_block))
ret = -1;
if (bypass_proc_create_entry_sd(&(current_pfs->tpl), HW_RESET_ENTRY_SD, set_hw_reset_pfs, /* write */
get_hw_reset_pfs, /* read */
procfs_dir, pbp_device_block))
ret = -1;
#endif
}
if (ret < 0)
printk(KERN_DEBUG "Create proc entry failed\n");
return ret;
}
int bypass_proc_remove_dev_sd(bpctl_dev_t * pbp_device_block)
{
struct bypass_pfs_sd *current_pfs = &pbp_device_block->bypass_pfs_set;
struct proc_dir_entry *pde = current_pfs->bypass_entry, *pde_curr =
NULL;
char name[256];
for (pde = pde->subdir; pde;) {
strcpy(name, pde->name);
pde_curr = pde;
pde = pde->next;
remove_proc_entry(name, current_pfs->bypass_entry);
}
if (!pde)
remove_proc_entry(current_pfs->dir_name, bp_procfs_dir);
return 0;
}
#endif /* BYPASS_SUPPORT */
/******************************************************************************/
/* */
/* Bypass Control utility, Copyright (c) 2005 Silicom */
/* All rights reserved. */
/* */
/* 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. */
/* */
/* */
/******************************************************************************/
#ifndef BYPASS_H
#define BYPASS_H
/* Bypass related */
#define SYNC_CMD_VAL 2 /* 10b */
#define SYNC_CMD_LEN 2
#define WR_CMD_VAL 2 /* 10b */
#define WR_CMD_LEN 2
#define RD_CMD_VAL 1 /* 10b */
#define RD_CMD_LEN 2
#define ADDR_CMD_LEN 4
#define WR_DATA_LEN 8
#define RD_DATA_LEN 8
#define PIC_SIGN_REG_ADDR 0x7
#define PIC_SIGN_VALUE 0xcd
#define STATUS_REG_ADDR 0
#define WDT_EN_MASK 0x01 //BIT_0
#define CMND_EN_MASK 0x02 //BIT_1
#define DIS_BYPASS_CAP_MASK 0x04 //BIT_2 /* Bypass Cap is disable*/
#define DFLT_PWRON_MASK 0x08 //BIT_3
#define BYPASS_OFF_MASK 0x10 //BIT_4
#define BYPASS_FLAG_MASK 0x20 //BIT_5
#define STD_NIC_MASK (DIS_BYPASS_CAP_MASK | BYPASS_OFF_MASK | DFLT_PWRON_MASK)
#define WD_EXP_FLAG_MASK 0x40 //BIT_6
#define DFLT_PWROFF_MASK 0x80 //BIT_7
#define STD_NIC_PWOFF_MASK (DIS_BYPASS_CAP_MASK | BYPASS_OFF_MASK | DFLT_PWRON_MASK | DFLT_PWROFF_MASK)
#define PRODUCT_CAP_REG_ADDR 0x5
#define BYPASS_SUPPORT_MASK 0x01 //BIT_0
#define TAP_SUPPORT_MASK 0x02 //BIT_1
#define NORMAL_UNSUPPORT_MASK 0x04 /*BIT_2 */
#define DISC_SUPPORT_MASK 0x08 //BIT_3
#define TPL2_SUPPORT_MASK 0x10 //BIT_4
#define DISC_PORT_SUPPORT_MASK 0x20 //BIT_5
#define STATUS_TAP_REG_ADDR 0x6
#define WDTE_TAP_BPN_MASK 0x01 //BIT_1 /* 1 when wdt expired -> TAP, 0 - Bypass */
#define DIS_TAP_CAP_MASK 0x04 //BIT_2 /* TAP Cap is disable*/
#define DFLT_PWRON_TAP_MASK 0x08 //BIT_3
#define TAP_OFF_MASK 0x10 //BIT_4
#define TAP_FLAG_MASK 0x20 //BIT_5
#define TX_DISA_MASK 0x40
#define TX_DISB_MASK 0x80
#define STD_NIC_TAP_MASK (DIS_TAP_CAP_MASK | TAP_OFF_MASK | DFLT_PWRON_TAP_MASK)
#define STATUS_DISC_REG_ADDR 13
#define WDTE_DISC_BPN_MASK 0x01 //BIT_0 /* 1 when wdt expired -> TAP, 0 - Bypass */
#define STD_NIC_ON_MASK 0x02 //BIT_1
#define DIS_DISC_CAP_MASK 0x04 //BIT_2 /* TAP Cap is disable*/
#define DFLT_PWRON_DISC_MASK 0x08 //BIT_3
#define DISC_OFF_MASK 0x10 //BIT_4
#define DISC_FLAG_MASK 0x20 //BIT_5
#define TPL2_FLAG_MASK 0x40 //BIT_6
#define STD_NIC_DISC_MASK DIS_DISC_CAP_MASK
#define CONT_CONFIG_REG_ADDR 12
#define EN_HW_RESET_MASK 0x2 /* BIT_1 */
#define WAIT_AT_PWUP_MASK 0x1 /* BIT_0 */
#define VER_REG_ADDR 0x1
#define BP_FW_VER_A0 0xa0
#define BP_FW_VER_A1 0xa1
#define INT_VER_MASK 0xf0
#define EXT_VER_MASK 0xf
/* */
#define PXG2BPI_VER 0x0
#define PXG2TBPI_VER 0x1
#define PXE2TBPI_VER 0x2
#define PXG4BPFI_VER 0x4
#define BP_FW_EXT_VER7 0x6
#define BP_FW_EXT_VER8 0x8
#define BP_FW_EXT_VER9 0x9
#define OLD_IF_VER -1
#define CMND_REG_ADDR 10 /* 1010b */
#define WDT_REG_ADDR 4
#define TMRL_REG_ADDR 2
#define TMRH_REG_ADDR 3
/* NEW_FW */
#define WDT_INTERVAL 1 //5 //8
#define WDT_CMND_INTERVAL 200 //50
#define CMND_INTERVAL 200 //100 /* usec */
#define PULSE_TIME 100
/* OLD_FW */
#define INIT_CMND_INTERVAL 40
#define PULSE_INTERVAL 5
#define WDT_TIME_CNT 3
/* Intel Commands */
#define CMND_OFF_INT 0xf
#define PWROFF_BYPASS_ON_INT 0x5
#define BYPASS_ON_INT 0x6
#define DIS_BYPASS_CAP_INT 0x4
#define RESET_WDT_INT 0x1
/* Intel timing */
#define BYPASS_DELAY_INT 4 /* msec */
#define CMND_INTERVAL_INT 2 /* msec */
/* Silicom Commands */
#define CMND_ON 0x4
#define CMND_OFF 0x2
#define BYPASS_ON 0xa
#define BYPASS_OFF 0x8
#define PORT_LINK_EN 0xe
#define PORT_LINK_DIS 0xc
#define WDT_ON 0x10 /* 0x1f (11111) - max */
#define TIMEOUT_UNIT 100
#define TIMEOUT_MAX_STEP 15
#define WDT_TIMEOUT_MIN 100 /* msec */
#define WDT_TIMEOUT_MAX 3276800 /* msec */
#define WDT_AUTO_MIN_INT 500
#define WDT_TIMEOUT_DEF WDT_TIMEOUT_MIN
#define WDT_OFF 0x6
#define WDT_RELOAD 0x9
#define RESET_CONT 0x20
#define DIS_BYPASS_CAP 0x22
#define EN_BYPASS_CAP 0x24
#define BYPASS_STATE_PWRON 0x26
#define NORMAL_STATE_PWRON 0x28
#define BYPASS_STATE_PWROFF 0x27
#define NORMAL_STATE_PWROFF 0x29
#define TAP_ON 0xb
#define TAP_OFF 0x9
#define TAP_STATE_PWRON 0x2a
#define DIS_TAP_CAP 0x2c
#define EN_TAP_CAP 0x2e
#define STD_NIC_OFF 0x86
#define STD_NIC_ON 0x84
#define DISC_ON 0x85
#define DISC_OFF 0x8a
#define DISC_STATE_PWRON 0x87
#define DIS_DISC_CAP 0x88
#define EN_DISC_CAP 0x89
#define TPL2_ON 0x8c
#define TPL2_OFF 0x8b
#define BP_WAIT_AT_PWUP_EN 0x80
#define BP_WAIT_AT_PWUP_DIS 0x81
#define BP_HW_RESET_EN 0x82
#define BP_HW_RESET_DIS 0x83
#define TX_DISA 0x8d
#define TX_DISB 0x8e
#define TX_ENA 0xA0
#define TX_ENB 0xA1
#define TX_DISA_PWRUP 0xA2
#define TX_DISB_PWRUP 0xA3
#define TX_ENA_PWRUP 0xA4
#define TX_ENB_PWRUP 0xA5
#define BYPASS_CAP_DELAY 21 /* msec */
#define DFLT_PWRON_DELAY 10 /* msec */
#define LATCH_DELAY 13 /* msec */
#define EEPROM_WR_DELAY 8 /* msec */
#define BP_LINK_MON_DELAY 4 /* sec */
#define BP_FW_EXT_VER0 0xa0
#define BP_FW_EXT_VER1 0xa1
#define BP_FW_EXT_VER2 0xb1
#define BP_OK 0
#define BP_NOT_CAP -1
#define WDT_STATUS_EXP -2
#define WDT_STATUS_UNKNOWN -1
#define WDT_STATUS_EN 1
#define WDT_STATUS_DIS 0
#ifdef BP_SELF_TEST
#define ETH_P_BPTEST 0xabba
#define BPTEST_DATA_LEN 60
#endif
#endif /* BYPASS_H */
#
# Makefile for the Bypass network device drivers.
#
obj-$(CONFIG_SBYPASS) += bypass.o
/******************************************************************************/
/* */
/* bypass library, Copyright (c) 2004-2006 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. */
/* */
/* */
/* */
/******************************************************************************/
#ifndef BP_IOCTL_H
#define BP_IOCTL_H
#define BP_CAP 0x01 //BIT_0
#define BP_STATUS_CAP 0x02 //BIT_1
#define BP_STATUS_CHANGE_CAP 0x04 //BIT_2
#define SW_CTL_CAP 0x08 //BIT_3
#define BP_DIS_CAP 0x10 //BIT_4
#define BP_DIS_STATUS_CAP 0x20 //BIT_5
#define STD_NIC_CAP 0x40 //BIT_6
#define BP_PWOFF_ON_CAP 0x80 //BIT_7
#define BP_PWOFF_OFF_CAP 0x0100 //BIT_8
#define BP_PWOFF_CTL_CAP 0x0200 //BIT_9
#define BP_PWUP_ON_CAP 0x0400 //BIT_10
#define BP_PWUP_OFF_CAP 0x0800 //BIT_11
#define BP_PWUP_CTL_CAP 0x1000 //BIT_12
#define WD_CTL_CAP 0x2000 //BIT_13
#define WD_STATUS_CAP 0x4000 //BIT_14
#define WD_TIMEOUT_CAP 0x8000 //BIT_15
#define TX_CTL_CAP 0x10000 //BIT_16
#define TX_STATUS_CAP 0x20000 //BIT_17
#define TAP_CAP 0x40000 //BIT_18
#define TAP_STATUS_CAP 0x80000 //BIT_19
#define TAP_STATUS_CHANGE_CAP 0x100000 //BIT_20
#define TAP_DIS_CAP 0x200000 //BIT_21
#define TAP_DIS_STATUS_CAP 0x400000 //BIT_22
#define TAP_PWUP_ON_CAP 0x800000 //BIT_23
#define TAP_PWUP_OFF_CAP 0x1000000 //BIT 24
#define TAP_PWUP_CTL_CAP 0x2000000 //BIT 25
#define NIC_CAP_NEG 0x4000000 //BIT 26
#define TPL_CAP 0x8000000 //BIT 27
#define DISC_CAP 0x10000000 //BIT 28
#define DISC_DIS_CAP 0x20000000 //BIT 29
#define DISC_PWUP_CTL_CAP 0x40000000 //BIT 30
#define WD_MIN_TIME_MASK(val) (val & 0xf)
#define WD_STEP_COUNT_MASK(val) ((val & 0xf) << 5)
#define WDT_STEP_TIME 0x10 //BIT_4
#define WD_MIN_TIME_GET(desc) (desc & 0xf)
#define WD_STEP_COUNT_GET(desc) (desc>>5) & 0xf
typedef enum {
IS_BYPASS = 1,
GET_BYPASS_SLAVE,
GET_BYPASS_CAPS,
GET_WD_SET_CAPS,
SET_BYPASS,
GET_BYPASS,
GET_BYPASS_CHANGE,
SET_BYPASS_WD,
GET_BYPASS_WD,
GET_WD_EXPIRE_TIME,
RESET_BYPASS_WD_TIMER,
SET_DIS_BYPASS,
GET_DIS_BYPASS,
SET_BYPASS_PWOFF,
GET_BYPASS_PWOFF,
SET_BYPASS_PWUP,
GET_BYPASS_PWUP,
SET_STD_NIC,
GET_STD_NIC,
SET_TX,
GET_TX,
SET_TAP,
GET_TAP,
GET_TAP_CHANGE,
SET_DIS_TAP,
GET_DIS_TAP,
SET_TAP_PWUP,
GET_TAP_PWUP,
SET_WD_EXP_MODE,
GET_WD_EXP_MODE,
SET_WD_AUTORESET,
GET_WD_AUTORESET,
SET_TPL,
GET_TPL,
SET_DISC,
GET_DISC,
GET_DISC_CHANGE,
SET_DIS_DISC,
GET_DIS_DISC,
SET_DISC_PWUP,
GET_DISC_PWUP,
GET_BYPASS_INFO = 100,
GET_BP_WAIT_AT_PWUP,
SET_BP_WAIT_AT_PWUP,
GET_BP_HW_RESET,
SET_BP_HW_RESET,
} CMND_TYPE;
typedef enum {
IF_SCAN_SD,
GET_DEV_NUM_SD,
IS_BYPASS_SD,
GET_BYPASS_SLAVE_SD,
GET_BYPASS_CAPS_SD,
GET_WD_SET_CAPS_SD,
SET_BYPASS_SD,
GET_BYPASS_SD,
GET_BYPASS_CHANGE_SD,
SET_BYPASS_WD_SD,
GET_BYPASS_WD_SD,
GET_WD_EXPIRE_TIME_SD,
RESET_BYPASS_WD_TIMER_SD,
SET_DIS_BYPASS_SD,
GET_DIS_BYPASS_SD,
SET_BYPASS_PWOFF_SD,
GET_BYPASS_PWOFF_SD,
SET_BYPASS_PWUP_SD,
GET_BYPASS_PWUP_SD,
SET_STD_NIC_SD,
GET_STD_NIC_SD,
SET_TX_SD,
GET_TX_SD,
SET_TAP_SD,
GET_TAP_SD,
GET_TAP_CHANGE_SD,
SET_DIS_TAP_SD,
GET_DIS_TAP_SD,
SET_TAP_PWUP_SD,
GET_TAP_PWUP_SD,
SET_WD_EXP_MODE_SD,
GET_WD_EXP_MODE_SD,
SET_WD_AUTORESET_SD,
GET_WD_AUTORESET_SD,
SET_TPL_SD,
GET_TPL_SD,
SET_DISC_SD,
GET_DISC_SD,
GET_DISC_CHANGE_SD,
SET_DIS_DISC_SD,
GET_DIS_DISC_SD,
SET_DISC_PWUP_SD,
GET_DISC_PWUP_SD,
GET_BYPASS_INFO_SD = 100,
GET_BP_WAIT_AT_PWUP_SD,
SET_BP_WAIT_AT_PWUP_SD,
GET_BP_HW_RESET_SD,
SET_BP_HW_RESET_SD,
} CMND_TYPE_SD;
#define SIOCGIFBYPASS SIOCDEVPRIVATE+10
struct bp_info {
char prod_name[14];
unsigned char fw_ver;
};
/* for passing single values */
struct if_bypass {
char if_name[IFNAMSIZ];
int cmd;
int data;
};
struct if_bypass_info {
char if_name[IFNAMSIZ];
char cmd;
struct bp_info bp_info;
};
/*
* The major device number. We can't rely on dynamic
* registration any more, because ioctls need to know
* it.
*/
#define MAGIC_NUM 'J'
/* for passing single values */
struct bpctl_cmd {
int status;
int data[8];
int in_param[8];
int out_param[8];
};
#define IOCTL_TX_MSG(cmd) _IOWR(MAGIC_NUM, cmd, struct bpctl_cmd)
#define DEVICE_NODE "/dev/bpctl0"
#define DEVICE_NAME "bpctl"
#endif
/******************************************************************************/
/* */
/* bypass library, Copyright (c) 2004 Silicom, Ltd */
/* */
/* 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. */
/* */
/* */
/* bplib.h */
/* */
/******************************************************************************/
#ifndef BYPASS_H
#define BYPASS_H
#include "bp_ioctl.h"
#include "libbp_sd.h"
#define IF_NAME "eth"
#define SILICOM_VID 0x1374
#define SILICOM_BP_PID_MIN 0x24
#define SILICOM_BP_PID_MAX 0x5f
#define INTEL_PEG4BPII_PID 0x10a0
#define INTEL_PEG4BPFII_PID 0x10a1
#define PEGII_IF_SERIES(vid, pid) \
((vid==0x8086)&& \
((pid==INTEL_PEG4BPII_PID)|| \
(pid==INTEL_PEG4BPFII_PID)))
#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10))
#define pci_get_class pci_find_class
#define pci_get_device pci_find_device
#endif
#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,10))
#define EXPORT_SYMBOL_NOVERS EXPORT_SYMBOL
#endif
#ifdef BP_VENDOR_SUPPORT
char *bp_desc_array[] =
{ "e1000bp", "e1000bpe", "slcm5700", "bnx2xbp", "ixgbp", "ixgbpe", NULL };
#endif
#endif
/******************************************************************************/
/* */
/* bypass library, Copyright (c) 2004-2007 Silicom, Ltd */
/* */
/* 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. */
/* */
/* */
/* bypass.c */
/* */
/******************************************************************************/
#include <linux/version.h>
#if defined(CONFIG_SMP) && ! defined(__SMP__)
#define __SMP__
#endif
#include <linux/module.h>
#include <linux/kernel.h>
#include <asm/unistd.h>
#include <linux/sched.h>
#include <linux/wait.h>
#include <linux/netdevice.h> // struct device, and other headers
#include <linux/kernel_stat.h>
#include <linux/pci.h>
#include <linux/rtnetlink.h>
#include <linux/ethtool.h>
#include <net/net_namespace.h>
#include "bplibk.h"
#define MOD_NAME "bypass"
#define VERSION "\n"MOD_NAME" version 9.0.4\n"
MODULE_AUTHOR("www.silicom.co.il");
MODULE_LICENSE("GPL");
int init_lib_module(void);
void cleanup_lib_module(void);
static int do_cmd(struct net_device *dev, struct ifreq *ifr, int cmd, int *data)
{
int ret = -1;
struct if_bypass *bypass_cb;
static int (*ioctl) (struct net_device *, struct ifreq *, int);
bypass_cb = (struct if_bypass *)ifr;
bypass_cb->cmd = cmd;
bypass_cb->data = *data;
if ((dev->netdev_ops) && (ioctl = dev->netdev_ops->ndo_do_ioctl)) {
ret = ioctl(dev, ifr, SIOCGIFBYPASS);
*data = bypass_cb->data;
}
return ret;
}
static int doit(int cmd, int if_index, int *data)
{
struct ifreq ifr;
int ret = -1;
struct net_device *dev;
struct net_device *n;
for_each_netdev_safe(&init_net, dev, n) {
if (dev->ifindex == if_index) {
ret = do_cmd(dev, &ifr, cmd, data);
if (ret < 0)
ret = -1;
}
}
return ret;
}
#define bp_symbol_get(fn_name) symbol_get(fn_name)
#define bp_symbol_put(fn_name) symbol_put(fn_name)
#define SET_BPLIB_INT_FN(fn_name, arg_type, arg, ret) \
({ int (* fn_ex)(arg_type)=NULL; \
fn_ex=bp_symbol_get(fn_name##_sd); \
if(fn_ex) { \
ret= fn_ex(arg); \
bp_symbol_put(fn_name##_sd); \
} else ret=-1; \
})
#define SET_BPLIB_INT_FN2(fn_name, arg_type, arg, arg_type1, arg1, ret) \
({ int (* fn_ex)(arg_type,arg_type1)=NULL; \
fn_ex=bp_symbol_get(fn_name##_sd); \
if(fn_ex) { \
ret= fn_ex(arg,arg1); \
bp_symbol_put(fn_name##_sd); \
} else ret=-1; \
})
#define SET_BPLIB_INT_FN3(fn_name, arg_type, arg, arg_type1, arg1,arg_type2, arg2, ret) \
({ int (* fn_ex)(arg_type,arg_type1, arg_type2)=NULL; \
fn_ex=bp_symbol_get(fn_name##_sd); \
if(fn_ex) { \
ret= fn_ex(arg,arg1,arg2); \
bp_symbol_put(fn_name##_sd); \
} else ret=-1; \
})
#define DO_BPLIB_GET_ARG_FN(fn_name,ioctl_val, if_index) \
({ int data, ret=0; \
if(is_dev_sd(if_index)){ \
SET_BPLIB_INT_FN(fn_name, int, if_index, ret); \
return ret; \
} \
return doit(ioctl_val,if_index, &data); \
})
#define DO_BPLIB_SET_ARG_FN(fn_name,ioctl_val,if_index,arg) \
({ int data, ret=0; \
if(is_dev_sd(if_index)){ \
SET_BPLIB_INT_FN2(fn_name, int, if_index, int, arg, ret); \
return ret; \
} \
data=arg; \
return doit(ioctl_val,if_index, &data); \
})
static int is_dev_sd(int if_index)
{
int ret = 0;
SET_BPLIB_INT_FN(is_bypass, int, if_index, ret);
return (ret >= 0 ? 1 : 0);
}
int is_bypass_dev(int if_index)
{
struct pci_dev *pdev = NULL;
struct net_device *dev = NULL;
struct ifreq ifr;
int ret = 0, data = 0;
while ((pdev = pci_get_class(PCI_CLASS_NETWORK_ETHERNET << 8, pdev))) {
if ((dev = pci_get_drvdata(pdev)) != NULL)
if (((dev = pci_get_drvdata(pdev)) != NULL) &&
(dev->ifindex == if_index)) {
if ((pdev->vendor == SILICOM_VID) &&
(pdev->device >= SILICOM_BP_PID_MIN) &&
(pdev->device <= SILICOM_BP_PID_MAX))
goto send_cmd;
#if defined(BP_VENDOR_SUPPORT) && defined(ETHTOOL_GDRVINFO)
else {
struct ethtool_drvinfo info;
const struct ethtool_ops *ops =
dev->ethtool_ops;
int k = 0;
if (ops->get_drvinfo) {
memset(&info, 0, sizeof(info));
info.cmd = ETHTOOL_GDRVINFO;
ops->get_drvinfo(dev, &info);
for (; bp_desc_array[k]; k++)
if (!
(strcmp
(bp_desc_array[k],
info.driver)))
goto send_cmd;
}
}
#endif
return -1;
}
}
send_cmd:
ret = do_cmd(dev, &ifr, IS_BYPASS, &data);
return (ret < 0 ? -1 : ret);
}
int is_bypass(int if_index)
{
int ret = 0;
SET_BPLIB_INT_FN(is_bypass, int, if_index, ret);
if (ret < 0)
return is_bypass_dev(if_index);
return ret;
}
int get_bypass_slave(int if_index)
{
DO_BPLIB_GET_ARG_FN(get_bypass_slave, GET_BYPASS_SLAVE, if_index);
}
int get_bypass_caps(int if_index)
{
DO_BPLIB_GET_ARG_FN(get_bypass_caps, GET_BYPASS_CAPS, if_index);
}
int get_wd_set_caps(int if_index)
{
DO_BPLIB_GET_ARG_FN(get_wd_set_caps, GET_WD_SET_CAPS, if_index);
}
int set_bypass(int if_index, int bypass_mode)
{
DO_BPLIB_SET_ARG_FN(set_bypass, SET_BYPASS, if_index, bypass_mode);
}
int get_bypass(int if_index)
{
DO_BPLIB_GET_ARG_FN(get_bypass, GET_BYPASS, if_index);
}
int get_bypass_change(int if_index)
{
DO_BPLIB_GET_ARG_FN(get_bypass_change, GET_BYPASS_CHANGE, if_index);
}
int set_dis_bypass(int if_index, int dis_bypass)
{
DO_BPLIB_SET_ARG_FN(set_dis_bypass, SET_DIS_BYPASS, if_index,
dis_bypass);
}
int get_dis_bypass(int if_index)
{
DO_BPLIB_GET_ARG_FN(get_dis_bypass, GET_DIS_BYPASS, if_index);
}
int set_bypass_pwoff(int if_index, int bypass_mode)
{
DO_BPLIB_SET_ARG_FN(set_bypass_pwoff, SET_BYPASS_PWOFF, if_index,
bypass_mode);
}
int get_bypass_pwoff(int if_index)
{
DO_BPLIB_GET_ARG_FN(get_bypass_pwoff, GET_BYPASS_PWOFF, if_index);
}
int set_bypass_pwup(int if_index, int bypass_mode)
{
DO_BPLIB_SET_ARG_FN(set_bypass_pwup, SET_BYPASS_PWUP, if_index,
bypass_mode);
}
int get_bypass_pwup(int if_index)
{
DO_BPLIB_GET_ARG_FN(get_bypass_pwup, GET_BYPASS_PWUP, if_index);
}
int set_bypass_wd(int if_index, int ms_timeout, int *ms_timeout_set)
{
int data = ms_timeout, ret = 0;
if (is_dev_sd(if_index))
SET_BPLIB_INT_FN3(set_bypass_wd, int, if_index, int, ms_timeout,
int *, ms_timeout_set, ret);
else {
ret = doit(SET_BYPASS_WD, if_index, &data);
if (ret > 0) {
*ms_timeout_set = ret;
ret = 0;
}
}
return ret;
}
int get_bypass_wd(int if_index, int *ms_timeout_set)
{
int *data = ms_timeout_set, ret = 0;
if (is_dev_sd(if_index))
SET_BPLIB_INT_FN2(get_bypass_wd, int, if_index, int *,
ms_timeout_set, ret);
else
ret = doit(GET_BYPASS_WD, if_index, data);
return ret;
}
int get_wd_expire_time(int if_index, int *ms_time_left)
{
int *data = ms_time_left, ret = 0;
if (is_dev_sd(if_index))
SET_BPLIB_INT_FN2(get_wd_expire_time, int, if_index, int *,
ms_time_left, ret);
else {
ret = doit(GET_WD_EXPIRE_TIME, if_index, data);
if ((ret == 0) && (*data != 0))
ret = 1;
}
return ret;
}
int reset_bypass_wd_timer(int if_index)
{
DO_BPLIB_GET_ARG_FN(reset_bypass_wd_timer, RESET_BYPASS_WD_TIMER,
if_index);
}
int set_std_nic(int if_index, int bypass_mode)
{
DO_BPLIB_SET_ARG_FN(set_std_nic, SET_STD_NIC, if_index, bypass_mode);
}
int get_std_nic(int if_index)
{
DO_BPLIB_GET_ARG_FN(get_std_nic, GET_STD_NIC, if_index);
}
int set_tx(int if_index, int tx_state)
{
DO_BPLIB_SET_ARG_FN(set_tx, SET_TX, if_index, tx_state);
}
int get_tx(int if_index)
{
DO_BPLIB_GET_ARG_FN(get_tx, GET_TX, if_index);
}
int set_tap(int if_index, int tap_mode)
{
DO_BPLIB_SET_ARG_FN(set_tap, SET_TAP, if_index, tap_mode);
}
int get_tap(int if_index)
{
DO_BPLIB_GET_ARG_FN(get_tap, GET_TAP, if_index);
}
int get_tap_change(int if_index)
{
DO_BPLIB_GET_ARG_FN(get_tap_change, GET_TAP_CHANGE, if_index);
}
int set_dis_tap(int if_index, int dis_tap)
{
DO_BPLIB_SET_ARG_FN(set_dis_tap, SET_DIS_TAP, if_index, dis_tap);
}
int get_dis_tap(int if_index)
{
DO_BPLIB_GET_ARG_FN(get_dis_tap, GET_DIS_TAP, if_index);
}
int set_tap_pwup(int if_index, int tap_mode)
{
DO_BPLIB_SET_ARG_FN(set_tap_pwup, SET_TAP_PWUP, if_index, tap_mode);
}
int get_tap_pwup(int if_index)
{
DO_BPLIB_GET_ARG_FN(get_tap_pwup, GET_TAP_PWUP, if_index);
}
int set_bp_disc(int if_index, int disc_mode)
{
DO_BPLIB_SET_ARG_FN(set_bp_disc, SET_DISC, if_index, disc_mode);
}
int get_bp_disc(int if_index)
{
DO_BPLIB_GET_ARG_FN(get_bp_disc, GET_DISC, if_index);
}
int get_bp_disc_change(int if_index)
{
DO_BPLIB_GET_ARG_FN(get_bp_disc_change, GET_DISC_CHANGE, if_index);
}
int set_bp_dis_disc(int if_index, int dis_disc)
{
DO_BPLIB_SET_ARG_FN(set_bp_dis_disc, SET_DIS_DISC, if_index, dis_disc);
}
int get_bp_dis_disc(int if_index)
{
DO_BPLIB_GET_ARG_FN(get_bp_dis_disc, GET_DIS_DISC, if_index);
}
int set_bp_disc_pwup(int if_index, int disc_mode)
{
DO_BPLIB_SET_ARG_FN(set_bp_disc_pwup, SET_DISC_PWUP, if_index,
disc_mode);
}
int get_bp_disc_pwup(int if_index)
{
DO_BPLIB_GET_ARG_FN(get_bp_disc_pwup, GET_DISC_PWUP, if_index);
}
int set_wd_exp_mode(int if_index, int mode)
{
DO_BPLIB_SET_ARG_FN(set_wd_exp_mode, SET_WD_EXP_MODE, if_index, mode);
}
int get_wd_exp_mode(int if_index)
{
DO_BPLIB_GET_ARG_FN(get_wd_exp_mode, GET_WD_EXP_MODE, if_index);
}
int set_wd_autoreset(int if_index, int time)
{
DO_BPLIB_SET_ARG_FN(set_wd_autoreset, SET_WD_AUTORESET, if_index, time);
}
int get_wd_autoreset(int if_index)
{
DO_BPLIB_GET_ARG_FN(get_wd_autoreset, GET_WD_AUTORESET, if_index);
}
int set_tpl(int if_index, int tpl_mode)
{
DO_BPLIB_SET_ARG_FN(set_tpl, SET_TPL, if_index, tpl_mode);
}
int get_tpl(int if_index)
{
DO_BPLIB_GET_ARG_FN(get_tpl, GET_TPL, if_index);
}
int set_bp_hw_reset(int if_index, int mode)
{
DO_BPLIB_SET_ARG_FN(set_tpl, SET_BP_HW_RESET, if_index, mode);
}
int get_bp_hw_reset(int if_index)
{
DO_BPLIB_GET_ARG_FN(get_tpl, GET_BP_HW_RESET, if_index);
}
int get_bypass_info(int if_index, struct bp_info *bp_info)
{
int ret = 0;
if (is_dev_sd(if_index)) {
SET_BPLIB_INT_FN2(get_bypass_info, int, if_index,
struct bp_info *, bp_info, ret);
} else {
static int (*ioctl) (struct net_device *, struct ifreq *, int);
struct net_device *dev;
struct net_device *n;
for_each_netdev_safe(&init_net, dev, n) {
if (dev->ifindex == if_index) {
struct if_bypass_info *bypass_cb;
struct ifreq ifr;
memset(&ifr, 0, sizeof(ifr));
bypass_cb = (struct if_bypass_info *)&ifr;
bypass_cb->cmd = GET_BYPASS_INFO;
if ((dev->netdev_ops) &&
(ioctl = dev->netdev_ops->ndo_do_ioctl)) {
ret = ioctl(dev, &ifr, SIOCGIFBYPASS);
}
else
ret = -1;
if (ret == 0)
memcpy(bp_info, &bypass_cb->bp_info,
sizeof(struct bp_info));
ret = (ret < 0 ? -1 : 0);
break;
}
}
}
return ret;
}
int init_lib_module()
{
printk(VERSION);
return 0;
}
void cleanup_lib_module()
{
}
EXPORT_SYMBOL_NOVERS(is_bypass);
EXPORT_SYMBOL_NOVERS(get_bypass_slave);
EXPORT_SYMBOL_NOVERS(get_bypass_caps);
EXPORT_SYMBOL_NOVERS(get_wd_set_caps);
EXPORT_SYMBOL_NOVERS(set_bypass);
EXPORT_SYMBOL_NOVERS(get_bypass);
EXPORT_SYMBOL_NOVERS(get_bypass_change);
EXPORT_SYMBOL_NOVERS(set_dis_bypass);
EXPORT_SYMBOL_NOVERS(get_dis_bypass);
EXPORT_SYMBOL_NOVERS(set_bypass_pwoff);
EXPORT_SYMBOL_NOVERS(get_bypass_pwoff);
EXPORT_SYMBOL_NOVERS(set_bypass_pwup);
EXPORT_SYMBOL_NOVERS(get_bypass_pwup);
EXPORT_SYMBOL_NOVERS(set_bypass_wd);
EXPORT_SYMBOL_NOVERS(get_bypass_wd);
EXPORT_SYMBOL_NOVERS(get_wd_expire_time);
EXPORT_SYMBOL_NOVERS(reset_bypass_wd_timer);
EXPORT_SYMBOL_NOVERS(set_std_nic);
EXPORT_SYMBOL_NOVERS(get_std_nic);
EXPORT_SYMBOL_NOVERS(set_tx);
EXPORT_SYMBOL_NOVERS(get_tx);
EXPORT_SYMBOL_NOVERS(set_tap);
EXPORT_SYMBOL_NOVERS(get_tap);
EXPORT_SYMBOL_NOVERS(get_tap_change);
EXPORT_SYMBOL_NOVERS(set_dis_tap);
EXPORT_SYMBOL_NOVERS(get_dis_tap);
EXPORT_SYMBOL_NOVERS(set_tap_pwup);
EXPORT_SYMBOL_NOVERS(get_tap_pwup);
EXPORT_SYMBOL_NOVERS(set_bp_disc);
EXPORT_SYMBOL_NOVERS(get_bp_disc);
EXPORT_SYMBOL_NOVERS(get_bp_disc_change);
EXPORT_SYMBOL_NOVERS(set_bp_dis_disc);
EXPORT_SYMBOL_NOVERS(get_bp_dis_disc);
EXPORT_SYMBOL_NOVERS(set_bp_disc_pwup);
EXPORT_SYMBOL_NOVERS(get_bp_disc_pwup);
EXPORT_SYMBOL_NOVERS(set_wd_exp_mode);
EXPORT_SYMBOL_NOVERS(get_wd_exp_mode);
EXPORT_SYMBOL_NOVERS(set_wd_autoreset);
EXPORT_SYMBOL_NOVERS(get_wd_autoreset);
EXPORT_SYMBOL_NOVERS(set_tpl);
EXPORT_SYMBOL_NOVERS(get_tpl);
EXPORT_SYMBOL_NOVERS(set_bp_hw_reset);
EXPORT_SYMBOL_NOVERS(get_bp_hw_reset);
EXPORT_SYMBOL_NOVERS(get_bypass_info);
module_init(init_lib_module);
module_exit(cleanup_lib_module);
/******************************************************************************/
/* */
/* 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 */
/* */
/******************************************************************************/
/**
* 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_std_nic - 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_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_bp_disc - set Disconnect state
* @if_index: network device index of the controlling device
* @tap_mode: 1 disc mode , 0 non-disc 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_bp_disc - Get Disconnect 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_bp_disc_change - Get change of Disconnect 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_bp_dis_disc - Set Disable Disconnect 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 ofthe operation ordevice not support Disconnect
* or it's a slave device)
**/
int set_bp_dis_disc_sd(int if_index, int dis_disc);
/**
* get_dis_tap - Get Disable Disconnect mode state
* @if_index: network device index of the controlling device
* Output:
* 0/1 - on success (normal Disconnect mode/ Disable Disconnect)
* -1 - on failure (device is not capable of the operation ordevice not support Disconnect
* or it's a slave device)
**/
int get_bp_dis_disc_sd(int if_index);
/**
* set_bp_disc_pwup - Set Disconnect mode at power-up state
* @if_index: network device index of the controlling device
* @disc_mode: tap mode setting at power up state (1=Disc en, 0=Disc Dis)
* Output:
* 0 - on success
* -1 - on failure (device is not capable of the operation ordevice not support Disconnect
* or it's a slave device)
**/
int set_bp_disc_pwup_sd(int if_index, int disc_mode);
/**
* get_bp_disc_pwup - Get Disconnect mode state at power-up state
* @if_index: network device index of the controlling device
* Output:
* 0/1 - on success (Disable Disconnect at power up state / normal Disconnect mode)
* -1 - on failure (device is not capable of the operation ordevice not support TAP
* or it's a slave device)
**/
int get_bp_disc_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_tpl - set TPL state
* @if_index: network device index of the controlling device
* @tpl_mode: 1 tpl mode , 0 normal nic mode
* Output:
* 0 - on success
* -1 - on failure (device not support TPL)
**/
int set_tpl_sd(int if_index, int tpl_mode);
/**
* get_tpl - Get TPL mode state
* @if_index: network device index of the controlling device
* Output:
* 0/1 - (off/on) on success
* -1 - on failure (device not support TPL or it's a slave device)
**/
int get_tpl_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);*/
/******************************************************************************/
/* */
/* 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 //BIT_1
#define BP_STATUS_CHANGE_CAP 0x04 //BIT_2
#define SW_CTL_CAP 0x08 //BIT_3
#define BP_DIS_CAP 0x10 //BIT_4
#define BP_DIS_STATUS_CAP 0x20 //BIT_5
#define STD_NIC_CAP 0x40 //BIT_6
#define BP_PWOFF_ON_CAP 0x80 //BIT_7
#define BP_PWOFF_OFF_CAP 0x0100 //BIT_8
#define BP_PWOFF_CTL_CAP 0x0200 //BIT_9
#define BP_PWUP_ON_CAP 0x0400 //BIT_10
#define BP_PWUP_OFF_CAP 0x0800 //BIT_11
#define BP_PWUP_CTL_CAP 0x1000 //BIT_12
#define WD_CTL_CAP 0x2000 //BIT_13
#define WD_STATUS_CAP 0x4000 //BIT_14
#define WD_TIMEOUT_CAP 0x8000 //BIT_15
#define TX_CTL_CAP 0x10000 //BIT_16
#define TX_STATUS_CAP 0x20000 //BIT_17
#define TAP_CAP 0x40000 //BIT_18
#define TAP_STATUS_CAP 0x80000 //BIT_19
#define TAP_STATUS_CHANGE_CAP 0x100000 //BIT_20
#define TAP_DIS_CAP 0x200000 //BIT_21
#define TAP_DIS_STATUS_CAP 0x400000 //BIT_22
#define TAP_PWUP_ON_CAP 0x800000 //BIT_23
#define TAP_PWUP_OFF_CAP 0x1000000 //BIT 24
#define TAP_PWUP_CTL_CAP 0x2000000 //BIT 25
#define NIC_CAP_NEG 0x4000000 //BIT 26
#define WD_MIN_TIME_GET(desc) (desc & 0xf)
#define WD_STEP_COUNT_GET(desc) (desc>>5) & 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);*/
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment