Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
7bcba5b0
Commit
7bcba5b0
authored
Mar 18, 2004
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
bk://gkernel.bkbits.net/libata-2.6
into ppc970.osdl.org:/home/torvalds/v2.6/linux
parents
f6c5dcb1
cfa0250d
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
260 additions
and
153 deletions
+260
-153
drivers/scsi/ata_piix.c
drivers/scsi/ata_piix.c
+1
-3
drivers/scsi/libata-core.c
drivers/scsi/libata-core.c
+26
-15
drivers/scsi/sata_promise.c
drivers/scsi/sata_promise.c
+3
-3
drivers/scsi/sata_sil.c
drivers/scsi/sata_sil.c
+68
-50
drivers/scsi/sata_svw.c
drivers/scsi/sata_svw.c
+4
-2
drivers/scsi/sata_via.c
drivers/scsi/sata_via.c
+154
-74
drivers/scsi/sata_vsc.c
drivers/scsi/sata_vsc.c
+3
-4
include/linux/libata.h
include/linux/libata.h
+1
-2
No files found.
drivers/scsi/ata_piix.c
View file @
7bcba5b0
...
...
@@ -16,7 +16,7 @@
May be copied or modified under the terms of the GNU General Public License
*/
#include <linux/config.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/pci.h>
...
...
@@ -125,7 +125,6 @@ static struct ata_port_operations piix_pata_ops = {
.
exec_command
=
ata_exec_command_pio
,
.
phy_reset
=
piix_pata_phy_reset
,
.
phy_config
=
pata_phy_config
,
.
bmdma_start
=
ata_bmdma_start_pio
,
.
fill_sg
=
ata_fill_sg
,
...
...
@@ -148,7 +147,6 @@ static struct ata_port_operations piix_sata_ops = {
.
exec_command
=
ata_exec_command_pio
,
.
phy_reset
=
piix_sata_phy_reset
,
.
phy_config
=
pata_phy_config
,
/* not a typo */
.
bmdma_start
=
ata_bmdma_start_pio
,
.
fill_sg
=
ata_fill_sg
,
...
...
drivers/scsi/libata-core.c
View file @
7bcba5b0
...
...
@@ -58,6 +58,7 @@ static void ata_host_set_pio(struct ata_port *ap);
static
void
ata_host_set_udma
(
struct
ata_port
*
ap
);
static
void
ata_dev_set_pio
(
struct
ata_port
*
ap
,
unsigned
int
device
);
static
void
ata_dev_set_udma
(
struct
ata_port
*
ap
,
unsigned
int
device
);
static
void
ata_set_mode
(
struct
ata_port
*
ap
);
static
unsigned
int
ata_unique_id
=
1
;
...
...
@@ -1031,7 +1032,7 @@ static void ata_port_reset(struct ata_port *ap)
if
((
!
found
)
||
(
ap
->
flags
&
ATA_FLAG_PORT_DISABLED
))
goto
err_out_disable
;
a
p
->
ops
->
phy_config
(
ap
);
a
ta_set_mode
(
ap
);
if
(
ap
->
flags
&
ATA_FLAG_PORT_DISABLED
)
goto
err_out_disable
;
...
...
@@ -1120,13 +1121,13 @@ void ata_port_disable(struct ata_port *ap)
}
/**
*
pata_phy_config -
* @ap:
*
ata_set_mode - Program timings and issue SET FEATURES - XFER
* @ap:
port on which timings will be programmed
*
* LOCKING:
*
*/
void
pata_phy_config
(
struct
ata_port
*
ap
)
static
void
ata_set_mode
(
struct
ata_port
*
ap
)
{
unsigned
int
force_pio
;
...
...
@@ -1158,6 +1159,8 @@ void pata_phy_config(struct ata_port *ap)
return
;
}
if
(
ap
->
ops
->
post_set_mode
)
ap
->
ops
->
post_set_mode
(
ap
);
}
/**
...
...
@@ -2263,9 +2266,12 @@ void ata_bmdma_start_mmio (struct ata_queued_cmd *qc)
mb
();
/* make sure PRD table writes are visible to controller */
writel
(
ap
->
prd_dma
,
mmio
+
ATA_DMA_TABLE_OFS
);
/* specify data direction */
/* FIXME: redundant to later start-dma command? */
writeb
(
rw
?
0
:
ATA_DMA_WR
,
mmio
+
ATA_DMA_CMD
);
/* specify data direction, triple-check start bit is clear */
dmactl
=
readb
(
mmio
+
ATA_DMA_CMD
);
dmactl
&=
~
(
ATA_DMA_WR
|
ATA_DMA_START
);
if
(
!
rw
)
dmactl
|=
ATA_DMA_WR
;
writeb
(
dmactl
,
mmio
+
ATA_DMA_CMD
);
/* clear interrupt, error bits */
host_stat
=
readb
(
mmio
+
ATA_DMA_STATUS
);
...
...
@@ -2275,7 +2281,6 @@ void ata_bmdma_start_mmio (struct ata_queued_cmd *qc)
ap
->
ops
->
exec_command
(
ap
,
&
qc
->
tf
);
/* start host DMA transaction */
dmactl
=
readb
(
mmio
+
ATA_DMA_CMD
);
writeb
(
dmactl
|
ATA_DMA_START
,
mmio
+
ATA_DMA_CMD
);
/* Strictly, one may wish to issue a readb() here, to
...
...
@@ -2308,9 +2313,12 @@ void ata_bmdma_start_pio (struct ata_queued_cmd *qc)
/* load PRD table addr. */
outl
(
ap
->
prd_dma
,
ap
->
ioaddr
.
bmdma_addr
+
ATA_DMA_TABLE_OFS
);
/* specify data direction */
/* FIXME: redundant to later start-dma command? */
outb
(
rw
?
0
:
ATA_DMA_WR
,
ap
->
ioaddr
.
bmdma_addr
+
ATA_DMA_CMD
);
/* specify data direction, triple-check start bit is clear */
dmactl
=
inb
(
ap
->
ioaddr
.
bmdma_addr
+
ATA_DMA_CMD
);
dmactl
&=
~
(
ATA_DMA_WR
|
ATA_DMA_START
);
if
(
!
rw
)
dmactl
|=
ATA_DMA_WR
;
outb
(
dmactl
,
ap
->
ioaddr
.
bmdma_addr
+
ATA_DMA_CMD
);
/* clear interrupt, error bits */
host_stat
=
inb
(
ap
->
ioaddr
.
bmdma_addr
+
ATA_DMA_STATUS
);
...
...
@@ -2321,7 +2329,6 @@ void ata_bmdma_start_pio (struct ata_queued_cmd *qc)
ap
->
ops
->
exec_command
(
ap
,
&
qc
->
tf
);
/* start host DMA transaction */
dmactl
=
inb
(
ap
->
ioaddr
.
bmdma_addr
+
ATA_DMA_CMD
);
outb
(
dmactl
|
ATA_DMA_START
,
ap
->
ioaddr
.
bmdma_addr
+
ATA_DMA_CMD
);
}
...
...
@@ -2344,14 +2351,16 @@ static void ata_dma_complete(struct ata_port *ap, u8 host_stat,
void
*
mmio
=
(
void
*
)
ap
->
ioaddr
.
bmdma_addr
;
/* clear start/stop bit */
writeb
(
0
,
mmio
+
ATA_DMA_CMD
);
writeb
(
readb
(
mmio
+
ATA_DMA_CMD
)
&
~
ATA_DMA_START
,
mmio
+
ATA_DMA_CMD
);
/* ack intr, err bits */
writeb
(
host_stat
|
ATA_DMA_INTR
|
ATA_DMA_ERR
,
mmio
+
ATA_DMA_STATUS
);
}
else
{
/* clear start/stop bit */
outb
(
0
,
ap
->
ioaddr
.
bmdma_addr
+
ATA_DMA_CMD
);
outb
(
inb
(
ap
->
ioaddr
.
bmdma_addr
+
ATA_DMA_CMD
)
&
~
ATA_DMA_START
,
ap
->
ioaddr
.
bmdma_addr
+
ATA_DMA_CMD
);
/* ack intr, err bits */
outb
(
host_stat
|
ATA_DMA_INTR
|
ATA_DMA_ERR
,
...
...
@@ -3138,6 +3147,9 @@ int ata_pci_init_one (struct pci_dev *pdev, struct ata_port_info **port_info,
}
rc
=
pci_set_dma_mask
(
pdev
,
ATA_DMA_MASK
);
if
(
rc
)
goto
err_out_regions
;
rc
=
pci_set_consistent_dma_mask
(
pdev
,
ATA_DMA_MASK
);
if
(
rc
)
goto
err_out_regions
;
...
...
@@ -3381,7 +3393,6 @@ EXPORT_SYMBOL_GPL(ata_bmdma_start_pio);
EXPORT_SYMBOL_GPL
(
ata_bmdma_start_mmio
);
EXPORT_SYMBOL_GPL
(
ata_port_probe
);
EXPORT_SYMBOL_GPL
(
sata_phy_reset
);
EXPORT_SYMBOL_GPL
(
pata_phy_config
);
EXPORT_SYMBOL_GPL
(
ata_bus_reset
);
EXPORT_SYMBOL_GPL
(
ata_port_disable
);
EXPORT_SYMBOL_GPL
(
ata_pci_init_one
);
...
...
drivers/scsi/sata_promise.c
View file @
7bcba5b0
...
...
@@ -21,7 +21,6 @@
*
*/
#include <linux/config.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/pci.h>
...
...
@@ -201,7 +200,6 @@ static struct ata_port_operations pdc_sata_ops = {
.
check_status
=
ata_check_status_mmio
,
.
exec_command
=
pdc_exec_command_mmio
,
.
phy_reset
=
sata_phy_reset
,
.
phy_config
=
pata_phy_config
,
/* not a typo */
.
bmdma_start
=
pdc_dma_start
,
.
fill_sg
=
pdc_fill_sg
,
.
eng_timeout
=
pdc_eng_timeout
,
...
...
@@ -219,7 +217,6 @@ static struct ata_port_operations pdc_20621_ops = {
.
check_status
=
ata_check_status_mmio
,
.
exec_command
=
pdc_exec_command_mmio
,
.
phy_reset
=
pdc_20621_phy_reset
,
.
phy_config
=
pata_phy_config
,
/* not a typo */
.
bmdma_start
=
pdc20621_dma_start
,
.
fill_sg
=
pdc20621_fill_sg
,
.
eng_timeout
=
pdc_eng_timeout
,
...
...
@@ -1670,6 +1667,9 @@ static int pdc_sata_init_one (struct pci_dev *pdev, const struct pci_device_id *
goto
err_out
;
rc
=
pci_set_dma_mask
(
pdev
,
ATA_DMA_MASK
);
if
(
rc
)
goto
err_out_regions
;
rc
=
pci_set_consistent_dma_mask
(
pdev
,
ATA_DMA_MASK
);
if
(
rc
)
goto
err_out_regions
;
...
...
drivers/scsi/sata_sil.c
View file @
7bcba5b0
...
...
@@ -22,7 +22,6 @@
*
*/
#include <linux/config.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/pci.h>
...
...
@@ -50,27 +49,9 @@ enum {
SIL_MASK_4PORT
=
SIL_MASK_2PORT
|
SIL_MASK_IDE2_INT
|
SIL_MASK_IDE3_INT
,
SIL_IDE0_TF
=
0x80
,
SIL_IDE0_CTL
=
0x8A
,
SIL_IDE0_BMDMA
=
0x00
,
SIL_IDE0_SCR
=
0x100
,
SIL_IDE1_TF
=
0xC0
,
SIL_IDE1_CTL
=
0xCA
,
SIL_IDE1_BMDMA
=
0x08
,
SIL_IDE1_SCR
=
0x180
,
SIL_IDE2_TF
=
0x280
,
SIL_IDE2_CTL
=
0x28A
,
SIL_IDE2_BMDMA
=
0x200
,
SIL_IDE2_SCR
=
0x300
,
SIL_INTR_STEERING
=
(
1
<<
1
),
SIL_IDE3_TF
=
0x2C0
,
SIL_IDE3_CTL
=
0x2CA
,
SIL_IDE3_BMDMA
=
0x208
,
SIL_IDE3_SCR
=
0x380
,
SIL_INTR_STEERING
=
(
1
<<
1
),
SIL_QUIRK_MOD15WRITE
=
(
1
<<
0
),
SIL_QUIRK_UDMA5MAX
=
(
1
<<
1
),
};
...
...
@@ -79,6 +60,7 @@ static int sil_init_one (struct pci_dev *pdev, const struct pci_device_id *ent);
static
void
sil_dev_config
(
struct
ata_port
*
ap
,
struct
ata_device
*
dev
);
static
u32
sil_scr_read
(
struct
ata_port
*
ap
,
unsigned
int
sc_reg
);
static
void
sil_scr_write
(
struct
ata_port
*
ap
,
unsigned
int
sc_reg
,
u32
val
);
static
void
sil_post_set_mode
(
struct
ata_port
*
ap
);
static
struct
pci_device_id
sil_pci_tbl
[]
=
{
{
0x1095
,
0x3112
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
sil_3112
},
...
...
@@ -142,7 +124,7 @@ static struct ata_port_operations sil_ops = {
.
check_status
=
ata_check_status_mmio
,
.
exec_command
=
ata_exec_command_mmio
,
.
phy_reset
=
sata_phy_reset
,
.
p
hy_config
=
pata_phy_config
,
/* not a typo */
.
p
ost_set_mode
=
sil_post_set_mode
,
.
bmdma_start
=
ata_bmdma_start_mmio
,
.
fill_sg
=
ata_fill_sg
,
.
eng_timeout
=
ata_eng_timeout
,
...
...
@@ -160,7 +142,7 @@ static struct ata_port_info sil_port_info[] = {
.
host_flags
=
ATA_FLAG_SATA
|
ATA_FLAG_NO_LEGACY
|
ATA_FLAG_SRST
|
ATA_FLAG_MMIO
,
.
pio_mask
=
0x03
,
/* pio3-4 */
.
udma_mask
=
0x
7f
,
/* udma0-6; FIXME
*/
.
udma_mask
=
0x
3f
,
/* udma0-5
*/
.
port_ops
=
&
sil_ops
,
},
/* sil_3114 */
{
...
...
@@ -168,16 +150,61 @@ static struct ata_port_info sil_port_info[] = {
.
host_flags
=
ATA_FLAG_SATA
|
ATA_FLAG_NO_LEGACY
|
ATA_FLAG_SRST
|
ATA_FLAG_MMIO
,
.
pio_mask
=
0x03
,
/* pio3-4 */
.
udma_mask
=
0x
7f
,
/* udma0-6; FIXME
*/
.
udma_mask
=
0x
3f
,
/* udma0-5
*/
.
port_ops
=
&
sil_ops
,
},
};
/* per-port register offsets */
/* TODO: we can probably calculate rather than use a table */
static
const
struct
{
unsigned
long
tf
;
/* ATA taskfile register block */
unsigned
long
ctl
;
/* ATA control/altstatus register block */
unsigned
long
bmdma
;
/* DMA register block */
unsigned
long
scr
;
/* SATA control register block */
unsigned
long
sien
;
/* SATA Interrupt Enable register */
unsigned
long
xfer_mode
;
/* data transfer mode register */
}
sil_port
[]
=
{
/* port 0 ... */
{
0x80
,
0x8A
,
0x00
,
0x100
,
0x148
,
0xb4
},
{
0xC0
,
0xCA
,
0x08
,
0x180
,
0x1c8
,
0xf4
},
{
0x280
,
0x28A
,
0x200
,
0x300
,
0x348
,
0x2b4
},
{
0x2C0
,
0x2CA
,
0x208
,
0x380
,
0x3c8
,
0x2f4
},
/* ... port 3 */
};
MODULE_AUTHOR
(
"Jeff Garzik"
);
MODULE_DESCRIPTION
(
"low-level driver for Silicon Image SATA controller"
);
MODULE_LICENSE
(
"GPL"
);
MODULE_DEVICE_TABLE
(
pci
,
sil_pci_tbl
);
static
void
sil_post_set_mode
(
struct
ata_port
*
ap
)
{
struct
ata_host_set
*
host_set
=
ap
->
host_set
;
struct
ata_device
*
dev
;
void
*
addr
=
host_set
->
mmio_base
+
sil_port
[
ap
->
port_no
].
xfer_mode
;
u32
tmp
,
dev_mode
[
2
];
unsigned
int
i
;
for
(
i
=
0
;
i
<
2
;
i
++
)
{
dev
=
&
ap
->
device
[
i
];
if
(
!
ata_dev_present
(
dev
))
dev_mode
[
i
]
=
0
;
/* PIO0/1/2 */
else
if
(
dev
->
flags
&
ATA_DFLAG_PIO
)
dev_mode
[
i
]
=
1
;
/* PIO3/4 */
else
dev_mode
[
i
]
=
3
;
/* UDMA */
/* value 2 indicates MDMA */
}
tmp
=
readl
(
addr
);
tmp
&=
~
((
1
<<
5
)
|
(
1
<<
4
)
|
(
1
<<
1
)
|
(
1
<<
0
));
tmp
|=
dev_mode
[
0
];
tmp
|=
(
dev_mode
[
1
]
<<
4
);
writel
(
tmp
,
addr
);
readl
(
addr
);
/* flush */
}
static
inline
unsigned
long
sil_scr_addr
(
struct
ata_port
*
ap
,
unsigned
int
sc_reg
)
{
unsigned
long
offset
=
ap
->
ioaddr
.
scr_addr
;
...
...
@@ -283,6 +310,7 @@ static int sil_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
unsigned
long
base
;
void
*
mmio_base
;
int
rc
;
unsigned
int
i
;
u32
tmp
,
irq_mask
;
if
(
!
printed_version
++
)
...
...
@@ -301,6 +329,9 @@ static int sil_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
goto
err_out
;
rc
=
pci_set_dma_mask
(
pdev
,
ATA_DMA_MASK
);
if
(
rc
)
goto
err_out_regions
;
rc
=
pci_set_consistent_dma_mask
(
pdev
,
ATA_DMA_MASK
);
if
(
rc
)
goto
err_out_regions
;
...
...
@@ -332,35 +363,17 @@ static int sil_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
probe_ent
->
mmio_base
=
mmio_base
;
base
=
(
unsigned
long
)
mmio_base
;
probe_ent
->
port
[
0
].
cmd_addr
=
base
+
SIL_IDE0_TF
;
probe_ent
->
port
[
0
].
altstatus_addr
=
probe_ent
->
port
[
0
].
ctl_addr
=
base
+
SIL_IDE0_CTL
;
probe_ent
->
port
[
0
].
bmdma_addr
=
base
+
SIL_IDE0_BMDMA
;
probe_ent
->
port
[
0
].
scr_addr
=
base
+
SIL_IDE0_SCR
;
ata_std_ports
(
&
probe_ent
->
port
[
0
]);
probe_ent
->
port
[
1
].
cmd_addr
=
base
+
SIL_IDE1_TF
;
probe_ent
->
port
[
1
].
altstatus_addr
=
probe_ent
->
port
[
1
].
ctl_addr
=
base
+
SIL_IDE1_CTL
;
probe_ent
->
port
[
1
].
bmdma_addr
=
base
+
SIL_IDE1_BMDMA
;
probe_ent
->
port
[
1
].
scr_addr
=
base
+
SIL_IDE1_SCR
;
ata_std_ports
(
&
probe_ent
->
port
[
1
]);
if
(
ent
->
driver_data
==
sil_3114
)
{
probe_ent
->
port
[
2
].
cmd_addr
=
base
+
SIL_IDE2_TF
;
probe_ent
->
port
[
2
].
altstatus_addr
=
probe_ent
->
port
[
2
].
ctl_addr
=
base
+
SIL_IDE2_CTL
;
probe_ent
->
port
[
2
].
bmdma_addr
=
base
+
SIL_IDE2_BMDMA
;
probe_ent
->
port
[
2
].
scr_addr
=
base
+
SIL_IDE2_SCR
;
ata_std_ports
(
&
probe_ent
->
port
[
2
]);
probe_ent
->
port
[
3
].
cmd_addr
=
base
+
SIL_IDE3_TF
;
probe_ent
->
port
[
3
].
altstatus_addr
=
probe_ent
->
port
[
3
].
ctl_addr
=
base
+
SIL_IDE3_CTL
;
probe_ent
->
port
[
3
].
bmdma_addr
=
base
+
SIL_IDE3_BMDMA
;
probe_ent
->
port
[
3
].
scr_addr
=
base
+
SIL_IDE3_SCR
;
ata_std_ports
(
&
probe_ent
->
port
[
3
]);
for
(
i
=
0
;
i
<
probe_ent
->
n_ports
;
i
++
)
{
probe_ent
->
port
[
i
].
cmd_addr
=
base
+
sil_port
[
i
].
tf
;
probe_ent
->
port
[
i
].
altstatus_addr
=
probe_ent
->
port
[
i
].
ctl_addr
=
base
+
sil_port
[
i
].
ctl
;
probe_ent
->
port
[
i
].
bmdma_addr
=
base
+
sil_port
[
i
].
bmdma
;
probe_ent
->
port
[
i
].
scr_addr
=
base
+
sil_port
[
i
].
scr
;
ata_std_ports
(
&
probe_ent
->
port
[
i
]);
}
if
(
ent
->
driver_data
==
sil_3114
)
{
irq_mask
=
SIL_MASK_4PORT
;
/* flip the magic "make 4 ports work" bit */
...
...
@@ -381,6 +394,11 @@ static int sil_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
readl
(
mmio_base
+
SIL_SYSCFG
);
/* flush */
}
/* mask all SATA phy-related interrupts */
/* TODO: unmask bit 6 (SError N bit) for hotplug */
for
(
i
=
0
;
i
<
probe_ent
->
n_ports
;
i
++
)
writel
(
0
,
mmio_base
+
sil_port
[
i
].
sien
);
pci_set_master
(
pdev
);
/* FIXME: check ata_device_add return value */
...
...
drivers/scsi/sata_svw.c
View file @
7bcba5b0
...
...
@@ -226,7 +226,6 @@ static struct ata_port_operations k2_sata_ops = {
.
check_status
=
k2_stat_check_status
,
.
exec_command
=
ata_exec_command_mmio
,
.
phy_reset
=
sata_phy_reset
,
.
phy_config
=
pata_phy_config
,
/* not a typo */
.
bmdma_start
=
ata_bmdma_start_mmio
,
.
fill_sg
=
ata_fill_sg
,
.
eng_timeout
=
ata_eng_timeout
,
...
...
@@ -288,6 +287,9 @@ static int k2_sata_init_one (struct pci_dev *pdev, const struct pci_device_id *e
goto
err_out
;
rc
=
pci_set_dma_mask
(
pdev
,
ATA_DMA_MASK
);
if
(
rc
)
goto
err_out_regions
;
rc
=
pci_set_consistent_dma_mask
(
pdev
,
ATA_DMA_MASK
);
if
(
rc
)
goto
err_out_regions
;
...
...
@@ -333,7 +335,7 @@ static int k2_sata_init_one (struct pci_dev *pdev, const struct pci_device_id *e
* if we don't fill these
*/
probe_ent
->
pio_mask
=
0x1f
;
probe_ent
->
udma_mask
=
0x
3
f
;
probe_ent
->
udma_mask
=
0x
7
f
;
/* We have 4 ports per PCI function */
k2_sata_setup_port
(
&
probe_ent
->
port
[
0
],
base
+
0
*
K2_SATA_PORT_OFFSET
);
...
...
drivers/scsi/sata_via.c
View file @
7bcba5b0
...
...
@@ -22,7 +22,6 @@
*/
#include <linux/config.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/pci.h>
...
...
@@ -32,19 +31,31 @@
#include "scsi.h"
#include "hosts.h"
#include <linux/libata.h>
#include <asm/io.h>
#define DRV_NAME "sata_via"
#define DRV_VERSION "0.
11
"
#define DRV_VERSION "0.
20
"
enum
{
via_sata
=
0
,
SATA_CHAN_ENAB
=
0x40
,
SATA_INT_GATE
=
0x41
,
SATA_NATIVE_MODE
=
0x42
,
PORT0
=
(
1
<<
1
),
PORT1
=
(
1
<<
0
),
ENAB_ALL
=
PORT0
|
PORT1
,
INT_GATE_ALL
=
PORT0
|
PORT1
,
NATIVE_MODE_ALL
=
(
1
<<
7
)
|
(
1
<<
6
)
|
(
1
<<
5
)
|
(
1
<<
4
),
};
static
int
svia_init_one
(
struct
pci_dev
*
pdev
,
const
struct
pci_device_id
*
ent
);
static
void
svia_sata_phy_reset
(
struct
ata_port
*
ap
);
static
void
svia_port_disable
(
struct
ata_port
*
ap
);
static
unsigned
int
in_module_init
=
1
;
static
u32
svia_scr_read
(
struct
ata_port
*
ap
,
unsigned
int
sc_reg
);
static
void
svia_scr_write
(
struct
ata_port
*
ap
,
unsigned
int
sc_reg
,
u32
val
);
static
struct
pci_device_id
svia_pci_tbl
[]
=
{
{
0x1106
,
0x3149
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
via_sata
},
...
...
@@ -78,15 +89,14 @@ static Scsi_Host_Template svia_sht = {
};
static
struct
ata_port_operations
svia_sata_ops
=
{
.
port_disable
=
svi
a_port_disable
,
.
port_disable
=
at
a_port_disable
,
.
tf_load
=
ata_tf_load_pio
,
.
tf_read
=
ata_tf_read_pio
,
.
check_status
=
ata_check_status_pio
,
.
exec_command
=
ata_exec_command_pio
,
.
phy_reset
=
svia_sata_phy_reset
,
.
phy_config
=
pata_phy_config
,
/* not a typo */
.
phy_reset
=
sata_phy_reset
,
.
bmdma_start
=
ata_bmdma_start_pio
,
.
fill_sg
=
ata_fill_sg
,
...
...
@@ -94,70 +104,45 @@ static struct ata_port_operations svia_sata_ops = {
.
irq_handler
=
ata_interrupt
,
.
scr_read
=
svia_scr_read
,
.
scr_write
=
svia_scr_write
,
.
port_start
=
ata_port_start
,
.
port_stop
=
ata_port_stop
,
};
static
struct
ata_port_info
svia_port_info
[]
=
{
/* via_sata */
{
.
sht
=
&
svia_sht
,
.
host_flags
=
ATA_FLAG_SATA
|
ATA_FLAG_NO_LEGACY
|
ATA_FLAG_SRST
,
.
pio_mask
=
0x03
,
/* pio3-4 */
.
udma_mask
=
0x7f
,
/* udma0-6 ; FIXME */
.
port_ops
=
&
svia_sata_ops
,
},
};
static
struct
pci_bits
svia_enable_bits
[]
=
{
{
0x40U
,
1U
,
0x02UL
,
0x02UL
},
/* port 0 */
{
0x40U
,
1U
,
0x01UL
,
0x01UL
},
/* port 1 */
};
MODULE_AUTHOR
(
"Jeff Garzik"
);
MODULE_DESCRIPTION
(
"SCSI low-level driver for VIA SATA controllers"
);
MODULE_LICENSE
(
"GPL"
);
MODULE_DEVICE_TABLE
(
pci
,
svia_pci_tbl
);
/**
* svia_sata_phy_reset -
* @ap:
*
* LOCKING:
*
*/
static
void
svia_sata_phy_reset
(
struct
ata_port
*
ap
)
static
u32
svia_scr_read
(
struct
ata_port
*
ap
,
unsigned
int
sc_reg
)
{
if
(
!
pci_test_config_bits
(
ap
->
host_set
->
pdev
,
&
svia_enable_bits
[
ap
->
port_no
]))
{
ata_port_disable
(
ap
);
printk
(
KERN_INFO
"ata%u: port disabled. ignoring.
\n
"
,
ap
->
id
);
return
;
}
if
(
sc_reg
>
SCR_CONTROL
)
return
0xffffffffU
;
return
inl
(
ap
->
ioaddr
.
scr_addr
+
(
4
*
sc_reg
));
}
ata_port_probe
(
ap
);
if
(
ap
->
flags
&
ATA_FLAG_PORT_DISABLED
)
static
void
svia_scr_write
(
struct
ata_port
*
ap
,
unsigned
int
sc_reg
,
u32
val
)
{
if
(
sc_reg
>
SCR_CONTROL
)
return
;
ata_bus_reset
(
ap
);
outl
(
val
,
ap
->
ioaddr
.
scr_addr
+
(
4
*
sc_reg
));
}
/**
* svia_port_disable -
* @ap:
*
* LOCKING:
*
*/
static
const
unsigned
int
svia_bar_sizes
[]
=
{
8
,
4
,
8
,
4
,
16
,
256
};
static
void
svia_port_disable
(
struct
ata_port
*
ap
)
static
unsigned
long
svia_scr_addr
(
unsigned
long
addr
,
unsigned
int
port
)
{
ata_port_disable
(
ap
);
if
(
port
>=
4
)
return
0
;
/* invalid port */
addr
&=
~
((
1
<<
7
)
|
(
1
<<
6
));
addr
|=
((
unsigned
long
)
port
<<
6
);
/* FIXME */
return
addr
;
}
/**
...
...
@@ -174,19 +159,124 @@ static void svia_port_disable(struct ata_port *ap)
static
int
svia_init_one
(
struct
pci_dev
*
pdev
,
const
struct
pci_device_id
*
ent
)
{
static
int
printed_version
;
struct
ata_port_info
*
port_info
[
1
];
unsigned
int
n_ports
=
1
;
unsigned
int
i
;
int
rc
;
struct
ata_probe_ent
*
probe_ent
;
u8
tmp8
;
if
(
!
printed_version
++
)
printk
(
KERN_DEBUG
DRV_NAME
" version "
DRV_VERSION
"
\n
"
);
/* no hotplugging support (FIXME) */
if
(
!
in_module_init
)
return
-
ENODEV
;
rc
=
pci_enable_device
(
pdev
);
if
(
rc
)
return
rc
;
rc
=
pci_request_regions
(
pdev
,
DRV_NAME
);
if
(
rc
)
goto
err_out
;
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
svia_bar_sizes
);
i
++
)
if
((
pci_resource_start
(
pdev
,
i
)
==
0
)
||
(
pci_resource_len
(
pdev
,
i
)
<
svia_bar_sizes
[
i
]))
{
printk
(
KERN_ERR
DRV_NAME
"(%s): invalid PCI BAR %u (sz 0x%lx, val 0x%lx)
\n
"
,
pci_name
(
pdev
),
i
,
pci_resource_start
(
pdev
,
i
),
pci_resource_len
(
pdev
,
i
));
rc
=
-
ENODEV
;
goto
err_out_regions
;
}
rc
=
pci_set_dma_mask
(
pdev
,
ATA_DMA_MASK
);
if
(
rc
)
goto
err_out_regions
;
rc
=
pci_set_consistent_dma_mask
(
pdev
,
ATA_DMA_MASK
);
if
(
rc
)
goto
err_out_regions
;
probe_ent
=
kmalloc
(
sizeof
(
*
probe_ent
),
GFP_KERNEL
);
if
(
!
probe_ent
)
{
printk
(
KERN_ERR
DRV_NAME
"(%s): out of memory
\n
"
,
pci_name
(
pdev
));
rc
=
-
ENOMEM
;
goto
err_out_regions
;
}
memset
(
probe_ent
,
0
,
sizeof
(
*
probe_ent
));
INIT_LIST_HEAD
(
&
probe_ent
->
node
);
probe_ent
->
pdev
=
pdev
;
probe_ent
->
sht
=
&
svia_sht
;
probe_ent
->
host_flags
=
ATA_FLAG_SATA
|
ATA_FLAG_SATA_RESET
|
ATA_FLAG_NO_LEGACY
;
probe_ent
->
port_ops
=
&
svia_sata_ops
;
probe_ent
->
n_ports
=
2
;
probe_ent
->
irq
=
pdev
->
irq
;
probe_ent
->
irq_flags
=
SA_SHIRQ
;
probe_ent
->
pio_mask
=
0x1f
;
probe_ent
->
udma_mask
=
0x7f
;
probe_ent
->
port
[
0
].
cmd_addr
=
pci_resource_start
(
pdev
,
0
);
ata_std_ports
(
&
probe_ent
->
port
[
0
]);
probe_ent
->
port
[
0
].
altstatus_addr
=
probe_ent
->
port
[
0
].
ctl_addr
=
pci_resource_start
(
pdev
,
1
)
|
ATA_PCI_CTL_OFS
;
probe_ent
->
port
[
0
].
bmdma_addr
=
pci_resource_start
(
pdev
,
4
);
probe_ent
->
port
[
0
].
scr_addr
=
svia_scr_addr
(
pci_resource_start
(
pdev
,
5
),
0
);
probe_ent
->
port
[
1
].
cmd_addr
=
pci_resource_start
(
pdev
,
2
);
ata_std_ports
(
&
probe_ent
->
port
[
1
]);
probe_ent
->
port
[
1
].
altstatus_addr
=
probe_ent
->
port
[
1
].
ctl_addr
=
pci_resource_start
(
pdev
,
3
)
|
ATA_PCI_CTL_OFS
;
probe_ent
->
port
[
1
].
bmdma_addr
=
pci_resource_start
(
pdev
,
4
)
+
8
;
probe_ent
->
port
[
1
].
scr_addr
=
svia_scr_addr
(
pci_resource_start
(
pdev
,
5
),
1
);
pci_read_config_byte
(
pdev
,
PCI_INTERRUPT_LINE
,
&
tmp8
);
printk
(
KERN_INFO
DRV_NAME
"(%s): routed to hard irq line %d
\n
"
,
pci_name
(
pdev
),
(
int
)
(
tmp8
&
0xf0
)
==
0xf0
?
0
:
tmp8
&
0x0f
);
/* make sure SATA channels are enabled */
pci_read_config_byte
(
pdev
,
SATA_CHAN_ENAB
,
&
tmp8
);
if
((
tmp8
&
ENAB_ALL
)
!=
ENAB_ALL
)
{
printk
(
KERN_DEBUG
DRV_NAME
"(%s): enabling SATA channels (0x%x)
\n
"
,
pci_name
(
pdev
),
(
int
)
tmp8
);
tmp8
|=
ENAB_ALL
;
pci_write_config_byte
(
pdev
,
SATA_CHAN_ENAB
,
tmp8
);
}
/* make sure interrupts for each channel sent to us */
pci_read_config_byte
(
pdev
,
SATA_INT_GATE
,
&
tmp8
);
if
((
tmp8
&
INT_GATE_ALL
)
!=
INT_GATE_ALL
)
{
printk
(
KERN_DEBUG
DRV_NAME
"(%s): enabling SATA channel interrupts (0x%x)
\n
"
,
pci_name
(
pdev
),
(
int
)
tmp8
);
tmp8
|=
INT_GATE_ALL
;
pci_write_config_byte
(
pdev
,
SATA_INT_GATE
,
tmp8
);
}
/* make sure native mode is enabled */
pci_read_config_byte
(
pdev
,
SATA_NATIVE_MODE
,
&
tmp8
);
if
((
tmp8
&
NATIVE_MODE_ALL
)
!=
NATIVE_MODE_ALL
)
{
printk
(
KERN_DEBUG
DRV_NAME
"(%s): enabling SATA channel native mode (0x%x)
\n
"
,
pci_name
(
pdev
),
(
int
)
tmp8
);
tmp8
|=
NATIVE_MODE_ALL
;
pci_write_config_byte
(
pdev
,
SATA_NATIVE_MODE
,
tmp8
);
}
port_info
[
0
]
=
&
svia_port_info
[
ent
->
driver_data
];
pci_set_master
(
pdev
);
/* FIXME: check ata_device_add return value */
ata_device_add
(
probe_ent
);
kfree
(
probe_ent
);
return
0
;
return
ata_pci_init_one
(
pdev
,
port_info
,
n_ports
);
err_out_regions:
pci_release_regions
(
pdev
);
err_out:
pci_disable_device
(
pdev
);
return
rc
;
}
/**
...
...
@@ -200,17 +290,7 @@ static int svia_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
static
int
__init
svia_init
(
void
)
{
int
rc
;
DPRINTK
(
"pci_module_init
\n
"
);
rc
=
pci_module_init
(
&
svia_pci_driver
);
if
(
rc
)
return
rc
;
in_module_init
=
0
;
DPRINTK
(
"done
\n
"
);
return
0
;
return
pci_module_init
(
&
svia_pci_driver
);
}
/**
...
...
drivers/scsi/sata_vsc.c
View file @
7bcba5b0
...
...
@@ -207,7 +207,6 @@ static struct ata_port_operations vsc_sata_ops = {
.
exec_command
=
ata_exec_command_mmio
,
.
check_status
=
ata_check_status_mmio
,
.
phy_reset
=
sata_phy_reset
,
.
phy_config
=
pata_phy_config
,
/* not a typo */
.
bmdma_start
=
ata_bmdma_start_mmio
,
.
fill_sg
=
ata_fill_sg
,
.
eng_timeout
=
ata_eng_timeout
,
...
...
@@ -268,10 +267,10 @@ static int __devinit vsc_sata_init_one (struct pci_dev *pdev, const struct pci_d
/*
* Use 32 bit DMA mask, because 64 bit address support is poor.
*/
rc
=
pci_set_dma_mask
(
pdev
,
0xFFFFFFFF
);
rc
=
pci_set_dma_mask
(
pdev
,
0xFFFFFFFF
ULL
);
if
(
rc
)
goto
err_out_regions
;
rc
=
pci_set_consistent_dma_mask
(
pdev
,
0xFFFFFFFF
);
rc
=
pci_set_consistent_dma_mask
(
pdev
,
0xFFFFFFFF
ULL
);
if
(
rc
)
goto
err_out_regions
;
...
...
@@ -310,7 +309,7 @@ static int __devinit vsc_sata_init_one (struct pci_dev *pdev, const struct pci_d
* if we don't fill these
*/
probe_ent
->
pio_mask
=
0x1f
;
probe_ent
->
udma_mask
=
0x
3
f
;
probe_ent
->
udma_mask
=
0x
7
f
;
/* We have 4 ports per PCI function */
vsc_sata_setup_port
(
&
probe_ent
->
port
[
0
],
base
+
1
*
VSC_SATA_PORT_OFFSET
);
...
...
include/linux/libata.h
View file @
7bcba5b0
...
...
@@ -362,7 +362,7 @@ struct ata_port_operations {
u8
(
*
check_status
)(
struct
ata_port
*
ap
);
void
(
*
phy_reset
)
(
struct
ata_port
*
ap
);
void
(
*
p
hy_config
)
(
struct
ata_port
*
ap
);
void
(
*
p
ost_set_mode
)
(
struct
ata_port
*
ap
);
void
(
*
bmdma_start
)
(
struct
ata_queued_cmd
*
qc
);
void
(
*
fill_sg
)
(
struct
ata_queued_cmd
*
qc
);
...
...
@@ -396,7 +396,6 @@ struct pci_bits {
};
extern
void
ata_port_probe
(
struct
ata_port
*
);
extern
void
pata_phy_config
(
struct
ata_port
*
ap
);
extern
void
sata_phy_reset
(
struct
ata_port
*
ap
);
extern
void
ata_bus_reset
(
struct
ata_port
*
ap
);
extern
void
ata_port_disable
(
struct
ata_port
*
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment