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
nexedi
linux
Commits
e98fd32c
Commit
e98fd32c
authored
Jan 20, 2004
by
Jeff Garzik
Browse files
Options
Browse Files
Download
Plain Diff
Merge redhat.com:/spare/repo/linux-2.5
into redhat.com:/spare/repo/libata-2.5
parents
3940ed85
3c56486b
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
178 additions
and
76 deletions
+178
-76
drivers/scsi/sata_sil.c
drivers/scsi/sata_sil.c
+108
-17
drivers/scsi/sata_svw.c
drivers/scsi/sata_svw.c
+70
-59
No files found.
drivers/scsi/sata_sil.c
View file @
e98fd32c
...
...
@@ -34,11 +34,16 @@
#include "hosts.h"
#include <linux/libata.h>
#define DRV_NAME "ata_sil"
#define DRV_VERSION "0.5
1
"
#define DRV_NAME "
s
ata_sil"
#define DRV_VERSION "0.5
2
"
enum
{
sil_3112
=
0
,
sil_3114
=
1
,
SIL_SYSCFG
=
0x48
,
SIL_MASK_IDE0_INT
=
(
1
<<
22
),
SIL_MASK_IDE1_INT
=
(
1
<<
23
),
SIL_IDE0_TF
=
0x80
,
SIL_IDE0_CTL
=
0x8A
,
...
...
@@ -49,6 +54,19 @@ enum {
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_IDE3_TF
=
0x2C0
,
SIL_IDE3_CTL
=
0x2CA
,
SIL_IDE3_BMDMA
=
0x208
,
SIL_IDE3_SCR
=
0x380
,
SIL_QUIRK_MOD15WRITE
=
(
1
<<
0
),
SIL_QUIRK_UDMA5MAX
=
(
1
<<
1
),
};
static
void
sil_set_piomode
(
struct
ata_port
*
ap
,
struct
ata_device
*
adev
,
...
...
@@ -62,9 +80,33 @@ static void sil_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val);
static
struct
pci_device_id
sil_pci_tbl
[]
=
{
{
0x1095
,
0x3112
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
sil_3112
},
{
0x1095
,
0x0240
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
sil_3112
},
{
0x1095
,
0x3512
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
sil_3112
},
{
0x1095
,
0x3114
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
sil_3114
},
{
}
/* terminate list */
};
/* TODO firmware versions should be added - eric */
struct
sil_drivelist
{
const
char
*
product
;
unsigned
int
quirk
;
}
sil_blacklist
[]
=
{
{
"ST320012AS"
,
SIL_QUIRK_MOD15WRITE
},
{
"ST330013AS"
,
SIL_QUIRK_MOD15WRITE
},
{
"ST340017AS"
,
SIL_QUIRK_MOD15WRITE
},
{
"ST360015AS"
,
SIL_QUIRK_MOD15WRITE
},
{
"ST380023AS"
,
SIL_QUIRK_MOD15WRITE
},
{
"ST3120023AS"
,
SIL_QUIRK_MOD15WRITE
},
{
"ST340014ASL"
,
SIL_QUIRK_MOD15WRITE
},
{
"ST360014ASL"
,
SIL_QUIRK_MOD15WRITE
},
{
"ST380011ASL"
,
SIL_QUIRK_MOD15WRITE
},
{
"ST3120022ASL"
,
SIL_QUIRK_MOD15WRITE
},
{
"ST3160021ASL"
,
SIL_QUIRK_MOD15WRITE
},
{
"Maxtor 4D060H3"
,
SIL_QUIRK_UDMA5MAX
},
{
}
};
static
struct
pci_driver
sil_pci_driver
=
{
.
name
=
DRV_NAME
,
.
id_table
=
sil_pci_tbl
,
...
...
@@ -113,6 +155,14 @@ static struct ata_port_operations sil_ops = {
static
struct
ata_port_info
sil_port_info
[]
=
{
/* sil_3112 */
{
.
sht
=
&
sil_sht
,
.
host_flags
=
ATA_FLAG_SATA
|
ATA_FLAG_NO_LEGACY
|
ATA_FLAG_SRST
|
ATA_FLAG_MMIO
,
.
pio_mask
=
0x03
,
/* pio3-4 */
.
udma_mask
=
0x7f
,
/* udma0-6; FIXME */
.
port_ops
=
&
sil_ops
,
},
/* sil_3114 */
{
.
sht
=
&
sil_sht
,
.
host_flags
=
ATA_FLAG_SATA
|
ATA_FLAG_NO_LEGACY
|
...
...
@@ -182,34 +232,52 @@ static void sil_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val)
* information on these errata, I will create a more exhaustive
* list, and apply the fixups to only the specific
* devices/hosts/firmwares that need it.
*
* 20040111 - Seagate drives affected by the Mod15Write bug are blacklisted
* The Maxtor quirk is in the blacklist, but I'm keeping the original
* pessimistic fix for the following reasons:
* - There seems to be less info on it, only one device gleaned off the
* Windows driver, maybe only one is affected. More info would be greatly
* appreciated.
* - But then again UDMA5 is hardly anything to complain about
*/
static
void
sil_dev_config
(
struct
ata_port
*
ap
,
struct
ata_device
*
dev
)
{
unsigned
int
n
,
quirks
=
0
;
u32
class_rev
=
0
;
const
char
*
s
=
&
dev
->
product
[
0
];
unsigned
int
len
=
strnlen
(
s
,
sizeof
(
dev
->
product
));
pci_read_config_dword
(
ap
->
host_set
->
pdev
,
PCI_CLASS_REVISION
,
&
class_rev
);
class_rev
&=
0xff
;
/* ATAPI specifies that empty space is blank-filled; remove blanks */
while
((
len
>
0
)
&&
(
s
[
len
-
1
]
==
' '
))
len
--
;
/* limit to udma5 */
if
(
!
memcmp
(
s
,
"Maxtor "
,
7
))
{
printk
(
KERN_INFO
"ata%u(%u): applying pessimistic Maxtor errata fix
\n
"
,
for
(
n
=
0
;
sil_blacklist
[
n
].
product
;
n
++
)
if
(
!
memcmp
(
sil_blacklist
[
n
].
product
,
s
,
strlen
(
sil_blacklist
[
n
].
product
)))
{
quirks
=
sil_blacklist
[
n
].
quirk
;
break
;
}
/* limit requests to 15 sectors */
if
((
class_rev
<=
0x01
)
&&
(
quirks
&
SIL_QUIRK_MOD15WRITE
))
{
printk
(
KERN_INFO
"ata%u(%u): applying Seagate errata fix
\n
"
,
ap
->
id
,
dev
->
devno
);
ap
->
udma_mask
&=
ATA_UDMA5
;
ap
->
host
->
max_sectors
=
15
;
ap
->
host
->
hostt
->
max_sectors
=
15
;
return
;
}
/* limit requests to 15 sectors */
if
((
len
>
4
)
&&
(
!
memcmp
(
s
,
"ST"
,
2
)))
{
if
((
!
memcmp
(
s
+
len
-
2
,
"AS"
,
2
))
||
(
!
memcmp
(
s
+
len
-
3
,
"ASL"
,
3
)))
{
printk
(
KERN_INFO
"ata%u(%u): applying pessimistic Seagate errata fix
\n
"
,
ap
->
id
,
dev
->
devno
);
ap
->
host
->
max_sectors
=
15
;
ap
->
host
->
hostt
->
max_sectors
=
15
;
return
;
}
/* limit to udma5 */
/* is this for (class_rev <= 0x01) only, too? */
if
(
quirks
&
SIL_QUIRK_UDMA5MAX
)
{
printk
(
KERN_INFO
"ata%u(%u): applying Maxtor errata fix %s
\n
"
,
ap
->
id
,
dev
->
devno
,
s
);
ap
->
udma_mask
&=
ATA_UDMA5
;
return
;
}
}
...
...
@@ -236,6 +304,7 @@ static int sil_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
unsigned
long
base
;
void
*
mmio_base
;
int
rc
;
u32
tmp
;
if
(
!
printed_version
++
)
printk
(
KERN_DEBUG
DRV_NAME
" version "
DRV_VERSION
"
\n
"
);
...
...
@@ -267,7 +336,7 @@ static int sil_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
probe_ent
->
pdev
=
pdev
;
probe_ent
->
port_ops
=
sil_port_info
[
ent
->
driver_data
].
port_ops
;
probe_ent
->
sht
=
sil_port_info
[
ent
->
driver_data
].
sht
;
probe_ent
->
n_ports
=
2
;
probe_ent
->
n_ports
=
(
ent
->
driver_data
==
sil_3114
)
?
4
:
2
;
probe_ent
->
pio_mask
=
sil_port_info
[
ent
->
driver_data
].
pio_mask
;
probe_ent
->
udma_mask
=
sil_port_info
[
ent
->
driver_data
].
udma_mask
;
probe_ent
->
irq
=
pdev
->
irq
;
...
...
@@ -296,6 +365,28 @@ static int sil_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
probe_ent
->
port
[
1
].
scr_addr
=
base
+
SIL_IDE1_SCR
;
ata_std_ports
(
&
probe_ent
->
port
[
1
]);
/* make sure IDE0/1 interrupts are not masked */
tmp
=
readl
(
mmio_base
+
SIL_SYSCFG
);
if
(
tmp
&
(
SIL_MASK_IDE0_INT
|
SIL_MASK_IDE1_INT
))
{
tmp
&=
~
(
SIL_MASK_IDE0_INT
|
SIL_MASK_IDE1_INT
);
writel
(
tmp
,
mmio_base
+
SIL_SYSCFG
);
readl
(
mmio_base
+
SIL_SYSCFG
);
/* flush */
}
if
(
ent
->
driver_data
==
sil_3114
)
{
probe_ent
->
port
[
2
].
cmd_addr
=
base
+
SIL_IDE2_TF
;
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
].
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
]);
}
pci_set_master
(
pdev
);
/* FIXME: check ata_device_add return value */
...
...
drivers/scsi/sata_svw.c
View file @
e98fd32c
...
...
@@ -38,13 +38,41 @@
#include "hosts.h"
#include <linux/libata.h>
#ifdef CONFIG_
ALL_PPC
#ifdef CONFIG_
PPC_OF
#include <asm/prom.h>
#include <asm/pci-bridge.h>
#endif
/* CONFIG_
ALL_PPC
*/
#endif
/* CONFIG_
PPC_OF
*/
#define DRV_NAME "ata_k2"
#define DRV_VERSION "1.03"
#define DRV_NAME "sata_svw"
#define DRV_VERSION "1.04"
/* Taskfile registers offsets */
#define K2_SATA_TF_CMD_OFFSET 0x00
#define K2_SATA_TF_DATA_OFFSET 0x00
#define K2_SATA_TF_ERROR_OFFSET 0x04
#define K2_SATA_TF_NSECT_OFFSET 0x08
#define K2_SATA_TF_LBAL_OFFSET 0x0c
#define K2_SATA_TF_LBAM_OFFSET 0x10
#define K2_SATA_TF_LBAH_OFFSET 0x14
#define K2_SATA_TF_DEVICE_OFFSET 0x18
#define K2_SATA_TF_CMDSTAT_OFFSET 0x1c
#define K2_SATA_TF_CTL_OFFSET 0x20
/* DMA base */
#define K2_SATA_DMA_CMD_OFFSET 0x30
/* SCRs base */
#define K2_SATA_SCR_STATUS_OFFSET 0x40
#define K2_SATA_SCR_ERROR_OFFSET 0x44
#define K2_SATA_SCR_CONTROL_OFFSET 0x48
/* Others */
#define K2_SATA_SICR1_OFFSET 0x80
#define K2_SATA_SICR2_OFFSET 0x84
#define K2_SATA_SIM_OFFSET 0x88
/* Port stride */
#define K2_SATA_PORT_OFFSET 0x100
static
u32
k2_sata_scr_read
(
struct
ata_port
*
ap
,
unsigned
int
sc_reg
)
...
...
@@ -139,7 +167,7 @@ static void k2_sata_set_udmamode (struct ata_port *ap, struct ata_device *adev,
}
#ifdef CONFIG_
ALL_PPC
#ifdef CONFIG_
PPC_OF
/*
* k2_sata_proc_info
* inout : decides on the direction of the dataflow and the meaning of the
...
...
@@ -151,29 +179,15 @@ static void k2_sata_set_udmamode (struct ata_port *ap, struct ata_device *adev,
* length: If inout==FALSE max number of bytes to be written into the buffer
* else number of bytes in the buffer
*/
static
int
k2_sata_proc_info
(
char
*
page
,
char
**
start
,
off_t
offset
,
int
coun
t
,
int
hostno
,
int
inout
)
static
int
k2_sata_proc_info
(
struct
Scsi_Host
*
shost
,
char
*
page
,
char
**
star
t
,
off_t
offset
,
int
count
,
int
inout
)
{
struct
Scsi_Host
*
hpnt
;
struct
ata_port
*
ap
;
struct
device_node
*
np
;
int
len
,
index
;
/* Find ourself. That's locking-broken, shitty etc... but thanks to
* /proc/scsi interface and lack of state kept around in this driver,
* its best I want to do for now...
*/
hpnt
=
scsi_hostlist
;
while
(
hpnt
)
{
if
(
hostno
==
hpnt
->
host_no
)
break
;
hpnt
=
hpnt
->
next
;
}
if
(
!
hpnt
)
return
0
;
/* Find the ata_port */
ap
=
(
struct
ata_port
*
)
&
hpn
t
->
hostdata
[
0
];
ap
=
(
struct
ata_port
*
)
&
shos
t
->
hostdata
[
0
];
if
(
ap
==
NULL
)
return
0
;
...
...
@@ -198,7 +212,7 @@ static int k2_sata_proc_info(char *page, char **start, off_t offset, int count,
return
len
;
}
#endif
/* CONFIG_
ALL_PPC
*/
#endif
/* CONFIG_
PPC_OF
*/
static
Scsi_Host_Template
k2_sata_sht
=
{
...
...
@@ -216,8 +230,8 @@ static Scsi_Host_Template k2_sata_sht = {
.
proc_name
=
DRV_NAME
,
.
dma_boundary
=
ATA_DMA_BOUNDARY
,
.
slave_configure
=
ata_scsi_slave_config
,
#ifdef CONFIG_
ALL_PPC
.
proc_info
=
k2_sata_proc_info
#ifdef CONFIG_
PPC_OF
.
proc_info
=
k2_sata_proc_info
,
#endif
.
bios_param
=
ata_std_bios_param
,
};
...
...
@@ -243,21 +257,20 @@ static struct ata_port_operations k2_sata_ops = {
.
port_stop
=
ata_port_stop
,
};
static
void
k2_sata_setup_port
(
struct
ata_ioports
*
port
,
unsigned
long
base
)
{
port
->
cmd_addr
=
base
;
port
->
data_addr
=
base
;
port
->
error_addr
=
base
+
0x4
;
port
->
nsect_addr
=
base
+
0x8
;
port
->
lbal_addr
=
base
+
0xc
;
port
->
lbam_addr
=
base
+
0x10
;
port
->
lbah_addr
=
base
+
0x14
;
port
->
device_addr
=
base
+
0x18
;
port
->
cmdstat_addr
=
base
+
0x1c
;
port
->
ctl_addr
=
base
+
0x20
;
port
->
bmdma_addr
=
base
+
0x30
;
port
->
scr_addr
=
base
+
0x40
;
port
->
cmd_addr
=
base
+
K2_SATA_TF_CMD_OFFSET
;
port
->
data_addr
=
base
+
K2_SATA_TF_DATA_OFFSET
;
port
->
error_addr
=
base
+
K2_SATA_TF_ERROR_OFFSET
;
port
->
nsect_addr
=
base
+
K2_SATA_TF_NSECT_OFFSET
;
port
->
lbal_addr
=
base
+
K2_SATA_TF_LBAL_OFFSET
;
port
->
lbam_addr
=
base
+
K2_SATA_TF_LBAM_OFFSET
;
port
->
lbah_addr
=
base
+
K2_SATA_TF_LBAH_OFFSET
;
port
->
device_addr
=
base
+
K2_SATA_TF_DEVICE_OFFSET
;
port
->
cmdstat_addr
=
base
+
K2_SATA_TF_CMDSTAT_OFFSET
;
port
->
ctl_addr
=
base
+
K2_SATA_TF_CTL_OFFSET
;
port
->
bmdma_addr
=
base
+
K2_SATA_DMA_CMD_OFFSET
;
port
->
scr_addr
=
base
+
K2_SATA_SCR_STATUS_OFFSET
;
}
...
...
@@ -279,7 +292,14 @@ static int k2_sata_init_one (struct pci_dev *pdev, const struct pci_device_id *e
rc
=
pci_enable_device
(
pdev
);
if
(
rc
)
return
rc
;
/*
* Check if we have resources mapped at all (second function may
* have been disabled by firmware)
*/
if
(
pci_resource_len
(
pdev
,
5
)
==
0
)
return
-
ENODEV
;
/* Request PCI regions */
rc
=
pci_request_regions
(
pdev
,
DRV_NAME
);
if
(
rc
)
goto
err_out
;
...
...
@@ -306,44 +326,37 @@ static int k2_sata_init_one (struct pci_dev *pdev, const struct pci_device_id *e
}
base
=
(
unsigned
long
)
mmio_base
;
/*
* Check for the "disabled" second function to avoid registering
* useless interfaces on K2
*/
if
(
readl
(
mmio_base
+
0x40
)
==
0xffffffffUL
&&
readl
(
mmio_base
+
0x140
)
==
0xffffffffUL
)
{
rc
=
-
ENODEV
;
goto
err_out_unmap
;
}
/* Clear a magic bit in SCR1 according to Darwin, those help
* some funky seagate drives (though so far, those were already
* set by the firmware on the machines I had access to
*/
writel
(
readl
(
mmio_base
+
0x80
)
&
~
0x00040000
,
mmio_base
+
0x80
);
writel
(
readl
(
mmio_base
+
K2_SATA_SICR1_OFFSET
)
&
~
0x00040000
,
mmio_base
+
K2_SATA_SICR1_OFFSET
);
/* Clear SATA error & interrupts we don't use */
writel
(
0xffffffff
,
mmio_base
+
0x44
);
writel
(
0x0
,
mmio_base
+
0x88
);
writel
(
0xffffffff
,
mmio_base
+
K2_SATA_SCR_ERROR_OFFSET
);
writel
(
0x0
,
mmio_base
+
K2_SATA_SIM_OFFSET
);
probe_ent
->
sht
=
&
k2_sata_sht
;
probe_ent
->
host_flags
=
ATA_FLAG_SATA
|
ATA_FLAG_SATA_RESET
|
ATA_FLAG_NO_LEGACY
|
ATA_FLAG_MMIO
;
probe_ent
->
port_ops
=
&
k2_sata_ops
;
probe_ent
->
n_ports
=
2
;
probe_ent
->
n_ports
=
4
;
probe_ent
->
irq
=
pdev
->
irq
;
probe_ent
->
irq_flags
=
SA_SHIRQ
;
probe_ent
->
mmio_base
=
mmio_base
;
/*
* We don't care much about the PIO/UDMA masks, but the core won't like us
/* We don't care much about the PIO/UDMA masks, but the core won't like us
* if we don't fill these
*/
probe_ent
->
pio_mask
=
0x1f
;
probe_ent
->
udma_mask
=
0x
7
f
;
probe_ent
->
udma_mask
=
0x
3
f
;
k2_sata_setup_port
(
&
probe_ent
->
port
[
0
],
base
);
k2_sata_setup_port
(
&
probe_ent
->
port
[
1
],
base
+
0x100
);
/* We have 4 ports per PCI function */
k2_sata_setup_port
(
&
probe_ent
->
port
[
0
],
base
+
0
*
K2_SATA_PORT_OFFSET
);
k2_sata_setup_port
(
&
probe_ent
->
port
[
1
],
base
+
1
*
K2_SATA_PORT_OFFSET
);
k2_sata_setup_port
(
&
probe_ent
->
port
[
2
],
base
+
2
*
K2_SATA_PORT_OFFSET
);
k2_sata_setup_port
(
&
probe_ent
->
port
[
3
],
base
+
3
*
K2_SATA_PORT_OFFSET
);
pci_set_master
(
pdev
);
...
...
@@ -353,8 +366,6 @@ static int k2_sata_init_one (struct pci_dev *pdev, const struct pci_device_id *e
return
0
;
err_out_unmap:
iounmap
((
void
*
)
base
);
err_out_free_ent:
kfree
(
probe_ent
);
err_out_regions:
...
...
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