ea807d7d0b
Why I did it A demo driver base on this framework will display the sysfs node wich conform to the s3ip sysfs specification How I did it 1、 demo driver will call the s3ip kernel framework interface How to verify it run the demo ,it will display the sysfs node wich conform to the s3ip sysfs specification
336 lines
10 KiB
C
336 lines
10 KiB
C
/*
|
|
* transceiver_device_driver.c
|
|
*
|
|
* This module realize /sys/s3ip/transceiver attributes read and write functions
|
|
*
|
|
* History
|
|
* [Version] [Date] [Description]
|
|
* * v1.0 2021-08-31 S3IP sysfs
|
|
*/
|
|
|
|
#include <linux/slab.h>
|
|
|
|
#include "device_driver_common.h"
|
|
#include "transceiver_sysfs.h"
|
|
|
|
#define SFF_INFO(fmt, args...) LOG_INFO("sff: ", fmt, ##args)
|
|
#define SFF_ERR(fmt, args...) LOG_ERR("sff: ", fmt, ##args)
|
|
#define SFF_DBG(fmt, args...) LOG_DBG("sff: ", fmt, ##args)
|
|
|
|
static int g_loglevel = 0;
|
|
|
|
/****************************************transceiver******************************************/
|
|
static int demo_get_eth_number(void)
|
|
{
|
|
/* add vendor codes here */
|
|
return 1;
|
|
}
|
|
|
|
/*
|
|
* demo_get_transceiver_power_on_status - Used to get the whole machine port power on status,
|
|
* filled the value to buf, 0: power off, 1: power on
|
|
* @buf: Data receiving buffer
|
|
* @count: length of buf
|
|
*
|
|
* This function returns the length of the filled buffer,
|
|
* if not support this attributes filled "NA" to buf,
|
|
* otherwise it returns a negative value on failed.
|
|
*/
|
|
static ssize_t demo_get_transceiver_power_on_status(char *buf, size_t count)
|
|
{
|
|
/* add vendor codes here */
|
|
return -ENOSYS;
|
|
}
|
|
|
|
/*
|
|
* demo_set_transceiver_power_on_status - Used to set the whole machine port power on status,
|
|
* @status: power on status, 0: power off, 1: power on
|
|
*
|
|
* This function returns 0 on success,
|
|
* otherwise it returns a negative value on failed.
|
|
*/
|
|
static int demo_set_transceiver_power_on_status(int status)
|
|
{
|
|
/* add vendor codes here */
|
|
return -ENOSYS;
|
|
}
|
|
|
|
/*
|
|
* demo_get_eth_power_on_status - Used to get single port power on status,
|
|
* filled the value to buf, 0: power off, 1: power on
|
|
* @eth_index: start with 1
|
|
* @buf: Data receiving buffer
|
|
* @count: length of buf
|
|
*
|
|
* This function returns the length of the filled buffer,
|
|
* if not support this attributes filled "NA" to buf,
|
|
* otherwise it returns a negative value on failed.
|
|
*/
|
|
static ssize_t demo_get_eth_power_on_status(unsigned int eth_index, char *buf, size_t count)
|
|
{
|
|
/* add vendor codes here */
|
|
return -ENOSYS;
|
|
}
|
|
|
|
/*
|
|
* demo_set_eth_power_on_status - Used to set single port power on status,
|
|
* @eth_index: start with 1
|
|
* @status: power on status, 0: power off, 1: power on
|
|
*
|
|
* This function returns 0 on success,
|
|
* otherwise it returns a negative value on failed.
|
|
*/
|
|
static int demo_set_eth_power_on_status(unsigned int eth_index, int status)
|
|
{
|
|
/* add vendor codes here */
|
|
return -ENOSYS;
|
|
}
|
|
|
|
/*
|
|
* demo_get_eth_tx_fault_status - Used to get port tx_fault status,
|
|
* filled the value to buf, 0: normal, 1: abnormal
|
|
* @eth_index: start with 1
|
|
* @buf: Data receiving buffer
|
|
* @count: length of buf
|
|
*
|
|
* This function returns the length of the filled buffer,
|
|
* if not support this attributes filled "NA" to buf,
|
|
* otherwise it returns a negative value on failed.
|
|
*/
|
|
static ssize_t demo_get_eth_tx_fault_status(unsigned int eth_index, char *buf, size_t count)
|
|
{
|
|
/* add vendor codes here */
|
|
return -ENOSYS;
|
|
}
|
|
|
|
/*
|
|
* demo_get_eth_tx_disable_status - Used to get port tx_disable status,
|
|
* filled the value to buf, 0: tx_enable, 1: tx_disable
|
|
* @eth_index: start with 1
|
|
* @buf: Data receiving buffer
|
|
* @count: length of buf
|
|
*
|
|
* This function returns the length of the filled buffer,
|
|
* if not support this attributes filled "NA" to buf,
|
|
* otherwise it returns a negative value on failed.
|
|
*/
|
|
static ssize_t demo_get_eth_tx_disable_status(unsigned int eth_index, char *buf, size_t count)
|
|
{
|
|
/* add vendor codes here */
|
|
return -ENOSYS;
|
|
}
|
|
|
|
/*
|
|
* demo_set_eth_tx_disable_status - Used to set port tx_disable status,
|
|
* @eth_index: start with 1
|
|
* @status: tx_disable status, 0: tx_enable, 1: tx_disable
|
|
*
|
|
* This function returns 0 on success,
|
|
* otherwise it returns a negative value on failed.
|
|
*/
|
|
static int demo_set_eth_tx_disable_status(unsigned int eth_index, int status)
|
|
{
|
|
/* add vendor codes here */
|
|
return -ENOSYS;
|
|
}
|
|
|
|
/*
|
|
* demo_get_eth_present_status - Used to get port present status,
|
|
* filled the value to buf, 1: present, 0: absent
|
|
* @eth_index: start with 1
|
|
* @buf: Data receiving buffer
|
|
* @count: length of buf
|
|
*
|
|
* This function returns the length of the filled buffer,
|
|
* if not support this attributes filled "NA" to buf,
|
|
* otherwise it returns a negative value on failed.
|
|
*/
|
|
static ssize_t demo_get_eth_present_status(unsigned int eth_index, char *buf, size_t count)
|
|
{
|
|
/* add vendor codes here */
|
|
return -ENOSYS;
|
|
}
|
|
|
|
/*
|
|
* demo_get_eth_rx_los_status - Used to get port rx_los status,
|
|
* filled the value to buf, 0: normal, 1: abnormal
|
|
* @eth_index: start with 1
|
|
* @buf: Data receiving buffer
|
|
* @count: length of buf
|
|
*
|
|
* This function returns the length of the filled buffer,
|
|
* if not support this attributes filled "NA" to buf,
|
|
* otherwise it returns a negative value on failed.
|
|
*/
|
|
static ssize_t demo_get_eth_rx_los_status(unsigned int eth_index, char *buf, size_t count)
|
|
{
|
|
/* add vendor codes here */
|
|
return -ENOSYS;
|
|
}
|
|
|
|
/*
|
|
* demo_get_eth_reset_status - Used to get port reset status,
|
|
* filled the value to buf, 0: unreset, 1: reset
|
|
* @eth_index: start with 1
|
|
* @buf: Data receiving buffer
|
|
* @count: length of buf
|
|
*
|
|
* This function returns the length of the filled buffer,
|
|
* if not support this attributes filled "NA" to buf,
|
|
* otherwise it returns a negative value on failed.
|
|
*/
|
|
static ssize_t demo_get_eth_reset_status(unsigned int eth_index, char *buf, size_t count)
|
|
{
|
|
/* add vendor codes here */
|
|
return -ENOSYS;
|
|
}
|
|
|
|
/*
|
|
* demo_set_eth_reset_status - Used to set port reset status,
|
|
* @eth_index: start with 1
|
|
* @status: reset status, 0: unreset, 1: reset
|
|
*
|
|
* This function returns 0 on success,
|
|
* otherwise it returns a negative value on failed.
|
|
*/
|
|
static int demo_set_eth_reset_status(unsigned int eth_index, int status)
|
|
{
|
|
/* add vendor codes here */
|
|
return -ENOSYS;
|
|
}
|
|
|
|
/*
|
|
* demo_get_eth_low_power_mode_status - Used to get port low power mode status,
|
|
* filled the value to buf, 0: high power mode, 1: low power mode
|
|
* @eth_index: start with 1
|
|
* @buf: Data receiving buffer
|
|
* @count: length of buf
|
|
*
|
|
* This function returns the length of the filled buffer,
|
|
* if not support this attributes filled "NA" to buf,
|
|
* otherwise it returns a negative value on failed.
|
|
*/
|
|
static ssize_t demo_get_eth_low_power_mode_status(unsigned int eth_index, char *buf, size_t count)
|
|
{
|
|
/* add vendor codes here */
|
|
return -ENOSYS;
|
|
}
|
|
|
|
/*
|
|
* demo_get_eth_interrupt_status - Used to get port interruption status,
|
|
* filled the value to buf, 0: no interruption, 1: interruption
|
|
* @eth_index: start with 1
|
|
* @buf: Data receiving buffer
|
|
* @count: length of buf
|
|
*
|
|
* This function returns the length of the filled buffer,
|
|
* if not support this attributes filled "NA" to buf,
|
|
* otherwise it returns a negative value on failed.
|
|
*/
|
|
static ssize_t demo_get_eth_interrupt_status(unsigned int eth_index, char *buf, size_t count)
|
|
{
|
|
/* add vendor codes here */
|
|
return -ENOSYS;
|
|
}
|
|
|
|
/*
|
|
* demo_get_eth_eeprom_size - Used to get port eeprom size
|
|
*
|
|
* This function returns the size of port eeprom,
|
|
* otherwise it returns a negative value on failed.
|
|
*/
|
|
static int demo_get_eth_eeprom_size(unsigned int eth_index)
|
|
{
|
|
/* add vendor codes here */
|
|
return 0x8180;
|
|
}
|
|
|
|
/*
|
|
* demo_read_eth_eeprom_data - Used to read port eeprom data,
|
|
* @buf: Data read buffer
|
|
* @offset: offset address to read port eeprom data
|
|
* @count: length of buf
|
|
*
|
|
* This function returns the length of the filled buffer,
|
|
* returns 0 means EOF,
|
|
* otherwise it returns a negative value on failed.
|
|
*/
|
|
static ssize_t demo_read_eth_eeprom_data(unsigned int eth_index, char *buf, loff_t offset,
|
|
size_t count)
|
|
{
|
|
/* add vendor codes here */
|
|
return -ENOSYS;
|
|
}
|
|
|
|
/*
|
|
* demo_write_eth_eeprom_data - Used to write port eeprom data
|
|
* @buf: Data write buffer
|
|
* @offset: offset address to write port eeprom data
|
|
* @count: length of buf
|
|
*
|
|
* This function returns the written length of port eeprom,
|
|
* returns 0 means EOF,
|
|
* otherwise it returns a negative value on failed.
|
|
*/
|
|
static ssize_t demo_write_eth_eeprom_data(unsigned int eth_index, char *buf, loff_t offset,
|
|
size_t count)
|
|
{
|
|
/* add vendor codes here */
|
|
return -ENOSYS;
|
|
}
|
|
/************************************end of transceiver***************************************/
|
|
|
|
static struct s3ip_sysfs_transceiver_drivers_s drivers = {
|
|
/*
|
|
* set ODM transceiver drivers to /sys/s3ip/transceiver,
|
|
* if not support the function, set corresponding hook to NULL.
|
|
*/
|
|
.get_eth_number = demo_get_eth_number,
|
|
.get_transceiver_power_on_status = demo_get_transceiver_power_on_status,
|
|
.set_transceiver_power_on_status = demo_set_transceiver_power_on_status,
|
|
.get_eth_power_on_status = demo_get_eth_power_on_status,
|
|
.set_eth_power_on_status = demo_set_eth_power_on_status,
|
|
.get_eth_tx_fault_status = demo_get_eth_tx_fault_status,
|
|
.get_eth_tx_disable_status = demo_get_eth_tx_disable_status,
|
|
.set_eth_tx_disable_status = demo_set_eth_tx_disable_status,
|
|
.get_eth_present_status = demo_get_eth_present_status,
|
|
.get_eth_rx_los_status = demo_get_eth_rx_los_status,
|
|
.get_eth_reset_status = demo_get_eth_reset_status,
|
|
.set_eth_reset_status = demo_set_eth_reset_status,
|
|
.get_eth_low_power_mode_status = demo_get_eth_low_power_mode_status,
|
|
.get_eth_interrupt_status = demo_get_eth_interrupt_status,
|
|
.get_eth_eeprom_size = demo_get_eth_eeprom_size,
|
|
.read_eth_eeprom_data = demo_read_eth_eeprom_data,
|
|
.write_eth_eeprom_data = demo_write_eth_eeprom_data,
|
|
};
|
|
|
|
static int __init sff_dev_drv_init(void)
|
|
{
|
|
int ret;
|
|
|
|
SFF_INFO("sff_init...\n");
|
|
|
|
ret = s3ip_sysfs_sff_drivers_register(&drivers);
|
|
if (ret < 0) {
|
|
SFF_ERR("transceiver drivers register err, ret %d.\n", ret);
|
|
return ret;
|
|
}
|
|
SFF_INFO("sff_init success.\n");
|
|
return 0;
|
|
}
|
|
|
|
static void __exit sff_dev_drv_exit(void)
|
|
{
|
|
s3ip_sysfs_sff_drivers_unregister();
|
|
SFF_INFO("sff_exit success.\n");
|
|
return;
|
|
}
|
|
|
|
module_init(sff_dev_drv_init);
|
|
module_exit(sff_dev_drv_exit);
|
|
module_param(g_loglevel, int, 0644);
|
|
MODULE_PARM_DESC(g_loglevel, "the log level(info=0x1, err=0x2, dbg=0x4, all=0xf).\n");
|
|
MODULE_LICENSE("GPL");
|
|
MODULE_AUTHOR("sonic S3IP sysfs");
|
|
MODULE_DESCRIPTION("transceiver device driver");
|