Merge tag 'firewire-updates' of git://git.kernel.org/pub/scm/linux/kernel/git/ieee139...
authorLinus Torvalds <torvalds@linux-foundation.org>
Fri, 2 Feb 2018 22:57:44 +0000 (14:57 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 2 Feb 2018 22:57:44 +0000 (14:57 -0800)
Pull firewire updates from Stefan Richter

  - make JMicron JMB38x controllers work with IOMMU-equipped systems

  - IP-over-1394: allow user-configured MTU of up to 4096 bytes

* tag 'firewire-updates' of git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394:
  firewire-ohci: work around oversized DMA reads on JMicron controllers
  firewire: net: max MTU off by one

drivers/firewire/net.c
drivers/firewire/ohci.c

index 242359c2d1f1839999fdfa68aff7c1ee708fc291..60e75e6d9104c3db01c8ca36b25b70f02bb70c83 100644 (file)
@@ -1480,9 +1480,14 @@ static int fwnet_probe(struct fw_unit *unit,
                goto out;
        dev->local_fifo = dev->handler.offset;
 
+       /*
+        * default MTU: RFC 2734 cl. 4, RFC 3146 cl. 4
+        * maximum MTU: RFC 2734 cl. 4.2, fragment encapsulation header's
+        *              maximum possible datagram_size + 1 = 0xfff + 1
+        */
        net->mtu = 1500U;
        net->min_mtu = ETH_MIN_MTU;
-       net->max_mtu = 0xfff;
+       net->max_mtu = 4096U;
 
        /* Set our hardware address while we're at it */
        ha = (union fwnet_hwaddr *)net->dev_addr;
index ccf52368a073ecf0518b946853a8f7980087d8f1..45c048751f3bd8a9527631d26673cc7f603fe85e 100644 (file)
@@ -1128,7 +1128,13 @@ static int context_add_buffer(struct context *ctx)
                return -ENOMEM;
 
        offset = (void *)&desc->buffer - (void *)desc;
-       desc->buffer_size = PAGE_SIZE - offset;
+       /*
+        * Some controllers, like JMicron ones, always issue 0x20-byte DMA reads
+        * for descriptors, even 0x10-byte ones. This can cause page faults when
+        * an IOMMU is in use and the oversized read crosses a page boundary.
+        * Work around this by always leaving at least 0x10 bytes of padding.
+        */
+       desc->buffer_size = PAGE_SIZE - offset - 0x10;
        desc->buffer_bus = bus_addr + offset;
        desc->used = 0;