]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
* include/grub/ata.h (grub_ata): Add a new element maxbuffer.
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Sun, 29 Jan 2012 18:00:30 +0000 (19:00 +0100)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Sun, 29 Jan 2012 18:00:30 +0000 (19:00 +0100)
* grub-core/disk/ata.c (grub_ata_readwrite): Limit to ata->maxbuffer.
* grub-core/disk/pata.c (grub_pata_open): Set ata->maxbuffer.
* grub-core/disk/ahci.c (grub_ahci_open): Likewise.

ChangeLog
grub-core/disk/ahci.c
grub-core/disk/ata.c
grub-core/disk/pata.c
include/grub/ata.h

index d270c87df4cc45859d1ef2fa86de49ae45c3c2f7..7a0af5e7a75fafedde578395ce49df088df89ac2 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2012-01-29  Vladimir Serbinenko  <phcoder@gmail.com>
+
+       * include/grub/ata.h (grub_ata): Add a new element maxbuffer.
+       * grub-core/disk/ata.c (grub_ata_readwrite): Limit to ata->maxbuffer.
+       * grub-core/disk/pata.c (grub_pata_open): Set ata->maxbuffer.
+       * grub-core/disk/ahci.c (grub_ahci_open): Likewise.
+
 2012-01-29  Vladimir Serbinenko  <phcoder@gmail.com>
 
        * include/grub/zfs/dnode.h (DN_MIN_INDBLKSHIFT): Removed.
index a5a14d414fc96c3ed5b0d6ad96833a65759ef5c7..8c4fc2bfb1daa1776a883d138a4d83bb9649308b 100644 (file)
@@ -693,6 +693,7 @@ grub_ahci_open (int id, int devnum, struct grub_ata *ata)
 
   ata->data = dev;
   ata->dma = 1;
+  ata->maxbuffer = GRUB_AHCI_PRDT_MAX_CHUNK_LENGTH;
   ata->present = &dev->present;
 
   return GRUB_ERR_NONE;
index 50559a815d45ea04f02d5e6d8906812233e3357b..6d2ec0c78202419695c1f9c7c7d5d8d6bf5e2cbf 100644 (file)
@@ -278,6 +278,7 @@ grub_ata_readwrite (grub_disk_t disk, grub_disk_addr_t sector,
   grub_ata_addressing_t addressing = ata->addr;
   grub_size_t batch;
   int cmd, cmd_write;
+  grub_size_t nsectors = 0;
 
   grub_dprintf("ata", "grub_ata_readwrite (size=%llu, rw=%d)\n",
               (unsigned long long) size, rw);
@@ -314,9 +315,11 @@ grub_ata_readwrite (grub_disk_t disk, grub_disk_addr_t sector,
          cmd = GRUB_ATA_CMD_READ_SECTORS;
          cmd_write = GRUB_ATA_CMD_WRITE_SECTORS;
        }
-    }    
+    }
+
+  if (batch > (ata->maxbuffer >> ata->log_sector_size))
+    batch = (ata->maxbuffer >> ata->log_sector_size);
 
-  grub_size_t nsectors = 0;
   while (nsectors < size)
     {
       struct grub_disk_ata_pass_through_parms parms;
index ff76cc1fb1363667154aa65768a2d3ad50b4cce2..089059d10aa1800608382423b242e08d63abd496 100644 (file)
@@ -484,6 +484,7 @@ grub_pata_open (int id, int devnum, struct grub_ata *ata)
 
   ata->data = devfnd;
   ata->dma = 0;
+  ata->maxbuffer = 256 * 512;
   ata->present = &devfnd->present;
 
   return GRUB_ERR_NONE;
index 1a19f27aaf920012000e08b920c485e12660c248..efba7b71d3fa0d2457854ed35a1651a42e445c3d 100644 (file)
@@ -182,6 +182,8 @@ struct grub_ata
 
   int dma;
 
+  grub_size_t maxbuffer;
+
   int *present;
 
   void *data;