Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
39f6e22a
Commit
39f6e22a
authored
Jun 27, 2003
by
Richard Henderson
Browse files
Options
Browse Files
Download
Plain Diff
Merge
ssh://kanga/work/linux/axp-2.5
into are.twiddle.net:/home/rth/BK/axp-2.5
parents
788fbf37
f727aff5
Changes
7
Show whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
120 additions
and
189 deletions
+120
-189
drivers/ide/ide-dma.c
drivers/ide/ide-dma.c
+9
-21
drivers/ide/ide-io.c
drivers/ide/ide-io.c
+2
-2
drivers/ide/ide-probe.c
drivers/ide/ide-probe.c
+6
-80
drivers/ide/ide-taskfile.c
drivers/ide/ide-taskfile.c
+6
-65
drivers/ide/ide-tcq.c
drivers/ide/ide-tcq.c
+11
-4
drivers/ide/ide.c
drivers/ide/ide.c
+84
-15
include/linux/ide.h
include/linux/ide.h
+2
-2
No files found.
drivers/ide/ide-dma.c
View file @
39f6e22a
...
@@ -250,6 +250,9 @@ static int ide_raw_build_sglist (ide_drive_t *drive, struct request *rq)
...
@@ -250,6 +250,9 @@ static int ide_raw_build_sglist (ide_drive_t *drive, struct request *rq)
BUG
();
BUG
();
if
(
sector_count
>
128
)
{
if
(
sector_count
>
128
)
{
#else
while
(
sector_count
>
128
)
{
#endif
memset
(
&
sg
[
nents
],
0
,
sizeof
(
*
sg
));
memset
(
&
sg
[
nents
],
0
,
sizeof
(
*
sg
));
sg
[
nents
].
page
=
virt_to_page
(
virt_addr
);
sg
[
nents
].
page
=
virt_to_page
(
virt_addr
);
sg
[
nents
].
offset
=
(
unsigned
long
)
virt_addr
&
~
PAGE_MASK
;
sg
[
nents
].
offset
=
(
unsigned
long
)
virt_addr
&
~
PAGE_MASK
;
...
@@ -263,22 +266,7 @@ static int ide_raw_build_sglist (ide_drive_t *drive, struct request *rq)
...
@@ -263,22 +266,7 @@ static int ide_raw_build_sglist (ide_drive_t *drive, struct request *rq)
sg
[
nents
].
offset
=
(
unsigned
long
)
virt_addr
&
~
PAGE_MASK
;
sg
[
nents
].
offset
=
(
unsigned
long
)
virt_addr
&
~
PAGE_MASK
;
sg
[
nents
].
length
=
sector_count
*
SECTOR_SIZE
;
sg
[
nents
].
length
=
sector_count
*
SECTOR_SIZE
;
nents
++
;
nents
++
;
#else
while
(
sector_count
>
128
)
{
memset
(
&
sg
[
nents
],
0
,
sizeof
(
*
sg
));
sg
[
nents
].
address
=
virt_to_page
(
virt_addr
);
sg
[
nents
].
offset
=
(
unsigned
long
)
virt_addr
&
~
PAGE_MASK
;
sg
[
nents
].
length
=
128
*
SECTOR_SIZE
;
nents
++
;
virt_addr
=
virt_addr
+
(
128
*
SECTOR_SIZE
);
sector_count
-=
128
;
};
memset
(
&
sg
[
nents
],
0
,
sizeof
(
*
sg
));
sg
[
nents
].
page
=
virt_to_page
(
virt_addr
);
sg
[
nents
].
offset
=
(
unsigned
long
)
virt_addr
&
~
PAGE_MASK
;
sg
[
nents
].
length
=
sector_count
*
SECTOR_SIZE
;
nents
++
;
#endif
return
pci_map_sg
(
hwif
->
pci_dev
,
sg
,
nents
,
hwif
->
sg_dma_direction
);
return
pci_map_sg
(
hwif
->
pci_dev
,
sg
,
nents
,
hwif
->
sg_dma_direction
);
}
}
...
@@ -523,7 +511,6 @@ int __ide_dma_off_quietly (ide_drive_t *drive)
...
@@ -523,7 +511,6 @@ int __ide_dma_off_quietly (ide_drive_t *drive)
if
(
HWIF
(
drive
)
->
ide_dma_host_off
(
drive
))
if
(
HWIF
(
drive
)
->
ide_dma_host_off
(
drive
))
return
1
;
return
1
;
if
(
drive
->
queue_setup
)
HWIF
(
drive
)
->
ide_dma_queued_off
(
drive
);
HWIF
(
drive
)
->
ide_dma_queued_off
(
drive
);
return
0
;
return
0
;
...
@@ -585,8 +572,9 @@ int __ide_dma_on (ide_drive_t *drive)
...
@@ -585,8 +572,9 @@ int __ide_dma_on (ide_drive_t *drive)
if
(
HWIF
(
drive
)
->
ide_dma_host_on
(
drive
))
if
(
HWIF
(
drive
)
->
ide_dma_host_on
(
drive
))
return
1
;
return
1
;
if
(
drive
->
queue_setup
)
#ifdef CONFIG_BLK_DEV_IDE_TCQ_DEFAULT
HWIF
(
drive
)
->
ide_dma_queued_on
(
drive
);
HWIF
(
drive
)
->
ide_dma_queued_on
(
drive
);
#endif
return
0
;
return
0
;
}
}
...
...
drivers/ide/ide-io.c
View file @
39f6e22a
...
@@ -1264,7 +1264,7 @@ irqreturn_t ide_intr (int irq, void *dev_id, struct pt_regs *regs)
...
@@ -1264,7 +1264,7 @@ irqreturn_t ide_intr (int irq, void *dev_id, struct pt_regs *regs)
#endif
/* CONFIG_BLK_DEV_IDEPCI */
#endif
/* CONFIG_BLK_DEV_IDEPCI */
}
}
spin_unlock_irqrestore
(
&
ide_lock
,
flags
);
spin_unlock_irqrestore
(
&
ide_lock
,
flags
);
return
IRQ_
HANDLED
;
return
IRQ_
NONE
;
}
}
drive
=
hwgroup
->
drive
;
drive
=
hwgroup
->
drive
;
if
(
!
drive
)
{
if
(
!
drive
)
{
...
@@ -1286,7 +1286,7 @@ irqreturn_t ide_intr (int irq, void *dev_id, struct pt_regs *regs)
...
@@ -1286,7 +1286,7 @@ irqreturn_t ide_intr (int irq, void *dev_id, struct pt_regs *regs)
* enough advance overhead that the latter isn't a problem.
* enough advance overhead that the latter isn't a problem.
*/
*/
spin_unlock_irqrestore
(
&
ide_lock
,
flags
);
spin_unlock_irqrestore
(
&
ide_lock
,
flags
);
return
IRQ_
HANDLED
;
return
IRQ_
NONE
;
}
}
if
(
!
hwgroup
->
busy
)
{
if
(
!
hwgroup
->
busy
)
{
hwgroup
->
busy
=
1
;
/* paranoia */
hwgroup
->
busy
=
1
;
/* paranoia */
...
...
drivers/ide/ide-probe.c
View file @
39f6e22a
...
@@ -634,64 +634,8 @@ static inline u8 probe_for_drive (ide_drive_t *drive)
...
@@ -634,64 +634,8 @@ static inline u8 probe_for_drive (ide_drive_t *drive)
return
drive
->
present
;
return
drive
->
present
;
}
}
static
int
hwif_check_region
(
ide_hwif_t
*
hwif
,
unsigned
long
addr
,
int
num
)
{
int
err
;
if
(
hwif
->
mmio
)
err
=
check_mem_region
(
addr
,
num
);
else
err
=
check_region
(
addr
,
num
);
if
(
err
)
{
printk
(
"%s: %s resource 0x%lX-0x%lX not free.
\n
"
,
hwif
->
name
,
hwif
->
mmio
?
"MMIO"
:
"I/O"
,
addr
,
addr
+
num
-
1
);
}
return
err
;
}
/**
* hwif_check_regions - check resources for IDE
* @hwif: interface to use
*
* Checks if all the needed resources for an interface are free
* providing the interface is PIO. Right now core IDE code does
* this work which is deeply wrong. MMIO leaves it to the controller
* driver, PIO will migrate this way over time
*/
static
int
hwif_check_regions
(
ide_hwif_t
*
hwif
)
{
u32
i
=
0
;
int
addr_errs
=
0
;
if
(
hwif
->
mmio
==
2
)
return
0
;
addr_errs
=
hwif_check_region
(
hwif
,
hwif
->
io_ports
[
IDE_DATA_OFFSET
],
1
);
for
(
i
=
IDE_ERROR_OFFSET
;
i
<=
IDE_STATUS_OFFSET
;
i
++
)
addr_errs
+=
hwif_check_region
(
hwif
,
hwif
->
io_ports
[
i
],
1
);
if
(
hwif
->
io_ports
[
IDE_CONTROL_OFFSET
])
addr_errs
+=
hwif_check_region
(
hwif
,
hwif
->
io_ports
[
IDE_CONTROL_OFFSET
],
1
);
#if defined(CONFIG_AMIGA) || defined(CONFIG_MAC)
if
(
hwif
->
io_ports
[
IDE_IRQ_OFFSET
])
addr_errs
+=
hwif_check_region
(
hwif
,
hwif
->
io_ports
[
IDE_IRQ_OFFSET
],
1
);
#endif
/* (CONFIG_AMIGA) || (CONFIG_MAC) */
/* If any errors are return, we drop the hwif interface. */
hwif
->
straight8
=
0
;
return
(
addr_errs
);
}
//EXPORT_SYMBOL(hwif_check_regions);
#define hwif_request_region(addr, num, name) \
((hwif->mmio) ? request_mem_region((addr),(num),(name)) : request_region((addr),(num),(name)))
static
void
hwif_register
(
ide_hwif_t
*
hwif
)
static
void
hwif_register
(
ide_hwif_t
*
hwif
)
{
{
u32
i
=
0
;
/* register with global device tree */
/* register with global device tree */
strlcpy
(
hwif
->
gendev
.
bus_id
,
hwif
->
name
,
BUS_ID_SIZE
);
strlcpy
(
hwif
->
gendev
.
bus_id
,
hwif
->
name
,
BUS_ID_SIZE
);
snprintf
(
hwif
->
gendev
.
name
,
DEVICE_NAME_SIZE
,
"IDE Controller"
);
snprintf
(
hwif
->
gendev
.
name
,
DEVICE_NAME_SIZE
,
"IDE Controller"
);
...
@@ -701,24 +645,6 @@ static void hwif_register (ide_hwif_t *hwif)
...
@@ -701,24 +645,6 @@ static void hwif_register (ide_hwif_t *hwif)
else
else
hwif
->
gendev
.
parent
=
NULL
;
/* Would like to do = &device_legacy */
hwif
->
gendev
.
parent
=
NULL
;
/* Would like to do = &device_legacy */
device_register
(
&
hwif
->
gendev
);
device_register
(
&
hwif
->
gendev
);
if
(
hwif
->
mmio
==
2
)
return
;
if
(
hwif
->
io_ports
[
IDE_CONTROL_OFFSET
])
hwif_request_region
(
hwif
->
io_ports
[
IDE_CONTROL_OFFSET
],
1
,
hwif
->
name
);
#if defined(CONFIG_AMIGA) || defined(CONFIG_MAC)
if
(
hwif
->
io_ports
[
IDE_IRQ_OFFSET
])
hwif_request_region
(
hwif
->
io_ports
[
IDE_IRQ_OFFSET
],
1
,
hwif
->
name
);
#endif
/* (CONFIG_AMIGA) || (CONFIG_MAC) */
if
(((
unsigned
long
)
hwif
->
io_ports
[
IDE_DATA_OFFSET
]
|
7
)
==
((
unsigned
long
)
hwif
->
io_ports
[
IDE_STATUS_OFFSET
]))
{
hwif_request_region
(
hwif
->
io_ports
[
IDE_DATA_OFFSET
],
8
,
hwif
->
name
);
hwif
->
straight8
=
1
;
return
;
}
for
(
i
=
IDE_DATA_OFFSET
;
i
<=
IDE_STATUS_OFFSET
;
i
++
)
hwif_request_region
(
hwif
->
io_ports
[
i
],
1
,
hwif
->
name
);
}
}
//EXPORT_SYMBOL(hwif_register);
//EXPORT_SYMBOL(hwif_register);
...
@@ -778,7 +704,7 @@ void probe_hwif (ide_hwif_t *hwif)
...
@@ -778,7 +704,7 @@ void probe_hwif (ide_hwif_t *hwif)
#ifdef CONFIG_BLK_DEV_PDC4030
#ifdef CONFIG_BLK_DEV_PDC4030
(
hwif
->
chipset
!=
ide_pdc4030
||
hwif
->
channel
==
0
)
&&
(
hwif
->
chipset
!=
ide_pdc4030
||
hwif
->
channel
==
0
)
&&
#endif
/* CONFIG_BLK_DEV_PDC4030 */
#endif
/* CONFIG_BLK_DEV_PDC4030 */
(
hwif_check
_regions
(
hwif
)))
{
(
ide_hwif_request
_regions
(
hwif
)))
{
u16
msgout
=
0
;
u16
msgout
=
0
;
for
(
unit
=
0
;
unit
<
MAX_DRIVES
;
++
unit
)
{
for
(
unit
=
0
;
unit
<
MAX_DRIVES
;
++
unit
)
{
ide_drive_t
*
drive
=
&
hwif
->
drives
[
unit
];
ide_drive_t
*
drive
=
&
hwif
->
drives
[
unit
];
...
@@ -869,6 +795,11 @@ void probe_hwif (ide_hwif_t *hwif)
...
@@ -869,6 +795,11 @@ void probe_hwif (ide_hwif_t *hwif)
if
(
irqd
)
if
(
irqd
)
enable_irq
(
irqd
);
enable_irq
(
irqd
);
if
(
!
hwif
->
present
)
{
ide_hwif_release_regions
(
hwif
);
return
;
}
for
(
unit
=
0
;
unit
<
MAX_DRIVES
;
++
unit
)
{
for
(
unit
=
0
;
unit
<
MAX_DRIVES
;
++
unit
)
{
ide_drive_t
*
drive
=
&
hwif
->
drives
[
unit
];
ide_drive_t
*
drive
=
&
hwif
->
drives
[
unit
];
int
enable_dma
=
1
;
int
enable_dma
=
1
;
...
@@ -983,7 +914,6 @@ static void ide_init_queue(ide_drive_t *drive)
...
@@ -983,7 +914,6 @@ static void ide_init_queue(ide_drive_t *drive)
blk_init_queue
(
q
,
do_ide_request
,
&
ide_lock
);
blk_init_queue
(
q
,
do_ide_request
,
&
ide_lock
);
q
->
queuedata
=
HWGROUP
(
drive
);
q
->
queuedata
=
HWGROUP
(
drive
);
drive
->
queue_setup
=
1
;
blk_queue_segment_boundary
(
q
,
0xffff
);
blk_queue_segment_boundary
(
q
,
0xffff
);
if
(
!
hwif
->
rqsize
)
if
(
!
hwif
->
rqsize
)
...
@@ -1005,10 +935,6 @@ static void ide_init_queue(ide_drive_t *drive)
...
@@ -1005,10 +935,6 @@ static void ide_init_queue(ide_drive_t *drive)
static
void
ide_init_drive
(
ide_drive_t
*
drive
)
static
void
ide_init_drive
(
ide_drive_t
*
drive
)
{
{
ide_toggle_bounce
(
drive
,
1
);
ide_toggle_bounce
(
drive
,
1
);
#ifdef CONFIG_BLK_DEV_IDE_TCQ_DEFAULT
HWIF
(
drive
)
->
ide_dma_queued_on
(
drive
);
#endif
}
}
/*
/*
...
...
drivers/ide/ide-taskfile.c
View file @
39f6e22a
...
@@ -954,6 +954,9 @@ ide_startstop_t pre_task_out_intr (ide_drive_t *drive, struct request *rq)
...
@@ -954,6 +954,9 @@ ide_startstop_t pre_task_out_intr (ide_drive_t *drive, struct request *rq)
return
startstop
;
return
startstop
;
}
}
if
(
!
drive
->
unmask
)
local_irq_disable
();
return
task_out_intr
(
drive
);
return
task_out_intr
(
drive
);
}
}
EXPORT_SYMBOL
(
pre_task_out_intr
);
EXPORT_SYMBOL
(
pre_task_out_intr
);
...
@@ -1030,6 +1033,9 @@ ide_startstop_t pre_task_mulout_intr (ide_drive_t *drive, struct request *rq)
...
@@ -1030,6 +1033,9 @@ ide_startstop_t pre_task_mulout_intr (ide_drive_t *drive, struct request *rq)
return
startstop
;
return
startstop
;
}
}
if
(
!
drive
->
unmask
)
local_irq_disable
();
return
task_mulout_intr
(
drive
);
return
task_mulout_intr
(
drive
);
}
}
EXPORT_SYMBOL
(
pre_task_mulout_intr
);
EXPORT_SYMBOL
(
pre_task_mulout_intr
);
...
@@ -1361,8 +1367,6 @@ void ide_init_drive_taskfile (struct request *rq)
...
@@ -1361,8 +1367,6 @@ void ide_init_drive_taskfile (struct request *rq)
EXPORT_SYMBOL
(
ide_init_drive_taskfile
);
EXPORT_SYMBOL
(
ide_init_drive_taskfile
);
#if 1
int
ide_diag_taskfile
(
ide_drive_t
*
drive
,
ide_task_t
*
args
,
unsigned
long
data_size
,
u8
*
buf
)
int
ide_diag_taskfile
(
ide_drive_t
*
drive
,
ide_task_t
*
args
,
unsigned
long
data_size
,
u8
*
buf
)
{
{
struct
request
rq
;
struct
request
rq
;
...
@@ -1401,69 +1405,6 @@ int ide_diag_taskfile (ide_drive_t *drive, ide_task_t *args, unsigned long data_
...
@@ -1401,69 +1405,6 @@ int ide_diag_taskfile (ide_drive_t *drive, ide_task_t *args, unsigned long data_
return
ide_do_drive_cmd
(
drive
,
&
rq
,
ide_wait
);
return
ide_do_drive_cmd
(
drive
,
&
rq
,
ide_wait
);
}
}
#else
int
ide_diag_taskfile
(
ide_drive_t
*
drive
,
ide_task_t
*
args
,
unsigned
long
data_size
,
u8
*
buf
)
{
struct
request
*
rq
;
unsigned
long
flags
;
ide_hwgroup_t
*
hwgroup
=
HWGROUP
(
drive
);
struct
list_head
*
queue_head
=
&
drive
->
queue
.
queue_head
;
DECLARE_COMPLETION
(
wait
);
if
(
HWIF
(
drive
)
->
chipset
==
ide_pdc4030
&&
buf
!=
NULL
)
return
-
ENOSYS
;
/* special drive cmds not supported */
memset
(
rq
,
0
,
sizeof
(
*
rq
));
rq
->
flags
=
REQ_DRIVE_TASKFILE
;
rq
->
buffer
=
buf
;
/*
* (ks) We transfer currently only whole sectors.
* This is suffient for now. But, it would be great,
* if we would find a solution to transfer any size.
* To support special commands like READ LONG.
*/
if
(
args
->
command_type
!=
IDE_DRIVE_TASK_NO_DATA
)
{
if
(
data_size
==
0
)
{
ata_nsector_t
nsector
;
nsector
.
b
.
low
=
args
->
hobRegister
[
IDE_NSECTOR_OFFSET_HOB
];
nsector
.
b
.
high
=
args
->
tfRegister
[
IDE_NSECTOR_OFFSET
];
rq
.
nr_sectors
=
nsector
.
all
;
}
else
{
rq
.
nr_sectors
=
data_size
/
SECTOR_SIZE
;
}
rq
.
current_nr_sectors
=
rq
.
nr_sectors
;
// rq.hard_cur_sectors = rq.nr_sectors;
}
if
(
args
->
tf_out_flags
.
all
==
0
)
{
/*
* clean up kernel settings for driver sanity, regardless.
* except for discrete diag services.
*/
args
->
posthandler
=
ide_post_handler_parser
(
(
struct
hd_drive_task_hdr
*
)
args
->
tfRegister
,
(
struct
hd_drive_hob_hdr
*
)
args
->
hobRegister
);
}
rq
->
special
=
args
;
rq
->
errors
=
0
;
rq
->
rq_status
=
RQ_ACTIVE
;
rq
->
rq_disk
=
drive
->
disk
;
rq
->
waiting
=
&
wait
;
spin_lock_irqsave
(
&
ide_lock
,
flags
);
queue_head
=
queue_head
->
prev
;
list_add
(
&
rq
->
queue
,
queue_head
);
ide_do_request
(
hwgroup
,
0
);
spin_unlock_irqrestore
(
&
ide_lock
,
flags
);
wait_for_completion
(
&
wait
);
/* wait for it to be serviced */
return
rq
->
errors
?
-
EIO
:
0
;
/* return -EIO if errors */
}
#endif
EXPORT_SYMBOL
(
ide_diag_taskfile
);
EXPORT_SYMBOL
(
ide_diag_taskfile
);
int
ide_raw_taskfile
(
ide_drive_t
*
drive
,
ide_task_t
*
args
,
u8
*
buf
)
int
ide_raw_taskfile
(
ide_drive_t
*
drive
,
ide_task_t
*
args
,
u8
*
buf
)
...
...
drivers/ide/ide-tcq.c
View file @
39f6e22a
...
@@ -501,8 +501,10 @@ static int ide_tcq_configure(ide_drive_t *drive)
...
@@ -501,8 +501,10 @@ static int ide_tcq_configure(ide_drive_t *drive)
* bit 14 and 1 must be set in word 83 of the device id to indicate
* bit 14 and 1 must be set in word 83 of the device id to indicate
* support for dma queued protocol, and bit 15 must be cleared
* support for dma queued protocol, and bit 15 must be cleared
*/
*/
if
((
drive
->
id
->
command_set_2
&
tcq_bits
)
^
tcq_mask
)
if
((
drive
->
id
->
command_set_2
&
tcq_bits
)
^
tcq_mask
)
{
printk
(
KERN_INFO
"%s: TCQ not supported
\n
"
,
drive
->
name
);
return
-
EIO
;
return
-
EIO
;
}
args
=
kmalloc
(
sizeof
(
*
args
),
GFP_ATOMIC
);
args
=
kmalloc
(
sizeof
(
*
args
),
GFP_ATOMIC
);
if
(
!
args
)
if
(
!
args
)
...
@@ -655,21 +657,24 @@ static int ide_tcq_check_blacklist(ide_drive_t *drive)
...
@@ -655,21 +657,24 @@ static int ide_tcq_check_blacklist(ide_drive_t *drive)
int
__ide_dma_queued_on
(
ide_drive_t
*
drive
)
int
__ide_dma_queued_on
(
ide_drive_t
*
drive
)
{
{
ide_hwif_t
*
hwif
=
HWIF
(
drive
);
if
(
drive
->
media
!=
ide_disk
)
return
1
;
if
(
!
drive
->
using_dma
)
if
(
!
drive
->
using_dma
)
return
1
;
return
1
;
if
(
HWIF
(
drive
)
->
chipset
==
ide_pdc4030
)
if
(
hwif
->
chipset
==
ide_pdc4030
)
return
1
;
return
1
;
if
(
ide_tcq_check_blacklist
(
drive
))
{
if
(
ide_tcq_check_blacklist
(
drive
))
{
printk
(
KERN_WARNING
"%s: tcq forbidden by blacklist
\n
"
,
printk
(
KERN_WARNING
"%s: tcq forbidden by blacklist
\n
"
,
drive
->
name
);
drive
->
name
);
return
1
;
return
1
;
}
}
if
(
drive
->
next
!=
drive
)
{
if
(
hwif
->
drives
[
0
].
present
&&
hwif
->
drives
[
1
].
present
)
{
printk
(
KERN_WARNING
"%s: only one drive on a channel supported"
printk
(
KERN_WARNING
"%s: only one drive on a channel supported"
" for tcq
\n
"
,
drive
->
name
);
" for tcq
\n
"
,
drive
->
name
);
return
1
;
return
1
;
}
}
if
(
ata_pending_commands
(
drive
))
{
if
(
ata_pending_commands
(
drive
))
{
printk
(
KERN_WARNING
"ide-tcq; can't toggle tcq feature on "
printk
(
KERN_WARNING
"ide-tcq; can't toggle tcq feature on "
"busy drive
\n
"
);
"busy drive
\n
"
);
...
@@ -681,6 +686,8 @@ int __ide_dma_queued_on(ide_drive_t *drive)
...
@@ -681,6 +686,8 @@ int __ide_dma_queued_on(ide_drive_t *drive)
int
__ide_dma_queued_off
(
ide_drive_t
*
drive
)
int
__ide_dma_queued_off
(
ide_drive_t
*
drive
)
{
{
if
(
drive
->
media
!=
ide_disk
)
return
1
;
if
(
ata_pending_commands
(
drive
))
{
if
(
ata_pending_commands
(
drive
))
{
printk
(
"ide-tcq; can't toggle tcq feature on busy drive
\n
"
);
printk
(
"ide-tcq; can't toggle tcq feature on busy drive
\n
"
);
return
1
;
return
1
;
...
...
drivers/ide/ide.c
View file @
39f6e22a
...
@@ -508,12 +508,87 @@ ide_proc_entry_t generic_subdriver_entries[] = {
...
@@ -508,12 +508,87 @@ ide_proc_entry_t generic_subdriver_entries[] = {
};
};
#endif
#endif
static
struct
resource
*
hwif_request_region
(
ide_hwif_t
*
hwif
,
unsigned
long
addr
,
int
num
)
{
struct
resource
*
res
;
if
(
hwif
->
mmio
)
res
=
request_mem_region
(
addr
,
num
,
hwif
->
name
);
else
res
=
request_region
(
addr
,
num
,
hwif
->
name
);
if
(
!
res
)
printk
(
KERN_ERR
"%s: %s resource 0x%lX-0x%lX not free.
\n
"
,
hwif
->
name
,
hwif
->
mmio
?
"MMIO"
:
"I/O"
,
addr
,
addr
+
num
-
1
);
return
res
;
}
#define hwif_release_region(addr, num) \
#define hwif_release_region(addr, num) \
((hwif->mmio) ? release_mem_region((addr),(num)) : release_region((addr),(num)))
((hwif->mmio) ? release_mem_region((addr),(num)) : release_region((addr),(num)))
/**
/**
* hwif_unregister - free IDE resources
* ide_hwif_request_regions - request resources for IDE
* @hwif: interface to use
*
* Requests all the needed resources for an interface.
* Right now core IDE code does this work which is deeply wrong.
* MMIO leaves it to the controller driver,
* PIO will migrate this way over time.
*/
int
ide_hwif_request_regions
(
ide_hwif_t
*
hwif
)
{
unsigned
long
addr
;
unsigned
int
i
;
if
(
hwif
->
mmio
==
2
)
return
0
;
addr
=
hwif
->
io_ports
[
IDE_CONTROL_OFFSET
];
if
(
addr
&&
!
hwif_request_region
(
hwif
,
addr
,
1
))
goto
control_region_busy
;
#if defined(CONFIG_AMIGA) || defined(CONFIG_MAC)
addr
=
hwif
->
io_ports
[
IDE_IRQ_OFFSET
];
if
(
addr
&&
!
hwif_request_region
(
hwif
,
addr
,
1
))
goto
irq_region_busy
;
#endif
/* (CONFIG_AMIGA) || (CONFIG_MAC) */
hwif
->
straight8
=
0
;
addr
=
hwif
->
io_ports
[
IDE_DATA_OFFSET
];
if
((
addr
|
7
)
==
hwif
->
io_ports
[
IDE_STATUS_OFFSET
])
{
if
(
!
hwif_request_region
(
hwif
,
addr
,
8
))
goto
data_region_busy
;
hwif
->
straight8
=
1
;
return
0
;
}
for
(
i
=
IDE_DATA_OFFSET
;
i
<=
IDE_STATUS_OFFSET
;
i
++
)
{
addr
=
hwif
->
io_ports
[
i
];
if
(
!
hwif_request_region
(
hwif
,
addr
,
1
))
{
while
(
--
i
)
hwif_release_region
(
addr
,
1
);
goto
data_region_busy
;
}
}
return
0
;
data_region_busy:
#if defined(CONFIG_AMIGA) || defined(CONFIG_MAC)
addr
=
hwif
->
io_ports
[
IDE_IRQ_OFFSET
];
if
(
addr
)
hwif_release_region
(
addr
,
1
);
irq_region_busy:
#endif
/* (CONFIG_AMIGA) || (CONFIG_MAC) */
addr
=
hwif
->
io_ports
[
IDE_CONTROL_OFFSET
];
if
(
addr
)
hwif_release_region
(
addr
,
1
);
control_region_busy:
/* If any errors are return, we drop the hwif interface. */
return
-
EBUSY
;
}
EXPORT_SYMBOL
(
ide_hwif_request_regions
);
/**
* ide_hwif_release_regions - free IDE resources
*
*
* Note that we only release the standard ports,
* Note that we only release the standard ports,
* and do not even try to handle any extra ports
* and do not even try to handle any extra ports
...
@@ -523,8 +598,7 @@ ide_proc_entry_t generic_subdriver_entries[] = {
...
@@ -523,8 +598,7 @@ ide_proc_entry_t generic_subdriver_entries[] = {
* importantly our caller should be doing this so we need to
* importantly our caller should be doing this so we need to
* restructure this as a helper function for drivers.
* restructure this as a helper function for drivers.
*/
*/
void
ide_hwif_release_regions
(
ide_hwif_t
*
hwif
)
void
hwif_unregister
(
ide_hwif_t
*
hwif
)
{
{
u32
i
=
0
;
u32
i
=
0
;
...
@@ -548,7 +622,7 @@ void hwif_unregister (ide_hwif_t *hwif)
...
@@ -548,7 +622,7 @@ void hwif_unregister (ide_hwif_t *hwif)
}
}
}
}
EXPORT_SYMBOL
(
hwif_unregister
);
EXPORT_SYMBOL
(
ide_hwif_release_regions
);
extern
void
init_hwif_data
(
unsigned
int
index
);
extern
void
init_hwif_data
(
unsigned
int
index
);
...
@@ -635,7 +709,7 @@ void ide_unregister (unsigned int index)
...
@@ -635,7 +709,7 @@ void ide_unregister (unsigned int index)
* and do not even try to handle any extra ports
* and do not even try to handle any extra ports
* allocated for weird IDE interface chipsets.
* allocated for weird IDE interface chipsets.
*/
*/
hwif_unregister
(
hwif
);
ide_hwif_release_regions
(
hwif
);
/*
/*
* Remove us from the hwgroup, and free
* Remove us from the hwgroup, and free
...
@@ -2098,10 +2172,9 @@ int __init ide_setup (char *s)
...
@@ -2098,10 +2172,9 @@ int __init ide_setup (char *s)
#ifdef CONFIG_BLK_DEV_IDEPCI
#ifdef CONFIG_BLK_DEV_IDEPCI
hwif
->
udma_four
=
1
;
hwif
->
udma_four
=
1
;
goto
done
;
goto
done
;
#else
/* !CONFIG_BLK_DEV_IDEPCI */
#else
hwif
->
udma_four
=
0
;
goto
bad_hwif
;
goto
bad_hwif
;
#endif
/* CONFIG_BLK_DEV_IDEPCI */
#endif
case
-
6
:
/* dma */
case
-
6
:
/* dma */
hwif
->
autodma
=
1
;
hwif
->
autodma
=
1
;
goto
done
;
goto
done
;
...
@@ -2520,13 +2593,9 @@ struct bus_type ide_bus_type = {
...
@@ -2520,13 +2593,9 @@ struct bus_type ide_bus_type = {
*/
*/
int
__init
ide_init
(
void
)
int
__init
ide_init
(
void
)
{
{
static
char
banner_printed
;
if
(
!
banner_printed
)
{
printk
(
KERN_INFO
"Uniform Multi-Platform E-IDE driver "
REVISION
"
\n
"
);
printk
(
KERN_INFO
"Uniform Multi-Platform E-IDE driver "
REVISION
"
\n
"
);
devfs_mk_dir
(
"ide"
);
devfs_mk_dir
(
"ide"
);
system_bus_speed
=
ide_system_bus_speed
();
system_bus_speed
=
ide_system_bus_speed
();
banner_printed
=
1
;
}
bus_register
(
&
ide_bus_type
);
bus_register
(
&
ide_bus_type
);
...
...
include/linux/ide.h
View file @
39f6e22a
...
@@ -726,7 +726,6 @@ typedef struct ide_drive_s {
...
@@ -726,7 +726,6 @@ typedef struct ide_drive_s {
unsigned
ata_flash
:
1
;
/* 1=present, 0=default */
unsigned
ata_flash
:
1
;
/* 1=present, 0=default */
unsigned
blocked
:
1
;
/* 1=powermanagment told us not to do anything, so sleep nicely */
unsigned
blocked
:
1
;
/* 1=powermanagment told us not to do anything, so sleep nicely */
unsigned
vdma
:
1
;
/* 1=doing PIO over DMA 0=doing normal DMA */
unsigned
vdma
:
1
;
/* 1=doing PIO over DMA 0=doing normal DMA */
unsigned
queue_setup
:
1
;
unsigned
addressing
;
/* : 3;
unsigned
addressing
;
/* : 3;
* 0=28-bit
* 0=28-bit
* 1=48-bit
* 1=48-bit
...
@@ -1777,7 +1776,8 @@ static inline int __ide_dma_queued_off(ide_drive_t *drive)
...
@@ -1777,7 +1776,8 @@ static inline int __ide_dma_queued_off(ide_drive_t *drive)
static
inline
void
ide_release_dma
(
ide_hwif_t
*
drive
)
{;}
static
inline
void
ide_release_dma
(
ide_hwif_t
*
drive
)
{;}
#endif
#endif
extern
void
hwif_unregister
(
ide_hwif_t
*
);
extern
int
ide_hwif_request_regions
(
ide_hwif_t
*
hwif
);
extern
void
ide_hwif_release_regions
(
ide_hwif_t
*
hwif
);
extern
void
ide_unregister
(
unsigned
int
index
);
extern
void
ide_unregister
(
unsigned
int
index
);
extern
void
export_ide_init_queue
(
ide_drive_t
*
);
extern
void
export_ide_init_queue
(
ide_drive_t
*
);
...
...
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