mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-09-04 20:19:47 +08:00

This patch implements the "ethtool --set-mm" callback to trigger the frame preemption verification handshake. Uses the MAC Merge Software Verification (mmsv) mechanism in ethtool to perform the verification handshake for igc. The structure fpe.mmsv is set by mmsv in ethtool and should remain read-only for the driver. Other mmsv callbacks: a) configure_tx() -> not used yet at this point - igc lacks registers to configure FPE in the transmit direction, so this API is not utilized for now. When igc supports preemptible queue, driver will use this API to manage its configuration. b) configure_pmac() -> not used - this callback dynamically controls pmac_enabled at runtime. For example, mmsv calls configure_pmac() and disables pmac_enabled when the link partner goes down, even if the user previously enabled it. The intention is to save power but it is not feasible in igc because it causes an endless adapter reset loop: 1) Board A and Board B complete the verification handshake. Tx mode register for both boards are in TSN mode. 2) Board B link goes down. On Board A: 3) mmsv calls configure_pmac() with pmac_enabled = false. 4) configure_pmac() in igc updates a new field based on pmac_enabled. Driver uses this field in igc_tsn_new_flags() to indicate that the user enabled/disabled FPE. 5) configure_pmac() in igc calls igc_tsn_offload_apply() to check whether an adapter reset is needed. Calls existing logic in igc_tsn_will_tx_mode_change() and igc_tsn_new_flags(). 6) Since pmac_enabled is now disabled and no other TSN feature is active, igc_tsn_will_tx_mode_change() evaluates to true because Tx mode will switch from TSN to Legacy. 7) Driver resets the adapter. 8) Registers are set, and Tx mode switches to Legacy. 9) When link partner is up, steps 3-8 repeat, but this time with pmac_enabled = true, reactivating TSN. igc_tsn_will_tx_mode_change() evaluates to true again, since Tx mode will switch from Legacy to TSN. 10) Driver resets the adapter. 11) Adapter reset completes, registers are set, and Tx mode switches to TSN. On Board B: 12) Adapter reset on Board A at step 10 causes it to detect its link partner as down. 13) Repeats steps 3-8. 14) Once reset adapter on Board A is completed at step 11, it detects its link partner as up. 15) Repeats steps 9-11. - this cycle repeats indefinitely. To avoid this issue, igc only uses mmsv.pmac_enabled to track whether FPE is enabled or disabled. Co-developed-by: Vinicius Costa Gomes <vinicius.gomes@intel.com> Signed-off-by: Vinicius Costa Gomes <vinicius.gomes@intel.com> Co-developed-by: Choong Yong Liang <yong.liang.choong@linux.intel.com> Signed-off-by: Choong Yong Liang <yong.liang.choong@linux.intel.com> Co-developed-by: Chwee-Lin Choong <chwee.lin.choong@intel.com> Signed-off-by: Chwee-Lin Choong <chwee.lin.choong@intel.com> Reviewed-by: Vladimir Oltean <vladimir.oltean@nxp.com> Signed-off-by: Faizal Rahim <faizal.abdul.rahim@linux.intel.com> Tested-by: Mor Bar-Gabay <morx.bar.gabay@intel.com> Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
108 lines
3.6 KiB
C
108 lines
3.6 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
/* Copyright (c) 2018 Intel Corporation */
|
|
|
|
#ifndef _IGC_BASE_H_
|
|
#define _IGC_BASE_H_
|
|
|
|
/* forward declaration */
|
|
void igc_rx_fifo_flush_base(struct igc_hw *hw);
|
|
void igc_power_down_phy_copper_base(struct igc_hw *hw);
|
|
bool igc_is_device_id_i225(struct igc_hw *hw);
|
|
bool igc_is_device_id_i226(struct igc_hw *hw);
|
|
|
|
/* Transmit Descriptor - Advanced */
|
|
union igc_adv_tx_desc {
|
|
struct {
|
|
__le64 buffer_addr; /* Address of descriptor's data buf */
|
|
__le32 cmd_type_len;
|
|
__le32 olinfo_status;
|
|
} read;
|
|
struct {
|
|
__le64 rsvd; /* Reserved */
|
|
__le32 nxtseq_seed;
|
|
__le32 status;
|
|
} wb;
|
|
};
|
|
|
|
/* Context descriptors */
|
|
struct igc_adv_tx_context_desc {
|
|
__le32 vlan_macip_lens;
|
|
__le32 launch_time;
|
|
__le32 type_tucmd_mlhl;
|
|
__le32 mss_l4len_idx;
|
|
};
|
|
|
|
/* Adv Transmit Descriptor Config Masks */
|
|
#define IGC_ADVTXD_MAC_TSTAMP 0x00080000 /* IEEE1588 Timestamp packet */
|
|
#define IGC_ADVTXD_TSTAMP_REG_1 0x00010000 /* Select register 1 for timestamp */
|
|
#define IGC_ADVTXD_TSTAMP_REG_2 0x00020000 /* Select register 2 for timestamp */
|
|
#define IGC_ADVTXD_TSTAMP_REG_3 0x00030000 /* Select register 3 for timestamp */
|
|
#define IGC_ADVTXD_TSTAMP_TIMER_1 0x00010000 /* Select timer 1 for timestamp */
|
|
#define IGC_ADVTXD_TSTAMP_TIMER_2 0x00020000 /* Select timer 2 for timestamp */
|
|
#define IGC_ADVTXD_TSTAMP_TIMER_3 0x00030000 /* Select timer 3 for timestamp */
|
|
|
|
#define IGC_ADVTXD_DTYP_CTXT 0x00200000 /* Advanced Context Descriptor */
|
|
#define IGC_ADVTXD_DTYP_DATA 0x00300000 /* Advanced Data Descriptor */
|
|
#define IGC_ADVTXD_DCMD_EOP 0x01000000 /* End of Packet */
|
|
#define IGC_ADVTXD_DCMD_IFCS 0x02000000 /* Insert FCS (Ethernet CRC) */
|
|
#define IGC_ADVTXD_DCMD_RS 0x08000000 /* Report Status */
|
|
#define IGC_ADVTXD_DCMD_DEXT 0x20000000 /* Descriptor extension (1=Adv) */
|
|
#define IGC_ADVTXD_DCMD_VLE 0x40000000 /* VLAN pkt enable */
|
|
#define IGC_ADVTXD_DCMD_TSE 0x80000000 /* TCP Seg enable */
|
|
#define IGC_ADVTXD_PAYLEN_MASK 0XFFFFC000 /* Adv desc PAYLEN mask */
|
|
#define IGC_ADVTXD_PAYLEN_SHIFT 14 /* Adv desc PAYLEN shift */
|
|
|
|
#define IGC_RAR_ENTRIES 16
|
|
|
|
/* Receive Descriptor - Advanced */
|
|
union igc_adv_rx_desc {
|
|
struct {
|
|
__le64 pkt_addr; /* Packet buffer address */
|
|
__le64 hdr_addr; /* Header buffer address */
|
|
} read;
|
|
struct {
|
|
struct {
|
|
union {
|
|
__le32 data;
|
|
struct {
|
|
__le16 pkt_info; /*RSS type, Pkt type*/
|
|
/* Split Header, header buffer len */
|
|
__le16 hdr_info;
|
|
} hs_rss;
|
|
} lo_dword;
|
|
union {
|
|
__le32 rss; /* RSS Hash */
|
|
struct {
|
|
__le16 ip_id; /* IP id */
|
|
__le16 csum; /* Packet Checksum */
|
|
} csum_ip;
|
|
} hi_dword;
|
|
} lower;
|
|
struct {
|
|
__le32 status_error; /* ext status/error */
|
|
__le16 length; /* Packet length */
|
|
__le16 vlan; /* VLAN tag */
|
|
} upper;
|
|
} wb; /* writeback */
|
|
};
|
|
|
|
/* Additional Transmit Descriptor Control definitions */
|
|
#define IGC_TXDCTL_QUEUE_ENABLE 0x02000000 /* Ena specific Tx Queue */
|
|
#define IGC_TXDCTL_SWFLUSH 0x04000000 /* Transmit Software Flush */
|
|
|
|
/* Additional Receive Descriptor Control definitions */
|
|
#define IGC_RXDCTL_QUEUE_ENABLE 0x02000000 /* Ena specific Rx Queue */
|
|
#define IGC_RXDCTL_SWFLUSH 0x04000000 /* Receive Software Flush */
|
|
|
|
/* SRRCTL bit definitions */
|
|
#define IGC_SRRCTL_BSIZEPKT_MASK GENMASK(6, 0)
|
|
#define IGC_SRRCTL_BSIZEPKT(x) FIELD_PREP(IGC_SRRCTL_BSIZEPKT_MASK, \
|
|
(x) / 1024) /* in 1 KB resolution */
|
|
#define IGC_SRRCTL_BSIZEHDR_MASK GENMASK(13, 8)
|
|
#define IGC_SRRCTL_BSIZEHDR(x) FIELD_PREP(IGC_SRRCTL_BSIZEHDR_MASK, \
|
|
(x) / 64) /* in 64 bytes resolution */
|
|
#define IGC_SRRCTL_DESCTYPE_MASK GENMASK(27, 25)
|
|
#define IGC_SRRCTL_DESCTYPE_ADV_ONEBUF FIELD_PREP(IGC_SRRCTL_DESCTYPE_MASK, 1)
|
|
|
|
#endif /* _IGC_BASE_H */
|