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

1  2 
drivers/firewire/ohci.c

diff --combined drivers/firewire/ohci.c
index ccf52368a073ecf0518b946853a8f7980087d8f1,d731b413cb2ce504c5cb895cdec0d91e4231fe01..45c048751f3bd8a9527631d26673cc7f603fe85e
@@@ -734,7 -734,7 +734,7 @@@ static unsigned int ar_search_last_acti
        __le16 res_count, next_res_count;
  
        i = ar_first_buffer_index(ctx);
 -      res_count = ACCESS_ONCE(ctx->descriptors[i].res_count);
 +      res_count = READ_ONCE(ctx->descriptors[i].res_count);
  
        /* A buffer that is not yet completely filled must be the last one. */
        while (i != last && res_count == 0) {
                /* Peek at the next descriptor. */
                next_i = ar_next_buffer_index(i);
                rmb(); /* read descriptors in order */
 -              next_res_count = ACCESS_ONCE(
 -                              ctx->descriptors[next_i].res_count);
 +              next_res_count = READ_ONCE(ctx->descriptors[next_i].res_count);
                /*
                 * If the next descriptor is still empty, we must stop at this
                 * descriptor.
                        if (MAX_AR_PACKET_SIZE > PAGE_SIZE && i != last) {
                                next_i = ar_next_buffer_index(next_i);
                                rmb();
 -                              next_res_count = ACCESS_ONCE(
 -                                      ctx->descriptors[next_i].res_count);
 +                              next_res_count = READ_ONCE(ctx->descriptors[next_i].res_count);
                                if (next_res_count != cpu_to_le16(PAGE_SIZE))
                                        goto next_buffer_is_active;
                        }
@@@ -1128,7 -1130,13 +1128,13 @@@ static int context_add_buffer(struct co
                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;
  
@@@ -2810,7 -2818,7 +2816,7 @@@ static int handle_ir_buffer_fill(struc
        u32 buffer_dma;
  
        req_count = le16_to_cpu(last->req_count);
 -      res_count = le16_to_cpu(ACCESS_ONCE(last->res_count));
 +      res_count = le16_to_cpu(READ_ONCE(last->res_count));
        completed = req_count - res_count;
        buffer_dma = le32_to_cpu(last->data_address);