Re: Seagate ST340824A and (un)clipping max LBA: 2.2.19+ide04092001 patch
On Sat, Apr 28, 2001 at 12:22:07AM +0200, [EMAIL PROTECTED] wrote: > No. Maybe someone can tell us about its origin, but in your case > of course this just works because 0xa intersects 0x306b. You might > comment out this entire test. If I comment out the entire test, it would try to unclip the capacity of all drives. Is it safe? For my situation I would prefer to use "setmax" or disk specific "seagate" (see later), but I do not know how to change the kernel idea of drive geometry and capacity. I use 2.2.19 + ide patch. Neither fdisk nor dd would not read past the clipped capacity before or after software unclipping. > > In the case of this particular disk the manufacturer says: > Use the Set Features command (EF) with subfunction F1. > That tells the disk to report full capacity. > (ATA-6 says that F1 is reserved for use by the Compact Flash Association) > > [Could you try that and report identify output before and after?] Yes, I tried that and it does report unclipped capacity. seagate.c is attached for reference. stalex@eagle:~$ sudo hdparm -I /dev/hdb /dev/hdb: Model=TS438042 A , FwRev=.350, SerialNo=H30E0186 Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs RotSpdTol>.5% } RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=0 BuffType=unknown, BuffSize=2048kB, MaxMultSect=16, MultSect=?16? CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=66055248 IORDY=on/off, tPIO={min:240,w/IORDY:120}, tDMA={min:120,rec:120} PIO modes: pio0 pio1 pio2 pio3 pio4 DMA modes: mdma0 mdma1 mdma2 udma0 udma1 *udma2 udma3 udma4 udma5 stalex@eagle:~$ sudo /usr/src/seagate /dev/hdb Using device /dev/hdb Sending Set Features F1 subcommand Done. stalex@eagle:~$ sudo hdparm -I /dev/hdb /dev/hdb: Model=TS438042 A , FwRev=.350, SerialNo=H30E0186 Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs RotSpdTol>.5% } RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=0 BuffType=unknown, BuffSize=2048kB, MaxMultSect=16, MultSect=?16? CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=78165360 IORDY=on/off, tPIO={min:240,w/IORDY:120}, tDMA={min:120,rec:120} PIO modes: pio0 pio1 pio2 pio3 pio4 DMA modes: mdma0 mdma1 mdma2 udma0 udma1 *udma2 udma3 udma4 udma5 -- = mailto:[EMAIL PROTECTED] ===http://www.geocities.com/astavitsky = GPG Key 0xF7343C8B: 68DD 1E1B 2C98 D336 E31F C87B 91B9 5244 F734 3C8B |_Alexander Stavitsky #include #include //#include #include #define SEAGATE_REPORT_FULL_CAPACITY 0xF1 int get_identity(int fd) { unsigned char args[4+512] = {WIN_IDENTIFY,0,0,1,}; struct hd_driveid *id = (struct hd_driveid *)[4]; if (ioctl(fd, HDIO_DRIVE_CMD, )) { perror("HDIO_DRIVE_CMD"); fprintf(stderr, "WIN_IDENTIFY failed - trying WIN_PIDENTIFY\n"); args[0] = WIN_PIDENTIFY; if (ioctl(fd, HDIO_DRIVE_CMD, )) { perror("HDIO_DRIVE_CMD"); fprintf(stderr, "WIN_PIDENTIFY also failed - giving up\n"); exit(1); } } printf("id->command_set_1: 0x%X\n", id->command_set_1); printf("id->lba_capacity: %lu\n", id->lba_capacity); } /* * result: in LBA mode precisely what is expected * in CHS mode the correct H and S, and C mod 65536. */ int set_feature(int fd) { unsigned char args[4] = {WIN_SETFEATURES,0,0xf1,0}; int i; if (ioctl(fd, HDIO_DRIVE_CMD, )) { perror("HDIO_DRIVE_CMD failed WIN_SETFEATURES"); for (i=0; i<4; i++) printf("%d = 0x%X\n", args[i], args[i]); exit(1); } return 0; } main(int argc, char **argv){ int fd, c; char *device = NULL; /* e.g. "/dev/hda" */ int slave = 0; device = argv[1]; if (!device) { fprintf(stderr, "no device specified - " "use e.g. \"seagate /dev/hdb\"\n"); exit(1); } printf("Using device %s\n", device); fd = open(device, O_RDONLY); if (fd == -1) { perror("open"); exit(1); } printf("Sending Set Features F1 subcommand\n"); set_feature(fd); printf("Done.\n"); return 0; } PGP signature
Re: Seagate ST340824A and (un)clipping max LBA: 2.2.19+ide04092001 patch
On Sat, Apr 28, 2001 at 12:22:07AM +0200, [EMAIL PROTECTED] wrote: No. Maybe someone can tell us about its origin, but in your case of course this just works because 0xa intersects 0x306b. You might comment out this entire test. If I comment out the entire test, it would try to unclip the capacity of all drives. Is it safe? For my situation I would prefer to use setmax or disk specific seagate (see later), but I do not know how to change the kernel idea of drive geometry and capacity. I use 2.2.19 + ide patch. Neither fdisk nor dd would not read past the clipped capacity before or after software unclipping. In the case of this particular disk the manufacturer says: Use the Set Features command (EF) with subfunction F1. That tells the disk to report full capacity. (ATA-6 says that F1 is reserved for use by the Compact Flash Association) [Could you try that and report identify output before and after?] Yes, I tried that and it does report unclipped capacity. seagate.c is attached for reference. stalex@eagle:~$ sudo hdparm -I /dev/hdb /dev/hdb: Model=TS438042 A , FwRev=.350, SerialNo=H30E0186 Config={ HardSect NotMFM HdSw15uSec Fixed DTR10Mbs RotSpdTol.5% } RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=0 BuffType=unknown, BuffSize=2048kB, MaxMultSect=16, MultSect=?16? CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=66055248 IORDY=on/off, tPIO={min:240,w/IORDY:120}, tDMA={min:120,rec:120} PIO modes: pio0 pio1 pio2 pio3 pio4 DMA modes: mdma0 mdma1 mdma2 udma0 udma1 *udma2 udma3 udma4 udma5 stalex@eagle:~$ sudo /usr/src/seagate /dev/hdb Using device /dev/hdb Sending Set Features F1 subcommand Done. stalex@eagle:~$ sudo hdparm -I /dev/hdb /dev/hdb: Model=TS438042 A , FwRev=.350, SerialNo=H30E0186 Config={ HardSect NotMFM HdSw15uSec Fixed DTR10Mbs RotSpdTol.5% } RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=0 BuffType=unknown, BuffSize=2048kB, MaxMultSect=16, MultSect=?16? CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=78165360 IORDY=on/off, tPIO={min:240,w/IORDY:120}, tDMA={min:120,rec:120} PIO modes: pio0 pio1 pio2 pio3 pio4 DMA modes: mdma0 mdma1 mdma2 udma0 udma1 *udma2 udma3 udma4 udma5 -- = mailto:[EMAIL PROTECTED] ===http://www.geocities.com/astavitsky = GPG Key 0xF7343C8B: 68DD 1E1B 2C98 D336 E31F C87B 91B9 5244 F734 3C8B |_Alexander Stavitsky #include stdio.h #include fcntl.h //#include linux/ide.h #include linux/hdreg.h #define SEAGATE_REPORT_FULL_CAPACITY 0xF1 int get_identity(int fd) { unsigned char args[4+512] = {WIN_IDENTIFY,0,0,1,}; struct hd_driveid *id = (struct hd_driveid *)args[4]; if (ioctl(fd, HDIO_DRIVE_CMD, args)) { perror(HDIO_DRIVE_CMD); fprintf(stderr, WIN_IDENTIFY failed - trying WIN_PIDENTIFY\n); args[0] = WIN_PIDENTIFY; if (ioctl(fd, HDIO_DRIVE_CMD, args)) { perror(HDIO_DRIVE_CMD); fprintf(stderr, WIN_PIDENTIFY also failed - giving up\n); exit(1); } } printf(id-command_set_1: 0x%X\n, id-command_set_1); printf(id-lba_capacity: %lu\n, id-lba_capacity); } /* * result: in LBA mode precisely what is expected * in CHS mode the correct H and S, and C mod 65536. */ int set_feature(int fd) { unsigned char args[4] = {WIN_SETFEATURES,0,0xf1,0}; int i; if (ioctl(fd, HDIO_DRIVE_CMD, args)) { perror(HDIO_DRIVE_CMD failed WIN_SETFEATURES); for (i=0; i4; i++) printf(%d = 0x%X\n, args[i], args[i]); exit(1); } return 0; } main(int argc, char **argv){ int fd, c; char *device = NULL; /* e.g. /dev/hda */ int slave = 0; device = argv[1]; if (!device) { fprintf(stderr, no device specified - use e.g. \seagate /dev/hdb\\n); exit(1); } printf(Using device %s\n, device); fd = open(device, O_RDONLY); if (fd == -1) { perror(open); exit(1); } printf(Sending Set Features F1 subcommand\n); set_feature(fd); printf(Done.\n); return 0; } PGP signature
Re: Seagate ST340824A and (un)clipping max LBA: 2.2.19+ide04092001 patch
From: Alexander Stavitsky <[EMAIL PROTECTED]> Disk capacity unclipping routines in ide.2.2.19.04092001.patch do not unclip Seagate ST340824A. I have to use the jumper on the drive to make system boot. I tried "setmax" program and it is able to unclip the capacity, kernel however does not. I digged a little and I think the problem is that ST340824A does not follow the ATA standard - it does support both READ NATIVE MAX ADDRESS and SET MAX ADDRESS, but does not advertise support for Host Protected Area feature set. (maybe support is incomplete and therefore not announced?) drive->id->command_set_1 =3D 0x306b for the this drive. The unclipping routines compare drive->id->command_set_1 and 0x0400 (Host Protected Feature set) That is correct. The earlier version of the patch compared drive->id->command_set_1 and 0x000a (Security Mode & Power Managment ???) When I changed it back to 0x000a, it unclipped the capacity just fine. But 0x000a doesn't make any sense to me. No. Maybe someone can tell us about its origin, but in your case of course this just works because 0xa intersects 0x306b. You might comment out this entire test. What is the correct solution? In the case of this particular disk the manufacturer says: Use the Set Features command (EF) with subfunction F1. That tells the disk to report full capacity. (ATA-6 says that F1 is reserved for use by the Compact Flash Association) [Could you try that and report identify output before and after?] Also a related question: when I use "setmax", the drive reports full capacity through "hdparm -I /dev/hd*", but kernel still uses the old info. How does one update the kernel info after using "setmax"? Details depend on kernel version and patches used. There is not yet a good framework here. (Many kernel versions will believe the partition table, even if it extends beyond the end of the disk. That may be regarded as a bug, but is useful in cases like this where the disk lies about its size.) Andries - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Seagate ST340824A and (un)clipping max LBA: 2.2.19+ide04092001 patch
Disk capacity unclipping routines in ide.2.2.19.04092001.patch do not unclip Seagate ST340824A. I have to use the jumper on the drive to make system boot. I tried "setmax" program and it is able to unclip the capacity, kernel however does not. I digged a little and I think the problem is that ST340824A does not follow the ATA standard - it does support both READ NATIVE MAX ADDRESS and SET MAX ADDRESS, but does not advertise support for Host Protected Area feature set. drive->id->command_set_1 = 0x306b for the this drive. The unclipping routines compare drive->id->command_set_1 and 0x0400 (Host Protected Feature set) The earlier version of the patch compared drive->id->command_set_1 and 0x000a (Security Mode & Power Managment ???) When I changed it back to 0x000a, it unclipped the capacity just fine. But 0x000a doesn't make any sense to me. What is the correct solution? Also the idedisk_supports_host_protected_area is there, but not used and the printk's notifying of unclipping are commented out??? I attach the diff to show what I'm talking about. Also a related question: when I use "setmax", the drive reports full capacity through "hdparm -I /dev/hd*", but kernel still uses the old info. How does one update the kernel info after using "setmax"? --- ide-disk.c.orig Mon Apr 16 13:30:50 2001 +++ ide-disk.c Fri Apr 27 11:16:38 2001 @@ -546,7 +546,7 @@ ide_task_t args; unsigned long addr = 0; - if (!(drive->id->command_set_1 & 0x0400)) + if (!(drive->id->command_set_1 & 0x000a)) // if (!(drive->id->cfs_enable_1 & 0x0400)) return addr; @@ -580,7 +580,7 @@ ide_task_t args; unsigned long addr_set = 0; -// printk("%s: (un)clipping max LBA...%lu\n", drive->name, addr_req); + printk("%s: (un)clipping max LBA...%lu\n", drive->name, addr_req); addr_req--; /* Create IDE/ATA command request structure */ @@ -603,7 +603,7 @@ | ((args.tfRegister[IDE_SECTOR_OFFSET] )); } addr_set++; -// printk("%s: max LBA (un)clipped to %lu\n", drive->name, addr_set); + printk("%s: max LBA (un)clipped to %lu\n", drive->name, addr_set); return addr_set; } -- = mailto:[EMAIL PROTECTED] ===http://www.geocities.com/astavitsky = GPG Key 0xF7343C8B: 68DD 1E1B 2C98 D336 E31F C87B 91B9 5244 F734 3C8B |_Alexander Stavitsky PGP signature
Seagate ST340824A and (un)clipping max LBA: 2.2.19+ide04092001 patch
Disk capacity unclipping routines in ide.2.2.19.04092001.patch do not unclip Seagate ST340824A. I have to use the jumper on the drive to make system boot. I tried setmax program and it is able to unclip the capacity, kernel however does not. I digged a little and I think the problem is that ST340824A does not follow the ATA standard - it does support both READ NATIVE MAX ADDRESS and SET MAX ADDRESS, but does not advertise support for Host Protected Area feature set. drive-id-command_set_1 = 0x306b for the this drive. The unclipping routines compare drive-id-command_set_1 and 0x0400 (Host Protected Feature set) The earlier version of the patch compared drive-id-command_set_1 and 0x000a (Security Mode Power Managment ???) When I changed it back to 0x000a, it unclipped the capacity just fine. But 0x000a doesn't make any sense to me. What is the correct solution? Also the idedisk_supports_host_protected_area is there, but not used and the printk's notifying of unclipping are commented out??? I attach the diff to show what I'm talking about. Also a related question: when I use setmax, the drive reports full capacity through hdparm -I /dev/hd*, but kernel still uses the old info. How does one update the kernel info after using setmax? --- ide-disk.c.orig Mon Apr 16 13:30:50 2001 +++ ide-disk.c Fri Apr 27 11:16:38 2001 @@ -546,7 +546,7 @@ ide_task_t args; unsigned long addr = 0; - if (!(drive-id-command_set_1 0x0400)) + if (!(drive-id-command_set_1 0x000a)) // if (!(drive-id-cfs_enable_1 0x0400)) return addr; @@ -580,7 +580,7 @@ ide_task_t args; unsigned long addr_set = 0; -// printk(%s: (un)clipping max LBA...%lu\n, drive-name, addr_req); + printk(%s: (un)clipping max LBA...%lu\n, drive-name, addr_req); addr_req--; /* Create IDE/ATA command request structure */ @@ -603,7 +603,7 @@ | ((args.tfRegister[IDE_SECTOR_OFFSET] )); } addr_set++; -// printk(%s: max LBA (un)clipped to %lu\n, drive-name, addr_set); + printk(%s: max LBA (un)clipped to %lu\n, drive-name, addr_set); return addr_set; } -- = mailto:[EMAIL PROTECTED] ===http://www.geocities.com/astavitsky = GPG Key 0xF7343C8B: 68DD 1E1B 2C98 D336 E31F C87B 91B9 5244 F734 3C8B |_Alexander Stavitsky PGP signature