--- /dev/null
+From stable-bounces@linux.kernel.org Fri Jun 2 10:39:23 2006
+Date: Fri, 2 Jun 2006 19:34:30 +0200 (CEST)
+From: Stefan Richter <stefanr@s5r6.in-berlin.de>
+To: stable@kernel.org
+Cc: linux-kernel@vger.kernel.org
+Subject: sbp2: backport read_capacity workaround for iPod
+
+There is a firmware bug in several Apple iPods which prevents access to
+these iPods under certain conditions. The disk size reported by the iPod
+is one sector too big. Once access to the end of the disk is attempted,
+the iPod becomes inaccessible. This problem has been known for USB iPods
+for some time and has recently been discovered to exist with
+FireWire/USB combo iPods too.
+
+This patch is derived from the fix in Linux 2.6.17, commit
+e9a1c52c7b19d10342226c12f170d7ab644427e2, to be applicable to 2.6.16.x
+without prerequisite patches. It hard-wires a workaround for three known
+affected model numbers (those of 4th generation iPod, iPod Photo, iPod
+mini).
+
+Note: This patch lacks Linux 2.6.17's ability to enable and disable the
+workaround via a module parameter.
+
+Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
+Signed-off-by: Chris Wright <chrisw@sous-sol.org>
+---
+
+ drivers/ieee1394/sbp2.c | 11 +++++++++++
+ 1 file changed, 11 insertions(+)
+
+--- linux-2.6.16.19.orig/drivers/ieee1394/sbp2.c
++++ linux-2.6.16.19/drivers/ieee1394/sbp2.c
+@@ -2491,9 +2491,20 @@ static int sbp2scsi_slave_alloc(struct s
+
+ static int sbp2scsi_slave_configure(struct scsi_device *sdev)
+ {
++ struct scsi_id_instance_data *scsi_id =
++ (struct scsi_id_instance_data *)sdev->host->hostdata[0];
++
+ blk_queue_dma_alignment(sdev->request_queue, (512 - 1));
+ sdev->use_10_for_rw = 1;
+ sdev->use_10_for_ms = 1;
++
++ if ((scsi_id->sbp2_firmware_revision & 0xffff00) == 0x0a2700 &&
++ (scsi_id->ud->model_id == 0x000021 /* gen.4 iPod */ ||
++ scsi_id->ud->model_id == 0x000023 /* iPod mini */ ||
++ scsi_id->ud->model_id == 0x00007e /* iPod Photo */ )) {
++ SBP2_INFO("enabling iPod workaround: decrement disk capacity");
++ sdev->fix_capacity = 1;
++ }
+ return 0;
+ }
+