Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
cloud-kernel
提交
d4bf2053
cloud-kernel
项目概览
openanolis
/
cloud-kernel
1 年多 前同步成功
通知
161
Star
36
Fork
7
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
10
列表
看板
标记
里程碑
合并请求
2
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
cloud-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
10
Issue
10
列表
看板
标记
里程碑
合并请求
2
合并请求
2
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
d4bf2053
编写于
19年前
作者:
L
Linus Torvalds
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'upstream-fixes' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/libata-dev
上级
8907e94b
e2b1be56
master
alk-4.19.24
alk-4.19.30
alk-4.19.34
alk-4.19.36
alk-4.19.43
alk-4.19.48
alk-4.19.57
ck-4.19.67
ck-4.19.81
ck-4.19.91
github/fork/deepanshu1422/fix-typo-in-comment
github/fork/haosdent/fix-typo
linux-next
v4.19.91
v4.19.90
v4.19.89
v4.19.88
v4.19.87
v4.19.86
v4.19.85
v4.19.84
v4.19.83
v4.19.82
v4.19.81
v4.19.80
v4.19.79
v4.19.78
v4.19.77
v4.19.76
v4.19.75
v4.19.74
v4.19.73
v4.19.72
v4.19.71
v4.19.70
v4.19.69
v4.19.68
v4.19.67
v4.19.66
v4.19.65
v4.19.64
v4.19.63
v4.19.62
v4.19.61
v4.19.60
v4.19.59
v4.19.58
v4.19.57
v4.19.56
v4.19.55
v4.19.54
v4.19.53
v4.19.52
v4.19.51
v4.19.50
v4.19.49
v4.19.48
v4.19.47
v4.19.46
v4.19.45
v4.19.44
v4.19.43
v4.19.42
v4.19.41
v4.19.40
v4.19.39
v4.19.38
v4.19.37
v4.19.36
v4.19.35
v4.19.34
v4.19.33
v4.19.32
v4.19.31
v4.19.30
v4.19.29
v4.19.28
v4.19.27
v4.19.26
v4.19.25
v4.19.24
v4.19.23
v4.19.22
v4.19.21
v4.19.20
v4.19.19
v4.19.18
v4.19.17
v4.19.16
v4.19.15
v4.19.14
v4.19.13
v4.19.12
v4.19.11
v4.19.10
v4.19.9
v4.19.8
v4.19.7
v4.19.6
v4.19.5
v4.19.4
v4.19.3
v4.19.2
v4.19.1
v4.19
v4.19-rc8
v4.19-rc7
v4.19-rc6
v4.19-rc5
v4.19-rc4
v4.19-rc3
v4.19-rc2
v4.19-rc1
ck-release-21
ck-release-20
ck-release-19.2
ck-release-19.1
ck-release-19
ck-release-18
ck-release-17.2
ck-release-17.1
ck-release-17
ck-release-16
ck-release-15.1
ck-release-15
ck-release-14
ck-release-13.2
ck-release-13
ck-release-12
ck-release-11
ck-release-10
ck-release-9
ck-release-7
alk-release-15
alk-release-14
alk-release-13.2
alk-release-13
alk-release-12
alk-release-11
alk-release-10
alk-release-9
alk-release-7
无相关合并请求
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
162 addition
and
38 deletion
+162
-38
drivers/scsi/sata_mv.c
drivers/scsi/sata_mv.c
+2
-1
drivers/scsi/sata_sil24.c
drivers/scsi/sata_sil24.c
+160
-37
未找到文件。
drivers/scsi/sata_mv.c
浏览文件 @
d4bf2053
...
...
@@ -2,6 +2,7 @@
* sata_mv.c - Marvell SATA support
*
* Copyright 2005: EMC Corporation, all rights reserved.
* Copyright 2005 Red Hat, Inc. All rights reserved.
*
* Please ALWAYS copy linux-ide@vger.kernel.org on emails.
*
...
...
@@ -36,7 +37,7 @@
#include <asm/io.h>
#define DRV_NAME "sata_mv"
#define DRV_VERSION "0.
2
5"
#define DRV_VERSION "0.5"
enum
{
/* BAR's are enumerated in terms of pci_resource_start() terms */
...
...
This diff is collapsed.
Click to expand it.
drivers/scsi/sata_sil24.c
浏览文件 @
d4bf2053
...
...
@@ -5,17 +5,6 @@
*
* Based on preview driver from Silicon Image.
*
* NOTE: No NCQ/ATAPI support yet. The preview driver didn't support
* NCQ nor ATAPI, and, unfortunately, I couldn't find out how to make
* those work. Enabling those shouldn't be difficult. Basic
* structure is all there (in libata-dev tree). If you have any
* information about this hardware, please contact me or linux-ide.
* Info is needed on...
*
* - How to issue tagged commands and turn on sactive on issue accordingly.
* - Where to put an ATAPI command and how to tell the device to send it.
* - How to enable/use 64bit.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2, or (at your option) any
...
...
@@ -42,7 +31,7 @@
#include <asm/io.h>
#define DRV_NAME "sata_sil24"
#define DRV_VERSION "0.2
2"
/* Silicon Image's preview driver was 0.10 */
#define DRV_VERSION "0.2
3"
/*
* Port request block (PRB) 32 bytes
...
...
@@ -221,11 +210,22 @@ enum {
IRQ_STAT_4PORTS
=
0xf
,
};
struct
sil24_
cmd
_block
{
struct
sil24_
ata
_block
{
struct
sil24_prb
prb
;
struct
sil24_sge
sge
[
LIBATA_MAX_PRD
];
};
struct
sil24_atapi_block
{
struct
sil24_prb
prb
;
u8
cdb
[
16
];
struct
sil24_sge
sge
[
LIBATA_MAX_PRD
-
1
];
};
union
sil24_cmd_block
{
struct
sil24_ata_block
ata
;
struct
sil24_atapi_block
atapi
;
};
/*
* ap->private_data
*
...
...
@@ -233,7 +233,7 @@ struct sil24_cmd_block {
* here from the previous interrupt.
*/
struct
sil24_port_priv
{
struct
sil24_cmd_block
*
cmd_block
;
/* 32 cmd blocks */
union
sil24_cmd_block
*
cmd_block
;
/* 32 cmd blocks */
dma_addr_t
cmd_block_dma
;
/* DMA base addr for them */
struct
ata_taskfile
tf
;
/* Cached taskfile registers */
};
...
...
@@ -244,6 +244,7 @@ struct sil24_host_priv {
void
__iomem
*
port_base
;
/* port registers (4 * 8192 bytes @BAR2) */
};
static
void
sil24_dev_config
(
struct
ata_port
*
ap
,
struct
ata_device
*
dev
);
static
u8
sil24_check_status
(
struct
ata_port
*
ap
);
static
u32
sil24_scr_read
(
struct
ata_port
*
ap
,
unsigned
sc_reg
);
static
void
sil24_scr_write
(
struct
ata_port
*
ap
,
unsigned
sc_reg
,
u32
val
);
...
...
@@ -297,6 +298,8 @@ static struct scsi_host_template sil24_sht = {
static
const
struct
ata_port_operations
sil24_ops
=
{
.
port_disable
=
ata_port_disable
,
.
dev_config
=
sil24_dev_config
,
.
check_status
=
sil24_check_status
,
.
check_altstatus
=
sil24_check_status
,
.
dev_select
=
ata_noop_dev_select
,
...
...
@@ -333,7 +336,7 @@ static struct ata_port_info sil24_port_info[] = {
{
.
sht
=
&
sil24_sht
,
.
host_flags
=
ATA_FLAG_SATA
|
ATA_FLAG_NO_LEGACY
|
ATA_FLAG_S
ATA_RESE
T
|
ATA_FLAG_MMIO
|
ATA_FLAG_S
RS
T
|
ATA_FLAG_MMIO
|
ATA_FLAG_PIO_DMA
|
SIL24_NPORTS2FLAG
(
4
),
.
pio_mask
=
0x1f
,
/* pio0-4 */
.
mwdma_mask
=
0x07
,
/* mwdma0-2 */
...
...
@@ -344,7 +347,7 @@ static struct ata_port_info sil24_port_info[] = {
{
.
sht
=
&
sil24_sht
,
.
host_flags
=
ATA_FLAG_SATA
|
ATA_FLAG_NO_LEGACY
|
ATA_FLAG_S
ATA_RESE
T
|
ATA_FLAG_MMIO
|
ATA_FLAG_S
RS
T
|
ATA_FLAG_MMIO
|
ATA_FLAG_PIO_DMA
|
SIL24_NPORTS2FLAG
(
2
),
.
pio_mask
=
0x1f
,
/* pio0-4 */
.
mwdma_mask
=
0x07
,
/* mwdma0-2 */
...
...
@@ -355,7 +358,7 @@ static struct ata_port_info sil24_port_info[] = {
{
.
sht
=
&
sil24_sht
,
.
host_flags
=
ATA_FLAG_SATA
|
ATA_FLAG_NO_LEGACY
|
ATA_FLAG_S
ATA_RESE
T
|
ATA_FLAG_MMIO
|
ATA_FLAG_S
RS
T
|
ATA_FLAG_MMIO
|
ATA_FLAG_PIO_DMA
|
SIL24_NPORTS2FLAG
(
1
),
.
pio_mask
=
0x1f
,
/* pio0-4 */
.
mwdma_mask
=
0x07
,
/* mwdma0-2 */
...
...
@@ -364,6 +367,16 @@ static struct ata_port_info sil24_port_info[] = {
},
};
static
void
sil24_dev_config
(
struct
ata_port
*
ap
,
struct
ata_device
*
dev
)
{
void
__iomem
*
port
=
(
void
__iomem
*
)
ap
->
ioaddr
.
cmd_addr
;
if
(
ap
->
cdb_len
==
16
)
writel
(
PORT_CS_CDB16
,
port
+
PORT_CTRL_STAT
);
else
writel
(
PORT_CS_CDB16
,
port
+
PORT_CTRL_CLR
);
}
static
inline
void
sil24_update_tf
(
struct
ata_port
*
ap
)
{
struct
sil24_port_priv
*
pp
=
ap
->
private_data
;
...
...
@@ -415,22 +428,73 @@ static void sil24_tf_read(struct ata_port *ap, struct ata_taskfile *tf)
*
tf
=
pp
->
tf
;
}
static
void
sil24_phy_reset
(
struct
ata_port
*
ap
)
static
int
sil24_issue_SRST
(
struct
ata_port
*
ap
)
{
__sata_phy_reset
(
ap
);
void
__iomem
*
port
=
(
void
__iomem
*
)
ap
->
ioaddr
.
cmd_addr
;
struct
sil24_port_priv
*
pp
=
ap
->
private_data
;
struct
sil24_prb
*
prb
=
&
pp
->
cmd_block
[
0
].
ata
.
prb
;
dma_addr_t
paddr
=
pp
->
cmd_block_dma
;
u32
irq_enable
,
irq_stat
;
int
cnt
;
/* temporarily turn off IRQs during SRST */
irq_enable
=
readl
(
port
+
PORT_IRQ_ENABLE_SET
);
writel
(
irq_enable
,
port
+
PORT_IRQ_ENABLE_CLR
);
/*
* No ATAPI yet. Just unconditionally indicate ATA device.
* If ATAPI device is attached, it will fail ATA_CMD_ID_ATA
* and libata core will ignore the device.
* XXX: Not sure whether the following sleep is needed or not.
* The original driver had it. So....
*/
if
(
!
(
ap
->
flags
&
ATA_FLAG_PORT_DISABLED
))
ap
->
device
[
0
].
class
=
ATA_DEV_ATA
;
msleep
(
10
);
prb
->
ctrl
=
PRB_CTRL_SRST
;
prb
->
fis
[
1
]
=
0
;
/* no PM yet */
writel
((
u32
)
paddr
,
port
+
PORT_CMD_ACTIVATE
);
for
(
cnt
=
0
;
cnt
<
100
;
cnt
++
)
{
irq_stat
=
readl
(
port
+
PORT_IRQ_STAT
);
writel
(
irq_stat
,
port
+
PORT_IRQ_STAT
);
/* clear irq */
irq_stat
>>=
PORT_IRQ_RAW_SHIFT
;
if
(
irq_stat
&
(
PORT_IRQ_COMPLETE
|
PORT_IRQ_ERROR
))
break
;
msleep
(
1
);
}
/* restore IRQs */
writel
(
irq_enable
,
port
+
PORT_IRQ_ENABLE_SET
);
if
(
!
(
irq_stat
&
PORT_IRQ_COMPLETE
))
return
-
1
;
/* update TF */
sil24_update_tf
(
ap
);
return
0
;
}
static
void
sil24_phy_reset
(
struct
ata_port
*
ap
)
{
struct
sil24_port_priv
*
pp
=
ap
->
private_data
;
__sata_phy_reset
(
ap
);
if
(
ap
->
flags
&
ATA_FLAG_PORT_DISABLED
)
return
;
if
(
sil24_issue_SRST
(
ap
)
<
0
)
{
printk
(
KERN_ERR
DRV_NAME
" ata%u: SRST failed, disabling port
\n
"
,
ap
->
id
);
ap
->
ops
->
port_disable
(
ap
);
return
;
}
ap
->
device
->
class
=
ata_dev_classify
(
&
pp
->
tf
);
}
static
inline
void
sil24_fill_sg
(
struct
ata_queued_cmd
*
qc
,
struct
sil24_
cmd_block
*
cb
)
struct
sil24_
sge
*
sge
)
{
struct
sil24_sge
*
sge
=
cb
->
sge
;
struct
scatterlist
*
sg
;
unsigned
int
idx
=
0
;
...
...
@@ -451,23 +515,47 @@ static void sil24_qc_prep(struct ata_queued_cmd *qc)
{
struct
ata_port
*
ap
=
qc
->
ap
;
struct
sil24_port_priv
*
pp
=
ap
->
private_data
;
struct
sil24_cmd_block
*
cb
=
pp
->
cmd_block
+
qc
->
tag
;
struct
sil24_prb
*
prb
=
&
cb
->
prb
;
union
sil24_cmd_block
*
cb
=
pp
->
cmd_block
+
qc
->
tag
;
struct
sil24_prb
*
prb
;
struct
sil24_sge
*
sge
;
switch
(
qc
->
tf
.
protocol
)
{
case
ATA_PROT_PIO
:
case
ATA_PROT_DMA
:
case
ATA_PROT_NODATA
:
prb
=
&
cb
->
ata
.
prb
;
sge
=
cb
->
ata
.
sge
;
prb
->
ctrl
=
0
;
break
;
case
ATA_PROT_ATAPI
:
case
ATA_PROT_ATAPI_DMA
:
case
ATA_PROT_ATAPI_NODATA
:
prb
=
&
cb
->
atapi
.
prb
;
sge
=
cb
->
atapi
.
sge
;
memset
(
cb
->
atapi
.
cdb
,
0
,
32
);
memcpy
(
cb
->
atapi
.
cdb
,
qc
->
cdb
,
ap
->
cdb_len
);
if
(
qc
->
tf
.
protocol
!=
ATA_PROT_ATAPI_NODATA
)
{
if
(
qc
->
tf
.
flags
&
ATA_TFLAG_WRITE
)
prb
->
ctrl
=
PRB_CTRL_PACKET_WRITE
;
else
prb
->
ctrl
=
PRB_CTRL_PACKET_READ
;
}
else
prb
->
ctrl
=
0
;
break
;
default:
/* ATAPI isn't supported yet */
prb
=
NULL
;
/* shut up, gcc */
sge
=
NULL
;
BUG
();
}
ata_tf_to_fis
(
&
qc
->
tf
,
prb
->
fis
,
0
);
if
(
qc
->
flags
&
ATA_QCFLAG_DMAMAP
)
sil24_fill_sg
(
qc
,
cb
);
sil24_fill_sg
(
qc
,
sge
);
}
static
int
sil24_qc_issue
(
struct
ata_queued_cmd
*
qc
)
...
...
@@ -486,6 +574,31 @@ static void sil24_irq_clear(struct ata_port *ap)
/* unused */
}
static
int
__sil24_restart_controller
(
void
__iomem
*
port
)
{
u32
tmp
;
int
cnt
;
writel
(
PORT_CS_INIT
,
port
+
PORT_CTRL_STAT
);
/* Max ~10ms */
for
(
cnt
=
0
;
cnt
<
10000
;
cnt
++
)
{
tmp
=
readl
(
port
+
PORT_CTRL_STAT
);
if
(
tmp
&
PORT_CS_RDY
)
return
0
;
udelay
(
1
);
}
return
-
1
;
}
static
void
sil24_restart_controller
(
struct
ata_port
*
ap
)
{
if
(
__sil24_restart_controller
((
void
__iomem
*
)
ap
->
ioaddr
.
cmd_addr
))
printk
(
KERN_ERR
DRV_NAME
" ata%u: failed to restart controller
\n
"
,
ap
->
id
);
}
static
int
__sil24_reset_controller
(
void
__iomem
*
port
)
{
int
cnt
;
...
...
@@ -505,7 +618,11 @@ static int __sil24_reset_controller(void __iomem *port)
if
(
tmp
&
PORT_CS_DEV_RST
)
return
-
1
;
return
0
;
if
(
tmp
&
PORT_CS_RDY
)
return
0
;
return
__sil24_restart_controller
(
port
);
}
static
void
sil24_reset_controller
(
struct
ata_port
*
ap
)
...
...
@@ -567,9 +684,15 @@ static void sil24_error_intr(struct ata_port *ap, u32 slot_stat)
if
(
serror
)
writel
(
serror
,
port
+
PORT_SERROR
);
printk
(
KERN_ERR
DRV_NAME
" ata%u: error interrupt on port%d
\n
"
" stat=0x%x irq=0x%x cmd_err=%d sstatus=0x%x serror=0x%x
\n
"
,
ap
->
id
,
ap
->
port_no
,
slot_stat
,
irq_stat
,
cmd_err
,
sstatus
,
serror
);
/*
* Don't log ATAPI device errors. They're supposed to happen
* and any serious errors will be logged using sense data by
* the SCSI layer.
*/
if
(
ap
->
device
[
0
].
class
!=
ATA_DEV_ATAPI
||
cmd_err
>
PORT_CERR_SDB
)
printk
(
"ata%u: error interrupt on port%d
\n
"
" stat=0x%x irq=0x%x cmd_err=%d sstatus=0x%x serror=0x%x
\n
"
,
ap
->
id
,
ap
->
port_no
,
slot_stat
,
irq_stat
,
cmd_err
,
sstatus
,
serror
);
if
(
cmd_err
==
PORT_CERR_DEV
||
cmd_err
==
PORT_CERR_SDB
)
{
/*
...
...
@@ -577,6 +700,7 @@ static void sil24_error_intr(struct ata_port *ap, u32 slot_stat)
*/
sil24_update_tf
(
ap
);
err_mask
=
ac_err_mask
(
pp
->
tf
.
command
);
sil24_restart_controller
(
ap
);
}
else
{
/*
* Other errors. libata currently doesn't have any
...
...
@@ -584,12 +708,11 @@ static void sil24_error_intr(struct ata_port *ap, u32 slot_stat)
* ATA_ERR.
*/
err_mask
=
AC_ERR_OTHER
;
sil24_reset_controller
(
ap
);
}
if
(
qc
)
ata_qc_complete
(
qc
,
err_mask
);
sil24_reset_controller
(
ap
);
}
static
inline
void
sil24_host_intr
(
struct
ata_port
*
ap
)
...
...
@@ -665,7 +788,7 @@ static int sil24_port_start(struct ata_port *ap)
{
struct
device
*
dev
=
ap
->
host_set
->
dev
;
struct
sil24_port_priv
*
pp
;
struct
sil24_cmd_block
*
cb
;
union
sil24_cmd_block
*
cb
;
size_t
cb_size
=
sizeof
(
*
cb
);
dma_addr_t
cb_dma
;
int
rc
=
-
ENOMEM
;
...
...
This diff is collapsed.
Click to expand it.
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录
反馈
建议
客服
返回
顶部