@@ -1371,6 +1371,10 @@ static void i40evf_watchdog_task(struct work_struct *work)
1371
1371
}
1372
1372
goto watchdog_done ;
1373
1373
}
1374
+ if (adapter -> aq_required & I40EVF_FLAG_AQ_GET_CONFIG ) {
1375
+ i40evf_send_vf_config_msg (adapter );
1376
+ goto watchdog_done ;
1377
+ }
1374
1378
1375
1379
if (adapter -> aq_required & I40EVF_FLAG_AQ_DISABLE_QUEUES ) {
1376
1380
i40evf_disable_queues (adapter );
@@ -1606,7 +1610,8 @@ static void i40evf_reset_task(struct work_struct *work)
1606
1610
dev_info (& adapter -> pdev -> dev , "Failed to init adminq: %d\n" ,
1607
1611
err );
1608
1612
1609
- i40evf_map_queues (adapter );
1613
+ adapter -> aq_required = I40EVF_FLAG_AQ_GET_CONFIG ;
1614
+ adapter -> aq_required |= I40EVF_FLAG_AQ_MAP_VECTORS ;
1610
1615
1611
1616
/* re-add all MAC filters */
1612
1617
list_for_each_entry (f , & adapter -> mac_filter_list , list ) {
@@ -1616,7 +1621,7 @@ static void i40evf_reset_task(struct work_struct *work)
1616
1621
list_for_each_entry (f , & adapter -> vlan_filter_list , list ) {
1617
1622
f -> add = true;
1618
1623
}
1619
- adapter -> aq_required = I40EVF_FLAG_AQ_ADD_MAC_FILTER ;
1624
+ adapter -> aq_required | = I40EVF_FLAG_AQ_ADD_MAC_FILTER ;
1620
1625
adapter -> aq_required |= I40EVF_FLAG_AQ_ADD_VLAN_FILTER ;
1621
1626
clear_bit (__I40EVF_IN_CRITICAL_TASK , & adapter -> crit_section );
1622
1627
i40evf_misc_irq_enable (adapter );
@@ -1981,6 +1986,62 @@ static int i40evf_check_reset_complete(struct i40e_hw *hw)
1981
1986
return - EBUSY ;
1982
1987
}
1983
1988
1989
+ /**
1990
+ * i40evf_process_config - Process the config information we got from the PF
1991
+ * @adapter: board private structure
1992
+ *
1993
+ * Verify that we have a valid config struct, and set up our netdev features
1994
+ * and our VSI struct.
1995
+ **/
1996
+ int i40evf_process_config (struct i40evf_adapter * adapter )
1997
+ {
1998
+ struct net_device * netdev = adapter -> netdev ;
1999
+ int i ;
2000
+
2001
+ /* got VF config message back from PF, now we can parse it */
2002
+ for (i = 0 ; i < adapter -> vf_res -> num_vsis ; i ++ ) {
2003
+ if (adapter -> vf_res -> vsi_res [i ].vsi_type == I40E_VSI_SRIOV )
2004
+ adapter -> vsi_res = & adapter -> vf_res -> vsi_res [i ];
2005
+ }
2006
+ if (!adapter -> vsi_res ) {
2007
+ dev_err (& adapter -> pdev -> dev , "No LAN VSI found\n" );
2008
+ return - ENODEV ;
2009
+ }
2010
+
2011
+ if (adapter -> vf_res -> vf_offload_flags
2012
+ & I40E_VIRTCHNL_VF_OFFLOAD_VLAN ) {
2013
+ netdev -> vlan_features = netdev -> features ;
2014
+ netdev -> features |= NETIF_F_HW_VLAN_CTAG_TX |
2015
+ NETIF_F_HW_VLAN_CTAG_RX |
2016
+ NETIF_F_HW_VLAN_CTAG_FILTER ;
2017
+ }
2018
+ netdev -> features |= NETIF_F_HIGHDMA |
2019
+ NETIF_F_SG |
2020
+ NETIF_F_IP_CSUM |
2021
+ NETIF_F_SCTP_CSUM |
2022
+ NETIF_F_IPV6_CSUM |
2023
+ NETIF_F_TSO |
2024
+ NETIF_F_TSO6 |
2025
+ NETIF_F_RXCSUM |
2026
+ NETIF_F_GRO ;
2027
+
2028
+ /* copy netdev features into list of user selectable features */
2029
+ netdev -> hw_features |= netdev -> features ;
2030
+ netdev -> hw_features &= ~NETIF_F_RXCSUM ;
2031
+
2032
+ adapter -> vsi .id = adapter -> vsi_res -> vsi_id ;
2033
+
2034
+ adapter -> vsi .back = adapter ;
2035
+ adapter -> vsi .base_vector = 1 ;
2036
+ adapter -> vsi .work_limit = I40E_DEFAULT_IRQ_WORK ;
2037
+ adapter -> vsi .rx_itr_setting = (I40E_ITR_DYNAMIC |
2038
+ ITR_REG_TO_USEC (I40E_ITR_RX_DEF ));
2039
+ adapter -> vsi .tx_itr_setting = (I40E_ITR_DYNAMIC |
2040
+ ITR_REG_TO_USEC (I40E_ITR_TX_DEF ));
2041
+ adapter -> vsi .netdev = adapter -> netdev ;
2042
+ return 0 ;
2043
+ }
2044
+
1984
2045
/**
1985
2046
* i40evf_init_task - worker thread to perform delayed initialization
1986
2047
* @work: pointer to work_struct containing our data
@@ -2001,7 +2062,7 @@ static void i40evf_init_task(struct work_struct *work)
2001
2062
struct net_device * netdev = adapter -> netdev ;
2002
2063
struct i40e_hw * hw = & adapter -> hw ;
2003
2064
struct pci_dev * pdev = adapter -> pdev ;
2004
- int i , err , bufsz ;
2065
+ int err , bufsz ;
2005
2066
2006
2067
switch (adapter -> state ) {
2007
2068
case __I40EVF_STARTUP :
@@ -2087,42 +2148,15 @@ static void i40evf_init_task(struct work_struct *work)
2087
2148
default :
2088
2149
goto err_alloc ;
2089
2150
}
2090
- /* got VF config message back from PF, now we can parse it */
2091
- for (i = 0 ; i < adapter -> vf_res -> num_vsis ; i ++ ) {
2092
- if (adapter -> vf_res -> vsi_res [i ].vsi_type == I40E_VSI_SRIOV )
2093
- adapter -> vsi_res = & adapter -> vf_res -> vsi_res [i ];
2094
- }
2095
- if (!adapter -> vsi_res ) {
2096
- dev_err (& pdev -> dev , "No LAN VSI found\n" );
2151
+ if (i40evf_process_config (adapter ))
2097
2152
goto err_alloc ;
2098
- }
2153
+ adapter -> current_op = I40E_VIRTCHNL_OP_UNKNOWN ;
2099
2154
2100
2155
adapter -> flags |= I40EVF_FLAG_RX_CSUM_ENABLED ;
2101
2156
2102
2157
netdev -> netdev_ops = & i40evf_netdev_ops ;
2103
2158
i40evf_set_ethtool_ops (netdev );
2104
2159
netdev -> watchdog_timeo = 5 * HZ ;
2105
- netdev -> features |= NETIF_F_HIGHDMA |
2106
- NETIF_F_SG |
2107
- NETIF_F_IP_CSUM |
2108
- NETIF_F_SCTP_CSUM |
2109
- NETIF_F_IPV6_CSUM |
2110
- NETIF_F_TSO |
2111
- NETIF_F_TSO6 |
2112
- NETIF_F_RXCSUM |
2113
- NETIF_F_GRO ;
2114
-
2115
- if (adapter -> vf_res -> vf_offload_flags
2116
- & I40E_VIRTCHNL_VF_OFFLOAD_VLAN ) {
2117
- netdev -> vlan_features = netdev -> features ;
2118
- netdev -> features |= NETIF_F_HW_VLAN_CTAG_TX |
2119
- NETIF_F_HW_VLAN_CTAG_RX |
2120
- NETIF_F_HW_VLAN_CTAG_FILTER ;
2121
- }
2122
-
2123
- /* copy netdev features into list of user selectable features */
2124
- netdev -> hw_features |= netdev -> features ;
2125
- netdev -> hw_features &= ~NETIF_F_RXCSUM ;
2126
2160
2127
2161
if (!is_valid_ether_addr (adapter -> hw .mac .addr )) {
2128
2162
dev_info (& pdev -> dev , "Invalid MAC address %pM, using random\n" ,
@@ -2153,17 +2187,6 @@ static void i40evf_init_task(struct work_struct *work)
2153
2187
2154
2188
netif_carrier_off (netdev );
2155
2189
2156
- adapter -> vsi .id = adapter -> vsi_res -> vsi_id ;
2157
- adapter -> vsi .seid = adapter -> vsi_res -> vsi_id ; /* dummy */
2158
- adapter -> vsi .back = adapter ;
2159
- adapter -> vsi .base_vector = 1 ;
2160
- adapter -> vsi .work_limit = I40E_DEFAULT_IRQ_WORK ;
2161
- adapter -> vsi .rx_itr_setting = (I40E_ITR_DYNAMIC |
2162
- ITR_REG_TO_USEC (I40E_ITR_RX_DEF ));
2163
- adapter -> vsi .tx_itr_setting = (I40E_ITR_DYNAMIC |
2164
- ITR_REG_TO_USEC (I40E_ITR_TX_DEF ));
2165
- adapter -> vsi .netdev = adapter -> netdev ;
2166
-
2167
2190
if (!adapter -> netdev_registered ) {
2168
2191
err = register_netdev (netdev );
2169
2192
if (err )
0 commit comments