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
6db492bc
Commit
6db492bc
authored
Oct 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
6df3af84
49093583
Changes
8
Show whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
334 additions
and
33 deletions
+334
-33
drivers/scsi/Kconfig
drivers/scsi/Kconfig
+8
-0
drivers/scsi/Makefile
drivers/scsi/Makefile
+1
-0
drivers/scsi/ata_piix.c
drivers/scsi/ata_piix.c
+13
-13
drivers/scsi/libata-core.c
drivers/scsi/libata-core.c
+8
-0
drivers/scsi/libata-scsi.c
drivers/scsi/libata-scsi.c
+1
-1
drivers/scsi/sata_nv.c
drivers/scsi/sata_nv.c
+19
-19
drivers/scsi/sata_uli.c
drivers/scsi/sata_uli.c
+282
-0
include/linux/libata.h
include/linux/libata.h
+2
-0
No files found.
drivers/scsi/Kconfig
View file @
6db492bc
...
@@ -465,6 +465,14 @@ config SCSI_SATA_SIS
...
@@ -465,6 +465,14 @@ config SCSI_SATA_SIS
If unsure, say N.
If unsure, say N.
config SCSI_SATA_ULI
tristate "ULi Electronics SATA support"
depends on SCSI_SATA && PCI && EXPERIMENTAL
help
This option enables support for ULi Electronics SATA.
If unsure, say N.
config SCSI_SATA_VIA
config SCSI_SATA_VIA
tristate "VIA SATA support"
tristate "VIA SATA support"
depends on SCSI_SATA && PCI && EXPERIMENTAL
depends on SCSI_SATA && PCI && EXPERIMENTAL
...
...
drivers/scsi/Makefile
View file @
6db492bc
...
@@ -130,6 +130,7 @@ obj-$(CONFIG_SCSI_SATA_VITESSE) += libata.o sata_vsc.o
...
@@ -130,6 +130,7 @@ obj-$(CONFIG_SCSI_SATA_VITESSE) += libata.o sata_vsc.o
obj-$(CONFIG_SCSI_SATA_SIS)
+=
libata.o sata_sis.o
obj-$(CONFIG_SCSI_SATA_SIS)
+=
libata.o sata_sis.o
obj-$(CONFIG_SCSI_SATA_SX4)
+=
libata.o sata_sx4.o
obj-$(CONFIG_SCSI_SATA_SX4)
+=
libata.o sata_sx4.o
obj-$(CONFIG_SCSI_SATA_NV)
+=
libata.o sata_nv.o
obj-$(CONFIG_SCSI_SATA_NV)
+=
libata.o sata_nv.o
obj-$(CONFIG_SCSI_SATA_ULI)
+=
libata.o sata_uli.o
obj-$(CONFIG_ARM)
+=
arm/
obj-$(CONFIG_ARM)
+=
arm/
...
...
drivers/scsi/ata_piix.c
View file @
6db492bc
...
@@ -184,7 +184,7 @@ static struct ata_port_info piix_port_info[] = {
...
@@ -184,7 +184,7 @@ static struct ata_port_info piix_port_info[] = {
#else
#else
.
mwdma_mask
=
0x00
,
/* mwdma broken */
.
mwdma_mask
=
0x00
,
/* mwdma broken */
#endif
#endif
.
udma_mask
=
ATA_UDMA_MASK_40C
,
/* FIXME: cbl det
*/
.
udma_mask
=
0x3f
,
/* udma0-5
*/
.
port_ops
=
&
piix_pata_ops
,
.
port_ops
=
&
piix_pata_ops
,
},
},
...
@@ -209,7 +209,7 @@ static struct ata_port_info piix_port_info[] = {
...
@@ -209,7 +209,7 @@ static struct ata_port_info piix_port_info[] = {
#else
#else
.
mwdma_mask
=
0x00
,
/* mwdma broken */
.
mwdma_mask
=
0x00
,
/* mwdma broken */
#endif
#endif
.
udma_mask
=
ATA_UDMA_MASK_40C
,
/* FIXME: cbl det */
.
udma_mask
=
ATA_UDMA_MASK_40C
,
.
port_ops
=
&
piix_pata_ops
,
.
port_ops
=
&
piix_pata_ops
,
},
},
...
@@ -252,7 +252,7 @@ MODULE_DEVICE_TABLE(pci, piix_pci_tbl);
...
@@ -252,7 +252,7 @@ MODULE_DEVICE_TABLE(pci, piix_pci_tbl);
* piix_pata_cbl_detect - Probe host controller cable detect info
* piix_pata_cbl_detect - Probe host controller cable detect info
* @ap: Port for which cable detect info is desired
* @ap: Port for which cable detect info is desired
*
*
* Read 80c cable indicator from
S
ATA PCI device's PCI config
* Read 80c cable indicator from ATA PCI device's PCI config
* register. This register is normally set by firmware (BIOS).
* register. This register is normally set by firmware (BIOS).
*
*
* LOCKING:
* LOCKING:
...
@@ -268,7 +268,7 @@ static void piix_pata_cbl_detect(struct ata_port *ap)
...
@@ -268,7 +268,7 @@ static void piix_pata_cbl_detect(struct ata_port *ap)
goto
cbl40
;
goto
cbl40
;
/* check BIOS cable detect results */
/* check BIOS cable detect results */
mask
=
ap
->
port_no
==
0
?
PIIX_80C_PRI
:
PIIX_80C_SEC
;
mask
=
ap
->
hard_
port_no
==
0
?
PIIX_80C_PRI
:
PIIX_80C_SEC
;
pci_read_config_byte
(
pdev
,
PIIX_IOCFG
,
&
tmp
);
pci_read_config_byte
(
pdev
,
PIIX_IOCFG
,
&
tmp
);
if
((
tmp
&
mask
)
==
0
)
if
((
tmp
&
mask
)
==
0
)
goto
cbl40
;
goto
cbl40
;
...
@@ -294,7 +294,7 @@ static void piix_pata_cbl_detect(struct ata_port *ap)
...
@@ -294,7 +294,7 @@ static void piix_pata_cbl_detect(struct ata_port *ap)
static
void
piix_pata_phy_reset
(
struct
ata_port
*
ap
)
static
void
piix_pata_phy_reset
(
struct
ata_port
*
ap
)
{
{
if
(
!
pci_test_config_bits
(
ap
->
host_set
->
pdev
,
if
(
!
pci_test_config_bits
(
ap
->
host_set
->
pdev
,
&
piix_enable_bits
[
ap
->
port_no
]))
{
&
piix_enable_bits
[
ap
->
hard_
port_no
]))
{
ata_port_disable
(
ap
);
ata_port_disable
(
ap
);
printk
(
KERN_INFO
"ata%u: port disabled. ignoring.
\n
"
,
ap
->
id
);
printk
(
KERN_INFO
"ata%u: port disabled. ignoring.
\n
"
,
ap
->
id
);
return
;
return
;
...
@@ -327,8 +327,8 @@ static int piix_sata_probe (struct ata_port *ap)
...
@@ -327,8 +327,8 @@ static int piix_sata_probe (struct ata_port *ap)
int
orig_mask
,
mask
,
i
;
int
orig_mask
,
mask
,
i
;
u8
pcs
;
u8
pcs
;
mask
=
(
PIIX_PORT_PRESENT
<<
ap
->
port_no
)
|
mask
=
(
PIIX_PORT_PRESENT
<<
ap
->
hard_
port_no
)
|
(
PIIX_PORT_ENABLED
<<
ap
->
port_no
);
(
PIIX_PORT_ENABLED
<<
ap
->
hard_
port_no
);
pci_read_config_byte
(
pdev
,
ICH5_PCS
,
&
pcs
);
pci_read_config_byte
(
pdev
,
ICH5_PCS
,
&
pcs
);
orig_mask
=
(
int
)
pcs
&
0xff
;
orig_mask
=
(
int
)
pcs
&
0xff
;
...
@@ -345,7 +345,7 @@ static int piix_sata_probe (struct ata_port *ap)
...
@@ -345,7 +345,7 @@ static int piix_sata_probe (struct ata_port *ap)
mask
=
(
PIIX_PORT_PRESENT
<<
i
)
|
(
PIIX_PORT_ENABLED
<<
i
);
mask
=
(
PIIX_PORT_PRESENT
<<
i
)
|
(
PIIX_PORT_ENABLED
<<
i
);
if
((
orig_mask
&
mask
)
==
mask
)
if
((
orig_mask
&
mask
)
==
mask
)
if
(
combined
||
(
i
==
ap
->
port_no
))
if
(
combined
||
(
i
==
ap
->
hard_
port_no
))
return
1
;
return
1
;
}
}
...
@@ -394,7 +394,7 @@ static void piix_set_piomode (struct ata_port *ap, struct ata_device *adev)
...
@@ -394,7 +394,7 @@ static void piix_set_piomode (struct ata_port *ap, struct ata_device *adev)
unsigned
int
pio
=
adev
->
pio_mode
-
XFER_PIO_0
;
unsigned
int
pio
=
adev
->
pio_mode
-
XFER_PIO_0
;
struct
pci_dev
*
dev
=
ap
->
host_set
->
pdev
;
struct
pci_dev
*
dev
=
ap
->
host_set
->
pdev
;
unsigned
int
is_slave
=
(
adev
->
devno
!=
0
);
unsigned
int
is_slave
=
(
adev
->
devno
!=
0
);
unsigned
int
master_port
=
ap
->
port_no
?
0x42
:
0x40
;
unsigned
int
master_port
=
ap
->
hard_
port_no
?
0x42
:
0x40
;
unsigned
int
slave_port
=
0x44
;
unsigned
int
slave_port
=
0x44
;
u16
master_data
;
u16
master_data
;
u8
slave_data
;
u8
slave_data
;
...
@@ -412,10 +412,10 @@ static void piix_set_piomode (struct ata_port *ap, struct ata_device *adev)
...
@@ -412,10 +412,10 @@ static void piix_set_piomode (struct ata_port *ap, struct ata_device *adev)
/* enable PPE, IE and TIME */
/* enable PPE, IE and TIME */
master_data
|=
0x0070
;
master_data
|=
0x0070
;
pci_read_config_byte
(
dev
,
slave_port
,
&
slave_data
);
pci_read_config_byte
(
dev
,
slave_port
,
&
slave_data
);
slave_data
&=
(
ap
->
port_no
?
0x0f
:
0xf0
);
slave_data
&=
(
ap
->
hard_
port_no
?
0x0f
:
0xf0
);
slave_data
|=
slave_data
|=
(
timings
[
pio
][
0
]
<<
2
)
|
(
timings
[
pio
][
0
]
<<
2
)
|
(
timings
[
pio
][
1
]
<<
(
ap
->
port_no
?
4
:
0
));
(
timings
[
pio
][
1
]
<<
(
ap
->
hard_
port_no
?
4
:
0
));
}
else
{
}
else
{
master_data
&=
0xccf8
;
master_data
&=
0xccf8
;
/* enable PPE, IE and TIME */
/* enable PPE, IE and TIME */
...
@@ -445,9 +445,9 @@ static void piix_set_dmamode (struct ata_port *ap, struct ata_device *adev)
...
@@ -445,9 +445,9 @@ static void piix_set_dmamode (struct ata_port *ap, struct ata_device *adev)
{
{
unsigned
int
udma
=
adev
->
dma_mode
;
/* FIXME: MWDMA too */
unsigned
int
udma
=
adev
->
dma_mode
;
/* FIXME: MWDMA too */
struct
pci_dev
*
dev
=
ap
->
host_set
->
pdev
;
struct
pci_dev
*
dev
=
ap
->
host_set
->
pdev
;
u8
maslave
=
ap
->
port_no
?
0x42
:
0x40
;
u8
maslave
=
ap
->
hard_
port_no
?
0x42
:
0x40
;
u8
speed
=
udma
;
u8
speed
=
udma
;
unsigned
int
drive_dn
=
(
ap
->
port_no
?
2
:
0
)
+
adev
->
devno
;
unsigned
int
drive_dn
=
(
ap
->
hard_
port_no
?
2
:
0
)
+
adev
->
devno
;
int
a_speed
=
3
<<
(
drive_dn
*
4
);
int
a_speed
=
3
<<
(
drive_dn
*
4
);
int
u_flag
=
1
<<
drive_dn
;
int
u_flag
=
1
<<
drive_dn
;
int
v_flag
=
0x01
<<
drive_dn
;
int
v_flag
=
0x01
<<
drive_dn
;
...
...
drivers/scsi/libata-core.c
View file @
6db492bc
...
@@ -3032,6 +3032,8 @@ static void ata_host_init(struct ata_port *ap, struct Scsi_Host *host,
...
@@ -3032,6 +3032,8 @@ static void ata_host_init(struct ata_port *ap, struct Scsi_Host *host,
ap
->
ctl
=
ATA_DEVCTL_OBS
;
ap
->
ctl
=
ATA_DEVCTL_OBS
;
ap
->
host_set
=
host_set
;
ap
->
host_set
=
host_set
;
ap
->
port_no
=
port_no
;
ap
->
port_no
=
port_no
;
ap
->
hard_port_no
=
ent
->
legacy_mode
?
ent
->
hard_port_no
:
port_no
;
ap
->
pio_mask
=
ent
->
pio_mask
;
ap
->
pio_mask
=
ent
->
pio_mask
;
ap
->
mwdma_mask
=
ent
->
mwdma_mask
;
ap
->
mwdma_mask
=
ent
->
mwdma_mask
;
ap
->
udma_mask
=
ent
->
udma_mask
;
ap
->
udma_mask
=
ent
->
udma_mask
;
...
@@ -3338,9 +3340,15 @@ ata_pci_init_legacy_mode(struct pci_dev *pdev, struct ata_port_info **port)
...
@@ -3338,9 +3340,15 @@ ata_pci_init_legacy_mode(struct pci_dev *pdev, struct ata_port_info **port)
probe_ent
[
0
].
n_ports
=
1
;
probe_ent
[
0
].
n_ports
=
1
;
probe_ent
[
0
].
irq
=
14
;
probe_ent
[
0
].
irq
=
14
;
probe_ent
[
0
].
hard_port_no
=
0
;
probe_ent
[
0
].
legacy_mode
=
1
;
probe_ent
[
1
].
n_ports
=
1
;
probe_ent
[
1
].
n_ports
=
1
;
probe_ent
[
1
].
irq
=
15
;
probe_ent
[
1
].
irq
=
15
;
probe_ent
[
1
].
hard_port_no
=
1
;
probe_ent
[
1
].
legacy_mode
=
1
;
probe_ent
[
0
].
port
[
0
].
cmd_addr
=
0x1f0
;
probe_ent
[
0
].
port
[
0
].
cmd_addr
=
0x1f0
;
probe_ent
[
0
].
port
[
0
].
altstatus_addr
=
probe_ent
[
0
].
port
[
0
].
altstatus_addr
=
probe_ent
[
0
].
port
[
0
].
ctl_addr
=
0x3f6
;
probe_ent
[
0
].
port
[
0
].
ctl_addr
=
0x3f6
;
...
...
drivers/scsi/libata-scsi.c
View file @
6db492bc
...
@@ -731,7 +731,6 @@ static unsigned int ata_scsi_rbuf_get(struct scsi_cmnd *cmd, u8 **buf_out)
...
@@ -731,7 +731,6 @@ static unsigned int ata_scsi_rbuf_get(struct scsi_cmnd *cmd, u8 **buf_out)
buflen
=
cmd
->
request_bufflen
;
buflen
=
cmd
->
request_bufflen
;
}
}
memset
(
buf
,
0
,
buflen
);
*
buf_out
=
buf
;
*
buf_out
=
buf
;
return
buflen
;
return
buflen
;
}
}
...
@@ -780,6 +779,7 @@ void ata_scsi_rbuf_fill(struct ata_scsi_args *args,
...
@@ -780,6 +779,7 @@ void ata_scsi_rbuf_fill(struct ata_scsi_args *args,
struct
scsi_cmnd
*
cmd
=
args
->
cmd
;
struct
scsi_cmnd
*
cmd
=
args
->
cmd
;
buflen
=
ata_scsi_rbuf_get
(
cmd
,
&
rbuf
);
buflen
=
ata_scsi_rbuf_get
(
cmd
,
&
rbuf
);
memset
(
rbuf
,
0
,
buflen
);
rc
=
actor
(
args
,
rbuf
,
buflen
);
rc
=
actor
(
args
,
rbuf
,
buflen
);
ata_scsi_rbuf_put
(
cmd
);
ata_scsi_rbuf_put
(
cmd
);
...
...
drivers/scsi/sata_nv.c
View file @
6db492bc
...
@@ -311,7 +311,7 @@ static int nv_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
...
@@ -311,7 +311,7 @@ static int nv_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
static
int
printed_version
=
0
;
static
int
printed_version
=
0
;
struct
nv_host
*
host
;
struct
nv_host
*
host
;
struct
ata_port_info
*
ppi
;
struct
ata_port_info
*
ppi
;
struct
ata_probe_ent
*
probe_ent
=
NULL
;
struct
ata_probe_ent
*
probe_ent
;
int
rc
;
int
rc
;
if
(
!
printed_version
++
)
if
(
!
printed_version
++
)
...
@@ -319,11 +319,11 @@ static int nv_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
...
@@ -319,11 +319,11 @@ static int nv_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
rc
=
pci_enable_device
(
pdev
);
rc
=
pci_enable_device
(
pdev
);
if
(
rc
)
if
(
rc
)
return
rc
;
goto
err_out
;
rc
=
pci_request_regions
(
pdev
,
DRV_NAME
);
rc
=
pci_request_regions
(
pdev
,
DRV_NAME
);
if
(
rc
)
if
(
rc
)
goto
err_out
;
goto
err_out
_disable
;
rc
=
pci_set_dma_mask
(
pdev
,
ATA_DMA_MASK
);
rc
=
pci_set_dma_mask
(
pdev
,
ATA_DMA_MASK
);
if
(
rc
)
if
(
rc
)
...
@@ -332,18 +332,16 @@ static int nv_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
...
@@ -332,18 +332,16 @@ static int nv_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
if
(
rc
)
if
(
rc
)
goto
err_out_regions
;
goto
err_out_regions
;
rc
=
-
ENOMEM
;
ppi
=
&
nv_port_info
;
ppi
=
&
nv_port_info
;
probe_ent
=
ata_pci_init_native_mode
(
pdev
,
&
ppi
);
probe_ent
=
ata_pci_init_native_mode
(
pdev
,
&
ppi
);
if
(
!
probe_ent
)
{
if
(
!
probe_ent
)
rc
=
-
ENOMEM
;
goto
err_out_regions
;
goto
err_out_regions
;
}
host
=
kmalloc
(
sizeof
(
struct
nv_host
),
GFP_KERNEL
);
host
=
kmalloc
(
sizeof
(
struct
nv_host
),
GFP_KERNEL
);
if
(
!
host
)
{
if
(
!
host
)
rc
=
-
ENOMEM
;
goto
err_out_free_ent
;
goto
err_out_free_ent
;
}
host
->
host_desc
=
&
nv_device_tbl
[
ent
->
driver_data
];
host
->
host_desc
=
&
nv_device_tbl
[
ent
->
driver_data
];
...
@@ -354,8 +352,10 @@ static int nv_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
...
@@ -354,8 +352,10 @@ static int nv_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
probe_ent
->
mmio_base
=
ioremap
(
pci_resource_start
(
pdev
,
5
),
probe_ent
->
mmio_base
=
ioremap
(
pci_resource_start
(
pdev
,
5
),
pci_resource_len
(
pdev
,
5
));
pci_resource_len
(
pdev
,
5
));
if
(
probe_ent
->
mmio_base
==
NULL
)
if
(
probe_ent
->
mmio_base
==
NULL
)
{
goto
err_out_iounmap
;
rc
=
-
EIO
;
goto
err_out_free_host
;
}
base
=
(
unsigned
long
)
probe_ent
->
mmio_base
;
base
=
(
unsigned
long
)
probe_ent
->
mmio_base
;
...
@@ -373,14 +373,14 @@ static int nv_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
...
@@ -373,14 +373,14 @@ static int nv_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
pci_set_master
(
pdev
);
pci_set_master
(
pdev
);
// Enable hotplug event interrupts.
if
(
host
->
host_desc
->
enable_hotplug
)
host
->
host_desc
->
enable_hotplug
(
probe_ent
);
rc
=
ata_device_add
(
probe_ent
);
rc
=
ata_device_add
(
probe_ent
);
if
(
rc
!=
NV_PORTS
)
if
(
rc
!=
NV_PORTS
)
goto
err_out_iounmap
;
goto
err_out_iounmap
;
// Enable hotplug event interrupts.
if
(
host
->
host_desc
->
enable_hotplug
)
host
->
host_desc
->
enable_hotplug
(
probe_ent
);
kfree
(
probe_ent
);
kfree
(
probe_ent
);
return
0
;
return
0
;
...
@@ -388,15 +388,15 @@ static int nv_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
...
@@ -388,15 +388,15 @@ static int nv_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
err_out_iounmap:
err_out_iounmap:
if
(
host
->
host_desc
->
host_flags
&
NV_HOST_FLAGS_SCR_MMIO
)
if
(
host
->
host_desc
->
host_flags
&
NV_HOST_FLAGS_SCR_MMIO
)
iounmap
(
probe_ent
->
mmio_base
);
iounmap
(
probe_ent
->
mmio_base
);
err_out_free_host:
kfree
(
host
);
err_out_free_ent:
err_out_free_ent:
kfree
(
probe_ent
);
kfree
(
probe_ent
);
err_out_regions:
err_out_regions:
pci_release_regions
(
pdev
);
pci_release_regions
(
pdev
);
err_out_disable:
err_out:
pci_disable_device
(
pdev
);
pci_disable_device
(
pdev
);
err_out:
return
rc
;
return
rc
;
}
}
...
...
drivers/scsi/sata_uli.c
0 → 100644
View file @
6db492bc
/*
* sata_uli.c - ULi Electronics SATA
*
* The contents of this file are subject to the Open
* Software License version 1.1 that can be found at
* http://www.opensource.org/licenses/osl-1.1.txt and is included herein
* by reference.
*
* Alternatively, the contents of this file may be used under the terms
* of the GNU General Public License version 2 (the "GPL") as distributed
* in the kernel source COPYING file, in which case the provisions of
* the GPL are applicable instead of the above. If you wish to allow
* the use of your version of this file only under the terms of the
* GPL and not to allow others to use your version of this file under
* the OSL, indicate your decision by deleting the provisions above and
* replace them with the notice and other provisions required by the GPL.
* If you do not delete the provisions above, a recipient may use your
* version of this file under either the OSL or the GPL.
*
*/
#include <linux/config.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/pci.h>
#include <linux/init.h>
#include <linux/blkdev.h>
#include <linux/delay.h>
#include <linux/interrupt.h>
#include "scsi.h"
#include <scsi/scsi_host.h>
#include <linux/libata.h>
#define DRV_NAME "sata_uli"
#define DRV_VERSION "0.11"
enum
{
uli_5289
=
0
,
uli_5287
=
1
,
/* PCI configuration registers */
ULI_SCR_BASE
=
0x90
,
/* sata0 phy SCR registers */
ULI_SATA1_OFS
=
0x10
,
/* offset from sata0->sata1 phy regs */
};
static
int
uli_init_one
(
struct
pci_dev
*
pdev
,
const
struct
pci_device_id
*
ent
);
static
u32
uli_scr_read
(
struct
ata_port
*
ap
,
unsigned
int
sc_reg
);
static
void
uli_scr_write
(
struct
ata_port
*
ap
,
unsigned
int
sc_reg
,
u32
val
);
static
struct
pci_device_id
uli_pci_tbl
[]
=
{
{
PCI_VENDOR_ID_AL
,
0x5289
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
uli_5289
},
{
PCI_VENDOR_ID_AL
,
0x5287
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
uli_5287
},
{
}
/* terminate list */
};
static
struct
pci_driver
uli_pci_driver
=
{
.
name
=
DRV_NAME
,
.
id_table
=
uli_pci_tbl
,
.
probe
=
uli_init_one
,
.
remove
=
ata_pci_remove_one
,
};
static
Scsi_Host_Template
uli_sht
=
{
.
module
=
THIS_MODULE
,
.
name
=
DRV_NAME
,
.
ioctl
=
ata_scsi_ioctl
,
.
queuecommand
=
ata_scsi_queuecmd
,
.
eh_strategy_handler
=
ata_scsi_error
,
.
can_queue
=
ATA_DEF_QUEUE
,
.
this_id
=
ATA_SHT_THIS_ID
,
.
sg_tablesize
=
LIBATA_MAX_PRD
,
.
max_sectors
=
ATA_MAX_SECTORS
,
.
cmd_per_lun
=
ATA_SHT_CMD_PER_LUN
,
.
emulated
=
ATA_SHT_EMULATED
,
.
use_clustering
=
ATA_SHT_USE_CLUSTERING
,
.
proc_name
=
DRV_NAME
,
.
dma_boundary
=
ATA_DMA_BOUNDARY
,
.
slave_configure
=
ata_scsi_slave_config
,
.
bios_param
=
ata_std_bios_param
,
};
static
struct
ata_port_operations
uli_ops
=
{
.
port_disable
=
ata_port_disable
,
.
tf_load
=
ata_tf_load
,
.
tf_read
=
ata_tf_read
,
.
check_status
=
ata_check_status
,
.
exec_command
=
ata_exec_command
,
.
dev_select
=
ata_std_dev_select
,
.
phy_reset
=
sata_phy_reset
,
.
bmdma_setup
=
ata_bmdma_setup
,
.
bmdma_start
=
ata_bmdma_start
,
.
qc_prep
=
ata_qc_prep
,
.
qc_issue
=
ata_qc_issue_prot
,
.
eng_timeout
=
ata_eng_timeout
,
.
irq_handler
=
ata_interrupt
,
.
irq_clear
=
ata_bmdma_irq_clear
,
.
scr_read
=
uli_scr_read
,
.
scr_write
=
uli_scr_write
,
.
port_start
=
ata_port_start
,
.
port_stop
=
ata_port_stop
,
};
static
struct
ata_port_info
uli_port_info
=
{
.
sht
=
&
uli_sht
,
.
host_flags
=
ATA_FLAG_SATA
|
ATA_FLAG_SATA_RESET
|
ATA_FLAG_NO_LEGACY
,
.
pio_mask
=
0x03
,
//support pio mode 4 (FIXME)
.
udma_mask
=
0x7f
,
//support udma mode 6
.
port_ops
=
&
uli_ops
,
};
MODULE_AUTHOR
(
"Peer Chen"
);
MODULE_DESCRIPTION
(
"low-level driver for ULi Electronics SATA controller"
);
MODULE_LICENSE
(
"GPL"
);
MODULE_DEVICE_TABLE
(
pci
,
uli_pci_tbl
);
static
unsigned
int
get_scr_cfg_addr
(
unsigned
int
port_no
,
unsigned
int
sc_reg
)
{
unsigned
int
addr
=
ULI_SCR_BASE
+
(
4
*
sc_reg
);
switch
(
port_no
)
{
case
0
:
break
;
case
1
:
addr
+=
ULI_SATA1_OFS
;
break
;
case
2
:
addr
+=
ULI_SATA1_OFS
*
4
;
break
;
case
3
:
addr
+=
ULI_SATA1_OFS
*
5
;
break
;
default:
BUG
();
break
;
}
return
addr
;
}
static
u32
uli_scr_cfg_read
(
struct
ata_port
*
ap
,
unsigned
int
sc_reg
)
{
unsigned
int
cfg_addr
=
get_scr_cfg_addr
(
ap
->
port_no
,
sc_reg
);
u32
val
;
pci_read_config_dword
(
ap
->
host_set
->
pdev
,
cfg_addr
,
&
val
);
return
val
;
}
static
void
uli_scr_cfg_write
(
struct
ata_port
*
ap
,
unsigned
int
scr
,
u32
val
)
{
unsigned
int
cfg_addr
=
get_scr_cfg_addr
(
ap
->
port_no
,
scr
);
pci_write_config_dword
(
ap
->
host_set
->
pdev
,
cfg_addr
,
val
);
}
static
u32
uli_scr_read
(
struct
ata_port
*
ap
,
unsigned
int
sc_reg
)
{
if
(
sc_reg
>
SCR_CONTROL
)
return
0xffffffffU
;
return
uli_scr_cfg_read
(
ap
,
sc_reg
);
}
static
void
uli_scr_write
(
struct
ata_port
*
ap
,
unsigned
int
sc_reg
,
u32
val
)
{
if
(
sc_reg
>
SCR_CONTROL
)
//SCR_CONTROL=2, SCR_ERROR=1, SCR_STATUS=0
return
;
uli_scr_cfg_write
(
ap
,
sc_reg
,
val
);
}
/* move to PCI layer, integrate w/ MSI stuff */
static
void
pci_enable_intx
(
struct
pci_dev
*
pdev
)
{
u16
pci_command
;
pci_read_config_word
(
pdev
,
PCI_COMMAND
,
&
pci_command
);
if
(
pci_command
&
PCI_COMMAND_INTX_DISABLE
)
{
pci_command
&=
~
PCI_COMMAND_INTX_DISABLE
;
pci_write_config_word
(
pdev
,
PCI_COMMAND
,
pci_command
);
}
}
static
int
uli_init_one
(
struct
pci_dev
*
pdev
,
const
struct
pci_device_id
*
ent
)
{
struct
ata_probe_ent
*
probe_ent
;
struct
ata_port_info
*
ppi
;
int
rc
;
unsigned
int
board_idx
=
(
unsigned
int
)
ent
->
driver_data
;
rc
=
pci_enable_device
(
pdev
);
if
(
rc
)
return
rc
;
rc
=
pci_request_regions
(
pdev
,
DRV_NAME
);
if
(
rc
)
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
;
ppi
=
&
uli_port_info
;
probe_ent
=
ata_pci_init_native_mode
(
pdev
,
&
ppi
);
if
(
!
probe_ent
)
{
rc
=
-
ENOMEM
;
goto
err_out_regions
;
}
switch
(
board_idx
)
{
case
uli_5287
:
probe_ent
->
n_ports
=
4
;
probe_ent
->
port
[
2
].
cmd_addr
=
pci_resource_start
(
pdev
,
0
)
+
8
;
probe_ent
->
port
[
2
].
altstatus_addr
=
probe_ent
->
port
[
2
].
ctl_addr
=
(
pci_resource_start
(
pdev
,
1
)
|
ATA_PCI_CTL_OFS
)
+
4
;
probe_ent
->
port
[
2
].
bmdma_addr
=
pci_resource_start
(
pdev
,
4
)
+
16
;
probe_ent
->
port
[
3
].
cmd_addr
=
pci_resource_start
(
pdev
,
2
)
+
8
;
probe_ent
->
port
[
3
].
altstatus_addr
=
probe_ent
->
port
[
3
].
ctl_addr
=
(
pci_resource_start
(
pdev
,
3
)
|
ATA_PCI_CTL_OFS
)
+
4
;
probe_ent
->
port
[
3
].
bmdma_addr
=
pci_resource_start
(
pdev
,
4
)
+
24
;
ata_std_ports
(
&
probe_ent
->
port
[
2
]);
ata_std_ports
(
&
probe_ent
->
port
[
3
]);
break
;
case
uli_5289
:
/* do nothing; ata_pci_init_native_mode did it all */
break
;
default:
BUG
();
break
;
}
pci_set_master
(
pdev
);
pci_enable_intx
(
pdev
);
/* FIXME: check ata_device_add return value */
ata_device_add
(
probe_ent
);
kfree
(
probe_ent
);
return
0
;
err_out_regions:
pci_release_regions
(
pdev
);
err_out:
pci_disable_device
(
pdev
);
return
rc
;
}
static
int
__init
uli_init
(
void
)
{
return
pci_module_init
(
&
uli_pci_driver
);
}
static
void
__exit
uli_exit
(
void
)
{
pci_unregister_driver
(
&
uli_pci_driver
);
}
module_init
(
uli_init
);
module_exit
(
uli_exit
);
include/linux/libata.h
View file @
6db492bc
...
@@ -189,6 +189,7 @@ struct ata_probe_ent {
...
@@ -189,6 +189,7 @@ struct ata_probe_ent {
Scsi_Host_Template
*
sht
;
Scsi_Host_Template
*
sht
;
struct
ata_ioports
port
[
ATA_MAX_PORTS
];
struct
ata_ioports
port
[
ATA_MAX_PORTS
];
unsigned
int
n_ports
;
unsigned
int
n_ports
;
unsigned
int
hard_port_no
;
unsigned
int
pio_mask
;
unsigned
int
pio_mask
;
unsigned
int
mwdma_mask
;
unsigned
int
mwdma_mask
;
unsigned
int
udma_mask
;
unsigned
int
udma_mask
;
...
@@ -273,6 +274,7 @@ struct ata_port {
...
@@ -273,6 +274,7 @@ struct ata_port {
unsigned
long
flags
;
/* ATA_FLAG_xxx */
unsigned
long
flags
;
/* ATA_FLAG_xxx */
unsigned
int
id
;
/* unique id req'd by scsi midlyr */
unsigned
int
id
;
/* unique id req'd by scsi midlyr */
unsigned
int
port_no
;
/* unique port #; from zero */
unsigned
int
port_no
;
/* unique port #; from zero */
unsigned
int
hard_port_no
;
/* hardware port #; from zero */
struct
ata_prd
*
prd
;
/* our SG list */
struct
ata_prd
*
prd
;
/* our SG list */
dma_addr_t
prd_dma
;
/* and its DMA mapping */
dma_addr_t
prd_dma
;
/* and its DMA mapping */
...
...
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