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
0d1e8f1f
Commit
0d1e8f1f
authored
Sep 11, 2002
by
Jens Axboe
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
arm icside update
parent
b73a4ba1
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
215 additions
and
122 deletions
+215
-122
drivers/ide/arm/icside.c
drivers/ide/arm/icside.c
+215
-122
No files found.
drivers/ide/arm/icside.c
View file @
0d1e8f1f
...
@@ -26,6 +26,19 @@
...
@@ -26,6 +26,19 @@
#include <asm/ecard.h>
#include <asm/ecard.h>
#include <asm/io.h>
#include <asm/io.h>
#include "ide-noise.h"
/*
* FIXME: We want to drop the the MACRO CRAP!
*
* ec->iops->in{b/w/l}
* ec->iops->in{b/w/l}_p
* ec->iops->out{b/w/l}
* ec->iops->out{b/w/l}_p
*
* the new core supports clean MMIO calls and other goodies
*/
/*
/*
* Maximum number of interfaces per card
* Maximum number of interfaces per card
*/
*/
...
@@ -92,7 +105,7 @@ typedef enum {
...
@@ -92,7 +105,7 @@ typedef enum {
static
void
icside_irqenable_arcin_v5
(
struct
expansion_card
*
ec
,
int
irqnr
)
static
void
icside_irqenable_arcin_v5
(
struct
expansion_card
*
ec
,
int
irqnr
)
{
{
unsigned
int
memc_port
=
(
unsigned
int
)
ec
->
irq_data
;
unsigned
int
memc_port
=
(
unsigned
int
)
ec
->
irq_data
;
OUT_BYTE
(
0
,
memc_port
+
ICS_ARCIN_V5_INTROFFSET
);
outb
(
0
,
memc_port
+
ICS_ARCIN_V5_INTROFFSET
);
}
}
/* Prototype: icside_irqdisable_arcin_v5 (struct expansion_card *ec, int irqnr)
/* Prototype: icside_irqdisable_arcin_v5 (struct expansion_card *ec, int irqnr)
...
@@ -101,7 +114,7 @@ static void icside_irqenable_arcin_v5 (struct expansion_card *ec, int irqnr)
...
@@ -101,7 +114,7 @@ static void icside_irqenable_arcin_v5 (struct expansion_card *ec, int irqnr)
static
void
icside_irqdisable_arcin_v5
(
struct
expansion_card
*
ec
,
int
irqnr
)
static
void
icside_irqdisable_arcin_v5
(
struct
expansion_card
*
ec
,
int
irqnr
)
{
{
unsigned
int
memc_port
=
(
unsigned
int
)
ec
->
irq_data
;
unsigned
int
memc_port
=
(
unsigned
int
)
ec
->
irq_data
;
IN_BYTE
(
memc_port
+
ICS_ARCIN_V5_INTROFFSET
);
inb
(
memc_port
+
ICS_ARCIN_V5_INTROFFSET
);
}
}
static
const
expansioncard_ops_t
icside_ops_arcin_v5
=
{
static
const
expansioncard_ops_t
icside_ops_arcin_v5
=
{
...
@@ -122,8 +135,8 @@ static void icside_irqenable_arcin_v6 (struct expansion_card *ec, int irqnr)
...
@@ -122,8 +135,8 @@ static void icside_irqenable_arcin_v6 (struct expansion_card *ec, int irqnr)
{
{
unsigned
int
ide_base_port
=
(
unsigned
int
)
ec
->
irq_data
;
unsigned
int
ide_base_port
=
(
unsigned
int
)
ec
->
irq_data
;
OUT_BYTE
(
0
,
ide_base_port
+
ICS_ARCIN_V6_INTROFFSET_1
);
outb
(
0
,
ide_base_port
+
ICS_ARCIN_V6_INTROFFSET_1
);
OUT_BYTE
(
0
,
ide_base_port
+
ICS_ARCIN_V6_INTROFFSET_2
);
outb
(
0
,
ide_base_port
+
ICS_ARCIN_V6_INTROFFSET_2
);
}
}
/* Prototype: icside_irqdisable_arcin_v6 (struct expansion_card *ec, int irqnr)
/* Prototype: icside_irqdisable_arcin_v6 (struct expansion_card *ec, int irqnr)
...
@@ -133,8 +146,8 @@ static void icside_irqdisable_arcin_v6 (struct expansion_card *ec, int irqnr)
...
@@ -133,8 +146,8 @@ static void icside_irqdisable_arcin_v6 (struct expansion_card *ec, int irqnr)
{
{
unsigned
int
ide_base_port
=
(
unsigned
int
)
ec
->
irq_data
;
unsigned
int
ide_base_port
=
(
unsigned
int
)
ec
->
irq_data
;
IN_BYTE
(
ide_base_port
+
ICS_ARCIN_V6_INTROFFSET_1
);
inb
(
ide_base_port
+
ICS_ARCIN_V6_INTROFFSET_1
);
IN_BYTE
(
ide_base_port
+
ICS_ARCIN_V6_INTROFFSET_2
);
inb
(
ide_base_port
+
ICS_ARCIN_V6_INTROFFSET_2
);
}
}
/* Prototype: icside_irqprobe(struct expansion_card *ec)
/* Prototype: icside_irqprobe(struct expansion_card *ec)
...
@@ -144,8 +157,8 @@ static int icside_irqpending_arcin_v6(struct expansion_card *ec)
...
@@ -144,8 +157,8 @@ static int icside_irqpending_arcin_v6(struct expansion_card *ec)
{
{
unsigned
int
ide_base_port
=
(
unsigned
int
)
ec
->
irq_data
;
unsigned
int
ide_base_port
=
(
unsigned
int
)
ec
->
irq_data
;
return
IN_BYTE
(
ide_base_port
+
ICS_ARCIN_V6_INTRSTAT_1
)
&
1
||
return
inb
(
ide_base_port
+
ICS_ARCIN_V6_INTRSTAT_1
)
&
1
||
IN_BYTE
(
ide_base_port
+
ICS_ARCIN_V6_INTRSTAT_2
)
&
1
;
inb
(
ide_base_port
+
ICS_ARCIN_V6_INTRSTAT_2
)
&
1
;
}
}
static
const
expansioncard_ops_t
icside_ops_arcin_v6
=
{
static
const
expansioncard_ops_t
icside_ops_arcin_v6
=
{
...
@@ -171,10 +184,10 @@ static iftype_t __init icside_identifyif (struct expansion_card *ec)
...
@@ -171,10 +184,10 @@ static iftype_t __init icside_identifyif (struct expansion_card *ec)
addr
=
ecard_address
(
ec
,
ECARD_IOC
,
ECARD_FAST
)
+
ICS_IDENT_OFFSET
;
addr
=
ecard_address
(
ec
,
ECARD_IOC
,
ECARD_FAST
)
+
ICS_IDENT_OFFSET
;
id
=
IN_BYTE
(
addr
)
&
1
;
id
=
inb
(
addr
)
&
1
;
id
|=
(
IN_BYTE
(
addr
+
1
)
&
1
)
<<
1
;
id
|=
(
inb
(
addr
+
1
)
&
1
)
<<
1
;
id
|=
(
IN_BYTE
(
addr
+
2
)
&
1
)
<<
2
;
id
|=
(
inb
(
addr
+
2
)
&
1
)
<<
2
;
id
|=
(
IN_BYTE
(
addr
+
3
)
&
1
)
<<
3
;
id
|=
(
inb
(
addr
+
3
)
&
1
)
<<
3
;
switch
(
id
)
{
switch
(
id
)
{
case
0
:
/* A3IN */
case
0
:
/* A3IN */
...
@@ -294,10 +307,10 @@ icside_config_if(ide_drive_t *drive, int xfer_mode)
...
@@ -294,10 +307,10 @@ icside_config_if(ide_drive_t *drive, int xfer_mode)
}
}
if
(
!
drive
->
init_speed
)
if
(
!
drive
->
init_speed
)
drive
->
init_speed
=
(
byte
)
xfer_mode
;
drive
->
init_speed
=
(
u8
)
xfer_mode
;
if
(
drive
->
drive_data
&&
if
(
drive
->
drive_data
&&
ide_config_drive_speed
(
drive
,
(
byte
)
xfer_mode
)
==
0
)
ide_config_drive_speed
(
drive
,
(
u8
)
xfer_mode
)
==
0
)
func
=
ide_dma_on
;
func
=
ide_dma_on
;
else
else
drive
->
drive_data
=
480
;
drive
->
drive_data
=
480
;
...
@@ -305,13 +318,13 @@ icside_config_if(ide_drive_t *drive, int xfer_mode)
...
@@ -305,13 +318,13 @@ icside_config_if(ide_drive_t *drive, int xfer_mode)
printk
(
"%s: %s selected (peak %dMB/s)
\n
"
,
drive
->
name
,
printk
(
"%s: %s selected (peak %dMB/s)
\n
"
,
drive
->
name
,
ide_xfer_verbose
(
xfer_mode
),
2000
/
drive
->
drive_data
);
ide_xfer_verbose
(
xfer_mode
),
2000
/
drive
->
drive_data
);
drive
->
current_speed
=
(
byte
)
xfer_mode
;
drive
->
current_speed
=
(
u8
)
xfer_mode
;
return
func
;
return
func
;
}
}
static
int
static
int
icside_set_speed
(
ide_drive_t
*
drive
,
byte
speed
)
icside_set_speed
(
ide_drive_t
*
drive
,
u8
speed
)
{
{
return
icside_config_if
(
drive
,
speed
);
return
icside_config_if
(
drive
,
speed
);
}
}
...
@@ -321,11 +334,11 @@ icside_set_speed(ide_drive_t *drive, byte speed)
...
@@ -321,11 +334,11 @@ icside_set_speed(ide_drive_t *drive, byte speed)
*/
*/
static
ide_startstop_t
icside_dmaintr
(
ide_drive_t
*
drive
)
static
ide_startstop_t
icside_dmaintr
(
ide_drive_t
*
drive
)
{
{
u8
dma_stat
=
HWIF
(
drive
)
->
ide_dma_end
(
drive
);
/* get drive status */
u8
stat
=
HWIF
(
drive
)
->
INB
(
IDE_STATUS_REG
);
int
i
;
int
i
;
byte
stat
,
dma_stat
;
dma_stat
=
HWIF
(
drive
)
->
dmaproc
(
ide_dma_end
,
drive
);
stat
=
GET_STAT
();
/* get drive status */
if
(
OK_STAT
(
stat
,
DRIVE_READY
,
drive
->
bad_wstat
|
DRQ_STAT
))
{
if
(
OK_STAT
(
stat
,
DRIVE_READY
,
drive
->
bad_wstat
|
DRQ_STAT
))
{
if
(
!
dma_stat
)
{
if
(
!
dma_stat
)
{
struct
request
*
rq
=
HWGROUP
(
drive
)
->
rq
;
struct
request
*
rq
=
HWGROUP
(
drive
)
->
rq
;
...
@@ -412,40 +425,36 @@ static int in_drive_list(struct hd_driveid *id, struct drive_list_entry * drive_
...
@@ -412,40 +425,36 @@ static int in_drive_list(struct hd_driveid *id, struct drive_list_entry * drive_
* This is setup to be called as an extern for future support
* This is setup to be called as an extern for future support
* to other special driver code.
* to other special driver code.
*/
*/
static
int
check_drive_lists
(
ide_drive_t
*
drive
,
int
good_bad
)
int
check_drive_good_lists
(
ide_drive_t
*
drive
)
{
{
struct
hd_driveid
*
id
=
drive
->
id
;
struct
hd_driveid
*
id
=
drive
->
id
;
return
in_drive_list
(
id
,
drive_whitelist
);
}
if
(
good_bad
)
{
int
check_drive_bad_lists
(
ide_drive_t
*
drive
)
return
in_drive_list
(
id
,
drive_whitelist
);
{
}
else
{
struct
hd_driveid
*
id
=
drive
->
id
;
int
blacklist
=
in_drive_list
(
id
,
drive_blacklist
);
int
blacklist
=
in_drive_list
(
id
,
drive_blacklist
);
if
(
blacklist
)
if
(
blacklist
)
printk
(
"%s: Disabling DMA for %s
\n
"
,
drive
->
name
,
id
->
model
);
printk
(
"%s: Disabling DMA for %s
\n
"
,
drive
->
name
,
id
->
model
);
return
(
blacklist
);
return
(
blacklist
);
}
return
0
;
}
}
static
int
int
icside_dma_check
(
ide_drive_t
*
drive
)
icside_dma_check
(
ide_drive_t
*
drive
)
{
{
struct
hd_driveid
*
id
=
drive
->
id
;
struct
hd_driveid
*
id
=
drive
->
id
;
ide_hwif_t
*
hwif
=
HWIF
(
drive
);
ide_hwif_t
*
hwif
=
HWIF
(
drive
);
int
autodma
=
hwif
->
autodma
;
int
autodma
=
hwif
->
autodma
;
int
xfer_mode
=
XFER_PIO_2
;
int
xfer_mode
=
XFER_PIO_2
;
int
func
=
ide_dma_off_quietly
;
if
(
!
id
||
!
(
id
->
capability
&
1
)
||
!
autodma
)
if
(
!
id
||
!
(
id
->
capability
&
1
)
||
!
autodma
)
goto
out
;
return
hwif
->
ide_dma_off_quietly
(
drive
)
;
/*
/*
* Consult the list of known "bad" drives
* Consult the list of known "bad" drives
*/
*/
if
(
check_drive_lists
(
drive
,
0
))
{
if
(
check_drive_bad_lists
(
drive
))
func
=
ide_dma_off
;
return
hwif
->
ide_dma_off
(
drive
);
goto
out
;
}
/*
/*
* Enable DMA on any drive that has multiword DMA
* Enable DMA on any drive that has multiword DMA
...
@@ -453,13 +462,10 @@ icside_dma_check(ide_drive_t *drive)
...
@@ -453,13 +462,10 @@ icside_dma_check(ide_drive_t *drive)
if
(
id
->
field_valid
&
2
)
{
if
(
id
->
field_valid
&
2
)
{
if
(
id
->
dma_mword
&
4
)
{
if
(
id
->
dma_mword
&
4
)
{
xfer_mode
=
XFER_MW_DMA_2
;
xfer_mode
=
XFER_MW_DMA_2
;
func
=
ide_dma_on
;
}
else
if
(
id
->
dma_mword
&
2
)
{
}
else
if
(
id
->
dma_mword
&
2
)
{
xfer_mode
=
XFER_MW_DMA_1
;
xfer_mode
=
XFER_MW_DMA_1
;
func
=
ide_dma_on
;
}
else
if
(
id
->
dma_mword
&
1
)
{
}
else
if
(
id
->
dma_mword
&
1
)
{
xfer_mode
=
XFER_MW_DMA_0
;
xfer_mode
=
XFER_MW_DMA_0
;
func
=
ide_dma_on
;
}
}
goto
out
;
goto
out
;
}
}
...
@@ -467,119 +473,187 @@ icside_dma_check(ide_drive_t *drive)
...
@@ -467,119 +473,187 @@ icside_dma_check(ide_drive_t *drive)
/*
/*
* Consult the list of known "good" drives
* Consult the list of known "good" drives
*/
*/
if
(
check_drive_
lists
(
drive
,
1
))
{
if
(
check_drive_
good_lists
(
drive
))
{
if
(
id
->
eide_dma_time
>
150
)
if
(
id
->
eide_dma_time
>
150
)
goto
out
;
goto
out
;
xfer_mode
=
XFER_MW_DMA_1
;
xfer_mode
=
XFER_MW_DMA_1
;
func
=
ide_dma_on
;
}
}
out:
out:
func
=
icside_config_if
(
drive
,
xfer_mode
);
if
(
icside_config_if
(
drive
,
xfer_mode
))
return
hwif
->
ide_dma_on
(
drive
);
return
hwif
->
dmaproc
(
func
,
drive
);
return
hwif
->
ide_dma_off
(
drive
);
}
}
static
int
int
icside_dma_verbose
(
ide_drive_t
*
drive
)
icside_dma_verbose
(
ide_drive_t
*
drive
)
{
{
printk
(
", DMA"
);
printk
(
", DMA"
);
return
1
;
return
1
;
}
}
static
int
int
icside_dma_test_irq
(
ide_drive_t
*
drive
)
icside_dmaproc
(
ide_dma_action_t
func
,
ide_drive_t
*
drive
)
{
{
ide_hwif_t
*
hwif
=
HWIF
(
drive
);
ide_hwif_t
*
hwif
=
HWIF
(
drive
);
// ide_task_t *args = HWGROUP(drive)->rq->special
;
return
inb
((
unsigned
long
)
hwif
->
hw
.
priv
)
&
1
;
int
count
,
reading
=
0
;
}
switch
(
func
)
{
int
icside_dma_host_off
(
ide_drive_t
*
drive
)
case
ide_dma_off
:
{
printk
(
"%s: DMA disabled
\n
"
,
drive
->
name
)
;
return
0
;
/*FALLTHROUGH*/
}
case
ide_dma_off_quietly
:
int
icside_dma_off_quietly
(
ide_drive_t
*
drive
)
case
ide_dma_on
:
{
drive
->
using_dma
=
(
func
==
ide_dma_on
);
drive
->
using_dma
=
0
;
return
0
;
return
icside_dma_host_off
(
drive
);
}
case
ide_dma_check
:
int
icside_dma_off
(
ide_drive_t
*
drive
)
return
icside_dma_check
(
drive
);
{
printk
(
"%s: DMA disabled
\n
"
,
drive
->
name
);
return
icside_dma_off_quietly
(
drive
);
}
case
ide_dma_read
:
int
icside_dma_host_on
(
ide_drive_t
*
drive
)
reading
=
1
;
{
case
ide_dma_write
:
return
0
;
count
=
icside_build_dmatable
(
drive
,
reading
);
}
if
(
!
count
)
return
1
;
disable_dma
(
hwif
->
hw
.
dma
);
/* Route the DMA signals to
int
icside_dma_on
(
ide_drive_t
*
drive
)
* to the correct interface.
{
*/
drive
->
using_dma
=
1
;
OUT_BYTE
(
hwif
->
select_data
,
hwif
->
config_data
);
return
icside_dma_host_on
(
drive
);
}
/* Select the correct timing
int
icside_dma_begin
(
ide_drive_t
*
drive
)
* for this drive
{
*/
ide_hwif_t
*
hwif
=
HWIF
(
drive
);
set_dma_speed
(
hwif
->
hw
.
dma
,
drive
->
drive_data
);
enable_dma
(
hwif
->
hw
.
dma
);
return
0
;
}
set_dma_sg
(
hwif
->
hw
.
dma
,
HWIF
(
drive
)
->
sg_table
,
count
);
int
icside_dma_end
(
ide_drive_t
*
drive
)
set_dma_mode
(
hwif
->
hw
.
dma
,
reading
?
DMA_MODE_READ
{
:
DMA_MODE_WRITE
);
ide_hwif_t
*
hwif
=
HWIF
(
drive
);
drive
->
waiting_for_dma
=
0
;
disable_dma
(
hwif
->
hw
.
dma
);
icside_destroy_dmatable
(
drive
);
return
get_dma_residue
(
hwif
->
hw
.
dma
)
!=
0
;
}
drive
->
waiting_for_dma
=
1
;
int
icside_dma_count
(
ide_drive_t
*
drive
)
if
(
drive
->
media
!=
ide_disk
)
{
return
0
;
return
icside_dma_begin
(
drive
);
}
if
(
HWGROUP
(
drive
)
->
handler
!=
NULL
)
/* paranoia check */
int
icside_dma_read
(
ide_drive_t
*
drive
)
BUG
();
{
ide_set_handler
(
drive
,
&
icside_dmaintr
,
WAIT_CMD
,
NULL
);
ide_hwif_t
*
hwif
=
HWIF
(
drive
);
/*
// ide_task_t *args = HWGROUP(drive)->rq->special;
* FIX ME to use only ACB ide_task_t args Struct
int
count
=
0
;
*/
u8
lba48
=
(
drive
->
addressing
==
1
)
?
1
:
0
;
task_ioreg_t
command
=
WIN_NOP
;
count
=
icside_build_dmatable
(
drive
,
1
);
if
(
!
count
)
return
1
;
disable_dma
(
hwif
->
hw
.
dma
);
/* Route the DMA signals to
* to the correct interface.
*/
HWIF
(
drive
)
->
OUTB
(
hwif
->
select_data
,
hwif
->
config_data
);
/* Select the correct timing
* for this drive
*/
set_dma_speed
(
hwif
->
hw
.
dma
,
drive
->
drive_data
);
set_dma_sg
(
hwif
->
hw
.
dma
,
HWIF
(
drive
)
->
sg_table
,
count
);
set_dma_mode
(
hwif
->
hw
.
dma
,
DMA_MODE_READ
);
drive
->
waiting_for_dma
=
1
;
if
(
drive
->
media
!=
ide_disk
)
return
0
;
if
(
HWGROUP
(
drive
)
->
handler
!=
NULL
)
/* paranoia check */
BUG
();
ide_set_handler
(
drive
,
&
icside_dmaintr
,
WAIT_CMD
,
NULL
);
/*
* FIX ME to use only ACB ide_task_t args Struct
*/
#if 0
#if 0
{
{
ide_task_t *args = HWGROUP(drive)->rq->special;
ide_task_t *args = HWGROUP(drive)->rq->special;
OUT_BYTE(args->tfRegister[IDE_COMMAND_OFFSET], IDE_COMMAND_REG)
;
command = args->tfRegister[IDE_COMMAND_OFFSET]
;
}
}
#else
#else
if
(
HWGROUP
(
drive
)
->
rq
->
flags
==
REQ_DRIVE_TASKFILE
)
{
command
=
(
lba48
)
?
WIN_READDMA_EXT
:
WIN_READDMA
;
ide_task_t
*
args
=
HWGROUP
(
drive
)
->
rq
->
special
;
if
(
HWGROUP
(
drive
)
->
rq
->
flags
&
REQ_DRIVE_TASKFILE
)
{
OUT_BYTE
(
args
->
tfRegister
[
IDE_COMMAND_OFFSET
],
IDE_COMMAND_REG
);
ide_task_t
*
args
=
HWGROUP
(
drive
)
->
rq
->
special
;
}
else
if
(
drive
->
addressing
==
1
)
command
=
args
->
tfRegister
[
IDE_COMMAND_OFFSET
];
OUT_BYTE
(
reading
?
WIN_READDMA_EXT
:
WIN_WRITEDMA_EXT
,
IDE_COMMAND_REG
);
}
else
OUT_BYTE
(
reading
?
WIN_READDMA
:
WIN_WRITEDMA
,
IDE_COMMAND_REG
);
#endif
#endif
return
HWIF
(
drive
)
->
dmaproc
(
ide_dma_begin
,
drive
);
/* issue cmd to drive */
case
ide_dma_begin
:
HWIF
(
drive
)
->
OUTB
(
command
,
IDE_COMMAND_REG
);
enable_dma
(
hwif
->
hw
.
dma
);
return
0
;
return
icside_dma_count
(
drive
);
}
case
ide_dma_end
:
int
icside_dma_write
(
ide_drive_t
*
drive
)
drive
->
waiting_for_dma
=
0
;
{
disable_dma
(
hwif
->
hw
.
dma
);
ide_hwif_t
*
hwif
=
HWIF
(
drive
);
icside_destroy_dmatable
(
drive
);
// ide_task_t *args = HWGROUP(drive)->rq->special;
return
get_dma_residue
(
hwif
->
hw
.
dma
)
!=
0
;
int
count
=
0
;
u8
lba48
=
(
drive
->
addressing
==
1
)
?
1
:
0
;
task_ioreg_t
command
=
WIN_NOP
;
count
=
icside_build_dmatable
(
drive
,
0
);
if
(
!
count
)
return
1
;
disable_dma
(
hwif
->
hw
.
dma
);
/* Route the DMA signals to
* to the correct interface.
*/
HWIF
(
drive
)
->
OUTB
(
hwif
->
select_data
,
hwif
->
config_data
);
case
ide_dma_test_irq
:
/* Select the correct timing
return
IN_BYTE
((
unsigned
long
)
hwif
->
hw
.
priv
)
&
1
;
* for this drive
*/
set_dma_speed
(
hwif
->
hw
.
dma
,
drive
->
drive_data
);
case
ide_dma_bad_drive
:
set_dma_sg
(
hwif
->
hw
.
dma
,
HWIF
(
drive
)
->
sg_table
,
count
);
case
ide_dma_good_drive
:
set_dma_mode
(
hwif
->
hw
.
dma
,
DMA_MODE_WRITE
);
return
check_drive_lists
(
drive
,
(
func
==
ide_dma_good_drive
));
case
ide_dma_verbose
:
drive
->
waiting_for_dma
=
1
;
return
icside_dma_verbose
(
drive
);
if
(
drive
->
media
!=
ide_disk
)
return
0
;
case
ide_dma_timeout
:
if
(
HWGROUP
(
drive
)
->
handler
!=
NULL
)
default:
BUG
();
printk
(
"icside_dmaproc: unsupported %s func: %d
\n
"
,
ide_set_handler
(
drive
,
&
icside_dmaintr
,
WAIT_CMD
,
NULL
);
ide_dmafunc_verbose
(
func
),
func
);
/*
* FIX ME to use only ACB ide_task_t args Struct
*/
#if 0
{
ide_task_t *args = HWGROUP(drive)->rq->special;
command = args->tfRegister[IDE_COMMAND_OFFSET];
}
}
return
1
;
#else
command
=
(
lba48
)
?
WIN_WRITEDMA_EXT
:
WIN_WRITEDMA
;
if
(
HWGROUP
(
drive
)
->
rq
->
flags
&
REQ_DRIVE_TASKFILE
)
{
ide_task_t
*
args
=
HWGROUP
(
drive
)
->
rq
->
special
;
command
=
args
->
tfRegister
[
IDE_COMMAND_OFFSET
];
}
#endif
/* issue cmd to drive */
HWIF
(
drive
)
->
OUTB
(
command
,
IDE_COMMAND_REG
);
return
icside_dma_count
(
drive
);
}
}
static
int
static
int
...
@@ -595,9 +669,24 @@ icside_setup_dma(ide_hwif_t *hwif, int autodma)
...
@@ -595,9 +669,24 @@ icside_setup_dma(ide_hwif_t *hwif, int autodma)
hwif
->
dmatable_cpu
=
NULL
;
hwif
->
dmatable_cpu
=
NULL
;
hwif
->
dmatable_dma
=
0
;
hwif
->
dmatable_dma
=
0
;
hwif
->
speedproc
=
icside_set_speed
;
hwif
->
speedproc
=
icside_set_speed
;
hwif
->
dmaproc
=
icside_dmaproc
;
hwif
->
autodma
=
autodma
;
hwif
->
autodma
=
autodma
;
hwif
->
ide_dma_check
=
icside_dma_check
;
hwif
->
ide_dma_host_off
=
icside_dma_host_off
;
hwif
->
ide_dma_off_quietly
=
icside_dma_off_quietly
;
hwif
->
ide_dma_off
=
icside_dma_off
;
hwif
->
ide_dma_host_on
=
icside_dma_host_on
;
hwif
->
ide_dma_on
=
icside_dma_on
;
hwif
->
ide_dma_read
=
icside_dma_read
;
hwif
->
ide_dma_write
=
icside_dma_write
;
hwif
->
ide_dma_count
=
icside_dma_count
;
hwif
->
ide_dma_begin
=
icside_dma_begin
;
hwif
->
ide_dma_end
=
icside_dma_end
;
hwif
->
ide_dma_verbose
=
icside_dma_verbose
;
hwif
->
ide_dma_bad_drive
=
check_drive_bad_lists
;
hwif
->
ide_dma_good_drive
=
check_drive_good_lists
;
hwif
->
ide_dma_test_irq
=
icside_dma_test_irq
;
printk
(
" capable%s
\n
"
,
autodma
?
printk
(
" capable%s
\n
"
,
autodma
?
", auto-enable"
:
""
);
", auto-enable"
:
""
);
...
@@ -676,7 +765,7 @@ static int __init icside_register_v5(struct expansion_card *ec, int autodma)
...
@@ -676,7 +765,7 @@ static int __init icside_register_v5(struct expansion_card *ec, int autodma)
/*
/*
* Be on the safe side - disable interrupts
* Be on the safe side - disable interrupts
*/
*/
IN_BYTE
(
slot_port
+
ICS_ARCIN_V5_INTROFFSET
);
inb
(
slot_port
+
ICS_ARCIN_V5_INTROFFSET
);
hwif
=
icside_setup
(
slot_port
,
&
icside_cardinfo_v5
,
ec
->
irq
);
hwif
=
icside_setup
(
slot_port
,
&
icside_cardinfo_v5
,
ec
->
irq
);
...
@@ -697,7 +786,7 @@ static int __init icside_register_v6(struct expansion_card *ec, int autodma)
...
@@ -697,7 +786,7 @@ static int __init icside_register_v6(struct expansion_card *ec, int autodma)
else
else
sel
=
1
<<
5
;
sel
=
1
<<
5
;
OUT_BYTE
(
sel
,
slot_port
);
outb
(
sel
,
slot_port
);
ec
->
irq_data
=
(
void
*
)
port
;
ec
->
irq_data
=
(
void
*
)
port
;
ec
->
ops
=
(
expansioncard_ops_t
*
)
&
icside_ops_arcin_v6
;
ec
->
ops
=
(
expansioncard_ops_t
*
)
&
icside_ops_arcin_v6
;
...
@@ -705,8 +794,8 @@ static int __init icside_register_v6(struct expansion_card *ec, int autodma)
...
@@ -705,8 +794,8 @@ static int __init icside_register_v6(struct expansion_card *ec, int autodma)
/*
/*
* Be on the safe side - disable interrupts
* Be on the safe side - disable interrupts
*/
*/
IN_BYTE
(
port
+
ICS_ARCIN_V6_INTROFFSET_1
);
inb
(
port
+
ICS_ARCIN_V6_INTROFFSET_1
);
IN_BYTE
(
port
+
ICS_ARCIN_V6_INTROFFSET_2
);
inb
(
port
+
ICS_ARCIN_V6_INTROFFSET_2
);
hwif
=
icside_setup
(
port
,
&
icside_cardinfo_v6_1
,
ec
->
irq
);
hwif
=
icside_setup
(
port
,
&
icside_cardinfo_v6_1
,
ec
->
irq
);
mate
=
icside_setup
(
port
,
&
icside_cardinfo_v6_2
,
ec
->
irq
);
mate
=
icside_setup
(
port
,
&
icside_cardinfo_v6_2
,
ec
->
irq
);
...
@@ -724,6 +813,8 @@ static int __init icside_register_v6(struct expansion_card *ec, int autodma)
...
@@ -724,6 +813,8 @@ static int __init icside_register_v6(struct expansion_card *ec, int autodma)
(
port
+
ICS_ARCIN_V6_INTRSTAT_1
);
(
port
+
ICS_ARCIN_V6_INTRSTAT_1
);
hwif
->
channel
=
0
;
hwif
->
channel
=
0
;
icside_setup_dma
(
hwif
,
autodma
);
icside_setup_dma
(
hwif
,
autodma
);
hwif
->
drives
[
0
].
autodma
=
autodma
;
hwif
->
drives
[
1
].
autodma
=
autodma
;
}
}
if
(
mate
)
{
if
(
mate
)
{
mate
->
config_data
=
slot_port
;
mate
->
config_data
=
slot_port
;
...
@@ -733,6 +824,8 @@ static int __init icside_register_v6(struct expansion_card *ec, int autodma)
...
@@ -733,6 +824,8 @@ static int __init icside_register_v6(struct expansion_card *ec, int autodma)
(
port
+
ICS_ARCIN_V6_INTRSTAT_2
);
(
port
+
ICS_ARCIN_V6_INTRSTAT_2
);
mate
->
channel
=
1
;
mate
->
channel
=
1
;
icside_setup_dma
(
mate
,
autodma
);
icside_setup_dma
(
mate
,
autodma
);
mate
->
drives
[
0
].
autodma
=
autodma
;
mate
->
drives
[
1
].
autodma
=
autodma
;
}
}
}
}
no_dma:
no_dma:
...
...
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