From: Stephan Gatzka Date: Mon, 26 Sep 2011 19:44:30 +0000 (+0200) Subject: firewire: net: Use posted writes X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=a74477db9171e677b7a37b89e6e0ac8a15ba1f26;p=linux-beck.git firewire: net: Use posted writes 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 Signed-off-by: Stefan Richter --- diff --git a/drivers/firewire/net.c b/drivers/firewire/net.c index d1fad1fb17e2..a20f45b1e7e5 100644 --- a/drivers/firewire/net.c +++ b/drivers/firewire/net.c @@ -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, ®ion); + retval = fw_core_add_address_handler(&dev->handler, + &fw_high_memory_region); if (retval < 0) goto failed_initial; diff --git a/drivers/firewire/ohci.c b/drivers/firewire/ohci.c index 399d5926caf7..bffc2ad7ecab 100644 --- a/drivers/firewire/ohci.c +++ b/drivers/firewire/ohci.c @@ -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)) {