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
22e9af4e
Commit
22e9af4e
authored
Mar 14, 2004
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
bk://kernel.bkbits.net/davem/sparc-2.6
into ppc970.osdl.org:/home/torvalds/v2.5/linux
parents
558dadec
333876f3
Changes
13
Hide whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
136 additions
and
790 deletions
+136
-790
drivers/ide/ide-disk.c
drivers/ide/ide-disk.c
+84
-64
drivers/ide/ide-io.c
drivers/ide/ide-io.c
+7
-7
drivers/ide/ide-taskfile.c
drivers/ide/ide-taskfile.c
+11
-347
drivers/ide/ide-tcq.c
drivers/ide/ide-tcq.c
+7
-4
drivers/ide/legacy/pdc4030.c
drivers/ide/legacy/pdc4030.c
+4
-5
drivers/ide/pci/pdc202xx_new.c
drivers/ide/pci/pdc202xx_new.c
+7
-158
drivers/ide/pci/pdc202xx_new.h
drivers/ide/pci/pdc202xx_new.h
+0
-119
drivers/ide/pci/piix.c
drivers/ide/pci/piix.c
+1
-1
drivers/scsi/sata_promise.c
drivers/scsi/sata_promise.c
+1
-7
drivers/scsi/sata_sil.c
drivers/scsi/sata_sil.c
+2
-13
drivers/scsi/sata_svw.c
drivers/scsi/sata_svw.c
+1
-8
drivers/scsi/sata_vsc.c
drivers/scsi/sata_vsc.c
+11
-26
include/linux/ide.h
include/linux/ide.h
+0
-31
No files found.
drivers/ide/ide-disk.c
View file @
22e9af4e
...
...
@@ -569,28 +569,37 @@ ide_startstop_t __ide_do_rw_disk (ide_drive_t *drive, struct request *rq, sector
}
EXPORT_SYMBOL_GPL
(
__ide_do_rw_disk
);
static
task_ioreg_t
get_command
(
ide_drive_t
*
drive
,
int
cmd
)
static
u8
get_command
(
ide_drive_t
*
drive
,
int
cmd
,
ide_task_t
*
task
)
{
int
lba48bit
=
(
drive
->
addressing
==
1
)
?
1
:
0
;
if
((
cmd
==
READ
)
&&
drive
->
using_tcq
)
return
lba48bit
?
WIN_READDMA_QUEUED_EXT
:
WIN_READDMA_QUEUED
;
if
((
cmd
==
READ
)
&&
(
drive
->
using_dma
))
return
(
lba48bit
)
?
WIN_READDMA_EXT
:
WIN_READDMA
;
else
if
((
cmd
==
READ
)
&&
(
drive
->
mult_count
))
return
(
lba48bit
)
?
WIN_MULTREAD_EXT
:
WIN_MULTREAD
;
else
if
(
cmd
==
READ
)
return
(
lba48bit
)
?
WIN_READ_EXT
:
WIN_READ
;
else
if
((
cmd
==
WRITE
)
&&
drive
->
using_tcq
)
return
lba48bit
?
WIN_WRITEDMA_QUEUED_EXT
:
WIN_WRITEDMA_QUEUED
;
else
if
((
cmd
==
WRITE
)
&&
(
drive
->
using_dma
))
return
(
lba48bit
)
?
WIN_WRITEDMA_EXT
:
WIN_WRITEDMA
;
else
if
((
cmd
==
WRITE
)
&&
(
drive
->
mult_count
))
return
(
lba48bit
)
?
WIN_MULTWRITE_EXT
:
WIN_MULTWRITE
;
else
if
(
cmd
==
WRITE
)
return
(
lba48bit
)
?
WIN_WRITE_EXT
:
WIN_WRITE
;
else
return
WIN_NOP
;
unsigned
int
lba48
=
(
drive
->
addressing
==
1
)
?
1
:
0
;
if
(
cmd
==
READ
)
{
task
->
command_type
=
IDE_DRIVE_TASK_IN
;
if
(
drive
->
using_tcq
)
return
lba48
?
WIN_READDMA_QUEUED_EXT
:
WIN_READDMA_QUEUED
;
if
(
drive
->
using_dma
)
return
lba48
?
WIN_READDMA_EXT
:
WIN_READDMA
;
if
(
drive
->
mult_count
)
{
task
->
handler
=
&
task_mulin_intr
;
return
lba48
?
WIN_MULTREAD_EXT
:
WIN_MULTREAD
;
}
task
->
handler
=
&
task_in_intr
;
return
lba48
?
WIN_READ_EXT
:
WIN_READ
;
}
else
{
task
->
command_type
=
IDE_DRIVE_TASK_RAW_WRITE
;
if
(
drive
->
using_tcq
)
return
lba48
?
WIN_WRITEDMA_QUEUED_EXT
:
WIN_WRITEDMA_QUEUED
;
if
(
drive
->
using_dma
)
return
lba48
?
WIN_WRITEDMA_EXT
:
WIN_WRITEDMA
;
if
(
drive
->
mult_count
)
{
task
->
prehandler
=
&
pre_task_mulout_intr
;
task
->
handler
=
&
task_mulout_intr
;
return
lba48
?
WIN_MULTWRITE_EXT
:
WIN_MULTWRITE
;
}
task
->
prehandler
=
&
pre_task_out_intr
;
task
->
handler
=
&
task_out_intr
;
return
lba48
?
WIN_WRITE_EXT
:
WIN_WRITE
;
}
}
static
ide_startstop_t
chs_rw_disk
(
ide_drive_t
*
drive
,
struct
request
*
rq
,
unsigned
long
block
)
...
...
@@ -598,7 +607,6 @@ static ide_startstop_t chs_rw_disk (ide_drive_t *drive, struct request *rq, unsi
ide_task_t
args
;
int
sectors
;
ata_nsector_t
nsectors
;
task_ioreg_t
command
=
get_command
(
drive
,
rq_data_dir
(
rq
));
unsigned
int
track
=
(
block
/
drive
->
sect
);
unsigned
int
sect
=
(
block
%
drive
->
sect
)
+
1
;
unsigned
int
head
=
(
track
%
drive
->
head
);
...
...
@@ -628,8 +636,7 @@ static ide_startstop_t chs_rw_disk (ide_drive_t *drive, struct request *rq, unsi
args
.
tfRegister
[
IDE_HCYL_OFFSET
]
=
(
cyl
>>
8
);
args
.
tfRegister
[
IDE_SELECT_OFFSET
]
=
head
;
args
.
tfRegister
[
IDE_SELECT_OFFSET
]
|=
drive
->
select
.
all
;
args
.
tfRegister
[
IDE_COMMAND_OFFSET
]
=
command
;
args
.
command_type
=
ide_cmd_type_parser
(
&
args
);
args
.
tfRegister
[
IDE_COMMAND_OFFSET
]
=
get_command
(
drive
,
rq_data_dir
(
rq
),
&
args
);
args
.
rq
=
(
struct
request
*
)
rq
;
rq
->
special
=
(
ide_task_t
*
)
&
args
;
return
do_rw_taskfile
(
drive
,
&
args
);
...
...
@@ -640,7 +647,6 @@ static ide_startstop_t lba_28_rw_disk (ide_drive_t *drive, struct request *rq, u
ide_task_t
args
;
int
sectors
;
ata_nsector_t
nsectors
;
task_ioreg_t
command
=
get_command
(
drive
,
rq_data_dir
(
rq
));
nsectors
.
all
=
(
u16
)
rq
->
nr_sectors
;
...
...
@@ -666,8 +672,7 @@ static ide_startstop_t lba_28_rw_disk (ide_drive_t *drive, struct request *rq, u
args
.
tfRegister
[
IDE_HCYL_OFFSET
]
=
(
block
>>=
8
);
args
.
tfRegister
[
IDE_SELECT_OFFSET
]
=
((
block
>>
8
)
&
0x0f
);
args
.
tfRegister
[
IDE_SELECT_OFFSET
]
|=
drive
->
select
.
all
;
args
.
tfRegister
[
IDE_COMMAND_OFFSET
]
=
command
;
args
.
command_type
=
ide_cmd_type_parser
(
&
args
);
args
.
tfRegister
[
IDE_COMMAND_OFFSET
]
=
get_command
(
drive
,
rq_data_dir
(
rq
),
&
args
);
args
.
rq
=
(
struct
request
*
)
rq
;
rq
->
special
=
(
ide_task_t
*
)
&
args
;
return
do_rw_taskfile
(
drive
,
&
args
);
...
...
@@ -684,7 +689,6 @@ static ide_startstop_t lba_48_rw_disk (ide_drive_t *drive, struct request *rq, u
ide_task_t
args
;
int
sectors
;
ata_nsector_t
nsectors
;
task_ioreg_t
command
=
get_command
(
drive
,
rq_data_dir
(
rq
));
nsectors
.
all
=
(
u16
)
rq
->
nr_sectors
;
...
...
@@ -702,24 +706,23 @@ static ide_startstop_t lba_48_rw_disk (ide_drive_t *drive, struct request *rq, u
if
(
blk_rq_tagged
(
rq
))
{
args
.
tfRegister
[
IDE_FEATURE_OFFSET
]
=
sectors
;
args
.
tfRegister
[
IDE_NSECTOR_OFFSET
]
=
rq
->
tag
<<
3
;
args
.
hobRegister
[
IDE_FEATURE_OFFSET
_HOB
]
=
sectors
>>
8
;
args
.
hobRegister
[
IDE_NSECTOR_OFFSET
_HOB
]
=
0
;
args
.
hobRegister
[
IDE_FEATURE_OFFSET
]
=
sectors
>>
8
;
args
.
hobRegister
[
IDE_NSECTOR_OFFSET
]
=
0
;
}
else
{
args
.
tfRegister
[
IDE_NSECTOR_OFFSET
]
=
sectors
;
args
.
hobRegister
[
IDE_NSECTOR_OFFSET
_HOB
]
=
sectors
>>
8
;
args
.
hobRegister
[
IDE_NSECTOR_OFFSET
]
=
sectors
>>
8
;
}
args
.
tfRegister
[
IDE_SECTOR_OFFSET
]
=
block
;
/* low lba */
args
.
tfRegister
[
IDE_LCYL_OFFSET
]
=
(
block
>>=
8
);
/* mid lba */
args
.
tfRegister
[
IDE_HCYL_OFFSET
]
=
(
block
>>=
8
);
/* hi lba */
args
.
tfRegister
[
IDE_SELECT_OFFSET
]
=
drive
->
select
.
all
;
args
.
tfRegister
[
IDE_COMMAND_OFFSET
]
=
command
;
args
.
hobRegister
[
IDE_SECTOR_OFFSET
_HOB
]
=
(
block
>>=
8
);
/* low lba */
args
.
hobRegister
[
IDE_LCYL_OFFSET
_HOB
]
=
(
block
>>=
8
);
/* mid lba */
args
.
hobRegister
[
IDE_HCYL_OFFSET
_HOB
]
=
(
block
>>=
8
);
/* hi lba */
args
.
hobRegister
[
IDE_SELECT_OFFSET
_HOB
]
=
drive
->
select
.
all
;
args
.
tfRegister
[
IDE_COMMAND_OFFSET
]
=
get_command
(
drive
,
rq_data_dir
(
rq
),
&
args
)
;
args
.
hobRegister
[
IDE_SECTOR_OFFSET
]
=
(
block
>>=
8
);
/* low lba */
args
.
hobRegister
[
IDE_LCYL_OFFSET
]
=
(
block
>>=
8
);
/* mid lba */
args
.
hobRegister
[
IDE_HCYL_OFFSET
]
=
(
block
>>=
8
);
/* hi lba */
args
.
hobRegister
[
IDE_SELECT_OFFSET
]
=
drive
->
select
.
all
;
args
.
hobRegister
[
IDE_CONTROL_OFFSET_HOB
]
=
(
drive
->
ctl
|
0x80
);
args
.
command_type
=
ide_cmd_type_parser
(
&
args
);
args
.
rq
=
(
struct
request
*
)
rq
;
rq
->
special
=
(
ide_task_t
*
)
&
args
;
return
do_rw_taskfile
(
drive
,
&
args
);
...
...
@@ -927,7 +930,8 @@ static unsigned long idedisk_read_native_max_address(ide_drive_t *drive)
memset
(
&
args
,
0
,
sizeof
(
ide_task_t
));
args
.
tfRegister
[
IDE_SELECT_OFFSET
]
=
0x40
;
args
.
tfRegister
[
IDE_COMMAND_OFFSET
]
=
WIN_READ_NATIVE_MAX
;
args
.
command_type
=
ide_cmd_type_parser
(
&
args
);
args
.
command_type
=
IDE_DRIVE_TASK_NO_DATA
;
args
.
handler
=
&
task_no_data_intr
;
/* submit command request */
ide_raw_taskfile
(
drive
,
&
args
,
NULL
);
...
...
@@ -952,15 +956,16 @@ static unsigned long long idedisk_read_native_max_address_ext(ide_drive_t *drive
args
.
tfRegister
[
IDE_SELECT_OFFSET
]
=
0x40
;
args
.
tfRegister
[
IDE_COMMAND_OFFSET
]
=
WIN_READ_NATIVE_MAX_EXT
;
args
.
command_type
=
ide_cmd_type_parser
(
&
args
);
args
.
command_type
=
IDE_DRIVE_TASK_NO_DATA
;
args
.
handler
=
&
task_no_data_intr
;
/* submit command request */
ide_raw_taskfile
(
drive
,
&
args
,
NULL
);
/* if OK, compute maximum address value */
if
((
args
.
tfRegister
[
IDE_STATUS_OFFSET
]
&
0x01
)
==
0
)
{
u32
high
=
(
(
args
.
hobRegister
[
IDE_HCYL_OFFSET_HOB
])
<<
16
)
|
(
(
args
.
hobRegister
[
IDE_LCYL_OFFSET_HOB
])
<<
8
)
|
(
args
.
hobRegister
[
IDE_SECTOR_OFFSET_HOB
]);
u32
high
=
(
args
.
hobRegister
[
IDE_HCYL_OFFSET
]
<<
16
)
|
(
args
.
hobRegister
[
IDE_LCYL_OFFSET
]
<<
8
)
|
args
.
hobRegister
[
IDE_SECTOR_OFFSET
];
u32
low
=
((
args
.
tfRegister
[
IDE_HCYL_OFFSET
])
<<
16
)
|
((
args
.
tfRegister
[
IDE_LCYL_OFFSET
])
<<
8
)
|
(
args
.
tfRegister
[
IDE_SECTOR_OFFSET
]);
...
...
@@ -988,7 +993,8 @@ static unsigned long idedisk_set_max_address(ide_drive_t *drive, unsigned long a
args
.
tfRegister
[
IDE_HCYL_OFFSET
]
=
((
addr_req
>>
16
)
&
0xff
);
args
.
tfRegister
[
IDE_SELECT_OFFSET
]
=
((
addr_req
>>
24
)
&
0x0f
)
|
0x40
;
args
.
tfRegister
[
IDE_COMMAND_OFFSET
]
=
WIN_SET_MAX
;
args
.
command_type
=
ide_cmd_type_parser
(
&
args
);
args
.
command_type
=
IDE_DRIVE_TASK_NO_DATA
;
args
.
handler
=
&
task_no_data_intr
;
/* submit command request */
ide_raw_taskfile
(
drive
,
&
args
,
NULL
);
/* if OK, read new maximum address value */
...
...
@@ -1015,19 +1021,20 @@ static unsigned long long idedisk_set_max_address_ext(ide_drive_t *drive, unsign
args
.
tfRegister
[
IDE_HCYL_OFFSET
]
=
((
addr_req
>>=
8
)
&
0xff
);
args
.
tfRegister
[
IDE_SELECT_OFFSET
]
=
0x40
;
args
.
tfRegister
[
IDE_COMMAND_OFFSET
]
=
WIN_SET_MAX_EXT
;
args
.
hobRegister
[
IDE_SECTOR_OFFSET
_HOB
]
=
((
addr_req
>>=
8
)
&
0xff
)
;
args
.
hobRegister
[
IDE_LCYL_OFFSET
_HOB
]
=
((
addr_req
>>=
8
)
&
0xff
)
;
args
.
hobRegister
[
IDE_HCYL_OFFSET
_HOB
]
=
((
addr_req
>>=
8
)
&
0xff
)
;
args
.
hobRegister
[
IDE_SELECT_OFFSET
_HOB
]
=
0x40
;
args
.
hobRegister
[
IDE_SECTOR_OFFSET
]
=
(
addr_req
>>=
8
)
&
0xff
;
args
.
hobRegister
[
IDE_LCYL_OFFSET
]
=
(
addr_req
>>=
8
)
&
0xff
;
args
.
hobRegister
[
IDE_HCYL_OFFSET
]
=
(
addr_req
>>=
8
)
&
0xff
;
args
.
hobRegister
[
IDE_SELECT_OFFSET
]
=
0x40
;
args
.
hobRegister
[
IDE_CONTROL_OFFSET_HOB
]
=
(
drive
->
ctl
|
0x80
);
args
.
command_type
=
ide_cmd_type_parser
(
&
args
);
args
.
command_type
=
IDE_DRIVE_TASK_NO_DATA
;
args
.
handler
=
&
task_no_data_intr
;
/* submit command request */
ide_raw_taskfile
(
drive
,
&
args
,
NULL
);
/* if OK, compute maximum address value */
if
((
args
.
tfRegister
[
IDE_STATUS_OFFSET
]
&
0x01
)
==
0
)
{
u32
high
=
(
(
args
.
hobRegister
[
IDE_HCYL_OFFSET_HOB
])
<<
16
)
|
(
(
args
.
hobRegister
[
IDE_LCYL_OFFSET_HOB
])
<<
8
)
|
(
args
.
hobRegister
[
IDE_SECTOR_OFFSET_HOB
])
;
u32
high
=
(
args
.
hobRegister
[
IDE_HCYL_OFFSET
]
<<
16
)
|
(
args
.
hobRegister
[
IDE_LCYL_OFFSET
]
<<
8
)
|
args
.
hobRegister
[
IDE_SECTOR_OFFSET
]
;
u32
low
=
((
args
.
tfRegister
[
IDE_HCYL_OFFSET
])
<<
16
)
|
((
args
.
tfRegister
[
IDE_LCYL_OFFSET
])
<<
8
)
|
(
args
.
tfRegister
[
IDE_SECTOR_OFFSET
]);
...
...
@@ -1158,7 +1165,8 @@ static ide_startstop_t idedisk_special (ide_drive_t *drive)
args
.
tfRegister
[
IDE_HCYL_OFFSET
]
=
drive
->
cyl
>>
8
;
args
.
tfRegister
[
IDE_SELECT_OFFSET
]
=
((
drive
->
head
-
1
)
|
drive
->
select
.
all
)
&
0xBF
;
args
.
tfRegister
[
IDE_COMMAND_OFFSET
]
=
WIN_SPECIFY
;
args
.
command_type
=
ide_cmd_type_parser
(
&
args
);
args
.
command_type
=
IDE_DRIVE_TASK_NO_DATA
;
args
.
handler
=
&
set_geometry_intr
;
do_rw_taskfile
(
drive
,
&
args
);
}
}
else
if
(
s
->
b
.
recalibrate
)
{
...
...
@@ -1168,7 +1176,8 @@ static ide_startstop_t idedisk_special (ide_drive_t *drive)
memset
(
&
args
,
0
,
sizeof
(
ide_task_t
));
args
.
tfRegister
[
IDE_NSECTOR_OFFSET
]
=
drive
->
sect
;
args
.
tfRegister
[
IDE_COMMAND_OFFSET
]
=
WIN_RESTORE
;
args
.
command_type
=
ide_cmd_type_parser
(
&
args
);
args
.
command_type
=
IDE_DRIVE_TASK_NO_DATA
;
args
.
handler
=
&
recal_intr
;
do_rw_taskfile
(
drive
,
&
args
);
}
}
else
if
(
s
->
b
.
set_multmode
)
{
...
...
@@ -1180,7 +1189,8 @@ static ide_startstop_t idedisk_special (ide_drive_t *drive)
memset
(
&
args
,
0
,
sizeof
(
ide_task_t
));
args
.
tfRegister
[
IDE_NSECTOR_OFFSET
]
=
drive
->
mult_req
;
args
.
tfRegister
[
IDE_COMMAND_OFFSET
]
=
WIN_SETMULT
;
args
.
command_type
=
ide_cmd_type_parser
(
&
args
);
args
.
command_type
=
IDE_DRIVE_TASK_NO_DATA
;
args
.
handler
=
&
set_multmode_intr
;
do_rw_taskfile
(
drive
,
&
args
);
}
}
else
if
(
s
->
all
)
{
...
...
@@ -1218,7 +1228,8 @@ static int smart_enable(ide_drive_t *drive)
args
.
tfRegister
[
IDE_LCYL_OFFSET
]
=
SMART_LCYL_PASS
;
args
.
tfRegister
[
IDE_HCYL_OFFSET
]
=
SMART_HCYL_PASS
;
args
.
tfRegister
[
IDE_COMMAND_OFFSET
]
=
WIN_SMART
;
args
.
command_type
=
ide_cmd_type_parser
(
&
args
);
args
.
command_type
=
IDE_DRIVE_TASK_NO_DATA
;
args
.
handler
=
&
task_no_data_intr
;
return
ide_raw_taskfile
(
drive
,
&
args
,
NULL
);
}
...
...
@@ -1232,7 +1243,8 @@ static int get_smart_values(ide_drive_t *drive, u8 *buf)
args
.
tfRegister
[
IDE_LCYL_OFFSET
]
=
SMART_LCYL_PASS
;
args
.
tfRegister
[
IDE_HCYL_OFFSET
]
=
SMART_HCYL_PASS
;
args
.
tfRegister
[
IDE_COMMAND_OFFSET
]
=
WIN_SMART
;
args
.
command_type
=
ide_cmd_type_parser
(
&
args
);
args
.
command_type
=
IDE_DRIVE_TASK_IN
;
args
.
handler
=
&
task_in_intr
;
(
void
)
smart_enable
(
drive
);
return
ide_raw_taskfile
(
drive
,
&
args
,
buf
);
}
...
...
@@ -1246,7 +1258,8 @@ static int get_smart_thresholds(ide_drive_t *drive, u8 *buf)
args
.
tfRegister
[
IDE_LCYL_OFFSET
]
=
SMART_LCYL_PASS
;
args
.
tfRegister
[
IDE_HCYL_OFFSET
]
=
SMART_HCYL_PASS
;
args
.
tfRegister
[
IDE_COMMAND_OFFSET
]
=
WIN_SMART
;
args
.
command_type
=
ide_cmd_type_parser
(
&
args
);
args
.
command_type
=
IDE_DRIVE_TASK_IN
;
args
.
handler
=
&
task_in_intr
;
(
void
)
smart_enable
(
drive
);
return
ide_raw_taskfile
(
drive
,
&
args
,
buf
);
}
...
...
@@ -1356,7 +1369,8 @@ static int write_cache (ide_drive_t *drive, int arg)
args
.
tfRegister
[
IDE_FEATURE_OFFSET
]
=
(
arg
)
?
SETFEATURES_EN_WCACHE
:
SETFEATURES_DIS_WCACHE
;
args
.
tfRegister
[
IDE_COMMAND_OFFSET
]
=
WIN_SETFEATURES
;
args
.
command_type
=
ide_cmd_type_parser
(
&
args
);
args
.
command_type
=
IDE_DRIVE_TASK_NO_DATA
;
args
.
handler
=
&
task_no_data_intr
;
(
void
)
ide_raw_taskfile
(
drive
,
&
args
,
NULL
);
drive
->
wcache
=
arg
;
...
...
@@ -1372,7 +1386,8 @@ static int do_idedisk_flushcache (ide_drive_t *drive)
args
.
tfRegister
[
IDE_COMMAND_OFFSET
]
=
WIN_FLUSH_CACHE_EXT
;
else
args
.
tfRegister
[
IDE_COMMAND_OFFSET
]
=
WIN_FLUSH_CACHE
;
args
.
command_type
=
ide_cmd_type_parser
(
&
args
);
args
.
command_type
=
IDE_DRIVE_TASK_NO_DATA
;
args
.
handler
=
&
task_no_data_intr
;
return
ide_raw_taskfile
(
drive
,
&
args
,
NULL
);
}
...
...
@@ -1385,7 +1400,8 @@ static int set_acoustic (ide_drive_t *drive, int arg)
SETFEATURES_DIS_AAM
;
args
.
tfRegister
[
IDE_NSECTOR_OFFSET
]
=
arg
;
args
.
tfRegister
[
IDE_COMMAND_OFFSET
]
=
WIN_SETFEATURES
;
args
.
command_type
=
ide_cmd_type_parser
(
&
args
);
args
.
command_type
=
IDE_DRIVE_TASK_NO_DATA
;
args
.
handler
=
&
task_no_data_intr
;
ide_raw_taskfile
(
drive
,
&
args
,
NULL
);
drive
->
acoustic
=
arg
;
return
0
;
...
...
@@ -1504,11 +1520,13 @@ static ide_startstop_t idedisk_start_power_step (ide_drive_t *drive, struct requ
args
->
tfRegister
[
IDE_COMMAND_OFFSET
]
=
WIN_FLUSH_CACHE_EXT
;
else
args
->
tfRegister
[
IDE_COMMAND_OFFSET
]
=
WIN_FLUSH_CACHE
;
args
->
command_type
=
ide_cmd_type_parser
(
args
);
args
->
command_type
=
IDE_DRIVE_TASK_NO_DATA
;
args
->
handler
=
&
task_no_data_intr
;
return
do_rw_taskfile
(
drive
,
args
);
case
idedisk_pm_standby
:
/* Suspend step 2 (standby) */
args
->
tfRegister
[
IDE_COMMAND_OFFSET
]
=
WIN_STANDBYNOW1
;
args
->
command_type
=
ide_cmd_type_parser
(
args
);
args
->
command_type
=
IDE_DRIVE_TASK_NO_DATA
;
args
->
handler
=
&
task_no_data_intr
;
return
do_rw_taskfile
(
drive
,
args
);
case
idedisk_pm_restore_dma
:
/* Resume step 1 (restore DMA) */
...
...
@@ -1716,7 +1734,8 @@ static int idedisk_open(struct inode *inode, struct file *filp)
u8
cf
;
memset
(
&
args
,
0
,
sizeof
(
ide_task_t
));
args
.
tfRegister
[
IDE_COMMAND_OFFSET
]
=
WIN_DOORLOCK
;
args
.
command_type
=
ide_cmd_type_parser
(
&
args
);
args
.
command_type
=
IDE_DRIVE_TASK_NO_DATA
;
args
.
handler
=
&
task_no_data_intr
;
check_disk_change
(
inode
->
i_bdev
);
/*
* Ignore the return code from door_lock,
...
...
@@ -1762,7 +1781,8 @@ static int idedisk_release(struct inode *inode, struct file *filp)
ide_task_t
args
;
memset
(
&
args
,
0
,
sizeof
(
ide_task_t
));
args
.
tfRegister
[
IDE_COMMAND_OFFSET
]
=
WIN_DOORUNLOCK
;
args
.
command_type
=
ide_cmd_type_parser
(
&
args
);
args
.
command_type
=
IDE_DRIVE_TASK_NO_DATA
;
args
.
handler
=
&
task_no_data_intr
;
if
(
drive
->
doorlocking
&&
ide_raw_taskfile
(
drive
,
&
args
,
NULL
))
drive
->
doorlocking
=
0
;
}
...
...
drivers/ide/ide-io.c
View file @
22e9af4e
...
...
@@ -197,7 +197,7 @@ void ide_end_drive_cmd (ide_drive_t *drive, u8 stat, u8 err)
if
(
args
->
tf_in_flags
.
b
.
data
)
{
u16
data
=
hwif
->
INW
(
IDE_DATA_REG
);
args
->
tfRegister
[
IDE_DATA_OFFSET
]
=
(
data
)
&
0xFF
;
args
->
hobRegister
[
IDE_DATA_OFFSET
_HOB
]
=
(
data
>>
8
)
&
0xFF
;
args
->
hobRegister
[
IDE_DATA_OFFSET
]
=
(
data
>>
8
)
&
0xFF
;
}
args
->
tfRegister
[
IDE_ERROR_OFFSET
]
=
err
;
args
->
tfRegister
[
IDE_NSECTOR_OFFSET
]
=
hwif
->
INB
(
IDE_NSECTOR_REG
);
...
...
@@ -208,12 +208,12 @@ void ide_end_drive_cmd (ide_drive_t *drive, u8 stat, u8 err)
args
->
tfRegister
[
IDE_STATUS_OFFSET
]
=
stat
;
if
(
drive
->
addressing
==
1
)
{
hwif
->
OUTB
(
drive
->
ctl
|
0x80
,
IDE_CONTROL_REG
_HOB
);
args
->
hobRegister
[
IDE_FEATURE_OFFSET
_HOB
]
=
hwif
->
INB
(
IDE_FEATURE_REG
);
args
->
hobRegister
[
IDE_NSECTOR_OFFSET
_HOB
]
=
hwif
->
INB
(
IDE_NSECTOR_REG
);
args
->
hobRegister
[
IDE_SECTOR_OFFSET
_HOB
]
=
hwif
->
INB
(
IDE_SECTOR_REG
);
args
->
hobRegister
[
IDE_LCYL_OFFSET
_HOB
]
=
hwif
->
INB
(
IDE_LCYL_REG
);
args
->
hobRegister
[
IDE_HCYL_OFFSET
_HOB
]
=
hwif
->
INB
(
IDE_HCYL_REG
);
hwif
->
OUTB
(
drive
->
ctl
|
0x80
,
IDE_CONTROL_REG
);
args
->
hobRegister
[
IDE_FEATURE_OFFSET
]
=
hwif
->
INB
(
IDE_FEATURE_REG
);
args
->
hobRegister
[
IDE_NSECTOR_OFFSET
]
=
hwif
->
INB
(
IDE_NSECTOR_REG
);
args
->
hobRegister
[
IDE_SECTOR_OFFSET
]
=
hwif
->
INB
(
IDE_SECTOR_REG
);
args
->
hobRegister
[
IDE_LCYL_OFFSET
]
=
hwif
->
INB
(
IDE_LCYL_REG
);
args
->
hobRegister
[
IDE_HCYL_OFFSET
]
=
hwif
->
INB
(
IDE_HCYL_REG
);
}
}
}
else
if
(
blk_pm_request
(
rq
))
{
...
...
drivers/ide/ide-taskfile.c
View file @
22e9af4e
...
...
@@ -101,7 +101,8 @@ int taskfile_lib_get_identify (ide_drive_t *drive, u8 *buf)
args
.
tfRegister
[
IDE_COMMAND_OFFSET
]
=
WIN_IDENTIFY
;
else
args
.
tfRegister
[
IDE_COMMAND_OFFSET
]
=
WIN_PIDENTIFY
;
args
.
command_type
=
ide_cmd_type_parser
(
&
args
);
args
.
command_type
=
IDE_DRIVE_TASK_IN
;
args
.
handler
=
&
task_in_intr
;
return
ide_raw_taskfile
(
drive
,
&
args
,
buf
);
}
...
...
@@ -120,13 +121,13 @@ void debug_taskfile (ide_drive_t *drive, ide_task_t *args)
printk
(
"TF.6=x%02x "
,
args
->
tfRegister
[
IDE_SELECT_OFFSET
]);
printk
(
"TF.7=x%02x
\n
"
,
args
->
tfRegister
[
IDE_COMMAND_OFFSET
]);
printk
(
KERN_INFO
"%s: "
,
drive
->
name
);
// printk("HTF.0=x%02x ", args->hobRegister[IDE_DATA_OFFSET
_HOB
]);
printk
(
"HTF.1=x%02x "
,
args
->
hobRegister
[
IDE_FEATURE_OFFSET
_HOB
]);
printk
(
"HTF.2=x%02x "
,
args
->
hobRegister
[
IDE_NSECTOR_OFFSET
_HOB
]);
printk
(
"HTF.3=x%02x "
,
args
->
hobRegister
[
IDE_SECTOR_OFFSET
_HOB
]);
printk
(
"HTF.4=x%02x "
,
args
->
hobRegister
[
IDE_LCYL_OFFSET
_HOB
]);
printk
(
"HTF.5=x%02x "
,
args
->
hobRegister
[
IDE_HCYL_OFFSET
_HOB
]);
printk
(
"HTF.6=x%02x "
,
args
->
hobRegister
[
IDE_SELECT_OFFSET
_HOB
]);
// printk("HTF.0=x%02x ", args->hobRegister[IDE_DATA_OFFSET]);
printk
(
"HTF.1=x%02x "
,
args
->
hobRegister
[
IDE_FEATURE_OFFSET
]);
printk
(
"HTF.2=x%02x "
,
args
->
hobRegister
[
IDE_NSECTOR_OFFSET
]);
printk
(
"HTF.3=x%02x "
,
args
->
hobRegister
[
IDE_SECTOR_OFFSET
]);
printk
(
"HTF.4=x%02x "
,
args
->
hobRegister
[
IDE_LCYL_OFFSET
]);
printk
(
"HTF.5=x%02x "
,
args
->
hobRegister
[
IDE_HCYL_OFFSET
]);
printk
(
"HTF.6=x%02x "
,
args
->
hobRegister
[
IDE_SELECT_OFFSET
]);
printk
(
"HTF.7=x%02x
\n
"
,
args
->
hobRegister
[
IDE_CONTROL_OFFSET_HOB
]);
}
#endif
/* CONFIG_IDE_TASK_IOCTL_DEBUG */
...
...
@@ -990,336 +991,11 @@ EXPORT_SYMBOL(pre_task_mulout_intr);
#endif
/* !CONFIG_IDE_TASKFILE_IO */
/* Called by internal to feature out type of command being called */
//ide_pre_handler_t * ide_pre_handler_parser (task_struct_t *taskfile, hob_struct_t *hobfile)
ide_pre_handler_t
*
ide_pre_handler_parser
(
struct
hd_drive_task_hdr
*
taskfile
,
struct
hd_drive_hob_hdr
*
hobfile
)
{
switch
(
taskfile
->
command
)
{
/* IDE_DRIVE_TASK_RAW_WRITE */
case
CFA_WRITE_MULTI_WO_ERASE
:
// case WIN_WRITE_LONG:
// case WIN_WRITE_LONG_ONCE:
case
WIN_MULTWRITE
:
case
WIN_MULTWRITE_EXT
:
return
&
pre_task_mulout_intr
;
/* IDE_DRIVE_TASK_OUT */
case
WIN_WRITE
:
// case WIN_WRITE_ONCE:
case
WIN_WRITE_EXT
:
case
WIN_WRITE_VERIFY
:
case
WIN_WRITE_BUFFER
:
case
CFA_WRITE_SECT_WO_ERASE
:
case
WIN_DOWNLOAD_MICROCODE
:
return
&
pre_task_out_intr
;
/* IDE_DRIVE_TASK_OUT */
case
WIN_SMART
:
if
(
taskfile
->
feature
==
SMART_WRITE_LOG_SECTOR
)
return
&
pre_task_out_intr
;
case
WIN_WRITEDMA
:
// case WIN_WRITEDMA_ONCE:
case
WIN_WRITEDMA_QUEUED
:
case
WIN_WRITEDMA_EXT
:
case
WIN_WRITEDMA_QUEUED_EXT
:
/* IDE_DRIVE_TASK_OUT */
default:
break
;
}
return
(
NULL
);
}
EXPORT_SYMBOL
(
ide_pre_handler_parser
);
/* Called by internal to feature out type of command being called */
//ide_handler_t * ide_handler_parser (task_struct_t *taskfile, hob_struct_t *hobfile)
ide_handler_t
*
ide_handler_parser
(
struct
hd_drive_task_hdr
*
taskfile
,
struct
hd_drive_hob_hdr
*
hobfile
)
{
switch
(
taskfile
->
command
)
{
case
WIN_IDENTIFY
:
case
WIN_PIDENTIFY
:
case
CFA_TRANSLATE_SECTOR
:
case
WIN_READ_BUFFER
:
case
WIN_READ
:
// case WIN_READ_ONCE:
case
WIN_READ_EXT
:
return
&
task_in_intr
;
case
WIN_SECURITY_DISABLE
:
case
WIN_SECURITY_ERASE_UNIT
:
case
WIN_SECURITY_SET_PASS
:
case
WIN_SECURITY_UNLOCK
:
case
WIN_DOWNLOAD_MICROCODE
:
case
CFA_WRITE_SECT_WO_ERASE
:
case
WIN_WRITE_BUFFER
:
case
WIN_WRITE_VERIFY
:
case
WIN_WRITE
:
// case WIN_WRITE_ONCE:
case
WIN_WRITE_EXT
:
return
&
task_out_intr
;
// case WIN_READ_LONG:
// case WIN_READ_LONG_ONCE:
case
WIN_MULTREAD
:
case
WIN_MULTREAD_EXT
:
return
&
task_mulin_intr
;
// case WIN_WRITE_LONG:
// case WIN_WRITE_LONG_ONCE:
case
CFA_WRITE_MULTI_WO_ERASE
:
case
WIN_MULTWRITE
:
case
WIN_MULTWRITE_EXT
:
return
&
task_mulout_intr
;
case
WIN_SMART
:
switch
(
taskfile
->
feature
)
{
case
SMART_READ_VALUES
:
case
SMART_READ_THRESHOLDS
:
case
SMART_READ_LOG_SECTOR
:
return
&
task_in_intr
;
case
SMART_WRITE_LOG_SECTOR
:
return
&
task_out_intr
;
default:
return
&
task_no_data_intr
;
}
case
CFA_REQ_EXT_ERROR_CODE
:
case
CFA_ERASE_SECTORS
:
case
WIN_VERIFY
:
// case WIN_VERIFY_ONCE:
case
WIN_VERIFY_EXT
:
case
WIN_SEEK
:
return
&
task_no_data_intr
;
case
WIN_SPECIFY
:
return
&
set_geometry_intr
;
case
WIN_RECAL
:
// case WIN_RESTORE:
return
&
recal_intr
;
case
WIN_NOP
:
case
WIN_DIAGNOSE
:
case
WIN_FLUSH_CACHE
:
case
WIN_FLUSH_CACHE_EXT
:
case
WIN_STANDBYNOW1
:
case
WIN_STANDBYNOW2
:
case
WIN_SLEEPNOW1
:
case
WIN_SLEEPNOW2
:
case
WIN_SETIDLE1
:
case
WIN_CHECKPOWERMODE1
:
case
WIN_CHECKPOWERMODE2
:
case
WIN_GETMEDIASTATUS
:
case
WIN_MEDIAEJECT
:
return
&
task_no_data_intr
;
case
WIN_SETMULT
:
return
&
set_multmode_intr
;
case
WIN_READ_NATIVE_MAX
:
case
WIN_SET_MAX
:
case
WIN_READ_NATIVE_MAX_EXT
:
case
WIN_SET_MAX_EXT
:
case
WIN_SECURITY_ERASE_PREPARE
:
case
WIN_SECURITY_FREEZE_LOCK
:
case
WIN_DOORLOCK
:
case
WIN_DOORUNLOCK
:
case
WIN_SETFEATURES
:
return
&
task_no_data_intr
;
case
DISABLE_SEAGATE
:
case
EXABYTE_ENABLE_NEST
:
return
&
task_no_data_intr
;
case
WIN_READDMA
:
// case WIN_READDMA_ONCE:
case
WIN_IDENTIFY_DMA
:
case
WIN_READDMA_QUEUED
:
case
WIN_READDMA_EXT
:
case
WIN_READDMA_QUEUED_EXT
:
case
WIN_WRITEDMA
:
// case WIN_WRITEDMA_ONCE:
case
WIN_WRITEDMA_QUEUED
:
case
WIN_WRITEDMA_EXT
:
case
WIN_WRITEDMA_QUEUED_EXT
:
case
WIN_FORMAT
:
case
WIN_INIT
:
case
WIN_DEVICE_RESET
:
case
WIN_QUEUED_SERVICE
:
case
WIN_PACKETCMD
:
default:
return
(
NULL
);
}
}
EXPORT_SYMBOL
(
ide_handler_parser
);
ide_post_handler_t
*
ide_post_handler_parser
(
struct
hd_drive_task_hdr
*
taskfile
,
struct
hd_drive_hob_hdr
*
hobfile
)
{
switch
(
taskfile
->
command
)
{
case
WIN_SPECIFY
:
/* set_geometry_intr */
case
WIN_RESTORE
:
/* recal_intr */
case
WIN_SETMULT
:
/* set_multmode_intr */
default:
return
(
NULL
);
}
}
EXPORT_SYMBOL
(
ide_post_handler_parser
);
/* Called by ioctl to feature out type of command being called */
int
ide_cmd_type_parser
(
ide_task_t
*
args
)
{
task_struct_t
*
taskfile
=
(
task_struct_t
*
)
args
->
tfRegister
;
hob_struct_t
*
hobfile
=
(
hob_struct_t
*
)
args
->
hobRegister
;
args
->
prehandler
=
ide_pre_handler_parser
(
taskfile
,
hobfile
);
args
->
handler
=
ide_handler_parser
(
taskfile
,
hobfile
);
args
->
posthandler
=
ide_post_handler_parser
(
taskfile
,
hobfile
);
switch
(
args
->
tfRegister
[
IDE_COMMAND_OFFSET
])
{
case
WIN_IDENTIFY
:
case
WIN_PIDENTIFY
:
return
IDE_DRIVE_TASK_IN
;
case
CFA_TRANSLATE_SECTOR
:
case
WIN_READ
:
// case WIN_READ_ONCE:
case
WIN_READ_EXT
:
case
WIN_READ_BUFFER
:
return
IDE_DRIVE_TASK_IN
;
case
WIN_WRITE
:
// case WIN_WRITE_ONCE:
case
WIN_WRITE_EXT
:
case
WIN_WRITE_VERIFY
:
case
WIN_WRITE_BUFFER
:
case
CFA_WRITE_SECT_WO_ERASE
:
case
WIN_DOWNLOAD_MICROCODE
:
return
IDE_DRIVE_TASK_RAW_WRITE
;
// case WIN_READ_LONG:
// case WIN_READ_LONG_ONCE:
case
WIN_MULTREAD
:
case
WIN_MULTREAD_EXT
:
return
IDE_DRIVE_TASK_IN
;
// case WIN_WRITE_LONG:
// case WIN_WRITE_LONG_ONCE:
case
CFA_WRITE_MULTI_WO_ERASE
:
case
WIN_MULTWRITE
:
case
WIN_MULTWRITE_EXT
:
return
IDE_DRIVE_TASK_RAW_WRITE
;
case
WIN_SECURITY_DISABLE
:
case
WIN_SECURITY_ERASE_UNIT
:
case
WIN_SECURITY_SET_PASS
:
case
WIN_SECURITY_UNLOCK
:
return
IDE_DRIVE_TASK_OUT
;
case
WIN_SMART
:
args
->
tfRegister
[
IDE_LCYL_OFFSET
]
=
SMART_LCYL_PASS
;
args
->
tfRegister
[
IDE_HCYL_OFFSET
]
=
SMART_HCYL_PASS
;
switch
(
args
->
tfRegister
[
IDE_FEATURE_OFFSET
])
{
case
SMART_READ_VALUES
:
case
SMART_READ_THRESHOLDS
:
case
SMART_READ_LOG_SECTOR
:
return
IDE_DRIVE_TASK_IN
;
case
SMART_WRITE_LOG_SECTOR
:
return
IDE_DRIVE_TASK_OUT
;
default:
return
IDE_DRIVE_TASK_NO_DATA
;
}
case
WIN_READDMA
:
// case WIN_READDMA_ONCE:
case
WIN_IDENTIFY_DMA
:
case
WIN_READDMA_QUEUED
:
case
WIN_READDMA_EXT
:
case
WIN_READDMA_QUEUED_EXT
:
return
IDE_DRIVE_TASK_IN
;
case
WIN_WRITEDMA
:
// case WIN_WRITEDMA_ONCE:
case
WIN_WRITEDMA_QUEUED
:
case
WIN_WRITEDMA_EXT
:
case
WIN_WRITEDMA_QUEUED_EXT
:
return
IDE_DRIVE_TASK_RAW_WRITE
;
case
WIN_SETFEATURES
:
switch
(
args
->
tfRegister
[
IDE_FEATURE_OFFSET
])
{
case
SETFEATURES_EN_8BIT
:
case
SETFEATURES_EN_WCACHE
:
return
IDE_DRIVE_TASK_NO_DATA
;
case
SETFEATURES_XFER
:
return
IDE_DRIVE_TASK_SET_XFER
;
case
SETFEATURES_DIS_DEFECT
:
case
SETFEATURES_EN_APM
:
case
SETFEATURES_DIS_MSN
:
case
SETFEATURES_DIS_RETRY
:
case
SETFEATURES_EN_AAM
:
case
SETFEATURES_RW_LONG
:
case
SETFEATURES_SET_CACHE
:
case
SETFEATURES_DIS_RLA
:
case
SETFEATURES_EN_RI
:
case
SETFEATURES_EN_SI
:
case
SETFEATURES_DIS_RPOD
:
case
SETFEATURES_DIS_WCACHE
:
case
SETFEATURES_EN_DEFECT
:
case
SETFEATURES_DIS_APM
:
case
SETFEATURES_EN_ECC
:
case
SETFEATURES_EN_MSN
:
case
SETFEATURES_EN_RETRY
:
case
SETFEATURES_EN_RLA
:
case
SETFEATURES_PREFETCH
:
case
SETFEATURES_4B_RW_LONG
:
case
SETFEATURES_DIS_AAM
:
case
SETFEATURES_EN_RPOD
:
case
SETFEATURES_DIS_RI
:
case
SETFEATURES_DIS_SI
:
default:
return
IDE_DRIVE_TASK_NO_DATA
;
}
case
WIN_NOP
:
case
CFA_REQ_EXT_ERROR_CODE
:
case
CFA_ERASE_SECTORS
:
case
WIN_VERIFY
:
// case WIN_VERIFY_ONCE:
case
WIN_VERIFY_EXT
:
case
WIN_SEEK
:
case
WIN_SPECIFY
:
case
WIN_RESTORE
:
case
WIN_DIAGNOSE
:
case
WIN_FLUSH_CACHE
:
case
WIN_FLUSH_CACHE_EXT
:
case
WIN_STANDBYNOW1
:
case
WIN_STANDBYNOW2
:
case
WIN_SLEEPNOW1
:
case
WIN_SLEEPNOW2
:
case
WIN_SETIDLE1
:
case
DISABLE_SEAGATE
:
case
WIN_CHECKPOWERMODE1
:
case
WIN_CHECKPOWERMODE2
:
case
WIN_GETMEDIASTATUS
:
case
WIN_MEDIAEJECT
:
case
WIN_SETMULT
:
case
WIN_READ_NATIVE_MAX
:
case
WIN_SET_MAX
:
case
WIN_READ_NATIVE_MAX_EXT
:
case
WIN_SET_MAX_EXT
:
case
WIN_SECURITY_ERASE_PREPARE
:
case
WIN_SECURITY_FREEZE_LOCK
:
case
EXABYTE_ENABLE_NEST
:
case
WIN_DOORLOCK
:
case
WIN_DOORUNLOCK
:
return
IDE_DRIVE_TASK_NO_DATA
;
case
WIN_FORMAT
:
case
WIN_INIT
:
case
WIN_DEVICE_RESET
:
case
WIN_QUEUED_SERVICE
:
case
WIN_PACKETCMD
:
default:
return
IDE_DRIVE_TASK_INVALID
;
}
}
EXPORT_SYMBOL
(
ide_cmd_type_parser
);
/*
* This function is intended to be used prior to invoking ide_do_drive_cmd().
*/
void
ide_init_drive_taskfile
(
struct
request
*
rq
)
{
memset
(
rq
,
0
,
sizeof
(
*
rq
));
rq
->
flags
=
REQ_DRIVE_TASKFILE
;
}
EXPORT_SYMBOL
(
ide_init_drive_taskfile
);
int
ide_diag_taskfile
(
ide_drive_t
*
drive
,
ide_task_t
*
args
,
unsigned
long
data_size
,
u8
*
buf
)
{
struct
request
rq
;
ide_init_drive_taskfile
(
&
rq
);
memset
(
&
rq
,
0
,
sizeof
(
rq
)
);
rq
.
flags
=
REQ_DRIVE_TASKFILE
;
rq
.
buffer
=
buf
;
...
...
@@ -1331,7 +1007,7 @@ int ide_diag_taskfile (ide_drive_t *drive, ide_task_t *args, unsigned long data_
*/
if
(
args
->
command_type
!=
IDE_DRIVE_TASK_NO_DATA
)
{
if
(
data_size
==
0
)
rq
.
nr_sectors
=
(
args
->
hobRegister
[
IDE_NSECTOR_OFFSET
_HOB
]
<<
8
)
|
args
->
tfRegister
[
IDE_NSECTOR_OFFSET
];
rq
.
nr_sectors
=
(
args
->
hobRegister
[
IDE_NSECTOR_OFFSET
]
<<
8
)
|
args
->
tfRegister
[
IDE_NSECTOR_OFFSET
];
else
rq
.
nr_sectors
=
data_size
/
SECTOR_SIZE
;
...
...
@@ -1339,16 +1015,6 @@ int ide_diag_taskfile (ide_drive_t *drive, ide_task_t *args, unsigned long data_
rq
.
hard_cur_sectors
=
rq
.
current_nr_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
;
return
ide_do_drive_cmd
(
drive
,
&
rq
,
ide_wait
);
}
...
...
@@ -1451,11 +1117,9 @@ int ide_taskfile_ioctl (ide_drive_t *drive, unsigned int cmd, unsigned long arg)
#if 0
args.prehandler = &pre_task_out_intr;
args.handler = &task_out_intr;
args.posthandler = NULL;
err = ide_diag_taskfile(drive, &args, taskout, outbuf);
args.prehandler = NULL;
args.handler = &task_in_intr;
args.posthandler = NULL;
err = ide_diag_taskfile(drive, &args, taskin, inbuf);
break;
#else
...
...
drivers/ide/ide-tcq.c
View file @
22e9af4e
...
...
@@ -483,7 +483,7 @@ static int ide_tcq_check_autopoll(ide_drive_t *drive)
args
->
tfRegister
[
IDE_FEATURE_OFFSET
]
=
0x01
;
args
->
tfRegister
[
IDE_COMMAND_OFFSET
]
=
WIN_NOP
;
args
->
command_type
=
ide_cmd_type_parser
(
args
)
;
args
->
command_type
=
IDE_DRIVE_TASK_NO_DATA
;
args
->
handler
=
ide_tcq_nop_handler
;
return
ide_raw_taskfile
(
drive
,
args
,
NULL
);
}
...
...
@@ -513,7 +513,8 @@ static int ide_tcq_configure(ide_drive_t *drive)
memset
(
args
,
0
,
sizeof
(
ide_task_t
));
args
->
tfRegister
[
IDE_COMMAND_OFFSET
]
=
WIN_SETFEATURES
;
args
->
tfRegister
[
IDE_FEATURE_OFFSET
]
=
SETFEATURES_EN_WCACHE
;
args
->
command_type
=
ide_cmd_type_parser
(
args
);
args
->
command_type
=
IDE_DRIVE_TASK_NO_DATA
;
args
->
handler
=
&
task_no_data_intr
;
if
(
ide_raw_taskfile
(
drive
,
args
,
NULL
))
{
printk
(
KERN_WARNING
"%s: failed to enable write cache
\n
"
,
drive
->
name
);
...
...
@@ -527,7 +528,8 @@ static int ide_tcq_configure(ide_drive_t *drive)
memset
(
args
,
0
,
sizeof
(
ide_task_t
));
args
->
tfRegister
[
IDE_COMMAND_OFFSET
]
=
WIN_SETFEATURES
;
args
->
tfRegister
[
IDE_FEATURE_OFFSET
]
=
SETFEATURES_DIS_RI
;
args
->
command_type
=
ide_cmd_type_parser
(
args
);
args
->
command_type
=
IDE_DRIVE_TASK_NO_DATA
;
args
->
handler
=
&
task_no_data_intr
;
if
(
ide_raw_taskfile
(
drive
,
args
,
NULL
))
{
printk
(
KERN_ERR
"%s: disabling release interrupt fail
\n
"
,
drive
->
name
);
...
...
@@ -541,7 +543,8 @@ static int ide_tcq_configure(ide_drive_t *drive)
memset
(
args
,
0
,
sizeof
(
ide_task_t
));
args
->
tfRegister
[
IDE_COMMAND_OFFSET
]
=
WIN_SETFEATURES
;
args
->
tfRegister
[
IDE_FEATURE_OFFSET
]
=
SETFEATURES_EN_SI
;
args
->
command_type
=
ide_cmd_type_parser
(
args
);
args
->
command_type
=
IDE_DRIVE_TASK_NO_DATA
;
args
->
handler
=
&
task_no_data_intr
;
if
(
ide_raw_taskfile
(
drive
,
args
,
NULL
))
{
printk
(
KERN_ERR
"%s: enabling service interrupt fail
\n
"
,
drive
->
name
);
...
...
drivers/ide/legacy/pdc4030.c
View file @
22e9af4e
...
...
@@ -814,11 +814,10 @@ static ide_startstop_t promise_rw_disk (ide_drive_t *drive, struct request *rq,
memcpy
(
args
.
tfRegister
,
&
taskfile
,
sizeof
(
struct
hd_drive_task_hdr
));
memset
(
args
.
hobRegister
,
0
,
sizeof
(
struct
hd_drive_hob_hdr
));
/* We can't call ide_cmd_type_parser here, since it won't understand
our command, but that doesn't matter, since we don't use the
generic interrupt handlers either. Setup the bits of args that we
do need.
*/
/*
* Setup the bits of args that we do need.
* Note that we don't use the generic interrupt handlers.
*/
args
.
handler
=
NULL
;
args
.
rq
=
(
struct
request
*
)
rq
;
rq
->
special
=
(
ide_task_t
*
)
&
args
;
...
...
drivers/ide/pci/pdc202xx_new.c
View file @
22e9af4e
...
...
@@ -140,108 +140,6 @@ static int check_in_drive_lists (ide_drive_t *drive, const char **list)
return
0
;
}
static
int
pdcnew_tune_chipset
(
ide_drive_t
*
drive
,
u8
xferspeed
)
{
ide_hwif_t
*
hwif
=
HWIF
(
drive
);
struct
pci_dev
*
dev
=
hwif
->
pci_dev
;
u8
drive_pci
=
0x60
+
(
drive
->
dn
<<
2
);
u8
speed
=
ide_rate_filter
(
pdcnew_ratemask
(
drive
),
xferspeed
);
u32
drive_conf
;
u8
AP
,
BP
,
CP
,
DP
;
u8
TA
=
0
,
TB
=
0
,
TC
=
0
;
if
((
drive
->
media
!=
ide_disk
)
&&
(
speed
<
XFER_SW_DMA_0
))
return
-
1
;
pci_read_config_dword
(
dev
,
drive_pci
,
&
drive_conf
);
pci_read_config_byte
(
dev
,
(
drive_pci
),
&
AP
);
pci_read_config_byte
(
dev
,
(
drive_pci
)
|
0x01
,
&
BP
);
pci_read_config_byte
(
dev
,
(
drive_pci
)
|
0x02
,
&
CP
);
pci_read_config_byte
(
dev
,
(
drive_pci
)
|
0x03
,
&
DP
);
if
(
speed
<
XFER_SW_DMA_0
)
{
if
((
AP
&
0x0F
)
||
(
BP
&
0x07
))
{
/* clear PIO modes of lower 8421 bits of A Register */
pci_write_config_byte
(
dev
,
(
drive_pci
),
AP
&~
0x0F
);
pci_read_config_byte
(
dev
,
(
drive_pci
),
&
AP
);
/* clear PIO modes of lower 421 bits of B Register */
pci_write_config_byte
(
dev
,
(
drive_pci
)
|
0x01
,
BP
&~
0x07
);
pci_read_config_byte
(
dev
,
(
drive_pci
)
|
0x01
,
&
BP
);
pci_read_config_byte
(
dev
,
(
drive_pci
),
&
AP
);
pci_read_config_byte
(
dev
,
(
drive_pci
)
|
0x01
,
&
BP
);
}
}
else
{
if
((
BP
&
0xF0
)
&&
(
CP
&
0x0F
))
{
/* clear DMA modes of upper 842 bits of B Register */
/* clear PIO forced mode upper 1 bit of B Register */
pci_write_config_byte
(
dev
,
(
drive_pci
)
|
0x01
,
BP
&~
0xF0
);
pci_read_config_byte
(
dev
,
(
drive_pci
)
|
0x01
,
&
BP
);
/* clear DMA modes of lower 8421 bits of C Register */
pci_write_config_byte
(
dev
,
(
drive_pci
)
|
0x02
,
CP
&~
0x0F
);
pci_read_config_byte
(
dev
,
(
drive_pci
)
|
0x02
,
&
CP
);
}
}
pci_read_config_byte
(
dev
,
(
drive_pci
),
&
AP
);
pci_read_config_byte
(
dev
,
(
drive_pci
)
|
0x01
,
&
BP
);
pci_read_config_byte
(
dev
,
(
drive_pci
)
|
0x02
,
&
CP
);
switch
(
speed
)
{
case
XFER_UDMA_6
:
speed
=
XFER_UDMA_5
;
case
XFER_UDMA_5
:
case
XFER_UDMA_4
:
TB
=
0x20
;
TC
=
0x01
;
break
;
case
XFER_UDMA_2
:
TB
=
0x20
;
TC
=
0x01
;
break
;
case
XFER_UDMA_3
:
case
XFER_UDMA_1
:
TB
=
0x40
;
TC
=
0x02
;
break
;
case
XFER_UDMA_0
:
case
XFER_MW_DMA_2
:
TB
=
0x60
;
TC
=
0x03
;
break
;
case
XFER_MW_DMA_1
:
TB
=
0x60
;
TC
=
0x04
;
break
;
case
XFER_MW_DMA_0
:
case
XFER_SW_DMA_2
:
TB
=
0x60
;
TC
=
0x05
;
break
;
case
XFER_SW_DMA_1
:
TB
=
0x80
;
TC
=
0x06
;
break
;
case
XFER_SW_DMA_0
:
TB
=
0xC0
;
TC
=
0x0B
;
break
;
case
XFER_PIO_4
:
TA
=
0x01
;
TB
=
0x04
;
break
;
case
XFER_PIO_3
:
TA
=
0x02
;
TB
=
0x06
;
break
;
case
XFER_PIO_2
:
TA
=
0x03
;
TB
=
0x08
;
break
;
case
XFER_PIO_1
:
TA
=
0x05
;
TB
=
0x0C
;
break
;
case
XFER_PIO_0
:
default:
TA
=
0x09
;
TB
=
0x13
;
break
;
}
if
(
speed
<
XFER_SW_DMA_0
)
{
pci_write_config_byte
(
dev
,
(
drive_pci
),
AP
|
TA
);
pci_write_config_byte
(
dev
,
(
drive_pci
)
|
0x01
,
BP
|
TB
);
}
else
{
pci_write_config_byte
(
dev
,
(
drive_pci
)
|
0x01
,
BP
|
TB
);
pci_write_config_byte
(
dev
,
(
drive_pci
)
|
0x02
,
CP
|
TC
);
}
#if PDC202XX_DECODE_REGISTER_INFO
pci_read_config_byte
(
dev
,
(
drive_pci
),
&
AP
);
pci_read_config_byte
(
dev
,
(
drive_pci
)
|
0x01
,
&
BP
);
pci_read_config_byte
(
dev
,
(
drive_pci
)
|
0x02
,
&
CP
);
pci_read_config_byte
(
dev
,
(
drive_pci
)
|
0x03
,
&
DP
);
decode_registers
(
REG_A
,
AP
);
decode_registers
(
REG_B
,
BP
);
decode_registers
(
REG_C
,
CP
);
decode_registers
(
REG_D
,
DP
);
#endif
/* PDC202XX_DECODE_REGISTER_INFO */
#if PDC202XX_DEBUG_DRIVE_INFO
printk
(
KERN_DEBUG
"%s: %s drive%d 0x%08x "
,
drive
->
name
,
ide_xfer_verbose
(
speed
),
drive
->
dn
,
drive_conf
);
pci_read_config_dword
(
dev
,
drive_pci
,
&
drive_conf
);
printk
(
"0x%08x
\n
"
,
drive_conf
);
#endif
/* PDC202XX_DEBUG_DRIVE_INFO */
return
(
ide_config_drive_speed
(
drive
,
speed
));
}
static
int
pdcnew_new_tune_chipset
(
ide_drive_t
*
drive
,
u8
xferspeed
)
{
ide_hwif_t
*
hwif
=
HWIF
(
drive
);
...
...
@@ -288,19 +186,14 @@ static int pdcnew_new_tune_chipset (ide_drive_t *drive, u8 xferspeed)
* 180, 120, 90, 90, 90, 60, 30
* 11, 5, 4, 3, 2, 1, 0
*/
static
int
config_chipset_for_pio
(
ide_drive_t
*
drive
,
u8
pio
)
static
void
pdcnew_tune_drive
(
ide_drive_t
*
drive
,
u8
pio
)
{
u8
speed
=
0
;
u8
speed
;
if
(
pio
==
5
)
pio
=
4
;
speed
=
XFER_PIO_0
+
ide_get_best_pio_mode
(
drive
,
255
,
pio
,
NULL
);
return
((
int
)
pdcnew_tune_chipset
(
drive
,
speed
));
}
static
void
pdcnew_tune_drive
(
ide_drive_t
*
drive
,
u8
pio
)
{
(
void
)
config_chipset_for_pio
(
drive
,
pio
);
(
void
)
pdcnew_new_tune_chipset
(
drive
,
speed
);
}
static
u8
pdcnew_new_cable_detect
(
ide_hwif_t
*
hwif
)
...
...
@@ -312,56 +205,15 @@ static int config_chipset_for_dma (ide_drive_t *drive)
{
struct
hd_driveid
*
id
=
drive
->
id
;
ide_hwif_t
*
hwif
=
HWIF
(
drive
);
struct
pci_dev
*
dev
=
hwif
->
pci_dev
;
u8
speed
=
-
1
;
u8
cable
=
0
;
u8
cable
;
u8
ultra_66
=
((
id
->
dma_ultra
&
0x0010
)
||
(
id
->
dma_ultra
&
0x0008
))
?
1
:
0
;
switch
(
dev
->
device
)
{
case
PCI_DEVICE_ID_PROMISE_20277
:
case
PCI_DEVICE_ID_PROMISE_20276
:
case
PCI_DEVICE_ID_PROMISE_20275
:
case
PCI_DEVICE_ID_PROMISE_20271
:
case
PCI_DEVICE_ID_PROMISE_20269
:
case
PCI_DEVICE_ID_PROMISE_20270
:
case
PCI_DEVICE_ID_PROMISE_20268
:
cable
=
pdcnew_new_cable_detect
(
hwif
);
#if PDC202_DEBUG_CABLE
printk
(
KERN_DEBUG
"%s: %s-pin cable, %s-pin cable, %d
\n
"
,
hwif
->
name
,
hwif
->
udma_four
?
"80"
:
"40"
,
cable
?
"40"
:
"80"
,
cable
);
#endif
/* PDC202_DEBUG_CABLE */
break
;
default:
/* If it's not one we know we should never
arrive here.. */
BUG
();
}
cable
=
pdcnew_new_cable_detect
(
hwif
);
/*
* Set the control register to use the 66Mhz system
* clock for UDMA 3/4 mode operation. If one drive on
* a channel is U66 capable but the other isn't we
* fall back to U33 mode. The BIOS INT 13 hooks turn
* the clock on then off for each read/write issued. I don't
* do that here because it would require modifying the
* kernel, separating the fop routines from the kernel or
* somehow hooking the fops calls. It may also be possible to
* leave the 66Mhz clock on and readjust the timing
* parameters.
*/
if
((
ultra_66
)
&&
(
cable
))
{
#ifdef DEBUG
printk
(
KERN_DEBUG
"ULTRA 66/100/133: %s channel of Ultra 66/100/133 "
"requires an 80-pin cable for Ultra66 operation.
\n
"
,
hwif
->
channel
?
"Secondary"
:
"Primary"
);
printk
(
KERN_DEBUG
" Switching to Ultra33 mode.
\n
"
);
#endif
/* DEBUG */
/* Primary : zero out second bit */
/* Secondary : zero out fourth bit */
if
(
ultra_66
&&
cable
)
{
printk
(
KERN_WARNING
"Warning: %s channel requires an 80-pin cable for operation.
\n
"
,
hwif
->
channel
?
"Secondary"
:
"Primary"
);
printk
(
KERN_WARNING
"%s reduced to Ultra33 mode.
\n
"
,
drive
->
name
);
}
...
...
@@ -590,10 +442,7 @@ static void __init init_hwif_pdc202new (ide_hwif_t *hwif)
hwif
->
speedproc
=
&
pdcnew_new_tune_chipset
;
hwif
->
resetproc
=
&
pdcnew_new_reset
;
if
(
!
hwif
->
dma_base
)
{
hwif
->
drives
[
0
].
autotune
=
hwif
->
drives
[
1
].
autotune
=
1
;
return
;
}
hwif
->
drives
[
0
].
autotune
=
hwif
->
drives
[
1
].
autotune
=
1
;
hwif
->
ultra_mask
=
0x7f
;
hwif
->
mwdma_mask
=
0x07
;
...
...
drivers/ide/pci/pdc202xx_new.h
View file @
22e9af4e
...
...
@@ -5,15 +5,6 @@
#include <linux/pci.h>
#include <linux/ide.h>
#define DISPLAY_PDC202XX_TIMINGS
#ifndef SPLIT_BYTE
#define SPLIT_BYTE(B,H,L) ((H)=(B>>4), (L)=(B-((B>>4)<<4)))
#endif
#define PDC202XX_DEBUG_DRIVE_INFO 0
#define PDC202XX_DECODE_REGISTER_INFO 0
const
static
char
*
pdc_quirk_drives
[]
=
{
"QUANTUM FIREBALLlct08 08"
,
"QUANTUM FIREBALLP KA6.4"
,
...
...
@@ -26,116 +17,6 @@ const static char *pdc_quirk_drives[] = {
NULL
};
/* A Register */
#define SYNC_ERRDY_EN 0xC0
#define SYNC_IN 0x80
/* control bit, different for master vs. slave drives */
#define ERRDY_EN 0x40
/* control bit, different for master vs. slave drives */
#define IORDY_EN 0x20
/* PIO: IOREADY */
#define PREFETCH_EN 0x10
/* PIO: PREFETCH */
#define PA3 0x08
/* PIO"A" timing */
#define PA2 0x04
/* PIO"A" timing */
#define PA1 0x02
/* PIO"A" timing */
#define PA0 0x01
/* PIO"A" timing */
/* B Register */
#define MB2 0x80
/* DMA"B" timing */
#define MB1 0x40
/* DMA"B" timing */
#define MB0 0x20
/* DMA"B" timing */
#define PB4 0x10
/* PIO_FORCE 1:0 */
#define PB3 0x08
/* PIO"B" timing */
/* PIO flow Control mode */
#define PB2 0x04
/* PIO"B" timing */
/* PIO 4 */
#define PB1 0x02
/* PIO"B" timing */
/* PIO 3 half */
#define PB0 0x01
/* PIO"B" timing */
/* PIO 3 other half */
/* C Register */
#define IORDYp_NO_SPEED 0x4F
#define SPEED_DIS 0x0F
#define DMARQp 0x80
#define IORDYp 0x40
#define DMAR_EN 0x20
#define DMAW_EN 0x10
#define MC3 0x08
/* DMA"C" timing */
#define MC2 0x04
/* DMA"C" timing */
#define MC1 0x02
/* DMA"C" timing */
#define MC0 0x01
/* DMA"C" timing */
#if PDC202XX_DECODE_REGISTER_INFO
#define REG_A 0x01
#define REG_B 0x02
#define REG_C 0x04
#define REG_D 0x08
static
void
decode_registers
(
u8
registers
,
u8
value
)
{
u8
bit
=
0
,
bit1
=
0
,
bit2
=
0
;
switch
(
registers
)
{
case
REG_A
:
bit2
=
0
;
printk
(
"A Register "
);
if
(
value
&
0x80
)
printk
(
"SYNC_IN "
);
if
(
value
&
0x40
)
printk
(
"ERRDY_EN "
);
if
(
value
&
0x20
)
printk
(
"IORDY_EN "
);
if
(
value
&
0x10
)
printk
(
"PREFETCH_EN "
);
if
(
value
&
0x08
)
{
printk
(
"PA3 "
);
bit2
|=
0x08
;
}
if
(
value
&
0x04
)
{
printk
(
"PA2 "
);
bit2
|=
0x04
;
}
if
(
value
&
0x02
)
{
printk
(
"PA1 "
);
bit2
|=
0x02
;
}
if
(
value
&
0x01
)
{
printk
(
"PA0 "
);
bit2
|=
0x01
;
}
printk
(
"PIO(A) = %d "
,
bit2
);
break
;
case
REG_B
:
bit1
=
0
;
bit2
=
0
;
printk
(
"B Register "
);
if
(
value
&
0x80
)
{
printk
(
"MB2 "
);
bit1
|=
0x80
;
}
if
(
value
&
0x40
)
{
printk
(
"MB1 "
);
bit1
|=
0x40
;
}
if
(
value
&
0x20
)
{
printk
(
"MB0 "
);
bit1
|=
0x20
;
}
printk
(
"DMA(B) = %d "
,
bit1
>>
5
);
if
(
value
&
0x10
)
printk
(
"PIO_FORCED/PB4 "
);
if
(
value
&
0x08
)
{
printk
(
"PB3 "
);
bit2
|=
0x08
;
}
if
(
value
&
0x04
)
{
printk
(
"PB2 "
);
bit2
|=
0x04
;
}
if
(
value
&
0x02
)
{
printk
(
"PB1 "
);
bit2
|=
0x02
;
}
if
(
value
&
0x01
)
{
printk
(
"PB0 "
);
bit2
|=
0x01
;
}
printk
(
"PIO(B) = %d "
,
bit2
);
break
;
case
REG_C
:
bit2
=
0
;
printk
(
"C Register "
);
if
(
value
&
0x80
)
printk
(
"DMARQp "
);
if
(
value
&
0x40
)
printk
(
"IORDYp "
);
if
(
value
&
0x20
)
printk
(
"DMAR_EN "
);
if
(
value
&
0x10
)
printk
(
"DMAW_EN "
);
if
(
value
&
0x08
)
{
printk
(
"MC3 "
);
bit2
|=
0x08
;
}
if
(
value
&
0x04
)
{
printk
(
"MC2 "
);
bit2
|=
0x04
;
}
if
(
value
&
0x02
)
{
printk
(
"MC1 "
);
bit2
|=
0x02
;
}
if
(
value
&
0x01
)
{
printk
(
"MC0 "
);
bit2
|=
0x01
;
}
printk
(
"DMA(C) = %d "
,
bit2
);
break
;
case
REG_D
:
printk
(
"D Register "
);
break
;
default:
return
;
}
printk
(
"
\n
%s "
,
(
registers
&
REG_D
)
?
"DP"
:
(
registers
&
REG_C
)
?
"CP"
:
(
registers
&
REG_B
)
?
"BP"
:
(
registers
&
REG_A
)
?
"AP"
:
"ERROR"
);
for
(
bit
=
128
;
bit
>
0
;
bit
/=
2
)
printk
(
"%s"
,
(
value
&
bit
)
?
"1"
:
"0"
);
printk
(
"
\n
"
);
}
#endif
/* PDC202XX_DECODE_REGISTER_INFO */
#define set_2regs(a, b) \
do { \
hwif->OUTB((a + adj), indexreg); \
...
...
drivers/ide/pci/piix.c
View file @
22e9af4e
...
...
@@ -814,7 +814,7 @@ static struct pci_driver driver = {
.
probe
=
piix_init_one
,
};
static
int
piix_ide_init
(
void
)
static
int
__init
piix_ide_init
(
void
)
{
piix_check_450nx
();
return
ide_pci_register_driver
(
&
driver
);
...
...
drivers/scsi/sata_promise.c
View file @
22e9af4e
...
...
@@ -1791,13 +1791,7 @@ static int pdc_sata_init_one (struct pci_dev *pdev, const struct pci_device_id *
static
int
__init
pdc_sata_init
(
void
)
{
int
rc
;
rc
=
pci_module_init
(
&
pdc_sata_pci_driver
);
if
(
rc
)
return
rc
;
return
0
;
return
pci_module_init
(
&
pdc_sata_pci_driver
);
}
...
...
drivers/scsi/sata_sil.c
View file @
22e9af4e
...
...
@@ -244,13 +244,9 @@ static void sil_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val)
static
void
sil_dev_config
(
struct
ata_port
*
ap
,
struct
ata_device
*
dev
)
{
unsigned
int
n
,
quirks
=
0
;
u32
class_rev
=
0
;
const
char
*
s
=
&
dev
->
product
[
0
];
unsigned
int
len
=
strnlen
(
s
,
sizeof
(
dev
->
product
));
pci_read_config_dword
(
ap
->
host_set
->
pdev
,
PCI_CLASS_REVISION
,
&
class_rev
);
class_rev
&=
0xff
;
/* ATAPI specifies that empty space is blank-filled; remove blanks */
while
((
len
>
0
)
&&
(
s
[
len
-
1
]
==
' '
))
len
--
;
...
...
@@ -263,7 +259,7 @@ static void sil_dev_config(struct ata_port *ap, struct ata_device *dev)
}
/* limit requests to 15 sectors */
if
(
(
class_rev
<=
0x01
)
&&
(
quirks
&
SIL_QUIRK_MOD15WRITE
)
)
{
if
(
quirks
&
SIL_QUIRK_MOD15WRITE
)
{
printk
(
KERN_INFO
"ata%u(%u): applying Seagate errata fix
\n
"
,
ap
->
id
,
dev
->
devno
);
ap
->
host
->
max_sectors
=
15
;
...
...
@@ -272,7 +268,6 @@ static void sil_dev_config(struct ata_port *ap, struct ata_device *dev)
}
/* limit to udma5 */
/* is this for (class_rev <= 0x01) only, too? */
if
(
quirks
&
SIL_QUIRK_UDMA5MAX
)
{
printk
(
KERN_INFO
"ata%u(%u): applying Maxtor errata fix %s
\n
"
,
ap
->
id
,
dev
->
devno
,
s
);
...
...
@@ -405,13 +400,7 @@ static int sil_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
static
int
__init
sil_init
(
void
)
{
int
rc
;
rc
=
pci_module_init
(
&
sil_pci_driver
);
if
(
rc
)
return
rc
;
return
0
;
return
pci_module_init
(
&
sil_pci_driver
);
}
static
void
__exit
sil_exit
(
void
)
...
...
drivers/scsi/sata_svw.c
View file @
22e9af4e
...
...
@@ -375,16 +375,9 @@ static struct pci_driver k2_sata_pci_driver = {
static
int
__init
k2_sata_init
(
void
)
{
int
rc
;
rc
=
pci_module_init
(
&
k2_sata_pci_driver
);
if
(
rc
)
return
rc
;
return
0
;
return
pci_module_init
(
&
k2_sata_pci_driver
);
}
static
void
__exit
k2_sata_exit
(
void
)
{
pci_unregister_driver
(
&
k2_sata_pci_driver
);
...
...
drivers/scsi/sata_vsc.c
View file @
22e9af4e
...
...
@@ -5,25 +5,11 @@
*
* Bits from Jeff Garzik, Copyright RedHat, Inc.
*
* The contents of this file are subject to the Open
* Software License version 1.1 that can be found at
* http://www.opensource.org/licenses/osl-1.1.txt and is included herein
* by reference.
*
* Alternatively, the contents of this file may be used under the terms
* of the GNU General Public License version 2 (the "GPL") as distributed
* in the kernel source COPYING file, in which case the provisions of
* the GPL are applicable instead of the above. If you wish to allow
* the use of your version of this file only under the terms of the
* GPL and not to allow others to use your version of this file under
* the OSL, indicate your decision by deleting the provisions above and
* replace them with the notice and other provisions required by the GPL.
* If you do not delete the provisions above, a recipient may use your
* version of this file under either the OSL or the GPL.
*
* This file is subject to the terms and conditions of the GNU General Public
* License. See the file "COPYING" in the main directory of this archive
* for more details.
*/
#include <linux/config.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/pci.h>
...
...
@@ -232,7 +218,7 @@ static struct ata_port_operations vsc_sata_ops = {
.
port_stop
=
ata_port_stop
,
};
static
void
vsc_sata_setup_port
(
struct
ata_ioports
*
port
,
unsigned
long
base
)
static
void
__devinit
vsc_sata_setup_port
(
struct
ata_ioports
*
port
,
unsigned
long
base
)
{
port
->
cmd_addr
=
base
+
VSC_SATA_TF_CMD_OFFSET
;
port
->
data_addr
=
base
+
VSC_SATA_TF_DATA_OFFSET
;
...
...
@@ -252,7 +238,7 @@ static void vsc_sata_setup_port(struct ata_ioports *port, unsigned long base)
}
static
int
vsc_sata_init_one
(
struct
pci_dev
*
pdev
,
const
struct
pci_device_id
*
ent
)
static
int
__devinit
vsc_sata_init_one
(
struct
pci_dev
*
pdev
,
const
struct
pci_device_id
*
ent
)
{
static
int
printed_version
;
struct
ata_probe_ent
*
probe_ent
=
NULL
;
...
...
@@ -350,6 +336,11 @@ static int vsc_sata_init_one (struct pci_dev *pdev, const struct pci_device_id *
}
/*
* 0x1725/0x7174 is the Vitesse VSC-7174
* 0x8086/0x3200 is the Intel 31244, which is supposed to be identical
* compatibility is untested as of yet
*/
static
struct
pci_device_id
vsc_sata_pci_tbl
[]
=
{
{
0x1725
,
0x7174
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0x10600
,
0xFFFFFF
,
0
},
{
0x8086
,
0x3200
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0x10600
,
0xFFFFFF
,
0
},
...
...
@@ -367,13 +358,7 @@ static struct pci_driver vsc_sata_pci_driver = {
static
int
__init
vsc_sata_init
(
void
)
{
int
rc
;
rc
=
pci_module_init
(
&
vsc_sata_pci_driver
);
if
(
rc
)
return
rc
;
return
0
;
return
pci_module_init
(
&
vsc_sata_pci_driver
);
}
...
...
include/linux/ide.h
View file @
22e9af4e
...
...
@@ -143,17 +143,8 @@ typedef unsigned char byte; /* used everywhere */
#define IDE_FEATURE_OFFSET IDE_ERROR_OFFSET
#define IDE_COMMAND_OFFSET IDE_STATUS_OFFSET
#define IDE_DATA_OFFSET_HOB (0)
#define IDE_ERROR_OFFSET_HOB (1)
#define IDE_NSECTOR_OFFSET_HOB (2)
#define IDE_SECTOR_OFFSET_HOB (3)
#define IDE_LCYL_OFFSET_HOB (4)
#define IDE_HCYL_OFFSET_HOB (5)
#define IDE_SELECT_OFFSET_HOB (6)
#define IDE_CONTROL_OFFSET_HOB (7)
#define IDE_FEATURE_OFFSET_HOB IDE_ERROR_OFFSET_HOB
#define IDE_DATA_REG (HWIF(drive)->io_ports[IDE_DATA_OFFSET])
#define IDE_ERROR_REG (HWIF(drive)->io_ports[IDE_ERROR_OFFSET])
#define IDE_NSECTOR_REG (HWIF(drive)->io_ports[IDE_NSECTOR_OFFSET])
...
...
@@ -165,16 +156,6 @@ typedef unsigned char byte; /* used everywhere */
#define IDE_CONTROL_REG (HWIF(drive)->io_ports[IDE_CONTROL_OFFSET])
#define IDE_IRQ_REG (HWIF(drive)->io_ports[IDE_IRQ_OFFSET])
#define IDE_DATA_REG_HOB (HWIF(drive)->io_ports[IDE_DATA_OFFSET])
#define IDE_ERROR_REG_HOB (HWIF(drive)->io_ports[IDE_ERROR_OFFSET])
#define IDE_NSECTOR_REG_HOB (HWIF(drive)->io_ports[IDE_NSECTOR_OFFSET])
#define IDE_SECTOR_REG_HOB (HWIF(drive)->io_ports[IDE_SECTOR_OFFSET])
#define IDE_LCYL_REG_HOB (HWIF(drive)->io_ports[IDE_LCYL_OFFSET])
#define IDE_HCYL_REG_HOB (HWIF(drive)->io_ports[IDE_HCYL_OFFSET])
#define IDE_SELECT_REG_HOB (HWIF(drive)->io_ports[IDE_SELECT_OFFSET])
#define IDE_STATUS_REG_HOB (HWIF(drive)->io_ports[IDE_STATUS_OFFSET])
#define IDE_CONTROL_REG_HOB (HWIF(drive)->io_ports[IDE_CONTROL_OFFSET])
#define IDE_FEATURE_REG IDE_ERROR_REG
#define IDE_COMMAND_REG IDE_STATUS_REG
#define IDE_ALTSTATUS_REG IDE_CONTROL_REG
...
...
@@ -998,7 +979,6 @@ typedef struct hwif_s {
*/
typedef
ide_startstop_t
(
ide_pre_handler_t
)(
ide_drive_t
*
,
struct
request
*
);
typedef
ide_startstop_t
(
ide_handler_t
)(
ide_drive_t
*
);
typedef
ide_startstop_t
(
ide_post_handler_t
)(
ide_drive_t
*
);
typedef
int
(
ide_expiry_t
)(
ide_drive_t
*
);
typedef
struct
hwgroup_s
{
...
...
@@ -1360,7 +1340,6 @@ typedef struct ide_task_s {
int
command_type
;
ide_pre_handler_t
*
prehandler
;
ide_handler_t
*
handler
;
ide_post_handler_t
*
posthandler
;
struct
request
*
rq
;
/* copy of request */
void
*
special
;
/* valid_t generally */
}
ide_task_t
;
...
...
@@ -1455,19 +1434,9 @@ extern ide_startstop_t pre_task_out_intr(ide_drive_t *, struct request *);
extern
ide_startstop_t
task_out_intr
(
ide_drive_t
*
);
extern
ide_startstop_t
pre_task_mulout_intr
(
ide_drive_t
*
,
struct
request
*
);
extern
ide_startstop_t
task_mulout_intr
(
ide_drive_t
*
);
extern
void
ide_init_drive_taskfile
(
struct
request
*
);
extern
int
ide_raw_taskfile
(
ide_drive_t
*
,
ide_task_t
*
,
u8
*
);
extern
ide_pre_handler_t
*
ide_pre_handler_parser
(
struct
hd_drive_task_hdr
*
,
struct
hd_drive_hob_hdr
*
);
extern
ide_handler_t
*
ide_handler_parser
(
struct
hd_drive_task_hdr
*
,
struct
hd_drive_hob_hdr
*
);
extern
ide_post_handler_t
*
ide_post_handler_parser
(
struct
hd_drive_task_hdr
*
,
struct
hd_drive_hob_hdr
*
);
/* Expects args is a full set of TF registers and parses the command type */
extern
int
ide_cmd_type_parser
(
ide_task_t
*
);
int
ide_taskfile_ioctl
(
ide_drive_t
*
,
unsigned
int
,
unsigned
long
);
int
ide_cmd_ioctl
(
ide_drive_t
*
,
unsigned
int
,
unsigned
long
);
int
ide_task_ioctl
(
ide_drive_t
*
,
unsigned
int
,
unsigned
long
);
...
...
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