Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xiphi1978
linux
提交
7103c7bc
L
linux
项目概览
xiphi1978
/
linux
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
L
linux
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
7103c7bc
编写于
1月 27, 2006
作者:
J
Jeff Garzik
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'tmp'
上级
b4d28889
a72ec4ce
变更
8
隐藏空白更改
内联
并排
Showing
8 changed file
with
70 addition
and
64 deletion
+70
-64
drivers/scsi/ahci.c
drivers/scsi/ahci.c
+3
-9
drivers/scsi/libata-core.c
drivers/scsi/libata-core.c
+5
-9
drivers/scsi/libata-scsi.c
drivers/scsi/libata-scsi.c
+53
-6
drivers/scsi/sata_mv.c
drivers/scsi/sata_mv.c
+1
-11
drivers/scsi/sata_promise.c
drivers/scsi/sata_promise.c
+2
-10
drivers/scsi/sata_sil24.c
drivers/scsi/sata_sil24.c
+1
-9
drivers/scsi/sata_sx4.c
drivers/scsi/sata_sx4.c
+2
-10
include/linux/libata.h
include/linux/libata.h
+3
-0
未找到文件。
drivers/scsi/ahci.c
浏览文件 @
7103c7bc
...
...
@@ -672,19 +672,13 @@ static void ahci_eng_timeout(struct ata_port *ap)
ap
->
id
);
}
else
{
ahci_restart_port
(
ap
,
readl
(
port_mmio
+
PORT_IRQ_STAT
));
/* hack alert! We cannot use the supplied completion
* function from inside the ->eh_strategy_handler() thread.
* libata is the only user of ->eh_strategy_handler() in
* any kernel, so the default scsi_done() assumes it is
* not being called from the SCSI EH.
*/
qc
->
scsidone
=
scsi_finish_command
;
qc
->
err_mask
|=
AC_ERR_TIMEOUT
;
ata_qc_complete
(
qc
);
}
spin_unlock_irqrestore
(
&
host_set
->
lock
,
flags
);
if
(
qc
)
ata_eh_qc_complete
(
qc
);
}
static
inline
int
ahci_host_intr
(
struct
ata_port
*
ap
,
struct
ata_queued_cmd
*
qc
)
...
...
drivers/scsi/libata-core.c
浏览文件 @
7103c7bc
...
...
@@ -3633,14 +3633,6 @@ static void ata_qc_timeout(struct ata_queued_cmd *qc)
spin_lock_irqsave
(
&
host_set
->
lock
,
flags
);
/* hack alert! We cannot use the supplied completion
* function from inside the ->eh_strategy_handler() thread.
* libata is the only user of ->eh_strategy_handler() in
* any kernel, so the default scsi_done() assumes it is
* not being called from the SCSI EH.
*/
qc
->
scsidone
=
scsi_finish_command
;
switch
(
qc
->
tf
.
protocol
)
{
case
ATA_PROT_DMA
:
...
...
@@ -3666,12 +3658,13 @@ static void ata_qc_timeout(struct ata_queued_cmd *qc)
/* complete taskfile transaction */
qc
->
err_mask
|=
ac_err_mask
(
drv_stat
);
ata_qc_complete
(
qc
);
break
;
}
spin_unlock_irqrestore
(
&
host_set
->
lock
,
flags
);
ata_eh_qc_complete
(
qc
);
DPRINTK
(
"EXIT
\n
"
);
}
...
...
@@ -4706,6 +4699,7 @@ static void ata_host_init(struct ata_port *ap, struct Scsi_Host *host,
ap
->
last_ctl
=
0xFF
;
INIT_WORK
(
&
ap
->
pio_task
,
ata_pio_task
,
ap
);
INIT_LIST_HEAD
(
&
ap
->
eh_done_q
);
for
(
i
=
0
;
i
<
ATA_MAX_DEVICES
;
i
++
)
ap
->
device
[
i
].
devno
=
i
;
...
...
@@ -5449,6 +5443,8 @@ EXPORT_SYMBOL_GPL(ata_dev_classify);
EXPORT_SYMBOL_GPL
(
ata_dev_id_string
);
EXPORT_SYMBOL_GPL
(
ata_dev_config
);
EXPORT_SYMBOL_GPL
(
ata_scsi_simulate
);
EXPORT_SYMBOL_GPL
(
ata_eh_qc_complete
);
EXPORT_SYMBOL_GPL
(
ata_eh_qc_retry
);
EXPORT_SYMBOL_GPL
(
ata_pio_need_iordy
);
EXPORT_SYMBOL_GPL
(
ata_timing_compute
);
...
...
drivers/scsi/libata-scsi.c
浏览文件 @
7103c7bc
...
...
@@ -738,17 +738,64 @@ int ata_scsi_error(struct Scsi_Host *host)
ap
=
(
struct
ata_port
*
)
&
host
->
hostdata
[
0
];
ap
->
ops
->
eng_timeout
(
ap
);
/* TODO: this is per-command; when queueing is supported
* this code will either change or move to a more
* appropriate place
*/
host
->
host_failed
--
;
INIT_LIST_HEAD
(
&
host
->
eh_cmd_q
);
assert
(
host
->
host_failed
==
0
&&
list_empty
(
&
host
->
eh_cmd_q
));
scsi_eh_flush_done_q
(
&
ap
->
eh_done_q
);
DPRINTK
(
"EXIT
\n
"
);
return
0
;
}
static
void
ata_eh_scsidone
(
struct
scsi_cmnd
*
scmd
)
{
/* nada */
}
static
void
__ata_eh_qc_complete
(
struct
ata_queued_cmd
*
qc
)
{
struct
ata_port
*
ap
=
qc
->
ap
;
struct
scsi_cmnd
*
scmd
=
qc
->
scsicmd
;
unsigned
long
flags
;
spin_lock_irqsave
(
&
ap
->
host_set
->
lock
,
flags
);
qc
->
scsidone
=
ata_eh_scsidone
;
ata_qc_complete
(
qc
);
assert
(
!
ata_tag_valid
(
qc
->
tag
));
spin_unlock_irqrestore
(
&
ap
->
host_set
->
lock
,
flags
);
scsi_eh_finish_cmd
(
scmd
,
&
ap
->
eh_done_q
);
}
/**
* ata_eh_qc_complete - Complete an active ATA command from EH
* @qc: Command to complete
*
* Indicate to the mid and upper layers that an ATA command has
* completed. To be used from EH.
*/
void
ata_eh_qc_complete
(
struct
ata_queued_cmd
*
qc
)
{
struct
scsi_cmnd
*
scmd
=
qc
->
scsicmd
;
scmd
->
retries
=
scmd
->
allowed
;
__ata_eh_qc_complete
(
qc
);
}
/**
* ata_eh_qc_retry - Tell midlayer to retry an ATA command after EH
* @qc: Command to retry
*
* Indicate to the mid and upper layers that an ATA command
* should be retried. To be used from EH.
*
* SCSI midlayer limits the number of retries to scmd->allowed.
* This function might need to adjust scmd->retries for commands
* which get retried due to unrelated NCQ failures.
*/
void
ata_eh_qc_retry
(
struct
ata_queued_cmd
*
qc
)
{
__ata_eh_qc_complete
(
qc
);
}
/**
* ata_scsi_start_stop_xlat - Translate SCSI START STOP UNIT command
* @qc: Storage for translated ATA taskfile
...
...
drivers/scsi/sata_mv.c
浏览文件 @
7103c7bc
...
...
@@ -1838,7 +1838,6 @@ static void mv_phy_reset(struct ata_port *ap)
static
void
mv_eng_timeout
(
struct
ata_port
*
ap
)
{
struct
ata_queued_cmd
*
qc
;
unsigned
long
flags
;
printk
(
KERN_ERR
"ata%u: Entering mv_eng_timeout
\n
"
,
ap
->
id
);
DPRINTK
(
"All regs @ start of eng_timeout
\n
"
);
...
...
@@ -1857,17 +1856,8 @@ static void mv_eng_timeout(struct ata_port *ap)
printk
(
KERN_ERR
"ata%u: BUG: timeout without command
\n
"
,
ap
->
id
);
}
else
{
/* hack alert! We cannot use the supplied completion
* function from inside the ->eh_strategy_handler() thread.
* libata is the only user of ->eh_strategy_handler() in
* any kernel, so the default scsi_done() assumes it is
* not being called from the SCSI EH.
*/
spin_lock_irqsave
(
&
ap
->
host_set
->
lock
,
flags
);
qc
->
scsidone
=
scsi_finish_command
;
qc
->
err_mask
|=
AC_ERR_TIMEOUT
;
ata_qc_complete
(
qc
);
spin_unlock_irqrestore
(
&
ap
->
host_set
->
lock
,
flags
);
ata_eh_qc_complete
(
qc
);
}
}
...
...
drivers/scsi/sata_promise.c
浏览文件 @
7103c7bc
...
...
@@ -401,21 +401,12 @@ static void pdc_eng_timeout(struct ata_port *ap)
goto
out
;
}
/* hack alert! We cannot use the supplied completion
* function from inside the ->eh_strategy_handler() thread.
* libata is the only user of ->eh_strategy_handler() in
* any kernel, so the default scsi_done() assumes it is
* not being called from the SCSI EH.
*/
qc
->
scsidone
=
scsi_finish_command
;
switch
(
qc
->
tf
.
protocol
)
{
case
ATA_PROT_DMA
:
case
ATA_PROT_NODATA
:
printk
(
KERN_ERR
"ata%u: command timeout
\n
"
,
ap
->
id
);
drv_stat
=
ata_wait_idle
(
ap
);
qc
->
err_mask
|=
__ac_err_mask
(
drv_stat
);
ata_qc_complete
(
qc
);
break
;
default:
...
...
@@ -425,12 +416,13 @@ static void pdc_eng_timeout(struct ata_port *ap)
ap
->
id
,
qc
->
tf
.
command
,
drv_stat
);
qc
->
err_mask
|=
ac_err_mask
(
drv_stat
);
ata_qc_complete
(
qc
);
break
;
}
out:
spin_unlock_irqrestore
(
&
host_set
->
lock
,
flags
);
if
(
qc
)
ata_eh_qc_complete
(
qc
);
DPRINTK
(
"EXIT
\n
"
);
}
...
...
drivers/scsi/sata_sil24.c
浏览文件 @
7103c7bc
...
...
@@ -644,17 +644,9 @@ static void sil24_eng_timeout(struct ata_port *ap)
return
;
}
/*
* hack alert! We cannot use the supplied completion
* function from inside the ->eh_strategy_handler() thread.
* libata is the only user of ->eh_strategy_handler() in
* any kernel, so the default scsi_done() assumes it is
* not being called from the SCSI EH.
*/
printk
(
KERN_ERR
"ata%u: command timeout
\n
"
,
ap
->
id
);
qc
->
scsidone
=
scsi_finish_command
;
qc
->
err_mask
|=
AC_ERR_TIMEOUT
;
ata_qc_complete
(
qc
);
ata_
eh_
qc_complete
(
qc
);
sil24_reset_controller
(
ap
);
}
...
...
drivers/scsi/sata_sx4.c
浏览文件 @
7103c7bc
...
...
@@ -872,20 +872,11 @@ static void pdc_eng_timeout(struct ata_port *ap)
goto
out
;
}
/* hack alert! We cannot use the supplied completion
* function from inside the ->eh_strategy_handler() thread.
* libata is the only user of ->eh_strategy_handler() in
* any kernel, so the default scsi_done() assumes it is
* not being called from the SCSI EH.
*/
qc
->
scsidone
=
scsi_finish_command
;
switch
(
qc
->
tf
.
protocol
)
{
case
ATA_PROT_DMA
:
case
ATA_PROT_NODATA
:
printk
(
KERN_ERR
"ata%u: command timeout
\n
"
,
ap
->
id
);
qc
->
err_mask
|=
__ac_err_mask
(
ata_wait_idle
(
ap
));
ata_qc_complete
(
qc
);
break
;
default:
...
...
@@ -895,12 +886,13 @@ static void pdc_eng_timeout(struct ata_port *ap)
ap
->
id
,
qc
->
tf
.
command
,
drv_stat
);
qc
->
err_mask
|=
ac_err_mask
(
drv_stat
);
ata_qc_complete
(
qc
);
break
;
}
out:
spin_unlock_irqrestore
(
&
host_set
->
lock
,
flags
);
if
(
qc
)
ata_eh_qc_complete
(
qc
);
DPRINTK
(
"EXIT
\n
"
);
}
...
...
include/linux/libata.h
浏览文件 @
7103c7bc
...
...
@@ -401,6 +401,7 @@ struct ata_port {
unsigned
long
pio_task_timeout
;
u32
msg_enable
;
struct
list_head
eh_done_q
;
void
*
private_data
;
};
...
...
@@ -493,6 +494,8 @@ extern int ata_scsi_detect(struct scsi_host_template *sht);
extern
int
ata_scsi_ioctl
(
struct
scsi_device
*
dev
,
int
cmd
,
void
__user
*
arg
);
extern
int
ata_scsi_queuecmd
(
struct
scsi_cmnd
*
cmd
,
void
(
*
done
)(
struct
scsi_cmnd
*
));
extern
int
ata_scsi_error
(
struct
Scsi_Host
*
host
);
extern
void
ata_eh_qc_complete
(
struct
ata_queued_cmd
*
qc
);
extern
void
ata_eh_qc_retry
(
struct
ata_queued_cmd
*
qc
);
extern
int
ata_scsi_release
(
struct
Scsi_Host
*
host
);
extern
unsigned
int
ata_host_intr
(
struct
ata_port
*
ap
,
struct
ata_queued_cmd
*
qc
);
extern
int
ata_scsi_device_resume
(
struct
scsi_device
*
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录