diff --git a/src/add-ons/kernel/busses/scsi/ahci/ahci_port.cpp b/src/add-ons/kernel/busses/scsi/ahci/ahci_port.cpp index 3a5611d529..00f17ebfae 100644 --- a/src/add-ons/kernel/busses/scsi/ahci/ahci_port.cpp +++ b/src/add-ons/kernel/busses/scsi/ahci/ahci_port.cpp @@ -837,12 +837,14 @@ AHCIPort::ScsiUnmap(scsi_ccb* request, scsi_unmap_parameter_list* unmapBlocks) lbaRanges[i++] = B_HOST_TO_LENDIAN_INT64( ((uint64)blocks << 48) | lba); lba += blocks; + bytesLeft -= blocks; } } sata_request sreq; sreq.set_ata48_cmd(ATA_COMMAND_DATA_SET_MANAGEMENT, 0, (lbaRangesSize + 511) / 512); + sreq.SetFeature(1); sreq.set_data(lbaRanges, lbaRangesSize); ExecuteSataRequest(&sreq); diff --git a/src/add-ons/kernel/busses/scsi/ahci/sata_request.cpp b/src/add-ons/kernel/busses/scsi/ahci/sata_request.cpp index d5cfd823cc..2fe8b214e2 100644 --- a/src/add-ons/kernel/busses/scsi/ahci/sata_request.cpp +++ b/src/add-ons/kernel/busses/scsi/ahci/sata_request.cpp @@ -94,6 +94,14 @@ sata_request::set_ata48_cmd(uint8 command, uint64 lba, uint16 sectorCount) } +void +sata_request::SetFeature(uint16 feature) +{ + fFis[3] = (uint8)(feature & 0xff); + fFis[11] = (uint8)(feature >> 8); +} + + void sata_request::set_atapi_cmd(size_t transferLength) { diff --git a/src/add-ons/kernel/busses/scsi/ahci/sata_request.h b/src/add-ons/kernel/busses/scsi/ahci/sata_request.h index 71550f6886..61191be9d1 100644 --- a/src/add-ons/kernel/busses/scsi/ahci/sata_request.h +++ b/src/add-ons/kernel/busses/scsi/ahci/sata_request.h @@ -20,6 +20,7 @@ public: void set_ata_cmd(uint8 command); void set_ata28_cmd(uint8 command, uint32 lba, uint8 sectorCount); void set_ata48_cmd(uint8 command, uint64 lba, uint16 sectorCount); + void SetFeature(uint16 feature); void set_atapi_cmd(size_t transferLength); bool is_atapi();