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