Merge branch 'master'
This commit is contained in:
@@ -38,6 +38,7 @@
|
||||
#include <linux/spinlock.h>
|
||||
#include <scsi/scsi.h>
|
||||
#include <scsi/scsi_host.h>
|
||||
#include <scsi/scsi_eh.h>
|
||||
#include <scsi/scsi_device.h>
|
||||
#include <scsi/scsi_request.h>
|
||||
#include <linux/libata.h>
|
||||
@@ -147,7 +148,8 @@ int ata_cmd_ioctl(struct scsi_device *scsidev, void __user *arg)
|
||||
u8 scsi_cmd[MAX_COMMAND_SIZE];
|
||||
u8 args[4], *argbuf = NULL;
|
||||
int argsize = 0;
|
||||
struct scsi_request *sreq;
|
||||
struct scsi_sense_hdr sshdr;
|
||||
enum dma_data_direction data_dir;
|
||||
|
||||
if (NULL == (void *)arg)
|
||||
return -EINVAL;
|
||||
@@ -155,10 +157,6 @@ int ata_cmd_ioctl(struct scsi_device *scsidev, void __user *arg)
|
||||
if (copy_from_user(args, arg, sizeof(args)))
|
||||
return -EFAULT;
|
||||
|
||||
sreq = scsi_allocate_request(scsidev, GFP_KERNEL);
|
||||
if (!sreq)
|
||||
return -EINTR;
|
||||
|
||||
memset(scsi_cmd, 0, sizeof(scsi_cmd));
|
||||
|
||||
if (args[3]) {
|
||||
@@ -172,11 +170,11 @@ int ata_cmd_ioctl(struct scsi_device *scsidev, void __user *arg)
|
||||
scsi_cmd[1] = (4 << 1); /* PIO Data-in */
|
||||
scsi_cmd[2] = 0x0e; /* no off.line or cc, read from dev,
|
||||
block count in sector count field */
|
||||
sreq->sr_data_direction = DMA_FROM_DEVICE;
|
||||
data_dir = DMA_FROM_DEVICE;
|
||||
} else {
|
||||
scsi_cmd[1] = (3 << 1); /* Non-data */
|
||||
/* scsi_cmd[2] is already 0 -- no off.line, cc, or data xfer */
|
||||
sreq->sr_data_direction = DMA_NONE;
|
||||
data_dir = DMA_NONE;
|
||||
}
|
||||
|
||||
scsi_cmd[0] = ATA_16;
|
||||
@@ -194,9 +192,8 @@ int ata_cmd_ioctl(struct scsi_device *scsidev, void __user *arg)
|
||||
|
||||
/* Good values for timeout and retries? Values below
|
||||
from scsi_ioctl_send_command() for default case... */
|
||||
scsi_wait_req(sreq, scsi_cmd, argbuf, argsize, (10*HZ), 5);
|
||||
|
||||
if (sreq->sr_result) {
|
||||
if (scsi_execute_req(scsidev, scsi_cmd, data_dir, argbuf, argsize,
|
||||
&sshdr, (10*HZ), 5)) {
|
||||
rc = -EIO;
|
||||
goto error;
|
||||
}
|
||||
@@ -207,8 +204,6 @@ int ata_cmd_ioctl(struct scsi_device *scsidev, void __user *arg)
|
||||
&& copy_to_user((void *)(arg + sizeof(args)), argbuf, argsize))
|
||||
rc = -EFAULT;
|
||||
error:
|
||||
scsi_release_request(sreq);
|
||||
|
||||
if (argbuf)
|
||||
kfree(argbuf);
|
||||
|
||||
@@ -231,7 +226,7 @@ int ata_task_ioctl(struct scsi_device *scsidev, void __user *arg)
|
||||
int rc = 0;
|
||||
u8 scsi_cmd[MAX_COMMAND_SIZE];
|
||||
u8 args[7];
|
||||
struct scsi_request *sreq;
|
||||
struct scsi_sense_hdr sshdr;
|
||||
|
||||
if (NULL == (void *)arg)
|
||||
return -EINVAL;
|
||||
@@ -250,26 +245,13 @@ int ata_task_ioctl(struct scsi_device *scsidev, void __user *arg)
|
||||
scsi_cmd[12] = args[5];
|
||||
scsi_cmd[14] = args[0];
|
||||
|
||||
sreq = scsi_allocate_request(scsidev, GFP_KERNEL);
|
||||
if (!sreq) {
|
||||
rc = -EINTR;
|
||||
goto error;
|
||||
}
|
||||
|
||||
sreq->sr_data_direction = DMA_NONE;
|
||||
/* Good values for timeout and retries? Values below
|
||||
from scsi_ioctl_send_command() for default case... */
|
||||
scsi_wait_req(sreq, scsi_cmd, NULL, 0, (10*HZ), 5);
|
||||
|
||||
if (sreq->sr_result) {
|
||||
from scsi_ioctl_send_command() for default case... */
|
||||
if (scsi_execute_req(scsidev, scsi_cmd, DMA_NONE, NULL, 0, &sshdr,
|
||||
(10*HZ), 5))
|
||||
rc = -EIO;
|
||||
goto error;
|
||||
}
|
||||
|
||||
/* Need code to retrieve data from check condition? */
|
||||
|
||||
error:
|
||||
scsi_release_request(sreq);
|
||||
return rc;
|
||||
}
|
||||
|
||||
@@ -1127,6 +1109,8 @@ static unsigned int ata_scsi_rw_xlat(struct ata_queued_cmd *qc, const u8 *scsicm
|
||||
* length 0 means transfer 0 block of data.
|
||||
* However, for ATA R/W commands, sector count 0 means
|
||||
* 256 or 65536 sectors, not 0 sectors as in SCSI.
|
||||
*
|
||||
* WARNING: one or two older ATA drives treat 0 as 0...
|
||||
*/
|
||||
goto nothing_to_do;
|
||||
|
||||
|
Reference in New Issue
Block a user