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
48aa12e1
Commit
48aa12e1
authored
May 15, 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
78479816
96b2b4d7
Changes
12
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
142 additions
and
118 deletions
+142
-118
drivers/scsi/ata_piix.c
drivers/scsi/ata_piix.c
+2
-0
drivers/scsi/libata-core.c
drivers/scsi/libata-core.c
+80
-51
drivers/scsi/libata-scsi.c
drivers/scsi/libata-scsi.c
+16
-47
drivers/scsi/libata.h
drivers/scsi/libata.h
+0
-1
drivers/scsi/sata_promise.c
drivers/scsi/sata_promise.c
+14
-8
drivers/scsi/sata_sil.c
drivers/scsi/sata_sil.c
+1
-0
drivers/scsi/sata_sis.c
drivers/scsi/sata_sis.c
+1
-0
drivers/scsi/sata_svw.c
drivers/scsi/sata_svw.c
+1
-0
drivers/scsi/sata_sx4.c
drivers/scsi/sata_sx4.c
+14
-8
drivers/scsi/sata_via.c
drivers/scsi/sata_via.c
+1
-0
drivers/scsi/sata_vsc.c
drivers/scsi/sata_vsc.c
+2
-1
include/linux/libata.h
include/linux/libata.h
+10
-2
No files found.
drivers/scsi/ata_piix.c
View file @
48aa12e1
...
...
@@ -136,6 +136,7 @@ static struct ata_port_operations piix_pata_ops = {
.
phy_reset
=
piix_pata_phy_reset
,
.
bmdma_setup
=
ata_bmdma_setup_pio
,
.
bmdma_start
=
ata_bmdma_start_pio
,
.
fill_sg
=
ata_fill_sg
,
.
eng_timeout
=
ata_eng_timeout
,
...
...
@@ -158,6 +159,7 @@ static struct ata_port_operations piix_sata_ops = {
.
phy_reset
=
piix_sata_phy_reset
,
.
bmdma_setup
=
ata_bmdma_setup_pio
,
.
bmdma_start
=
ata_bmdma_start_pio
,
.
fill_sg
=
ata_fill_sg
,
.
eng_timeout
=
ata_eng_timeout
,
...
...
drivers/scsi/libata-core.c
View file @
48aa12e1
...
...
@@ -50,8 +50,7 @@ static unsigned int ata_busy_sleep (struct ata_port *ap,
unsigned
long
tmout_pat
,
unsigned
long
tmout
);
static
void
__ata_dev_select
(
struct
ata_port
*
ap
,
unsigned
int
device
);
static
void
ata_dma_complete
(
struct
ata_port
*
ap
,
u8
host_stat
,
unsigned
int
done_late
);
static
void
ata_dma_complete
(
struct
ata_queued_cmd
*
qc
,
u8
host_stat
);
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
);
...
...
@@ -1156,7 +1155,7 @@ static void ata_dev_identify(struct ata_port *ap, unsigned int device)
ap
->
host
->
max_cmd_len
=
16
;
/* print device info to dmesg */
printk
(
KERN_INFO
"ata%u: dev %u ATA, max %s, %Lu sectors:
%s
\n
"
,
printk
(
KERN_INFO
"ata%u: dev %u ATA, max %s, %Lu sectors:%s
\n
"
,
ap
->
id
,
device
,
ata_udma_string
(
udma_modes
),
(
unsigned
long
long
)
dev
->
n_sectors
,
...
...
@@ -2066,7 +2065,7 @@ static void ata_pio_complete (struct ata_port *ap)
ata_irq_on
(
ap
);
ata_qc_complete
(
qc
,
drv_stat
,
0
);
ata_qc_complete
(
qc
,
drv_stat
);
}
/**
...
...
@@ -2239,7 +2238,7 @@ void ata_eng_timeout(struct ata_port *ap)
printk
(
KERN_ERR
"ata%u: DMA timeout, stat 0x%x
\n
"
,
ap
->
id
,
host_stat
);
ata_dma_complete
(
ap
,
host_stat
,
1
);
ata_dma_complete
(
qc
,
host_stat
);
break
;
case
ATA_PROT_NODATA
:
...
...
@@ -2248,7 +2247,7 @@ void ata_eng_timeout(struct ata_port *ap)
printk
(
KERN_ERR
"ata%u: command 0x%x timeout, stat 0x%x
\n
"
,
ap
->
id
,
qc
->
tf
.
command
,
drv_stat
);
ata_qc_complete
(
qc
,
drv_stat
,
1
);
ata_qc_complete
(
qc
,
drv_stat
);
break
;
default:
...
...
@@ -2257,7 +2256,7 @@ void ata_eng_timeout(struct ata_port *ap)
printk
(
KERN_ERR
"ata%u: unknown timeout, cmd 0x%x stat 0x%x
\n
"
,
ap
->
id
,
qc
->
tf
.
command
,
drv_stat
);
ata_qc_complete
(
qc
,
drv_stat
,
1
);
ata_qc_complete
(
qc
,
drv_stat
);
break
;
}
...
...
@@ -2328,13 +2327,12 @@ struct ata_queued_cmd *ata_qc_new_init(struct ata_port *ap,
* ata_qc_complete -
* @qc:
* @drv_stat:
* @done_late:
*
* LOCKING:
*
*/
void
ata_qc_complete
(
struct
ata_queued_cmd
*
qc
,
u8
drv_stat
,
unsigned
int
done_late
)
void
ata_qc_complete
(
struct
ata_queued_cmd
*
qc
,
u8
drv_stat
)
{
struct
ata_port
*
ap
=
qc
->
ap
;
struct
scsi_cmnd
*
cmd
=
qc
->
scsicmd
;
...
...
@@ -2396,16 +2394,18 @@ int ata_qc_issue(struct ata_queued_cmd *qc)
struct
ata_port
*
ap
=
qc
->
ap
;
struct
scsi_cmnd
*
cmd
=
qc
->
scsicmd
;
/* set up SG table */
if
(
cmd
->
use_sg
)
{
if
(
ata_sg_setup
(
qc
))
goto
err_out
;
}
else
{
if
(
ata_sg_setup_one
(
qc
))
goto
err_out
;
}
if
(
qc
->
flags
&
ATA_QCFLAG_SG
)
{
/* set up SG table */
if
(
cmd
->
use_sg
)
{
if
(
ata_sg_setup
(
qc
))
goto
err_out
;
}
else
{
if
(
ata_sg_setup_one
(
qc
))
goto
err_out
;
}
ap
->
ops
->
fill_sg
(
qc
);
ap
->
ops
->
fill_sg
(
qc
);
}
qc
->
ap
->
active_tag
=
qc
->
tag
;
qc
->
flags
|=
ATA_QCFLAG_ACTIVE
;
...
...
@@ -2445,17 +2445,28 @@ static int ata_qc_issue_prot(struct ata_queued_cmd *qc)
case
ATA_PROT_DMA
:
ap
->
ops
->
tf_load
(
ap
,
&
qc
->
tf
);
/* load tf registers */
ap
->
ops
->
bmdma_setup
(
qc
);
/* set up bmdma */
ap
->
ops
->
bmdma_start
(
qc
);
/* initiate bmdma */
break
;
case
ATA_PROT_PIO
:
/* load tf registers, initiate polling pio */
qc
->
flags
|=
ATA_QCFLAG_POLL
;
qc
->
tf
.
ctl
|=
ATA_NIEN
;
/* disable interrupts */
ata_qc_set_polling
(
qc
);
ata_tf_to_host_nolock
(
ap
,
&
qc
->
tf
);
ap
->
pio_task_state
=
PIO_ST
;
queue_work
(
ata_wq
,
&
ap
->
pio_task
);
break
;
case
ATA_PROT_ATAPI
:
ata_tf_to_host_nolock
(
ap
,
&
qc
->
tf
);
queue_work
(
ata_wq
,
&
ap
->
packet_task
);
break
;
case
ATA_PROT_ATAPI_DMA
:
ap
->
ops
->
tf_load
(
ap
,
&
qc
->
tf
);
/* load tf registers */
ap
->
ops
->
bmdma_setup
(
qc
);
/* set up bmdma */
queue_work
(
ata_wq
,
&
ap
->
packet_task
);
break
;
default:
WARN_ON
(
1
);
return
-
1
;
...
...
@@ -2465,14 +2476,14 @@ static int ata_qc_issue_prot(struct ata_queued_cmd *qc)
}
/**
* ata_bmdma_s
tart_mmio -
* @qc:
* ata_bmdma_s
etup_mmio - Set up PCI IDE BMDMA transaction (MMIO)
* @qc:
Info associated with this ATA transaction.
*
* LOCKING:
* spin_lock_irqsave(host_set lock)
*/
void
ata_bmdma_s
tart
_mmio
(
struct
ata_queued_cmd
*
qc
)
void
ata_bmdma_s
etup
_mmio
(
struct
ata_queued_cmd
*
qc
)
{
struct
ata_port
*
ap
=
qc
->
ap
;
unsigned
int
rw
=
(
qc
->
tf
.
flags
&
ATA_TFLAG_WRITE
);
...
...
@@ -2496,8 +2507,24 @@ void ata_bmdma_start_mmio (struct ata_queued_cmd *qc)
/* issue r/w command */
ap
->
ops
->
exec_command
(
ap
,
&
qc
->
tf
);
}
/**
* ata_bmdma_start_mmio - Start a PCI IDE BMDMA transaction (MMIO)
* @qc: Info associated with this ATA transaction.
*
* LOCKING:
* spin_lock_irqsave(host_set lock)
*/
void
ata_bmdma_start_mmio
(
struct
ata_queued_cmd
*
qc
)
{
struct
ata_port
*
ap
=
qc
->
ap
;
void
*
mmio
=
(
void
*
)
ap
->
ioaddr
.
bmdma_addr
;
u8
dmactl
;
/* 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
...
...
@@ -2514,14 +2541,14 @@ void ata_bmdma_start_mmio (struct ata_queued_cmd *qc)
}
/**
* ata_bmdma_s
tart_pio -
* @qc:
* ata_bmdma_s
etup_pio - Set up PCI IDE BMDMA transaction (PIO)
* @qc:
Info associated with this ATA transaction.
*
* LOCKING:
* spin_lock_irqsave(host_set lock)
*/
void
ata_bmdma_s
tart
_pio
(
struct
ata_queued_cmd
*
qc
)
void
ata_bmdma_s
etup
_pio
(
struct
ata_queued_cmd
*
qc
)
{
struct
ata_port
*
ap
=
qc
->
ap
;
unsigned
int
rw
=
(
qc
->
tf
.
flags
&
ATA_TFLAG_WRITE
);
...
...
@@ -2544,24 +2571,38 @@ void ata_bmdma_start_pio (struct ata_queued_cmd *qc)
/* issue r/w command */
ap
->
ops
->
exec_command
(
ap
,
&
qc
->
tf
);
}
/**
* ata_bmdma_start_pio - Start a PCI IDE BMDMA transaction (PIO)
* @qc: Info associated with this ATA transaction.
*
* LOCKING:
* spin_lock_irqsave(host_set lock)
*/
void
ata_bmdma_start_pio
(
struct
ata_queued_cmd
*
qc
)
{
struct
ata_port
*
ap
=
qc
->
ap
;
u8
dmactl
;
/* 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
);
}
/**
* ata_dma_complete -
* @
ap
:
* @
qc
:
* @host_stat:
* @done_late:
*
* LOCKING:
*/
static
void
ata_dma_complete
(
struct
ata_port
*
ap
,
u8
host_stat
,
unsigned
int
done_late
)
static
void
ata_dma_complete
(
struct
ata_queued_cmd
*
qc
,
u8
host_stat
)
{
struct
ata_port
*
ap
=
qc
->
ap
;
VPRINTK
(
"ENTER
\n
"
);
if
(
ap
->
flags
&
ATA_FLAG_MMIO
)
{
...
...
@@ -2592,8 +2633,7 @@ static void ata_dma_complete(struct ata_port *ap, u8 host_stat,
ap
->
id
,
(
u32
)
host_stat
,
(
u32
)
ata_chk_status
(
ap
));
/* get drive status; clear intr; complete txn */
ata_qc_complete
(
ata_qc_from_tag
(
ap
,
ap
->
active_tag
),
ata_wait_idle
(
ap
),
done_late
);
ata_qc_complete
(
qc
,
ata_wait_idle
(
ap
));
}
/**
...
...
@@ -2620,6 +2660,7 @@ inline unsigned int ata_host_intr (struct ata_port *ap,
switch
(
qc
->
tf
.
protocol
)
{
case
ATA_PROT_DMA
:
case
ATA_PROT_ATAPI_DMA
:
if
(
ap
->
flags
&
ATA_FLAG_MMIO
)
{
void
*
mmio
=
(
void
*
)
ap
->
ioaddr
.
bmdma_addr
;
host_stat
=
readb
(
mmio
+
ATA_DMA_STATUS
);
...
...
@@ -2632,14 +2673,14 @@ inline unsigned int ata_host_intr (struct ata_port *ap,
break
;
}
ata_dma_complete
(
ap
,
host_stat
,
0
);
ata_dma_complete
(
qc
,
host_stat
);
handled
=
1
;
break
;
case
ATA_PROT_NODATA
:
/* command completion, but no data xfer */
status
=
ata_busy_wait
(
ap
,
ATA_BUSY
|
ATA_DRQ
,
1000
);
DPRINTK
(
"BUS_NODATA (drv_stat 0x%X)
\n
"
,
status
);
ata_qc_complete
(
qc
,
status
,
0
);
ata_qc_complete
(
qc
,
status
);
handled
=
1
;
break
;
...
...
@@ -2689,7 +2730,7 @@ irqreturn_t ata_interrupt (int irq, void *dev_instance, struct pt_regs *regs)
struct
ata_queued_cmd
*
qc
;
qc
=
ata_qc_from_tag
(
ap
,
ap
->
active_tag
);
if
(
qc
&&
(
(
qc
->
flags
&
ATA_QCFLAG_POLL
)
==
0
))
if
(
qc
&&
(
!
(
qc
->
tf
.
ctl
&
ATA_NIEN
)
))
handled
+=
ata_host_intr
(
ap
,
qc
);
}
}
...
...
@@ -2755,20 +2796,6 @@ static unsigned long ata_thread_iter(struct ata_port *ap)
return
timeout
;
}
void
atapi_start
(
struct
ata_queued_cmd
*
qc
)
{
struct
ata_port
*
ap
=
qc
->
ap
;
qc
->
flags
|=
ATA_QCFLAG_ACTIVE
;
ap
->
active_tag
=
qc
->
tag
;
ata_dev_select
(
ap
,
qc
->
dev
->
devno
,
1
,
0
);
ata_tf_to_host_nolock
(
ap
,
&
qc
->
tf
);
queue_work
(
ata_wq
,
&
ap
->
packet_task
);
VPRINTK
(
"EXIT
\n
"
);
}
/**
* atapi_packet_task - Write CDB bytes to hardware
* @_data: Port to which ATAPI device is attached.
...
...
@@ -2811,7 +2838,7 @@ static void atapi_packet_task(void *_data)
/* if we are DMA'ing, irq handler takes over from here */
if
(
qc
->
tf
.
protocol
==
ATA_PROT_ATAPI_DMA
)
{
/* FIXME: start DMA here
*/
ap
->
ops
->
bmdma_start
(
qc
);
/* initiate bmdma
*/
}
else
{
ap
->
pio_task_state
=
PIO_ST
;
queue_work
(
ata_wq
,
&
ap
->
pio_task
);
...
...
@@ -2820,7 +2847,7 @@ static void atapi_packet_task(void *_data)
return
;
err_out:
ata_qc_complete
(
qc
,
ATA_ERR
,
0
);
ata_qc_complete
(
qc
,
ATA_ERR
);
}
int
ata_port_start
(
struct
ata_port
*
ap
)
...
...
@@ -3475,7 +3502,9 @@ EXPORT_SYMBOL_GPL(ata_port_start);
EXPORT_SYMBOL_GPL
(
ata_port_stop
);
EXPORT_SYMBOL_GPL
(
ata_interrupt
);
EXPORT_SYMBOL_GPL
(
ata_fill_sg
);
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_port_probe
);
EXPORT_SYMBOL_GPL
(
sata_phy_reset
);
...
...
drivers/scsi/libata-scsi.c
View file @
48aa12e1
...
...
@@ -885,53 +885,20 @@ void ata_scsi_badcmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *), u8
}
/**
* atapi_scsi_queuecmd - Send CDB to ATAPI device
* @ap: Port to which ATAPI device is attached.
* @dev: Target device for CDB.
* @cmd: SCSI command being sent to device.
* @done: SCSI command completion function.
*
* Sends CDB to ATAPI device. If the Linux SCSI layer sends a
* non-data command, then this function handles the command
* directly, via polling. Otherwise, the bmdma engine is started.
* atapi_xlat - Initialize PACKET taskfile
* @qc: command structure to be initialized
* @scsicmd: SCSI CDB associated with this PACKET command
*
* LOCKING:
* spin_lock_irqsave(host_set lock)
*
* RETURNS:
* Zero on success, non-zero on failure.
*/
static
void
atapi_scsi_queuecmd
(
struct
ata_port
*
ap
,
struct
ata_device
*
dev
,
struct
scsi_cmnd
*
cmd
,
void
(
*
done
)(
struct
scsi_cmnd
*
))
static
unsigned
int
atapi_xlat
(
struct
ata_queued_cmd
*
qc
,
u8
*
scsicmd
)
{
struct
ata_queued_cmd
*
qc
;
u8
*
scsicmd
=
cmd
->
cmnd
;
VPRINTK
(
"ENTER, drv_stat = 0x%x
\n
"
,
ata_chk_status
(
ap
));
if
(
cmd
->
sc_data_direction
==
SCSI_DATA_UNKNOWN
)
{
DPRINTK
(
"unknown data, scsicmd 0x%x
\n
"
,
scsicmd
[
0
]);
ata_bad_cdb
(
cmd
,
done
);
return
;
}
switch
(
scsicmd
[
0
])
{
case
READ_6
:
case
WRITE_6
:
case
MODE_SELECT
:
case
MODE_SENSE
:
DPRINTK
(
"read6/write6/modesel/modesense trap
\n
"
);
ata_bad_scsiop
(
cmd
,
done
);
return
;
default:
/* do nothing */
break
;
}
qc
=
ata_scsi_qc_new
(
ap
,
dev
,
cmd
,
done
);
if
(
!
qc
)
{
printk
(
KERN_ERR
"ata%u: command queue empty
\n
"
,
ap
->
id
);
return
;
}
struct
scsi_cmnd
*
cmd
=
qc
->
scsicmd
;
qc
->
flags
|=
ATA_QCFLAG_ATAPI
;
...
...
@@ -943,17 +910,19 @@ static void atapi_scsi_queuecmd(struct ata_port *ap, struct ata_device *dev,
qc
->
tf
.
command
=
ATA_CMD_PACKET
;
if
(
cmd
->
sc_data_direction
==
SCSI_DATA_NONE
)
{
if
((
cmd
->
sc_data_direction
==
SCSI_DATA_NONE
)
||
((
qc
->
flags
&
ATA_QCFLAG_DMA
)
==
0
))
{
ata_qc_set_polling
(
qc
);
qc
->
tf
.
protocol
=
ATA_PROT_ATAPI
;
qc
->
flags
|=
ATA_QCFLAG_POLL
;
qc
->
tf
.
ctl
|=
ATA_NIEN
;
/* disable interrupts */
qc
->
tf
.
lbam
=
(
8
*
1024
)
&
0xff
;
qc
->
tf
.
lbah
=
(
8
*
1024
)
>>
8
;
}
else
{
qc
->
tf
.
protocol
=
ATA_PROT_ATAPI_DMA
;
qc
->
flags
|=
ATA_QCFLAG_SG
;
/* data is present; dma-map it */
qc
->
tf
.
protocol
=
ATA_PROT_ATAPI_DMA
;
qc
->
tf
.
feature
|=
ATAPI_PKT_DMA
;
}
atapi_start
(
qc
)
;
return
0
;
}
/**
...
...
@@ -1092,7 +1061,7 @@ int ata_scsi_queuecmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *))
else
ata_scsi_simulate
(
ap
,
dev
,
cmd
,
done
);
}
else
ata
pi_scsi_queuecmd
(
ap
,
dev
,
cmd
,
done
);
ata
_scsi_translate
(
ap
,
dev
,
cmd
,
done
,
atapi_xlat
);
out_unlock:
return
0
;
...
...
drivers/scsi/libata.h
View file @
48aa12e1
...
...
@@ -44,7 +44,6 @@ extern int ata_qc_issue(struct ata_queued_cmd *qc);
extern
void
ata_dev_select
(
struct
ata_port
*
ap
,
unsigned
int
device
,
unsigned
int
wait
,
unsigned
int
can_sleep
);
extern
void
ata_tf_to_host_nolock
(
struct
ata_port
*
ap
,
struct
ata_taskfile
*
tf
);
extern
void
atapi_start
(
struct
ata_queued_cmd
*
qc
);
/* libata-scsi.c */
...
...
drivers/scsi/sata_promise.c
View file @
48aa12e1
...
...
@@ -74,6 +74,7 @@ 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
);
...
...
@@ -111,6 +112,7 @@ 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
,
.
fill_sg
=
pdc_fill_sg
,
.
eng_timeout
=
pdc_eng_timeout
,
...
...
@@ -285,8 +287,7 @@ static inline void pdc_dma_complete (struct ata_port *ap,
u8
err_bit
=
have_err
?
ATA_ERR
:
0
;
/* get drive status; clear intr; complete txn */
ata_qc_complete
(
ata_qc_from_tag
(
ap
,
ap
->
active_tag
),
ata_wait_idle
(
ap
)
|
err_bit
,
0
);
ata_qc_complete
(
qc
,
ata_wait_idle
(
ap
)
|
err_bit
);
}
static
void
pdc_eng_timeout
(
struct
ata_port
*
ap
)
...
...
@@ -314,8 +315,7 @@ static void pdc_eng_timeout(struct ata_port *ap)
switch
(
qc
->
tf
.
protocol
)
{
case
ATA_PROT_DMA
:
printk
(
KERN_ERR
"ata%u: DMA timeout
\n
"
,
ap
->
id
);
ata_qc_complete
(
ata_qc_from_tag
(
ap
,
ap
->
active_tag
),
ata_wait_idle
(
ap
)
|
ATA_ERR
,
0
);
ata_qc_complete
(
qc
,
ata_wait_idle
(
ap
)
|
ATA_ERR
);
break
;
case
ATA_PROT_NODATA
:
...
...
@@ -324,7 +324,7 @@ static void pdc_eng_timeout(struct ata_port *ap)
printk
(
KERN_ERR
"ata%u: command 0x%x timeout, stat 0x%x
\n
"
,
ap
->
id
,
qc
->
tf
.
command
,
drv_stat
);
ata_qc_complete
(
qc
,
drv_stat
,
1
);
ata_qc_complete
(
qc
,
drv_stat
);
break
;
default:
...
...
@@ -333,7 +333,7 @@ static void pdc_eng_timeout(struct ata_port *ap)
printk
(
KERN_ERR
"ata%u: unknown timeout, cmd 0x%x stat 0x%x
\n
"
,
ap
->
id
,
qc
->
tf
.
command
,
drv_stat
);
ata_qc_complete
(
qc
,
drv_stat
,
1
);
ata_qc_complete
(
qc
,
drv_stat
);
break
;
}
...
...
@@ -366,7 +366,7 @@ static inline unsigned int pdc_host_intr( struct ata_port *ap,
DPRINTK
(
"BUS_NODATA (drv_stat 0x%X)
\n
"
,
status
);
if
(
have_err
)
status
|=
ATA_ERR
;
ata_qc_complete
(
qc
,
status
,
0
);
ata_qc_complete
(
qc
,
status
);
handled
=
1
;
break
;
...
...
@@ -419,7 +419,7 @@ static irqreturn_t pdc_interrupt (int irq, void *dev_instance, struct pt_regs *r
struct
ata_queued_cmd
*
qc
;
qc
=
ata_qc_from_tag
(
ap
,
ap
->
active_tag
);
if
(
qc
&&
(
(
qc
->
flags
&
ATA_QCFLAG_POLL
)
==
0
))
if
(
qc
&&
(
!
(
qc
->
tf
.
ctl
&
ATA_NIEN
)
))
handled
+=
pdc_host_intr
(
ap
,
qc
);
}
}
...
...
@@ -431,6 +431,12 @@ 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
)
{
struct
ata_port
*
ap
=
qc
->
ap
;
...
...
drivers/scsi/sata_sil.c
View file @
48aa12e1
...
...
@@ -129,6 +129,7 @@ static struct ata_port_operations sil_ops = {
.
exec_command
=
ata_exec_command_mmio
,
.
phy_reset
=
sata_phy_reset
,
.
post_set_mode
=
sil_post_set_mode
,
.
bmdma_setup
=
ata_bmdma_setup_mmio
,
.
bmdma_start
=
ata_bmdma_start_mmio
,
.
fill_sg
=
ata_fill_sg
,
.
eng_timeout
=
ata_eng_timeout
,
...
...
drivers/scsi/sata_sis.c
View file @
48aa12e1
...
...
@@ -98,6 +98,7 @@ static struct ata_port_operations sis_ops = {
.
check_status
=
ata_check_status_pio
,
.
exec_command
=
ata_exec_command_pio
,
.
phy_reset
=
sata_phy_reset
,
.
bmdma_setup
=
ata_bmdma_setup_pio
,
.
bmdma_start
=
ata_bmdma_start_pio
,
.
fill_sg
=
ata_fill_sg
,
.
eng_timeout
=
ata_eng_timeout
,
...
...
drivers/scsi/sata_svw.c
View file @
48aa12e1
...
...
@@ -231,6 +231,7 @@ 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
,
.
bmdma_setup
=
ata_bmdma_setup_mmio
,
.
bmdma_start
=
ata_bmdma_start_mmio
,
.
fill_sg
=
ata_fill_sg
,
.
eng_timeout
=
ata_eng_timeout
,
...
...
drivers/scsi/sata_sx4.c
View file @
48aa12e1
...
...
@@ -146,6 +146,7 @@ struct pdc_host_priv {
static
int
pdc_sata_init_one
(
struct
pci_dev
*
pdev
,
const
struct
pci_device_id
*
ent
);
static
void
pdc20621_dma_setup
(
struct
ata_queued_cmd
*
qc
);
static
void
pdc20621_dma_start
(
struct
ata_queued_cmd
*
qc
);
static
irqreturn_t
pdc20621_interrupt
(
int
irq
,
void
*
dev_instance
,
struct
pt_regs
*
regs
);
static
void
pdc_eng_timeout
(
struct
ata_port
*
ap
);
...
...
@@ -197,6 +198,7 @@ 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
,
.
bmdma_setup
=
pdc20621_dma_setup
,
.
bmdma_start
=
pdc20621_dma_start
,
.
fill_sg
=
pdc20621_fill_sg
,
.
eng_timeout
=
pdc_eng_timeout
,
...
...
@@ -568,6 +570,12 @@ static void pdc20621_dump_hdma(struct ata_queued_cmd *qc)
static
inline
void
pdc20621_dump_hdma
(
struct
ata_queued_cmd
*
qc
)
{
}
#endif
/* ATA_VERBOSE_DEBUG */
static
void
pdc20621_dma_setup
(
struct
ata_queued_cmd
*
qc
)
{
/* nothing for now. later, we will call standard
* code in libata-core for ATAPI here */
}
static
void
pdc20621_dma_start
(
struct
ata_queued_cmd
*
qc
)
{
struct
ata_port
*
ap
=
qc
->
ap
;
...
...
@@ -681,7 +689,7 @@ static inline unsigned int pdc20621_host_intr( struct ata_port *ap,
status
=
ata_busy_wait
(
ap
,
ATA_BUSY
|
ATA_DRQ
,
1000
);
DPRINTK
(
"BUS_NODATA (drv_stat 0x%X)
\n
"
,
status
);
ata_qc_complete
(
qc
,
status
,
0
);
ata_qc_complete
(
qc
,
status
);
handled
=
1
;
}
else
{
...
...
@@ -740,7 +748,7 @@ static irqreturn_t pdc20621_interrupt (int irq, void *dev_instance, struct pt_re
struct
ata_queued_cmd
*
qc
;
qc
=
ata_qc_from_tag
(
ap
,
ap
->
active_tag
);
if
(
qc
&&
(
(
qc
->
flags
&
ATA_QCFLAG_POLL
)
==
0
))
if
(
qc
&&
(
!
(
qc
->
tf
.
ctl
&
ATA_NIEN
)
))
handled
+=
pdc20621_host_intr
(
ap
,
qc
,
(
i
>
4
),
mmio_base
);
}
...
...
@@ -762,8 +770,7 @@ static inline void pdc_dma_complete (struct ata_port *ap,
u8
err_bit
=
have_err
?
ATA_ERR
:
0
;
/* get drive status; clear intr; complete txn */
ata_qc_complete
(
ata_qc_from_tag
(
ap
,
ap
->
active_tag
),
ata_wait_idle
(
ap
)
|
err_bit
,
0
);
ata_qc_complete
(
qc
,
ata_wait_idle
(
ap
)
|
err_bit
);
}
static
void
pdc_eng_timeout
(
struct
ata_port
*
ap
)
...
...
@@ -791,8 +798,7 @@ static void pdc_eng_timeout(struct ata_port *ap)
switch
(
qc
->
tf
.
protocol
)
{
case
ATA_PROT_DMA
:
printk
(
KERN_ERR
"ata%u: DMA timeout
\n
"
,
ap
->
id
);
ata_qc_complete
(
ata_qc_from_tag
(
ap
,
ap
->
active_tag
),
ata_wait_idle
(
ap
)
|
ATA_ERR
,
0
);
ata_qc_complete
(
qc
,
ata_wait_idle
(
ap
)
|
ATA_ERR
);
break
;
case
ATA_PROT_NODATA
:
...
...
@@ -801,7 +807,7 @@ static void pdc_eng_timeout(struct ata_port *ap)
printk
(
KERN_ERR
"ata%u: command 0x%x timeout, stat 0x%x
\n
"
,
ap
->
id
,
qc
->
tf
.
command
,
drv_stat
);
ata_qc_complete
(
qc
,
drv_stat
,
1
);
ata_qc_complete
(
qc
,
drv_stat
);
break
;
default:
...
...
@@ -810,7 +816,7 @@ static void pdc_eng_timeout(struct ata_port *ap)
printk
(
KERN_ERR
"ata%u: unknown timeout, cmd 0x%x stat 0x%x
\n
"
,
ap
->
id
,
qc
->
tf
.
command
,
drv_stat
);
ata_qc_complete
(
qc
,
drv_stat
,
1
);
ata_qc_complete
(
qc
,
drv_stat
);
break
;
}
...
...
drivers/scsi/sata_via.c
View file @
48aa12e1
...
...
@@ -106,6 +106,7 @@ static struct ata_port_operations svia_sata_ops = {
.
phy_reset
=
sata_phy_reset
,
.
bmdma_setup
=
ata_bmdma_setup_pio
,
.
bmdma_start
=
ata_bmdma_start_pio
,
.
fill_sg
=
ata_fill_sg
,
.
eng_timeout
=
ata_eng_timeout
,
...
...
drivers/scsi/sata_vsc.c
View file @
48aa12e1
...
...
@@ -175,7 +175,7 @@ irqreturn_t vsc_sata_interrupt (int irq, void *dev_instance, struct pt_regs *reg
struct
ata_queued_cmd
*
qc
;
qc
=
ata_qc_from_tag
(
ap
,
ap
->
active_tag
);
if
(
qc
&&
(
(
qc
->
flags
&
ATA_QCFLAG_POLL
)
==
0
))
if
(
qc
&&
(
!
(
qc
->
tf
.
ctl
&
ATA_NIEN
)
))
handled
+=
ata_host_intr
(
ap
,
qc
);
}
}
...
...
@@ -213,6 +213,7 @@ 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
,
.
bmdma_setup
=
ata_bmdma_setup_mmio
,
.
bmdma_start
=
ata_bmdma_start_mmio
,
.
fill_sg
=
ata_fill_sg
,
.
eng_timeout
=
ata_eng_timeout
,
...
...
include/linux/libata.h
View file @
48aa12e1
...
...
@@ -112,7 +112,6 @@ enum {
ATA_QCFLAG_DMA
=
(
1
<<
2
),
/* data delivered via DMA */
ATA_QCFLAG_ATAPI
=
(
1
<<
3
),
/* is ATAPI packet command? */
ATA_QCFLAG_SG
=
(
1
<<
4
),
/* have s/g table? */
ATA_QCFLAG_POLL
=
(
1
<<
5
),
/* polling, no interrupts */
/* various lengths of time */
ATA_TMOUT_EDD
=
5
*
HZ
,
/* hueristic */
...
...
@@ -335,6 +334,7 @@ struct ata_port_operations {
void
(
*
phy_reset
)
(
struct
ata_port
*
ap
);
void
(
*
post_set_mode
)
(
struct
ata_port
*
ap
);
void
(
*
bmdma_setup
)
(
struct
ata_queued_cmd
*
qc
);
void
(
*
bmdma_start
)
(
struct
ata_queued_cmd
*
qc
);
void
(
*
fill_sg
)
(
struct
ata_queued_cmd
*
qc
);
void
(
*
eng_timeout
)
(
struct
ata_port
*
ap
);
...
...
@@ -397,10 +397,12 @@ 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_fill_sg
(
struct
ata_queued_cmd
*
qc
);
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
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
,
unsigned
int
done_late
);
extern
void
ata_qc_complete
(
struct
ata_queued_cmd
*
qc
,
u8
drv_stat
);
extern
void
ata_eng_timeout
(
struct
ata_port
*
ap
);
extern
int
ata_std_bios_param
(
struct
scsi_device
*
sdev
,
struct
block_device
*
bdev
,
...
...
@@ -473,6 +475,12 @@ static inline u8 ata_wait_idle(struct ata_port *ap)
return
status
;
}
static
inline
void
ata_qc_set_polling
(
struct
ata_queued_cmd
*
qc
)
{
qc
->
flags
&=
~
ATA_QCFLAG_DMA
;
qc
->
tf
.
ctl
|=
ATA_NIEN
;
}
static
inline
struct
ata_queued_cmd
*
ata_qc_from_tag
(
struct
ata_port
*
ap
,
unsigned
int
tag
)
{
...
...
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