Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
kernel_linux
提交
701db69d
K
kernel_linux
项目概览
OpenHarmony
/
kernel_linux
上一次同步 3 年多
通知
13
Star
8
Fork
2
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
kernel_linux
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
701db69d
编写于
12月 06, 2005
作者:
J
Jeff Garzik
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'upstream'
上级
6cf5bcaa
fe79e683
变更
12
隐藏空白更改
内联
并排
Showing
12 changed file
with
124 addition
and
75 deletion
+124
-75
drivers/scsi/ahci.c
drivers/scsi/ahci.c
+9
-5
drivers/scsi/libata-core.c
drivers/scsi/libata-core.c
+47
-22
drivers/scsi/libata-scsi.c
drivers/scsi/libata-scsi.c
+13
-11
drivers/scsi/libata.h
drivers/scsi/libata.h
+1
-1
drivers/scsi/pdc_adma.c
drivers/scsi/pdc_adma.c
+5
-6
drivers/scsi/sata_mv.c
drivers/scsi/sata_mv.c
+6
-3
drivers/scsi/sata_promise.c
drivers/scsi/sata_promise.c
+11
-9
drivers/scsi/sata_qstor.c
drivers/scsi/sata_qstor.c
+5
-4
drivers/scsi/sata_sil.c
drivers/scsi/sata_sil.c
+1
-1
drivers/scsi/sata_sil24.c
drivers/scsi/sata_sil24.c
+10
-5
drivers/scsi/sata_sx4.c
drivers/scsi/sata_sx4.c
+11
-6
include/linux/libata.h
include/linux/libata.h
+5
-2
未找到文件。
drivers/scsi/ahci.c
浏览文件 @
701db69d
...
...
@@ -243,7 +243,7 @@ static const struct ata_port_operations ahci_ops = {
.
port_stop
=
ahci_port_stop
,
};
static
struct
ata_port_info
ahci_port_info
[]
=
{
static
const
struct
ata_port_info
ahci_port_info
[]
=
{
/* board_ahci */
{
.
sht
=
&
ahci_sht
,
...
...
@@ -643,7 +643,8 @@ static void ahci_eng_timeout(struct ata_port *ap)
* not being called from the SCSI EH.
*/
qc
->
scsidone
=
scsi_finish_command
;
ata_qc_complete
(
qc
,
AC_ERR_OTHER
);
qc
->
err_mask
|=
AC_ERR_OTHER
;
ata_qc_complete
(
qc
);
}
spin_unlock_irqrestore
(
&
host_set
->
lock
,
flags
);
...
...
@@ -664,7 +665,8 @@ static inline int ahci_host_intr(struct ata_port *ap, struct ata_queued_cmd *qc)
ci
=
readl
(
port_mmio
+
PORT_CMD_ISSUE
);
if
(
likely
((
ci
&
0x1
)
==
0
))
{
if
(
qc
)
{
ata_qc_complete
(
qc
,
0
);
assert
(
qc
->
err_mask
==
0
);
ata_qc_complete
(
qc
);
qc
=
NULL
;
}
}
...
...
@@ -681,8 +683,10 @@ static inline int ahci_host_intr(struct ata_port *ap, struct ata_queued_cmd *qc)
/* command processing has stopped due to error; restart */
ahci_restart_port
(
ap
,
status
);
if
(
qc
)
ata_qc_complete
(
qc
,
err_mask
);
if
(
qc
)
{
qc
->
err_mask
|=
AC_ERR_OTHER
;
ata_qc_complete
(
qc
);
}
}
return
1
;
...
...
drivers/scsi/libata-core.c
浏览文件 @
701db69d
...
...
@@ -606,7 +606,7 @@ void ata_rwcmd_protocol(struct ata_queued_cmd *qc)
tf
->
command
=
ata_rw_cmds
[
index
+
lba48
+
write
];
}
static
const
char
*
xfer_mode_str
[]
=
{
static
const
char
*
const
xfer_mode_str
[]
=
{
"UDMA/16"
,
"UDMA/25"
,
"UDMA/33"
,
...
...
@@ -1054,9 +1054,9 @@ static int ata_qc_wait_err(struct ata_queued_cmd *qc,
if
(
wait_for_completion_timeout
(
wait
,
30
*
HZ
)
<
1
)
{
/* timeout handling */
unsigned
int
err_mask
=
ac_err_mask
(
ata_chk_status
(
qc
->
ap
));
qc
->
err_mask
|
=
ac_err_mask
(
ata_chk_status
(
qc
->
ap
));
if
(
!
err_mask
)
{
if
(
!
qc
->
err_mask
)
{
printk
(
KERN_WARNING
"ata%u: slow completion (cmd %x)
\n
"
,
qc
->
ap
->
id
,
qc
->
tf
.
command
);
}
else
{
...
...
@@ -1065,7 +1065,7 @@ static int ata_qc_wait_err(struct ata_queued_cmd *qc,
rc
=
-
EIO
;
}
ata_qc_complete
(
qc
,
err_mask
);
ata_qc_complete
(
qc
);
}
return
rc
;
...
...
@@ -1176,6 +1176,7 @@ static void ata_dev_identify(struct ata_port *ap, unsigned int device)
qc
->
cursg_ofs
=
0
;
qc
->
cursect
=
0
;
qc
->
nsect
=
1
;
qc
->
err_mask
=
0
;
goto
retry
;
}
}
...
...
@@ -2093,7 +2094,7 @@ static void ata_pr_blacklisted(const struct ata_port *ap,
ap
->
id
,
dev
->
devno
);
}
static
const
char
*
ata_dma_blacklist
[]
=
{
static
const
char
*
const
ata_dma_blacklist
[]
=
{
"WDC AC11000H"
,
"WDC AC22100H"
,
"WDC AC32500H"
,
...
...
@@ -2787,14 +2788,14 @@ static int ata_sg_setup(struct ata_queued_cmd *qc)
* None. (grabs host lock)
*/
void
ata_poll_qc_complete
(
struct
ata_queued_cmd
*
qc
,
unsigned
int
err_mask
)
void
ata_poll_qc_complete
(
struct
ata_queued_cmd
*
qc
)
{
struct
ata_port
*
ap
=
qc
->
ap
;
unsigned
long
flags
;
spin_lock_irqsave
(
&
ap
->
host_set
->
lock
,
flags
);
ata_irq_on
(
ap
);
ata_qc_complete
(
qc
,
err_mask
);
ata_qc_complete
(
qc
);
spin_unlock_irqrestore
(
&
ap
->
host_set
->
lock
,
flags
);
}
...
...
@@ -2811,10 +2812,14 @@ void ata_poll_qc_complete(struct ata_queued_cmd *qc, unsigned int err_mask)
static
unsigned
long
ata_pio_poll
(
struct
ata_port
*
ap
)
{
struct
ata_queued_cmd
*
qc
;
u8
status
;
unsigned
int
poll_state
=
HSM_ST_UNKNOWN
;
unsigned
int
reg_state
=
HSM_ST_UNKNOWN
;
qc
=
ata_qc_from_tag
(
ap
,
ap
->
active_tag
);
assert
(
qc
!=
NULL
);
switch
(
ap
->
hsm_task_state
)
{
case
HSM_ST
:
case
HSM_ST_POLL
:
...
...
@@ -2834,6 +2839,7 @@ static unsigned long ata_pio_poll(struct ata_port *ap)
status
=
ata_chk_status
(
ap
);
if
(
status
&
ATA_BUSY
)
{
if
(
time_after
(
jiffies
,
ap
->
pio_task_timeout
))
{
qc
->
err_mask
|=
AC_ERR_ATA_BUS
;
ap
->
hsm_task_state
=
HSM_ST_TMOUT
;
return
0
;
}
...
...
@@ -2869,29 +2875,31 @@ static int ata_pio_complete (struct ata_port *ap)
* msecs, then chk-status again. If still busy, fall back to
* HSM_ST_LAST_POLL state.
*/
drv_stat
=
ata_busy_wait
(
ap
,
ATA_BUSY
|
ATA_DRQ
,
10
);
if
(
drv_stat
&
(
ATA_BUSY
|
ATA_DRQ
)
)
{
drv_stat
=
ata_busy_wait
(
ap
,
ATA_BUSY
,
10
);
if
(
drv_stat
&
ATA_BUSY
)
{
msleep
(
2
);
drv_stat
=
ata_busy_wait
(
ap
,
ATA_BUSY
|
ATA_DRQ
,
10
);
if
(
drv_stat
&
(
ATA_BUSY
|
ATA_DRQ
)
)
{
drv_stat
=
ata_busy_wait
(
ap
,
ATA_BUSY
,
10
);
if
(
drv_stat
&
ATA_BUSY
)
{
ap
->
hsm_task_state
=
HSM_ST_LAST_POLL
;
ap
->
pio_task_timeout
=
jiffies
+
ATA_TMOUT_PIO
;
return
1
;
}
}
qc
=
ata_qc_from_tag
(
ap
,
ap
->
active_tag
);
assert
(
qc
!=
NULL
);
drv_stat
=
ata_wait_idle
(
ap
);
if
(
!
ata_ok
(
drv_stat
))
{
qc
->
err_mask
|=
__ac_err_mask
(
drv_stat
);
ap
->
hsm_task_state
=
HSM_ST_ERR
;
return
1
;
}
qc
=
ata_qc_from_tag
(
ap
,
ap
->
active_tag
);
assert
(
qc
!=
NULL
);
ap
->
hsm_task_state
=
HSM_ST_IDLE
;
ata_poll_qc_complete
(
qc
,
0
);
assert
(
qc
->
err_mask
==
0
);
ata_poll_qc_complete
(
qc
);
/* another command may start at this point */
...
...
@@ -3363,6 +3371,7 @@ static void atapi_pio_bytes(struct ata_queued_cmd *qc)
err_out:
printk
(
KERN_INFO
"ata%u: dev %u: ATAPI check failed
\n
"
,
ap
->
id
,
dev
->
devno
);
qc
->
err_mask
|=
AC_ERR_ATA_BUS
;
ap
->
hsm_task_state
=
HSM_ST_ERR
;
}
...
...
@@ -3401,8 +3410,16 @@ static void ata_pio_block(struct ata_port *ap)
qc
=
ata_qc_from_tag
(
ap
,
ap
->
active_tag
);
assert
(
qc
!=
NULL
);
/* check error */
if
(
status
&
(
ATA_ERR
|
ATA_DF
))
{
qc
->
err_mask
|=
AC_ERR_DEV
;
ap
->
hsm_task_state
=
HSM_ST_ERR
;
return
;
}
/* transfer data if any */
if
(
is_atapi_taskfile
(
&
qc
->
tf
))
{
/*
no more data to transfer or unsupported ATAPI command
*/
/*
DRQ=0 means no more data to transfer
*/
if
((
status
&
ATA_DRQ
)
==
0
)
{
ap
->
hsm_task_state
=
HSM_ST_LAST
;
return
;
...
...
@@ -3412,6 +3429,7 @@ static void ata_pio_block(struct ata_port *ap)
}
else
{
/* handle BSY=0, DRQ=0 as error */
if
((
status
&
ATA_DRQ
)
==
0
)
{
qc
->
err_mask
|=
AC_ERR_ATA_BUS
;
ap
->
hsm_task_state
=
HSM_ST_ERR
;
return
;
}
...
...
@@ -3431,9 +3449,14 @@ static void ata_pio_error(struct ata_port *ap)
qc
=
ata_qc_from_tag
(
ap
,
ap
->
active_tag
);
assert
(
qc
!=
NULL
);
/* make sure qc->err_mask is available to
* know what's wrong and recover
*/
assert
(
qc
->
err_mask
);
ap
->
hsm_task_state
=
HSM_ST_IDLE
;
ata_poll_qc_complete
(
qc
,
AC_ERR_ATA_BUS
);
ata_poll_qc_complete
(
qc
);
}
static
void
ata_pio_task
(
void
*
_data
)
...
...
@@ -3542,7 +3565,8 @@ static void ata_qc_timeout(struct ata_queued_cmd *qc)
ap
->
hsm_task_state
=
HSM_ST_IDLE
;
/* complete taskfile transaction */
ata_qc_complete
(
qc
,
ac_err_mask
(
drv_stat
));
qc
->
err_mask
|=
ac_err_mask
(
drv_stat
);
ata_qc_complete
(
qc
);
break
;
}
...
...
@@ -3641,7 +3665,7 @@ struct ata_queued_cmd *ata_qc_new_init(struct ata_port *ap,
return
qc
;
}
int
ata_qc_complete_noop
(
struct
ata_queued_cmd
*
qc
,
unsigned
int
err_mask
)
int
ata_qc_complete_noop
(
struct
ata_queued_cmd
*
qc
)
{
return
0
;
}
...
...
@@ -3700,7 +3724,7 @@ void ata_qc_free(struct ata_queued_cmd *qc)
* spin_lock_irqsave(host_set lock)
*/
void
ata_qc_complete
(
struct
ata_queued_cmd
*
qc
,
unsigned
int
err_mask
)
void
ata_qc_complete
(
struct
ata_queued_cmd
*
qc
)
{
int
rc
;
...
...
@@ -3717,7 +3741,7 @@ void ata_qc_complete(struct ata_queued_cmd *qc, unsigned int err_mask)
qc
->
flags
&=
~
ATA_QCFLAG_ACTIVE
;
/* call completion callback */
rc
=
qc
->
complete_fn
(
qc
,
err_mask
);
rc
=
qc
->
complete_fn
(
qc
);
/* if callback indicates not to complete command (non-zero),
* return immediately
...
...
@@ -4303,7 +4327,8 @@ inline unsigned int ata_host_intr (struct ata_port *ap,
ap
->
hsm_task_state
=
HSM_ST_IDLE
;
/* complete taskfile transaction */
ata_qc_complete
(
qc
,
ac_err_mask
(
status
));
qc
->
err_mask
|=
ac_err_mask
(
status
);
ata_qc_complete
(
qc
);
break
;
case
HSM_ST_ERR
:
...
...
drivers/scsi/libata-scsi.c
浏览文件 @
701db69d
...
...
@@ -418,7 +418,7 @@ void ata_to_sense_error(unsigned id, u8 drv_stat, u8 drv_err, u8 *sk, u8 *asc,
int
i
;
/* Based on the 3ware driver translation table */
static
unsigned
char
sense_table
[][
4
]
=
{
static
const
unsigned
char
sense_table
[][
4
]
=
{
/* BBD|ECC|ID|MAR */
{
0xd1
,
ABORTED_COMMAND
,
0x00
,
0x00
},
// Device busy Aborted command
/* BBD|ECC|ID */
...
...
@@ -449,7 +449,7 @@ void ata_to_sense_error(unsigned id, u8 drv_stat, u8 drv_err, u8 *sk, u8 *asc,
{
0x80
,
MEDIUM_ERROR
,
0x11
,
0x04
},
// Block marked bad Medium error, unrecovered read error
{
0xFF
,
0xFF
,
0xFF
,
0xFF
},
// END mark
};
static
unsigned
char
stat_table
[][
4
]
=
{
static
const
unsigned
char
stat_table
[][
4
]
=
{
/* Must be first because BUSY means no other bits valid */
{
0x80
,
ABORTED_COMMAND
,
0x47
,
0x00
},
// Busy, fake parity for now
{
0x20
,
HARDWARE_ERROR
,
0x00
,
0x00
},
// Device fault
...
...
@@ -1203,12 +1203,11 @@ static unsigned int ata_scsi_rw_xlat(struct ata_queued_cmd *qc, const u8 *scsicm
return
1
;
}
static
int
ata_scsi_qc_complete
(
struct
ata_queued_cmd
*
qc
,
unsigned
int
err_mask
)
static
int
ata_scsi_qc_complete
(
struct
ata_queued_cmd
*
qc
)
{
struct
scsi_cmnd
*
cmd
=
qc
->
scsicmd
;
u8
*
cdb
=
cmd
->
cmnd
;
int
need_sense
=
(
err_mask
!=
0
);
int
need_sense
=
(
qc
->
err_mask
!=
0
);
/* For ATA pass thru (SAT) commands, generate a sense block if
* user mandated it or if there's an error. Note that if we
...
...
@@ -1532,7 +1531,7 @@ unsigned int ata_scsiop_inq_80(struct ata_scsi_args *args, u8 *rbuf,
return
0
;
}
static
const
char
*
inq_83_str
=
"Linux ATA-SCSI simulator"
;
static
const
char
*
const
inq_83_str
=
"Linux ATA-SCSI simulator"
;
/**
* ata_scsiop_inq_83 - Simulate INQUIRY EVPD page 83, device identity
...
...
@@ -1955,9 +1954,9 @@ void ata_scsi_badcmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *), u8
done
(
cmd
);
}
static
int
atapi_sense_complete
(
struct
ata_queued_cmd
*
qc
,
unsigned
int
err_mask
)
static
int
atapi_sense_complete
(
struct
ata_queued_cmd
*
qc
)
{
if
(
err_mask
&&
((
err_mask
&
AC_ERR_DEV
)
==
0
))
if
(
qc
->
err_mask
&&
((
qc
->
err_mask
&
AC_ERR_DEV
)
==
0
))
/* FIXME: not quite right; we don't want the
* translation of taskfile registers into
* a sense descriptors, since that's only
...
...
@@ -2015,15 +2014,18 @@ static void atapi_request_sense(struct ata_queued_cmd *qc)
qc
->
complete_fn
=
atapi_sense_complete
;
if
(
ata_qc_issue
(
qc
))
ata_qc_complete
(
qc
,
AC_ERR_OTHER
);
if
(
ata_qc_issue
(
qc
))
{
qc
->
err_mask
|=
AC_ERR_OTHER
;
ata_qc_complete
(
qc
);
}
DPRINTK
(
"EXIT
\n
"
);
}
static
int
atapi_qc_complete
(
struct
ata_queued_cmd
*
qc
,
unsigned
int
err_mask
)
static
int
atapi_qc_complete
(
struct
ata_queued_cmd
*
qc
)
{
struct
scsi_cmnd
*
cmd
=
qc
->
scsicmd
;
unsigned
int
err_mask
=
qc
->
err_mask
;
VPRINTK
(
"ENTER, err_mask 0x%X
\n
"
,
err_mask
);
...
...
drivers/scsi/libata.h
浏览文件 @
701db69d
...
...
@@ -39,7 +39,7 @@ struct ata_scsi_args {
/* libata-core.c */
extern
int
atapi_enabled
;
extern
int
ata_qc_complete_noop
(
struct
ata_queued_cmd
*
qc
,
unsigned
int
err_mask
);
extern
int
ata_qc_complete_noop
(
struct
ata_queued_cmd
*
qc
);
extern
struct
ata_queued_cmd
*
ata_qc_new_init
(
struct
ata_port
*
ap
,
struct
ata_device
*
dev
);
extern
void
ata_rwcmd_protocol
(
struct
ata_queued_cmd
*
qc
);
...
...
drivers/scsi/pdc_adma.c
浏览文件 @
701db69d
...
...
@@ -464,14 +464,12 @@ static inline unsigned int adma_intr_pkt(struct ata_host_set *host_set)
continue
;
qc
=
ata_qc_from_tag
(
ap
,
ap
->
active_tag
);
if
(
qc
&&
(
!
(
qc
->
tf
.
flags
&
ATA_TFLAG_POLLING
)))
{
unsigned
int
err_mask
=
0
;
if
((
status
&
(
aPERR
|
aPSD
|
aUIRQ
)))
err_mask
=
AC_ERR_OTHER
;
qc
->
err_mask
|
=
AC_ERR_OTHER
;
else
if
(
pp
->
pkt
[
0
]
!=
cDONE
)
err_mask
=
AC_ERR_OTHER
;
qc
->
err_mask
|
=
AC_ERR_OTHER
;
ata_qc_complete
(
qc
,
err_mask
);
ata_qc_complete
(
qc
);
}
}
return
handled
;
...
...
@@ -501,7 +499,8 @@ static inline unsigned int adma_intr_mmio(struct ata_host_set *host_set)
/* complete taskfile transaction */
pp
->
state
=
adma_state_idle
;
ata_qc_complete
(
qc
,
ac_err_mask
(
status
));
qc
->
err_mask
|=
ac_err_mask
(
status
);
ata_qc_complete
(
qc
);
handled
=
1
;
}
}
...
...
drivers/scsi/sata_mv.c
浏览文件 @
701db69d
...
...
@@ -431,7 +431,7 @@ static const struct ata_port_operations mv6_ops = {
.
host_stop
=
mv_host_stop
,
};
static
struct
ata_port_info
mv_port_info
[]
=
{
static
const
struct
ata_port_info
mv_port_info
[]
=
{
{
/* chip_504x */
.
sht
=
&
mv_sht
,
.
host_flags
=
MV_COMMON_FLAGS
,
...
...
@@ -1242,8 +1242,10 @@ static void mv_host_intr(struct ata_host_set *host_set, u32 relevant,
VPRINTK
(
"port %u IRQ found for qc, "
"ata_status 0x%x
\n
"
,
port
,
ata_status
);
/* mark qc status appropriately */
if
(
!
(
qc
->
tf
.
flags
&
ATA_TFLAG_POLLING
))
if
(
!
(
qc
->
tf
.
flags
&
ATA_TFLAG_POLLING
))
{
qc
->
err_mask
|=
err_mask
;
ata_qc_complete
(
qc
,
err_mask
);
}
}
}
}
...
...
@@ -1864,7 +1866,8 @@ static void mv_eng_timeout(struct ata_port *ap)
*/
spin_lock_irqsave
(
&
ap
->
host_set
->
lock
,
flags
);
qc
->
scsidone
=
scsi_finish_command
;
ata_qc_complete
(
qc
,
AC_ERR_OTHER
);
qc
->
err_mask
|=
AC_ERR_OTHER
;
ata_qc_complete
(
qc
);
spin_unlock_irqrestore
(
&
ap
->
host_set
->
lock
,
flags
);
}
}
...
...
drivers/scsi/sata_promise.c
浏览文件 @
701db69d
...
...
@@ -158,7 +158,7 @@ static const struct ata_port_operations pdc_pata_ops = {
.
host_stop
=
ata_pci_host_stop
,
};
static
struct
ata_port_info
pdc_port_info
[]
=
{
static
const
struct
ata_port_info
pdc_port_info
[]
=
{
/* board_2037x */
{
.
sht
=
&
pdc_ata_sht
,
...
...
@@ -404,7 +404,8 @@ static void pdc_eng_timeout(struct ata_port *ap)
case
ATA_PROT_NODATA
:
printk
(
KERN_ERR
"ata%u: command timeout
\n
"
,
ap
->
id
);
drv_stat
=
ata_wait_idle
(
ap
);
ata_qc_complete
(
qc
,
__ac_err_mask
(
drv_stat
));
qc
->
err_mask
|=
__ac_err_mask
(
drv_stat
);
ata_qc_complete
(
qc
);
break
;
default:
...
...
@@ -413,7 +414,8 @@ static void pdc_eng_timeout(struct ata_port *ap)
printk
(
KERN_ERR
"ata%u: unknown timeout, cmd 0x%x stat 0x%x
\n
"
,
ap
->
id
,
qc
->
tf
.
command
,
drv_stat
);
ata_qc_complete
(
qc
,
ac_err_mask
(
drv_stat
));
qc
->
err_mask
|=
ac_err_mask
(
drv_stat
);
ata_qc_complete
(
qc
);
break
;
}
...
...
@@ -425,21 +427,21 @@ static void pdc_eng_timeout(struct ata_port *ap)
static
inline
unsigned
int
pdc_host_intr
(
struct
ata_port
*
ap
,
struct
ata_queued_cmd
*
qc
)
{
unsigned
int
handled
=
0
,
err_mask
=
0
;
unsigned
int
handled
=
0
;
u32
tmp
;
void
__iomem
*
mmio
=
(
void
__iomem
*
)
ap
->
ioaddr
.
cmd_addr
+
PDC_GLOBAL_CTL
;
tmp
=
readl
(
mmio
);
if
(
tmp
&
PDC_ERR_MASK
)
{
err_mask
=
AC_ERR_DEV
;
qc
->
err_mask
|
=
AC_ERR_DEV
;
pdc_reset_port
(
ap
);
}
switch
(
qc
->
tf
.
protocol
)
{
case
ATA_PROT_DMA
:
case
ATA_PROT_NODATA
:
err_mask
|=
ac_err_mask
(
ata_wait_idle
(
ap
));
ata_qc_complete
(
qc
,
err_mask
);
qc
->
err_mask
|=
ac_err_mask
(
ata_wait_idle
(
ap
));
ata_qc_complete
(
qc
);
handled
=
1
;
break
;
...
...
@@ -706,7 +708,7 @@ static int pdc_ata_init_one (struct pci_dev *pdev, const struct pci_device_id *e
probe_ent
->
port
[
3
].
scr_addr
=
base
+
0x700
;
break
;
case
board_2037x
:
probe_ent
->
n_ports
=
2
;
probe_ent
->
n_ports
=
2
;
break
;
case
board_20619
:
probe_ent
->
n_ports
=
4
;
...
...
@@ -716,7 +718,7 @@ static int pdc_ata_init_one (struct pci_dev *pdev, const struct pci_device_id *e
probe_ent
->
port
[
2
].
scr_addr
=
base
+
0x600
;
probe_ent
->
port
[
3
].
scr_addr
=
base
+
0x700
;
break
;
break
;
default:
BUG
();
break
;
...
...
drivers/scsi/sata_qstor.c
浏览文件 @
701db69d
...
...
@@ -170,7 +170,7 @@ static const struct ata_port_operations qs_ata_ops = {
.
bmdma_status
=
qs_bmdma_status
,
};
static
struct
ata_port_info
qs_port_info
[]
=
{
static
const
struct
ata_port_info
qs_port_info
[]
=
{
/* board_2068_idx */
{
.
sht
=
&
qs_ata_sht
,
...
...
@@ -408,8 +408,8 @@ static inline unsigned int qs_intr_pkt(struct ata_host_set *host_set)
case
3
:
/* device error */
pp
->
state
=
qs_state_idle
;
qs_enter_reg_mode
(
qc
->
ap
);
ata_qc_complete
(
qc
,
ac_err_mask
(
sDST
)
);
qc
->
err_mask
|=
ac_err_mask
(
sDST
);
ata_qc_complete
(
qc
);
break
;
default:
break
;
...
...
@@ -446,7 +446,8 @@ static inline unsigned int qs_intr_mmio(struct ata_host_set *host_set)
/* complete taskfile transaction */
pp
->
state
=
qs_state_idle
;
ata_qc_complete
(
qc
,
ac_err_mask
(
status
));
qc
->
err_mask
|=
ac_err_mask
(
status
);
ata_qc_complete
(
qc
);
handled
=
1
;
}
}
...
...
drivers/scsi/sata_sil.c
浏览文件 @
701db69d
...
...
@@ -176,7 +176,7 @@ static const struct ata_port_operations sil_ops = {
.
host_stop
=
ata_pci_host_stop
,
};
static
struct
ata_port_info
sil_port_info
[]
=
{
static
const
struct
ata_port_info
sil_port_info
[]
=
{
/* sil_3112 */
{
.
sht
=
&
sil_sht
,
...
...
drivers/scsi/sata_sil24.c
浏览文件 @
701db69d
...
...
@@ -654,7 +654,8 @@ static void sil24_eng_timeout(struct ata_port *ap)
*/
printk
(
KERN_ERR
"ata%u: command timeout
\n
"
,
ap
->
id
);
qc
->
scsidone
=
scsi_finish_command
;
ata_qc_complete
(
qc
,
AC_ERR_OTHER
);
qc
->
err_mask
|=
AC_ERR_OTHER
;
ata_qc_complete
(
qc
);
sil24_reset_controller
(
ap
);
}
...
...
@@ -711,8 +712,10 @@ static void sil24_error_intr(struct ata_port *ap, u32 slot_stat)
sil24_reset_controller
(
ap
);
}
if
(
qc
)
ata_qc_complete
(
qc
,
err_mask
);
if
(
qc
)
{
qc
->
err_mask
|=
err_mask
;
ata_qc_complete
(
qc
);
}
}
static
inline
void
sil24_host_intr
(
struct
ata_port
*
ap
)
...
...
@@ -734,8 +737,10 @@ static inline void sil24_host_intr(struct ata_port *ap)
*/
sil24_update_tf
(
ap
);
if
(
qc
)
ata_qc_complete
(
qc
,
ac_err_mask
(
pp
->
tf
.
command
));
if
(
qc
)
{
qc
->
err_mask
|=
ac_err_mask
(
pp
->
tf
.
command
);
ata_qc_complete
(
qc
);
}
}
else
sil24_error_intr
(
ap
,
slot_stat
);
}
...
...
drivers/scsi/sata_sx4.c
浏览文件 @
701db69d
...
...
@@ -215,7 +215,7 @@ static const struct ata_port_operations pdc_20621_ops = {
.
host_stop
=
pdc20621_host_stop
,
};
static
struct
ata_port_info
pdc_port_info
[]
=
{
static
const
struct
ata_port_info
pdc_port_info
[]
=
{
/* board_20621 */
{
.
sht
=
&
pdc_sata_sht
,
...
...
@@ -719,7 +719,8 @@ static inline unsigned int pdc20621_host_intr( struct ata_port *ap,
VPRINTK
(
"ata%u: read hdma, 0x%x 0x%x
\n
"
,
ap
->
id
,
readl
(
mmio
+
0x104
),
readl
(
mmio
+
PDC_HDMA_CTLSTAT
));
/* get drive status; clear intr; complete txn */
ata_qc_complete
(
qc
,
ac_err_mask
(
ata_wait_idle
(
ap
)));
qc
->
err_mask
|=
ac_err_mask
(
ata_wait_idle
(
ap
));
ata_qc_complete
(
qc
);
pdc20621_pop_hdma
(
qc
);
}
...
...
@@ -757,7 +758,8 @@ static inline unsigned int pdc20621_host_intr( struct ata_port *ap,
VPRINTK
(
"ata%u: write ata, 0x%x 0x%x
\n
"
,
ap
->
id
,
readl
(
mmio
+
0x104
),
readl
(
mmio
+
PDC_HDMA_CTLSTAT
));
/* get drive status; clear intr; complete txn */
ata_qc_complete
(
qc
,
ac_err_mask
(
ata_wait_idle
(
ap
)));
qc
->
err_mask
|=
ac_err_mask
(
ata_wait_idle
(
ap
));
ata_qc_complete
(
qc
);
pdc20621_pop_hdma
(
qc
);
}
handled
=
1
;
...
...
@@ -767,7 +769,8 @@ static inline unsigned int pdc20621_host_intr( struct ata_port *ap,
status
=
ata_busy_wait
(
ap
,
ATA_BUSY
|
ATA_DRQ
,
1000
);
DPRINTK
(
"BUS_NODATA (drv_stat 0x%X)
\n
"
,
status
);
ata_qc_complete
(
qc
,
ac_err_mask
(
status
));
qc
->
err_mask
|=
ac_err_mask
(
status
);
ata_qc_complete
(
qc
);
handled
=
1
;
}
else
{
...
...
@@ -882,7 +885,8 @@ static void pdc_eng_timeout(struct ata_port *ap)
case
ATA_PROT_DMA
:
case
ATA_PROT_NODATA
:
printk
(
KERN_ERR
"ata%u: command timeout
\n
"
,
ap
->
id
);
ata_qc_complete
(
qc
,
__ac_err_mask
(
ata_wait_idle
(
ap
)));
qc
->
err_mask
|=
__ac_err_mask
(
ata_wait_idle
(
ap
));
ata_qc_complete
(
qc
);
break
;
default:
...
...
@@ -891,7 +895,8 @@ static void pdc_eng_timeout(struct ata_port *ap)
printk
(
KERN_ERR
"ata%u: unknown timeout, cmd 0x%x stat 0x%x
\n
"
,
ap
->
id
,
qc
->
tf
.
command
,
drv_stat
);
ata_qc_complete
(
qc
,
ac_err_mask
(
drv_stat
));
qc
->
err_mask
|=
ac_err_mask
(
drv_stat
);
ata_qc_complete
(
qc
);
break
;
}
...
...
include/linux/libata.h
浏览文件 @
701db69d
...
...
@@ -197,7 +197,7 @@ struct ata_port;
struct
ata_queued_cmd
;
/* typedefs */
typedef
int
(
*
ata_qc_cb_t
)
(
struct
ata_queued_cmd
*
qc
,
unsigned
int
err_mask
);
typedef
int
(
*
ata_qc_cb_t
)
(
struct
ata_queued_cmd
*
qc
);
struct
ata_ioports
{
unsigned
long
cmd_addr
;
...
...
@@ -282,6 +282,8 @@ struct ata_queued_cmd {
/* DO NOT iterate over __sg manually, use ata_for_each_sg() */
struct
scatterlist
*
__sg
;
unsigned
int
err_mask
;
ata_qc_cb_t
complete_fn
;
struct
completion
*
waiting
;
...
...
@@ -476,7 +478,7 @@ extern void ata_bmdma_start (struct ata_queued_cmd *qc);
extern
void
ata_bmdma_stop
(
struct
ata_queued_cmd
*
qc
);
extern
u8
ata_bmdma_status
(
struct
ata_port
*
ap
);
extern
void
ata_bmdma_irq_clear
(
struct
ata_port
*
ap
);
extern
void
ata_qc_complete
(
struct
ata_queued_cmd
*
qc
,
unsigned
int
err_mask
);
extern
void
ata_qc_complete
(
struct
ata_queued_cmd
*
qc
);
extern
void
ata_eng_timeout
(
struct
ata_port
*
ap
);
extern
void
ata_scsi_simulate
(
u16
*
id
,
struct
scsi_cmnd
*
cmd
,
void
(
*
done
)(
struct
scsi_cmnd
*
));
...
...
@@ -668,6 +670,7 @@ static inline void ata_qc_reinit(struct ata_queued_cmd *qc)
qc
->
cursect
=
qc
->
cursg
=
qc
->
cursg_ofs
=
0
;
qc
->
nsect
=
0
;
qc
->
nbytes
=
qc
->
curbytes
=
0
;
qc
->
err_mask
=
0
;
ata_tf_init
(
qc
->
ap
,
&
qc
->
tf
,
qc
->
dev
->
devno
);
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录