Skip to content

Commit

Permalink
firewire: net: Use posted writes
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Stephan Gatzka authored and Stefan Richter committed Oct 9, 2011
1 parent 4ec4a67 commit a74477d
Show file tree
Hide file tree
Showing 2 changed files with 4 additions and 8 deletions.
9 changes: 2 additions & 7 deletions drivers/firewire/net.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
3 changes: 2 additions & 1 deletion drivers/firewire/ohci.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)) {
Expand Down

0 comments on commit a74477d

Please sign in to comment.