aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/scsi/libata-core.c57
1 files changed, 43 insertions, 14 deletions
diff --git a/drivers/scsi/libata-core.c b/drivers/scsi/libata-core.c
index bbd6665eb212..4a44e759e45a 100644
--- a/drivers/scsi/libata-core.c
+++ b/drivers/scsi/libata-core.c
@@ -1131,14 +1131,23 @@ unsigned ata_exec_internal(struct ata_device *dev,
1131 return err_mask; 1131 return err_mask;
1132} 1132}
1133 1133
1134/* 1134/**
1135 * Execute a 'simple' command, that only consists of the opcode 'cmd' itself, 1135 * ata_do_simple_cmd - execute simple internal command
1136 * without filling any other registers 1136 * @dev: Device to which the command is sent
1137 * @cmd: Opcode to execute
1138 *
1139 * Execute a 'simple' command, that only consists of the opcode
1140 * 'cmd' itself, without filling any other registers
1141 *
1142 * LOCKING:
1143 * Kernel thread context (may sleep).
1144 *
1145 * RETURNS:
1146 * Zero on success, AC_ERR_* mask on failure
1137 */ 1147 */
1138static int ata_do_simple_cmd(struct ata_device *dev, u8 cmd) 1148static unsigned int ata_do_simple_cmd(struct ata_device *dev, u8 cmd)
1139{ 1149{
1140 struct ata_taskfile tf; 1150 struct ata_taskfile tf;
1141 int err;
1142 1151
1143 ata_tf_init(dev, &tf); 1152 ata_tf_init(dev, &tf);
1144 1153
@@ -1146,12 +1155,7 @@ static int ata_do_simple_cmd(struct ata_device *dev, u8 cmd)
1146 tf.flags |= ATA_TFLAG_DEVICE; 1155 tf.flags |= ATA_TFLAG_DEVICE;
1147 tf.protocol = ATA_PROT_NODATA; 1156 tf.protocol = ATA_PROT_NODATA;
1148 1157
1149 err = ata_exec_internal(dev, &tf, NULL, DMA_NONE, NULL, 0); 1158 return ata_exec_internal(dev, &tf, NULL, DMA_NONE, NULL, 0);
1150 if (err)
1151 ata_dev_printk(dev, KERN_ERR, "%s: ata command failed: %d\n",
1152 __FUNCTION__, err);
1153
1154 return err;
1155} 1159}
1156 1160
1157/** 1161/**
@@ -4971,6 +4975,7 @@ int ata_port_offline(struct ata_port *ap)
4971 4975
4972static int ata_flush_cache(struct ata_device *dev) 4976static int ata_flush_cache(struct ata_device *dev)
4973{ 4977{
4978 unsigned int err_mask;
4974 u8 cmd; 4979 u8 cmd;
4975 4980
4976 if (!ata_try_flush_cache(dev)) 4981 if (!ata_try_flush_cache(dev))
@@ -4981,17 +4986,41 @@ static int ata_flush_cache(struct ata_device *dev)
4981 else 4986 else
4982 cmd = ATA_CMD_FLUSH; 4987 cmd = ATA_CMD_FLUSH;
4983 4988
4984 return ata_do_simple_cmd(dev, cmd); 4989 err_mask = ata_do_simple_cmd(dev, cmd);
4990 if (err_mask) {
4991 ata_dev_printk(dev, KERN_ERR, "failed to flush cache\n");
4992 return -EIO;
4993 }
4994
4995 return 0;
4985} 4996}
4986 4997
4987static int ata_standby_drive(struct ata_device *dev) 4998static int ata_standby_drive(struct ata_device *dev)
4988{ 4999{
4989 return ata_do_simple_cmd(dev, ATA_CMD_STANDBYNOW1); 5000 unsigned int err_mask;
5001
5002 err_mask = ata_do_simple_cmd(dev, ATA_CMD_STANDBYNOW1);
5003 if (err_mask) {
5004 ata_dev_printk(dev, KERN_ERR, "failed to standby drive "
5005 "(err_mask=0x%x)\n", err_mask);
5006 return -EIO;
5007 }
5008
5009 return 0;
4990} 5010}
4991 5011
4992static int ata_start_drive(struct ata_device *dev) 5012static int ata_start_drive(struct ata_device *dev)
4993{ 5013{
4994 return ata_do_simple_cmd(dev, ATA_CMD_IDLEIMMEDIATE); 5014 unsigned int err_mask;
5015
5016 err_mask = ata_do_simple_cmd(dev, ATA_CMD_IDLEIMMEDIATE);
5017 if (err_mask) {
5018 ata_dev_printk(dev, KERN_ERR, "failed to start drive "
5019 "(err_mask=0x%x)\n", err_mask);
5020 return -EIO;
5021 }
5022
5023 return 0;
4995} 5024}
4996 5025
4997/** 5026/**