mirror of
https://github.com/torvalds/linux.git
synced 2024-11-15 00:21:59 +00:00
e1000e: Validate hwtstamp_config completely before applying it
e1000e_hwtstamp_ioctl() should validate all fields of hwtstamp_config before making any changes. Currently it copies the configuration to the e1000_adapter structure before validating it at all. Change e1000e_config_hwtstamp() to take a pointer to the hwstamp_config and to copy the config after validating it. Compile-tested only. Signed-off-by: Ben Hutchings <bhutchings@solarflare.com> Acked-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
58b187c68d
commit
62d7e3a2d0
@ -3482,10 +3482,10 @@ s32 e1000e_get_base_timinca(struct e1000_adapter *adapter, u32 *timinca)
|
|||||||
* specified. Matching the kind of event packet is not supported, with the
|
* specified. Matching the kind of event packet is not supported, with the
|
||||||
* exception of "all V2 events regardless of level 2 or 4".
|
* exception of "all V2 events regardless of level 2 or 4".
|
||||||
**/
|
**/
|
||||||
static int e1000e_config_hwtstamp(struct e1000_adapter *adapter)
|
static int e1000e_config_hwtstamp(struct e1000_adapter *adapter,
|
||||||
|
struct hwtstamp_config *config)
|
||||||
{
|
{
|
||||||
struct e1000_hw *hw = &adapter->hw;
|
struct e1000_hw *hw = &adapter->hw;
|
||||||
struct hwtstamp_config *config = &adapter->hwtstamp_config;
|
|
||||||
u32 tsync_tx_ctl = E1000_TSYNCTXCTL_ENABLED;
|
u32 tsync_tx_ctl = E1000_TSYNCTXCTL_ENABLED;
|
||||||
u32 tsync_rx_ctl = E1000_TSYNCRXCTL_ENABLED;
|
u32 tsync_rx_ctl = E1000_TSYNCRXCTL_ENABLED;
|
||||||
u32 rxmtrl = 0;
|
u32 rxmtrl = 0;
|
||||||
@ -3586,6 +3586,8 @@ static int e1000e_config_hwtstamp(struct e1000_adapter *adapter)
|
|||||||
return -ERANGE;
|
return -ERANGE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
adapter->hwtstamp_config = *config;
|
||||||
|
|
||||||
/* enable/disable Tx h/w time stamping */
|
/* enable/disable Tx h/w time stamping */
|
||||||
regval = er32(TSYNCTXCTL);
|
regval = er32(TSYNCTXCTL);
|
||||||
regval &= ~E1000_TSYNCTXCTL_ENABLED;
|
regval &= ~E1000_TSYNCTXCTL_ENABLED;
|
||||||
@ -3874,7 +3876,7 @@ void e1000e_reset(struct e1000_adapter *adapter)
|
|||||||
e1000e_reset_adaptive(hw);
|
e1000e_reset_adaptive(hw);
|
||||||
|
|
||||||
/* initialize systim and reset the ns time counter */
|
/* initialize systim and reset the ns time counter */
|
||||||
e1000e_config_hwtstamp(adapter);
|
e1000e_config_hwtstamp(adapter, &adapter->hwtstamp_config);
|
||||||
|
|
||||||
/* Set EEE advertisement as appropriate */
|
/* Set EEE advertisement as appropriate */
|
||||||
if (adapter->flags2 & FLAG2_HAS_EEE) {
|
if (adapter->flags2 & FLAG2_HAS_EEE) {
|
||||||
@ -5797,14 +5799,10 @@ static int e1000e_hwtstamp_ioctl(struct net_device *netdev, struct ifreq *ifr)
|
|||||||
if (copy_from_user(&config, ifr->ifr_data, sizeof(config)))
|
if (copy_from_user(&config, ifr->ifr_data, sizeof(config)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
adapter->hwtstamp_config = config;
|
ret_val = e1000e_config_hwtstamp(adapter, &config);
|
||||||
|
|
||||||
ret_val = e1000e_config_hwtstamp(adapter);
|
|
||||||
if (ret_val)
|
if (ret_val)
|
||||||
return ret_val;
|
return ret_val;
|
||||||
|
|
||||||
config = adapter->hwtstamp_config;
|
|
||||||
|
|
||||||
switch (config.rx_filter) {
|
switch (config.rx_filter) {
|
||||||
case HWTSTAMP_FILTER_PTP_V2_L4_SYNC:
|
case HWTSTAMP_FILTER_PTP_V2_L4_SYNC:
|
||||||
case HWTSTAMP_FILTER_PTP_V2_L2_SYNC:
|
case HWTSTAMP_FILTER_PTP_V2_L2_SYNC:
|
||||||
|
Loading…
Reference in New Issue
Block a user