git://scm.lunaixsky.com
/
lunaix-os.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
feat: symlink(2) and realpathat syscall
[lunaix-os.git]
/
lunaix-os
/
hal
/
ahci
/
ata.c
diff --git
a/lunaix-os/hal/ahci/ata.c
b/lunaix-os/hal/ahci/ata.c
index 486d69d7c76ac7a551c125f96c0da4e68b10b845..a2f10ba769bfa49c24e7440baae63b7e98231c65 100644
(file)
--- a/
lunaix-os/hal/ahci/ata.c
+++ b/
lunaix-os/hal/ahci/ata.c
@@
-6,7
+6,7
@@
#include <lunaix/spike.h>
int
#include <lunaix/spike.h>
int
-__sata_buffer_io(struct hba_
port* port
,
+__sata_buffer_io(struct hba_
device* dev
,
uint64_t lba,
void* buffer,
uint32_t size,
uint64_t lba,
void* buffer,
uint32_t size,
@@
-14,9
+14,10
@@
__sata_buffer_io(struct hba_port* port,
{
assert_msg(((uintptr_t)buffer & 0x3) == 0, "HBA: Bad buffer alignment");
{
assert_msg(((uintptr_t)buffer & 0x3) == 0, "HBA: Bad buffer alignment");
+ struct hba_port* port = dev->port;
struct hba_cmdh* header;
struct hba_cmdt* table;
struct hba_cmdh* header;
struct hba_cmdt* table;
- int slot = hba_
alloc_slot(port, &table, &header, 0
);
+ int slot = hba_
prepare_cmd(port, &table, &header, buffer, size
);
int bitmask = 1 << slot;
// 确保端口是空闲的
int bitmask = 1 << slot;
// 确保端口是空闲的
@@
-24,9
+25,6
@@
__sata_buffer_io(struct hba_port* port,
port->regs[HBA_RPxIS] = 0;
port->regs[HBA_RPxIS] = 0;
- table->entries[0] = (struct hba_prdte){ .byte_count = size - 1,
- .data_base = vmm_v2p(buffer) };
- header->prdt_len = 1;
header->options |= HBA_CMDH_WRITE * (write == 1);
uint16_t count = ICEIL(size, port->device->block_size);
header->options |= HBA_CMDH_WRITE * (write == 1);
uint16_t count = ICEIL(size, port->device->block_size);
@@
-73,21
+71,21
@@
fail:
}
int
}
int
-sata_read_buffer(struct hba_
port* port
,
+sata_read_buffer(struct hba_
device* dev
,
uint64_t lba,
void* buffer,
uint32_t size)
{
uint64_t lba,
void* buffer,
uint32_t size)
{
- return __sata_buffer_io(
port
, lba, buffer, size, 0);
+ return __sata_buffer_io(
dev
, lba, buffer, size, 0);
}
int
}
int
-sata_write_buffer(struct hba_
port* port
,
+sata_write_buffer(struct hba_
device* dev
,
uint64_t lba,
void* buffer,
uint32_t size)
{
uint64_t lba,
void* buffer,
uint32_t size)
{
- return __sata_buffer_io(
port
, lba, buffer, size, 1);
+ return __sata_buffer_io(
dev
, lba, buffer, size, 1);
}
void
}
void
@@
-95,4
+93,5
@@
sata_read_error(struct hba_port* port)
{
uint32_t tfd = port->regs[HBA_RPxTFD];
port->device->last_error = (tfd >> 8) & 0xff;
{
uint32_t tfd = port->regs[HBA_RPxTFD];
port->device->last_error = (tfd >> 8) & 0xff;
+ port->device->last_status = tfd & 0xff;
}
\ No newline at end of file
}
\ No newline at end of file