--- linux-2.4.18/drivers/usb/storage/isd200.c	Tue Nov 13 18:19:41 2001
+++ linux/drivers/usb/storage/isd200.c	Sun Mar 10 00:27:26 2002
@@ -124,6 +124,8 @@
 #define	ACTION_SOFT_RESET	3
 #define	ACTION_ENUM		4
 #define	ACTION_IDENTIFY		5
+#define	ACTION_UNLOCK		6
+#define	ACTION_PW_DISABLE	7
 
 
 /*
@@ -772,6 +774,42 @@
 		srb.request_bufflen = sizeof(struct hd_driveid);
 		break;
 
+	case ACTION_UNLOCK:
+	{
+		unsigned short pw[256];
+		int i;
+        
+		US_DEBUGP("   isd200_action(UNLOCK)\n");
+		ata.write.SelectCommand = 1;
+		ata.write.CommandByte = 0xf2;
+		srb.sc_data_direction = SCSI_DATA_WRITE;
+		for(i = 0;i < 256;i++)
+		{
+			pw[i] = 0;
+		}
+		srb.request_buffer = (void *)pw;
+		srb.request_bufflen = sizeof(pw);
+		break;
+	}
+	
+	case ACTION_PW_DISABLE:
+	{
+		unsigned short pw[256];
+		int i;
+        
+		US_DEBUGP("   isd200_action(PW_DISABLE)\n");
+		ata.write.SelectCommand = 1;
+		ata.write.CommandByte = 0xf6;
+		srb.sc_data_direction = SCSI_DATA_WRITE;
+		for(i = 0;i < 256;i++)
+		{
+			pw[i] = 0;
+		}
+		srb.request_buffer = (void *)pw;
+		srb.request_bufflen = sizeof(pw);
+		break;
+	}
+	
 	default:
 		US_DEBUGP("Error: Undefined action %d\n",action);
 		break;
@@ -1301,6 +1339,22 @@
 				US_DEBUGP("      command_set_1 = 0x%x\n", info->drive.command_set_1);
 				US_DEBUGP("      command_set_2 = 0x%x\n", info->drive.command_set_2);
 
+				if(info->drive.dlf & 4) { /* Locked??? */
+					transferStatus = isd200_action(us, ACTION_UNLOCK, NULL, 0);
+					if (transferStatus != ISD200_TRANSPORT_GOOD) {
+						/* Error issuing ATA Command Identify */
+						US_DEBUGP("   Error issuing ATA Command Security Unlock\n");
+						retStatus = ISD200_ERROR;
+					} else {
+						transferStatus = isd200_action(us, ACTION_PW_DISABLE, NULL, 0);
+						if (transferStatus != ISD200_TRANSPORT_GOOD) {
+							/* Error issuing ATA Command Identify */
+							US_DEBUGP("   Error issuing ATA Command Security Password Disable\n");
+							retStatus = ISD200_ERROR;
+						}
+					}
+				}
+				
 				memset(&info->InquiryData, 0, sizeof(info->InquiryData));
 
 				/* Standard IDE interface only supports disks */

