mirror of
https://github.com/Telecominfraproject/OpenNetworkLinux.git
synced 2025-12-25 17:27:01 +00:00
Merge branch 'master' into onl-anaconda
This commit is contained in:
22
docker/images/builder8/1.9/Dockerfile
Normal file
22
docker/images/builder8/1.9/Dockerfile
Normal file
@@ -0,0 +1,22 @@
|
||||
############################################################
|
||||
#
|
||||
# Minor updates.
|
||||
# - libelf-dev for kernel 4.14
|
||||
# - cryptsetup-bin
|
||||
#
|
||||
############################################################
|
||||
FROM opennetworklinux/builder8:1.8
|
||||
MAINTAINER Jeffrey Townsend <jeffrey.townsend@bigswitch.com>
|
||||
|
||||
# LTS architecture fixes
|
||||
|
||||
RUN sudo sed -i s/'http:\/\/security'/'[arch=amd64,armel] http:\/\/security'/g /etc/apt/sources.list && \
|
||||
apt-get update && \
|
||||
DEBIAN_FRONTEND=noninteractive apt-get upgrade -y && \
|
||||
apt-get install -y apt-transport-https
|
||||
|
||||
#
|
||||
# Docker shell and other container tools.
|
||||
#
|
||||
COPY docker_shell /bin/docker_shell
|
||||
COPY container-id /bin/container-id
|
||||
19
docker/images/builder8/1.9/Makefile
Normal file
19
docker/images/builder8/1.9/Makefile
Normal file
@@ -0,0 +1,19 @@
|
||||
VERSION=1.9
|
||||
USER=opennetworklinux
|
||||
REPO=builder8
|
||||
|
||||
TOOLS=../../../tools/docker_shell ../../../tools/container-id
|
||||
|
||||
build: check_version
|
||||
cp $(TOOLS) .
|
||||
docker build -t $(USER)/$(REPO):$(VERSION) .
|
||||
rm -rf $(notdir $(TOOLS))
|
||||
|
||||
#
|
||||
# Todo: Query remote repository to see if the request version already exists to avoid accidental overwrites
|
||||
# when a new image is built but the VERSION variable is not updated.
|
||||
#
|
||||
check_version:
|
||||
|
||||
push:
|
||||
docker push $(USER)/$(REPO):$(VERSION)
|
||||
17
docker/images/builder9/1.2/Dockerfile
Normal file
17
docker/images/builder9/1.2/Dockerfile
Normal file
@@ -0,0 +1,17 @@
|
||||
############################################################
|
||||
#
|
||||
# Update Packages for arm64.
|
||||
# Additional build dependencies.
|
||||
#
|
||||
############################################################
|
||||
FROM opennetworklinux/builder9:1.1
|
||||
MAINTAINER Jeffrey Townsend <jeffrey.townsend@bigswitch.com>
|
||||
|
||||
RUN apt-get update && \
|
||||
apt-get upgrade -y && \
|
||||
apt-get install -y apt-transport-https
|
||||
|
||||
# Docker shell and other container tools.
|
||||
#
|
||||
COPY docker_shell /bin/docker_shell
|
||||
COPY container-id /bin/container-id
|
||||
19
docker/images/builder9/1.2/Makefile
Normal file
19
docker/images/builder9/1.2/Makefile
Normal file
@@ -0,0 +1,19 @@
|
||||
VERSION=1.2
|
||||
USER=opennetworklinux
|
||||
REPO=builder9
|
||||
|
||||
TOOLS=../../../tools/docker_shell ../../../tools/container-id
|
||||
|
||||
build: check_version
|
||||
cp $(TOOLS) .
|
||||
docker build -t $(USER)/$(REPO):$(VERSION) .
|
||||
rm -rf $(notdir $(TOOLS))
|
||||
|
||||
#
|
||||
# Todo: Query remote repository to see if the request version already exists to avoid accidental overwrites
|
||||
# when a new image is built but the VERSION variable is not updated.
|
||||
#
|
||||
check_version:
|
||||
|
||||
push:
|
||||
docker push $(USER)/$(REPO):$(VERSION)
|
||||
@@ -18,8 +18,8 @@ g_current_uid = os.getuid()
|
||||
g_timestamp = datetime.datetime.now().strftime("%Y-%m-%d.%H%M%S")
|
||||
|
||||
g_builder7_image_name="opennetworklinux/builder7:1.2"
|
||||
g_builder8_image_name="opennetworklinux/builder8:1.8"
|
||||
g_builder9_image_name="opennetworklinux/builder9:1.1"
|
||||
g_builder8_image_name="opennetworklinux/builder8:1.9"
|
||||
g_builder9_image_name="opennetworklinux/builder9:1.2"
|
||||
|
||||
g_default_image_name=g_builder8_image_name
|
||||
g_default_container_name = "%s_%s" % (g_current_user, g_timestamp)
|
||||
|
||||
@@ -3,7 +3,7 @@ prerequisites:
|
||||
|
||||
packages:
|
||||
- name: onl-vendor-config-onl
|
||||
depends: [ python-yaml, onl-bootd, python-dmidecode ]
|
||||
depends: [ python-yaml, onl-bootd, python-dmidecode, python-netaddr ]
|
||||
version: 1.0.0
|
||||
arch: all
|
||||
copyright: Copyright 2013, 2014, 2015 Big Switch Networks
|
||||
|
||||
@@ -132,7 +132,7 @@ default:
|
||||
- "bootm $onl_loadaddr#$onl_platform"
|
||||
|
||||
mmc_bootcmds: &mmc_bootcmds
|
||||
- mmc part 0
|
||||
- mmc part
|
||||
- ext2load mmc 0:1 $onl_loadaddr $onl_itb
|
||||
- "bootm $onl_loadaddr#$onl_platform"
|
||||
|
||||
|
||||
@@ -22,6 +22,8 @@ class OnlBootConfig(object):
|
||||
def read(self, bc=None):
|
||||
if bc:
|
||||
self._readf(bc)
|
||||
elif os.path.exists(self.BOOT_CONFIG_DEFAULT):
|
||||
self._readf(self.BOOT_CONFIG_DEFAULT)
|
||||
else:
|
||||
from onl.mounts import OnlMountContextReadOnly
|
||||
with OnlMountContextReadOnly("ONL-BOOT", logger=None):
|
||||
|
||||
@@ -535,3 +535,7 @@ class OnlPlatformPortConfig_48x10_6x100(object):
|
||||
class OnlPlatformPortConfig_12x10_3x100(object):
|
||||
PORT_COUNT=15
|
||||
PORT_CONFIG="12x10 + 3x100"
|
||||
|
||||
class OnlPlatformPortConfig_24x10_2x100(object):
|
||||
PORT_COUNT=26
|
||||
PORT_CONFIG="24x10 + 2x100"
|
||||
|
||||
@@ -440,6 +440,7 @@ CONFIG_ZONE_DMA=y
|
||||
CONFIG_SMP=y
|
||||
CONFIG_X86_FEATURE_NAMES=y
|
||||
CONFIG_X86_FAST_FEATURE_TESTS=y
|
||||
CONFIG_X86_X2APIC=y
|
||||
CONFIG_X86_MPPARSE=y
|
||||
# CONFIG_GOLDFISH is not set
|
||||
CONFIG_RETPOLINE=y
|
||||
@@ -448,13 +449,14 @@ CONFIG_X86_EXTENDED_PLATFORM=y
|
||||
# CONFIG_X86_VSMP is not set
|
||||
# CONFIG_X86_GOLDFISH is not set
|
||||
# CONFIG_X86_INTEL_MID is not set
|
||||
# CONFIG_X86_INTEL_LPSS is not set
|
||||
CONFIG_X86_INTEL_LPSS=y
|
||||
# CONFIG_X86_AMD_PLATFORM_DEVICE is not set
|
||||
CONFIG_IOSF_MBI=y
|
||||
# CONFIG_IOSF_MBI_DEBUG is not set
|
||||
CONFIG_X86_SUPPORTS_MEMORY_FAILURE=y
|
||||
CONFIG_SCHED_OMIT_FRAME_POINTER=y
|
||||
# CONFIG_HYPERVISOR_GUEST is not set
|
||||
CONFIG_HYPERVISOR_GUEST=y
|
||||
# CONFIG_PARAVIRT is not set
|
||||
CONFIG_NO_BOOTMEM=y
|
||||
# CONFIG_MK8 is not set
|
||||
# CONFIG_MPSC is not set
|
||||
@@ -2009,6 +2011,7 @@ CONFIG_MOUSE_PS2_TRACKPOINT=y
|
||||
# CONFIG_MOUSE_PS2_SENTELIC is not set
|
||||
# CONFIG_MOUSE_PS2_TOUCHKIT is not set
|
||||
CONFIG_MOUSE_PS2_FOCALTECH=y
|
||||
# CONFIG_MOUSE_PS2_VMMOUSE is not set
|
||||
CONFIG_MOUSE_PS2_SMBUS=y
|
||||
# CONFIG_MOUSE_SERIAL is not set
|
||||
# CONFIG_MOUSE_APPLETOUCH is not set
|
||||
@@ -2401,6 +2404,27 @@ CONFIG_PTP_1588_CLOCK=y
|
||||
#
|
||||
# Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks.
|
||||
#
|
||||
CONFIG_PINCTRL=y
|
||||
|
||||
#
|
||||
# Pin controllers
|
||||
#
|
||||
CONFIG_PINMUX=y
|
||||
CONFIG_PINCONF=y
|
||||
CONFIG_GENERIC_PINCONF=y
|
||||
# CONFIG_DEBUG_PINCTRL is not set
|
||||
# CONFIG_PINCTRL_AMD is not set
|
||||
# CONFIG_PINCTRL_MCP23S08 is not set
|
||||
# CONFIG_PINCTRL_SX150X is not set
|
||||
# CONFIG_PINCTRL_BAYTRAIL is not set
|
||||
# CONFIG_PINCTRL_CHERRYVIEW is not set
|
||||
CONFIG_PINCTRL_INTEL=y
|
||||
# CONFIG_PINCTRL_BROXTON is not set
|
||||
# CONFIG_PINCTRL_CANNONLAKE is not set
|
||||
CONFIG_PINCTRL_DENVERTON=y
|
||||
# CONFIG_PINCTRL_GEMINILAKE is not set
|
||||
# CONFIG_PINCTRL_LEWISBURG is not set
|
||||
# CONFIG_PINCTRL_SUNRISEPOINT is not set
|
||||
CONFIG_GPIOLIB=y
|
||||
CONFIG_GPIO_ACPI=y
|
||||
CONFIG_GPIOLIB_IRQCHIP=y
|
||||
@@ -2437,6 +2461,7 @@ CONFIG_GPIO_SCH=y
|
||||
CONFIG_GPIO_PCA953X=y
|
||||
# CONFIG_GPIO_PCA953X_IRQ is not set
|
||||
CONFIG_GPIO_PCF857X=y
|
||||
# CONFIG_GPIO_SX150X is not set
|
||||
# CONFIG_GPIO_TPIC2810 is not set
|
||||
|
||||
#
|
||||
@@ -2780,8 +2805,9 @@ CONFIG_LPC_ICH=y
|
||||
CONFIG_LPC_SCH=y
|
||||
# CONFIG_INTEL_SOC_PMIC is not set
|
||||
# CONFIG_INTEL_SOC_PMIC_CHTWC is not set
|
||||
# CONFIG_MFD_INTEL_LPSS_ACPI is not set
|
||||
# CONFIG_MFD_INTEL_LPSS_PCI is not set
|
||||
CONFIG_MFD_INTEL_LPSS=y
|
||||
CONFIG_MFD_INTEL_LPSS_ACPI=y
|
||||
CONFIG_MFD_INTEL_LPSS_PCI=y
|
||||
# CONFIG_MFD_JANZ_CMODIO is not set
|
||||
# CONFIG_MFD_KEMPLD is not set
|
||||
# CONFIG_MFD_88PM800 is not set
|
||||
@@ -3409,6 +3435,7 @@ CONFIG_VIRTIO_PCI_LEGACY=y
|
||||
#
|
||||
# Microsoft Hyper-V guest support
|
||||
#
|
||||
# CONFIG_HYPERV is not set
|
||||
# CONFIG_HYPERV_TSCPAGE is not set
|
||||
# CONFIG_STAGING is not set
|
||||
CONFIG_X86_PLATFORM_DEVICES=y
|
||||
|
||||
@@ -2435,6 +2435,7 @@ CONFIG_SENSORS_MAX6620=y
|
||||
# CONFIG_SENSORS_MAX6697 is not set
|
||||
# CONFIG_SENSORS_MAX31790 is not set
|
||||
# CONFIG_SENSORS_MCP3021 is not set
|
||||
CONFIG_SENSORS_MLXREG_FAN=y
|
||||
# CONFIG_SENSORS_ADCXX is not set
|
||||
# CONFIG_SENSORS_LM63 is not set
|
||||
# CONFIG_SENSORS_LM70 is not set
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -13,3 +13,4 @@ driver-support-intel-igb-bcm5461-phy.patch
|
||||
0012-i2c-busses-Add-capabilities-to-i2c-mlxcpld.patch
|
||||
driver-i2c-i2c-core.patch
|
||||
driver-add-the-support-max6620.patch
|
||||
0013-Mellanox-backport-patchwork-from-kernels-4.17-4.19.patch
|
||||
|
||||
@@ -31,7 +31,7 @@ packages:
|
||||
${ONL}/packages/base/any/onlp/src/onlp/module/python/onlp/onlp: ${PY_INSTALL}/onlp/onlp
|
||||
${ONL}/packages/base/any/onlp/src/onlp/module/python/onlp/test: ${PY_INSTALL}/onlp/test
|
||||
${ONL}/packages/base/any/onlp/src/onlplib/module/python/onlp/onlplib: ${PY_INSTALL}/onlp/onlplib
|
||||
${ONL}/packages/base/any/onlp/src/sff/module/python/onlp/sff: ${PY_INSTALL}/onlp/sff
|
||||
${ONL}/sm/bigcode/modules/sff/module/python/sff: ${PY_INSTALL}/onlp/sff
|
||||
|
||||
init: $ONL/packages/base/any/onlp/src/onlpd.init
|
||||
|
||||
|
||||
@@ -110,6 +110,7 @@ ONLP_LOCKED_API1(onlp_sfp_is_present, int, port);
|
||||
static int
|
||||
onlp_sfp_presence_bitmap_get_locked__(onlp_sfp_bitmap_t* dst)
|
||||
{
|
||||
onlp_sfp_bitmap_t_init(dst);
|
||||
int rv = onlp_sfpi_presence_bitmap_get(dst);
|
||||
|
||||
if(rv == ONLP_STATUS_E_UNSUPPORTED) {
|
||||
|
||||
1
packages/base/any/onlp/src/sff/.gitignore
vendored
1
packages/base/any/onlp/src/sff/.gitignore
vendored
@@ -1 +0,0 @@
|
||||
*.mk
|
||||
@@ -1 +0,0 @@
|
||||
name: sff
|
||||
@@ -1,4 +0,0 @@
|
||||
include $(ONL)/make/config.mk
|
||||
MODULE := sff
|
||||
AUTOMODULE := sff
|
||||
include $(BUILDER)/definemodule.mk
|
||||
@@ -1,181 +0,0 @@
|
||||
###############################################################################
|
||||
#
|
||||
# sff Autogeneration Definitions.
|
||||
#
|
||||
###############################################################################
|
||||
|
||||
cdefs: &cdefs
|
||||
- SFF_CONFIG_INCLUDE_LOGGING:
|
||||
doc: "Include or exclude logging."
|
||||
default: 1
|
||||
- SFF_CONFIG_LOG_OPTIONS_DEFAULT:
|
||||
doc: "Default enabled log options."
|
||||
default: AIM_LOG_OPTIONS_DEFAULT
|
||||
- SFF_CONFIG_LOG_BITS_DEFAULT:
|
||||
doc: "Default enabled log bits."
|
||||
default: AIM_LOG_BITS_DEFAULT
|
||||
- SFF_CONFIG_LOG_CUSTOM_BITS_DEFAULT:
|
||||
doc: "Default enabled custom log bits."
|
||||
default: 0
|
||||
- SFF_CONFIG_PORTING_STDLIB:
|
||||
doc: "Default all porting macros to use the C standard libraries."
|
||||
default: 1
|
||||
- SFF_CONFIG_PORTING_INCLUDE_STDLIB_HEADERS:
|
||||
doc: "Include standard library headers for stdlib porting macros."
|
||||
default: SFF_CONFIG_PORTING_STDLIB
|
||||
- SFF_CONFIG_INCLUDE_UCLI:
|
||||
doc: "Include generic uCli support."
|
||||
default: 0
|
||||
- SFF_CONFIG_INCLUDE_SFF_TOOL:
|
||||
doc: "Include the SFF tool main entry point."
|
||||
default: 0
|
||||
- SFF_CONFIG_INCLUDE_EXT_CC_CHECK:
|
||||
doc: "Include extended checksum verification."
|
||||
default: 0
|
||||
- SFF_CONFIG_INCLUDE_DATABASE:
|
||||
doc: "Include eeprom database."
|
||||
default: 1
|
||||
|
||||
sff_media_types: &sff_media_types
|
||||
- COPPER:
|
||||
desc: "Copper"
|
||||
- FIBER:
|
||||
desc: "Fiber"
|
||||
|
||||
sff_module_types: &sff_module_types
|
||||
- 100G_AOC:
|
||||
desc: "100G-AOC"
|
||||
- 100G_BASE_CR4:
|
||||
desc: "100GBASE-CR4"
|
||||
- 100G_BASE_SR4:
|
||||
desc: "100GBASE-SR4"
|
||||
- 100G_BASE_LR4:
|
||||
desc: "100GBASE-LR4"
|
||||
- 100G_CWDM4:
|
||||
desc: "100G-CWDM4"
|
||||
- 100G_PSM4:
|
||||
desc: "100G-PSM4"
|
||||
- 100G_SWDM4:
|
||||
desc: "100G-SWDM4"
|
||||
- 40G_BASE_CR4:
|
||||
desc: "40GBASE-CR4"
|
||||
- 40G_BASE_SR4:
|
||||
desc: "40GBASE-SR4"
|
||||
- 40G_BASE_LR4:
|
||||
desc: "40GBASE-LR4"
|
||||
- 40G_BASE_LM4:
|
||||
desc: "40GBASE-LM4"
|
||||
- 40G_BASE_ACTIVE:
|
||||
desc: "40GBASE-ACTIVE"
|
||||
- 40G_BASE_CR:
|
||||
desc: "40GBASE-CR"
|
||||
- 40G_BASE_SR2:
|
||||
desc: "40GBASE-SR2"
|
||||
- 40G_BASE_SM4:
|
||||
desc: "40GBASE-SM4"
|
||||
- 40G_BASE_ER4:
|
||||
desc: "40GBASE-ER4"
|
||||
- 25G_BASE_CR:
|
||||
desc: "25GBASE-CR"
|
||||
- 25G_BASE_SR:
|
||||
desc: "25GBASE-SR"
|
||||
- 25G_BASE_LR:
|
||||
desc: "25GBASE-LR"
|
||||
- 25G_BASE_AOC:
|
||||
desc: "25GBASE-AOC"
|
||||
- 10G_BASE_SR:
|
||||
desc: "10GBASE-SR"
|
||||
- 10G_BASE_LR:
|
||||
desc: "10GBASE-LR"
|
||||
- 10G_BASE_LRM:
|
||||
desc: "10GBASE-LRM"
|
||||
- 10G_BASE_ER:
|
||||
desc: "10GBASE-ER"
|
||||
- 10G_BASE_CR:
|
||||
desc: "10GBASE-CR"
|
||||
- 10G_BASE_SX:
|
||||
desc: "10GBASE-SX"
|
||||
- 10G_BASE_LX:
|
||||
desc: "10GBASE-LX"
|
||||
- 10G_BASE_ZR:
|
||||
desc: "10GBASE-ZR"
|
||||
- 10G_BASE_SRL:
|
||||
desc: "10GBASE-SRL"
|
||||
- 1G_BASE_SX:
|
||||
desc: "1GBASE-SX"
|
||||
- 1G_BASE_LX:
|
||||
desc: "1GBASE-LX"
|
||||
- 1G_BASE_ZX:
|
||||
desc: "1GBASE-ZX"
|
||||
- 1G_BASE_CX:
|
||||
desc: "1GBASE-CX"
|
||||
- 1G_BASE_T:
|
||||
desc: "1GBASE-T"
|
||||
- 100_BASE_LX:
|
||||
desc: "100BASE-LX"
|
||||
- 100_BASE_FX:
|
||||
desc: "100BASE-FX"
|
||||
- 4X_MUX:
|
||||
desc: "4X-MUX"
|
||||
|
||||
sff_module_caps: &sff_module_caps
|
||||
- F_100 : 0x1
|
||||
- F_1G : 0x2
|
||||
- F_10G : 0x4
|
||||
- F_25G : 0x8
|
||||
- F_40G : 0x10
|
||||
- F_100G : 0x20
|
||||
|
||||
sff_sfp_types: &sff_sfp_types
|
||||
- SFP:
|
||||
desc: "SFP"
|
||||
- QSFP:
|
||||
desc: "QSFP"
|
||||
- QSFP_PLUS:
|
||||
desc: "QSFP+"
|
||||
- QSFP28:
|
||||
desc: "QSFP28"
|
||||
- SFP28:
|
||||
desc: "SFP28"
|
||||
|
||||
definitions:
|
||||
cdefs:
|
||||
SFF_CONFIG_HEADER:
|
||||
defs: *cdefs
|
||||
basename: sff_config
|
||||
|
||||
portingmacro:
|
||||
SFF:
|
||||
macros:
|
||||
- memset
|
||||
- memcpy
|
||||
- strncpy
|
||||
- strncmp
|
||||
- strlen
|
||||
- snprintf
|
||||
|
||||
enum: &enums
|
||||
sff_sfp_type:
|
||||
members: *sff_sfp_types
|
||||
sff_module_type:
|
||||
members: *sff_module_types
|
||||
sff_module_caps:
|
||||
members: *sff_module_caps
|
||||
sff_media_type:
|
||||
members: *sff_media_types
|
||||
|
||||
pyenum: *enums
|
||||
|
||||
xenum:
|
||||
SFF_ENUMERATION_ENTRY:
|
||||
members: *enums
|
||||
|
||||
xmacro:
|
||||
SFF_SFP_TYPE_ENTRY:
|
||||
members: *sff_sfp_types
|
||||
SFF_MODULE_TYPE_ENTRY:
|
||||
members: *sff_module_types
|
||||
SFF_MODULE_CAP_ENTRY:
|
||||
members: *sff_module_caps
|
||||
SFF_MEDIA_TYPE_ENTRY:
|
||||
members: *sff_module_types
|
||||
@@ -1,525 +0,0 @@
|
||||
/**********************************************************************
|
||||
*
|
||||
* 8436.h
|
||||
*
|
||||
* idprom defintions for QSFP+ modules.
|
||||
*
|
||||
**********************************************************************/
|
||||
|
||||
#ifndef __SFF_8436_H__
|
||||
#define __SFF_8436_H__
|
||||
|
||||
#include <sff/sff_config.h>
|
||||
#include "sff/8472.h"
|
||||
|
||||
/* identifier, bytes 128 page 0 (also byte 0) */
|
||||
|
||||
#define SFF8436_IDENT_UNKNOWN SFF8472_IDENT_UNKNOWN
|
||||
#define SFF8436_IDENT_GBIC SFF8472_IDENT_GBIC
|
||||
#define SFF8436_IDENT_BASEBOARD SFF8472_IDENT_BASEBOARD
|
||||
#define SFF8436_IDENT_SFP SFF8472_IDENT_SFP
|
||||
#define SFF8436_IDENT_XBI SFF8472_IDENT_XBI
|
||||
#define SFF8436_IDENT_XENPAK SFF8472_IDENT_XENPAK
|
||||
#define SFF8436_IDENT_XFP SFF8472_IDENT_XFP
|
||||
#define SFF8436_IDENT_XFF SFF8472_IDENT_XFF
|
||||
#define SFF8436_IDENT_XFPE SFF8472_IDENT_XFPE
|
||||
#define SFF8436_IDENT_XPAK SFF8472_IDENT_XPAK
|
||||
#define SFF8436_IDENT_X2 SFF8472_IDENT_X2
|
||||
#define SFF8436_IDENT_DWDM_SFP SFF8472_IDENT_DWDM_SFP
|
||||
#define SFF8436_IDENT_QSFP SFF8472_IDENT_QSFP
|
||||
|
||||
/* additional values from this spec */
|
||||
#define SFF8436_IDENT_QSFP_PLUS 0x0D
|
||||
|
||||
#define SFF8436_MODULE_QSFP_PLUS(idprom) \
|
||||
((idprom[0] == SFF8436_IDENT_QSFP) \
|
||||
|| (idprom[0] == SFF8436_IDENT_QSFP_PLUS))
|
||||
|
||||
#define SFF8436_MODULE_QSFP_PLUS_V2(idprom) \
|
||||
((idprom[128] == SFF8436_IDENT_QSFP) \
|
||||
|| (idprom[128] == SFF8436_IDENT_QSFP_PLUS))
|
||||
|
||||
#define SFF8436_RX1_PWR(idprom) \
|
||||
(idprom[34] << 8 | idprom[34 + 1])
|
||||
#define SFF8436_RX2_PWR(idprom) \
|
||||
(idprom[36] << 8 | idprom[36 + 1])
|
||||
#define SFF8436_RX3_PWR(idprom) \
|
||||
(idprom[38] << 8 | idprom[38 + 1])
|
||||
#define SFF8436_RX4_PWR(idprom) \
|
||||
(idprom[40] << 8 | idprom[40 + 1])
|
||||
|
||||
#define SFF8436_TX1_BIAS(idprom) \
|
||||
(idprom[42] << 8 | idprom[42 + 1])
|
||||
#define SFF8436_TX2_BIAS(idprom) \
|
||||
(idprom[44] << 8 | idprom[44 + 1])
|
||||
#define SFF8436_TX3_BIAS(idprom) \
|
||||
(idprom[46] << 8 | idprom[46 + 1])
|
||||
#define SFF8436_TX4_BIAS(idprom) \
|
||||
(idprom[48] << 8 | idprom[48 + 1])
|
||||
|
||||
#define SFF8436_SFP_VOLT(idprom) \
|
||||
(idprom[26] << 8 | idprom[26 + 1])
|
||||
#define SFF8436_SFP_TEMP(idprom) \
|
||||
(idprom[22] << 8 | idprom[22 + 1])
|
||||
|
||||
/* connector value, byte 130 page 0 */
|
||||
|
||||
#define SFF8436_CONN_UNKNOWN SFF8472_CONN_UNKNOWN
|
||||
#define SFF8436_CONN_SC SFF8472_CONN_SC
|
||||
#define SFF8436_CONN_FC1_CU SFF8472_CONN_FC1_CU
|
||||
#define SFF8436_CONN_FC2_CU SFF8472_CONN_FC2_CU
|
||||
#define SFF8436_CONN_BNC SFF8472_CONN_BNC
|
||||
#define SFF8436_CONN_FC_COAX SFF8472_CONN_FC_COAX
|
||||
#define SFF8436_CONN_FJ SFF8472_CONN_FJ
|
||||
#define SFF8436_CONN_LC SFF8472_CONN_LC
|
||||
#define SFF8436_CONN_MT_RJ SFF8472_CONN_MT_RJ
|
||||
#define SFF8436_CONN_MU SFF8472_CONN_MU
|
||||
#define SFF8436_CONN_SG SFF8472_CONN_SG
|
||||
#define SFF8436_CONN_SI_PIGTAIL SFF8472_CONN_SI_PIGTAIL
|
||||
#define SFF8436_CONN_MPO SFF8472_CONN_MPO
|
||||
#define SFF8436_CONN_HSSDC_II SFF8472_CONN_HSSDC_II
|
||||
#define SFF8436_CONN_CU_PIGTAIL SFF8472_CONN_CU_PIGTAIL
|
||||
#define SFF8436_CONN_RJ45 SFF8472_CONN_RJ45
|
||||
|
||||
/* addtional values from this spec */
|
||||
#define SFF8436_CONN_NONE 0x23
|
||||
|
||||
/* Amphenol QSFP, identified as "QSFP" (not "QSFP+") and copper
|
||||
pigtail */
|
||||
#define SFF8436_MEDIA_40GE_CR(idprom) \
|
||||
(idprom[130] == SFF8436_CONN_CU_PIGTAIL)
|
||||
|
||||
/* QSFP+ compliance codes, bytes 131-138 */
|
||||
#define SFF8436_CC131_XGE_BASE_LRM SFF8472_CC3_XGE_BASE_LRM
|
||||
#define SFF8436_CC131_XGE_BASE_LR SFF8472_CC3_XGE_BASE_LR
|
||||
#define SFF8436_CC131_XGE_BASE_SR SFF8472_CC3_XGE_BASE_SR
|
||||
#define SFF8436_CC131_40GE_BASE_CR4 0x08
|
||||
#define SFF8436_CC131_40GE_BASE_SR4 0x04
|
||||
#define SFF8436_CC131_40GE_BASE_LR4 0x02
|
||||
#define SFF8436_CC131_40GE_ACTIVE 0x01
|
||||
|
||||
#define SFF8436_MEDIA_XGE_LRM(idprom) \
|
||||
((idprom[131] & SFF8436_CC131_XGE_BASE_LRM) != 0)
|
||||
#define SFF8436_MEDIA_XGE_LR(idprom) \
|
||||
((idprom[131] & SFF8436_CC131_XGE_BASE_LR) != 0)
|
||||
#define SFF8436_MEDIA_XGE_SR(idprom) \
|
||||
((idprom[131] & SFF8436_CC131_XGE_BASE_SR) != 0)
|
||||
|
||||
#define SFF8436_MEDIA_40GE_CR4(idprom) \
|
||||
((idprom[131] & SFF8436_CC131_40GE_BASE_CR4) != 0)
|
||||
#define SFF8436_MEDIA_40GE_SR4(idprom) \
|
||||
((idprom[131] & SFF8436_CC131_40GE_BASE_SR4) != 0)
|
||||
#define SFF8436_MEDIA_40GE_LR4(idprom) \
|
||||
((idprom[131] & SFF8436_CC131_40GE_BASE_LR4) != 0)
|
||||
#define SFF8436_MEDIA_40GE_ACTIVE(idprom) \
|
||||
((idprom[131] & SFF8436_CC131_40GE_ACTIVE) != 0)
|
||||
|
||||
#define SFF8436_MEDIA_NONE(idprom) \
|
||||
((idprom[131] & 0x7F) == 0)
|
||||
|
||||
#define SFF8436_CC132_40G_OTN 0x08
|
||||
#define SFF8436_CC132_OC48_LONG SFF8472_CC4_OC48_LONG
|
||||
#define SFF8436_CC132_OC48_INTERMETIATE SFF8472_CC4_OC48_INTERMEDIATE
|
||||
#define SFF8436_CC132_OC48_SHORT SFF8472_CC4_OC48_SHORT
|
||||
|
||||
#define SFF8436_CC133_SAS_6G 0x20
|
||||
#define SFF8436_CC133_SAS_3G 0x10
|
||||
|
||||
#define SFF8436_CC134_GBE_BASE_T SFF8472_CC6_GBE_BASE_T
|
||||
#define SFF8436_CC134_GBE_BASE_CX SFF8472_CC6_GBE_BASE_CX
|
||||
#define SFF8436_CC134_GBE_BASE_LX SFF8472_CC6_GBE_BASE_LX
|
||||
#define SFF8436_CC134_GBE_BASE_SX SFF8472_CC6_GBE_BASE_SX
|
||||
|
||||
#define SFF8436_MEDIA_GBE_T(idprom) \
|
||||
((idprom[134] & SFF8436_CC134_GBE_BASE_T) != 0)
|
||||
#define SFF8436_MEDIA_GBE_CX(idprom) \
|
||||
((idprom[134] & SFF8436_CC134_GBE_BASE_CX) != 0)
|
||||
#define SFF8436_MEDIA_GBE_LX(idprom) \
|
||||
((idprom[134] & SFF8436_CC134_GBE_BASE_LX) != 0)
|
||||
#define SFF8436_MEDIA_GBE_SX(idprom) \
|
||||
((idprom[134] & SFF8436_CC134_GBE_BASE_SX) != 0)
|
||||
|
||||
#define SFF8436_CC135_FC_VERY_LONG SFF8472_CC7_FC_VERY_LONG
|
||||
#define SFF8436_CC135_FC_SHORT SFF8472_CC7_FC_SHORT
|
||||
#define SFF8436_CC135_FC_INTERMEDIATE SFF8472_CC7_FC_INTERMEDIATE
|
||||
#define SFF8436_CC135_FC_LONG SFF8472_CC7_FC_LONG
|
||||
#define SFF8436_CC135_FC_MEDIUM SFF8472_CC7_FC_MEDIUM
|
||||
#define SFF8436_CC135_FC_TECH_LC SFF8472_CC7_FC_TECH_LC
|
||||
#define SFF8436_CC135_FC_TECH_EL SFF8472_CC7_FC_TECH_EL
|
||||
#define SFF8436_CC136_FC_TECH_EL SFF8472_CC8_FC_TECH_EL
|
||||
#define SFF8436_CC136_FC_TECH_SN SFF8472_CC8_FC_TECH_SN
|
||||
#define SFF8436_CC136_FC_TECH_SL SFF8472_CC8_FC_TECH_SL
|
||||
#define SFF8436_CC136_FC_TECH_LL SFF8472_CC8_FC_TECH_LL
|
||||
|
||||
#define SFF8436_TECH_FC_FIBER_LONG(idprom) \
|
||||
(((idprom[135] & SFF8436_CC135_FC_TECH_LC) != 0) \
|
||||
|| ((idprom[136] & SFF8436_CC136_FC_TECH_LL) != 0))
|
||||
|
||||
#define SFF8436_TECH_FC_FIBER_SHORT(idprom) \
|
||||
(((idprom[136] & SFF8436_CC136_FC_TECH_SN) != 0) \
|
||||
|| ((idprom[136] & SFF8436_CC136_FC_TECH_SL) != 0))
|
||||
|
||||
#define SFF8436_TECH_FC_FIBER(idprom) \
|
||||
(SFF8436_TECH_FC_FIBER_SHORT(idprom) \
|
||||
|| SFF8436_TECH_FC_FIBER_LONG(idprom))
|
||||
|
||||
#define SFF8436_TECH_FC_COPPER(idprom) \
|
||||
(((idprom[135] & SFF8436_CC135_FC_TECH_EL) != 0) \
|
||||
|| ((idprom[136] & SFF8436_CC136_FC_TECH_EL) != 0))
|
||||
|
||||
#define SFF8436_CC137_FC_MEDIA_TW SFF8472_CC9_FC_MEDIA_TW
|
||||
#define SFF8436_CC137_FC_MEDIA_TP SFF8472_CC9_FC_MEDIA_TP
|
||||
#define SFF8436_CC137_FC_MEDIA_MI SFF8472_CC9_FC_MEDIA_MI
|
||||
#define SFF8436_CC137_FC_MEDIA_TV SFF8472_CC9_FC_MEDIA_TV
|
||||
#define SFF8436_CC137_FC_MEDIA_M6 SFF8472_CC9_FC_MEDIA_M6
|
||||
#define SFF8436_CC137_FC_MEDIA_M5 SFF8472_CC9_FC_MEDIA_M5
|
||||
#define SFF8436_CC137_FC_MEDIA_OM3 0x02
|
||||
#define SFF8436_CC137_FC_MEDIA_SM SFF8472_CC9_FC_MEDIA_SM
|
||||
|
||||
#define SFF8436_MEDIA_FC_FIBER_SM(idprom) \
|
||||
((idprom[137] & SFF8436_CC137_FC_MEDIA_SM) != 0)
|
||||
|
||||
#define SFF8436_MEDIA_FC_FIBER_MM(idprom) \
|
||||
(((idprom[137] & SFF8436_CC137_FC_MEDIA_OM3) != 0) \
|
||||
|| ((idprom[137] & SFF8436_CC137_FC_MEDIA_M5) != 0) \
|
||||
|| ((idprom[137] & SFF8436_CC137_FC_MEDIA_M6) != 0))
|
||||
|
||||
#define SFF8436_MEDIA_FC_FIBER(idprom) \
|
||||
(SFF8436_MEDIA_FC_FIBER_SM(idprom) \
|
||||
|| SFF8436_MEDIA_FC_FIBER_MM(idprom))
|
||||
|
||||
#define SFF8436_MEDIA_FC_COPPER_TP(idprom) \
|
||||
(((idprom[137] & SFF8436_CC137_FC_MEDIA_TP) != 0) \
|
||||
|| ((idprom[137] & SFF8436_CC137_FC_MEDIA_TW) != 0))
|
||||
|
||||
#define SFF8436_MEDIA_FC_COPPER_COAX(idprom) \
|
||||
(((idprom[137] & SFF8436_CC137_FC_MEDIA_TV) != 0) \
|
||||
|| ((idprom[137] & SFF8436_CC137_FC_MEDIA_MI) != 0))
|
||||
|
||||
#define SFF8436_MEDIA_FC_COPPER(idprom) \
|
||||
(SFF8436_MEDIA_FC_COPPER_TP(idprom) \
|
||||
|| SFF8436_MEDIA_FC_COPPER_COAX(idprom)
|
||||
|
||||
#define SFF8436_CC138_FC_SPEED_100 SFF8472_CC10_FC_SPEED_100
|
||||
#define SFF8436_CC138_FC_SPEED_200 SFF8472_CC10_FC_SPEED_200
|
||||
#define SFF8436_CC138_FC_SPEED_400 SFF8472_CC10_FC_SPEED_400
|
||||
#define SFF8436_CC138_FC_SPEED_1600 SFF8472_CC10_FC_SPEED_1600
|
||||
#define SFF8436_CC138_FC_SPEED_800 SFF8472_CC10_FC_SPEED_800
|
||||
#define SFF8436_CC138_FC_SPEED_1200 SFF8472_CC10_FC_SPEED_1200
|
||||
|
||||
#define SFF8436_CC139_8B10B 0x01
|
||||
#define SFF8436_CC139_4B5B 0x02
|
||||
#define SFF8436_CC139_NRZ 0x03
|
||||
#define SFF8436_CC139_SONET 0x04
|
||||
#define SFF8436_CC139_64B66B 0x05
|
||||
#define SFF8436_CC139_MANCHESTER 0x06
|
||||
|
||||
#define SFF8436_CC164_INF_SDR 0x01
|
||||
#define SFF8436_CC164_INF_DDR 0x02
|
||||
#define SFF8436_CC164_INF_QDR 0x04
|
||||
#define SFF8436_CC164_INF_FDR 0x08
|
||||
#define SFF8436_CC164_INF_EDR 0x10
|
||||
|
||||
#define SFF8436_RX_PWR_TYPE_MASK 0x08
|
||||
#define SFF8436_DOM_GET_RXPWR_TYPE(idprom) \
|
||||
(idprom[220] & SFF8436_RX_PWR_TYPE_MASK)
|
||||
|
||||
/* SFF8436 registers */
|
||||
#define SFF8436_CONTROL_TX_DISABLE 86
|
||||
/* alternate ways to identify pre-standard 40G cables */
|
||||
static inline int
|
||||
_sff8436_qsfp_40g_pre(const uint8_t* idprom)
|
||||
{
|
||||
/* skip if not qsfp+ */
|
||||
if (!SFF8436_MODULE_QSFP_PLUS_V2(idprom))
|
||||
return 0;
|
||||
|
||||
/* if any of the other standard bits are set, abort */
|
||||
if (SFF8436_MEDIA_40GE_CR4(idprom))
|
||||
return 0;
|
||||
if (SFF8436_MEDIA_40GE_SR4(idprom))
|
||||
return 0;
|
||||
if (SFF8436_MEDIA_40GE_LR4(idprom))
|
||||
return 0;
|
||||
if (SFF8436_MEDIA_40GE_ACTIVE(idprom))
|
||||
return 0;
|
||||
|
||||
/* since it is QSFP/QSFP+, let us assume 4 lanes */
|
||||
|
||||
/* QDR infiniband == 8G per lane, 32G total, probably 40G Ethernet
|
||||
compliant */
|
||||
if ((idprom[164] & SFF8436_CC164_INF_QDR) != 0)
|
||||
return 1;
|
||||
|
||||
/* nominal BR > 100 * 100M (10G), likely 40G Ethernet compliant */
|
||||
if (idprom[140] >= 64)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int
|
||||
_sff8436_qsfp_40g_lm4(const uint8_t* idprom)
|
||||
{
|
||||
if(!SFF8436_MODULE_QSFP_PLUS_V2(idprom)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (idprom[130] != SFF8436_CONN_LC) return 0;
|
||||
if (!SFF8436_MEDIA_NONE(idprom)) return 0;
|
||||
|
||||
if ((idprom[142] != 1) && idprom[143] != 70) {
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline int
|
||||
_sff8436_qsfp_40g_sm4(const uint8_t* idprom)
|
||||
{
|
||||
if(!SFF8436_MODULE_QSFP_PLUS_V2(idprom)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!SFF8436_MEDIA_NONE(idprom)) return 0;
|
||||
/* 850nm tx technology */
|
||||
if (idprom[147] & 0xF0) return 0;
|
||||
/* length is 200m(OM3) or 250m(OM4) */
|
||||
if ((idprom[143] != 100) && (idprom[146] != 125)) {
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline int
|
||||
_sff8436_qsfp_40g_er4(const uint8_t* idprom)
|
||||
{
|
||||
if(!SFF8436_MODULE_QSFP_PLUS_V2(idprom)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (idprom[130] != SFF8436_CONN_LC) return 0;
|
||||
if (!SFF8436_MEDIA_NONE(idprom)) return 0;
|
||||
|
||||
/* 40 kilometer SMF */
|
||||
if (idprom[142] != 40) {
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline int
|
||||
_sff8436_bitrate(const uint8_t *idprom)
|
||||
{
|
||||
if (idprom[12] == 0)
|
||||
return 0;
|
||||
if (idprom[12] == 0xFF)
|
||||
return 0;
|
||||
long long br = (long long) idprom[12] * 100*1000000;
|
||||
if ((br > 1000*1000000LL) && (br < 5*1000*1000000LL))
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int
|
||||
_sff8436_length_sm(const uint8_t *idprom)
|
||||
{
|
||||
return idprom[142] * 1000;
|
||||
}
|
||||
|
||||
static inline int
|
||||
_sff8436_length_om3(const uint8_t *idprom)
|
||||
{
|
||||
return idprom[143] * 2;
|
||||
}
|
||||
|
||||
static inline int
|
||||
_sff8436_length_om2(const uint8_t *idprom)
|
||||
{
|
||||
return idprom[144];
|
||||
}
|
||||
|
||||
static inline int
|
||||
_sff8436_length_om1(const uint8_t *idprom)
|
||||
{
|
||||
return idprom[145];
|
||||
}
|
||||
|
||||
static inline int
|
||||
_sff8436_length_copper_active(const uint8_t *idprom)
|
||||
{
|
||||
return idprom[146];
|
||||
}
|
||||
|
||||
static inline int
|
||||
_sff8436_wavelength(const uint8_t *idprom)
|
||||
{
|
||||
return ((idprom[186] << 8) | idprom[187]) / 20;
|
||||
}
|
||||
|
||||
/*
|
||||
* try to detect QSFP modules (outside of the 8436 spec)
|
||||
*/
|
||||
static inline int
|
||||
_sff8436_qsfp_40g_sr2_bidi_pre(const uint8_t *idprom)
|
||||
{
|
||||
/* module should be qsfp */
|
||||
if (!SFF8436_MODULE_QSFP_PLUS(idprom)
|
||||
&& !SFF8436_MODULE_QSFP_PLUS_V2(idprom))
|
||||
return 0;
|
||||
|
||||
/* module should have LC connector */
|
||||
if (idprom[130] != SFF8436_CONN_LC) return 0;
|
||||
|
||||
/* reject any unrelated compliance codes */
|
||||
if (SFF8436_MEDIA_XGE_LRM(idprom)) return 0;
|
||||
if (SFF8436_MEDIA_XGE_LR(idprom)) return 0;
|
||||
if (SFF8436_MEDIA_XGE_SR(idprom)) return 0;
|
||||
if (SFF8436_MEDIA_40GE_CR4(idprom)) return 0;
|
||||
|
||||
/* do *not* report SR4 compliance */
|
||||
if (SFF8436_MEDIA_40GE_SR4(idprom)) return 0;
|
||||
|
||||
if (SFF8436_MEDIA_40GE_LR4(idprom)) return 0;
|
||||
if (SFF8436_MEDIA_40GE_ACTIVE(idprom)) return 0;
|
||||
|
||||
/* make sure it's MM fiber */
|
||||
if (_sff8436_wavelength(idprom) != 850) return 0;
|
||||
|
||||
/* make sure it reports a MM cable length */
|
||||
if (_sff8436_length_sm(idprom) > 0) return 0;
|
||||
if (!_sff8436_length_om1(idprom)
|
||||
&& !_sff8436_length_om2(idprom)
|
||||
&& !_sff8436_length_om3(idprom))
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* report a BR greater than 10G...
|
||||
* for a two-fiber bidi cable we report 20G, but that is per fiber
|
||||
*/
|
||||
long long br = (long long) idprom[140] * 100 * 1000000;
|
||||
if ((br >= 20LL*1000*1000000) && (br < 40LL*1000*1000000)) return 1;
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
* non-standard Cisco/Finisar QSFP MM (AOC?)
|
||||
*/
|
||||
static inline int
|
||||
_sff8436_qsfp_40g_sr4_aoc_pre(const uint8_t *idprom)
|
||||
{
|
||||
/* module should be qsfp */
|
||||
if (!SFF8436_MODULE_QSFP_PLUS(idprom)
|
||||
&& !SFF8436_MODULE_QSFP_PLUS_V2(idprom))
|
||||
return 0;
|
||||
|
||||
/* no separable connector -- likely active */
|
||||
if (idprom[130] != SFF8436_CONN_NONE) return 0;
|
||||
|
||||
/* reject any unrelated compliance codes */
|
||||
if (SFF8436_MEDIA_XGE_LRM(idprom)) return 0;
|
||||
if (SFF8436_MEDIA_XGE_LR(idprom)) return 0;
|
||||
if (SFF8436_MEDIA_XGE_SR(idprom)) return 0;
|
||||
if (SFF8436_MEDIA_40GE_CR4(idprom)) return 0;
|
||||
|
||||
/* do *not* report SR4 compliance */
|
||||
if (SFF8436_MEDIA_40GE_SR4(idprom)) return 0;
|
||||
|
||||
if (SFF8436_MEDIA_40GE_LR4(idprom)) return 0;
|
||||
if (SFF8436_MEDIA_40GE_ACTIVE(idprom)) return 0;
|
||||
|
||||
/* make sure it's MM fiber */
|
||||
if (_sff8436_wavelength(idprom) != 850) return 0;
|
||||
|
||||
/* make sure it reports a MM cable length */
|
||||
if (_sff8436_length_sm(idprom) > 0) return 0;
|
||||
if (!_sff8436_length_om1(idprom)
|
||||
&& !_sff8436_length_om2(idprom)
|
||||
&& !_sff8436_length_om3(idprom))
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* report a BR roughly 10G (4 strands)
|
||||
*/
|
||||
long long br = (long long) idprom[140] * 100 * 1000000;
|
||||
if ((br >= 10LL*1000*1000000) && (br < 15LL*1000*1000000)) return 1;
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
* 40G AOC breakout cable, e.g. Finisar
|
||||
*/
|
||||
static inline int
|
||||
_sff8436_qsfp_40g_aoc_breakout(const uint8_t *idprom)
|
||||
{
|
||||
/* module should be qsfp */
|
||||
if (!SFF8436_MODULE_QSFP_PLUS(idprom)
|
||||
&& !SFF8436_MODULE_QSFP_PLUS_V2(idprom))
|
||||
return 0;
|
||||
|
||||
/* no separable connector -- likely active */
|
||||
if (idprom[130] != SFF8436_CONN_NONE) return 0;
|
||||
|
||||
/* no media compliance, probably active or breakout */
|
||||
if (!SFF8436_MEDIA_NONE(idprom)) return 0;
|
||||
|
||||
/* reject any 40G compliance codes */
|
||||
if (SFF8436_MEDIA_40GE_CR4(idprom)) return 0;
|
||||
if (SFF8436_MEDIA_40GE_SR4(idprom)) return 0;
|
||||
if (SFF8436_MEDIA_40GE_LR4(idprom)) return 0;
|
||||
|
||||
/* also does not report as active! Ugh. */
|
||||
if (SFF8436_MEDIA_40GE_ACTIVE(idprom)) return 0;
|
||||
|
||||
/* reject any unrelated compliance codes */
|
||||
if (SFF8436_MEDIA_XGE_LRM(idprom)) return 0;
|
||||
if (SFF8436_MEDIA_XGE_LR(idprom)) return 0;
|
||||
if (SFF8436_MEDIA_XGE_SR(idprom)) return 0;
|
||||
|
||||
/* make sure it's MM fiber */
|
||||
if (_sff8436_wavelength(idprom) != 850) return 0;
|
||||
|
||||
/* does not report a fiber length, but does report a cable length */
|
||||
if (_sff8436_length_sm(idprom) > 0) return 0;
|
||||
if (_sff8436_length_om1(idprom) > 0) return 0;
|
||||
if (_sff8436_length_om2(idprom) > 0) return 0;
|
||||
if (_sff8436_length_om3(idprom) > 0) return 0;
|
||||
if (_sff8436_length_copper_active(idprom) == 0) return 0;
|
||||
|
||||
/* maybe, possibly an AOC breakout cable */
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Infer cable length for fixed-length (AOC) optical cables
|
||||
*
|
||||
* XXX roth -- may also be able to cook up a rule for SFP+ cables too.
|
||||
*/
|
||||
static inline int
|
||||
_sff8436_qsfp_40g_aoc_length(const uint8_t *idprom)
|
||||
{
|
||||
/* module should be qsfp */
|
||||
if (!SFF8436_MODULE_QSFP_PLUS(idprom)
|
||||
&& !SFF8436_MODULE_QSFP_PLUS_V2(idprom))
|
||||
return -1;
|
||||
|
||||
/* no separable connector -- likely active */
|
||||
if (idprom[130] != SFF8436_CONN_NONE) return -1;
|
||||
|
||||
/* make sure it's MM fiber */
|
||||
if (_sff8436_wavelength(idprom) != 850) return 0;
|
||||
|
||||
/* does not report a fiber length, but does report a cable length */
|
||||
if (_sff8436_length_sm(idprom) > 0) return -1;
|
||||
if (_sff8436_length_om1(idprom) > 0) return -1;
|
||||
if (_sff8436_length_om2(idprom) > 0) return -1;
|
||||
if (_sff8436_length_om3(idprom) > 0) return -1;
|
||||
if (_sff8436_length_copper_active(idprom) > 0)
|
||||
return _sff8436_length_copper_active(idprom);
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
#endif /* __SFF_8436_H__ */
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,187 +0,0 @@
|
||||
/**********************************************************************
|
||||
*
|
||||
* 8636.h
|
||||
*
|
||||
* idprom defintions for QSFP+ modules.
|
||||
*
|
||||
**********************************************************************/
|
||||
|
||||
#ifndef __SFF_8636_H__
|
||||
#define __SFF_8636_H__
|
||||
|
||||
#include <sff/sff_config.h>
|
||||
#include "sff/8472.h"
|
||||
|
||||
/* identifier, bytes 128 page 0 (also byte 0) */
|
||||
|
||||
#define SFF8636_IDENT_UNKNOWN SFF8472_IDENT_UNKNOWN
|
||||
#define SFF8636_IDENT_GBIC SFF8472_IDENT_GBIC
|
||||
#define SFF8636_IDENT_BASEBOARD SFF8472_IDENT_BASEBOARD
|
||||
#define SFF8636_IDENT_SFP SFF8472_IDENT_SFP
|
||||
#define SFF8636_IDENT_XBI SFF8472_IDENT_XBI
|
||||
#define SFF8636_IDENT_XENPAK SFF8472_IDENT_XENPAK
|
||||
#define SFF8636_IDENT_XFP SFF8472_IDENT_XFP
|
||||
#define SFF8636_IDENT_XFF SFF8472_IDENT_XFF
|
||||
#define SFF8636_IDENT_XFPE SFF8472_IDENT_XFPE
|
||||
#define SFF8636_IDENT_XPAK SFF8472_IDENT_XPAK
|
||||
#define SFF8636_IDENT_X2 SFF8472_IDENT_X2
|
||||
#define SFF8636_IDENT_DWDM_SFP SFF8472_IDENT_DWDM_SFP
|
||||
#define SFF8636_IDENT_QSFP SFF8472_IDENT_QSFP
|
||||
|
||||
/* additional values from this spec */
|
||||
#define SFF8636_IDENT_QSFP_PLUS 0x0D
|
||||
#define SFF8636_IDENT_QSFP28 0x11
|
||||
|
||||
#define SFF8636_MODULE_QSFP28(idprom) \
|
||||
(idprom[0] == SFF8636_IDENT_QSFP28)
|
||||
|
||||
#define SFF8636_RX1_PWR(idprom) \
|
||||
(idprom[34] << 8 | idprom[34 + 1])
|
||||
#define SFF8636_RX2_PWR(idprom) \
|
||||
(idprom[36] << 8 | idprom[36 + 1])
|
||||
#define SFF8636_RX3_PWR(idprom) \
|
||||
(idprom[38] << 8 | idprom[38 + 1])
|
||||
#define SFF8636_RX4_PWR(idprom) \
|
||||
(idprom[40] << 8 | idprom[40 + 1])
|
||||
|
||||
#define SFF8636_TX1_BIAS(idprom) \
|
||||
(idprom[42] << 8 | idprom[42 + 1])
|
||||
#define SFF8636_TX2_BIAS(idprom) \
|
||||
(idprom[44] << 8 | idprom[44 + 1])
|
||||
#define SFF8636_TX3_BIAS(idprom) \
|
||||
(idprom[46] << 8 | idprom[46 + 1])
|
||||
#define SFF8636_TX4_BIAS(idprom) \
|
||||
(idprom[48] << 8 | idprom[48 + 1])
|
||||
|
||||
#define SFF8636_TX1_PWR(idprom) \
|
||||
(idprom[50] << 8 | idprom[50 + 1])
|
||||
#define SFF8636_TX2_PWR(idprom) \
|
||||
(idprom[52] << 8 | idprom[52 + 1])
|
||||
#define SFF8636_TX3_PWR(idprom) \
|
||||
(idprom[54] << 8 | idprom[54 + 1])
|
||||
#define SFF8636_TX4_PWR(idprom) \
|
||||
(idprom[56] << 8 | idprom[56 + 1])
|
||||
|
||||
#define SFF8636_SFP_VOLT(idprom) \
|
||||
(idprom[26] << 8 | idprom[26 + 1])
|
||||
#define SFF8636_SFP_TEMP(idprom) \
|
||||
(idprom[22] << 8 | idprom[22 + 1])
|
||||
|
||||
/* connector value, byte 130 page 0 */
|
||||
|
||||
#define SFF8636_CONN_UNKNOWN SFF8472_CONN_UNKNOWN
|
||||
#define SFF8636_CONN_SC SFF8472_CONN_SC
|
||||
#define SFF8636_CONN_FC1_CU SFF8472_CONN_FC1_CU
|
||||
#define SFF8636_CONN_FC2_CU SFF8472_CONN_FC2_CU
|
||||
#define SFF8636_CONN_BNC SFF8472_CONN_BNC
|
||||
#define SFF8636_CONN_FC_COAX SFF8472_CONN_FC_COAX
|
||||
#define SFF8636_CONN_FJ SFF8472_CONN_FJ
|
||||
#define SFF8636_CONN_LC SFF8472_CONN_LC
|
||||
#define SFF8636_CONN_MT_RJ SFF8472_CONN_MT_RJ
|
||||
#define SFF8636_CONN_MU SFF8472_CONN_MU
|
||||
#define SFF8636_CONN_SG SFF8472_CONN_SG
|
||||
#define SFF8636_CONN_SI_PIGTAIL SFF8472_CONN_SI_PIGTAIL
|
||||
#define SFF8636_CONN_MPO SFF8472_CONN_MPO
|
||||
#define SFF8636_CONN_HSSDC_II SFF8472_CONN_HSSDC_II
|
||||
#define SFF8636_CONN_CU_PIGTAIL SFF8472_CONN_CU_PIGTAIL
|
||||
#define SFF8636_CONN_RJ45 SFF8472_CONN_RJ45
|
||||
|
||||
/* addtional values from this spec */
|
||||
#define SFF8636_CONN_NONE 0x23
|
||||
|
||||
/* Amphenol QSFP, identified as "QSFP" (not "QSFP+") and copper
|
||||
pigtail */
|
||||
#define SFF8636_MEDIA_40GE_CR(idprom) \
|
||||
(idprom[130] == SFF8636_CONN_CU_PIGTAIL)
|
||||
|
||||
/* QSFP+ compliance codes, bytes 131-138 */
|
||||
#define SFF8636_CC131_EXTENDED 0x80
|
||||
#define SFF8636_CC131_XGE_BASE_LRM SFF8472_CC3_XGE_BASE_LRM
|
||||
#define SFF8636_CC131_XGE_BASE_LR SFF8472_CC3_XGE_BASE_LR
|
||||
#define SFF8636_CC131_XGE_BASE_SR SFF8472_CC3_XGE_BASE_SR
|
||||
#define SFF8636_CC131_40GE_BASE_CR4 0x08
|
||||
#define SFF8636_CC131_40GE_BASE_SR4 0x04
|
||||
#define SFF8636_CC131_40GE_BASE_LR4 0x02
|
||||
#define SFF8636_CC131_40GE_ACTIVE 0x01
|
||||
|
||||
#define SFF8636_MEDIA_EXTENDED(idprom) \
|
||||
((idprom[131] & SFF8636_CC131_EXTENDED) != 0)
|
||||
|
||||
#define SFF8636_MEDIA_XGE_LRM(idprom) \
|
||||
((idprom[131] & SFF8636_CC131_XGE_BASE_LRM) != 0)
|
||||
#define SFF8636_MEDIA_XGE_LR(idprom) \
|
||||
((idprom[131] & SFF8636_CC131_XGE_BASE_LR) != 0)
|
||||
#define SFF8636_MEDIA_XGE_SR(idprom) \
|
||||
((idprom[131] & SFF8636_CC131_XGE_BASE_SR) != 0)
|
||||
|
||||
#define SFF8636_MEDIA_40GE_CR4(idprom) \
|
||||
((idprom[131] & SFF8636_CC131_40GE_BASE_CR4) != 0)
|
||||
#define SFF8636_MEDIA_40GE_SR4(idprom) \
|
||||
((idprom[131] & SFF8636_CC131_40GE_BASE_SR4) != 0)
|
||||
#define SFF8636_MEDIA_40GE_LR4(idprom) \
|
||||
((idprom[131] & SFF8636_CC131_40GE_BASE_LR4) != 0)
|
||||
#define SFF8636_MEDIA_40GE_ACTIVE(idprom) \
|
||||
((idprom[131] & SFF8636_CC131_40GE_ACTIVE) != 0)
|
||||
|
||||
#define SFF8636_MEDIA_NONE(idprom) \
|
||||
(idprom[131] == 0)
|
||||
|
||||
#define SFF8636_CC192_100GE_AOC 0x01
|
||||
#define SFF8636_CC192_100GE_SR4 0x02
|
||||
#define SFF8636_CC192_100GE_LR4 0x03
|
||||
#define SFF8636_CC192_100GE_CWDM4 0x06
|
||||
#define SFF8636_CC192_100GE_PSM4 0x07
|
||||
#define SFF8636_CC192_100GE_ACC 0x08
|
||||
#define SFF8636_CC192_100GE_CR4 0x0B
|
||||
#define SFF8636_CC192_25GE_CR_S 0x0C
|
||||
#define SFF8636_CC192_25GE_CR_N 0x0D
|
||||
#define SFF8636_CC192_40GE_SWDM4 0x1F
|
||||
#define SFF8636_CC192_100GE_SWDM4 0x20
|
||||
|
||||
#define SFF8636_MEDIA_100GE_AOC(idprom) \
|
||||
(idprom[192] == SFF8636_CC192_100GE_AOC)
|
||||
#define SFF8636_MEDIA_100GE_SR4(idprom) \
|
||||
(idprom[192] == SFF8636_CC192_100GE_SR4)
|
||||
#define SFF8636_MEDIA_100GE_LR4(idprom) \
|
||||
(idprom[192] == SFF8636_CC192_100GE_LR4)
|
||||
#define SFF8636_MEDIA_100GE_CWDM4(idprom) \
|
||||
(idprom[192] == SFF8636_CC192_100GE_CWDM4)
|
||||
#define SFF8636_MEDIA_100GE_PSM4(idprom) \
|
||||
(idprom[192] == SFF8636_CC192_100GE_PSM4)
|
||||
#define SFF8636_MEDIA_100GE_CR4(idprom) \
|
||||
(idprom[192] == SFF8636_CC192_100GE_CR4)
|
||||
#define SFF8636_MEDIA_100GE_SWDM4(idprom) \
|
||||
(idprom[192] == SFF8636_CC192_100GE_SWDM4)
|
||||
#define SFF8636_MEDIA_40GE_SWDM4(idprom) \
|
||||
(idprom[192] == SFF8636_CC192_40GE_SWDM4)
|
||||
#define SFF8636_MEDIA_25GE_CR_S(idprom) \
|
||||
(idprom[192] == SFF8636_CC192_25GE_CR_S)
|
||||
#define SFF8636_MEDIA_25GE_CR_N(idprom) \
|
||||
(idprom[192] == SFF8636_CC192_25GE_CR_N)
|
||||
|
||||
#define SFF8636_RX_PWR_TYPE_MASK 0x08
|
||||
#define SFF8636_DOM_GET_RXPWR_TYPE(idprom) \
|
||||
(idprom[220] & SFF8636_RX_PWR_TYPE_MASK)
|
||||
#define SFF8636_TX_PWR_SUPPORT_MASK 0x04
|
||||
#define SFF8636_DOM_GET_TXPWR_SUPPORT(idprom) \
|
||||
(idprom[220] & SFF8636_TX_PWR_SUPPORT_MASK)
|
||||
|
||||
/*
|
||||
* Infer cable length for fixed-length (AOC) optical cables
|
||||
*
|
||||
* XXX roth -- may also be able to cook up a rule for SFP+ cables too.
|
||||
*/
|
||||
static inline int
|
||||
_sff8636_qsfp28_100g_aoc_length(const uint8_t *idprom)
|
||||
{
|
||||
/* module should be qsfp28 */
|
||||
if (!SFF8636_MODULE_QSFP28(idprom))
|
||||
return -1;
|
||||
|
||||
/* no separable connector -- likely active */
|
||||
if (idprom[130] != SFF8636_CONN_NONE) return -1;
|
||||
|
||||
return idprom[146];
|
||||
}
|
||||
|
||||
#endif /* __SFF_8636_H__ */
|
||||
@@ -1,388 +0,0 @@
|
||||
/************************************************************
|
||||
* <bsn.cl fy=2014 v=onl>
|
||||
*
|
||||
* Copyright 2014, 2015 Big Switch Networks, Inc.
|
||||
*
|
||||
* Licensed under the Eclipse Public License, Version 1.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
|
||||
* either express or implied. See the License for the specific
|
||||
* language governing permissions and limitations under the
|
||||
* License.
|
||||
*
|
||||
* </bsn.cl>
|
||||
************************************************************
|
||||
*
|
||||
*
|
||||
*
|
||||
***********************************************************/
|
||||
#ifndef __SFF_SFF_H__
|
||||
#define __SFF_SFF_H__
|
||||
|
||||
#include <sff/sff_config.h>
|
||||
#include <AIM/aim_pvs.h>
|
||||
|
||||
#include <dependmodules.x>
|
||||
|
||||
/* <auto.start.enum(ALL).header> */
|
||||
/** sff_media_type */
|
||||
typedef enum sff_media_type_e {
|
||||
SFF_MEDIA_TYPE_COPPER,
|
||||
SFF_MEDIA_TYPE_FIBER,
|
||||
SFF_MEDIA_TYPE_LAST = SFF_MEDIA_TYPE_FIBER,
|
||||
SFF_MEDIA_TYPE_COUNT,
|
||||
SFF_MEDIA_TYPE_INVALID = -1,
|
||||
} sff_media_type_t;
|
||||
|
||||
/** Strings macro. */
|
||||
#define SFF_MEDIA_TYPE_STRINGS \
|
||||
{\
|
||||
"COPPER", \
|
||||
"FIBER", \
|
||||
}
|
||||
/** Enum names. */
|
||||
const char* sff_media_type_name(sff_media_type_t e);
|
||||
|
||||
/** Enum values. */
|
||||
int sff_media_type_value(const char* str, sff_media_type_t* e, int substr);
|
||||
|
||||
/** Enum descriptions. */
|
||||
const char* sff_media_type_desc(sff_media_type_t e);
|
||||
|
||||
/** validator */
|
||||
#define SFF_MEDIA_TYPE_VALID(_e) \
|
||||
( (0 <= (_e)) && ((_e) <= SFF_MEDIA_TYPE_FIBER))
|
||||
|
||||
/** sff_media_type_map table. */
|
||||
extern aim_map_si_t sff_media_type_map[];
|
||||
/** sff_media_type_desc_map table. */
|
||||
extern aim_map_si_t sff_media_type_desc_map[];
|
||||
|
||||
/** sff_module_caps */
|
||||
typedef enum sff_module_caps_e {
|
||||
SFF_MODULE_CAPS_F_100 = 1,
|
||||
SFF_MODULE_CAPS_F_1G = 2,
|
||||
SFF_MODULE_CAPS_F_10G = 4,
|
||||
SFF_MODULE_CAPS_F_25G = 8,
|
||||
SFF_MODULE_CAPS_F_40G = 16,
|
||||
SFF_MODULE_CAPS_F_100G = 32,
|
||||
} sff_module_caps_t;
|
||||
|
||||
/** Enum names. */
|
||||
const char* sff_module_caps_name(sff_module_caps_t e);
|
||||
|
||||
/** Enum values. */
|
||||
int sff_module_caps_value(const char* str, sff_module_caps_t* e, int substr);
|
||||
|
||||
/** Enum descriptions. */
|
||||
const char* sff_module_caps_desc(sff_module_caps_t e);
|
||||
|
||||
/** Enum validator. */
|
||||
int sff_module_caps_valid(sff_module_caps_t e);
|
||||
|
||||
/** validator */
|
||||
#define SFF_MODULE_CAPS_VALID(_e) \
|
||||
(sff_module_caps_valid((_e)))
|
||||
|
||||
/** sff_module_caps_map table. */
|
||||
extern aim_map_si_t sff_module_caps_map[];
|
||||
/** sff_module_caps_desc_map table. */
|
||||
extern aim_map_si_t sff_module_caps_desc_map[];
|
||||
|
||||
/** sff_module_type */
|
||||
typedef enum sff_module_type_e {
|
||||
SFF_MODULE_TYPE_100G_AOC,
|
||||
SFF_MODULE_TYPE_100G_BASE_CR4,
|
||||
SFF_MODULE_TYPE_100G_BASE_SR4,
|
||||
SFF_MODULE_TYPE_100G_BASE_LR4,
|
||||
SFF_MODULE_TYPE_100G_CWDM4,
|
||||
SFF_MODULE_TYPE_100G_PSM4,
|
||||
SFF_MODULE_TYPE_100G_SWDM4,
|
||||
SFF_MODULE_TYPE_40G_BASE_CR4,
|
||||
SFF_MODULE_TYPE_40G_BASE_SR4,
|
||||
SFF_MODULE_TYPE_40G_BASE_LR4,
|
||||
SFF_MODULE_TYPE_40G_BASE_LM4,
|
||||
SFF_MODULE_TYPE_40G_BASE_ACTIVE,
|
||||
SFF_MODULE_TYPE_40G_BASE_CR,
|
||||
SFF_MODULE_TYPE_40G_BASE_SR2,
|
||||
SFF_MODULE_TYPE_40G_BASE_SM4,
|
||||
SFF_MODULE_TYPE_40G_BASE_ER4,
|
||||
SFF_MODULE_TYPE_25G_BASE_CR,
|
||||
SFF_MODULE_TYPE_25G_BASE_SR,
|
||||
SFF_MODULE_TYPE_25G_BASE_LR,
|
||||
SFF_MODULE_TYPE_25G_BASE_AOC,
|
||||
SFF_MODULE_TYPE_10G_BASE_SR,
|
||||
SFF_MODULE_TYPE_10G_BASE_LR,
|
||||
SFF_MODULE_TYPE_10G_BASE_LRM,
|
||||
SFF_MODULE_TYPE_10G_BASE_ER,
|
||||
SFF_MODULE_TYPE_10G_BASE_CR,
|
||||
SFF_MODULE_TYPE_10G_BASE_SX,
|
||||
SFF_MODULE_TYPE_10G_BASE_LX,
|
||||
SFF_MODULE_TYPE_10G_BASE_ZR,
|
||||
SFF_MODULE_TYPE_10G_BASE_SRL,
|
||||
SFF_MODULE_TYPE_1G_BASE_SX,
|
||||
SFF_MODULE_TYPE_1G_BASE_LX,
|
||||
SFF_MODULE_TYPE_1G_BASE_ZX,
|
||||
SFF_MODULE_TYPE_1G_BASE_CX,
|
||||
SFF_MODULE_TYPE_1G_BASE_T,
|
||||
SFF_MODULE_TYPE_100_BASE_LX,
|
||||
SFF_MODULE_TYPE_100_BASE_FX,
|
||||
SFF_MODULE_TYPE_4X_MUX,
|
||||
SFF_MODULE_TYPE_LAST = SFF_MODULE_TYPE_4X_MUX,
|
||||
SFF_MODULE_TYPE_COUNT,
|
||||
SFF_MODULE_TYPE_INVALID = -1,
|
||||
} sff_module_type_t;
|
||||
|
||||
/** Strings macro. */
|
||||
#define SFF_MODULE_TYPE_STRINGS \
|
||||
{\
|
||||
"100G_AOC", \
|
||||
"100G_BASE_CR4", \
|
||||
"100G_BASE_SR4", \
|
||||
"100G_BASE_LR4", \
|
||||
"100G_CWDM4", \
|
||||
"100G_PSM4", \
|
||||
"100G_SWDM4", \
|
||||
"40G_BASE_CR4", \
|
||||
"40G_BASE_SR4", \
|
||||
"40G_BASE_LR4", \
|
||||
"40G_BASE_LM4", \
|
||||
"40G_BASE_ACTIVE", \
|
||||
"40G_BASE_CR", \
|
||||
"40G_BASE_SR2", \
|
||||
"40G_BASE_SM4", \
|
||||
"40G_BASE_ER4", \
|
||||
"25G_BASE_CR", \
|
||||
"25G_BASE_SR", \
|
||||
"25G_BASE_LR", \
|
||||
"25G_BASE_AOC", \
|
||||
"10G_BASE_SR", \
|
||||
"10G_BASE_LR", \
|
||||
"10G_BASE_LRM", \
|
||||
"10G_BASE_ER", \
|
||||
"10G_BASE_CR", \
|
||||
"10G_BASE_SX", \
|
||||
"10G_BASE_LX", \
|
||||
"10G_BASE_ZR", \
|
||||
"10G_BASE_SRL", \
|
||||
"1G_BASE_SX", \
|
||||
"1G_BASE_LX", \
|
||||
"1G_BASE_ZX", \
|
||||
"1G_BASE_CX", \
|
||||
"1G_BASE_T", \
|
||||
"100_BASE_LX", \
|
||||
"100_BASE_FX", \
|
||||
"4X_MUX", \
|
||||
}
|
||||
/** Enum names. */
|
||||
const char* sff_module_type_name(sff_module_type_t e);
|
||||
|
||||
/** Enum values. */
|
||||
int sff_module_type_value(const char* str, sff_module_type_t* e, int substr);
|
||||
|
||||
/** Enum descriptions. */
|
||||
const char* sff_module_type_desc(sff_module_type_t e);
|
||||
|
||||
/** validator */
|
||||
#define SFF_MODULE_TYPE_VALID(_e) \
|
||||
( (0 <= (_e)) && ((_e) <= SFF_MODULE_TYPE_4X_MUX))
|
||||
|
||||
/** sff_module_type_map table. */
|
||||
extern aim_map_si_t sff_module_type_map[];
|
||||
/** sff_module_type_desc_map table. */
|
||||
extern aim_map_si_t sff_module_type_desc_map[];
|
||||
|
||||
/** sff_sfp_type */
|
||||
typedef enum sff_sfp_type_e {
|
||||
SFF_SFP_TYPE_SFP,
|
||||
SFF_SFP_TYPE_QSFP,
|
||||
SFF_SFP_TYPE_QSFP_PLUS,
|
||||
SFF_SFP_TYPE_QSFP28,
|
||||
SFF_SFP_TYPE_SFP28,
|
||||
SFF_SFP_TYPE_LAST = SFF_SFP_TYPE_SFP28,
|
||||
SFF_SFP_TYPE_COUNT,
|
||||
SFF_SFP_TYPE_INVALID = -1,
|
||||
} sff_sfp_type_t;
|
||||
|
||||
/** Strings macro. */
|
||||
#define SFF_SFP_TYPE_STRINGS \
|
||||
{\
|
||||
"SFP", \
|
||||
"QSFP", \
|
||||
"QSFP_PLUS", \
|
||||
"QSFP28", \
|
||||
"SFP28", \
|
||||
}
|
||||
/** Enum names. */
|
||||
const char* sff_sfp_type_name(sff_sfp_type_t e);
|
||||
|
||||
/** Enum values. */
|
||||
int sff_sfp_type_value(const char* str, sff_sfp_type_t* e, int substr);
|
||||
|
||||
/** Enum descriptions. */
|
||||
const char* sff_sfp_type_desc(sff_sfp_type_t e);
|
||||
|
||||
/** validator */
|
||||
#define SFF_SFP_TYPE_VALID(_e) \
|
||||
( (0 <= (_e)) && ((_e) <= SFF_SFP_TYPE_SFP28))
|
||||
|
||||
/** sff_sfp_type_map table. */
|
||||
extern aim_map_si_t sff_sfp_type_map[];
|
||||
/** sff_sfp_type_desc_map table. */
|
||||
extern aim_map_si_t sff_sfp_type_desc_map[];
|
||||
/* <auto.end.enum(ALL).header> */
|
||||
|
||||
/**
|
||||
* @brief Determine the SFP type (from the idprom data).
|
||||
* @param idprom The SFF idprom.
|
||||
*/
|
||||
sff_sfp_type_t sff_sfp_type_get(const uint8_t* idprom);
|
||||
|
||||
/**
|
||||
* @brief Determine the SFF module type (from the idprom data).
|
||||
* @param idprom The SFF idprom.
|
||||
*/
|
||||
sff_module_type_t sff_module_type_get(const uint8_t* idprom);
|
||||
|
||||
/**
|
||||
* @brief Determine the SFF Media type (from the idprom data)./
|
||||
* @param idprom The SFF idprom.
|
||||
*/
|
||||
sff_media_type_t sff_media_type_get(sff_module_type_t mt);
|
||||
|
||||
/**
|
||||
* @brief Determine the SFF module capabilities (from the idprom data).
|
||||
* @param idprom The SFF idprom.
|
||||
* @param caps [out] Receives the capabilities.
|
||||
* @returns 0 on successful parse.
|
||||
* @returns < 0 on error.
|
||||
*/
|
||||
int sff_module_caps_get(sff_module_type_t mt, uint32_t* caps);
|
||||
|
||||
|
||||
typedef struct sff_info_s {
|
||||
|
||||
/** Vendor Name */
|
||||
char vendor[17];
|
||||
|
||||
/** Model Number */
|
||||
char model[17];
|
||||
|
||||
/** Serial Number */
|
||||
char serial[17];
|
||||
|
||||
/** SFP Type */
|
||||
sff_sfp_type_t sfp_type;
|
||||
|
||||
/** SFP Type Name */
|
||||
const char* sfp_type_name;
|
||||
|
||||
/** Module Type */
|
||||
sff_module_type_t module_type;
|
||||
|
||||
/** Module Type Name */
|
||||
const char* module_type_name;
|
||||
|
||||
/** Media Type */
|
||||
sff_media_type_t media_type;
|
||||
|
||||
/** Media Type Name */
|
||||
const char* media_type_name;
|
||||
|
||||
/** Capabilities */
|
||||
sff_module_caps_t caps;
|
||||
|
||||
/** Cable length, if available */
|
||||
int length;
|
||||
char length_desc[16];
|
||||
} sff_info_t;
|
||||
|
||||
/**
|
||||
* SFF Module Information Structure
|
||||
*/
|
||||
typedef struct sff_eeprom_s {
|
||||
/** Raw eeprom data */
|
||||
uint8_t eeprom[256];
|
||||
|
||||
/** computed checksums for eeprom contents */
|
||||
uint8_t cc_base;
|
||||
uint8_t cc_ext;
|
||||
|
||||
/** Whether this EEPROM was successfully parsed and identified. */
|
||||
int identified;
|
||||
|
||||
/** Parsed SFF Information */
|
||||
sff_info_t info;
|
||||
|
||||
} sff_eeprom_t;
|
||||
|
||||
|
||||
/**
|
||||
* @brief Initialize an SFF module information structure.
|
||||
* @param rv [out] Receives the data.
|
||||
* @param eeprom Raw EEPROM data.
|
||||
* @note if eeprom is != NULL it will be copied into rv->eeprom first.
|
||||
* @note if eeprom is NULL it is assumed the rv->eeprom buffer
|
||||
* has already been initialized.
|
||||
*/
|
||||
int sff_eeprom_parse(sff_eeprom_t* rv, uint8_t* eeprom);
|
||||
|
||||
/**
|
||||
* @brief Initialize an SFF module information structure from a file.
|
||||
* @param rv [out] Receives thh data.
|
||||
* @param fname The filename.
|
||||
*/
|
||||
int sff_eeprom_parse_file(sff_eeprom_t* rv, const char* fname);
|
||||
|
||||
/**
|
||||
* @brief Clear an sff_eeprom_t structure.
|
||||
* @param eeprom The eeprom structure.
|
||||
*/
|
||||
void sff_eeprom_invalidate(sff_eeprom_t *info);
|
||||
|
||||
/**
|
||||
* @brief Determine if this is a valid SFP
|
||||
* (whether or not we can parse it)
|
||||
* @param info The info structure.
|
||||
* @param verbose Whether to report errors on invalid contents.
|
||||
*/
|
||||
int sff_eeprom_validate(sff_eeprom_t *info, int verbose);
|
||||
|
||||
/**
|
||||
* @brief Show an sff info structure.
|
||||
* @param info The info structure.
|
||||
* @param pvs The output pvs.
|
||||
*/
|
||||
void sff_info_show(sff_info_t* info, aim_pvs_t* pvs);
|
||||
|
||||
/**
|
||||
* @brief Initialize an info structure based on module type.
|
||||
*/
|
||||
int sff_info_init(sff_info_t* pinfo, sff_module_type_t type,
|
||||
const char* vendor, const char* model, const char* serial,
|
||||
int length);
|
||||
|
||||
|
||||
int sff_info_from_module_type(sff_info_t* info, sff_sfp_type_t st,
|
||||
sff_module_type_t mt);
|
||||
|
||||
#ifdef DEPENDMODULE_INCLUDE_CJSON_UTIL
|
||||
|
||||
#include <cjson_util/cjson_util.h>
|
||||
|
||||
/**
|
||||
* @brief Return a JSON representation of the sff_info_t structure.
|
||||
* @param cj Add keys this object. If NULL a new object is created.
|
||||
* @param info The info structure.
|
||||
*/
|
||||
cJSON* sff_info_json(cJSON* cj, sff_info_t* info);
|
||||
|
||||
#endif /* DEPENDMODULE_CJSON_UTIL */
|
||||
|
||||
#endif /* __SFF_SFF_H__ */
|
||||
@@ -1,119 +0,0 @@
|
||||
/**************************************************************************//**
|
||||
*
|
||||
*
|
||||
*
|
||||
*****************************************************************************/
|
||||
#include <sff/sff_config.h>
|
||||
|
||||
/* <auto.start.xmacro(ALL).define> */
|
||||
#ifdef SFF_MEDIA_TYPE_ENTRY
|
||||
SFF_MEDIA_TYPE_ENTRY(100G_AOC, 100G-AOC)
|
||||
SFF_MEDIA_TYPE_ENTRY(100G_BASE_CR4, 100GBASE-CR4)
|
||||
SFF_MEDIA_TYPE_ENTRY(100G_BASE_SR4, 100GBASE-SR4)
|
||||
SFF_MEDIA_TYPE_ENTRY(100G_BASE_LR4, 100GBASE-LR4)
|
||||
SFF_MEDIA_TYPE_ENTRY(100G_CWDM4, 100G-CWDM4)
|
||||
SFF_MEDIA_TYPE_ENTRY(100G_PSM4, 100G-PSM4)
|
||||
SFF_MEDIA_TYPE_ENTRY(100G_SWDM4, 100G-SWDM4)
|
||||
SFF_MEDIA_TYPE_ENTRY(40G_BASE_CR4, 40GBASE-CR4)
|
||||
SFF_MEDIA_TYPE_ENTRY(40G_BASE_SR4, 40GBASE-SR4)
|
||||
SFF_MEDIA_TYPE_ENTRY(40G_BASE_LR4, 40GBASE-LR4)
|
||||
SFF_MEDIA_TYPE_ENTRY(40G_BASE_LM4, 40GBASE-LM4)
|
||||
SFF_MEDIA_TYPE_ENTRY(40G_BASE_ACTIVE, 40GBASE-ACTIVE)
|
||||
SFF_MEDIA_TYPE_ENTRY(40G_BASE_CR, 40GBASE-CR)
|
||||
SFF_MEDIA_TYPE_ENTRY(40G_BASE_SR2, 40GBASE-SR2)
|
||||
SFF_MEDIA_TYPE_ENTRY(40G_BASE_SM4, 40GBASE-SM4)
|
||||
SFF_MEDIA_TYPE_ENTRY(40G_BASE_ER4, 40GBASE-ER4)
|
||||
SFF_MEDIA_TYPE_ENTRY(25G_BASE_CR, 25GBASE-CR)
|
||||
SFF_MEDIA_TYPE_ENTRY(25G_BASE_SR, 25GBASE-SR)
|
||||
SFF_MEDIA_TYPE_ENTRY(25G_BASE_LR, 25GBASE-LR)
|
||||
SFF_MEDIA_TYPE_ENTRY(25G_BASE_AOC, 25GBASE-AOC)
|
||||
SFF_MEDIA_TYPE_ENTRY(10G_BASE_SR, 10GBASE-SR)
|
||||
SFF_MEDIA_TYPE_ENTRY(10G_BASE_LR, 10GBASE-LR)
|
||||
SFF_MEDIA_TYPE_ENTRY(10G_BASE_LRM, 10GBASE-LRM)
|
||||
SFF_MEDIA_TYPE_ENTRY(10G_BASE_ER, 10GBASE-ER)
|
||||
SFF_MEDIA_TYPE_ENTRY(10G_BASE_CR, 10GBASE-CR)
|
||||
SFF_MEDIA_TYPE_ENTRY(10G_BASE_SX, 10GBASE-SX)
|
||||
SFF_MEDIA_TYPE_ENTRY(10G_BASE_LX, 10GBASE-LX)
|
||||
SFF_MEDIA_TYPE_ENTRY(10G_BASE_ZR, 10GBASE-ZR)
|
||||
SFF_MEDIA_TYPE_ENTRY(10G_BASE_SRL, 10GBASE-SRL)
|
||||
SFF_MEDIA_TYPE_ENTRY(1G_BASE_SX, 1GBASE-SX)
|
||||
SFF_MEDIA_TYPE_ENTRY(1G_BASE_LX, 1GBASE-LX)
|
||||
SFF_MEDIA_TYPE_ENTRY(1G_BASE_ZX, 1GBASE-ZX)
|
||||
SFF_MEDIA_TYPE_ENTRY(1G_BASE_CX, 1GBASE-CX)
|
||||
SFF_MEDIA_TYPE_ENTRY(1G_BASE_T, 1GBASE-T)
|
||||
SFF_MEDIA_TYPE_ENTRY(100_BASE_LX, 100BASE-LX)
|
||||
SFF_MEDIA_TYPE_ENTRY(100_BASE_FX, 100BASE-FX)
|
||||
SFF_MEDIA_TYPE_ENTRY(4X_MUX, 4X-MUX)
|
||||
#undef SFF_MEDIA_TYPE_ENTRY
|
||||
#endif
|
||||
|
||||
#ifdef SFF_MODULE_CAP_ENTRY
|
||||
SFF_MODULE_CAP_ENTRY(F_100, 1)
|
||||
SFF_MODULE_CAP_ENTRY(F_1G, 2)
|
||||
SFF_MODULE_CAP_ENTRY(F_10G, 4)
|
||||
SFF_MODULE_CAP_ENTRY(F_25G, 8)
|
||||
SFF_MODULE_CAP_ENTRY(F_40G, 16)
|
||||
SFF_MODULE_CAP_ENTRY(F_100G, 32)
|
||||
#undef SFF_MODULE_CAP_ENTRY
|
||||
#endif
|
||||
|
||||
#ifdef SFF_MODULE_TYPE_ENTRY
|
||||
SFF_MODULE_TYPE_ENTRY(100G_AOC, 100G-AOC)
|
||||
SFF_MODULE_TYPE_ENTRY(100G_BASE_CR4, 100GBASE-CR4)
|
||||
SFF_MODULE_TYPE_ENTRY(100G_BASE_SR4, 100GBASE-SR4)
|
||||
SFF_MODULE_TYPE_ENTRY(100G_BASE_LR4, 100GBASE-LR4)
|
||||
SFF_MODULE_TYPE_ENTRY(100G_CWDM4, 100G-CWDM4)
|
||||
SFF_MODULE_TYPE_ENTRY(100G_PSM4, 100G-PSM4)
|
||||
SFF_MODULE_TYPE_ENTRY(100G_SWDM4, 100G-SWDM4)
|
||||
SFF_MODULE_TYPE_ENTRY(40G_BASE_CR4, 40GBASE-CR4)
|
||||
SFF_MODULE_TYPE_ENTRY(40G_BASE_SR4, 40GBASE-SR4)
|
||||
SFF_MODULE_TYPE_ENTRY(40G_BASE_LR4, 40GBASE-LR4)
|
||||
SFF_MODULE_TYPE_ENTRY(40G_BASE_LM4, 40GBASE-LM4)
|
||||
SFF_MODULE_TYPE_ENTRY(40G_BASE_ACTIVE, 40GBASE-ACTIVE)
|
||||
SFF_MODULE_TYPE_ENTRY(40G_BASE_CR, 40GBASE-CR)
|
||||
SFF_MODULE_TYPE_ENTRY(40G_BASE_SR2, 40GBASE-SR2)
|
||||
SFF_MODULE_TYPE_ENTRY(40G_BASE_SM4, 40GBASE-SM4)
|
||||
SFF_MODULE_TYPE_ENTRY(40G_BASE_ER4, 40GBASE-ER4)
|
||||
SFF_MODULE_TYPE_ENTRY(25G_BASE_CR, 25GBASE-CR)
|
||||
SFF_MODULE_TYPE_ENTRY(25G_BASE_SR, 25GBASE-SR)
|
||||
SFF_MODULE_TYPE_ENTRY(25G_BASE_LR, 25GBASE-LR)
|
||||
SFF_MODULE_TYPE_ENTRY(25G_BASE_AOC, 25GBASE-AOC)
|
||||
SFF_MODULE_TYPE_ENTRY(10G_BASE_SR, 10GBASE-SR)
|
||||
SFF_MODULE_TYPE_ENTRY(10G_BASE_LR, 10GBASE-LR)
|
||||
SFF_MODULE_TYPE_ENTRY(10G_BASE_LRM, 10GBASE-LRM)
|
||||
SFF_MODULE_TYPE_ENTRY(10G_BASE_ER, 10GBASE-ER)
|
||||
SFF_MODULE_TYPE_ENTRY(10G_BASE_CR, 10GBASE-CR)
|
||||
SFF_MODULE_TYPE_ENTRY(10G_BASE_SX, 10GBASE-SX)
|
||||
SFF_MODULE_TYPE_ENTRY(10G_BASE_LX, 10GBASE-LX)
|
||||
SFF_MODULE_TYPE_ENTRY(10G_BASE_ZR, 10GBASE-ZR)
|
||||
SFF_MODULE_TYPE_ENTRY(10G_BASE_SRL, 10GBASE-SRL)
|
||||
SFF_MODULE_TYPE_ENTRY(1G_BASE_SX, 1GBASE-SX)
|
||||
SFF_MODULE_TYPE_ENTRY(1G_BASE_LX, 1GBASE-LX)
|
||||
SFF_MODULE_TYPE_ENTRY(1G_BASE_ZX, 1GBASE-ZX)
|
||||
SFF_MODULE_TYPE_ENTRY(1G_BASE_CX, 1GBASE-CX)
|
||||
SFF_MODULE_TYPE_ENTRY(1G_BASE_T, 1GBASE-T)
|
||||
SFF_MODULE_TYPE_ENTRY(100_BASE_LX, 100BASE-LX)
|
||||
SFF_MODULE_TYPE_ENTRY(100_BASE_FX, 100BASE-FX)
|
||||
SFF_MODULE_TYPE_ENTRY(4X_MUX, 4X-MUX)
|
||||
#undef SFF_MODULE_TYPE_ENTRY
|
||||
#endif
|
||||
|
||||
#ifdef SFF_SFP_TYPE_ENTRY
|
||||
SFF_SFP_TYPE_ENTRY(SFP, SFP)
|
||||
SFF_SFP_TYPE_ENTRY(QSFP, QSFP)
|
||||
SFF_SFP_TYPE_ENTRY(QSFP_PLUS, QSFP+)
|
||||
SFF_SFP_TYPE_ENTRY(QSFP28, QSFP28)
|
||||
SFF_SFP_TYPE_ENTRY(SFP28, SFP28)
|
||||
#undef SFF_SFP_TYPE_ENTRY
|
||||
#endif
|
||||
/* <auto.end.xmacro(ALL).define> */
|
||||
|
||||
/* <auto.start.xenum(ALL).define> */
|
||||
#ifdef SFF_ENUMERATION_ENTRY
|
||||
SFF_ENUMERATION_ENTRY(sff_media_type, "")
|
||||
SFF_ENUMERATION_ENTRY(sff_module_caps, "")
|
||||
SFF_ENUMERATION_ENTRY(sff_module_type, "")
|
||||
SFF_ENUMERATION_ENTRY(sff_sfp_type, "")
|
||||
#undef SFF_ENUMERATION_ENTRY
|
||||
#endif
|
||||
/* <auto.end.xenum(ALL).define> */
|
||||
@@ -1,157 +0,0 @@
|
||||
/**************************************************************************//**
|
||||
*
|
||||
* @file
|
||||
* @brief sff Configuration Header
|
||||
*
|
||||
* @addtogroup sff-config
|
||||
* @{
|
||||
*
|
||||
*****************************************************************************/
|
||||
#ifndef __SFF_CONFIG_H__
|
||||
#define __SFF_CONFIG_H__
|
||||
|
||||
#ifdef GLOBAL_INCLUDE_CUSTOM_CONFIG
|
||||
#include <global_custom_config.h>
|
||||
#endif
|
||||
#ifdef SFF_INCLUDE_CUSTOM_CONFIG
|
||||
#include <sff_custom_config.h>
|
||||
#endif
|
||||
|
||||
/* <auto.start.cdefs(SFF_CONFIG_HEADER).header> */
|
||||
#include <AIM/aim.h>
|
||||
/**
|
||||
* SFF_CONFIG_INCLUDE_LOGGING
|
||||
*
|
||||
* Include or exclude logging. */
|
||||
|
||||
|
||||
#ifndef SFF_CONFIG_INCLUDE_LOGGING
|
||||
#define SFF_CONFIG_INCLUDE_LOGGING 1
|
||||
#endif
|
||||
|
||||
/**
|
||||
* SFF_CONFIG_LOG_OPTIONS_DEFAULT
|
||||
*
|
||||
* Default enabled log options. */
|
||||
|
||||
|
||||
#ifndef SFF_CONFIG_LOG_OPTIONS_DEFAULT
|
||||
#define SFF_CONFIG_LOG_OPTIONS_DEFAULT AIM_LOG_OPTIONS_DEFAULT
|
||||
#endif
|
||||
|
||||
/**
|
||||
* SFF_CONFIG_LOG_BITS_DEFAULT
|
||||
*
|
||||
* Default enabled log bits. */
|
||||
|
||||
|
||||
#ifndef SFF_CONFIG_LOG_BITS_DEFAULT
|
||||
#define SFF_CONFIG_LOG_BITS_DEFAULT AIM_LOG_BITS_DEFAULT
|
||||
#endif
|
||||
|
||||
/**
|
||||
* SFF_CONFIG_LOG_CUSTOM_BITS_DEFAULT
|
||||
*
|
||||
* Default enabled custom log bits. */
|
||||
|
||||
|
||||
#ifndef SFF_CONFIG_LOG_CUSTOM_BITS_DEFAULT
|
||||
#define SFF_CONFIG_LOG_CUSTOM_BITS_DEFAULT 0
|
||||
#endif
|
||||
|
||||
/**
|
||||
* SFF_CONFIG_PORTING_STDLIB
|
||||
*
|
||||
* Default all porting macros to use the C standard libraries. */
|
||||
|
||||
|
||||
#ifndef SFF_CONFIG_PORTING_STDLIB
|
||||
#define SFF_CONFIG_PORTING_STDLIB 1
|
||||
#endif
|
||||
|
||||
/**
|
||||
* SFF_CONFIG_PORTING_INCLUDE_STDLIB_HEADERS
|
||||
*
|
||||
* Include standard library headers for stdlib porting macros. */
|
||||
|
||||
|
||||
#ifndef SFF_CONFIG_PORTING_INCLUDE_STDLIB_HEADERS
|
||||
#define SFF_CONFIG_PORTING_INCLUDE_STDLIB_HEADERS SFF_CONFIG_PORTING_STDLIB
|
||||
#endif
|
||||
|
||||
/**
|
||||
* SFF_CONFIG_INCLUDE_UCLI
|
||||
*
|
||||
* Include generic uCli support. */
|
||||
|
||||
|
||||
#ifndef SFF_CONFIG_INCLUDE_UCLI
|
||||
#define SFF_CONFIG_INCLUDE_UCLI 0
|
||||
#endif
|
||||
|
||||
/**
|
||||
* SFF_CONFIG_INCLUDE_SFF_TOOL
|
||||
*
|
||||
* Include the SFF tool main entry point. */
|
||||
|
||||
|
||||
#ifndef SFF_CONFIG_INCLUDE_SFF_TOOL
|
||||
#define SFF_CONFIG_INCLUDE_SFF_TOOL 0
|
||||
#endif
|
||||
|
||||
/**
|
||||
* SFF_CONFIG_INCLUDE_EXT_CC_CHECK
|
||||
*
|
||||
* Include extended checksum verification. */
|
||||
|
||||
|
||||
#ifndef SFF_CONFIG_INCLUDE_EXT_CC_CHECK
|
||||
#define SFF_CONFIG_INCLUDE_EXT_CC_CHECK 0
|
||||
#endif
|
||||
|
||||
/**
|
||||
* SFF_CONFIG_INCLUDE_DATABASE
|
||||
*
|
||||
* Include eeprom database. */
|
||||
|
||||
|
||||
#ifndef SFF_CONFIG_INCLUDE_DATABASE
|
||||
#define SFF_CONFIG_INCLUDE_DATABASE 1
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* All compile time options can be queried or displayed
|
||||
*/
|
||||
|
||||
/** Configuration settings structure. */
|
||||
typedef struct sff_config_settings_s {
|
||||
/** name */
|
||||
const char* name;
|
||||
/** value */
|
||||
const char* value;
|
||||
} sff_config_settings_t;
|
||||
|
||||
/** Configuration settings table. */
|
||||
/** sff_config_settings table. */
|
||||
extern sff_config_settings_t sff_config_settings[];
|
||||
|
||||
/**
|
||||
* @brief Lookup a configuration setting.
|
||||
* @param setting The name of the configuration option to lookup.
|
||||
*/
|
||||
const char* sff_config_lookup(const char* setting);
|
||||
|
||||
/**
|
||||
* @brief Show the compile-time configuration.
|
||||
* @param pvs The output stream.
|
||||
*/
|
||||
int sff_config_show(struct aim_pvs_s* pvs);
|
||||
|
||||
/* <auto.end.cdefs(SFF_CONFIG_HEADER).header> */
|
||||
|
||||
#include "sff_porting.h"
|
||||
|
||||
#endif /* __SFF_CONFIG_H__ */
|
||||
/* @} */
|
||||
@@ -1,60 +0,0 @@
|
||||
/************************************************************
|
||||
* <bsn.cl fy=2014 v=onl>
|
||||
*
|
||||
* Copyright 2014, 2015 Big Switch Networks, Inc.
|
||||
*
|
||||
* Licensed under the Eclipse Public License, Version 1.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
|
||||
* either express or implied. See the License for the specific
|
||||
* language governing permissions and limitations under the
|
||||
* License.
|
||||
*
|
||||
* </bsn.cl>
|
||||
************************************************************
|
||||
*
|
||||
*
|
||||
*
|
||||
***********************************************************/
|
||||
#ifndef __SFF_DB_H__
|
||||
#define __SFF_DB_H__
|
||||
|
||||
#include <sff/sff_config.h>
|
||||
#include <sff/sff.h>
|
||||
#include <AIM/aim_pvs.h>
|
||||
|
||||
typedef struct {
|
||||
sff_eeprom_t se;
|
||||
} sff_db_entry_t;
|
||||
|
||||
/**
|
||||
* @brief Get the database entry table.
|
||||
* @param entries Receives the table pointer.
|
||||
* @param count Receives the size of the table.
|
||||
*/
|
||||
int sff_db_get(sff_db_entry_t** entries, int* count);
|
||||
|
||||
/**
|
||||
* @brief Return any entry with the given module type.
|
||||
* @param se Receives the information struct.
|
||||
* @param type The type to retreive.
|
||||
*/
|
||||
int sff_db_get_type(sff_eeprom_t* se, sff_module_type_t type);
|
||||
|
||||
|
||||
/**
|
||||
* @brief Output the given SFF information to a database entry.
|
||||
* @param info The source information.
|
||||
* @param pvs The output pvs.;
|
||||
* @note This is used mainly for generating new entries for the SFF db from a running system.
|
||||
*/
|
||||
int sff_db_entry_struct(sff_eeprom_t* se, aim_pvs_t* pvs);
|
||||
|
||||
#endif /* __SFF_DB_H__ */
|
||||
|
||||
@@ -1,26 +0,0 @@
|
||||
/**************************************************************************//**
|
||||
*
|
||||
* sff Doxygen Header
|
||||
*
|
||||
*****************************************************************************/
|
||||
#ifndef __SFF_DOX_H__
|
||||
#define __SFF_DOX_H__
|
||||
|
||||
/**
|
||||
* @defgroup sff sff - sff Description
|
||||
*
|
||||
|
||||
The documentation overview for this module should go here.
|
||||
|
||||
*
|
||||
* @{
|
||||
*
|
||||
* @defgroup sff-sff Public Interface
|
||||
* @defgroup sff-config Compile Time Configuration
|
||||
* @defgroup sff-porting Porting Macros
|
||||
*
|
||||
* @}
|
||||
*
|
||||
*/
|
||||
|
||||
#endif /* __SFF_DOX_H__ */
|
||||
@@ -1,87 +0,0 @@
|
||||
/**************************************************************************//**
|
||||
*
|
||||
* @file
|
||||
* @brief sff Porting Macros.
|
||||
*
|
||||
* @addtogroup sff-porting
|
||||
* @{
|
||||
*
|
||||
*****************************************************************************/
|
||||
#ifndef __SFF_PORTING_H__
|
||||
#define __SFF_PORTING_H__
|
||||
|
||||
|
||||
/* <auto.start.portingmacro(ALL).define> */
|
||||
#if SFF_CONFIG_PORTING_INCLUDE_STDLIB_HEADERS == 1
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdarg.h>
|
||||
#include <memory.h>
|
||||
#endif
|
||||
|
||||
#ifndef SFF_MEMSET
|
||||
#if defined(GLOBAL_MEMSET)
|
||||
#define SFF_MEMSET GLOBAL_MEMSET
|
||||
#elif SFF_CONFIG_PORTING_STDLIB == 1
|
||||
#define SFF_MEMSET memset
|
||||
#else
|
||||
#error The macro SFF_MEMSET is required but cannot be defined.
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef SFF_MEMCPY
|
||||
#if defined(GLOBAL_MEMCPY)
|
||||
#define SFF_MEMCPY GLOBAL_MEMCPY
|
||||
#elif SFF_CONFIG_PORTING_STDLIB == 1
|
||||
#define SFF_MEMCPY memcpy
|
||||
#else
|
||||
#error The macro SFF_MEMCPY is required but cannot be defined.
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef SFF_STRNCPY
|
||||
#if defined(GLOBAL_STRNCPY)
|
||||
#define SFF_STRNCPY GLOBAL_STRNCPY
|
||||
#elif SFF_CONFIG_PORTING_STDLIB == 1
|
||||
#define SFF_STRNCPY strncpy
|
||||
#else
|
||||
#error The macro SFF_STRNCPY is required but cannot be defined.
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef SFF_STRNCMP
|
||||
#if defined(GLOBAL_STRNCMP)
|
||||
#define SFF_STRNCMP GLOBAL_STRNCMP
|
||||
#elif SFF_CONFIG_PORTING_STDLIB == 1
|
||||
#define SFF_STRNCMP strncmp
|
||||
#else
|
||||
#error The macro SFF_STRNCMP is required but cannot be defined.
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef SFF_STRLEN
|
||||
#if defined(GLOBAL_STRLEN)
|
||||
#define SFF_STRLEN GLOBAL_STRLEN
|
||||
#elif SFF_CONFIG_PORTING_STDLIB == 1
|
||||
#define SFF_STRLEN strlen
|
||||
#else
|
||||
#error The macro SFF_STRLEN is required but cannot be defined.
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef SFF_SNPRINTF
|
||||
#if defined(GLOBAL_SNPRINTF)
|
||||
#define SFF_SNPRINTF GLOBAL_SNPRINTF
|
||||
#elif SFF_CONFIG_PORTING_STDLIB == 1
|
||||
#define SFF_SNPRINTF snprintf
|
||||
#else
|
||||
#error The macro SFF_SNPRINTF is required but cannot be defined.
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* <auto.end.portingmacro(ALL).define> */
|
||||
|
||||
|
||||
#endif /* __SFF_PORTING_H__ */
|
||||
/* @} */
|
||||
@@ -1,34 +0,0 @@
|
||||
"""__init__.py
|
||||
|
||||
Module init for onlp/sff
|
||||
"""
|
||||
|
||||
from onlp.sff.enums import *
|
||||
|
||||
import ctypes
|
||||
|
||||
sff_media_type = ctypes.c_int
|
||||
sff_module_caps = ctypes.c_int
|
||||
sff_module_type = ctypes.c_int
|
||||
sff_sfp_type = ctypes.c_int
|
||||
|
||||
class sff_info(ctypes.Structure):
|
||||
_fields_ = [("vendor", ctypes.c_char * 17),
|
||||
("model", ctypes.c_char * 17),
|
||||
("serial", ctypes.c_char * 17),
|
||||
("sfp_type", sff_sfp_type),
|
||||
("sfp_type_name", ctypes.c_char_p),
|
||||
("module_type", sff_module_type),
|
||||
("module_type_name", ctypes.c_char_p),
|
||||
("media_type", sff_media_type),
|
||||
("media_type_name", ctypes.c_char_p),
|
||||
("caps", sff_module_caps),
|
||||
("length", ctypes.c_int),
|
||||
("desc", ctypes.c_char * 16),]
|
||||
|
||||
class sff_eeprom(ctypes.Structure):
|
||||
_fields_ = [("eeprom", ctypes.c_ubyte * 256),
|
||||
("cc_base", ctypes.c_ubyte),
|
||||
("cc_ext", ctypes.c_ubyte),
|
||||
("identified", ctypes.c_int),
|
||||
("info", sff_info),]
|
||||
@@ -1,76 +0,0 @@
|
||||
"""enums.py
|
||||
|
||||
Enumerations from the SFF auto.yml.
|
||||
"""
|
||||
|
||||
class Enumeration(object):
|
||||
@classmethod
|
||||
def name(klass, value):
|
||||
for (k, v) in klass.__dict__.iteritems():
|
||||
if v == value:
|
||||
return k
|
||||
return None
|
||||
|
||||
# <auto.start.pyenum(ALL).define>
|
||||
class SFF_MEDIA_TYPE(Enumeration):
|
||||
COPPER = 0
|
||||
FIBER = 1
|
||||
|
||||
|
||||
class SFF_MODULE_CAPS(Enumeration):
|
||||
F_100 = 1
|
||||
F_1G = 2
|
||||
F_10G = 4
|
||||
F_25G = 8
|
||||
F_40G = 16
|
||||
F_100G = 32
|
||||
|
||||
|
||||
class SFF_MODULE_TYPE(Enumeration):
|
||||
_100G_AOC = 0
|
||||
_100G_BASE_CR4 = 1
|
||||
_100G_BASE_SR4 = 2
|
||||
_100G_BASE_LR4 = 3
|
||||
_100G_CWDM4 = 4
|
||||
_100G_PSM4 = 5
|
||||
_100G_SWDM4 = 6
|
||||
_40G_BASE_CR4 = 7
|
||||
_40G_BASE_SR4 = 8
|
||||
_40G_BASE_LR4 = 9
|
||||
_40G_BASE_LM4 = 10
|
||||
_40G_BASE_ACTIVE = 11
|
||||
_40G_BASE_CR = 12
|
||||
_40G_BASE_SR2 = 13
|
||||
_40G_BASE_SM4 = 14
|
||||
_40G_BASE_ER4 = 15
|
||||
_25G_BASE_CR = 16
|
||||
_25G_BASE_SR = 17
|
||||
_25G_BASE_LR = 18
|
||||
_25G_BASE_AOC = 19
|
||||
_10G_BASE_SR = 20
|
||||
_10G_BASE_LR = 21
|
||||
_10G_BASE_LRM = 22
|
||||
_10G_BASE_ER = 23
|
||||
_10G_BASE_CR = 24
|
||||
_10G_BASE_SX = 25
|
||||
_10G_BASE_LX = 26
|
||||
_10G_BASE_ZR = 27
|
||||
_10G_BASE_SRL = 28
|
||||
_1G_BASE_SX = 29
|
||||
_1G_BASE_LX = 30
|
||||
_1G_BASE_ZX = 31
|
||||
_1G_BASE_CX = 32
|
||||
_1G_BASE_T = 33
|
||||
_100_BASE_LX = 34
|
||||
_100_BASE_FX = 35
|
||||
_4X_MUX = 36
|
||||
|
||||
|
||||
class SFF_SFP_TYPE(Enumeration):
|
||||
SFP = 0
|
||||
QSFP = 1
|
||||
QSFP_PLUS = 2
|
||||
QSFP28 = 3
|
||||
SFP28 = 4
|
||||
|
||||
# <auto.end.pyenum(ALL).define>
|
||||
@@ -1,328 +0,0 @@
|
||||
/************************************************************
|
||||
* <bsn.cl fy=2014 v=onl>
|
||||
*
|
||||
* Copyright 2014, 2015 Big Switch Networks, Inc.
|
||||
*
|
||||
* Licensed under the Eclipse Public License, Version 1.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
|
||||
* either express or implied. See the License for the specific
|
||||
* language governing permissions and limitations under the
|
||||
* License.
|
||||
*
|
||||
* </bsn.cl>
|
||||
************************************************************
|
||||
*
|
||||
*
|
||||
*
|
||||
***********************************************************/
|
||||
#include <sff/8472.h>
|
||||
|
||||
#if 0
|
||||
|
||||
/*
|
||||
* some CR cables identify as infiniband copper
|
||||
* some CR cables identify as FC twinax
|
||||
* some CR cables identify their electrical compliance
|
||||
* using bytes 60,61
|
||||
* some CR cables identify as FC electrical intra-
|
||||
* or inter-enclosure (bytes 7, 8)
|
||||
*/
|
||||
|
||||
int
|
||||
sff8472_inf_1x(const uint8_t* idprom)
|
||||
{
|
||||
if ((idprom[3] & SFF8472_CC3_INF_1X_CU_PASSIVE) != 0) return 1;
|
||||
if ((idprom[3] & SFF8472_CC3_INF_1X_CU_ACTIVE) != 0) return 1;
|
||||
if ((idprom[3] & SFF8472_CC3_INF_1X_LX) != 0) return 1;
|
||||
if ((idprom[3] & SFF8472_CC3_INF_1X_SX) != 0) return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
sff8472_inf_1x_cu_active(const uint8_t* idprom)
|
||||
{
|
||||
if ((idprom[3] & SFF8472_CC3_INF_1X_CU_PASSIVE) != 0) return 0;
|
||||
if ((idprom[3] & SFF8472_CC3_INF_1X_LX) != 0) return 0;
|
||||
if ((idprom[3] & SFF8472_CC3_INF_1X_SX) != 0) return 0;
|
||||
|
||||
if ((idprom[3] & SFF8472_CC3_INF_1X_CU_ACTIVE) != 0) return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
sff8472_inf_1x_cu_passive(const uint8_t* idprom)
|
||||
{
|
||||
if ((idprom[3] & SFF8472_CC3_INF_1X_CU_ACTIVE) != 0) return 0;
|
||||
if ((idprom[3] & SFF8472_CC3_INF_1X_LX) != 0) return 0;
|
||||
if ((idprom[3] & SFF8472_CC3_INF_1X_SX) != 0) return 0;
|
||||
|
||||
if ((idprom[3] & SFF8472_CC3_INF_1X_CU_PASSIVE) != 0) return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
sff8472_fc_media(const uint8_t* idprom)
|
||||
{
|
||||
if ((idprom[9] & SFF8472_CC9_FC_MEDIA_SM) != 0) return 1;
|
||||
if ((idprom[9] & SFF8472_CC9_FC_MEDIA_M5) != 0) return 1;
|
||||
if ((idprom[9] & SFF8472_CC9_FC_MEDIA_M6) != 0) return 1;
|
||||
if ((idprom[9] & SFF8472_CC9_FC_MEDIA_TV) != 0) return 1;
|
||||
if ((idprom[9] & SFF8472_CC9_FC_MEDIA_MI) != 0) return 1;
|
||||
if ((idprom[9] & SFF8472_CC9_FC_MEDIA_TP) != 0) return 1;
|
||||
if ((idprom[9] & SFF8472_CC9_FC_MEDIA_TW) != 0) return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
sff8472_fc_media_tw(const uint8_t* idprom)
|
||||
{
|
||||
if ((idprom[9] & SFF8472_CC9_FC_MEDIA_SM) != 0) return 0;
|
||||
if ((idprom[9] & SFF8472_CC9_FC_MEDIA_M5) != 0) return 0;
|
||||
if ((idprom[9] & SFF8472_CC9_FC_MEDIA_M6) != 0) return 0;
|
||||
if ((idprom[9] & SFF8472_CC9_FC_MEDIA_TV) != 0) return 0;
|
||||
if ((idprom[9] & SFF8472_CC9_FC_MEDIA_MI) != 0) return 0;
|
||||
if ((idprom[9] & SFF8472_CC9_FC_MEDIA_TP) != 0) return 0;
|
||||
|
||||
if ((idprom[9] & SFF8472_CC9_FC_MEDIA_TW) != 0) return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
sff8472_tech_fc(const uint8_t* idprom)
|
||||
{
|
||||
if ((idprom[7] & SFF8472_CC7_FC_TECH_EL) != 0) return 1;
|
||||
if ((idprom[7] & SFF8472_CC7_FC_TECH_LC) != 0) return 1;
|
||||
if ((idprom[7] & SFF8472_CC7_FC_TECH_SA) != 0) return 1;
|
||||
if ((idprom[8] & SFF8472_CC8_FC_TECH_EL) != 0) return 1;
|
||||
if ((idprom[8] & SFF8472_CC8_FC_TECH_LL) != 0) return 1;
|
||||
if ((idprom[8] & SFF8472_CC8_FC_TECH_SL) != 0) return 1;
|
||||
if ((idprom[8] & SFF8472_CC8_FC_TECH_SN) != 0) return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
sff8472_tech_fc_el(const uint8_t* idprom)
|
||||
{
|
||||
/* non-EL types */
|
||||
if ((idprom[7] & SFF8472_CC7_FC_TECH_LC) != 0) return 0;
|
||||
if ((idprom[7] & SFF8472_CC7_FC_TECH_SA) != 0) return 0;
|
||||
if ((idprom[8] & SFF8472_CC8_FC_TECH_LL) != 0) return 0;
|
||||
if ((idprom[8] & SFF8472_CC8_FC_TECH_SL) != 0) return 0;
|
||||
if ((idprom[8] & SFF8472_CC8_FC_TECH_SN) != 0) return 0;
|
||||
|
||||
if (((idprom[7] & SFF8472_CC7_FC_TECH_EL) != 0)
|
||||
&& ((idprom[8] & SFF8472_CC8_FC_TECH_EL) == 0))
|
||||
return 1;
|
||||
if (((idprom[7] & SFF8472_CC7_FC_TECH_EL) == 0)
|
||||
&& ((idprom[8] & SFF8472_CC8_FC_TECH_EL) != 0))
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* do not specify an FC speed code unless you actually FC */
|
||||
int
|
||||
sff8472_fc_speed_ok(const uint8_t* idprom)
|
||||
{
|
||||
if (_sff8472_tech_fc(idprom)
|
||||
&& (idprom[10] != 0))
|
||||
return 1;
|
||||
if (!_sff8472_tech_fc(idprom)
|
||||
&& (idprom[10] == 0))
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* XXX roth
|
||||
* some CR cables do not list an SFP+ active/passive bit,
|
||||
* but register as active or passive via infiniband instead
|
||||
*/
|
||||
|
||||
int
|
||||
sff8472_sfp_plus_passive(const uint8_t* idprom)
|
||||
{
|
||||
if ((idprom[8] & SFF8472_CC8_SFP_PASSIVE) != 0) return 1;
|
||||
|
||||
/* also allow pre-standard cables identifying as infiniband */
|
||||
if (_sff8472_inf_1x_cu_passive(idprom)) return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
sff8472_sfp_plus_active(const uint8_t* idprom)
|
||||
{
|
||||
if ((idprom[8] & SFF8472_CC8_SFP_ACTIVE) != 0) return 1;
|
||||
|
||||
/* also allow pre-standard cables identifying as infiniband */
|
||||
if (_sff8472_inf_1x_cu_active(idprom)) return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* XXX roth
|
||||
* some pre-standard CR cables report a "wavelength"
|
||||
* in byte 60, 61, pretending to be an optical module
|
||||
*/
|
||||
|
||||
#define _SFF8472_WAVELENGTH(idprom) \
|
||||
((idprom[60] << 8) | idprom[61])
|
||||
|
||||
#define _SFF8472_COMPLIANCE_UNSPEC(idprom) \
|
||||
((idprom[60] == 0) \
|
||||
&& (idprom[61] == 0))
|
||||
|
||||
#define _SFF8472_COMPLIANCE_PASSIVE_FC(idprom) \
|
||||
(((idprom[60] & SFF8471_CC60_FC_PI_4) != 0) \
|
||||
&& (idprom[61] == 0))
|
||||
|
||||
#define _SFF8472_COMPLIANCE_PASSIVE_SFF(idprom) \
|
||||
(((idprom[60] & SFF8471_CC60_SFF8431) != 0) \
|
||||
&& (idprom[61] == 0))
|
||||
|
||||
#define _SFF8472_COMPLIANCE_ACTIVE_FC(idprom) \
|
||||
((((idprom[60] & SFF8471_CC60_FC_PI_4) != 0) \
|
||||
|| (idprom[60] & SFF8471_CC60_FC_PI_4_LIMITING) != 0) \
|
||||
&& (idprom[61] == 0))
|
||||
|
||||
#define _SFF8472_COMPLIANCE_ACTIVE_SFF(idprom) \
|
||||
((((idprom[60] & SFF8471_CC60_SFF8431) != 0) \
|
||||
|| (idprom[60] & SFF8471_CC60_SFF8431_LIMITING) != 0) \
|
||||
&& (idprom[61] == 0))
|
||||
|
||||
/*
|
||||
* Cisco pre-standard CR cables
|
||||
*/
|
||||
int
|
||||
sff8472_hack_cr(const uint8_t* idprom)
|
||||
{
|
||||
/* vendor is 'OEM' */
|
||||
if (SFF_STRNCMP((char*)idprom+20, "OEM ", 4) != 0) return 0;
|
||||
|
||||
/* model reads like 'SFP-H10GB-CU...' */
|
||||
if (SFF_STRNCMP((char*)idprom+40, "SFP-H10GB-CU", 12) != 0) return 0;
|
||||
|
||||
/* S/N reads like 'CSC...' */
|
||||
if (SFF_STRNCMP((char*)idprom+68, "CSC", 3) != 0) return 0;
|
||||
|
||||
/*
|
||||
* congratulations, you have an expensive Cisco
|
||||
* pre-standard CR cable.
|
||||
*/
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* grab-bag to detect pre-standard CR media */
|
||||
int
|
||||
sff8472_media_cr_passive(const uint8_t* idprom)
|
||||
{
|
||||
int maybe = 0;
|
||||
|
||||
if (_sff8472_inf_1x_cu_passive(idprom))
|
||||
maybe = 1;
|
||||
else if (_sff8472_inf_1x(idprom))
|
||||
return 0;
|
||||
|
||||
if (_sff8472_tech_fc_el(idprom))
|
||||
maybe = 1;
|
||||
else if (_sff8472_tech_fc(idprom))
|
||||
return 0;
|
||||
|
||||
if (idprom[4] != 0) return 0;
|
||||
if (idprom[5] != 0) return 0;
|
||||
if (idprom[6] != 0) return 0;
|
||||
|
||||
if (_sff8472_sfp_plus_passive(idprom))
|
||||
maybe = 1;
|
||||
|
||||
if (_sff8472_fc_media_tw(idprom))
|
||||
maybe = 1;
|
||||
else if (_sff8472_fc_media(idprom))
|
||||
return 0;
|
||||
|
||||
if (!_sff8472_fc_speed_ok(idprom))
|
||||
return 0;
|
||||
|
||||
if (_sff8472_hack_cr(idprom))
|
||||
maybe = 1;
|
||||
|
||||
if (maybe) {
|
||||
if (!_SFF8472_COMPLIANCE_PASSIVE_FC(idprom)
|
||||
&& !_SFF8472_COMPLIANCE_PASSIVE_SFF(idprom)
|
||||
&& (_SFF8472_WAVELENGTH(idprom) != 850)
|
||||
&& !_SFF8472_COMPLIANCE_UNSPEC(idprom)
|
||||
&& !_sff8472_hack_cr(idprom))
|
||||
return 0;
|
||||
}
|
||||
|
||||
return maybe;
|
||||
}
|
||||
|
||||
int
|
||||
sff8472_media_cr_active(const uint8_t* idprom)
|
||||
{
|
||||
int maybe = 0;
|
||||
|
||||
if (_sff8472_inf_1x_cu_active(idprom))
|
||||
maybe = 1;
|
||||
else if (_sff8472_inf_1x(idprom))
|
||||
return 0;
|
||||
|
||||
if (_sff8472_tech_fc_el(idprom))
|
||||
maybe = 1;
|
||||
else if (_sff8472_tech_fc(idprom))
|
||||
return 0;
|
||||
|
||||
if (idprom[4] != 0) return 0;
|
||||
if (idprom[5] != 0) return 0;
|
||||
if (idprom[6] != 0) return 0;
|
||||
|
||||
if (_sff8472_sfp_plus_active(idprom))
|
||||
maybe = 1;
|
||||
|
||||
if (_sff8472_fc_media_tw(idprom))
|
||||
maybe = 1;
|
||||
else if (_sff8472_fc_media(idprom))
|
||||
return 0;
|
||||
|
||||
if (!_sff8472_fc_speed_ok(idprom))
|
||||
return 0;
|
||||
|
||||
if (maybe) {
|
||||
if (!_SFF8472_COMPLIANCE_ACTIVE_FC(idprom)
|
||||
&& !_SFF8472_COMPLIANCE_ACTIVE_SFF(idprom)
|
||||
&& !_SFF8472_COMPLIANCE_UNSPEC(idprom))
|
||||
return 0;
|
||||
}
|
||||
|
||||
return maybe;
|
||||
}
|
||||
|
||||
#define SFF8472_MEDIA_GBE_SX(idprom) \
|
||||
((idprom[6] & SFF8472_CC6_GBE_BASE_SX) != 0)
|
||||
#define SFF8472_MEDIA_GBE_LX(idprom) \
|
||||
((idprom[6] & SFF8472_CC6_GBE_BASE_LX) != 0)
|
||||
#define SFF8472_MEDIA_GBE_CX(idprom) \
|
||||
((idprom[6] & SFF8472_CC6_GBE_BASE_CX) != 0)
|
||||
#define SFF8472_MEDIA_GBE_T(idprom) \
|
||||
((idprom[6] & SFF8472_CC6_GBE_BASE_T) != 0)
|
||||
|
||||
#define SFF8472_MEDIA_CBE_LX(idprom) \
|
||||
((idprom[6] & SFF8472_CC6_CBE_BASE_LX) != 0)
|
||||
#define SFF8472_MEDIA_CBE_FX(idprom) \
|
||||
((idprom[6] & SFF8472_CC6_CBE_BASE_FX) != 0)
|
||||
|
||||
|
||||
#endif
|
||||
@@ -1,37 +0,0 @@
|
||||
/**
|
||||
* These parts must be special-cased by vendor and model
|
||||
* due to nonstandard eeprom contents.
|
||||
*/
|
||||
#include <sff/sff.h>
|
||||
|
||||
typedef struct sff_ns_entry_s {
|
||||
const char* vendor;
|
||||
const char* model;
|
||||
sff_module_type_t mt;
|
||||
int len;
|
||||
} sff_ns_entry_t;
|
||||
|
||||
static sff_ns_entry_t nonstandard_modules__[] =
|
||||
{
|
||||
{ "CISCO-OEM ", "QSFP-4SFP+-CU2M ", SFF_MODULE_TYPE_40G_BASE_CR4, 2 },
|
||||
{ "CISCO-OEM ", "QSFP-4SFP+-CU3M ", SFF_MODULE_TYPE_40G_BASE_CR4, 3 },
|
||||
{ "CISCO-OEM ", "QSFP-4SFP+-CU5M ", SFF_MODULE_TYPE_40G_BASE_CR4, 5 },
|
||||
{ "Mellanox ", "MC2206130-001 ", SFF_MODULE_TYPE_40G_BASE_CR4, 1 },
|
||||
{ "OEM ", "F4M-QSSFP-C-2-30", SFF_MODULE_TYPE_40G_BASE_CR4, 2 },
|
||||
{},
|
||||
};
|
||||
|
||||
|
||||
int
|
||||
sff_nonstandard_lookup(sff_info_t* info)
|
||||
{
|
||||
sff_ns_entry_t* p;
|
||||
for(p = nonstandard_modules__; p->vendor; p++) {
|
||||
if(!strcmp(info->vendor, p->vendor) && !strcmp(info->model, p->model)) {
|
||||
sff_info_from_module_type(info, info->sfp_type, p->mt);
|
||||
info->length = p->len;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
@@ -1,863 +0,0 @@
|
||||
/************************************************************
|
||||
* <bsn.cl fy=2014 v=onl>
|
||||
*
|
||||
* Copyright 2014, 2015 Big Switch Networks, Inc.
|
||||
*
|
||||
* Licensed under the Eclipse Public License, Version 1.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
|
||||
* either express or implied. See the License for the specific
|
||||
* language governing permissions and limitations under the
|
||||
* License.
|
||||
*
|
||||
* </bsn.cl>
|
||||
************************************************************
|
||||
*
|
||||
*
|
||||
*
|
||||
***********************************************************/
|
||||
#include <sff/sff.h>
|
||||
#include <sff/8472.h>
|
||||
#include <sff/8436.h>
|
||||
#include <sff/8636.h>
|
||||
#include "sff_log.h"
|
||||
#include <ctype.h>
|
||||
#include "sff_int.h"
|
||||
|
||||
sff_sfp_type_t
|
||||
sff_sfp_type_get(const uint8_t* eeprom)
|
||||
{
|
||||
if(eeprom) {
|
||||
if(SFF8472_MODULE_SFP(eeprom)) {
|
||||
return SFF_SFP_TYPE_SFP;
|
||||
}
|
||||
if(SFF8436_MODULE_QSFP_PLUS_V2(eeprom)) {
|
||||
return SFF_SFP_TYPE_QSFP_PLUS;
|
||||
}
|
||||
if(SFF8636_MODULE_QSFP28(eeprom)) {
|
||||
return SFF_SFP_TYPE_QSFP28;
|
||||
}
|
||||
}
|
||||
return SFF_SFP_TYPE_INVALID;
|
||||
}
|
||||
|
||||
sff_module_type_t
|
||||
sff_module_type_get(const uint8_t* eeprom)
|
||||
{
|
||||
if (SFF8636_MODULE_QSFP28(eeprom)
|
||||
&& SFF8636_MEDIA_EXTENDED(eeprom)
|
||||
&& SFF8636_MEDIA_100GE_AOC(eeprom))
|
||||
return SFF_MODULE_TYPE_100G_AOC;
|
||||
|
||||
if (SFF8636_MODULE_QSFP28(eeprom)
|
||||
&& SFF8636_MEDIA_EXTENDED(eeprom)
|
||||
&& SFF8636_MEDIA_100GE_SR4(eeprom))
|
||||
return SFF_MODULE_TYPE_100G_BASE_SR4;
|
||||
|
||||
if (SFF8636_MODULE_QSFP28(eeprom)
|
||||
&& SFF8636_MEDIA_EXTENDED(eeprom)
|
||||
&& SFF8636_MEDIA_100GE_LR4(eeprom))
|
||||
return SFF_MODULE_TYPE_100G_BASE_LR4;
|
||||
|
||||
if (SFF8636_MODULE_QSFP28(eeprom)
|
||||
&& SFF8636_MEDIA_EXTENDED(eeprom)
|
||||
&& (SFF8636_MEDIA_100GE_CR4(eeprom) ||
|
||||
SFF8636_MEDIA_25GE_CR_S(eeprom) ||
|
||||
SFF8636_MEDIA_25GE_CR_N(eeprom)))
|
||||
return SFF_MODULE_TYPE_100G_BASE_CR4;
|
||||
|
||||
if (SFF8636_MODULE_QSFP28(eeprom)
|
||||
&& SFF8636_MEDIA_EXTENDED(eeprom)
|
||||
&& SFF8636_MEDIA_100GE_CWDM4(eeprom))
|
||||
return SFF_MODULE_TYPE_100G_CWDM4;
|
||||
|
||||
if (SFF8636_MODULE_QSFP28(eeprom)
|
||||
&& SFF8636_MEDIA_EXTENDED(eeprom)
|
||||
&& SFF8636_MEDIA_100GE_PSM4(eeprom))
|
||||
return SFF_MODULE_TYPE_100G_PSM4;
|
||||
|
||||
if (SFF8636_MODULE_QSFP28(eeprom)
|
||||
&& SFF8636_MEDIA_EXTENDED(eeprom)
|
||||
&& SFF8636_MEDIA_100GE_SWDM4(eeprom))
|
||||
return SFF_MODULE_TYPE_100G_SWDM4;
|
||||
|
||||
if (SFF8436_MODULE_QSFP_PLUS_V2(eeprom)
|
||||
&& SFF8436_MEDIA_40GE_CR4(eeprom))
|
||||
return SFF_MODULE_TYPE_40G_BASE_CR4;
|
||||
|
||||
if (SFF8436_MODULE_QSFP_PLUS_V2(eeprom)
|
||||
&& SFF8436_MEDIA_40GE_SR4(eeprom))
|
||||
return SFF_MODULE_TYPE_40G_BASE_SR4;
|
||||
|
||||
if (SFF8436_MODULE_QSFP_PLUS_V2(eeprom)
|
||||
&& _sff8436_qsfp_40g_sr4_aoc_pre(eeprom))
|
||||
return SFF_MODULE_TYPE_40G_BASE_SR4;
|
||||
|
||||
if (SFF8436_MODULE_QSFP_PLUS_V2(eeprom)
|
||||
&& SFF8436_MEDIA_40GE_LR4(eeprom))
|
||||
return SFF_MODULE_TYPE_40G_BASE_LR4;
|
||||
|
||||
if (SFF8436_MODULE_QSFP_PLUS_V2(eeprom)
|
||||
&& SFF8436_MEDIA_40GE_ACTIVE(eeprom))
|
||||
return SFF_MODULE_TYPE_40G_BASE_ACTIVE;
|
||||
|
||||
if (SFF8436_MODULE_QSFP_PLUS_V2(eeprom)
|
||||
&& _sff8436_qsfp_40g_aoc_breakout(eeprom))
|
||||
return SFF_MODULE_TYPE_40G_BASE_SR4;
|
||||
|
||||
if (SFF8436_MODULE_QSFP_PLUS_V2(eeprom)
|
||||
&& SFF8436_MEDIA_40GE_CR(eeprom))
|
||||
return SFF_MODULE_TYPE_40G_BASE_CR;
|
||||
|
||||
/* pre-standard finisar optics */
|
||||
if (SFF8436_MODULE_QSFP_PLUS_V2(eeprom)
|
||||
&& _sff8436_qsfp_40g_pre(eeprom)
|
||||
&& (SFF8436_TECH_FC_FIBER_LONG(eeprom)
|
||||
|| SFF8436_MEDIA_FC_FIBER_SM(eeprom)))
|
||||
return SFF_MODULE_TYPE_40G_BASE_LR4;
|
||||
|
||||
if (SFF8436_MODULE_QSFP_PLUS_V2(eeprom)
|
||||
&& _sff8436_qsfp_40g_pre(eeprom)
|
||||
&& (SFF8436_TECH_FC_FIBER_SHORT(eeprom)
|
||||
|| SFF8436_MEDIA_FC_FIBER_MM(eeprom)))
|
||||
return SFF_MODULE_TYPE_40G_BASE_SR4;
|
||||
|
||||
/* pre-standard QSFP-BiDi optics */
|
||||
if (SFF8436_MODULE_QSFP_PLUS_V2(eeprom)
|
||||
&& _sff8436_qsfp_40g_sr2_bidi_pre(eeprom))
|
||||
return SFF_MODULE_TYPE_40G_BASE_SR2;
|
||||
|
||||
if (SFF8436_MODULE_QSFP_PLUS_V2(eeprom)
|
||||
&& _sff8436_qsfp_40g_lm4(eeprom)) {
|
||||
return SFF_MODULE_TYPE_40G_BASE_LM4;
|
||||
}
|
||||
|
||||
if (SFF8436_MODULE_QSFP_PLUS_V2(eeprom)
|
||||
&& _sff8436_qsfp_40g_sm4(eeprom)) {
|
||||
return SFF_MODULE_TYPE_40G_BASE_SM4;
|
||||
}
|
||||
|
||||
if (SFF8436_MODULE_QSFP_PLUS_V2(eeprom)
|
||||
&& _sff8436_qsfp_40g_er4(eeprom)) {
|
||||
return SFF_MODULE_TYPE_40G_BASE_ER4;
|
||||
}
|
||||
|
||||
if (SFF8472_MODULE_SFP(eeprom)
|
||||
&& _sff8472_media_sfp28_cr(eeprom)) {
|
||||
return SFF_MODULE_TYPE_25G_BASE_CR;
|
||||
}
|
||||
|
||||
if (SFF8472_MODULE_SFP(eeprom)
|
||||
&& _sff8472_media_sfp28_sr(eeprom)) {
|
||||
return SFF_MODULE_TYPE_25G_BASE_SR;
|
||||
}
|
||||
|
||||
if (SFF8472_MODULE_SFP(eeprom)
|
||||
&& _sff8472_media_sfp28_lr(eeprom)) {
|
||||
return SFF_MODULE_TYPE_25G_BASE_LR;
|
||||
}
|
||||
|
||||
if (SFF8472_MODULE_SFP(eeprom)
|
||||
&& _sff8472_media_sfp28_aoc(eeprom)) {
|
||||
return SFF_MODULE_TYPE_25G_BASE_AOC;
|
||||
}
|
||||
|
||||
if (SFF8472_MODULE_SFP(eeprom)
|
||||
&& SFF8472_MEDIA_XGE_SR(eeprom)
|
||||
&& !_sff8472_media_gbe_sx_fc_hack(eeprom))
|
||||
return SFF_MODULE_TYPE_10G_BASE_SR;
|
||||
|
||||
if (SFF8472_MODULE_SFP(eeprom)
|
||||
&& SFF8472_MEDIA_XGE_LR(eeprom)
|
||||
&& !_sff8472_media_gbe_lx_fc_hack(eeprom))
|
||||
return SFF_MODULE_TYPE_10G_BASE_LR;
|
||||
|
||||
if (SFF8472_MODULE_SFP(eeprom)
|
||||
&& SFF8472_MEDIA_XGE_LRM(eeprom)
|
||||
&& !_sff8472_media_gbe_lx_fc_hack(eeprom))
|
||||
return SFF_MODULE_TYPE_10G_BASE_LRM;
|
||||
|
||||
/*
|
||||
* XXX roth -- PAN-934 -- DAC cable erroneously reports ER,
|
||||
* so we need to disallow infiniband features when matching here.
|
||||
* See also _sff8472_media_cr_passive, which encodes some
|
||||
* additional workarounds for these cables.
|
||||
*/
|
||||
if (SFF8472_MODULE_SFP(eeprom)
|
||||
&& SFF8472_MEDIA_XGE_ER(eeprom)
|
||||
&& !_sff8472_inf_1x_cu_active(eeprom)
|
||||
&& !_sff8472_inf_1x_cu_passive(eeprom))
|
||||
return SFF_MODULE_TYPE_10G_BASE_ER;
|
||||
|
||||
/* XXX roth - not sure on this one */
|
||||
if (SFF8472_MODULE_SFP(eeprom)
|
||||
&& _sff8472_media_cr_passive(eeprom))
|
||||
return SFF_MODULE_TYPE_10G_BASE_CR;
|
||||
|
||||
if (SFF8472_MODULE_SFP(eeprom)
|
||||
&& _sff8472_media_cr_active(eeprom)) {
|
||||
if (_sff8472_sfp_10g_aoc(eeprom))
|
||||
return SFF_MODULE_TYPE_10G_BASE_SR;
|
||||
else
|
||||
return SFF_MODULE_TYPE_10G_BASE_CR;
|
||||
}
|
||||
|
||||
if (SFF8472_MODULE_SFP(eeprom)
|
||||
&& SFF8472_MEDIA_GBE_SX(eeprom))
|
||||
return SFF_MODULE_TYPE_1G_BASE_SX;
|
||||
|
||||
if (SFF8472_MODULE_SFP(eeprom)
|
||||
&& SFF8472_MEDIA_GBE_LX(eeprom)) {
|
||||
if (SFF8472_MEDIA_LENGTH_ZX(eeprom)) {
|
||||
return SFF_MODULE_TYPE_1G_BASE_ZX;
|
||||
} else {
|
||||
return SFF_MODULE_TYPE_1G_BASE_LX;
|
||||
}
|
||||
}
|
||||
|
||||
if (SFF8472_MODULE_SFP(eeprom)
|
||||
&& SFF8472_MEDIA_GBE_CX(eeprom))
|
||||
return SFF_MODULE_TYPE_1G_BASE_CX;
|
||||
|
||||
if (SFF8472_MODULE_SFP(eeprom)
|
||||
&& SFF8472_MEDIA_GBE_T(eeprom))
|
||||
return SFF_MODULE_TYPE_1G_BASE_T;
|
||||
|
||||
if (SFF8472_MODULE_SFP(eeprom)
|
||||
&& SFF8472_MEDIA_CBE_LX(eeprom))
|
||||
return SFF_MODULE_TYPE_100_BASE_LX;
|
||||
|
||||
if (SFF8472_MODULE_SFP(eeprom)
|
||||
&& SFF8472_MEDIA_CBE_FX(eeprom))
|
||||
return SFF_MODULE_TYPE_100_BASE_FX;
|
||||
|
||||
/* non-standard (e.g. Finisar) ZR media */
|
||||
if (SFF8472_MODULE_SFP(eeprom)
|
||||
&& _sff8472_media_zr(eeprom))
|
||||
return SFF_MODULE_TYPE_10G_BASE_ZR;
|
||||
|
||||
/* non-standard (e.g. Finisar) SRL media */
|
||||
if (SFF8472_MODULE_SFP(eeprom)
|
||||
&& _sff8472_media_srlite(eeprom))
|
||||
return SFF_MODULE_TYPE_10G_BASE_SRL;
|
||||
|
||||
return SFF_MODULE_TYPE_INVALID;
|
||||
}
|
||||
|
||||
sff_media_type_t
|
||||
sff_media_type_get(sff_module_type_t mt)
|
||||
{
|
||||
switch(mt)
|
||||
{
|
||||
case SFF_MODULE_TYPE_100G_BASE_CR4:
|
||||
case SFF_MODULE_TYPE_40G_BASE_CR4:
|
||||
case SFF_MODULE_TYPE_40G_BASE_CR:
|
||||
case SFF_MODULE_TYPE_25G_BASE_CR:
|
||||
case SFF_MODULE_TYPE_10G_BASE_CR:
|
||||
case SFF_MODULE_TYPE_1G_BASE_CX:
|
||||
case SFF_MODULE_TYPE_1G_BASE_T:
|
||||
return SFF_MEDIA_TYPE_COPPER;
|
||||
|
||||
case SFF_MODULE_TYPE_100G_AOC:
|
||||
case SFF_MODULE_TYPE_100G_BASE_SR4:
|
||||
case SFF_MODULE_TYPE_100G_BASE_LR4:
|
||||
case SFF_MODULE_TYPE_100G_CWDM4:
|
||||
case SFF_MODULE_TYPE_100G_PSM4:
|
||||
case SFF_MODULE_TYPE_100G_SWDM4:
|
||||
case SFF_MODULE_TYPE_40G_BASE_SR4:
|
||||
case SFF_MODULE_TYPE_40G_BASE_LR4:
|
||||
case SFF_MODULE_TYPE_40G_BASE_LM4:
|
||||
case SFF_MODULE_TYPE_40G_BASE_ACTIVE:
|
||||
case SFF_MODULE_TYPE_40G_BASE_SR2:
|
||||
case SFF_MODULE_TYPE_40G_BASE_SM4:
|
||||
case SFF_MODULE_TYPE_40G_BASE_ER4:
|
||||
case SFF_MODULE_TYPE_25G_BASE_SR:
|
||||
case SFF_MODULE_TYPE_25G_BASE_LR:
|
||||
case SFF_MODULE_TYPE_25G_BASE_AOC:
|
||||
case SFF_MODULE_TYPE_10G_BASE_SR:
|
||||
case SFF_MODULE_TYPE_10G_BASE_LR:
|
||||
case SFF_MODULE_TYPE_10G_BASE_LRM:
|
||||
case SFF_MODULE_TYPE_10G_BASE_ER:
|
||||
case SFF_MODULE_TYPE_10G_BASE_SX:
|
||||
case SFF_MODULE_TYPE_10G_BASE_LX:
|
||||
case SFF_MODULE_TYPE_10G_BASE_ZR:
|
||||
case SFF_MODULE_TYPE_10G_BASE_SRL:
|
||||
case SFF_MODULE_TYPE_1G_BASE_SX:
|
||||
case SFF_MODULE_TYPE_1G_BASE_LX:
|
||||
case SFF_MODULE_TYPE_1G_BASE_ZX:
|
||||
case SFF_MODULE_TYPE_100_BASE_LX:
|
||||
case SFF_MODULE_TYPE_100_BASE_FX:
|
||||
case SFF_MODULE_TYPE_4X_MUX:
|
||||
return SFF_MEDIA_TYPE_FIBER;
|
||||
|
||||
case SFF_MODULE_TYPE_COUNT:
|
||||
case SFF_MODULE_TYPE_INVALID:
|
||||
return SFF_MEDIA_TYPE_INVALID;
|
||||
}
|
||||
|
||||
return SFF_MEDIA_TYPE_INVALID;
|
||||
}
|
||||
|
||||
int
|
||||
sff_module_caps_get(sff_module_type_t mt, uint32_t *caps)
|
||||
{
|
||||
if (caps == NULL)
|
||||
return -1;
|
||||
|
||||
*caps = 0;
|
||||
|
||||
switch(mt)
|
||||
{
|
||||
case SFF_MODULE_TYPE_100G_AOC:
|
||||
case SFF_MODULE_TYPE_100G_BASE_SR4:
|
||||
case SFF_MODULE_TYPE_100G_BASE_LR4:
|
||||
case SFF_MODULE_TYPE_100G_BASE_CR4:
|
||||
case SFF_MODULE_TYPE_100G_CWDM4:
|
||||
case SFF_MODULE_TYPE_100G_PSM4:
|
||||
case SFF_MODULE_TYPE_100G_SWDM4:
|
||||
*caps |= SFF_MODULE_CAPS_F_100G;
|
||||
return 0;
|
||||
|
||||
case SFF_MODULE_TYPE_40G_BASE_CR4:
|
||||
case SFF_MODULE_TYPE_40G_BASE_SR4:
|
||||
case SFF_MODULE_TYPE_40G_BASE_LR4:
|
||||
case SFF_MODULE_TYPE_40G_BASE_LM4:
|
||||
case SFF_MODULE_TYPE_40G_BASE_ACTIVE:
|
||||
case SFF_MODULE_TYPE_40G_BASE_CR:
|
||||
case SFF_MODULE_TYPE_40G_BASE_SR2:
|
||||
case SFF_MODULE_TYPE_40G_BASE_SM4:
|
||||
case SFF_MODULE_TYPE_40G_BASE_ER4:
|
||||
*caps |= SFF_MODULE_CAPS_F_40G;
|
||||
return 0;
|
||||
|
||||
case SFF_MODULE_TYPE_25G_BASE_CR:
|
||||
case SFF_MODULE_TYPE_25G_BASE_SR:
|
||||
case SFF_MODULE_TYPE_25G_BASE_AOC:
|
||||
*caps |= SFF_MODULE_CAPS_F_25G;
|
||||
return 0;
|
||||
|
||||
case SFF_MODULE_TYPE_10G_BASE_SR:
|
||||
case SFF_MODULE_TYPE_10G_BASE_LR:
|
||||
case SFF_MODULE_TYPE_10G_BASE_LRM:
|
||||
case SFF_MODULE_TYPE_10G_BASE_ER:
|
||||
case SFF_MODULE_TYPE_10G_BASE_CR:
|
||||
case SFF_MODULE_TYPE_10G_BASE_SX:
|
||||
case SFF_MODULE_TYPE_10G_BASE_LX:
|
||||
case SFF_MODULE_TYPE_10G_BASE_ZR:
|
||||
case SFF_MODULE_TYPE_10G_BASE_SRL:
|
||||
*caps |= SFF_MODULE_CAPS_F_10G;
|
||||
return 0;
|
||||
|
||||
case SFF_MODULE_TYPE_1G_BASE_SX:
|
||||
case SFF_MODULE_TYPE_1G_BASE_LX:
|
||||
case SFF_MODULE_TYPE_1G_BASE_ZX:
|
||||
case SFF_MODULE_TYPE_1G_BASE_CX:
|
||||
case SFF_MODULE_TYPE_1G_BASE_T:
|
||||
*caps |= SFF_MODULE_CAPS_F_1G;
|
||||
return 0;
|
||||
|
||||
case SFF_MODULE_TYPE_100_BASE_LX:
|
||||
case SFF_MODULE_TYPE_100_BASE_FX:
|
||||
*caps |= SFF_MODULE_CAPS_F_100;
|
||||
return 0;
|
||||
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
make_printable__(char* string, int size)
|
||||
{
|
||||
char* p;
|
||||
for(p = string; p && *p && size; p++) {
|
||||
if(!isprint(*p)) {
|
||||
*p = '?';
|
||||
}
|
||||
size --;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Initialize an SFF module information structure.
|
||||
* @param rv [out] Receives the data.
|
||||
* @param eeprom Raw EEPROM data.
|
||||
* @note if eeprom is != NULL it will be copied into rv->eeprom first.
|
||||
* @note if eeprom is NULL it is assumed the rv->eeprom buffer
|
||||
* has already been initialized.
|
||||
*/
|
||||
static int
|
||||
sff_eeprom_parse_standard__(sff_eeprom_t* se, uint8_t* eeprom)
|
||||
{
|
||||
if(se == NULL) {
|
||||
return -1;
|
||||
}
|
||||
se->identified = 0;
|
||||
|
||||
if(eeprom) {
|
||||
SFF_MEMCPY(se->eeprom, eeprom, 256);
|
||||
}
|
||||
|
||||
if (SFF8472_MODULE_SFP(se->eeprom)) {
|
||||
/* See SFF-8472 pp22, pp28 */
|
||||
int i;
|
||||
for (i = 0, se->cc_base = 0; i < 63; ++i)
|
||||
se->cc_base = (se->cc_base + se->eeprom[i]) & 0xFF;
|
||||
for (i = 64, se->cc_ext = 0; i < 95; ++i)
|
||||
se->cc_ext = (se->cc_ext + se->eeprom[i]) & 0xFF;
|
||||
} else if (SFF8436_MODULE_QSFP_PLUS_V2(se->eeprom) ||
|
||||
SFF8636_MODULE_QSFP28(se->eeprom)) {
|
||||
/* See SFF-8436 pp72, pp73 */
|
||||
int i;
|
||||
for (i = 128, se->cc_base = 0; i < 191; ++i)
|
||||
se->cc_base = (se->cc_base + se->eeprom[i]) & 0xFF;
|
||||
for (i = 192, se->cc_ext = 0; i < 223; ++i)
|
||||
se->cc_ext = (se->cc_ext + se->eeprom[i]) & 0xFF;
|
||||
}
|
||||
|
||||
if (!sff_eeprom_validate(se, 1)) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
se->info.sfp_type = sff_sfp_type_get(se->eeprom);
|
||||
if(se->info.sfp_type == SFF_SFP_TYPE_INVALID) {
|
||||
AIM_LOG_ERROR("sff_eeprom_parse() failed: invalid sfp type");
|
||||
return -1;
|
||||
}
|
||||
se->info.sfp_type_name = sff_sfp_type_desc(se->info.sfp_type);
|
||||
|
||||
const uint8_t *vendor, *model, *serial;
|
||||
|
||||
switch(se->info.sfp_type)
|
||||
{
|
||||
case SFF_SFP_TYPE_QSFP_PLUS:
|
||||
case SFF_SFP_TYPE_QSFP28:
|
||||
vendor=se->eeprom+148;
|
||||
model=se->eeprom+168;
|
||||
serial=se->eeprom+196;
|
||||
break;
|
||||
|
||||
case SFF_SFP_TYPE_SFP:
|
||||
default:
|
||||
vendor=se->eeprom+20;
|
||||
model=se->eeprom+40;
|
||||
serial=se->eeprom+68;
|
||||
break;
|
||||
}
|
||||
|
||||
/* handle NULL fields, they should actually be space-padded */
|
||||
const char *empty = " ";
|
||||
if (*vendor) {
|
||||
aim_strlcpy(se->info.vendor, (char*)vendor, sizeof(se->info.vendor));
|
||||
make_printable__(se->info.vendor, sizeof(se->info.vendor));
|
||||
}
|
||||
else {
|
||||
aim_strlcpy(se->info.vendor, empty, 17);
|
||||
}
|
||||
if (*model) {
|
||||
aim_strlcpy(se->info.model, (char*)model, sizeof(se->info.model));
|
||||
make_printable__(se->info.model, sizeof(se->info.model));
|
||||
}
|
||||
else {
|
||||
aim_strlcpy(se->info.model, empty, 17);
|
||||
}
|
||||
if (*serial) {
|
||||
aim_strlcpy(se->info.serial, (char*)serial, sizeof(se->info.serial));
|
||||
make_printable__(se->info.serial, sizeof(se->info.serial));
|
||||
}
|
||||
else {
|
||||
aim_strlcpy(se->info.serial, empty, 17);
|
||||
}
|
||||
|
||||
se->info.module_type = sff_module_type_get(se->eeprom);
|
||||
if(se->info.module_type == SFF_MODULE_TYPE_INVALID) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if(sff_info_init(&se->info, se->info.module_type, NULL, NULL, NULL, 0) < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
int aoc_length;
|
||||
switch (se->info.media_type)
|
||||
{
|
||||
case SFF_MEDIA_TYPE_COPPER:
|
||||
switch (se->info.sfp_type)
|
||||
{
|
||||
case SFF_SFP_TYPE_QSFP_PLUS:
|
||||
case SFF_SFP_TYPE_QSFP28:
|
||||
se->info.length = se->eeprom[146];
|
||||
break;
|
||||
case SFF_SFP_TYPE_SFP:
|
||||
case SFF_SFP_TYPE_SFP28:
|
||||
se->info.length = se->eeprom[18];
|
||||
break;
|
||||
default:
|
||||
se->info.length = -1;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case SFF_MEDIA_TYPE_FIBER:
|
||||
switch (se->info.sfp_type)
|
||||
{
|
||||
case SFF_SFP_TYPE_QSFP28:
|
||||
aoc_length = _sff8636_qsfp28_100g_aoc_length(se->eeprom);
|
||||
se->info.length = aoc_length;
|
||||
break;
|
||||
case SFF_SFP_TYPE_QSFP_PLUS:
|
||||
case SFF_SFP_TYPE_SFP:
|
||||
case SFF_SFP_TYPE_SFP28:
|
||||
aoc_length = _sff8436_qsfp_40g_aoc_length(se->eeprom);
|
||||
if (aoc_length < 0)
|
||||
aoc_length = _sff8472_sfp_10g_aoc_length(se->eeprom);
|
||||
if (aoc_length > 0)
|
||||
se->info.length = aoc_length;
|
||||
else
|
||||
se->info.length = -1;
|
||||
break;
|
||||
default:
|
||||
se->info.length = -1;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
se->info.length = -1;
|
||||
}
|
||||
|
||||
if(se->info.length == -1) {
|
||||
se->info.length_desc[0] = 0;
|
||||
}
|
||||
else {
|
||||
SFF_SNPRINTF(se->info.length_desc, sizeof(se->info.length_desc), "%dm", se->info.length);
|
||||
}
|
||||
se->identified = 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
sff_info_from_module_type(sff_info_t* info, sff_sfp_type_t st, sff_module_type_t mt)
|
||||
{
|
||||
info->sfp_type = st;
|
||||
info->sfp_type_name = sff_sfp_type_desc(st);
|
||||
|
||||
info->module_type = mt;
|
||||
info->module_type_name = sff_module_type_desc(mt);
|
||||
|
||||
info->media_type = sff_media_type_get(mt);
|
||||
info->media_type_name = sff_media_type_desc(info->media_type);
|
||||
|
||||
if (sff_module_caps_get(info->module_type, &info->caps) < 0) {
|
||||
AIM_LOG_ERROR("sff_info_init() failed: invalid module caps");
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
sff_info_show(sff_info_t* info, aim_pvs_t* pvs)
|
||||
{
|
||||
aim_printf(pvs, "Vendor: %s Model: %s SN: %s Type: %s Module: %s Media: %s Length: %d\n",
|
||||
info->vendor, info->model, info->serial, info->sfp_type_name,
|
||||
info->module_type_name, info->media_type_name, info->length);
|
||||
}
|
||||
|
||||
int
|
||||
sff_eeprom_parse_file(sff_eeprom_t* se, const char* fname)
|
||||
{
|
||||
int rv;
|
||||
FILE* fp;
|
||||
|
||||
SFF_MEMSET(se, 0, sizeof(*se));
|
||||
|
||||
if( (fp = fopen(fname, "r")) == NULL) {
|
||||
AIM_LOG_ERROR("Failed to open eeprom file %s: %{errno}");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if( (rv = fread(se->eeprom, 1, 256, fp)) > 0) {
|
||||
if( (rv=sff_eeprom_parse(se, NULL)) < 0) {
|
||||
AIM_LOG_ERROR("sff_init() failed on data from file %s: %d\n", fname, rv);
|
||||
rv = -1;
|
||||
}
|
||||
rv = 0;
|
||||
}
|
||||
else {
|
||||
rv = -1;
|
||||
}
|
||||
fclose(fp);
|
||||
return rv;
|
||||
}
|
||||
|
||||
void
|
||||
sff_eeprom_invalidate(sff_eeprom_t *se)
|
||||
{
|
||||
memset(se->eeprom, 0xFF, 256);
|
||||
se->cc_base = 0xFF;
|
||||
se->cc_ext = 0xFF;
|
||||
se->identified = 0;
|
||||
}
|
||||
|
||||
int
|
||||
sff_eeprom_validate(sff_eeprom_t *se, int verbose)
|
||||
{
|
||||
if (SFF8436_MODULE_QSFP_PLUS_V2(se->eeprom) ||
|
||||
SFF8636_MODULE_QSFP28(se->eeprom)) {
|
||||
|
||||
if (se->cc_base != se->eeprom[191]) {
|
||||
if (verbose) {
|
||||
AIM_LOG_ERROR("sff_eeprom_validate() failed: invalid base QSFP checksum (0x%x should be 0x%x)",
|
||||
se->eeprom[191], se->cc_base);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if SFF_CONFIG_INCLUDE_EXT_CC_CHECK == 1
|
||||
if (se->cc_ext != se->eeprom[223]) {
|
||||
if (verbose) {
|
||||
AIM_LOG_ERROR("sff_info_valid() failed: invalid extended QSFP checksum (0x%x should be 0x%x)",
|
||||
se->eeprom[223], se->cc_ext);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
} else if (SFF8472_MODULE_SFP(se->eeprom)) {
|
||||
|
||||
if (se->cc_base != se->eeprom[63]) {
|
||||
if (verbose) {
|
||||
AIM_LOG_ERROR("sff_info_valid() failed: invalid base SFP checksum (0x%x should be 0x%x)",
|
||||
se->eeprom[63], se->cc_base);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if SFF_CONFIG_INCLUDE_EXT_CC_CHECK == 1
|
||||
if (se->cc_ext != se->eeprom[95]) {
|
||||
if (verbose) {
|
||||
AIM_LOG_ERROR("sff_info_valid() failed: invalid extended SFP checksum (0x%x should be 0x%x)",
|
||||
se->eeprom[95], se->cc_ext);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
} else {
|
||||
|
||||
if (verbose) {
|
||||
AIM_LOG_ERROR("sff_info_valid() failed: invalid module type");
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
sff_eeprom_parse_nonstandard__(sff_eeprom_t* se, uint8_t* eeprom)
|
||||
{
|
||||
if(se == NULL) {
|
||||
return -1;
|
||||
}
|
||||
se->identified = 0;
|
||||
|
||||
if(eeprom) {
|
||||
SFF_MEMCPY(se->eeprom, eeprom, 256);
|
||||
}
|
||||
|
||||
if (strncmp(se->info.vendor, "Amphenol", 8) == 0 &&
|
||||
(strncmp(se->info.model, "625960001", 9) == 0 || strncmp(se->info.model, "659900001", 9) == 0) &&
|
||||
(se->eeprom[240] == 0x0f) &&
|
||||
(se->eeprom[241] == 0x10) &&
|
||||
((se->eeprom[243] & 0xF0) == 0xE0)) {
|
||||
|
||||
/* 4X_MUX */
|
||||
se->identified = 1;
|
||||
se->info.module_type = SFF_MODULE_TYPE_4X_MUX;
|
||||
se->info.module_type_name = sff_module_type_desc(se->info.module_type);
|
||||
se->info.media_type = SFF_MEDIA_TYPE_COPPER;
|
||||
se->info.media_type_name = sff_media_type_desc(se->info.media_type);
|
||||
se->info.caps = SFF_MODULE_CAPS_F_1G;
|
||||
se->info.length = se->eeprom[146];
|
||||
SFF_SNPRINTF(se->info.length_desc, sizeof(se->info.length_desc), "%dm",
|
||||
se->info.length);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (sff_nonstandard_lookup(&se->info) == 0) {
|
||||
se->identified = 1;
|
||||
SFF_SNPRINTF(se->info.length_desc, sizeof(se->info.length_desc), "%dm",
|
||||
se->info.length);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
int
|
||||
sff_eeprom_parse(sff_eeprom_t* se, uint8_t* eeprom)
|
||||
{
|
||||
int rv = sff_eeprom_parse_standard__(se, eeprom);
|
||||
if(!se->identified) {
|
||||
rv = sff_eeprom_parse_nonstandard__(se, eeprom);
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
int
|
||||
sff_info_init(sff_info_t* info, sff_module_type_t mt,
|
||||
const char* vendor, const char* model, const char* serial,
|
||||
int length)
|
||||
{
|
||||
info->module_type = mt;
|
||||
|
||||
switch(mt)
|
||||
{
|
||||
case SFF_MODULE_TYPE_100G_AOC:
|
||||
case SFF_MODULE_TYPE_100G_BASE_SR4:
|
||||
case SFF_MODULE_TYPE_100G_BASE_LR4:
|
||||
case SFF_MODULE_TYPE_100G_CWDM4:
|
||||
case SFF_MODULE_TYPE_100G_PSM4:
|
||||
case SFF_MODULE_TYPE_100G_SWDM4:
|
||||
info->sfp_type = SFF_SFP_TYPE_QSFP28;
|
||||
info->media_type = SFF_MEDIA_TYPE_FIBER;
|
||||
info->caps = SFF_MODULE_CAPS_F_100G;
|
||||
break;
|
||||
|
||||
case SFF_MODULE_TYPE_100G_BASE_CR4:
|
||||
info->sfp_type = SFF_SFP_TYPE_QSFP28;
|
||||
info->media_type = SFF_MEDIA_TYPE_COPPER;
|
||||
info->caps = SFF_MODULE_CAPS_F_100G;
|
||||
break;
|
||||
|
||||
case SFF_MODULE_TYPE_40G_BASE_SR4:
|
||||
case SFF_MODULE_TYPE_40G_BASE_LR4:
|
||||
case SFF_MODULE_TYPE_40G_BASE_LM4:
|
||||
case SFF_MODULE_TYPE_40G_BASE_ACTIVE:
|
||||
case SFF_MODULE_TYPE_40G_BASE_SR2:
|
||||
case SFF_MODULE_TYPE_40G_BASE_SM4:
|
||||
case SFF_MODULE_TYPE_40G_BASE_ER4:
|
||||
case SFF_MODULE_TYPE_4X_MUX:
|
||||
info->sfp_type = SFF_SFP_TYPE_QSFP_PLUS;
|
||||
info->media_type = SFF_MEDIA_TYPE_FIBER;
|
||||
info->caps = SFF_MODULE_CAPS_F_40G;
|
||||
break;
|
||||
|
||||
case SFF_MODULE_TYPE_40G_BASE_CR4:
|
||||
case SFF_MODULE_TYPE_40G_BASE_CR:
|
||||
info->sfp_type = SFF_SFP_TYPE_QSFP_PLUS;
|
||||
info->media_type = SFF_MEDIA_TYPE_COPPER;
|
||||
info->caps = SFF_MODULE_CAPS_F_40G;
|
||||
break;
|
||||
|
||||
case SFF_MODULE_TYPE_25G_BASE_CR:
|
||||
info->sfp_type = SFF_SFP_TYPE_SFP28;
|
||||
info->media_type = SFF_MEDIA_TYPE_COPPER;
|
||||
info->caps = SFF_MODULE_CAPS_F_25G;
|
||||
break;
|
||||
|
||||
case SFF_MODULE_TYPE_25G_BASE_SR:
|
||||
case SFF_MODULE_TYPE_25G_BASE_LR:
|
||||
case SFF_MODULE_TYPE_25G_BASE_AOC:
|
||||
info->sfp_type = SFF_SFP_TYPE_SFP28;
|
||||
info->media_type = SFF_MEDIA_TYPE_FIBER;
|
||||
info->caps = SFF_MODULE_CAPS_F_25G;
|
||||
break;
|
||||
|
||||
case SFF_MODULE_TYPE_10G_BASE_CR:
|
||||
info->sfp_type = SFF_SFP_TYPE_SFP;
|
||||
info->media_type = SFF_MEDIA_TYPE_COPPER;
|
||||
info->caps = SFF_MODULE_CAPS_F_10G;
|
||||
break;
|
||||
|
||||
case SFF_MODULE_TYPE_10G_BASE_SR:
|
||||
case SFF_MODULE_TYPE_10G_BASE_LR:
|
||||
case SFF_MODULE_TYPE_10G_BASE_LRM:
|
||||
case SFF_MODULE_TYPE_10G_BASE_ER:
|
||||
case SFF_MODULE_TYPE_10G_BASE_SX:
|
||||
case SFF_MODULE_TYPE_10G_BASE_LX:
|
||||
case SFF_MODULE_TYPE_10G_BASE_ZR:
|
||||
case SFF_MODULE_TYPE_10G_BASE_SRL:
|
||||
info->sfp_type = SFF_SFP_TYPE_SFP;
|
||||
info->media_type = SFF_MEDIA_TYPE_FIBER;
|
||||
info->caps = SFF_MODULE_CAPS_F_10G;
|
||||
break;
|
||||
|
||||
case SFF_MODULE_TYPE_1G_BASE_SX:
|
||||
case SFF_MODULE_TYPE_1G_BASE_LX:
|
||||
case SFF_MODULE_TYPE_1G_BASE_ZX:
|
||||
info->sfp_type = SFF_SFP_TYPE_SFP;
|
||||
info->media_type = SFF_MEDIA_TYPE_FIBER;
|
||||
info->caps = SFF_MODULE_CAPS_F_1G;
|
||||
break;
|
||||
|
||||
case SFF_MODULE_TYPE_1G_BASE_CX:
|
||||
case SFF_MODULE_TYPE_1G_BASE_T:
|
||||
info->sfp_type = SFF_SFP_TYPE_SFP;
|
||||
info->media_type = SFF_MEDIA_TYPE_COPPER;
|
||||
info->caps = SFF_MODULE_CAPS_F_1G;
|
||||
break;
|
||||
|
||||
case SFF_MODULE_TYPE_100_BASE_LX:
|
||||
case SFF_MODULE_TYPE_100_BASE_FX:
|
||||
info->sfp_type = SFF_SFP_TYPE_SFP;
|
||||
info->media_type = SFF_MEDIA_TYPE_FIBER;
|
||||
info->caps = SFF_MODULE_CAPS_F_100;
|
||||
break;
|
||||
|
||||
case SFF_MODULE_TYPE_COUNT:
|
||||
case SFF_MODULE_TYPE_INVALID:
|
||||
return -1;
|
||||
}
|
||||
|
||||
info->sfp_type_name = sff_sfp_type_desc(info->sfp_type);
|
||||
info->module_type_name = sff_module_type_desc(info->module_type);
|
||||
info->media_type_name = sff_media_type_desc(info->media_type);
|
||||
|
||||
if(vendor) {
|
||||
aim_strlcpy(info->vendor, vendor, sizeof(info->vendor));
|
||||
}
|
||||
if(model) {
|
||||
aim_strlcpy(info->model, model, sizeof(info->model));
|
||||
}
|
||||
if(serial) {
|
||||
aim_strlcpy(info->serial, serial, sizeof(info->serial));
|
||||
}
|
||||
|
||||
info->length = length;
|
||||
SFF_SNPRINTF(info->length_desc, sizeof(info->length_desc), "%dm", length);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef DEPENDMODULE_INCLUDE_CJSON_UTIL
|
||||
|
||||
#include <cjson_util/cjson_util_format.h>
|
||||
|
||||
cJSON*
|
||||
sff_info_json(cJSON* rv, sff_info_t* info)
|
||||
{
|
||||
if(rv == NULL) {
|
||||
rv = cJSON_CreateObject();
|
||||
}
|
||||
|
||||
cjson_util_add_string_to_object(rv, "vendor", "%-16.16s", info->vendor);
|
||||
cjson_util_add_string_to_object(rv, "model", "%-16.16s", info->model);
|
||||
cjson_util_add_string_to_object(rv, "serial", "%-16.16s", info->serial);
|
||||
cJSON_AddStringToObject(rv, "sfp-type", info->sfp_type_name);
|
||||
cJSON_AddStringToObject(rv, "module-type", info->module_type_name);
|
||||
cJSON_AddStringToObject(rv, "media-type", info->media_type_name);
|
||||
cjson_util_add_string_to_object(rv, "caps", "%{sff_module_caps}", info->caps);
|
||||
cjson_util_add_string_to_object(rv, "length", info->length_desc);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
#endif /* DEPENDMODULE_CJSON_UTIL */
|
||||
@@ -1,91 +0,0 @@
|
||||
/**************************************************************************//**
|
||||
*
|
||||
*
|
||||
*
|
||||
*****************************************************************************/
|
||||
#include <sff/sff_config.h>
|
||||
|
||||
/* <auto.start.cdefs(SFF_CONFIG_HEADER).source> */
|
||||
#define __sff_config_STRINGIFY_NAME(_x) #_x
|
||||
#define __sff_config_STRINGIFY_VALUE(_x) __sff_config_STRINGIFY_NAME(_x)
|
||||
sff_config_settings_t sff_config_settings[] =
|
||||
{
|
||||
#ifdef SFF_CONFIG_INCLUDE_LOGGING
|
||||
{ __sff_config_STRINGIFY_NAME(SFF_CONFIG_INCLUDE_LOGGING), __sff_config_STRINGIFY_VALUE(SFF_CONFIG_INCLUDE_LOGGING) },
|
||||
#else
|
||||
{ SFF_CONFIG_INCLUDE_LOGGING(__sff_config_STRINGIFY_NAME), "__undefined__" },
|
||||
#endif
|
||||
#ifdef SFF_CONFIG_LOG_OPTIONS_DEFAULT
|
||||
{ __sff_config_STRINGIFY_NAME(SFF_CONFIG_LOG_OPTIONS_DEFAULT), __sff_config_STRINGIFY_VALUE(SFF_CONFIG_LOG_OPTIONS_DEFAULT) },
|
||||
#else
|
||||
{ SFF_CONFIG_LOG_OPTIONS_DEFAULT(__sff_config_STRINGIFY_NAME), "__undefined__" },
|
||||
#endif
|
||||
#ifdef SFF_CONFIG_LOG_BITS_DEFAULT
|
||||
{ __sff_config_STRINGIFY_NAME(SFF_CONFIG_LOG_BITS_DEFAULT), __sff_config_STRINGIFY_VALUE(SFF_CONFIG_LOG_BITS_DEFAULT) },
|
||||
#else
|
||||
{ SFF_CONFIG_LOG_BITS_DEFAULT(__sff_config_STRINGIFY_NAME), "__undefined__" },
|
||||
#endif
|
||||
#ifdef SFF_CONFIG_LOG_CUSTOM_BITS_DEFAULT
|
||||
{ __sff_config_STRINGIFY_NAME(SFF_CONFIG_LOG_CUSTOM_BITS_DEFAULT), __sff_config_STRINGIFY_VALUE(SFF_CONFIG_LOG_CUSTOM_BITS_DEFAULT) },
|
||||
#else
|
||||
{ SFF_CONFIG_LOG_CUSTOM_BITS_DEFAULT(__sff_config_STRINGIFY_NAME), "__undefined__" },
|
||||
#endif
|
||||
#ifdef SFF_CONFIG_PORTING_STDLIB
|
||||
{ __sff_config_STRINGIFY_NAME(SFF_CONFIG_PORTING_STDLIB), __sff_config_STRINGIFY_VALUE(SFF_CONFIG_PORTING_STDLIB) },
|
||||
#else
|
||||
{ SFF_CONFIG_PORTING_STDLIB(__sff_config_STRINGIFY_NAME), "__undefined__" },
|
||||
#endif
|
||||
#ifdef SFF_CONFIG_PORTING_INCLUDE_STDLIB_HEADERS
|
||||
{ __sff_config_STRINGIFY_NAME(SFF_CONFIG_PORTING_INCLUDE_STDLIB_HEADERS), __sff_config_STRINGIFY_VALUE(SFF_CONFIG_PORTING_INCLUDE_STDLIB_HEADERS) },
|
||||
#else
|
||||
{ SFF_CONFIG_PORTING_INCLUDE_STDLIB_HEADERS(__sff_config_STRINGIFY_NAME), "__undefined__" },
|
||||
#endif
|
||||
#ifdef SFF_CONFIG_INCLUDE_UCLI
|
||||
{ __sff_config_STRINGIFY_NAME(SFF_CONFIG_INCLUDE_UCLI), __sff_config_STRINGIFY_VALUE(SFF_CONFIG_INCLUDE_UCLI) },
|
||||
#else
|
||||
{ SFF_CONFIG_INCLUDE_UCLI(__sff_config_STRINGIFY_NAME), "__undefined__" },
|
||||
#endif
|
||||
#ifdef SFF_CONFIG_INCLUDE_SFF_TOOL
|
||||
{ __sff_config_STRINGIFY_NAME(SFF_CONFIG_INCLUDE_SFF_TOOL), __sff_config_STRINGIFY_VALUE(SFF_CONFIG_INCLUDE_SFF_TOOL) },
|
||||
#else
|
||||
{ SFF_CONFIG_INCLUDE_SFF_TOOL(__sff_config_STRINGIFY_NAME), "__undefined__" },
|
||||
#endif
|
||||
#ifdef SFF_CONFIG_INCLUDE_EXT_CC_CHECK
|
||||
{ __sff_config_STRINGIFY_NAME(SFF_CONFIG_INCLUDE_EXT_CC_CHECK), __sff_config_STRINGIFY_VALUE(SFF_CONFIG_INCLUDE_EXT_CC_CHECK) },
|
||||
#else
|
||||
{ SFF_CONFIG_INCLUDE_EXT_CC_CHECK(__sff_config_STRINGIFY_NAME), "__undefined__" },
|
||||
#endif
|
||||
#ifdef SFF_CONFIG_INCLUDE_DATABASE
|
||||
{ __sff_config_STRINGIFY_NAME(SFF_CONFIG_INCLUDE_DATABASE), __sff_config_STRINGIFY_VALUE(SFF_CONFIG_INCLUDE_DATABASE) },
|
||||
#else
|
||||
{ SFF_CONFIG_INCLUDE_DATABASE(__sff_config_STRINGIFY_NAME), "__undefined__" },
|
||||
#endif
|
||||
{ NULL, NULL }
|
||||
};
|
||||
#undef __sff_config_STRINGIFY_VALUE
|
||||
#undef __sff_config_STRINGIFY_NAME
|
||||
|
||||
const char*
|
||||
sff_config_lookup(const char* setting)
|
||||
{
|
||||
int i;
|
||||
for(i = 0; sff_config_settings[i].name; i++) {
|
||||
if(!strcmp(sff_config_settings[i].name, setting)) {
|
||||
return sff_config_settings[i].value;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int
|
||||
sff_config_show(struct aim_pvs_s* pvs)
|
||||
{
|
||||
int i;
|
||||
for(i = 0; sff_config_settings[i].name; i++) {
|
||||
aim_printf(pvs, "%s = %s\n", sff_config_settings[i].name, sff_config_settings[i].value);
|
||||
}
|
||||
return i;
|
||||
}
|
||||
|
||||
/* <auto.end.cdefs(SFF_CONFIG_HEADER).source> */
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,316 +0,0 @@
|
||||
/**************************************************************************//**
|
||||
*
|
||||
*
|
||||
*
|
||||
*****************************************************************************/
|
||||
#include <sff/sff_config.h>
|
||||
#include <sff/sff.h>
|
||||
|
||||
/* <auto.start.enum(ALL).source> */
|
||||
aim_map_si_t sff_media_type_map[] =
|
||||
{
|
||||
{ "COPPER", SFF_MEDIA_TYPE_COPPER },
|
||||
{ "FIBER", SFF_MEDIA_TYPE_FIBER },
|
||||
{ NULL, 0 }
|
||||
};
|
||||
|
||||
aim_map_si_t sff_media_type_desc_map[] =
|
||||
{
|
||||
{ "Copper", SFF_MEDIA_TYPE_COPPER },
|
||||
{ "Fiber", SFF_MEDIA_TYPE_FIBER },
|
||||
{ NULL, 0 }
|
||||
};
|
||||
|
||||
const char*
|
||||
sff_media_type_name(sff_media_type_t e)
|
||||
{
|
||||
const char* name;
|
||||
if(aim_map_si_i(&name, e, sff_media_type_map, 0)) {
|
||||
return name;
|
||||
}
|
||||
else {
|
||||
return "-invalid value for enum type 'sff_media_type'";
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
sff_media_type_value(const char* str, sff_media_type_t* e, int substr)
|
||||
{
|
||||
int i;
|
||||
AIM_REFERENCE(substr);
|
||||
if(aim_map_si_s(&i, str, sff_media_type_map, 0)) {
|
||||
/* Enum Found */
|
||||
*e = i;
|
||||
return 0;
|
||||
}
|
||||
else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
const char*
|
||||
sff_media_type_desc(sff_media_type_t e)
|
||||
{
|
||||
const char* name;
|
||||
if(aim_map_si_i(&name, e, sff_media_type_desc_map, 0)) {
|
||||
return name;
|
||||
}
|
||||
else {
|
||||
return "-invalid value for enum type 'sff_media_type'";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
aim_map_si_t sff_module_caps_map[] =
|
||||
{
|
||||
{ "F_100", SFF_MODULE_CAPS_F_100 },
|
||||
{ "F_1G", SFF_MODULE_CAPS_F_1G },
|
||||
{ "F_10G", SFF_MODULE_CAPS_F_10G },
|
||||
{ "F_25G", SFF_MODULE_CAPS_F_25G },
|
||||
{ "F_40G", SFF_MODULE_CAPS_F_40G },
|
||||
{ "F_100G", SFF_MODULE_CAPS_F_100G },
|
||||
{ NULL, 0 }
|
||||
};
|
||||
|
||||
aim_map_si_t sff_module_caps_desc_map[] =
|
||||
{
|
||||
{ "None", SFF_MODULE_CAPS_F_100 },
|
||||
{ "None", SFF_MODULE_CAPS_F_1G },
|
||||
{ "None", SFF_MODULE_CAPS_F_10G },
|
||||
{ "None", SFF_MODULE_CAPS_F_25G },
|
||||
{ "None", SFF_MODULE_CAPS_F_40G },
|
||||
{ "None", SFF_MODULE_CAPS_F_100G },
|
||||
{ NULL, 0 }
|
||||
};
|
||||
|
||||
const char*
|
||||
sff_module_caps_name(sff_module_caps_t e)
|
||||
{
|
||||
const char* name;
|
||||
if(aim_map_si_i(&name, e, sff_module_caps_map, 0)) {
|
||||
return name;
|
||||
}
|
||||
else {
|
||||
return "-invalid value for enum type 'sff_module_caps'";
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
sff_module_caps_value(const char* str, sff_module_caps_t* e, int substr)
|
||||
{
|
||||
int i;
|
||||
AIM_REFERENCE(substr);
|
||||
if(aim_map_si_s(&i, str, sff_module_caps_map, 0)) {
|
||||
/* Enum Found */
|
||||
*e = i;
|
||||
return 0;
|
||||
}
|
||||
else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
const char*
|
||||
sff_module_caps_desc(sff_module_caps_t e)
|
||||
{
|
||||
const char* name;
|
||||
if(aim_map_si_i(&name, e, sff_module_caps_desc_map, 0)) {
|
||||
return name;
|
||||
}
|
||||
else {
|
||||
return "-invalid value for enum type 'sff_module_caps'";
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
sff_module_caps_valid(sff_module_caps_t e)
|
||||
{
|
||||
return aim_map_si_i(NULL, e, sff_module_caps_map, 0) ? 1 : 0;
|
||||
}
|
||||
|
||||
|
||||
aim_map_si_t sff_module_type_map[] =
|
||||
{
|
||||
{ "100G_AOC", SFF_MODULE_TYPE_100G_AOC },
|
||||
{ "100G_BASE_CR4", SFF_MODULE_TYPE_100G_BASE_CR4 },
|
||||
{ "100G_BASE_SR4", SFF_MODULE_TYPE_100G_BASE_SR4 },
|
||||
{ "100G_BASE_LR4", SFF_MODULE_TYPE_100G_BASE_LR4 },
|
||||
{ "100G_CWDM4", SFF_MODULE_TYPE_100G_CWDM4 },
|
||||
{ "100G_PSM4", SFF_MODULE_TYPE_100G_PSM4 },
|
||||
{ "100G_SWDM4", SFF_MODULE_TYPE_100G_SWDM4 },
|
||||
{ "40G_BASE_CR4", SFF_MODULE_TYPE_40G_BASE_CR4 },
|
||||
{ "40G_BASE_SR4", SFF_MODULE_TYPE_40G_BASE_SR4 },
|
||||
{ "40G_BASE_LR4", SFF_MODULE_TYPE_40G_BASE_LR4 },
|
||||
{ "40G_BASE_LM4", SFF_MODULE_TYPE_40G_BASE_LM4 },
|
||||
{ "40G_BASE_ACTIVE", SFF_MODULE_TYPE_40G_BASE_ACTIVE },
|
||||
{ "40G_BASE_CR", SFF_MODULE_TYPE_40G_BASE_CR },
|
||||
{ "40G_BASE_SR2", SFF_MODULE_TYPE_40G_BASE_SR2 },
|
||||
{ "40G_BASE_SM4", SFF_MODULE_TYPE_40G_BASE_SM4 },
|
||||
{ "40G_BASE_ER4", SFF_MODULE_TYPE_40G_BASE_ER4 },
|
||||
{ "25G_BASE_CR", SFF_MODULE_TYPE_25G_BASE_CR },
|
||||
{ "25G_BASE_SR", SFF_MODULE_TYPE_25G_BASE_SR },
|
||||
{ "25G_BASE_LR", SFF_MODULE_TYPE_25G_BASE_LR },
|
||||
{ "25G_BASE_AOC", SFF_MODULE_TYPE_25G_BASE_AOC },
|
||||
{ "10G_BASE_SR", SFF_MODULE_TYPE_10G_BASE_SR },
|
||||
{ "10G_BASE_LR", SFF_MODULE_TYPE_10G_BASE_LR },
|
||||
{ "10G_BASE_LRM", SFF_MODULE_TYPE_10G_BASE_LRM },
|
||||
{ "10G_BASE_ER", SFF_MODULE_TYPE_10G_BASE_ER },
|
||||
{ "10G_BASE_CR", SFF_MODULE_TYPE_10G_BASE_CR },
|
||||
{ "10G_BASE_SX", SFF_MODULE_TYPE_10G_BASE_SX },
|
||||
{ "10G_BASE_LX", SFF_MODULE_TYPE_10G_BASE_LX },
|
||||
{ "10G_BASE_ZR", SFF_MODULE_TYPE_10G_BASE_ZR },
|
||||
{ "10G_BASE_SRL", SFF_MODULE_TYPE_10G_BASE_SRL },
|
||||
{ "1G_BASE_SX", SFF_MODULE_TYPE_1G_BASE_SX },
|
||||
{ "1G_BASE_LX", SFF_MODULE_TYPE_1G_BASE_LX },
|
||||
{ "1G_BASE_ZX", SFF_MODULE_TYPE_1G_BASE_ZX },
|
||||
{ "1G_BASE_CX", SFF_MODULE_TYPE_1G_BASE_CX },
|
||||
{ "1G_BASE_T", SFF_MODULE_TYPE_1G_BASE_T },
|
||||
{ "100_BASE_LX", SFF_MODULE_TYPE_100_BASE_LX },
|
||||
{ "100_BASE_FX", SFF_MODULE_TYPE_100_BASE_FX },
|
||||
{ "4X_MUX", SFF_MODULE_TYPE_4X_MUX },
|
||||
{ NULL, 0 }
|
||||
};
|
||||
|
||||
aim_map_si_t sff_module_type_desc_map[] =
|
||||
{
|
||||
{ "100G-AOC", SFF_MODULE_TYPE_100G_AOC },
|
||||
{ "100GBASE-CR4", SFF_MODULE_TYPE_100G_BASE_CR4 },
|
||||
{ "100GBASE-SR4", SFF_MODULE_TYPE_100G_BASE_SR4 },
|
||||
{ "100GBASE-LR4", SFF_MODULE_TYPE_100G_BASE_LR4 },
|
||||
{ "100G-CWDM4", SFF_MODULE_TYPE_100G_CWDM4 },
|
||||
{ "100G-PSM4", SFF_MODULE_TYPE_100G_PSM4 },
|
||||
{ "100G-SWDM4", SFF_MODULE_TYPE_100G_SWDM4 },
|
||||
{ "40GBASE-CR4", SFF_MODULE_TYPE_40G_BASE_CR4 },
|
||||
{ "40GBASE-SR4", SFF_MODULE_TYPE_40G_BASE_SR4 },
|
||||
{ "40GBASE-LR4", SFF_MODULE_TYPE_40G_BASE_LR4 },
|
||||
{ "40GBASE-LM4", SFF_MODULE_TYPE_40G_BASE_LM4 },
|
||||
{ "40GBASE-ACTIVE", SFF_MODULE_TYPE_40G_BASE_ACTIVE },
|
||||
{ "40GBASE-CR", SFF_MODULE_TYPE_40G_BASE_CR },
|
||||
{ "40GBASE-SR2", SFF_MODULE_TYPE_40G_BASE_SR2 },
|
||||
{ "40GBASE-SM4", SFF_MODULE_TYPE_40G_BASE_SM4 },
|
||||
{ "40GBASE-ER4", SFF_MODULE_TYPE_40G_BASE_ER4 },
|
||||
{ "25GBASE-CR", SFF_MODULE_TYPE_25G_BASE_CR },
|
||||
{ "25GBASE-SR", SFF_MODULE_TYPE_25G_BASE_SR },
|
||||
{ "25GBASE-LR", SFF_MODULE_TYPE_25G_BASE_LR },
|
||||
{ "25GBASE-AOC", SFF_MODULE_TYPE_25G_BASE_AOC },
|
||||
{ "10GBASE-SR", SFF_MODULE_TYPE_10G_BASE_SR },
|
||||
{ "10GBASE-LR", SFF_MODULE_TYPE_10G_BASE_LR },
|
||||
{ "10GBASE-LRM", SFF_MODULE_TYPE_10G_BASE_LRM },
|
||||
{ "10GBASE-ER", SFF_MODULE_TYPE_10G_BASE_ER },
|
||||
{ "10GBASE-CR", SFF_MODULE_TYPE_10G_BASE_CR },
|
||||
{ "10GBASE-SX", SFF_MODULE_TYPE_10G_BASE_SX },
|
||||
{ "10GBASE-LX", SFF_MODULE_TYPE_10G_BASE_LX },
|
||||
{ "10GBASE-ZR", SFF_MODULE_TYPE_10G_BASE_ZR },
|
||||
{ "10GBASE-SRL", SFF_MODULE_TYPE_10G_BASE_SRL },
|
||||
{ "1GBASE-SX", SFF_MODULE_TYPE_1G_BASE_SX },
|
||||
{ "1GBASE-LX", SFF_MODULE_TYPE_1G_BASE_LX },
|
||||
{ "1GBASE-ZX", SFF_MODULE_TYPE_1G_BASE_ZX },
|
||||
{ "1GBASE-CX", SFF_MODULE_TYPE_1G_BASE_CX },
|
||||
{ "1GBASE-T", SFF_MODULE_TYPE_1G_BASE_T },
|
||||
{ "100BASE-LX", SFF_MODULE_TYPE_100_BASE_LX },
|
||||
{ "100BASE-FX", SFF_MODULE_TYPE_100_BASE_FX },
|
||||
{ "4X-MUX", SFF_MODULE_TYPE_4X_MUX },
|
||||
{ NULL, 0 }
|
||||
};
|
||||
|
||||
const char*
|
||||
sff_module_type_name(sff_module_type_t e)
|
||||
{
|
||||
const char* name;
|
||||
if(aim_map_si_i(&name, e, sff_module_type_map, 0)) {
|
||||
return name;
|
||||
}
|
||||
else {
|
||||
return "-invalid value for enum type 'sff_module_type'";
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
sff_module_type_value(const char* str, sff_module_type_t* e, int substr)
|
||||
{
|
||||
int i;
|
||||
AIM_REFERENCE(substr);
|
||||
if(aim_map_si_s(&i, str, sff_module_type_map, 0)) {
|
||||
/* Enum Found */
|
||||
*e = i;
|
||||
return 0;
|
||||
}
|
||||
else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
const char*
|
||||
sff_module_type_desc(sff_module_type_t e)
|
||||
{
|
||||
const char* name;
|
||||
if(aim_map_si_i(&name, e, sff_module_type_desc_map, 0)) {
|
||||
return name;
|
||||
}
|
||||
else {
|
||||
return "-invalid value for enum type 'sff_module_type'";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
aim_map_si_t sff_sfp_type_map[] =
|
||||
{
|
||||
{ "SFP", SFF_SFP_TYPE_SFP },
|
||||
{ "QSFP", SFF_SFP_TYPE_QSFP },
|
||||
{ "QSFP_PLUS", SFF_SFP_TYPE_QSFP_PLUS },
|
||||
{ "QSFP28", SFF_SFP_TYPE_QSFP28 },
|
||||
{ "SFP28", SFF_SFP_TYPE_SFP28 },
|
||||
{ NULL, 0 }
|
||||
};
|
||||
|
||||
aim_map_si_t sff_sfp_type_desc_map[] =
|
||||
{
|
||||
{ "SFP", SFF_SFP_TYPE_SFP },
|
||||
{ "QSFP", SFF_SFP_TYPE_QSFP },
|
||||
{ "QSFP+", SFF_SFP_TYPE_QSFP_PLUS },
|
||||
{ "QSFP28", SFF_SFP_TYPE_QSFP28 },
|
||||
{ "SFP28", SFF_SFP_TYPE_SFP28 },
|
||||
{ NULL, 0 }
|
||||
};
|
||||
|
||||
const char*
|
||||
sff_sfp_type_name(sff_sfp_type_t e)
|
||||
{
|
||||
const char* name;
|
||||
if(aim_map_si_i(&name, e, sff_sfp_type_map, 0)) {
|
||||
return name;
|
||||
}
|
||||
else {
|
||||
return "-invalid value for enum type 'sff_sfp_type'";
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
sff_sfp_type_value(const char* str, sff_sfp_type_t* e, int substr)
|
||||
{
|
||||
int i;
|
||||
AIM_REFERENCE(substr);
|
||||
if(aim_map_si_s(&i, str, sff_sfp_type_map, 0)) {
|
||||
/* Enum Found */
|
||||
*e = i;
|
||||
return 0;
|
||||
}
|
||||
else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
const char*
|
||||
sff_sfp_type_desc(sff_sfp_type_t e)
|
||||
{
|
||||
const char* name;
|
||||
if(aim_map_si_i(&name, e, sff_sfp_type_desc_map, 0)) {
|
||||
return name;
|
||||
}
|
||||
else {
|
||||
return "-invalid value for enum type 'sff_sfp_type'";
|
||||
}
|
||||
}
|
||||
|
||||
/* <auto.end.enum(ALL).source> */
|
||||
|
||||
@@ -1,13 +0,0 @@
|
||||
/**************************************************************************//**
|
||||
*
|
||||
* sff Internal Header
|
||||
*
|
||||
*****************************************************************************/
|
||||
#ifndef __SFF_INT_H__
|
||||
#define __SFF_INT_H__
|
||||
|
||||
#include <sff/sff_config.h>
|
||||
|
||||
int sff_nonstandard_lookup(sff_info_t* info);
|
||||
|
||||
#endif /* __SFF_INT_H__ */
|
||||
@@ -1,18 +0,0 @@
|
||||
/**************************************************************************//**
|
||||
*
|
||||
*
|
||||
*
|
||||
*****************************************************************************/
|
||||
#include <sff/sff_config.h>
|
||||
|
||||
#include "sff_log.h"
|
||||
/*
|
||||
* sff log struct.
|
||||
*/
|
||||
AIM_LOG_STRUCT_DEFINE(
|
||||
SFF_CONFIG_LOG_OPTIONS_DEFAULT,
|
||||
SFF_CONFIG_LOG_BITS_DEFAULT,
|
||||
NULL, /* Custom log map */
|
||||
SFF_CONFIG_LOG_CUSTOM_BITS_DEFAULT
|
||||
);
|
||||
|
||||
@@ -1,23 +0,0 @@
|
||||
/**************************************************************************//**
|
||||
*
|
||||
*
|
||||
*
|
||||
*****************************************************************************/
|
||||
#include <sff/sff_config.h>
|
||||
|
||||
#include "sff_log.h"
|
||||
|
||||
static int
|
||||
datatypes_init__(void)
|
||||
{
|
||||
#define SFF_ENUMERATION_ENTRY(_enum_name, _desc) AIM_DATATYPE_MAP_REGISTER(_enum_name, _enum_name##_map, _desc, AIM_LOG_INTERNAL);
|
||||
#include <sff/sff.x>
|
||||
return 0;
|
||||
}
|
||||
|
||||
void __sff_module_init__(void)
|
||||
{
|
||||
AIM_LOG_STRUCT_REGISTER();
|
||||
datatypes_init__();
|
||||
}
|
||||
|
||||
@@ -1,143 +0,0 @@
|
||||
/************************************************************
|
||||
* <bsn.cl fy=2014 v=onl>
|
||||
*
|
||||
* Copyright 2014, 2015 Big Switch Networks, Inc.
|
||||
*
|
||||
* Licensed under the Eclipse Public License, Version 1.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
|
||||
* either express or implied. See the License for the specific
|
||||
* language governing permissions and limitations under the
|
||||
* License.
|
||||
*
|
||||
* </bsn.cl>
|
||||
************************************************************
|
||||
*
|
||||
* SFF Utility for eeprom files.
|
||||
*
|
||||
***********************************************************/
|
||||
#include <sff/sff_config.h>
|
||||
|
||||
#if SFF_CONFIG_INCLUDE_SFF_TOOL == 1
|
||||
|
||||
#include <sff/sff.h>
|
||||
#include <unistd.h>
|
||||
#include <BigList/biglist.h>
|
||||
#include <limits.h>
|
||||
|
||||
int
|
||||
sff_tool(int argc, char* argv[])
|
||||
{
|
||||
int rv = 0;
|
||||
int i;
|
||||
int c;
|
||||
|
||||
int s = 0;
|
||||
int e = 0;
|
||||
int help = 0;
|
||||
int n = 0;
|
||||
int v = 0;
|
||||
int sin = 0;
|
||||
|
||||
biglist_t* fnames=NULL;
|
||||
|
||||
|
||||
while( (c = getopt(argc, argv, "sehnvi")) != -1) {
|
||||
switch(c)
|
||||
{
|
||||
case 's': s = 1; break;
|
||||
case 'e': e = 1; break;
|
||||
case 'h': help=1; rv=0; break;
|
||||
case 'n': n=1; break;
|
||||
case 'v': v=1; break;
|
||||
case 'i': sin=1; break;
|
||||
default: help=1; rv = 1; break;
|
||||
}
|
||||
}
|
||||
|
||||
if(help) {
|
||||
printf("Usage: %s [OPTIONS] [FILES]\n", argv[0]);
|
||||
printf(" -i Read eeprom data from stdin.\n");
|
||||
printf(" -s Read filenames from stdin. \n");
|
||||
printf(" -n Print the filename if successful.\n");
|
||||
printf(" -v Print the filename always.\n");
|
||||
printf(" -e Show the raw eeprom data.\n");
|
||||
printf(" -h Help.\n");
|
||||
return rv;
|
||||
}
|
||||
|
||||
if(sin) {
|
||||
uint8_t data[512];
|
||||
if(fread(data, 256, 1, stdin) == 1) {
|
||||
sff_info_t info;
|
||||
sff_info_init(&info, data);
|
||||
if(info.supported) {
|
||||
sff_info_show(&info, &aim_pvs_stdout);
|
||||
return 0;
|
||||
}
|
||||
else {
|
||||
aim_printf(&aim_pvs_stderr, "The eeprom data could not be parsed.\n");
|
||||
}
|
||||
}
|
||||
else {
|
||||
aim_printf(&aim_pvs_stderr, "Error reading eeprom data from stdin.\n");
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
if(s) {
|
||||
/* Read filenames from stdin */
|
||||
char b[PATH_MAX];
|
||||
char* l;
|
||||
while((l = fgets(b, PATH_MAX, stdin))) {
|
||||
int len=SFF_STRLEN(l);
|
||||
if(len) {
|
||||
if(l[len-1] == '\n') {
|
||||
l[len-1] = 0;
|
||||
}
|
||||
fnames = biglist_append(fnames, aim_strdup(l));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Read from command line. This can be used together with -s */
|
||||
for(i = optind; i < argc; i++) {
|
||||
fnames = biglist_append(fnames, aim_strdup(argv[i]));
|
||||
}
|
||||
|
||||
biglist_t* ble;
|
||||
char* f;
|
||||
BIGLIST_FOREACH_DATA(ble, fnames, char*, f) {
|
||||
sff_info_t info;
|
||||
memset(&info, 0, sizeof(info));
|
||||
if( (rv = sff_info_init_file(&info, f)) >= 0) {
|
||||
if(n || v) {
|
||||
aim_printf(&aim_pvs_stdout, "%s\n", f);
|
||||
}
|
||||
if(e) {
|
||||
aim_printf(&aim_pvs_stdout, "eeprom:\n%{data}\n", info.eeprom, sizeof(info.eeprom));
|
||||
}
|
||||
sff_info_show(&info, &aim_pvs_stdout);
|
||||
}
|
||||
else if(v) {
|
||||
aim_printf(&aim_pvs_stdout, "%s: failed.\n", f);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#else
|
||||
int __not_empty__;
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1 +0,0 @@
|
||||
*_utest.mk
|
||||
@@ -1,15 +0,0 @@
|
||||
###############################################################################
|
||||
#
|
||||
#
|
||||
#
|
||||
###############################################################################
|
||||
include $(ONL)/make/config.amd64.mk
|
||||
MODULE := sff_utest
|
||||
TEST_MODULE := sff
|
||||
DEPENDMODULES := AIM BigList cjson_util cjson IOF
|
||||
GLOBAL_CFLAGS += -DAIM_CONFIG_INCLUDE_MODULES_INIT=1
|
||||
GLOBAL_CFLAGS += -DAIM_CONFIG_INCLUDE_MAIN=1
|
||||
GLOBAL_CFLAGS += -DSFF_CONFIG_INCLUDE_EXT_CC_CHECK=1
|
||||
GLOBAL_CFLAGS += -DSFF_CONFIG_INCLUDE_DATABASE=1
|
||||
GLOBAL_LINK_LIBS += -lrt -lpthread -lm
|
||||
include $(BUILDER)/build-unit-test.mk
|
||||
@@ -1,106 +0,0 @@
|
||||
/**************************************************************************//**
|
||||
*
|
||||
*
|
||||
*
|
||||
*****************************************************************************/
|
||||
#include <sff/sff_config.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <AIM/aim.h>
|
||||
#include <sff/sff.h>
|
||||
#include <sff/sff_db.h>
|
||||
|
||||
int
|
||||
aim_main(int argc, char* argv[])
|
||||
{
|
||||
int i;
|
||||
|
||||
sff_db_entry_t* entries;
|
||||
sff_db_entry_t* p;
|
||||
int count;
|
||||
|
||||
sff_db_get(&entries, &count);
|
||||
|
||||
for(i = 0, p=entries; i < count; i++, p++) {
|
||||
int rv;
|
||||
sff_eeprom_t se;
|
||||
|
||||
aim_printf(&aim_pvs_stdout, "Verifying entry %d: %s:%s:%s...\n",
|
||||
i,
|
||||
p->se.info.vendor,
|
||||
p->se.info.model,
|
||||
p->se.info.serial);
|
||||
|
||||
|
||||
if( (rv=sff_eeprom_parse(&se, p->se.eeprom)) < 0) {
|
||||
AIM_DIE("index=%d sff_eeprom_parse=%d\n", i, rv);
|
||||
}
|
||||
if (!se.identified) {
|
||||
AIM_DIE("index=%d identified=0\n", i);
|
||||
}
|
||||
if(strcmp(se.info.vendor, p->se.info.vendor)) {
|
||||
AIM_DIE("index=%d vendor expected '%s' got '%s'",
|
||||
i, p->se.info.vendor, se.info.vendor);
|
||||
}
|
||||
if(strcmp(se.info.model, p->se.info.model)) {
|
||||
AIM_DIE("index=%d model expected '%s' got '%s'",
|
||||
i, p->se.info.model, se.info.model);
|
||||
}
|
||||
if(strcmp(se.info.serial, p->se.info.serial)) {
|
||||
AIM_DIE("index=%d serial expected '%s' got '%s'",
|
||||
i, p->se.info.serial, se.info.serial);
|
||||
}
|
||||
if(se.info.sfp_type != p->se.info.sfp_type) {
|
||||
AIM_DIE("index=%d sfp_type expected '%{sff_sfp_type}' got '%{sff_sfp_type}'",
|
||||
i, p->se.info.sfp_type, se.info.sfp_type);
|
||||
}
|
||||
if(strcmp(se.info.sfp_type_name, p->se.info.sfp_type_name)) {
|
||||
AIM_DIE("index=%d type_name expected '%s' got '%s'",
|
||||
i, p->se.info.sfp_type, se.info.sfp_type);
|
||||
}
|
||||
if(se.info.module_type != p->se.info.module_type) {
|
||||
AIM_DIE("index=%d module_type expected '%{sff_module_type}' got '%{sff_module_type}'",
|
||||
i, p->se.info.module_type, se.info.module_type);
|
||||
}
|
||||
if(se.info.media_type != p->se.info.media_type) {
|
||||
AIM_DIE("index=%d media_type expected '%{sff_media_type}' got '%{sff_media_type}'\n",
|
||||
i, p->se.info.media_type, se.info.media_type);
|
||||
}
|
||||
if(strcmp(se.info.media_type_name, p->se.info.media_type_name)) {
|
||||
AIM_DIE("index=%d media_type_name expected '%s' got '%s'",
|
||||
i, p->se.info.media_type_name, se.info.media_type_name);
|
||||
}
|
||||
if (se.info.caps != p->se.info.caps) {
|
||||
AIM_DIE("index=%d caps expected '%{sff_module_caps}' got '%{sff_module_caps}'",
|
||||
i, p->se.info.caps, se.info.caps);
|
||||
}
|
||||
|
||||
if(se.info.length != p->se.info.length) {
|
||||
AIM_DIE("index=%d length expected %d got %d",
|
||||
i, p->se.info.length, se.info.length);
|
||||
}
|
||||
if(se.info.length == -1 && se.info.length_desc[0]) {
|
||||
AIM_DIE("index=%d length_desc expected '%s' got '%s'",
|
||||
i, '\0', se.info.length_desc);
|
||||
}
|
||||
else if(se.info.length != -1) {
|
||||
char tmp[32];
|
||||
snprintf(tmp, sizeof(tmp), "%dm", se.info.length);
|
||||
if(strcmp(tmp, se.info.length_desc)) {
|
||||
AIM_DIE("index=%d length_desc expected '%s' got '%s'",
|
||||
i, tmp, se.info.length_desc);
|
||||
}
|
||||
}
|
||||
|
||||
aim_printf(&aim_pvs_stdout, "Verifying entry %d: %s:%s:%s...PASSED\n",
|
||||
i,
|
||||
p->se.info.vendor,
|
||||
p->se.info.model,
|
||||
p->se.info.serial);
|
||||
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
2
packages/platforms/accton/x86-64/x86-64-accton-as5916-26xb/.gitignore
vendored
Normal file
2
packages/platforms/accton/x86-64/x86-64-accton-as5916-26xb/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
*x86*64*accton*as5916*26xb*.mk
|
||||
onlpdump.mk
|
||||
@@ -0,0 +1 @@
|
||||
include $(ONL)/make/pkg.mk
|
||||
@@ -0,0 +1 @@
|
||||
include $(ONL)/make/pkg.mk
|
||||
@@ -0,0 +1 @@
|
||||
!include $ONL_TEMPLATES/platform-modules.yml VENDOR=accton BASENAME=x86-64-accton-as5916-26xb ARCH=amd64 KERNELS="onl-kernel-4.14-lts-x86-64-all:amd64"
|
||||
1
packages/platforms/accton/x86-64/x86-64-accton-as5916-26xb/modules/builds/.gitignore
vendored
Normal file
1
packages/platforms/accton/x86-64/x86-64-accton-as5916-26xb/modules/builds/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
lib
|
||||
@@ -0,0 +1,6 @@
|
||||
KERNELS := onl-kernel-4.14-lts-x86-64-all:amd64
|
||||
KMODULES := $(wildcard *.c)
|
||||
VENDOR := accton
|
||||
BASENAME := x86-64-accton-as5916-26xb
|
||||
ARCH := x86_64
|
||||
include $(ONL)/make/kmodule.mk
|
||||
@@ -0,0 +1,457 @@
|
||||
/*
|
||||
* Copyright (C) Brandon Chuang <brandon_chuang@accton.com.tw>
|
||||
*
|
||||
* This module supports the accton cpld that hold the channel select
|
||||
* mechanism for other i2c slave devices, such as SFP.
|
||||
* This includes the:
|
||||
* Accton as5916_54x CPLD1/CPLD2
|
||||
*
|
||||
* Based on:
|
||||
* pca954x.c from Kumar Gala <galak@kernel.crashing.org>
|
||||
* Copyright (C) 2006
|
||||
*
|
||||
* Based on:
|
||||
* pca954x.c from Ken Harrenstien
|
||||
* Copyright (C) 2004 Google, Inc. (Ken Harrenstien)
|
||||
*
|
||||
* Based on:
|
||||
* i2c-virtual_cb.c from Brian Kuschak <bkuschak@yahoo.com>
|
||||
* and
|
||||
* pca9540.c from Jean Delvare <khali@linux-fr.org>.
|
||||
*
|
||||
* This file is licensed under the terms of the GNU General Public
|
||||
* License version 2. This program is licensed "as is" without any
|
||||
* warranty of any kind, whether express or implied.
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/version.h>
|
||||
#include <linux/stat.h>
|
||||
#include <linux/sysfs.h>
|
||||
#include <linux/hwmon-sysfs.h>
|
||||
#include <linux/ipmi.h>
|
||||
#include <linux/ipmi_smi.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#define DRVNAME "as5916_26xb_fan"
|
||||
#define ACCTON_IPMI_NETFN 0x34
|
||||
#define IPMI_FAN_READ_CMD 0x14
|
||||
#define IPMI_FAN_WRITE_CMD 0x15
|
||||
#define IPMI_TIMEOUT (5 * HZ)
|
||||
|
||||
static void ipmi_msg_handler(struct ipmi_recv_msg *msg, void *user_msg_data);
|
||||
static ssize_t set_fan(struct device *dev, struct device_attribute *da,
|
||||
const char *buf, size_t count);
|
||||
static ssize_t show_fan(struct device *dev, struct device_attribute *attr, char *buf);
|
||||
static int as5916_26xb_fan_probe(struct platform_device *pdev);
|
||||
static int as5916_26xb_fan_remove(struct platform_device *pdev);
|
||||
|
||||
enum fan_id {
|
||||
FAN_1,
|
||||
FAN_2,
|
||||
FAN_3,
|
||||
FAN_4,
|
||||
FAN_5,
|
||||
NUM_OF_FAN
|
||||
};
|
||||
|
||||
enum fan_data_index {
|
||||
FAN_PRESENT,
|
||||
FAN_PWM,
|
||||
FAN_SPEED0,
|
||||
FAN_SPEED1,
|
||||
FAN_DATA_COUNT
|
||||
};
|
||||
|
||||
struct ipmi_data {
|
||||
struct completion read_complete;
|
||||
struct ipmi_addr address;
|
||||
ipmi_user_t user;
|
||||
int interface;
|
||||
|
||||
struct kernel_ipmi_msg tx_message;
|
||||
long tx_msgid;
|
||||
|
||||
void *rx_msg_data;
|
||||
unsigned short rx_msg_len;
|
||||
unsigned char rx_result;
|
||||
int rx_recv_type;
|
||||
|
||||
struct ipmi_user_hndl ipmi_hndlrs;
|
||||
};
|
||||
|
||||
struct as5916_26xb_fan_data {
|
||||
struct platform_device *pdev;
|
||||
struct mutex update_lock;
|
||||
char valid; /* != 0 if registers are valid */
|
||||
unsigned long last_updated; /* In jiffies */
|
||||
unsigned char ipmi_resp[20];
|
||||
struct ipmi_data ipmi;
|
||||
unsigned char ipmi_tx_data[3]; /* 0: FAN id, 1: 0x02, 2: PWM */
|
||||
};
|
||||
|
||||
struct as5916_26xb_fan_data *data = NULL;
|
||||
|
||||
static struct platform_driver as5916_26xb_fan_driver = {
|
||||
.probe = as5916_26xb_fan_probe,
|
||||
.remove = as5916_26xb_fan_remove,
|
||||
.driver = {
|
||||
.name = DRVNAME,
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
};
|
||||
|
||||
#define FAN_PRESENT_ATTR_ID(index) FAN##index##_PRESENT
|
||||
#define FAN_PWM_ATTR_ID(index) FAN##index##_PWM
|
||||
#define FAN_RPM_ATTR_ID(index) FAN##index##_INPUT
|
||||
|
||||
#define FAN_ATTR(fan_id) \
|
||||
FAN_PRESENT_ATTR_ID(fan_id), \
|
||||
FAN_PWM_ATTR_ID(fan_id), \
|
||||
FAN_RPM_ATTR_ID(fan_id)
|
||||
|
||||
enum as5916_54x_fan_sysfs_attrs {
|
||||
FAN_ATTR(1),
|
||||
FAN_ATTR(2),
|
||||
FAN_ATTR(3),
|
||||
FAN_ATTR(4),
|
||||
FAN_ATTR(5),
|
||||
NUM_OF_FAN_ATTR,
|
||||
NUM_OF_PER_FAN_ATTR = (NUM_OF_FAN_ATTR/NUM_OF_FAN)
|
||||
};
|
||||
|
||||
/* fan attributes */
|
||||
#define DECLARE_FAN_SENSOR_DEVICE_ATTR(index) \
|
||||
static SENSOR_DEVICE_ATTR(fan##index##_present, S_IRUGO, show_fan, NULL, FAN##index##_PRESENT); \
|
||||
static SENSOR_DEVICE_ATTR(fan##index##_pwm, S_IWUSR | S_IRUGO, show_fan, set_fan, FAN##index##_PWM); \
|
||||
static SENSOR_DEVICE_ATTR(fan##index##_input, S_IRUGO, show_fan, NULL, FAN##index##_INPUT)
|
||||
#define DECLARE_FAN_ATTR(index) \
|
||||
&sensor_dev_attr_fan##index##_present.dev_attr.attr, \
|
||||
&sensor_dev_attr_fan##index##_pwm.dev_attr.attr, \
|
||||
&sensor_dev_attr_fan##index##_input.dev_attr.attr
|
||||
|
||||
DECLARE_FAN_SENSOR_DEVICE_ATTR(1);
|
||||
DECLARE_FAN_SENSOR_DEVICE_ATTR(2);
|
||||
DECLARE_FAN_SENSOR_DEVICE_ATTR(3);
|
||||
DECLARE_FAN_SENSOR_DEVICE_ATTR(4);
|
||||
DECLARE_FAN_SENSOR_DEVICE_ATTR(5);
|
||||
|
||||
static struct attribute *as5916_26xb_fan_attributes[] = {
|
||||
/* fan attributes */
|
||||
DECLARE_FAN_ATTR(1),
|
||||
DECLARE_FAN_ATTR(2),
|
||||
DECLARE_FAN_ATTR(3),
|
||||
DECLARE_FAN_ATTR(4),
|
||||
DECLARE_FAN_ATTR(5),
|
||||
NULL
|
||||
};
|
||||
|
||||
static const struct attribute_group as5916_26xb_fan_group = {
|
||||
.attrs = as5916_26xb_fan_attributes,
|
||||
};
|
||||
|
||||
/* Functions to talk to the IPMI layer */
|
||||
|
||||
/* Initialize IPMI address, message buffers and user data */
|
||||
static int init_ipmi_data(struct ipmi_data *ipmi, int iface,
|
||||
struct device *dev)
|
||||
{
|
||||
int err;
|
||||
|
||||
init_completion(&ipmi->read_complete);
|
||||
|
||||
/* Initialize IPMI address */
|
||||
ipmi->address.addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE;
|
||||
ipmi->address.channel = IPMI_BMC_CHANNEL;
|
||||
ipmi->address.data[0] = 0;
|
||||
ipmi->interface = iface;
|
||||
|
||||
/* Initialize message buffers */
|
||||
ipmi->tx_msgid = 0;
|
||||
ipmi->tx_message.netfn = ACCTON_IPMI_NETFN;
|
||||
|
||||
ipmi->ipmi_hndlrs.ipmi_recv_hndl = ipmi_msg_handler;
|
||||
|
||||
/* Create IPMI messaging interface user */
|
||||
err = ipmi_create_user(ipmi->interface, &ipmi->ipmi_hndlrs,
|
||||
ipmi, &ipmi->user);
|
||||
if (err < 0) {
|
||||
dev_err(dev, "Unable to register user with IPMI "
|
||||
"interface %d\n", ipmi->interface);
|
||||
return -EACCES;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Send an IPMI command */
|
||||
static int ipmi_send_message(struct ipmi_data *ipmi, unsigned char cmd,
|
||||
unsigned char *tx_data, unsigned short tx_len,
|
||||
unsigned char *rx_data, unsigned short rx_len)
|
||||
{
|
||||
int err;
|
||||
|
||||
ipmi->tx_message.cmd = cmd;
|
||||
ipmi->tx_message.data = tx_data;
|
||||
ipmi->tx_message.data_len = tx_len;
|
||||
ipmi->rx_msg_data = rx_data;
|
||||
ipmi->rx_msg_len = rx_len;
|
||||
|
||||
err = ipmi_validate_addr(&ipmi->address, sizeof(ipmi->address));
|
||||
if (err)
|
||||
goto addr_err;
|
||||
|
||||
ipmi->tx_msgid++;
|
||||
err = ipmi_request_settime(ipmi->user, &ipmi->address, ipmi->tx_msgid,
|
||||
&ipmi->tx_message, ipmi, 0, 0, 0);
|
||||
if (err)
|
||||
goto ipmi_req_err;
|
||||
|
||||
err = wait_for_completion_timeout(&ipmi->read_complete, IPMI_TIMEOUT);
|
||||
if (!err)
|
||||
goto ipmi_timeout_err;
|
||||
|
||||
return 0;
|
||||
|
||||
ipmi_timeout_err:
|
||||
err = -ETIMEDOUT;
|
||||
dev_err(&data->pdev->dev, "request_timeout=%x\n", err);
|
||||
return err;
|
||||
ipmi_req_err:
|
||||
dev_err(&data->pdev->dev, "request_settime=%x\n", err);
|
||||
return err;
|
||||
addr_err:
|
||||
dev_err(&data->pdev->dev, "validate_addr=%x\n", err);
|
||||
return err;
|
||||
}
|
||||
|
||||
/* Dispatch IPMI messages to callers */
|
||||
static void ipmi_msg_handler(struct ipmi_recv_msg *msg, void *user_msg_data)
|
||||
{
|
||||
unsigned short rx_len;
|
||||
struct ipmi_data *ipmi = user_msg_data;
|
||||
|
||||
if (msg->msgid != ipmi->tx_msgid) {
|
||||
dev_err(&data->pdev->dev, "Mismatch between received msgid "
|
||||
"(%02x) and transmitted msgid (%02x)!\n",
|
||||
(int)msg->msgid,
|
||||
(int)ipmi->tx_msgid);
|
||||
ipmi_free_recv_msg(msg);
|
||||
return;
|
||||
}
|
||||
|
||||
ipmi->rx_recv_type = msg->recv_type;
|
||||
if (msg->msg.data_len > 0)
|
||||
ipmi->rx_result = msg->msg.data[0];
|
||||
else
|
||||
ipmi->rx_result = IPMI_UNKNOWN_ERR_COMPLETION_CODE;
|
||||
|
||||
if (msg->msg.data_len > 1) {
|
||||
rx_len = msg->msg.data_len - 1;
|
||||
if (ipmi->rx_msg_len < rx_len)
|
||||
rx_len = ipmi->rx_msg_len;
|
||||
ipmi->rx_msg_len = rx_len;
|
||||
memcpy(ipmi->rx_msg_data, msg->msg.data + 1, ipmi->rx_msg_len);
|
||||
} else
|
||||
ipmi->rx_msg_len = 0;
|
||||
|
||||
ipmi_free_recv_msg(msg);
|
||||
complete(&ipmi->read_complete);
|
||||
}
|
||||
|
||||
static struct as5916_26xb_fan_data *as5916_26xb_fan_update_device(void)
|
||||
{
|
||||
int status = 0;
|
||||
|
||||
if (time_before(jiffies, data->last_updated + HZ * 5) && data->valid) {
|
||||
return data;
|
||||
}
|
||||
|
||||
mutex_lock(&data->update_lock);
|
||||
|
||||
data->valid = 0;
|
||||
status = ipmi_send_message(&data->ipmi, IPMI_FAN_READ_CMD, NULL, 0,
|
||||
data->ipmi_resp, sizeof(data->ipmi_resp));
|
||||
if (unlikely(status != 0)) {
|
||||
goto exit;
|
||||
}
|
||||
|
||||
if (unlikely(data->ipmi.rx_result != 0)) {
|
||||
status = -EIO;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
data->last_updated = jiffies;
|
||||
data->valid = 1;
|
||||
|
||||
exit:
|
||||
mutex_unlock(&data->update_lock);
|
||||
return data;
|
||||
}
|
||||
|
||||
static ssize_t show_fan(struct device *dev, struct device_attribute *da, char *buf)
|
||||
{
|
||||
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
|
||||
unsigned char fid = attr->index / NUM_OF_PER_FAN_ATTR;
|
||||
struct as5916_26xb_fan_data *data = NULL;
|
||||
int value = 0;
|
||||
int index = 0;
|
||||
int present = 0;
|
||||
|
||||
data = as5916_26xb_fan_update_device();
|
||||
if (!data->valid) {
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
index = fid * FAN_DATA_COUNT; /* base index */
|
||||
present = !data->ipmi_resp[index + FAN_PRESENT];
|
||||
|
||||
switch (attr->index) {
|
||||
case FAN1_PRESENT:
|
||||
case FAN2_PRESENT:
|
||||
case FAN3_PRESENT:
|
||||
case FAN4_PRESENT:
|
||||
case FAN5_PRESENT:
|
||||
value = !data->ipmi_resp[index + FAN_PRESENT];
|
||||
break;
|
||||
case FAN1_PWM:
|
||||
case FAN2_PWM:
|
||||
case FAN3_PWM:
|
||||
case FAN4_PWM:
|
||||
case FAN5_PWM:
|
||||
value = (data->ipmi_resp[index + FAN_PWM] + 1) * 625 / 100;
|
||||
break;
|
||||
case FAN1_INPUT:
|
||||
case FAN2_INPUT:
|
||||
case FAN3_INPUT:
|
||||
case FAN4_INPUT:
|
||||
case FAN5_INPUT:
|
||||
value = (int)data->ipmi_resp[index + FAN_SPEED0] |
|
||||
(int)data->ipmi_resp[index + FAN_SPEED1] << 8;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return sprintf(buf, "%d\n", present ? value : 0);
|
||||
}
|
||||
|
||||
static ssize_t set_fan(struct device *dev, struct device_attribute *da,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
long pwm;
|
||||
int status;
|
||||
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
|
||||
unsigned char fid = attr->index / NUM_OF_PER_FAN_ATTR;
|
||||
|
||||
status = kstrtol(buf, 10, &pwm);
|
||||
if (status) {
|
||||
return status;
|
||||
}
|
||||
|
||||
pwm = (pwm * 100) / 625 - 1; /* Convert pwm to register value */
|
||||
|
||||
/* Send IPMI write command */
|
||||
data->ipmi_tx_data[0] = fid + 1; /* FAN ID base id for ipmi start from 1 */
|
||||
data->ipmi_tx_data[1] = 0x02;
|
||||
data->ipmi_tx_data[2] = pwm;
|
||||
status = ipmi_send_message(&data->ipmi, IPMI_FAN_WRITE_CMD,
|
||||
data->ipmi_tx_data, sizeof(data->ipmi_tx_data), NULL, 0);
|
||||
if (unlikely(status != 0)) {
|
||||
return status;
|
||||
}
|
||||
|
||||
if (unlikely(data->ipmi.rx_result != 0)) {
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
/* Update pwm to ipmi_resp buffer to prevent from the impact of lazy update */
|
||||
data->ipmi_resp[fid * FAN_DATA_COUNT + FAN_PWM] = pwm;
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static int as5916_26xb_fan_probe(struct platform_device *pdev)
|
||||
{
|
||||
int status = -1;
|
||||
|
||||
/* Register sysfs hooks */
|
||||
status = sysfs_create_group(&pdev->dev.kobj, &as5916_26xb_fan_group);
|
||||
if (status) {
|
||||
goto exit;
|
||||
}
|
||||
|
||||
dev_info(&pdev->dev, "device created\n");
|
||||
|
||||
return 0;
|
||||
|
||||
exit:
|
||||
return status;
|
||||
}
|
||||
|
||||
static int as5916_26xb_fan_remove(struct platform_device *pdev)
|
||||
{
|
||||
sysfs_remove_group(&pdev->dev.kobj, &as5916_26xb_fan_group);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __init as5916_26xb_fan_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
data = kzalloc(sizeof(struct as5916_26xb_fan_data), GFP_KERNEL);
|
||||
if (!data) {
|
||||
ret = -ENOMEM;
|
||||
goto alloc_err;
|
||||
}
|
||||
|
||||
mutex_init(&data->update_lock);
|
||||
data->valid = 0;
|
||||
|
||||
ret = platform_driver_register(&as5916_26xb_fan_driver);
|
||||
if (ret < 0) {
|
||||
goto dri_reg_err;
|
||||
}
|
||||
|
||||
data->pdev = platform_device_register_simple(DRVNAME, -1, NULL, 0);
|
||||
if (IS_ERR(data->pdev)) {
|
||||
ret = PTR_ERR(data->pdev);
|
||||
goto dev_reg_err;
|
||||
}
|
||||
|
||||
/* Set up IPMI interface */
|
||||
ret = init_ipmi_data(&data->ipmi, 0, &data->pdev->dev);
|
||||
if (ret)
|
||||
goto ipmi_err;
|
||||
|
||||
return 0;
|
||||
|
||||
ipmi_err:
|
||||
platform_device_unregister(data->pdev);
|
||||
dev_reg_err:
|
||||
platform_driver_unregister(&as5916_26xb_fan_driver);
|
||||
dri_reg_err:
|
||||
kfree(data);
|
||||
alloc_err:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void __exit as5916_26xb_fan_exit(void)
|
||||
{
|
||||
ipmi_destroy_user(data->ipmi.user);
|
||||
platform_device_unregister(data->pdev);
|
||||
platform_driver_unregister(&as5916_26xb_fan_driver);
|
||||
kfree(data);
|
||||
}
|
||||
|
||||
MODULE_AUTHOR("Brandon Chuang <brandon_chuang@accton.com.tw>");
|
||||
MODULE_DESCRIPTION("AS5916 26XB fan driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
module_init(as5916_26xb_fan_init);
|
||||
module_exit(as5916_26xb_fan_exit);
|
||||
|
||||
@@ -0,0 +1,465 @@
|
||||
/*
|
||||
* Copyright (C) Brandon Chuang <brandon_chuang@accton.com.tw>
|
||||
*
|
||||
* This module supports the accton cpld that hold the channel select
|
||||
* mechanism for other i2c slave devices, such as SFP.
|
||||
* This includes the:
|
||||
* Accton as5916_54x CPLD1/CPLD2
|
||||
*
|
||||
* Based on:
|
||||
* pca954x.c from Kumar Gala <galak@kernel.crashing.org>
|
||||
* Copyright (C) 2006
|
||||
*
|
||||
* Based on:
|
||||
* pca954x.c from Ken Harrenstien
|
||||
* Copyright (C) 2004 Google, Inc. (Ken Harrenstien)
|
||||
*
|
||||
* Based on:
|
||||
* i2c-virtual_cb.c from Brian Kuschak <bkuschak@yahoo.com>
|
||||
* and
|
||||
* pca9540.c from Jean Delvare <khali@linux-fr.org>.
|
||||
*
|
||||
* This file is licensed under the terms of the GNU General Public
|
||||
* License version 2. This program is licensed "as is" without any
|
||||
* warranty of any kind, whether express or implied.
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/version.h>
|
||||
#include <linux/stat.h>
|
||||
#include <linux/sysfs.h>
|
||||
#include <linux/hwmon-sysfs.h>
|
||||
#include <linux/ipmi.h>
|
||||
#include <linux/ipmi_smi.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#define DRVNAME "as5916_26xb_led"
|
||||
#define ACCTON_IPMI_NETFN 0x34
|
||||
#define IPMI_LED_READ_CMD 0x1A
|
||||
#define IPMI_LED_WRITE_CMD 0x1B
|
||||
#define IPMI_TIMEOUT (5 * HZ)
|
||||
|
||||
static void ipmi_msg_handler(struct ipmi_recv_msg *msg, void *user_msg_data);
|
||||
static ssize_t set_led(struct device *dev, struct device_attribute *da,
|
||||
const char *buf, size_t count);
|
||||
static ssize_t show_led(struct device *dev, struct device_attribute *attr, char *buf);
|
||||
static int as5916_26xb_led_probe(struct platform_device *pdev);
|
||||
static int as5916_26xb_led_remove(struct platform_device *pdev);
|
||||
|
||||
enum led_data_index {
|
||||
LOC_INDEX,
|
||||
DIAG_RED_INDEX,
|
||||
DIAG_GREEN_INDEX
|
||||
};
|
||||
|
||||
struct ipmi_data {
|
||||
struct completion read_complete;
|
||||
struct ipmi_addr address;
|
||||
ipmi_user_t user;
|
||||
int interface;
|
||||
|
||||
struct kernel_ipmi_msg tx_message;
|
||||
long tx_msgid;
|
||||
|
||||
void *rx_msg_data;
|
||||
unsigned short rx_msg_len;
|
||||
unsigned char rx_result;
|
||||
int rx_recv_type;
|
||||
|
||||
struct ipmi_user_hndl ipmi_hndlrs;
|
||||
};
|
||||
|
||||
struct as5916_26xb_led_data {
|
||||
struct platform_device *pdev;
|
||||
struct mutex update_lock;
|
||||
char valid; /* != 0 if registers are valid */
|
||||
unsigned long last_updated; /* In jiffies */
|
||||
unsigned char ipmi_resp[3]; /* 0: LOC LED, 1: DIAG Red LED, 2: DIAG Green LED */
|
||||
struct ipmi_data ipmi;
|
||||
};
|
||||
|
||||
struct as5916_26xb_led_data *data = NULL;
|
||||
|
||||
static struct platform_driver as5916_26xb_led_driver = {
|
||||
.probe = as5916_26xb_led_probe,
|
||||
.remove = as5916_26xb_led_remove,
|
||||
.driver = {
|
||||
.name = DRVNAME,
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
};
|
||||
|
||||
enum led_light_mode {
|
||||
LED_MODE_OFF,
|
||||
LED_MODE_RED = 10,
|
||||
LED_MODE_RED_BLINKING = 11,
|
||||
LED_MODE_ORANGE = 12,
|
||||
LED_MODE_ORANGE_BLINKING = 13,
|
||||
LED_MODE_YELLOW = 14,
|
||||
LED_MODE_YELLOW_BLINKING = 15,
|
||||
LED_MODE_GREEN = 16,
|
||||
LED_MODE_GREEN_BLINKING = 17,
|
||||
LED_MODE_BLUE = 18,
|
||||
LED_MODE_BLUE_BLINKING = 19,
|
||||
LED_MODE_PURPLE = 20,
|
||||
LED_MODE_PURPLE_BLINKING = 21,
|
||||
LED_MODE_AUTO = 22,
|
||||
LED_MODE_AUTO_BLINKING = 23,
|
||||
LED_MODE_WHITE = 24,
|
||||
LED_MODE_WHITE_BLINKING = 25,
|
||||
LED_MODE_CYAN = 26,
|
||||
LED_MODE_CYAN_BLINKING = 27,
|
||||
LED_MODE_UNKNOWN = 99
|
||||
};
|
||||
|
||||
enum as5916_54x_led_sysfs_attrs {
|
||||
LED_LOC,
|
||||
LED_DIAG,
|
||||
LED_PSU1,
|
||||
LED_PSU2,
|
||||
LED_FAN
|
||||
};
|
||||
|
||||
static SENSOR_DEVICE_ATTR(led_loc, S_IWUSR | S_IRUGO, show_led, set_led, LED_LOC);
|
||||
static SENSOR_DEVICE_ATTR(led_diag, S_IWUSR | S_IRUGO, show_led, set_led, LED_DIAG);
|
||||
static SENSOR_DEVICE_ATTR(led_psu1, S_IWUSR | S_IRUGO, show_led, set_led, LED_PSU1);
|
||||
static SENSOR_DEVICE_ATTR(led_psu2, S_IWUSR | S_IRUGO, show_led, set_led, LED_PSU2);
|
||||
static SENSOR_DEVICE_ATTR(led_fan, S_IWUSR | S_IRUGO, show_led, set_led, LED_FAN);
|
||||
|
||||
static struct attribute *as5916_26xb_led_attributes[] = {
|
||||
&sensor_dev_attr_led_loc.dev_attr.attr,
|
||||
&sensor_dev_attr_led_diag.dev_attr.attr,
|
||||
&sensor_dev_attr_led_psu1.dev_attr.attr,
|
||||
&sensor_dev_attr_led_psu2.dev_attr.attr,
|
||||
&sensor_dev_attr_led_fan.dev_attr.attr,
|
||||
NULL
|
||||
};
|
||||
|
||||
static const struct attribute_group as5916_26xb_led_group = {
|
||||
.attrs = as5916_26xb_led_attributes,
|
||||
};
|
||||
|
||||
/* Functions to talk to the IPMI layer */
|
||||
|
||||
/* Initialize IPMI address, message buffers and user data */
|
||||
static int init_ipmi_data(struct ipmi_data *ipmi, int iface,
|
||||
struct device *dev)
|
||||
{
|
||||
int err;
|
||||
|
||||
init_completion(&ipmi->read_complete);
|
||||
|
||||
/* Initialize IPMI address */
|
||||
ipmi->address.addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE;
|
||||
ipmi->address.channel = IPMI_BMC_CHANNEL;
|
||||
ipmi->address.data[0] = 0;
|
||||
ipmi->interface = iface;
|
||||
|
||||
/* Initialize message buffers */
|
||||
ipmi->tx_msgid = 0;
|
||||
ipmi->tx_message.netfn = ACCTON_IPMI_NETFN;
|
||||
|
||||
ipmi->ipmi_hndlrs.ipmi_recv_hndl = ipmi_msg_handler;
|
||||
|
||||
/* Create IPMI messaging interface user */
|
||||
err = ipmi_create_user(ipmi->interface, &ipmi->ipmi_hndlrs,
|
||||
ipmi, &ipmi->user);
|
||||
if (err < 0) {
|
||||
dev_err(dev, "Unable to register user with IPMI "
|
||||
"interface %d\n", ipmi->interface);
|
||||
return -EACCES;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Send an IPMI command */
|
||||
static int ipmi_send_message(struct ipmi_data *ipmi, unsigned char cmd,
|
||||
unsigned char *tx_data, unsigned short tx_len,
|
||||
unsigned char *rx_data, unsigned short rx_len)
|
||||
{
|
||||
int err;
|
||||
|
||||
ipmi->tx_message.cmd = cmd;
|
||||
ipmi->tx_message.data = tx_data;
|
||||
ipmi->tx_message.data_len = tx_len;
|
||||
ipmi->rx_msg_data = rx_data;
|
||||
ipmi->rx_msg_len = rx_len;
|
||||
|
||||
err = ipmi_validate_addr(&ipmi->address, sizeof(ipmi->address));
|
||||
if (err)
|
||||
goto addr_err;
|
||||
|
||||
ipmi->tx_msgid++;
|
||||
err = ipmi_request_settime(ipmi->user, &ipmi->address, ipmi->tx_msgid,
|
||||
&ipmi->tx_message, ipmi, 0, 0, 0);
|
||||
if (err)
|
||||
goto ipmi_req_err;
|
||||
|
||||
err = wait_for_completion_timeout(&ipmi->read_complete, IPMI_TIMEOUT);
|
||||
if (!err)
|
||||
goto ipmi_timeout_err;
|
||||
|
||||
return 0;
|
||||
|
||||
ipmi_timeout_err:
|
||||
err = -ETIMEDOUT;
|
||||
dev_err(&data->pdev->dev, "request_timeout=%x\n", err);
|
||||
return err;
|
||||
ipmi_req_err:
|
||||
dev_err(&data->pdev->dev, "request_settime=%x\n", err);
|
||||
return err;
|
||||
addr_err:
|
||||
dev_err(&data->pdev->dev, "validate_addr=%x\n", err);
|
||||
return err;
|
||||
}
|
||||
|
||||
/* Dispatch IPMI messages to callers */
|
||||
static void ipmi_msg_handler(struct ipmi_recv_msg *msg, void *user_msg_data)
|
||||
{
|
||||
unsigned short rx_len;
|
||||
struct ipmi_data *ipmi = user_msg_data;
|
||||
|
||||
if (msg->msgid != ipmi->tx_msgid) {
|
||||
dev_err(&data->pdev->dev, "Mismatch between received msgid "
|
||||
"(%02x) and transmitted msgid (%02x)!\n",
|
||||
(int)msg->msgid,
|
||||
(int)ipmi->tx_msgid);
|
||||
ipmi_free_recv_msg(msg);
|
||||
return;
|
||||
}
|
||||
|
||||
ipmi->rx_recv_type = msg->recv_type;
|
||||
if (msg->msg.data_len > 0)
|
||||
ipmi->rx_result = msg->msg.data[0];
|
||||
else
|
||||
ipmi->rx_result = IPMI_UNKNOWN_ERR_COMPLETION_CODE;
|
||||
|
||||
if (msg->msg.data_len > 1) {
|
||||
rx_len = msg->msg.data_len - 1;
|
||||
if (ipmi->rx_msg_len < rx_len)
|
||||
rx_len = ipmi->rx_msg_len;
|
||||
ipmi->rx_msg_len = rx_len;
|
||||
memcpy(ipmi->rx_msg_data, msg->msg.data + 1, ipmi->rx_msg_len);
|
||||
} else
|
||||
ipmi->rx_msg_len = 0;
|
||||
|
||||
ipmi_free_recv_msg(msg);
|
||||
complete(&ipmi->read_complete);
|
||||
}
|
||||
|
||||
static struct as5916_26xb_led_data *as5916_26xb_led_update_device(void)
|
||||
{
|
||||
int status = 0;
|
||||
|
||||
if (time_before(jiffies, data->last_updated + HZ * 5) && data->valid) {
|
||||
return data;
|
||||
}
|
||||
|
||||
mutex_lock(&data->update_lock);
|
||||
|
||||
data->valid = 0;
|
||||
status = ipmi_send_message(&data->ipmi, IPMI_LED_READ_CMD, NULL, 0,
|
||||
data->ipmi_resp, sizeof(data->ipmi_resp));
|
||||
if (unlikely(status != 0)) {
|
||||
goto exit;
|
||||
}
|
||||
|
||||
if (unlikely(data->ipmi.rx_result != 0)) {
|
||||
status = -EIO;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
data->last_updated = jiffies;
|
||||
data->valid = 1;
|
||||
|
||||
exit:
|
||||
mutex_unlock(&data->update_lock);
|
||||
return data;
|
||||
}
|
||||
|
||||
static ssize_t show_led(struct device *dev, struct device_attribute *da, char *buf)
|
||||
{
|
||||
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
|
||||
struct as5916_26xb_led_data *data = NULL;
|
||||
int value;
|
||||
|
||||
data = as5916_26xb_led_update_device();
|
||||
if (!data->valid) {
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
switch (attr->index) {
|
||||
case LED_LOC:
|
||||
value = data->ipmi_resp[LOC_INDEX] ? LED_MODE_ORANGE_BLINKING : LED_MODE_OFF;
|
||||
break;
|
||||
case LED_DIAG:
|
||||
{
|
||||
if (data->ipmi_resp[DIAG_GREEN_INDEX] && data->ipmi_resp[DIAG_RED_INDEX])
|
||||
value = LED_MODE_OFF;
|
||||
else if (!data->ipmi_resp[DIAG_GREEN_INDEX] && !data->ipmi_resp[DIAG_RED_INDEX])
|
||||
value = LED_MODE_OFF;
|
||||
else if (data->ipmi_resp[DIAG_RED_INDEX])
|
||||
value = LED_MODE_ORANGE;
|
||||
else if (data->ipmi_resp[DIAG_GREEN_INDEX] == 1)
|
||||
value = LED_MODE_GREEN_BLINKING;
|
||||
else
|
||||
value = LED_MODE_GREEN;
|
||||
break;
|
||||
}
|
||||
case LED_PSU1:
|
||||
case LED_PSU2:
|
||||
case LED_FAN:
|
||||
value = LED_MODE_AUTO;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return sprintf(buf, "%d\n", value);
|
||||
}
|
||||
|
||||
static ssize_t set_led(struct device *dev, struct device_attribute *da,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
long mode;
|
||||
int status;
|
||||
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
|
||||
|
||||
status = kstrtol(buf, 10, &mode);
|
||||
if (status) {
|
||||
return status;
|
||||
}
|
||||
|
||||
data = as5916_26xb_led_update_device();
|
||||
if (!data->valid) {
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
switch (attr->index) {
|
||||
case LED_LOC:
|
||||
data->ipmi_resp[LOC_INDEX] = !!mode;
|
||||
break;
|
||||
case LED_DIAG:
|
||||
{
|
||||
if (mode == LED_MODE_GREEN_BLINKING) {
|
||||
data->ipmi_resp[DIAG_GREEN_INDEX] = 1;
|
||||
data->ipmi_resp[DIAG_RED_INDEX] = 0;
|
||||
}
|
||||
else if (mode == LED_MODE_GREEN) {
|
||||
data->ipmi_resp[DIAG_GREEN_INDEX] = 2;
|
||||
data->ipmi_resp[DIAG_RED_INDEX] = 0;
|
||||
}
|
||||
else if (mode == LED_MODE_ORANGE) {
|
||||
data->ipmi_resp[DIAG_GREEN_INDEX] = 0;
|
||||
data->ipmi_resp[DIAG_RED_INDEX] = 1;
|
||||
}
|
||||
else { /* OFF */
|
||||
data->ipmi_resp[DIAG_GREEN_INDEX] = 0;
|
||||
data->ipmi_resp[DIAG_RED_INDEX] = 0;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Send IPMI write command */
|
||||
status = ipmi_send_message(&data->ipmi, IPMI_LED_WRITE_CMD,
|
||||
data->ipmi_resp, sizeof(data->ipmi_resp), NULL, 0);
|
||||
if (unlikely(status != 0)) {
|
||||
return status;
|
||||
}
|
||||
|
||||
if (unlikely(data->ipmi.rx_result != 0)) {
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static int as5916_26xb_led_probe(struct platform_device *pdev)
|
||||
{
|
||||
int status = -1;
|
||||
|
||||
/* Register sysfs hooks */
|
||||
status = sysfs_create_group(&pdev->dev.kobj, &as5916_26xb_led_group);
|
||||
if (status) {
|
||||
goto exit;
|
||||
}
|
||||
|
||||
dev_info(&pdev->dev, "device created\n");
|
||||
|
||||
return 0;
|
||||
|
||||
exit:
|
||||
return status;
|
||||
}
|
||||
|
||||
static int as5916_26xb_led_remove(struct platform_device *pdev)
|
||||
{
|
||||
sysfs_remove_group(&pdev->dev.kobj, &as5916_26xb_led_group);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __init as5916_26xb_led_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
data = kzalloc(sizeof(struct as5916_26xb_led_data), GFP_KERNEL);
|
||||
if (!data) {
|
||||
ret = -ENOMEM;
|
||||
goto alloc_err;
|
||||
}
|
||||
|
||||
mutex_init(&data->update_lock);
|
||||
data->valid = 0;
|
||||
|
||||
ret = platform_driver_register(&as5916_26xb_led_driver);
|
||||
if (ret < 0) {
|
||||
goto dri_reg_err;
|
||||
}
|
||||
|
||||
data->pdev = platform_device_register_simple(DRVNAME, -1, NULL, 0);
|
||||
if (IS_ERR(data->pdev)) {
|
||||
ret = PTR_ERR(data->pdev);
|
||||
goto dev_reg_err;
|
||||
}
|
||||
|
||||
/* Set up IPMI interface */
|
||||
ret = init_ipmi_data(&data->ipmi, 0, &data->pdev->dev);
|
||||
if (ret)
|
||||
goto ipmi_err;
|
||||
|
||||
return 0;
|
||||
|
||||
ipmi_err:
|
||||
platform_device_unregister(data->pdev);
|
||||
dev_reg_err:
|
||||
platform_driver_unregister(&as5916_26xb_led_driver);
|
||||
dri_reg_err:
|
||||
kfree(data);
|
||||
alloc_err:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void __exit as5916_26xb_led_exit(void)
|
||||
{
|
||||
ipmi_destroy_user(data->ipmi.user);
|
||||
platform_device_unregister(data->pdev);
|
||||
platform_driver_unregister(&as5916_26xb_led_driver);
|
||||
kfree(data);
|
||||
}
|
||||
|
||||
MODULE_AUTHOR("Brandon Chuang <brandon_chuang@accton.com.tw>");
|
||||
MODULE_DESCRIPTION("AS5916 26XB led driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
module_init(as5916_26xb_led_init);
|
||||
module_exit(as5916_26xb_led_exit);
|
||||
|
||||
@@ -0,0 +1,547 @@
|
||||
/*
|
||||
* Copyright (C) Brandon Chuang <brandon_chuang@accton.com.tw>
|
||||
*
|
||||
* This module supports the accton cpld that hold the channel select
|
||||
* mechanism for other i2c slave devices, such as SFP.
|
||||
* This includes the:
|
||||
* Accton as5916_54x CPLD1/CPLD2
|
||||
*
|
||||
* Based on:
|
||||
* pca954x.c from Kumar Gala <galak@kernel.crashing.org>
|
||||
* Copyright (C) 2006
|
||||
*
|
||||
* Based on:
|
||||
* pca954x.c from Ken Harrenstien
|
||||
* Copyright (C) 2004 Google, Inc. (Ken Harrenstien)
|
||||
*
|
||||
* Based on:
|
||||
* i2c-virtual_cb.c from Brian Kuschak <bkuschak@yahoo.com>
|
||||
* and
|
||||
* pca9540.c from Jean Delvare <khali@linux-fr.org>.
|
||||
*
|
||||
* This file is licensed under the terms of the GNU General Public
|
||||
* License version 2. This program is licensed "as is" without any
|
||||
* warranty of any kind, whether express or implied.
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/version.h>
|
||||
#include <linux/stat.h>
|
||||
#include <linux/sysfs.h>
|
||||
#include <linux/hwmon-sysfs.h>
|
||||
#include <linux/ipmi.h>
|
||||
#include <linux/ipmi_smi.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#define DRVNAME "as5916_26xb_psu"
|
||||
#define ACCTON_IPMI_NETFN 0x34
|
||||
#define IPMI_PSU_READ_CMD 0x16
|
||||
#define IPMI_PSU_MODEL_NAME_CMD 0x10
|
||||
#define IPMI_PSU_SERIAL_NUM_CMD 0x11
|
||||
#define IPMI_TIMEOUT (5 * HZ)
|
||||
|
||||
static void ipmi_msg_handler(struct ipmi_recv_msg *msg, void *user_msg_data);
|
||||
static ssize_t show_psu(struct device *dev, struct device_attribute *attr, char *buf);
|
||||
static ssize_t show_string(struct device *dev, struct device_attribute *attr, char *buf);
|
||||
static int as5916_26xb_psu_probe(struct platform_device *pdev);
|
||||
static int as5916_26xb_psu_remove(struct platform_device *pdev);
|
||||
|
||||
enum psu_id {
|
||||
PSU_1,
|
||||
PSU_2,
|
||||
NUM_OF_PSU
|
||||
};
|
||||
|
||||
enum psu_data_index {
|
||||
PSU_PRESENT = 0,
|
||||
PSU_TEMP_FAULT,
|
||||
PSU_POWER_GOOD_CPLD,
|
||||
PSU_POWER_GOOD_PMBUS,
|
||||
PSU_OVER_VOLTAGE,
|
||||
PSU_OVER_CURRENT,
|
||||
PSU_POWER_ON,
|
||||
PSU_VIN0,
|
||||
PSU_VIN1,
|
||||
PSU_VOUT0,
|
||||
PSU_VOUT1,
|
||||
PSU_IOUT0,
|
||||
PSU_IOUT1,
|
||||
PSU_TEMP0,
|
||||
PSU_TEMP1,
|
||||
PSU_FAN0,
|
||||
PSU_FAN1,
|
||||
PSU_POUT0,
|
||||
PSU_POUT1,
|
||||
PSU_STATUS_COUNT,
|
||||
PSU_MODEL = 0,
|
||||
PSU_SERIAL = 0
|
||||
};
|
||||
|
||||
struct ipmi_data {
|
||||
struct completion read_complete;
|
||||
struct ipmi_addr address;
|
||||
ipmi_user_t user;
|
||||
int interface;
|
||||
|
||||
struct kernel_ipmi_msg tx_message;
|
||||
long tx_msgid;
|
||||
|
||||
void *rx_msg_data;
|
||||
unsigned short rx_msg_len;
|
||||
unsigned char rx_result;
|
||||
int rx_recv_type;
|
||||
|
||||
struct ipmi_user_hndl ipmi_hndlrs;
|
||||
};
|
||||
|
||||
struct ipmi_psu_resp_data {
|
||||
char status[19];
|
||||
char serial[20];
|
||||
char model[9];
|
||||
};
|
||||
|
||||
struct as5916_26xb_psu_data {
|
||||
struct platform_device *pdev;
|
||||
struct mutex update_lock;
|
||||
char valid[2]; /* != 0 if registers are valid, 0: PSU1, 1: PSU2 */
|
||||
unsigned long last_updated[2]; /* In jiffies, 0: PSU1, 1: PSU2 */
|
||||
struct ipmi_data ipmi;
|
||||
struct ipmi_psu_resp_data ipmi_resp[2]; /* 0: PSU1, 1: PSU2 */
|
||||
unsigned char ipmi_tx_data[2];
|
||||
};
|
||||
|
||||
struct as5916_26xb_psu_data *data = NULL;
|
||||
|
||||
static struct platform_driver as5916_26xb_psu_driver = {
|
||||
.probe = as5916_26xb_psu_probe,
|
||||
.remove = as5916_26xb_psu_remove,
|
||||
.driver = {
|
||||
.name = DRVNAME,
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
};
|
||||
|
||||
#define PSU_PRESENT_ATTR_ID(index) PSU##index##_PRESENT
|
||||
#define PSU_POWERGOOD_ATTR_ID(index) PSU##index##_POWER_GOOD
|
||||
#define PSU_VIN_ATTR_ID(index) PSU##index##_VIN
|
||||
#define PSU_VOUT_ATTR_ID(index) PSU##index##_VOUT
|
||||
#define PSU_IOUT_ATTR_ID(index) PSU##index##_IOUT
|
||||
#define PSU_POUT_ATTR_ID(index) PSU##index##_POUT
|
||||
#define PSU_MODEL_ATTR_ID(index) PSU##index##_MODEL
|
||||
#define PSU_SERIAL_ATTR_ID(index) PSU##index##_SERIAL
|
||||
#define PSU_TEMP_INPUT_ATTR_ID(index) PSU##index##_TEMP_INPUT
|
||||
#define PSU_FAN_INPUT_ATTR_ID(index) PSU##index##_FAN_INPUT
|
||||
|
||||
#define PSU_ATTR(psu_id) \
|
||||
PSU_PRESENT_ATTR_ID(psu_id), \
|
||||
PSU_POWERGOOD_ATTR_ID(psu_id), \
|
||||
PSU_VIN_ATTR_ID(psu_id), \
|
||||
PSU_VOUT_ATTR_ID(psu_id), \
|
||||
PSU_IOUT_ATTR_ID(psu_id), \
|
||||
PSU_POUT_ATTR_ID(psu_id), \
|
||||
PSU_MODEL_ATTR_ID(psu_id), \
|
||||
PSU_SERIAL_ATTR_ID(psu_id), \
|
||||
PSU_TEMP_INPUT_ATTR_ID(psu_id), \
|
||||
PSU_FAN_INPUT_ATTR_ID(psu_id)
|
||||
|
||||
enum as5916_54x_psu_sysfs_attrs {
|
||||
/* psu attributes */
|
||||
PSU_ATTR(1),
|
||||
PSU_ATTR(2),
|
||||
NUM_OF_PSU_ATTR,
|
||||
NUM_OF_PER_PSU_ATTR = (NUM_OF_PSU_ATTR/NUM_OF_PSU)
|
||||
};
|
||||
|
||||
/* psu attributes */
|
||||
#define DECLARE_PSU_SENSOR_DEVICE_ATTR(index) \
|
||||
static SENSOR_DEVICE_ATTR(psu##index##_present, S_IRUGO, show_psu, NULL, PSU##index##_PRESENT); \
|
||||
static SENSOR_DEVICE_ATTR(psu##index##_power_good, S_IRUGO, show_psu, NULL, PSU##index##_POWER_GOOD); \
|
||||
static SENSOR_DEVICE_ATTR(psu##index##_vin, S_IRUGO, show_psu, NULL, PSU##index##_VIN); \
|
||||
static SENSOR_DEVICE_ATTR(psu##index##_vout, S_IRUGO, show_psu, NULL, PSU##index##_VOUT); \
|
||||
static SENSOR_DEVICE_ATTR(psu##index##_iout, S_IRUGO, show_psu, NULL, PSU##index##_IOUT); \
|
||||
static SENSOR_DEVICE_ATTR(psu##index##_pout, S_IRUGO, show_psu, NULL, PSU##index##_POUT); \
|
||||
static SENSOR_DEVICE_ATTR(psu##index##_model, S_IRUGO, show_string, NULL, PSU##index##_MODEL); \
|
||||
static SENSOR_DEVICE_ATTR(psu##index##_serial, S_IRUGO, show_string, NULL, PSU##index##_SERIAL);\
|
||||
static SENSOR_DEVICE_ATTR(psu##index##_temp1_input, S_IRUGO, show_psu, NULL, PSU##index##_TEMP_INPUT); \
|
||||
static SENSOR_DEVICE_ATTR(psu##index##_fan1_input, S_IRUGO, show_psu, NULL, PSU##index##_FAN_INPUT)
|
||||
#define DECLARE_PSU_ATTR(index) \
|
||||
&sensor_dev_attr_psu##index##_present.dev_attr.attr, \
|
||||
&sensor_dev_attr_psu##index##_power_good.dev_attr.attr, \
|
||||
&sensor_dev_attr_psu##index##_vin.dev_attr.attr, \
|
||||
&sensor_dev_attr_psu##index##_vout.dev_attr.attr, \
|
||||
&sensor_dev_attr_psu##index##_iout.dev_attr.attr, \
|
||||
&sensor_dev_attr_psu##index##_pout.dev_attr.attr, \
|
||||
&sensor_dev_attr_psu##index##_model.dev_attr.attr, \
|
||||
&sensor_dev_attr_psu##index##_serial.dev_attr.attr,\
|
||||
&sensor_dev_attr_psu##index##_temp1_input.dev_attr.attr, \
|
||||
&sensor_dev_attr_psu##index##_fan1_input.dev_attr.attr
|
||||
|
||||
DECLARE_PSU_SENSOR_DEVICE_ATTR(1);
|
||||
DECLARE_PSU_SENSOR_DEVICE_ATTR(2);
|
||||
|
||||
static struct attribute *as5916_26xb_psu_attributes[] = {
|
||||
/* psu attributes */
|
||||
DECLARE_PSU_ATTR(1),
|
||||
DECLARE_PSU_ATTR(2),
|
||||
NULL
|
||||
};
|
||||
|
||||
static const struct attribute_group as5916_26xb_psu_group = {
|
||||
.attrs = as5916_26xb_psu_attributes,
|
||||
};
|
||||
|
||||
/* Functions to talk to the IPMI layer */
|
||||
|
||||
/* Initialize IPMI address, message buffers and user data */
|
||||
static int init_ipmi_data(struct ipmi_data *ipmi, int iface,
|
||||
struct device *dev)
|
||||
{
|
||||
int err;
|
||||
|
||||
init_completion(&ipmi->read_complete);
|
||||
|
||||
/* Initialize IPMI address */
|
||||
ipmi->address.addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE;
|
||||
ipmi->address.channel = IPMI_BMC_CHANNEL;
|
||||
ipmi->address.data[0] = 0;
|
||||
ipmi->interface = iface;
|
||||
|
||||
/* Initialize message buffers */
|
||||
ipmi->tx_msgid = 0;
|
||||
ipmi->tx_message.netfn = ACCTON_IPMI_NETFN;
|
||||
|
||||
ipmi->ipmi_hndlrs.ipmi_recv_hndl = ipmi_msg_handler;
|
||||
|
||||
/* Create IPMI messaging interface user */
|
||||
err = ipmi_create_user(ipmi->interface, &ipmi->ipmi_hndlrs,
|
||||
ipmi, &ipmi->user);
|
||||
if (err < 0) {
|
||||
dev_err(dev, "Unable to register user with IPMI "
|
||||
"interface %d\n", ipmi->interface);
|
||||
return -EACCES;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Send an IPMI command */
|
||||
static int ipmi_send_message(struct ipmi_data *ipmi, unsigned char cmd,
|
||||
unsigned char *tx_data, unsigned short tx_len,
|
||||
unsigned char *rx_data, unsigned short rx_len)
|
||||
{
|
||||
int err;
|
||||
|
||||
ipmi->tx_message.cmd = cmd;
|
||||
ipmi->tx_message.data = tx_data;
|
||||
ipmi->tx_message.data_len = tx_len;
|
||||
ipmi->rx_msg_data = rx_data;
|
||||
ipmi->rx_msg_len = rx_len;
|
||||
|
||||
err = ipmi_validate_addr(&ipmi->address, sizeof(ipmi->address));
|
||||
if (err)
|
||||
goto addr_err;
|
||||
|
||||
ipmi->tx_msgid++;
|
||||
err = ipmi_request_settime(ipmi->user, &ipmi->address, ipmi->tx_msgid,
|
||||
&ipmi->tx_message, ipmi, 0, 0, 0);
|
||||
if (err)
|
||||
goto ipmi_req_err;
|
||||
|
||||
err = wait_for_completion_timeout(&ipmi->read_complete, IPMI_TIMEOUT);
|
||||
if (!err)
|
||||
goto ipmi_timeout_err;
|
||||
|
||||
return 0;
|
||||
|
||||
ipmi_timeout_err:
|
||||
err = -ETIMEDOUT;
|
||||
dev_err(&data->pdev->dev, "request_timeout=%x\n", err);
|
||||
return err;
|
||||
ipmi_req_err:
|
||||
dev_err(&data->pdev->dev, "request_settime=%x\n", err);
|
||||
return err;
|
||||
addr_err:
|
||||
dev_err(&data->pdev->dev, "validate_addr=%x\n", err);
|
||||
return err;
|
||||
}
|
||||
|
||||
/* Dispatch IPMI messages to callers */
|
||||
static void ipmi_msg_handler(struct ipmi_recv_msg *msg, void *user_msg_data)
|
||||
{
|
||||
unsigned short rx_len;
|
||||
struct ipmi_data *ipmi = user_msg_data;
|
||||
|
||||
if (msg->msgid != ipmi->tx_msgid) {
|
||||
dev_err(&data->pdev->dev, "Mismatch between received msgid "
|
||||
"(%02x) and transmitted msgid (%02x)!\n",
|
||||
(int)msg->msgid,
|
||||
(int)ipmi->tx_msgid);
|
||||
ipmi_free_recv_msg(msg);
|
||||
return;
|
||||
}
|
||||
|
||||
ipmi->rx_recv_type = msg->recv_type;
|
||||
if (msg->msg.data_len > 0)
|
||||
ipmi->rx_result = msg->msg.data[0];
|
||||
else
|
||||
ipmi->rx_result = IPMI_UNKNOWN_ERR_COMPLETION_CODE;
|
||||
|
||||
if (msg->msg.data_len > 1) {
|
||||
rx_len = msg->msg.data_len - 1;
|
||||
if (ipmi->rx_msg_len < rx_len)
|
||||
rx_len = ipmi->rx_msg_len;
|
||||
ipmi->rx_msg_len = rx_len;
|
||||
memcpy(ipmi->rx_msg_data, msg->msg.data + 1, ipmi->rx_msg_len);
|
||||
} else
|
||||
ipmi->rx_msg_len = 0;
|
||||
|
||||
ipmi_free_recv_msg(msg);
|
||||
complete(&ipmi->read_complete);
|
||||
}
|
||||
|
||||
static struct as5916_26xb_psu_data *as5916_26xb_psu_update_device(struct device_attribute *da)
|
||||
{
|
||||
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
|
||||
unsigned char pid = attr->index / NUM_OF_PER_PSU_ATTR;
|
||||
int status = 0;
|
||||
|
||||
if (time_before(jiffies, data->last_updated[pid] + HZ * 5) && data->valid[pid]) {
|
||||
return data;
|
||||
}
|
||||
|
||||
mutex_lock(&data->update_lock);
|
||||
|
||||
data->valid[pid] = 0;
|
||||
|
||||
/* Get status from ipmi */
|
||||
data->ipmi_tx_data[0] = pid + 1; /* PSU ID base id for ipmi start from 1 */
|
||||
status = ipmi_send_message(&data->ipmi, IPMI_PSU_READ_CMD, data->ipmi_tx_data, 1,
|
||||
data->ipmi_resp[pid].status, sizeof(data->ipmi_resp[pid].status));
|
||||
if (unlikely(status != 0)) {
|
||||
goto exit;
|
||||
}
|
||||
|
||||
if (unlikely(data->ipmi.rx_result != 0)) {
|
||||
status = -EIO;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
/* Get model name from ipmi */
|
||||
data->ipmi_tx_data[1] = 0x10;
|
||||
status = ipmi_send_message(&data->ipmi, IPMI_PSU_READ_CMD, data->ipmi_tx_data, 2,
|
||||
data->ipmi_resp[pid].model, sizeof(data->ipmi_resp[pid].model) - 1);
|
||||
if (unlikely(status != 0)) {
|
||||
goto exit;
|
||||
}
|
||||
|
||||
if (unlikely(data->ipmi.rx_result != 0)) {
|
||||
status = -EIO;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
/* Get serial number from ipmi */
|
||||
data->ipmi_tx_data[1] = 0x11;
|
||||
status = ipmi_send_message(&data->ipmi, IPMI_PSU_READ_CMD, data->ipmi_tx_data, 2,
|
||||
data->ipmi_resp[pid].serial, sizeof(data->ipmi_resp[pid].serial) - 1);
|
||||
if (unlikely(status != 0)) {
|
||||
goto exit;
|
||||
}
|
||||
|
||||
if (unlikely(data->ipmi.rx_result != 0)) {
|
||||
status = -EIO;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
data->last_updated[pid] = jiffies;
|
||||
data->valid[pid] = 1;
|
||||
|
||||
exit:
|
||||
mutex_unlock(&data->update_lock);
|
||||
return data;
|
||||
}
|
||||
|
||||
#define VALIDATE_PRESENT_RETURN(id) \
|
||||
{ \
|
||||
if (data->ipmi_resp[id].status[PSU_PRESENT] != 0) { \
|
||||
return -ENXIO; \
|
||||
} \
|
||||
}
|
||||
|
||||
static ssize_t show_psu(struct device *dev, struct device_attribute *da, char *buf)
|
||||
{
|
||||
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
|
||||
unsigned char pid = attr->index / NUM_OF_PER_PSU_ATTR;
|
||||
struct as5916_26xb_psu_data *data = NULL;
|
||||
int value = 0;
|
||||
|
||||
data = as5916_26xb_psu_update_device(da);
|
||||
if (!data->valid[pid]) {
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
switch (attr->index) {
|
||||
case PSU1_PRESENT:
|
||||
case PSU2_PRESENT:
|
||||
value = !(data->ipmi_resp[pid].status[PSU_PRESENT]);
|
||||
break;
|
||||
case PSU1_POWER_GOOD:
|
||||
case PSU2_POWER_GOOD:
|
||||
VALIDATE_PRESENT_RETURN(pid);
|
||||
value = data->ipmi_resp[pid].status[PSU_POWER_GOOD_CPLD];
|
||||
break;
|
||||
case PSU1_VIN:
|
||||
case PSU2_VIN:
|
||||
VALIDATE_PRESENT_RETURN(pid);
|
||||
value = ((int)data->ipmi_resp[pid].status[PSU_VIN0] |
|
||||
(int)data->ipmi_resp[pid].status[PSU_VIN1] << 8) * 1000;
|
||||
break;
|
||||
case PSU1_VOUT:
|
||||
case PSU2_VOUT:
|
||||
VALIDATE_PRESENT_RETURN(pid);
|
||||
value = ((int)data->ipmi_resp[pid].status[PSU_VOUT0] |
|
||||
(int)data->ipmi_resp[pid].status[PSU_VOUT1] << 8) * 1000;
|
||||
break;
|
||||
case PSU1_IOUT:
|
||||
case PSU2_IOUT:
|
||||
VALIDATE_PRESENT_RETURN(pid);
|
||||
value = ((int)data->ipmi_resp[pid].status[PSU_IOUT0] |
|
||||
(int)data->ipmi_resp[pid].status[PSU_IOUT1] << 8) * 1000;
|
||||
break;
|
||||
case PSU1_POUT:
|
||||
case PSU2_POUT:
|
||||
VALIDATE_PRESENT_RETURN(pid);
|
||||
value = ((int)data->ipmi_resp[pid].status[PSU_POUT0] |
|
||||
(int)data->ipmi_resp[pid].status[PSU_POUT1] << 8) * 1000;
|
||||
break;
|
||||
case PSU1_TEMP_INPUT:
|
||||
case PSU2_TEMP_INPUT:
|
||||
VALIDATE_PRESENT_RETURN(pid);
|
||||
value = ((int)data->ipmi_resp[pid].status[PSU_TEMP0] |
|
||||
(int)data->ipmi_resp[pid].status[PSU_TEMP1] << 8) * 1000;
|
||||
break;
|
||||
case PSU1_FAN_INPUT:
|
||||
case PSU2_FAN_INPUT:
|
||||
VALIDATE_PRESENT_RETURN(pid);
|
||||
value = ((int)data->ipmi_resp[pid].status[PSU_FAN0] |
|
||||
(int)data->ipmi_resp[pid].status[PSU_FAN1] << 8);
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return sprintf(buf, "%d\n", value);
|
||||
}
|
||||
|
||||
static ssize_t show_string(struct device *dev, struct device_attribute *da, char *buf)
|
||||
{
|
||||
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
|
||||
unsigned char pid = attr->index / NUM_OF_PER_PSU_ATTR;
|
||||
struct as5916_26xb_psu_data *data;
|
||||
char *str = NULL;
|
||||
|
||||
data = as5916_26xb_psu_update_device(da);
|
||||
if (!data->valid[pid]) {
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
switch (attr->index) {
|
||||
case PSU1_MODEL:
|
||||
case PSU2_MODEL:
|
||||
VALIDATE_PRESENT_RETURN(pid);
|
||||
str = data->ipmi_resp[pid].model;
|
||||
break;
|
||||
case PSU1_SERIAL:
|
||||
case PSU2_SERIAL:
|
||||
VALIDATE_PRESENT_RETURN(pid);
|
||||
str = data->ipmi_resp[pid].serial;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return sprintf(buf, "%s\n", str);
|
||||
}
|
||||
|
||||
static int as5916_26xb_psu_probe(struct platform_device *pdev)
|
||||
{
|
||||
int status = -1;
|
||||
|
||||
/* Register sysfs hooks */
|
||||
status = sysfs_create_group(&pdev->dev.kobj, &as5916_26xb_psu_group);
|
||||
if (status) {
|
||||
goto exit;
|
||||
}
|
||||
|
||||
|
||||
dev_info(&pdev->dev, "device created\n");
|
||||
|
||||
return 0;
|
||||
|
||||
exit:
|
||||
return status;
|
||||
}
|
||||
|
||||
static int as5916_26xb_psu_remove(struct platform_device *pdev)
|
||||
{
|
||||
sysfs_remove_group(&pdev->dev.kobj, &as5916_26xb_psu_group);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __init as5916_26xb_psu_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
data = kzalloc(sizeof(struct as5916_26xb_psu_data), GFP_KERNEL);
|
||||
if (!data) {
|
||||
ret = -ENOMEM;
|
||||
goto alloc_err;
|
||||
}
|
||||
|
||||
mutex_init(&data->update_lock);
|
||||
|
||||
ret = platform_driver_register(&as5916_26xb_psu_driver);
|
||||
if (ret < 0) {
|
||||
goto dri_reg_err;
|
||||
}
|
||||
|
||||
data->pdev = platform_device_register_simple(DRVNAME, -1, NULL, 0);
|
||||
if (IS_ERR(data->pdev)) {
|
||||
ret = PTR_ERR(data->pdev);
|
||||
goto dev_reg_err;
|
||||
}
|
||||
|
||||
/* Set up IPMI interface */
|
||||
ret = init_ipmi_data(&data->ipmi, 0, &data->pdev->dev);
|
||||
if (ret)
|
||||
goto ipmi_err;
|
||||
|
||||
return 0;
|
||||
|
||||
ipmi_err:
|
||||
platform_device_unregister(data->pdev);
|
||||
dev_reg_err:
|
||||
platform_driver_unregister(&as5916_26xb_psu_driver);
|
||||
dri_reg_err:
|
||||
kfree(data);
|
||||
alloc_err:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void __exit as5916_26xb_psu_exit(void)
|
||||
{
|
||||
ipmi_destroy_user(data->ipmi.user);
|
||||
platform_device_unregister(data->pdev);
|
||||
platform_driver_unregister(&as5916_26xb_psu_driver);
|
||||
kfree(data);
|
||||
}
|
||||
|
||||
MODULE_AUTHOR("Brandon Chuang <brandon_chuang@accton.com.tw>");
|
||||
MODULE_DESCRIPTION("AS5916 26XB PSU driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
module_init(as5916_26xb_psu_init);
|
||||
module_exit(as5916_26xb_psu_exit);
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,368 @@
|
||||
/*
|
||||
* Copyright (C) Brandon Chuang <brandon_chuang@accton.com.tw>
|
||||
*
|
||||
* This module supports the accton cpld that hold the channel select
|
||||
* mechanism for other i2c slave devices, such as SFP.
|
||||
* This includes the:
|
||||
* Accton as5916_54x CPLD1/CPLD2
|
||||
*
|
||||
* Based on:
|
||||
* pca954x.c from Kumar Gala <galak@kernel.crashing.org>
|
||||
* Copyright (C) 2006
|
||||
*
|
||||
* Based on:
|
||||
* pca954x.c from Ken Harrenstien
|
||||
* Copyright (C) 2004 Google, Inc. (Ken Harrenstien)
|
||||
*
|
||||
* Based on:
|
||||
* i2c-virtual_cb.c from Brian Kuschak <bkuschak@yahoo.com>
|
||||
* and
|
||||
* pca9540.c from Jean Delvare <khali@linux-fr.org>.
|
||||
*
|
||||
* This file is licensed under the terms of the GNU General Public
|
||||
* License version 2. This program is licensed "as is" without any
|
||||
* warranty of any kind, whether express or implied.
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/version.h>
|
||||
#include <linux/stat.h>
|
||||
#include <linux/sysfs.h>
|
||||
#include <linux/hwmon-sysfs.h>
|
||||
#include <linux/ipmi.h>
|
||||
#include <linux/ipmi_smi.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#define DRVNAME "as5916_26xb_sys"
|
||||
#define ACCTON_IPMI_NETFN 0x34
|
||||
#define IPMI_SYSEEPROM_READ_CMD 0x18
|
||||
#define IPMI_TIMEOUT (5 * HZ)
|
||||
#define IPMI_READ_MAX_LEN 128
|
||||
|
||||
#define EEPROM_NAME "eeprom"
|
||||
#define EEPROM_SIZE 256 /* 256 byte eeprom */
|
||||
|
||||
static void ipmi_msg_handler(struct ipmi_recv_msg *msg, void *user_msg_data);
|
||||
static int as5916_26xb_sys_probe(struct platform_device *pdev);
|
||||
static int as5916_26xb_sys_remove(struct platform_device *pdev);
|
||||
|
||||
struct ipmi_data {
|
||||
struct completion read_complete;
|
||||
struct ipmi_addr address;
|
||||
ipmi_user_t user;
|
||||
int interface;
|
||||
|
||||
struct kernel_ipmi_msg tx_message;
|
||||
long tx_msgid;
|
||||
|
||||
void *rx_msg_data;
|
||||
unsigned short rx_msg_len;
|
||||
unsigned char rx_result;
|
||||
int rx_recv_type;
|
||||
|
||||
struct ipmi_user_hndl ipmi_hndlrs;
|
||||
};
|
||||
|
||||
struct as5916_26xb_sys_data {
|
||||
struct platform_device *pdev;
|
||||
struct mutex update_lock;
|
||||
char valid; /* != 0 if registers are valid */
|
||||
unsigned long last_updated; /* In jiffies */
|
||||
unsigned char ipmi_resp[256];
|
||||
struct ipmi_data ipmi;
|
||||
unsigned char ipmi_tx_data[2];
|
||||
struct bin_attribute eeprom; /* eeprom data */
|
||||
};
|
||||
|
||||
struct as5916_26xb_sys_data *data = NULL;
|
||||
|
||||
static struct platform_driver as5916_26xb_sys_driver = {
|
||||
.probe = as5916_26xb_sys_probe,
|
||||
.remove = as5916_26xb_sys_remove,
|
||||
.driver = {
|
||||
.name = DRVNAME,
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
};
|
||||
|
||||
/* Functions to talk to the IPMI layer */
|
||||
|
||||
/* Initialize IPMI address, message buffers and user data */
|
||||
static int init_ipmi_data(struct ipmi_data *ipmi, int iface,
|
||||
struct device *dev)
|
||||
{
|
||||
int err;
|
||||
|
||||
init_completion(&ipmi->read_complete);
|
||||
|
||||
/* Initialize IPMI address */
|
||||
ipmi->address.addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE;
|
||||
ipmi->address.channel = IPMI_BMC_CHANNEL;
|
||||
ipmi->address.data[0] = 0;
|
||||
ipmi->interface = iface;
|
||||
|
||||
/* Initialize message buffers */
|
||||
ipmi->tx_msgid = 0;
|
||||
ipmi->tx_message.netfn = ACCTON_IPMI_NETFN;
|
||||
|
||||
ipmi->ipmi_hndlrs.ipmi_recv_hndl = ipmi_msg_handler;
|
||||
|
||||
/* Create IPMI messaging interface user */
|
||||
err = ipmi_create_user(ipmi->interface, &ipmi->ipmi_hndlrs,
|
||||
ipmi, &ipmi->user);
|
||||
if (err < 0) {
|
||||
dev_err(dev, "Unable to register user with IPMI "
|
||||
"interface %d\n", ipmi->interface);
|
||||
return -EACCES;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Send an IPMI command */
|
||||
static int ipmi_send_message(struct ipmi_data *ipmi, unsigned char cmd,
|
||||
unsigned char *tx_data, unsigned short tx_len,
|
||||
unsigned char *rx_data, unsigned short rx_len)
|
||||
{
|
||||
int err;
|
||||
|
||||
ipmi->tx_message.cmd = cmd;
|
||||
ipmi->tx_message.data = tx_data;
|
||||
ipmi->tx_message.data_len = tx_len;
|
||||
ipmi->rx_msg_data = rx_data;
|
||||
ipmi->rx_msg_len = rx_len;
|
||||
|
||||
err = ipmi_validate_addr(&ipmi->address, sizeof(ipmi->address));
|
||||
if (err)
|
||||
goto addr_err;
|
||||
|
||||
ipmi->tx_msgid++;
|
||||
err = ipmi_request_settime(ipmi->user, &ipmi->address, ipmi->tx_msgid,
|
||||
&ipmi->tx_message, ipmi, 0, 0, 0);
|
||||
if (err)
|
||||
goto ipmi_req_err;
|
||||
|
||||
err = wait_for_completion_timeout(&ipmi->read_complete, IPMI_TIMEOUT);
|
||||
if (!err)
|
||||
goto ipmi_timeout_err;
|
||||
|
||||
return 0;
|
||||
|
||||
ipmi_timeout_err:
|
||||
err = -ETIMEDOUT;
|
||||
dev_err(&data->pdev->dev, "request_timeout=%x\n", err);
|
||||
return err;
|
||||
ipmi_req_err:
|
||||
dev_err(&data->pdev->dev, "request_settime=%x\n", err);
|
||||
return err;
|
||||
addr_err:
|
||||
dev_err(&data->pdev->dev, "validate_addr=%x\n", err);
|
||||
return err;
|
||||
}
|
||||
|
||||
/* Dispatch IPMI messages to callers */
|
||||
static void ipmi_msg_handler(struct ipmi_recv_msg *msg, void *user_msg_data)
|
||||
{
|
||||
unsigned short rx_len;
|
||||
struct ipmi_data *ipmi = user_msg_data;
|
||||
|
||||
if (msg->msgid != ipmi->tx_msgid) {
|
||||
dev_err(&data->pdev->dev, "Mismatch between received msgid "
|
||||
"(%02x) and transmitted msgid (%02x)!\n",
|
||||
(int)msg->msgid,
|
||||
(int)ipmi->tx_msgid);
|
||||
ipmi_free_recv_msg(msg);
|
||||
return;
|
||||
}
|
||||
|
||||
ipmi->rx_recv_type = msg->recv_type;
|
||||
if (msg->msg.data_len > 0)
|
||||
ipmi->rx_result = msg->msg.data[0];
|
||||
else
|
||||
ipmi->rx_result = IPMI_UNKNOWN_ERR_COMPLETION_CODE;
|
||||
|
||||
if (msg->msg.data_len > 1) {
|
||||
rx_len = msg->msg.data_len - 1;
|
||||
if (ipmi->rx_msg_len < rx_len)
|
||||
rx_len = ipmi->rx_msg_len;
|
||||
ipmi->rx_msg_len = rx_len;
|
||||
memcpy(ipmi->rx_msg_data, msg->msg.data + 1, ipmi->rx_msg_len);
|
||||
} else
|
||||
ipmi->rx_msg_len = 0;
|
||||
|
||||
ipmi_free_recv_msg(msg);
|
||||
complete(&ipmi->read_complete);
|
||||
}
|
||||
|
||||
static ssize_t sys_eeprom_read(loff_t off, char *buf, size_t count)
|
||||
{
|
||||
int status = 0;
|
||||
|
||||
if ((off + count) > EEPROM_SIZE) {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
data->ipmi_tx_data[0] = off;
|
||||
data->ipmi_tx_data[1] = (count >= IPMI_READ_MAX_LEN) ? IPMI_READ_MAX_LEN : count;
|
||||
data->ipmi.rx_msg_data = data->ipmi_resp + off;
|
||||
data->ipmi.rx_msg_len = data->ipmi_tx_data[1];
|
||||
|
||||
status = ipmi_send_message(&data->ipmi, IPMI_SYSEEPROM_READ_CMD, data->ipmi_tx_data, sizeof(data->ipmi_tx_data),
|
||||
data->ipmi_resp + off, data->ipmi_tx_data[1]);
|
||||
if (unlikely(status != 0)) {
|
||||
goto exit;
|
||||
}
|
||||
|
||||
if (unlikely(data->ipmi.rx_result != 0)) {
|
||||
status = -EIO;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
status = data->ipmi_tx_data[1];
|
||||
memcpy(buf, data->ipmi_resp + off, data->ipmi_tx_data[1]);
|
||||
|
||||
exit:
|
||||
return status;
|
||||
}
|
||||
|
||||
static ssize_t sysfs_bin_read(struct file *filp, struct kobject *kobj,
|
||||
struct bin_attribute *attr,
|
||||
char *buf, loff_t off, size_t count)
|
||||
{
|
||||
ssize_t retval = 0;
|
||||
|
||||
if (unlikely(!count)) {
|
||||
return count;
|
||||
}
|
||||
|
||||
/*
|
||||
* Read data from chip, protecting against concurrent updates
|
||||
* from this host
|
||||
*/
|
||||
mutex_lock(&data->update_lock);
|
||||
|
||||
while (count) {
|
||||
ssize_t status;
|
||||
|
||||
status = sys_eeprom_read(off, buf, count);
|
||||
if (status <= 0) {
|
||||
if (retval == 0) {
|
||||
retval = status;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
buf += status;
|
||||
off += status;
|
||||
count -= status;
|
||||
retval += status;
|
||||
}
|
||||
|
||||
mutex_unlock(&data->update_lock);
|
||||
return retval;
|
||||
|
||||
}
|
||||
|
||||
static int sysfs_eeprom_init(struct kobject *kobj, struct bin_attribute *eeprom)
|
||||
{
|
||||
sysfs_bin_attr_init(eeprom);
|
||||
eeprom->attr.name = EEPROM_NAME;
|
||||
eeprom->attr.mode = S_IRUGO;
|
||||
eeprom->read = sysfs_bin_read;
|
||||
eeprom->write = NULL;
|
||||
eeprom->size = EEPROM_SIZE;
|
||||
|
||||
/* Create eeprom file */
|
||||
return sysfs_create_bin_file(kobj, eeprom);
|
||||
}
|
||||
|
||||
static int sysfs_eeprom_cleanup(struct kobject *kobj, struct bin_attribute *eeprom)
|
||||
{
|
||||
sysfs_remove_bin_file(kobj, eeprom);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int as5916_26xb_sys_probe(struct platform_device *pdev)
|
||||
{
|
||||
int status = -1;
|
||||
|
||||
/* Register sysfs hooks */
|
||||
status = sysfs_eeprom_init(&pdev->dev.kobj, &data->eeprom);
|
||||
if (status) {
|
||||
goto exit;
|
||||
}
|
||||
|
||||
dev_info(&pdev->dev, "device created\n");
|
||||
|
||||
return 0;
|
||||
|
||||
exit:
|
||||
return status;
|
||||
}
|
||||
|
||||
static int as5916_26xb_sys_remove(struct platform_device *pdev)
|
||||
{
|
||||
sysfs_eeprom_cleanup(&pdev->dev.kobj, &data->eeprom);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __init as5916_26xb_sys_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
data = kzalloc(sizeof(struct as5916_26xb_sys_data), GFP_KERNEL);
|
||||
if (!data) {
|
||||
ret = -ENOMEM;
|
||||
goto alloc_err;
|
||||
}
|
||||
|
||||
mutex_init(&data->update_lock);
|
||||
data->valid = 0;
|
||||
|
||||
ret = platform_driver_register(&as5916_26xb_sys_driver);
|
||||
if (ret < 0) {
|
||||
goto dri_reg_err;
|
||||
}
|
||||
|
||||
data->pdev = platform_device_register_simple(DRVNAME, -1, NULL, 0);
|
||||
if (IS_ERR(data->pdev)) {
|
||||
ret = PTR_ERR(data->pdev);
|
||||
goto dev_reg_err;
|
||||
}
|
||||
|
||||
/* Set up IPMI interface */
|
||||
ret = init_ipmi_data(&data->ipmi, 0, &data->pdev->dev);
|
||||
if (ret)
|
||||
goto ipmi_err;
|
||||
|
||||
return 0;
|
||||
|
||||
ipmi_err:
|
||||
platform_device_unregister(data->pdev);
|
||||
dev_reg_err:
|
||||
platform_driver_unregister(&as5916_26xb_sys_driver);
|
||||
dri_reg_err:
|
||||
kfree(data);
|
||||
alloc_err:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void __exit as5916_26xb_sys_exit(void)
|
||||
{
|
||||
ipmi_destroy_user(data->ipmi.user);
|
||||
platform_device_unregister(data->pdev);
|
||||
platform_driver_unregister(&as5916_26xb_sys_driver);
|
||||
kfree(data);
|
||||
}
|
||||
|
||||
MODULE_AUTHOR("Brandon Chuang <brandon_chuang@accton.com.tw>");
|
||||
MODULE_DESCRIPTION("AS5916 26XB System driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
module_init(as5916_26xb_sys_init);
|
||||
module_exit(as5916_26xb_sys_exit);
|
||||
|
||||
@@ -0,0 +1,358 @@
|
||||
/*
|
||||
* Copyright (C) Brandon Chuang <brandon_chuang@accton.com.tw>
|
||||
*
|
||||
* This module supports the accton cpld that hold the channel select
|
||||
* mechanism for other i2c slave devices, such as SFP.
|
||||
* This includes the:
|
||||
* Accton as5916_54x CPLD1/CPLD2
|
||||
*
|
||||
* Based on:
|
||||
* pca954x.c from Kumar Gala <galak@kernel.crashing.org>
|
||||
* Copyright (C) 2006
|
||||
*
|
||||
* Based on:
|
||||
* pca954x.c from Ken Harrenstien
|
||||
* Copyright (C) 2004 Google, Inc. (Ken Harrenstien)
|
||||
*
|
||||
* Based on:
|
||||
* i2c-virtual_cb.c from Brian Kuschak <bkuschak@yahoo.com>
|
||||
* and
|
||||
* pca9540.c from Jean Delvare <khali@linux-fr.org>.
|
||||
*
|
||||
* This file is licensed under the terms of the GNU General Public
|
||||
* License version 2. This program is licensed "as is" without any
|
||||
* warranty of any kind, whether express or implied.
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/version.h>
|
||||
#include <linux/stat.h>
|
||||
#include <linux/sysfs.h>
|
||||
#include <linux/hwmon-sysfs.h>
|
||||
#include <linux/ipmi.h>
|
||||
#include <linux/ipmi_smi.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#define DRVNAME "as5916_26xb_thermal"
|
||||
#define ACCTON_IPMI_NETFN 0x34
|
||||
#define IPMI_THERMAL_READ_CMD 0x12
|
||||
#define IPMI_TIMEOUT (5 * HZ)
|
||||
|
||||
static void ipmi_msg_handler(struct ipmi_recv_msg *msg, void *user_msg_data);
|
||||
static ssize_t show_temp(struct device *dev, struct device_attribute *attr, char *buf);
|
||||
static int as5916_26xb_thermal_probe(struct platform_device *pdev);
|
||||
static int as5916_26xb_thermal_remove(struct platform_device *pdev);
|
||||
|
||||
enum temp_data_index {
|
||||
TEMP_ADDR,
|
||||
TEMP_FAULT,
|
||||
TEMP_INPUT,
|
||||
TEMP_DATA_COUNT
|
||||
};
|
||||
|
||||
struct ipmi_data {
|
||||
struct completion read_complete;
|
||||
struct ipmi_addr address;
|
||||
ipmi_user_t user;
|
||||
int interface;
|
||||
|
||||
struct kernel_ipmi_msg tx_message;
|
||||
long tx_msgid;
|
||||
|
||||
void *rx_msg_data;
|
||||
unsigned short rx_msg_len;
|
||||
unsigned char rx_result;
|
||||
int rx_recv_type;
|
||||
|
||||
struct ipmi_user_hndl ipmi_hndlrs;
|
||||
};
|
||||
|
||||
struct as5916_26xb_thermal_data {
|
||||
struct platform_device *pdev;
|
||||
struct mutex update_lock;
|
||||
char valid; /* != 0 if registers are valid */
|
||||
unsigned long last_updated; /* In jiffies */
|
||||
char ipmi_resp[18];
|
||||
struct ipmi_data ipmi;
|
||||
};
|
||||
|
||||
struct as5916_26xb_thermal_data *data = NULL;
|
||||
|
||||
static struct platform_driver as5916_26xb_thermal_driver = {
|
||||
.probe = as5916_26xb_thermal_probe,
|
||||
.remove = as5916_26xb_thermal_remove,
|
||||
.driver = {
|
||||
.name = DRVNAME,
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
};
|
||||
|
||||
enum as5916_54x_thermal_sysfs_attrs {
|
||||
TEMP1_INPUT,
|
||||
TEMP2_INPUT,
|
||||
TEMP3_INPUT,
|
||||
TEMP4_INPUT,
|
||||
TEMP5_INPUT,
|
||||
TEMP6_INPUT
|
||||
};
|
||||
|
||||
static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL, TEMP1_INPUT);
|
||||
static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO, show_temp, NULL, TEMP2_INPUT);
|
||||
static SENSOR_DEVICE_ATTR(temp3_input, S_IRUGO, show_temp, NULL, TEMP3_INPUT);
|
||||
static SENSOR_DEVICE_ATTR(temp4_input, S_IRUGO, show_temp, NULL, TEMP4_INPUT);
|
||||
static SENSOR_DEVICE_ATTR(temp5_input, S_IRUGO, show_temp, NULL, TEMP5_INPUT);
|
||||
static SENSOR_DEVICE_ATTR(temp6_input, S_IRUGO, show_temp, NULL, TEMP6_INPUT);
|
||||
|
||||
static struct attribute *as5916_26xb_thermal_attributes[] = {
|
||||
&sensor_dev_attr_temp1_input.dev_attr.attr,
|
||||
&sensor_dev_attr_temp2_input.dev_attr.attr,
|
||||
&sensor_dev_attr_temp3_input.dev_attr.attr,
|
||||
&sensor_dev_attr_temp4_input.dev_attr.attr,
|
||||
&sensor_dev_attr_temp5_input.dev_attr.attr,
|
||||
&sensor_dev_attr_temp6_input.dev_attr.attr,
|
||||
NULL
|
||||
};
|
||||
|
||||
static const struct attribute_group as5916_26xb_thermal_group = {
|
||||
.attrs = as5916_26xb_thermal_attributes,
|
||||
};
|
||||
|
||||
/* Functions to talk to the IPMI layer */
|
||||
|
||||
/* Initialize IPMI address, message buffers and user data */
|
||||
static int init_ipmi_data(struct ipmi_data *ipmi, int iface,
|
||||
struct device *dev)
|
||||
{
|
||||
int err;
|
||||
|
||||
init_completion(&ipmi->read_complete);
|
||||
|
||||
/* Initialize IPMI address */
|
||||
ipmi->address.addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE;
|
||||
ipmi->address.channel = IPMI_BMC_CHANNEL;
|
||||
ipmi->address.data[0] = 0;
|
||||
ipmi->interface = iface;
|
||||
|
||||
/* Initialize message buffers */
|
||||
ipmi->tx_msgid = 0;
|
||||
ipmi->tx_message.netfn = ACCTON_IPMI_NETFN;
|
||||
|
||||
ipmi->ipmi_hndlrs.ipmi_recv_hndl = ipmi_msg_handler;
|
||||
|
||||
/* Create IPMI messaging interface user */
|
||||
err = ipmi_create_user(ipmi->interface, &ipmi->ipmi_hndlrs,
|
||||
ipmi, &ipmi->user);
|
||||
if (err < 0) {
|
||||
dev_err(dev, "Unable to register user with IPMI "
|
||||
"interface %d\n", ipmi->interface);
|
||||
return -EACCES;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Send an IPMI command */
|
||||
static int ipmi_send_message(struct ipmi_data *ipmi, unsigned char cmd,
|
||||
unsigned char *tx_data, unsigned short tx_len,
|
||||
unsigned char *rx_data, unsigned short rx_len)
|
||||
{
|
||||
int err;
|
||||
|
||||
ipmi->tx_message.cmd = cmd;
|
||||
ipmi->tx_message.data = tx_data;
|
||||
ipmi->tx_message.data_len = tx_len;
|
||||
ipmi->rx_msg_data = rx_data;
|
||||
ipmi->rx_msg_len = rx_len;
|
||||
|
||||
err = ipmi_validate_addr(&ipmi->address, sizeof(ipmi->address));
|
||||
if (err)
|
||||
goto addr_err;
|
||||
|
||||
ipmi->tx_msgid++;
|
||||
err = ipmi_request_settime(ipmi->user, &ipmi->address, ipmi->tx_msgid,
|
||||
&ipmi->tx_message, ipmi, 0, 0, 0);
|
||||
if (err)
|
||||
goto ipmi_req_err;
|
||||
|
||||
err = wait_for_completion_timeout(&ipmi->read_complete, IPMI_TIMEOUT);
|
||||
if (!err)
|
||||
goto ipmi_timeout_err;
|
||||
|
||||
return 0;
|
||||
|
||||
ipmi_timeout_err:
|
||||
err = -ETIMEDOUT;
|
||||
dev_err(&data->pdev->dev, "request_timeout=%x\n", err);
|
||||
return err;
|
||||
ipmi_req_err:
|
||||
dev_err(&data->pdev->dev, "request_settime=%x\n", err);
|
||||
return err;
|
||||
addr_err:
|
||||
dev_err(&data->pdev->dev, "validate_addr=%x\n", err);
|
||||
return err;
|
||||
}
|
||||
|
||||
/* Dispatch IPMI messages to callers */
|
||||
static void ipmi_msg_handler(struct ipmi_recv_msg *msg, void *user_msg_data)
|
||||
{
|
||||
unsigned short rx_len;
|
||||
struct ipmi_data *ipmi = user_msg_data;
|
||||
|
||||
if (msg->msgid != ipmi->tx_msgid) {
|
||||
dev_err(&data->pdev->dev, "Mismatch between received msgid "
|
||||
"(%02x) and transmitted msgid (%02x)!\n",
|
||||
(int)msg->msgid,
|
||||
(int)ipmi->tx_msgid);
|
||||
ipmi_free_recv_msg(msg);
|
||||
return;
|
||||
}
|
||||
|
||||
ipmi->rx_recv_type = msg->recv_type;
|
||||
if (msg->msg.data_len > 0)
|
||||
ipmi->rx_result = msg->msg.data[0];
|
||||
else
|
||||
ipmi->rx_result = IPMI_UNKNOWN_ERR_COMPLETION_CODE;
|
||||
|
||||
if (msg->msg.data_len > 1) {
|
||||
rx_len = msg->msg.data_len - 1;
|
||||
if (ipmi->rx_msg_len < rx_len)
|
||||
rx_len = ipmi->rx_msg_len;
|
||||
ipmi->rx_msg_len = rx_len;
|
||||
memcpy(ipmi->rx_msg_data, msg->msg.data + 1, ipmi->rx_msg_len);
|
||||
} else
|
||||
ipmi->rx_msg_len = 0;
|
||||
|
||||
ipmi_free_recv_msg(msg);
|
||||
complete(&ipmi->read_complete);
|
||||
}
|
||||
|
||||
static ssize_t show_temp(struct device *dev, struct device_attribute *da, char *buf)
|
||||
{
|
||||
int status = 0;
|
||||
int index = 0;
|
||||
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
|
||||
|
||||
mutex_lock(&data->update_lock);
|
||||
|
||||
if (time_after(jiffies, data->last_updated + HZ * 5) || !data->valid) {
|
||||
data->valid = 0;
|
||||
|
||||
status = ipmi_send_message(&data->ipmi, IPMI_THERMAL_READ_CMD, NULL, 0,
|
||||
data->ipmi_resp, sizeof(data->ipmi_resp));
|
||||
if (unlikely(status != 0)) {
|
||||
goto exit;
|
||||
}
|
||||
|
||||
if (unlikely(data->ipmi.rx_result != 0)) {
|
||||
status = -EIO;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
data->last_updated = jiffies;
|
||||
data->valid = 1;
|
||||
}
|
||||
|
||||
mutex_unlock(&data->update_lock);
|
||||
|
||||
/* Get temp fault status */
|
||||
index = attr->index * TEMP_DATA_COUNT + TEMP_FAULT;
|
||||
if (unlikely(data->ipmi_resp[index] == 0)) {
|
||||
status = -EIO;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
/* Get temperature in degree celsius */
|
||||
index = attr->index * TEMP_DATA_COUNT + TEMP_INPUT;
|
||||
status = data->ipmi_resp[index] * 1000;
|
||||
|
||||
return sprintf(buf, "%d\n", status);
|
||||
|
||||
exit:
|
||||
mutex_unlock(&data->update_lock);
|
||||
return status;
|
||||
}
|
||||
|
||||
static int as5916_26xb_thermal_probe(struct platform_device *pdev)
|
||||
{
|
||||
int status = -1;
|
||||
|
||||
/* Register sysfs hooks */
|
||||
status = sysfs_create_group(&pdev->dev.kobj, &as5916_26xb_thermal_group);
|
||||
if (status) {
|
||||
goto exit;
|
||||
}
|
||||
|
||||
dev_info(&pdev->dev, "device created\n");
|
||||
|
||||
return 0;
|
||||
|
||||
exit:
|
||||
return status;
|
||||
}
|
||||
|
||||
static int as5916_26xb_thermal_remove(struct platform_device *pdev)
|
||||
{
|
||||
sysfs_remove_group(&pdev->dev.kobj, &as5916_26xb_thermal_group);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __init as5916_26xb_thermal_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
data = kzalloc(sizeof(struct as5916_26xb_thermal_data), GFP_KERNEL);
|
||||
if (!data) {
|
||||
ret = -ENOMEM;
|
||||
goto alloc_err;
|
||||
}
|
||||
|
||||
mutex_init(&data->update_lock);
|
||||
data->valid = 0;
|
||||
|
||||
ret = platform_driver_register(&as5916_26xb_thermal_driver);
|
||||
if (ret < 0) {
|
||||
goto dri_reg_err;
|
||||
}
|
||||
|
||||
data->pdev = platform_device_register_simple(DRVNAME, -1, NULL, 0);
|
||||
if (IS_ERR(data->pdev)) {
|
||||
ret = PTR_ERR(data->pdev);
|
||||
goto dev_reg_err;
|
||||
}
|
||||
|
||||
/* Set up IPMI interface */
|
||||
ret = init_ipmi_data(&data->ipmi, 0, &data->pdev->dev);
|
||||
if (ret)
|
||||
goto ipmi_err;
|
||||
|
||||
return 0;
|
||||
|
||||
ipmi_err:
|
||||
platform_device_unregister(data->pdev);
|
||||
dev_reg_err:
|
||||
platform_driver_unregister(&as5916_26xb_thermal_driver);
|
||||
dri_reg_err:
|
||||
kfree(data);
|
||||
alloc_err:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void __exit as5916_26xb_thermal_exit(void)
|
||||
{
|
||||
ipmi_destroy_user(data->ipmi.user);
|
||||
platform_device_unregister(data->pdev);
|
||||
platform_driver_unregister(&as5916_26xb_thermal_driver);
|
||||
kfree(data);
|
||||
}
|
||||
|
||||
MODULE_AUTHOR("Brandon Chuang <brandon_chuang@accton.com.tw>");
|
||||
MODULE_DESCRIPTION("AS5916 26XB Thermal driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
module_init(as5916_26xb_thermal_init);
|
||||
module_exit(as5916_26xb_thermal_exit);
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
include $(ONL)/make/pkg.mk
|
||||
@@ -0,0 +1 @@
|
||||
!include $ONL_TEMPLATES/onlp-platform-any.yml PLATFORM=x86-64-accton-as5916-26xb ARCH=amd64 TOOLCHAIN=x86_64-linux-gnu
|
||||
@@ -0,0 +1,2 @@
|
||||
FILTER=src
|
||||
include $(ONL)/make/subdirs.mk
|
||||
@@ -0,0 +1,45 @@
|
||||
############################################################
|
||||
# <bsn.cl fy=2014 v=onl>
|
||||
#
|
||||
# Copyright 2014 BigSwitch Networks, Inc.
|
||||
#
|
||||
# Licensed under the Eclipse Public License, Version 1.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.eclipse.org/legal/epl-v10.html
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
|
||||
# either express or implied. See the License for the specific
|
||||
# language governing permissions and limitations under the
|
||||
# License.
|
||||
#
|
||||
# </bsn.cl>
|
||||
############################################################
|
||||
#
|
||||
#
|
||||
############################################################
|
||||
include $(ONL)/make/config.amd64.mk
|
||||
|
||||
MODULE := libonlp-x86-64-accton-as5916-26xb
|
||||
include $(BUILDER)/standardinit.mk
|
||||
|
||||
DEPENDMODULES := AIM IOF x86_64_accton_as5916_26xb onlplib
|
||||
DEPENDMODULE_HEADERS := sff
|
||||
|
||||
include $(BUILDER)/dependmodules.mk
|
||||
|
||||
SHAREDLIB := libonlp-x86-64-accton-as5916-26xb.so
|
||||
$(SHAREDLIB)_TARGETS := $(ALL_TARGETS)
|
||||
include $(BUILDER)/so.mk
|
||||
.DEFAULT_GOAL := $(SHAREDLIB)
|
||||
|
||||
GLOBAL_CFLAGS += -I$(onlp_BASEDIR)/module/inc
|
||||
GLOBAL_CFLAGS += -DAIM_CONFIG_INCLUDE_MODULES_INIT=1
|
||||
GLOBAL_CFLAGS += -fPIC
|
||||
GLOBAL_LINK_LIBS += -lpthread
|
||||
|
||||
include $(BUILDER)/targets.mk
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
############################################################
|
||||
# <bsn.cl fy=2014 v=onl>
|
||||
#
|
||||
# Copyright 2014 BigSwitch Networks, Inc.
|
||||
#
|
||||
# Licensed under the Eclipse Public License, Version 1.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.eclipse.org/legal/epl-v10.html
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
|
||||
# either express or implied. See the License for the specific
|
||||
# language governing permissions and limitations under the
|
||||
# License.
|
||||
#
|
||||
# </bsn.cl>
|
||||
############################################################
|
||||
#
|
||||
#
|
||||
#
|
||||
############################################################
|
||||
include $(ONL)/make/config.amd64.mk
|
||||
|
||||
.DEFAULT_GOAL := onlpdump
|
||||
|
||||
MODULE := onlpdump
|
||||
include $(BUILDER)/standardinit.mk
|
||||
|
||||
DEPENDMODULES := AIM IOF onlp x86_64_accton_as5916_26xb onlplib onlp_platform_defaults sff cjson cjson_util timer_wheel OS
|
||||
|
||||
include $(BUILDER)/dependmodules.mk
|
||||
|
||||
BINARY := onlpdump
|
||||
$(BINARY)_LIBRARIES := $(LIBRARY_TARGETS)
|
||||
include $(BUILDER)/bin.mk
|
||||
|
||||
GLOBAL_CFLAGS += -DAIM_CONFIG_AIM_MAIN_FUNCTION=onlpdump_main
|
||||
GLOBAL_CFLAGS += -DAIM_CONFIG_INCLUDE_MODULES_INIT=1
|
||||
GLOBAL_CFLAGS += -DAIM_CONFIG_INCLUDE_MAIN=1
|
||||
GLOBAL_LINK_LIBS += -lpthread -lm
|
||||
|
||||
include $(BUILDER)/targets.mk
|
||||
|
||||
1
packages/platforms/accton/x86-64/x86-64-accton-as5916-26xb/onlp/builds/src/.gitignore
vendored
Normal file
1
packages/platforms/accton/x86-64/x86-64-accton-as5916-26xb/onlp/builds/src/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
name: x86_64_accton_as5916_26xb
|
||||
@@ -0,0 +1,9 @@
|
||||
###############################################################################
|
||||
#
|
||||
#
|
||||
#
|
||||
###############################################################################
|
||||
include $(ONL)/make/config.mk
|
||||
MODULE := x86_64_accton_as5916_26xb
|
||||
AUTOMODULE := x86_64_accton_as5916_26xb
|
||||
include $(BUILDER)/definemodule.mk
|
||||
@@ -1,8 +1,6 @@
|
||||
###############################################################################
|
||||
#
|
||||
# sff Unit Test Makefile.
|
||||
# x86_64_accton_as5916_26xb README
|
||||
#
|
||||
###############################################################################
|
||||
UMODULE := sff
|
||||
UMODULE_SUBDIR := $(dir $(lastword $(MAKEFILE_LIST)))
|
||||
include $(BUILDER)/utest.mk
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
###############################################################################
|
||||
#
|
||||
# x86_64_accton_as5916_54x Autogeneration
|
||||
#
|
||||
###############################################################################
|
||||
x86_64_accton_as5916_54x_AUTO_DEFS := module/auto/x86_64_accton_as5916_54x.yml
|
||||
x86_64_accton_as5916_54x_AUTO_DIRS := module/inc/x86_64_accton_as5916_54x module/src
|
||||
include $(BUILDER)/auto.mk
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
###############################################################################
|
||||
#
|
||||
# x86_64_accton_as5916_26xb Autogeneration Definitions.
|
||||
#
|
||||
###############################################################################
|
||||
|
||||
cdefs: &cdefs
|
||||
- X86_64_ACCTON_AS5916_26XB_CONFIG_INCLUDE_LOGGING:
|
||||
doc: "Include or exclude logging."
|
||||
default: 1
|
||||
- X86_64_ACCTON_AS5916_26XB_CONFIG_LOG_OPTIONS_DEFAULT:
|
||||
doc: "Default enabled log options."
|
||||
default: AIM_LOG_OPTIONS_DEFAULT
|
||||
- X86_64_ACCTON_AS5916_26XB_CONFIG_LOG_BITS_DEFAULT:
|
||||
doc: "Default enabled log bits."
|
||||
default: AIM_LOG_BITS_DEFAULT
|
||||
- X86_64_ACCTON_AS5916_26XB_CONFIG_LOG_CUSTOM_BITS_DEFAULT:
|
||||
doc: "Default enabled custom log bits."
|
||||
default: 0
|
||||
- X86_64_ACCTON_AS5916_26XB_CONFIG_PORTING_STDLIB:
|
||||
doc: "Default all porting macros to use the C standard libraries."
|
||||
default: 1
|
||||
- X86_64_ACCTON_AS5916_26XB_CONFIG_PORTING_INCLUDE_STDLIB_HEADERS:
|
||||
doc: "Include standard library headers for stdlib porting macros."
|
||||
default: X86_64_ACCTON_AS5916_26XB_CONFIG_PORTING_STDLIB
|
||||
- X86_64_ACCTON_AS5916_26XB_CONFIG_INCLUDE_UCLI:
|
||||
doc: "Include generic uCli support."
|
||||
default: 0
|
||||
- X86_64_ACCTON_AS5916_26XB_CONFIG_INCLUDE_DEFAULT_FAN_DIRECTION:
|
||||
doc: "Assume chassis fan direction is the same as the PSU fan direction."
|
||||
default: 0
|
||||
|
||||
|
||||
definitions:
|
||||
cdefs:
|
||||
X86_64_ACCTON_AS5916_26xb_CONFIG_HEADER:
|
||||
defs: *cdefs
|
||||
basename: x86_64_accton_as5916_26xb_config
|
||||
|
||||
portingmacro:
|
||||
x86_64_accton_as5916_26xb:
|
||||
macros:
|
||||
- malloc
|
||||
- free
|
||||
- memset
|
||||
- memcpy
|
||||
- strncpy
|
||||
- vsnprintf
|
||||
- snprintf
|
||||
- strlen
|
||||
@@ -0,0 +1,14 @@
|
||||
/**************************************************************************//**
|
||||
*
|
||||
*
|
||||
*
|
||||
*****************************************************************************/
|
||||
#include <x86_64_accton_as5916_26xb/x86_64_accton_as5916_26xb_config.h>
|
||||
|
||||
/* <--auto.start.xmacro(ALL).define> */
|
||||
/* <auto.end.xmacro(ALL).define> */
|
||||
|
||||
/* <--auto.start.xenum(ALL).define> */
|
||||
/* <auto.end.xenum(ALL).define> */
|
||||
|
||||
|
||||
@@ -0,0 +1,137 @@
|
||||
/**************************************************************************//**
|
||||
*
|
||||
* @file
|
||||
* @brief x86_64_accton_as5916_26xb Configuration Header
|
||||
*
|
||||
* @addtogroup x86_64_accton_as5916_26xb-config
|
||||
* @{
|
||||
*
|
||||
*****************************************************************************/
|
||||
#ifndef __X86_64_ACCTON_AS5916_26XB_CONFIG_H__
|
||||
#define __X86_64_ACCTON_AS5916_26XB_CONFIG_H__
|
||||
|
||||
#ifdef GLOBAL_INCLUDE_CUSTOM_CONFIG
|
||||
#include <global_custom_config.h>
|
||||
#endif
|
||||
#ifdef X86_64_ACCTON_AS5916_26XB_INCLUDE_CUSTOM_CONFIG
|
||||
#include <x86_64_accton_as5916_26xb_custom_config.h>
|
||||
#endif
|
||||
|
||||
/* <auto.start.cdefs(X86_64_ACCTON_AS5916_26XB_CONFIG_HEADER).header> */
|
||||
#include <AIM/aim.h>
|
||||
/**
|
||||
* X86_64_ACCTON_AS5916_26XB_CONFIG_INCLUDE_LOGGING
|
||||
*
|
||||
* Include or exclude logging. */
|
||||
|
||||
|
||||
#ifndef X86_64_ACCTON_AS5916_26XB_CONFIG_INCLUDE_LOGGING
|
||||
#define X86_64_ACCTON_AS5916_26XB_CONFIG_INCLUDE_LOGGING 1
|
||||
#endif
|
||||
|
||||
/**
|
||||
* X86_64_ACCTON_AS5916_26XB_CONFIG_LOG_OPTIONS_DEFAULT
|
||||
*
|
||||
* Default enabled log options. */
|
||||
|
||||
|
||||
#ifndef X86_64_ACCTON_AS5916_26XB_CONFIG_LOG_OPTIONS_DEFAULT
|
||||
#define X86_64_ACCTON_AS5916_26XB_CONFIG_LOG_OPTIONS_DEFAULT AIM_LOG_OPTIONS_DEFAULT
|
||||
#endif
|
||||
|
||||
/**
|
||||
* X86_64_ACCTON_AS5916_26XB_CONFIG_LOG_BITS_DEFAULT
|
||||
*
|
||||
* Default enabled log bits. */
|
||||
|
||||
|
||||
#ifndef X86_64_ACCTON_AS5916_26XB_CONFIG_LOG_BITS_DEFAULT
|
||||
#define X86_64_ACCTON_AS5916_26XB_CONFIG_LOG_BITS_DEFAULT AIM_LOG_BITS_DEFAULT
|
||||
#endif
|
||||
|
||||
/**
|
||||
* X86_64_ACCTON_AS5916_26XB_CONFIG_LOG_CUSTOM_BITS_DEFAULT
|
||||
*
|
||||
* Default enabled custom log bits. */
|
||||
|
||||
|
||||
#ifndef X86_64_ACCTON_AS5916_26XB_CONFIG_LOG_CUSTOM_BITS_DEFAULT
|
||||
#define X86_64_ACCTON_AS5916_26XB_CONFIG_LOG_CUSTOM_BITS_DEFAULT 0
|
||||
#endif
|
||||
|
||||
/**
|
||||
* X86_64_ACCTON_AS5916_26XB_CONFIG_PORTING_STDLIB
|
||||
*
|
||||
* Default all porting macros to use the C standard libraries. */
|
||||
|
||||
|
||||
#ifndef X86_64_ACCTON_AS5916_26XB_CONFIG_PORTING_STDLIB
|
||||
#define X86_64_ACCTON_AS5916_26XB_CONFIG_PORTING_STDLIB 1
|
||||
#endif
|
||||
|
||||
/**
|
||||
* X86_64_ACCTON_AS5916_26XB_CONFIG_PORTING_INCLUDE_STDLIB_HEADERS
|
||||
*
|
||||
* Include standard library headers for stdlib porting macros. */
|
||||
|
||||
|
||||
#ifndef X86_64_ACCTON_AS5916_26XB_CONFIG_PORTING_INCLUDE_STDLIB_HEADERS
|
||||
#define X86_64_ACCTON_AS5916_26XB_CONFIG_PORTING_INCLUDE_STDLIB_HEADERS X86_64_ACCTON_AS5916_26XB_CONFIG_PORTING_STDLIB
|
||||
#endif
|
||||
|
||||
/**
|
||||
* X86_64_ACCTON_AS5916_26XB_CONFIG_INCLUDE_UCLI
|
||||
*
|
||||
* Include generic uCli support. */
|
||||
|
||||
|
||||
#ifndef X86_64_ACCTON_AS5916_26XB_CONFIG_INCLUDE_UCLI
|
||||
#define X86_64_ACCTON_AS5916_26XB_CONFIG_INCLUDE_UCLI 0
|
||||
#endif
|
||||
|
||||
/**
|
||||
* X86_64_ACCTON_AS5916_26XB_CONFIG_INCLUDE_DEFAULT_FAN_DIRECTION
|
||||
*
|
||||
* Assume chassis fan direction is the same as the PSU fan direction. */
|
||||
|
||||
|
||||
#ifndef X86_64_ACCTON_AS5916_26XB_CONFIG_INCLUDE_DEFAULT_FAN_DIRECTION
|
||||
#define X86_64_ACCTON_AS5916_26XB_CONFIG_INCLUDE_DEFAULT_FAN_DIRECTION 0
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* All compile time options can be queried or displayed
|
||||
*/
|
||||
|
||||
/** Configuration settings structure. */
|
||||
typedef struct x86_64_accton_as5916_26xb_config_settings_s {
|
||||
/** name */
|
||||
const char* name;
|
||||
/** value */
|
||||
const char* value;
|
||||
} x86_64_accton_as5916_26xb_config_settings_t;
|
||||
|
||||
/** Configuration settings table. */
|
||||
/** x86_64_accton_as5916_26xb_config_settings table. */
|
||||
extern x86_64_accton_as5916_26xb_config_settings_t x86_64_accton_as5916_26xb_config_settings[];
|
||||
|
||||
/**
|
||||
* @brief Lookup a configuration setting.
|
||||
* @param setting The name of the configuration option to lookup.
|
||||
*/
|
||||
const char* x86_64_accton_as5916_26xb_config_lookup(const char* setting);
|
||||
|
||||
/**
|
||||
* @brief Show the compile-time configuration.
|
||||
* @param pvs The output stream.
|
||||
*/
|
||||
int x86_64_accton_as5916_26xb_config_show(struct aim_pvs_s* pvs);
|
||||
|
||||
/* <auto.end.cdefs(X86_64_ACCTON_AS5916_26XB_CONFIG_HEADER).header> */
|
||||
|
||||
#include "x86_64_accton_as5916_26xb_porting.h"
|
||||
|
||||
#endif /* __X86_64_ACCTON_AS5916_26XB_CONFIG_H__ */
|
||||
/* @} */
|
||||
@@ -0,0 +1,26 @@
|
||||
/**************************************************************************//**
|
||||
*
|
||||
* x86_64_accton_as5916_26xb Doxygen Header
|
||||
*
|
||||
*****************************************************************************/
|
||||
#ifndef __X86_64_ACCTON_AS5916_26XB_DOX_H__
|
||||
#define __X86_64_ACCTON_AS5916_26XB_DOX_H__
|
||||
|
||||
/**
|
||||
* @defgroup x86_64_accton_as5916_26xb x86_64_accton_as5916_26xb - x86_64_accton_as5916_26xb Description
|
||||
*
|
||||
|
||||
The documentation overview for this module should go here.
|
||||
|
||||
*
|
||||
* @{
|
||||
*
|
||||
* @defgroup x86_64_accton_as5916_26xb-x86_64_accton_as5916_26xb Public Interface
|
||||
* @defgroup x86_64_accton_as5916_26xb-config Compile Time Configuration
|
||||
* @defgroup x86_64_accton_as5916_26xb-porting Porting Macros
|
||||
*
|
||||
* @}
|
||||
*
|
||||
*/
|
||||
|
||||
#endif /* __X86_64_ACCTON_AS5916_26XB_DOX_H__ */
|
||||
@@ -0,0 +1,107 @@
|
||||
/**************************************************************************//**
|
||||
*
|
||||
* @file
|
||||
* @brief x86_64_accton_as5916_26xb Porting Macros.
|
||||
*
|
||||
* @addtogroup x86_64_accton_as5916_26xb-porting
|
||||
* @{
|
||||
*
|
||||
*****************************************************************************/
|
||||
#ifndef __X86_64_ACCTON_AS5916_26XB_PORTING_H__
|
||||
#define __X86_64_ACCTON_AS5916_26XB_PORTING_H__
|
||||
|
||||
|
||||
/* <auto.start.portingmacro(ALL).define> */
|
||||
#if X86_64_ACCTON_AS5916_26XB_CONFIG_PORTING_INCLUDE_STDLIB_HEADERS == 1
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdarg.h>
|
||||
#include <memory.h>
|
||||
#endif
|
||||
|
||||
#ifndef X86_64_ACCTON_AS5916_26XB_MALLOC
|
||||
#if defined(GLOBAL_MALLOC)
|
||||
#define X86_64_ACCTON_AS5916_26XB_MALLOC GLOBAL_MALLOC
|
||||
#elif X86_64_ACCTON_AS5916_26XB_CONFIG_PORTING_STDLIB == 1
|
||||
#define X86_64_ACCTON_AS5916_26XB_MALLOC malloc
|
||||
#else
|
||||
#error The macro X86_64_ACCTON_AS5916_26XB_MALLOC is required but cannot be defined.
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef X86_64_ACCTON_AS5916_26XB_FREE
|
||||
#if defined(GLOBAL_FREE)
|
||||
#define X86_64_ACCTON_AS5916_26XB_FREE GLOBAL_FREE
|
||||
#elif X86_64_ACCTON_AS5916_26XB_CONFIG_PORTING_STDLIB == 1
|
||||
#define X86_64_ACCTON_AS5916_26XB_FREE free
|
||||
#else
|
||||
#error The macro X86_64_ACCTON_AS5916_26XB_FREE is required but cannot be defined.
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef X86_64_ACCTON_AS5916_26XB_MEMSET
|
||||
#if defined(GLOBAL_MEMSET)
|
||||
#define X86_64_ACCTON_AS5916_26XB_MEMSET GLOBAL_MEMSET
|
||||
#elif X86_64_ACCTON_AS5916_26XB_CONFIG_PORTING_STDLIB == 1
|
||||
#define X86_64_ACCTON_AS5916_26XB_MEMSET memset
|
||||
#else
|
||||
#error The macro X86_64_ACCTON_AS5916_26XB_MEMSET is required but cannot be defined.
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef X86_64_ACCTON_AS5916_26XB_MEMCPY
|
||||
#if defined(GLOBAL_MEMCPY)
|
||||
#define X86_64_ACCTON_AS5916_26XB_MEMCPY GLOBAL_MEMCPY
|
||||
#elif X86_64_ACCTON_AS5916_26XB_CONFIG_PORTING_STDLIB == 1
|
||||
#define X86_64_ACCTON_AS5916_26XB_MEMCPY memcpy
|
||||
#else
|
||||
#error The macro X86_64_ACCTON_AS5916_26XB_MEMCPY is required but cannot be defined.
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef X86_64_ACCTON_AS5916_26XB_STRNCPY
|
||||
#if defined(GLOBAL_STRNCPY)
|
||||
#define X86_64_ACCTON_AS5916_26XB_STRNCPY GLOBAL_STRNCPY
|
||||
#elif X86_64_ACCTON_AS5916_26XB_CONFIG_PORTING_STDLIB == 1
|
||||
#define X86_64_ACCTON_AS5916_26XB_STRNCPY strncpy
|
||||
#else
|
||||
#error The macro X86_64_ACCTON_AS5916_26XB_STRNCPY is required but cannot be defined.
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef X86_64_ACCTON_AS5916_26XB_VSNPRINTF
|
||||
#if defined(GLOBAL_VSNPRINTF)
|
||||
#define X86_64_ACCTON_AS5916_26XB_VSNPRINTF GLOBAL_VSNPRINTF
|
||||
#elif X86_64_ACCTON_AS5916_26XB_CONFIG_PORTING_STDLIB == 1
|
||||
#define X86_64_ACCTON_AS5916_26XB_VSNPRINTF vsnprintf
|
||||
#else
|
||||
#error The macro X86_64_ACCTON_AS5916_26XB_VSNPRINTF is required but cannot be defined.
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef X86_64_ACCTON_AS5916_26XB_SNPRINTF
|
||||
#if defined(GLOBAL_SNPRINTF)
|
||||
#define X86_64_ACCTON_AS5916_26XB_SNPRINTF GLOBAL_SNPRINTF
|
||||
#elif X86_64_ACCTON_AS5916_26XB_CONFIG_PORTING_STDLIB == 1
|
||||
#define X86_64_ACCTON_AS5916_26XB_SNPRINTF snprintf
|
||||
#else
|
||||
#error The macro X86_64_ACCTON_AS5916_26XB_SNPRINTF is required but cannot be defined.
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef X86_64_ACCTON_AS5916_26XB_STRLEN
|
||||
#if defined(GLOBAL_STRLEN)
|
||||
#define X86_64_ACCTON_AS5916_26XB_STRLEN GLOBAL_STRLEN
|
||||
#elif X86_64_ACCTON_AS5916_26XB_CONFIG_PORTING_STDLIB == 1
|
||||
#define X86_64_ACCTON_AS5916_26XB_STRLEN strlen
|
||||
#else
|
||||
#error The macro X86_64_ACCTON_AS5916_26XB_STRLEN is required but cannot be defined.
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* <auto.end.portingmacro(ALL).define> */
|
||||
|
||||
|
||||
#endif /* __X86_64_ACCTON_AS5916_26XB_PORTING_H__ */
|
||||
/* @} */
|
||||
@@ -0,0 +1,10 @@
|
||||
###############################################################################
|
||||
#
|
||||
#
|
||||
#
|
||||
###############################################################################
|
||||
THIS_DIR := $(dir $(lastword $(MAKEFILE_LIST)))
|
||||
x86_64_accton_as5916_26xb_INCLUDES := -I $(THIS_DIR)inc
|
||||
x86_64_accton_as5916_26xb_INTERNAL_INCLUDES := -I $(THIS_DIR)src
|
||||
x86_64_accton_as5916_26xb_DEPENDMODULE_ENTRIES := init:x86_64_accton_as5916_26xb ucli:x86_64_accton_as5916_26xb
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
###############################################################################
|
||||
#
|
||||
# Local source generation targets.
|
||||
#
|
||||
###############################################################################
|
||||
|
||||
ucli:
|
||||
@../../../../tools/uclihandlers.py x86_64_accton_as5916_26xb_ucli.c
|
||||
|
||||
@@ -0,0 +1,232 @@
|
||||
/************************************************************
|
||||
* <bsn.cl fy=2014 v=onl>
|
||||
*
|
||||
* Copyright 2014 Big Switch Networks, Inc.
|
||||
* Copyright 2014 Accton Technology Corporation.
|
||||
*
|
||||
* Licensed under the Eclipse Public License, Version 1.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
|
||||
* either express or implied. See the License for the specific
|
||||
* language governing permissions and limitations under the
|
||||
* License.
|
||||
*
|
||||
* </bsn.cl>
|
||||
************************************************************
|
||||
*
|
||||
* Fan Platform Implementation Defaults.
|
||||
*
|
||||
***********************************************************/
|
||||
#include <onlplib/file.h>
|
||||
#include <onlp/platformi/fani.h>
|
||||
#include "platform_lib.h"
|
||||
|
||||
enum fan_id {
|
||||
FAN_1_ON_FAN_BOARD = 1,
|
||||
FAN_2_ON_FAN_BOARD,
|
||||
FAN_3_ON_FAN_BOARD,
|
||||
FAN_4_ON_FAN_BOARD,
|
||||
FAN_5_ON_FAN_BOARD,
|
||||
FAN_1_ON_PSU_1,
|
||||
FAN_1_ON_PSU_2,
|
||||
};
|
||||
|
||||
#define MAX_FAN_SPEED 25500
|
||||
#define MAX_PSU_FAN_SPEED 25500
|
||||
|
||||
#define CHASSIS_FAN_INFO(fid) \
|
||||
{ \
|
||||
{ ONLP_FAN_ID_CREATE(FAN_##fid##_ON_FAN_BOARD), "Chassis Fan - "#fid, 0 },\
|
||||
0x0,\
|
||||
ONLP_FAN_CAPS_SET_PERCENTAGE | ONLP_FAN_CAPS_GET_RPM | ONLP_FAN_CAPS_GET_PERCENTAGE,\
|
||||
0,\
|
||||
0,\
|
||||
ONLP_FAN_MODE_INVALID,\
|
||||
}
|
||||
|
||||
#define PSU_FAN_INFO(pid, fid) \
|
||||
{ \
|
||||
{ ONLP_FAN_ID_CREATE(FAN_##fid##_ON_PSU_##pid), "PSU "#pid" - Fan "#fid, 0 },\
|
||||
0x0,\
|
||||
ONLP_FAN_CAPS_SET_PERCENTAGE | ONLP_FAN_CAPS_GET_RPM | ONLP_FAN_CAPS_GET_PERCENTAGE,\
|
||||
0,\
|
||||
0,\
|
||||
ONLP_FAN_MODE_INVALID,\
|
||||
}
|
||||
|
||||
/* Static fan information */
|
||||
onlp_fan_info_t finfo[] = {
|
||||
{ }, /* Not used */
|
||||
CHASSIS_FAN_INFO(1),
|
||||
CHASSIS_FAN_INFO(2),
|
||||
CHASSIS_FAN_INFO(3),
|
||||
CHASSIS_FAN_INFO(4),
|
||||
CHASSIS_FAN_INFO(5),
|
||||
PSU_FAN_INFO(1, 1),
|
||||
PSU_FAN_INFO(2, 1)
|
||||
};
|
||||
|
||||
#define VALIDATE(_id) \
|
||||
do { \
|
||||
if(!ONLP_OID_IS_FAN(_id)) { \
|
||||
return ONLP_STATUS_E_INVALID; \
|
||||
} \
|
||||
} while(0)
|
||||
|
||||
static int
|
||||
_onlp_fani_info_get_fan(int fid, onlp_fan_info_t* info)
|
||||
{
|
||||
int value, ret;
|
||||
|
||||
/* get fan present status
|
||||
*/
|
||||
ret = onlp_file_read_int(&value, "%s""fan%d_present", FAN_BOARD_PATH, fid);
|
||||
if (ret < 0) {
|
||||
AIM_LOG_ERROR("Unable to read status from (%s)\r\n", FAN_BOARD_PATH);
|
||||
return ONLP_STATUS_E_INTERNAL;
|
||||
}
|
||||
|
||||
if (value == 0) {
|
||||
return ONLP_STATUS_OK; /* fan is not present */
|
||||
}
|
||||
info->status |= ONLP_FAN_STATUS_PRESENT;
|
||||
|
||||
|
||||
/* get fan direction
|
||||
*/
|
||||
info->status |= ONLP_FAN_STATUS_F2B;
|
||||
|
||||
|
||||
/* get fan speed
|
||||
*/
|
||||
ret = onlp_file_read_int(&value, "%s""fan%d_input", FAN_BOARD_PATH, fid);
|
||||
if (ret < 0) {
|
||||
AIM_LOG_ERROR("Unable to read status from (%s)\r\n", FAN_BOARD_PATH);
|
||||
return ONLP_STATUS_E_INTERNAL;
|
||||
}
|
||||
info->rpm = value;
|
||||
info->percentage = (info->rpm * 100)/MAX_FAN_SPEED;
|
||||
|
||||
|
||||
/* get fan fault status
|
||||
*/
|
||||
if (!info->rpm) {
|
||||
info->status |= ONLP_FAN_STATUS_FAILED;
|
||||
}
|
||||
|
||||
return ONLP_STATUS_OK;
|
||||
}
|
||||
|
||||
static int
|
||||
_onlp_fani_info_get_fan_on_psu(int pid, onlp_fan_info_t* info)
|
||||
{
|
||||
int value, ret;
|
||||
|
||||
info->status |= ONLP_FAN_STATUS_PRESENT;
|
||||
|
||||
/* get fan direction
|
||||
*/
|
||||
info->status |= ONLP_FAN_STATUS_F2B;
|
||||
|
||||
/* get fan speed
|
||||
*/
|
||||
ret = onlp_file_read_int(&value, "%s""psu%d_fan1_input", PSU_SYSFS_PATH, pid);
|
||||
if (ret < 0) {
|
||||
AIM_LOG_ERROR("Unable to read status from (%s)\r\n", PSU_SYSFS_PATH);
|
||||
return ONLP_STATUS_E_INTERNAL;
|
||||
}
|
||||
|
||||
info->rpm = value;
|
||||
info->percentage = (info->rpm * 100)/MAX_PSU_FAN_SPEED;
|
||||
|
||||
/* get fan fault status
|
||||
*/
|
||||
if (!info->rpm) {
|
||||
info->status |= ONLP_FAN_STATUS_FAILED;
|
||||
}
|
||||
|
||||
return ONLP_STATUS_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* This function will be called prior to all of onlp_fani_* functions.
|
||||
*/
|
||||
int
|
||||
onlp_fani_init(void)
|
||||
{
|
||||
return ONLP_STATUS_OK;
|
||||
}
|
||||
|
||||
int
|
||||
onlp_fani_info_get(onlp_oid_t id, onlp_fan_info_t* info)
|
||||
{
|
||||
int rc = 0;
|
||||
int fid;
|
||||
VALIDATE(id);
|
||||
|
||||
fid = ONLP_OID_ID_GET(id);
|
||||
*info = finfo[fid];
|
||||
|
||||
switch (fid)
|
||||
{
|
||||
case FAN_1_ON_PSU_1:
|
||||
rc = _onlp_fani_info_get_fan_on_psu(PSU1_ID, info);
|
||||
break;
|
||||
case FAN_1_ON_PSU_2:
|
||||
rc = _onlp_fani_info_get_fan_on_psu(PSU2_ID, info);
|
||||
break;
|
||||
case FAN_1_ON_FAN_BOARD:
|
||||
case FAN_2_ON_FAN_BOARD:
|
||||
case FAN_3_ON_FAN_BOARD:
|
||||
case FAN_4_ON_FAN_BOARD:
|
||||
case FAN_5_ON_FAN_BOARD:
|
||||
rc =_onlp_fani_info_get_fan(fid, info);
|
||||
break;
|
||||
default:
|
||||
rc = ONLP_STATUS_E_INVALID;
|
||||
break;
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
/*
|
||||
* This function sets the fan speed of the given OID as a percentage.
|
||||
*
|
||||
* This will only be called if the OID has the PERCENTAGE_SET
|
||||
* capability.
|
||||
*
|
||||
* It is optional if you have no fans at all with this feature.
|
||||
*/
|
||||
int
|
||||
onlp_fani_percentage_set(onlp_oid_t id, int p)
|
||||
{
|
||||
int fid;
|
||||
|
||||
VALIDATE(id);
|
||||
|
||||
fid = ONLP_OID_ID_GET(id);
|
||||
|
||||
/* reject p=0 (p=0, stop fan) */
|
||||
if (p == 0){
|
||||
return ONLP_STATUS_E_INVALID;
|
||||
}
|
||||
|
||||
if (fid < FAN_1_ON_FAN_BOARD || fid > FAN_5_ON_FAN_BOARD) {
|
||||
return ONLP_STATUS_E_INVALID;
|
||||
}
|
||||
|
||||
if (onlp_file_write_int(p, "%s""fan%d_pwm", FAN_BOARD_PATH, fid) < 0) {
|
||||
AIM_LOG_ERROR("Unable to write data to file %s""fan%d_pwm", FAN_BOARD_PATH, fid);
|
||||
return ONLP_STATUS_E_INTERNAL;
|
||||
}
|
||||
|
||||
return ONLP_STATUS_OK;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,248 @@
|
||||
/************************************************************
|
||||
* <bsn.cl fy=2014 v=onl>
|
||||
*
|
||||
* Copyright 2014 Big Switch Networks, Inc.
|
||||
* Copyright 2013 Accton Technology Corporation.
|
||||
*
|
||||
* Licensed under the Eclipse Public License, Version 1.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
|
||||
* either express or implied. See the License for the specific
|
||||
* language governing permissions and limitations under the
|
||||
* License.
|
||||
*
|
||||
* </bsn.cl>
|
||||
************************************************************
|
||||
*
|
||||
*
|
||||
*
|
||||
***********************************************************/
|
||||
#include <onlplib/file.h>
|
||||
#include <onlp/platformi/ledi.h>
|
||||
#include "platform_lib.h"
|
||||
|
||||
#define LED_FORMAT "/sys/devices/platform/as5916_26xb_led/%s"
|
||||
|
||||
#define VALIDATE(_id) \
|
||||
do { \
|
||||
if(!ONLP_OID_IS_LED(_id)) { \
|
||||
return ONLP_STATUS_E_INVALID; \
|
||||
} \
|
||||
} while(0)
|
||||
|
||||
/* LED related data
|
||||
*/
|
||||
enum onlp_led_id
|
||||
{
|
||||
LED_RESERVED = 0,
|
||||
LED_LOC,
|
||||
LED_DIAG,
|
||||
LED_PSU1,
|
||||
LED_PSU2,
|
||||
LED_FAN,
|
||||
};
|
||||
|
||||
enum led_light_mode {
|
||||
LED_MODE_OFF,
|
||||
LED_MODE_RED = 10,
|
||||
LED_MODE_RED_BLINKING = 11,
|
||||
LED_MODE_ORANGE = 12,
|
||||
LED_MODE_ORANGE_BLINKING = 13,
|
||||
LED_MODE_YELLOW = 14,
|
||||
LED_MODE_YELLOW_BLINKING = 15,
|
||||
LED_MODE_GREEN = 16,
|
||||
LED_MODE_GREEN_BLINKING = 17,
|
||||
LED_MODE_BLUE = 18,
|
||||
LED_MODE_BLUE_BLINKING = 19,
|
||||
LED_MODE_PURPLE = 20,
|
||||
LED_MODE_PURPLE_BLINKING = 21,
|
||||
LED_MODE_AUTO = 22,
|
||||
LED_MODE_AUTO_BLINKING = 23,
|
||||
LED_MODE_WHITE = 24,
|
||||
LED_MODE_WHITE_BLINKING = 25,
|
||||
LED_MODE_CYAN = 26,
|
||||
LED_MODE_CYAN_BLINKING = 27,
|
||||
LED_MODE_UNKNOWN = 99
|
||||
};
|
||||
|
||||
typedef struct led_light_mode_map {
|
||||
enum onlp_led_id id;
|
||||
enum led_light_mode driver_led_mode;
|
||||
enum onlp_led_mode_e onlp_led_mode;
|
||||
} led_light_mode_map_t;
|
||||
|
||||
led_light_mode_map_t led_map[] = {
|
||||
{LED_LOC, LED_MODE_OFF, ONLP_LED_MODE_OFF},
|
||||
{LED_LOC, LED_MODE_ORANGE_BLINKING, ONLP_LED_MODE_ORANGE_BLINKING},
|
||||
{LED_DIAG, LED_MODE_OFF, ONLP_LED_MODE_OFF},
|
||||
{LED_DIAG, LED_MODE_GREEN, ONLP_LED_MODE_GREEN},
|
||||
{LED_DIAG, LED_MODE_GREEN_BLINKING, ONLP_LED_MODE_GREEN_BLINKING},
|
||||
{LED_DIAG, LED_MODE_ORANGE, ONLP_LED_MODE_ORANGE},
|
||||
{LED_FAN, LED_MODE_AUTO, ONLP_LED_MODE_AUTO},
|
||||
{LED_PSU1, LED_MODE_AUTO, ONLP_LED_MODE_AUTO},
|
||||
{LED_PSU2, LED_MODE_AUTO, ONLP_LED_MODE_AUTO}
|
||||
};
|
||||
|
||||
static char *leds[] = /* must map with onlp_led_id */
|
||||
{
|
||||
NULL,
|
||||
"led_loc",
|
||||
"led_diag",
|
||||
"led_psu1",
|
||||
"led_psu2",
|
||||
"led_fan"
|
||||
};
|
||||
|
||||
/*
|
||||
* Get the information for the given LED OID.
|
||||
*/
|
||||
static onlp_led_info_t linfo[] =
|
||||
{
|
||||
{ }, /* Not used */
|
||||
{
|
||||
{ ONLP_LED_ID_CREATE(LED_LOC), "Chassis LED 1 (LOC LED)", 0 },
|
||||
ONLP_LED_STATUS_PRESENT,
|
||||
ONLP_LED_CAPS_ON_OFF | ONLP_LED_CAPS_ORANGE_BLINKING,
|
||||
},
|
||||
{
|
||||
{ ONLP_LED_ID_CREATE(LED_DIAG), "Chassis LED 2 (DIAG LED)", 0 },
|
||||
ONLP_LED_STATUS_PRESENT,
|
||||
ONLP_LED_CAPS_ON_OFF | ONLP_LED_CAPS_GREEN | ONLP_LED_CAPS_GREEN_BLINKING,
|
||||
},
|
||||
{
|
||||
{ ONLP_LED_ID_CREATE(LED_PSU1), "Chassis LED 3 (PSU1 LED)", 0 },
|
||||
ONLP_LED_STATUS_PRESENT,
|
||||
ONLP_LED_CAPS_ON_OFF | ONLP_LED_CAPS_AUTO,
|
||||
},
|
||||
{
|
||||
{ ONLP_LED_ID_CREATE(LED_PSU2), "Chassis LED 4 (PSU2 LED)", 0 },
|
||||
ONLP_LED_STATUS_PRESENT,
|
||||
ONLP_LED_CAPS_ON_OFF | ONLP_LED_CAPS_AUTO,
|
||||
},
|
||||
{
|
||||
{ ONLP_LED_ID_CREATE(LED_FAN), "Chassis LED 5 (FAN LED)", 0 },
|
||||
ONLP_LED_STATUS_PRESENT,
|
||||
ONLP_LED_CAPS_ON_OFF | ONLP_LED_CAPS_AUTO,
|
||||
},
|
||||
};
|
||||
|
||||
static int driver_to_onlp_led_mode(enum onlp_led_id id, enum led_light_mode driver_led_mode)
|
||||
{
|
||||
int i, nsize = sizeof(led_map)/sizeof(led_map[0]);
|
||||
|
||||
for (i = 0; i < nsize; i++)
|
||||
{
|
||||
if (id == led_map[i].id && driver_led_mode == led_map[i].driver_led_mode)
|
||||
{
|
||||
return led_map[i].onlp_led_mode;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int onlp_to_driver_led_mode(enum onlp_led_id id, onlp_led_mode_t onlp_led_mode)
|
||||
{
|
||||
int i, nsize = sizeof(led_map)/sizeof(led_map[0]);
|
||||
|
||||
for(i = 0; i < nsize; i++)
|
||||
{
|
||||
if (id == led_map[i].id && onlp_led_mode == led_map[i].onlp_led_mode)
|
||||
{
|
||||
return led_map[i].driver_led_mode;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* This function will be called prior to any other onlp_ledi_* functions.
|
||||
*/
|
||||
int
|
||||
onlp_ledi_init(void)
|
||||
{
|
||||
/*
|
||||
* Turn off the LOCATION and DIAG LEDs at startup
|
||||
*/
|
||||
onlp_ledi_mode_set(ONLP_LED_ID_CREATE(LED_DIAG), ONLP_LED_MODE_OFF);
|
||||
onlp_ledi_mode_set(ONLP_LED_ID_CREATE(LED_LOC), ONLP_LED_MODE_OFF);
|
||||
|
||||
return ONLP_STATUS_OK;
|
||||
}
|
||||
|
||||
int
|
||||
onlp_ledi_info_get(onlp_oid_t id, onlp_led_info_t* info)
|
||||
{
|
||||
int lid, value;
|
||||
|
||||
VALIDATE(id);
|
||||
|
||||
lid = ONLP_OID_ID_GET(id);
|
||||
|
||||
/* Set the onlp_oid_hdr_t and capabilities */
|
||||
*info = linfo[ONLP_OID_ID_GET(id)];
|
||||
|
||||
/* Get LED mode */
|
||||
if (onlp_file_read_int(&value, LED_FORMAT, leds[lid]) < 0) {
|
||||
DEBUG_PRINT("Unable to read status from file "LED_FORMAT, leds[lid]);
|
||||
return ONLP_STATUS_E_INTERNAL;
|
||||
}
|
||||
|
||||
info->mode = driver_to_onlp_led_mode(lid, value);
|
||||
|
||||
/* Set the on/off status */
|
||||
if (info->mode != ONLP_LED_MODE_OFF) {
|
||||
info->status |= ONLP_LED_STATUS_ON;
|
||||
}
|
||||
|
||||
return ONLP_STATUS_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* Turn an LED on or off.
|
||||
*
|
||||
* This function will only be called if the LED OID supports the ONOFF
|
||||
* capability.
|
||||
*
|
||||
* What 'on' means in terms of colors or modes for multimode LEDs is
|
||||
* up to the platform to decide. This is intended as baseline toggle mechanism.
|
||||
*/
|
||||
int
|
||||
onlp_ledi_set(onlp_oid_t id, int on_or_off)
|
||||
{
|
||||
VALIDATE(id);
|
||||
|
||||
if (!on_or_off) {
|
||||
return onlp_ledi_mode_set(id, ONLP_LED_MODE_OFF);
|
||||
}
|
||||
|
||||
return ONLP_STATUS_E_UNSUPPORTED;
|
||||
}
|
||||
|
||||
/*
|
||||
* This function puts the LED into the given mode. It is a more functional
|
||||
* interface for multimode LEDs.
|
||||
*
|
||||
* Only modes reported in the LED's capabilities will be attempted.
|
||||
*/
|
||||
int
|
||||
onlp_ledi_mode_set(onlp_oid_t id, onlp_led_mode_t mode)
|
||||
{
|
||||
int lid;
|
||||
VALIDATE(id);
|
||||
|
||||
lid = ONLP_OID_ID_GET(id);
|
||||
if (onlp_file_write_int(onlp_to_driver_led_mode(lid , mode), LED_FORMAT, leds[lid]) < 0) {
|
||||
return ONLP_STATUS_E_INTERNAL;
|
||||
}
|
||||
|
||||
return ONLP_STATUS_OK;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
###############################################################################
|
||||
#
|
||||
#
|
||||
#
|
||||
###############################################################################
|
||||
|
||||
LIBRARY := x86_64_accton_as5916_26xb
|
||||
$(LIBRARY)_SUBDIR := $(dir $(lastword $(MAKEFILE_LIST)))
|
||||
include $(BUILDER)/lib.mk
|
||||
@@ -0,0 +1,70 @@
|
||||
/************************************************************
|
||||
* <bsn.cl fy=2014 v=onl>
|
||||
*
|
||||
* Copyright 2014 Big Switch Networks, Inc.
|
||||
* Copyright 2014 Accton Technology Corporation.
|
||||
*
|
||||
* Licensed under the Eclipse Public License, Version 1.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
|
||||
* either express or implied. See the License for the specific
|
||||
* language governing permissions and limitations under the
|
||||
* License.
|
||||
*
|
||||
* </bsn.cl>
|
||||
************************************************************
|
||||
*
|
||||
*
|
||||
*
|
||||
***********************************************************/
|
||||
#ifndef __PLATFORM_LIB_H__
|
||||
#define __PLATFORM_LIB_H__
|
||||
|
||||
#include "x86_64_accton_as5916_26xb_log.h"
|
||||
|
||||
#define CHASSIS_FAN_COUNT 5
|
||||
#define CHASSIS_THERMAL_COUNT 7
|
||||
#define CHASSIS_LED_COUNT 5
|
||||
#define CHASSIS_PSU_COUNT 2
|
||||
|
||||
#define PSU1_ID 1
|
||||
#define PSU2_ID 2
|
||||
|
||||
#define PSU_SYSFS_PATH "/sys/devices/platform/as5916_26xb_psu/"
|
||||
|
||||
#define FAN_BOARD_PATH "/sys/devices/platform/as5916_26xb_fan/"
|
||||
#define FAN_NODE(node) FAN_BOARD_PATH#node
|
||||
|
||||
#define IDPROM_PATH "/sys/devices/platform/as5916_26xb_sys/eeprom"
|
||||
|
||||
enum onlp_thermal_id
|
||||
{
|
||||
THERMAL_RESERVED = 0,
|
||||
THERMAL_CPU_CORE,
|
||||
THERMAL_1_ON_MAIN_BROAD,
|
||||
THERMAL_2_ON_MAIN_BROAD,
|
||||
THERMAL_3_ON_MAIN_BROAD,
|
||||
THERMAL_4_ON_MAIN_BROAD,
|
||||
THERMAL_5_ON_MAIN_BROAD,
|
||||
THERMAL_6_ON_MAIN_BROAD,
|
||||
THERMAL_1_ON_PSU1,
|
||||
THERMAL_1_ON_PSU2,
|
||||
};
|
||||
|
||||
#define DEBUG_MODE 0
|
||||
|
||||
#if (DEBUG_MODE == 1)
|
||||
#define DEBUG_PRINT(fmt, args...) \
|
||||
printf("%s:%s[%d]: " fmt "\r\n", __FILE__, __FUNCTION__, __LINE__, ##args)
|
||||
#else
|
||||
#define DEBUG_PRINT(fmt, args...)
|
||||
#endif
|
||||
|
||||
#endif /* __PLATFORM_LIB_H__ */
|
||||
|
||||
@@ -0,0 +1,154 @@
|
||||
/************************************************************
|
||||
* <bsn.cl fy=2014 v=onl>
|
||||
*
|
||||
* Copyright 2014 Big Switch Networks, Inc.
|
||||
* Copyright 2014 Accton Technology Corporation.
|
||||
*
|
||||
* Licensed under the Eclipse Public License, Version 1.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
|
||||
* either express or implied. See the License for the specific
|
||||
* language governing permissions and limitations under the
|
||||
* License.
|
||||
*
|
||||
* </bsn.cl>
|
||||
************************************************************
|
||||
*
|
||||
*
|
||||
*
|
||||
***********************************************************/
|
||||
#include <onlp/platformi/psui.h>
|
||||
#include <onlplib/file.h>
|
||||
#include "platform_lib.h"
|
||||
|
||||
#define PSU_STATUS_PRESENT 1
|
||||
#define PSU_STATUS_POWER_GOOD 1
|
||||
|
||||
#define VALIDATE(_id) \
|
||||
do { \
|
||||
if(!ONLP_OID_IS_PSU(_id)) { \
|
||||
return ONLP_STATUS_E_INVALID; \
|
||||
} \
|
||||
} while(0)
|
||||
|
||||
int
|
||||
onlp_psui_init(void)
|
||||
{
|
||||
return ONLP_STATUS_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* Get all information about the given PSU oid.
|
||||
*/
|
||||
static onlp_psu_info_t pinfo[] =
|
||||
{
|
||||
{ }, /* Not used */
|
||||
{
|
||||
{ ONLP_PSU_ID_CREATE(PSU1_ID), "PSU-1", 0 },
|
||||
},
|
||||
{
|
||||
{ ONLP_PSU_ID_CREATE(PSU2_ID), "PSU-2", 0 },
|
||||
}
|
||||
};
|
||||
|
||||
int
|
||||
onlp_psui_info_get(onlp_oid_t id, onlp_psu_info_t* info)
|
||||
{
|
||||
int val = 0;
|
||||
int ret = ONLP_STATUS_OK;
|
||||
int pid = ONLP_OID_ID_GET(id);
|
||||
|
||||
VALIDATE(id);
|
||||
|
||||
memset(info, 0, sizeof(onlp_psu_info_t));
|
||||
*info = pinfo[pid]; /* Set the onlp_oid_hdr_t */
|
||||
|
||||
/* Get the present state */
|
||||
ret = onlp_file_read_int(&val, "%s""psu%d_present", PSU_SYSFS_PATH, pid);
|
||||
if (ret < 0) {
|
||||
AIM_LOG_ERROR("Unable to read status from (%s""psu%d_present)\r\n", PSU_SYSFS_PATH, pid);
|
||||
return ONLP_STATUS_E_INTERNAL;
|
||||
}
|
||||
|
||||
if (val != PSU_STATUS_PRESENT) {
|
||||
info->status &= ~ONLP_PSU_STATUS_PRESENT;
|
||||
return ONLP_STATUS_OK;
|
||||
}
|
||||
info->status |= ONLP_PSU_STATUS_PRESENT;
|
||||
|
||||
|
||||
/* Get power good status */
|
||||
ret = onlp_file_read_int(&val, "%s""psu%d_power_good", PSU_SYSFS_PATH, pid);
|
||||
if (ret < 0) {
|
||||
AIM_LOG_ERROR("Unable to read status from (%s""psu%d_power_good)\r\n", PSU_SYSFS_PATH, pid);
|
||||
return ONLP_STATUS_E_INTERNAL;
|
||||
}
|
||||
|
||||
if (val != PSU_STATUS_POWER_GOOD) {
|
||||
info->status |= ONLP_PSU_STATUS_FAILED;
|
||||
}
|
||||
|
||||
if (info->status & ONLP_PSU_STATUS_FAILED) {
|
||||
return ONLP_STATUS_OK;
|
||||
}
|
||||
|
||||
/* Read voltage, current and power */
|
||||
val = 0;
|
||||
if (onlp_file_read_int(&val, "%s""psu%d_vin", PSU_SYSFS_PATH, pid) == 0 && val) {
|
||||
info->mvin = val;
|
||||
info->caps |= ONLP_PSU_CAPS_VIN;
|
||||
}
|
||||
|
||||
val = 0;
|
||||
if (onlp_file_read_int(&val, "%s""psu%d_vout", PSU_SYSFS_PATH, pid) == 0 && val) {
|
||||
info->mvout = val;
|
||||
info->caps |= ONLP_PSU_CAPS_VOUT;
|
||||
}
|
||||
|
||||
val = 0;
|
||||
if (onlp_file_read_int(&val, "%s""psu%d_iout", PSU_SYSFS_PATH, pid) == 0 && val) {
|
||||
info->miout = val;
|
||||
info->caps |= ONLP_PSU_CAPS_IOUT;
|
||||
}
|
||||
|
||||
val = 0;
|
||||
if (onlp_file_read_int(&val, "%s""psu%d_pout", PSU_SYSFS_PATH, pid) == 0 && val) {
|
||||
info->mpout = val;
|
||||
info->caps |= ONLP_PSU_CAPS_POUT;
|
||||
}
|
||||
|
||||
/* Set the associated oid_table */
|
||||
val = 0;
|
||||
if (onlp_file_read_int(&val, "%s""psu%d_fan1_input", PSU_SYSFS_PATH, pid) == 0 && val) {
|
||||
info->hdr.coids[0] = ONLP_FAN_ID_CREATE(pid + CHASSIS_FAN_COUNT);
|
||||
}
|
||||
|
||||
val = 0;
|
||||
if (onlp_file_read_int(&val, "%s""psu%d_temp1_input", PSU_SYSFS_PATH, pid) == 0 && val) {
|
||||
info->hdr.coids[1] = ONLP_THERMAL_ID_CREATE(pid + CHASSIS_THERMAL_COUNT);
|
||||
}
|
||||
|
||||
/* Read model */
|
||||
char *string = NULL;
|
||||
int len = onlp_file_read_str(&string, "%s""psu%d_model", PSU_SYSFS_PATH, pid);
|
||||
if (string && len) {
|
||||
strncpy(info->model, string, len);
|
||||
aim_free(string);
|
||||
}
|
||||
|
||||
/* Read serial */
|
||||
len = onlp_file_read_str(&string, "%s""psu%d_serial", PSU_SYSFS_PATH, pid);
|
||||
if (string && len) {
|
||||
strncpy(info->serial, string, len);
|
||||
aim_free(string);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,287 @@
|
||||
/************************************************************
|
||||
* <bsn.cl fy=2014 v=onl>
|
||||
*
|
||||
* Copyright 2014 Big Switch Networks, Inc.
|
||||
* Copyright 2017 Accton Technology Corporation.
|
||||
*
|
||||
* Licensed under the Eclipse Public License, Version 1.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
|
||||
* either express or implied. See the License for the specific
|
||||
* language governing permissions and limitations under the
|
||||
* License.
|
||||
*
|
||||
* </bsn.cl>
|
||||
************************************************************
|
||||
*
|
||||
*
|
||||
*
|
||||
***********************************************************/
|
||||
#include <onlp/platformi/sfpi.h>
|
||||
#include <onlplib/i2c.h>
|
||||
#include <onlplib/file.h>
|
||||
#include "x86_64_accton_as5916_26xb_int.h"
|
||||
#include "x86_64_accton_as5916_26xb_log.h"
|
||||
|
||||
#define PORT_EEPROM_FORMAT "/sys/devices/platform/as5916_26xb_sfp/module_eeprom_%d"
|
||||
#define MODULE_PRESENT_FORMAT "/sys/devices/platform/as5916_26xb_sfp/module_present_%d"
|
||||
#define MODULE_RXLOS_FORMAT "/sys/devices/platform/as5916_26xb_sfp/module_rx_los_%d"
|
||||
#define MODULE_TXFAULT_FORMAT "/sys/devices/platform/as5916_26xb_sfp/module_tx_fault_%d"
|
||||
#define MODULE_TXDISABLE_FORMAT "/sys/devices/platform/as5916_26xb_sfp/module_tx_disable_%d"
|
||||
#define MODULE_PRESENT_ALL_ATTR "/sys/devices/platform/as5916_26xb_sfp/module_present_all"
|
||||
#define MODULE_RXLOS_ALL_ATTR "/sys/devices/platform/as5916_26xb_sfp/module_rxlos_all"
|
||||
|
||||
/************************************************************
|
||||
*
|
||||
* SFPI Entry Points
|
||||
*
|
||||
***********************************************************/
|
||||
int
|
||||
onlp_sfpi_init(void)
|
||||
{
|
||||
/* Called at initialization time */
|
||||
return ONLP_STATUS_OK;
|
||||
}
|
||||
|
||||
int
|
||||
onlp_sfpi_bitmap_get(onlp_sfp_bitmap_t* bmap)
|
||||
{
|
||||
/*
|
||||
* Ports {0, 54}
|
||||
*/
|
||||
int p;
|
||||
|
||||
for(p = 0; p < 26; p++) {
|
||||
AIM_BITMAP_SET(bmap, p);
|
||||
}
|
||||
|
||||
return ONLP_STATUS_OK;
|
||||
}
|
||||
|
||||
int
|
||||
onlp_sfpi_is_present(int port)
|
||||
{
|
||||
/*
|
||||
* Return 1 if present.
|
||||
* Return 0 if not present.
|
||||
* Return < 0 if error.
|
||||
*/
|
||||
int present;
|
||||
|
||||
if (onlp_file_read_int(&present, MODULE_PRESENT_FORMAT, (port+1)) < 0) {
|
||||
AIM_LOG_ERROR("Unable to read present status from port(%d)\r\n", port);
|
||||
return ONLP_STATUS_E_INTERNAL;
|
||||
}
|
||||
|
||||
return present;
|
||||
}
|
||||
|
||||
int
|
||||
onlp_sfpi_presence_bitmap_get(onlp_sfp_bitmap_t* dst)
|
||||
{
|
||||
uint32_t bytes[4];
|
||||
FILE* fp;
|
||||
|
||||
/* Read present status of port 0~25 */
|
||||
int count = 0;
|
||||
|
||||
fp = fopen(MODULE_PRESENT_ALL_ATTR, "r");
|
||||
if(fp == NULL) {
|
||||
AIM_LOG_ERROR("Unable to open the module_present_all device file from (%s).", MODULE_PRESENT_ALL_ATTR);
|
||||
return ONLP_STATUS_E_INTERNAL;
|
||||
}
|
||||
|
||||
count = fscanf(fp, "%x %x %x %x", bytes+0, bytes+1, bytes+2, bytes+3);
|
||||
fclose(fp);
|
||||
if(count != 4) {
|
||||
/* Likely a CPLD read timeout. */
|
||||
AIM_LOG_ERROR("Unable to read all fields the module_present_all device file from(%s).", MODULE_PRESENT_ALL_ATTR);
|
||||
return ONLP_STATUS_E_INTERNAL;
|
||||
}
|
||||
|
||||
/* Mask out non-existant QSFP ports */
|
||||
bytes[3] &= 0x3;
|
||||
|
||||
/* Convert to 64 bit integer in port order */
|
||||
int i = 0;
|
||||
uint64_t presence_all = 0 ;
|
||||
for(i = AIM_ARRAYSIZE(bytes)-1; i >= 0; i--) {
|
||||
presence_all <<= 8;
|
||||
presence_all |= bytes[i];
|
||||
}
|
||||
|
||||
/* Populate bitmap */
|
||||
for(i = 0; presence_all; i++) {
|
||||
AIM_BITMAP_MOD(dst, i, (presence_all & 1));
|
||||
presence_all >>= 1;
|
||||
}
|
||||
|
||||
return ONLP_STATUS_OK;
|
||||
}
|
||||
|
||||
int
|
||||
onlp_sfpi_rx_los_bitmap_get(onlp_sfp_bitmap_t* dst)
|
||||
{
|
||||
uint32_t bytes[3];
|
||||
FILE* fp;
|
||||
|
||||
/* Read present status of port 0~25 */
|
||||
int count = 0;
|
||||
|
||||
fp = fopen(MODULE_RXLOS_ALL_ATTR, "r");
|
||||
if(fp == NULL) {
|
||||
AIM_LOG_ERROR("Unable to open the module_rxlos_all device file from (%s).", MODULE_RXLOS_ALL_ATTR);
|
||||
return ONLP_STATUS_E_INTERNAL;
|
||||
}
|
||||
|
||||
count = fscanf(fp, "%x %x %x", bytes+0, bytes+1, bytes+2);
|
||||
fclose(fp);
|
||||
if(count != 3) {
|
||||
/* Likely a CPLD read timeout. */
|
||||
AIM_LOG_ERROR("Unable to read all fields the module_rxlos_all device file from(%s).", MODULE_RXLOS_ALL_ATTR);
|
||||
return ONLP_STATUS_E_INTERNAL;
|
||||
}
|
||||
|
||||
/* Convert to 64 bit integer in port order */
|
||||
int i = 0;
|
||||
uint64_t rx_los_all = 0 ;
|
||||
for(i = AIM_ARRAYSIZE(bytes)-1; i >= 0; i--) {
|
||||
rx_los_all <<= 8;
|
||||
rx_los_all |= bytes[i];
|
||||
}
|
||||
|
||||
/* Populate bitmap */
|
||||
for(i = 0; rx_los_all; i++) {
|
||||
AIM_BITMAP_MOD(dst, i, (rx_los_all & 1));
|
||||
rx_los_all >>= 1;
|
||||
}
|
||||
|
||||
return ONLP_STATUS_OK;
|
||||
}
|
||||
|
||||
int
|
||||
onlp_sfpi_eeprom_read(int port, uint8_t data[256])
|
||||
{
|
||||
/*
|
||||
* Read the SFP eeprom into data[]
|
||||
*
|
||||
* Return MISSING if SFP is missing.
|
||||
* Return OK if eeprom is read
|
||||
*/
|
||||
int size = 0;
|
||||
memset(data, 0, 256);
|
||||
|
||||
if(onlp_file_read(data, 256, &size, PORT_EEPROM_FORMAT, (port+1)) != ONLP_STATUS_OK) {
|
||||
AIM_LOG_ERROR("Unable to read eeprom from port(%d)\r\n", port);
|
||||
return ONLP_STATUS_E_INTERNAL;
|
||||
}
|
||||
|
||||
if (size != 256) {
|
||||
AIM_LOG_ERROR("Unable to read eeprom from port(%d), size is different!\r\n", port);
|
||||
return ONLP_STATUS_E_INTERNAL;
|
||||
}
|
||||
|
||||
return ONLP_STATUS_OK;
|
||||
}
|
||||
|
||||
int
|
||||
onlp_sfpi_control_set(int port, onlp_sfp_control_t control, int value)
|
||||
{
|
||||
int rv;
|
||||
|
||||
switch(control)
|
||||
{
|
||||
case ONLP_SFP_CONTROL_TX_DISABLE:
|
||||
{
|
||||
if (onlp_file_write_int(value, MODULE_TXDISABLE_FORMAT, (port+1)) < 0) {
|
||||
AIM_LOG_ERROR("Unable to set tx_disable status to port(%d)\r\n", port);
|
||||
rv = ONLP_STATUS_E_INTERNAL;
|
||||
}
|
||||
else {
|
||||
rv = ONLP_STATUS_OK;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
rv = ONLP_STATUS_E_UNSUPPORTED;
|
||||
break;
|
||||
}
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
int
|
||||
onlp_sfpi_control_get(int port, onlp_sfp_control_t control, int* value)
|
||||
{
|
||||
int rv;
|
||||
|
||||
if (port < 0) {
|
||||
return ONLP_STATUS_E_UNSUPPORTED;
|
||||
}
|
||||
|
||||
switch(control)
|
||||
{
|
||||
case ONLP_SFP_CONTROL_RX_LOS:
|
||||
{
|
||||
if (port >= 24) {
|
||||
return ONLP_STATUS_E_UNSUPPORTED;
|
||||
}
|
||||
|
||||
if (onlp_file_read_int(value, MODULE_RXLOS_FORMAT, (port+1)) < 0) {
|
||||
AIM_LOG_ERROR("Unable to read rx_loss status from port(%d)\r\n", port);
|
||||
rv = ONLP_STATUS_E_INTERNAL;
|
||||
}
|
||||
else {
|
||||
rv = ONLP_STATUS_OK;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case ONLP_SFP_CONTROL_TX_FAULT:
|
||||
{
|
||||
if (port >= 24) {
|
||||
return ONLP_STATUS_E_UNSUPPORTED;
|
||||
}
|
||||
|
||||
if (onlp_file_read_int(value, MODULE_TXFAULT_FORMAT, (port+1)) < 0) {
|
||||
AIM_LOG_ERROR("Unable to read tx_fault status from port(%d)\r\n", port);
|
||||
rv = ONLP_STATUS_E_INTERNAL;
|
||||
}
|
||||
else {
|
||||
rv = ONLP_STATUS_OK;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case ONLP_SFP_CONTROL_TX_DISABLE:
|
||||
{
|
||||
if (onlp_file_read_int(value, MODULE_TXDISABLE_FORMAT, (port+1)) < 0) {
|
||||
AIM_LOG_ERROR("Unable to read tx_disabled status from port(%d)\r\n", port);
|
||||
rv = ONLP_STATUS_E_INTERNAL;
|
||||
}
|
||||
else {
|
||||
rv = ONLP_STATUS_OK;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
rv = ONLP_STATUS_E_UNSUPPORTED;
|
||||
}
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
int
|
||||
onlp_sfpi_denit(void)
|
||||
{
|
||||
return ONLP_STATUS_OK;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,103 @@
|
||||
/************************************************************
|
||||
* <bsn.cl fy=2014 v=onl>
|
||||
*
|
||||
* Copyright 2014 Big Switch Networks, Inc.
|
||||
* Copyright 2017 Accton Technology Corporation.
|
||||
*
|
||||
* Licensed under the Eclipse Public License, Version 1.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
|
||||
* either express or implied. See the License for the specific
|
||||
* language governing permissions and limitations under the
|
||||
* License.
|
||||
*
|
||||
* </bsn.cl>
|
||||
************************************************************
|
||||
*
|
||||
*
|
||||
*
|
||||
***********************************************************/
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#include <onlplib/file.h>
|
||||
#include <onlp/platformi/sysi.h>
|
||||
#include <onlp/platformi/ledi.h>
|
||||
#include <onlp/platformi/thermali.h>
|
||||
#include <onlp/platformi/fani.h>
|
||||
#include <onlp/platformi/psui.h>
|
||||
#include "platform_lib.h"
|
||||
|
||||
#include "x86_64_accton_as5916_26xb_int.h"
|
||||
#include "x86_64_accton_as5916_26xb_log.h"
|
||||
|
||||
const char*
|
||||
onlp_sysi_platform_get(void)
|
||||
{
|
||||
return "x86-64-accton-as5916-26xb-r0";
|
||||
}
|
||||
|
||||
int
|
||||
onlp_sysi_onie_data_get(uint8_t** data, int* size)
|
||||
{
|
||||
uint8_t* rdata = aim_zmalloc(256);
|
||||
if(onlp_file_read(rdata, 256, size, IDPROM_PATH) == ONLP_STATUS_OK) {
|
||||
if(*size == 256) {
|
||||
*data = rdata;
|
||||
return ONLP_STATUS_OK;
|
||||
}
|
||||
}
|
||||
|
||||
aim_free(rdata);
|
||||
*size = 0;
|
||||
return ONLP_STATUS_E_INTERNAL;
|
||||
}
|
||||
|
||||
int
|
||||
onlp_sysi_oids_get(onlp_oid_t* table, int max)
|
||||
{
|
||||
int i;
|
||||
onlp_oid_t* e = table;
|
||||
memset(table, 0, max*sizeof(onlp_oid_t));
|
||||
|
||||
/* 5 Thermal sensors on the chassis */
|
||||
for (i = 1; i <= CHASSIS_THERMAL_COUNT; i++) {
|
||||
*e++ = ONLP_THERMAL_ID_CREATE(i);
|
||||
}
|
||||
|
||||
/* 5 LEDs on the chassis */
|
||||
for (i = 1; i <= CHASSIS_LED_COUNT; i++) {
|
||||
*e++ = ONLP_LED_ID_CREATE(i);
|
||||
}
|
||||
|
||||
/* 2 PSUs on the chassis */
|
||||
for (i = 1; i <= CHASSIS_PSU_COUNT; i++) {
|
||||
*e++ = ONLP_PSU_ID_CREATE(i);
|
||||
}
|
||||
|
||||
/* 6 Fans on the chassis */
|
||||
for (i = 1; i <= CHASSIS_FAN_COUNT; i++) {
|
||||
*e++ = ONLP_FAN_ID_CREATE(i);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
onlp_sysi_platform_info_get(onlp_platform_info_t* pi)
|
||||
{
|
||||
return ONLP_STATUS_OK;
|
||||
}
|
||||
|
||||
void
|
||||
onlp_sysi_platform_info_free(onlp_platform_info_t* pi)
|
||||
{
|
||||
aim_free(pi->cpld_versions);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,138 @@
|
||||
/************************************************************
|
||||
* <bsn.cl fy=2014 v=onl>
|
||||
*
|
||||
* Copyright 2014 Big Switch Networks, Inc.
|
||||
* Copyright 2014 Accton Technology Corporation.
|
||||
*
|
||||
* Licensed under the Eclipse Public License, Version 1.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
|
||||
* either express or implied. See the License for the specific
|
||||
* language governing permissions and limitations under the
|
||||
* License.
|
||||
*
|
||||
* </bsn.cl>
|
||||
************************************************************
|
||||
*
|
||||
* Thermal Sensor Platform Implementation.
|
||||
*
|
||||
***********************************************************/
|
||||
#include <onlplib/file.h>
|
||||
#include <onlp/platformi/thermali.h>
|
||||
#include "platform_lib.h"
|
||||
|
||||
#define VALIDATE(_id) \
|
||||
do { \
|
||||
if(!ONLP_OID_IS_THERMAL(_id)) { \
|
||||
return ONLP_STATUS_E_INVALID; \
|
||||
} \
|
||||
} while(0)
|
||||
|
||||
static char* devfiles__[] = /* must map with onlp_thermal_id */
|
||||
{
|
||||
NULL,
|
||||
NULL, /* CPU_CORE files */
|
||||
"/sys/devices/platform/as5916_26xb_thermal/temp1_input",
|
||||
"/sys/devices/platform/as5916_26xb_thermal/temp2_input",
|
||||
"/sys/devices/platform/as5916_26xb_thermal/temp3_input",
|
||||
"/sys/devices/platform/as5916_26xb_thermal/temp4_input",
|
||||
"/sys/devices/platform/as5916_26xb_thermal/temp5_input",
|
||||
"/sys/devices/platform/as5916_26xb_thermal/temp6_input",
|
||||
"/sys/devices/platform/as5916_26xb_psu/psu1_temp1_input",
|
||||
"/sys/devices/platform/as5916_26xb_psu/psu2_temp1_input",
|
||||
};
|
||||
|
||||
static char* cpu_coretemp_files[] =
|
||||
{
|
||||
"/sys/devices/platform/coretemp.0*temp2_input",
|
||||
"/sys/devices/platform/coretemp.0*temp3_input",
|
||||
"/sys/devices/platform/coretemp.0*temp4_input",
|
||||
"/sys/devices/platform/coretemp.0*temp5_input",
|
||||
NULL,
|
||||
};
|
||||
|
||||
/* Static values */
|
||||
static onlp_thermal_info_t linfo[] = {
|
||||
{ }, /* Not used */
|
||||
{ { ONLP_THERMAL_ID_CREATE(THERMAL_CPU_CORE), "CPU Core", 0},
|
||||
ONLP_THERMAL_STATUS_PRESENT,
|
||||
ONLP_THERMAL_CAPS_ALL, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS
|
||||
},
|
||||
{ { ONLP_THERMAL_ID_CREATE(THERMAL_1_ON_MAIN_BROAD), "LM75-1", 0},
|
||||
ONLP_THERMAL_STATUS_PRESENT,
|
||||
ONLP_THERMAL_CAPS_ALL, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS
|
||||
},
|
||||
{ { ONLP_THERMAL_ID_CREATE(THERMAL_2_ON_MAIN_BROAD), "LM75-2", 0},
|
||||
ONLP_THERMAL_STATUS_PRESENT,
|
||||
ONLP_THERMAL_CAPS_ALL, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS
|
||||
},
|
||||
{ { ONLP_THERMAL_ID_CREATE(THERMAL_3_ON_MAIN_BROAD), "LM75-3", 0},
|
||||
ONLP_THERMAL_STATUS_PRESENT,
|
||||
ONLP_THERMAL_CAPS_ALL, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS
|
||||
},
|
||||
{ { ONLP_THERMAL_ID_CREATE(THERMAL_4_ON_MAIN_BROAD), "LM75-4", 0},
|
||||
ONLP_THERMAL_STATUS_PRESENT,
|
||||
ONLP_THERMAL_CAPS_ALL, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS
|
||||
},
|
||||
{ { ONLP_THERMAL_ID_CREATE(THERMAL_5_ON_MAIN_BROAD), "LM75-5", 0},
|
||||
ONLP_THERMAL_STATUS_PRESENT,
|
||||
ONLP_THERMAL_CAPS_ALL, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS
|
||||
},
|
||||
{ { ONLP_THERMAL_ID_CREATE(THERMAL_6_ON_MAIN_BROAD), "LM75-6", 0},
|
||||
ONLP_THERMAL_STATUS_PRESENT,
|
||||
ONLP_THERMAL_CAPS_ALL, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS
|
||||
},
|
||||
{ { ONLP_THERMAL_ID_CREATE(THERMAL_1_ON_PSU1), "PSU-1 Thermal Sensor 1", ONLP_PSU_ID_CREATE(PSU1_ID)},
|
||||
ONLP_THERMAL_STATUS_PRESENT,
|
||||
ONLP_THERMAL_CAPS_ALL, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS
|
||||
},
|
||||
{ { ONLP_THERMAL_ID_CREATE(THERMAL_1_ON_PSU2), "PSU-2 Thermal Sensor 1", ONLP_PSU_ID_CREATE(PSU2_ID)},
|
||||
ONLP_THERMAL_STATUS_PRESENT,
|
||||
ONLP_THERMAL_CAPS_ALL, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS
|
||||
}
|
||||
};
|
||||
|
||||
/*
|
||||
* This will be called to intiialize the thermali subsystem.
|
||||
*/
|
||||
int
|
||||
onlp_thermali_init(void)
|
||||
{
|
||||
return ONLP_STATUS_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* Retrieve the information structure for the given thermal OID.
|
||||
*
|
||||
* If the OID is invalid, return ONLP_E_STATUS_INVALID.
|
||||
* If an unexpected error occurs, return ONLP_E_STATUS_INTERNAL.
|
||||
* Otherwise, return ONLP_STATUS_OK with the OID's information.
|
||||
*
|
||||
* Note -- it is expected that you fill out the information
|
||||
* structure even if the sensor described by the OID is not present.
|
||||
*/
|
||||
int
|
||||
onlp_thermali_info_get(onlp_oid_t id, onlp_thermal_info_t* info)
|
||||
{
|
||||
int tid;
|
||||
VALIDATE(id);
|
||||
|
||||
tid = ONLP_OID_ID_GET(id);
|
||||
|
||||
/* Set the onlp_oid_hdr_t and capabilities */
|
||||
*info = linfo[tid];
|
||||
|
||||
if(tid == THERMAL_CPU_CORE) {
|
||||
int rv = onlp_file_read_int_max(&info->mcelsius, cpu_coretemp_files);
|
||||
return rv;
|
||||
}
|
||||
|
||||
return onlp_file_read_int(&info->mcelsius, devfiles__[tid]);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,80 @@
|
||||
/**************************************************************************//**
|
||||
*
|
||||
*
|
||||
*
|
||||
*****************************************************************************/
|
||||
#include <x86_64_accton_as5916_26xb/x86_64_accton_as5916_26xb_config.h>
|
||||
|
||||
/* <auto.start.cdefs(X86_64_ACCTON_AS5916_26XB_CONFIG_HEADER).source> */
|
||||
#define __x86_64_accton_as5916_26xb_config_STRINGIFY_NAME(_x) #_x
|
||||
#define __x86_64_accton_as5916_26xb_config_STRINGIFY_VALUE(_x) __x86_64_accton_as5916_26xb_config_STRINGIFY_NAME(_x)
|
||||
x86_64_accton_as5916_26xb_config_settings_t x86_64_accton_as5916_26xb_config_settings[] =
|
||||
{
|
||||
#ifdef X86_64_ACCTON_AS5916_26XB_CONFIG_INCLUDE_LOGGING
|
||||
{ __x86_64_accton_as5916_26xb_config_STRINGIFY_NAME(X86_64_ACCTON_AS5916_26XB_CONFIG_INCLUDE_LOGGING), __x86_64_accton_as5916_26xb_config_STRINGIFY_VALUE(X86_64_ACCTON_AS5916_26XB_CONFIG_INCLUDE_LOGGING) },
|
||||
#else
|
||||
{ X86_64_ACCTON_AS5916_26XB_CONFIG_INCLUDE_LOGGING(__x86_64_accton_as5916_26xb_config_STRINGIFY_NAME), "__undefined__" },
|
||||
#endif
|
||||
#ifdef X86_64_ACCTON_AS5916_26XB_CONFIG_LOG_OPTIONS_DEFAULT
|
||||
{ __x86_64_accton_as5916_26xb_config_STRINGIFY_NAME(X86_64_ACCTON_AS5916_26XB_CONFIG_LOG_OPTIONS_DEFAULT), __x86_64_accton_as5916_26xb_config_STRINGIFY_VALUE(X86_64_ACCTON_AS5916_26XB_CONFIG_LOG_OPTIONS_DEFAULT) },
|
||||
#else
|
||||
{ X86_64_ACCTON_AS5916_26XB_CONFIG_LOG_OPTIONS_DEFAULT(__x86_64_accton_as5916_26xb_config_STRINGIFY_NAME), "__undefined__" },
|
||||
#endif
|
||||
#ifdef X86_64_ACCTON_AS5916_26XB_CONFIG_LOG_BITS_DEFAULT
|
||||
{ __x86_64_accton_as5916_26xb_config_STRINGIFY_NAME(X86_64_ACCTON_AS5916_26XB_CONFIG_LOG_BITS_DEFAULT), __x86_64_accton_as5916_26xb_config_STRINGIFY_VALUE(X86_64_ACCTON_AS5916_26XB_CONFIG_LOG_BITS_DEFAULT) },
|
||||
#else
|
||||
{ X86_64_ACCTON_AS5916_26XB_CONFIG_LOG_BITS_DEFAULT(__x86_64_accton_as5916_26xb_config_STRINGIFY_NAME), "__undefined__" },
|
||||
#endif
|
||||
#ifdef X86_64_ACCTON_AS5916_26XB_CONFIG_LOG_CUSTOM_BITS_DEFAULT
|
||||
{ __x86_64_accton_as5916_26xb_config_STRINGIFY_NAME(X86_64_ACCTON_AS5916_26XB_CONFIG_LOG_CUSTOM_BITS_DEFAULT), __x86_64_accton_as5916_26xb_config_STRINGIFY_VALUE(X86_64_ACCTON_AS5916_26XB_CONFIG_LOG_CUSTOM_BITS_DEFAULT) },
|
||||
#else
|
||||
{ X86_64_ACCTON_AS5916_26XB_CONFIG_LOG_CUSTOM_BITS_DEFAULT(__x86_64_accton_as5916_26xb_config_STRINGIFY_NAME), "__undefined__" },
|
||||
#endif
|
||||
#ifdef X86_64_ACCTON_AS5916_26XB_CONFIG_PORTING_STDLIB
|
||||
{ __x86_64_accton_as5916_26xb_config_STRINGIFY_NAME(X86_64_ACCTON_AS5916_26XB_CONFIG_PORTING_STDLIB), __x86_64_accton_as5916_26xb_config_STRINGIFY_VALUE(X86_64_ACCTON_AS5916_26XB_CONFIG_PORTING_STDLIB) },
|
||||
#else
|
||||
{ X86_64_ACCTON_AS5916_26XB_CONFIG_PORTING_STDLIB(__x86_64_accton_as5916_26xb_config_STRINGIFY_NAME), "__undefined__" },
|
||||
#endif
|
||||
#ifdef X86_64_ACCTON_AS5916_26XB_CONFIG_PORTING_INCLUDE_STDLIB_HEADERS
|
||||
{ __x86_64_accton_as5916_26xb_config_STRINGIFY_NAME(X86_64_ACCTON_AS5916_26XB_CONFIG_PORTING_INCLUDE_STDLIB_HEADERS), __x86_64_accton_as5916_26xb_config_STRINGIFY_VALUE(X86_64_ACCTON_AS5916_26XB_CONFIG_PORTING_INCLUDE_STDLIB_HEADERS) },
|
||||
#else
|
||||
{ X86_64_ACCTON_AS5916_26XB_CONFIG_PORTING_INCLUDE_STDLIB_HEADERS(__x86_64_accton_as5916_26xb_config_STRINGIFY_NAME), "__undefined__" },
|
||||
#endif
|
||||
#ifdef X86_64_ACCTON_AS5916_26XB_CONFIG_INCLUDE_UCLI
|
||||
{ __x86_64_accton_as5916_26xb_config_STRINGIFY_NAME(X86_64_ACCTON_AS5916_26XB_CONFIG_INCLUDE_UCLI), __x86_64_accton_as5916_26xb_config_STRINGIFY_VALUE(X86_64_ACCTON_AS5916_26XB_CONFIG_INCLUDE_UCLI) },
|
||||
#else
|
||||
{ X86_64_ACCTON_AS5916_26XB_CONFIG_INCLUDE_UCLI(__x86_64_accton_as5916_26xb_config_STRINGIFY_NAME), "__undefined__" },
|
||||
#endif
|
||||
#ifdef X86_64_ACCTON_AS5916_26XB_CONFIG_INCLUDE_DEFAULT_FAN_DIRECTION
|
||||
{ __x86_64_accton_as5916_26xb_config_STRINGIFY_NAME(X86_64_ACCTON_AS5916_26XB_CONFIG_INCLUDE_DEFAULT_FAN_DIRECTION), __x86_64_accton_as5916_26xb_config_STRINGIFY_VALUE(X86_64_ACCTON_AS5916_26XB_CONFIG_INCLUDE_DEFAULT_FAN_DIRECTION) },
|
||||
#else
|
||||
{ X86_64_ACCTON_AS5916_26XB_CONFIG_INCLUDE_DEFAULT_FAN_DIRECTION(__x86_64_accton_as5916_26xb_config_STRINGIFY_NAME), "__undefined__" },
|
||||
#endif
|
||||
{ NULL, NULL }
|
||||
};
|
||||
#undef __x86_64_accton_as5916_26xb_config_STRINGIFY_VALUE
|
||||
#undef __x86_64_accton_as5916_26xb_config_STRINGIFY_NAME
|
||||
|
||||
const char*
|
||||
x86_64_accton_as5916_26xb_config_lookup(const char* setting)
|
||||
{
|
||||
int i;
|
||||
for(i = 0; x86_64_accton_as5916_26xb_config_settings[i].name; i++) {
|
||||
if(!strcmp(x86_64_accton_as5916_26xb_config_settings[i].name, setting)) {
|
||||
return x86_64_accton_as5916_26xb_config_settings[i].value;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int
|
||||
x86_64_accton_as5916_26xb_config_show(struct aim_pvs_s* pvs)
|
||||
{
|
||||
int i;
|
||||
for(i = 0; x86_64_accton_as5916_26xb_config_settings[i].name; i++) {
|
||||
aim_printf(pvs, "%s = %s\n", x86_64_accton_as5916_26xb_config_settings[i].name, x86_64_accton_as5916_26xb_config_settings[i].value);
|
||||
}
|
||||
return i;
|
||||
}
|
||||
|
||||
/* <auto.end.cdefs(X86_64_ACCTON_AS5916_26XB_CONFIG_HEADER).source> */
|
||||
@@ -0,0 +1,10 @@
|
||||
/**************************************************************************//**
|
||||
*
|
||||
*
|
||||
*
|
||||
*****************************************************************************/
|
||||
#include <x86_64_accton_as5916_26xb/x86_64_accton_as5916_26xb_config.h>
|
||||
|
||||
/* <--auto.start.enum(ALL).source> */
|
||||
/* <auto.end.enum(ALL).source> */
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
/**************************************************************************//**
|
||||
*
|
||||
* x86_64_accton_as5916_26xb Internal Header
|
||||
*
|
||||
*****************************************************************************/
|
||||
#ifndef __x86_64_accton_as5916_26xb_INT_H__
|
||||
#define __x86_64_accton_as5916_26xb_INT_H__
|
||||
|
||||
#include <x86_64_accton_as5916_26xb/x86_64_accton_as5916_26xb_config.h>
|
||||
|
||||
|
||||
#endif /* __x86_64_accton_as5916_26xb_INT_H__ */
|
||||
@@ -0,0 +1,18 @@
|
||||
/**************************************************************************//**
|
||||
*
|
||||
*
|
||||
*
|
||||
*****************************************************************************/
|
||||
#include <x86_64_accton_as5916_26xb/x86_64_accton_as5916_26xb_config.h>
|
||||
|
||||
#include "x86_64_accton_as5916_26xb_log.h"
|
||||
/*
|
||||
* x86_64_accton_as5916_26xb log struct.
|
||||
*/
|
||||
AIM_LOG_STRUCT_DEFINE(
|
||||
X86_64_ACCTON_AS5916_26XB_CONFIG_LOG_OPTIONS_DEFAULT,
|
||||
X86_64_ACCTON_AS5916_26XB_CONFIG_LOG_BITS_DEFAULT,
|
||||
NULL, /* Custom log map */
|
||||
X86_64_ACCTON_AS5916_26XB_CONFIG_LOG_CUSTOM_BITS_DEFAULT
|
||||
);
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
/**************************************************************************//**
|
||||
*
|
||||
*
|
||||
*
|
||||
*****************************************************************************/
|
||||
#ifndef __x86_64_accton_as5916_26xb_LOG_H__
|
||||
#define __x86_64_accton_as5916_26xb_LOG_H__
|
||||
|
||||
#define AIM_LOG_MODULE_NAME x86_64_accton_as5916_26xb
|
||||
#include <AIM/aim_log.h>
|
||||
|
||||
#endif /* __x86_64_accton_as5916_26xb_LOG_H__ */
|
||||
@@ -0,0 +1,24 @@
|
||||
/**************************************************************************//**
|
||||
*
|
||||
*
|
||||
*
|
||||
*****************************************************************************/
|
||||
#include <x86_64_accton_as5916_26xb/x86_64_accton_as5916_26xb_config.h>
|
||||
|
||||
#include "x86_64_accton_as5916_26xb_log.h"
|
||||
|
||||
static int
|
||||
datatypes_init__(void)
|
||||
{
|
||||
#define x86_64_accton_as5916_26xb_ENUMERATION_ENTRY(_enum_name, _desc) AIM_DATATYPE_MAP_REGISTER(_enum_name, _enum_name##_map, _desc, AIM_LOG_INTERNAL);
|
||||
#include <x86_64_accton_as5916_26xb/x86_64_accton_as5916_26xb.x>
|
||||
return 0;
|
||||
}
|
||||
|
||||
void __x86_64_accton_as5916_26xb_module_init__(void)
|
||||
{
|
||||
AIM_LOG_STRUCT_REGISTER();
|
||||
datatypes_init__();
|
||||
}
|
||||
|
||||
int __onlp_platform_version__ = 1;
|
||||
@@ -0,0 +1,50 @@
|
||||
/**************************************************************************//**
|
||||
*
|
||||
*
|
||||
*
|
||||
*****************************************************************************/
|
||||
#include <x86_64_accton_as5916_26xb/x86_64_accton_as5916_26xb_config.h>
|
||||
|
||||
#if x86_64_accton_as5916_26xb_CONFIG_INCLUDE_UCLI == 1
|
||||
|
||||
#include <uCli/ucli.h>
|
||||
#include <uCli/ucli_argparse.h>
|
||||
#include <uCli/ucli_handler_macros.h>
|
||||
|
||||
static ucli_status_t
|
||||
x86_64_accton_as5916_26xb_ucli_ucli__config__(ucli_context_t* uc)
|
||||
{
|
||||
UCLI_HANDLER_MACRO_MODULE_CONFIG(x86_64_accton_as5916_26xb)
|
||||
}
|
||||
|
||||
/* <auto.ucli.handlers.start> */
|
||||
/* <auto.ucli.handlers.end> */
|
||||
|
||||
static ucli_module_t
|
||||
x86_64_accton_as5916_26xb_ucli_module__ =
|
||||
{
|
||||
"x86_64_accton_as5916_26xb_ucli",
|
||||
NULL,
|
||||
x86_64_accton_as5916_26xb_ucli_ucli_handlers__,
|
||||
NULL,
|
||||
NULL,
|
||||
};
|
||||
|
||||
ucli_node_t*
|
||||
x86_64_accton_as5916_26xb_ucli_node_create(void)
|
||||
{
|
||||
ucli_node_t* n;
|
||||
ucli_module_init(&x86_64_accton_as5916_26xb_ucli_module__);
|
||||
n = ucli_node_create("x86_64_accton_as5916_26xb", NULL, &x86_64_accton_as5916_26xb_ucli_module__);
|
||||
ucli_node_subnode_add(n, ucli_module_log_node_create("x86_64_accton_as5916_26xb"));
|
||||
return n;
|
||||
}
|
||||
|
||||
#else
|
||||
void*
|
||||
x86_64_accton_as5916_26xb_ucli_node_create(void)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
include $(ONL)/make/pkg.mk
|
||||
@@ -0,0 +1 @@
|
||||
include $(ONL)/make/pkg.mk
|
||||
@@ -0,0 +1 @@
|
||||
!include $ONL_TEMPLATES/platform-config-platform.yml ARCH=amd64 VENDOR=accton BASENAME=x86-64-accton-as5916-26xb REVISION=r0
|
||||
@@ -0,0 +1,33 @@
|
||||
---
|
||||
|
||||
######################################################################
|
||||
#
|
||||
# platform-config for AS5916
|
||||
#
|
||||
######################################################################
|
||||
|
||||
x86-64-accton-as5916-26xb-r0:
|
||||
|
||||
grub:
|
||||
|
||||
serial: >-
|
||||
--port=0x3f8
|
||||
--speed=115200
|
||||
--word=8
|
||||
--parity=no
|
||||
--stop=1
|
||||
|
||||
kernel:
|
||||
<<: *kernel-4-14
|
||||
|
||||
args: >-
|
||||
nopat
|
||||
console=ttyS0,115200n8
|
||||
tg3.short_preamble=1
|
||||
tg3.bcm5718s_reset=1
|
||||
|
||||
##network:
|
||||
## interfaces:
|
||||
## ma1:
|
||||
## name: ~
|
||||
## syspath: pci0000:00/0000:00:1c.0/0000:0a:00.0
|
||||
@@ -0,0 +1,13 @@
|
||||
from onl.platform.base import *
|
||||
from onl.platform.accton import *
|
||||
|
||||
class OnlPlatform_x86_64_accton_as5916_26xb_r0(OnlPlatformAccton,
|
||||
OnlPlatformPortConfig_24x10_2x100):
|
||||
PLATFORM='x86-64-accton-as5916-26xb-r0'
|
||||
MODEL="AS5916-26XB"
|
||||
SYS_OBJECT_ID=".5916.26"
|
||||
|
||||
def baseconfig(self):
|
||||
self.insmod_platform()
|
||||
return True
|
||||
|
||||
2
packages/platforms/accton/x86-64/x86-64-accton-as5916-54xks/.gitignore
vendored
Normal file
2
packages/platforms/accton/x86-64/x86-64-accton-as5916-54xks/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
*x86*64*accton*as5916*54xks*.mk
|
||||
onlpdump.mk
|
||||
@@ -0,0 +1 @@
|
||||
include $(ONL)/make/pkg.mk
|
||||
@@ -0,0 +1 @@
|
||||
include $(ONL)/make/pkg.mk
|
||||
@@ -0,0 +1 @@
|
||||
!include $ONL_TEMPLATES/platform-modules.yml VENDOR=accton BASENAME=x86-64-accton-as5916-54xks ARCH=amd64 KERNELS="onl-kernel-4.14-lts-x86-64-all:amd64"
|
||||
1
packages/platforms/accton/x86-64/x86-64-accton-as5916-54xks/modules/builds/.gitignore
vendored
Normal file
1
packages/platforms/accton/x86-64/x86-64-accton-as5916-54xks/modules/builds/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
lib
|
||||
@@ -0,0 +1,6 @@
|
||||
KERNELS := onl-kernel-4.14-lts-x86-64-all:amd64
|
||||
KMODULES := $(wildcard *.c)
|
||||
VENDOR := accton
|
||||
BASENAME := x86-64-accton-as5916-54xks
|
||||
ARCH := x86_64
|
||||
include $(ONL)/make/kmodule.mk
|
||||
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user