[SCSI] sym2: Remove code to handle DMA_BIDIRECTION requests
The upper layer doesn't send these down since 2.4.x (or 2.6 in practice), so no need to handle it. Inline sym_setup_data_pointers into its only caller so we can fail gracefully in the case we'd get one neverless. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Matthew Wilcox <matthew@wil.cx> Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
This commit is contained in:
parent
84e203a279
commit
44f30b0f59
8 changed files with 40 additions and 204 deletions
|
@ -62,9 +62,6 @@ static struct sym_fwa_ofs sym_fw1a_ofs = {
|
|||
};
|
||||
static struct sym_fwb_ofs sym_fw1b_ofs = {
|
||||
SYM_GEN_FW_B(struct SYM_FWB_SCR)
|
||||
#ifdef SYM_OPT_HANDLE_DIR_UNKNOWN
|
||||
SYM_GEN_B(struct SYM_FWB_SCR, data_io)
|
||||
#endif
|
||||
};
|
||||
static struct sym_fwz_ofs sym_fw1z_ofs = {
|
||||
SYM_GEN_FW_Z(struct SYM_FWZ_SCR)
|
||||
|
@ -86,9 +83,6 @@ static struct sym_fwa_ofs sym_fw2a_ofs = {
|
|||
};
|
||||
static struct sym_fwb_ofs sym_fw2b_ofs = {
|
||||
SYM_GEN_FW_B(struct SYM_FWB_SCR)
|
||||
#ifdef SYM_OPT_HANDLE_DIR_UNKNOWN
|
||||
SYM_GEN_B(struct SYM_FWB_SCR, data_io)
|
||||
#endif
|
||||
SYM_GEN_B(struct SYM_FWB_SCR, start64)
|
||||
SYM_GEN_B(struct SYM_FWB_SCR, pm_handle)
|
||||
};
|
||||
|
|
|
@ -92,9 +92,6 @@ struct sym_fwa_ofs {
|
|||
};
|
||||
struct sym_fwb_ofs {
|
||||
SYM_GEN_FW_B(u_short)
|
||||
#ifdef SYM_OPT_HANDLE_DIR_UNKNOWN
|
||||
SYM_GEN_B(u_short, data_io)
|
||||
#endif
|
||||
SYM_GEN_B(u_short, start64)
|
||||
SYM_GEN_B(u_short, pm_handle)
|
||||
};
|
||||
|
@ -111,9 +108,6 @@ struct sym_fwa_ba {
|
|||
};
|
||||
struct sym_fwb_ba {
|
||||
SYM_GEN_FW_B(u32)
|
||||
#ifdef SYM_OPT_HANDLE_DIR_UNKNOWN
|
||||
SYM_GEN_B(u32, data_io)
|
||||
#endif
|
||||
SYM_GEN_B(u32, start64);
|
||||
SYM_GEN_B(u32, pm_handle);
|
||||
};
|
||||
|
|
|
@ -197,12 +197,6 @@ struct SYM_FWB_SCR {
|
|||
u32 bad_status [ 7];
|
||||
u32 wsr_ma_helper [ 4];
|
||||
|
||||
#ifdef SYM_OPT_HANDLE_DIR_UNKNOWN
|
||||
/* Unknown direction handling */
|
||||
u32 data_io [ 2];
|
||||
u32 data_io_com [ 8];
|
||||
u32 data_io_out [ 7];
|
||||
#endif
|
||||
/* Data area */
|
||||
u32 zero [ 1];
|
||||
u32 scratch [ 1];
|
||||
|
@ -1747,48 +1741,6 @@ static struct SYM_FWB_SCR SYM_FWB_SCR = {
|
|||
SCR_JUMP,
|
||||
PADDR_A (dispatch),
|
||||
|
||||
#ifdef SYM_OPT_HANDLE_DIR_UNKNOWN
|
||||
}/*-------------------------< DATA_IO >--------------------------*/,{
|
||||
/*
|
||||
* We jump here if the data direction was unknown at the
|
||||
* time we had to queue the command to the scripts processor.
|
||||
* Pointers had been set as follow in this situation:
|
||||
* savep --> DATA_IO
|
||||
* lastp --> start pointer when DATA_IN
|
||||
* wlastp --> start pointer when DATA_OUT
|
||||
* This script sets savep and lastp according to the
|
||||
* direction chosen by the target.
|
||||
*/
|
||||
SCR_JUMP ^ IFTRUE (WHEN (SCR_DATA_OUT)),
|
||||
PADDR_B (data_io_out),
|
||||
}/*-------------------------< DATA_IO_COM >----------------------*/,{
|
||||
/*
|
||||
* Direction is DATA IN.
|
||||
*/
|
||||
SCR_COPY (4),
|
||||
HADDR_1 (ccb_head.lastp),
|
||||
HADDR_1 (ccb_head.savep),
|
||||
/*
|
||||
* Jump to the SCRIPTS according to actual direction.
|
||||
*/
|
||||
SCR_COPY (4),
|
||||
HADDR_1 (ccb_head.savep),
|
||||
RADDR_1 (temp),
|
||||
SCR_RETURN,
|
||||
0,
|
||||
}/*-------------------------< DATA_IO_OUT >----------------------*/,{
|
||||
/*
|
||||
* Direction is DATA OUT.
|
||||
*/
|
||||
SCR_REG_REG (HF_REG, SCR_AND, (~HF_DATA_IN)),
|
||||
0,
|
||||
SCR_COPY (4),
|
||||
HADDR_1 (ccb_head.wlastp),
|
||||
HADDR_1 (ccb_head.lastp),
|
||||
SCR_JUMP,
|
||||
PADDR_B(data_io_com),
|
||||
#endif /* SYM_OPT_HANDLE_DIR_UNKNOWN */
|
||||
|
||||
}/*-------------------------< ZERO >-----------------------------*/,{
|
||||
SCR_DATA_ZERO,
|
||||
}/*-------------------------< SCRATCH >--------------------------*/,{
|
||||
|
|
|
@ -191,13 +191,6 @@ struct SYM_FWB_SCR {
|
|||
u32 pm_wsr_handle [ 38];
|
||||
u32 wsr_ma_helper [ 4];
|
||||
|
||||
#ifdef SYM_OPT_HANDLE_DIR_UNKNOWN
|
||||
/* Unknown direction handling */
|
||||
u32 data_io [ 2];
|
||||
u32 data_io_in [ 2];
|
||||
u32 data_io_com [ 6];
|
||||
u32 data_io_out [ 8];
|
||||
#endif
|
||||
/* Data area */
|
||||
u32 zero [ 1];
|
||||
u32 scratch [ 1];
|
||||
|
@ -1838,51 +1831,6 @@ static struct SYM_FWB_SCR SYM_FWB_SCR = {
|
|||
SCR_JUMP,
|
||||
PADDR_A (dispatch),
|
||||
|
||||
#ifdef SYM_OPT_HANDLE_DIR_UNKNOWN
|
||||
}/*-------------------------< DATA_IO >--------------------------*/,{
|
||||
/*
|
||||
* We jump here if the data direction was unknown at the
|
||||
* time we had to queue the command to the scripts processor.
|
||||
* Pointers had been set as follow in this situation:
|
||||
* savep --> DATA_IO
|
||||
* lastp --> start pointer when DATA_IN
|
||||
* wlastp --> start pointer when DATA_OUT
|
||||
* This script sets savep and lastp according to the
|
||||
* direction chosen by the target.
|
||||
*/
|
||||
SCR_JUMP ^ IFTRUE (WHEN (SCR_DATA_OUT)),
|
||||
PADDR_B (data_io_out),
|
||||
}/*-------------------------< DATA_IO_IN >-----------------------*/,{
|
||||
/*
|
||||
* Direction is DATA IN.
|
||||
*/
|
||||
SCR_LOAD_REL (scratcha, 4),
|
||||
offsetof (struct sym_ccb, phys.head.lastp),
|
||||
}/*-------------------------< DATA_IO_COM >----------------------*/,{
|
||||
SCR_STORE_REL (scratcha, 4),
|
||||
offsetof (struct sym_ccb, phys.head.savep),
|
||||
|
||||
/*
|
||||
* Jump to the SCRIPTS according to actual direction.
|
||||
*/
|
||||
SCR_LOAD_REL (temp, 4),
|
||||
offsetof (struct sym_ccb, phys.head.savep),
|
||||
SCR_RETURN,
|
||||
0,
|
||||
}/*-------------------------< DATA_IO_OUT >----------------------*/,{
|
||||
/*
|
||||
* Direction is DATA OUT.
|
||||
*/
|
||||
SCR_REG_REG (HF_REG, SCR_AND, (~HF_DATA_IN)),
|
||||
0,
|
||||
SCR_LOAD_REL (scratcha, 4),
|
||||
offsetof (struct sym_ccb, phys.head.wlastp),
|
||||
SCR_STORE_REL (scratcha, 4),
|
||||
offsetof (struct sym_ccb, phys.head.lastp),
|
||||
SCR_JUMP,
|
||||
PADDR_B(data_io_com),
|
||||
#endif /* SYM_OPT_HANDLE_DIR_UNKNOWN */
|
||||
|
||||
}/*-------------------------< ZERO >-----------------------------*/,{
|
||||
SCR_DATA_ZERO,
|
||||
}/*-------------------------< SCRATCH >--------------------------*/,{
|
||||
|
|
|
@ -514,9 +514,10 @@ static inline int sym_setup_cdb(struct sym_hcb *np, struct scsi_cmnd *cmd, struc
|
|||
*/
|
||||
int sym_setup_data_and_start(struct sym_hcb *np, struct scsi_cmnd *cmd, struct sym_ccb *cp)
|
||||
{
|
||||
int dir;
|
||||
struct sym_tcb *tp = &np->target[cp->target];
|
||||
struct sym_lcb *lp = sym_lp(tp, cp->lun);
|
||||
u32 lastp, goalp;
|
||||
int dir;
|
||||
|
||||
/*
|
||||
* Build the CDB.
|
||||
|
@ -534,15 +535,47 @@ int sym_setup_data_and_start(struct sym_hcb *np, struct scsi_cmnd *cmd, struct s
|
|||
sym_set_cam_status(cmd, DID_ERROR);
|
||||
goto out_abort;
|
||||
}
|
||||
|
||||
/*
|
||||
* No segments means no data.
|
||||
*/
|
||||
if (!cp->segments)
|
||||
dir = DMA_NONE;
|
||||
} else {
|
||||
cp->data_len = 0;
|
||||
cp->segments = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Set data pointers.
|
||||
* Set the data pointer.
|
||||
*/
|
||||
sym_setup_data_pointers(np, cp, dir);
|
||||
switch (dir) {
|
||||
case DMA_BIDIRECTIONAL:
|
||||
printk("%s: got DMA_BIDIRECTIONAL command", sym_name(np));
|
||||
sym_set_cam_status(cmd, DID_ERROR);
|
||||
goto out_abort;
|
||||
case DMA_TO_DEVICE:
|
||||
goalp = SCRIPTA_BA(np, data_out2) + 8;
|
||||
lastp = goalp - 8 - (cp->segments * (2*4));
|
||||
break;
|
||||
case DMA_FROM_DEVICE:
|
||||
cp->host_flags |= HF_DATA_IN;
|
||||
goalp = SCRIPTA_BA(np, data_in2) + 8;
|
||||
lastp = goalp - 8 - (cp->segments * (2*4));
|
||||
break;
|
||||
case DMA_NONE:
|
||||
default:
|
||||
lastp = goalp = SCRIPTB_BA(np, no_data);
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* Set all pointers values needed by SCRIPTS.
|
||||
*/
|
||||
cp->phys.head.lastp = cpu_to_scr(lastp);
|
||||
cp->phys.head.savep = cpu_to_scr(lastp);
|
||||
cp->startp = cp->phys.head.savep;
|
||||
cp->goalp = cpu_to_scr(goalp);
|
||||
|
||||
/*
|
||||
* When `#ifed 1', the code below makes the driver
|
||||
|
|
|
@ -68,7 +68,6 @@
|
|||
*/
|
||||
#define SYM_CONF_TIMER_INTERVAL ((HZ+1)/2)
|
||||
|
||||
#define SYM_OPT_HANDLE_DIR_UNKNOWN
|
||||
#define SYM_OPT_HANDLE_DEVICE_QUEUEING
|
||||
#define SYM_OPT_LIMIT_COMMAND_REORDERING
|
||||
|
||||
|
|
|
@ -3654,7 +3654,7 @@ static int sym_evaluate_dp(struct sym_hcb *np, struct sym_ccb *cp, u32 scr, int
|
|||
* If result is dp_sg = SYM_CONF_MAX_SG, then we are at the
|
||||
* end of the data.
|
||||
*/
|
||||
tmp = scr_to_cpu(sym_goalp(cp));
|
||||
tmp = scr_to_cpu(cp->goalp);
|
||||
dp_sg = SYM_CONF_MAX_SG;
|
||||
if (dp_scr != tmp)
|
||||
dp_sg -= (tmp - 8 - (int)dp_scr) / (2*4);
|
||||
|
@ -3761,7 +3761,7 @@ static void sym_modify_dp(struct sym_hcb *np, struct sym_tcb *tp, struct sym_ccb
|
|||
* And our alchemy:) allows to easily calculate the data
|
||||
* script address we want to return for the next data phase.
|
||||
*/
|
||||
dp_ret = cpu_to_scr(sym_goalp(cp));
|
||||
dp_ret = cpu_to_scr(cp->goalp);
|
||||
dp_ret = dp_ret - 8 - (SYM_CONF_MAX_SG - dp_sg) * (2*4);
|
||||
|
||||
/*
|
||||
|
@ -3857,7 +3857,7 @@ int sym_compute_residual(struct sym_hcb *np, struct sym_ccb *cp)
|
|||
* If all data has been transferred,
|
||||
* there is no residual.
|
||||
*/
|
||||
if (cp->phys.head.lastp == sym_goalp(cp))
|
||||
if (cp->phys.head.lastp == cp->goalp)
|
||||
return resid;
|
||||
|
||||
/*
|
||||
|
@ -5470,7 +5470,7 @@ void sym_complete_ok (struct sym_hcb *np, struct sym_ccb *cp)
|
|||
* extended error did occur, there is no residual.
|
||||
*/
|
||||
resid = 0;
|
||||
if (cp->phys.head.lastp != sym_goalp(cp))
|
||||
if (cp->phys.head.lastp != cp->goalp)
|
||||
resid = sym_compute_residual(np, cp);
|
||||
|
||||
/*
|
||||
|
|
|
@ -48,12 +48,6 @@
|
|||
* They may be defined in platform specific headers, if they
|
||||
* are useful.
|
||||
*
|
||||
* SYM_OPT_HANDLE_DIR_UNKNOWN
|
||||
* When this option is set, the SCRIPTS used by the driver
|
||||
* are able to handle SCSI transfers with direction not
|
||||
* supplied by user.
|
||||
* (set for Linux-2.0.X)
|
||||
*
|
||||
* SYM_OPT_HANDLE_DEVICE_QUEUEING
|
||||
* When this option is set, the driver will use a queue per
|
||||
* device and handle QUEUE FULL status requeuing internally.
|
||||
|
@ -64,7 +58,6 @@
|
|||
* (set for Linux)
|
||||
*/
|
||||
#if 0
|
||||
#define SYM_OPT_HANDLE_DIR_UNKNOWN
|
||||
#define SYM_OPT_HANDLE_DEVICE_QUEUEING
|
||||
#define SYM_OPT_LIMIT_COMMAND_REORDERING
|
||||
#endif
|
||||
|
@ -659,9 +652,6 @@ struct sym_ccbh {
|
|||
*/
|
||||
u32 savep; /* Jump address to saved data pointer */
|
||||
u32 lastp; /* SCRIPTS address at end of data */
|
||||
#ifdef SYM_OPT_HANDLE_DIR_UNKNOWN
|
||||
u32 wlastp;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Status fields.
|
||||
|
@ -791,9 +781,6 @@ struct sym_ccb {
|
|||
SYM_QUEHEAD link_ccbq; /* Link to free/busy CCB queue */
|
||||
u32 startp; /* Initial data pointer */
|
||||
u32 goalp; /* Expected last data pointer */
|
||||
#ifdef SYM_OPT_HANDLE_DIR_UNKNOWN
|
||||
u32 wgoalp;
|
||||
#endif
|
||||
int ext_sg; /* Extreme data pointer, used */
|
||||
int ext_ofs; /* to calculate the residual. */
|
||||
#ifdef SYM_OPT_HANDLE_DEVICE_QUEUEING
|
||||
|
@ -808,12 +795,6 @@ struct sym_ccb {
|
|||
|
||||
#define CCB_BA(cp,lbl) cpu_to_scr(cp->ccb_ba + offsetof(struct sym_ccb, lbl))
|
||||
|
||||
#ifdef SYM_OPT_HANDLE_DIR_UNKNOWN
|
||||
#define sym_goalp(cp) ((cp->host_flags & HF_DATA_IN) ? cp->goalp : cp->wgoalp)
|
||||
#else
|
||||
#define sym_goalp(cp) (cp->goalp)
|
||||
#endif
|
||||
|
||||
typedef struct device *m_pool_ident_t;
|
||||
|
||||
/*
|
||||
|
@ -1121,71 +1102,6 @@ sym_build_sge(struct sym_hcb *np, struct sym_tblmove *data, u64 badd, int len)
|
|||
#error "Unsupported DMA addressing mode"
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Set up data pointers used by SCRIPTS.
|
||||
* Called from O/S specific code.
|
||||
*/
|
||||
static inline void sym_setup_data_pointers(struct sym_hcb *np,
|
||||
struct sym_ccb *cp, int dir)
|
||||
{
|
||||
u32 lastp, goalp;
|
||||
|
||||
/*
|
||||
* No segments means no data.
|
||||
*/
|
||||
if (!cp->segments)
|
||||
dir = DMA_NONE;
|
||||
|
||||
/*
|
||||
* Set the data pointer.
|
||||
*/
|
||||
switch(dir) {
|
||||
#ifdef SYM_OPT_HANDLE_DIR_UNKNOWN
|
||||
case DMA_BIDIRECTIONAL:
|
||||
#endif
|
||||
case DMA_TO_DEVICE:
|
||||
goalp = SCRIPTA_BA(np, data_out2) + 8;
|
||||
lastp = goalp - 8 - (cp->segments * (2*4));
|
||||
#ifdef SYM_OPT_HANDLE_DIR_UNKNOWN
|
||||
cp->wgoalp = cpu_to_scr(goalp);
|
||||
if (dir != DMA_BIDIRECTIONAL)
|
||||
break;
|
||||
cp->phys.head.wlastp = cpu_to_scr(lastp);
|
||||
/* fall through */
|
||||
#else
|
||||
break;
|
||||
#endif
|
||||
case DMA_FROM_DEVICE:
|
||||
cp->host_flags |= HF_DATA_IN;
|
||||
goalp = SCRIPTA_BA(np, data_in2) + 8;
|
||||
lastp = goalp - 8 - (cp->segments * (2*4));
|
||||
break;
|
||||
case DMA_NONE:
|
||||
default:
|
||||
#ifdef SYM_OPT_HANDLE_DIR_UNKNOWN
|
||||
cp->host_flags |= HF_DATA_IN;
|
||||
#endif
|
||||
lastp = goalp = SCRIPTB_BA(np, no_data);
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* Set all pointers values needed by SCRIPTS.
|
||||
*/
|
||||
cp->phys.head.lastp = cpu_to_scr(lastp);
|
||||
cp->phys.head.savep = cpu_to_scr(lastp);
|
||||
cp->startp = cp->phys.head.savep;
|
||||
cp->goalp = cpu_to_scr(goalp);
|
||||
|
||||
#ifdef SYM_OPT_HANDLE_DIR_UNKNOWN
|
||||
/*
|
||||
* If direction is unknown, start at data_io.
|
||||
*/
|
||||
if (dir == DMA_BIDIRECTIONAL)
|
||||
cp->phys.head.savep = cpu_to_scr(SCRIPTB_BA(np, data_io));
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* MEMORY ALLOCATOR.
|
||||
*/
|
||||
|
|
Loading…
Reference in a new issue