NVMe: Fix START_STOP_UNIT Scsi->NVMe translation.

This patch contains several fixes for Scsi START_STOP_UNIT. The previous
code did not account for signed vs. unsigned arithmetic which resulted
in an invalid lowest power state caculation when the device only supports
1 power state.

The code for Power Condition == 2 (Idle) was not following the spec. The
spec calls for setting the device to specific power states, depending
upon Power Condition Modifier, without accounting for the number of
power states supported by the device.

The code for Power Condition == 3 (Standby) was using a hard-coded '0'
which is replaced with the macro POWER_STATE_0.

Signed-off-by: Dan McLeran <daniel.mcleran@intel.com>
Reviewed-by: Vishal Verma <vishal.l.verma@linux.intel.com>
Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>

authored by Dan McLeran and committed by Matthew Wilcox b8e08084 ef351b97

Changed files
+6 -7
drivers
block
+6 -7
drivers/block/nvme-scsi.c
··· 1476 1476 goto out_dma; 1477 1477 } 1478 1478 id_ctrl = mem; 1479 - lowest_pow_st = id_ctrl->npss - 1; 1479 + lowest_pow_st = max(POWER_STATE_0, (int)(id_ctrl->npss - 1)); 1480 1480 1481 1481 switch (pc) { 1482 1482 case NVME_POWER_STATE_START_VALID: ··· 1493 1493 break; 1494 1494 case NVME_POWER_STATE_IDLE: 1495 1495 /* Action unspecified if POWER CONDITION MODIFIER != [0,1,2] */ 1496 - /* min of desired state and (lps-1) because lps is STOP */ 1497 1496 if (pcmod == 0x0) 1498 - ps_desired = min(POWER_STATE_1, (lowest_pow_st - 1)); 1497 + ps_desired = POWER_STATE_1; 1499 1498 else if (pcmod == 0x1) 1500 - ps_desired = min(POWER_STATE_2, (lowest_pow_st - 1)); 1499 + ps_desired = POWER_STATE_2; 1501 1500 else if (pcmod == 0x2) 1502 - ps_desired = min(POWER_STATE_3, (lowest_pow_st - 1)); 1501 + ps_desired = POWER_STATE_3; 1503 1502 break; 1504 1503 case NVME_POWER_STATE_STANDBY: 1505 1504 /* Action unspecified if POWER CONDITION MODIFIER != [0,1] */ 1506 1505 if (pcmod == 0x0) 1507 - ps_desired = max(0, (lowest_pow_st - 2)); 1506 + ps_desired = max(POWER_STATE_0, (lowest_pow_st - 2)); 1508 1507 else if (pcmod == 0x1) 1509 - ps_desired = max(0, (lowest_pow_st - 1)); 1508 + ps_desired = max(POWER_STATE_0, (lowest_pow_st - 1)); 1510 1509 break; 1511 1510 case NVME_POWER_STATE_LU_CONTROL: 1512 1511 default: