diff -ru linux-2.6.15.2/drivers/scsi/scsi_scan.c linux-2.6.15.2-patched/drivers/scsi/scsi_scan.c
--- linux-2.6.15.2/drivers/scsi/scsi_scan.c	2006-01-31 06:25:07.000000000 +0000
+++ linux-2.6.15.2-patched/drivers/scsi/scsi_scan.c	2006-02-03 13:15:34.000000000 +0000
@@ -613,6 +613,8 @@
 	    (sdev->scsi_level == 1 && (inq_result[3] & 0x0f) == 1))
 		sdev->scsi_level++;
 	sdev->sdev_target->scsi_level = sdev->scsi_level;
+ 	if(memcmp(inq_result+48,"ARC2TBSC",8)==0)
+ 		sdev->manufacturer=0x17d3;
 
 	return 0;
 }
diff -ru linux-2.6.15.2/drivers/scsi/sd.c linux-2.6.15.2-patched/drivers/scsi/sd.c
--- linux-2.6.15.2/drivers/scsi/sd.c	2006-01-31 06:25:07.000000000 +0000
+++ linux-2.6.15.2-patched/drivers/scsi/sd.c	2006-02-03 15:28:28.000000000 +0000
@@ -345,6 +345,24 @@
 	SCpnt->cmnd[1] = 0;
 	
 	if (block > 0xffffffff) {
+		if(sdp->manufacturer==0x17d3)
+		{
+		    SCpnt->cmnd[0]  = (SCpnt->cmnd[0] & 0x02) ? 0xB2 : 0xB0;
+		    SCpnt->cmnd[1]  = sizeof(block) > 4 ? (unsigned char) (block >> 56) & 0xff : 0;
+		    SCpnt->cmnd[2]  = sizeof(block) > 4 ? (unsigned char) (block >> 48) & 0xff : 0;
+		    SCpnt->cmnd[3]  = sizeof(block) > 4 ? (unsigned char) (block >> 40) & 0xff : 0;
+		    SCpnt->cmnd[4]  = sizeof(block) > 4 ? (unsigned char) (block >> 32) & 0xff : 0;
+		    SCpnt->cmnd[5]  = (unsigned char) (block >> 24) & 0xff;
+		    SCpnt->cmnd[6]  = (unsigned char) (block >> 16) & 0xff;
+		    SCpnt->cmnd[7]  = (unsigned char) (block >> 8) & 0xff;
+		    SCpnt->cmnd[8]  = (unsigned char) block & 0xff;	
+		    SCpnt->cmnd[9]  = (unsigned char) (this_count >> 8) & 0xff;
+		    SCpnt->cmnd[10] = (unsigned char) this_count & 0xff;
+		    SCpnt->cmnd[11] = 0;
+		    SCpnt->cmd_len  = 12;
+		}
+		else
+		{
 		SCpnt->cmnd[0] += READ_16 - READ_6;
 		SCpnt->cmnd[2] = sizeof(block) > 4 ? (unsigned char) (block >> 56) & 0xff : 0;
 		SCpnt->cmnd[3] = sizeof(block) > 4 ? (unsigned char) (block >> 48) & 0xff : 0;
@@ -359,6 +377,7 @@
 		SCpnt->cmnd[12] = (unsigned char) (this_count >> 8) & 0xff;
 		SCpnt->cmnd[13] = (unsigned char) this_count & 0xff;
 		SCpnt->cmnd[14] = SCpnt->cmnd[15] = 0;
+		}
 	} else if ((this_count > 0xff) || (block > 0x1fffff) ||
 		   SCpnt->device->use_10_for_rw) {
 		if (this_count > 0xffff)
@@ -1115,11 +1134,18 @@
 	retries = 3;
 	do {
 		if (longrc) {
-			memset((void *) cmd, 0, 16);
-			cmd[0] = SERVICE_ACTION_IN;
-			cmd[1] = SAI_READ_CAPACITY_16;
-			cmd[13] = 12;
-			memset((void *) buffer, 0, 12);
+            if(sdp->manufacturer == 0x17d3) {
+                cmd[0] = 0xb3;
+                memset((void *) &cmd[1], 0, 11);
+                memset((void *) buffer, 0, 12);
+            }
+            else {
+    			memset((void *) cmd, 0, 16);
+	    		cmd[0] = SERVICE_ACTION_IN;
+		    	cmd[1] = SAI_READ_CAPACITY_16;
+			    cmd[13] = 12;
+    			memset((void *) buffer, 0, 12);
+           }
 		} else {
 			cmd[0] = READ_CAPACITY;
 			memset((void *) &cmd[1], 0, 9);
