--- 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 */