summaryrefslogtreecommitdiffstats
path: root/sys/cam/ata/ata_da.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/cam/ata/ata_da.c')
-rw-r--r--sys/cam/ata/ata_da.c27
1 files changed, 26 insertions, 1 deletions
diff --git a/sys/cam/ata/ata_da.c b/sys/cam/ata/ata_da.c
index ed8eb4d..62eab67 100644
--- a/sys/cam/ata/ata_da.c
+++ b/sys/cam/ata/ata_da.c
@@ -233,16 +233,31 @@ static struct ada_quirk_entry ada_quirk_table[] =
/*quirks*/ADA_Q_4K
},
{
+ /* WDC Caviar Red Advanced Format (4k) drives */
+ { T_DIRECT, SIP_MEDIA_FIXED, "*", "WDC WD????CX*", "*" },
+ /*quirks*/ADA_Q_4K
+ },
+ {
/* WDC Caviar Green Advanced Format (4k) drives */
{ T_DIRECT, SIP_MEDIA_FIXED, "*", "WDC WD????RS*", "*" },
/*quirks*/ADA_Q_4K
},
{
- /* WDC Caviar Green Advanced Format (4k) drives */
+ /* WDC Caviar Green/Red Advanced Format (4k) drives */
{ T_DIRECT, SIP_MEDIA_FIXED, "*", "WDC WD????RX*", "*" },
/*quirks*/ADA_Q_4K
},
{
+ /* WDC Caviar Red Advanced Format (4k) drives */
+ { T_DIRECT, SIP_MEDIA_FIXED, "*", "WDC WD??????CX*", "*" },
+ /*quirks*/ADA_Q_4K
+ },
+ {
+ /* WDC Caviar Black Advanced Format (4k) drives */
+ { T_DIRECT, SIP_MEDIA_FIXED, "*", "WDC WD??????EX*", "*" },
+ /*quirks*/ADA_Q_4K
+ },
+ {
/* WDC Caviar Green Advanced Format (4k) drives */
{ T_DIRECT, SIP_MEDIA_FIXED, "*", "WDC WD??????RS*", "*" },
/*quirks*/ADA_Q_4K
@@ -1797,6 +1812,16 @@ adadone(struct cam_periph *periph, union ccb *done_ccb)
TAILQ_INIT(&queue);
TAILQ_CONCAT(&queue, &softc->trim_req.bps, bio_queue);
+ /*
+ * Normally, the xpt_release_ccb() above would make sure
+ * that when we have more work to do, that work would
+ * get kicked off. However, we specifically keep
+ * trim_running set to 0 before the call above to allow
+ * other I/O to progress when many BIO_DELETE requests
+ * are pushed down. We set trim_running to 0 and call
+ * daschedule again so that we don't stall if there are
+ * no other I/Os pending apart from BIO_DELETEs.
+ */
softc->trim_running = 0;
adaschedule(periph);
cam_periph_unlock(periph);
OpenPOWER on IntegriCloud