Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
0202b160
Commit
0202b160
authored
Feb 23, 2005
by
Jeff Garzik
Browse files
Options
Browse Files
Download
Plain Diff
Merge pobox.com:/garz/repo/netdev-2.6/r8169
into pobox.com:/garz/repo/net-drivers-2.6
parents
3cbae07b
f5f23ec8
Changes
28
Show whitespace changes
Inline
Side-by-side
Showing
28 changed files
with
1127 additions
and
164 deletions
+1127
-164
arch/ppc/mm/pgtable.c
arch/ppc/mm/pgtable.c
+4
-1
arch/ppc/mm/tlb.c
arch/ppc/mm/tlb.c
+1
-1
arch/ppc64/xmon/xmon.c
arch/ppc64/xmon/xmon.c
+2
-0
drivers/input/mouse/alps.c
drivers/input/mouse/alps.c
+3
-3
drivers/md/dm-raid1.c
drivers/md/dm-raid1.c
+2
-2
drivers/scsi/Kconfig
drivers/scsi/Kconfig
+8
-0
drivers/scsi/Makefile
drivers/scsi/Makefile
+1
-0
drivers/scsi/ahci.c
drivers/scsi/ahci.c
+16
-2
drivers/scsi/ata_piix.c
drivers/scsi/ata_piix.c
+4
-0
drivers/scsi/libata-core.c
drivers/scsi/libata-core.c
+101
-14
drivers/scsi/libata-scsi.c
drivers/scsi/libata-scsi.c
+1
-0
drivers/scsi/libata.h
drivers/scsi/libata.h
+1
-0
drivers/scsi/sata_nv.c
drivers/scsi/sata_nv.c
+8
-2
drivers/scsi/sata_promise.c
drivers/scsi/sata_promise.c
+6
-2
drivers/scsi/sata_qstor.c
drivers/scsi/sata_qstor.c
+700
-0
drivers/scsi/sata_sil.c
drivers/scsi/sata_sil.c
+8
-2
drivers/scsi/sata_sis.c
drivers/scsi/sata_sis.c
+8
-2
drivers/scsi/sata_svw.c
drivers/scsi/sata_svw.c
+8
-2
drivers/scsi/sata_sx4.c
drivers/scsi/sata_sx4.c
+6
-2
drivers/scsi/sata_uli.c
drivers/scsi/sata_uli.c
+8
-2
drivers/scsi/sata_via.c
drivers/scsi/sata_via.c
+157
-56
drivers/scsi/sata_vsc.c
drivers/scsi/sata_vsc.c
+8
-2
fs/nfs/file.c
fs/nfs/file.c
+3
-3
include/linux/agp_backend.h
include/linux/agp_backend.h
+1
-1
include/linux/agpgart.h
include/linux/agpgart.h
+2
-2
include/linux/libata.h
include/linux/libata.h
+9
-55
kernel/futex.c
kernel/futex.c
+45
-6
mm/mempolicy.c
mm/mempolicy.c
+6
-2
No files found.
arch/ppc/mm/pgtable.c
View file @
0202b160
...
...
@@ -107,8 +107,11 @@ pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long address)
ptepage
->
mapping
=
(
void
*
)
mm
;
ptepage
->
index
=
address
&
PMD_MASK
;
}
}
else
}
else
{
pte
=
(
pte_t
*
)
early_get_page
();
if
(
pte
)
clear_page
(
pte
);
}
return
pte
;
}
...
...
arch/ppc/mm/tlb.c
View file @
0202b160
...
...
@@ -62,7 +62,7 @@ void flush_hash_one_pte(pte_t *ptep)
ptepage
=
virt_to_page
(
ptep
);
mm
=
(
struct
mm_struct
*
)
ptepage
->
mapping
;
ptephys
=
__pa
(
ptep
)
&
PAGE_MASK
;
addr
=
ptepage
->
index
+
(((
unsigned
long
)
ptep
&
~
PAGE_MASK
)
<<
9
);
addr
=
ptepage
->
index
+
(((
unsigned
long
)
ptep
&
~
PAGE_MASK
)
<<
10
);
flush_hash_pages
(
mm
->
context
,
addr
,
ptephys
,
1
);
}
...
...
arch/ppc64/xmon/xmon.c
View file @
0202b160
...
...
@@ -628,11 +628,13 @@ int xmon_fault_handler(struct pt_regs *regs)
(data address breakpoint register) directly. */
static
void
set_controlled_dabr
(
unsigned
long
val
)
{
#ifdef CONFIG_PPC_PSERIES
if
(
systemcfg
->
platform
==
PLATFORM_PSERIES_LPAR
)
{
int
rc
=
plpar_hcall_norets
(
H_SET_DABR
,
val
);
if
(
rc
!=
H_Success
)
xmon_printf
(
"Warning: setting DABR failed (%d)
\n
"
,
rc
);
}
else
#endif
set_dabr
(
val
);
}
...
...
drivers/input/mouse/alps.c
View file @
0202b160
...
...
@@ -34,7 +34,7 @@ struct alps_model_info {
unsigned
char
signature
[
3
];
unsigned
char
model
;
}
alps_model_data
[]
=
{
{
{
0x33
,
0x02
,
0x0a
},
ALPS_MODEL_GLIDEPOINT
},
/* { { 0x33, 0x02, 0x0a }, ALPS_MODEL_GLIDEPOINT }, */
{
{
0x53
,
0x02
,
0x0a
},
ALPS_MODEL_GLIDEPOINT
},
{
{
0x53
,
0x02
,
0x14
},
ALPS_MODEL_GLIDEPOINT
},
{
{
0x63
,
0x02
,
0x0a
},
ALPS_MODEL_GLIDEPOINT
},
...
...
@@ -42,8 +42,8 @@ struct alps_model_info {
{
{
0x73
,
0x02
,
0x0a
},
ALPS_MODEL_GLIDEPOINT
},
{
{
0x73
,
0x02
,
0x14
},
ALPS_MODEL_GLIDEPOINT
},
{
{
0x63
,
0x02
,
0x28
},
ALPS_MODEL_GLIDEPOINT
},
{
{
0x63
,
0x02
,
0x3c
},
ALPS_MODEL_GLIDEPOINT
},
{
{
0x63
,
0x02
,
0x50
},
ALPS_MODEL_GLIDEPOINT
},
/* { { 0x63, 0x02, 0x3c }, ALPS_MODEL_GLIDEPOINT }, */
/* { { 0x63, 0x02, 0x50 }, ALPS_MODEL_GLIDEPOINT }, */
{
{
0x63
,
0x02
,
0x64
},
ALPS_MODEL_GLIDEPOINT
},
{
{
0x20
,
0x02
,
0x0e
},
ALPS_MODEL_DUALPOINT
},
{
{
0x22
,
0x02
,
0x0a
},
ALPS_MODEL_DUALPOINT
},
...
...
drivers/md/dm-raid1.c
View file @
0202b160
...
...
@@ -253,9 +253,9 @@ static struct region *__rh_alloc(struct region_hash *rh, region_t region)
else
{
__rh_insert
(
rh
,
nreg
);
if
(
nreg
->
state
==
RH_CLEAN
)
{
spin_lock
_irq
(
&
rh
->
region_lock
);
spin_lock
(
&
rh
->
region_lock
);
list_add
(
&
nreg
->
list
,
&
rh
->
clean_regions
);
spin_unlock
_irq
(
&
rh
->
region_lock
);
spin_unlock
(
&
rh
->
region_lock
);
}
reg
=
nreg
;
}
...
...
drivers/scsi/Kconfig
View file @
0202b160
...
...
@@ -457,6 +457,14 @@ config SCSI_SATA_PROMISE
If unsure, say N.
config SCSI_SATA_QSTOR
tristate "Pacific Digital SATA QStor support"
depends on SCSI_SATA && PCI
help
This option enables support for Pacific Digital Serial ATA QStor.
If unsure, say N.
config SCSI_SATA_SX4
tristate "Promise SATA SX4 support"
depends on SCSI_SATA && PCI && EXPERIMENTAL
...
...
drivers/scsi/Makefile
View file @
0202b160
...
...
@@ -125,6 +125,7 @@ obj-$(CONFIG_SCSI_SATA_AHCI) += libata.o ahci.o
obj-$(CONFIG_SCSI_SATA_SVW)
+=
libata.o sata_svw.o
obj-$(CONFIG_SCSI_ATA_PIIX)
+=
libata.o ata_piix.o
obj-$(CONFIG_SCSI_SATA_PROMISE)
+=
libata.o sata_promise.o
obj-$(CONFIG_SCSI_SATA_QSTOR)
+=
libata.o sata_qstor.o
obj-$(CONFIG_SCSI_SATA_SIL)
+=
libata.o sata_sil.o
obj-$(CONFIG_SCSI_SATA_VIA)
+=
libata.o sata_via.o
obj-$(CONFIG_SCSI_SATA_VITESSE)
+=
libata.o sata_vsc.o
...
...
drivers/scsi/ahci.c
View file @
0202b160
...
...
@@ -179,6 +179,7 @@ static void ahci_port_stop(struct ata_port *ap);
static
void
ahci_host_stop
(
struct
ata_host_set
*
host_set
);
static
void
ahci_qc_prep
(
struct
ata_queued_cmd
*
qc
);
static
u8
ahci_check_status
(
struct
ata_port
*
ap
);
static
u8
ahci_check_err
(
struct
ata_port
*
ap
);
static
inline
int
ahci_host_intr
(
struct
ata_port
*
ap
,
struct
ata_queued_cmd
*
qc
);
static
Scsi_Host_Template
ahci_sht
=
{
...
...
@@ -204,6 +205,8 @@ static struct ata_port_operations ahci_ops = {
.
port_disable
=
ata_port_disable
,
.
check_status
=
ahci_check_status
,
.
check_altstatus
=
ahci_check_status
,
.
check_err
=
ahci_check_err
,
.
dev_select
=
ata_noop_dev_select
,
.
phy_reset
=
ahci_phy_reset
,
...
...
@@ -452,6 +455,13 @@ static u8 ahci_check_status(struct ata_port *ap)
return
readl
(
mmio
+
PORT_TFDATA
)
&
0xFF
;
}
static
u8
ahci_check_err
(
struct
ata_port
*
ap
)
{
void
*
mmio
=
(
void
*
)
ap
->
ioaddr
.
cmd_addr
;
return
(
readl
(
mmio
+
PORT_TFDATA
)
>>
8
)
&
0xFF
;
}
static
void
ahci_fill_sg
(
struct
ata_queued_cmd
*
qc
)
{
struct
ahci_port_priv
*
pp
=
qc
->
ap
->
private_data
;
...
...
@@ -940,6 +950,7 @@ static int ahci_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
unsigned
long
base
;
void
*
mmio_base
;
unsigned
int
board_idx
=
(
unsigned
int
)
ent
->
driver_data
;
int
pci_dev_busy
=
0
;
int
rc
;
VPRINTK
(
"ENTER
\n
"
);
...
...
@@ -952,8 +963,10 @@ static int ahci_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
return
rc
;
rc
=
pci_request_regions
(
pdev
,
DRV_NAME
);
if
(
rc
)
if
(
rc
)
{
pci_dev_busy
=
1
;
goto
err_out
;
}
pci_enable_intx
(
pdev
);
...
...
@@ -1015,6 +1028,7 @@ static int ahci_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
err_out_regions:
pci_release_regions
(
pdev
);
err_out:
if
(
!
pci_dev_busy
)
pci_disable_device
(
pdev
);
return
rc
;
}
...
...
drivers/scsi/ata_piix.c
View file @
0202b160
...
...
@@ -138,6 +138,8 @@ static struct ata_port_operations piix_pata_ops = {
.
bmdma_setup
=
ata_bmdma_setup
,
.
bmdma_start
=
ata_bmdma_start
,
.
bmdma_stop
=
ata_bmdma_stop
,
.
bmdma_status
=
ata_bmdma_status
,
.
qc_prep
=
ata_qc_prep
,
.
qc_issue
=
ata_qc_issue_prot
,
...
...
@@ -163,6 +165,8 @@ static struct ata_port_operations piix_sata_ops = {
.
bmdma_setup
=
ata_bmdma_setup
,
.
bmdma_start
=
ata_bmdma_start
,
.
bmdma_stop
=
ata_bmdma_stop
,
.
bmdma_status
=
ata_bmdma_status
,
.
qc_prep
=
ata_qc_prep
,
.
qc_issue
=
ata_qc_issue_prot
,
...
...
drivers/scsi/libata-core.c
View file @
0202b160
...
...
@@ -377,7 +377,7 @@ void ata_tf_read(struct ata_port *ap, struct ata_taskfile *tf)
}
/**
* ata_check_status - Read device status reg & clear interrupt
* ata_check_status
_pio
- Read device status reg & clear interrupt
* @ap: port where the device is
*
* Reads ATA taskfile status register for currently-selected device
...
...
@@ -415,6 +415,27 @@ u8 ata_check_status(struct ata_port *ap)
return
ata_check_status_pio
(
ap
);
}
u8
ata_altstatus
(
struct
ata_port
*
ap
)
{
if
(
ap
->
ops
->
check_altstatus
)
return
ap
->
ops
->
check_altstatus
(
ap
);
if
(
ap
->
flags
&
ATA_FLAG_MMIO
)
return
readb
((
void
__iomem
*
)
ap
->
ioaddr
.
altstatus_addr
);
return
inb
(
ap
->
ioaddr
.
altstatus_addr
);
}
u8
ata_chk_err
(
struct
ata_port
*
ap
)
{
if
(
ap
->
ops
->
check_err
)
return
ap
->
ops
->
check_err
(
ap
);
if
(
ap
->
flags
&
ATA_FLAG_MMIO
)
{
return
readb
((
void
__iomem
*
)
ap
->
ioaddr
.
error_addr
);
}
return
inb
(
ap
->
ioaddr
.
error_addr
);
}
/**
* ata_tf_to_fis - Convert ATA taskfile to SATA FIS structure
* @tf: Taskfile to convert
...
...
@@ -1161,7 +1182,6 @@ static void ata_dev_identify(struct ata_port *ap, unsigned int device)
printk
(
KERN_WARNING
"ata%u: dev %u not supported, ignoring
\n
"
,
ap
->
id
,
device
);
err_out:
ata_irq_on
(
ap
);
/* re-enable interrupts */
dev
->
class
++
;
/* converts ATA_DEV_xxx into ATA_DEV_xxx_UNSUP */
DPRINTK
(
"EXIT, err
\n
"
);
}
...
...
@@ -1669,6 +1689,7 @@ void ata_bus_reset(struct ata_port *ap)
ata_dev_try_classify
(
ap
,
1
);
/* re-enable interrupts */
if
(
ap
->
ioaddr
.
ctl_addr
)
/* FIXME: hack. create a hook instead */
ata_irq_on
(
ap
);
/* is double-select really necessary? */
...
...
@@ -2601,10 +2622,10 @@ static void ata_qc_timeout(struct ata_queued_cmd *qc)
case
ATA_PROT_DMA
:
case
ATA_PROT_ATAPI_DMA
:
host_stat
=
a
ta_
bmdma_status
(
ap
);
host_stat
=
a
p
->
ops
->
bmdma_status
(
ap
);
/* before we do anything else, clear DMA-Start bit */
a
ta_
bmdma_stop
(
ap
);
a
p
->
ops
->
bmdma_stop
(
ap
);
/* fall through */
...
...
@@ -2613,7 +2634,7 @@ static void ata_qc_timeout(struct ata_queued_cmd *qc)
drv_stat
=
ata_chk_status
(
ap
);
/* ack bmdma irq events */
a
ta_bmdma_ack_irq
(
ap
);
a
p
->
ops
->
irq_clear
(
ap
);
printk
(
KERN_ERR
"ata%u: command 0x%x timeout, stat 0x%x host_stat 0x%x
\n
"
,
ap
->
id
,
qc
->
tf
.
command
,
drv_stat
,
host_stat
);
...
...
@@ -2751,6 +2772,24 @@ static void __ata_qc_complete(struct ata_queued_cmd *qc)
clear_bit
(
tag
,
&
ap
->
qactive
);
}
/**
* ata_qc_free - free unused ata_queued_cmd
* @qc: Command to complete
*
* Designed to free unused ata_queued_cmd object
* in case something prevents using it.
*
* LOCKING:
*
*/
void
ata_qc_free
(
struct
ata_queued_cmd
*
qc
)
{
assert
(
qc
!=
NULL
);
/* ata_qc_from_tag _might_ return NULL */
assert
(
qc
->
waiting
==
NULL
);
/* nothing should be waiting */
__ata_qc_complete
(
qc
);
}
/**
* ata_qc_complete - Complete an active ATA command
* @qc: Command to complete
...
...
@@ -3042,7 +3081,43 @@ void ata_bmdma_setup(struct ata_queued_cmd *qc)
void
ata_bmdma_irq_clear
(
struct
ata_port
*
ap
)
{
ata_bmdma_ack_irq
(
ap
);
if
(
ap
->
flags
&
ATA_FLAG_MMIO
)
{
void
__iomem
*
mmio
=
((
void
__iomem
*
)
ap
->
ioaddr
.
bmdma_addr
)
+
ATA_DMA_STATUS
;
writeb
(
readb
(
mmio
),
mmio
);
}
else
{
unsigned
long
addr
=
ap
->
ioaddr
.
bmdma_addr
+
ATA_DMA_STATUS
;
outb
(
inb
(
addr
),
addr
);
}
}
u8
ata_bmdma_status
(
struct
ata_port
*
ap
)
{
u8
host_stat
;
if
(
ap
->
flags
&
ATA_FLAG_MMIO
)
{
void
__iomem
*
mmio
=
(
void
__iomem
*
)
ap
->
ioaddr
.
bmdma_addr
;
host_stat
=
readb
(
mmio
+
ATA_DMA_STATUS
);
}
else
host_stat
=
inb
(
ap
->
ioaddr
.
bmdma_addr
+
ATA_DMA_STATUS
);
return
host_stat
;
}
void
ata_bmdma_stop
(
struct
ata_port
*
ap
)
{
if
(
ap
->
flags
&
ATA_FLAG_MMIO
)
{
void
__iomem
*
mmio
=
(
void
__iomem
*
)
ap
->
ioaddr
.
bmdma_addr
;
/* clear start/stop bit */
writeb
(
readb
(
mmio
+
ATA_DMA_CMD
)
&
~
ATA_DMA_START
,
mmio
+
ATA_DMA_CMD
);
}
else
{
/* clear start/stop bit */
outb
(
inb
(
ap
->
ioaddr
.
bmdma_addr
+
ATA_DMA_CMD
)
&
~
ATA_DMA_START
,
ap
->
ioaddr
.
bmdma_addr
+
ATA_DMA_CMD
);
}
/* one-PIO-cycle guaranteed wait, per spec, for HDMA1:0 transition */
ata_altstatus
(
ap
);
/* dummy read */
}
/**
...
...
@@ -3072,7 +3147,7 @@ inline unsigned int ata_host_intr (struct ata_port *ap,
case
ATA_PROT_ATAPI_DMA
:
case
ATA_PROT_ATAPI
:
/* check status of DMA engine */
host_stat
=
a
ta_
bmdma_status
(
ap
);
host_stat
=
a
p
->
ops
->
bmdma_status
(
ap
);
VPRINTK
(
"ata%u: host_stat 0x%X
\n
"
,
ap
->
id
,
host_stat
);
/* if it's not our irq... */
...
...
@@ -3080,7 +3155,7 @@ inline unsigned int ata_host_intr (struct ata_port *ap,
goto
idle_irq
;
/* before we do anything else, clear DMA-Start bit */
a
ta_
bmdma_stop
(
ap
);
a
p
->
ops
->
bmdma_stop
(
ap
);
/* fall through */
...
...
@@ -3099,7 +3174,7 @@ inline unsigned int ata_host_intr (struct ata_port *ap,
ap
->
id
,
qc
->
tf
.
protocol
,
status
);
/* ack bmdma irq events */
a
ta_bmdma_ack_irq
(
ap
);
a
p
->
ops
->
irq_clear
(
ap
);
/* complete taskfile transaction */
ata_qc_complete
(
qc
,
status
);
...
...
@@ -3656,6 +3731,7 @@ int ata_pci_init_one (struct pci_dev *pdev, struct ata_port_info **port_info,
struct
ata_port_info
*
port
[
2
];
u8
tmp8
,
mask
;
unsigned
int
legacy_mode
=
0
;
int
disable_dev_on_err
=
1
;
int
rc
;
DPRINTK
(
"ENTER
\n
"
);
...
...
@@ -3686,8 +3762,10 @@ int ata_pci_init_one (struct pci_dev *pdev, struct ata_port_info **port_info,
return
rc
;
rc
=
pci_request_regions
(
pdev
,
DRV_NAME
);
if
(
rc
)
if
(
rc
)
{
disable_dev_on_err
=
0
;
goto
err_out
;
}
if
(
legacy_mode
)
{
if
(
!
request_region
(
0x1f0
,
8
,
"libata"
))
{
...
...
@@ -3697,8 +3775,10 @@ int ata_pci_init_one (struct pci_dev *pdev, struct ata_port_info **port_info,
conflict
=
____request_resource
(
&
ioport_resource
,
&
res
);
if
(
!
strcmp
(
conflict
->
name
,
"libata"
))
legacy_mode
|=
(
1
<<
0
);
else
else
{
disable_dev_on_err
=
0
;
printk
(
KERN_WARNING
"ata: 0x1f0 IDE port busy
\n
"
);
}
}
else
legacy_mode
|=
(
1
<<
0
);
...
...
@@ -3709,8 +3789,10 @@ int ata_pci_init_one (struct pci_dev *pdev, struct ata_port_info **port_info,
conflict
=
____request_resource
(
&
ioport_resource
,
&
res
);
if
(
!
strcmp
(
conflict
->
name
,
"libata"
))
legacy_mode
|=
(
1
<<
1
);
else
else
{
disable_dev_on_err
=
0
;
printk
(
KERN_WARNING
"ata: 0x170 IDE port busy
\n
"
);
}
}
else
legacy_mode
|=
(
1
<<
1
);
}
...
...
@@ -3760,6 +3842,7 @@ int ata_pci_init_one (struct pci_dev *pdev, struct ata_port_info **port_info,
release_region
(
0x170
,
8
);
pci_release_regions
(
pdev
);
err_out:
if
(
disable_dev_on_err
)
pci_disable_device
(
pdev
);
return
rc
;
}
...
...
@@ -3910,6 +3993,8 @@ EXPORT_SYMBOL_GPL(ata_std_dev_select);
EXPORT_SYMBOL_GPL
(
ata_tf_to_fis
);
EXPORT_SYMBOL_GPL
(
ata_tf_from_fis
);
EXPORT_SYMBOL_GPL
(
ata_check_status
);
EXPORT_SYMBOL_GPL
(
ata_altstatus
);
EXPORT_SYMBOL_GPL
(
ata_chk_err
);
EXPORT_SYMBOL_GPL
(
ata_exec_command
);
EXPORT_SYMBOL_GPL
(
ata_port_start
);
EXPORT_SYMBOL_GPL
(
ata_port_stop
);
...
...
@@ -3918,6 +4003,8 @@ EXPORT_SYMBOL_GPL(ata_qc_prep);
EXPORT_SYMBOL_GPL
(
ata_bmdma_setup
);
EXPORT_SYMBOL_GPL
(
ata_bmdma_start
);
EXPORT_SYMBOL_GPL
(
ata_bmdma_irq_clear
);
EXPORT_SYMBOL_GPL
(
ata_bmdma_status
);
EXPORT_SYMBOL_GPL
(
ata_bmdma_stop
);
EXPORT_SYMBOL_GPL
(
ata_port_probe
);
EXPORT_SYMBOL_GPL
(
sata_phy_reset
);
EXPORT_SYMBOL_GPL
(
__sata_phy_reset
);
...
...
drivers/scsi/libata-scsi.c
View file @
0202b160
...
...
@@ -701,6 +701,7 @@ static void ata_scsi_translate(struct ata_port *ap, struct ata_device *dev,
return
;
err_out:
ata_qc_free
(
qc
);
ata_bad_cdb
(
cmd
,
done
);
DPRINTK
(
"EXIT - badcmd
\n
"
);
}
...
...
drivers/scsi/libata.h
View file @
0202b160
...
...
@@ -37,6 +37,7 @@ struct ata_scsi_args {
/* libata-core.c */
extern
struct
ata_queued_cmd
*
ata_qc_new_init
(
struct
ata_port
*
ap
,
struct
ata_device
*
dev
);
extern
void
ata_qc_free
(
struct
ata_queued_cmd
*
qc
);
extern
int
ata_qc_issue
(
struct
ata_queued_cmd
*
qc
);
extern
int
ata_check_atapi_dma
(
struct
ata_queued_cmd
*
qc
);
extern
void
ata_dev_select
(
struct
ata_port
*
ap
,
unsigned
int
device
,
...
...
drivers/scsi/sata_nv.c
View file @
0202b160
...
...
@@ -217,6 +217,8 @@ static struct ata_port_operations nv_ops = {
.
phy_reset
=
sata_phy_reset
,
.
bmdma_setup
=
ata_bmdma_setup
,
.
bmdma_start
=
ata_bmdma_start
,
.
bmdma_stop
=
ata_bmdma_stop
,
.
bmdma_status
=
ata_bmdma_status
,
.
qc_prep
=
ata_qc_prep
,
.
qc_issue
=
ata_qc_issue_prot
,
.
eng_timeout
=
ata_eng_timeout
,
...
...
@@ -332,6 +334,7 @@ static int nv_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
struct
nv_host
*
host
;
struct
ata_port_info
*
ppi
;
struct
ata_probe_ent
*
probe_ent
;
int
pci_dev_busy
=
0
;
int
rc
;
u32
bar
;
...
...
@@ -350,8 +353,10 @@ static int nv_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
goto
err_out
;
rc
=
pci_request_regions
(
pdev
,
DRV_NAME
);
if
(
rc
)
if
(
rc
)
{
pci_dev_busy
=
1
;
goto
err_out_disable
;
}
rc
=
pci_set_dma_mask
(
pdev
,
ATA_DMA_MASK
);
if
(
rc
)
...
...
@@ -427,6 +432,7 @@ static int nv_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
err_out_regions:
pci_release_regions
(
pdev
);
err_out_disable:
if
(
!
pci_dev_busy
)
pci_disable_device
(
pdev
);
err_out:
return
rc
;
...
...
drivers/scsi/sata_promise.c
View file @
0202b160
...
...
@@ -556,6 +556,7 @@ static int pdc_ata_init_one (struct pci_dev *pdev, const struct pci_device_id *e
unsigned
long
base
;
void
*
mmio_base
;
unsigned
int
board_idx
=
(
unsigned
int
)
ent
->
driver_data
;
int
pci_dev_busy
=
0
;
int
rc
;
if
(
!
printed_version
++
)
...
...
@@ -570,8 +571,10 @@ static int pdc_ata_init_one (struct pci_dev *pdev, const struct pci_device_id *e
return
rc
;
rc
=
pci_request_regions
(
pdev
,
DRV_NAME
);
if
(
rc
)
if
(
rc
)
{
pci_dev_busy
=
1
;
goto
err_out
;
}
rc
=
pci_set_dma_mask
(
pdev
,
ATA_DMA_MASK
);
if
(
rc
)
...
...
@@ -650,6 +653,7 @@ static int pdc_ata_init_one (struct pci_dev *pdev, const struct pci_device_id *e
err_out_regions:
pci_release_regions
(
pdev
);
err_out:
if
(
!
pci_dev_busy
)
pci_disable_device
(
pdev
);
return
rc
;
}
...
...
drivers/scsi/sata_qstor.c
0 → 100644
View file @
0202b160
/*
* sata_qstor.c - Pacific Digital Corporation QStor SATA
*
* Maintained by: Mark Lord <mlord@pobox.com>
*
* Copyright 2005 Pacific Digital Corporation.
* (OSL/GPL code release authorized by Jalil Fadavi).
*
* The contents of this file are subject to the Open
* Software License version 1.1 that can be found at
* http://www.opensource.org/licenses/osl-1.1.txt and is included herein
* by reference.
*
* Alternatively, the contents of this file may be used under the terms
* of the GNU General Public License version 2 (the "GPL") as distributed
* in the kernel source COPYING file, in which case the provisions of
* the GPL are applicable instead of the above. If you wish to allow
* the use of your version of this file only under the terms of the
* GPL and not to allow others to use your version of this file under
* the OSL, indicate your decision by deleting the provisions above and
* replace them with the notice and other provisions required by the GPL.
* If you do not delete the provisions above, a recipient may use your
* version of this file under either the OSL or the GPL.
*
*/
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/pci.h>
#include <linux/init.h>
#include <linux/blkdev.h>
#include <linux/delay.h>
#include <linux/interrupt.h>
#include <linux/sched.h>
#include "scsi.h"
#include <scsi/scsi_host.h>
#include <asm/io.h>
#include <linux/libata.h>
#define DRV_NAME "sata_qstor"
#define DRV_VERSION "0.03"
enum
{
QS_PORTS
=
4
,
QS_MAX_PRD
=
LIBATA_MAX_PRD
,
QS_CPB_ORDER
=
6
,
QS_CPB_BYTES
=
(
1
<<
QS_CPB_ORDER
),
QS_PRD_BYTES
=
QS_MAX_PRD
*
16
,
QS_PKT_BYTES
=
QS_CPB_BYTES
+
QS_PRD_BYTES
,
QS_DMA_BOUNDARY
=
~
0UL
,
/* global register offsets */
QS_HCF_CNFG3
=
0x0003
,
/* host configuration offset */
QS_HID_HPHY
=
0x0004
,
/* host physical interface info */
QS_HCT_CTRL
=
0x00e4
,
/* global interrupt mask offset */
QS_HST_SFF
=
0x0100
,
/* host status fifo offset */
QS_HVS_SERD3
=
0x0393
,
/* PHY enable offset */
/* global control bits */
QS_HPHY_64BIT
=
(
1
<<
1
),
/* 64-bit bus detected */
QS_CNFG3_GSRST
=
0x01
,
/* global chip reset */
QS_SERD3_PHY_ENA
=
0xf0
,
/* PHY detection ENAble*/
/* per-channel register offsets */
QS_CCF_CPBA
=
0x0710
,
/* chan CPB base address */
QS_CCF_CSEP
=
0x0718
,
/* chan CPB separation factor */
QS_CFC_HUFT
=
0x0800
,
/* host upstream fifo threshold */
QS_CFC_HDFT
=
0x0804
,
/* host downstream fifo threshold */
QS_CFC_DUFT
=
0x0808
,
/* dev upstream fifo threshold */
QS_CFC_DDFT
=
0x080c
,
/* dev downstream fifo threshold */
QS_CCT_CTR0
=
0x0900
,
/* chan control-0 offset */
QS_CCT_CTR1
=
0x0901
,
/* chan control-1 offset */
QS_CCT_CFF
=
0x0a00
,
/* chan command fifo offset */
/* channel control bits */
QS_CTR0_REG
=
(
1
<<
1
),
/* register mode (vs. pkt mode) */
QS_CTR0_CLER
=
(
1
<<
2
),
/* clear channel errors */
QS_CTR1_RDEV
=
(
1
<<
1
),
/* sata phy/comms reset */
QS_CTR1_RCHN
=
(
1
<<
4
),
/* reset channel logic */
QS_CCF_RUN_PKT
=
0x107
,
/* RUN a new dma PKT */
/* pkt sub-field headers */
QS_HCB_HDR
=
0x01
,
/* Host Control Block header */
QS_DCB_HDR
=
0x02
,
/* Device Control Block header */
/* pkt HCB flag bits */
QS_HF_DIRO
=
(
1
<<
0
),
/* data DIRection Out */
QS_HF_DAT
=
(
1
<<
3
),
/* DATa pkt */
QS_HF_IEN
=
(
1
<<
4
),
/* Interrupt ENable */
QS_HF_VLD
=
(
1
<<
5
),
/* VaLiD pkt */
/* pkt DCB flag bits */
QS_DF_PORD
=
(
1
<<
2
),
/* Pio OR Dma */
QS_DF_ELBA
=
(
1
<<
3
),
/* Extended LBA (lba48) */
/* PCI device IDs */
board_2068_idx
=
0
,
/* QStor 4-port SATA/RAID */
};
typedef
enum
{
qs_state_idle
,
qs_state_pkt
,
qs_state_mmio
}
qs_state_t
;
struct
qs_port_priv
{
u8
*
pkt
;
dma_addr_t
pkt_dma
;
qs_state_t
state
;
};
static
u32
qs_scr_read
(
struct
ata_port
*
ap
,
unsigned
int
sc_reg
);
static
void
qs_scr_write
(
struct
ata_port
*
ap
,
unsigned
int
sc_reg
,
u32
val
);
static
int
qs_ata_init_one
(
struct
pci_dev
*
pdev
,
const
struct
pci_device_id
*
ent
);
static
irqreturn_t
qs_intr
(
int
irq
,
void
*
dev_instance
,
struct
pt_regs
*
regs
);
static
int
qs_port_start
(
struct
ata_port
*
ap
);
static
void
qs_host_stop
(
struct
ata_host_set
*
host_set
);
static
void
qs_port_stop
(
struct
ata_port
*
ap
);
static
void
qs_phy_reset
(
struct
ata_port
*
ap
);
static
void
qs_qc_prep
(
struct
ata_queued_cmd
*
qc
);
static
int
qs_qc_issue
(
struct
ata_queued_cmd
*
qc
);
static
int
qs_check_atapi_dma
(
struct
ata_queued_cmd
*
qc
);
static
void
qs_bmdma_stop
(
struct
ata_port
*
ap
);
static
u8
qs_bmdma_status
(
struct
ata_port
*
ap
);
static
void
qs_irq_clear
(
struct
ata_port
*
ap
);
static
Scsi_Host_Template
qs_ata_sht
=
{
.
module
=
THIS_MODULE
,
.
name
=
DRV_NAME
,
.
ioctl
=
ata_scsi_ioctl
,
.
queuecommand
=
ata_scsi_queuecmd
,
.
eh_strategy_handler
=
ata_scsi_error
,
.
can_queue
=
ATA_DEF_QUEUE
,
.
this_id
=
ATA_SHT_THIS_ID
,
.
sg_tablesize
=
QS_MAX_PRD
,
.
max_sectors
=
ATA_MAX_SECTORS
,
.
cmd_per_lun
=
ATA_SHT_CMD_PER_LUN
,
.
emulated
=
ATA_SHT_EMULATED
,
//FIXME .use_clustering = ATA_SHT_USE_CLUSTERING,
.
use_clustering
=
ENABLE_CLUSTERING
,
.
proc_name
=
DRV_NAME
,
.
dma_boundary
=
QS_DMA_BOUNDARY
,
.
slave_configure
=
ata_scsi_slave_config
,
.
bios_param
=
ata_std_bios_param
,
};
static
struct
ata_port_operations
qs_ata_ops
=
{
.
port_disable
=
ata_port_disable
,
.
tf_load
=
ata_tf_load
,
.
tf_read
=
ata_tf_read
,
.
check_status
=
ata_check_status
,
.
check_atapi_dma
=
qs_check_atapi_dma
,
.
exec_command
=
ata_exec_command
,
.
dev_select
=
ata_std_dev_select
,
.
phy_reset
=
qs_phy_reset
,
.
qc_prep
=
qs_qc_prep
,
.
qc_issue
=
qs_qc_issue
,
.
eng_timeout
=
ata_eng_timeout
,
.
irq_handler
=
qs_intr
,
.
irq_clear
=
qs_irq_clear
,
.
scr_read
=
qs_scr_read
,
.
scr_write
=
qs_scr_write
,
.
port_start
=
qs_port_start
,
.
port_stop
=
qs_port_stop
,
.
host_stop
=
qs_host_stop
,
.
bmdma_stop
=
qs_bmdma_stop
,
.
bmdma_status
=
qs_bmdma_status
,
};
static
struct
ata_port_info
qs_port_info
[]
=
{
/* board_2068_idx */
{
.
sht
=
&
qs_ata_sht
,
.
host_flags
=
ATA_FLAG_SATA
|
ATA_FLAG_NO_LEGACY
|
ATA_FLAG_SATA_RESET
|
//FIXME ATA_FLAG_SRST |
ATA_FLAG_MMIO
,
.
pio_mask
=
0x10
,
/* pio4 */
.
udma_mask
=
0x7f
,
/* udma0-6 */
.
port_ops
=
&
qs_ata_ops
,
},
};
static
struct
pci_device_id
qs_ata_pci_tbl
[]
=
{
{
PCI_VENDOR_ID_PDC
,
0x2068
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
board_2068_idx
},
{
}
/* terminate list */
};
static
struct
pci_driver
qs_ata_pci_driver
=
{
.
name
=
DRV_NAME
,
.
id_table
=
qs_ata_pci_tbl
,
.
probe
=
qs_ata_init_one
,
.
remove
=
ata_pci_remove_one
,
};
static
int
qs_check_atapi_dma
(
struct
ata_queued_cmd
*
qc
)
{
return
1
;
/* ATAPI DMA not supported */
}
static
void
qs_bmdma_stop
(
struct
ata_port
*
ap
)
{
/* nothing */
}
static
u8
qs_bmdma_status
(
struct
ata_port
*
ap
)
{
return
0
;
}
static
void
qs_irq_clear
(
struct
ata_port
*
ap
)
{
/* nothing */
}
static
void
qs_enter_reg_mode
(
struct
ata_port
*
ap
)
{
u8
__iomem
*
chan
=
ap
->
host_set
->
mmio_base
+
(
ap
->
port_no
*
0x4000
);
writeb
(
QS_CTR0_REG
,
chan
+
QS_CCT_CTR0
);
readb
(
chan
+
QS_CCT_CTR0
);
/* flush */
}
static
void
qs_phy_reset
(
struct
ata_port
*
ap
)
{
u8
__iomem
*
chan
=
ap
->
host_set
->
mmio_base
+
(
ap
->
port_no
*
0x4000
);
struct
qs_port_priv
*
pp
=
ap
->
private_data
;
pp
->
state
=
qs_state_idle
;
writeb
(
QS_CTR1_RCHN
,
chan
+
QS_CCT_CTR1
);
qs_enter_reg_mode
(
ap
);
sata_phy_reset
(
ap
);
}
static
u32
qs_scr_read
(
struct
ata_port
*
ap
,
unsigned
int
sc_reg
)
{
if
(
sc_reg
>
SCR_CONTROL
)
return
~
0U
;
return
readl
((
void
__iomem
*
)(
ap
->
ioaddr
.
scr_addr
+
(
sc_reg
*
8
)));
}
static
void
qs_scr_write
(
struct
ata_port
*
ap
,
unsigned
int
sc_reg
,
u32
val
)
{
if
(
sc_reg
>
SCR_CONTROL
)
return
;
writel
(
val
,
(
void
__iomem
*
)(
ap
->
ioaddr
.
scr_addr
+
(
sc_reg
*
8
)));
}
static
void
qs_fill_sg
(
struct
ata_queued_cmd
*
qc
)
{
struct
scatterlist
*
sg
=
qc
->
sg
;
struct
ata_port
*
ap
=
qc
->
ap
;
struct
qs_port_priv
*
pp
=
ap
->
private_data
;
unsigned
int
nelem
;
u8
*
prd
=
pp
->
pkt
+
QS_CPB_BYTES
;
assert
(
sg
!=
NULL
);
assert
(
qc
->
n_elem
>
0
);
for
(
nelem
=
0
;
nelem
<
qc
->
n_elem
;
nelem
++
,
sg
++
)
{
u64
addr
;
u32
len
;
addr
=
sg_dma_address
(
sg
);
*
(
u64
*
)
prd
=
cpu_to_le64
(
addr
);
prd
+=
sizeof
(
u64
);
len
=
sg_dma_len
(
sg
);
*
(
u32
*
)
prd
=
cpu_to_le32
(
len
);
prd
+=
sizeof
(
u64
);
VPRINTK
(
"PRD[%u] = (0x%llX, 0x%X)
\n
"
,
nelem
,
(
unsigned
long
long
)
addr
,
len
);
}
}
static
void
qs_qc_prep
(
struct
ata_queued_cmd
*
qc
)
{
struct
qs_port_priv
*
pp
=
qc
->
ap
->
private_data
;
u8
dflags
=
QS_DF_PORD
,
*
buf
=
pp
->
pkt
;
u8
hflags
=
QS_HF_DAT
|
QS_HF_IEN
|
QS_HF_VLD
;
u64
addr
;
VPRINTK
(
"ENTER
\n
"
);
qs_enter_reg_mode
(
qc
->
ap
);
if
(
qc
->
tf
.
protocol
!=
ATA_PROT_DMA
)
{
ata_qc_prep
(
qc
);
return
;
}
qs_fill_sg
(
qc
);
if
((
qc
->
tf
.
flags
&
ATA_TFLAG_WRITE
))
hflags
|=
QS_HF_DIRO
;
if
((
qc
->
tf
.
flags
&
ATA_TFLAG_LBA48
))
dflags
|=
QS_DF_ELBA
;
/* host control block (HCB) */
buf
[
0
]
=
QS_HCB_HDR
;
buf
[
1
]
=
hflags
;
*
(
u32
*
)(
&
buf
[
4
])
=
cpu_to_le32
(
qc
->
nsect
*
ATA_SECT_SIZE
);
*
(
u32
*
)(
&
buf
[
8
])
=
cpu_to_le32
(
qc
->
n_elem
);
addr
=
((
u64
)
pp
->
pkt_dma
)
+
QS_CPB_BYTES
;
*
(
u64
*
)(
&
buf
[
16
])
=
cpu_to_le64
(
addr
);
/* device control block (DCB) */
buf
[
24
]
=
QS_DCB_HDR
;
buf
[
28
]
=
dflags
;
/* frame information structure (FIS) */
ata_tf_to_fis
(
&
qc
->
tf
,
&
buf
[
32
],
0
);
}
static
inline
void
qs_packet_start
(
struct
ata_queued_cmd
*
qc
)
{
struct
ata_port
*
ap
=
qc
->
ap
;
u8
__iomem
*
chan
=
ap
->
host_set
->
mmio_base
+
(
ap
->
port_no
*
0x4000
);
VPRINTK
(
"ENTER, ap %p
\n
"
,
ap
);
writeb
(
QS_CTR0_CLER
,
chan
+
QS_CCT_CTR0
);
wmb
();
/* flush PRDs and pkt to memory */
writel
(
QS_CCF_RUN_PKT
,
chan
+
QS_CCT_CFF
);
readl
(
chan
+
QS_CCT_CFF
);
/* flush */
}
static
int
qs_qc_issue
(
struct
ata_queued_cmd
*
qc
)
{
struct
qs_port_priv
*
pp
=
qc
->
ap
->
private_data
;
switch
(
qc
->
tf
.
protocol
)
{
case
ATA_PROT_DMA
:
pp
->
state
=
qs_state_pkt
;
qs_packet_start
(
qc
);
return
0
;
case
ATA_PROT_ATAPI_DMA
:
BUG
();
break
;
default:
break
;
}
pp
->
state
=
qs_state_mmio
;
return
ata_qc_issue_prot
(
qc
);
}
static
inline
unsigned
int
qs_intr_pkt
(
struct
ata_host_set
*
host_set
)
{
unsigned
int
handled
=
0
;
u8
sFFE
;
u8
__iomem
*
mmio_base
=
host_set
->
mmio_base
;
do
{
u32
sff0
=
readl
(
mmio_base
+
QS_HST_SFF
);
u32
sff1
=
readl
(
mmio_base
+
QS_HST_SFF
+
4
);
u8
sEVLD
=
(
sff1
>>
30
)
&
0x01
;
/* valid flag */
sFFE
=
sff1
>>
31
;
/* empty flag */
if
(
sEVLD
)
{
u8
sDST
=
sff0
>>
16
;
/* dev status */
u8
sHST
=
sff1
&
0x3f
;
/* host status */
unsigned
int
port_no
=
(
sff1
>>
8
)
&
0x03
;
struct
ata_port
*
ap
=
host_set
->
ports
[
port_no
];
DPRINTK
(
"SFF=%08x%08x: sCHAN=%u sHST=%d sDST=%02x
\n
"
,
sff1
,
sff0
,
port_no
,
sHST
,
sDST
);
handled
=
1
;
if
(
ap
&&
(
!
(
ap
->
flags
&
ATA_FLAG_PORT_DISABLED
)))
{
struct
ata_queued_cmd
*
qc
;
struct
qs_port_priv
*
pp
=
ap
->
private_data
;
if
(
!
pp
||
pp
->
state
!=
qs_state_pkt
)
continue
;
qc
=
ata_qc_from_tag
(
ap
,
ap
->
active_tag
);
if
(
qc
&&
(
!
(
qc
->
tf
.
ctl
&
ATA_NIEN
)))
{
switch
(
sHST
)
{
case
0
:
/* sucessful CPB */
case
3
:
/* device error */
pp
->
state
=
qs_state_idle
;
qs_enter_reg_mode
(
qc
->
ap
);
ata_qc_complete
(
qc
,
sDST
);
break
;
default:
break
;
}
}
}
}
}
while
(
!
sFFE
);
return
handled
;
}
static
inline
unsigned
int
qs_intr_mmio
(
struct
ata_host_set
*
host_set
)
{
unsigned
int
handled
=
0
,
port_no
;
for
(
port_no
=
0
;
port_no
<
host_set
->
n_ports
;
++
port_no
)
{
struct
ata_port
*
ap
;
ap
=
host_set
->
ports
[
port_no
];
if
(
ap
&&
(
!
(
ap
->
flags
&
ATA_FLAG_PORT_DISABLED
)))
{
struct
ata_queued_cmd
*
qc
;
struct
qs_port_priv
*
pp
=
ap
->
private_data
;
if
(
!
pp
||
pp
->
state
!=
qs_state_mmio
)
continue
;
qc
=
ata_qc_from_tag
(
ap
,
ap
->
active_tag
);
if
(
qc
&&
(
!
(
qc
->
tf
.
ctl
&
ATA_NIEN
)))
{
/* check main status, clearing INTRQ */
u8
status
=
ata_chk_status
(
ap
);
if
((
status
&
ATA_BUSY
))
continue
;
DPRINTK
(
"ata%u: protocol %d (dev_stat 0x%X)
\n
"
,
ap
->
id
,
qc
->
tf
.
protocol
,
status
);
/* complete taskfile transaction */
pp
->
state
=
qs_state_idle
;
ata_qc_complete
(
qc
,
status
);
handled
=
1
;
}
}
}
return
handled
;
}
static
irqreturn_t
qs_intr
(
int
irq
,
void
*
dev_instance
,
struct
pt_regs
*
regs
)
{
struct
ata_host_set
*
host_set
=
dev_instance
;
unsigned
int
handled
=
0
;
VPRINTK
(
"ENTER
\n
"
);
spin_lock
(
&
host_set
->
lock
);
handled
=
qs_intr_pkt
(
host_set
)
|
qs_intr_mmio
(
host_set
);
spin_unlock
(
&
host_set
->
lock
);
VPRINTK
(
"EXIT
\n
"
);
return
IRQ_RETVAL
(
handled
);
}
static
void
qs_ata_setup_port
(
struct
ata_ioports
*
port
,
unsigned
long
base
)
{
port
->
cmd_addr
=
port
->
data_addr
=
base
+
0x400
;
port
->
error_addr
=
port
->
feature_addr
=
base
+
0x408
;
/* hob_feature = 0x409 */
port
->
nsect_addr
=
base
+
0x410
;
/* hob_nsect = 0x411 */
port
->
lbal_addr
=
base
+
0x418
;
/* hob_lbal = 0x419 */
port
->
lbam_addr
=
base
+
0x420
;
/* hob_lbam = 0x421 */
port
->
lbah_addr
=
base
+
0x428
;
/* hob_lbah = 0x429 */
port
->
device_addr
=
base
+
0x430
;
port
->
status_addr
=
port
->
command_addr
=
base
+
0x438
;
port
->
altstatus_addr
=
port
->
ctl_addr
=
base
+
0x440
;
port
->
scr_addr
=
base
+
0xc00
;
}
static
int
qs_port_start
(
struct
ata_port
*
ap
)
{
struct
device
*
dev
=
ap
->
host_set
->
dev
;
struct
qs_port_priv
*
pp
;
void
__iomem
*
mmio_base
=
ap
->
host_set
->
mmio_base
;
void
__iomem
*
chan
=
mmio_base
+
(
ap
->
port_no
*
0x4000
);
u64
addr
;
int
rc
;
rc
=
ata_port_start
(
ap
);
if
(
rc
)
return
rc
;
qs_enter_reg_mode
(
ap
);
pp
=
kcalloc
(
1
,
sizeof
(
*
pp
),
GFP_KERNEL
);
if
(
!
pp
)
{
rc
=
-
ENOMEM
;
goto
err_out
;
}
pp
->
pkt
=
dma_alloc_coherent
(
dev
,
QS_PKT_BYTES
,
&
pp
->
pkt_dma
,
GFP_KERNEL
);
if
(
!
pp
->
pkt
)
{
rc
=
-
ENOMEM
;
goto
err_out_kfree
;
}
memset
(
pp
->
pkt
,
0
,
QS_PKT_BYTES
);
ap
->
private_data
=
pp
;
addr
=
(
u64
)
pp
->
pkt_dma
;
writel
((
u32
)
addr
,
chan
+
QS_CCF_CPBA
);
writel
((
u32
)(
addr
>>
32
),
chan
+
QS_CCF_CPBA
+
4
);
return
0
;
err_out_kfree:
kfree
(
pp
);
err_out:
ata_port_stop
(
ap
);
return
rc
;
}
static
void
qs_port_stop
(
struct
ata_port
*
ap
)
{
struct
device
*
dev
=
ap
->
host_set
->
dev
;
struct
qs_port_priv
*
pp
=
ap
->
private_data
;
if
(
pp
!=
NULL
)
{
ap
->
private_data
=
NULL
;
if
(
pp
->
pkt
!=
NULL
)
dma_free_coherent
(
dev
,
QS_PKT_BYTES
,
pp
->
pkt
,
pp
->
pkt_dma
);
kfree
(
pp
);
}
ata_port_stop
(
ap
);
}
static
void
qs_host_stop
(
struct
ata_host_set
*
host_set
)
{
void
__iomem
*
mmio_base
=
host_set
->
mmio_base
;
writeb
(
0
,
mmio_base
+
QS_HCT_CTRL
);
/* disable host interrupts */
writeb
(
QS_CNFG3_GSRST
,
mmio_base
+
QS_HCF_CNFG3
);
/* global reset */
}
static
void
qs_host_init
(
unsigned
int
chip_id
,
struct
ata_probe_ent
*
pe
)
{
void
__iomem
*
mmio_base
=
pe
->
mmio_base
;
unsigned
int
port_no
;
writeb
(
0
,
mmio_base
+
QS_HCT_CTRL
);
/* disable host interrupts */
writeb
(
QS_CNFG3_GSRST
,
mmio_base
+
QS_HCF_CNFG3
);
/* global reset */
/* reset each channel in turn */
for
(
port_no
=
0
;
port_no
<
pe
->
n_ports
;
++
port_no
)
{
u8
__iomem
*
chan
=
mmio_base
+
(
port_no
*
0x4000
);
writeb
(
QS_CTR1_RDEV
|
QS_CTR1_RCHN
,
chan
+
QS_CCT_CTR1
);
writeb
(
QS_CTR0_REG
,
chan
+
QS_CCT_CTR0
);
readb
(
chan
+
QS_CCT_CTR0
);
/* flush */
}
writeb
(
QS_SERD3_PHY_ENA
,
mmio_base
+
QS_HVS_SERD3
);
/* enable phy */
for
(
port_no
=
0
;
port_no
<
pe
->
n_ports
;
++
port_no
)
{
u8
__iomem
*
chan
=
mmio_base
+
(
port_no
*
0x4000
);
/* set FIFO depths to same settings as Windows driver */
writew
(
32
,
chan
+
QS_CFC_HUFT
);
writew
(
32
,
chan
+
QS_CFC_HDFT
);
writew
(
10
,
chan
+
QS_CFC_DUFT
);
writew
(
8
,
chan
+
QS_CFC_DDFT
);
/* set CPB size in bytes, as a power of two */
writeb
(
QS_CPB_ORDER
,
chan
+
QS_CCF_CSEP
);
}
writeb
(
1
,
mmio_base
+
QS_HCT_CTRL
);
/* enable host interrupts */
}
/*
* The QStor understands 64-bit buses, and uses 64-bit fields
* for DMA pointers regardless of bus width. We just have to
* make sure our DMA masks are set appropriately for whatever
* bridge lies between us and the QStor, and then the DMA mapping
* code will ensure we only ever "see" appropriate buffer addresses.
* If we're 32-bit limited somewhere, then our 64-bit fields will
* just end up with zeros in the upper 32-bits, without any special
* logic required outside of this routine (below).
*/
static
int
qs_set_dma_masks
(
struct
pci_dev
*
pdev
,
void
__iomem
*
mmio_base
)
{
u32
bus_info
=
readl
(
mmio_base
+
QS_HID_HPHY
);
int
rc
,
have_64bit_bus
=
(
bus_info
&
QS_HPHY_64BIT
);
if
(
have_64bit_bus
&&
!
pci_set_dma_mask
(
pdev
,
0xffffffffffffffffULL
))
{
rc
=
pci_set_consistent_dma_mask
(
pdev
,
0xffffffffffffffffULL
);
if
(
rc
)
{
rc
=
pci_set_consistent_dma_mask
(
pdev
,
0xffffffffULL
);
if
(
rc
)
{
printk
(
KERN_ERR
DRV_NAME
"(%s): 64-bit DMA enable failed
\n
"
,
pci_name
(
pdev
));
return
rc
;
}
}
}
else
{
rc
=
pci_set_dma_mask
(
pdev
,
0xffffffffULL
);
if
(
rc
)
{
printk
(
KERN_ERR
DRV_NAME
"(%s): 32-bit DMA enable failed
\n
"
,
pci_name
(
pdev
));
return
rc
;
}
rc
=
pci_set_consistent_dma_mask
(
pdev
,
0xffffffffULL
);
if
(
rc
)
{
printk
(
KERN_ERR
DRV_NAME
"(%s): 32-bit consistent DMA enable failed
\n
"
,
pci_name
(
pdev
));
return
rc
;
}
}
return
0
;
}
static
int
qs_ata_init_one
(
struct
pci_dev
*
pdev
,
const
struct
pci_device_id
*
ent
)
{
static
int
printed_version
;
struct
ata_probe_ent
*
probe_ent
=
NULL
;
void
__iomem
*
mmio_base
;
unsigned
int
board_idx
=
(
unsigned
int
)
ent
->
driver_data
;
int
rc
,
port_no
;
if
(
!
printed_version
++
)
printk
(
KERN_DEBUG
DRV_NAME
" version "
DRV_VERSION
"
\n
"
);
rc
=
pci_enable_device
(
pdev
);
if
(
rc
)
return
rc
;
rc
=
pci_request_regions
(
pdev
,
DRV_NAME
);
if
(
rc
)
goto
err_out
;
if
((
pci_resource_flags
(
pdev
,
4
)
&
IORESOURCE_MEM
)
==
0
)
{
rc
=
-
ENODEV
;
goto
err_out_regions
;
}
mmio_base
=
ioremap
(
pci_resource_start
(
pdev
,
4
),
pci_resource_len
(
pdev
,
4
));
if
(
mmio_base
==
NULL
)
{
rc
=
-
ENOMEM
;
goto
err_out_regions
;
}
rc
=
qs_set_dma_masks
(
pdev
,
mmio_base
);
if
(
rc
)
goto
err_out_iounmap
;
probe_ent
=
kmalloc
(
sizeof
(
*
probe_ent
),
GFP_KERNEL
);
if
(
probe_ent
==
NULL
)
{
rc
=
-
ENOMEM
;
goto
err_out_iounmap
;
}
memset
(
probe_ent
,
0
,
sizeof
(
*
probe_ent
));
probe_ent
->
dev
=
pci_dev_to_dev
(
pdev
);
INIT_LIST_HEAD
(
&
probe_ent
->
node
);
probe_ent
->
sht
=
qs_port_info
[
board_idx
].
sht
;
probe_ent
->
host_flags
=
qs_port_info
[
board_idx
].
host_flags
;
probe_ent
->
pio_mask
=
qs_port_info
[
board_idx
].
pio_mask
;
probe_ent
->
mwdma_mask
=
qs_port_info
[
board_idx
].
mwdma_mask
;
probe_ent
->
udma_mask
=
qs_port_info
[
board_idx
].
udma_mask
;
probe_ent
->
port_ops
=
qs_port_info
[
board_idx
].
port_ops
;
probe_ent
->
irq
=
pdev
->
irq
;
probe_ent
->
irq_flags
=
SA_SHIRQ
;
probe_ent
->
mmio_base
=
mmio_base
;
probe_ent
->
n_ports
=
QS_PORTS
;
for
(
port_no
=
0
;
port_no
<
probe_ent
->
n_ports
;
++
port_no
)
{
unsigned
long
chan
=
(
unsigned
long
)
mmio_base
+
(
port_no
*
0x4000
);
qs_ata_setup_port
(
&
probe_ent
->
port
[
port_no
],
chan
);
}
pci_set_master
(
pdev
);
/* initialize adapter */
qs_host_init
(
board_idx
,
probe_ent
);
rc
=
ata_device_add
(
probe_ent
);
kfree
(
probe_ent
);
if
(
rc
!=
QS_PORTS
)
goto
err_out_iounmap
;
return
0
;
err_out_iounmap:
iounmap
(
mmio_base
);
err_out_regions:
pci_release_regions
(
pdev
);
err_out:
pci_disable_device
(
pdev
);
return
rc
;
}
static
int
__init
qs_ata_init
(
void
)
{
return
pci_module_init
(
&
qs_ata_pci_driver
);
}
static
void
__exit
qs_ata_exit
(
void
)
{
pci_unregister_driver
(
&
qs_ata_pci_driver
);
}
MODULE_AUTHOR
(
"Mark Lord"
);
MODULE_DESCRIPTION
(
"Pacific Digital Corporation QStor SATA low-level driver"
);
MODULE_LICENSE
(
"GPL"
);
MODULE_DEVICE_TABLE
(
pci
,
qs_ata_pci_tbl
);
MODULE_VERSION
(
DRV_VERSION
);
module_init
(
qs_ata_init
);
module_exit
(
qs_ata_exit
);
drivers/scsi/sata_sil.c
View file @
0202b160
...
...
@@ -139,6 +139,8 @@ static struct ata_port_operations sil_ops = {
.
post_set_mode
=
sil_post_set_mode
,
.
bmdma_setup
=
ata_bmdma_setup
,
.
bmdma_start
=
ata_bmdma_start
,
.
bmdma_stop
=
ata_bmdma_stop
,
.
bmdma_status
=
ata_bmdma_status
,
.
qc_prep
=
ata_qc_prep
,
.
qc_issue
=
ata_qc_issue_prot
,
.
eng_timeout
=
ata_eng_timeout
,
...
...
@@ -336,6 +338,7 @@ static int sil_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
void
*
mmio_base
;
int
rc
;
unsigned
int
i
;
int
pci_dev_busy
=
0
;
u32
tmp
,
irq_mask
;
if
(
!
printed_version
++
)
...
...
@@ -350,8 +353,10 @@ static int sil_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
return
rc
;
rc
=
pci_request_regions
(
pdev
,
DRV_NAME
);
if
(
rc
)
if
(
rc
)
{
pci_dev_busy
=
1
;
goto
err_out
;
}
rc
=
pci_set_dma_mask
(
pdev
,
ATA_DMA_MASK
);
if
(
rc
)
...
...
@@ -438,6 +443,7 @@ static int sil_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
err_out_regions:
pci_release_regions
(
pdev
);
err_out:
if
(
!
pci_dev_busy
)
pci_disable_device
(
pdev
);
return
rc
;
}
...
...
drivers/scsi/sata_sis.c
View file @
0202b160
...
...
@@ -102,6 +102,8 @@ static struct ata_port_operations sis_ops = {
.
phy_reset
=
sata_phy_reset
,
.
bmdma_setup
=
ata_bmdma_setup
,
.
bmdma_start
=
ata_bmdma_start
,
.
bmdma_stop
=
ata_bmdma_stop
,
.
bmdma_status
=
ata_bmdma_status
,
.
qc_prep
=
ata_qc_prep
,
.
qc_issue
=
ata_qc_issue_prot
,
.
eng_timeout
=
ata_eng_timeout
,
...
...
@@ -200,14 +202,17 @@ static int sis_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
int
rc
;
u32
genctl
;
struct
ata_port_info
*
ppi
;
int
pci_dev_busy
=
0
;
rc
=
pci_enable_device
(
pdev
);
if
(
rc
)
return
rc
;
rc
=
pci_request_regions
(
pdev
,
DRV_NAME
);
if
(
rc
)
if
(
rc
)
{
pci_dev_busy
=
1
;
goto
err_out
;
}
rc
=
pci_set_dma_mask
(
pdev
,
ATA_DMA_MASK
);
if
(
rc
)
...
...
@@ -259,6 +264,7 @@ static int sis_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
pci_release_regions
(
pdev
);
err_out:
if
(
!
pci_dev_busy
)
pci_disable_device
(
pdev
);
return
rc
;
...
...
drivers/scsi/sata_svw.c
View file @
0202b160
...
...
@@ -301,6 +301,8 @@ static struct ata_port_operations k2_sata_ops = {
.
phy_reset
=
sata_phy_reset
,
.
bmdma_setup
=
k2_bmdma_setup_mmio
,
.
bmdma_start
=
k2_bmdma_start_mmio
,
.
bmdma_stop
=
ata_bmdma_stop
,
.
bmdma_status
=
ata_bmdma_status
,
.
qc_prep
=
ata_qc_prep
,
.
qc_issue
=
ata_qc_issue_prot
,
.
eng_timeout
=
ata_eng_timeout
,
...
...
@@ -338,6 +340,7 @@ static int k2_sata_init_one (struct pci_dev *pdev, const struct pci_device_id *e
struct
ata_probe_ent
*
probe_ent
=
NULL
;
unsigned
long
base
;
void
*
mmio_base
;
int
pci_dev_busy
=
0
;
int
rc
;
if
(
!
printed_version
++
)
...
...
@@ -359,8 +362,10 @@ static int k2_sata_init_one (struct pci_dev *pdev, const struct pci_device_id *e
/* Request PCI regions */
rc
=
pci_request_regions
(
pdev
,
DRV_NAME
);
if
(
rc
)
if
(
rc
)
{
pci_dev_busy
=
1
;
goto
err_out
;
}
rc
=
pci_set_dma_mask
(
pdev
,
ATA_DMA_MASK
);
if
(
rc
)
...
...
@@ -433,6 +438,7 @@ static int k2_sata_init_one (struct pci_dev *pdev, const struct pci_device_id *e
err_out_regions:
pci_release_regions
(
pdev
);
err_out:
if
(
!
pci_dev_busy
)
pci_disable_device
(
pdev
);
return
rc
;
}
...
...
drivers/scsi/sata_sx4.c
View file @
0202b160
...
...
@@ -1366,6 +1366,7 @@ static int pdc_sata_init_one (struct pci_dev *pdev, const struct pci_device_id *
void
*
mmio_base
,
*
dimm_mmio
=
NULL
;
struct
pdc_host_priv
*
hpriv
=
NULL
;
unsigned
int
board_idx
=
(
unsigned
int
)
ent
->
driver_data
;
int
pci_dev_busy
=
0
;
int
rc
;
if
(
!
printed_version
++
)
...
...
@@ -1380,8 +1381,10 @@ static int pdc_sata_init_one (struct pci_dev *pdev, const struct pci_device_id *
return
rc
;
rc
=
pci_request_regions
(
pdev
,
DRV_NAME
);
if
(
rc
)
if
(
rc
)
{
pci_dev_busy
=
1
;
goto
err_out
;
}
rc
=
pci_set_dma_mask
(
pdev
,
ATA_DMA_MASK
);
if
(
rc
)
...
...
@@ -1471,6 +1474,7 @@ static int pdc_sata_init_one (struct pci_dev *pdev, const struct pci_device_id *
err_out_regions:
pci_release_regions
(
pdev
);
err_out:
if
(
!
pci_dev_busy
)
pci_disable_device
(
pdev
);
return
rc
;
}
...
...
drivers/scsi/sata_uli.c
View file @
0202b160
...
...
@@ -97,6 +97,8 @@ static struct ata_port_operations uli_ops = {
.
bmdma_setup
=
ata_bmdma_setup
,
.
bmdma_start
=
ata_bmdma_start
,
.
bmdma_stop
=
ata_bmdma_stop
,
.
bmdma_status
=
ata_bmdma_status
,
.
qc_prep
=
ata_qc_prep
,
.
qc_issue
=
ata_qc_issue_prot
,
...
...
@@ -185,14 +187,17 @@ static int uli_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
struct
ata_port_info
*
ppi
;
int
rc
;
unsigned
int
board_idx
=
(
unsigned
int
)
ent
->
driver_data
;
int
pci_dev_busy
=
0
;
rc
=
pci_enable_device
(
pdev
);
if
(
rc
)
return
rc
;
rc
=
pci_request_regions
(
pdev
,
DRV_NAME
);
if
(
rc
)
if
(
rc
)
{
pci_dev_busy
=
1
;
goto
err_out
;
}
rc
=
pci_set_dma_mask
(
pdev
,
ATA_DMA_MASK
);
if
(
rc
)
...
...
@@ -260,6 +265,7 @@ static int uli_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
pci_release_regions
(
pdev
);
err_out:
if
(
!
pci_dev_busy
)
pci_disable_device
(
pdev
);
return
rc
;
...
...
drivers/scsi/sata_via.c
View file @
0202b160
...
...
@@ -24,6 +24,11 @@
If you do not delete the provisions above, a recipient may use your
version of this file under either the OSL or the GPL.
----------------------------------------------------------------------
To-do list:
* VT6421 PATA support
*/
#include <linux/kernel.h>
...
...
@@ -38,11 +43,14 @@
#include <asm/io.h>
#define DRV_NAME "sata_via"
#define DRV_VERSION "1.
0
"
#define DRV_VERSION "1.
1
"
enum
{
via_sata
=
0
,
enum
board_ids_enum
{
vt6420
,
vt6421
,
};
enum
{
SATA_CHAN_ENAB
=
0x40
,
/* SATA channel enable */
SATA_INT_GATE
=
0x41
,
/* SATA interrupt gating */
SATA_NATIVE_MODE
=
0x42
,
/* Native mode enable */
...
...
@@ -50,10 +58,8 @@ enum {
PORT0
=
(
1
<<
1
),
PORT1
=
(
1
<<
0
),
ENAB_ALL
=
PORT0
|
PORT1
,
INT_GATE_ALL
=
PORT0
|
PORT1
,
ALL_PORTS
=
PORT0
|
PORT1
,
N_PORTS
=
2
,
NATIVE_MODE_ALL
=
(
1
<<
7
)
|
(
1
<<
6
)
|
(
1
<<
5
)
|
(
1
<<
4
),
...
...
@@ -66,7 +72,8 @@ static u32 svia_scr_read (struct ata_port *ap, unsigned int sc_reg);
static
void
svia_scr_write
(
struct
ata_port
*
ap
,
unsigned
int
sc_reg
,
u32
val
);
static
struct
pci_device_id
svia_pci_tbl
[]
=
{
{
0x1106
,
0x3149
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
via_sata
},
{
0x1106
,
0x3149
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
vt6420
},
{
0x1106
,
0x3249
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
vt6421
},
{
}
/* terminate list */
};
...
...
@@ -110,6 +117,9 @@ static struct ata_port_operations svia_sata_ops = {
.
bmdma_setup
=
ata_bmdma_setup
,
.
bmdma_start
=
ata_bmdma_start
,
.
bmdma_stop
=
ata_bmdma_stop
,
.
bmdma_status
=
ata_bmdma_status
,
.
qc_prep
=
ata_qc_prep
,
.
qc_issue
=
ata_qc_issue_prot
,
...
...
@@ -158,18 +168,132 @@ static const unsigned int svia_bar_sizes[] = {
8
,
4
,
8
,
4
,
16
,
256
};
static
const
unsigned
int
vt6421_bar_sizes
[]
=
{
16
,
16
,
16
,
16
,
32
,
128
};
static
unsigned
long
svia_scr_addr
(
unsigned
long
addr
,
unsigned
int
port
)
{
return
addr
+
(
port
*
128
);
}
static
unsigned
long
vt6421_scr_addr
(
unsigned
long
addr
,
unsigned
int
port
)
{
return
addr
+
(
port
*
64
);
}
static
void
vt6421_init_addrs
(
struct
ata_probe_ent
*
probe_ent
,
struct
pci_dev
*
pdev
,
unsigned
int
port
)
{
unsigned
long
reg_addr
=
pci_resource_start
(
pdev
,
port
);
unsigned
long
bmdma_addr
=
pci_resource_start
(
pdev
,
4
)
+
(
port
*
8
);
unsigned
long
scr_addr
;
probe_ent
->
port
[
port
].
cmd_addr
=
reg_addr
;
probe_ent
->
port
[
port
].
altstatus_addr
=
probe_ent
->
port
[
port
].
ctl_addr
=
(
reg_addr
+
8
)
|
ATA_PCI_CTL_OFS
;
probe_ent
->
port
[
port
].
bmdma_addr
=
bmdma_addr
;
scr_addr
=
vt6421_scr_addr
(
pci_resource_start
(
pdev
,
5
),
port
);
probe_ent
->
port
[
port
].
scr_addr
=
scr_addr
;
ata_std_ports
(
&
probe_ent
->
port
[
port
]);
}
static
struct
ata_probe_ent
*
vt6420_init_probe_ent
(
struct
pci_dev
*
pdev
)
{
struct
ata_probe_ent
*
probe_ent
;
struct
ata_port_info
*
ppi
=
&
svia_port_info
;
probe_ent
=
ata_pci_init_native_mode
(
pdev
,
&
ppi
);
if
(
!
probe_ent
)
return
NULL
;
probe_ent
->
port
[
0
].
scr_addr
=
svia_scr_addr
(
pci_resource_start
(
pdev
,
5
),
0
);
probe_ent
->
port
[
1
].
scr_addr
=
svia_scr_addr
(
pci_resource_start
(
pdev
,
5
),
1
);
return
probe_ent
;
}
static
struct
ata_probe_ent
*
vt6421_init_probe_ent
(
struct
pci_dev
*
pdev
)
{
struct
ata_probe_ent
*
probe_ent
;
unsigned
int
i
;
probe_ent
=
kmalloc
(
sizeof
(
*
probe_ent
),
GFP_KERNEL
);
if
(
!
probe_ent
)
return
NULL
;
memset
(
probe_ent
,
0
,
sizeof
(
*
probe_ent
));
probe_ent
->
dev
=
pci_dev_to_dev
(
pdev
);
INIT_LIST_HEAD
(
&
probe_ent
->
node
);
probe_ent
->
sht
=
&
svia_sht
;
probe_ent
->
host_flags
=
ATA_FLAG_SATA
|
ATA_FLAG_SATA_RESET
|
ATA_FLAG_NO_LEGACY
;
probe_ent
->
port_ops
=
&
svia_sata_ops
;
probe_ent
->
n_ports
=
N_PORTS
;
probe_ent
->
irq
=
pdev
->
irq
;
probe_ent
->
irq_flags
=
SA_SHIRQ
;
probe_ent
->
pio_mask
=
0x1f
;
probe_ent
->
mwdma_mask
=
0x07
;
probe_ent
->
udma_mask
=
0x7f
;
for
(
i
=
0
;
i
<
N_PORTS
;
i
++
)
vt6421_init_addrs
(
probe_ent
,
pdev
,
i
);
return
probe_ent
;
}
static
void
svia_configure
(
struct
pci_dev
*
pdev
)
{
u8
tmp8
;
pci_read_config_byte
(
pdev
,
PCI_INTERRUPT_LINE
,
&
tmp8
);
printk
(
KERN_INFO
DRV_NAME
"(%s): routed to hard irq line %d
\n
"
,
pci_name
(
pdev
),
(
int
)
(
tmp8
&
0xf0
)
==
0xf0
?
0
:
tmp8
&
0x0f
);
/* make sure SATA channels are enabled */
pci_read_config_byte
(
pdev
,
SATA_CHAN_ENAB
,
&
tmp8
);
if
((
tmp8
&
ALL_PORTS
)
!=
ALL_PORTS
)
{
printk
(
KERN_DEBUG
DRV_NAME
"(%s): enabling SATA channels (0x%x)
\n
"
,
pci_name
(
pdev
),
(
int
)
tmp8
);
tmp8
|=
ALL_PORTS
;
pci_write_config_byte
(
pdev
,
SATA_CHAN_ENAB
,
tmp8
);
}
/* make sure interrupts for each channel sent to us */
pci_read_config_byte
(
pdev
,
SATA_INT_GATE
,
&
tmp8
);
if
((
tmp8
&
ALL_PORTS
)
!=
ALL_PORTS
)
{
printk
(
KERN_DEBUG
DRV_NAME
"(%s): enabling SATA channel interrupts (0x%x)
\n
"
,
pci_name
(
pdev
),
(
int
)
tmp8
);
tmp8
|=
ALL_PORTS
;
pci_write_config_byte
(
pdev
,
SATA_INT_GATE
,
tmp8
);
}
/* make sure native mode is enabled */
pci_read_config_byte
(
pdev
,
SATA_NATIVE_MODE
,
&
tmp8
);
if
((
tmp8
&
NATIVE_MODE_ALL
)
!=
NATIVE_MODE_ALL
)
{
printk
(
KERN_DEBUG
DRV_NAME
"(%s): enabling SATA channel native mode (0x%x)
\n
"
,
pci_name
(
pdev
),
(
int
)
tmp8
);
tmp8
|=
NATIVE_MODE_ALL
;
pci_write_config_byte
(
pdev
,
SATA_NATIVE_MODE
,
tmp8
);
}
}
static
int
svia_init_one
(
struct
pci_dev
*
pdev
,
const
struct
pci_device_id
*
ent
)
{
static
int
printed_version
;
unsigned
int
i
;
int
rc
;
struct
ata_port_info
*
ppi
;
struct
ata_probe_ent
*
probe_ent
;
int
board_id
=
(
int
)
ent
->
driver_data
;
const
int
*
bar_sizes
;
int
pci_dev_busy
=
0
;
u8
tmp8
;
if
(
!
printed_version
++
)
...
...
@@ -180,9 +304,12 @@ static int svia_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
return
rc
;
rc
=
pci_request_regions
(
pdev
,
DRV_NAME
);
if
(
rc
)
if
(
rc
)
{
pci_dev_busy
=
1
;
goto
err_out
;
}
if
(
board_id
==
vt6420
)
{
pci_read_config_byte
(
pdev
,
SATA_PATA_SHARING
,
&
tmp8
);
if
(
tmp8
&
SATA_2DEV
)
{
printk
(
KERN_ERR
DRV_NAME
"(%s): SATA master/slave not supported (0x%x)
\n
"
,
...
...
@@ -191,9 +318,14 @@ static int svia_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
goto
err_out_regions
;
}
bar_sizes
=
&
svia_bar_sizes
[
0
];
}
else
{
bar_sizes
=
&
vt6421_bar_sizes
[
0
];
}
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
svia_bar_sizes
);
i
++
)
if
((
pci_resource_start
(
pdev
,
i
)
==
0
)
||
(
pci_resource_len
(
pdev
,
i
)
<
svia_
bar_sizes
[
i
]))
{
(
pci_resource_len
(
pdev
,
i
)
<
bar_sizes
[
i
]))
{
printk
(
KERN_ERR
DRV_NAME
"(%s): invalid PCI BAR %u (sz 0x%lx, val 0x%lx)
\n
"
,
pci_name
(
pdev
),
i
,
pci_resource_start
(
pdev
,
i
),
...
...
@@ -209,8 +341,11 @@ static int svia_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
if
(
rc
)
goto
err_out_regions
;
ppi
=
&
svia_port_info
;
probe_ent
=
ata_pci_init_native_mode
(
pdev
,
&
ppi
);
if
(
board_id
==
vt6420
)
probe_ent
=
vt6420_init_probe_ent
(
pdev
);
else
probe_ent
=
vt6421_init_probe_ent
(
pdev
);
if
(
!
probe_ent
)
{
printk
(
KERN_ERR
DRV_NAME
"(%s): out of memory
\n
"
,
pci_name
(
pdev
));
...
...
@@ -218,42 +353,7 @@ static int svia_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
goto
err_out_regions
;
}
probe_ent
->
port
[
0
].
scr_addr
=
svia_scr_addr
(
pci_resource_start
(
pdev
,
5
),
0
);
probe_ent
->
port
[
1
].
scr_addr
=
svia_scr_addr
(
pci_resource_start
(
pdev
,
5
),
1
);
pci_read_config_byte
(
pdev
,
PCI_INTERRUPT_LINE
,
&
tmp8
);
printk
(
KERN_INFO
DRV_NAME
"(%s): routed to hard irq line %d
\n
"
,
pci_name
(
pdev
),
(
int
)
(
tmp8
&
0xf0
)
==
0xf0
?
0
:
tmp8
&
0x0f
);
/* make sure SATA channels are enabled */
pci_read_config_byte
(
pdev
,
SATA_CHAN_ENAB
,
&
tmp8
);
if
((
tmp8
&
ENAB_ALL
)
!=
ENAB_ALL
)
{
printk
(
KERN_DEBUG
DRV_NAME
"(%s): enabling SATA channels (0x%x)
\n
"
,
pci_name
(
pdev
),
(
int
)
tmp8
);
tmp8
|=
ENAB_ALL
;
pci_write_config_byte
(
pdev
,
SATA_CHAN_ENAB
,
tmp8
);
}
/* make sure interrupts for each channel sent to us */
pci_read_config_byte
(
pdev
,
SATA_INT_GATE
,
&
tmp8
);
if
((
tmp8
&
INT_GATE_ALL
)
!=
INT_GATE_ALL
)
{
printk
(
KERN_DEBUG
DRV_NAME
"(%s): enabling SATA channel interrupts (0x%x)
\n
"
,
pci_name
(
pdev
),
(
int
)
tmp8
);
tmp8
|=
INT_GATE_ALL
;
pci_write_config_byte
(
pdev
,
SATA_INT_GATE
,
tmp8
);
}
/* make sure native mode is enabled */
pci_read_config_byte
(
pdev
,
SATA_NATIVE_MODE
,
&
tmp8
);
if
((
tmp8
&
NATIVE_MODE_ALL
)
!=
NATIVE_MODE_ALL
)
{
printk
(
KERN_DEBUG
DRV_NAME
"(%s): enabling SATA channel native mode (0x%x)
\n
"
,
pci_name
(
pdev
),
(
int
)
tmp8
);
tmp8
|=
NATIVE_MODE_ALL
;
pci_write_config_byte
(
pdev
,
SATA_NATIVE_MODE
,
tmp8
);
}
svia_configure
(
pdev
);
pci_set_master
(
pdev
);
...
...
@@ -266,6 +366,7 @@ static int svia_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
err_out_regions:
pci_release_regions
(
pdev
);
err_out:
if
(
!
pci_dev_busy
)
pci_disable_device
(
pdev
);
return
rc
;
}
...
...
drivers/scsi/sata_vsc.c
View file @
0202b160
...
...
@@ -217,6 +217,8 @@ static struct ata_port_operations vsc_sata_ops = {
.
phy_reset
=
sata_phy_reset
,
.
bmdma_setup
=
ata_bmdma_setup
,
.
bmdma_start
=
ata_bmdma_start
,
.
bmdma_stop
=
ata_bmdma_stop
,
.
bmdma_status
=
ata_bmdma_status
,
.
qc_prep
=
ata_qc_prep
,
.
qc_issue
=
ata_qc_issue_prot
,
.
eng_timeout
=
ata_eng_timeout
,
...
...
@@ -255,6 +257,7 @@ static int __devinit vsc_sata_init_one (struct pci_dev *pdev, const struct pci_d
static
int
printed_version
;
struct
ata_probe_ent
*
probe_ent
=
NULL
;
unsigned
long
base
;
int
pci_dev_busy
=
0
;
void
*
mmio_base
;
int
rc
;
...
...
@@ -274,8 +277,10 @@ static int __devinit vsc_sata_init_one (struct pci_dev *pdev, const struct pci_d
}
rc
=
pci_request_regions
(
pdev
,
DRV_NAME
);
if
(
rc
)
if
(
rc
)
{
pci_dev_busy
=
1
;
goto
err_out
;
}
/*
* Use 32 bit DMA mask, because 64 bit address support is poor.
...
...
@@ -352,6 +357,7 @@ static int __devinit vsc_sata_init_one (struct pci_dev *pdev, const struct pci_d
err_out_regions:
pci_release_regions
(
pdev
);
err_out:
if
(
!
pci_dev_busy
)
pci_disable_device
(
pdev
);
return
rc
;
}
...
...
fs/nfs/file.c
View file @
0202b160
...
...
@@ -303,10 +303,10 @@ static int do_getlk(struct file *filp, int cmd, struct file_lock *fl)
status
=
NFS_PROTO
(
inode
)
->
lock
(
filp
,
cmd
,
fl
);
else
{
struct
file_lock
*
cfl
=
posix_test_lock
(
filp
,
fl
);
if
(
cfl
!=
NULL
)
{
memcpy
(
fl
,
cfl
,
sizeof
(
*
fl
));
fl
->
fl_type
=
F_UNLCK
;
}
if
(
cfl
!=
NULL
)
memcpy
(
fl
,
cfl
,
sizeof
(
*
fl
));
}
unlock_kernel
();
return
status
;
...
...
include/linux/agp_backend.h
View file @
0202b160
...
...
@@ -54,7 +54,7 @@ struct agp_kern_info {
struct
pci_dev
*
device
;
enum
chipset_type
chipset
;
unsigned
long
mode
;
off_t
aper_base
;
unsigned
long
aper_base
;
size_t
aper_size
;
int
max_memory
;
/* In pages */
int
current_memory
;
...
...
include/linux/agpgart.h
View file @
0202b160
...
...
@@ -64,7 +64,7 @@ typedef struct _agp_info {
struct
agp_version
version
;
/* version of the driver */
__u32
bridge_id
;
/* bridge vendor/device */
__u32
agp_mode
;
/* mode info of bridge */
off_t
aper_base
;
/* base of aperture */
unsigned
long
aper_base
;
/* base of aperture */
size_t
aper_size
;
/* size of aperture */
size_t
pg_total
;
/* max pages (swap + system) */
size_t
pg_system
;
/* max pages (system) */
...
...
@@ -118,7 +118,7 @@ struct agp_info {
struct
agp_version
version
;
/* version of the driver */
u32
bridge_id
;
/* bridge vendor/device */
u32
agp_mode
;
/* mode info of bridge */
off_t
aper_base
;
/* base of aperture */
unsigned
long
aper_base
;
/* base of aperture */
size_t
aper_size
;
/* size of aperture */
size_t
pg_total
;
/* max pages (swap + system) */
size_t
pg_system
;
/* max pages (system) */
...
...
include/linux/libata.h
View file @
0202b160
...
...
@@ -334,6 +334,8 @@ struct ata_port_operations {
void
(
*
exec_command
)(
struct
ata_port
*
ap
,
struct
ata_taskfile
*
tf
);
u8
(
*
check_status
)(
struct
ata_port
*
ap
);
u8
(
*
check_altstatus
)(
struct
ata_port
*
ap
);
u8
(
*
check_err
)(
struct
ata_port
*
ap
);
void
(
*
dev_select
)(
struct
ata_port
*
ap
,
unsigned
int
device
);
void
(
*
phy_reset
)
(
struct
ata_port
*
ap
);
...
...
@@ -360,6 +362,9 @@ struct ata_port_operations {
void
(
*
port_stop
)
(
struct
ata_port
*
ap
);
void
(
*
host_stop
)
(
struct
ata_host_set
*
host_set
);
void
(
*
bmdma_stop
)
(
struct
ata_port
*
ap
);
u8
(
*
bmdma_status
)
(
struct
ata_port
*
ap
);
};
struct
ata_port_info
{
...
...
@@ -400,6 +405,8 @@ extern void ata_tf_from_fis(u8 *fis, struct ata_taskfile *tf);
extern
void
ata_noop_dev_select
(
struct
ata_port
*
ap
,
unsigned
int
device
);
extern
void
ata_std_dev_select
(
struct
ata_port
*
ap
,
unsigned
int
device
);
extern
u8
ata_check_status
(
struct
ata_port
*
ap
);
extern
u8
ata_altstatus
(
struct
ata_port
*
ap
);
extern
u8
ata_chk_err
(
struct
ata_port
*
ap
);
extern
void
ata_exec_command
(
struct
ata_port
*
ap
,
struct
ata_taskfile
*
tf
);
extern
int
ata_port_start
(
struct
ata_port
*
ap
);
extern
void
ata_port_stop
(
struct
ata_port
*
ap
);
...
...
@@ -415,6 +422,8 @@ extern void ata_dev_id_string(u16 *id, unsigned char *s,
unsigned
int
ofs
,
unsigned
int
len
);
extern
void
ata_bmdma_setup
(
struct
ata_queued_cmd
*
qc
);
extern
void
ata_bmdma_start
(
struct
ata_queued_cmd
*
qc
);
extern
void
ata_bmdma_stop
(
struct
ata_port
*
ap
);
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
,
u8
drv_stat
);
extern
void
ata_eng_timeout
(
struct
ata_port
*
ap
);
...
...
@@ -452,26 +461,11 @@ static inline unsigned int ata_dev_present(struct ata_device *dev)
(
dev
->
class
==
ATA_DEV_ATAPI
));
}
static
inline
u8
ata_chk_err
(
struct
ata_port
*
ap
)
{
if
(
ap
->
flags
&
ATA_FLAG_MMIO
)
{
return
readb
((
void
__iomem
*
)
ap
->
ioaddr
.
error_addr
);
}
return
inb
(
ap
->
ioaddr
.
error_addr
);
}
static
inline
u8
ata_chk_status
(
struct
ata_port
*
ap
)
{
return
ap
->
ops
->
check_status
(
ap
);
}
static
inline
u8
ata_altstatus
(
struct
ata_port
*
ap
)
{
if
(
ap
->
flags
&
ATA_FLAG_MMIO
)
return
readb
((
void
__iomem
*
)
ap
->
ioaddr
.
altstatus_addr
);
return
inb
(
ap
->
ioaddr
.
altstatus_addr
);
}
static
inline
void
ata_pause
(
struct
ata_port
*
ap
)
{
ata_altstatus
(
ap
);
...
...
@@ -595,46 +589,6 @@ static inline unsigned int sata_dev_present(struct ata_port *ap)
return
((
scr_read
(
ap
,
SCR_STATUS
)
&
0xf
)
==
0x3
)
?
1
:
0
;
}
static
inline
void
ata_bmdma_stop
(
struct
ata_port
*
ap
)
{
if
(
ap
->
flags
&
ATA_FLAG_MMIO
)
{
void
__iomem
*
mmio
=
(
void
__iomem
*
)
ap
->
ioaddr
.
bmdma_addr
;
/* clear start/stop bit */
writeb
(
readb
(
mmio
+
ATA_DMA_CMD
)
&
~
ATA_DMA_START
,
mmio
+
ATA_DMA_CMD
);
}
else
{
/* clear start/stop bit */
outb
(
inb
(
ap
->
ioaddr
.
bmdma_addr
+
ATA_DMA_CMD
)
&
~
ATA_DMA_START
,
ap
->
ioaddr
.
bmdma_addr
+
ATA_DMA_CMD
);
}
/* one-PIO-cycle guaranteed wait, per spec, for HDMA1:0 transition */
ata_altstatus
(
ap
);
/* dummy read */
}
static
inline
void
ata_bmdma_ack_irq
(
struct
ata_port
*
ap
)
{
if
(
ap
->
flags
&
ATA_FLAG_MMIO
)
{
void
__iomem
*
mmio
=
((
void
__iomem
*
)
ap
->
ioaddr
.
bmdma_addr
)
+
ATA_DMA_STATUS
;
writeb
(
readb
(
mmio
),
mmio
);
}
else
{
unsigned
long
addr
=
ap
->
ioaddr
.
bmdma_addr
+
ATA_DMA_STATUS
;
outb
(
inb
(
addr
),
addr
);
}
}
static
inline
u8
ata_bmdma_status
(
struct
ata_port
*
ap
)
{
u8
host_stat
;
if
(
ap
->
flags
&
ATA_FLAG_MMIO
)
{
void
__iomem
*
mmio
=
(
void
__iomem
*
)
ap
->
ioaddr
.
bmdma_addr
;
host_stat
=
readb
(
mmio
+
ATA_DMA_STATUS
);
}
else
host_stat
=
inb
(
ap
->
ioaddr
.
bmdma_addr
+
ATA_DMA_STATUS
);
return
host_stat
;
}
static
inline
int
ata_try_flush_cache
(
struct
ata_device
*
dev
)
{
return
ata_id_wcache_enabled
(
dev
->
id
)
||
...
...
kernel/futex.c
View file @
0202b160
...
...
@@ -258,6 +258,18 @@ static void drop_key_refs(union futex_key *key)
}
}
static
inline
int
get_futex_value_locked
(
int
*
dest
,
int
__user
*
from
)
{
int
ret
;
inc_preempt_count
();
ret
=
__copy_from_user_inatomic
(
dest
,
from
,
sizeof
(
int
));
dec_preempt_count
();
preempt_check_resched
();
return
ret
?
-
EFAULT
:
0
;
}
/*
* The hash bucket lock must be held when this is called.
* Afterwards, the futex_q must not be accessed.
...
...
@@ -329,6 +341,7 @@ static int futex_requeue(unsigned long uaddr1, unsigned long uaddr2,
int
ret
,
drop_count
=
0
;
unsigned
int
nqueued
;
retry:
down_read
(
&
current
->
mm
->
mmap_sem
);
ret
=
get_futex_key
(
uaddr1
,
&
key1
);
...
...
@@ -355,9 +368,20 @@ static int futex_requeue(unsigned long uaddr1, unsigned long uaddr2,
before *uaddr1. */
smp_mb
();
if
(
get_user
(
curval
,
(
int
__user
*
)
uaddr1
)
!=
0
)
{
ret
=
-
EFAULT
;
goto
out
;
ret
=
get_futex_value_locked
(
&
curval
,
(
int
__user
*
)
uaddr1
);
if
(
unlikely
(
ret
))
{
/* If we would have faulted, release mmap_sem, fault
* it in and start all over again.
*/
up_read
(
&
current
->
mm
->
mmap_sem
);
ret
=
get_user
(
curval
,
(
int
__user
*
)
uaddr1
);
if
(
!
ret
)
goto
retry
;
return
ret
;
}
if
(
curval
!=
*
valp
)
{
ret
=
-
EAGAIN
;
...
...
@@ -480,6 +504,7 @@ static int futex_wait(unsigned long uaddr, int val, unsigned long time)
int
ret
,
curval
;
struct
futex_q
q
;
retry:
down_read
(
&
current
->
mm
->
mmap_sem
);
ret
=
get_futex_key
(
uaddr
,
&
q
.
key
);
...
...
@@ -508,9 +533,23 @@ static int futex_wait(unsigned long uaddr, int val, unsigned long time)
* We hold the mmap semaphore, so the mapping cannot have changed
* since we looked it up in get_futex_key.
*/
if
(
get_user
(
curval
,
(
int
__user
*
)
uaddr
)
!=
0
)
{
ret
=
-
EFAULT
;
goto
out_unqueue
;
ret
=
get_futex_value_locked
(
&
curval
,
(
int
__user
*
)
uaddr
);
if
(
unlikely
(
ret
))
{
/* If we would have faulted, release mmap_sem, fault it in and
* start all over again.
*/
up_read
(
&
current
->
mm
->
mmap_sem
);
if
(
!
unqueue_me
(
&
q
))
/* There's a chance we got woken already */
return
0
;
ret
=
get_user
(
curval
,
(
int
__user
*
)
uaddr
);
if
(
!
ret
)
goto
retry
;
return
ret
;
}
if
(
curval
!=
val
)
{
ret
=
-
EWOULDBLOCK
;
...
...
mm/mempolicy.c
View file @
0202b160
...
...
@@ -524,9 +524,13 @@ asmlinkage long sys_get_mempolicy(int __user *policy,
}
else
pval
=
pol
->
policy
;
err
=
-
EFAULT
;
if
(
vma
)
{
up_read
(
&
current
->
mm
->
mmap_sem
);
vma
=
NULL
;
}
if
(
policy
&&
put_user
(
pval
,
policy
))
goto
out
;
return
-
EFAULT
;
err
=
0
;
if
(
nmask
)
{
...
...
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