firewire: net: Use posted writes
authorStephan Gatzka <stephan@gatzka.org>
Mon, 26 Sep 2011 19:44:30 +0000 (21:44 +0200)
committerStefan Richter <stefanr@s5r6.in-berlin.de>
Sun, 9 Oct 2011 15:00:18 +0000 (17:00 +0200)
Change memory region to ohci "middle address space". This effectively
reduces the number of packets by 50%.

[Stefan R.:]  This eliminates 1394 ack packets and improved throughput
by a few percent in some tests with an S400a connection with and without
gap count optimization.  Since firewire-net taxes the AR-req DMA unit of
a FireWire controller much more than firewire-sbp2 (which uses the
middle address space with PCI posted writes too), this commit also
changes a related error printk into a ratelimited one as a precaution.

Side note:  The IPv4-over-1394 drivers of Mac OS X 10.4, Windows XP SP3,
and the Thesycon 1394 bus driver for Windows all use the middle address
space too.

Signed-off-by: Stephan Gatzka <stephan@gatzka.org>
Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
drivers/firewire/net.c
drivers/firewire/ohci.c

index d1fad1f..a20f45b 100644 (file)
@@ -1121,17 +1121,12 @@ static int fwnet_broadcast_start(struct fwnet_device *dev)
        unsigned u;
 
        if (dev->local_fifo == FWNET_NO_FIFO_ADDR) {
-               /* outside OHCI posted write area? */
-               static const struct fw_address_region region = {
-                       .start = 0xffff00000000ULL,
-                       .end   = CSR_REGISTER_BASE,
-               };
-
                dev->handler.length = 4096;
                dev->handler.address_callback = fwnet_receive_packet;
                dev->handler.callback_data = dev;
 
-               retval = fw_core_add_address_handler(&dev->handler, &region);
+               retval = fw_core_add_address_handler(&dev->handler,
+                                       &fw_high_memory_region);
                if (retval < 0)
                        goto failed_initial;
 
index 399d592..bffc2ad 100644 (file)
@@ -2045,7 +2045,8 @@ static irqreturn_t irq_handler(int irq, void *data)
                reg_read(ohci, OHCI1394_PostedWriteAddressLo);
                reg_write(ohci, OHCI1394_IntEventClear,
                          OHCI1394_postedWriteErr);
-               fw_error("PCI posted write error\n");
+               if (printk_ratelimit())
+                       fw_error("PCI posted write error\n");
        }
 
        if (unlikely(event & OHCI1394_cycleTooLong)) {