rpms/kernel/F-10 linux-2.6-hwmon-superio-fix-acpi-resource-check-error-handling.patch, NONE, 1.1 linux-2.6.29-btrfs-readdir-fix.patch, NONE, 1.1 linux-2.6.29-btrfs-selinux.patch, NONE, 1.1 linux-2.6.29-btrfs-setxattr-fix.patch, NONE, 1.1 patch-2.6.29-rc3-git1.bz2.sign, NONE, 1.1 .cvsignore, 1.967, 1.968 kernel.spec, 1.1236, 1.1237 linux-2.6-firewire-git-pending.patch, 1.35, 1.36 linux-2.6-firewire-git-update.patch, 1.19, 1.20 linux-2.6.29-lirc.patch, 1.1, 1.2 sources, 1.929, 1.930 upstream, 1.840, 1.841 linux-2.6-gspca-git.patch, 1.2, NONE linux-2.6-gspca-stv06xx-git.patch, 1.1, NONE

Chuck Ebbert cebbert at fedoraproject.org
Fri Jan 30 21:22:12 UTC 2009


Author: cebbert

Update of /cvs/pkgs/rpms/kernel/F-10
In directory cvs1.fedora.phx.redhat.com:/tmp/cvs-serv27948

Modified Files:
	.cvsignore kernel.spec linux-2.6-firewire-git-pending.patch 
	linux-2.6-firewire-git-update.patch linux-2.6.29-lirc.patch 
	sources upstream 
Added Files:
	linux-2.6-hwmon-superio-fix-acpi-resource-check-error-handling.patch 
	linux-2.6.29-btrfs-readdir-fix.patch 
	linux-2.6.29-btrfs-selinux.patch 
	linux-2.6.29-btrfs-setxattr-fix.patch 
	patch-2.6.29-rc3-git1.bz2.sign 
Removed Files:
	linux-2.6-gspca-git.patch linux-2.6-gspca-stv06xx-git.patch 
Log Message:
Copy 2.6.29-rc3-git1 update and btrfs fixes from Rawhide.

linux-2.6-hwmon-superio-fix-acpi-resource-check-error-handling.patch:

--- NEW FILE linux-2.6-hwmon-superio-fix-acpi-resource-check-error-handling.patch ---
This patch fixes a number of cases where things were not properly cleaned up
when acpi_check_resource_conflict() returned an error, causing oopses such as
the one reported here:
https://bugzilla.redhat.com/show_bug.cgi?id=483208

Signed-off-by: Hans de Goede <hdegoede at redhat.com>
diff -up linux-2.6.28.x86_64/drivers/hwmon/f71882fg.c~ linux-2.6.28.x86_64/drivers/hwmon/f71882fg.c
--- linux-2.6.28.x86_64/drivers/hwmon/f71882fg.c~	2009-01-30 11:18:04.000000000 +0100
+++ linux-2.6.28.x86_64/drivers/hwmon/f71882fg.c	2009-01-30 11:18:04.000000000 +0100
@@ -1932,7 +1932,7 @@ static int __init f71882fg_device_add(un
 	res.name = f71882fg_pdev->name;
 	err = acpi_check_resource_conflict(&res);
 	if (err)
-		return err;
+		goto exit_device_put;
 
 	err = platform_device_add_resources(f71882fg_pdev, &res, 1);
 	if (err) {
diff -up linux-2.6.28.x86_64/drivers/hwmon/vt1211.c~ linux-2.6.28.x86_64/drivers/hwmon/vt1211.c
--- linux-2.6.28.x86_64/drivers/hwmon/vt1211.c~	2009-01-30 11:21:32.000000000 +0100
+++ linux-2.6.28.x86_64/drivers/hwmon/vt1211.c	2009-01-30 11:21:32.000000000 +0100
@@ -1262,7 +1262,7 @@ static int __init vt1211_device_add(unsi
 	res.name = pdev->name;
 	err = acpi_check_resource_conflict(&res);
 	if (err)
-		goto EXIT;
+		goto EXIT_DEV_PUT;
 
 	err = platform_device_add_resources(pdev, &res, 1);
 	if (err) {
diff -up linux-2.6.28.x86_64/drivers/hwmon/w83627ehf.c~ linux-2.6.28.x86_64/drivers/hwmon/w83627ehf.c
--- linux-2.6.28.x86_64/drivers/hwmon/w83627ehf.c~	2009-01-30 11:22:26.000000000 +0100
+++ linux-2.6.28.x86_64/drivers/hwmon/w83627ehf.c	2009-01-30 11:22:26.000000000 +0100
@@ -1548,7 +1548,7 @@ static int __init sensors_w83627ehf_init
 
 	err = acpi_check_resource_conflict(&res);
 	if (err)
-		goto exit;
+		goto exit_device_put;
 
 	err = platform_device_add_resources(pdev, &res, 1);
 	if (err) {

linux-2.6.29-btrfs-readdir-fix.patch:

--- NEW FILE linux-2.6.29-btrfs-readdir-fix.patch ---
Josef,

This fixes btrfs readdir on 32 bit boxes.  It keeps us from giving glibc
an offset too big to handle.

diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index 5771ec2..ebd7d6c 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -3277,7 +3277,7 @@ skip:
 
 	/* Reached end of directory/root. Bump pos past the last item. */
 	if (key_type == BTRFS_DIR_INDEX_KEY)
-		filp->f_pos = INT_LIMIT(typeof(filp->f_pos));
+		filp->f_pos = INT_LIMIT(off_t);
 	else
 		filp->f_pos++;
 nopos:



linux-2.6.29-btrfs-selinux.patch:

--- NEW FILE linux-2.6.29-btrfs-selinux.patch ---
Add call to LSM security initialization and save
resulting security xattr for new inodes.

Add xattr support to symlink inode ops.

Set inode->i_op for existing special files.

Signed-off-by: jim owens <jowens at hp.com>
---
  fs/btrfs/inode.c |   23 +++++++++++++++++++----
  fs/btrfs/xattr.c |   32 ++++++++++++++++++++++++++++++++
  fs/btrfs/xattr.h |    2 ++
  3 files changed, 53 insertions(+), 4 deletions(-)

Index: linux/fs/btrfs/inode.c
===================================================================
--- linux.orig/fs/btrfs/inode.c
+++ linux/fs/btrfs/inode.c
@@ -91,6 +91,16 @@ static noinline int cow_file_range(struc
 				   u64 start, u64 end, int *page_started,
 				   unsigned long *nr_written, int unlock);
 
+static int btrfs_init_inode_security(struct inode *inode,  struct inode *dir)
+{
+	int err;
+
+	err = btrfs_init_acl(inode, dir);
+	if (!err)
+		err = btrfs_xattr_security_init(inode, dir);
+	return err;
+}
+
 /*
  * a very lame attempt at stopping writes when the FS is 85% full.  There
  * are countless ways this is incorrect, but it is better than nothing.
@@ -2039,6 +2049,7 @@ void btrfs_read_locked_inode(struct inod
 		inode->i_mapping->backing_dev_info = &root->fs_info->bdi;
 		break;
 	default:
+		inode->i_op = &btrfs_special_inode_operations;
 		init_special_inode(inode, inode->i_mode, rdev);
 		break;
 	}
@@ -3586,7 +3597,7 @@ static int btrfs_mknod(struct inode *dir
 	if (IS_ERR(inode))
 		goto out_unlock;
 
-	err = btrfs_init_acl(inode, dir);
+	err = btrfs_init_inode_security(inode, dir);
 	if (err) {
 		drop_inode = 1;
 		goto out_unlock;
@@ -3649,7 +3660,7 @@ static int btrfs_create(struct inode *di
 	if (IS_ERR(inode))
 		goto out_unlock;
 
-	err = btrfs_init_acl(inode, dir);
+	err = btrfs_init_inode_security(inode, dir);
 	if (err) {
 		drop_inode = 1;
 		goto out_unlock;
@@ -3772,7 +3783,7 @@ static int btrfs_mkdir(struct inode *dir
 
 	drop_on_err = 1;
 
-	err = btrfs_init_acl(inode, dir);
+	err = btrfs_init_inode_security(inode, dir);
 	if (err)
 		goto out_fail;
 
@@ -4733,7 +4744,7 @@ static int btrfs_symlink(struct inode *d
 	if (IS_ERR(inode))
 		goto out_unlock;
 
-	err = btrfs_init_acl(inode, dir);
+	err = btrfs_init_inode_security(inode, dir);
 	if (err) {
 		drop_inode = 1;
 		goto out_unlock;
@@ -5032,4 +5043,8 @@ static struct inode_operations btrfs_sym
 	.follow_link	= page_follow_link_light,
 	.put_link	= page_put_link,
 	.permission	= btrfs_permission,
+	.setxattr	= btrfs_setxattr,
+	.getxattr	= btrfs_getxattr,
+	.listxattr	= btrfs_listxattr,
+	.removexattr	= btrfs_removexattr,
 };
Index: linux/fs/btrfs/xattr.c
===================================================================
--- linux.orig/fs/btrfs/xattr.c
+++ linux/fs/btrfs/xattr.c
@@ -21,6 +21,7 @@
 #include <linux/slab.h>
 #include <linux/rwsem.h>
 #include <linux/xattr.h>
+#include <linux/security.h>
 #include "ctree.h"
 #include "btrfs_inode.h"
 #include "transaction.h"
@@ -320,3 +321,34 @@ int btrfs_removexattr(struct dentry *den
 		return -EOPNOTSUPP;
 	return __btrfs_setxattr(dentry->d_inode, name, NULL, 0, XATTR_REPLACE);
 }
+
+int btrfs_xattr_security_init(struct inode *inode, struct inode *dir)
+{
+	int err;
+	size_t len;
+	void *value;
+	char *suffix;
+	char *name;
+
+	err = security_inode_init_security(inode, dir, &suffix, &value, &len);
+	if (err) {
+		if (err == -EOPNOTSUPP)
+			return 0;
+		return err;
+	}
+
+	name = kmalloc(XATTR_SECURITY_PREFIX_LEN + strlen(suffix) + 1,
+		       GFP_NOFS);
+	if (!name) {
+		err = -ENOMEM;
+	} else {
+		strcpy(name, XATTR_SECURITY_PREFIX);
+		strcpy(name + XATTR_SECURITY_PREFIX_LEN, suffix);
+		err = __btrfs_setxattr(inode, name, value, len, 0);
+		kfree(name);
+	}
+
+	kfree(suffix);
+	kfree(value);
+	return err;
+}
Index: linux/fs/btrfs/xattr.h
===================================================================
--- linux.orig/fs/btrfs/xattr.h
+++ linux/fs/btrfs/xattr.h
@@ -36,4 +36,6 @@ extern int btrfs_setxattr(struct dentry 
 		const void *value, size_t size, int flags);
 extern int btrfs_removexattr(struct dentry *dentry, const char *name);
 
+extern int btrfs_xattr_security_init(struct inode *inode, struct inode *dir);
+
 #endif /* __XATTR__ */


linux-2.6.29-btrfs-setxattr-fix.patch:

--- NEW FILE linux-2.6.29-btrfs-setxattr-fix.patch ---
With selinux on we end up calling __btrfs_setxattr when we create an inode,
which calls btrfs_start_transaction().  The problem is we've already called that
in btrfs_new_inode, and in btrfs_start_transaction we end up doing a
wait_current_trans().  If btrfs-transaction has started committing it will wait
for all handles to finish, while the other process is waiting for the
transaction to commit.  This is fixed by using btrfs_join_transaction, which
won't wait for the transaction to commit.  Thanks,

Signed-off-by: Josef Bacik <jbacik at redhat.com>
---
 fs/btrfs/xattr.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/fs/btrfs/xattr.c b/fs/btrfs/xattr.c
index 312b943..a9d3bf4 100644
--- a/fs/btrfs/xattr.c
+++ b/fs/btrfs/xattr.c
@@ -98,7 +98,7 @@ int __btrfs_setxattr(struct inode *inode, const char *name,
 	if (!path)
 		return -ENOMEM;
 
-	trans = btrfs_start_transaction(root, 1);
+	trans = btrfs_join_transaction(root, 1);
 	btrfs_set_trans_block_group(trans, inode);
 
 	/* first lets see if we already have this xattr */
-- 
1.5.4.3



--- NEW FILE patch-2.6.29-rc3-git1.bz2.sign ---
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)
Comment: See http://www.kernel.org/signature.html for info

iD8DBQBJguwAyGugalF9Dw4RAhQUAJ0eeGfFKWnr3R/eqRA3JktfT/pz6ACfXMZr
SaiMPoOJt6Di4ZgqPjadpuU=
=piNt
-----END PGP SIGNATURE-----


Index: .cvsignore
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/F-10/.cvsignore,v
retrieving revision 1.967
retrieving revision 1.968
diff -u -r1.967 -r1.968
--- .cvsignore	29 Jan 2009 21:14:10 -0000	1.967
+++ .cvsignore	30 Jan 2009 21:21:41 -0000	1.968
@@ -5,3 +5,4 @@
 kernel-2.6.28
 linux-2.6.28.tar.bz2
 patch-2.6.29-rc3.bz2
+patch-2.6.29-rc3-git1.bz2


Index: kernel.spec
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/F-10/kernel.spec,v
retrieving revision 1.1236
retrieving revision 1.1237
diff -u -r1.1236 -r1.1237
--- kernel.spec	30 Jan 2009 03:22:12 -0000	1.1236
+++ kernel.spec	30 Jan 2009 21:21:41 -0000	1.1237
@@ -57,7 +57,7 @@
 # The rc snapshot level
 %define rcrev 3
 # The git snapshot level
-%define gitrev 0
+%define gitrev 1
 # Set rpm version accordingly
 %define rpmversion 2.6.%{upstream_sublevel}
 %endif
@@ -613,6 +613,7 @@
 Patch382: linux-2.6-defaults-pciehp.patch
 Patch390: linux-2.6-defaults-acpi-video.patch
 Patch391: linux-2.6-acpi-video-dos.patch
+Patch394: linux-2.6-hwmon-superio-fix-acpi-resource-check-error-handling.patch
 Patch400: linux-2.6-scsi-cpqarray-set-master.patch
 Patch450: linux-2.6-input-kill-stupid-messages.patch
 Patch460: linux-2.6-serial-460800.patch
@@ -666,6 +667,15 @@
 # silence the ACPI blacklist code
 Patch2802: linux-2.6-silence-acpi-blacklist.patch
 
+# Hook up proper selinux bits for btrfs
+Patch9003: linux-2.6.29-btrfs-selinux.patch
+
+# Fix setxattr bug in btrfs
+Patch9004: linux-2.6.29-btrfs-setxattr-fix.patch
+
+# Fix readdir for 32bit boxes in btrfs
+Patch9005: linux-2.6.29-btrfs-readdir-fix.patch
+
 %endif
 
 BuildRoot: %{_tmppath}/kernel-%{KVERREL}-root
@@ -1067,11 +1077,17 @@
 
 # xfs
 
+# btrfs
+ApplyPatch linux-2.6.29-btrfs-selinux.patch
+ApplyPatch linux-2.6.29-btrfs-setxattr-fix.patch
+ApplyPatch linux-2.6.29-btrfs-readdir-fix.patch
+
 # USB
 
 # ACPI
 ApplyPatch linux-2.6-defaults-acpi-video.patch
 ApplyPatch linux-2.6-acpi-video-dos.patch
+ApplyPatch linux-2.6-hwmon-superio-fix-acpi-resource-check-error-handling.patch
 
 # Various low-impact patches to aid debugging.
 ApplyPatch linux-2.6-debug-sizeof-structs.patch
@@ -1747,6 +1763,9 @@
 %kernel_variant_files -k vmlinux %{with_kdump} kdump
 
 %changelog
+* Fri Jan 30 2009 Chuck Ebbert <cebbert at redhat.com> 2.6.29-0.7.rc3.git1
+- Copy 2.6.29-rc3-git1 update and btrfs fixes from Rawhide.
+
 * Thu Jan 29 2009 Chuck Ebbert <cebbert at redhat.com> 2.6.29-0.6.rc3
 - Copy lirc and nouveau from rawhide.
 

linux-2.6-firewire-git-pending.patch:

Index: linux-2.6-firewire-git-pending.patch
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/F-10/linux-2.6-firewire-git-pending.patch,v
retrieving revision 1.35
retrieving revision 1.36
diff -u -r1.35 -r1.36
--- linux-2.6-firewire-git-pending.patch	30 Jan 2009 00:24:47 -0000	1.35
+++ linux-2.6-firewire-git-pending.patch	30 Jan 2009 21:21:41 -0000	1.36
@@ -2,393 +2,3 @@
 # Patches under review and/or pending inclusion in the linux1394-git
 # tree (and/or in by the time your read this), which we want...
 #
-
-Date: Sat, 24 Jan 2009 19:42:21 +0100 (CET)
-From: Stefan Richter <stefanr at s5r6.in-berlin.de>
-Subject: [PATCH 1/7] firewire: sbp2: fix payload limit at S1600 and S3200
-To: linux1394-devel at lists.sourceforge.net
-Cc: linux-kernel at vger.kernel.org
-
-1394-2008 clause 16.3.4.1 (1394b-2002 clause 16.3.1.1) defines tighter
-limits than 1394-2008 clause 6.2.2.3 (1394a-2000 clause 6.2.2.3).
-
-Our previously too large limit doesn't matter though if the controller
-reports its max_receive correctly.
-
-Signed-off-by: Stefan Richter <stefanr at s5r6.in-berlin.de>
----
- drivers/firewire/fw-sbp2.c |   23 ++++++++++++-----------
- 1 file changed, 12 insertions(+), 11 deletions(-)
-
-Index: linux/drivers/firewire/fw-sbp2.c
-===================================================================
---- linux.orig/drivers/firewire/fw-sbp2.c
-+++ linux/drivers/firewire/fw-sbp2.c
-@@ -168,6 +168,7 @@ struct sbp2_target {
- 	int address_high;
- 	unsigned int workarounds;
- 	unsigned int mgt_orb_timeout;
-+	unsigned int max_payload;
- 
- 	int dont_block;	/* counter for each logical unit */
- 	int blocked;	/* ditto */
-@@ -1150,6 +1151,15 @@ static int sbp2_probe(struct device *dev
- 
- 	sbp2_init_workarounds(tgt, model, firmware_revision);
- 
-+	/*
-+	 * At S100 we can do 512 bytes per packet, at S200 1024 bytes,
-+	 * and so on up to 4096 bytes.  The SBP-2 max_payload field
-+	 * specifies the max payload size as 2 ^ (max_payload + 2), so
-+	 * if we set this to max_speed + 7, we get the right value.
-+	 */
-+	tgt->max_payload = min(device->max_speed + 7, 10U);
-+	tgt->max_payload = min(tgt->max_payload, device->card->max_receive - 1);
-+
- 	/* Do the login in a workqueue so we can easily reschedule retries. */
- 	list_for_each_entry(lu, &tgt->lu_list, link)
- 		sbp2_queue_work(lu, DIV_ROUND_UP(HZ, 5));
-@@ -1426,7 +1436,6 @@ static int sbp2_scsi_queuecommand(struct
- 	struct sbp2_logical_unit *lu = cmd->device->hostdata;
- 	struct fw_device *device = fw_device(lu->tgt->unit->device.parent);
- 	struct sbp2_command_orb *orb;
--	unsigned int max_payload;
- 	int generation, retval = SCSI_MLQUEUE_HOST_BUSY;
- 
- 	/*
-@@ -1454,17 +1463,9 @@ static int sbp2_scsi_queuecommand(struct
- 	orb->done = done;
- 	orb->cmd  = cmd;
- 
--	orb->request.next.high   = cpu_to_be32(SBP2_ORB_NULL);
--	/*
--	 * At speed 100 we can do 512 bytes per packet, at speed 200,
--	 * 1024 bytes per packet etc.  The SBP-2 max_payload field
--	 * specifies the max payload size as 2 ^ (max_payload + 2), so
--	 * if we set this to max_speed + 7, we get the right value.
--	 */
--	max_payload = min(device->max_speed + 7,
--			  device->card->max_receive - 1);
-+	orb->request.next.high = cpu_to_be32(SBP2_ORB_NULL);
- 	orb->request.misc = cpu_to_be32(
--		COMMAND_ORB_MAX_PAYLOAD(max_payload) |
-+		COMMAND_ORB_MAX_PAYLOAD(lu->tgt->max_payload) |
- 		COMMAND_ORB_SPEED(device->max_speed) |
- 		COMMAND_ORB_NOTIFY);
- 
-
--- 
-Stefan Richter
--=====-==--= ---= ==---
-http://arcgraph.de/sr/
-
-
-
-Date: Sat, 24 Jan 2009 19:42:47 +0100 (CET)
-From: Stefan Richter <stefanr at s5r6.in-berlin.de>
-Subject: [PATCH 2/7] firewire: sbp2: define some magic numbers as macros
-To: linux1394-devel at lists.sourceforge.net
-Cc: linux-kernel at vger.kernel.org
-
-Signed-off-by: Stefan Richter <stefanr at s5r6.in-berlin.de>
----
- drivers/firewire/fw-sbp2.c |   23 ++++++++++++-----------
- 1 file changed, 12 insertions(+), 11 deletions(-)
-
-Index: linux/drivers/firewire/fw-sbp2.c
-===================================================================
---- linux.orig/drivers/firewire/fw-sbp2.c
-+++ linux/drivers/firewire/fw-sbp2.c
-@@ -311,14 +311,16 @@ struct sbp2_command_orb {
- 	dma_addr_t page_table_bus;
- };
- 
-+#define SBP2_ROM_VALUE_WILDCARD ~0         /* match all */
-+#define SBP2_ROM_VALUE_MISSING  0xff000000 /* not present in the unit dir. */
-+
- /*
-  * List of devices with known bugs.
-  *
-  * The firmware_revision field, masked with 0xffff00, is the best
-  * indicator for the type of bridge chip of a device.  It yields a few
-  * false positives but this did not break correctly behaving devices
-- * so far.  We use ~0 as a wildcard, since the 24 bit values we get
-- * from the config rom can never match that.
-+ * so far.
-  */
- static const struct {
- 	u32 firmware_revision;
-@@ -340,22 +342,22 @@ static const struct {
- 	},
- 	/* Initio bridges, actually only needed for some older ones */ {
- 		.firmware_revision	= 0x000200,
--		.model			= ~0,
-+		.model			= SBP2_ROM_VALUE_WILDCARD,
- 		.workarounds		= SBP2_WORKAROUND_INQUIRY_36,
- 	},
- 	/* PL-3507 bridge with Prolific firmware */ {
- 		.firmware_revision	= 0x012800,
--		.model			= ~0,
-+		.model			= SBP2_ROM_VALUE_WILDCARD,
- 		.workarounds		= SBP2_WORKAROUND_POWER_CONDITION,
- 	},
- 	/* Symbios bridge */ {
- 		.firmware_revision	= 0xa0b800,
--		.model			= ~0,
-+		.model			= SBP2_ROM_VALUE_WILDCARD,
- 		.workarounds		= SBP2_WORKAROUND_128K_MAX_TRANS,
- 	},
- 	/* Datafab MD2-FW2 with Symbios/LSILogic SYM13FW500 bridge */ {
- 		.firmware_revision	= 0x002600,
--		.model			= ~0,
-+		.model			= SBP2_ROM_VALUE_WILDCARD,
- 		.workarounds		= SBP2_WORKAROUND_128K_MAX_TRANS,
- 	},
- 
-@@ -1087,7 +1089,7 @@ static void sbp2_init_workarounds(struct
- 			continue;
- 
- 		if (sbp2_workarounds_table[i].model != model &&
--		    sbp2_workarounds_table[i].model != ~0)
-+		    sbp2_workarounds_table[i].model != SBP2_ROM_VALUE_WILDCARD)
- 			continue;
- 
- 		w |= sbp2_workarounds_table[i].workarounds;
-@@ -1137,14 +1139,13 @@ static int sbp2_probe(struct device *dev
- 	fw_device_get(device);
- 	fw_unit_get(unit);
- 
--	/* Initialize to values that won't match anything in our table. */
--	firmware_revision = 0xff000000;
--	model = 0xff000000;
--
- 	/* implicit directory ID */
- 	tgt->directory_id = ((unit->directory - device->config_rom) * 4
- 			     + CSR_CONFIG_ROM) & 0xffffff;
- 
-+	firmware_revision = SBP2_ROM_VALUE_MISSING;
-+	model		  = SBP2_ROM_VALUE_MISSING;
-+
- 	if (sbp2_scan_unit_dir(tgt, unit->directory, &model,
- 			       &firmware_revision) < 0)
- 		goto fail_tgt_put;
-
--- 
-Stefan Richter
--=====-==--= ---= ==---
-http://arcgraph.de/sr/
-
-
-
-Date: Sat, 24 Jan 2009 19:41:46 +0100 (CET)
-From: Stefan Richter <stefanr at s5r6.in-berlin.de>
-Subject: firewire: sbp2: add workarounds for 2nd and 3rd generation iPods
-
-According to https://bugs.launchpad.net/bugs/294391
-  - 3rd generation iPods need the "fix capacity" workaround after all
-    (apparently they crash after the last sector was accessed),
-  - 2nd generation iPods need the "128 kB maximum request size"
-    workaround.
-
-Furthermore, Kristian Høgsberg mentioned that 2nd generation iPods
-treat page tables (scatter-gather lists) as data buffers, i.e. ignore
-the page_table_present bit of command block ORBs.  If this is true, then
-the 128 kB limit is not a sufficient workaround; instead we have to
-guarantee that all requests have only a single s/g element.  This could
-be up to 64 kByte - 4 Bytes in size.  But I expect the block layer to
-typically emit much smaller elements than that, alas.
-
-Alas both iPod generations feature the same model ID in the config ROM,
-hence we can only define a shared quirks list entry for them.  This is
-bad since
-  - the "fix capacity" workaround prevents access to the very last
-    sector if a device does not actually have this bug,
-  - the "no page tables" workaround dramatically reduces throughput,
-    e.g. from 25 to 9 MB/s without gap count optimization, and from 36
-    11 MB/s with gap count optimization (as per hdparm with a regular
-    3.5" S400 disk on an i686 PC without IOMMU).  Whether this matters
-    with the already slow iPod disk is not yet known.
-
-This patch needs testing by somebody who has the hardware:
-  - Do 2nd and 3rd gen. iPods actually have a model_id == 0, or do they
-    have in fact no model_id at all?
-  - Does the "fix capacity" workaround harm usage of 2nd gen. iPods?
-  - Is the "no page tables" workaround really necessary for 2nd gen.
-    iPods, or is the 128k limit sufficient as reported for the Ubuntu
-    8.10 kernel?
-  - How badly does the "no page tables" workaround affect throughput of
-    3rd gen. iPods which don't need it?
-
-A side note:  Apple computers in target mode (or at least an x86 Mac
-mini) don't have firmware_version and model_id, hence none of the iPod
-quirks list entries is active for them.
-
-Signed-off-by: Stefan Richter <stefanr at s5r6.in-berlin.de>
----
- drivers/firewire/fw-sbp2.c |   27 +++++++++++++++++++--------
- 1 file changed, 19 insertions(+), 8 deletions(-)
-
-Index: linux/drivers/firewire/fw-sbp2.c
-===================================================================
---- linux.orig/drivers/firewire/fw-sbp2.c
-+++ linux/drivers/firewire/fw-sbp2.c
-@@ -92,6 +92,10 @@ MODULE_PARM_DESC(exclusive_login, "Exclu
-  *   sd_mod on suspend, resume, and shutdown (if manage_start_stop is on).
-  *   Some disks need this to spin down or to resume properly.
-  *
-+ * - no page tables
-+ *   Limit data buffers to a single scatter/ gather element for buggy devices
-+ *   which ignore the page_table_present bit in command block ORBs.
-+ *
-  * - override internal blacklist
-  *   Instead of adding to the built-in blacklist, use only the workarounds
-  *   specified in the module load parameter.
-@@ -104,6 +108,7 @@ MODULE_PARM_DESC(exclusive_login, "Exclu
- #define SBP2_WORKAROUND_DELAY_INQUIRY	0x10
- #define SBP2_INQUIRY_DELAY		12
- #define SBP2_WORKAROUND_POWER_CONDITION	0x20
-+#define SBP2_WORKAROUND_NO_PAGE_TABLES	0x40
- #define SBP2_WORKAROUND_OVERRIDE	0x100
- 
- static int sbp2_param_workarounds;
-@@ -116,6 +121,7 @@ MODULE_PARM_DESC(workarounds, "Work arou
- 	", delay inquiry = "      __stringify(SBP2_WORKAROUND_DELAY_INQUIRY)
- 	", set power condition in start stop unit = "
- 				  __stringify(SBP2_WORKAROUND_POWER_CONDITION)
-+	", no page tables = "     __stringify(SBP2_WORKAROUND_NO_PAGE_TABLES)
- 	", override internal blacklist = " __stringify(SBP2_WORKAROUND_OVERRIDE)
- 	", or a combination)");
- 
-@@ -325,7 +331,7 @@ struct sbp2_command_orb {
- static const struct {
- 	u32 firmware_revision;
- 	u32 model;
--	unsigned int workarounds;
-+	unsigned workarounds;
- } sbp2_workarounds_table[] = {
- 	/* DViCO Momobay CX-1 with TSB42AA9 bridge */ {
- 		.firmware_revision	= 0x002800,
-@@ -360,15 +366,17 @@ static const struct {
- 		.model			= SBP2_ROM_VALUE_WILDCARD,
- 		.workarounds		= SBP2_WORKAROUND_128K_MAX_TRANS,
- 	},
--
- 	/*
--	 * There are iPods (2nd gen, 3rd gen) with model_id == 0, but
--	 * these iPods do not feature the read_capacity bug according
--	 * to one report.  Read_capacity behaviour as well as model_id
--	 * could change due to Apple-supplied firmware updates though.
-+	 * iPod 2nd generation: needs 128k max transfer workaround
-+	 * iPod 3rd generation: needs fix-capacity workaround
- 	 */
--
--	/* iPod 4th generation. */ {
-+	{
-+		.firmware_revision	= 0x0a2700,
-+		.model			= 0x000000,
-+		.workarounds		= SBP2_WORKAROUND_128K_MAX_TRANS |
-+					  SBP2_WORKAROUND_FIX_CAPACITY,
-+	},
-+	/* iPod 4th generation */ {
- 		.firmware_revision	= 0x0a2700,
- 		.model			= 0x000021,
- 		.workarounds		= SBP2_WORKAROUND_FIX_CAPACITY,
-@@ -1540,6 +1548,9 @@ static int sbp2_scsi_slave_configure(str
- 	if (lu->tgt->workarounds & SBP2_WORKAROUND_128K_MAX_TRANS)
- 		blk_queue_max_sectors(sdev->request_queue, 128 * 1024 / 512);
- 
-+	if (lu->tgt->workarounds & SBP2_WORKAROUND_NO_PAGE_TABLES)
-+		blk_queue_max_hw_segments(sdev->request_queue, 1);
-+
- 	blk_queue_max_segment_size(sdev->request_queue, SBP2_MAX_SEG_SIZE);
- 
- 	return 0;
-Date: Wed, 28 Jan 2009 01:03:34 +0100 (CET)
-From: Stefan Richter <stefanr at s5r6.in-berlin.de>
-Subject: Re: swiotlb default size (64 MB) too small?
-To: FUJITA Tomonori <fujita.tomonori at lab.ntt.co.jp>
-Cc: linux1394-devel at lists.sourceforge.net,
- linux-kernel at vger.kernel.org,
- linux-scsi at vger.kernel.org
-
-> FUJITA Tomonori wrote:
->> On Tue, 27 Jan 2009 18:03:40 +0100 (CET)
->> Stefan Richter <stefanr at s5r6.in-berlin.de> wrote:
->>> +	if (orb->page_table_bus)
->>> +		dma_unmap_single(card_device, orb->page_table_bus,
->>> +				 sizeof(orb->page_table), DMA_TO_DEVICE);
->> 
->> Well, this does not look correct since zero can be a valid dma
->> address.
-
-
-From: Stefan Richter <stefanr at s5r6.in-berlin.de>
-Subject: firewire: sbp2: fix DMA mapping leak on the failure path
-
-Reported-by: FUJITA Tomonori <fujita.tomonori at lab.ntt.co.jp>
-who also provided a first version of the fix.
-
-Signed-off-by: Stefan Richter <stefanr at s5r6.in-berlin.de>
----
- drivers/firewire/fw-sbp2.c |   27 +++++++++++++++++----------
- 1 file changed, 17 insertions(+), 10 deletions(-)
-
-Index: linux/drivers/firewire/fw-sbp2.c
-===================================================================
---- linux.orig/drivers/firewire/fw-sbp2.c
-+++ linux/drivers/firewire/fw-sbp2.c
-@@ -1323,6 +1323,19 @@ static unsigned int sbp2_status_to_sense
- 	}
- }
- 
-+static void sbp2_unmap_scatterlist(struct device *card_device,
-+				   struct sbp2_command_orb *orb)
-+{
-+	if (scsi_sg_count(orb->cmd))
-+		dma_unmap_sg(card_device, scsi_sglist(orb->cmd),
-+			     scsi_sg_count(orb->cmd),
-+			     orb->cmd->sc_data_direction);
-+
-+	if (orb->request.misc & cpu_to_be32(COMMAND_ORB_PAGE_TABLE_PRESENT))
-+		dma_unmap_single(card_device, orb->page_table_bus,
-+				 sizeof(orb->page_table), DMA_TO_DEVICE);
-+}
-+
- static void complete_command_orb(struct sbp2_orb *base_orb,
- 				 struct sbp2_status *status)
- {
-@@ -1364,15 +1377,7 @@ static void complete_command_orb(struct 
- 
- 	dma_unmap_single(device->card->device, orb->base.request_bus,
- 			 sizeof(orb->request), DMA_TO_DEVICE);
--
--	if (scsi_sg_count(orb->cmd) > 0)
--		dma_unmap_sg(device->card->device, scsi_sglist(orb->cmd),
--			     scsi_sg_count(orb->cmd),
--			     orb->cmd->sc_data_direction);
--
--	if (orb->page_table_bus != 0)
--		dma_unmap_single(device->card->device, orb->page_table_bus,
--				 sizeof(orb->page_table), DMA_TO_DEVICE);
-+	sbp2_unmap_scatterlist(device->card->device, orb);
- 
- 	orb->cmd->result = result;
- 	orb->done(orb->cmd);
-@@ -1493,8 +1498,10 @@ static int sbp2_scsi_queuecommand(struct
- 	orb->base.request_bus =
- 		dma_map_single(device->card->device, &orb->request,
- 			       sizeof(orb->request), DMA_TO_DEVICE);
--	if (dma_mapping_error(device->card->device, orb->base.request_bus))
-+	if (dma_mapping_error(device->card->device, orb->base.request_bus)) {
-+		sbp2_unmap_scatterlist(device->card->device, orb);
- 		goto out;
-+	}
- 
- 	sbp2_send_orb(&orb->base, lu, lu->tgt->node_id, generation,
- 		      lu->command_block_agent_address + SBP2_ORB_POINTER);
-
--- 
-Stefan Richter
--=====-==--= ---= ===--
-http://arcgraph.de/sr/
-

linux-2.6-firewire-git-update.patch:

Index: linux-2.6-firewire-git-update.patch
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/F-10/linux-2.6-firewire-git-update.patch,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -r1.19 -r1.20
--- linux-2.6-firewire-git-update.patch	30 Jan 2009 00:24:47 -0000	1.19
+++ linux-2.6-firewire-git-update.patch	30 Jan 2009 21:21:41 -0000	1.20
@@ -1,25 +1,23 @@
-git diff -p --stat v2.6.29-rc2 -- drivers/firewire/ include/linux/ in
-linux1394-2.6.git, done on 20090126 by Jarod.
+linux1394-2.6.git tree vs. linus v2.6.29-rc3-git1 on 20090130 by jarod
 
 ---
- drivers/firewire/fw-card.c        |   70 +--
- drivers/firewire/fw-cdev.c        | 1006 +++++++++++++++++++++++++------------
- drivers/firewire/fw-device.c      |  164 +++++--
- drivers/firewire/fw-device.h      |    8 +-
- drivers/firewire/fw-iso.c         |  225 +++++++--
- drivers/firewire/fw-ohci.c        |  242 +++++-----
- drivers/firewire/fw-sbp2.c        |   57 +--
- drivers/firewire/fw-topology.c    |   40 +-
- drivers/firewire/fw-topology.h    |   19 +-
- drivers/firewire/fw-transaction.c |  151 +++----
- drivers/firewire/fw-transaction.h |  136 ++----
- include/linux/firewire-cdev.h     |  170 ++++++-
- 12 files changed, 1481 insertions(+), 807 deletions(-)
+ firewire-git/drivers/firewire/fw-card.c        |   68 -
+ firewire-git/drivers/firewire/fw-cdev.c        | 1014 +++++++++++++++++--------
+ firewire-git/drivers/firewire/fw-device.c      |   43 -
+ firewire-git/drivers/firewire/fw-device.h      |    7 
+ firewire-git/drivers/firewire/fw-iso.c         |  225 ++++-
+ firewire-git/drivers/firewire/fw-ohci.c        |  236 ++---
+ firewire-git/drivers/firewire/fw-sbp2.c        |   57 -
+ firewire-git/drivers/firewire/fw-topology.c    |   28 
+ firewire-git/drivers/firewire/fw-topology.h    |   19 
+ firewire-git/drivers/firewire/fw-transaction.c |  151 +--
+ firewire-git/drivers/firewire/fw-transaction.h |  125 ---
+ include/linux/firewire-cdev.h                  |  170 +++-
+ 12 files changed, 1359 insertions(+), 784 deletions(-)
 
-diff --git a/drivers/firewire/fw-card.c b/drivers/firewire/fw-card.c
-index 6bd91a1..bed7994 100644
---- a/drivers/firewire/fw-card.c
-+++ b/drivers/firewire/fw-card.c
+diff -Naurp linux-2.6-git/drivers/firewire/fw-card.c firewire-git/drivers/firewire/fw-card.c
+--- linux-2.6-git/drivers/firewire/fw-card.c	2009-01-30 13:39:02.989651512 -0500
++++ firewire-git/drivers/firewire/fw-card.c	2009-01-30 13:35:51.859771884 -0500
 @@ -63,8 +63,7 @@ static int descriptor_count;
  #define BIB_CMC			((1) << 30)
  #define BIB_IMC			((1) << 31)
@@ -30,7 +28,7 @@
  {
  	struct fw_descriptor *desc;
  	static u32 config_rom[256];
-@@ -128,8 +127,7 @@ generate_config_rom(struct fw_card *card, size_t *config_rom_length)
+@@ -128,8 +127,7 @@ generate_config_rom(struct fw_card *card
  	return config_rom;
  }
  
@@ -50,7 +48,7 @@
  {
  	size_t i;
  
-@@ -171,8 +168,7 @@ fw_core_add_descriptor(struct fw_descriptor *desc)
+@@ -171,8 +168,7 @@ fw_core_add_descriptor(struct fw_descrip
  	return 0;
  }
  
@@ -70,7 +68,7 @@
  {
  	int scheduled;
  
-@@ -200,8 +195,7 @@ fw_schedule_bm_work(struct fw_card *card, unsigned long delay)
+@@ -200,8 +195,7 @@ fw_schedule_bm_work(struct fw_card *card
  		fw_card_put(card);
  }
  
@@ -80,16 +78,7 @@
  {
  	struct fw_card *card = container_of(work, struct fw_card, work.work);
  	struct fw_device *root_device;
-@@ -232,7 +226,7 @@ fw_card_bm_work(struct work_struct *work)
- 	root_id = root_node->node_id;
- 	grace = time_after(jiffies, card->reset_jiffies + DIV_ROUND_UP(HZ, 10));
- 
--	if (card->bm_generation + 1 == generation ||
-+	if (is_next_generation(generation, card->bm_generation) ||
- 	    (card->bm_generation != generation && grace)) {
- 		/*
- 		 * This first step is to figure out who is IRM and
-@@ -371,17 +365,16 @@ fw_card_bm_work(struct work_struct *work)
+@@ -371,17 +365,16 @@ fw_card_bm_work(struct work_struct *work
  	fw_card_put(card);
  }
  
@@ -111,7 +100,7 @@
  {
  	static atomic_t index = ATOMIC_INIT(-1);
  
-@@ -406,9 +399,8 @@ fw_card_initialize(struct fw_card *card, const struct fw_card_driver *driver,
+@@ -406,9 +399,8 @@ fw_card_initialize(struct fw_card *card,
  }
  EXPORT_SYMBOL(fw_card_initialize);
  
@@ -152,7 +141,7 @@
  {
  	/*
  	 * We take the card out of card_list before setting the dummy
-@@ -461,27 +450,23 @@ dummy_set_config_rom(struct fw_card *card,
+@@ -461,27 +450,23 @@ dummy_set_config_rom(struct fw_card *car
  	return -1;
  }
  
@@ -185,7 +174,7 @@
  {
  	return -ENODEV;
  }
-@@ -496,16 +481,14 @@ static struct fw_card_driver dummy_driver = {
+@@ -496,16 +481,14 @@ static struct fw_card_driver dummy_drive
  	.enable_phys_dma = dummy_enable_phys_dma,
  };
  
@@ -204,7 +193,7 @@
  {
  	card->driver->update_phy_reg(card, 4,
  				     PHY_LINK_ACTIVE | PHY_CONTENDER, 0);
-@@ -529,8 +512,7 @@ fw_core_remove_card(struct fw_card *card)
+@@ -529,8 +512,7 @@ fw_core_remove_card(struct fw_card *card
  }
  EXPORT_SYMBOL(fw_core_remove_card);
  
@@ -214,10 +203,9 @@
  {
  	int reg = short_reset ? 5 : 1;
  	int bit = short_reset ? PHY_BUS_SHORT_RESET : PHY_BUS_RESET;
-diff --git a/drivers/firewire/fw-cdev.c b/drivers/firewire/fw-cdev.c
-index ed03234..86ec4da 100644
---- a/drivers/firewire/fw-cdev.c
-+++ b/drivers/firewire/fw-cdev.c
+diff -Naurp linux-2.6-git/drivers/firewire/fw-cdev.c firewire-git/drivers/firewire/fw-cdev.c
+--- linux-2.6-git/drivers/firewire/fw-cdev.c	2008-11-04 11:19:19.000000000 -0500
++++ firewire-git/drivers/firewire/fw-cdev.c	2009-01-30 13:35:51.860646788 -0500
 @@ -18,87 +18,162 @@
   * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
   */
@@ -424,7 +412,7 @@
  {
  	return (__u64)(unsigned long)ptr;
  }
-@@ -107,7 +182,6 @@ static int fw_device_op_open(struct inode *inode, struct file *file)
+@@ -107,7 +182,6 @@ static int fw_device_op_open(struct inod
  {
  	struct fw_device *device;
  	struct client *client;
@@ -432,7 +420,7 @@
  
  	device = fw_device_get_by_devt(inode->i_rdev);
  	if (device == NULL)
-@@ -125,16 +199,17 @@ static int fw_device_op_open(struct inode *inode, struct file *file)
+@@ -125,16 +199,17 @@ static int fw_device_op_open(struct inod
  	}
  
  	client->device = device;
@@ -454,7 +442,7 @@
  
  	return 0;
  }
-@@ -150,68 +225,69 @@ static void queue_event(struct client *client, struct event *event,
+@@ -150,68 +225,69 @@ static void queue_event(struct client *c
  	event->v[1].size = size1;
  
  	spin_lock_irqsave(&client->lock, flags);
@@ -547,7 +535,7 @@
  	event->closure	     = client->bus_reset_closure;
  	event->type          = FW_CDEV_EVENT_BUS_RESET;
  	event->generation    = client->device->generation;
-@@ -220,39 +296,49 @@ fill_bus_reset_event(struct fw_cdev_event_bus_reset *event,
+@@ -220,39 +296,49 @@ fill_bus_reset_event(struct fw_cdev_even
  	event->bm_node_id    = 0; /* FIXME: We don't track the BM. */
  	event->irm_node_id   = card->irm_node->node_id;
  	event->root_node_id  = card->root_node->node_id;
@@ -613,7 +601,7 @@
  }
  
  void fw_device_cdev_update(struct fw_device *device)
-@@ -274,11 +360,11 @@ static int ioctl_get_info(struct client *client, void *buffer)
+@@ -274,11 +360,11 @@ static int ioctl_get_info(struct client 
  {
  	struct fw_cdev_get_info *get_info = buffer;
  	struct fw_cdev_event_bus_reset bus_reset;
@@ -626,7 +614,7 @@
  
  	down_read(&fw_device_rwsem);
  
-@@ -300,49 +386,61 @@ static int ioctl_get_info(struct client *client, void *buffer)
+@@ -300,49 +386,61 @@ static int ioctl_get_info(struct client 
  	client->bus_reset_closure = get_info->bus_reset_closure;
  	if (get_info->bus_reset != 0) {
  		void __user *uptr = u64_to_uptr(get_info->bus_reset);
@@ -711,7 +699,7 @@
  		return -EINVAL;
  
  	if (resource)
-@@ -350,203 +448,242 @@ release_client_resource(struct client *client, u32 handle,
+@@ -350,203 +448,242 @@ release_client_resource(struct client *c
  	else
  		r->release(client, r);
  
@@ -846,14 +834,7 @@
  
 -	response->resource.release = release_transaction;
 -	add_client_resource(client, &response->resource);
-+	e->r.resource.release = release_transaction;
-+	ret = add_client_resource(client, &e->r.resource, GFP_KERNEL);
-+	if (ret < 0)
-+		goto failed;
-+
-+	/* Get a reference for the transaction callback */
-+	client_get(client);
- 
+-
 -	fw_send_request(device->card, &response->transaction,
 -			request->tcode & 0x1f,
 -			device->node->node_id,
@@ -862,6 +843,14 @@
 -			request->offset,
 -			response->response.data, request->length,
 -			complete_transaction, response);
++	e->r.resource.release = release_transaction;
++	ret = add_client_resource(client, &e->r.resource, GFP_KERNEL);
++	if (ret < 0)
++		goto failed;
++
++	/* Get a reference for the transaction callback */
++	client_get(client);
++
 +	fw_send_request(client->device->card, &e->r.transaction,
 +			request->tcode & 0x1f, destination_id,
 +			request->generation, speed, request->offset,
@@ -942,16 +931,17 @@
 -	       int generation, int speed,
 -	       unsigned long long offset,
 -	       void *payload, size_t length, void *callback_data)
+-{
+-	struct address_handler *handler = callback_data;
+-	struct request *request;
+-	struct request_event *e;
+-	struct client *client = handler->client;
 +static void handle_request(struct fw_card *card, struct fw_request *request,
 +			   int tcode, int destination, int source,
 +			   int generation, int speed,
 +			   unsigned long long offset,
 +			   void *payload, size_t length, void *callback_data)
- {
--	struct address_handler *handler = callback_data;
--	struct request *request;
--	struct request_event *e;
--	struct client *client = handler->client;
++{
 +	struct address_handler_resource *handler = callback_data;
 +	struct inbound_transaction_resource *r;
 +	struct inbound_transaction_event *e;
@@ -966,18 +956,19 @@
 -		fw_send_response(card, r, RCODE_CONFLICT_ERROR);
 -		return;
 -	}
-+	if (r == NULL || e == NULL)
-+		goto failed;
- 
+-
 -	request->request = r;
 -	request->data    = payload;
 -	request->length  = length;
-+	r->request = request;
-+	r->data    = payload;
-+	r->length  = length;
++	if (r == NULL || e == NULL)
++		goto failed;
  
 -	request->resource.release = release_request;
 -	add_client_resource(client, &request->resource);
++	r->request = request;
++	r->data    = payload;
++	r->length  = length;
++
 +	r->resource.release = release_request;
 +	ret = add_client_resource(handler->client, &r->resource, GFP_ATOMIC);
 +	if (ret < 0)
@@ -1069,7 +1060,7 @@
  
  	return 0;
  }
-@@ -555,18 +692,22 @@ static int ioctl_deallocate(struct client *client, void *buffer)
+@@ -555,18 +692,22 @@ static int ioctl_deallocate(struct clien
  {
  	struct fw_cdev_deallocate *request = buffer;
  
@@ -1096,7 +1087,7 @@
  	if (request->length < r->length)
  		r->length = request->length;
  	if (copy_from_user(r->data, u64_to_uptr(request->data), r->length))
-@@ -588,85 +729,84 @@ static int ioctl_initiate_bus_reset(struct client *client, void *buffer)
+@@ -588,85 +729,84 @@ static int ioctl_initiate_bus_reset(stru
  	return fw_core_initiate_bus_reset(client->device->card, short_reset);
  }
  
@@ -1151,29 +1142,30 @@
 -	descriptor->d.immediate = request->immediate;
 -	descriptor->d.key = request->key;
 -	descriptor->d.data = descriptor->data;
-+	r->descriptor.length    = request->length;
-+	r->descriptor.immediate = request->immediate;
-+	r->descriptor.key       = request->key;
-+	r->descriptor.data      = r->data;
- 
+-
 -	retval = fw_core_add_descriptor(&descriptor->d);
 -	if (retval < 0) {
 -		kfree(descriptor);
 -		return retval;
--	}
++	r->descriptor.length    = request->length;
++	r->descriptor.immediate = request->immediate;
++	r->descriptor.key       = request->key;
++	r->descriptor.data      = r->data;
++
 +	ret = fw_core_add_descriptor(&r->descriptor);
 +	if (ret < 0)
 +		goto failed;
- 
--	descriptor->resource.release = release_descriptor;
--	add_client_resource(client, &descriptor->resource);
--	request->handle = descriptor->resource.handle;
++
 +	r->resource.release = release_descriptor;
 +	ret = add_client_resource(client, &r->resource, GFP_KERNEL);
 +	if (ret < 0) {
 +		fw_core_remove_descriptor(&r->descriptor);
 +		goto failed;
-+	}
+ 	}
+-
+-	descriptor->resource.release = release_descriptor;
+-	add_client_resource(client, &descriptor->resource);
+-	request->handle = descriptor->resource.handle;
 +	request->handle = r->resource.handle;
  
  	return 0;
@@ -1225,7 +1217,7 @@
  }
  
  static int ioctl_create_iso_context(struct client *client, void *buffer)
-@@ -871,6 +1011,237 @@ static int ioctl_get_cycle_timer(struct client *client, void *buffer)
+@@ -871,6 +1011,237 @@ static int ioctl_get_cycle_timer(struct 
  	return 0;
  }
  
@@ -1463,7 +1455,7 @@
  static int (* const ioctl_handlers[])(struct client *client, void *buffer) = {
  	ioctl_get_info,
  	ioctl_send_request,
-@@ -885,13 +1256,19 @@ static int (* const ioctl_handlers[])(struct client *client, void *buffer) = {
+@@ -885,13 +1256,19 @@ static int (* const ioctl_handlers[])(st
  	ioctl_start_iso,
  	ioctl_stop_iso,
  	ioctl_get_cycle_timer,
@@ -1486,7 +1478,7 @@
  
  	if (_IOC_TYPE(cmd) != '#' ||
  	    _IOC_NR(cmd) >= ARRAY_SIZE(ioctl_handlers))
-@@ -903,9 +1280,9 @@ dispatch_ioctl(struct client *client, unsigned int cmd, void __user *arg)
+@@ -903,9 +1280,9 @@ dispatch_ioctl(struct client *client, un
  			return -EFAULT;
  	}
  
@@ -1499,7 +1491,7 @@
  
  	if (_IOC_DIR(cmd) & _IOC_READ) {
  		if (_IOC_SIZE(cmd) > sizeof(buffer) ||
-@@ -913,12 +1290,11 @@ dispatch_ioctl(struct client *client, unsigned int cmd, void __user *arg)
+@@ -913,12 +1290,11 @@ dispatch_ioctl(struct client *client, un
  			return -EFAULT;
  	}
  
@@ -1527,7 +1519,7 @@
  {
  	struct client *client = file->private_data;
  
-@@ -947,7 +1322,7 @@ static int fw_device_op_mmap(struct file *file, struct vm_area_struct *vma)
+@@ -947,7 +1322,7 @@ static int fw_device_op_mmap(struct file
  	struct client *client = file->private_data;
  	enum dma_data_direction direction;
  	unsigned long size;
@@ -1536,7 +1528,7 @@
  
  	if (fw_device_is_shutdown(client->device))
  		return -ENODEV;
-@@ -973,48 +1348,57 @@ static int fw_device_op_mmap(struct file *file, struct vm_area_struct *vma)
+@@ -973,48 +1348,57 @@ static int fw_device_op_mmap(struct file
  	else
  		direction = DMA_FROM_DEVICE;
  
@@ -1617,15 +1609,12 @@
  
  	return 0;
  }
-diff --git a/drivers/firewire/fw-device.c b/drivers/firewire/fw-device.c
-index 2af5a8d..e4efdd3 100644
---- a/drivers/firewire/fw-device.c
-+++ b/drivers/firewire/fw-device.c
-@@ -25,9 +25,12 @@
- #include <linux/device.h>
- #include <linux/delay.h>
+diff -Naurp linux-2.6-git/drivers/firewire/fw-device.c firewire-git/drivers/firewire/fw-device.c
+--- linux-2.6-git/drivers/firewire/fw-device.c	2009-01-30 13:39:02.989651512 -0500
++++ firewire-git/drivers/firewire/fw-device.c	2009-01-30 13:35:51.860646788 -0500
+@@ -27,8 +27,10 @@
  #include <linux/idr.h>
-+#include <linux/jiffies.h>
+ #include <linux/jiffies.h>
  #include <linux/string.h>
 +#include <linux/mutex.h>
  #include <linux/rwsem.h>
@@ -1634,7 +1623,7 @@
  #include <asm/system.h>
  #include <linux/ctype.h>
  #include "fw-transaction.h"
-@@ -131,8 +134,7 @@ static int get_modalias(struct fw_unit *unit, char *buffer, size_t buffer_size)
+@@ -132,8 +134,7 @@ static int get_modalias(struct fw_unit *
  			vendor, model, specifier_id, version);
  }
  
@@ -1644,7 +1633,7 @@
  {
  	struct fw_unit *unit = fw_unit(dev);
  	char modalias[64];
-@@ -190,8 +192,8 @@ struct config_rom_attribute {
+@@ -191,8 +192,8 @@ struct config_rom_attribute {
  	u32 key;
  };
  
@@ -1655,7 +1644,7 @@
  {
  	struct config_rom_attribute *attr =
  		container_of(dattr, struct config_rom_attribute, attr);
-@@ -222,8 +224,8 @@ show_immediate(struct device *dev, struct device_attribute *dattr, char *buf)
+@@ -223,8 +224,8 @@ show_immediate(struct device *dev, struc
  #define IMMEDIATE_ATTR(name, key)				\
  	{ __ATTR(name, S_IRUGO, show_immediate, NULL), key }
  
@@ -1666,7 +1655,7 @@
  {
  	struct config_rom_attribute *attr =
  		container_of(dattr, struct config_rom_attribute, attr);
-@@ -292,10 +294,9 @@ static struct config_rom_attribute config_rom_attributes[] = {
+@@ -293,10 +294,9 @@ static struct config_rom_attribute confi
  	TEXT_LEAF_ATTR(hardware_version_name, CSR_HARDWARE_VERSION),
  };
  
@@ -1680,7 +1669,7 @@
  {
  	struct device_attribute *attr;
  	int i, j;
-@@ -318,9 +319,8 @@ init_fw_attribute_group(struct device *dev,
+@@ -319,9 +319,8 @@ init_fw_attribute_group(struct device *d
  	dev->groups = group->groups;
  }
  
@@ -1692,7 +1681,7 @@
  {
  	struct fw_unit *unit = fw_unit(dev);
  	int length;
-@@ -331,9 +331,8 @@ modalias_show(struct device *dev,
+@@ -332,9 +331,8 @@ modalias_show(struct device *dev,
  	return length + 1;
  }
  
@@ -1704,7 +1693,7 @@
  {
  	struct fw_device *device = fw_device(dev->parent);
  	struct fw_unit *unit = fw_unit(dev);
-@@ -348,8 +347,8 @@ static struct device_attribute fw_unit_attributes[] = {
+@@ -349,8 +347,8 @@ static struct device_attribute fw_unit_a
  	__ATTR_NULL,
  };
  
@@ -1715,7 +1704,7 @@
  {
  	struct fw_device *device = fw_device(dev);
  	size_t length;
-@@ -362,8 +361,8 @@ config_rom_show(struct device *dev, struct device_attribute *attr, char *buf)
+@@ -363,8 +361,8 @@ config_rom_show(struct device *dev, stru
  	return length;
  }
  
@@ -1726,7 +1715,7 @@
  {
  	struct fw_device *device = fw_device(dev);
  	int ret;
-@@ -382,8 +381,8 @@ static struct device_attribute fw_device_attributes[] = {
+@@ -383,8 +381,8 @@ static struct device_attribute fw_device
  	__ATTR_NULL,
  };
  
@@ -1737,193 +1726,7 @@
  {
  	int rcode;
  
-@@ -634,12 +633,38 @@ struct fw_device *fw_device_get_by_devt(dev_t devt)
- 	return device;
- }
- 
-+/*
-+ * These defines control the retry behavior for reading the config
-+ * rom.  It shouldn't be necessary to tweak these; if the device
-+ * doesn't respond to a config rom read within 10 seconds, it's not
-+ * going to respond at all.  As for the initial delay, a lot of
-+ * devices will be able to respond within half a second after bus
-+ * reset.  On the other hand, it's not really worth being more
-+ * aggressive than that, since it scales pretty well; if 10 devices
-+ * are plugged in, they're all getting read within one second.
-+ */
-+
-+#define MAX_RETRIES	10
-+#define RETRY_DELAY	(3 * HZ)
-+#define INITIAL_DELAY	(HZ / 2)
-+#define SHUTDOWN_DELAY	(2 * HZ)
-+
- static void fw_device_shutdown(struct work_struct *work)
- {
- 	struct fw_device *device =
- 		container_of(work, struct fw_device, work.work);
- 	int minor = MINOR(device->device.devt);
- 
-+	if (time_is_after_jiffies(device->card->reset_jiffies + SHUTDOWN_DELAY)) {
-+		schedule_delayed_work(&device->work, SHUTDOWN_DELAY);
-+		return;
-+	}
-+
-+	if (atomic_cmpxchg(&device->state,
-+			   FW_DEVICE_GONE,
-+			   FW_DEVICE_SHUTDOWN) != FW_DEVICE_GONE)
-+		return;
-+
- 	fw_device_cdev_remove(device);
- 	device_for_each_child(&device->device, NULL, shutdown_unit);
- 	device_unregister(&device->device);
-@@ -647,6 +672,7 @@ static void fw_device_shutdown(struct work_struct *work)
- 	down_write(&fw_device_rwsem);
- 	idr_remove(&fw_device_idr, minor);
- 	up_write(&fw_device_rwsem);
-+
- 	fw_device_put(device);
- }
- 
-@@ -654,25 +680,63 @@ static struct device_type fw_device_type = {
- 	.release	= fw_device_release,
- };
- 
-+static void fw_device_update(struct work_struct *work);
-+
- /*
-- * These defines control the retry behavior for reading the config
-- * rom.  It shouldn't be necessary to tweak these; if the device
-- * doesn't respond to a config rom read within 10 seconds, it's not
-- * going to respond at all.  As for the initial delay, a lot of
-- * devices will be able to respond within half a second after bus
-- * reset.  On the other hand, it's not really worth being more
-- * aggressive than that, since it scales pretty well; if 10 devices
-- * are plugged in, they're all getting read within one second.
-+ * If a device was pending for deletion because its node went away but its
-+ * bus info block and root directory header matches that of a newly discovered
-+ * device, revive the existing fw_device.
-+ * The newly allocated fw_device becomes obsolete instead.
-  */
-+static int lookup_existing_device(struct device *dev, void *data)
-+{
-+	struct fw_device *old = fw_device(dev);
-+	struct fw_device *new = data;
-+	struct fw_card *card = new->card;
-+	int match = 0;
-+
-+	down_read(&fw_device_rwsem); /* serialize config_rom access */
-+	spin_lock_irq(&card->lock);  /* serialize node access */
-+
-+	if (memcmp(old->config_rom, new->config_rom, 6 * 4) == 0 &&
-+	    atomic_cmpxchg(&old->state,
-+			   FW_DEVICE_GONE,
-+			   FW_DEVICE_RUNNING) == FW_DEVICE_GONE) {
-+		struct fw_node *current_node = new->node;
-+		struct fw_node *obsolete_node = old->node;
-+
-+		new->node = obsolete_node;
-+		new->node->data = new;
-+		old->node = current_node;
-+		old->node->data = old;
-+
-+		old->max_speed = new->max_speed;
-+		old->node_id = current_node->node_id;
-+		smp_wmb();  /* update node_id before generation */
-+		old->generation = card->generation;
-+		old->config_rom_retries = 0;
-+		fw_notify("rediscovered device %s\n", dev_name(dev));
- 
--#define MAX_RETRIES	10
--#define RETRY_DELAY	(3 * HZ)
--#define INITIAL_DELAY	(HZ / 2)
-+		PREPARE_DELAYED_WORK(&old->work, fw_device_update);
-+		schedule_delayed_work(&old->work, 0);
-+
-+		if (current_node == card->root_node)
-+			fw_schedule_bm_work(card, 0);
-+
-+		match = 1;
-+	}
-+
-+	spin_unlock_irq(&card->lock);
-+	up_read(&fw_device_rwsem);
-+
-+	return match;
-+}
- 
- static void fw_device_init(struct work_struct *work)
- {
- 	struct fw_device *device =
- 		container_of(work, struct fw_device, work.work);
-+	struct device *revived_dev;
- 	int minor, err;
- 
- 	/*
-@@ -696,6 +760,15 @@ static void fw_device_init(struct work_struct *work)
- 		return;
- 	}
- 
-+	revived_dev = device_find_child(device->card->device,
-+					device, lookup_existing_device);
-+	if (revived_dev) {
-+		put_device(revived_dev);
-+		fw_device_release(&device->device);
-+
-+		return;
-+	}
-+
- 	device_initialize(&device->device);
- 
- 	fw_device_get(device);
-@@ -734,9 +807,10 @@ static void fw_device_init(struct work_struct *work)
- 	 * fw_node_event().
- 	 */
- 	if (atomic_cmpxchg(&device->state,
--		    FW_DEVICE_INITIALIZING,
--		    FW_DEVICE_RUNNING) == FW_DEVICE_SHUTDOWN) {
--		fw_device_shutdown(work);
-+			   FW_DEVICE_INITIALIZING,
-+			   FW_DEVICE_RUNNING) == FW_DEVICE_GONE) {
-+		PREPARE_DELAYED_WORK(&device->work, fw_device_shutdown);
-+		schedule_delayed_work(&device->work, SHUTDOWN_DELAY);
- 	} else {
- 		if (device->config_rom_retries)
- 			fw_notify("created device %s: GUID %08x%08x, S%d00, "
-@@ -847,8 +921,8 @@ static void fw_device_refresh(struct work_struct *work)
- 
- 	case REREAD_BIB_UNCHANGED:
- 		if (atomic_cmpxchg(&device->state,
--			    FW_DEVICE_INITIALIZING,
--			    FW_DEVICE_RUNNING) == FW_DEVICE_SHUTDOWN)
-+				   FW_DEVICE_INITIALIZING,
-+				   FW_DEVICE_RUNNING) == FW_DEVICE_GONE)
- 			goto gone;
- 
- 		fw_device_update(work);
-@@ -879,8 +953,8 @@ static void fw_device_refresh(struct work_struct *work)
- 	create_units(device);
- 
- 	if (atomic_cmpxchg(&device->state,
--		    FW_DEVICE_INITIALIZING,
--		    FW_DEVICE_RUNNING) == FW_DEVICE_SHUTDOWN)
-+			   FW_DEVICE_INITIALIZING,
-+			   FW_DEVICE_RUNNING) == FW_DEVICE_GONE)
- 		goto gone;
- 
- 	fw_notify("refreshed device %s\n", dev_name(&device->device));
-@@ -890,8 +964,9 @@ static void fw_device_refresh(struct work_struct *work)
-  give_up:
- 	fw_notify("giving up on refresh of device %s\n", dev_name(&device->device));
-  gone:
--	atomic_set(&device->state, FW_DEVICE_SHUTDOWN);
--	fw_device_shutdown(work);
-+	atomic_set(&device->state, FW_DEVICE_GONE);
-+	PREPARE_DELAYED_WORK(&device->work, fw_device_shutdown);
-+	schedule_delayed_work(&device->work, SHUTDOWN_DELAY);
-  out:
- 	if (node_id == card->root_node->node_id)
- 		fw_schedule_bm_work(card, 0);
-@@ -926,6 +1001,7 @@ void fw_node_event(struct fw_card *card, struct fw_node *node, int event)
+@@ -1004,6 +1002,7 @@ void fw_node_event(struct fw_card *card,
  		device->node = fw_node_get(node);
  		device->node_id = node->node_id;
  		device->generation = card->generation;
@@ -1931,23 +1734,10 @@
  		INIT_LIST_HEAD(&device->client_list);
  
  		/*
-@@ -995,9 +1071,9 @@ void fw_node_event(struct fw_card *card, struct fw_node *node, int event)
- 		 */
- 		device = node->data;
- 		if (atomic_xchg(&device->state,
--				FW_DEVICE_SHUTDOWN) == FW_DEVICE_RUNNING) {
-+				FW_DEVICE_GONE) == FW_DEVICE_RUNNING) {
- 			PREPARE_DELAYED_WORK(&device->work, fw_device_shutdown);
--			schedule_delayed_work(&device->work, 0);
-+			schedule_delayed_work(&device->work, SHUTDOWN_DELAY);
- 		}
- 		break;
- 	}
-diff --git a/drivers/firewire/fw-device.h b/drivers/firewire/fw-device.h
-index df51732..41483f1 100644
---- a/drivers/firewire/fw-device.h
-+++ b/drivers/firewire/fw-device.h
-@@ -23,11 +23,13 @@
+diff -Naurp linux-2.6-git/drivers/firewire/fw-device.h firewire-git/drivers/firewire/fw-device.h
+--- linux-2.6-git/drivers/firewire/fw-device.h	2009-01-30 13:39:02.989651512 -0500
++++ firewire-git/drivers/firewire/fw-device.h	2009-01-30 13:35:51.860646788 -0500
+@@ -23,6 +23,7 @@
  #include <linux/cdev.h>
  #include <linux/idr.h>
  #include <linux/rwsem.h>
@@ -1955,13 +1745,7 @@
  #include <asm/atomic.h>
  
  enum fw_device_state {
- 	FW_DEVICE_INITIALIZING,
- 	FW_DEVICE_RUNNING,
-+	FW_DEVICE_GONE,
- 	FW_DEVICE_SHUTDOWN,
- };
- 
-@@ -63,7 +65,10 @@ struct fw_device {
+@@ -64,7 +65,10 @@ struct fw_device {
  	bool cmc;
  	struct fw_card *card;
  	struct device device;
@@ -1972,7 +1756,7 @@
  	u32 *config_rom;
  	size_t config_rom_length;
  	int config_rom_retries;
-@@ -175,8 +180,7 @@ struct fw_driver {
+@@ -176,8 +180,7 @@ struct fw_driver {
  	const struct fw_device_id *id_table;
  };
  
@@ -1982,10 +1766,9 @@
  {
  	return container_of(drv, struct fw_driver, driver);
  }
-diff --git a/drivers/firewire/fw-iso.c b/drivers/firewire/fw-iso.c
-index e14c03d..f511d16 100644
---- a/drivers/firewire/fw-iso.c
-+++ b/drivers/firewire/fw-iso.c
+diff -Naurp linux-2.6-git/drivers/firewire/fw-iso.c firewire-git/drivers/firewire/fw-iso.c
+--- linux-2.6-git/drivers/firewire/fw-iso.c	2008-11-04 11:18:33.000000000 -0500
++++ firewire-git/drivers/firewire/fw-iso.c	2009-01-30 13:35:51.860646788 -0500
 @@ -1,5 +1,7 @@
  /*
 - * Isochronous IO functionality
@@ -2030,7 +1813,7 @@
  	dma_addr_t address;
  
  	buffer->page_count = page_count;
-@@ -69,19 +75,19 @@ fw_iso_buffer_init(struct fw_iso_buffer *buffer, struct fw_card *card,
+@@ -69,19 +75,19 @@ fw_iso_buffer_init(struct fw_iso_buffer 
  	kfree(buffer->pages);
   out:
  	buffer->pages = NULL;
@@ -2055,7 +1838,7 @@
  		uaddr += PAGE_SIZE;
  	}
  
-@@ -105,14 +111,14 @@ void fw_iso_buffer_destroy(struct fw_iso_buffer *buffer,
+@@ -105,14 +111,14 @@ void fw_iso_buffer_destroy(struct fw_iso
  	buffer->pages = NULL;
  }
  
@@ -2075,7 +1858,7 @@
  	if (IS_ERR(ctx))
  		return ctx;
  
-@@ -134,25 +140,186 @@ void fw_iso_context_destroy(struct fw_iso_context *ctx)
+@@ -134,25 +140,186 @@ void fw_iso_context_destroy(struct fw_is
  	card->driver->free_iso_context(ctx);
  }
  
@@ -2271,10 +2054,9 @@
 +		*channel = ret;
 +	}
 +}
-diff --git a/drivers/firewire/fw-ohci.c b/drivers/firewire/fw-ohci.c
-index ab9c01e..859af71 100644
---- a/drivers/firewire/fw-ohci.c
-+++ b/drivers/firewire/fw-ohci.c
+diff -Naurp linux-2.6-git/drivers/firewire/fw-ohci.c firewire-git/drivers/firewire/fw-ohci.c
+--- linux-2.6-git/drivers/firewire/fw-ohci.c	2009-01-30 13:39:02.990772025 -0500
++++ firewire-git/drivers/firewire/fw-ohci.c	2009-01-30 13:35:51.861646907 -0500
 @@ -205,6 +205,7 @@ struct fw_ohci {
  
  	u32 it_context_mask;
@@ -2283,16 +2065,7 @@
  	u32 ir_context_mask;
  	struct iso_context *ir_context_list;
  };
-@@ -226,7 +227,7 @@ static inline struct fw_ohci *fw_ohci(struct fw_card *card)
- #define CONTEXT_DEAD	0x0800
- #define CONTEXT_ACTIVE	0x0400
- 
--#define OHCI1394_MAX_AT_REQ_RETRIES	0x2
-+#define OHCI1394_MAX_AT_REQ_RETRIES	0xf
- #define OHCI1394_MAX_AT_RESP_RETRIES	0x2
- #define OHCI1394_MAX_PHYS_RESP_RETRIES	0x8
- 
-@@ -441,9 +442,8 @@ static inline void flush_writes(const struct fw_ohci *ohci)
+@@ -441,9 +442,8 @@ static inline void flush_writes(const st
  	reg_read(ohci, OHCI1394_Version);
  }
  
@@ -2304,7 +2077,7 @@
  {
  	struct fw_ohci *ohci = fw_ohci(card);
  	u32 val, old;
-@@ -658,8 +658,8 @@ static void ar_context_tasklet(unsigned long data)
+@@ -658,8 +658,8 @@ static void ar_context_tasklet(unsigned 
  	}
  }
  
@@ -2315,7 +2088,7 @@
  {
  	struct ar_buffer ab;
  
-@@ -690,8 +690,7 @@ static void ar_context_run(struct ar_context *ctx)
+@@ -690,8 +690,7 @@ static void ar_context_run(struct ar_con
  	flush_writes(ctx->ohci);
  }
  
@@ -2325,7 +2098,7 @@
  {
  	int b, key;
  
-@@ -751,8 +750,7 @@ static void context_tasklet(unsigned long data)
+@@ -751,8 +750,7 @@ static void context_tasklet(unsigned lon
   * Allocate a new buffer and add it to the list of free buffers for this
   * context.  Must be called with ohci->lock held.
   */
@@ -2347,7 +2120,7 @@
  {
  	ctx->ohci = ohci;
  	ctx->regs = regs;
-@@ -814,8 +811,7 @@ context_init(struct context *ctx, struct fw_ohci *ohci,
+@@ -814,8 +811,7 @@ context_init(struct context *ctx, struct
  	return 0;
  }
  
@@ -2368,20 +2141,6 @@
  {
  	struct descriptor *d = NULL;
  	struct descriptor_buffer *desc = ctx->buffer_tail;
-@@ -896,11 +892,11 @@ static void context_stop(struct context *ctx)
- 	for (i = 0; i < 10; i++) {
- 		reg = reg_read(ctx->ohci, CONTROL_SET(ctx->regs));
- 		if ((reg & CONTEXT_ACTIVE) == 0)
--			break;
-+			return;
- 
--		fw_notify("context_stop: still active (0x%08x)\n", reg);
- 		mdelay(1);
- 	}
-+	fw_error("Error: DMA context still active (0x%08x)\n", reg);
- }
- 
- struct driver_data {
 @@ -912,8 +908,8 @@ struct driver_data {
   * Must always be called with the ochi->lock held to ensure proper
   * generation handling and locking around packet queue manipulation.
@@ -2393,7 +2152,7 @@
  {
  	struct fw_ohci *ohci = ctx->ohci;
  	dma_addr_t d_bus, uninitialized_var(payload_bus);
-@@ -1095,8 +1091,8 @@ static int handle_at_packet(struct context *context,
+@@ -1095,8 +1091,8 @@ static int handle_at_packet(struct conte
  #define HEADER_GET_DATA_LENGTH(q)	(((q) >> 16) & 0xffff)
  #define HEADER_GET_EXTENDED_TCODE(q)	(((q) >> 0) & 0xffff)
  
@@ -2404,7 +2163,7 @@
  {
  	struct fw_packet response;
  	int tcode, length, i;
-@@ -1122,8 +1118,8 @@ handle_local_rom(struct fw_ohci *ohci, struct fw_packet *packet, u32 csr)
+@@ -1122,8 +1118,8 @@ handle_local_rom(struct fw_ohci *ohci, s
  	fw_core_handle_response(&ohci->card, &response);
  }
  
@@ -2415,7 +2174,7 @@
  {
  	struct fw_packet response;
  	int tcode, length, ext_tcode, sel;
-@@ -1164,8 +1160,7 @@ handle_local_lock(struct fw_ohci *ohci, struct fw_packet *packet, u32 csr)
+@@ -1164,8 +1160,7 @@ handle_local_lock(struct fw_ohci *ohci, 
  	fw_core_handle_response(&ohci->card, &response);
  }
  
@@ -2425,7 +2184,7 @@
  {
  	u64 offset;
  	u32 csr;
-@@ -1205,11 +1200,10 @@ handle_local_request(struct context *ctx, struct fw_packet *packet)
+@@ -1205,11 +1200,10 @@ handle_local_request(struct context *ctx
  	}
  }
  
@@ -2439,7 +2198,7 @@
  
  	spin_lock_irqsave(&ctx->ohci->lock, flags);
  
-@@ -1220,10 +1214,10 @@ at_context_transmit(struct context *ctx, struct fw_packet *packet)
+@@ -1220,10 +1214,10 @@ at_context_transmit(struct context *ctx,
  		return;
  	}
  
@@ -2452,7 +2211,7 @@
  		packet->callback(packet, &ctx->ohci->card, packet->ack);
  
  }
-@@ -1590,12 +1584,12 @@ static int ohci_enable(struct fw_card *card, u32 *config_rom, size_t length)
+@@ -1590,12 +1584,12 @@ static int ohci_enable(struct fw_card *c
  	return 0;
  }
  
@@ -2468,7 +2227,7 @@
  	__be32 *next_config_rom;
  	dma_addr_t uninitialized_var(next_config_rom_bus);
  
-@@ -1649,7 +1643,7 @@ ohci_set_config_rom(struct fw_card *card, u32 *config_rom, size_t length)
+@@ -1649,7 +1643,7 @@ ohci_set_config_rom(struct fw_card *card
  
  		reg_write(ohci, OHCI1394_ConfigROMmap,
  			  ohci->next_config_rom_bus);
@@ -2477,7 +2236,7 @@
  	}
  
  	spin_unlock_irqrestore(&ohci->lock, flags);
-@@ -1661,13 +1655,13 @@ ohci_set_config_rom(struct fw_card *card, u32 *config_rom, size_t length)
+@@ -1661,13 +1655,13 @@ ohci_set_config_rom(struct fw_card *card
  	 * controller could need to access it before the bus reset
  	 * takes effect.
  	 */
@@ -2493,7 +2252,7 @@
  }
  
  static void ohci_send_request(struct fw_card *card, struct fw_packet *packet)
-@@ -1689,7 +1683,7 @@ static int ohci_cancel_packet(struct fw_card *card, struct fw_packet *packet)
+@@ -1689,7 +1683,7 @@ static int ohci_cancel_packet(struct fw_
  	struct fw_ohci *ohci = fw_ohci(card);
  	struct context *ctx = &ohci->at_request_ctx;
  	struct driver_data *driver_data = packet->driver_data;
@@ -2502,7 +2261,7 @@
  
  	tasklet_disable(&ctx->tasklet);
  
-@@ -1704,23 +1698,22 @@ static int ohci_cancel_packet(struct fw_card *card, struct fw_packet *packet)
+@@ -1704,23 +1698,22 @@ static int ohci_cancel_packet(struct fw_
  	driver_data->packet = NULL;
  	packet->ack = RCODE_CANCELLED;
  	packet->callback(packet, &ohci->card, packet->ack);
@@ -2531,7 +2290,7 @@
  
  	/*
  	 * FIXME:  Make sure this bitmask is cleared when we clear the busReset
-@@ -1730,7 +1723,7 @@ ohci_enable_phys_dma(struct fw_card *card, int node_id, int generation)
+@@ -1730,7 +1723,7 @@ ohci_enable_phys_dma(struct fw_card *car
  	spin_lock_irqsave(&ohci->lock, flags);
  
  	if (ohci->generation != generation) {
@@ -2540,7 +2299,7 @@
  		goto out;
  	}
  
-@@ -1748,12 +1741,12 @@ ohci_enable_phys_dma(struct fw_card *card, int node_id, int generation)
+@@ -1748,12 +1741,12 @@ ohci_enable_phys_dma(struct fw_card *car
  	flush_writes(ohci);
   out:
  	spin_unlock_irqrestore(&ohci->lock, flags);
@@ -2585,7 +2344,7 @@
  static int handle_ir_dualbuffer_packet(struct context *context,
  				       struct descriptor *d,
  				       struct descriptor *last)
-@@ -1775,7 +1790,6 @@ static int handle_ir_dualbuffer_packet(struct context *context,
+@@ -1775,7 +1790,6 @@ static int handle_ir_dualbuffer_packet(s
  	__le32 *ir_header;
  	size_t header_length;
  	void *p, *end;
@@ -2593,7 +2352,7 @@
  
  	if (db->first_res_count != 0 && db->second_res_count != 0) {
  		if (ctx->excess_bytes <= le16_to_cpu(db->second_req_count)) {
-@@ -1788,25 +1802,14 @@ static int handle_ir_dualbuffer_packet(struct context *context,
+@@ -1788,25 +1802,14 @@ static int handle_ir_dualbuffer_packet(s
  	header_length = le16_to_cpu(db->first_req_count) -
  		le16_to_cpu(db->first_res_count);
  
@@ -2622,7 +2381,7 @@
  
  	ctx->excess_bytes -= le16_to_cpu(db->second_req_count) -
  		le16_to_cpu(db->second_res_count);
-@@ -1832,7 +1835,6 @@ static int handle_ir_packet_per_buffer(struct context *context,
+@@ -1832,7 +1835,6 @@ static int handle_ir_packet_per_buffer(s
  	struct descriptor *pd;
  	__le32 *ir_header;
  	void *p;
@@ -2630,7 +2389,7 @@
  
  	for (pd = d; pd <= last; pd++) {
  		if (pd->transfer_status)
-@@ -1842,21 +1844,8 @@ static int handle_ir_packet_per_buffer(struct context *context,
+@@ -1842,21 +1844,8 @@ static int handle_ir_packet_per_buffer(s
  		/* Descriptor(s) not done yet, stop iteration */
  		return 0;
  
@@ -2654,7 +2413,7 @@
  
  	if (le16_to_cpu(last->control) & DESCRIPTOR_IRQ_ALWAYS) {
  		ir_header = (__le32 *) p;
-@@ -1888,21 +1877,24 @@ static int handle_it_packet(struct context *context,
+@@ -1888,21 +1877,24 @@ static int handle_it_packet(struct conte
  	return 1;
  }
  
@@ -2682,7 +2441,7 @@
  		mask = &ohci->ir_context_mask;
  		list = ohci->ir_context_list;
  		if (ohci->use_dualbuffer)
-@@ -1912,9 +1904,11 @@ ohci_allocate_iso_context(struct fw_card *card, int type, size_t header_size)
+@@ -1912,9 +1904,11 @@ ohci_allocate_iso_context(struct fw_card
  	}
  
  	spin_lock_irqsave(&ohci->lock, flags);
@@ -2696,7 +2455,7 @@
  	spin_unlock_irqrestore(&ohci->lock, flags);
  
  	if (index < 0)
-@@ -1932,8 +1926,8 @@ ohci_allocate_iso_context(struct fw_card *card, int type, size_t header_size)
+@@ -1932,8 +1926,8 @@ ohci_allocate_iso_context(struct fw_card
  	if (ctx->header == NULL)
  		goto out;
  
@@ -2707,7 +2466,7 @@
  		goto out_with_header;
  
  	return &ctx->base;
-@@ -1945,7 +1939,7 @@ ohci_allocate_iso_context(struct fw_card *card, int type, size_t header_size)
+@@ -1945,7 +1939,7 @@ ohci_allocate_iso_context(struct fw_card
  	*mask |= 1 << index;
  	spin_unlock_irqrestore(&ohci->lock, flags);
  
@@ -2716,7 +2475,7 @@
  }
  
  static int ohci_start_iso(struct fw_iso_context *base,
-@@ -2024,16 +2018,16 @@ static void ohci_free_iso_context(struct fw_iso_context *base)
+@@ -2024,16 +2018,16 @@ static void ohci_free_iso_context(struct
  	} else {
  		index = ctx - ohci->ir_context_list;
  		ohci->ir_context_mask |= 1 << index;
@@ -2738,7 +2497,7 @@
  {
  	struct iso_context *ctx = container_of(base, struct iso_context, base);
  	struct descriptor *d, *last, *pd;
-@@ -2128,11 +2122,10 @@ ohci_queue_iso_transmit(struct fw_iso_context *base,
+@@ -2128,11 +2122,10 @@ ohci_queue_iso_transmit(struct fw_iso_co
  	return 0;
  }
  
@@ -2754,7 +2513,7 @@
  {
  	struct iso_context *ctx = container_of(base, struct iso_context, base);
  	struct db_descriptor *db = NULL;
-@@ -2151,11 +2144,11 @@ ohci_queue_iso_receive_dualbuffer(struct fw_iso_context *base,
+@@ -2151,11 +2144,11 @@ ohci_queue_iso_receive_dualbuffer(struct
  	z = 2;
  
  	/*
@@ -2769,7 +2528,7 @@
  
  	/* Get header size in number of descriptors. */
  	header_z = DIV_ROUND_UP(header_size, sizeof(*d));
-@@ -2173,7 +2166,8 @@ ohci_queue_iso_receive_dualbuffer(struct fw_iso_context *base,
+@@ -2173,7 +2166,8 @@ ohci_queue_iso_receive_dualbuffer(struct
  		db = (struct db_descriptor *) d;
  		db->control = cpu_to_le16(DESCRIPTOR_STATUS |
  					  DESCRIPTOR_BRANCH_ALWAYS);
@@ -2779,7 +2538,7 @@
  		if (p->skip && rest == p->payload_length) {
  			db->control |= cpu_to_le16(DESCRIPTOR_WAIT);
  			db->first_req_count = db->first_size;
-@@ -2208,11 +2202,10 @@ ohci_queue_iso_receive_dualbuffer(struct fw_iso_context *base,
+@@ -2208,11 +2202,10 @@ ohci_queue_iso_receive_dualbuffer(struct
  	return 0;
  }
  
@@ -2795,7 +2554,7 @@
  {
  	struct iso_context *ctx = container_of(base, struct iso_context, base);
  	struct descriptor *d = NULL, *pd = NULL;
-@@ -2223,11 +2216,11 @@ ohci_queue_iso_receive_packet_per_buffer(struct fw_iso_context *base,
+@@ -2223,11 +2216,11 @@ ohci_queue_iso_receive_packet_per_buffer
  	int page, offset, packet_count, header_size, payload_per_buffer;
  
  	/*
@@ -2810,7 +2569,7 @@
  
  	/* Get header size in number of descriptors. */
  	header_z = DIV_ROUND_UP(header_size, sizeof(*d));
-@@ -2286,29 +2279,27 @@ ohci_queue_iso_receive_packet_per_buffer(struct fw_iso_context *base,
+@@ -2286,29 +2279,27 @@ ohci_queue_iso_receive_packet_per_buffer
  	return 0;
  }
  
@@ -2851,7 +2610,7 @@
  }
  
  static const struct fw_card_driver ohci_driver = {
-@@ -2357,8 +2348,8 @@ static void ohci_pmac_off(struct pci_dev *dev)
+@@ -2357,8 +2348,8 @@ static void ohci_pmac_off(struct pci_dev
  #define ohci_pmac_off(dev)
  #endif /* CONFIG_PPC_PMAC */
  
@@ -2862,7 +2621,7 @@
  {
  	struct fw_ohci *ohci;
  	u32 bus_options, max_receive, link_speed, version;
-@@ -2440,6 +2431,7 @@ pci_probe(struct pci_dev *dev, const struct pci_device_id *ent)
+@@ -2440,6 +2431,7 @@ pci_probe(struct pci_dev *dev, const str
  	ohci->it_context_list = kzalloc(size, GFP_KERNEL);
  
  	reg_write(ohci, OHCI1394_IsoXmitIntMaskSet, ~0);
@@ -2870,11 +2629,10 @@
  	ohci->ir_context_mask = reg_read(ohci, OHCI1394_IsoXmitIntMaskSet);
  	reg_write(ohci, OHCI1394_IsoXmitIntMaskClear, ~0);
  	size = sizeof(struct iso_context) * hweight32(ohci->ir_context_mask);
-diff --git a/drivers/firewire/fw-sbp2.c b/drivers/firewire/fw-sbp2.c
-index e88d506..090e72e 100644
---- a/drivers/firewire/fw-sbp2.c
-+++ b/drivers/firewire/fw-sbp2.c
-@@ -387,20 +387,18 @@ static const struct {
+diff -Naurp linux-2.6-git/drivers/firewire/fw-sbp2.c firewire-git/drivers/firewire/fw-sbp2.c
+--- linux-2.6-git/drivers/firewire/fw-sbp2.c	2009-01-30 13:39:02.991771976 -0500
++++ firewire-git/drivers/firewire/fw-sbp2.c	2009-01-30 13:35:51.861646907 -0500
+@@ -392,20 +392,18 @@ static const struct {
  	}
  };
  
@@ -2901,7 +2659,7 @@
  {
  	struct sbp2_logical_unit *lu = callback_data;
  	struct sbp2_orb *orb;
-@@ -446,9 +444,8 @@ sbp2_status_write(struct fw_card *card, struct fw_request *request,
+@@ -451,9 +449,8 @@ sbp2_status_write(struct fw_card *card, 
  	fw_send_response(card, request, RCODE_COMPLETE);
  }
  
@@ -2913,7 +2671,7 @@
  {
  	struct sbp2_orb *orb = data;
  	unsigned long flags;
-@@ -477,9 +474,8 @@ complete_transaction(struct fw_card *card, int rcode,
+@@ -482,9 +479,8 @@ complete_transaction(struct fw_card *car
  	kref_put(&orb->kref, free_orb);
  }
  
@@ -2925,7 +2683,7 @@
  {
  	struct fw_device *device = fw_device(lu->tgt->unit->device.parent);
  	unsigned long flags;
-@@ -526,8 +522,8 @@ static int sbp2_cancel_orbs(struct sbp2_logical_unit *lu)
+@@ -531,8 +527,8 @@ static int sbp2_cancel_orbs(struct sbp2_
  	return retval;
  }
  
@@ -2936,7 +2694,7 @@
  {
  	struct sbp2_management_orb *orb =
  		container_of(base_orb, struct sbp2_management_orb, base);
-@@ -537,10 +533,9 @@ complete_management_orb(struct sbp2_orb *base_orb, struct sbp2_status *status)
+@@ -542,10 +538,9 @@ complete_management_orb(struct sbp2_orb 
  	complete(&orb->done);
  }
  
@@ -2950,7 +2708,7 @@
  {
  	struct fw_device *device = fw_device(lu->tgt->unit->device.parent);
  	struct sbp2_management_orb *orb;
-@@ -647,9 +642,8 @@ static void sbp2_agent_reset(struct sbp2_logical_unit *lu)
+@@ -652,9 +647,8 @@ static void sbp2_agent_reset(struct sbp2
  			   &d, sizeof(d));
  }
  
@@ -2962,9 +2720,9 @@
  {
  	kfree(data);
  }
-@@ -1273,8 +1267,7 @@ static struct fw_driver sbp2_driver = {
- 	.id_table = sbp2_id_table,
- };
+@@ -1299,8 +1293,7 @@ static void sbp2_unmap_scatterlist(struc
+ 				 sizeof(orb->page_table), DMA_TO_DEVICE);
+ }
  
 -static unsigned int
 -sbp2_status_to_sense_data(u8 *sbp2_status, u8 *sense_data)
@@ -2972,7 +2730,7 @@
  {
  	int sam_status;
  
-@@ -1311,8 +1304,8 @@ sbp2_status_to_sense_data(u8 *sbp2_status, u8 *sense_data)
+@@ -1337,8 +1330,8 @@ sbp2_status_to_sense_data(u8 *sbp2_statu
  	}
  }
  
@@ -2983,7 +2741,7 @@
  {
  	struct sbp2_command_orb *orb =
  		container_of(base_orb, struct sbp2_command_orb, base);
-@@ -1366,9 +1359,8 @@ complete_command_orb(struct sbp2_orb *base_orb, struct sbp2_status *status)
+@@ -1384,9 +1377,8 @@ complete_command_orb(struct sbp2_orb *ba
  	orb->done(orb->cmd);
  }
  
@@ -2995,7 +2753,7 @@
  {
  	struct scatterlist *sg = scsi_sglist(orb->cmd);
  	int i, n;
-@@ -1573,9 +1565,8 @@ static int sbp2_scsi_abort(struct scsi_cmnd *cmd)
+@@ -1584,9 +1576,8 @@ static int sbp2_scsi_abort(struct scsi_c
   * This is the concatenation of target port identifier and logical unit
   * identifier as per SAM-2...SAM-4 annex A.
   */
@@ -3007,11 +2765,10 @@
  {
  	struct scsi_device *sdev = to_scsi_device(dev);
  	struct sbp2_logical_unit *lu;
-diff --git a/drivers/firewire/fw-topology.c b/drivers/firewire/fw-topology.c
-index c9be6e6..b44131c 100644
---- a/drivers/firewire/fw-topology.c
-+++ b/drivers/firewire/fw-topology.c
-@@ -314,9 +314,8 @@ typedef void (*fw_node_callback_t)(struct fw_card * card,
+diff -Naurp linux-2.6-git/drivers/firewire/fw-topology.c firewire-git/drivers/firewire/fw-topology.c
+--- linux-2.6-git/drivers/firewire/fw-topology.c	2009-01-30 13:39:02.991771976 -0500
++++ firewire-git/drivers/firewire/fw-topology.c	2009-01-30 13:35:51.862647087 -0500
+@@ -314,9 +314,8 @@ typedef void (*fw_node_callback_t)(struc
  				   struct fw_node * node,
  				   struct fw_node * parent);
  
@@ -3023,7 +2780,7 @@
  {
  	struct list_head list;
  	struct fw_node *node, *next, *child, *parent;
-@@ -349,9 +348,8 @@ for_each_fw_node(struct fw_card *card, struct fw_node *root,
+@@ -349,9 +348,8 @@ for_each_fw_node(struct fw_card *card, s
  		fw_node_put(node);
  }
  
@@ -3047,7 +2804,7 @@
  {
  	int b_path = (node->phy_speed == SCODE_BETA);
  
-@@ -415,8 +412,7 @@ static void move_tree(struct fw_node *node0, struct fw_node *node1, int port)
+@@ -415,8 +412,7 @@ static void move_tree(struct fw_node *no
   * found, lost or updated.  Update the nodes in the card topology tree
   * as we go.
   */
@@ -3057,7 +2814,7 @@
  {
  	struct list_head list0, list1;
  	struct fw_node *node0, *node1, *next1;
-@@ -497,8 +493,8 @@ update_tree(struct fw_card *card, struct fw_node *root)
+@@ -497,8 +493,8 @@ update_tree(struct fw_card *card, struct
  	}
  }
  
@@ -3068,7 +2825,7 @@
  {
  	int node_count;
  
-@@ -510,14 +506,24 @@ update_topology_map(struct fw_card *card, u32 *self_ids, int self_id_count)
+@@ -510,10 +506,8 @@ update_topology_map(struct fw_card *card
  	fw_compute_block_crc(card->topology_map);
  }
  
@@ -3081,26 +2838,9 @@
  {
  	struct fw_node *local_node;
  	unsigned long flags;
- 
-+	/*
-+	 * If the selfID buffer is not the immediate successor of the
-+	 * previously processed one, we cannot reliably compare the
-+	 * old and new topologies.
-+	 */
-+	if (!is_next_generation(generation, card->generation) &&
-+	    card->local_node != NULL) {
-+		fw_notify("skipped bus generations, destroying all nodes\n");
-+		fw_destroy_nodes(card);
-+		card->bm_retries = 0;
-+	}
-+
- 	spin_lock_irqsave(&card->lock, flags);
- 
- 	card->node_id = node_id;
-diff --git a/drivers/firewire/fw-topology.h b/drivers/firewire/fw-topology.h
-index addb9f8..3c497bb 100644
---- a/drivers/firewire/fw-topology.h
-+++ b/drivers/firewire/fw-topology.h
+diff -Naurp linux-2.6-git/drivers/firewire/fw-topology.h firewire-git/drivers/firewire/fw-topology.h
+--- linux-2.6-git/drivers/firewire/fw-topology.h	2008-11-04 11:18:33.000000000 -0500
++++ firewire-git/drivers/firewire/fw-topology.h	2009-01-30 13:35:51.862647087 -0500
 @@ -19,6 +19,11 @@
  #ifndef __fw_topology_h
  #define __fw_topology_h
@@ -3145,10 +2885,9 @@
 +int fw_compute_block_crc(u32 *block);
  
  #endif /* __fw_topology_h */
-diff --git a/drivers/firewire/fw-transaction.c b/drivers/firewire/fw-transaction.c
-index 699ac04..1537737 100644
---- a/drivers/firewire/fw-transaction.c
-+++ b/drivers/firewire/fw-transaction.c
+diff -Naurp linux-2.6-git/drivers/firewire/fw-transaction.c firewire-git/drivers/firewire/fw-transaction.c
+--- linux-2.6-git/drivers/firewire/fw-transaction.c	2009-01-30 13:39:02.991771976 -0500
++++ firewire-git/drivers/firewire/fw-transaction.c	2009-01-30 13:35:51.862647087 -0500
 @@ -64,10 +64,9 @@
  #define PHY_CONFIG_ROOT_ID(node_id)	((((node_id) & 0x3f) << 24) | (1 << 23))
  #define PHY_IDENTIFIER(id)		((id) << 30)
@@ -3163,7 +2902,7 @@
  {
  	struct fw_transaction *t;
  	unsigned long flags;
-@@ -94,9 +93,8 @@ close_transaction(struct fw_transaction *transaction,
+@@ -94,9 +93,8 @@ close_transaction(struct fw_transaction 
   * Only valid for transactions that are potentially pending (ie have
   * been sent).
   */
@@ -3175,7 +2914,7 @@
  {
  	/*
  	 * Cancel the packet transmission if it's still queued.  That
-@@ -116,9 +114,8 @@ fw_cancel_transaction(struct fw_card *card,
+@@ -116,9 +114,8 @@ fw_cancel_transaction(struct fw_card *ca
  }
  EXPORT_SYMBOL(fw_cancel_transaction);
  
@@ -3187,7 +2926,7 @@
  {
  	struct fw_transaction *t =
  	    container_of(packet, struct fw_transaction, packet);
-@@ -151,8 +148,7 @@ transmit_complete_callback(struct fw_packet *packet,
+@@ -151,8 +148,7 @@ transmit_complete_callback(struct fw_pac
  	}
  }
  
@@ -3197,7 +2936,7 @@
  		int destination_id, int source_id, int generation, int speed,
  		unsigned long long offset, void *payload, size_t length)
  {
-@@ -247,12 +243,10 @@ fw_fill_request(struct fw_packet *packet, int tcode, int tlabel,
+@@ -247,12 +243,10 @@ fw_fill_request(struct fw_packet *packet
   * @param callback_data pointer to arbitrary data, which will be
   *   passed to the callback
   */
@@ -3214,7 +2953,7 @@
  {
  	unsigned long flags;
  	int tlabel;
-@@ -322,8 +316,8 @@ static void transaction_callback(struct fw_card *card, int rcode,
+@@ -322,8 +316,8 @@ static void transaction_callback(struct 
   * Returns the RCODE.
   */
  int fw_run_transaction(struct fw_card *card, int tcode, int destination_id,
@@ -3225,7 +2964,7 @@
  {
  	struct transaction_callback_data d;
  	struct fw_transaction t;
-@@ -399,9 +393,8 @@ void fw_flush_transactions(struct fw_card *card)
+@@ -399,9 +393,8 @@ void fw_flush_transactions(struct fw_car
  	}
  }
  
@@ -3237,7 +2976,7 @@
  {
  	struct fw_address_handler *handler;
  
-@@ -414,9 +407,8 @@ lookup_overlapping_address_handler(struct list_head *list,
+@@ -414,9 +407,8 @@ lookup_overlapping_address_handler(struc
  	return NULL;
  }
  
@@ -3249,7 +2988,7 @@
  {
  	struct fw_address_handler *handler;
  
-@@ -449,36 +441,44 @@ const struct fw_address_region fw_unit_space_region =
+@@ -449,36 +441,44 @@ const struct fw_address_region fw_unit_s
  #endif  /*  0  */
  
  /**
@@ -3306,7 +3045,7 @@
  		} else {
  			list_add_tail(&handler->link, &address_handler_list);
  			ret = 0;
-@@ -493,12 +493,7 @@ fw_core_add_address_handler(struct fw_address_handler *handler,
+@@ -493,12 +493,7 @@ fw_core_add_address_handler(struct fw_ad
  EXPORT_SYMBOL(fw_core_add_address_handler);
  
  /**
@@ -3332,7 +3071,7 @@
  {
  	struct fw_request *request;
  
-@@ -528,9 +522,8 @@ free_response_callback(struct fw_packet *packet,
+@@ -528,9 +522,8 @@ free_response_callback(struct fw_packet 
  	kfree(request);
  }
  
@@ -3344,7 +3083,7 @@
  {
  	int tcode, tlabel, extended_tcode, source, destination;
  
-@@ -588,8 +581,7 @@ fw_fill_response(struct fw_packet *response, u32 *request_header,
+@@ -588,8 +581,7 @@ fw_fill_response(struct fw_packet *respo
  }
  EXPORT_SYMBOL(fw_fill_response);
  
@@ -3365,7 +3104,7 @@
  {
  	/* unified transaction or broadcast transaction: don't respond */
  	if (request->ack != ACK_PENDING ||
-@@ -670,8 +662,7 @@ fw_send_response(struct fw_card *card, struct fw_request *request, int rcode)
+@@ -670,8 +662,7 @@ fw_send_response(struct fw_card *card, s
  }
  EXPORT_SYMBOL(fw_send_response);
  
@@ -3375,7 +3114,7 @@
  {
  	struct fw_address_handler *handler;
  	struct fw_request *request;
-@@ -719,8 +710,7 @@ fw_core_handle_request(struct fw_card *card, struct fw_packet *p)
+@@ -719,8 +710,7 @@ fw_core_handle_request(struct fw_card *c
  }
  EXPORT_SYMBOL(fw_core_handle_request);
  
@@ -3385,7 +3124,7 @@
  {
  	struct fw_transaction *t;
  	unsigned long flags;
-@@ -793,12 +783,10 @@ static const struct fw_address_region topology_map_region =
+@@ -793,12 +783,10 @@ static const struct fw_address_region to
  	{ .start = CSR_REGISTER_BASE | CSR_TOPOLOGY_MAP,
  	  .end   = CSR_REGISTER_BASE | CSR_TOPOLOGY_MAP_END, };
  
@@ -3402,7 +3141,7 @@
  {
  	int i, start, end;
  	__be32 *map;
-@@ -832,12 +820,10 @@ static const struct fw_address_region registers_region =
+@@ -832,12 +820,10 @@ static const struct fw_address_region re
  	{ .start = CSR_REGISTER_BASE,
  	  .end   = CSR_REGISTER_BASE | CSR_CONFIG_ROM, };
  
@@ -3419,7 +3158,7 @@
  {
  	int reg = offset & ~CSR_REGISTER_BASE;
  	unsigned long long bus_time;
-@@ -939,11 +925,11 @@ static struct fw_descriptor model_id_descriptor = {
+@@ -939,11 +925,11 @@ static struct fw_descriptor model_id_des
  
  static int __init fw_core_init(void)
  {
@@ -3459,10 +3198,9 @@
  
  	return 0;
  }
-diff --git a/drivers/firewire/fw-transaction.h b/drivers/firewire/fw-transaction.h
-index c9ab12a..212a102 100644
---- a/drivers/firewire/fw-transaction.h
-+++ b/drivers/firewire/fw-transaction.h
+diff -Naurp linux-2.6-git/drivers/firewire/fw-transaction.h firewire-git/drivers/firewire/fw-transaction.h
+--- linux-2.6-git/drivers/firewire/fw-transaction.h	2009-01-30 13:39:02.992772636 -0500
++++ firewire-git/drivers/firewire/fw-transaction.h	2009-01-30 13:35:51.862647087 -0500
 @@ -82,14 +82,14 @@
  #define CSR_SPEED_MAP			0x2000
  #define CSR_SPEED_MAP_END		0x3000
@@ -3480,7 +3218,7 @@
  {
  	u32    *dst = _dst;
  	__be32 *src = _src;
-@@ -99,8 +99,7 @@ fw_memcpy_from_be32(void *_dst, void *_src, size_t size)
+@@ -99,8 +99,7 @@ fw_memcpy_from_be32(void *_dst, void *_s
  		dst[i] = be32_to_cpu(src[i]);
  }
  
@@ -3490,7 +3228,7 @@
  {
  	fw_memcpy_from_be32(_dst, _src, size);
  }
-@@ -125,8 +124,7 @@ typedef void (*fw_packet_callback_t)(struct fw_packet *packet,
+@@ -125,8 +124,7 @@ typedef void (*fw_packet_callback_t)(str
  				     struct fw_card *card, int status);
  
  typedef void (*fw_transaction_callback_t)(struct fw_card *card, int rcode,
@@ -3500,7 +3238,7 @@
  					  void *callback_data);
  
  /*
-@@ -141,12 +139,6 @@ typedef void (*fw_address_callback_t)(struct fw_card *card,
+@@ -141,12 +139,6 @@ typedef void (*fw_address_callback_t)(st
  				      void *data, size_t length,
  				      void *callback_data);
  
@@ -3534,23 +3272,7 @@
  struct fw_address_region {
  	u64 start;
  	u64 end;
-@@ -276,6 +261,15 @@ static inline void fw_card_put(struct fw_card *card)
- extern void fw_schedule_bm_work(struct fw_card *card, unsigned long delay);
- 
- /*
-+ * Check whether new_generation is the immediate successor of old_generation.
-+ * Take counter roll-over at 255 (as per to OHCI) into account.
-+ */
-+static inline bool is_next_generation(int new_generation, int old_generation)
-+{
-+	return (new_generation & 0xff) == ((old_generation + 1) & 0xff);
-+}
-+
-+/*
-  * The iso packet format allows for an immediate header/payload part
-  * stored in 'header' immediately after the packet info plus an
-  * indirect payload part that is pointer to by the 'payload' field.
-@@ -306,10 +300,8 @@ struct fw_iso_packet {
+@@ -315,10 +300,8 @@ struct fw_iso_packet {
  struct fw_iso_context;
  
  typedef void (*fw_iso_callback_t)(struct fw_iso_context *context,
@@ -3563,7 +3285,7 @@
  
  /*
   * An iso buffer is just a set of pages mapped for DMA in the
-@@ -335,36 +327,25 @@ struct fw_iso_context {
+@@ -344,36 +327,25 @@ struct fw_iso_context {
  	void *callback_data;
  };
  
@@ -3594,9 +3316,6 @@
 -int
 -fw_iso_context_start(struct fw_iso_context *ctx,
 -		     int cycle, int sync, int tags);
--
--int
--fw_iso_context_stop(struct fw_iso_context *ctx);
 +int fw_iso_buffer_init(struct fw_iso_buffer *buffer, struct fw_card *card,
 +		       int page_count, enum dma_data_direction direction);
 +int fw_iso_buffer_map(struct fw_iso_buffer *buffer, struct vm_area_struct *vma);
@@ -3613,13 +3332,15 @@
 +			 int cycle, int sync, int tags);
 +int fw_iso_context_stop(struct fw_iso_context *ctx);
 +void fw_iso_context_destroy(struct fw_iso_context *ctx);
-+
+ 
+-int
+-fw_iso_context_stop(struct fw_iso_context *ctx);
 +void fw_iso_resource_manage(struct fw_card *card, int generation,
 +		u64 channels_mask, int *channel, int *bandwidth, bool allocate);
  
  struct fw_card_driver {
  	/*
-@@ -406,7 +387,7 @@ struct fw_card_driver {
+@@ -415,7 +387,7 @@ struct fw_card_driver {
  
  	struct fw_iso_context *
  	(*allocate_iso_context)(struct fw_card *card,
@@ -3628,7 +3349,7 @@
  	void (*free_iso_context)(struct fw_iso_context *ctx);
  
  	int (*start_iso)(struct fw_iso_context *ctx,
-@@ -420,24 +401,18 @@ struct fw_card_driver {
+@@ -429,24 +401,18 @@ struct fw_card_driver {
  	int (*stop_iso)(struct fw_iso_context *ctx);
  };
  
@@ -3658,7 +3379,7 @@
  void fw_send_phy_config(struct fw_card *card,
  			int node_id, int generation, int gap_count);
  
-@@ -445,29 +420,18 @@ void fw_send_phy_config(struct fw_card *card,
+@@ -454,29 +420,18 @@ void fw_send_phy_config(struct fw_card *
   * Called by the topology code to inform the device code of node
   * activity; found, lost, or updated nodes.
   */
@@ -3698,10 +3419,8 @@
 +void fw_core_handle_response(struct fw_card *card, struct fw_packet *packet);
  
  #endif /* __fw_transaction_h */
-diff --git a/include/linux/firewire-cdev.h b/include/linux/firewire-cdev.h
-index 4d078e9..2e35379 100644
---- a/include/linux/firewire-cdev.h
-+++ b/include/linux/firewire-cdev.h
+--- linux-2.6-git/include/linux/firewire-cdev.h	2008-11-04 11:19:21.000000000 -0500
++++ firewire-git/include/linux/firewire-cdev.h	2009-01-30 13:35:54.327647015 -0500
 @@ -25,10 +25,12 @@
  #include <linux/types.h>
  #include <linux/firewire-constants.h>

linux-2.6.29-lirc.patch:

Index: linux-2.6.29-lirc.patch
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/F-10/linux-2.6.29-lirc.patch,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- linux-2.6.29-lirc.patch	30 Jan 2009 02:54:07 -0000	1.1
+++ linux-2.6.29-lirc.patch	30 Jan 2009 21:21:41 -0000	1.2
@@ -1,5 +1,3 @@
- drivers/hid/hid-core.c                |    2 +
- drivers/hid/hid-ids.h                 |    2 +
  drivers/input/Kconfig                 |    2 +
  drivers/input/Makefile                |    2 +
  drivers/input/lirc/Kconfig            |  118 +++
@@ -25,7 +23,7 @@
  drivers/input/lirc/lirc_ttusbir.c     |  396 ++++++++++
  drivers/input/lirc/lirc_zilog.c       | 1382 +++++++++++++++++++++++++++++++++
 
- 26 files changed, 14507 insertions(+), 0 deletions(-)
+ 24 files changed, 14503 insertions(+), 0 deletions(-)
 
 diff --git a/drivers/input/Kconfig b/drivers/input/Kconfig
 index 5f9d860..2ba0904 100644
@@ -14681,29 +14679,3 @@
 +
 +module_param(disable_tx, bool, 0644);
 +MODULE_PARM_DESC(disable_tx, "Disable the IR transmitter device");
-diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
-index 5d7640e..7001c31 100644
---- a/drivers/hid/hid-core.c
-+++ b/drivers/hid/hid-core.c
-@@ -1606,6 +1606,8 @@ static const struct hid_device_id hid_ignore_list[] = {
- 	{ HID_USB_DEVICE(USB_VENDOR_ID_SOUNDGRAPH, USB_DEVICE_ID_SOUNDGRAPH_IMON_LCD) },
- 	{ HID_USB_DEVICE(USB_VENDOR_ID_SOUNDGRAPH, USB_DEVICE_ID_SOUNDGRAPH_IMON_LCD2) },
- 	{ HID_USB_DEVICE(USB_VENDOR_ID_SOUNDGRAPH, USB_DEVICE_ID_SOUNDGRAPH_IMON_LCD3) },
-+	{ HID_USB_DEVICE(USB_VENDOR_ID_SOUNDGRAPH, USB_DEVICE_ID_SOUNDGRAPH_IMON_LCD4) },
-+	{ HID_USB_DEVICE(USB_VENDOR_ID_SOUNDGRAPH, USB_DEVICE_ID_SOUNDGRAPH_IMON_LCD5) },
- 	{ HID_USB_DEVICE(USB_VENDOR_ID_TENX, USB_DEVICE_ID_TENX_IBUDDY1) },
- 	{ HID_USB_DEVICE(USB_VENDOR_ID_TENX, USB_DEVICE_ID_TENX_IBUDDY2) },
- 	{ HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb300) },
-diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
-index acc1abc..e899f51 100644
---- a/drivers/hid/hid-ids.h
-+++ b/drivers/hid/hid-ids.h
-@@ -362,6 +362,8 @@
- #define USB_DEVICE_ID_SOUNDGRAPH_IMON_LCD	0x0038
- #define USB_DEVICE_ID_SOUNDGRAPH_IMON_LCD2	0x0036
- #define USB_DEVICE_ID_SOUNDGRAPH_IMON_LCD3	0x0034
-+#define USB_DEVICE_ID_SOUNDGRAPH_IMON_LCD4	0x0044
-+#define USB_DEVICE_ID_SOUNDGRAPH_IMON_LCD5	0x0045
- 
- #define USB_VENDOR_ID_SUN		0x0430
- #define USB_DEVICE_ID_RARITAN_KVM_DONGLE	0xcdab


Index: sources
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/F-10/sources,v
retrieving revision 1.929
retrieving revision 1.930
diff -u -r1.929 -r1.930
--- sources	29 Jan 2009 21:14:12 -0000	1.929
+++ sources	30 Jan 2009 21:21:41 -0000	1.930
@@ -1,2 +1,3 @@
 d351e44709c9810b85e29b877f50968a  linux-2.6.28.tar.bz2
 d95a5be60287e9632c9d0513b59f6511  patch-2.6.29-rc3.bz2
+8adc233b361618457c3f44c25be1455b  patch-2.6.29-rc3-git1.bz2


Index: upstream
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/F-10/upstream,v
retrieving revision 1.840
retrieving revision 1.841
diff -u -r1.840 -r1.841
--- upstream	29 Jan 2009 21:14:12 -0000	1.840
+++ upstream	30 Jan 2009 21:21:41 -0000	1.841
@@ -1,2 +1,3 @@
 linux-2.6.28.tar.bz2
 patch-2.6.29-rc3.bz2
+patch-2.6.29-rc3-git1.bz2


--- linux-2.6-gspca-git.patch DELETED ---


--- linux-2.6-gspca-stv06xx-git.patch DELETED ---




More information about the scm-commits mailing list