Fix management port led issue

This commit is contained in:
Jostar Yang
2019-06-21 17:31:35 +08:00
parent 748f23269b
commit 9dcea2f4a5
3 changed files with 72 additions and 0 deletions

View File

@@ -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));
}
}

View File

@@ -26,6 +26,12 @@
#ifndef __PLATFORM_LIB_H__
#define __PLATFORM_LIB_H__
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <linux/sockios.h>
#include <errno.h>
#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

View File

@@ -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)
{