Hello.

Bartlomiej Zolnierkiewicz wrote:

* Merge idedisk_{read_native,set}_max_address_ext() into
  idedisk_{read_native,set}_max_address().

There should be no functionality changes caused by this patch.

   This is unfortunately not achieved...

Signed-off-by: Bartlomiej Zolnierkiewicz <[EMAIL PROTECTED]>

   No cookie this time. :-)

Index: b/drivers/ide/ide-disk.c
===================================================================
--- a/drivers/ide/ide-disk.c
+++ b/drivers/ide/ide-disk.c
[...]
@@ -350,31 +353,12 @@ static unsigned long idedisk_read_native
/* if OK, compute maximum address value */
        if ((tf->command & 0x01) == 0) {
-               addr = ((tf->device & 0xf) << 24) |
-                      (tf->lbah << 16) | (tf->lbam << 8) | tf->lbal;
-               addr++; /* since the return value is (maxlba - 1), we add 1 */

Actually, the return value is just maxlba (which is *not* the same as capacity).

-       }
-       return addr;
-}
-
-static unsigned long long idedisk_read_native_max_address_ext(ide_drive_t 
*drive)
-{
-       ide_task_t args;
-       struct ide_taskfile *tf = &args.tf;
-       unsigned long long addr = 0;
-
-       /* Create IDE/ATA command request structure */
-       memset(&args, 0, sizeof(ide_task_t));
-       tf->device  = ATA_LBA;
-       tf->command = WIN_READ_NATIVE_MAX_EXT;
-       args.command_type                       = IDE_DRIVE_TASK_NO_DATA;
-       args.handler                            = &task_no_data_intr;
-        /* submit command request */
-        ide_raw_taskfile(drive, &args, NULL);
-
-       /* if OK, compute maximum address value */
-       if ((tf->command & 0x01) == 0) {
                u32 high, low;

No newline after declaration block. Well, I see that it's been this way before the patch but it doesn't have to when this code has been already touched...

+               if (lba48)
+                       high = (tf->hob_lbah << 16) | (tf->hob_lbam << 8) |
+                               tf->hob_lbal;
+               else
+                       high = tf->device & 0xf;
                high = (tf->hob_lbah << 16) | (tf->hob_lbam << 8) | 
tf->hob_lbal;

Wait, you've just properly calculated 'high'! And now LBA28 variant is borken. :-|

                low  = (tf->lbah << 16) | (tf->lbam << 8) | tf->lbal;
                addr = ((__u64)high << 24) | low;
@@ -387,38 +371,11 @@ static unsigned long long idedisk_read_n

[...]

@@ -438,7 +400,11 @@ static unsigned long long idedisk_set_ma
        /* if OK, compute maximum address value */
        if ((tf->command & 0x01) == 0) {
                u32 high, low;

  Again no newline after declaration...

-               high = (tf->hob_lbah << 16) | (tf->hob_lbam << 8) | 
tf->hob_lbal;
+               if (lba48)
+                       high = (tf->hob_lbah << 16) | (tf->hob_lbam << 8) |
+                               tf->hob_lbal;
+               else
+                       high = tf->device & 0xf;
                low  = (tf->lbah << 16) | (tf->lbam << 8) | tf->lbal;
                addr_set = ((__u64)high << 24) | low;
                addr_set++;

BTW, haven't you noticed that LBA readback code is duplicate? It just asks to be put into a separate function, like:

static u64 ide_read_lba(struct ide_taskfile *tf)
{
        if (!(tf->command & 0x01)) {
                u32 high, low;

                if (lba48)
                        high = (tf->hob_lbah << 16) | (tf->hob_lbam << 8) |
                                tf->hob_lbal;
                else
                        high = tf->device & 0xf;
                low  = (tf->lbah << 16) | (tf->lbam << 8) | tf->lbal;
                return (((__u64)high << 24) | low) + 1;
        } else
                return 0;
}

MBR, Sergei

-
To unsubscribe from this list: send the line "unsubscribe linux-ide" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to