Commit 78d61022 authored by Niklas Söderlund's avatar Niklas Söderlund Committed by David S. Miller

sh_eth: add support for changing MTU

The hardware supports the MTU to be changed and the driver it self is
somewhat prepared to support this. This patch hooks up the callbacks to
be able to change the MTU from user-space.
Signed-off-by: default avatarNiklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
Acked-by: default avatarSergei Shtylyov <sergei.shtylyov@cogentembedded.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent f1c9eed7
...@@ -2558,6 +2558,17 @@ static int sh_eth_do_ioctl(struct net_device *ndev, struct ifreq *rq, int cmd) ...@@ -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); 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 */ /* 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, static void *sh_eth_tsu_get_post_reg_offset(struct sh_eth_private *mdp,
int entry) int entry)
...@@ -3029,6 +3040,7 @@ static const struct net_device_ops sh_eth_netdev_ops = { ...@@ -3029,6 +3040,7 @@ static const struct net_device_ops sh_eth_netdev_ops = {
.ndo_set_rx_mode = sh_eth_set_rx_mode, .ndo_set_rx_mode = sh_eth_set_rx_mode,
.ndo_tx_timeout = sh_eth_tx_timeout, .ndo_tx_timeout = sh_eth_tx_timeout,
.ndo_do_ioctl = sh_eth_do_ioctl, .ndo_do_ioctl = sh_eth_do_ioctl,
.ndo_change_mtu = sh_eth_change_mtu,
.ndo_validate_addr = eth_validate_addr, .ndo_validate_addr = eth_validate_addr,
.ndo_set_mac_address = eth_mac_addr, .ndo_set_mac_address = eth_mac_addr,
}; };
...@@ -3043,6 +3055,7 @@ static const struct net_device_ops sh_eth_netdev_ops_tsu = { ...@@ -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_vlan_rx_kill_vid = sh_eth_vlan_rx_kill_vid,
.ndo_tx_timeout = sh_eth_tx_timeout, .ndo_tx_timeout = sh_eth_tx_timeout,
.ndo_do_ioctl = sh_eth_do_ioctl, .ndo_do_ioctl = sh_eth_do_ioctl,
.ndo_change_mtu = sh_eth_change_mtu,
.ndo_validate_addr = eth_validate_addr, .ndo_validate_addr = eth_validate_addr,
.ndo_set_mac_address = eth_mac_addr, .ndo_set_mac_address = eth_mac_addr,
}; };
...@@ -3171,6 +3184,13 @@ static int sh_eth_drv_probe(struct platform_device *pdev) ...@@ -3171,6 +3184,13 @@ static int sh_eth_drv_probe(struct platform_device *pdev)
} }
sh_eth_set_default_cpu_data(mdp->cd); 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 */ /* set function */
if (mdp->cd->tsu) if (mdp->cd->tsu)
ndev->netdev_ops = &sh_eth_netdev_ops_tsu; ndev->netdev_ops = &sh_eth_netdev_ops_tsu;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment