aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/ieee1394/eth1394.c34
1 files changed, 19 insertions, 15 deletions
diff --git a/drivers/ieee1394/eth1394.c b/drivers/ieee1394/eth1394.c
index 8f19f5b77a5..aee82922e6b 100644
--- a/drivers/ieee1394/eth1394.c
+++ b/drivers/ieee1394/eth1394.c
@@ -136,9 +136,6 @@ static const int hdr_type_len[] = {
sizeof(struct eth1394_sf_hdr)
};
-/* For now, this needs to be 1500, so that XP works with us */
-#define ETH1394_DATA_LEN ETH_DATA_LEN
-
static const u16 eth1394_speedto_maxpayload[] = {
/* S100, S200, S400, S800, S1600, S3200 */
512, 1024, 2048, 4096, 4096, 4096
@@ -262,17 +259,27 @@ static void ether1394_tx_timeout(struct net_device *dev)
ether1394_host_reset(host);
}
+static inline int ether1394_max_mtu(struct hpsb_host* host)
+{
+ return (1 << (host->csr.max_rec + 1))
+ - sizeof(union eth1394_hdr) - ETHER1394_GASP_OVERHEAD;
+}
+
static int ether1394_change_mtu(struct net_device *dev, int new_mtu)
{
- int max_rec =
- ((struct eth1394_priv *)netdev_priv(dev))->host->csr.max_rec;
+ int max_mtu;
- if (new_mtu < 68 ||
- new_mtu > ETH1394_DATA_LEN ||
- new_mtu > (1 << (max_rec + 1)) - sizeof(union eth1394_hdr) -
- ETHER1394_GASP_OVERHEAD)
+ if (new_mtu < 68)
return -EINVAL;
+ max_mtu = ether1394_max_mtu(
+ ((struct eth1394_priv *)netdev_priv(dev))->host);
+ if (new_mtu > max_mtu) {
+ ETH1394_PRINT(KERN_INFO, dev->name,
+ "Local node constrains MTU to %d\n", max_mtu);
+ return -ERANGE;
+ }
+
dev->mtu = new_mtu;
return 0;
}
@@ -476,13 +483,10 @@ static void ether1394_reset_priv(struct net_device *dev, int set_mtu)
max_speed = host->speed[i];
priv->bc_sspd = max_speed;
- /* We'll use our maximum payload as the default MTU */
if (set_mtu) {
- int max_payload = 1 << (host->csr.max_rec + 1);
-
- dev->mtu = min(ETH1394_DATA_LEN,
- (int)(max_payload - sizeof(union eth1394_hdr) -
- ETHER1394_GASP_OVERHEAD));
+ /* Use the RFC 2734 default 1500 octets or the maximum payload
+ * as initial MTU */
+ dev->mtu = min(1500, ether1394_max_mtu(host));
/* Set our hardware address while we're at it */
memcpy(dev->dev_addr, &guid, sizeof(u64));