Changeset View
Changeset View
Standalone View
Standalone View
sys/cam/ata/ata_da.c
Show First 20 Lines • Show All 105 Lines • ▼ Show 20 Lines | typedef enum { | ||||
ADA_FLAG_CAN_WCACHE = 0x00020000, | ADA_FLAG_CAN_WCACHE = 0x00020000, | ||||
ADA_FLAG_CAN_RAHEAD = 0x00040000, | ADA_FLAG_CAN_RAHEAD = 0x00040000, | ||||
ADA_FLAG_PROBED = 0x00080000, | ADA_FLAG_PROBED = 0x00080000, | ||||
ADA_FLAG_ANNOUNCED = 0x00100000, | ADA_FLAG_ANNOUNCED = 0x00100000, | ||||
ADA_FLAG_DIRTY = 0x00200000, | ADA_FLAG_DIRTY = 0x00200000, | ||||
ADA_FLAG_CAN_NCQ_TRIM = 0x00400000, /* CAN_TRIM also set */ | ADA_FLAG_CAN_NCQ_TRIM = 0x00400000, /* CAN_TRIM also set */ | ||||
ADA_FLAG_PIM_ATA_EXT = 0x00800000, | ADA_FLAG_PIM_ATA_EXT = 0x00800000, | ||||
ADA_FLAG_UNMAPPEDIO = 0x01000000, | ADA_FLAG_UNMAPPEDIO = 0x01000000, | ||||
ADA_FLAG_ROTATING = 0x02000000 | ADA_FLAG_ROTATING = 0x02000000, | ||||
ADA_FLAG_CAN_NCQ_PRIO = 0x04000000 | |||||
} ada_flags; | } ada_flags; | ||||
#define ADA_FLAG_STRING \ | #define ADA_FLAG_STRING \ | ||||
"\020" \ | "\020" \ | ||||
"\002CAN_48BIT" \ | "\002CAN_48BIT" \ | ||||
"\003CAN_FLUSHCACHE" \ | "\003CAN_FLUSHCACHE" \ | ||||
"\004CAN_NCQ" \ | "\004CAN_NCQ" \ | ||||
"\005CAN_DMA" \ | "\005CAN_DMA" \ | ||||
"\006NEED_OTAG" \ | "\006NEED_OTAG" \ | ||||
Show All 11 Lines | #define ADA_FLAG_STRING \ | ||||
"\022CAN_WCACHE" \ | "\022CAN_WCACHE" \ | ||||
"\023CAN_RAHEAD" \ | "\023CAN_RAHEAD" \ | ||||
"\024PROBED" \ | "\024PROBED" \ | ||||
"\025ANNOUNCED" \ | "\025ANNOUNCED" \ | ||||
"\026DIRTY" \ | "\026DIRTY" \ | ||||
"\027CAN_NCQ_TRIM" \ | "\027CAN_NCQ_TRIM" \ | ||||
"\030PIM_ATA_EXT" \ | "\030PIM_ATA_EXT" \ | ||||
"\031UNMAPPEDIO" \ | "\031UNMAPPEDIO" \ | ||||
"\032ROTATING" | "\032ROTATING" \ | ||||
"\033CAN_NCQ_PRIO" | |||||
typedef enum { | typedef enum { | ||||
ADA_Q_NONE = 0x00, | ADA_Q_NONE = 0x00, | ||||
ADA_Q_4K = 0x01, | ADA_Q_4K = 0x01, | ||||
ADA_Q_NCQ_TRIM_BROKEN = 0x02, | ADA_Q_NCQ_TRIM_BROKEN = 0x02, | ||||
ADA_Q_LOG_BROKEN = 0x04, | ADA_Q_LOG_BROKEN = 0x04, | ||||
ADA_Q_SMR_DM = 0x08, | ADA_Q_SMR_DM = 0x08, | ||||
ADA_Q_NO_TRIM = 0x10, | ADA_Q_NO_TRIM = 0x10, | ||||
▲ Show 20 Lines • Show All 1,567 Lines • ▼ Show 20 Lines | else | ||||
softc->flags &= ~ADA_FLAG_CAN_POWERMGT; | softc->flags &= ~ADA_FLAG_CAN_POWERMGT; | ||||
if ((cgd->ident_data.satacapabilities & ATA_SUPPORT_NCQ) && | if ((cgd->ident_data.satacapabilities & ATA_SUPPORT_NCQ) && | ||||
(cgd->inq_flags & SID_DMA) && (cgd->inq_flags & SID_CmdQue)) | (cgd->inq_flags & SID_DMA) && (cgd->inq_flags & SID_CmdQue)) | ||||
softc->flags |= ADA_FLAG_CAN_NCQ; | softc->flags |= ADA_FLAG_CAN_NCQ; | ||||
else | else | ||||
softc->flags &= ~ADA_FLAG_CAN_NCQ; | softc->flags &= ~ADA_FLAG_CAN_NCQ; | ||||
if ((cgd->ident_data.satacapabilities & ATA_SUPPORT_NCQ_PRIO) && | |||||
(softc->flags & ADA_FLAG_CAN_NCQ)) | |||||
softc->flags |= ADA_FLAG_CAN_NCQ_PRIO; | |||||
else | |||||
softc->flags &= ~ADA_FLAG_CAN_NCQ_PRIO; | |||||
if ((cgd->ident_data.support_dsm & ATA_SUPPORT_DSM_TRIM) && | if ((cgd->ident_data.support_dsm & ATA_SUPPORT_DSM_TRIM) && | ||||
(cgd->inq_flags & SID_DMA) && | (cgd->inq_flags & SID_DMA) && | ||||
(softc->quirks & ADA_Q_NO_TRIM) == 0) { | (softc->quirks & ADA_Q_NO_TRIM) == 0) { | ||||
softc->flags |= ADA_FLAG_CAN_TRIM; | softc->flags |= ADA_FLAG_CAN_TRIM; | ||||
softc->trim_max_ranges = TRIM_MAX_RANGES; | softc->trim_max_ranges = TRIM_MAX_RANGES; | ||||
if (cgd->ident_data.max_dsm_blocks != 0) { | if (cgd->ident_data.max_dsm_blocks != 0) { | ||||
softc->trim_max_ranges = | softc->trim_max_ranges = | ||||
min(cgd->ident_data.max_dsm_blocks * | min(cgd->ident_data.max_dsm_blocks * | ||||
▲ Show 20 Lines • Show All 335 Lines • ▼ Show 20 Lines | cam_fill_ataio(ataio, | ||||
req->data, | req->data, | ||||
howmany(ranges, ATA_DSM_BLK_RANGES) * ATA_DSM_BLK_SIZE, | howmany(ranges, ATA_DSM_BLK_RANGES) * ATA_DSM_BLK_SIZE, | ||||
ada_default_timeout * 1000); | ada_default_timeout * 1000); | ||||
ata_ncq_cmd(ataio, | ata_ncq_cmd(ataio, | ||||
ATA_SEND_FPDMA_QUEUED, | ATA_SEND_FPDMA_QUEUED, | ||||
0, | 0, | ||||
howmany(ranges, ATA_DSM_BLK_RANGES)); | howmany(ranges, ATA_DSM_BLK_RANGES)); | ||||
ataio->cmd.sector_count_exp = ATA_SFPDMA_DSM; | ataio->cmd.sector_count_exp = ATA_SFPDMA_DSM; | ||||
if ((bp->bio_flags & BIO_LOWPRIO) == 0 && | |||||
(softc->flags & ADA_FLAG_CAN_NCQ_PRIO) && cam_enable_prio) | |||||
ataio->cmd.sector_count_exp |= 0x80; | |||||
ataio->ata_flags |= ATA_FLAG_AUX; | ataio->ata_flags |= ATA_FLAG_AUX; | ||||
ataio->aux = 1; | ataio->aux = 1; | ||||
} | } | ||||
static void | static void | ||||
ada_cfaerase(struct ada_softc *softc, struct bio *bp, struct ccb_ataio *ataio) | ada_cfaerase(struct ada_softc *softc, struct bio *bp, struct ccb_ataio *ataio) | ||||
{ | { | ||||
struct trim_request *req = &softc->trim_req; | struct trim_request *req = &softc->trim_req; | ||||
▲ Show 20 Lines • Show All 324 Lines • ▼ Show 20 Lines | #endif | ||||
if ((softc->flags & ADA_FLAG_CAN_NCQ) && tag_code) { | if ((softc->flags & ADA_FLAG_CAN_NCQ) && tag_code) { | ||||
if (bp->bio_cmd == BIO_READ) { | if (bp->bio_cmd == BIO_READ) { | ||||
ata_ncq_cmd(ataio, ATA_READ_FPDMA_QUEUED, | ata_ncq_cmd(ataio, ATA_READ_FPDMA_QUEUED, | ||||
lba, count); | lba, count); | ||||
} else { | } else { | ||||
ata_ncq_cmd(ataio, ATA_WRITE_FPDMA_QUEUED, | ata_ncq_cmd(ataio, ATA_WRITE_FPDMA_QUEUED, | ||||
lba, count); | lba, count); | ||||
} | } | ||||
if ((bp->bio_flags & BIO_LOWPRIO) == 0 && | |||||
(softc->flags & ADA_FLAG_CAN_NCQ_PRIO) && | |||||
cam_enable_prio) | |||||
ataio->cmd.sector_count_exp = 0x80; | |||||
} else if ((softc->flags & ADA_FLAG_CAN_48BIT) && | } else if ((softc->flags & ADA_FLAG_CAN_48BIT) && | ||||
(lba + count >= ATA_MAX_28BIT_LBA || | (lba + count >= ATA_MAX_28BIT_LBA || | ||||
count > 256)) { | count > 256)) { | ||||
if (softc->flags & ADA_FLAG_CAN_DMA48) { | if (softc->flags & ADA_FLAG_CAN_DMA48) { | ||||
if (bp->bio_cmd == BIO_READ) { | if (bp->bio_cmd == BIO_READ) { | ||||
ata_48bit_cmd(ataio, ATA_READ_DMA48, | ata_48bit_cmd(ataio, ATA_READ_DMA48, | ||||
0, lba, count); | 0, lba, count); | ||||
} else { | } else { | ||||
▲ Show 20 Lines • Show All 1,280 Lines • Show Last 20 Lines |