Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 20f01703 authored by Eric Dumazet's avatar Eric Dumazet Committed by David S. Miller
Browse files

usbnet: do not pretend to support SG/TSO



usbnet doesn't support yet SG, so drivers should not advertise SG or TSO
capabilities, as they allow TCP stack to build large TSO packets that
need to be linearized and might use order-5 pages.

This adds an extra copy overhead and possible allocation failures.

Current code ignore skb_linearize() return code so crashes are even
possible.

Best is to not pretend SG/TSO is supported, and add this again when/if
usbnet really supports SG for devices who could get a performance gain.

Based on a prior patch from Freddy Xin <freddy@asix.com.tw>

Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 1df86b4c
Loading
Loading
Loading
Loading
+4 −5
Original line number Original line Diff line number Diff line
@@ -1029,10 +1029,10 @@ static int ax88179_bind(struct usbnet *dev, struct usb_interface *intf)
	dev->mii.supports_gmii = 1;
	dev->mii.supports_gmii = 1;


	dev->net->features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
	dev->net->features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
			      NETIF_F_RXCSUM | NETIF_F_SG | NETIF_F_TSO;
			      NETIF_F_RXCSUM;


	dev->net->hw_features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
	dev->net->hw_features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
				 NETIF_F_RXCSUM | NETIF_F_SG | NETIF_F_TSO;
				 NETIF_F_RXCSUM;


	/* Enable checksum offload */
	/* Enable checksum offload */
	*tmp = AX_RXCOE_IP | AX_RXCOE_TCP | AX_RXCOE_UDP |
	*tmp = AX_RXCOE_IP | AX_RXCOE_TCP | AX_RXCOE_UDP |
@@ -1173,7 +1173,6 @@ ax88179_tx_fixup(struct usbnet *dev, struct sk_buff *skb, gfp_t flags)
	if (((skb->len + 8) % frame_size) == 0)
	if (((skb->len + 8) % frame_size) == 0)
		tx_hdr2 |= 0x80008000;	/* Enable padding */
		tx_hdr2 |= 0x80008000;	/* Enable padding */


	skb_linearize(skb);
	headroom = skb_headroom(skb);
	headroom = skb_headroom(skb);
	tailroom = skb_tailroom(skb);
	tailroom = skb_tailroom(skb);


@@ -1317,10 +1316,10 @@ static int ax88179_reset(struct usbnet *dev)
			  1, 1, tmp);
			  1, 1, tmp);


	dev->net->features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
	dev->net->features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
			      NETIF_F_RXCSUM | NETIF_F_SG | NETIF_F_TSO;
			      NETIF_F_RXCSUM;


	dev->net->hw_features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
	dev->net->hw_features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
				 NETIF_F_RXCSUM | NETIF_F_SG | NETIF_F_TSO;
				 NETIF_F_RXCSUM;


	/* Enable checksum offload */
	/* Enable checksum offload */
	*tmp = AX_RXCOE_IP | AX_RXCOE_TCP | AX_RXCOE_UDP |
	*tmp = AX_RXCOE_IP | AX_RXCOE_TCP | AX_RXCOE_UDP |
+3 −9
Original line number Original line Diff line number Diff line
@@ -45,7 +45,6 @@
#define EEPROM_MAC_OFFSET		(0x01)
#define EEPROM_MAC_OFFSET		(0x01)
#define DEFAULT_TX_CSUM_ENABLE		(true)
#define DEFAULT_TX_CSUM_ENABLE		(true)
#define DEFAULT_RX_CSUM_ENABLE		(true)
#define DEFAULT_RX_CSUM_ENABLE		(true)
#define DEFAULT_TSO_ENABLE		(true)
#define SMSC75XX_INTERNAL_PHY_ID	(1)
#define SMSC75XX_INTERNAL_PHY_ID	(1)
#define SMSC75XX_TX_OVERHEAD		(8)
#define SMSC75XX_TX_OVERHEAD		(8)
#define MAX_RX_FIFO_SIZE		(20 * 1024)
#define MAX_RX_FIFO_SIZE		(20 * 1024)
@@ -1410,17 +1409,14 @@ static int smsc75xx_bind(struct usbnet *dev, struct usb_interface *intf)


	INIT_WORK(&pdata->set_multicast, smsc75xx_deferred_multicast_write);
	INIT_WORK(&pdata->set_multicast, smsc75xx_deferred_multicast_write);


	if (DEFAULT_TX_CSUM_ENABLE) {
	if (DEFAULT_TX_CSUM_ENABLE)
		dev->net->features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;
		dev->net->features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;
		if (DEFAULT_TSO_ENABLE)

			dev->net->features |= NETIF_F_SG |
				NETIF_F_TSO | NETIF_F_TSO6;
	}
	if (DEFAULT_RX_CSUM_ENABLE)
	if (DEFAULT_RX_CSUM_ENABLE)
		dev->net->features |= NETIF_F_RXCSUM;
		dev->net->features |= NETIF_F_RXCSUM;


	dev->net->hw_features = NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
	dev->net->hw_features = NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
		NETIF_F_SG | NETIF_F_TSO | NETIF_F_TSO6 | NETIF_F_RXCSUM;
				NETIF_F_RXCSUM;


	ret = smsc75xx_wait_ready(dev, 0);
	ret = smsc75xx_wait_ready(dev, 0);
	if (ret < 0) {
	if (ret < 0) {
@@ -2200,8 +2196,6 @@ static struct sk_buff *smsc75xx_tx_fixup(struct usbnet *dev,
{
{
	u32 tx_cmd_a, tx_cmd_b;
	u32 tx_cmd_a, tx_cmd_b;


	skb_linearize(skb);

	if (skb_headroom(skb) < SMSC75XX_TX_OVERHEAD) {
	if (skb_headroom(skb) < SMSC75XX_TX_OVERHEAD) {
		struct sk_buff *skb2 =
		struct sk_buff *skb2 =
			skb_copy_expand(skb, SMSC75XX_TX_OVERHEAD, 0, flags);
			skb_copy_expand(skb, SMSC75XX_TX_OVERHEAD, 0, flags);