Added kernel support in EEE Ethtool commands
This patch extends the kernel's ethtool interface by adding support for 2 new EEE commands - get_eee and set_eee. Thanks goes to Giuseppe Cavallaro for his original patch adding this support. Signed-off-by: Yuval Mintz <yuvalmin@broadcom.com> Signed-off-by: Eilon Greenstein <eilong@broadcom.com> Reviewed-by: Ben Hutchings <bhutchings@solarflare.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
94b6042cfe
commit
80f12eccce
@ -136,6 +136,35 @@ struct ethtool_eeprom {
|
||||
__u8 data[0];
|
||||
};
|
||||
|
||||
/**
|
||||
* struct ethtool_eee - Energy Efficient Ethernet information
|
||||
* @cmd: ETHTOOL_{G,S}EEE
|
||||
* @supported: Mask of %SUPPORTED_* flags for the speed/duplex combinations
|
||||
* for which there is EEE support.
|
||||
* @advertised: Mask of %ADVERTISED_* flags for the speed/duplex combinations
|
||||
* advertised as eee capable.
|
||||
* @lp_advertised: Mask of %ADVERTISED_* flags for the speed/duplex
|
||||
* combinations advertised by the link partner as eee capable.
|
||||
* @eee_active: Result of the eee auto negotiation.
|
||||
* @eee_enabled: EEE configured mode (enabled/disabled).
|
||||
* @tx_lpi_enabled: Whether the interface should assert its tx lpi, given
|
||||
* that eee was negotiated.
|
||||
* @tx_lpi_timer: Time in microseconds the interface delays prior to asserting
|
||||
* its tx lpi (after reaching 'idle' state). Effective only when eee
|
||||
* was negotiated and tx_lpi_enabled was set.
|
||||
*/
|
||||
struct ethtool_eee {
|
||||
__u32 cmd;
|
||||
__u32 supported;
|
||||
__u32 advertised;
|
||||
__u32 lp_advertised;
|
||||
__u32 eee_active;
|
||||
__u32 eee_enabled;
|
||||
__u32 tx_lpi_enabled;
|
||||
__u32 tx_lpi_timer;
|
||||
__u32 reserved[2];
|
||||
};
|
||||
|
||||
/**
|
||||
* struct ethtool_modinfo - plugin module eeprom information
|
||||
* @cmd: %ETHTOOL_GMODULEINFO
|
||||
@ -945,6 +974,8 @@ static inline u32 ethtool_rxfh_indir_default(u32 index, u32 n_rx_rings)
|
||||
* @get_module_info: Get the size and type of the eeprom contained within
|
||||
* a plug-in module.
|
||||
* @get_module_eeprom: Get the eeprom information from the plug-in module
|
||||
* @get_eee: Get Energy-Efficient (EEE) supported and status.
|
||||
* @set_eee: Set EEE status (enable/disable) as well as LPI timers.
|
||||
*
|
||||
* All operations are optional (i.e. the function pointer may be set
|
||||
* to %NULL) and callers must take this into account. Callers must
|
||||
@ -1011,6 +1042,8 @@ struct ethtool_ops {
|
||||
struct ethtool_modinfo *);
|
||||
int (*get_module_eeprom)(struct net_device *,
|
||||
struct ethtool_eeprom *, u8 *);
|
||||
int (*get_eee)(struct net_device *, struct ethtool_eee *);
|
||||
int (*set_eee)(struct net_device *, struct ethtool_eee *);
|
||||
|
||||
|
||||
};
|
||||
@ -1089,6 +1122,8 @@ struct ethtool_ops {
|
||||
#define ETHTOOL_GET_TS_INFO 0x00000041 /* Get time stamping and PHC info */
|
||||
#define ETHTOOL_GMODULEINFO 0x00000042 /* Get plug-in module information */
|
||||
#define ETHTOOL_GMODULEEEPROM 0x00000043 /* Get plug-in module eeprom */
|
||||
#define ETHTOOL_GEEE 0x00000044 /* Get EEE settings */
|
||||
#define ETHTOOL_SEEE 0x00000045 /* Set EEE settings */
|
||||
|
||||
/* compatibility with older code */
|
||||
#define SPARC_ETH_GSET ETHTOOL_GSET
|
||||
|
@ -729,6 +729,40 @@ static int ethtool_set_wol(struct net_device *dev, char __user *useraddr)
|
||||
return dev->ethtool_ops->set_wol(dev, &wol);
|
||||
}
|
||||
|
||||
static int ethtool_get_eee(struct net_device *dev, char __user *useraddr)
|
||||
{
|
||||
struct ethtool_eee edata;
|
||||
int rc;
|
||||
|
||||
if (!dev->ethtool_ops->get_eee)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
memset(&edata, 0, sizeof(struct ethtool_eee));
|
||||
edata.cmd = ETHTOOL_GEEE;
|
||||
rc = dev->ethtool_ops->get_eee(dev, &edata);
|
||||
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
if (copy_to_user(useraddr, &edata, sizeof(edata)))
|
||||
return -EFAULT;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ethtool_set_eee(struct net_device *dev, char __user *useraddr)
|
||||
{
|
||||
struct ethtool_eee edata;
|
||||
|
||||
if (!dev->ethtool_ops->set_eee)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (copy_from_user(&edata, useraddr, sizeof(edata)))
|
||||
return -EFAULT;
|
||||
|
||||
return dev->ethtool_ops->set_eee(dev, &edata);
|
||||
}
|
||||
|
||||
static int ethtool_nway_reset(struct net_device *dev)
|
||||
{
|
||||
if (!dev->ethtool_ops->nway_reset)
|
||||
@ -1471,6 +1505,12 @@ int dev_ethtool(struct net *net, struct ifreq *ifr)
|
||||
rc = ethtool_set_value_void(dev, useraddr,
|
||||
dev->ethtool_ops->set_msglevel);
|
||||
break;
|
||||
case ETHTOOL_GEEE:
|
||||
rc = ethtool_get_eee(dev, useraddr);
|
||||
break;
|
||||
case ETHTOOL_SEEE:
|
||||
rc = ethtool_set_eee(dev, useraddr);
|
||||
break;
|
||||
case ETHTOOL_NWAY_RST:
|
||||
rc = ethtool_nway_reset(dev);
|
||||
break;
|
||||
|
Loading…
Reference in New Issue
Block a user