Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
linux-davinci
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
linux
linux-davinci
Commits
1cb9e8e0
Commit
1cb9e8e0
authored
Jan 04, 2006
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'upstream' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/libata-dev
parents
d779188d
a18ceba7
Changes
15
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
15 changed files
with
412 additions
and
252 deletions
+412
-252
Documentation/kernel-parameters.txt
Documentation/kernel-parameters.txt
+8
-0
drivers/pci/quirks.c
drivers/pci/quirks.c
+30
-0
drivers/scsi/ahci.c
drivers/scsi/ahci.c
+9
-5
drivers/scsi/ata_piix.c
drivers/scsi/ata_piix.c
+93
-34
drivers/scsi/libata-core.c
drivers/scsi/libata-core.c
+202
-160
drivers/scsi/libata-scsi.c
drivers/scsi/libata-scsi.c
+13
-11
drivers/scsi/libata.h
drivers/scsi/libata.h
+0
-1
drivers/scsi/pdc_adma.c
drivers/scsi/pdc_adma.c
+5
-6
drivers/scsi/sata_mv.c
drivers/scsi/sata_mv.c
+7
-4
drivers/scsi/sata_promise.c
drivers/scsi/sata_promise.c
+11
-9
drivers/scsi/sata_qstor.c
drivers/scsi/sata_qstor.c
+5
-4
drivers/scsi/sata_sil.c
drivers/scsi/sata_sil.c
+1
-1
drivers/scsi/sata_sil24.c
drivers/scsi/sata_sil24.c
+10
-5
drivers/scsi/sata_sx4.c
drivers/scsi/sata_sx4.c
+11
-6
include/linux/libata.h
include/linux/libata.h
+7
-6
No files found.
Documentation/kernel-parameters.txt
View file @
1cb9e8e0
...
...
@@ -633,6 +633,14 @@ running once the system is up.
inport.irq= [HW] Inport (ATI XL and Microsoft) busmouse driver
Format: <irq>
combined_mode= [HW] control which driver uses IDE ports in combined
mode: legacy IDE driver, libata, or both
(in the libata case, libata.atapi_enabled=1 may be
useful as well). Note that using the ide or libata
options may affect your device naming (e.g. by
changing hdc to sdb).
Format: combined (default), ide, or libata
inttest= [IA64]
io7= [HW] IO7 for Marvel based alpha systems
...
...
drivers/pci/quirks.c
View file @
1cb9e8e0
...
...
@@ -1098,6 +1098,23 @@ static void __init quirk_alder_ioapic(struct pci_dev *pdev)
DECLARE_PCI_FIXUP_HEADER
(
PCI_VENDOR_ID_INTEL
,
PCI_DEVICE_ID_INTEL_EESSC
,
quirk_alder_ioapic
);
#endif
enum
ide_combined_type
{
COMBINED
=
0
,
IDE
=
1
,
LIBATA
=
2
};
/* Defaults to combined */
static
enum
ide_combined_type
combined_mode
;
static
int
__init
combined_setup
(
char
*
str
)
{
if
(
!
strncmp
(
str
,
"ide"
,
3
))
combined_mode
=
IDE
;
else
if
(
!
strncmp
(
str
,
"libata"
,
6
))
combined_mode
=
LIBATA
;
else
/* "combined" or anything else defaults to old behavior */
combined_mode
=
COMBINED
;
return
1
;
}
__setup
(
"combined_mode="
,
combined_setup
);
#ifdef CONFIG_SCSI_SATA_INTEL_COMBINED
static
void
__devinit
quirk_intel_ide_combined
(
struct
pci_dev
*
pdev
)
{
...
...
@@ -1164,6 +1181,19 @@ static void __devinit quirk_intel_ide_combined(struct pci_dev *pdev)
if
(
prog
&
comb
)
return
;
/* Don't reserve any so the IDE driver can get them (but only if
* combined_mode=ide).
*/
if
(
combined_mode
==
IDE
)
return
;
/* Grab them both for libata if combined_mode=libata. */
if
(
combined_mode
==
LIBATA
)
{
request_region
(
0x1f0
,
8
,
"libata"
);
/* port 0 */
request_region
(
0x170
,
8
,
"libata"
);
/* port 1 */
return
;
}
/* SATA port is in legacy mode. Reserve port so that
* IDE driver does not attempt to use it. If request_region
* fails, it will be obvious at boot time, so we don't bother
...
...
drivers/scsi/ahci.c
View file @
1cb9e8e0
...
...
@@ -243,7 +243,7 @@ static const struct ata_port_operations ahci_ops = {
.
port_stop
=
ahci_port_stop
,
};
static
struct
ata_port_info
ahci_port_info
[]
=
{
static
const
struct
ata_port_info
ahci_port_info
[]
=
{
/* board_ahci */
{
.
sht
=
&
ahci_sht
,
...
...
@@ -643,7 +643,8 @@ static void ahci_eng_timeout(struct ata_port *ap)
* not being called from the SCSI EH.
*/
qc
->
scsidone
=
scsi_finish_command
;
ata_qc_complete
(
qc
,
AC_ERR_OTHER
);
qc
->
err_mask
|=
AC_ERR_OTHER
;
ata_qc_complete
(
qc
);
}
spin_unlock_irqrestore
(
&
host_set
->
lock
,
flags
);
...
...
@@ -664,7 +665,8 @@ static inline int ahci_host_intr(struct ata_port *ap, struct ata_queued_cmd *qc)
ci
=
readl
(
port_mmio
+
PORT_CMD_ISSUE
);
if
(
likely
((
ci
&
0x1
)
==
0
))
{
if
(
qc
)
{
ata_qc_complete
(
qc
,
0
);
assert
(
qc
->
err_mask
==
0
);
ata_qc_complete
(
qc
);
qc
=
NULL
;
}
}
...
...
@@ -681,8 +683,10 @@ static inline int ahci_host_intr(struct ata_port *ap, struct ata_queued_cmd *qc)
/* command processing has stopped due to error; restart */
ahci_restart_port
(
ap
,
status
);
if
(
qc
)
ata_qc_complete
(
qc
,
err_mask
);
if
(
qc
)
{
qc
->
err_mask
|=
AC_ERR_OTHER
;
ata_qc_complete
(
qc
);
}
}
return
1
;
...
...
drivers/scsi/ata_piix.c
View file @
1cb9e8e0
...
...
@@ -37,6 +37,49 @@
*
* Hardware documentation available at http://developer.intel.com/
*
* Documentation
* Publically available from Intel web site. Errata documentation
* is also publically available. As an aide to anyone hacking on this
* driver the list of errata that are relevant is below.going back to
* PIIX4. Older device documentation is now a bit tricky to find.
*
* The chipsets all follow very much the same design. The orginal Triton
* series chipsets do _not_ support independant device timings, but this
* is fixed in Triton II. With the odd mobile exception the chips then
* change little except in gaining more modes until SATA arrives. This
* driver supports only the chips with independant timing (that is those
* with SITRE and the 0x44 timing register). See pata_oldpiix and pata_mpiix
* for the early chip drivers.
*
* Errata of note:
*
* Unfixable
* PIIX4 errata #9 - Only on ultra obscure hw
* ICH3 errata #13 - Not observed to affect real hw
* by Intel
*
* Things we must deal with
* PIIX4 errata #10 - BM IDE hang with non UDMA
* (must stop/start dma to recover)
* 440MX errata #15 - As PIIX4 errata #10
* PIIX4 errata #15 - Must not read control registers
* during a PIO transfer
* 440MX errata #13 - As PIIX4 errata #15
* ICH2 errata #21 - DMA mode 0 doesn't work right
* ICH0/1 errata #55 - As ICH2 errata #21
* ICH2 spec c #9 - Extra operations needed to handle
* drive hotswap [NOT YET SUPPORTED]
* ICH2 spec c #20 - IDE PRD must not cross a 64K boundary
* and must be dword aligned
* ICH2 spec c #24 - UDMA mode 4,5 t85/86 should be 6ns not 3.3
*
* Should have been BIOS fixed:
* 450NX: errata #19 - DMA hangs on old 450NX
* 450NX: errata #20 - DMA hangs on old 450NX
* 450NX: errata #25 - Corruption with DMA on old 450NX
* ICH3 errata #15 - IDE deadlock under high load
* (BIOS must set dev 31 fn 0 bit 23)
* ICH3 errata #18 - Don't use native mode
*/
#include <linux/kernel.h>
...
...
@@ -78,9 +121,7 @@ enum {
ich5_sata
=
1
,
piix4_pata
=
2
,
ich6_sata
=
3
,
ich6_sata_rm
=
4
,
ich7_sata
=
5
,
esb2_sata
=
6
,
ich6_sata_ahci
=
4
,
PIIX_AHCI_DEVICE
=
6
,
};
...
...
@@ -111,11 +152,11 @@ static const struct pci_device_id piix_pci_tbl[] = {
{
0x8086
,
0x25a3
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
ich5_sata
},
{
0x8086
,
0x25b0
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
ich5_sata
},
{
0x8086
,
0x2651
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
ich6_sata
},
{
0x8086
,
0x2652
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
ich6_sata_
rm
},
{
0x8086
,
0x2653
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
ich6_sata_
rm
},
{
0x8086
,
0x27c0
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
ich
7_sata
},
{
0x8086
,
0x27c4
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
ich
7_sata
},
{
0x8086
,
0x2680
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
esb2_sata
},
{
0x8086
,
0x2652
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
ich6_sata_
ahci
},
{
0x8086
,
0x2653
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
ich6_sata_
ahci
},
{
0x8086
,
0x27c0
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
ich
6_sata_ahci
},
{
0x8086
,
0x27c4
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
ich
6_sata_ahci
},
{
0x8086
,
0x2680
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
ich6_sata_ahci
},
{
}
/* terminate list */
};
...
...
@@ -258,31 +299,7 @@ static struct ata_port_info piix_port_info[] = {
.
port_ops
=
&
piix_sata_ops
,
},
/* ich6_sata_rm */
{
.
sht
=
&
piix_sht
,
.
host_flags
=
ATA_FLAG_SATA
|
ATA_FLAG_SRST
|
PIIX_FLAG_COMBINED
|
PIIX_FLAG_CHECKINTR
|
ATA_FLAG_SLAVE_POSS
|
PIIX_FLAG_AHCI
,
.
pio_mask
=
0x1f
,
/* pio0-4 */
.
mwdma_mask
=
0x07
,
/* mwdma0-2 */
.
udma_mask
=
0x7f
,
/* udma0-6 */
.
port_ops
=
&
piix_sata_ops
,
},
/* ich7_sata */
{
.
sht
=
&
piix_sht
,
.
host_flags
=
ATA_FLAG_SATA
|
ATA_FLAG_SRST
|
PIIX_FLAG_COMBINED
|
PIIX_FLAG_CHECKINTR
|
ATA_FLAG_SLAVE_POSS
|
PIIX_FLAG_AHCI
,
.
pio_mask
=
0x1f
,
/* pio0-4 */
.
mwdma_mask
=
0x07
,
/* mwdma0-2 */
.
udma_mask
=
0x7f
,
/* udma0-6 */
.
port_ops
=
&
piix_sata_ops
,
},
/* esb2_sata */
/* ich6_sata_ahci */
{
.
sht
=
&
piix_sht
,
.
host_flags
=
ATA_FLAG_SATA
|
ATA_FLAG_SRST
|
...
...
@@ -602,6 +619,40 @@ static int piix_disable_ahci(struct pci_dev *pdev)
return
rc
;
}
/**
* piix_check_450nx_errata - Check for problem 450NX setup
*
* Check for the present of 450NX errata #19 and errata #25. If
* they are found return an error code so we can turn off DMA
*/
static
int
__devinit
piix_check_450nx_errata
(
struct
pci_dev
*
ata_dev
)
{
struct
pci_dev
*
pdev
=
NULL
;
u16
cfg
;
u8
rev
;
int
no_piix_dma
=
0
;
while
((
pdev
=
pci_get_device
(
PCI_VENDOR_ID_INTEL
,
PCI_DEVICE_ID_INTEL_82454NX
,
pdev
))
!=
NULL
)
{
/* Look for 450NX PXB. Check for problem configurations
A PCI quirk checks bit 6 already */
pci_read_config_byte
(
pdev
,
PCI_REVISION_ID
,
&
rev
);
pci_read_config_word
(
pdev
,
0x41
,
&
cfg
);
/* Only on the original revision: IDE DMA can hang */
if
(
rev
==
0x00
)
no_piix_dma
=
1
;
/* On all revisions below 5 PXB bus lock must be disabled for IDE */
else
if
(
cfg
&
(
1
<<
14
)
&&
rev
<
5
)
no_piix_dma
=
2
;
}
if
(
no_piix_dma
)
dev_printk
(
KERN_WARNING
,
&
ata_dev
->
dev
,
"450NX errata present, disabling IDE DMA.
\n
"
);
if
(
no_piix_dma
==
2
)
dev_printk
(
KERN_WARNING
,
&
ata_dev
->
dev
,
"A BIOS update may resolve this.
\n
"
);
return
no_piix_dma
;
}
/**
* piix_init_one - Register PIIX ATA PCI device with kernel services
* @pdev: PCI device to register
...
...
@@ -676,7 +727,15 @@ static int piix_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
"combined mode detected (p=%u, s=%u)
\n
"
,
pata_chan
,
sata_chan
);
}
if
(
piix_check_450nx_errata
(
pdev
))
{
/* This writes into the master table but it does not
really matter for this errata as we will apply it to
all the PIIX devices on the board */
port_info
[
0
]
->
mwdma_mask
=
0
;
port_info
[
0
]
->
udma_mask
=
0
;
port_info
[
1
]
->
mwdma_mask
=
0
;
port_info
[
1
]
->
udma_mask
=
0
;
}
return
ata_pci_init_one
(
pdev
,
port_info
,
2
);
}
...
...
drivers/scsi/libata-core.c
View file @
1cb9e8e0
This diff is collapsed.
Click to expand it.
drivers/scsi/libata-scsi.c
View file @
1cb9e8e0
...
...
@@ -418,7 +418,7 @@ void ata_to_sense_error(unsigned id, u8 drv_stat, u8 drv_err, u8 *sk, u8 *asc,
int
i
;
/* Based on the 3ware driver translation table */
static
unsigned
char
sense_table
[][
4
]
=
{
static
const
unsigned
char
sense_table
[][
4
]
=
{
/* BBD|ECC|ID|MAR */
{
0xd1
,
ABORTED_COMMAND
,
0x00
,
0x00
},
// Device busy Aborted command
/* BBD|ECC|ID */
...
...
@@ -449,7 +449,7 @@ void ata_to_sense_error(unsigned id, u8 drv_stat, u8 drv_err, u8 *sk, u8 *asc,
{
0x80
,
MEDIUM_ERROR
,
0x11
,
0x04
},
// Block marked bad Medium error, unrecovered read error
{
0xFF
,
0xFF
,
0xFF
,
0xFF
},
// END mark
};
static
unsigned
char
stat_table
[][
4
]
=
{
static
const
unsigned
char
stat_table
[][
4
]
=
{
/* Must be first because BUSY means no other bits valid */
{
0x80
,
ABORTED_COMMAND
,
0x47
,
0x00
},
// Busy, fake parity for now
{
0x20
,
HARDWARE_ERROR
,
0x00
,
0x00
},
// Device fault
...
...
@@ -1203,12 +1203,11 @@ nothing_to_do:
return
1
;
}
static
int
ata_scsi_qc_complete
(
struct
ata_queued_cmd
*
qc
,
unsigned
int
err_mask
)
static
int
ata_scsi_qc_complete
(
struct
ata_queued_cmd
*
qc
)
{
struct
scsi_cmnd
*
cmd
=
qc
->
scsicmd
;
u8
*
cdb
=
cmd
->
cmnd
;
int
need_sense
=
(
err_mask
!=
0
);
int
need_sense
=
(
qc
->
err_mask
!=
0
);
/* For ATA pass thru (SAT) commands, generate a sense block if
* user mandated it or if there's an error. Note that if we
...
...
@@ -1532,7 +1531,7 @@ unsigned int ata_scsiop_inq_80(struct ata_scsi_args *args, u8 *rbuf,
return
0
;
}
static
const
char
*
inq_83_str
=
"Linux ATA-SCSI simulator"
;
static
const
char
*
const
inq_83_str
=
"Linux ATA-SCSI simulator"
;
/**
* ata_scsiop_inq_83 - Simulate INQUIRY EVPD page 83, device identity
...
...
@@ -1955,9 +1954,9 @@ void ata_scsi_badcmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *), u8
done
(
cmd
);
}
static
int
atapi_sense_complete
(
struct
ata_queued_cmd
*
qc
,
unsigned
int
err_mask
)
static
int
atapi_sense_complete
(
struct
ata_queued_cmd
*
qc
)
{
if
(
err_mask
&&
((
err_mask
&
AC_ERR_DEV
)
==
0
))
if
(
qc
->
err_mask
&&
((
qc
->
err_mask
&
AC_ERR_DEV
)
==
0
))
/* FIXME: not quite right; we don't want the
* translation of taskfile registers into
* a sense descriptors, since that's only
...
...
@@ -2015,15 +2014,18 @@ static void atapi_request_sense(struct ata_queued_cmd *qc)
qc
->
complete_fn
=
atapi_sense_complete
;
if
(
ata_qc_issue
(
qc
))
ata_qc_complete
(
qc
,
AC_ERR_OTHER
);
if
(
ata_qc_issue
(
qc
))
{
qc
->
err_mask
|=
AC_ERR_OTHER
;
ata_qc_complete
(
qc
);
}
DPRINTK
(
"EXIT
\n
"
);
}
static
int
atapi_qc_complete
(
struct
ata_queued_cmd
*
qc
,
unsigned
int
err_mask
)
static
int
atapi_qc_complete
(
struct
ata_queued_cmd
*
qc
)
{
struct
scsi_cmnd
*
cmd
=
qc
->
scsicmd
;
unsigned
int
err_mask
=
qc
->
err_mask
;
VPRINTK
(
"ENTER, err_mask 0x%X
\n
"
,
err_mask
);
...
...
drivers/scsi/libata.h
View file @
1cb9e8e0
...
...
@@ -39,7 +39,6 @@ struct ata_scsi_args {
/* libata-core.c */
extern
int
atapi_enabled
;
extern
int
ata_qc_complete_noop
(
struct
ata_queued_cmd
*
qc
,
unsigned
int
err_mask
);
extern
struct
ata_queued_cmd
*
ata_qc_new_init
(
struct
ata_port
*
ap
,
struct
ata_device
*
dev
);
extern
void
ata_rwcmd_protocol
(
struct
ata_queued_cmd
*
qc
);
...
...
drivers/scsi/pdc_adma.c
View file @
1cb9e8e0
...
...
@@ -464,14 +464,12 @@ static inline unsigned int adma_intr_pkt(struct ata_host_set *host_set)
continue
;
qc
=
ata_qc_from_tag
(
ap
,
ap
->
active_tag
);
if
(
qc
&&
(
!
(
qc
->
tf
.
ctl
&
ATA_NIEN
)))
{
unsigned
int
err_mask
=
0
;
if
((
status
&
(
aPERR
|
aPSD
|
aUIRQ
)))
err_mask
=
AC_ERR_OTHER
;
qc
->
err_mask
|
=
AC_ERR_OTHER
;
else
if
(
pp
->
pkt
[
0
]
!=
cDONE
)
err_mask
=
AC_ERR_OTHER
;
qc
->
err_mask
|
=
AC_ERR_OTHER
;
ata_qc_complete
(
qc
,
err_mask
);
ata_qc_complete
(
qc
);
}
}
return
handled
;
...
...
@@ -501,7 +499,8 @@ static inline unsigned int adma_intr_mmio(struct ata_host_set *host_set)
/* complete taskfile transaction */
pp
->
state
=
adma_state_idle
;
ata_qc_complete
(
qc
,
ac_err_mask
(
status
));
qc
->
err_mask
|=
ac_err_mask
(
status
);
ata_qc_complete
(
qc
);
handled
=
1
;
}
}
...
...
drivers/scsi/sata_mv.c
View file @
1cb9e8e0
...
...
@@ -431,7 +431,7 @@ static const struct ata_port_operations mv6_ops = {
.
host_stop
=
mv_host_stop
,
};
static
struct
ata_port_info
mv_port_info
[]
=
{
static
const
struct
ata_port_info
mv_port_info
[]
=
{
{
/* chip_504x */
.
sht
=
&
mv_sht
,
.
host_flags
=
MV_COMMON_FLAGS
,
...
...
@@ -1243,8 +1243,10 @@ static void mv_host_intr(struct ata_host_set *host_set, u32 relevant,
VPRINTK
(
"port %u IRQ found for qc, "
"ata_status 0x%x
\n
"
,
port
,
ata_status
);
/* mark qc status appropriately */
if
(
!
(
qc
->
tf
.
ctl
&
ATA_NIEN
))
ata_qc_complete
(
qc
,
err_mask
);
if
(
!
(
qc
->
tf
.
ctl
&
ATA_NIEN
))
{
qc
->
err_mask
|=
err_mask
;
ata_qc_complete
(
qc
);
}
}
}
}
...
...
@@ -1865,7 +1867,8 @@ static void mv_eng_timeout(struct ata_port *ap)
*/
spin_lock_irqsave
(
&
ap
->
host_set
->
lock
,
flags
);
qc
->
scsidone
=
scsi_finish_command
;
ata_qc_complete
(
qc
,
AC_ERR_OTHER
);
qc
->
err_mask
|=
AC_ERR_OTHER
;
ata_qc_complete
(
qc
);
spin_unlock_irqrestore
(
&
ap
->
host_set
->
lock
,
flags
);
}
}
...
...
drivers/scsi/sata_promise.c
View file @
1cb9e8e0
...
...
@@ -161,7 +161,7 @@ static const struct ata_port_operations pdc_pata_ops = {
.
host_stop
=
ata_pci_host_stop
,
};
static
struct
ata_port_info
pdc_port_info
[]
=
{
static
const
struct
ata_port_info
pdc_port_info
[]
=
{
/* board_2037x */
{
.
sht
=
&
pdc_ata_sht
,
...
...
@@ -401,7 +401,8 @@ static void pdc_eng_timeout(struct ata_port *ap)
case
ATA_PROT_NODATA
:
printk
(
KERN_ERR
"ata%u: command timeout
\n
"
,
ap
->
id
);
drv_stat
=
ata_wait_idle
(
ap
);
ata_qc_complete
(
qc
,
__ac_err_mask
(
drv_stat
));
qc
->
err_mask
|=
__ac_err_mask
(
drv_stat
);
ata_qc_complete
(
qc
);
break
;
default:
...
...
@@ -410,7 +411,8 @@ 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
,
ac_err_mask
(
drv_stat
));
qc
->
err_mask
|=
ac_err_mask
(
drv_stat
);
ata_qc_complete
(
qc
);
break
;
}
...
...
@@ -422,21 +424,21 @@ out:
static
inline
unsigned
int
pdc_host_intr
(
struct
ata_port
*
ap
,
struct
ata_queued_cmd
*
qc
)
{
unsigned
int
handled
=
0
,
err_mask
=
0
;
unsigned
int
handled
=
0
;
u32
tmp
;
void
__iomem
*
mmio
=
(
void
__iomem
*
)
ap
->
ioaddr
.
cmd_addr
+
PDC_GLOBAL_CTL
;
tmp
=
readl
(
mmio
);
if
(
tmp
&
PDC_ERR_MASK
)
{
err_mask
=
AC_ERR_DEV
;
qc
->
err_mask
|
=
AC_ERR_DEV
;
pdc_reset_port
(
ap
);
}
switch
(
qc
->
tf
.
protocol
)
{
case
ATA_PROT_DMA
:
case
ATA_PROT_NODATA
:
err_mask
|=
ac_err_mask
(
ata_wait_idle
(
ap
));
ata_qc_complete
(
qc
,
err_mask
);
qc
->
err_mask
|=
ac_err_mask
(
ata_wait_idle
(
ap
));
ata_qc_complete
(
qc
);
handled
=
1
;
break
;
...
...
@@ -703,7 +705,7 @@ static int pdc_ata_init_one (struct pci_dev *pdev, const struct pci_device_id *e
probe_ent
->
port
[
3
].
scr_addr
=
base
+
0x700
;
break
;
case
board_2037x
:
probe_ent
->
n_ports
=
2
;
probe_ent
->
n_ports
=
2
;
break
;
case
board_20619
:
probe_ent
->
n_ports
=
4
;
...
...
@@ -713,7 +715,7 @@ static int pdc_ata_init_one (struct pci_dev *pdev, const struct pci_device_id *e
probe_ent
->
port
[
2
].
scr_addr
=
base
+
0x600
;
probe_ent
->
port
[
3
].
scr_addr
=
base
+
0x700
;
break
;
break
;
default:
BUG
();
break
;
...
...
drivers/scsi/sata_qstor.c
View file @
1cb9e8e0
...
...
@@ -170,7 +170,7 @@ static const struct ata_port_operations qs_ata_ops = {
.
bmdma_status
=
qs_bmdma_status
,
};
static
struct
ata_port_info
qs_port_info
[]
=
{
static
const
struct
ata_port_info
qs_port_info
[]
=
{
/* board_2068_idx */
{
.
sht
=
&
qs_ata_sht
,
...
...
@@ -409,8 +409,8 @@ static inline unsigned int qs_intr_pkt(struct ata_host_set *host_set)
case
3
:
/* device error */
pp
->
state
=
qs_state_idle
;
qs_enter_reg_mode
(
qc
->
ap
);
ata_qc_complete
(
qc
,
ac_err_mask
(
sDST
)
);
qc
->
err_mask
|=
ac_err_mask
(
sDST
);
ata_qc_complete
(
qc
);
break
;
default:
break
;
...
...
@@ -447,7 +447,8 @@ static inline unsigned int qs_intr_mmio(struct ata_host_set *host_set)
/* complete taskfile transaction */
pp
->
state
=
qs_state_idle
;
ata_qc_complete
(
qc
,
ac_err_mask
(
status
));
qc
->
err_mask
|=
ac_err_mask
(
status
);
ata_qc_complete
(
qc
);
handled
=
1
;
}
}
...
...
drivers/scsi/sata_sil.c
View file @
1cb9e8e0
...
...
@@ -176,7 +176,7 @@ static const struct ata_port_operations sil_ops = {
.
host_stop
=
ata_pci_host_stop
,
};
static
struct
ata_port_info
sil_port_info
[]
=
{
static
const
struct
ata_port_info
sil_port_info
[]
=
{
/* sil_3112 */
{
.
sht
=
&
sil_sht
,
...
...
drivers/scsi/sata_sil24.c
View file @
1cb9e8e0
...
...
@@ -654,7 +654,8 @@ static void sil24_eng_timeout(struct ata_port *ap)
*/
printk
(
KERN_ERR
"ata%u: command timeout
\n
"
,
ap
->
id
);
qc
->
scsidone
=
scsi_finish_command
;
ata_qc_complete
(
qc
,
AC_ERR_OTHER
);
qc
->
err_mask
|=
AC_ERR_OTHER
;
ata_qc_complete
(
qc
);
sil24_reset_controller
(
ap
);
}
...
...
@@ -711,8 +712,10 @@ static void sil24_error_intr(struct ata_port *ap, u32 slot_stat)
sil24_reset_controller
(
ap
);
}
if
(
qc
)
ata_qc_complete
(
qc
,
err_mask
);
if
(
qc
)
{
qc
->
err_mask
|=
err_mask
;
ata_qc_complete
(
qc
);
}
}
static
inline
void
sil24_host_intr
(
struct
ata_port
*
ap
)
...
...
@@ -734,8 +737,10 @@ static inline void sil24_host_intr(struct ata_port *ap)
*/
sil24_update_tf
(
ap
);
if
(
qc
)
ata_qc_complete
(
qc
,
ac_err_mask
(
pp
->
tf
.
command
));
if
(
qc
)
{
qc
->
err_mask
|=
ac_err_mask
(
pp
->
tf
.
command
);
ata_qc_complete
(
qc
);
}
}
else
sil24_error_intr
(
ap
,
slot_stat
);
}
...
...
drivers/scsi/sata_sx4.c
View file @
1cb9e8e0
...
...
@@ -215,7 +215,7 @@ static const struct ata_port_operations pdc_20621_ops = {
.
host_stop
=
pdc20621_host_stop
,
};
static
struct
ata_port_info
pdc_port_info
[]
=
{
static
const
struct
ata_port_info
pdc_port_info
[]
=
{
/* board_20621 */
{
.
sht
=
&
pdc_sata_sht
,
...
...
@@ -719,7 +719,8 @@ static inline unsigned int pdc20621_host_intr( struct ata_port *ap,
VPRINTK
(
"ata%u: read hdma, 0x%x 0x%x
\n
"
,
ap
->
id
,
readl
(
mmio
+
0x104
),
readl
(
mmio
+
PDC_HDMA_CTLSTAT
));
/* get drive status; clear intr; complete txn */
ata_qc_complete
(
qc
,
ac_err_mask
(
ata_wait_idle
(
ap
)));
qc
->
err_mask
|=
ac_err_mask
(
ata_wait_idle
(
ap
));
ata_qc_complete
(
qc
);
pdc20621_pop_hdma
(
qc
);
}
...
...
@@ -757,7 +758,8 @@ static inline unsigned int pdc20621_host_intr( struct ata_port *ap,
VPRINTK
(
"ata%u: write ata, 0x%x 0x%x
\n
"
,
ap
->
id
,
readl
(
mmio
+
0x104
),
readl
(
mmio
+
PDC_HDMA_CTLSTAT
));
/* get drive status; clear intr; complete txn */
ata_qc_complete
(
qc
,
ac_err_mask
(
ata_wait_idle
(
ap
)));
qc
->
err_mask
|=
ac_err_mask
(
ata_wait_idle
(
ap
));
ata_qc_complete
(
qc
);
pdc20621_pop_hdma
(
qc
);
}
handled
=
1
;
...
...
@@ -767,7 +769,8 @@ 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
,
ac_err_mask
(
status
));
qc
->
err_mask
|=
ac_err_mask
(
status
);
ata_qc_complete
(
qc
);
handled
=
1
;
}
else
{
...
...
@@ -882,7 +885,8 @@ static void pdc_eng_timeout(struct ata_port *ap)
case
ATA_PROT_DMA
:
case
ATA_PROT_NODATA
:
printk
(
KERN_ERR
"ata%u: command timeout
\n
"
,
ap
->
id
);
ata_qc_complete
(
qc
,
__ac_err_mask
(
ata_wait_idle
(
ap
)));
qc
->
err_mask
|=
__ac_err_mask
(
ata_wait_idle
(
ap
));
ata_qc_complete
(
qc
);
break
;
default:
...
...
@@ -891,7 +895,8 @@ 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
,
ac_err_mask
(
drv_stat
));
qc
->
err_mask
|=
ac_err_mask
(
drv_stat
);
ata_qc_complete
(
qc
);
break
;
}
...
...
include/linux/libata.h
View file @
1cb9e8e0
...
...
@@ -136,6 +136,8 @@ enum {
ATA_TMOUT_BOOT_QUICK
=
7
*
HZ
,
/* hueristic */
ATA_TMOUT_CDB
=
30
*
HZ
,
ATA_TMOUT_CDB_QUICK
=
5
*
HZ
,
ATA_TMOUT_INTERNAL
=
30
*
HZ
,
ATA_TMOUT_INTERNAL_QUICK
=
5
*
HZ
,
/* ATA bus states */
BUS_UNKNOWN
=
0
,
...
...
@@ -195,7 +197,7 @@ struct ata_port;
struct
ata_queued_cmd
;
/* typedefs */
typedef
int
(
*
ata_qc_cb_t
)
(
struct
ata_queued_cmd
*
qc
,
unsigned
int
err_mask
);
typedef
int
(
*
ata_qc_cb_t
)
(
struct
ata_queued_cmd
*
qc
);
struct
ata_ioports
{
unsigned
long
cmd_addr
;
...
...
@@ -280,9 +282,9 @@ struct ata_queued_cmd {
/* DO NOT iterate over __sg manually, use ata_for_each_sg() */
struct
scatterlist
*
__sg
;
ata_qc_cb_t
complete_fn
;
unsigned
int
err_mask
;
struct
completion
*
waiting
;
ata_qc_cb_t
complete_fn
;
void
*
private_data
;
};
...
...
@@ -331,8 +333,6 @@ struct ata_port {
u8
ctl
;
/* cache of ATA control register */
u8
last_ctl
;
/* Cache last written value */
unsigned
int
bus_state
;
unsigned
int
port_state
;
unsigned
int
pio_mask
;
unsigned
int
mwdma_mask
;
unsigned
int
udma_mask
;
...
...
@@ -478,7 +478,7 @@ extern void ata_bmdma_start (struct ata_queued_cmd *qc);
extern
void
ata_bmdma_stop
(
struct
ata_queued_cmd
*
qc
);
extern
u8
ata_bmdma_status
(
struct
ata_port
*
ap
);
extern
void
ata_bmdma_irq_clear
(
struct
ata_port
*
ap
);
extern
void
ata_qc_complete
(
struct
ata_queued_cmd
*
qc
,
unsigned
int
err_mask
);
extern
void
ata_qc_complete
(
struct
ata_queued_cmd
*
qc
);
extern
void
ata_eng_timeout
(
struct
ata_port
*
ap
);
extern
void
ata_scsi_simulate
(
u16
*
id
,
struct
scsi_cmnd
*
cmd
,
void
(
*
done
)(
struct
scsi_cmnd
*
));
...
...
@@ -670,6 +670,7 @@ static inline void ata_qc_reinit(struct ata_queued_cmd *qc)
qc
->
cursect
=
qc
->
cursg
=
qc
->
cursg_ofs
=
0
;
qc
->
nsect
=
0
;
qc
->
nbytes
=
qc
->
curbytes
=
0
;
qc
->
err_mask
=
0
;
ata_tf_init
(
qc
->
ap
,
&
qc
->
tf
,
qc
->
dev
->
devno
);
}
...
...
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