@@ -1998,54 +1998,128 @@ static void wx_restore_vlan(struct wx *wx)
19981998 wx_vlan_rx_add_vid (wx -> netdev , htons (ETH_P_8021Q ), vid );
19991999}
20002000
2001- static void wx_store_reta (struct wx * wx )
2001+ u32 wx_rss_indir_tbl_entries (struct wx * wx )
20022002{
2003+ if (test_bit (WX_FLAG_SRIOV_ENABLED , wx -> flags ))
2004+ return 64 ;
2005+ else
2006+ return 128 ;
2007+ }
2008+
2009+ void wx_store_reta (struct wx * wx )
2010+ {
2011+ u32 reta_entries = wx_rss_indir_tbl_entries (wx );
20032012 u8 * indir_tbl = wx -> rss_indir_tbl ;
20042013 u32 reta = 0 ;
20052014 u32 i ;
20062015
20072016 /* Fill out the redirection table as follows:
20082017 * - 8 bit wide entries containing 4 bit RSS index
20092018 */
2010- for (i = 0 ; i < WX_MAX_RETA_ENTRIES ; i ++ ) {
2019+ for (i = 0 ; i < reta_entries ; i ++ ) {
20112020 reta |= indir_tbl [i ] << (i & 0x3 ) * 8 ;
20122021 if ((i & 3 ) == 3 ) {
2013- wr32 (wx , WX_RDB_RSSTBL (i >> 2 ), reta );
2022+ if (test_bit (WX_FLAG_SRIOV_ENABLED , wx -> flags ) &&
2023+ test_bit (WX_FLAG_MULTI_64_FUNC , wx -> flags ))
2024+ wr32 (wx , WX_RDB_VMRSSTBL (i >> 2 , wx -> num_vfs ), reta );
2025+ else
2026+ wr32 (wx , WX_RDB_RSSTBL (i >> 2 ), reta );
20142027 reta = 0 ;
20152028 }
20162029 }
20172030}
20182031
2019- static void wx_setup_reta (struct wx * wx )
2032+ void wx_store_rsskey (struct wx * wx )
20202033{
2021- u16 rss_i = wx -> ring_feature [RING_F_RSS ].indices ;
2022- u32 random_key_size = WX_RSS_KEY_SIZE / 4 ;
2023- u32 i , j ;
2034+ u32 key_size = WX_RSS_KEY_SIZE / 4 ;
2035+ u32 i ;
20242036
2025- if (test_bit (WX_FLAG_SRIOV_ENABLED , wx -> flags )) {
2026- if (wx -> mac .type == wx_mac_em )
2027- rss_i = 1 ;
2028- else
2029- rss_i = rss_i < 4 ? 4 : rss_i ;
2037+ if (test_bit (WX_FLAG_SRIOV_ENABLED , wx -> flags ) &&
2038+ test_bit (WX_FLAG_MULTI_64_FUNC , wx -> flags )) {
2039+ for (i = 0 ; i < key_size ; i ++ )
2040+ wr32 (wx , WX_RDB_VMRSSRK (i , wx -> num_vfs ),
2041+ wx -> rss_key [i ]);
2042+ } else {
2043+ for (i = 0 ; i < key_size ; i ++ )
2044+ wr32 (wx , WX_RDB_RSSRK (i ), wx -> rss_key [i ]);
20302045 }
2046+ }
20312047
2048+ static void wx_setup_reta (struct wx * wx )
2049+ {
20322050 /* Fill out hash function seeds */
2033- for (i = 0 ; i < random_key_size ; i ++ )
2034- wr32 (wx , WX_RDB_RSSRK (i ), wx -> rss_key [i ]);
2051+ wx_store_rsskey (wx );
20352052
20362053 /* Fill out redirection table */
2037- memset (wx -> rss_indir_tbl , 0 , sizeof (wx -> rss_indir_tbl ));
2054+ if (!netif_is_rxfh_configured (wx -> netdev )) {
2055+ u16 rss_i = wx -> ring_feature [RING_F_RSS ].indices ;
2056+ u32 reta_entries = wx_rss_indir_tbl_entries (wx );
2057+ u32 i , j ;
20382058
2039- for (i = 0 , j = 0 ; i < WX_MAX_RETA_ENTRIES ; i ++ , j ++ ) {
2040- if (j == rss_i )
2041- j = 0 ;
2059+ memset (wx -> rss_indir_tbl , 0 , sizeof (wx -> rss_indir_tbl ));
20422060
2043- wx -> rss_indir_tbl [i ] = j ;
2061+ if (test_bit (WX_FLAG_SRIOV_ENABLED , wx -> flags )) {
2062+ if (test_bit (WX_FLAG_MULTI_64_FUNC , wx -> flags ))
2063+ rss_i = rss_i < 2 ? 2 : rss_i ;
2064+ else
2065+ rss_i = 1 ;
2066+ }
2067+
2068+ for (i = 0 , j = 0 ; i < reta_entries ; i ++ , j ++ ) {
2069+ if (j == rss_i )
2070+ j = 0 ;
2071+
2072+ wx -> rss_indir_tbl [i ] = j ;
2073+ }
20442074 }
20452075
20462076 wx_store_reta (wx );
20472077}
20482078
2079+ void wx_config_rss_field (struct wx * wx )
2080+ {
2081+ u32 rss_field ;
2082+
2083+ if (test_bit (WX_FLAG_SRIOV_ENABLED , wx -> flags ) &&
2084+ test_bit (WX_FLAG_MULTI_64_FUNC , wx -> flags )) {
2085+ rss_field = rd32 (wx , WX_RDB_PL_CFG (wx -> num_vfs ));
2086+ rss_field &= ~WX_RDB_PL_CFG_RSS_MASK ;
2087+ rss_field |= FIELD_PREP (WX_RDB_PL_CFG_RSS_MASK , wx -> rss_flags );
2088+ wr32 (wx , WX_RDB_PL_CFG (wx -> num_vfs ), rss_field );
2089+
2090+ /* Enable global RSS and multiple RSS to make the RSS
2091+ * field of each pool take effect.
2092+ */
2093+ wr32m (wx , WX_RDB_RA_CTL ,
2094+ WX_RDB_RA_CTL_MULTI_RSS | WX_RDB_RA_CTL_RSS_EN ,
2095+ WX_RDB_RA_CTL_MULTI_RSS | WX_RDB_RA_CTL_RSS_EN );
2096+ } else {
2097+ rss_field = rd32 (wx , WX_RDB_RA_CTL );
2098+ rss_field &= ~WX_RDB_RA_CTL_RSS_MASK ;
2099+ rss_field |= FIELD_PREP (WX_RDB_RA_CTL_RSS_MASK , wx -> rss_flags );
2100+ wr32 (wx , WX_RDB_RA_CTL , rss_field );
2101+ }
2102+ }
2103+
2104+ void wx_enable_rss (struct wx * wx , bool enable )
2105+ {
2106+ if (test_bit (WX_FLAG_SRIOV_ENABLED , wx -> flags ) &&
2107+ test_bit (WX_FLAG_MULTI_64_FUNC , wx -> flags )) {
2108+ if (enable )
2109+ wr32m (wx , WX_RDB_PL_CFG (wx -> num_vfs ),
2110+ WX_RDB_PL_CFG_RSS_EN , WX_RDB_PL_CFG_RSS_EN );
2111+ else
2112+ wr32m (wx , WX_RDB_PL_CFG (wx -> num_vfs ),
2113+ WX_RDB_PL_CFG_RSS_EN , 0 );
2114+ } else {
2115+ if (enable )
2116+ wr32m (wx , WX_RDB_RA_CTL , WX_RDB_RA_CTL_RSS_EN ,
2117+ WX_RDB_RA_CTL_RSS_EN );
2118+ else
2119+ wr32m (wx , WX_RDB_RA_CTL , WX_RDB_RA_CTL_RSS_EN , 0 );
2120+ }
2121+ }
2122+
20492123#define WX_RDB_RSS_PL_2 FIELD_PREP(GENMASK(31, 29), 1)
20502124#define WX_RDB_RSS_PL_4 FIELD_PREP(GENMASK(31, 29), 2)
20512125static void wx_setup_psrtype (struct wx * wx )
@@ -2076,27 +2150,12 @@ static void wx_setup_psrtype(struct wx *wx)
20762150
20772151static void wx_setup_mrqc (struct wx * wx )
20782152{
2079- u32 rss_field = 0 ;
2080-
20812153 /* Disable indicating checksum in descriptor, enables RSS hash */
20822154 wr32m (wx , WX_PSR_CTL , WX_PSR_CTL_PCSD , WX_PSR_CTL_PCSD );
20832155
2084- /* Perform hash on these packet types */
2085- rss_field = WX_RDB_RA_CTL_RSS_IPV4 |
2086- WX_RDB_RA_CTL_RSS_IPV4_TCP |
2087- WX_RDB_RA_CTL_RSS_IPV4_UDP |
2088- WX_RDB_RA_CTL_RSS_IPV6 |
2089- WX_RDB_RA_CTL_RSS_IPV6_TCP |
2090- WX_RDB_RA_CTL_RSS_IPV6_UDP ;
2091-
2092- netdev_rss_key_fill (wx -> rss_key , sizeof (wx -> rss_key ));
2093-
2156+ wx_config_rss_field (wx );
2157+ wx_enable_rss (wx , wx -> rss_enabled );
20942158 wx_setup_reta (wx );
2095-
2096- if (wx -> rss_enabled )
2097- rss_field |= WX_RDB_RA_CTL_RSS_EN ;
2098-
2099- wr32 (wx , WX_RDB_RA_CTL , rss_field );
21002159}
21012160
21022161/**
@@ -2389,6 +2448,8 @@ int wx_sw_init(struct wx *wx)
23892448 wx_err (wx , "rss key allocation failed\n" );
23902449 return err ;
23912450 }
2451+ wx -> rss_flags = WX_RSS_FIELD_IPV4 | WX_RSS_FIELD_IPV4_TCP |
2452+ WX_RSS_FIELD_IPV6 | WX_RSS_FIELD_IPV6_TCP ;
23922453
23932454 wx -> mac_table = kcalloc (wx -> mac .num_rar_entries ,
23942455 sizeof (struct wx_mac_addr ),
0 commit comments