|
|
@@ -2558,6 +2558,17 @@ static int sh_eth_do_ioctl(struct net_device *ndev, struct ifreq *rq, int cmd)
|
|
|
return phy_mii_ioctl(phydev, rq, cmd);
|
|
|
}
|
|
|
|
|
|
+static int sh_eth_change_mtu(struct net_device *ndev, int new_mtu)
|
|
|
+{
|
|
|
+ if (netif_running(ndev))
|
|
|
+ return -EBUSY;
|
|
|
+
|
|
|
+ ndev->mtu = new_mtu;
|
|
|
+ netdev_update_features(ndev);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
/* For TSU_POSTn. Please refer to the manual about this (strange) bitfields */
|
|
|
static void *sh_eth_tsu_get_post_reg_offset(struct sh_eth_private *mdp,
|
|
|
int entry)
|
|
|
@@ -3029,6 +3040,7 @@ static const struct net_device_ops sh_eth_netdev_ops = {
|
|
|
.ndo_set_rx_mode = sh_eth_set_rx_mode,
|
|
|
.ndo_tx_timeout = sh_eth_tx_timeout,
|
|
|
.ndo_do_ioctl = sh_eth_do_ioctl,
|
|
|
+ .ndo_change_mtu = sh_eth_change_mtu,
|
|
|
.ndo_validate_addr = eth_validate_addr,
|
|
|
.ndo_set_mac_address = eth_mac_addr,
|
|
|
};
|
|
|
@@ -3043,6 +3055,7 @@ static const struct net_device_ops sh_eth_netdev_ops_tsu = {
|
|
|
.ndo_vlan_rx_kill_vid = sh_eth_vlan_rx_kill_vid,
|
|
|
.ndo_tx_timeout = sh_eth_tx_timeout,
|
|
|
.ndo_do_ioctl = sh_eth_do_ioctl,
|
|
|
+ .ndo_change_mtu = sh_eth_change_mtu,
|
|
|
.ndo_validate_addr = eth_validate_addr,
|
|
|
.ndo_set_mac_address = eth_mac_addr,
|
|
|
};
|
|
|
@@ -3171,6 +3184,13 @@ static int sh_eth_drv_probe(struct platform_device *pdev)
|
|
|
}
|
|
|
sh_eth_set_default_cpu_data(mdp->cd);
|
|
|
|
|
|
+ /* User's manual states max MTU should be 2048 but due to the
|
|
|
+ * alignment calculations in sh_eth_ring_init() the practical
|
|
|
+ * MTU is a bit less. Maybe this can be optimized some more.
|
|
|
+ */
|
|
|
+ ndev->max_mtu = 2000 - (ETH_HLEN + VLAN_HLEN + ETH_FCS_LEN);
|
|
|
+ ndev->min_mtu = ETH_MIN_MTU;
|
|
|
+
|
|
|
/* set function */
|
|
|
if (mdp->cd->tsu)
|
|
|
ndev->netdev_ops = &sh_eth_netdev_ops_tsu;
|