Commit 62d7e3a2 authored by Ben Hutchings's avatar Ben Hutchings Committed by David S. Miller

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: default avatarBen Hutchings <bhutchings@solarflare.com>
Acked-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 58b187c6
...@@ -3482,10 +3482,10 @@ s32 e1000e_get_base_timinca(struct e1000_adapter *adapter, u32 *timinca) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment