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
3af70258
Commit
3af70258
authored
Jul 03, 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
d2d4b0f3
2b50a905
Changes
13
Show whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
206 additions
and
82 deletions
+206
-82
drivers/scsi/ata_piix.c
drivers/scsi/ata_piix.c
+6
-0
drivers/scsi/libata-core.c
drivers/scsi/libata-core.c
+73
-61
drivers/scsi/libata-scsi.c
drivers/scsi/libata-scsi.c
+28
-1
drivers/scsi/sata_nv.c
drivers/scsi/sata_nv.c
+2
-0
drivers/scsi/sata_promise.c
drivers/scsi/sata_promise.c
+35
-14
drivers/scsi/sata_sil.c
drivers/scsi/sata_sil.c
+3
-0
drivers/scsi/sata_sis.c
drivers/scsi/sata_sis.c
+2
-0
drivers/scsi/sata_svw.c
drivers/scsi/sata_svw.c
+2
-0
drivers/scsi/sata_sx4.c
drivers/scsi/sata_sx4.c
+14
-1
drivers/scsi/sata_via.c
drivers/scsi/sata_via.c
+3
-0
drivers/scsi/sata_vsc.c
drivers/scsi/sata_vsc.c
+2
-0
include/linux/ata.h
include/linux/ata.h
+9
-1
include/linux/libata.h
include/linux/libata.h
+27
-4
No files found.
drivers/scsi/ata_piix.c
View file @
3af70258
...
...
@@ -138,9 +138,12 @@ static struct ata_port_operations piix_pata_ops = {
.
bmdma_setup
=
ata_bmdma_setup_pio
,
.
bmdma_start
=
ata_bmdma_start_pio
,
.
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
,
.
port_start
=
ata_port_start
,
.
port_stop
=
ata_port_stop
,
...
...
@@ -161,9 +164,12 @@ static struct ata_port_operations piix_sata_ops = {
.
bmdma_setup
=
ata_bmdma_setup_pio
,
.
bmdma_start
=
ata_bmdma_start_pio
,
.
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
,
.
port_start
=
ata_port_start
,
.
port_stop
=
ata_port_stop
,
...
...
drivers/scsi/libata-core.c
View file @
3af70258
...
...
@@ -55,7 +55,6 @@ 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
int
ata_qc_issue_prot
(
struct
ata_queued_cmd
*
qc
);
static
unsigned
int
ata_unique_id
=
1
;
static
struct
workqueue_struct
*
ata_wq
;
...
...
@@ -1751,26 +1750,24 @@ static void ata_dev_set_pio(struct ata_port *ap, unsigned int device)
static
void
ata_sg_clean
(
struct
ata_queued_cmd
*
qc
)
{
struct
ata_port
*
ap
=
qc
->
ap
;
struct
scsi_cmnd
*
cmd
=
qc
->
scsicmd
;
struct
scatterlist
*
sg
=
qc
->
sg
;
int
dir
=
scsi_to_pci_dma_dir
(
cmd
->
sc_data_direction
)
;
int
dir
=
qc
->
pci_dma_dir
;
assert
(
dir
==
SCSI_DATA_READ
||
dir
==
SCSI_DATA_WRITE
);
assert
(
qc
->
flags
&
ATA_QCFLAG_SG
);
assert
(
qc
->
flags
&
ATA_QCFLAG_DMAMAP
);
assert
(
sg
!=
NULL
);
if
(
!
cmd
->
use_sg
)
if
(
qc
->
flags
&
ATA_QCFLAG_SINGLE
)
assert
(
qc
->
n_elem
==
1
);
DPRINTK
(
"unmapping %u sg elements
\n
"
,
qc
->
n_elem
);
if
(
cmd
->
use_sg
)
if
(
qc
->
flags
&
ATA_QCFLAG_SG
)
pci_unmap_sg
(
ap
->
host_set
->
pdev
,
sg
,
qc
->
n_elem
,
dir
);
else
pci_unmap_single
(
ap
->
host_set
->
pdev
,
sg_dma_address
(
&
sg
[
0
]),
sg_dma_len
(
&
sg
[
0
]),
dir
);
qc
->
flags
&=
~
ATA_QCFLAG_
SG
;
qc
->
flags
&=
~
ATA_QCFLAG_
DMAMAP
;
qc
->
sg
=
NULL
;
}
...
...
@@ -1831,12 +1828,39 @@ static void ata_fill_sg(struct ata_queued_cmd *qc)
*/
void
ata_qc_prep
(
struct
ata_queued_cmd
*
qc
)
{
if
(
!
(
qc
->
flags
&
ATA_QCFLAG_
SG
))
if
(
!
(
qc
->
flags
&
ATA_QCFLAG_
DMAMAP
))
return
;
ata_fill_sg
(
qc
);
}
void
ata_sg_init_one
(
struct
ata_queued_cmd
*
qc
,
void
*
buf
,
unsigned
int
buflen
)
{
struct
scatterlist
*
sg
;
qc
->
flags
|=
ATA_QCFLAG_SINGLE
;
memset
(
&
qc
->
sgent
,
0
,
sizeof
(
qc
->
sgent
));
qc
->
sg
=
&
qc
->
sgent
;
qc
->
n_elem
=
1
;
qc
->
buf_virt
=
buf
;
sg
=
qc
->
sg
;
sg
->
page
=
virt_to_page
(
buf
);
sg
->
offset
=
(
unsigned
long
)
buf
&
~
PAGE_MASK
;
sg_dma_len
(
sg
)
=
buflen
;
WARN_ON
(
buflen
>
PAGE_SIZE
);
}
void
ata_sg_init
(
struct
ata_queued_cmd
*
qc
,
struct
scatterlist
*
sg
,
unsigned
int
n_elem
)
{
qc
->
flags
|=
ATA_QCFLAG_SG
;
qc
->
sg
=
sg
;
qc
->
n_elem
=
n_elem
;
}
/**
* ata_sg_setup_one -
* @qc:
...
...
@@ -1851,26 +1875,18 @@ void ata_qc_prep(struct ata_queued_cmd *qc)
static
int
ata_sg_setup_one
(
struct
ata_queued_cmd
*
qc
)
{
struct
ata_port
*
ap
=
qc
->
ap
;
struct
scsi_cmnd
*
cmd
=
qc
->
scsicmd
;
int
dir
=
scsi_to_pci_dma_dir
(
cmd
->
sc_data_direction
);
int
dir
=
qc
->
pci_dma_dir
;
struct
scatterlist
*
sg
=
qc
->
sg
;
dma_addr_t
dma_address
;
assert
(
sg
==
&
qc
->
sgent
);
assert
(
qc
->
n_elem
==
1
);
sg
->
page
=
virt_to_page
(
cmd
->
request_buffer
);
sg
->
offset
=
(
unsigned
long
)
cmd
->
request_buffer
&
~
PAGE_MASK
;
sg_dma_len
(
sg
)
=
cmd
->
request_bufflen
;
dma_address
=
pci_map_single
(
ap
->
host_set
->
pdev
,
cmd
->
request_buffer
,
cmd
->
request_bufflen
,
dir
);
dma_address
=
pci_map_single
(
ap
->
host_set
->
pdev
,
qc
->
buf_virt
,
sg_dma_len
(
sg
),
dir
);
if
(
pci_dma_mapping_error
(
dma_address
))
return
-
1
;
sg_dma_address
(
sg
)
=
dma_address
;
DPRINTK
(
"mapped buffer of %d bytes for %s
\n
"
,
cmd
->
request_bufflen
,
DPRINTK
(
"mapped buffer of %d bytes for %s
\n
"
,
sg_dma_len
(
sg
)
,
qc
->
tf
.
flags
&
ATA_TFLAG_WRITE
?
"write"
:
"read"
);
return
0
;
...
...
@@ -1890,16 +1906,14 @@ static int ata_sg_setup_one(struct ata_queued_cmd *qc)
static
int
ata_sg_setup
(
struct
ata_queued_cmd
*
qc
)
{
struct
ata_port
*
ap
=
qc
->
ap
;
struct
scsi_cmnd
*
cmd
=
qc
->
scsicmd
;
struct
scatterlist
*
sg
;
struct
scatterlist
*
sg
=
qc
->
sg
;
int
n_elem
,
dir
;
VPRINTK
(
"ENTER, ata%u
, use_sg %d
\n
"
,
ap
->
id
,
cmd
->
use_sg
);
assert
(
cmd
->
use_sg
>
0
);
VPRINTK
(
"ENTER, ata%u
\n
"
,
ap
->
id
);
assert
(
qc
->
flags
&
ATA_QCFLAG_SG
);
sg
=
(
struct
scatterlist
*
)
cmd
->
request_buffer
;
dir
=
scsi_to_pci_dma_dir
(
cmd
->
sc_data_direction
);
n_elem
=
pci_map_sg
(
ap
->
host_set
->
pdev
,
sg
,
cmd
->
use_sg
,
dir
);
dir
=
qc
->
pci_dma_dir
;
n_elem
=
pci_map_sg
(
ap
->
host_set
->
pdev
,
sg
,
qc
->
n_elem
,
dir
);
if
(
n_elem
<
1
)
return
-
1
;
...
...
@@ -2015,7 +2029,6 @@ static void ata_pio_sector(struct ata_port *ap)
{
struct
ata_queued_cmd
*
qc
;
struct
scatterlist
*
sg
;
struct
scsi_cmnd
*
cmd
;
unsigned
char
*
buf
;
u8
status
;
...
...
@@ -2047,7 +2060,6 @@ static void ata_pio_sector(struct ata_port *ap)
qc
=
ata_qc_from_tag
(
ap
,
ap
->
active_tag
);
assert
(
qc
!=
NULL
);
cmd
=
qc
->
scsicmd
;
sg
=
qc
->
sg
;
if
(
qc
->
cursect
==
(
qc
->
nsect
-
1
))
...
...
@@ -2059,7 +2071,7 @@ static void ata_pio_sector(struct ata_port *ap)
qc
->
cursect
++
;
qc
->
cursg_ofs
++
;
if
(
cmd
->
use_sg
)
if
(
qc
->
flags
&
ATA_QCFLAG_SG
)
if
((
qc
->
cursg_ofs
*
ATA_SECT_SIZE
)
==
sg_dma_len
(
&
sg
[
qc
->
cursg
]))
{
qc
->
cursg
++
;
qc
->
cursg_ofs
=
0
;
...
...
@@ -2294,27 +2306,23 @@ struct ata_queued_cmd *ata_qc_new_init(struct ata_port *ap,
void
ata_qc_complete
(
struct
ata_queued_cmd
*
qc
,
u8
drv_stat
)
{
struct
ata_port
*
ap
=
qc
->
ap
;
struct
scsi_cmnd
*
cmd
=
qc
->
scsicmd
;
unsigned
int
tag
,
do_clear
=
0
;
int
rc
;
assert
(
qc
!=
NULL
);
/* ata_qc_from_tag _might_ return NULL */
assert
(
qc
->
flags
&
ATA_QCFLAG_ACTIVE
);
if
(
likely
(
qc
->
flags
&
ATA_QCFLAG_
SG
))
if
(
likely
(
qc
->
flags
&
ATA_QCFLAG_
DMAMAP
))
ata_sg_clean
(
qc
);
if
(
cmd
)
{
if
(
unlikely
(
drv_stat
&
(
ATA_ERR
|
ATA_BUSY
|
ATA_DRQ
)))
{
if
(
is_atapi_taskfile
(
&
qc
->
tf
))
cmd
->
result
=
SAM_STAT_CHECK_CONDITION
;
else
ata_to_sense_error
(
qc
);
}
else
{
cmd
->
result
=
SAM_STAT_GOOD
;
}
/* call completion callback */
rc
=
qc
->
complete_fn
(
qc
,
drv_stat
);
qc
->
scsidone
(
cmd
);
}
/* if callback indicates not to complete command (non-zero),
* return immediately
*/
if
(
rc
!=
0
)
return
;
qc
->
flags
=
0
;
tag
=
qc
->
tag
;
...
...
@@ -2351,25 +2359,21 @@ void ata_qc_complete(struct ata_queued_cmd *qc, u8 drv_stat)
int
ata_qc_issue
(
struct
ata_queued_cmd
*
qc
)
{
struct
ata_port
*
ap
=
qc
->
ap
;
struct
scsi_cmnd
*
cmd
=
qc
->
scsicmd
;
if
(
qc
->
flags
&
ATA_QCFLAG_SG
)
{
/* set up SG table */
if
(
cmd
->
use_sg
)
{
if
(
ata_sg_setup
(
qc
))
goto
err_out
;
}
else
{
}
else
if
(
qc
->
flags
&
ATA_QCFLAG_SINGLE
)
{
if
(
ata_sg_setup_one
(
qc
))
goto
err_out
;
}
}
ap
->
ops
->
qc_prep
(
qc
);
qc
->
ap
->
active_tag
=
qc
->
tag
;
qc
->
flags
|=
ATA_QCFLAG_ACTIVE
;
return
a
ta_qc_issue_prot
(
qc
);
return
a
p
->
ops
->
qc_issue
(
qc
);
err_out:
return
-
1
;
...
...
@@ -2391,7 +2395,7 @@ int ata_qc_issue(struct ata_queued_cmd *qc)
* Zero on success, negative on error.
*/
static
int
ata_qc_issue_prot
(
struct
ata_queued_cmd
*
qc
)
int
ata_qc_issue_prot
(
struct
ata_queued_cmd
*
qc
)
{
struct
ata_port
*
ap
=
qc
->
ap
;
...
...
@@ -2542,6 +2546,11 @@ void ata_bmdma_start_pio (struct ata_queued_cmd *qc)
ap
->
ioaddr
.
bmdma_addr
+
ATA_DMA_CMD
);
}
void
ata_bmdma_irq_clear
(
struct
ata_port
*
ap
)
{
ata_bmdma_ack_irq
(
ap
);
}
/**
* ata_host_intr - Handle host interrupt for given (port, task)
* @ap: Port on which interrupt arrived (possibly...)
...
...
@@ -2884,6 +2893,7 @@ int ata_device_add(struct ata_probe_ent *ent)
host_set
->
irq
=
ent
->
irq
;
host_set
->
mmio_base
=
ent
->
mmio_base
;
host_set
->
private_data
=
ent
->
private_data
;
host_set
->
ops
=
ent
->
port_ops
;
/* register each port bound to this device */
for
(
i
=
0
;
i
<
ent
->
n_ports
;
i
++
)
{
...
...
@@ -2906,6 +2916,8 @@ int ata_device_add(struct ata_probe_ent *ent)
ap
->
ioaddr
.
bmdma_addr
,
ent
->
irq
);
ata_chk_status
(
ap
);
host_set
->
ops
->
irq_clear
(
ap
);
count
++
;
}
...
...
@@ -2914,10 +2926,6 @@ int ata_device_add(struct ata_probe_ent *ent)
return
0
;
}
/* TODO: ack irq here, to ensure it won't scream
* when we enable it?
*/
/* obtain irq, that is shared between channels */
if
(
request_irq
(
ent
->
irq
,
ent
->
port_ops
->
irq_handler
,
ent
->
irq_flags
,
DRV_NAME
,
host_set
))
...
...
@@ -3243,8 +3251,8 @@ void ata_pci_remove_one (struct pci_dev *pdev)
free_irq
(
host_set
->
irq
,
host_set
);
if
(
host_set
->
mmio_base
)
iounmap
(
host_set
->
mmio_base
);
if
(
host_set
->
ports
[
0
]
->
ops
->
host_stop
)
host_set
->
ports
[
0
]
->
ops
->
host_stop
(
host_set
);
if
(
host_set
->
ops
->
host_stop
)
host_set
->
ops
->
host_stop
(
host_set
);
for
(
i
=
0
;
i
<
host_set
->
n_ports
;
i
++
)
{
ap
=
host_set
->
ports
[
i
];
...
...
@@ -3347,7 +3355,10 @@ EXPORT_SYMBOL_GPL(pci_test_config_bits);
EXPORT_SYMBOL_GPL
(
ata_std_bios_param
);
EXPORT_SYMBOL_GPL
(
ata_std_ports
);
EXPORT_SYMBOL_GPL
(
ata_device_add
);
EXPORT_SYMBOL_GPL
(
ata_sg_init
);
EXPORT_SYMBOL_GPL
(
ata_sg_init_one
);
EXPORT_SYMBOL_GPL
(
ata_qc_complete
);
EXPORT_SYMBOL_GPL
(
ata_qc_issue_prot
);
EXPORT_SYMBOL_GPL
(
ata_eng_timeout
);
EXPORT_SYMBOL_GPL
(
ata_tf_load_pio
);
EXPORT_SYMBOL_GPL
(
ata_tf_load_mmio
);
...
...
@@ -3367,6 +3378,7 @@ EXPORT_SYMBOL_GPL(ata_bmdma_setup_pio);
EXPORT_SYMBOL_GPL
(
ata_bmdma_start_pio
);
EXPORT_SYMBOL_GPL
(
ata_bmdma_setup_mmio
);
EXPORT_SYMBOL_GPL
(
ata_bmdma_start_mmio
);
EXPORT_SYMBOL_GPL
(
ata_bmdma_irq_clear
);
EXPORT_SYMBOL_GPL
(
ata_port_probe
);
EXPORT_SYMBOL_GPL
(
sata_phy_reset
);
EXPORT_SYMBOL_GPL
(
ata_bus_reset
);
...
...
drivers/scsi/libata-scsi.c
View file @
3af70258
...
...
@@ -335,6 +335,24 @@ static unsigned int ata_scsi_rw_xlat(struct ata_queued_cmd *qc, u8 *scsicmd)
return
1
;
}
static
int
ata_scsi_qc_complete
(
struct
ata_queued_cmd
*
qc
,
u8
drv_stat
)
{
struct
scsi_cmnd
*
cmd
=
qc
->
scsicmd
;
if
(
unlikely
(
drv_stat
&
(
ATA_ERR
|
ATA_BUSY
|
ATA_DRQ
)))
{
if
(
is_atapi_taskfile
(
&
qc
->
tf
))
cmd
->
result
=
SAM_STAT_CHECK_CONDITION
;
else
ata_to_sense_error
(
qc
);
}
else
{
cmd
->
result
=
SAM_STAT_GOOD
;
}
qc
->
scsidone
(
cmd
);
return
0
;
}
/**
* ata_scsi_translate - Translate then issue SCSI command to ATA device
* @ap: ATA port to which the command is addressed
...
...
@@ -368,6 +386,7 @@ static void ata_scsi_translate(struct ata_port *ap, struct ata_device *dev,
if
(
!
qc
)
return
;
/* data is present; dma-map it */
if
(
cmd
->
sc_data_direction
==
SCSI_DATA_READ
||
cmd
->
sc_data_direction
==
SCSI_DATA_WRITE
)
{
if
(
unlikely
(
cmd
->
request_bufflen
<
1
))
{
...
...
@@ -376,9 +395,17 @@ static void ata_scsi_translate(struct ata_port *ap, struct ata_device *dev,
goto
err_out
;
}
qc
->
flags
|=
ATA_QCFLAG_SG
;
/* data is present; dma-map it */
if
(
cmd
->
use_sg
)
ata_sg_init
(
qc
,
cmd
->
request_buffer
,
cmd
->
use_sg
);
else
ata_sg_init_one
(
qc
,
cmd
->
request_buffer
,
cmd
->
request_bufflen
);
qc
->
pci_dma_dir
=
scsi_to_pci_dma_dir
(
cmd
->
sc_data_direction
);
}
qc
->
complete_fn
=
ata_scsi_qc_complete
;
if
(
xlat_func
(
qc
,
scsicmd
))
goto
err_out
;
...
...
drivers/scsi/sata_nv.c
View file @
3af70258
...
...
@@ -139,8 +139,10 @@ static struct ata_port_operations nv_ops = {
.
bmdma_setup
=
ata_bmdma_setup_pio
,
.
bmdma_start
=
ata_bmdma_start_pio
,
.
qc_prep
=
ata_qc_prep
,
.
qc_issue
=
ata_qc_issue_prot
,
.
eng_timeout
=
ata_eng_timeout
,
.
irq_handler
=
nv_interrupt
,
.
irq_clear
=
ata_bmdma_irq_clear
,
.
scr_read
=
nv_scr_read
,
.
scr_write
=
nv_scr_write
,
.
port_start
=
ata_port_start
,
...
...
drivers/scsi/sata_promise.c
View file @
3af70258
...
...
@@ -74,7 +74,6 @@ struct pdc_port_priv {
static
u32
pdc_sata_scr_read
(
struct
ata_port
*
ap
,
unsigned
int
sc_reg
);
static
void
pdc_sata_scr_write
(
struct
ata_port
*
ap
,
unsigned
int
sc_reg
,
u32
val
);
static
int
pdc_sata_init_one
(
struct
pci_dev
*
pdev
,
const
struct
pci_device_id
*
ent
);
static
void
pdc_dma_setup
(
struct
ata_queued_cmd
*
qc
);
static
void
pdc_dma_start
(
struct
ata_queued_cmd
*
qc
);
static
irqreturn_t
pdc_interrupt
(
int
irq
,
void
*
dev_instance
,
struct
pt_regs
*
regs
);
static
void
pdc_eng_timeout
(
struct
ata_port
*
ap
);
...
...
@@ -86,6 +85,8 @@ static void pdc_tf_load_mmio(struct ata_port *ap, struct ata_taskfile *tf);
static
void
pdc_exec_command_mmio
(
struct
ata_port
*
ap
,
struct
ata_taskfile
*
tf
);
static
inline
void
pdc_dma_complete
(
struct
ata_port
*
ap
,
struct
ata_queued_cmd
*
qc
,
int
have_err
);
static
void
pdc_irq_clear
(
struct
ata_port
*
ap
);
static
int
pdc_qc_issue_prot
(
struct
ata_queued_cmd
*
qc
);
static
Scsi_Host_Template
pdc_sata_sht
=
{
.
module
=
THIS_MODULE
,
...
...
@@ -112,11 +113,11 @@ static struct ata_port_operations pdc_sata_ops = {
.
check_status
=
ata_check_status_mmio
,
.
exec_command
=
pdc_exec_command_mmio
,
.
phy_reset
=
pdc_phy_reset
,
.
bmdma_setup
=
pdc_dma_setup
,
.
bmdma_start
=
pdc_dma_start
,
.
qc_prep
=
pdc_qc_prep
,
.
qc_issue
=
pdc_qc_issue_prot
,
.
eng_timeout
=
pdc_eng_timeout
,
.
irq_handler
=
pdc_interrupt
,
.
irq_clear
=
pdc_irq_clear
,
.
scr_read
=
pdc_sata_scr_read
,
.
scr_write
=
pdc_sata_scr_write
,
.
port_start
=
pdc_port_start
,
...
...
@@ -378,6 +379,14 @@ static inline unsigned int pdc_host_intr( struct ata_port *ap,
return
handled
;
}
static
void
pdc_irq_clear
(
struct
ata_port
*
ap
)
{
struct
ata_host_set
*
host_set
=
ap
->
host_set
;
void
*
mmio
=
host_set
->
mmio_base
;
readl
(
mmio
+
PDC_INT_SEQMASK
);
}
static
irqreturn_t
pdc_interrupt
(
int
irq
,
void
*
dev_instance
,
struct
pt_regs
*
regs
)
{
struct
ata_host_set
*
host_set
=
dev_instance
;
...
...
@@ -431,13 +440,7 @@ static irqreturn_t pdc_interrupt (int irq, void *dev_instance, struct pt_regs *r
return
IRQ_RETVAL
(
handled
);
}
static
void
pdc_dma_setup
(
struct
ata_queued_cmd
*
qc
)
{
/* nothing for now. later, we will call standard
* code in libata-core for ATAPI here */
}
static
void
pdc_dma_start
(
struct
ata_queued_cmd
*
qc
)
static
inline
void
pdc_dma_start
(
struct
ata_queued_cmd
*
qc
)
{
struct
ata_port
*
ap
=
qc
->
ap
;
struct
pdc_port_priv
*
pp
=
ap
->
private_data
;
...
...
@@ -455,16 +458,34 @@ static void pdc_dma_start(struct ata_queued_cmd *qc)
readl
((
void
*
)
ap
->
ioaddr
.
cmd_addr
+
PDC_PKT_SUBMIT
);
/* flush */
}
static
int
pdc_qc_issue_prot
(
struct
ata_queued_cmd
*
qc
)
{
switch
(
qc
->
tf
.
protocol
)
{
case
ATA_PROT_DMA
:
pdc_dma_start
(
qc
);
return
0
;
case
ATA_PROT_ATAPI_DMA
:
BUG
();
break
;
default:
break
;
}
return
ata_qc_issue_prot
(
qc
);
}
static
void
pdc_tf_load_mmio
(
struct
ata_port
*
ap
,
struct
ata_taskfile
*
tf
)
{
if
(
tf
->
protocol
!=
ATA_PROT_DMA
)
WARN_ON
(
tf
->
protocol
==
ATA_PROT_DMA
);
ata_tf_load_mmio
(
ap
,
tf
);
}
static
void
pdc_exec_command_mmio
(
struct
ata_port
*
ap
,
struct
ata_taskfile
*
tf
)
{
if
(
tf
->
protocol
!=
ATA_PROT_DMA
)
WARN_ON
(
tf
->
protocol
==
ATA_PROT_DMA
);
ata_exec_command_mmio
(
ap
,
tf
);
}
...
...
drivers/scsi/sata_sil.c
View file @
3af70258
...
...
@@ -86,6 +86,7 @@ struct sil_drivelist {
{
"ST360015AS"
,
SIL_QUIRK_MOD15WRITE
},
{
"ST380023AS"
,
SIL_QUIRK_MOD15WRITE
},
{
"ST3120023AS"
,
SIL_QUIRK_MOD15WRITE
},
{
"ST3160023AS"
,
SIL_QUIRK_MOD15WRITE
},
{
"ST340014ASL"
,
SIL_QUIRK_MOD15WRITE
},
{
"ST360014ASL"
,
SIL_QUIRK_MOD15WRITE
},
{
"ST380011ASL"
,
SIL_QUIRK_MOD15WRITE
},
...
...
@@ -132,8 +133,10 @@ static struct ata_port_operations sil_ops = {
.
bmdma_setup
=
ata_bmdma_setup_mmio
,
.
bmdma_start
=
ata_bmdma_start_mmio
,
.
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
=
sil_scr_read
,
.
scr_write
=
sil_scr_write
,
.
port_start
=
ata_port_start
,
...
...
drivers/scsi/sata_sis.c
View file @
3af70258
...
...
@@ -101,8 +101,10 @@ static struct ata_port_operations sis_ops = {
.
bmdma_setup
=
ata_bmdma_setup_pio
,
.
bmdma_start
=
ata_bmdma_start_pio
,
.
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
=
sis_scr_read
,
.
scr_write
=
sis_scr_write
,
.
port_start
=
ata_port_start
,
...
...
drivers/scsi/sata_svw.c
View file @
3af70258
...
...
@@ -234,8 +234,10 @@ static struct ata_port_operations k2_sata_ops = {
.
bmdma_setup
=
ata_bmdma_setup_mmio
,
.
bmdma_start
=
ata_bmdma_start_mmio
,
.
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
=
k2_sata_scr_read
,
.
scr_write
=
k2_sata_scr_write
,
.
port_start
=
ata_port_start
,
...
...
drivers/scsi/sata_sx4.c
View file @
3af70258
...
...
@@ -171,6 +171,7 @@ static void pdc20621_get_from_dimm(struct ata_probe_ent *pe,
#endif
static
void
pdc20621_put_to_dimm
(
struct
ata_probe_ent
*
pe
,
void
*
psource
,
u32
offset
,
u32
size
);
static
void
pdc20621_irq_clear
(
struct
ata_port
*
ap
);
static
Scsi_Host_Template
pdc_sata_sht
=
{
...
...
@@ -201,8 +202,10 @@ static struct ata_port_operations pdc_20621_ops = {
.
bmdma_setup
=
pdc20621_dma_setup
,
.
bmdma_start
=
pdc20621_dma_start
,
.
qc_prep
=
pdc20621_qc_prep
,
.
qc_issue
=
ata_qc_issue_prot
,
.
eng_timeout
=
pdc_eng_timeout
,
.
irq_handler
=
pdc20621_interrupt
,
.
irq_clear
=
pdc20621_irq_clear
,
.
port_start
=
pdc_port_start
,
.
port_stop
=
pdc_port_stop
,
.
host_stop
=
pdc20621_host_stop
,
...
...
@@ -446,7 +449,7 @@ static void pdc20621_qc_prep(struct ata_queued_cmd *qc)
unsigned
int
i
,
last
,
idx
,
total_len
=
0
,
sgt_len
;
u32
*
buf
=
(
u32
*
)
&
pp
->
dimm_buf
[
PDC_DIMM_HEADER_SZ
];
if
(
!
(
qc
->
flags
&
ATA_QCFLAG_
SG
))
if
(
!
(
qc
->
flags
&
ATA_QCFLAG_
DMAMAP
))
return
;
VPRINTK
(
"ata%u: ENTER
\n
"
,
ap
->
id
);
...
...
@@ -702,6 +705,16 @@ static inline unsigned int pdc20621_host_intr( struct ata_port *ap,
return
handled
;
}
static
void
pdc20621_irq_clear
(
struct
ata_port
*
ap
)
{
struct
ata_host_set
*
host_set
=
ap
->
host_set
;
void
*
mmio
=
host_set
->
mmio_base
;
mmio
+=
PDC_CHIP0_OFS
;
readl
(
mmio
+
PDC_20621_SEQMASK
);
}
static
irqreturn_t
pdc20621_interrupt
(
int
irq
,
void
*
dev_instance
,
struct
pt_regs
*
regs
)
{
struct
ata_host_set
*
host_set
=
dev_instance
;
...
...
drivers/scsi/sata_via.c
View file @
3af70258
...
...
@@ -109,9 +109,12 @@ static struct ata_port_operations svia_sata_ops = {
.
bmdma_setup
=
ata_bmdma_setup_pio
,
.
bmdma_start
=
ata_bmdma_start_pio
,
.
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
=
svia_scr_read
,
.
scr_write
=
svia_scr_write
,
...
...
drivers/scsi/sata_vsc.c
View file @
3af70258
...
...
@@ -216,8 +216,10 @@ static struct ata_port_operations vsc_sata_ops = {
.
bmdma_setup
=
ata_bmdma_setup_mmio
,
.
bmdma_start
=
ata_bmdma_start_mmio
,
.
qc_prep
=
ata_qc_prep
,
.
qc_issue
=
ata_qc_issue_prot
,
.
eng_timeout
=
ata_eng_timeout
,
.
irq_handler
=
vsc_sata_interrupt
,
.
irq_clear
=
ata_bmdma_irq_clear
,
.
scr_read
=
vsc_sata_scr_read
,
.
scr_write
=
vsc_sata_scr_write
,
.
port_start
=
ata_port_start
,
...
...
include/linux/ata.h
View file @
3af70258
...
...
@@ -78,9 +78,11 @@ enum {
ATA_NIEN
=
(
1
<<
1
),
/* disable-irq flag */
ATA_LBA
=
(
1
<<
6
),
/* LBA28 selector */
ATA_DEV1
=
(
1
<<
4
),
/* Select Device 1 (slave) */
ATA_BUSY
=
(
1
<<
7
),
/* BSY status bit */
ATA_DEVICE_OBS
=
(
1
<<
7
)
|
(
1
<<
5
),
/* obs bits in dev reg */
ATA_DEVCTL_OBS
=
(
1
<<
3
),
/* obsolete bit in devctl reg */
ATA_BUSY
=
(
1
<<
7
),
/* BSY status bit */
ATA_DRDY
=
(
1
<<
6
),
/* device ready */
ATA_DF
=
(
1
<<
5
),
/* device fault */
ATA_DRQ
=
(
1
<<
3
),
/* data request i/o */
ATA_ERR
=
(
1
<<
0
),
/* have an error */
ATA_SRST
=
(
1
<<
2
),
/* software reset */
...
...
@@ -224,4 +226,10 @@ static inline int is_atapi_taskfile(struct ata_taskfile *tf)
(
tf
->
protocol
==
ATA_PROT_ATAPI_DMA
);
}
static
inline
int
ata_ok
(
u8
status
)
{
return
((
status
&
(
ATA_BUSY
|
ATA_DRDY
|
ATA_DF
|
ATA_DRQ
|
ATA_ERR
))
==
ATA_DRDY
);
}
#endif
/* __LINUX_ATA_H__ */
include/linux/libata.h
View file @
3af70258
...
...
@@ -112,7 +112,9 @@ enum {
ATA_QCFLAG_ACTIVE
=
(
1
<<
1
),
/* cmd not yet ack'd to scsi lyer */
ATA_QCFLAG_DMA
=
(
1
<<
2
),
/* data delivered via DMA */
ATA_QCFLAG_SG
=
(
1
<<
4
),
/* have s/g table? */
ATA_QCFLAG_SG
=
(
1
<<
3
),
/* have s/g table? */
ATA_QCFLAG_SINGLE
=
(
1
<<
4
),
/* no s/g, just a single buffer */
ATA_QCFLAG_DMAMAP
=
ATA_QCFLAG_SG
|
ATA_QCFLAG_SINGLE
,
/* various lengths of time */
ATA_TMOUT_EDD
=
5
*
HZ
,
/* hueristic */
...
...
@@ -158,7 +160,7 @@ struct ata_port;
struct
ata_queued_cmd
;
/* typedefs */
typedef
void
(
*
ata_qc_cb_t
)
(
struct
ata_queued_cmd
*
qc
,
unsigned
int
flags
);
typedef
int
(
*
ata_qc_cb_t
)
(
struct
ata_queued_cmd
*
qc
,
u8
drv_stat
);
struct
ata_ioports
{
unsigned
long
cmd_addr
;
...
...
@@ -202,6 +204,7 @@ struct ata_host_set {
void
*
mmio_base
;
unsigned
int
n_ports
;
void
*
private_data
;
struct
ata_port_operations
*
ops
;
struct
ata_port
*
ports
[
0
];
};
...
...
@@ -215,16 +218,21 @@ struct ata_queued_cmd {
unsigned
long
flags
;
/* ATA_QCFLAG_xxx */
unsigned
int
tag
;
unsigned
int
n_elem
;
int
pci_dma_dir
;
unsigned
int
nsect
;
unsigned
int
cursect
;
unsigned
int
cursg
;
unsigned
int
cursg_ofs
;
struct
ata_taskfile
tf
;
struct
scatterlist
sgent
;
void
*
buf_virt
;
struct
scatterlist
*
sg
;
ata_qc_cb_t
c
allback
;
ata_qc_cb_t
c
omplete_fn
;
struct
completion
*
waiting
;
...
...
@@ -311,10 +319,14 @@ struct ata_port_operations {
void
(
*
bmdma_setup
)
(
struct
ata_queued_cmd
*
qc
);
void
(
*
bmdma_start
)
(
struct
ata_queued_cmd
*
qc
);
void
(
*
qc_prep
)
(
struct
ata_queued_cmd
*
qc
);
int
(
*
qc_issue
)
(
struct
ata_queued_cmd
*
qc
);
void
(
*
eng_timeout
)
(
struct
ata_port
*
ap
);
irqreturn_t
(
*
irq_handler
)(
int
,
void
*
,
struct
pt_regs
*
);
void
(
*
irq_clear
)
(
struct
ata_port
*
);
u32
(
*
scr_read
)
(
struct
ata_port
*
ap
,
unsigned
int
sc_reg
);
void
(
*
scr_write
)
(
struct
ata_port
*
ap
,
unsigned
int
sc_reg
,
...
...
@@ -372,12 +384,18 @@ extern int ata_port_start (struct ata_port *ap);
extern
void
ata_port_stop
(
struct
ata_port
*
ap
);
extern
irqreturn_t
ata_interrupt
(
int
irq
,
void
*
dev_instance
,
struct
pt_regs
*
regs
);
extern
void
ata_qc_prep
(
struct
ata_queued_cmd
*
qc
);
extern
int
ata_qc_issue_prot
(
struct
ata_queued_cmd
*
qc
);
extern
void
ata_sg_init_one
(
struct
ata_queued_cmd
*
qc
,
void
*
buf
,
unsigned
int
buflen
);
extern
void
ata_sg_init
(
struct
ata_queued_cmd
*
qc
,
struct
scatterlist
*
sg
,
unsigned
int
n_elem
);
extern
void
ata_dev_id_string
(
struct
ata_device
*
dev
,
unsigned
char
*
s
,
unsigned
int
ofs
,
unsigned
int
len
);
extern
void
ata_bmdma_setup_mmio
(
struct
ata_queued_cmd
*
qc
);
extern
void
ata_bmdma_start_mmio
(
struct
ata_queued_cmd
*
qc
);
extern
void
ata_bmdma_setup_pio
(
struct
ata_queued_cmd
*
qc
);
extern
void
ata_bmdma_start_pio
(
struct
ata_queued_cmd
*
qc
);
extern
void
ata_bmdma_irq_clear
(
struct
ata_port
*
ap
);
extern
int
pci_test_config_bits
(
struct
pci_dev
*
pdev
,
struct
pci_bits
*
bits
);
extern
void
ata_qc_complete
(
struct
ata_queued_cmd
*
qc
,
u8
drv_stat
);
extern
void
ata_eng_timeout
(
struct
ata_port
*
ap
);
...
...
@@ -480,6 +498,7 @@ static inline void ata_tf_init(struct ata_port *ap, struct ata_taskfile *tf, uns
static
inline
u8
ata_irq_on
(
struct
ata_port
*
ap
)
{
struct
ata_ioports
*
ioaddr
=
&
ap
->
ioaddr
;
u8
tmp
;
ap
->
ctl
&=
~
ATA_NIEN
;
ap
->
last_ctl
=
ap
->
ctl
;
...
...
@@ -488,7 +507,11 @@ static inline u8 ata_irq_on(struct ata_port *ap)
writeb
(
ap
->
ctl
,
ioaddr
->
ctl_addr
);
else
outb
(
ap
->
ctl
,
ioaddr
->
ctl_addr
);
return
ata_wait_idle
(
ap
);
tmp
=
ata_wait_idle
(
ap
);
ap
->
ops
->
irq_clear
(
ap
);
return
tmp
;
}
static
inline
u8
ata_irq_ack
(
struct
ata_port
*
ap
,
unsigned
int
chk_drq
)
...
...
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