Skip to content

Commit ab123fe

Browse files
Govindarajulu Varadarajandavem330
authored andcommitted
enic: handle mtu change for vf properly
When driver gets notification for mtu change, driver does not handle it for all RQs. It handles only RQ[0]. Fix is to use enic_change_mtu() interface to change mtu for vf. Signed-off-by: Govindarajulu Varadarajan <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 136f55f commit ab123fe

File tree

1 file changed

+27
-51
lines changed

1 file changed

+27
-51
lines changed

drivers/net/ethernet/cisco/enic/enic_main.c

Lines changed: 27 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
20502073
static 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

20742088
static 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

Comments
 (0)