From 9dcea2f4a5eadcb3ccbe41295e0688a5d49ca5c1 Mon Sep 17 00:00:00 2001 From: Jostar Yang Date: Fri, 21 Jun 2019 17:31:35 +0800 Subject: [PATCH] Fix management port led issue --- .../onlp/builds/src/module/src/platform_lib.c | 24 ++++++++++++++ .../onlp/builds/src/module/src/platform_lib.h | 16 ++++++++++ .../onlp/builds/src/module/src/sysi.c | 32 +++++++++++++++++++ 3 files changed, 72 insertions(+) diff --git a/packages/platforms/accton/x86-64/x86-64-accton-asgvolt64/onlp/builds/src/module/src/platform_lib.c b/packages/platforms/accton/x86-64/x86-64-accton-asgvolt64/onlp/builds/src/module/src/platform_lib.c index 1c520af2..7ce7b7ed 100755 --- a/packages/platforms/accton/x86-64/x86-64-accton-asgvolt64/onlp/builds/src/module/src/platform_lib.c +++ b/packages/platforms/accton/x86-64/x86-64-accton-asgvolt64/onlp/builds/src/module/src/platform_lib.c @@ -90,3 +90,27 @@ int onlp_file_read_string(char *filename, char *buffer, int buf_size, int data_l return ret; } + +int mdio_read(int skfd, int location, struct ifreq ifr) +{ + struct mii_data *mii = (struct mii_data *)&ifr.ifr_data; + mii->reg_num = location; + if (ioctl(skfd, SIOCGMIIREG, &ifr) < 0) { + fprintf(stderr, "SIOCGMIIREG on %s failed: %s\n", ifr.ifr_name, + strerror(errno)); + return -1; + } + return mii->val_out; +} + +void mdio_write(int skfd, int location, int value, struct ifreq ifr) +{ + struct mii_data *mii = (struct mii_data *)&ifr.ifr_data; + mii->reg_num = location; + mii->val_in = value; + if (ioctl(skfd, SIOCSMIIREG, &ifr) < 0) { + fprintf(stderr, "SIOCSMIIREG on %s failed: %s\n", ifr.ifr_name, + strerror(errno)); + } +} + diff --git a/packages/platforms/accton/x86-64/x86-64-accton-asgvolt64/onlp/builds/src/module/src/platform_lib.h b/packages/platforms/accton/x86-64/x86-64-accton-asgvolt64/onlp/builds/src/module/src/platform_lib.h index b9d60841..65c09276 100755 --- a/packages/platforms/accton/x86-64/x86-64-accton-asgvolt64/onlp/builds/src/module/src/platform_lib.h +++ b/packages/platforms/accton/x86-64/x86-64-accton-asgvolt64/onlp/builds/src/module/src/platform_lib.h @@ -26,6 +26,12 @@ #ifndef __PLATFORM_LIB_H__ #define __PLATFORM_LIB_H__ +#include +#include +#include +#include +#include +#include #include "x86_64_accton_asgvolt64_log.h" #define CHASSIS_FAN_COUNT 4 @@ -43,6 +49,16 @@ int onlp_file_write_integer(char *filename, int value); int onlp_file_read_binary(char *filename, char *buffer, int buf_size, int data_len); int onlp_file_read_string(char *filename, char *buffer, int buf_size, int data_len); +int mdio_read(int skfd, int location, struct ifreq ifr); +void mdio_write(int skfd, int location, int value, struct ifreq ifr); + + +struct mii_data { + unsigned short int phy_id; + unsigned short int reg_num; + unsigned short int val_in; + unsigned short int val_out; +}; enum onlp_thermal_id diff --git a/packages/platforms/accton/x86-64/x86-64-accton-asgvolt64/onlp/builds/src/module/src/sysi.c b/packages/platforms/accton/x86-64/x86-64-accton-asgvolt64/onlp/builds/src/module/src/sysi.c index 3fbe2459..6f521b9d 100755 --- a/packages/platforms/accton/x86-64/x86-64-accton-asgvolt64/onlp/builds/src/module/src/sysi.c +++ b/packages/platforms/accton/x86-64/x86-64-accton-asgvolt64/onlp/builds/src/module/src/sysi.c @@ -43,6 +43,38 @@ onlp_sysi_platform_get(void) return "x86-64-accton-asgvolt64-r0"; } +int +onlp_sysi_init(void) +{ + int skfd = -1; + char interface[64]; + struct ifreq ifr; + + if ((skfd = socket(AF_INET, SOCK_DGRAM,0)) < 0) { + perror("socket"); + return ONLP_STATUS_OK; + } + memset(interface, 0x0, 64); + strncpy(interface, "eth0", strlen("eth0")); + strncpy(ifr.ifr_name, interface, IFNAMSIZ); + if (ioctl(skfd, SIOCGMIIPHY, &ifr) < 0) { + if (errno != ENODEV) + fprintf(stderr, "SIOCGMIIPHY on '%s' failed: %s\n", + interface, strerror(errno)); + + close(skfd); + return ONLP_STATUS_E_INTERNAL; + } + /* fix mgt port led issue */ + mdio_write(skfd, 0x16, 3, ifr); + mdio_write(skfd, 0x10, 0x7204, ifr); + mdio_write(skfd, 0x11, 0x4455, ifr); + mdio_write(skfd, 0x16, 0, ifr); + close(skfd); + + return ONLP_STATUS_OK; +} + int onlp_sysi_onie_data_get(uint8_t** data, int* size) {