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
7116317d
Commit
7116317d
authored
Dec 14, 2005
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge master.kernel.org:/pub/scm/linux/kernel/git/bart/ide-2.6
parents
24996049
0afaa4fc
Changes
12
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
567 additions
and
1134 deletions
+567
-1134
drivers/ide/Kconfig
drivers/ide/Kconfig
+1
-9
drivers/ide/ide-cd.c
drivers/ide/ide-cd.c
+0
-7
drivers/ide/ide-cd.h
drivers/ide/ide-cd.h
+0
-1
drivers/ide/ide-disk.c
drivers/ide/ide-disk.c
+2
-2
drivers/ide/ide-dma.c
drivers/ide/ide-dma.c
+6
-9
drivers/ide/mips/Makefile
drivers/ide/mips/Makefile
+3
-0
drivers/ide/mips/au1xxx-ide.c
drivers/ide/mips/au1xxx-ide.c
+532
-966
drivers/ide/pci/sgiioc4.c
drivers/ide/pci/sgiioc4.c
+7
-1
drivers/ide/pci/via82cxxx.c
drivers/ide/pci/via82cxxx.c
+1
-0
include/asm-mips/mach-au1x00/au1xxx_ide.h
include/asm-mips/mach-au1x00/au1xxx_ide.h
+8
-14
include/linux/ide.h
include/linux/ide.h
+6
-125
include/linux/pci_ids.h
include/linux/pci_ids.h
+1
-0
No files found.
drivers/ide/Kconfig
View file @
7116317d
...
...
@@ -807,14 +807,6 @@ config BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA
depends on SOC_AU1200 && BLK_DEV_IDE_AU1XXX
endchoice
config BLK_DEV_IDE_AU1XXX_BURSTABLE_ON
bool "Enable burstable Mode on DbDMA"
default false
depends BLK_DEV_IDE_AU1XXX
help
This option enable the burstable Flag on DbDMA controller
(cf. "AMD Alchemy 'Au1200' Processor Data Book - PRELIMINARY").
config BLK_DEV_IDE_AU1XXX_SEQTS_PER_RQ
int "Maximum transfer size (KB) per request (up to 128)"
default "128"
...
...
@@ -940,7 +932,7 @@ config BLK_DEV_Q40IDE
config BLK_DEV_MPC8xx_IDE
bool "MPC8xx IDE support"
depends on 8xx
depends on 8xx
&& IDE=y && BLK_DEV_IDE=y
help
This option provides support for IDE on Motorola MPC8xx Systems.
Please see 'Type of MPC8xx IDE interface' for details.
...
...
drivers/ide/ide-cd.c
View file @
7116317d
...
...
@@ -1292,7 +1292,6 @@ static ide_startstop_t cdrom_start_seek (ide_drive_t *drive, unsigned int block)
struct
cdrom_info
*
info
=
drive
->
driver_data
;
info
->
dma
=
0
;
info
->
cmd
=
0
;
info
->
start_seek
=
jiffies
;
return
cdrom_start_packet_command
(
drive
,
0
,
cdrom_start_seek_continuation
);
}
...
...
@@ -1344,8 +1343,6 @@ static ide_startstop_t cdrom_start_read (ide_drive_t *drive, unsigned int block)
(
rq
->
nr_sectors
&
(
sectors_per_frame
-
1
)))
info
->
dma
=
0
;
info
->
cmd
=
READ
;
/* Start sending the read request to the drive. */
return
cdrom_start_packet_command
(
drive
,
32768
,
cdrom_start_read_continuation
);
}
...
...
@@ -1484,7 +1481,6 @@ static ide_startstop_t cdrom_do_packet_command (ide_drive_t *drive)
struct
cdrom_info
*
info
=
drive
->
driver_data
;
info
->
dma
=
0
;
info
->
cmd
=
0
;
rq
->
flags
&=
~
REQ_FAILED
;
len
=
rq
->
data_len
;
...
...
@@ -1891,7 +1887,6 @@ static ide_startstop_t cdrom_start_write(ide_drive_t *drive, struct request *rq)
/* use dma, if possible. we don't need to check more, since we
* know that the transfer is always (at least!) frame aligned */
info
->
dma
=
drive
->
using_dma
?
1
:
0
;
info
->
cmd
=
WRITE
;
info
->
devinfo
.
media_written
=
1
;
...
...
@@ -1916,7 +1911,6 @@ static ide_startstop_t cdrom_do_block_pc(ide_drive_t *drive, struct request *rq)
rq
->
flags
|=
REQ_QUIET
;
info
->
dma
=
0
;
info
->
cmd
=
0
;
/*
* sg request
...
...
@@ -1925,7 +1919,6 @@ static ide_startstop_t cdrom_do_block_pc(ide_drive_t *drive, struct request *rq)
int
mask
=
drive
->
queue
->
dma_alignment
;
unsigned
long
addr
=
(
unsigned
long
)
page_address
(
bio_page
(
rq
->
bio
));
info
->
cmd
=
rq_data_dir
(
rq
);
info
->
dma
=
drive
->
using_dma
;
/*
...
...
drivers/ide/ide-cd.h
View file @
7116317d
...
...
@@ -480,7 +480,6 @@ struct cdrom_info {
struct
request
request_sense_request
;
int
dma
;
int
cmd
;
unsigned
long
last_block
;
unsigned
long
start_seek
;
/* Buffer to hold mechanism status and changer slot table. */
...
...
drivers/ide/ide-disk.c
View file @
7116317d
...
...
@@ -1034,12 +1034,12 @@ static int ide_disk_remove(struct device *dev)
struct
ide_disk_obj
*
idkp
=
drive
->
driver_data
;
struct
gendisk
*
g
=
idkp
->
disk
;
ide_cacheflush_p
(
drive
);
ide_unregister_subdriver
(
drive
,
idkp
->
driver
);
del_gendisk
(
g
);
ide_cacheflush_p
(
drive
);
ide_disk_put
(
idkp
);
return
0
;
...
...
drivers/ide/ide-dma.c
View file @
7116317d
...
...
@@ -90,11 +90,6 @@
#include <asm/io.h>
#include <asm/irq.h>
struct
drive_list_entry
{
const
char
*
id_model
;
const
char
*
id_firmware
;
};
static
const
struct
drive_list_entry
drive_whitelist
[]
=
{
{
"Micropolis 2112A"
,
"ALL"
},
...
...
@@ -139,7 +134,7 @@ static const struct drive_list_entry drive_blacklist [] = {
};
/**
* in_drive_list - look for drive in black/white list
* i
de_i
n_drive_list - look for drive in black/white list
* @id: drive identifier
* @drive_table: list to inspect
*
...
...
@@ -147,7 +142,7 @@ static const struct drive_list_entry drive_blacklist [] = {
* Returns 1 if the drive is found in the table.
*/
static
int
in_drive_list
(
struct
hd_driveid
*
id
,
const
struct
drive_list_entry
*
drive_table
)
int
ide_
in_drive_list
(
struct
hd_driveid
*
id
,
const
struct
drive_list_entry
*
drive_table
)
{
for
(
;
drive_table
->
id_model
;
drive_table
++
)
if
((
!
strcmp
(
drive_table
->
id_model
,
id
->
model
))
&&
...
...
@@ -157,6 +152,8 @@ static int in_drive_list(struct hd_driveid *id, const struct drive_list_entry *d
return
0
;
}
EXPORT_SYMBOL_GPL
(
ide_in_drive_list
);
/**
* ide_dma_intr - IDE DMA interrupt handler
* @drive: the drive the interrupt is for
...
...
@@ -663,7 +660,7 @@ int __ide_dma_bad_drive (ide_drive_t *drive)
{
struct
hd_driveid
*
id
=
drive
->
id
;
int
blacklist
=
in_drive_list
(
id
,
drive_blacklist
);
int
blacklist
=
i
de_i
n_drive_list
(
id
,
drive_blacklist
);
if
(
blacklist
)
{
printk
(
KERN_WARNING
"%s: Disabling (U)DMA for %s (blacklisted)
\n
"
,
drive
->
name
,
id
->
model
);
...
...
@@ -677,7 +674,7 @@ EXPORT_SYMBOL(__ide_dma_bad_drive);
int
__ide_dma_good_drive
(
ide_drive_t
*
drive
)
{
struct
hd_driveid
*
id
=
drive
->
id
;
return
in_drive_list
(
id
,
drive_whitelist
);
return
i
de_i
n_drive_list
(
id
,
drive_whitelist
);
}
EXPORT_SYMBOL
(
__ide_dma_good_drive
);
...
...
drivers/ide/mips/Makefile
View file @
7116317d
obj-$(CONFIG_BLK_DEV_IDE_SWARM)
+=
swarm.o
obj-$(CONFIG_BLK_DEV_IDE_AU1XXX)
+=
au1xxx-ide.o
EXTRA_CFLAGS
:=
-Idrivers
/ide
drivers/ide/mips/au1xxx-ide.c
View file @
7116317d
...
...
@@ -31,865 +31,638 @@
*/
#undef REALLY_SLOW_IO
/* most systems can safely undef this */
#include <linux/config.h>
/* for CONFIG_BLK_DEV_IDEPCI */
#include <linux/types.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/delay.h>
#include <linux/timer.h>
#include <linux/mm.h>
#include <linux/ioport.h>
#include <linux/hdreg.h>
#include <linux/platform_device.h>
#include <linux/init.h>
#include <linux/ide.h>
#include <linux/sysdev.h>
#include <linux/dma-mapping.h>
#include "ide-timing.h"
#include <asm/io.h>
#include <asm/mach-au1x00/au1xxx.h>
#include <asm/mach-au1x00/au1xxx_dbdma.h>
#if CONFIG_PM
#include <asm/mach-au1x00/au1xxx_pm.h>
#endif
#include <asm/mach-au1x00/au1xxx_ide.h>
#define DRV_NAME "au1200-ide"
#define DRV_VERSION "1.0"
#define DRV_AUTHOR "AMD PCS / Pete Popov <ppopov@embeddedalley.com>"
#define DRV_DESC "Au1200 IDE"
static
_auide_hwif
auide_hwif
;
static
spinlock_t
ide_tune_drive_spin_lock
=
SPIN_LOCK_UNLOCKED
;
static
spinlock_t
ide_tune_chipset_spin_lock
=
SPIN_LOCK_UNLOCKED
;
static
int
dbdma_init_done
=
0
;
/*
* local I/O functions
*/
u8
auide_inb
(
unsigned
long
port
)
{
return
(
au_readb
(
port
));
}
#define DRV_AUTHOR "Enrico Walther <enrico.walther@amd.com> / Pete Popov <ppopov@embeddedalley.com>"
u16
auide_inw
(
unsigned
long
port
)
{
return
(
au_readw
(
port
));
}
/* enable the burstmode in the dbdma */
#define IDE_AU1XXX_BURSTMODE 1
u32
auide_inl
(
unsigned
long
port
)
{
return
(
au_readl
(
port
));
}
static
_auide_hwif
auide_hwif
;
static
int
dbdma_init_done
;
void
auide_insw
(
unsigned
long
port
,
void
*
addr
,
u32
count
)
{
#if defined(CONFIG_BLK_DEV_IDE_AU1XXX_PIO_DBDMA)
_auide_hwif
*
ahwif
=
&
auide_hwif
;
chan_tab_t
*
ctp
;
au1x_ddma_desc_t
*
dp
;
if
(
!
put_dest_flags
(
ahwif
->
rx_chan
,
(
void
*
)
addr
,
count
<<
1
,
DDMA_FLAGS_NOIE
))
{
printk
(
KERN_ERR
"%s failed %d
\n
"
,
__FUNCTION__
,
__LINE__
);
return
;
}
ctp
=
*
((
chan_tab_t
**
)
ahwif
->
rx_chan
);
dp
=
ctp
->
cur_ptr
;
while
(
dp
->
dscr_cmd0
&
DSCR_CMD0_V
)
;
ctp
->
cur_ptr
=
au1xxx_ddma_get_nextptr_virt
(
dp
);
#else
while
(
count
--
)
{
*
(
u16
*
)
addr
=
au_readw
(
port
);
addr
+=
2
;
}
#endif
}
void
auide_insl
(
unsigned
long
port
,
void
*
addr
,
u32
count
)
{
while
(
count
--
)
{
*
(
u32
*
)
addr
=
au_readl
(
port
);
/* NOTE: For IDE interfaces over PCMCIA,
* 32-bit access does not work
*/
addr
+=
4
;
}
}
void
auide_outb
(
u8
addr
,
unsigned
long
port
)
void
auide_insw
(
unsigned
long
port
,
void
*
addr
,
u32
count
)
{
return
(
au_writeb
(
addr
,
port
));
}
_auide_hwif
*
ahwif
=
&
auide_hwif
;
chan_tab_t
*
ctp
;
au1x_ddma_desc_t
*
dp
;
void
auide_outbsync
(
ide_drive_t
*
drive
,
u8
addr
,
unsigned
long
port
)
{
return
(
au_writeb
(
addr
,
port
));
if
(
!
put_dest_flags
(
ahwif
->
rx_chan
,
(
void
*
)
addr
,
count
<<
1
,
DDMA_FLAGS_NOIE
))
{
printk
(
KERN_ERR
"%s failed %d
\n
"
,
__FUNCTION__
,
__LINE__
);
return
;
}
ctp
=
*
((
chan_tab_t
**
)
ahwif
->
rx_chan
);
dp
=
ctp
->
cur_ptr
;
while
(
dp
->
dscr_cmd0
&
DSCR_CMD0_V
)
;
ctp
->
cur_ptr
=
au1xxx_ddma_get_nextptr_virt
(
dp
);
}
void
auide_out
w
(
u16
addr
,
unsigned
long
por
t
)
void
auide_out
sw
(
unsigned
long
port
,
void
*
addr
,
u32
coun
t
)
{
return
(
au_writew
(
addr
,
port
));
}
_auide_hwif
*
ahwif
=
&
auide_hwif
;
chan_tab_t
*
ctp
;
au1x_ddma_desc_t
*
dp
;
void
auide_outl
(
u32
addr
,
unsigned
long
port
)
{
return
(
au_writel
(
addr
,
port
));
if
(
!
put_source_flags
(
ahwif
->
tx_chan
,
(
void
*
)
addr
,
count
<<
1
,
DDMA_FLAGS_NOIE
))
{
printk
(
KERN_ERR
"%s failed %d
\n
"
,
__FUNCTION__
,
__LINE__
);
return
;
}
ctp
=
*
((
chan_tab_t
**
)
ahwif
->
tx_chan
);
dp
=
ctp
->
cur_ptr
;
while
(
dp
->
dscr_cmd0
&
DSCR_CMD0_V
)
;
ctp
->
cur_ptr
=
au1xxx_ddma_get_nextptr_virt
(
dp
);
}
void
auide_outsw
(
unsigned
long
port
,
void
*
addr
,
u32
count
)
{
#if defined(CONFIG_BLK_DEV_IDE_AU1XXX_PIO_DBDMA)
_auide_hwif
*
ahwif
=
&
auide_hwif
;
chan_tab_t
*
ctp
;
au1x_ddma_desc_t
*
dp
;
if
(
!
put_source_flags
(
ahwif
->
tx_chan
,
(
void
*
)
addr
,
count
<<
1
,
DDMA_FLAGS_NOIE
))
{
printk
(
KERN_ERR
"%s failed %d
\n
"
,
__FUNCTION__
,
__LINE__
);
return
;
}
ctp
=
*
((
chan_tab_t
**
)
ahwif
->
tx_chan
);
dp
=
ctp
->
cur_ptr
;
while
(
dp
->
dscr_cmd0
&
DSCR_CMD0_V
)
;
ctp
->
cur_ptr
=
au1xxx_ddma_get_nextptr_virt
(
dp
);
#else
while
(
count
--
)
{
au_writew
(
*
(
u16
*
)
addr
,
port
);
addr
+=
2
;
}
#endif
}
void
auide_outsl
(
unsigned
long
port
,
void
*
addr
,
u32
count
)
{
while
(
count
--
)
{
au_writel
(
*
(
u32
*
)
addr
,
port
);
/* NOTE: For IDE interfaces over PCMCIA,
* 32-bit access does not work
*/
addr
+=
4
;
}
}
static
void
auide_tune_drive
(
ide_drive_t
*
drive
,
byte
pio
)
{
int
mem_sttime
;
int
mem_stcfg
;
unsigned
long
flags
;
u8
speed
;
/* get the best pio mode for the drive */
pio
=
ide_get_best_pio_mode
(
drive
,
pio
,
4
,
NULL
);
printk
(
"%s: setting Au1XXX IDE to PIO mode%d
\n
"
,
drive
->
name
,
pio
);
spin_lock_irqsave
(
&
ide_tune_drive_spin_lock
,
flags
);
mem_sttime
=
0
;
mem_stcfg
=
au_readl
(
MEM_STCFG2
);
/* set pio mode! */
switch
(
pio
)
{
case
0
:
/* set timing parameters for RCS2# */
mem_sttime
=
SBC_IDE_PIO0_TWCS
|
SBC_IDE_PIO0_TCSH
|
SBC_IDE_PIO0_TCSOFF
|
SBC_IDE_PIO0_TWP
|
SBC_IDE_PIO0_TCSW
|
SBC_IDE_PIO0_TPM
|
SBC_IDE_PIO0_TA
;
/* set configuration for RCS2# */
mem_stcfg
|=
TS_MASK
;
mem_stcfg
&=
~
TCSOE_MASK
;
mem_stcfg
&=
~
TOECS_MASK
;
mem_stcfg
|=
SBC_IDE_PIO0_TCSOE
|
SBC_IDE_PIO0_TOECS
;
au_writel
(
mem_sttime
,
MEM_STTIME2
);
au_writel
(
mem_stcfg
,
MEM_STCFG2
);
break
;
case
1
:
/* set timing parameters for RCS2# */
mem_sttime
=
SBC_IDE_PIO1_TWCS
|
SBC_IDE_PIO1_TCSH
|
SBC_IDE_PIO1_TCSOFF
|
SBC_IDE_PIO1_TWP
|
SBC_IDE_PIO1_TCSW
|
SBC_IDE_PIO1_TPM
|
SBC_IDE_PIO1_TA
;
/* set configuration for RCS2# */
mem_stcfg
|=
TS_MASK
;
mem_stcfg
&=
~
TCSOE_MASK
;
mem_stcfg
&=
~
TOECS_MASK
;
mem_stcfg
|=
SBC_IDE_PIO1_TCSOE
|
SBC_IDE_PIO1_TOECS
;
break
;
case
2
:
/* set timing parameters for RCS2# */
mem_sttime
=
SBC_IDE_PIO2_TWCS
|
SBC_IDE_PIO2_TCSH
|
SBC_IDE_PIO2_TCSOFF
|
SBC_IDE_PIO2_TWP
|
SBC_IDE_PIO2_TCSW
|
SBC_IDE_PIO2_TPM
|
SBC_IDE_PIO2_TA
;
/* set configuration for RCS2# */
mem_stcfg
&=
~
TS_MASK
;
mem_stcfg
&=
~
TCSOE_MASK
;
mem_stcfg
&=
~
TOECS_MASK
;
mem_stcfg
|=
SBC_IDE_PIO2_TCSOE
|
SBC_IDE_PIO2_TOECS
;
break
;
case
3
:
/* set timing parameters for RCS2# */
mem_sttime
=
SBC_IDE_PIO3_TWCS
|
SBC_IDE_PIO3_TCSH
|
SBC_IDE_PIO3_TCSOFF
|
SBC_IDE_PIO3_TWP
|
SBC_IDE_PIO3_TCSW
|
SBC_IDE_PIO3_TPM
|
SBC_IDE_PIO3_TA
;
/* set configuration for RCS2# */
mem_stcfg
|=
TS_MASK
;
mem_stcfg
&=
~
TS_MASK
;
mem_stcfg
&=
~
TCSOE_MASK
;
mem_stcfg
&=
~
TOECS_MASK
;
mem_stcfg
|=
SBC_IDE_PIO3_TCSOE
|
SBC_IDE_PIO3_TOECS
;
break
;
case
4
:
/* set timing parameters for RCS2# */
mem_sttime
=
SBC_IDE_PIO4_TWCS
|
SBC_IDE_PIO4_TCSH
|
SBC_IDE_PIO4_TCSOFF
|
SBC_IDE_PIO4_TWP
|
SBC_IDE_PIO4_TCSW
|
SBC_IDE_PIO4_TPM
|
SBC_IDE_PIO4_TA
;
/* set configuration for RCS2# */
mem_stcfg
&=
~
TS_MASK
;
mem_stcfg
&=
~
TCSOE_MASK
;
mem_stcfg
&=
~
TOECS_MASK
;
mem_stcfg
|=
SBC_IDE_PIO4_TCSOE
|
SBC_IDE_PIO4_TOECS
;
break
;
}
au_writel
(
mem_sttime
,
MEM_STTIME2
);
au_writel
(
mem_stcfg
,
MEM_STCFG2
);
spin_unlock_irqrestore
(
&
ide_tune_drive_spin_lock
,
flags
);
speed
=
pio
+
XFER_PIO_0
;
ide_config_drive_speed
(
drive
,
speed
);
int
mem_sttime
;
int
mem_stcfg
;
u8
speed
;
/* get the best pio mode for the drive */
pio
=
ide_get_best_pio_mode
(
drive
,
pio
,
4
,
NULL
);
printk
(
KERN_INFO
"%s: setting Au1XXX IDE to PIO mode%d
\n
"
,
drive
->
name
,
pio
);
mem_sttime
=
0
;
mem_stcfg
=
au_readl
(
MEM_STCFG2
);
/* set pio mode! */
switch
(
pio
)
{
case
0
:
mem_sttime
=
SBC_IDE_TIMING
(
PIO0
);
/* set configuration for RCS2# */
mem_stcfg
|=
TS_MASK
;
mem_stcfg
&=
~
TCSOE_MASK
;
mem_stcfg
&=
~
TOECS_MASK
;
mem_stcfg
|=
SBC_IDE_PIO0_TCSOE
|
SBC_IDE_PIO0_TOECS
;
break
;
case
1
:
mem_sttime
=
SBC_IDE_TIMING
(
PIO1
);
/* set configuration for RCS2# */
mem_stcfg
|=
TS_MASK
;
mem_stcfg
&=
~
TCSOE_MASK
;
mem_stcfg
&=
~
TOECS_MASK
;
mem_stcfg
|=
SBC_IDE_PIO1_TCSOE
|
SBC_IDE_PIO1_TOECS
;
break
;
case
2
:
mem_sttime
=
SBC_IDE_TIMING
(
PIO2
);
/* set configuration for RCS2# */
mem_stcfg
&=
~
TS_MASK
;
mem_stcfg
&=
~
TCSOE_MASK
;
mem_stcfg
&=
~
TOECS_MASK
;
mem_stcfg
|=
SBC_IDE_PIO2_TCSOE
|
SBC_IDE_PIO2_TOECS
;
break
;
case
3
:
mem_sttime
=
SBC_IDE_TIMING
(
PIO3
);
/* set configuration for RCS2# */
mem_stcfg
&=
~
TS_MASK
;
mem_stcfg
&=
~
TCSOE_MASK
;
mem_stcfg
&=
~
TOECS_MASK
;
mem_stcfg
|=
SBC_IDE_PIO3_TCSOE
|
SBC_IDE_PIO3_TOECS
;
break
;
case
4
:
mem_sttime
=
SBC_IDE_TIMING
(
PIO4
);
/* set configuration for RCS2# */
mem_stcfg
&=
~
TS_MASK
;
mem_stcfg
&=
~
TCSOE_MASK
;
mem_stcfg
&=
~
TOECS_MASK
;
mem_stcfg
|=
SBC_IDE_PIO4_TCSOE
|
SBC_IDE_PIO4_TOECS
;
break
;
}
au_writel
(
mem_sttime
,
MEM_STTIME2
);
au_writel
(
mem_stcfg
,
MEM_STCFG2
);
speed
=
pio
+
XFER_PIO_0
;
ide_config_drive_speed
(
drive
,
speed
);
}
static
int
auide_tune_chipset
(
ide_drive_t
*
drive
,
u8
speed
)
{
u8
mode
=
0
;
int
mem_sttime
;
int
mem_stcfg
;
unsigned
long
flags
;
int
mem_sttime
;
int
mem_stcfg
;
unsigned
long
mode
;
#ifdef CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA
struct
hd_driveid
*
id
=
drive
->
id
;
/*
* Now see what the current drive is capable of,
* selecting UDMA only if the mate said it was ok.
*/
if
(
id
&&
(
id
->
capability
&
1
)
&&
drive
->
autodma
&&
!
__ide_dma_bad_drive
(
drive
))
{
if
(
!
mode
&&
(
id
->
field_valid
&
2
)
&&
(
id
->
dma_mword
&
7
))
{
if
(
id
->
dma_mword
&
4
)
mode
=
XFER_MW_DMA_2
;
else
if
(
id
->
dma_mword
&
2
)
mode
=
XFER_MW_DMA_1
;
else
if
(
id
->
dma_mword
&
1
)
mode
=
XFER_MW_DMA_0
;
}
}
if
(
ide_use_dma
(
drive
))
mode
=
ide_dma_speed
(
drive
,
0
);
#endif
spin_lock_irqsave
(
&
ide_tune_chipset_spin_lock
,
flags
);
mem_sttime
=
0
;
mem_stcfg
=
au_readl
(
MEM_STCFG2
);
mem_sttime
=
0
;
mem_stcfg
=
au_readl
(
MEM_STCFG2
);
switch
(
speed
)
{
case
XFER_PIO_4
:
case
XFER_PIO_3
:
case
XFER_PIO_2
:
case
XFER_PIO_1
:
case
XFER_PIO_0
:
auide_tune_drive
(
drive
,
(
speed
-
XFER_PIO_0
));
break
;
if
(
speed
>=
XFER_PIO_0
&&
speed
<=
XFER_PIO_4
)
{
auide_tune_drive
(
drive
,
speed
-
XFER_PIO_0
);
return
0
;
}
switch
(
speed
)
{
#ifdef CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA
case
XFER_MW_DMA_2
:
/* set timing parameters for RCS2# */
mem_sttime
=
SBC_IDE_MDMA2_TWCS
|
SBC_IDE_MDMA2_TCSH
|
SBC_IDE_MDMA2_TCSOFF
|
SBC_IDE_MDMA2_TWP
|
SBC_IDE_MDMA2_TCSW
|
SBC_IDE_MDMA2_TPM
|
SBC_IDE_MDMA2_TA
;
/* set configuration for RCS2# */
mem_stcfg
&=
~
TS_MASK
;
mem_stcfg
&=
~
TCSOE_MASK
;
mem_stcfg
&=
~
TOECS_MASK
;
mem_stcfg
|=
SBC_IDE_MDMA2_TCSOE
|
SBC_IDE_MDMA2_TOECS
;
mode
=
XFER_MW_DMA_2
;
break
;
case
XFER_MW_DMA_1
:
/* set timing parameters for RCS2# */
mem_sttime
=
SBC_IDE_MDMA1_TWCS
|
SBC_IDE_MDMA1_TCSH
|
SBC_IDE_MDMA1_TCSOFF
|
SBC_IDE_MDMA1_TWP
|
SBC_IDE_MDMA1_TCSW
|
SBC_IDE_MDMA1_TPM
|
SBC_IDE_MDMA1_TA
;
/* set configuration for RCS2# */
mem_stcfg
&=
~
TS_MASK
;
mem_stcfg
&=
~
TCSOE_MASK
;
mem_stcfg
&=
~
TOECS_MASK
;
mem_stcfg
|=
SBC_IDE_MDMA1_TCSOE
|
SBC_IDE_MDMA1_TOECS
;
mode
=
XFER_MW_DMA_1
;
break
;
case
XFER_MW_DMA_0
:
/* set timing parameters for RCS2# */
mem_sttime
=
SBC_IDE_MDMA0_TWCS
|
SBC_IDE_MDMA0_TCSH
|
SBC_IDE_MDMA0_TCSOFF
|
SBC_IDE_MDMA0_TWP
|
SBC_IDE_MDMA0_TCSW
|
SBC_IDE_MDMA0_TPM
|
SBC_IDE_MDMA0_TA
;
/* set configuration for RCS2# */
mem_stcfg
|=
TS_MASK
;
mem_stcfg
&=
~
TCSOE_MASK
;
mem_stcfg
&=
~
TOECS_MASK
;
mem_stcfg
|=
SBC_IDE_MDMA0_TCSOE
|
SBC_IDE_MDMA0_TOECS
;
mode
=
XFER_MW_DMA_0
;
break
;
case
XFER_MW_DMA_2
:
mem_sttime
=
SBC_IDE_TIMING
(
MDMA2
);
/* set configuration for RCS2# */
mem_stcfg
&=
~
TS_MASK
;
mem_stcfg
&=
~
TCSOE_MASK
;
mem_stcfg
&=
~
TOECS_MASK
;
mem_stcfg
|=
SBC_IDE_MDMA2_TCSOE
|
SBC_IDE_MDMA2_TOECS
;
mode
=
XFER_MW_DMA_2
;
break
;
case
XFER_MW_DMA_1
:
mem_sttime
=
SBC_IDE_TIMING
(
MDMA1
);
/* set configuration for RCS2# */
mem_stcfg
&=
~
TS_MASK
;
mem_stcfg
&=
~
TCSOE_MASK
;
mem_stcfg
&=
~
TOECS_MASK
;
mem_stcfg
|=
SBC_IDE_MDMA1_TCSOE
|
SBC_IDE_MDMA1_TOECS
;
mode
=
XFER_MW_DMA_1
;
break
;
case
XFER_MW_DMA_0
:
mem_sttime
=
SBC_IDE_TIMING
(
MDMA0
);
/* set configuration for RCS2# */
mem_stcfg
|=
TS_MASK
;
mem_stcfg
&=
~
TCSOE_MASK
;
mem_stcfg
&=
~
TOECS_MASK
;
mem_stcfg
|=
SBC_IDE_MDMA0_TCSOE
|
SBC_IDE_MDMA0_TOECS
;
mode
=
XFER_MW_DMA_0
;
break
;
#endif
default:
return
1
;
}
/*
* Tell the drive to switch to the new mode; abort on failure.
*/
if
(
!
mode
||
ide_config_drive_speed
(
drive
,
mode
))
{
return
1
;
/* failure */
}
au_writel
(
mem_sttime
,
MEM_STTIME2
);
au_writel
(
mem_stcfg
,
MEM_STCFG2
);
default:
return
1
;
}
if
(
ide_config_drive_speed
(
drive
,
mode
))
return
1
;
spin_unlock_irqrestore
(
&
ide_tune_chipset_spin_lock
,
flags
);
au_writel
(
mem_sttime
,
MEM_STTIME2
);
au_writel
(
mem_stcfg
,
MEM_STCFG2
);
return
0
;
return
0
;
}
/*
* Multi-Word DMA + DbDMA functions
*/
#ifdef CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA
static
int
in_drive_list
(
struct
hd_driveid
*
id
,
const
struct
drive_list_entry
*
drive_table
)
{
for
(
;
drive_table
->
id_model
;
drive_table
++
){
if
((
!
strcmp
(
drive_table
->
id_model
,
id
->
model
))
&&
((
strstr
(
drive_table
->
id_firmware
,
id
->
fw_rev
))
||
(
!
strcmp
(
drive_table
->
id_firmware
,
"ALL"
)))
)
return
1
;
}
return
0
;
}
#ifdef CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA
static
int
auide_build_sglist
(
ide_drive_t
*
drive
,
struct
request
*
rq
)
{
ide_hwif_t
*
hwif
=
drive
->
hwif
;
_auide_hwif
*
ahwif
=
(
_auide_hwif
*
)
hwif
->
hwif_data
;
struct
scatterlist
*
sg
=
hwif
->
sg_table
;
ide_hwif_t
*
hwif
=
drive
->
hwif
;
_auide_hwif
*
ahwif
=
(
_auide_hwif
*
)
hwif
->
hwif_data
;
struct
scatterlist
*
sg
=
hwif
->
sg_table
;
ide_map_sg
(
drive
,
rq
);
ide_map_sg
(
drive
,
rq
);
if
(
rq_data_dir
(
rq
)
==
READ
)
hwif
->
sg_dma_direction
=
DMA_FROM_DEVICE
;
else
hwif
->
sg_dma_direction
=
DMA_TO_DEVICE
;
if
(
rq_data_dir
(
rq
)
==
READ
)
hwif
->
sg_dma_direction
=
DMA_FROM_DEVICE
;
else
hwif
->
sg_dma_direction
=
DMA_TO_DEVICE
;
return
dma_map_sg
(
ahwif
->
dev
,
sg
,
hwif
->
sg_nents
,
hwif
->
sg_dma_direction
);
return
dma_map_sg
(
ahwif
->
dev
,
sg
,
hwif
->
sg_nents
,
hwif
->
sg_dma_direction
);
}
static
int
auide_build_dmatable
(
ide_drive_t
*
drive
)
{
int
i
,
iswrite
,
count
=
0
;
ide_hwif_t
*
hwif
=
HWIF
(
drive
);
struct
request
*
rq
=
HWGROUP
(
drive
)
->
rq
;
_auide_hwif
*
ahwif
=
(
_auide_hwif
*
)
hwif
->
hwif_data
;
struct
scatterlist
*
sg
;
iswrite
=
(
rq_data_dir
(
rq
)
==
WRITE
);
/* Save for interrupt context */
ahwif
->
drive
=
drive
;
/* Build sglist */
hwif
->
sg_nents
=
i
=
auide_build_sglist
(
drive
,
rq
);
if
(
!
i
)
return
0
;
/* fill the descriptors */
sg
=
hwif
->
sg_table
;
while
(
i
&&
sg_dma_len
(
sg
))
{
u32
cur_addr
;
u32
cur_len
;
cur_addr
=
sg_dma_address
(
sg
);
cur_len
=
sg_dma_len
(
sg
);
while
(
cur_len
)
{
u32
flags
=
DDMA_FLAGS_NOIE
;
unsigned
int
tc
=
(
cur_len
<
0xfe00
)
?
cur_len
:
0xfe00
;
if
(
++
count
>=
PRD_ENTRIES
)
{
printk
(
KERN_WARNING
"%s: DMA table too small
\n
"
,
drive
->
name
);
goto
use_pio_instead
;
}
/* Lets enable intr for the last descriptor only */
if
(
1
==
i
)
flags
=
DDMA_FLAGS_IE
;
else
flags
=
DDMA_FLAGS_NOIE
;
if
(
iswrite
)
{
if
(
!
put_source_flags
(
ahwif
->
tx_chan
,
(
void
*
)(
page_address
(
sg
->
page
)
+
sg
->
offset
),
tc
,
flags
))
{
printk
(
KERN_ERR
"%s failed %d
\n
"
,
__FUNCTION__
,
__LINE__
);
int
i
,
iswrite
,
count
=
0
;
ide_hwif_t
*
hwif
=
HWIF
(
drive
);
struct
request
*
rq
=
HWGROUP
(
drive
)
->
rq
;
_auide_hwif
*
ahwif
=
(
_auide_hwif
*
)
hwif
->
hwif_data
;
struct
scatterlist
*
sg
;
iswrite
=
(
rq_data_dir
(
rq
)
==
WRITE
);
/* Save for interrupt context */
ahwif
->
drive
=
drive
;
/* Build sglist */
hwif
->
sg_nents
=
i
=
auide_build_sglist
(
drive
,
rq
);
if
(
!
i
)
return
0
;
/* fill the descriptors */
sg
=
hwif
->
sg_table
;
while
(
i
&&
sg_dma_len
(
sg
))
{
u32
cur_addr
;
u32
cur_len
;
cur_addr
=
sg_dma_address
(
sg
);
cur_len
=
sg_dma_len
(
sg
);
while
(
cur_len
)
{
u32
flags
=
DDMA_FLAGS_NOIE
;
unsigned
int
tc
=
(
cur_len
<
0xfe00
)
?
cur_len
:
0xfe00
;
if
(
++
count
>=
PRD_ENTRIES
)
{
printk
(
KERN_WARNING
"%s: DMA table too small
\n
"
,
drive
->
name
);
goto
use_pio_instead
;
}
/* Lets enable intr for the last descriptor only */
if
(
1
==
i
)
flags
=
DDMA_FLAGS_IE
;
else
flags
=
DDMA_FLAGS_NOIE
;
if
(
iswrite
)
{
if
(
!
put_source_flags
(
ahwif
->
tx_chan
,
(
void
*
)(
page_address
(
sg
->
page
)
+
sg
->
offset
),
tc
,
flags
))
{
printk
(
KERN_ERR
"%s failed %d
\n
"
,
__FUNCTION__
,
__LINE__
);
}
}
else
}
else
{
if
(
!
put_dest_flags
(
ahwif
->
rx_chan
,
(
void
*
)(
page_address
(
sg
->
page
)
+
sg
->
offset
),
tc
,
flags
))
{
printk
(
KERN_ERR
"%s failed %d
\n
"
,
__FUNCTION__
,
__LINE__
);
if
(
!
put_dest_flags
(
ahwif
->
rx_chan
,
(
void
*
)(
page_address
(
sg
->
page
)
+
sg
->
offset
),
tc
,
flags
))
{
printk
(
KERN_ERR
"%s failed %d
\n
"
,
__FUNCTION__
,
__LINE__
);
}
}
}
cur_addr
+=
tc
;
cur_len
-=
tc
;
}
sg
++
;
i
--
;
}
cur_addr
+=
tc
;
cur_len
-=
tc
;
}
sg
++
;
i
--
;
}
if
(
count
)
return
1
;
if
(
count
)
return
1
;
use_pio_instead:
dma_unmap_sg
(
ahwif
->
dev
,
hwif
->
sg_table
,
hwif
->
sg_nents
,
hwif
->
sg_dma_direction
);
use_pio_instead:
dma_unmap_sg
(
ahwif
->
dev
,
hwif
->
sg_table
,
hwif
->
sg_nents
,
hwif
->
sg_dma_direction
);
return
0
;
/* revert to PIO for this request */
return
0
;
/* revert to PIO for this request */
}
static
int
auide_dma_end
(
ide_drive_t
*
drive
)
{
ide_hwif_t
*
hwif
=
HWIF
(
drive
);
_auide_hwif
*
ahwif
=
(
_auide_hwif
*
)
hwif
->
hwif_data
;
ide_hwif_t
*
hwif
=
HWIF
(
drive
);
_auide_hwif
*
ahwif
=
(
_auide_hwif
*
)
hwif
->
hwif_data
;
if
(
hwif
->
sg_nents
)
{
dma_unmap_sg
(
ahwif
->
dev
,
hwif
->
sg_table
,
hwif
->
sg_nents
,
hwif
->
sg_dma_direction
);
hwif
->
sg_nents
=
0
;
}
if
(
hwif
->
sg_nents
)
{
dma_unmap_sg
(
ahwif
->
dev
,
hwif
->
sg_table
,
hwif
->
sg_nents
,
hwif
->
sg_dma_direction
);
hwif
->
sg_nents
=
0
;
}
return
0
;
return
0
;
}
static
void
auide_dma_start
(
ide_drive_t
*
drive
)
{
// printk("%s\n", __FUNCTION__);
}
ide_startstop_t
auide_dma_intr
(
ide_drive_t
*
drive
)
{
//printk("%s\n", __FUNCTION__);
u8
stat
=
0
,
dma_stat
=
0
;
dma_stat
=
HWIF
(
drive
)
->
ide_dma_end
(
drive
);
stat
=
HWIF
(
drive
)
->
INB
(
IDE_STATUS_REG
);
/* get drive status */
if
(
OK_STAT
(
stat
,
DRIVE_READY
,
drive
->
bad_wstat
|
DRQ_STAT
))
{
if
(
!
dma_stat
)
{
struct
request
*
rq
=
HWGROUP
(
drive
)
->
rq
;
ide_end_request
(
drive
,
1
,
rq
->
nr_sectors
);
return
ide_stopped
;
}
printk
(
KERN_ERR
"%s: dma_intr: bad DMA status (dma_stat=%x)
\n
"
,
drive
->
name
,
dma_stat
);
}
return
ide_error
(
drive
,
"dma_intr"
,
stat
);
}
static
void
auide_dma_exec_cmd
(
ide_drive_t
*
drive
,
u8
command
)
{
//printk("%s\n", __FUNCTION__);
/* issue cmd to drive */
ide_execute_command
(
drive
,
command
,
&
auide_dma_intr
,
(
2
*
WAIT_CMD
),
NULL
);
/* issue cmd to drive */
ide_execute_command
(
drive
,
command
,
&
ide_dma_intr
,
(
2
*
WAIT_CMD
),
NULL
);
}
static
int
auide_dma_setup
(
ide_drive_t
*
drive
)
{
// printk("%s\n", __FUNCTION__);
if
(
drive
->
media
!=
ide_disk
)
return
1
;
if
(
!
auide_build_dmatable
(
drive
))
/* try PIO instead of DMA */
return
1
;
{
struct
request
*
rq
=
HWGROUP
(
drive
)
->
rq
;
drive
->
waiting_for_dma
=
1
;
if
(
!
auide_build_dmatable
(
drive
))
{
ide_map_sg
(
drive
,
rq
);
return
1
;
}
return
0
;
drive
->
waiting_for_dma
=
1
;
return
0
;
}
static
int
auide_dma_check
(
ide_drive_t
*
drive
)
{
// printk("%s\n", __FUNCTION__)
;
u8
speed
;
#ifdef CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA
if
(
!
dbdma_init_done
){
auide_hwif
.
white_list
=
in_drive_list
(
drive
->
id
,
dma_white_list
);
auide_hwif
.
black_list
=
in_drive_list
(
drive
->
id
,
dma_black_list
);
auide_hwif
.
drive
=
drive
;
auide_ddma_init
(
&
auide_hwif
);
dbdma_init_done
=
1
;
}
if
(
dbdma_init_done
==
0
){
auide_hwif
.
white_list
=
ide_in_drive_list
(
drive
->
id
,
dma_white_list
);
auide_hwif
.
black_list
=
ide_in_drive_list
(
drive
->
id
,
dma_black_list
);
auide_hwif
.
drive
=
drive
;
auide_ddma_init
(
&
auide_hwif
);
dbdma_init_done
=
1
;
}
#endif
/* Is the drive in our DMA black list? */
if
(
auide_hwif
.
black_list
)
{
drive
->
using_dma
=
0
;
printk
(
"%s found in dma_blacklist[]! Disabling DMA.
\n
"
,
drive
->
id
->
model
);
}
else
drive
->
using_dma
=
1
;
/* Is the drive in our DMA black list? */
if
(
auide_hwif
.
black_list
)
{
drive
->
using_dma
=
0
;
/* Borrowed the warning message from ide-dma.c */
return
HWIF
(
drive
)
->
ide_dma_host_on
(
drive
);
printk
(
KERN_WARNING
"%s: Disabling DMA for %s (blacklisted)
\n
"
,
drive
->
name
,
drive
->
id
->
model
);
}
else
drive
->
using_dma
=
1
;
speed
=
ide_find_best_mode
(
drive
,
XFER_PIO
|
XFER_MWDMA
);
if
(
drive
->
autodma
&&
(
speed
&
XFER_MODE
)
!=
XFER_PIO
)
return
HWIF
(
drive
)
->
ide_dma_on
(
drive
);
return
HWIF
(
drive
)
->
ide_dma_off_quietly
(
drive
);
}
static
int
auide_dma_test_irq
(
ide_drive_t
*
drive
)
{
// printk("%s\n", __FUNCTION__);
if
(
!
drive
->
waiting_for_dma
)
printk
(
KERN_WARNING
"%s: ide_dma_test_irq \
{
if
(
drive
->
waiting_for_dma
==
0
)
printk
(
KERN_WARNING
"%s: ide_dma_test_irq \
called while not waiting
\n
"
,
drive
->
name
);
/* If dbdma didn't execute the STOP command yet, the
* active bit is still set
/* If dbdma didn't execute the STOP command yet, the
* active bit is still set
*/
drive
->
waiting_for_dma
++
;
if
(
drive
->
waiting_for_dma
>=
DMA_WAIT_TIMEOUT
)
{
printk
(
KERN_WARNING
"%s: timeout waiting for ddma to \
drive
->
waiting_for_dma
++
;
if
(
drive
->
waiting_for_dma
>=
DMA_WAIT_TIMEOUT
)
{
printk
(
KERN_WARNING
"%s: timeout waiting for ddma to \
complete
\n
"
,
drive
->
name
);
return
1
;
}
udelay
(
10
);
return
0
;
return
1
;
}
udelay
(
10
);
return
0
;
}
static
int
auide_dma_host_on
(
ide_drive_t
*
drive
)
{
// printk("%s\n", __FUNCTION__);
return
0
;
return
0
;
}
static
int
auide_dma_on
(
ide_drive_t
*
drive
)
{
// printk("%s\n", __FUNCTION__);
drive
->
using_dma
=
1
;
return
auide_dma_host_on
(
drive
);
drive
->
using_dma
=
1
;
return
auide_dma_host_on
(
drive
);
}
static
int
auide_dma_host_off
(
ide_drive_t
*
drive
)
{
// printk("%s\n", __FUNCTION__);
return
0
;
return
0
;
}
static
int
auide_dma_off_quietly
(
ide_drive_t
*
drive
)
{
// printk("%s\n", __FUNCTION__);
drive
->
using_dma
=
0
;
return
auide_dma_host_off
(
drive
);
drive
->
using_dma
=
0
;
return
auide_dma_host_off
(
drive
);
}
static
int
auide_dma_lostirq
(
ide_drive_t
*
drive
)
{
// printk("%s\n", __FUNCTION__);
printk
(
KERN_ERR
"%s: IRQ lost
\n
"
,
drive
->
name
);
return
0
;
printk
(
KERN_ERR
"%s: IRQ lost
\n
"
,
drive
->
name
);
return
0
;
}
static
void
auide_ddma_tx_callback
(
int
irq
,
void
*
param
,
struct
pt_regs
*
regs
)
{
// printk("%s\n", __FUNCTION__);
_auide_hwif
*
ahwif
=
(
_auide_hwif
*
)
param
;
ahwif
->
drive
->
waiting_for_dma
=
0
;
return
;
_auide_hwif
*
ahwif
=
(
_auide_hwif
*
)
param
;
ahwif
->
drive
->
waiting_for_dma
=
0
;
}
static
void
auide_ddma_rx_callback
(
int
irq
,
void
*
param
,
struct
pt_regs
*
regs
)
{
// printk("%s\n", __FUNCTION__);
_auide_hwif
*
ahwif
=
(
_auide_hwif
*
)
param
;
ahwif
->
drive
->
waiting_for_dma
=
0
;
}
#endif
/* end CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA */
_auide_hwif
*
ahwif
=
(
_auide_hwif
*
)
param
;
ahwif
->
drive
->
waiting_for_dma
=
0
;
return
;
static
void
auide_init_dbdma_dev
(
dbdev_tab_t
*
dev
,
u32
dev_id
,
u32
tsize
,
u32
devwidth
,
u32
flags
)
{
dev
->
dev_id
=
dev_id
;
dev
->
dev_physaddr
=
(
u32
)
AU1XXX_ATA_PHYS_ADDR
;
dev
->
dev_intlevel
=
0
;
dev
->
dev_intpolarity
=
0
;
dev
->
dev_tsize
=
tsize
;
dev
->
dev_devwidth
=
devwidth
;
dev
->
dev_flags
=
flags
;
}
#if defined(CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA)
static
int
auide_dma_timeout
(
ide_drive_t
*
drive
)
{
// printk("%s\n", __FUNCTION__);
printk
(
KERN_ERR
"%s: DMA timeout occurred: "
,
drive
->
name
);
printk
(
KERN_ERR
"%s: DMA timeout occurred: "
,
drive
->
name
);
if
(
HWIF
(
drive
)
->
ide_dma_test_irq
(
drive
))
return
0
;
if
(
HWIF
(
drive
)
->
ide_dma_test_irq
(
drive
))
return
0
;
return
HWIF
(
drive
)
->
ide_dma_end
(
drive
);
return
HWIF
(
drive
)
->
ide_dma_end
(
drive
);
}
#endif
/* end CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA */
static
int
auide_ddma_init
(
_auide_hwif
*
auide
)
{
dbdev_tab_t
source_dev_tab
,
target_dev_tab
;
u32
dev_id
,
tsize
,
devwidth
,
flags
;
ide_hwif_t
*
hwif
=
auide
->
hwif
;
static
int
auide_ddma_init
(
_auide_hwif
*
auide
)
{
// printk("%s\n", __FUNCTION__);
dev_id
=
AU1XXX_ATA_DDMA_REQ
;
dbdev_tab_t
source_dev_tab
;
#if defined(CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA)
dbdev_tab_t
target_dev_tab
;
ide_hwif_t
*
hwif
=
auide
->
hwif
;
char
warning_output
[
2
][
80
];
int
i
;
#endif
if
(
auide
->
white_list
||
auide
->
black_list
)
{
tsize
=
8
;
devwidth
=
32
;
}
else
{
tsize
=
1
;
devwidth
=
16
;
printk
(
KERN_ERR
"au1xxx-ide: %s is not on ide driver whitelist.
\n
"
,
auide_hwif
.
drive
->
id
->
model
);
printk
(
KERN_ERR
" please read 'Documentation/mips/AU1xxx_IDE.README'"
);
}
/* Add our custom device to DDMA device table */
/* Create our new device entries in the table */
#if defined(CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA)
source_dev_tab
.
dev_id
=
AU1XXX_ATA_DDMA_REQ
;
if
(
auide
->
white_list
||
auide
->
black_list
){
source_dev_tab
.
dev_tsize
=
8
;
source_dev_tab
.
dev_devwidth
=
32
;
source_dev_tab
.
dev_physaddr
=
(
u32
)
AU1XXX_ATA_PHYS_ADDR
;
source_dev_tab
.
dev_intlevel
=
0
;
source_dev_tab
.
dev_intpolarity
=
0
;
/* init device table for target - static bus controller - */
target_dev_tab
.
dev_id
=
DSCR_CMD0_ALWAYS
;
target_dev_tab
.
dev_tsize
=
8
;
target_dev_tab
.
dev_devwidth
=
32
;
target_dev_tab
.
dev_physaddr
=
(
u32
)
AU1XXX_ATA_PHYS_ADDR
;
target_dev_tab
.
dev_intlevel
=
0
;
target_dev_tab
.
dev_intpolarity
=
0
;
target_dev_tab
.
dev_flags
=
DEV_FLAGS_ANYUSE
;
}
else
{
source_dev_tab
.
dev_tsize
=
1
;
source_dev_tab
.
dev_devwidth
=
16
;
source_dev_tab
.
dev_physaddr
=
(
u32
)
AU1XXX_ATA_PHYS_ADDR
;
source_dev_tab
.
dev_intlevel
=
0
;
source_dev_tab
.
dev_intpolarity
=
0
;
/* init device table for target - static bus controller - */
target_dev_tab
.
dev_id
=
DSCR_CMD0_ALWAYS
;
target_dev_tab
.
dev_tsize
=
1
;
target_dev_tab
.
dev_devwidth
=
16
;
target_dev_tab
.
dev_physaddr
=
(
u32
)
AU1XXX_ATA_PHYS_ADDR
;
target_dev_tab
.
dev_intlevel
=
0
;
target_dev_tab
.
dev_intpolarity
=
0
;
target_dev_tab
.
dev_flags
=
DEV_FLAGS_ANYUSE
;
sprintf
(
&
warning_output
[
0
][
0
],
"%s is not on ide driver white list."
,
auide_hwif
.
drive
->
id
->
model
);
for
(
i
=
strlen
(
&
warning_output
[
0
][
0
])
;
i
<
76
;
i
++
){
sprintf
(
&
warning_output
[
0
][
i
],
" "
);
}
sprintf
(
&
warning_output
[
1
][
0
],
"To add %s please read 'Documentation/mips/AU1xxx_IDE.README'."
,
auide_hwif
.
drive
->
id
->
model
);
for
(
i
=
strlen
(
&
warning_output
[
1
][
0
])
;
i
<
76
;
i
++
){
sprintf
(
&
warning_output
[
1
][
i
],
" "
);
}
printk
(
"
\n
****************************************"
);
printk
(
"****************************************
\n
"
);
printk
(
"* %s *
\n
"
,
&
warning_output
[
0
][
0
]);
printk
(
"* Switch to safe MWDMA Mode! "
);
printk
(
" *
\n
"
);
printk
(
"* %s *
\n
"
,
&
warning_output
[
1
][
0
]);
printk
(
"****************************************"
);
printk
(
"****************************************
\n\n
"
);
}
#ifdef IDE_AU1XXX_BURSTMODE
flags
=
DEV_FLAGS_SYNC
|
DEV_FLAGS_BURSTABLE
;
#else
source_dev_tab
.
dev_id
=
DSCR_CMD0_ALWAYS
;
source_dev_tab
.
dev_tsize
=
8
;
source_dev_tab
.
dev_devwidth
=
32
;
source_dev_tab
.
dev_physaddr
=
(
u32
)
AU1XXX_ATA_PHYS_ADDR
;
source_dev_tab
.
dev_intlevel
=
0
;
source_dev_tab
.
dev_intpolarity
=
0
;
flags
=
DEV_FLAGS_SYNC
;
#endif
#if CONFIG_BLK_DEV_IDE_AU1XXX_BURSTABLE_ON
/* set flags for tx channel */
source_dev_tab
.
dev_flags
=
DEV_FLAGS_OUT
|
DEV_FLAGS_SYNC
|
DEV_FLAGS_BURSTABLE
;
auide
->
tx_dev_id
=
au1xxx_ddma_add_device
(
&
source_dev_tab
);
/* set flags for rx channel */
source_dev_tab
.
dev_flags
=
DEV_FLAGS_IN
|
DEV_FLAGS_SYNC
|
DEV_FLAGS_BURSTABLE
;
auide
->
rx_dev_id
=
au1xxx_ddma_add_device
(
&
source_dev_tab
);
/* setup dev_tab for tx channel */
auide_init_dbdma_dev
(
&
source_dev_tab
,
dev_id
,
tsize
,
devwidth
,
DEV_FLAGS_OUT
|
flags
);
auide
->
tx_dev_id
=
au1xxx_ddma_add_device
(
&
source_dev_tab
);
auide_init_dbdma_dev
(
&
source_dev_tab
,
dev_id
,
tsize
,
devwidth
,
DEV_FLAGS_IN
|
flags
);
auide
->
rx_dev_id
=
au1xxx_ddma_add_device
(
&
source_dev_tab
);
/* We also need to add a target device for the DMA */
auide_init_dbdma_dev
(
&
target_dev_tab
,
(
u32
)
DSCR_CMD0_ALWAYS
,
tsize
,
devwidth
,
DEV_FLAGS_ANYUSE
);
auide
->
target_dev_id
=
au1xxx_ddma_add_device
(
&
target_dev_tab
);
/* Get a channel for TX */
auide
->
tx_chan
=
au1xxx_dbdma_chan_alloc
(
auide
->
target_dev_id
,
auide
->
tx_dev_id
,
auide_ddma_tx_callback
,
(
void
*
)
auide
);
/* Get a channel for RX */
auide
->
rx_chan
=
au1xxx_dbdma_chan_alloc
(
auide
->
rx_dev_id
,
auide
->
target_dev_id
,
auide_ddma_rx_callback
,
(
void
*
)
auide
);
auide
->
tx_desc_head
=
(
void
*
)
au1xxx_dbdma_ring_alloc
(
auide
->
tx_chan
,
NUM_DESCRIPTORS
);
auide
->
rx_desc_head
=
(
void
*
)
au1xxx_dbdma_ring_alloc
(
auide
->
rx_chan
,
NUM_DESCRIPTORS
);
hwif
->
dmatable_cpu
=
dma_alloc_coherent
(
auide
->
dev
,
PRD_ENTRIES
*
PRD_BYTES
,
/* 1 Page */
&
hwif
->
dmatable_dma
,
GFP_KERNEL
);
au1xxx_dbdma_start
(
auide
->
tx_chan
);
au1xxx_dbdma_start
(
auide
->
rx_chan
);
return
0
;
}
#else
/* set flags for tx channel */
source_dev_tab
.
dev_flags
=
DEV_FLAGS_OUT
|
DEV_FLAGS_SYNC
;
auide
->
tx_dev_id
=
au1xxx_ddma_add_device
(
&
source_dev_tab
);
/* set flags for rx channel */
source_dev_tab
.
dev_flags
=
DEV_FLAGS_IN
|
DEV_FLAGS_SYNC
;
auide
->
rx_dev_id
=
au1xxx_ddma_add_device
(
&
source_dev_tab
);
#endif
static
int
auide_ddma_init
(
_auide_hwif
*
auide
)
{
dbdev_tab_t
source_dev_tab
;
int
flags
;
#if defined(CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA)
auide
->
target_dev_id
=
au1xxx_ddma_add_device
(
&
target_dev_tab
);
/* Get a channel for TX */
auide
->
tx_chan
=
au1xxx_dbdma_chan_alloc
(
auide
->
target_dev_id
,
auide
->
tx_dev_id
,
auide_ddma_tx_callback
,
(
void
*
)
auide
);
/* Get a channel for RX */
auide
->
rx_chan
=
au1xxx_dbdma_chan_alloc
(
auide
->
rx_dev_id
,
auide
->
target_dev_id
,
auide_ddma_rx_callback
,
(
void
*
)
auide
);
#else
/* CONFIG_BLK_DEV_IDE_AU1XXX_PIO_DBDMA */
/*
* Note: if call back is not enabled, update ctp->cur_ptr manually
*/
auide
->
tx_chan
=
au1xxx_dbdma_chan_alloc
(
DSCR_CMD0_ALWAYS
,
auide
->
tx_dev_id
,
NULL
,
(
void
*
)
auide
);
auide
->
rx_chan
=
au1xxx_dbdma_chan_alloc
(
auide
->
rx_dev_id
,
DSCR_CMD0_ALWAYS
,
NULL
,
(
void
*
)
auide
);
#ifdef IDE_AU1XXX_BURSTMODE
flags
=
DEV_FLAGS_SYNC
|
DEV_FLAGS_BURSTABLE
;
#else
flags
=
DEV_FLAGS_SYNC
;
#endif
auide
->
tx_desc_head
=
(
void
*
)
au1xxx_dbdma_ring_alloc
(
auide
->
tx_chan
,
NUM_DESCRIPTORS
);
auide
->
rx_desc_head
=
(
void
*
)
au1xxx_dbdma_ring_alloc
(
auide
->
rx_chan
,
NUM_DESCRIPTORS
);
#if defined(CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA)
hwif
->
dmatable_cpu
=
dma_alloc_coherent
(
auide
->
dev
,
PRD_ENTRIES
*
PRD_BYTES
,
/* 1 Page */
&
hwif
->
dmatable_dma
,
GFP_KERNEL
);
auide
->
sg_table
=
kmalloc
(
sizeof
(
struct
scatterlist
)
*
PRD_ENTRIES
,
GFP_KERNEL
|
GFP_DMA
);
if
(
auide
->
sg_table
==
NULL
)
{
return
-
ENOMEM
;
}
#endif
au1xxx_dbdma_start
(
auide
->
tx_chan
);
au1xxx_dbdma_start
(
auide
->
rx_chan
);
return
0
;
/* setup dev_tab for tx channel */
auide_init_dbdma_dev
(
&
source_dev_tab
,
(
u32
)
DSCR_CMD0_ALWAYS
,
8
,
32
,
DEV_FLAGS_OUT
|
flags
);
auide
->
tx_dev_id
=
au1xxx_ddma_add_device
(
&
source_dev_tab
);
auide_init_dbdma_dev
(
&
source_dev_tab
,
(
u32
)
DSCR_CMD0_ALWAYS
,
8
,
32
,
DEV_FLAGS_IN
|
flags
);
auide
->
rx_dev_id
=
au1xxx_ddma_add_device
(
&
source_dev_tab
);
/* Get a channel for TX */
auide
->
tx_chan
=
au1xxx_dbdma_chan_alloc
(
DSCR_CMD0_ALWAYS
,
auide
->
tx_dev_id
,
NULL
,
(
void
*
)
auide
);
/* Get a channel for RX */
auide
->
rx_chan
=
au1xxx_dbdma_chan_alloc
(
auide
->
rx_dev_id
,
DSCR_CMD0_ALWAYS
,
NULL
,
(
void
*
)
auide
);
auide
->
tx_desc_head
=
(
void
*
)
au1xxx_dbdma_ring_alloc
(
auide
->
tx_chan
,
NUM_DESCRIPTORS
);
auide
->
rx_desc_head
=
(
void
*
)
au1xxx_dbdma_ring_alloc
(
auide
->
rx_chan
,
NUM_DESCRIPTORS
);
au1xxx_dbdma_start
(
auide
->
tx_chan
);
au1xxx_dbdma_start
(
auide
->
rx_chan
);
return
0
;
}
#endif
static
void
auide_setup_ports
(
hw_regs_t
*
hw
,
_auide_hwif
*
ahwif
)
{
int
i
;
#define ide_ioreg_t unsigned long
ide_ioreg_t
*
ata_regs
=
hw
->
io_ports
;
/* fixme */
for
(
i
=
0
;
i
<
IDE_CONTROL_OFFSET
;
i
++
)
{
*
ata_regs
++
=
(
ide_ioreg_t
)
ahwif
->
regbase
+
(
ide_ioreg_t
)(
i
<<
AU1XXX_ATA_REG_OFFSET
);
}
/* set the Alternative Status register */
*
ata_regs
=
(
ide_ioreg_t
)
ahwif
->
regbase
+
(
ide_ioreg_t
)(
14
<<
AU1XXX_ATA_REG_OFFSET
);
int
i
;
unsigned
long
*
ata_regs
=
hw
->
io_ports
;
/* FIXME? */
for
(
i
=
0
;
i
<
IDE_CONTROL_OFFSET
;
i
++
)
{
*
ata_regs
++
=
ahwif
->
regbase
+
(
i
<<
AU1XXX_ATA_REG_OFFSET
);
}
/* set the Alternative Status register */
*
ata_regs
=
ahwif
->
regbase
+
(
14
<<
AU1XXX_ATA_REG_OFFSET
);
}
static
int
au_ide_probe
(
struct
device
*
dev
)
{
struct
platform_device
*
pdev
=
to_platform_device
(
dev
);
_auide_hwif
*
ahwif
=
&
auide_hwif
;
ide_hwif_t
*
hwif
;
_auide_hwif
*
ahwif
=
&
auide_hwif
;
ide_hwif_t
*
hwif
;
struct
resource
*
res
;
int
ret
=
0
;
#if defined(CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA)
char
*
mode
=
"MWDMA2"
;
char
*
mode
=
"MWDMA2"
;
#elif defined(CONFIG_BLK_DEV_IDE_AU1XXX_PIO_DBDMA)
char
*
mode
=
"PIO+DDMA(offload)"
;
char
*
mode
=
"PIO+DDMA(offload)"
;
#endif
memset
(
&
auide_hwif
,
0
,
sizeof
(
_auide_hwif
));
auide_hwif
.
dev
=
0
;
memset
(
&
auide_hwif
,
0
,
sizeof
(
_auide_hwif
));
auide_hwif
.
dev
=
0
;
ahwif
->
dev
=
dev
;
ahwif
->
irq
=
platform_get_irq
(
pdev
,
0
);
...
...
@@ -902,11 +675,11 @@ static int au_ide_probe(struct device *dev)
goto
out
;
}
if
(
!
request_mem_region
(
res
->
start
,
res
->
end
-
res
->
start
,
pdev
->
name
))
{
if
(
!
request_mem_region
(
res
->
start
,
res
->
end
-
res
->
start
,
pdev
->
name
))
{
pr_debug
(
"%s: request_mem_region failed
\n
"
,
DRV_NAME
);
ret
=
-
EBUSY
;
ret
=
-
EBUSY
;
goto
out
;
}
}
ahwif
->
regbase
=
(
u32
)
ioremap
(
res
->
start
,
res
->
end
-
res
->
start
);
if
(
ahwif
->
regbase
==
0
)
{
...
...
@@ -914,130 +687,92 @@ static int au_ide_probe(struct device *dev)
goto
out
;
}
hwif
=
&
ide_hwifs
[
pdev
->
id
];
/* FIXME: This might possibly break PCMCIA IDE devices */
hwif
=
&
ide_hwifs
[
pdev
->
id
];
hw_regs_t
*
hw
=
&
hwif
->
hw
;
hwif
->
irq
=
hw
->
irq
=
ahwif
->
irq
;
hwif
->
chipset
=
ide_au1xxx
;
hwif
->
irq
=
hw
->
irq
=
ahwif
->
irq
;
hwif
->
chipset
=
ide_au1xxx
;
auide_setup_ports
(
hw
,
ahwif
);
auide_setup_ports
(
hw
,
ahwif
);
memcpy
(
hwif
->
io_ports
,
hw
->
io_ports
,
sizeof
(
hwif
->
io_ports
));
#ifdef CONFIG_BLK_DEV_IDE_AU1XXX_SEQTS_PER_RQ
hwif
->
rqsize
=
CONFIG_BLK_DEV_IDE_AU1XXX_SEQTS_PER_RQ
;
hwif
->
rqsize
=
((
hwif
->
rqsize
>
AU1XXX_ATA_RQSIZE
)
||
(
hwif
->
rqsize
<
32
))
?
AU1XXX_ATA_RQSIZE
:
hwif
->
rqsize
;
#else
/* if kernel config is not set */
hwif
->
rqsize
=
AU1XXX_ATA_RQSIZE
;
#endif
hwif
->
ultra_mask
=
0x0
;
/* Disable Ultra DMA */
hwif
->
ultra_mask
=
0x0
;
/* Disable Ultra DMA */
#ifdef CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA
hwif
->
mwdma_mask
=
0x07
;
/* Multimode-2 DMA */
hwif
->
swdma_mask
=
0x07
;
hwif
->
mwdma_mask
=
0x07
;
/* Multimode-2 DMA */
hwif
->
swdma_mask
=
0x00
;
#else
hwif
->
mwdma_mask
=
0x0
;
hwif
->
swdma_mask
=
0x0
;
hwif
->
mwdma_mask
=
0x0
;
hwif
->
swdma_mask
=
0x0
;
#endif
hwif
->
noprobe
=
0
;
hwif
->
drives
[
0
].
unmask
=
1
;
hwif
->
drives
[
1
].
unmask
=
1
;
/* hold should be on in all cases */
hwif
->
hold
=
1
;
hwif
->
mmio
=
2
;
/* If the user has selected DDMA assisted copies,
then set up a few local I/O function entry points
*/
#ifdef CONFIG_BLK_DEV_IDE_AU1XXX_PIO_DBDMA
hwif
->
INSW
=
auide_insw
;
hwif
->
OUTSW
=
auide_outsw
;
#endif
//hwif->noprobe = !hwif->io_ports[IDE_DATA_OFFSET];
hwif
->
noprobe
=
0
;
hwif
->
drives
[
0
].
unmask
=
1
;
hwif
->
drives
[
1
].
unmask
=
1
;
/* hold should be on in all cases */
hwif
->
hold
=
1
;
hwif
->
mmio
=
2
;
/* set up local I/O function entry points */
hwif
->
INB
=
auide_inb
;
hwif
->
INW
=
auide_inw
;
hwif
->
INL
=
auide_inl
;
hwif
->
INSW
=
auide_insw
;
hwif
->
INSL
=
auide_insl
;
hwif
->
OUTB
=
auide_outb
;
hwif
->
OUTBSYNC
=
auide_outbsync
;
hwif
->
OUTW
=
auide_outw
;
hwif
->
OUTL
=
auide_outl
;
hwif
->
OUTSW
=
auide_outsw
;
hwif
->
OUTSL
=
auide_outsl
;
hwif
->
tuneproc
=
&
auide_tune_drive
;
hwif
->
speedproc
=
&
auide_tune_chipset
;
hwif
->
tuneproc
=
&
auide_tune_drive
;
hwif
->
speedproc
=
&
auide_tune_chipset
;
#ifdef CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA
hwif
->
ide_dma_off_quietly
=
&
auide_dma_off_quietly
;
hwif
->
ide_dma_timeout
=
&
auide_dma_timeout
;
hwif
->
ide_dma_check
=
&
auide_dma_check
;
hwif
->
dma_exec_cmd
=
&
auide_dma_exec_cmd
;
hwif
->
dma_start
=
&
auide_dma_start
;
hwif
->
ide_dma_end
=
&
auide_dma_end
;
hwif
->
dma_setup
=
&
auide_dma_setup
;
hwif
->
ide_dma_test_irq
=
&
auide_dma_test_irq
;
hwif
->
ide_dma_host_off
=
&
auide_dma_host_off
;
hwif
->
ide_dma_host_on
=
&
auide_dma_host_on
;
hwif
->
ide_dma_lostirq
=
&
auide_dma_lostirq
;
hwif
->
ide_dma_on
=
&
auide_dma_on
;
hwif
->
autodma
=
1
;
hwif
->
drives
[
0
].
autodma
=
hwif
->
autodma
;
hwif
->
drives
[
1
].
autodma
=
hwif
->
autodma
;
hwif
->
atapi_dma
=
1
;
hwif
->
drives
[
0
].
using_dma
=
1
;
hwif
->
drives
[
1
].
using_dma
=
1
;
hwif
->
ide_dma_off_quietly
=
&
auide_dma_off_quietly
;
hwif
->
ide_dma_timeout
=
&
auide_dma_timeout
;
hwif
->
ide_dma_check
=
&
auide_dma_check
;
hwif
->
dma_exec_cmd
=
&
auide_dma_exec_cmd
;
hwif
->
dma_start
=
&
auide_dma_start
;
hwif
->
ide_dma_end
=
&
auide_dma_end
;
hwif
->
dma_setup
=
&
auide_dma_setup
;
hwif
->
ide_dma_test_irq
=
&
auide_dma_test_irq
;
hwif
->
ide_dma_host_off
=
&
auide_dma_host_off
;
hwif
->
ide_dma_host_on
=
&
auide_dma_host_on
;
hwif
->
ide_dma_lostirq
=
&
auide_dma_lostirq
;
hwif
->
ide_dma_on
=
&
auide_dma_on
;
hwif
->
autodma
=
1
;
hwif
->
drives
[
0
].
autodma
=
hwif
->
autodma
;
hwif
->
drives
[
1
].
autodma
=
hwif
->
autodma
;
hwif
->
atapi_dma
=
1
;
#else
/* !CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA */
hwif
->
autodma
=
0
;
hwif
->
channel
=
0
;
hwif
->
hold
=
1
;
hwif
->
select_data
=
0
;
/* no chipset-specific code */
hwif
->
config_data
=
0
;
/* no chipset-specific code */
hwif
->
drives
[
0
].
autodma
=
0
;
hwif
->
drives
[
0
].
drive_data
=
0
;
/* no drive data */
hwif
->
drives
[
0
].
using_dma
=
0
;
hwif
->
drives
[
0
].
waiting_for_dma
=
0
;
hwif
->
drives
[
0
].
autotune
=
1
;
/* 1=autotune, 2=noautotune, 0=default */
/* secondary hdd not supported */
hwif
->
drives
[
1
].
autodma
=
0
;
hwif
->
drives
[
1
].
drive_data
=
0
;
hwif
->
drives
[
1
].
using_dma
=
0
;
hwif
->
drives
[
1
].
waiting_for_dma
=
0
;
hwif
->
drives
[
1
].
autotune
=
2
;
/* 1=autotune, 2=noautotune, 0=default */
#endif
hwif
->
drives
[
0
].
io_32bit
=
0
;
/* 0=16-bit, 1=32-bit, 2/3=32bit+sync */
hwif
->
drives
[
1
].
io_32bit
=
0
;
/* 0=16-bit, 1=32-bit, 2/3=32bit+sync */
/*Register Driver with PM Framework*/
#ifdef CONFIG_PM
auide_hwif
.
pm
.
lock
=
SPIN_LOCK_UNLOCKED
;
auide_hwif
.
pm
.
stopped
=
0
;
auide_hwif
.
pm
.
dev
=
new_au1xxx_power_device
(
"ide"
,
&
au1200ide_pm_callback
,
NULL
);
if
(
auide_hwif
.
pm
.
dev
==
NULL
)
printk
(
KERN_INFO
"Unable to create a power management \
device entry for the au1200-IDE.
\n
"
);
else
printk
(
KERN_INFO
"Power management device entry for the \
au1200-IDE loaded.
\n
"
);
hwif
->
autodma
=
0
;
hwif
->
channel
=
0
;
hwif
->
hold
=
1
;
hwif
->
select_data
=
0
;
/* no chipset-specific code */
hwif
->
config_data
=
0
;
/* no chipset-specific code */
hwif
->
drives
[
0
].
autodma
=
0
;
hwif
->
drives
[
0
].
autotune
=
1
;
/* 1=autotune, 2=noautotune, 0=default */
#endif
hwif
->
drives
[
0
].
no_io_32bit
=
1
;
auide_hwif
.
hwif
=
hwif
;
hwif
->
hwif_data
=
&
auide_hwif
;
auide_hwif
.
hwif
=
hwif
;
hwif
->
hwif_data
=
&
auide_hwif
;
#ifdef CONFIG_BLK_DEV_IDE_AU1XXX_PIO_DBDMA
auide_ddma_init
(
&
auide_hwif
);
dbdma_init_done
=
1
;
#ifdef CONFIG_BLK_DEV_IDE_AU1XXX_PIO_DBDMA
auide_ddma_init
(
&
auide_hwif
);
dbdma_init_done
=
1
;
#endif
probe_hwif_init
(
hwif
);
dev_set_drvdata
(
dev
,
hwif
);
printk
(
KERN_INFO
"Au1xxx IDE(builtin) configured for %s
\n
"
,
mode
);
printk
(
KERN_INFO
"Au1xxx IDE(builtin) configured for %s
\n
"
,
mode
);
out:
return
ret
;
out:
return
ret
;
}
static
int
au_ide_remove
(
struct
device
*
dev
)
...
...
@@ -1045,7 +780,7 @@ static int au_ide_remove(struct device *dev)
struct
platform_device
*
pdev
=
to_platform_device
(
dev
);
struct
resource
*
res
;
ide_hwif_t
*
hwif
=
dev_get_drvdata
(
dev
);
_auide_hwif
*
ahwif
=
&
auide_hwif
;
_auide_hwif
*
ahwif
=
&
auide_hwif
;
ide_unregister
(
hwif
-
ide_hwifs
);
...
...
@@ -1069,180 +804,11 @@ static int __init au_ide_init(void)
return
driver_register
(
&
au1200_ide_driver
);
}
static
void
__
in
it
au_ide_exit
(
void
)
static
void
__
ex
it
au_ide_exit
(
void
)
{
driver_unregister
(
&
au1200_ide_driver
);
}
#ifdef CONFIG_PM
int
au1200ide_pm_callback
(
au1xxx_power_dev_t
*
dev
,
\
au1xxx_request_t
request
,
void
*
data
)
{
unsigned
int
d
,
err
=
0
;
unsigned
long
flags
;
spin_lock_irqsave
(
auide_hwif
.
pm
.
lock
,
flags
);
switch
(
request
){
case
AU1XXX_PM_SLEEP
:
err
=
au1xxxide_pm_sleep
(
dev
);
break
;
case
AU1XXX_PM_WAKEUP
:
d
=
*
((
unsigned
int
*
)
data
);
if
(
d
>
0
&&
d
<=
99
)
{
err
=
au1xxxide_pm_standby
(
dev
);
}
else
{
err
=
au1xxxide_pm_resume
(
dev
);
}
break
;
case
AU1XXX_PM_GETSTATUS
:
err
=
au1xxxide_pm_getstatus
(
dev
);
break
;
case
AU1XXX_PM_ACCESS
:
err
=
au1xxxide_pm_access
(
dev
);
break
;
case
AU1XXX_PM_IDLE
:
err
=
au1xxxide_pm_idle
(
dev
);
break
;
case
AU1XXX_PM_CLEANUP
:
err
=
au1xxxide_pm_cleanup
(
dev
);
break
;
default:
err
=
-
1
;
break
;
}
spin_unlock_irqrestore
(
auide_hwif
.
pm
.
lock
,
flags
);
return
err
;
}
static
int
au1xxxide_pm_standby
(
au1xxx_power_dev_t
*
dev
)
{
return
0
;
}
static
int
au1xxxide_pm_sleep
(
au1xxx_power_dev_t
*
dev
)
{
int
retval
;
ide_hwif_t
*
hwif
=
auide_hwif
.
hwif
;
struct
request
rq
;
struct
request_pm_state
rqpm
;
ide_task_t
args
;
if
(
auide_hwif
.
pm
.
stopped
)
return
-
1
;
/*
* wait until hard disc is ready
*/
if
(
wait_for_ready
(
&
hwif
->
drives
[
0
],
35000
)
)
{
printk
(
"Wait for drive sleep timeout!
\n
"
);
retval
=
-
1
;
}
/*
* sequenz to tell the high level ide driver that pm is resuming
*/
memset
(
&
rq
,
0
,
sizeof
(
rq
));
memset
(
&
rqpm
,
0
,
sizeof
(
rqpm
));
memset
(
&
args
,
0
,
sizeof
(
args
));
rq
.
flags
=
REQ_PM_SUSPEND
;
rq
.
special
=
&
args
;
rq
.
pm
=
&
rqpm
;
rqpm
.
pm_step
=
ide_pm_state_start_suspend
;
rqpm
.
pm_state
=
PMSG_SUSPEND
;
retval
=
ide_do_drive_cmd
(
&
hwif
->
drives
[
0
],
&
rq
,
ide_wait
);
if
(
wait_for_ready
(
&
hwif
->
drives
[
0
],
35000
))
{
printk
(
"Wait for drive sleep timeout!
\n
"
);
retval
=
-
1
;
}
/*
* stop dbdma channels
*/
au1xxx_dbdma_reset
(
auide_hwif
.
tx_chan
);
au1xxx_dbdma_reset
(
auide_hwif
.
rx_chan
);
auide_hwif
.
pm
.
stopped
=
1
;
return
retval
;
}
static
int
au1xxxide_pm_resume
(
au1xxx_power_dev_t
*
dev
)
{
int
retval
;
ide_hwif_t
*
hwif
=
auide_hwif
.
hwif
;
struct
request
rq
;
struct
request_pm_state
rqpm
;
ide_task_t
args
;
if
(
!
auide_hwif
.
pm
.
stopped
)
return
-
1
;
/*
* start dbdma channels
*/
au1xxx_dbdma_start
(
auide_hwif
.
tx_chan
);
au1xxx_dbdma_start
(
auide_hwif
.
rx_chan
);
/*
* wait until hard disc is ready
*/
if
(
wait_for_ready
(
&
hwif
->
drives
[
0
],
35000
))
{
printk
(
"Wait for drive wake up timeout!
\n
"
);
retval
=
-
1
;
}
/*
* sequenz to tell the high level ide driver that pm is resuming
*/
memset
(
&
rq
,
0
,
sizeof
(
rq
));
memset
(
&
rqpm
,
0
,
sizeof
(
rqpm
));
memset
(
&
args
,
0
,
sizeof
(
args
));
rq
.
flags
=
REQ_PM_RESUME
;
rq
.
special
=
&
args
;
rq
.
pm
=
&
rqpm
;
rqpm
.
pm_step
=
ide_pm_state_start_resume
;
rqpm
.
pm_state
=
PMSG_ON
;
retval
=
ide_do_drive_cmd
(
&
hwif
->
drives
[
0
],
&
rq
,
ide_head_wait
);
/*
* wait for hard disc
*/
if
(
wait_for_ready
(
&
hwif
->
drives
[
0
],
35000
)
)
{
printk
(
"Wait for drive wake up timeout!
\n
"
);
retval
=
-
1
;
}
auide_hwif
.
pm
.
stopped
=
0
;
return
retval
;
}
static
int
au1xxxide_pm_getstatus
(
au1xxx_power_dev_t
*
dev
)
{
return
dev
->
cur_state
;
}
static
int
au1xxxide_pm_access
(
au1xxx_power_dev_t
*
dev
)
{
if
(
dev
->
cur_state
!=
AWAKE_STATE
)
return
0
;
else
return
-
1
;
}
static
int
au1xxxide_pm_idle
(
au1xxx_power_dev_t
*
dev
)
{
return
0
;
}
static
int
au1xxxide_pm_cleanup
(
au1xxx_power_dev_t
*
dev
)
{
return
0
;
}
#endif
/* CONFIG_PM */
MODULE_LICENSE
(
"GPL"
);
MODULE_DESCRIPTION
(
"AU1200 IDE driver"
);
...
...
drivers/ide/pci/sgiioc4.c
View file @
7116317d
...
...
@@ -622,12 +622,18 @@ sgiioc4_ide_setup_pci_device(struct pci_dev *dev, ide_pci_device_t * d)
ide_hwif_t
*
hwif
;
int
h
;
/*
* Find an empty HWIF; if none available, return -ENOMEM.
*/
for
(
h
=
0
;
h
<
MAX_HWIFS
;
++
h
)
{
hwif
=
&
ide_hwifs
[
h
];
/* Find an empty HWIF */
if
(
hwif
->
chipset
==
ide_unknown
)
break
;
}
if
(
h
==
MAX_HWIFS
)
{
printk
(
KERN_ERR
"%s: too many IDE interfaces, no room in table
\n
"
,
d
->
name
);
return
-
ENOMEM
;
}
/* Get the CmdBlk and CtrlBlk Base Registers */
base
=
pci_resource_start
(
dev
,
0
)
+
IOC4_CMD_OFFSET
;
...
...
drivers/ide/pci/via82cxxx.c
View file @
7116317d
...
...
@@ -80,6 +80,7 @@ static struct via_isa_bridge {
u16
flags
;
}
via_isa_bridges
[]
=
{
{
"vt6410"
,
PCI_DEVICE_ID_VIA_6410
,
0x00
,
0x2f
,
VIA_UDMA_133
|
VIA_BAD_AST
},
{
"vt8251"
,
PCI_DEVICE_ID_VIA_8251
,
0x00
,
0x2f
,
VIA_UDMA_133
|
VIA_BAD_AST
},
{
"vt8237"
,
PCI_DEVICE_ID_VIA_8237
,
0x00
,
0x2f
,
VIA_UDMA_133
|
VIA_BAD_AST
},
{
"vt8235"
,
PCI_DEVICE_ID_VIA_8235
,
0x00
,
0x2f
,
VIA_UDMA_133
|
VIA_BAD_AST
},
{
"vt8233a"
,
PCI_DEVICE_ID_VIA_8233A
,
0x00
,
0x2f
,
VIA_UDMA_133
|
VIA_BAD_AST
},
...
...
include/asm-mips/mach-au1x00/au1xxx_ide.h
View file @
7116317d
...
...
@@ -74,9 +74,6 @@ typedef struct
u8
white_list
,
black_list
;
struct
dbdma_cmd
*
dma_table_cpu
;
dma_addr_t
dma_table_dma
;
struct
scatterlist
*
sg_table
;
int
sg_nents
;
int
sg_dma_direction
;
#endif
struct
device
*
dev
;
int
irq
;
...
...
@@ -87,11 +84,6 @@ typedef struct
}
_auide_hwif
;
#ifdef CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA
struct
drive_list_entry
{
const
char
*
id_model
;
const
char
*
id_firmware
;
};
/* HD white list */
static
const
struct
drive_list_entry
dma_white_list
[]
=
{
/*
...
...
@@ -167,13 +159,9 @@ int __init auide_probe(void);
* Multi-Word DMA + DbDMA functions
*/
#ifdef CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA
static
int
in_drive_list
(
struct
hd_driveid
*
id
,
const
struct
drive_list_entry
*
drive_table
);
static
int
auide_build_sglist
(
ide_drive_t
*
drive
,
struct
request
*
rq
);
static
int
auide_build_dmatable
(
ide_drive_t
*
drive
);
static
int
auide_dma_end
(
ide_drive_t
*
drive
);
static
void
auide_dma_start
(
ide_drive_t
*
drive
);
ide_startstop_t
auide_dma_intr
(
ide_drive_t
*
drive
);
static
void
auide_dma_exec_cmd
(
ide_drive_t
*
drive
,
u8
command
);
static
int
auide_dma_setup
(
ide_drive_t
*
drive
);
...
...
@@ -188,8 +176,6 @@ int __init auide_probe(void);
static
void
auide_ddma_rx_callback
(
int
irq
,
void
*
param
,
struct
pt_regs
*
regs
);
static
int
auide_dma_off_quietly
(
ide_drive_t
*
drive
);
static
int
auide_dma_timeout
(
ide_drive_t
*
drive
);
#endif
/* end CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA */
/*******************************************************************************
...
...
@@ -299,3 +285,11 @@ int __init auide_probe(void);
#define SBC_IDE_MDMA2_TPM (0x00<<6)
#define SBC_IDE_MDMA2_TA (0x12<<0)
#define SBC_IDE_TIMING(mode) \
SBC_IDE_##mode##_TWCS | \
SBC_IDE_##mode##_TCSH | \
SBC_IDE_##mode##_TCSOFF | \
SBC_IDE_##mode##_TWP | \
SBC_IDE_##mode##_TCSW | \
SBC_IDE_##mode##_TPM | \
SBC_IDE_##mode##_TA
include/linux/ide.h
View file @
7116317d
...
...
@@ -23,17 +23,6 @@
#include <asm/io.h>
#include <asm/semaphore.h>
/*
* This is the multiple IDE interface driver, as evolved from hd.c.
* It supports up to four IDE interfaces, on one or more IRQs (usually 14 & 15).
* There can be up to two drives per interface, as per the ATA-2 spec.
*
* Primary i/f: ide0: major=3; (hda) minor=0; (hdb) minor=64
* Secondary i/f: ide1: major=22; (hdc or hd1a) minor=0; (hdd or hd1b) minor=64
* Tertiary i/f: ide2: major=33; (hde) minor=0; (hdf) minor=64
* Quaternary i/f: ide3: major=34; (hdg) minor=0; (hdh) minor=64
*/
/******************************************************************************
* IDE driver configuration options (play with these as desired):
*
...
...
@@ -193,11 +182,6 @@ typedef unsigned char byte; /* used everywhere */
#define WAIT_CMD (10*HZ)
/* 10sec - maximum wait for an IRQ to happen */
#define WAIT_MIN_SLEEP (2*HZ/100)
/* 20msec - minimum sleep time */
#define HOST(hwif,chipset) \
{ \
return ((hwif)->chipset == chipset) ? 1 : 0; \
}
/*
* Check for an interrupt and acknowledge the interrupt status
*/
...
...
@@ -390,45 +374,6 @@ typedef union {
}
b
;
}
ata_nsector_t
,
ata_data_t
,
atapi_bcount_t
,
ata_index_t
;
/*
* ATA-IDE Error Register
*
* mark : Bad address mark
* tzero : Couldn't find track 0
* abrt : Aborted Command
* mcr : Media Change Request
* id : ID field not found
* mce : Media Change Event
* ecc : Uncorrectable ECC error
* bdd : dual meaing
*/
typedef
union
{
unsigned
all
:
8
;
struct
{
#if defined(__LITTLE_ENDIAN_BITFIELD)
unsigned
mark
:
1
;
unsigned
tzero
:
1
;
unsigned
abrt
:
1
;
unsigned
mcr
:
1
;
unsigned
id
:
1
;
unsigned
mce
:
1
;
unsigned
ecc
:
1
;
unsigned
bdd
:
1
;
#elif defined(__BIG_ENDIAN_BITFIELD)
unsigned
bdd
:
1
;
unsigned
ecc
:
1
;
unsigned
mce
:
1
;
unsigned
id
:
1
;
unsigned
mcr
:
1
;
unsigned
abrt
:
1
;
unsigned
tzero
:
1
;
unsigned
mark
:
1
;
#else
#error "Please fix <asm/byteorder.h>"
#endif
}
b
;
}
ata_error_t
;
/*
* ATA-IDE Select Register, aka Device-Head
*
...
...
@@ -503,39 +448,6 @@ typedef union {
}
b
;
}
ata_status_t
,
atapi_status_t
;
/*
* ATA-IDE Control Register
*
* bit0 : Should be set to zero
* nIEN : device INTRQ to host
* SRST : host soft reset bit
* bit3 : ATA-2 thingy, Should be set to 1
* reserved456 : Reserved
* HOB : 48-bit address ordering, High Ordered Bit
*/
typedef
union
{
unsigned
all
:
8
;
struct
{
#if defined(__LITTLE_ENDIAN_BITFIELD)
unsigned
bit0
:
1
;
unsigned
nIEN
:
1
;
unsigned
SRST
:
1
;
unsigned
bit3
:
1
;
unsigned
reserved456
:
3
;
unsigned
HOB
:
1
;
#elif defined(__BIG_ENDIAN_BITFIELD)
unsigned
HOB
:
1
;
unsigned
reserved456
:
3
;
unsigned
bit3
:
1
;
unsigned
SRST
:
1
;
unsigned
nIEN
:
1
;
unsigned
bit0
:
1
;
#else
#error "Please fix <asm/byteorder.h>"
#endif
}
b
;
}
ata_control_t
;
/*
* ATAPI Feature Register
*
...
...
@@ -617,39 +529,6 @@ typedef union {
}
b
;
}
atapi_error_t
;
/*
* ATAPI floppy Drive Select Register
*
* sam_lun : Logical unit number
* reserved3 : Reserved
* drv : The responding drive will be drive 0 (0) or drive 1 (1)
* one5 : Should be set to 1
* reserved6 : Reserved
* one7 : Should be set to 1
*/
typedef
union
{
unsigned
all
:
8
;
struct
{
#if defined(__LITTLE_ENDIAN_BITFIELD)
unsigned
sam_lun
:
3
;
unsigned
reserved3
:
1
;
unsigned
drv
:
1
;
unsigned
one5
:
1
;
unsigned
reserved6
:
1
;
unsigned
one7
:
1
;
#elif defined(__BIG_ENDIAN_BITFIELD)
unsigned
one7
:
1
;
unsigned
reserved6
:
1
;
unsigned
one5
:
1
;
unsigned
drv
:
1
;
unsigned
reserved3
:
1
;
unsigned
sam_lun
:
3
;
#else
#error "Please fix <asm/byteorder.h>"
#endif
}
b
;
}
atapi_select_t
;
/*
* Status returned from various ide_ functions
*/
...
...
@@ -1101,10 +980,7 @@ typedef struct ide_driver_s {
int
(
*
end_request
)(
ide_drive_t
*
,
int
,
int
);
ide_startstop_t
(
*
error
)(
ide_drive_t
*
,
struct
request
*
rq
,
u8
,
u8
);
ide_startstop_t
(
*
abort
)(
ide_drive_t
*
,
struct
request
*
rq
);
int
(
*
ioctl
)(
ide_drive_t
*
,
struct
inode
*
,
struct
file
*
,
unsigned
int
,
unsigned
long
);
ide_proc_entry_t
*
proc
;
void
(
*
ata_prebuilder
)(
ide_drive_t
*
);
void
(
*
atapi_prebuilder
)(
ide_drive_t
*
);
struct
device_driver
gen_driver
;
}
ide_driver_t
;
...
...
@@ -1298,7 +1174,6 @@ extern int ide_spin_wait_hwgroup(ide_drive_t *);
extern
void
ide_timer_expiry
(
unsigned
long
);
extern
irqreturn_t
ide_intr
(
int
irq
,
void
*
dev_id
,
struct
pt_regs
*
regs
);
extern
void
do_ide_request
(
request_queue_t
*
);
extern
void
ide_init_subdrivers
(
void
);
void
ide_init_disk
(
struct
gendisk
*
,
ide_drive_t
*
);
...
...
@@ -1371,6 +1246,12 @@ void ide_init_sg_cmd(ide_drive_t *, struct request *);
#define GOOD_DMA_DRIVE 1
#ifdef CONFIG_BLK_DEV_IDEDMA
struct
drive_list_entry
{
const
char
*
id_model
;
const
char
*
id_firmware
;
};
int
ide_in_drive_list
(
struct
hd_driveid
*
,
const
struct
drive_list_entry
*
);
int
__ide_dma_bad_drive
(
ide_drive_t
*
);
int
__ide_dma_good_drive
(
ide_drive_t
*
);
int
ide_use_dma
(
ide_drive_t
*
);
...
...
include/linux/pci_ids.h
View file @
7116317d
...
...
@@ -1244,6 +1244,7 @@
#define PCI_DEVICE_ID_VIA_8378_0 0x3205
#define PCI_DEVICE_ID_VIA_8783_0 0x3208
#define PCI_DEVICE_ID_VIA_8237 0x3227
#define PCI_DEVICE_ID_VIA_8251 0x3287
#define PCI_DEVICE_ID_VIA_3296_0 0x0296
#define PCI_DEVICE_ID_VIA_8231 0x8231
#define PCI_DEVICE_ID_VIA_8231_4 0x8235
...
...
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