<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;"># This is a BitKeeper generated patch for the following project:
# Project Name: Linux kernel tree
# This patch format is intended for GNU patch command version 2.5 or higher.
# This patch includes the following deltas:
#	           ChangeSet	1.564.2.2 -&gt; 1.564.2.3
#	drivers/usb/storage/protocol.c	1.8     -&gt; 1.9    
#	drivers/usb/storage/debug.c	1.9     -&gt; 1.10   
#	drivers/usb/storage/usb.c	1.37    -&gt; 1.38   
#	drivers/usb/storage/transport.c	1.31    -&gt; 1.32   
#	drivers/usb/storage/isd200.c	1.14    -&gt; 1.15   
#	drivers/usb/storage/scsiglue.c	1.29    -&gt; 1.30   
#	drivers/usb/storage/usb.h	1.18    -&gt; 1.19   
#	drivers/usb/storage/raw_bulk.c	1.2     -&gt; 1.3    
#	drivers/usb/storage/sddr09.c	1.16    -&gt; 1.17   
#	drivers/usb/storage/freecom.c	1.13    -&gt; 1.14   
#	drivers/usb/storage/debug.h	1.5     -&gt; 1.6    
#
# The following is the BitKeeper ChangeSet Log
# --------------------------------------------
# 02/09/16	mdharm-usb@one-eyed-alien.net	1.564.2.3
# [PATCH] USB storage: macro-ize address manipulation
# 
# This patch converts all uses of page_addres() to the sg_address() macro.
# This will make backporting to 2.4 easier, as well as eliminate lots of
# redundant code.
# --------------------------------------------
#
diff -Nru a/drivers/usb/storage/debug.c b/drivers/usb/storage/debug.c
--- a/drivers/usb/storage/debug.c	Mon Sep 16 15:01:05 2002
+++ b/drivers/usb/storage/debug.c	Mon Sep 16 15:01:05 2002
@@ -189,7 +189,7 @@
 	US_DEBUGP("Buffer has %d scatterlists.\n", cmd-&gt;use_sg );
 	for ( i=0; i&lt;cmd-&gt;use_sg; i++ )
 	{
-		char *adr = page_address(sg[i].page) + sg[i].offset;
+		char *adr = sg_address(sg[i]);
 		
 		US_DEBUGP("Length of scatterlist %d is %d.\n",i,sg[i].length);
 		US_DEBUGP("%02x %02x %02x %02x %02x %02x %02x %02x\n"
diff -Nru a/drivers/usb/storage/debug.h b/drivers/usb/storage/debug.h
--- a/drivers/usb/storage/debug.h	Mon Sep 16 15:01:05 2002
+++ b/drivers/usb/storage/debug.h	Mon Sep 16 15:01:05 2002
@@ -48,7 +48,7 @@
 #include &lt;linux/kernel.h&gt;
 #include &lt;linux/blk.h&gt;
 #include &lt;linux/cdrom.h&gt;
-#include "scsi.h"
+#include "usb.h"
 
 #define USB_STORAGE "usb-storage: "
 
diff -Nru a/drivers/usb/storage/freecom.c b/drivers/usb/storage/freecom.c
--- a/drivers/usb/storage/freecom.c	Mon Sep 16 15:01:05 2002
+++ b/drivers/usb/storage/freecom.c	Mon Sep 16 15:01:05 2002
@@ -148,11 +148,11 @@
 			if (transfer_amount - total_transferred &gt;= 
 					sg[i].length) {
 				result = usb_stor_transfer_partial(us,
-						page_address(sg[i].page) + sg[i].offset, sg[i].length);
+						sg_address(sg[i]), sg[i].length);
 				total_transferred += sg[i].length;
 			} else {
 				result = usb_stor_transfer_partial(us,
-						page_address(sg[i].page) + sg[i].offset,
+						sg_address(sg[i]),
 						transfer_amount - total_transferred);
 				total_transferred += transfer_amount - total_transferred;
 			}
diff -Nru a/drivers/usb/storage/isd200.c b/drivers/usb/storage/isd200.c
--- a/drivers/usb/storage/isd200.c	Mon Sep 16 15:01:05 2002
+++ b/drivers/usb/storage/isd200.c	Mon Sep 16 15:01:05 2002
@@ -501,13 +501,13 @@
                             sg[i].length) {
                                 result = isd200_transfer_partial(us, 
                                                                  srb-&gt;sc_data_direction,
-                                                                 page_address(sg[i].page) + sg[i].offset, 
+                                                                 sg_address(sg[i]), 
                                                                  sg[i].length);
                                 total_transferred += sg[i].length;
                         } else
                                 result = isd200_transfer_partial(us, 
                                                                  srb-&gt;sc_data_direction,                            
-                                                                 page_address(sg[i].page) + sg[i].offset, 
+                                                                 sg_address(sg[i]), 
                                                                  transfer_amount - total_transferred);
 
                         /* if we get an error, end the loop here */
@@ -1409,10 +1409,10 @@
 				/* transfer the lesser of the next buffer or the
 				 * remaining data */
 				if (len - total &gt;= sg[i].length) {
-					memcpy(page_address(sg[i].page) + sg[i].offset, src + total, sg[i].length);
+					memcpy(sg_address(sg[i]), src + total, sg[i].length);
 					total += sg[i].length;
 				} else {
-					memcpy(page_address(sg[i].page) + sg[i].offset, src + total, len - total);
+					memcpy(sg_address(sg[i]), src + total, len - total);
 					total = len;
 				}
 			} 
diff -Nru a/drivers/usb/storage/protocol.c b/drivers/usb/storage/protocol.c
--- a/drivers/usb/storage/protocol.c	Mon Sep 16 15:01:05 2002
+++ b/drivers/usb/storage/protocol.c	Mon Sep 16 15:01:05 2002
@@ -65,7 +65,7 @@
 		struct scatterlist *sg;
 
 		sg = (struct scatterlist *) srb-&gt;request_buffer;
-		return (void *) page_address(sg[0].page) + sg[0].offset;
+		return (void *) sg_address(sg[0]);
 	} else
 		return (void *) srb-&gt;request_buffer;
 }
diff -Nru a/drivers/usb/storage/raw_bulk.c b/drivers/usb/storage/raw_bulk.c
--- a/drivers/usb/storage/raw_bulk.c	Mon Sep 16 15:01:05 2002
+++ b/drivers/usb/storage/raw_bulk.c	Mon Sep 16 15:01:05 2002
@@ -191,7 +191,7 @@
 			unsigned char *buf;
 			unsigned int length;
 
-			buf = page_address(sg[i].page) + sg[i].offset;
+			buf = sg_address(sg[i]);
 			length = len-transferred;
 			if (length &gt; sg[i].length)
 				length = sg[i].length;
@@ -261,7 +261,7 @@
 		unsigned char *ptr;
 		unsigned int length, room;
 
-		ptr = page_address(sg[i].page) + sg[i].offset + *offset;
+		ptr = sg_address(sg[i]) + *offset;
 
 		room = sg[i].length - *offset;
 		length = len - transferred;
@@ -310,7 +310,7 @@
 		unsigned char *ptr;
 		unsigned int length, room;
 
-		ptr = page_address(sg[i].page) + sg[i].offset + *offset;
+		ptr = sg_address(sg[i]) + *offset;
 
 		room = sg[i].length - *offset;
 		length = buflen - transferred;
diff -Nru a/drivers/usb/storage/scsiglue.c b/drivers/usb/storage/scsiglue.c
--- a/drivers/usb/storage/scsiglue.c	Mon Sep 16 15:01:05 2002
+++ b/drivers/usb/storage/scsiglue.c	Mon Sep 16 15:01:05 2002
@@ -563,8 +563,8 @@
 
 	  /* copy one byte */
 	  {
-		char *src = page_address(sg[sb].page) + sg[sb].offset + si;
-		char *dst = page_address(sg[db].page) + sg[db].offset + di;
+		char *src = sg_address(sg[sb]) + si;
+		char *dst = sg_address(sg[db]) + di;
 
 		 *dst = *src;
 	  }
@@ -605,7 +605,7 @@
 	      break;
 	    }
 
-	  *(char*)(page_address(sg[db].page) + sg[db].offset) = 0;
+	  *(char*)(sg_address(sg[db])) = 0;
 
 	  /* get next destination */
 	  if ( sg[db].length-1 == di )
@@ -756,8 +756,8 @@
 
 	  /* copy one byte */
 	  {
-		char *src = page_address(sg[sb].page) + sg[sb].offset + si;
-		char *dst = page_address(sg[db].page) + sg[db].offset + di;
+		char *src = sg_address(sg[sb]) + si;
+		char *dst = sg_address(sg[db]) + di;
 
 		 *dst = *src;
 	  }
@@ -798,7 +798,7 @@
 	    }
 
 	 {
-		 char *dst = page_address(sg[db].page) + sg[db].offset + di;
+		 char *dst = sg_address(sg[db]) + di;
 
 		 *dst = tempBuffer[element-USB_STOR_SCSI_SENSE_HDRSZ];
 	 }
@@ -852,17 +852,14 @@
 		  if ( element &lt; USB_STOR_SCSI_SENSE_HDRSZ )
 		    {
 		      /* fill in the pointers for both header types */
-		      the6-&gt;array[element] = page_address(sg[i].page) +
-			      			sg[i].offset + j;
-		      the10-&gt;array[element] = page_address(sg[i].page) +
-						sg[i].offset + j;
+		      the6-&gt;array[element] = sg_address(sg[i]) + j;
+		      the10-&gt;array[element] = sg_address(sg[i]) + j;
 
 		    }
 		  else if ( element &lt; USB_STOR_SCSI_SENSE_10_HDRSZ )
 		    {
 		      /* only the longer headers still cares now */
-		      the10-&gt;array[element] = page_address(sg[i].page) +
-						sg[i].offset + j;
+		      the10-&gt;array[element] = sg_address(sg[i]) + j;
 		       
 		    }
 		  /* increase element counter */
diff -Nru a/drivers/usb/storage/sddr09.c b/drivers/usb/storage/sddr09.c
--- a/drivers/usb/storage/sddr09.c	Mon Sep 16 15:01:05 2002
+++ b/drivers/usb/storage/sddr09.c	Mon Sep 16 15:01:05 2002
@@ -1091,25 +1091,23 @@
 		return 0;
 
 	for (i=0; i&lt;alloc_blocks; i++) {
-		if (i&lt;alloc_blocks-1) {
-			char *vaddr = kmalloc(1 &lt;&lt; 17, GFP_NOIO);
-			sg[i].page = virt_to_page(vaddr);
-			sg[i].offset = ((unsigned long)vaddr &amp; ~PAGE_MASK);
-			sg[i].length = (1&lt;&lt;17);
-		} else {
-			char *vaddr = kmalloc(alloc_len, GFP_NOIO);
-			sg[i].page = virt_to_page(vaddr);
-			sg[i].offset = ((unsigned long)vaddr &amp; ~PAGE_MASK);
-			sg[i].length = alloc_len;
-		}
-		alloc_len -= sg[i].length;
+		int alloc_req = (i &lt; alloc_blocks-1 ? 1 &lt;&lt; 17 : alloc_len);
+		char *vaddr = kmalloc(alloc_req, GFP_NOIO);
+#if LINUX_VERSION_CODE &gt;= KERNEL_VERSION(2,5,3)
+		sg[i].page = virt_to_page(vaddr);
+		sg[i].offset = ((unsigned long)vaddr &amp; ~PAGE_MASK);
+#else
+		sg[i].address = vaddr;
+#endif
+		sg[i].length = alloc_req;
+		alloc_len -= alloc_req;
 	}
 
 	for (i=0; i&lt;alloc_blocks; i++)
 		if (sg[i].page == NULL) {
 			for (i=0; i&lt;alloc_blocks; i++)
 				if (sg[i].page != NULL)
-					kfree(page_address(sg[i].page) + sg[i].offset);
+					kfree(sg_address(sg[i]));
 			kfree(sg);
 			return 0;
 		}
@@ -1120,7 +1118,7 @@
 				     (unsigned char *)sg, alloc_blocks);
 	if (result != USB_STOR_TRANSPORT_GOOD) {
 		for (i=0; i&lt;alloc_blocks; i++)
-			kfree(page_address(sg[i].page) + sg[i].offset);
+			kfree(sg_address(sg[i]));
 		kfree(sg);
 		return -1;
 	}
@@ -1136,7 +1134,7 @@
 		info-&gt;lba_to_pba = NULL;
 		info-&gt;pba_to_lba = NULL;
 		for (i=0; i&lt;alloc_blocks; i++)
-			kfree(page_address(sg[i].page) + sg[i].offset);
+			kfree(sg_address(sg[i]));
 		kfree(sg);
 		return 0;
 	}
@@ -1144,7 +1142,7 @@
 	for (i = 0; i &lt; numblocks; i++)
 		info-&gt;lba_to_pba[i] = info-&gt;pba_to_lba[i] = UNDEF;
 
-	ptr = page_address(sg[0].page)+sg[0].offset;
+	ptr = sg_address(sg[0]);
 
 	/*
 	 * Define lba-pba translation table
@@ -1153,8 +1151,7 @@
 	// scatterlist block i*64/128k = i*(2^6)*(2^-17) = i*(2^-11)
 
 	for (i=0; i&lt;numblocks; i++) {
-		ptr = page_address(sg[i&gt;&gt;11].page) +
-			sg[i&gt;&gt;11].offset + ((i&amp;0x7ff)&lt;&lt;6);
+		ptr = sg_address(sg[i&gt;&gt;11]) + ((i&amp;0x7ff)&lt;&lt;6);
 
 		if (i == 0 || i == 1) {
 			info-&gt;pba_to_lba[i] = UNUSABLE;
@@ -1264,7 +1261,7 @@
 	US_DEBUGP("Found %d LBA's\n", lbact);
 
 	for (i=0; i&lt;alloc_blocks; i++)
-		kfree(page_address(sg[i].page) + sg[i].offset);
+		kfree(sg_address(sg[i]));
 	kfree(sg);
 	return 0;
 }
diff -Nru a/drivers/usb/storage/transport.c b/drivers/usb/storage/transport.c
--- a/drivers/usb/storage/transport.c	Mon Sep 16 15:01:05 2002
+++ b/drivers/usb/storage/transport.c	Mon Sep 16 15:01:05 2002
@@ -641,11 +641,11 @@
 			if (transfer_amount - total_transferred &gt;= 
 					sg[i].length) {
 				result = usb_stor_transfer_partial(us,
-						page_address(sg[i].page) + sg[i].offset, sg[i].length);
+						sg_address(sg[i]), sg[i].length);
 				total_transferred += sg[i].length;
 			} else
 				result = usb_stor_transfer_partial(us,
-						page_address(sg[i].page) + sg[i].offset,
+						sg_address(sg[i]),
 						transfer_amount - total_transferred);
 
 			/* if we get an error, end the loop here */
diff -Nru a/drivers/usb/storage/usb.c b/drivers/usb/storage/usb.c
--- a/drivers/usb/storage/usb.c	Mon Sep 16 15:01:05 2002
+++ b/drivers/usb/storage/usb.c	Mon Sep 16 15:01:05 2002
@@ -283,13 +283,13 @@
 	if (us-&gt;srb-&gt;use_sg) {
 		sg = (struct scatterlist *)us-&gt;srb-&gt;request_buffer;
 		for (i=0; i&lt;us-&gt;srb-&gt;use_sg; i++)
-			memset(page_address(sg[i].page) + sg[i].offset, 0, sg[i].length);
+			memset(sg_address(sg[i]), 0, sg[i].length);
 		for (i=0, transferred=0; 
 				i&lt;us-&gt;srb-&gt;use_sg &amp;&amp; transferred &lt; len;
 				i++) {
 			amt = sg[i].length &gt; len-transferred ? 
 					len-transferred : sg[i].length;
-			memcpy(page_address(sg[i].page) + sg[i].offset, data+transferred, amt);
+			memcpy(sg_address(sg[i]), data+transferred, amt);
 			transferred -= amt;
 		}
 	} else {
diff -Nru a/drivers/usb/storage/usb.h b/drivers/usb/storage/usb.h
--- a/drivers/usb/storage/usb.h	Mon Sep 16 15:01:05 2002
+++ b/drivers/usb/storage/usb.h	Mon Sep 16 15:01:05 2002
@@ -206,7 +206,6 @@
  * single queue element srb for write access */
 #define scsi_unlock(host)	spin_unlock_irq(host-&gt;host_lock)
 #define scsi_lock(host)		spin_lock_irq(host-&gt;host_lock)
-
-#define sg_address(psg)		(page_address((psg)-&gt;page) + (psg)-&gt;offset)
+#define sg_address(psg)		(page_address((psg).page) + (psg).offset)
 
 #endif
</pre></body></html>