Commit 55426f47 authored by David S. Miller's avatar David S. Miller

Merge branch '10GbE' of git://git.kernel.org/pub/scm/linux/kernel/git/jkirsher/next-queue

Jeff Kirsher says:

====================
10GbE Intel Wired LAN Driver Updates 2019-06-05

This series contains updates to mainly ixgbe, with a few updates to
i40e, net, ice and hns2 driver.

Jan adds support for tracking each queue pair for whether or not AF_XDP
zero copy is enabled.  Also updated the ixgbe driver to use the
netdev-provided umems so that we do not need to contain these structures
in our own adapter structure.

William Tu provides two fixes for AF_XDP statistics which were causing
incorrect counts.

Jake reduces the PTP transmit timestamp timeout from 15 seconds to 1 second,
which is still well after the maximum expected delay.  Also fixes an
issues with the PTP SDP pin setup which was not properly aligning on a
full second, so updated the code to account for the cyclecounter
multiplier and simplify the code to make the intent of the calculations
more clear.  Updated the function header comments to help with the code
documentation.  Added support for SDP/PPS output for x550 devices, which
is slightly different than x540 devices that currently have this
support.

Anirudh adds a new define for Link Layer Discovery Protocol to the
networking core, so that drivers do not have to create and use their own
definitions.  In addition, update all the drivers currently defining
their own LLDP define to use the new networking core define.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 11694b03 20d437ee
...@@ -677,7 +677,6 @@ struct hclge_umv_spc_alc_cmd { ...@@ -677,7 +677,6 @@ struct hclge_umv_spc_alc_cmd {
#define HCLGE_MAC_MGR_MASK_VLAN_B BIT(0) #define HCLGE_MAC_MGR_MASK_VLAN_B BIT(0)
#define HCLGE_MAC_MGR_MASK_MAC_B BIT(1) #define HCLGE_MAC_MGR_MASK_MAC_B BIT(1)
#define HCLGE_MAC_MGR_MASK_ETHERTYPE_B BIT(2) #define HCLGE_MAC_MGR_MASK_ETHERTYPE_B BIT(2)
#define HCLGE_MAC_ETHERTYPE_LLDP 0x88cc
struct hclge_mac_mgr_tbl_entry_cmd { struct hclge_mac_mgr_tbl_entry_cmd {
u8 flags; u8 flags;
......
...@@ -292,7 +292,7 @@ static const struct hclge_comm_stats_str g_mac_stats_string[] = { ...@@ -292,7 +292,7 @@ static const struct hclge_comm_stats_str g_mac_stats_string[] = {
static const struct hclge_mac_mgr_tbl_entry_cmd hclge_mgr_table[] = { static const struct hclge_mac_mgr_tbl_entry_cmd hclge_mgr_table[] = {
{ {
.flags = HCLGE_MAC_MGR_MASK_VLAN_B, .flags = HCLGE_MAC_MGR_MASK_VLAN_B,
.ethter_type = cpu_to_le16(HCLGE_MAC_ETHERTYPE_LLDP), .ethter_type = cpu_to_le16(ETH_P_LLDP),
.mac_addr_hi32 = cpu_to_le32(htonl(0x0180C200)), .mac_addr_hi32 = cpu_to_le32(htonl(0x0180C200)),
.mac_addr_lo16 = cpu_to_le16(htons(0x000E)), .mac_addr_lo16 = cpu_to_le16(htons(0x000E)),
.i_port_bitmap = 0x1, .i_port_bitmap = 0x1,
......
...@@ -295,8 +295,6 @@ struct i40e_cloud_filter { ...@@ -295,8 +295,6 @@ struct i40e_cloud_filter {
u8 tunnel_type; u8 tunnel_type;
}; };
#define I40E_ETH_P_LLDP 0x88cc
#define I40E_DCB_PRIO_TYPE_STRICT 0 #define I40E_DCB_PRIO_TYPE_STRICT 0
#define I40E_DCB_PRIO_TYPE_ETS 1 #define I40E_DCB_PRIO_TYPE_ETS 1
#define I40E_DCB_STRICT_PRIO_CREDITS 127 #define I40E_DCB_STRICT_PRIO_CREDITS 127
......
...@@ -1330,7 +1330,7 @@ static ssize_t i40e_dbg_command_write(struct file *filp, ...@@ -1330,7 +1330,7 @@ static ssize_t i40e_dbg_command_write(struct file *filp,
} }
ret = i40e_aq_add_rem_control_packet_filter(&pf->hw, ret = i40e_aq_add_rem_control_packet_filter(&pf->hw,
pf->hw.mac.addr, pf->hw.mac.addr,
I40E_ETH_P_LLDP, 0, ETH_P_LLDP, 0,
pf->vsi[pf->lan_vsi]->seid, pf->vsi[pf->lan_vsi]->seid,
0, true, NULL, NULL); 0, true, NULL, NULL);
if (ret) { if (ret) {
...@@ -1348,7 +1348,7 @@ static ssize_t i40e_dbg_command_write(struct file *filp, ...@@ -1348,7 +1348,7 @@ static ssize_t i40e_dbg_command_write(struct file *filp,
ret = i40e_aq_add_rem_control_packet_filter(&pf->hw, ret = i40e_aq_add_rem_control_packet_filter(&pf->hw,
pf->hw.mac.addr, pf->hw.mac.addr,
I40E_ETH_P_LLDP, 0, ETH_P_LLDP, 0,
pf->vsi[pf->lan_vsi]->seid, pf->vsi[pf->lan_vsi]->seid,
0, false, NULL, NULL); 0, false, NULL, NULL);
if (ret) { if (ret) {
......
...@@ -2345,8 +2345,6 @@ ice_vsi_add_rem_eth_mac(struct ice_vsi *vsi, bool add_rule) ...@@ -2345,8 +2345,6 @@ ice_vsi_add_rem_eth_mac(struct ice_vsi *vsi, bool add_rule)
ice_free_fltr_list(&pf->pdev->dev, &tmp_add_list); ice_free_fltr_list(&pf->pdev->dev, &tmp_add_list);
} }
#define ICE_ETH_P_LLDP 0x88CC
/** /**
* ice_cfg_sw_lldp - Config switch rules for LLDP packet handling * ice_cfg_sw_lldp - Config switch rules for LLDP packet handling
* @vsi: the VSI being configured * @vsi: the VSI being configured
...@@ -2366,7 +2364,7 @@ void ice_cfg_sw_lldp(struct ice_vsi *vsi, bool tx, bool create) ...@@ -2366,7 +2364,7 @@ void ice_cfg_sw_lldp(struct ice_vsi *vsi, bool tx, bool create)
list->fltr_info.lkup_type = ICE_SW_LKUP_ETHERTYPE; list->fltr_info.lkup_type = ICE_SW_LKUP_ETHERTYPE;
list->fltr_info.vsi_handle = vsi->idx; list->fltr_info.vsi_handle = vsi->idx;
list->fltr_info.l_data.ethertype_mac.ethertype = ICE_ETH_P_LLDP; list->fltr_info.l_data.ethertype_mac.ethertype = ETH_P_LLDP;
if (tx) { if (tx) {
list->fltr_info.fltr_act = ICE_DROP_PACKET; list->fltr_info.fltr_act = ICE_DROP_PACKET;
......
...@@ -50,8 +50,6 @@ ...@@ -50,8 +50,6 @@
#define IXGBE_MAX_RXD 4096 #define IXGBE_MAX_RXD 4096
#define IXGBE_MIN_RXD 64 #define IXGBE_MIN_RXD 64
#define IXGBE_ETH_P_LLDP 0x88CC
/* flow control */ /* flow control */
#define IXGBE_MIN_FCRTL 0x40 #define IXGBE_MIN_FCRTL 0x40
#define IXGBE_MAX_FCRTL 0x7FF80 #define IXGBE_MAX_FCRTL 0x7FF80
...@@ -635,6 +633,7 @@ struct ixgbe_adapter { ...@@ -635,6 +633,7 @@ struct ixgbe_adapter {
/* XDP */ /* XDP */
int num_xdp_queues; int num_xdp_queues;
struct ixgbe_ring *xdp_ring[MAX_XDP_QUEUES]; struct ixgbe_ring *xdp_ring[MAX_XDP_QUEUES];
unsigned long *af_xdp_zc_qps; /* tracks AF_XDP ZC enabled rings */
/* TX */ /* TX */
struct ixgbe_ring *tx_ring[MAX_TX_QUEUES] ____cacheline_aligned_in_smp; struct ixgbe_ring *tx_ring[MAX_TX_QUEUES] ____cacheline_aligned_in_smp;
...@@ -774,11 +773,6 @@ struct ixgbe_adapter { ...@@ -774,11 +773,6 @@ struct ixgbe_adapter {
#ifdef CONFIG_IXGBE_IPSEC #ifdef CONFIG_IXGBE_IPSEC
struct ixgbe_ipsec *ipsec; struct ixgbe_ipsec *ipsec;
#endif /* CONFIG_IXGBE_IPSEC */ #endif /* CONFIG_IXGBE_IPSEC */
/* AF_XDP zero-copy */
struct xdp_umem **xsk_umems;
u16 num_xsk_umems_used;
u16 num_xsk_umems;
}; };
static inline u8 ixgbe_max_rss_indices(struct ixgbe_adapter *adapter) static inline u8 ixgbe_max_rss_indices(struct ixgbe_adapter *adapter)
...@@ -1039,4 +1033,10 @@ static inline int ixgbe_ipsec_vf_add_sa(struct ixgbe_adapter *adapter, ...@@ -1039,4 +1033,10 @@ static inline int ixgbe_ipsec_vf_add_sa(struct ixgbe_adapter *adapter,
static inline int ixgbe_ipsec_vf_del_sa(struct ixgbe_adapter *adapter, static inline int ixgbe_ipsec_vf_del_sa(struct ixgbe_adapter *adapter,
u32 *mbuf, u32 vf) { return -EACCES; } u32 *mbuf, u32 vf) { return -EACCES; }
#endif /* CONFIG_IXGBE_IPSEC */ #endif /* CONFIG_IXGBE_IPSEC */
static inline bool ixgbe_enabled_xdp_adapter(struct ixgbe_adapter *adapter)
{
return !!adapter->xdp_prog;
}
#endif /* _IXGBE_H_ */ #endif /* _IXGBE_H_ */
...@@ -6288,6 +6288,10 @@ static int ixgbe_sw_init(struct ixgbe_adapter *adapter, ...@@ -6288,6 +6288,10 @@ static int ixgbe_sw_init(struct ixgbe_adapter *adapter,
if (ixgbe_init_rss_key(adapter)) if (ixgbe_init_rss_key(adapter))
return -ENOMEM; return -ENOMEM;
adapter->af_xdp_zc_qps = bitmap_zalloc(MAX_XDP_QUEUES, GFP_KERNEL);
if (!adapter->af_xdp_zc_qps)
return -ENOMEM;
/* Set MAC specific capability flags and exceptions */ /* Set MAC specific capability flags and exceptions */
switch (hw->mac.type) { switch (hw->mac.type) {
case ixgbe_mac_82598EB: case ixgbe_mac_82598EB:
...@@ -11161,6 +11165,7 @@ static int ixgbe_probe(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -11161,6 +11165,7 @@ static int ixgbe_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
kfree(adapter->jump_tables[0]); kfree(adapter->jump_tables[0]);
kfree(adapter->mac_table); kfree(adapter->mac_table);
kfree(adapter->rss_key); kfree(adapter->rss_key);
bitmap_free(adapter->af_xdp_zc_qps);
err_ioremap: err_ioremap:
disable_dev = !test_and_set_bit(__IXGBE_DISABLED, &adapter->state); disable_dev = !test_and_set_bit(__IXGBE_DISABLED, &adapter->state);
free_netdev(netdev); free_netdev(netdev);
...@@ -11249,6 +11254,7 @@ static void ixgbe_remove(struct pci_dev *pdev) ...@@ -11249,6 +11254,7 @@ static void ixgbe_remove(struct pci_dev *pdev)
kfree(adapter->mac_table); kfree(adapter->mac_table);
kfree(adapter->rss_key); kfree(adapter->rss_key);
bitmap_free(adapter->af_xdp_zc_qps);
disable_dev = !test_and_set_bit(__IXGBE_DISABLED, &adapter->state); disable_dev = !test_and_set_bit(__IXGBE_DISABLED, &adapter->state);
free_netdev(netdev); free_netdev(netdev);
......
...@@ -72,13 +72,13 @@ ...@@ -72,13 +72,13 @@
#define IXGBE_INCPER_SHIFT_82599 24 #define IXGBE_INCPER_SHIFT_82599 24
#define IXGBE_OVERFLOW_PERIOD (HZ * 30) #define IXGBE_OVERFLOW_PERIOD (HZ * 30)
#define IXGBE_PTP_TX_TIMEOUT (HZ * 15) #define IXGBE_PTP_TX_TIMEOUT (HZ)
/* half of a one second clock period, for use with PPS signal. We have to use /* We use our own definitions instead of NSEC_PER_SEC because we want to mark
* this instead of something pre-defined like IXGBE_PTP_PPS_HALF_SECOND, in * the value as a ULL to force precision when bit shifting.
* order to force at least 64bits of precision for shifting
*/ */
#define IXGBE_PTP_PPS_HALF_SECOND 500000000ULL #define NS_PER_SEC 1000000000ULL
#define NS_PER_HALF_SEC 500000000ULL
/* In contrast, the X550 controller has two registers, SYSTIMEH and SYSTIMEL /* In contrast, the X550 controller has two registers, SYSTIMEH and SYSTIMEL
* which contain measurements of seconds and nanoseconds respectively. This * which contain measurements of seconds and nanoseconds respectively. This
...@@ -141,23 +141,26 @@ ...@@ -141,23 +141,26 @@
#define MAX_TIMADJ 0x7FFFFFFF #define MAX_TIMADJ 0x7FFFFFFF
/** /**
* ixgbe_ptp_setup_sdp_x540 * ixgbe_ptp_setup_sdp_X540
* @adapter: private adapter structure * @adapter: private adapter structure
* *
* this function enables or disables the clock out feature on SDP0 for * this function enables or disables the clock out feature on SDP0 for
* the X540 device. It will create a 1second periodic output that can * the X540 device. It will create a 1 second periodic output that can
* be used as the PPS (via an interrupt). * be used as the PPS (via an interrupt).
* *
* It calculates when the systime will be on an exact second, and then * It calculates when the system time will be on an exact second, and then
* aligns the start of the PPS signal to that value. The shift is * aligns the start of the PPS signal to that value.
* necessary because it can change based on the link speed. *
* This works by using the cycle counter shift and mult values in reverse, and
* assumes that the values we're shifting will not overflow.
*/ */
static void ixgbe_ptp_setup_sdp_x540(struct ixgbe_adapter *adapter) static void ixgbe_ptp_setup_sdp_X540(struct ixgbe_adapter *adapter)
{ {
struct cyclecounter *cc = &adapter->hw_cc;
struct ixgbe_hw *hw = &adapter->hw; struct ixgbe_hw *hw = &adapter->hw;
int shift = adapter->hw_cc.shift;
u32 esdp, tsauxc, clktiml, clktimh, trgttiml, trgttimh, rem; u32 esdp, tsauxc, clktiml, clktimh, trgttiml, trgttimh, rem;
u64 ns = 0, clock_edge = 0; u64 ns = 0, clock_edge = 0, clock_period;
unsigned long flags;
/* disable the pin first */ /* disable the pin first */
IXGBE_WRITE_REG(hw, IXGBE_TSAUXC, 0x0); IXGBE_WRITE_REG(hw, IXGBE_TSAUXC, 0x0);
...@@ -177,26 +180,36 @@ static void ixgbe_ptp_setup_sdp_x540(struct ixgbe_adapter *adapter) ...@@ -177,26 +180,36 @@ static void ixgbe_ptp_setup_sdp_x540(struct ixgbe_adapter *adapter)
/* enable the Clock Out feature on SDP0, and allow /* enable the Clock Out feature on SDP0, and allow
* interrupts to occur when the pin changes * interrupts to occur when the pin changes
*/ */
tsauxc = IXGBE_TSAUXC_EN_CLK | tsauxc = (IXGBE_TSAUXC_EN_CLK |
IXGBE_TSAUXC_SYNCLK | IXGBE_TSAUXC_SYNCLK |
IXGBE_TSAUXC_SDP0_INT; IXGBE_TSAUXC_SDP0_INT);
/* clock period (or pulse length) */ /* Determine the clock time period to use. This assumes that the
clktiml = (u32)(IXGBE_PTP_PPS_HALF_SECOND << shift); * cycle counter shift is small enough to avoid overflow.
clktimh = (u32)((IXGBE_PTP_PPS_HALF_SECOND << shift) >> 32);
/* Account for the cyclecounter wrap-around value by
* using the converted ns value of the current time to
* check for when the next aligned second would occur.
*/ */
clock_edge |= (u64)IXGBE_READ_REG(hw, IXGBE_SYSTIML); clock_period = div_u64((NS_PER_HALF_SEC << cc->shift), cc->mult);
clock_edge |= (u64)IXGBE_READ_REG(hw, IXGBE_SYSTIMH) << 32; clktiml = (u32)(clock_period);
ns = timecounter_cyc2time(&adapter->hw_tc, clock_edge); clktimh = (u32)(clock_period >> 32);
div_u64_rem(ns, IXGBE_PTP_PPS_HALF_SECOND, &rem); /* Read the current clock time, and save the cycle counter value */
clock_edge += ((IXGBE_PTP_PPS_HALF_SECOND - (u64)rem) << shift); spin_lock_irqsave(&adapter->tmreg_lock, flags);
ns = timecounter_read(&adapter->hw_tc);
clock_edge = adapter->hw_tc.cycle_last;
spin_unlock_irqrestore(&adapter->tmreg_lock, flags);
/* Figure out how many seconds to add in order to round up */
div_u64_rem(ns, NS_PER_SEC, &rem);
/* Figure out how many nanoseconds to add to round the clock edge up
* to the next full second
*/
rem = (NS_PER_SEC - rem);
/* specify the initial clock start time */ /* Adjust the clock edge to align with the next full second. This
* assumes that the cycle counter shift is small enough to avoid
* overflowing when shifting the remainder.
*/
clock_edge += div_u64((rem << cc->shift), cc->mult);
trgttiml = (u32)clock_edge; trgttiml = (u32)clock_edge;
trgttimh = (u32)(clock_edge >> 32); trgttimh = (u32)(clock_edge >> 32);
...@@ -211,9 +224,104 @@ static void ixgbe_ptp_setup_sdp_x540(struct ixgbe_adapter *adapter) ...@@ -211,9 +224,104 @@ static void ixgbe_ptp_setup_sdp_x540(struct ixgbe_adapter *adapter)
IXGBE_WRITE_FLUSH(hw); IXGBE_WRITE_FLUSH(hw);
} }
/**
* ixgbe_ptp_setup_sdp_X550
* @adapter: private adapter structure
*
* Enable or disable a clock output signal on SDP 0 for X550 hardware.
*
* Use the target time feature to align the output signal on the next full
* second.
*
* This works by using the cycle counter shift and mult values in reverse, and
* assumes that the values we're shifting will not overflow.
*/
static void ixgbe_ptp_setup_sdp_X550(struct ixgbe_adapter *adapter)
{
u32 esdp, tsauxc, freqout, trgttiml, trgttimh, rem, tssdp;
struct cyclecounter *cc = &adapter->hw_cc;
struct ixgbe_hw *hw = &adapter->hw;
u64 ns = 0, clock_edge = 0;
struct timespec64 ts;
unsigned long flags;
/* disable the pin first */
IXGBE_WRITE_REG(hw, IXGBE_TSAUXC, 0x0);
IXGBE_WRITE_FLUSH(hw);
if (!(adapter->flags2 & IXGBE_FLAG2_PTP_PPS_ENABLED))
return;
esdp = IXGBE_READ_REG(hw, IXGBE_ESDP);
/* enable the SDP0 pin as output, and connected to the
* native function for Timesync (ClockOut)
*/
esdp |= IXGBE_ESDP_SDP0_DIR |
IXGBE_ESDP_SDP0_NATIVE;
/* enable the Clock Out feature on SDP0, and use Target Time 0 to
* enable generation of interrupts on the clock change.
*/
#define IXGBE_TSAUXC_DIS_TS_CLEAR 0x40000000
tsauxc = (IXGBE_TSAUXC_EN_CLK | IXGBE_TSAUXC_ST0 |
IXGBE_TSAUXC_EN_TT0 | IXGBE_TSAUXC_SDP0_INT |
IXGBE_TSAUXC_DIS_TS_CLEAR);
tssdp = (IXGBE_TSSDP_TS_SDP0_EN |
IXGBE_TSSDP_TS_SDP0_CLK0);
/* Determine the clock time period to use. This assumes that the
* cycle counter shift is small enough to avoid overflowing a 32bit
* value.
*/
freqout = div_u64(NS_PER_HALF_SEC << cc->shift, cc->mult);
/* Read the current clock time, and save the cycle counter value */
spin_lock_irqsave(&adapter->tmreg_lock, flags);
ns = timecounter_read(&adapter->hw_tc);
clock_edge = adapter->hw_tc.cycle_last;
spin_unlock_irqrestore(&adapter->tmreg_lock, flags);
/* Figure out how far past the next second we are */
div_u64_rem(ns, NS_PER_SEC, &rem);
/* Figure out how many nanoseconds to add to round the clock edge up
* to the next full second
*/
rem = (NS_PER_SEC - rem);
/* Adjust the clock edge to align with the next full second. This
* assumes that the cycle counter shift is small enough to avoid
* overflowing when shifting the remainder.
*/
clock_edge += div_u64((rem << cc->shift), cc->mult);
/* X550 hardware stores the time in 32bits of 'billions of cycles' and
* 32bits of 'cycles'. There's no guarantee that cycles represents
* nanoseconds. However, we can use the math from a timespec64 to
* convert into the hardware representation.
*
* See ixgbe_ptp_read_X550() for more details.
*/
ts = ns_to_timespec64(clock_edge);
trgttiml = (u32)ts.tv_nsec;
trgttimh = (u32)ts.tv_sec;
IXGBE_WRITE_REG(hw, IXGBE_FREQOUT0, freqout);
IXGBE_WRITE_REG(hw, IXGBE_TRGTTIML0, trgttiml);
IXGBE_WRITE_REG(hw, IXGBE_TRGTTIMH0, trgttimh);
IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp);
IXGBE_WRITE_REG(hw, IXGBE_TSSDP, tssdp);
IXGBE_WRITE_REG(hw, IXGBE_TSAUXC, tsauxc);
IXGBE_WRITE_FLUSH(hw);
}
/** /**
* ixgbe_ptp_read_X550 - read cycle counter value * ixgbe_ptp_read_X550 - read cycle counter value
* @hw_cc: cyclecounter structure * @cc: cyclecounter structure
* *
* This function reads SYSTIME registers. It is called by the cyclecounter * This function reads SYSTIME registers. It is called by the cyclecounter
* structure to convert from internal representation into nanoseconds. We need * structure to convert from internal representation into nanoseconds. We need
...@@ -221,10 +329,10 @@ static void ixgbe_ptp_setup_sdp_x540(struct ixgbe_adapter *adapter) ...@@ -221,10 +329,10 @@ static void ixgbe_ptp_setup_sdp_x540(struct ixgbe_adapter *adapter)
* result of SYSTIME is 32bits of "billions of cycles" and 32 bits of * result of SYSTIME is 32bits of "billions of cycles" and 32 bits of
* "cycles", rather than seconds and nanoseconds. * "cycles", rather than seconds and nanoseconds.
*/ */
static u64 ixgbe_ptp_read_X550(const struct cyclecounter *hw_cc) static u64 ixgbe_ptp_read_X550(const struct cyclecounter *cc)
{ {
struct ixgbe_adapter *adapter = struct ixgbe_adapter *adapter =
container_of(hw_cc, struct ixgbe_adapter, hw_cc); container_of(cc, struct ixgbe_adapter, hw_cc);
struct ixgbe_hw *hw = &adapter->hw; struct ixgbe_hw *hw = &adapter->hw;
struct timespec64 ts; struct timespec64 ts;
...@@ -838,6 +946,15 @@ void ixgbe_ptp_rx_rgtstamp(struct ixgbe_q_vector *q_vector, ...@@ -838,6 +946,15 @@ void ixgbe_ptp_rx_rgtstamp(struct ixgbe_q_vector *q_vector,
ixgbe_ptp_convert_to_hwtstamp(adapter, skb_hwtstamps(skb), regval); ixgbe_ptp_convert_to_hwtstamp(adapter, skb_hwtstamps(skb), regval);
} }
/**
* ixgbe_ptp_get_ts_config - get current hardware timestamping configuration
* @adapter: pointer to adapter structure
* @ifr: ioctl data
*
* This function returns the current timestamping settings. Rather than
* attempt to deconstruct registers to fill in the values, simply keep a copy
* of the old settings around, and return a copy when requested.
*/
int ixgbe_ptp_get_ts_config(struct ixgbe_adapter *adapter, struct ifreq *ifr) int ixgbe_ptp_get_ts_config(struct ixgbe_adapter *adapter, struct ifreq *ifr)
{ {
struct hwtstamp_config *config = &adapter->tstamp_config; struct hwtstamp_config *config = &adapter->tstamp_config;
...@@ -1253,7 +1370,7 @@ static long ixgbe_ptp_create_clock(struct ixgbe_adapter *adapter) ...@@ -1253,7 +1370,7 @@ static long ixgbe_ptp_create_clock(struct ixgbe_adapter *adapter)
adapter->ptp_caps.gettimex64 = ixgbe_ptp_gettimex; adapter->ptp_caps.gettimex64 = ixgbe_ptp_gettimex;
adapter->ptp_caps.settime64 = ixgbe_ptp_settime; adapter->ptp_caps.settime64 = ixgbe_ptp_settime;
adapter->ptp_caps.enable = ixgbe_ptp_feature_enable; adapter->ptp_caps.enable = ixgbe_ptp_feature_enable;
adapter->ptp_setup_sdp = ixgbe_ptp_setup_sdp_x540; adapter->ptp_setup_sdp = ixgbe_ptp_setup_sdp_X540;
break; break;
case ixgbe_mac_82599EB: case ixgbe_mac_82599EB:
snprintf(adapter->ptp_caps.name, snprintf(adapter->ptp_caps.name,
...@@ -1280,13 +1397,13 @@ static long ixgbe_ptp_create_clock(struct ixgbe_adapter *adapter) ...@@ -1280,13 +1397,13 @@ static long ixgbe_ptp_create_clock(struct ixgbe_adapter *adapter)
adapter->ptp_caps.n_alarm = 0; adapter->ptp_caps.n_alarm = 0;
adapter->ptp_caps.n_ext_ts = 0; adapter->ptp_caps.n_ext_ts = 0;
adapter->ptp_caps.n_per_out = 0; adapter->ptp_caps.n_per_out = 0;
adapter->ptp_caps.pps = 0; adapter->ptp_caps.pps = 1;
adapter->ptp_caps.adjfreq = ixgbe_ptp_adjfreq_X550; adapter->ptp_caps.adjfreq = ixgbe_ptp_adjfreq_X550;
adapter->ptp_caps.adjtime = ixgbe_ptp_adjtime; adapter->ptp_caps.adjtime = ixgbe_ptp_adjtime;
adapter->ptp_caps.gettimex64 = ixgbe_ptp_gettimex; adapter->ptp_caps.gettimex64 = ixgbe_ptp_gettimex;
adapter->ptp_caps.settime64 = ixgbe_ptp_settime; adapter->ptp_caps.settime64 = ixgbe_ptp_settime;
adapter->ptp_caps.enable = ixgbe_ptp_feature_enable; adapter->ptp_caps.enable = ixgbe_ptp_feature_enable;
adapter->ptp_setup_sdp = NULL; adapter->ptp_setup_sdp = ixgbe_ptp_setup_sdp_X550;
break; break;
default: default:
adapter->ptp_clock = NULL; adapter->ptp_clock = NULL;
......
...@@ -1645,7 +1645,7 @@ int ixgbe_ndo_set_vf_spoofchk(struct net_device *netdev, int vf, bool setting) ...@@ -1645,7 +1645,7 @@ int ixgbe_ndo_set_vf_spoofchk(struct net_device *netdev, int vf, bool setting)
IXGBE_WRITE_REG(hw, IXGBE_ETQF(IXGBE_ETQF_FILTER_LLDP), IXGBE_WRITE_REG(hw, IXGBE_ETQF(IXGBE_ETQF_FILTER_LLDP),
(IXGBE_ETQF_FILTER_EN | (IXGBE_ETQF_FILTER_EN |
IXGBE_ETQF_TX_ANTISPOOF | IXGBE_ETQF_TX_ANTISPOOF |
IXGBE_ETH_P_LLDP)); ETH_P_LLDP));
IXGBE_WRITE_REG(hw, IXGBE_ETQF(IXGBE_ETQF_FILTER_FC), IXGBE_WRITE_REG(hw, IXGBE_ETQF(IXGBE_ETQF_FILTER_FC),
(IXGBE_ETQF_FILTER_EN | (IXGBE_ETQF_FILTER_EN |
......
...@@ -1067,6 +1067,7 @@ struct ixgbe_nvm_version { ...@@ -1067,6 +1067,7 @@ struct ixgbe_nvm_version {
#define IXGBE_AUXSTMPL1 0x08C44 /* Auxiliary Time Stamp 1 register Low - RO */ #define IXGBE_AUXSTMPL1 0x08C44 /* Auxiliary Time Stamp 1 register Low - RO */
#define IXGBE_AUXSTMPH1 0x08C48 /* Auxiliary Time Stamp 1 register High - RO */ #define IXGBE_AUXSTMPH1 0x08C48 /* Auxiliary Time Stamp 1 register High - RO */
#define IXGBE_TSIM 0x08C68 /* TimeSync Interrupt Mask Register - RW */ #define IXGBE_TSIM 0x08C68 /* TimeSync Interrupt Mask Register - RW */
#define IXGBE_TSSDP 0x0003C /* TimeSync SDP Configuration Register - RW */
/* Diagnostic Registers */ /* Diagnostic Registers */
#define IXGBE_RDSTATCTL 0x02C20 #define IXGBE_RDSTATCTL 0x02C20
...@@ -2240,11 +2241,18 @@ enum { ...@@ -2240,11 +2241,18 @@ enum {
#define IXGBE_RXDCTL_RLPML_EN 0x00008000 #define IXGBE_RXDCTL_RLPML_EN 0x00008000
#define IXGBE_RXDCTL_VME 0x40000000 /* VLAN mode enable */ #define IXGBE_RXDCTL_VME 0x40000000 /* VLAN mode enable */
#define IXGBE_TSAUXC_EN_CLK 0x00000004 #define IXGBE_TSAUXC_EN_CLK 0x00000004
#define IXGBE_TSAUXC_SYNCLK 0x00000008 #define IXGBE_TSAUXC_SYNCLK 0x00000008
#define IXGBE_TSAUXC_SDP0_INT 0x00000040 #define IXGBE_TSAUXC_SDP0_INT 0x00000040
#define IXGBE_TSAUXC_EN_TT0 0x00000001
#define IXGBE_TSAUXC_EN_TT1 0x00000002
#define IXGBE_TSAUXC_ST0 0x00000010
#define IXGBE_TSAUXC_DISABLE_SYSTIME 0x80000000 #define IXGBE_TSAUXC_DISABLE_SYSTIME 0x80000000
#define IXGBE_TSSDP_TS_SDP0_SEL_MASK 0x000000C0
#define IXGBE_TSSDP_TS_SDP0_CLK0 0x00000080
#define IXGBE_TSSDP_TS_SDP0_EN 0x00000100
#define IXGBE_TSYNCTXCTL_VALID 0x00000001 /* Tx timestamp valid */ #define IXGBE_TSYNCTXCTL_VALID 0x00000001 /* Tx timestamp valid */
#define IXGBE_TSYNCTXCTL_ENABLED 0x00000010 /* Tx timestamping enabled */ #define IXGBE_TSYNCTXCTL_ENABLED 0x00000010 /* Tx timestamping enabled */
......
...@@ -14,57 +14,10 @@ struct xdp_umem *ixgbe_xsk_umem(struct ixgbe_adapter *adapter, ...@@ -14,57 +14,10 @@ struct xdp_umem *ixgbe_xsk_umem(struct ixgbe_adapter *adapter,
bool xdp_on = READ_ONCE(adapter->xdp_prog); bool xdp_on = READ_ONCE(adapter->xdp_prog);
int qid = ring->ring_idx; int qid = ring->ring_idx;
if (!adapter->xsk_umems || !adapter->xsk_umems[qid] || if (!xdp_on || !test_bit(qid, adapter->af_xdp_zc_qps))
qid >= adapter->num_xsk_umems || !xdp_on)
return NULL; return NULL;
return adapter->xsk_umems[qid]; return xdp_get_umem_from_qid(adapter->netdev, qid);
}
static int ixgbe_alloc_xsk_umems(struct ixgbe_adapter *adapter)
{
if (adapter->xsk_umems)
return 0;
adapter->num_xsk_umems_used = 0;
adapter->num_xsk_umems = adapter->num_rx_queues;
adapter->xsk_umems = kcalloc(adapter->num_xsk_umems,
sizeof(*adapter->xsk_umems),
GFP_KERNEL);
if (!adapter->xsk_umems) {
adapter->num_xsk_umems = 0;
return -ENOMEM;
}
return 0;
}
static int ixgbe_add_xsk_umem(struct ixgbe_adapter *adapter,
struct xdp_umem *umem,
u16 qid)
{
int err;
err = ixgbe_alloc_xsk_umems(adapter);
if (err)
return err;
adapter->xsk_umems[qid] = umem;
adapter->num_xsk_umems_used++;
return 0;
}
static void ixgbe_remove_xsk_umem(struct ixgbe_adapter *adapter, u16 qid)
{
adapter->xsk_umems[qid] = NULL;
adapter->num_xsk_umems_used--;
if (adapter->num_xsk_umems == 0) {
kfree(adapter->xsk_umems);
adapter->xsk_umems = NULL;
adapter->num_xsk_umems = 0;
}
} }
static int ixgbe_xsk_umem_dma_map(struct ixgbe_adapter *adapter, static int ixgbe_xsk_umem_dma_map(struct ixgbe_adapter *adapter,
...@@ -113,6 +66,7 @@ static int ixgbe_xsk_umem_enable(struct ixgbe_adapter *adapter, ...@@ -113,6 +66,7 @@ static int ixgbe_xsk_umem_enable(struct ixgbe_adapter *adapter,
struct xdp_umem *umem, struct xdp_umem *umem,
u16 qid) u16 qid)
{ {
struct net_device *netdev = adapter->netdev;
struct xdp_umem_fq_reuse *reuseq; struct xdp_umem_fq_reuse *reuseq;
bool if_running; bool if_running;
int err; int err;
...@@ -120,12 +74,9 @@ static int ixgbe_xsk_umem_enable(struct ixgbe_adapter *adapter, ...@@ -120,12 +74,9 @@ static int ixgbe_xsk_umem_enable(struct ixgbe_adapter *adapter,
if (qid >= adapter->num_rx_queues) if (qid >= adapter->num_rx_queues)
return -EINVAL; return -EINVAL;
if (adapter->xsk_umems) { if (qid >= netdev->real_num_rx_queues ||
if (qid >= adapter->num_xsk_umems) qid >= netdev->real_num_tx_queues)
return -EINVAL; return -EINVAL;
if (adapter->xsk_umems[qid])
return -EBUSY;
}
reuseq = xsk_reuseq_prepare(adapter->rx_ring[0]->count); reuseq = xsk_reuseq_prepare(adapter->rx_ring[0]->count);
if (!reuseq) if (!reuseq)
...@@ -138,14 +89,12 @@ static int ixgbe_xsk_umem_enable(struct ixgbe_adapter *adapter, ...@@ -138,14 +89,12 @@ static int ixgbe_xsk_umem_enable(struct ixgbe_adapter *adapter,
return err; return err;
if_running = netif_running(adapter->netdev) && if_running = netif_running(adapter->netdev) &&
READ_ONCE(adapter->xdp_prog); ixgbe_enabled_xdp_adapter(adapter);
if (if_running) if (if_running)
ixgbe_txrx_ring_disable(adapter, qid); ixgbe_txrx_ring_disable(adapter, qid);
err = ixgbe_add_xsk_umem(adapter, umem, qid); set_bit(qid, adapter->af_xdp_zc_qps);
if (err)
return err;
if (if_running) { if (if_running) {
ixgbe_txrx_ring_enable(adapter, qid); ixgbe_txrx_ring_enable(adapter, qid);
...@@ -161,20 +110,21 @@ static int ixgbe_xsk_umem_enable(struct ixgbe_adapter *adapter, ...@@ -161,20 +110,21 @@ static int ixgbe_xsk_umem_enable(struct ixgbe_adapter *adapter,
static int ixgbe_xsk_umem_disable(struct ixgbe_adapter *adapter, u16 qid) static int ixgbe_xsk_umem_disable(struct ixgbe_adapter *adapter, u16 qid)
{ {
struct xdp_umem *umem;
bool if_running; bool if_running;
if (!adapter->xsk_umems || qid >= adapter->num_xsk_umems || umem = xdp_get_umem_from_qid(adapter->netdev, qid);
!adapter->xsk_umems[qid]) if (!umem)
return -EINVAL; return -EINVAL;
if_running = netif_running(adapter->netdev) && if_running = netif_running(adapter->netdev) &&
READ_ONCE(adapter->xdp_prog); ixgbe_enabled_xdp_adapter(adapter);
if (if_running) if (if_running)
ixgbe_txrx_ring_disable(adapter, qid); ixgbe_txrx_ring_disable(adapter, qid);
ixgbe_xsk_umem_dma_unmap(adapter, adapter->xsk_umems[qid]); clear_bit(qid, adapter->af_xdp_zc_qps);
ixgbe_remove_xsk_umem(adapter, qid); ixgbe_xsk_umem_dma_unmap(adapter, umem);
if (if_running) if (if_running)
ixgbe_txrx_ring_enable(adapter, qid); ixgbe_txrx_ring_enable(adapter, qid);
...@@ -640,6 +590,7 @@ static bool ixgbe_xmit_zc(struct ixgbe_ring *xdp_ring, unsigned int budget) ...@@ -640,6 +590,7 @@ static bool ixgbe_xmit_zc(struct ixgbe_ring *xdp_ring, unsigned int budget)
tx_bi = &xdp_ring->tx_buffer_info[xdp_ring->next_to_use]; tx_bi = &xdp_ring->tx_buffer_info[xdp_ring->next_to_use];
tx_bi->bytecount = len; tx_bi->bytecount = len;
tx_bi->xdpf = NULL; tx_bi->xdpf = NULL;
tx_bi->gso_segs = 1;
tx_desc = IXGBE_TX_DESC(xdp_ring, xdp_ring->next_to_use); tx_desc = IXGBE_TX_DESC(xdp_ring, xdp_ring->next_to_use);
tx_desc->read.buffer_addr = cpu_to_le64(dma); tx_desc->read.buffer_addr = cpu_to_le64(dma);
...@@ -704,7 +655,6 @@ bool ixgbe_clean_xdp_tx_irq(struct ixgbe_q_vector *q_vector, ...@@ -704,7 +655,6 @@ bool ixgbe_clean_xdp_tx_irq(struct ixgbe_q_vector *q_vector,
xsk_frames++; xsk_frames++;
tx_bi->xdpf = NULL; tx_bi->xdpf = NULL;
total_bytes += tx_bi->bytecount;
tx_bi++; tx_bi++;
tx_desc++; tx_desc++;
...@@ -753,7 +703,7 @@ int ixgbe_xsk_async_xmit(struct net_device *dev, u32 qid) ...@@ -753,7 +703,7 @@ int ixgbe_xsk_async_xmit(struct net_device *dev, u32 qid)
if (qid >= adapter->num_xdp_queues) if (qid >= adapter->num_xdp_queues)
return -ENXIO; return -ENXIO;
if (!adapter->xsk_umems || !adapter->xsk_umems[qid]) if (!adapter->xdp_ring[qid]->xsk_umem)
return -ENXIO; return -ENXIO;
ring = adapter->xdp_ring[qid]; ring = adapter->xdp_ring[qid];
......
...@@ -508,9 +508,8 @@ static s32 ixgbevf_update_mc_addr_list_vf(struct ixgbe_hw *hw, ...@@ -508,9 +508,8 @@ static s32 ixgbevf_update_mc_addr_list_vf(struct ixgbe_hw *hw,
vector_list[i++] = ixgbevf_mta_vector(hw, ha->addr); vector_list[i++] = ixgbevf_mta_vector(hw, ha->addr);
} }
ixgbevf_write_msg_read_ack(hw, msgbuf, msgbuf, IXGBE_VFMAILBOX_SIZE); return ixgbevf_write_msg_read_ack(hw, msgbuf, msgbuf,
IXGBE_VFMAILBOX_SIZE);
return 0;
} }
/** /**
......
...@@ -91,6 +91,7 @@ ...@@ -91,6 +91,7 @@
#define ETH_P_802_EX1 0x88B5 /* 802.1 Local Experimental 1. */ #define ETH_P_802_EX1 0x88B5 /* 802.1 Local Experimental 1. */
#define ETH_P_PREAUTH 0x88C7 /* 802.11 Preauthentication */ #define ETH_P_PREAUTH 0x88C7 /* 802.11 Preauthentication */
#define ETH_P_TIPC 0x88CA /* TIPC */ #define ETH_P_TIPC 0x88CA /* TIPC */
#define ETH_P_LLDP 0x88CC /* Link Layer Discovery Protocol */
#define ETH_P_MACSEC 0x88E5 /* 802.1ae MACsec */ #define ETH_P_MACSEC 0x88E5 /* 802.1ae MACsec */
#define ETH_P_8021AH 0x88E7 /* 802.1ah Backbone Service Tag */ #define ETH_P_8021AH 0x88E7 /* 802.1ah Backbone Service Tag */
#define ETH_P_MVRP 0x88F5 /* 802.1Q MVRP */ #define ETH_P_MVRP 0x88F5 /* 802.1Q MVRP */
......
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