Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6:
firewire: fw-ohci: fix IOMMU resource exhaustion
ieee1394: node manager causes up to ~3.25s delay in freezing tasks

+14 -4
+7 -4
drivers/firewire/fw-ohci.c
··· 974 974 packet->ack = RCODE_SEND_ERROR; 975 975 return -1; 976 976 } 977 + packet->payload_bus = payload_bus; 977 978 978 979 d[2].req_count = cpu_to_le16(packet->payload_length); 979 980 d[2].data_address = cpu_to_le32(payload_bus); ··· 1026 1025 struct driver_data *driver_data; 1027 1026 struct fw_packet *packet; 1028 1027 struct fw_ohci *ohci = context->ohci; 1029 - dma_addr_t payload_bus; 1030 1028 int evt; 1031 1029 1032 1030 if (last->transfer_status == 0) ··· 1038 1038 /* This packet was cancelled, just continue. */ 1039 1039 return 1; 1040 1040 1041 - payload_bus = le32_to_cpu(last->data_address); 1042 - if (payload_bus != 0) 1043 - dma_unmap_single(ohci->card.device, payload_bus, 1041 + if (packet->payload_bus) 1042 + dma_unmap_single(ohci->card.device, packet->payload_bus, 1044 1043 packet->payload_length, DMA_TO_DEVICE); 1045 1044 1046 1045 evt = le16_to_cpu(last->transfer_status) & 0x1f; ··· 1695 1696 1696 1697 if (packet->ack != 0) 1697 1698 goto out; 1699 + 1700 + if (packet->payload_bus) 1701 + dma_unmap_single(ohci->card.device, packet->payload_bus, 1702 + packet->payload_length, DMA_TO_DEVICE); 1698 1703 1699 1704 log_ar_at_event('T', packet->speed, packet->header, 0x20); 1700 1705 driver_data->packet = NULL;
+3
drivers/firewire/fw-transaction.c
··· 207 207 packet->speed = speed; 208 208 packet->generation = generation; 209 209 packet->ack = 0; 210 + packet->payload_bus = 0; 210 211 } 211 212 212 213 /** ··· 582 581 BUG(); 583 582 return; 584 583 } 584 + 585 + response->payload_bus = 0; 585 586 } 586 587 EXPORT_SYMBOL(fw_fill_response); 587 588
+2
drivers/firewire/fw-transaction.h
··· 27 27 #include <linux/list.h> 28 28 #include <linux/spinlock_types.h> 29 29 #include <linux/timer.h> 30 + #include <linux/types.h> 30 31 #include <linux/workqueue.h> 31 32 32 33 #define TCODE_IS_READ_REQUEST(tcode) (((tcode) & ~1) == 4) ··· 154 153 size_t header_length; 155 154 void *payload; 156 155 size_t payload_length; 156 + dma_addr_t payload_bus; 157 157 u32 timestamp; 158 158 159 159 /*
+2
drivers/ieee1394/nodemgr.c
··· 1685 1685 g = get_hpsb_generation(host); 1686 1686 for (i = 0; i < 4 ; i++) { 1687 1687 msleep_interruptible(63); 1688 + try_to_freeze(); 1688 1689 if (kthread_should_stop()) 1689 1690 goto exit; 1690 1691 ··· 1726 1725 /* Sleep 3 seconds */ 1727 1726 for (i = 3000/200; i; i--) { 1728 1727 msleep_interruptible(200); 1728 + try_to_freeze(); 1729 1729 if (kthread_should_stop()) 1730 1730 goto exit; 1731 1731