@@ -2047,76 +2047,52 @@ static int enic_stop(struct net_device *netdev)
2047
2047
return 0 ;
2048
2048
}
2049
2049
2050
+ static int _enic_change_mtu (struct net_device * netdev , int new_mtu )
2051
+ {
2052
+ bool running = netif_running (netdev );
2053
+ int err = 0 ;
2054
+
2055
+ ASSERT_RTNL ();
2056
+ if (running ) {
2057
+ err = enic_stop (netdev );
2058
+ if (err )
2059
+ return err ;
2060
+ }
2061
+
2062
+ netdev -> mtu = new_mtu ;
2063
+
2064
+ if (running ) {
2065
+ err = enic_open (netdev );
2066
+ if (err )
2067
+ return err ;
2068
+ }
2069
+
2070
+ return 0 ;
2071
+ }
2072
+
2050
2073
static int enic_change_mtu (struct net_device * netdev , int new_mtu )
2051
2074
{
2052
2075
struct enic * enic = netdev_priv (netdev );
2053
- int running = netif_running (netdev );
2054
2076
2055
2077
if (enic_is_dynamic (enic ) || enic_is_sriov_vf (enic ))
2056
2078
return - EOPNOTSUPP ;
2057
2079
2058
- if (running )
2059
- enic_stop (netdev );
2060
-
2061
- netdev -> mtu = new_mtu ;
2062
-
2063
2080
if (netdev -> mtu > enic -> port_mtu )
2064
2081
netdev_warn (netdev ,
2065
- "interface MTU (%d) set higher than port MTU (%d)\n" ,
2066
- netdev -> mtu , enic -> port_mtu );
2082
+ "interface MTU (%d) set higher than port MTU (%d)\n" ,
2083
+ netdev -> mtu , enic -> port_mtu );
2067
2084
2068
- if (running )
2069
- enic_open (netdev );
2070
-
2071
- return 0 ;
2085
+ return _enic_change_mtu (netdev , new_mtu );
2072
2086
}
2073
2087
2074
2088
static void enic_change_mtu_work (struct work_struct * work )
2075
2089
{
2076
2090
struct enic * enic = container_of (work , struct enic , change_mtu_work );
2077
2091
struct net_device * netdev = enic -> netdev ;
2078
2092
int new_mtu = vnic_dev_mtu (enic -> vdev );
2079
- int err ;
2080
- unsigned int i ;
2081
-
2082
- new_mtu = max_t (int , ENIC_MIN_MTU , min_t (int , ENIC_MAX_MTU , new_mtu ));
2083
2093
2084
2094
rtnl_lock ();
2085
-
2086
- /* Stop RQ */
2087
- del_timer_sync (& enic -> notify_timer );
2088
-
2089
- for (i = 0 ; i < enic -> rq_count ; i ++ )
2090
- napi_disable (& enic -> napi [i ]);
2091
-
2092
- vnic_intr_mask (& enic -> intr [0 ]);
2093
- enic_synchronize_irqs (enic );
2094
- err = vnic_rq_disable (& enic -> rq [0 ]);
2095
- if (err ) {
2096
- rtnl_unlock ();
2097
- netdev_err (netdev , "Unable to disable RQ.\n" );
2098
- return ;
2099
- }
2100
- vnic_rq_clean (& enic -> rq [0 ], enic_free_rq_buf );
2101
- vnic_cq_clean (& enic -> cq [0 ]);
2102
- vnic_intr_clean (& enic -> intr [0 ]);
2103
-
2104
- /* Fill RQ with new_mtu-sized buffers */
2105
- netdev -> mtu = new_mtu ;
2106
- vnic_rq_fill (& enic -> rq [0 ], enic_rq_alloc_buf );
2107
- /* Need at least one buffer on ring to get going */
2108
- if (vnic_rq_desc_used (& enic -> rq [0 ]) == 0 ) {
2109
- rtnl_unlock ();
2110
- netdev_err (netdev , "Unable to alloc receive buffers.\n" );
2111
- return ;
2112
- }
2113
-
2114
- /* Start RQ */
2115
- vnic_rq_enable (& enic -> rq [0 ]);
2116
- napi_enable (& enic -> napi [0 ]);
2117
- vnic_intr_unmask (& enic -> intr [0 ]);
2118
- enic_notify_timer_start (enic );
2119
-
2095
+ (void )_enic_change_mtu (netdev , new_mtu );
2120
2096
rtnl_unlock ();
2121
2097
2122
2098
netdev_info (netdev , "interface MTU set as %d\n" , netdev -> mtu );
0 commit comments