scsi: don't add scsi command result bytes
Some drivers are ADDing the scsi command's result bytes instead of ORing them. While this can produce correct results it has unexpected side effects. Signed-off-by: Johannes Thumshirn <jthumshirn@suse.de> Reviewed-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Bart Van Assche <bart.vanassche@wdc.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
c65be1a63f
commit
6bec4c3842
|
@ -892,7 +892,7 @@ static int imm_engine(imm_struct *dev, struct scsi_cmnd *cmd)
|
||||||
/* Check for optional message byte */
|
/* Check for optional message byte */
|
||||||
if (imm_wait(dev) == (unsigned char) 0xb8)
|
if (imm_wait(dev) == (unsigned char) 0xb8)
|
||||||
imm_in(dev, &h, 1);
|
imm_in(dev, &h, 1);
|
||||||
cmd->result = (DID_OK << 16) + (l & STATUS_MASK);
|
cmd->result = (DID_OK << 16) | (l & STATUS_MASK);
|
||||||
}
|
}
|
||||||
if ((dev->mode == IMM_NIBBLE) || (dev->mode == IMM_PS2)) {
|
if ((dev->mode == IMM_NIBBLE) || (dev->mode == IMM_PS2)) {
|
||||||
w_ctr(ppb, 0x4);
|
w_ctr(ppb, 0x4);
|
||||||
|
|
|
@ -594,9 +594,9 @@ static void mesh_done(struct mesh_state *ms, int start_next)
|
||||||
ms->current_req = NULL;
|
ms->current_req = NULL;
|
||||||
tp->current_req = NULL;
|
tp->current_req = NULL;
|
||||||
if (cmd) {
|
if (cmd) {
|
||||||
cmd->result = (ms->stat << 16) + cmd->SCp.Status;
|
cmd->result = (ms->stat << 16) | cmd->SCp.Status;
|
||||||
if (ms->stat == DID_OK)
|
if (ms->stat == DID_OK)
|
||||||
cmd->result += (cmd->SCp.Message << 8);
|
cmd->result |= cmd->SCp.Message << 8;
|
||||||
if (DEBUG_TARGET(cmd)) {
|
if (DEBUG_TARGET(cmd)) {
|
||||||
printk(KERN_DEBUG "mesh_done: result = %x, data_ptr=%d, buflen=%d\n",
|
printk(KERN_DEBUG "mesh_done: result = %x, data_ptr=%d, buflen=%d\n",
|
||||||
cmd->result, ms->data_ptr, scsi_bufflen(cmd));
|
cmd->result, ms->data_ptr, scsi_bufflen(cmd));
|
||||||
|
|
|
@ -252,7 +252,7 @@ void sym_set_cam_result_error(struct sym_hcb *np, struct sym_ccb *cp, int resid)
|
||||||
cam_status = sym_xerr_cam_status(DID_ERROR, cp->xerr_status);
|
cam_status = sym_xerr_cam_status(DID_ERROR, cp->xerr_status);
|
||||||
}
|
}
|
||||||
scsi_set_resid(cmd, resid);
|
scsi_set_resid(cmd, resid);
|
||||||
cmd->result = (drv_status << 24) + (cam_status << 16) + scsi_status;
|
cmd->result = (drv_status << 24) | (cam_status << 16) | scsi_status;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int sym_scatter(struct sym_hcb *np, struct sym_ccb *cp, struct scsi_cmnd *cmd)
|
static int sym_scatter(struct sym_hcb *np, struct sym_ccb *cp, struct scsi_cmnd *cmd)
|
||||||
|
|
|
@ -256,7 +256,7 @@ sym_get_cam_status(struct scsi_cmnd *cmd)
|
||||||
static inline void sym_set_cam_result_ok(struct sym_ccb *cp, struct scsi_cmnd *cmd, int resid)
|
static inline void sym_set_cam_result_ok(struct sym_ccb *cp, struct scsi_cmnd *cmd, int resid)
|
||||||
{
|
{
|
||||||
scsi_set_resid(cmd, resid);
|
scsi_set_resid(cmd, resid);
|
||||||
cmd->result = (((DID_OK) << 16) + ((cp->ssss_status) & 0x7f));
|
cmd->result = (DID_OK << 16) | (cp->ssss_status & 0x7f);
|
||||||
}
|
}
|
||||||
void sym_set_cam_result_error(struct sym_hcb *np, struct sym_ccb *cp, int resid);
|
void sym_set_cam_result_error(struct sym_hcb *np, struct sym_ccb *cp, int resid);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue