Commit a5006777 authored by David S. Miller's avatar David S. Miller
Browse files


Jeff Kirsher says:

====================
1GbE Intel Wired LAN Driver Updates 2020-04-19

This series contains updates to e1000e and igc only.

Sasha adds new device IDs supported by the igc driver.

Vitaly fixes the S0ix entry and exit flows in e1000e for TGP and newer
MAC types when a cable is connected.

Andre has the remaining changes in the series, starting with cleanup of
the igc driver of duplicate code.  Added a check for
IGC_MAC_STATE_SRC_ADDR flag which is unsupported for MAC filters in igc.
Cleaned up the return values for igc_add_mac_filter(), where the return
value was not being used, so update the function to only return success
or failure.  Fix the return value of igc_uc_unsync() as well.  Refactor
the igc driver in several functions to help reduce the convoluted logic
and simplify the driver filtering mechanisms.  Improve the MAC address
checks when adding a MAC filter.  Lastly, improve the log messages
related to MAC address filtering to ease debugging.
====================

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 745e5ad5 949b922e
Loading
Loading
Loading
Loading
+54 −0
Original line number Diff line number Diff line
@@ -6404,6 +6404,31 @@ static void e1000e_s0ix_entry_flow(struct e1000_adapter *adapter)
	mac_data |= BIT(3);
	ew32(CTRL_EXT, mac_data);

	/* Disable disconnected cable conditioning for Power Gating */
	mac_data = er32(DPGFR);
	mac_data |= BIT(2);
	ew32(DPGFR, mac_data);

	/* Don't wake from dynamic Power Gating with clock request */
	mac_data = er32(FEXTNVM12);
	mac_data |= BIT(12);
	ew32(FEXTNVM12, mac_data);

	/* Ungate PGCB clock */
	mac_data = er32(FEXTNVM9);
	mac_data |= BIT(28);
	ew32(FEXTNVM9, mac_data);

	/* Enable K1 off to enable mPHY Power Gating */
	mac_data = er32(FEXTNVM6);
	mac_data |= BIT(31);
	ew32(FEXTNVM12, mac_data);

	/* Enable mPHY power gating for any link and speed */
	mac_data = er32(FEXTNVM8);
	mac_data |= BIT(9);
	ew32(FEXTNVM8, mac_data);

	/* Enable the Dynamic Clock Gating in the DMA and MAC */
	mac_data = er32(CTRL_EXT);
	mac_data |= E1000_CTRL_EXT_DMA_DYN_CLK_EN;
@@ -6433,6 +6458,35 @@ static void e1000e_s0ix_exit_flow(struct e1000_adapter *adapter)
	mac_data |= BIT(0);
	ew32(FEXTNVM7, mac_data);

	/* Disable mPHY power gating for any link and speed */
	mac_data = er32(FEXTNVM8);
	mac_data &= ~BIT(9);
	ew32(FEXTNVM8, mac_data);

	/* Disable K1 off */
	mac_data = er32(FEXTNVM6);
	mac_data &= ~BIT(31);
	ew32(FEXTNVM12, mac_data);

	/* Disable Ungate PGCB clock */
	mac_data = er32(FEXTNVM9);
	mac_data &= ~BIT(28);
	ew32(FEXTNVM9, mac_data);

	/* Cancel not waking from dynamic
	 * Power Gating with clock request
	 */
	mac_data = er32(FEXTNVM12);
	mac_data &= ~BIT(12);
	ew32(FEXTNVM12, mac_data);

	/* Cancel disable disconnected cable conditioning
	 * for Power Gating
	 */
	mac_data = er32(DPGFR);
	mac_data &= ~BIT(2);
	ew32(DPGFR, mac_data);

	/* Disable Dynamic Power Gating */
	mac_data = er32(CTRL_EXT);
	mac_data &= 0xFFFFFFF7;
+3 −0
Original line number Diff line number Diff line
@@ -21,9 +21,12 @@
#define E1000_FEXTNVM5	0x00014	/* Future Extended NVM 5 - RW */
#define E1000_FEXTNVM6	0x00010	/* Future Extended NVM 6 - RW */
#define E1000_FEXTNVM7	0x000E4	/* Future Extended NVM 7 - RW */
#define E1000_FEXTNVM8	0x5BB0	/* Future Extended NVM 8 - RW */
#define E1000_FEXTNVM9	0x5BB4	/* Future Extended NVM 9 - RW */
#define E1000_FEXTNVM11	0x5BBC	/* Future Extended NVM 11 - RW */
#define E1000_FEXTNVM12	0x5BC0	/* Future Extended NVM 12 - RW */
#define E1000_PCIEANACFG	0x00F18	/* PCIE Analog Config */
#define E1000_DPGFR	0x00FAC	/* Dynamic Power Gate Force Control Register */
#define E1000_FCT	0x00030	/* Flow Control Type - RW */
#define E1000_VET	0x00038	/* VLAN Ether Type - RW */
#define E1000_ICR	0x000C0	/* Interrupt Cause Read - R/clr */
+5 −6
Original line number Diff line number Diff line
@@ -227,10 +227,10 @@ void igc_write_rss_indir_tbl(struct igc_adapter *adapter);
bool igc_has_link(struct igc_adapter *adapter);
void igc_reset(struct igc_adapter *adapter);
int igc_set_spd_dplx(struct igc_adapter *adapter, u32 spd, u8 dplx);
int igc_add_mac_steering_filter(struct igc_adapter *adapter,
				const u8 *addr, u8 queue, u8 flags);
int igc_del_mac_steering_filter(struct igc_adapter *adapter,
				const u8 *addr, u8 queue, u8 flags);
int igc_add_mac_filter(struct igc_adapter *adapter, const u8 *addr,
		       const s8 queue, const u8 flags);
int igc_del_mac_filter(struct igc_adapter *adapter, const u8 *addr,
		       const u8 flags);
void igc_update_stats(struct igc_adapter *adapter);

/* igc_dump declarations */
@@ -466,14 +466,13 @@ struct igc_nfc_filter {

struct igc_mac_addr {
	u8 addr[ETH_ALEN];
	u8 queue;
	s8 queue;
	u8 state; /* bitmask */
};

#define IGC_MAC_STATE_DEFAULT		0x1
#define IGC_MAC_STATE_IN_USE		0x2
#define IGC_MAC_STATE_SRC_ADDR		0x4
#define IGC_MAC_STATE_QUEUE_STEERING	0x8

#define IGC_MAX_RXNFC_FILTERS		16

+3 −0
Original line number Diff line number Diff line
@@ -212,6 +212,9 @@ static s32 igc_get_invariants_base(struct igc_hw *hw)
	case IGC_DEV_ID_I225_I:
	case IGC_DEV_ID_I220_V:
	case IGC_DEV_ID_I225_K:
	case IGC_DEV_ID_I225_K2:
	case IGC_DEV_ID_I225_LMVP:
	case IGC_DEV_ID_I225_IT:
	case IGC_DEV_ID_I225_BLANK_NVM:
		mac->type = igc_i225;
		break;
+8 −14
Original line number Diff line number Diff line
@@ -1266,20 +1266,16 @@ int igc_add_filter(struct igc_adapter *adapter, struct igc_nfc_filter *input)
	}

	if (input->filter.match_flags & IGC_FILTER_FLAG_DST_MAC_ADDR) {
		err = igc_add_mac_steering_filter(adapter,
						  input->filter.dst_addr,
		err = igc_add_mac_filter(adapter, input->filter.dst_addr,
					 input->action, 0);
		err = min_t(int, err, 0);
		if (err)
			return err;
	}

	if (input->filter.match_flags & IGC_FILTER_FLAG_SRC_MAC_ADDR) {
		err = igc_add_mac_steering_filter(adapter,
						  input->filter.src_addr,
		err = igc_add_mac_filter(adapter, input->filter.src_addr,
					 input->action,
					 IGC_MAC_STATE_SRC_ADDR);
		err = min_t(int, err, 0);
		if (err)
			return err;
	}
@@ -1333,13 +1329,11 @@ int igc_erase_filter(struct igc_adapter *adapter, struct igc_nfc_filter *input)
					   ntohs(input->filter.vlan_tci));

	if (input->filter.match_flags & IGC_FILTER_FLAG_SRC_MAC_ADDR)
		igc_del_mac_steering_filter(adapter, input->filter.src_addr,
					    input->action,
		igc_del_mac_filter(adapter, input->filter.src_addr,
				   IGC_MAC_STATE_SRC_ADDR);

	if (input->filter.match_flags & IGC_FILTER_FLAG_DST_MAC_ADDR)
		igc_del_mac_steering_filter(adapter, input->filter.dst_addr,
					    input->action, 0);
		igc_del_mac_filter(adapter, input->filter.dst_addr, 0);

	return 0;
}
Loading