@@ -2047,76 +2047,52 @@ static int enic_stop(struct net_device *netdev)
20472047 return 0 ;
20482048}
20492049
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+
20502073static int enic_change_mtu (struct net_device * netdev , int new_mtu )
20512074{
20522075 struct enic * enic = netdev_priv (netdev );
2053- int running = netif_running (netdev );
20542076
20552077 if (enic_is_dynamic (enic ) || enic_is_sriov_vf (enic ))
20562078 return - EOPNOTSUPP ;
20572079
2058- if (running )
2059- enic_stop (netdev );
2060-
2061- netdev -> mtu = new_mtu ;
2062-
20632080 if (netdev -> mtu > enic -> port_mtu )
20642081 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 );
20672084
2068- if (running )
2069- enic_open (netdev );
2070-
2071- return 0 ;
2085+ return _enic_change_mtu (netdev , new_mtu );
20722086}
20732087
20742088static void enic_change_mtu_work (struct work_struct * work )
20752089{
20762090 struct enic * enic = container_of (work , struct enic , change_mtu_work );
20772091 struct net_device * netdev = enic -> netdev ;
20782092 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 ));
20832093
20842094 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 );
21202096 rtnl_unlock ();
21212097
21222098 netdev_info (netdev , "interface MTU set as %d\n" , netdev -> mtu );
0 commit comments