提交 44f30b0f 编写于 作者: M Matthew Wilcox 提交者: James Bottomley

[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: NChristoph Hellwig <hch@lst.de>
Signed-off-by: NMatthew Wilcox <matthew@wil.cx>
Signed-off-by: NJames Bottomley <James.Bottomley@SteelEye.com>
上级 84e203a2
......@@ -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.
*/
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.
*/
sym_setup_data_pointers(np, cp, dir);
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.
*/
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册