mirror of
https://github.com/torvalds/linux.git
synced 2024-11-14 08:02:07 +00:00
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];
|
__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
|
* struct ethtool_modinfo - plugin module eeprom information
|
||||||
* @cmd: %ETHTOOL_GMODULEINFO
|
* @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
|
* @get_module_info: Get the size and type of the eeprom contained within
|
||||||
* a plug-in module.
|
* a plug-in module.
|
||||||
* @get_module_eeprom: Get the eeprom information from the 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
|
* All operations are optional (i.e. the function pointer may be set
|
||||||
* to %NULL) and callers must take this into account. Callers must
|
* to %NULL) and callers must take this into account. Callers must
|
||||||
@ -1011,6 +1042,8 @@ struct ethtool_ops {
|
|||||||
struct ethtool_modinfo *);
|
struct ethtool_modinfo *);
|
||||||
int (*get_module_eeprom)(struct net_device *,
|
int (*get_module_eeprom)(struct net_device *,
|
||||||
struct ethtool_eeprom *, u8 *);
|
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_GET_TS_INFO 0x00000041 /* Get time stamping and PHC info */
|
||||||
#define ETHTOOL_GMODULEINFO 0x00000042 /* Get plug-in module information */
|
#define ETHTOOL_GMODULEINFO 0x00000042 /* Get plug-in module information */
|
||||||
#define ETHTOOL_GMODULEEEPROM 0x00000043 /* Get plug-in module eeprom */
|
#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 */
|
/* compatibility with older code */
|
||||||
#define SPARC_ETH_GSET ETHTOOL_GSET
|
#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);
|
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)
|
static int ethtool_nway_reset(struct net_device *dev)
|
||||||
{
|
{
|
||||||
if (!dev->ethtool_ops->nway_reset)
|
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,
|
rc = ethtool_set_value_void(dev, useraddr,
|
||||||
dev->ethtool_ops->set_msglevel);
|
dev->ethtool_ops->set_msglevel);
|
||||||
break;
|
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:
|
case ETHTOOL_NWAY_RST:
|
||||||
rc = ethtool_nway_reset(dev);
|
rc = ethtool_nway_reset(dev);
|
||||||
break;
|
break;
|
||||||
|
Loading…
Reference in New Issue
Block a user