Ver código fonte

rndis_host: reduce MTU instead of refusing to talk to devices with low max packet size

This patch makes the host RNDIS driver talk to RNDIS devices with an MTU
less than 1.5k, instead of refusing to talk to such a device.

Signed-Off-by: Thomas Sailer <t.sailer@alumni.ethz.ch>
Acked-by: David Brownell <dbrownell@users.sourceforge.net>

--

Hi Jeff,
are you the right person to send this to?
Nobody else seems to be wanting to forward this to Linus...

Thanks,
Tom

Signed-off-by: Jeff Garzik <jeff@garzik.org>
Thomas Sailer 17 anos atrás
pai
commit
500d2c2f7b
1 arquivos alterados com 13 adições e 5 exclusões
  1. 13 5
      drivers/net/usb/rndis_host.c

+ 13 - 5
drivers/net/usb/rndis_host.c

@@ -512,11 +512,19 @@ static int rndis_bind(struct usbnet *dev, struct usb_interface *intf)
 	}
 	}
 	tmp = le32_to_cpu(u.init_c->max_transfer_size);
 	tmp = le32_to_cpu(u.init_c->max_transfer_size);
 	if (tmp < dev->hard_mtu) {
 	if (tmp < dev->hard_mtu) {
-		dev_err(&intf->dev,
-			"dev can't take %u byte packets (max %u)\n",
-			dev->hard_mtu, tmp);
-		retval = -EINVAL;
-		goto fail_and_release;
+		if (tmp <= net->hard_header_len) {
+			dev_err(&intf->dev,
+				"dev can't take %u byte packets (max %u)\n",
+				dev->hard_mtu, tmp);
+			retval = -EINVAL;
+			goto fail_and_release;
+		}
+		dev->hard_mtu = tmp;
+		net->mtu = dev->hard_mtu - net->hard_header_len;
+		dev_warn(&intf->dev,
+			 "dev can't take %u byte packets (max %u), "
+			 "adjusting MTU to %u\n",
+			 dev->hard_mtu, tmp, net->mtu);
 	}
 	}
 
 
 	/* REVISIT:  peripheral "alignment" request is ignored ... */
 	/* REVISIT:  peripheral "alignment" request is ignored ... */