|
@@ -1148,11 +1148,15 @@ static bool mtip_pause_ncq(struct mtip_port *port,
|
|
|
reply = port->rxfis + RX_FIS_D2H_REG;
|
|
|
task_file_data = readl(port->mmio+PORT_TFDATA);
|
|
|
|
|
|
- if ((task_file_data & 1) || (fis->command == ATA_CMD_SEC_ERASE_UNIT))
|
|
|
+ if (fis->command == ATA_CMD_SEC_ERASE_UNIT)
|
|
|
+ clear_bit(MTIP_DDF_SEC_LOCK_BIT, &port->dd->dd_flag);
|
|
|
+
|
|
|
+ if ((task_file_data & 1))
|
|
|
return false;
|
|
|
|
|
|
if (fis->command == ATA_CMD_SEC_ERASE_PREP) {
|
|
|
set_bit(MTIP_PF_SE_ACTIVE_BIT, &port->flags);
|
|
|
+ set_bit(MTIP_DDF_SEC_LOCK_BIT, &port->dd->dd_flag);
|
|
|
port->ic_pause_timer = jiffies;
|
|
|
return true;
|
|
|
} else if ((fis->command == ATA_CMD_DOWNLOAD_MICRO) &&
|
|
@@ -3619,6 +3623,10 @@ static void mtip_make_request(struct request_queue *queue, struct bio *bio)
|
|
|
bio_endio(bio, -ENODATA);
|
|
|
return;
|
|
|
}
|
|
|
+ if (unlikely(test_bit(MTIP_DDF_SEC_LOCK_BIT, &dd->dd_flag))) {
|
|
|
+ bio_endio(bio, -ENODATA);
|
|
|
+ return;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
if (unlikely(!bio_has_data(bio))) {
|