if (sfan_handle) {
                /* 570, 770x-JL */
                fan_control_access_mode = IBMACPI_FAN_WR_ACPI_SFAN;
-               fan_control_commands |= IBMACPI_FAN_CMD_LEVEL;
+               fan_control_commands |=
+                   IBMACPI_FAN_CMD_LEVEL | IBMACPI_FAN_CMD_ENABLE;
        } else {
                if (!gfan_handle) {
                        /* gfan without sfan means no fan control */
 
 static int fan_set_enable(void)
 {
+       u8 s;
+       int rc;
+
        switch (fan_control_access_mode) {
        case IBMACPI_FAN_WR_ACPI_FANS:
        case IBMACPI_FAN_WR_TPEC:
-               if (!acpi_ec_write(fan_status_offset, 0x80))
+               if ((rc = fan_get_status(&s)) < 0)
+                       return rc;
+
+               /* Don't go out of emergency fan mode */
+               if (s != 7)
+                       s = IBMACPI_FAN_EC_AUTO;
+
+               if (!acpi_ec_write(fan_status_offset, s))
+                       return -EIO;
+               break;
+
+       case IBMACPI_FAN_WR_ACPI_SFAN:
+               if ((rc = fan_get_status(&s)) < 0)
+                       return rc;
+
+               s &= 0x07;
+
+               /* Set fan to at least level 4 */
+               if (s < 4)
+                       s = 4;
+
+               if (!acpi_evalf(sfan_handle, NULL, NULL, "vd", s))
                        return -EIO;
                break;
 
                        return -EIO;
                break;
 
+       case IBMACPI_FAN_WR_ACPI_SFAN:
+               if (!acpi_evalf(sfan_handle, NULL, NULL, "vd", 0x00))
+                       return -EIO;
+               break;
+
        default:
                return -ENXIO;
        }