|
|
|
@ -750,49 +750,6 @@ static u32 dwc_ahsata_rw_cmd_ext(int dev, u32 start, lbaint_t blkcnt, |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
u32 dwc_ahsata_rw_ncq_cmd(int dev, u32 start, lbaint_t blkcnt, |
|
|
|
|
u8 *buffer, int is_write) |
|
|
|
|
{ |
|
|
|
|
struct ahci_uc_priv *probe_ent = |
|
|
|
|
(struct ahci_uc_priv *)sata_dev_desc[dev].priv; |
|
|
|
|
struct sata_fis_h2d h2d __aligned(ARCH_DMA_MINALIGN); |
|
|
|
|
struct sata_fis_h2d *cfis = &h2d; |
|
|
|
|
u8 port = probe_ent->hard_port_no; |
|
|
|
|
u64 block; |
|
|
|
|
|
|
|
|
|
if (sata_dev_desc[dev].lba48 != 1) { |
|
|
|
|
printf("execute FPDMA command on non-LBA48 hard disk\n\r"); |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
block = (u64)start; |
|
|
|
|
|
|
|
|
|
memset(cfis, 0, sizeof(struct sata_fis_h2d)); |
|
|
|
|
|
|
|
|
|
cfis->fis_type = SATA_FIS_TYPE_REGISTER_H2D; |
|
|
|
|
cfis->pm_port_c = 0x80; /* is command */ |
|
|
|
|
|
|
|
|
|
cfis->command = (is_write) ? ATA_CMD_FPDMA_WRITE |
|
|
|
|
: ATA_CMD_FPDMA_READ; |
|
|
|
|
|
|
|
|
|
cfis->lba_high_exp = (block >> 40) & 0xff; |
|
|
|
|
cfis->lba_mid_exp = (block >> 32) & 0xff; |
|
|
|
|
cfis->lba_low_exp = (block >> 24) & 0xff; |
|
|
|
|
cfis->lba_high = (block >> 16) & 0xff; |
|
|
|
|
cfis->lba_mid = (block >> 8) & 0xff; |
|
|
|
|
cfis->lba_low = block & 0xff; |
|
|
|
|
|
|
|
|
|
cfis->device = ATA_LBA; |
|
|
|
|
cfis->features_exp = (blkcnt >> 8) & 0xff; |
|
|
|
|
cfis->features = blkcnt & 0xff; |
|
|
|
|
|
|
|
|
|
/* Use the latest queue */ |
|
|
|
|
ahci_exec_ata_cmd(probe_ent, port, cfis, |
|
|
|
|
buffer, ATA_SECT_SIZE * blkcnt, is_write); |
|
|
|
|
|
|
|
|
|
return blkcnt; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void dwc_ahsata_flush_cache_ext(int dev) |
|
|
|
|
{ |
|
|
|
|
struct ahci_uc_priv *probe_ent = |
|
|
|
|