@@ -956,6 +956,7 @@ static int igc_ethtool_set_coalesce(struct net_device *netdev,
956956}
957957
958958#define ETHER_TYPE_FULL_MASK ((__force __be16)~0)
959+ #define VLAN_TCI_FULL_MASK ((__force __be16)~0)
959960static int igc_ethtool_get_nfc_rule (struct igc_adapter * adapter ,
960961 struct ethtool_rxnfc * cmd )
961962{
@@ -978,10 +979,16 @@ static int igc_ethtool_get_nfc_rule(struct igc_adapter *adapter,
978979 fsp -> m_u .ether_spec .h_proto = ETHER_TYPE_FULL_MASK ;
979980 }
980981
982+ if (rule -> filter .match_flags & IGC_FILTER_FLAG_VLAN_ETYPE ) {
983+ fsp -> flow_type |= FLOW_EXT ;
984+ fsp -> h_ext .vlan_etype = htons (rule -> filter .vlan_etype );
985+ fsp -> m_ext .vlan_etype = ETHER_TYPE_FULL_MASK ;
986+ }
987+
981988 if (rule -> filter .match_flags & IGC_FILTER_FLAG_VLAN_TCI ) {
982989 fsp -> flow_type |= FLOW_EXT ;
983990 fsp -> h_ext .vlan_tci = htons (rule -> filter .vlan_tci );
984- fsp -> m_ext .vlan_tci = htons (VLAN_PRIO_MASK );
991+ fsp -> m_ext .vlan_tci = htons (rule -> filter . vlan_tci_mask );
985992 }
986993
987994 if (rule -> filter .match_flags & IGC_FILTER_FLAG_DST_MAC_ADDR ) {
@@ -1216,6 +1223,7 @@ static void igc_ethtool_init_nfc_rule(struct igc_nfc_rule *rule,
12161223
12171224 if ((fsp -> flow_type & FLOW_EXT ) && fsp -> m_ext .vlan_tci ) {
12181225 rule -> filter .vlan_tci = ntohs (fsp -> h_ext .vlan_tci );
1226+ rule -> filter .vlan_tci_mask = ntohs (fsp -> m_ext .vlan_tci );
12191227 rule -> filter .match_flags |= IGC_FILTER_FLAG_VLAN_TCI ;
12201228 }
12211229
@@ -1241,7 +1249,7 @@ static void igc_ethtool_init_nfc_rule(struct igc_nfc_rule *rule,
12411249
12421250 /* VLAN etype matching */
12431251 if ((fsp -> flow_type & FLOW_EXT ) && fsp -> h_ext .vlan_etype ) {
1244- rule -> filter .vlan_etype = fsp -> h_ext .vlan_etype ;
1252+ rule -> filter .vlan_etype = ntohs ( fsp -> h_ext .vlan_etype ) ;
12451253 rule -> filter .match_flags |= IGC_FILTER_FLAG_VLAN_ETYPE ;
12461254 }
12471255
@@ -1253,11 +1261,19 @@ static void igc_ethtool_init_nfc_rule(struct igc_nfc_rule *rule,
12531261 memcpy (rule -> filter .user_mask , fsp -> m_ext .data , sizeof (fsp -> m_ext .data ));
12541262 }
12551263
1256- /* When multiple filter options or user data or vlan etype is set, use a
1257- * flex filter.
1264+ /* The i225/i226 has various different filters. Flex filters provide a
1265+ * way to match up to the first 128 bytes of a packet. Use them for:
1266+ * a) For specific user data
1267+ * b) For VLAN EtherType
1268+ * c) For full TCI match
1269+ * d) Or in case multiple filter criteria are set
1270+ *
1271+ * Otherwise, use the simple MAC, VLAN PRIO or EtherType filters.
12581272 */
12591273 if ((rule -> filter .match_flags & IGC_FILTER_FLAG_USER_DATA ) ||
12601274 (rule -> filter .match_flags & IGC_FILTER_FLAG_VLAN_ETYPE ) ||
1275+ ((rule -> filter .match_flags & IGC_FILTER_FLAG_VLAN_TCI ) &&
1276+ rule -> filter .vlan_tci_mask == ntohs (VLAN_TCI_FULL_MASK )) ||
12611277 (rule -> filter .match_flags & (rule -> filter .match_flags - 1 )))
12621278 rule -> flex = true;
12631279 else
@@ -1327,6 +1343,26 @@ static int igc_ethtool_add_nfc_rule(struct igc_adapter *adapter,
13271343 return - EINVAL ;
13281344 }
13291345
1346+ /* There are two ways to match the VLAN TCI:
1347+ * 1. Match on PCP field and use vlan prio filter for it
1348+ * 2. Match on complete TCI field and use flex filter for it
1349+ */
1350+ if ((fsp -> flow_type & FLOW_EXT ) &&
1351+ fsp -> m_ext .vlan_tci &&
1352+ fsp -> m_ext .vlan_tci != htons (VLAN_PRIO_MASK ) &&
1353+ fsp -> m_ext .vlan_tci != VLAN_TCI_FULL_MASK ) {
1354+ netdev_dbg (netdev , "VLAN mask not supported\n" );
1355+ return - EOPNOTSUPP ;
1356+ }
1357+
1358+ /* VLAN EtherType can only be matched by full mask. */
1359+ if ((fsp -> flow_type & FLOW_EXT ) &&
1360+ fsp -> m_ext .vlan_etype &&
1361+ fsp -> m_ext .vlan_etype != ETHER_TYPE_FULL_MASK ) {
1362+ netdev_dbg (netdev , "VLAN EtherType mask not supported\n" );
1363+ return - EOPNOTSUPP ;
1364+ }
1365+
13301366 if (fsp -> location >= IGC_MAX_RXNFC_RULES ) {
13311367 netdev_dbg (netdev , "Invalid location\n" );
13321368 return - EINVAL ;
@@ -1593,12 +1629,16 @@ static int igc_ethtool_get_eee(struct net_device *netdev,
15931629 struct igc_hw * hw = & adapter -> hw ;
15941630 u32 eeer ;
15951631
1596- if (hw -> dev_spec ._base .eee_enable )
1597- edata -> advertised_u32 =
1598- mmd_eee_adv_to_ethtool_adv_t (adapter -> eee_advert );
1632+ linkmode_set_bit (ETHTOOL_LINK_MODE_2500baseT_Full_BIT ,
1633+ edata -> supported );
1634+ linkmode_set_bit (ETHTOOL_LINK_MODE_1000baseT_Full_BIT ,
1635+ edata -> supported );
1636+ linkmode_set_bit (ETHTOOL_LINK_MODE_100baseT_Full_BIT ,
1637+ edata -> supported );
15991638
1600- * edata = adapter -> eee ;
1601- edata -> supported_u32 = SUPPORTED_Autoneg ;
1639+ if (hw -> dev_spec ._base .eee_enable )
1640+ mii_eee_cap1_mod_linkmode_t (edata -> advertised ,
1641+ adapter -> eee_advert );
16021642
16031643 eeer = rd32 (IGC_EEER );
16041644
@@ -1611,17 +1651,14 @@ static int igc_ethtool_get_eee(struct net_device *netdev,
16111651
16121652 edata -> eee_enabled = hw -> dev_spec ._base .eee_enable ;
16131653
1614- edata -> advertised_u32 = SUPPORTED_Autoneg ;
1615- edata -> lp_advertised_u32 = SUPPORTED_Autoneg ;
1616-
16171654 /* Report correct negotiated EEE status for devices that
16181655 * wrongly report EEE at half-duplex
16191656 */
16201657 if (adapter -> link_duplex == HALF_DUPLEX ) {
16211658 edata -> eee_enabled = false;
16221659 edata -> eee_active = false;
16231660 edata -> tx_lpi_enabled = false;
1624- edata -> advertised_u32 &= ~ edata -> advertised_u32 ;
1661+ linkmode_zero ( edata -> advertised ) ;
16251662 }
16261663
16271664 return 0 ;
@@ -1663,7 +1700,8 @@ static int igc_ethtool_set_eee(struct net_device *netdev,
16631700 return - EINVAL ;
16641701 }
16651702
1666- adapter -> eee_advert = ethtool_adv_to_mmd_eee_adv_t (edata -> advertised_u32 );
1703+ adapter -> eee_advert = linkmode_to_mii_eee_cap1_t (edata -> advertised );
1704+
16671705 if (hw -> dev_spec ._base .eee_enable != edata -> eee_enabled ) {
16681706 hw -> dev_spec ._base .eee_enable = edata -> eee_enabled ;
16691707 adapter -> flags |= IGC_FLAG_EEE ;
@@ -1678,21 +1716,6 @@ static int igc_ethtool_set_eee(struct net_device *netdev,
16781716 return 0 ;
16791717}
16801718
1681- static int igc_ethtool_begin (struct net_device * netdev )
1682- {
1683- struct igc_adapter * adapter = netdev_priv (netdev );
1684-
1685- pm_runtime_get_sync (& adapter -> pdev -> dev );
1686- return 0 ;
1687- }
1688-
1689- static void igc_ethtool_complete (struct net_device * netdev )
1690- {
1691- struct igc_adapter * adapter = netdev_priv (netdev );
1692-
1693- pm_runtime_put (& adapter -> pdev -> dev );
1694- }
1695-
16961719static int igc_ethtool_get_link_ksettings (struct net_device * netdev ,
16971720 struct ethtool_link_ksettings * cmd )
16981721{
@@ -1992,8 +2015,6 @@ static const struct ethtool_ops igc_ethtool_ops = {
19922015 .set_priv_flags = igc_ethtool_set_priv_flags ,
19932016 .get_eee = igc_ethtool_get_eee ,
19942017 .set_eee = igc_ethtool_set_eee ,
1995- .begin = igc_ethtool_begin ,
1996- .complete = igc_ethtool_complete ,
19972018 .get_link_ksettings = igc_ethtool_get_link_ksettings ,
19982019 .set_link_ksettings = igc_ethtool_set_link_ksettings ,
19992020 .self_test = igc_ethtool_diag_test ,
0 commit comments