1. 27 Feb, 2021 1 commit
    • Jeffrey Lee's avatar
      Fix "Too complex" errors causing invalid transfer lengths to be used · 704af3bc
      Jeffrey Lee authored
      When ATA_Op reports a "Too complex" error, the truncated transfer length
      that it returns isn't guaranteed to be a multiple of the sector size.
      Make sure that we apply the appropriate rounding to the value before
      retrying the op.
      This issue was discovered while testing long descriptor page tables on
      4GB IGEPv5, which has the restriction that only the low 2GB of RAM can
      be accessed by the SATA controller. The kernel will (via OS_Memory 19)
      instruct SATADriver to use a bounce buffer for any parts of a transfer
      which access high RAM, but SATADriver only has a limited bounce buffer
      size, which will force it to split the transfer with a "Too complex"
      error once the buffer is full. If a mix of low & high RAM is being used
      for a transfer then this can easily result in SATADriver suggesting a
      transfer length which isn't a multiple of the sector size.
      For 2GB/short descriptor page tables this situation is much less likely
      to occur, since it'd be rare for a transfer to target a non-DMAable
      address (would have to be a mix of RAM & IO memory)
      Version 4.06. Tagged as 'ADFS4-4_06'
  2. 16 Jun, 2017 1 commit
    • Robert Sprowson's avatar
      Run time detect the sector size · 4b3236af
      Robert Sprowson authored
      Read the sector size from ATA Identify, and keep it in the drive structure. This allows a mix of sector sizes to be used across discs.
      Search & replace LOG2_SECTOR_SIZE and SECTOR_SIZE with the value read from the drive.
      Tested on Titanium with an assortment of manufacturer drives, capacities, and sector sizes.
      Version 4.03. Tagged as 'ADFS-4_03'
  3. 24 Mar, 2016 1 commit
    • Ben Avison's avatar
      Fix inability to recover from disc errors 08 and 21 · e1cf30a1
      Ben Avison authored
        These disc errors relate to the status of the task file registers before
        a command is issued, however with SATA (unlike PATA) we can't simply read
        the task file on demand, we need to issue a command to cause a register FIS
        transaction to happen on the bus. The only available command which is
        compatible with all device types (packet and non-packet) and which can be
        issued in not-ready state is EXECUTE_DEVICE_DIAGNOSTIC, so issue this when
        either disc error is encountered and retry to give the drive a chance to
        return to ready/not-busy state. This command has the advantage of having
        been mandatory back to ATA-1 so should be harmless for PATA drives, whether
        connected via a PATA-SATA bridge or via a future PATADriver module.
        Tested on Titanium.
      Version 4.02. Tagged as 'ADFS-4_02'
  4. 13 Mar, 2016 2 commits
    • Ben Avison's avatar
      LBA28 support · 86c19b05
      Ben Avison authored
        LBA28 is still useful for some small capacity Micro SATA SSDs in particular.
        Also a bugfix to reading the drive capacity (the only effect would have
        been that we didn't correctly fault DiscOps beyond the end of the media).
        Tested on IGEPv5
      Version 4.01. Tagged as 'ADFS-4_01'
    • Ben Avison's avatar
      Initial import of ADFS 4 · 120aa298
      Ben Avison authored
        Version 4 of ADFS is a complete rewrite, but backward compatible with
        previous versions of ADFS. The hardware driver components have been
        extracted out into separate modules, along the lines of the
        SCSIFS/SCSIDriver and SDFS/SDIODriver interfaces. Initially, the only
        supported driver backend is for AHCI SATA controllers, but it is anticipated
        that PATA controller support and maybe even floppy drive support may be
        added at a later date to cater for legacy hardware. Background transfers are
        only partially implemented at present.
        This version is what appeared in initial Titanium ROM releases.
      Tagged as 'ADFS-4_00'