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
c9c13c7b
Commit
c9c13c7b
authored
Sep 15, 2002
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge master.kernel.org:/home/hch/BK/xfs/linux-2.5
into home.transmeta.com:/home/torvalds/v2.5/linux
parents
f67dd842
13c7e0d4
Changes
67
Hide whitespace changes
Inline
Side-by-side
Showing
67 changed files
with
1752 additions
and
2207 deletions
+1752
-2207
drivers/block/elevator.c
drivers/block/elevator.c
+14
-33
drivers/block/ll_rw_blk.c
drivers/block/ll_rw_blk.c
+0
-2
drivers/ide/Config.in
drivers/ide/Config.in
+29
-49
drivers/ide/Makefile
drivers/ide/Makefile
+9
-4
drivers/ide/ide-dma.c
drivers/ide/ide-dma.c
+7
-1
drivers/ide/ide-lib.c
drivers/ide/ide-lib.c
+200
-0
drivers/ide/ide-probe.c
drivers/ide/ide-probe.c
+13
-3
drivers/ide/ide.c
drivers/ide/ide.c
+2
-1
drivers/ide/ide_modes.h
drivers/ide/ide_modes.h
+0
-195
drivers/ide/legacy/Makefile
drivers/ide/legacy/Makefile
+1
-0
drivers/ide/legacy/hd.c
drivers/ide/legacy/hd.c
+1
-0
drivers/ide/pci/Makefile
drivers/ide/pci/Makefile
+3
-1
drivers/ide/pci/aec62xx.c
drivers/ide/pci/aec62xx.c
+61
-16
drivers/ide/pci/aec62xx.h
drivers/ide/pci/aec62xx.h
+5
-10
drivers/ide/pci/alim15x3.c
drivers/ide/pci/alim15x3.c
+46
-24
drivers/ide/pci/alim15x3.h
drivers/ide/pci/alim15x3.h
+1
-3
drivers/ide/pci/amd74xx.c
drivers/ide/pci/amd74xx.c
+49
-14
drivers/ide/pci/amd74xx.h
drivers/ide/pci/amd74xx.h
+5
-11
drivers/ide/pci/cmd64x.c
drivers/ide/pci/cmd64x.c
+50
-22
drivers/ide/pci/cmd64x.h
drivers/ide/pci/cmd64x.h
+3
-8
drivers/ide/pci/cs5530.c
drivers/ide/pci/cs5530.c
+42
-29
drivers/ide/pci/cs5530.h
drivers/ide/pci/cs5530.h
+1
-3
drivers/ide/pci/cy82c693.c
drivers/ide/pci/cy82c693.c
+45
-18
drivers/ide/pci/cy82c693.h
drivers/ide/pci/cy82c693.h
+1
-3
drivers/ide/pci/generic.c
drivers/ide/pci/generic.c
+75
-13
drivers/ide/pci/generic.h
drivers/ide/pci/generic.h
+10
-10
drivers/ide/pci/hpt34x.c
drivers/ide/pci/hpt34x.c
+45
-17
drivers/ide/pci/hpt34x.h
drivers/ide/pci/hpt34x.h
+1
-3
drivers/ide/pci/hpt366.c
drivers/ide/pci/hpt366.c
+63
-15
drivers/ide/pci/hpt366.h
drivers/ide/pci/hpt366.h
+5
-5
drivers/ide/pci/it8172.c
drivers/ide/pci/it8172.c
+43
-15
drivers/ide/pci/it8172.h
drivers/ide/pci/it8172.h
+1
-1
drivers/ide/pci/ns87415.c
drivers/ide/pci/ns87415.c
+45
-15
drivers/ide/pci/ns87415.h
drivers/ide/pci/ns87415.h
+1
-3
drivers/ide/pci/nvidia.c
drivers/ide/pci/nvidia.c
+46
-17
drivers/ide/pci/nvidia.h
drivers/ide/pci/nvidia.h
+1
-7
drivers/ide/pci/opti621.c
drivers/ide/pci/opti621.c
+50
-14
drivers/ide/pci/opti621.h
drivers/ide/pci/opti621.h
+2
-2
drivers/ide/pci/pdc202xx.c
drivers/ide/pci/pdc202xx.c
+0
-1181
drivers/ide/pci/pdc202xx_new.c
drivers/ide/pci/pdc202xx_new.c
+64
-13
drivers/ide/pci/pdc202xx_new.h
drivers/ide/pci/pdc202xx_new.h
+7
-7
drivers/ide/pci/pdc202xx_old.c
drivers/ide/pci/pdc202xx_old.c
+63
-14
drivers/ide/pci/pdc202xx_old.h
drivers/ide/pci/pdc202xx_old.h
+5
-5
drivers/ide/pci/pdcadma.c
drivers/ide/pci/pdcadma.c
+46
-17
drivers/ide/pci/pdcadma.h
drivers/ide/pci/pdcadma.h
+1
-1
drivers/ide/pci/piix.c
drivers/ide/pci/piix.c
+69
-18
drivers/ide/pci/piix.h
drivers/ide/pci/piix.h
+24
-18
drivers/ide/pci/rz1000.c
drivers/ide/pci/rz1000.c
+48
-16
drivers/ide/pci/rz1000.h
drivers/ide/pci/rz1000.h
+0
-3
drivers/ide/pci/serverworks.c
drivers/ide/pci/serverworks.c
+67
-14
drivers/ide/pci/serverworks.h
drivers/ide/pci/serverworks.h
+4
-4
drivers/ide/pci/siimage.c
drivers/ide/pci/siimage.c
+47
-15
drivers/ide/pci/siimage.h
drivers/ide/pci/siimage.h
+2
-5
drivers/ide/pci/sis5513.c
drivers/ide/pci/sis5513.c
+46
-15
drivers/ide/pci/sis5513.h
drivers/ide/pci/sis5513.h
+1
-3
drivers/ide/pci/sl82c105.c
drivers/ide/pci/sl82c105.c
+43
-14
drivers/ide/pci/sl82c105.h
drivers/ide/pci/sl82c105.h
+1
-3
drivers/ide/pci/slc90e66.c
drivers/ide/pci/slc90e66.c
+46
-15
drivers/ide/pci/slc90e66.h
drivers/ide/pci/slc90e66.h
+1
-3
drivers/ide/pci/trm290.c
drivers/ide/pci/trm290.c
+46
-16
drivers/ide/pci/trm290.h
drivers/ide/pci/trm290.h
+1
-3
drivers/ide/pci/via82cxxx.c
drivers/ide/pci/via82cxxx.c
+43
-24
drivers/ide/pci/via82cxxx.h
drivers/ide/pci/via82cxxx.h
+2
-5
drivers/ide/setup-pci.c
drivers/ide/setup-pci.c
+56
-150
fs/bio.c
fs/bio.c
+39
-11
include/linux/elevator.h
include/linux/elevator.h
+1
-4
include/linux/ide.h
include/linux/ide.h
+3
-23
No files found.
drivers/block/elevator.c
View file @
c9c13c7b
...
...
@@ -177,14 +177,9 @@ int elevator_linus_merge(request_queue_t *q, struct request **req,
if
(
__rq
->
flags
&
(
REQ_BARRIER
|
REQ_STARTED
))
break
;
/*
* simply "aging" of requests in queue
*/
if
(
elv_linus_sequence
(
__rq
)
--
<=
0
)
break
;
if
(
!
(
__rq
->
flags
&
REQ_CMD
))
continue
;
if
(
elv_linus_sequence
(
__rq
)
<
bio_sectors
(
bio
))
break
;
...
...
@@ -200,24 +195,20 @@ int elevator_linus_merge(request_queue_t *q, struct request **req,
}
}
return
ret
;
}
void
elevator_linus_merge_cleanup
(
request_queue_t
*
q
,
struct
request
*
req
,
int
count
)
{
struct
list_head
*
entry
;
BUG_ON
(
req
->
q
!=
q
);
/*
*
second pass scan of requests that got passed over, if any
*
if *req, it's either a seek or merge in the middle of the queue
*/
entry
=
&
req
->
queuelist
;
while
((
entry
=
entry
->
next
)
!=
&
q
->
queue_head
)
{
struct
request
*
tmp
;
tmp
=
list_entry_rq
(
entry
);
elv_linus_sequence
(
tmp
)
-=
count
;
if
(
*
req
)
{
struct
list_head
*
entry
=
&
(
*
req
)
->
queuelist
;
int
cost
=
ret
?
1
:
ELV_LINUS_SEEK_COST
;
while
((
entry
=
entry
->
next
)
!=
&
q
->
queue_head
)
{
__rq
=
list_entry_rq
(
entry
);
elv_linus_sequence
(
__rq
)
-=
cost
;
}
}
return
ret
;
}
void
elevator_linus_merge_req
(
request_queue_t
*
q
,
struct
request
*
req
,
...
...
@@ -260,8 +251,8 @@ int elevator_linus_init(request_queue_t *q, elevator_t *e)
if
(
!
latency
)
return
-
ENOMEM
;
latency
[
READ
]
=
8192
;
latency
[
WRITE
]
=
16384
;
latency
[
READ
]
=
1024
;
latency
[
WRITE
]
=
2048
;
e
->
elevator_data
=
latency
;
return
0
;
...
...
@@ -355,15 +346,6 @@ int elevator_global_init(void)
return
0
;
}
void
elv_merge_cleanup
(
request_queue_t
*
q
,
struct
request
*
rq
,
int
nr_sectors
)
{
elevator_t
*
e
=
&
q
->
elevator
;
if
(
e
->
elevator_merge_cleanup_fn
)
e
->
elevator_merge_cleanup_fn
(
q
,
rq
,
nr_sectors
);
}
int
elv_merge
(
request_queue_t
*
q
,
struct
request
**
rq
,
struct
bio
*
bio
)
{
elevator_t
*
e
=
&
q
->
elevator
;
...
...
@@ -460,7 +442,6 @@ inline struct list_head *elv_get_sort_head(request_queue_t *q,
elevator_t
elevator_linus
=
{
elevator_merge_fn:
elevator_linus_merge
,
elevator_merge_cleanup_fn:
elevator_linus_merge_cleanup
,
elevator_merge_req_fn:
elevator_linus_merge_req
,
elevator_next_req_fn:
elevator_noop_next_request
,
elevator_add_req_fn:
elevator_linus_add_request
,
...
...
drivers/block/ll_rw_blk.c
View file @
c9c13c7b
...
...
@@ -1508,7 +1508,6 @@ static int __make_request(request_queue_t *q, struct bio *bio)
req
->
biotail
->
bi_next
=
bio
;
req
->
biotail
=
bio
;
req
->
nr_sectors
=
req
->
hard_nr_sectors
+=
nr_sectors
;
elv_merge_cleanup
(
q
,
req
,
nr_sectors
);
drive_stat_acct
(
req
,
nr_sectors
,
0
);
attempt_back_merge
(
q
,
req
);
goto
out
;
...
...
@@ -1532,7 +1531,6 @@ static int __make_request(request_queue_t *q, struct bio *bio)
req
->
hard_cur_sectors
=
cur_nr_sectors
;
req
->
sector
=
req
->
hard_sector
=
sector
;
req
->
nr_sectors
=
req
->
hard_nr_sectors
+=
nr_sectors
;
elv_merge_cleanup
(
q
,
req
,
nr_sectors
);
drive_stat_acct
(
req
,
nr_sectors
,
0
);
attempt_front_merge
(
q
,
req
);
goto
out
;
...
...
drivers/ide/Config.in
View file @
c9c13c7b
...
...
@@ -16,20 +16,8 @@ if [ "$CONFIG_BLK_DEV_IDE" != "n" ]; then
dep_mbool ' Use multi-mode by default' CONFIG_IDEDISK_MULTI_MODE $CONFIG_BLK_DEV_IDEDISK
dep_mbool ' Auto-Geometry Resizing support' CONFIG_IDEDISK_STROKE $CONFIG_BLK_DEV_IDEDISK
define_bool CONFIG_BLK_DEV_IDEDISK_VENDOR n
dep_mbool ' Fujitsu Vendor Specific' CONFIG_BLK_DEV_IDEDISK_FUJITSU $CONFIG_BLK_DEV_IDEDISK_VENDOR
dep_mbool ' IBM Vendor Specific' CONFIG_BLK_DEV_IDEDISK_IBM $CONFIG_BLK_DEV_IDEDISK_VENDOR
dep_mbool ' Maxtor Vendor Specific' CONFIG_BLK_DEV_IDEDISK_MAXTOR $CONFIG_BLK_DEV_IDEDISK_VENDOR
dep_mbool ' Quantum Vendor Specific' CONFIG_BLK_DEV_IDEDISK_QUANTUM $CONFIG_BLK_DEV_IDEDISK_VENDOR
dep_mbool ' Seagate Vendor Specific' CONFIG_BLK_DEV_IDEDISK_SEAGATE $CONFIG_BLK_DEV_IDEDISK_VENDOR
dep_mbool ' Western Digital Vendor Specific' CONFIG_BLK_DEV_IDEDISK_WD $CONFIG_BLK_DEV_IDEDISK_VENDOR
define_bool CONFIG_BLK_DEV_COMMERIAL n
dep_mbool ' TiVo Commerial Application Specific' CONFIG_BLK_DEV_TIVO $CONFIG_BLK_DEV_COMMERIAL
dep_tristate ' PCMCIA IDE support' CONFIG_BLK_DEV_IDECS $CONFIG_BLK_DEV_IDE $CONFIG_PCMCIA
dep_tristate ' Include IDE/ATAPI CDROM support' CONFIG_BLK_DEV_IDECD $CONFIG_BLK_DEV_IDE
dep_mbool ' Reduce media failure retries support' CONFIG_BLK_DEV_IDECD_BAILOUT $CONFIG_BLK_DEV_IDECD
#dep_tristate ' Include IDE/ATAPI TAPE support' CONFIG_BLK_DEV_IDETAPE $CONFIG_BLK_DEV_IDE
dep_tristate ' Include IDE/ATAPI FLOPPY support' CONFIG_BLK_DEV_IDEFLOPPY $CONFIG_BLK_DEV_IDE
dep_tristate ' SCSI emulation support' CONFIG_BLK_DEV_IDESCSI $CONFIG_BLK_DEV_IDE $CONFIG_SCSI
...
...
@@ -45,7 +33,7 @@ if [ "$CONFIG_BLK_DEV_IDE" != "n" ]; then
if [ "$CONFIG_PCI" = "y" ]; then
bool ' Generic PCI IDE chipset support' CONFIG_BLK_DEV_IDEPCI
if [ "$CONFIG_BLK_DEV_IDEPCI" = "y" ]; then
dep_bool '
Orphan
Chipset Support' CONFIG_BLK_DEV_GENERIC $CONFIG_BLK_DEV_IDEPCI
dep_bool '
Generic PCI IDE
Chipset Support' CONFIG_BLK_DEV_GENERIC $CONFIG_BLK_DEV_IDEPCI
bool ' Sharing PCI IDE interrupts support' CONFIG_IDEPCI_SHARE_IRQ
bool ' Generic PCI bus-master DMA support' CONFIG_BLK_DEV_IDEDMA_PCI
bool ' Boot off-board chipsets first support' CONFIG_BLK_DEV_OFFBOARD
...
...
@@ -55,44 +43,40 @@ if [ "$CONFIG_BLK_DEV_IDE" != "n" ]; then
define_bool CONFIG_BLK_DEV_IDEDMA $CONFIG_BLK_DEV_IDEDMA_PCI
dep_bool ' ATA Work(s) In Progress (EXPERIMENTAL)' CONFIG_IDEDMA_PCI_WIP $CONFIG_BLK_DEV_IDEDMA_PCI $CONFIG_EXPERIMENTAL
dep_bool ' Good-Bad DMA Model-Firmware (WIP)' CONFIG_IDEDMA_NEW_DRIVE_LISTINGS $CONFIG_IDEDMA_PCI_WIP
# dep_bool ' Asynchronous DMA support (WIP) (EXPERIMENTAL)' CONFIG_BLK_DEV_ADMA $CONFIG_BLK_DEV_IDEDMA_PCI $CONFIG_IDEDMA_PCI_WIP $CONFIG_EXPERIMENTAL
define_bool CONFIG_BLK_DEV_ADMA $CONFIG_BLK_DEV_IDEDMA_PCI
# dep_bool ' Tag Command Queue DMA support (WIP) (EXPERIMENTAL)' CONFIG_BLK_DEV_IDEDMA_TCQ $CONFIG_BLK_DEV_IDEDMA_PCI $CONFIG_IDEDMA_PCI_WIP $CONFIG_EXPERIMENTAL
dep_bool ' AEC62XX chipset support' CONFIG_BLK_DEV_AEC62XX $CONFIG_BLK_DEV_IDEDMA_PCI
dep_bool ' ALI M15x3 chipset support' CONFIG_BLK_DEV_ALI15X3 $CONFIG_BLK_DEV_IDEDMA_PCI
dep_mbool ' ALI M15x3 WDC support (DANGEROUS)' CONFIG_WDC_ALI15X3 $CONFIG_BLK_DEV_ALI15X3
dep_bool ' AMD Viper support' CONFIG_BLK_DEV_AMD74XX $CONFIG_BLK_DEV_IDEDMA_PCI
dep_mbool ' AMD Viper ATA-66 Override' CONFIG_AMD74XX_OVERRIDE $CONFIG_BLK_DEV_AMD74XX
dep_bool ' CMD64{3|6|8|9} chipset support' CONFIG_BLK_DEV_CMD64X $CONFIG_BLK_DEV_IDEDMA_PCI
dep_bool ' CY82C693 chipset support' CONFIG_BLK_DEV_CY82C693 $CONFIG_BLK_DEV_IDEDMA_PCI
dep_bool ' Cyrix CS5530 MediaGX chipset support' CONFIG_BLK_DEV_CS5530 $CONFIG_BLK_DEV_IDEDMA_PCI
dep_bool ' HPT34X chipset support' CONFIG_BLK_DEV_HPT34X $CONFIG_BLK_DEV_IDEDMA_PCI
dep_mbool ' HPT34X AUTODMA support (WIP)' CONFIG_HPT34X_AUTODMA $CONFIG_BLK_DEV_HPT34X $CONFIG_IDEDMA_PCI_WIP
dep_bool ' HPT366/368/370 chipset support' CONFIG_BLK_DEV_HPT366 $CONFIG_BLK_DEV_IDEDMA_PCI
if [ "$CONFIG_X86" = "y" -o "$CONFIG_IA64" = "y" ]; then
dep_mbool ' Intel PIIXn chipsets support' CONFIG_BLK_DEV_PIIX $CONFIG_BLK_DEV_IDEDMA_PCI
fi
dep_tristate ' AEC62XX chipset support' CONFIG_BLK_DEV_AEC62XX $CONFIG_BLK_DEV_IDEDMA_PCI
dep_tristate ' ALI M15x3 chipset support' CONFIG_BLK_DEV_ALI15X3 $CONFIG_BLK_DEV_IDEDMA_PCI
dep_mbool ' ALI M15x3 WDC support (DANGEROUS)' CONFIG_WDC_ALI15X3 $CONFIG_BLK_DEV_ALI15X3
dep_tristate ' AMD Viper support' CONFIG_BLK_DEV_AMD74XX $CONFIG_BLK_DEV_IDEDMA_PCI
dep_mbool ' AMD Viper ATA-66 Override' CONFIG_AMD74XX_OVERRIDE $CONFIG_BLK_DEV_AMD74XX
dep_tristate ' CMD64{3|6|8|9} chipset support' CONFIG_BLK_DEV_CMD64X $CONFIG_BLK_DEV_IDEDMA_PCI
dep_tristate ' CY82C693 chipset support' CONFIG_BLK_DEV_CY82C693 $CONFIG_BLK_DEV_IDEDMA_PCI
dep_tristate ' Cyrix CS5530 MediaGX chipset support' CONFIG_BLK_DEV_CS5530 $CONFIG_BLK_DEV_IDEDMA_PCI
dep_tristate ' HPT34X chipset support' CONFIG_BLK_DEV_HPT34X $CONFIG_BLK_DEV_IDEDMA_PCI
dep_mbool ' HPT34X AUTODMA support (WIP)' CONFIG_HPT34X_AUTODMA $CONFIG_BLK_DEV_HPT34X $CONFIG_IDEDMA_PCI_WIP
dep_tristate ' HPT366/368/370 chipset support' CONFIG_BLK_DEV_HPT366 $CONFIG_BLK_DEV_IDEDMA_PCI
dep_tristate ' Intel PIIXn chipsets support' CONFIG_BLK_DEV_PIIX $CONFIG_BLK_DEV_IDEDMA_PCI
if [ "$CONFIG_MIPS_ITE8172" = "y" -o "$CONFIG_MIPS_IVR" = "y" ]; then
dep_mbool ' IT8172 IDE support' CONFIG_BLK_DEV_IT8172 $CONFIG_BLK_DEV_IDEDMA_PCI
fi
dep_
bool
' nVidia NFORCE support' CONFIG_BLK_DEV_NFORCE $CONFIG_BLK_DEV_IDEDMA_PCI
dep_
bool
' NS87415 chipset support' CONFIG_BLK_DEV_NS87415 $CONFIG_BLK_DEV_IDEDMA_PCI
dep_
bool
' OPTi 82C621 chipset enhanced support (EXPERIMENTAL)' CONFIG_BLK_DEV_OPTI621 $CONFIG_EXPERIMENTAL
# dep_bool ' Pacific Digital ADMA100 basic support' CONFIG_BLK_DEV_ADMA100
$CONFIG_BLK_DEV_IDEDMA_PCI
dep_bool
' PROMISE PDC202{46|62|65|67} support' CONFIG_BLK_DEV_PDC202XX_OLD $CONFIG
_BLK_DEV_IDEDMA_PCI
dep_
bool ' Special UDMA Feature' CONFIG_PDC202XX_BURST $CONFIG_BLK_DEV_PDC202XX_OLD $CONFI
_BLK_DEV_IDEDMA_PCI
dep_bool ' PROMISE PDC202{68|69|70|71|75|76|77} support' CONFIG_BLK_DEV_PDC202XX_NEW $CONFIG_BLK_DEV_IDEDMA_PCI
dep_bool
' Special FastTrak Feature' CONFIG_PDC202XX_FORCE $CONFIG_BLK_DEV_PDC202XX
dep_
bool
' RZ1000 chipset bugfix/support' CONFIG_BLK_DEV_RZ1000 $CONFIG_X86
dep_
bool
' ServerWorks OSB4/CSB5/CSB6 chipsets support' CONFIG_BLK_DEV_SVWKS $CONFIG_BLK_DEV_IDEDMA_PCI
dep_
bool
' Silicon Image chipset support' CONFIG_BLK_DEV_SIIMAGE $CONFIG_BLK_DEV_IDEDMA_PCI
dep_
bool
' SiS5513 chipset support' CONFIG_BLK_DEV_SIS5513 $CONFIG_BLK_DEV_IDEDMA_PCI $CONFIG_X86
dep_
bool
' SLC90E66 chipset support' CONFIG_BLK_DEV_SLC90E66 $CONFIG_BLK_DEV_IDEDMA_PCI
dep_
bool
' Tekram TRM290 chipset support' CONFIG_BLK_DEV_TRM290 $CONFIG_BLK_DEV_IDEDMA_PCI
dep_
bool
' VIA82CXXX chipset support' CONFIG_BLK_DEV_VIA82CXXX $CONFIG_BLK_DEV_IDEDMA_PCI
dep_
tristate
' nVidia NFORCE support' CONFIG_BLK_DEV_NFORCE $CONFIG_BLK_DEV_IDEDMA_PCI
dep_
tristate
' NS87415 chipset support' CONFIG_BLK_DEV_NS87415 $CONFIG_BLK_DEV_IDEDMA_PCI
dep_
tristate
' OPTi 82C621 chipset enhanced support (EXPERIMENTAL)' CONFIG_BLK_DEV_OPTI621 $CONFIG_EXPERIMENTAL
dep_tristate ' PROMISE PDC202{46|62|65|67} support' CONFIG_BLK_DEV_PDC202XX_OLD
$CONFIG_BLK_DEV_IDEDMA_PCI
dep_bool
' Special UDMA Feature' CONFIG_PDC202XX_BURST $CONFIG_BLK_DEV_PDC202XX_OLD $CONFI
_BLK_DEV_IDEDMA_PCI
dep_
tristate ' PROMISE PDC202{68|69|70|71|75|76|77} support' CONFIG_BLK_DEV_PDC202XX_NEW $CONFIG
_BLK_DEV_IDEDMA_PCI
# FIXME - probably wants to be one for old and for new
dep_bool
' Special FastTrak Feature' CONFIG_PDC202XX_FORCE $CONFIG_BLK_DEV_PDC202XX_NEW
dep_
tristate
' RZ1000 chipset bugfix/support' CONFIG_BLK_DEV_RZ1000 $CONFIG_X86
dep_
tristate
' ServerWorks OSB4/CSB5/CSB6 chipsets support' CONFIG_BLK_DEV_SVWKS $CONFIG_BLK_DEV_IDEDMA_PCI
dep_
tristate
' Silicon Image chipset support' CONFIG_BLK_DEV_SIIMAGE $CONFIG_BLK_DEV_IDEDMA_PCI
dep_
tristate
' SiS5513 chipset support' CONFIG_BLK_DEV_SIS5513 $CONFIG_BLK_DEV_IDEDMA_PCI $CONFIG_X86
dep_
tristate
' SLC90E66 chipset support' CONFIG_BLK_DEV_SLC90E66 $CONFIG_BLK_DEV_IDEDMA_PCI
dep_
tristate
' Tekram TRM290 chipset support' CONFIG_BLK_DEV_TRM290 $CONFIG_BLK_DEV_IDEDMA_PCI
dep_
tristate
' VIA82CXXX chipset support' CONFIG_BLK_DEV_VIA82CXXX $CONFIG_BLK_DEV_IDEDMA_PCI
if [ "$CONFIG_PPC" = "y" -o "$CONFIG_ARM" = "y" ]; then
dep_
bool
' Winbond SL82c105 support' CONFIG_BLK_DEV_SL82C105 $CONFIG_BLK_DEV_IDEPCI
dep_
tristate
' Winbond SL82c105 support' CONFIG_BLK_DEV_SL82C105 $CONFIG_BLK_DEV_IDEPCI
fi
fi
fi
...
...
@@ -230,8 +214,4 @@ else
define_bool CONFIG_BLK_DEV_IDE_MODES n
fi
#dep_tristate 'Support for IDE Raid controllers (EXPERIMENTAL)' CONFIG_BLK_DEV_ATARAID $CONFIG_BLK_DEV_IDE $CONFIG_EXPERIMENTAL
#dep_tristate ' Support Promise software RAID (Fasttrak(tm)) (EXPERIMENTAL)' CONFIG_BLK_DEV_ATARAID_PDC $CONFIG_BLK_DEV_IDE $CONFIG_EXPERIMENTAL $CONFIG_BLK_DEV_ATARAID
#dep_tristate ' Highpoint 370 software RAID (EXPERIMENTAL)' CONFIG_BLK_DEV_ATARAID_HPT $CONFIG_BLK_DEV_IDE $CONFIG_EXPERIMENTAL $CONFIG_BLK_DEV_ATARAID
endmenu
drivers/ide/Makefile
View file @
c9c13c7b
...
...
@@ -19,21 +19,26 @@ ide-obj-y :=
subdir-$(CONFIG_BLK_DEV_IDEPCI)
+=
pci
subdir-$(CONFIG_BLK_DEV_IDE)
+=
legacy ppc arm pci
# First come modules that register themselves with the core
obj-y
+=
pci/idedriver-pci.o
# Core IDE code - must come before legacy
obj-$(CONFIG_BLK_DEV_IDE)
+=
ide-probe.o ide-geometry.o ide-iops.o ide-taskfile.o ide.o ide-lib.o
obj-$(CONFIG_BLK_DEV_IDEDISK)
+=
ide-disk.o
obj-$(CONFIG_BLK_DEV_IDECD)
+=
ide-cd.o
obj-$(CONFIG_BLK_DEV_IDETAPE)
+=
ide-tape.o
obj-$(CONFIG_BLK_DEV_IDEFLOPPY)
+=
ide-floppy.o
obj-$(CONFIG_BLK_DEV_IDEPCI)
+=
setup-pci.o
obj-$(CONFIG_BLK_DEV_IDEDMA_PCI)
+=
ide-dma.o
obj-$(CONFIG_BLK_DEV_ISAPNP)
+=
ide-pnp.o
obj-$(CONFIG_PROC_FS)
+=
ide-proc.o
obj-$(CONFIG_BLK_DEV_IDEPCI)
+=
setup-pci.o
ifeq
($(CONFIG_BLK_DEV_IDE),y)
obj-$(CONFIG_PROC_FS)
+=
ide-proc.o
endif
ifeq
($(CONFIG_BLK_DEV_IDE),y)
obj-y
+=
pci/idedriver-pci.o
obj-y
+=
legacy/idedriver-legacy.o
obj-y
+=
ppc/idedriver-ppc.o
obj-y
+=
arm/idedriver-arm.o
...
...
drivers/ide/ide-dma.c
View file @
c9c13c7b
...
...
@@ -211,6 +211,8 @@ ide_startstop_t ide_dma_intr (ide_drive_t *drive)
return
DRIVER
(
drive
)
->
error
(
drive
,
"dma_intr"
,
stat
);
}
EXPORT_SYMBOL_GPL
(
ide_dma_intr
);
static
int
ide_build_sglist
(
ide_drive_t
*
drive
,
struct
request
*
rq
)
{
ide_hwif_t
*
hwif
=
HWIF
(
drive
);
...
...
@@ -365,6 +367,8 @@ int ide_build_dmatable (ide_drive_t *drive, struct request *rq)
return
0
;
/* revert to PIO for this request */
}
EXPORT_SYMBOL_GPL
(
ide_build_dmatable
);
/* Teardown mappings after DMA has completed. */
void
ide_destroy_dmatable
(
ide_drive_t
*
drive
)
{
...
...
@@ -376,6 +380,8 @@ void ide_destroy_dmatable (ide_drive_t *drive)
HWIF
(
drive
)
->
sg_dma_active
=
0
;
}
EXPORT_SYMBOL_GPL
(
ide_destroy_dmatable
);
static
int
config_drive_for_dma
(
ide_drive_t
*
drive
)
{
struct
hd_driveid
*
id
=
drive
->
id
;
...
...
@@ -1019,4 +1025,4 @@ void ide_setup_dma (ide_hwif_t *hwif, unsigned long dma_base, unsigned int num_p
BUG
();
}
EXPORT_SYMBOL_GPL
(
ide_setup_dma
);
drivers/ide/ide-lib.c
View file @
c9c13c7b
...
...
@@ -23,6 +23,8 @@
#include <asm/io.h>
#include <asm/bitops.h>
#include "ide_modes.h"
/*
* IDE library routines. These are plug in code that most
* drivers can use but occasionally may be weird enough
...
...
@@ -186,3 +188,201 @@ int ide_dma_enable (ide_drive_t *drive)
}
EXPORT_SYMBOL
(
ide_dma_enable
);
const
ide_pio_timings_t
ide_pio_timings
[
6
]
=
{
{
70
,
165
,
600
},
/* PIO Mode 0 */
{
50
,
125
,
383
},
/* PIO Mode 1 */
{
30
,
100
,
240
},
/* PIO Mode 2 */
{
30
,
80
,
180
},
/* PIO Mode 3 with IORDY */
{
25
,
70
,
120
},
/* PIO Mode 4 with IORDY */
{
20
,
50
,
100
}
/* PIO Mode 5 with IORDY (nonstandard) */
};
EXPORT_SYMBOL_GPL
(
ide_pio_timings
);
/*
* Black list. Some drives incorrectly report their maximal PIO mode,
* at least in respect to CMD640. Here we keep info on some known drives.
*/
static
struct
ide_pio_info
{
const
char
*
name
;
int
pio
;
}
ide_pio_blacklist
[]
=
{
/* { "Conner Peripherals 1275MB - CFS1275A", 4 }, */
{
"Conner Peripherals 540MB - CFS540A"
,
3
},
{
"WDC AC2700"
,
3
},
{
"WDC AC2540"
,
3
},
{
"WDC AC2420"
,
3
},
{
"WDC AC2340"
,
3
},
{
"WDC AC2250"
,
0
},
{
"WDC AC2200"
,
0
},
{
"WDC AC21200"
,
4
},
{
"WDC AC2120"
,
0
},
{
"WDC AC2850"
,
3
},
{
"WDC AC1270"
,
3
},
{
"WDC AC1170"
,
1
},
{
"WDC AC1210"
,
1
},
{
"WDC AC280"
,
0
},
/* { "WDC AC21000", 4 }, */
{
"WDC AC31000"
,
3
},
{
"WDC AC31200"
,
3
},
/* { "WDC AC31600", 4 }, */
{
"Maxtor 7131 AT"
,
1
},
{
"Maxtor 7171 AT"
,
1
},
{
"Maxtor 7213 AT"
,
1
},
{
"Maxtor 7245 AT"
,
1
},
{
"Maxtor 7345 AT"
,
1
},
{
"Maxtor 7546 AT"
,
3
},
{
"Maxtor 7540 AV"
,
3
},
{
"SAMSUNG SHD-3121A"
,
1
},
{
"SAMSUNG SHD-3122A"
,
1
},
{
"SAMSUNG SHD-3172A"
,
1
},
/* { "ST51080A", 4 },
* { "ST51270A", 4 },
* { "ST31220A", 4 },
* { "ST31640A", 4 },
* { "ST32140A", 4 },
* { "ST3780A", 4 },
*/
{
"ST5660A"
,
3
},
{
"ST3660A"
,
3
},
{
"ST3630A"
,
3
},
{
"ST3655A"
,
3
},
{
"ST3391A"
,
3
},
{
"ST3390A"
,
1
},
{
"ST3600A"
,
1
},
{
"ST3290A"
,
0
},
{
"ST3144A"
,
0
},
{
"ST3491A"
,
1
},
/* reports 3, should be 1 or 2 (depending on */
/* drive) according to Seagates FIND-ATA program */
{
"QUANTUM ELS127A"
,
0
},
{
"QUANTUM ELS170A"
,
0
},
{
"QUANTUM LPS240A"
,
0
},
{
"QUANTUM LPS210A"
,
3
},
{
"QUANTUM LPS270A"
,
3
},
{
"QUANTUM LPS365A"
,
3
},
{
"QUANTUM LPS540A"
,
3
},
{
"QUANTUM LIGHTNING 540A"
,
3
},
{
"QUANTUM LIGHTNING 730A"
,
3
},
{
"QUANTUM FIREBALL_540"
,
3
},
/* Older Quantum Fireballs don't work */
{
"QUANTUM FIREBALL_640"
,
3
},
{
"QUANTUM FIREBALL_1080"
,
3
},
{
"QUANTUM FIREBALL_1280"
,
3
},
{
NULL
,
0
}
};
/**
* ide_scan_pio_blacklist - check for a blacklisted drive
* @model: Drive model string
*
* This routine searches the ide_pio_blacklist for an entry
* matching the start/whole of the supplied model name.
*
* Returns -1 if no match found.
* Otherwise returns the recommended PIO mode from ide_pio_blacklist[].
*/
static
int
ide_scan_pio_blacklist
(
char
*
model
)
{
struct
ide_pio_info
*
p
;
for
(
p
=
ide_pio_blacklist
;
p
->
name
!=
NULL
;
p
++
)
{
if
(
strncmp
(
p
->
name
,
model
,
strlen
(
p
->
name
))
==
0
)
return
p
->
pio
;
}
return
-
1
;
}
/**
* ide_get_best_pio_mode - get PIO mode fro drive
* @driver: drive to consider
* @mode_wanted: preferred mode
* @max_mode: highest allowed
* @d: pio data
*
* This routine returns the recommended PIO settings for a given drive,
* based on the drive->id information and the ide_pio_blacklist[].
* This is used by most chipset support modules when "auto-tuning".
*
* Drive PIO mode auto selection
*/
u8
ide_get_best_pio_mode
(
ide_drive_t
*
drive
,
u8
mode_wanted
,
u8
max_mode
,
ide_pio_data_t
*
d
)
{
int
pio_mode
;
int
cycle_time
=
0
;
int
use_iordy
=
0
;
struct
hd_driveid
*
id
=
drive
->
id
;
int
overridden
=
0
;
int
blacklisted
=
0
;
if
(
mode_wanted
!=
255
)
{
pio_mode
=
mode_wanted
;
}
else
if
(
!
drive
->
id
)
{
pio_mode
=
0
;
}
else
if
((
pio_mode
=
ide_scan_pio_blacklist
(
id
->
model
))
!=
-
1
)
{
overridden
=
1
;
blacklisted
=
1
;
use_iordy
=
(
pio_mode
>
2
);
}
else
{
pio_mode
=
id
->
tPIO
;
if
(
pio_mode
>
2
)
{
/* 2 is maximum allowed tPIO value */
pio_mode
=
2
;
overridden
=
1
;
}
if
(
id
->
field_valid
&
2
)
{
/* drive implements ATA2? */
if
(
id
->
capability
&
8
)
{
/* drive supports use_iordy? */
use_iordy
=
1
;
cycle_time
=
id
->
eide_pio_iordy
;
if
(
id
->
eide_pio_modes
&
7
)
{
overridden
=
0
;
if
(
id
->
eide_pio_modes
&
4
)
pio_mode
=
5
;
else
if
(
id
->
eide_pio_modes
&
2
)
pio_mode
=
4
;
else
pio_mode
=
3
;
}
}
else
{
cycle_time
=
id
->
eide_pio
;
}
}
#if 0
if (drive->id->major_rev_num & 0x0004) printk("ATA-2 ");
#endif
/*
* Conservative "downgrade" for all pre-ATA2 drives
*/
if
(
pio_mode
&&
pio_mode
<
4
)
{
pio_mode
--
;
overridden
=
1
;
#if 0
use_iordy = (pio_mode > 2);
#endif
if
(
cycle_time
&&
cycle_time
<
ide_pio_timings
[
pio_mode
].
cycle_time
)
cycle_time
=
0
;
/* use standard timing */
}
}
if
(
pio_mode
>
max_mode
)
{
pio_mode
=
max_mode
;
cycle_time
=
0
;
}
if
(
d
)
{
d
->
pio_mode
=
pio_mode
;
d
->
cycle_time
=
cycle_time
?
cycle_time
:
ide_pio_timings
[
pio_mode
].
cycle_time
;
d
->
use_iordy
=
use_iordy
;
d
->
overridden
=
overridden
;
d
->
blacklisted
=
blacklisted
;
}
return
pio_mode
;
}
EXPORT_SYMBOL_GPL
(
ide_get_best_pio_mode
);
drivers/ide/ide-probe.c
View file @
c9c13c7b
...
...
@@ -592,6 +592,7 @@ void probe_hwif (ide_hwif_t *hwif)
{
unsigned
int
unit
;
unsigned
long
flags
;
unsigned
int
irqd
;
if
(
hwif
->
noprobe
)
return
;
...
...
@@ -623,7 +624,12 @@ void probe_hwif (ide_hwif_t *hwif)
return
;
}
if
(
hwif
->
hw
.
ack_intr
&&
hwif
->
irq
)
/*
* We must always disable IRQ, as probe_for_drive will assert IRQ, but
* we'll install our IRQ driver much later...
*/
irqd
=
hwif
->
irq
;
if
(
irqd
)
disable_irq
(
hwif
->
irq
);
local_irq_set
(
flags
);
...
...
@@ -659,8 +665,12 @@ void probe_hwif (ide_hwif_t *hwif)
}
local_irq_restore
(
flags
);
if
(
hwif
->
hw
.
ack_intr
&&
hwif
->
irq
)
enable_irq
(
hwif
->
irq
);
/*
* Use cached IRQ number. It might be (and is...) changed by probe
* code above
*/
if
(
irqd
)
enable_irq
(
irqd
);
for
(
unit
=
0
;
unit
<
MAX_DRIVES
;
++
unit
)
{
ide_drive_t
*
drive
=
&
hwif
->
drives
[
unit
];
...
...
drivers/ide/ide.c
View file @
c9c13c7b
...
...
@@ -194,6 +194,8 @@ int noautodma = 0;
int
noautodma
=
1
;
#endif
EXPORT_SYMBOL
(
noautodma
);
/*
* ide_modules keeps track of the available IDE chipset/probe/driver modules.
*/
...
...
@@ -1376,7 +1378,6 @@ void ide_intr (int irq, void *dev_id, struct pt_regs *regs)
if
((
handler
=
hwgroup
->
handler
)
==
NULL
||
hwgroup
->
poll_timeout
!=
0
)
{
printk
(
"ide_intr: unexpected interrupt!
\n
"
);
/*
* Not expecting an interrupt from this drive.
* That means this could be:
...
...
drivers/ide/ide_modes.h
View file @
c9c13c7b
...
...
@@ -16,8 +16,6 @@
* breaking the fragile cmd640.c support.
*/
#ifdef CONFIG_BLK_DEV_IDE_MODES
/*
* Standard (generic) timings for PIO modes, from ATA2 specification.
* These timings are for access to the IDE data port register *only*.
...
...
@@ -38,199 +36,6 @@ typedef struct ide_pio_data_s {
unsigned
int
cycle_time
;
}
ide_pio_data_t
;
#ifndef _IDE_C
int
ide_scan_pio_blacklist
(
char
*
model
);
u8
ide_get_best_pio_mode
(
ide_drive_t
*
drive
,
u8
mode_wanted
,
u8
max_mode
,
ide_pio_data_t
*
d
);
extern
const
ide_pio_timings_t
ide_pio_timings
[
6
];
#else
/* _IDE_C */
const
ide_pio_timings_t
ide_pio_timings
[
6
]
=
{
{
70
,
165
,
600
},
/* PIO Mode 0 */
{
50
,
125
,
383
},
/* PIO Mode 1 */
{
30
,
100
,
240
},
/* PIO Mode 2 */
{
30
,
80
,
180
},
/* PIO Mode 3 with IORDY */
{
25
,
70
,
120
},
/* PIO Mode 4 with IORDY */
{
20
,
50
,
100
}
/* PIO Mode 5 with IORDY (nonstandard) */
};
/*
* Black list. Some drives incorrectly report their maximal PIO mode,
* at least in respect to CMD640. Here we keep info on some known drives.
*/
static
struct
ide_pio_info
{
const
char
*
name
;
int
pio
;
}
ide_pio_blacklist
[]
=
{
/* { "Conner Peripherals 1275MB - CFS1275A", 4 }, */
{
"Conner Peripherals 540MB - CFS540A"
,
3
},
{
"WDC AC2700"
,
3
},
{
"WDC AC2540"
,
3
},
{
"WDC AC2420"
,
3
},
{
"WDC AC2340"
,
3
},
{
"WDC AC2250"
,
0
},
{
"WDC AC2200"
,
0
},
{
"WDC AC21200"
,
4
},
{
"WDC AC2120"
,
0
},
{
"WDC AC2850"
,
3
},
{
"WDC AC1270"
,
3
},
{
"WDC AC1170"
,
1
},
{
"WDC AC1210"
,
1
},
{
"WDC AC280"
,
0
},
/* { "WDC AC21000", 4 }, */
{
"WDC AC31000"
,
3
},
{
"WDC AC31200"
,
3
},
/* { "WDC AC31600", 4 }, */
{
"Maxtor 7131 AT"
,
1
},
{
"Maxtor 7171 AT"
,
1
},
{
"Maxtor 7213 AT"
,
1
},
{
"Maxtor 7245 AT"
,
1
},
{
"Maxtor 7345 AT"
,
1
},
{
"Maxtor 7546 AT"
,
3
},
{
"Maxtor 7540 AV"
,
3
},
{
"SAMSUNG SHD-3121A"
,
1
},
{
"SAMSUNG SHD-3122A"
,
1
},
{
"SAMSUNG SHD-3172A"
,
1
},
/* { "ST51080A", 4 },
* { "ST51270A", 4 },
* { "ST31220A", 4 },
* { "ST31640A", 4 },
* { "ST32140A", 4 },
* { "ST3780A", 4 },
*/
{
"ST5660A"
,
3
},
{
"ST3660A"
,
3
},
{
"ST3630A"
,
3
},
{
"ST3655A"
,
3
},
{
"ST3391A"
,
3
},
{
"ST3390A"
,
1
},
{
"ST3600A"
,
1
},
{
"ST3290A"
,
0
},
{
"ST3144A"
,
0
},
{
"ST3491A"
,
1
},
/* reports 3, should be 1 or 2 (depending on */
/* drive) according to Seagates FIND-ATA program */
{
"QUANTUM ELS127A"
,
0
},
{
"QUANTUM ELS170A"
,
0
},
{
"QUANTUM LPS240A"
,
0
},
{
"QUANTUM LPS210A"
,
3
},
{
"QUANTUM LPS270A"
,
3
},
{
"QUANTUM LPS365A"
,
3
},
{
"QUANTUM LPS540A"
,
3
},
{
"QUANTUM LIGHTNING 540A"
,
3
},
{
"QUANTUM LIGHTNING 730A"
,
3
},
{
"QUANTUM FIREBALL_540"
,
3
},
/* Older Quantum Fireballs don't work */
{
"QUANTUM FIREBALL_640"
,
3
},
{
"QUANTUM FIREBALL_1080"
,
3
},
{
"QUANTUM FIREBALL_1280"
,
3
},
{
NULL
,
0
}
};
/*
* This routine searches the ide_pio_blacklist for an entry
* matching the start/whole of the supplied model name.
*
* Returns -1 if no match found.
* Otherwise returns the recommended PIO mode from ide_pio_blacklist[].
*/
int
ide_scan_pio_blacklist
(
char
*
model
)
{
struct
ide_pio_info
*
p
;
for
(
p
=
ide_pio_blacklist
;
p
->
name
!=
NULL
;
p
++
)
{
if
(
strncmp
(
p
->
name
,
model
,
strlen
(
p
->
name
))
==
0
)
return
p
->
pio
;
}
return
-
1
;
}
/*
* This routine returns the recommended PIO settings for a given drive,
* based on the drive->id information and the ide_pio_blacklist[].
* This is used by most chipset support modules when "auto-tuning".
*/
/*
* Drive PIO mode auto selection
*/
u8
ide_get_best_pio_mode
(
ide_drive_t
*
drive
,
u8
mode_wanted
,
u8
max_mode
,
ide_pio_data_t
*
d
)
{
int
pio_mode
;
int
cycle_time
=
0
;
int
use_iordy
=
0
;
struct
hd_driveid
*
id
=
drive
->
id
;
int
overridden
=
0
;
int
blacklisted
=
0
;
if
(
mode_wanted
!=
255
)
{
pio_mode
=
mode_wanted
;
}
else
if
(
!
drive
->
id
)
{
pio_mode
=
0
;
}
else
if
((
pio_mode
=
ide_scan_pio_blacklist
(
id
->
model
))
!=
-
1
)
{
overridden
=
1
;
blacklisted
=
1
;
use_iordy
=
(
pio_mode
>
2
);
}
else
{
pio_mode
=
id
->
tPIO
;
if
(
pio_mode
>
2
)
{
/* 2 is maximum allowed tPIO value */
pio_mode
=
2
;
overridden
=
1
;
}
if
(
id
->
field_valid
&
2
)
{
/* drive implements ATA2? */
if
(
id
->
capability
&
8
)
{
/* drive supports use_iordy? */
use_iordy
=
1
;
cycle_time
=
id
->
eide_pio_iordy
;
if
(
id
->
eide_pio_modes
&
7
)
{
overridden
=
0
;
if
(
id
->
eide_pio_modes
&
4
)
pio_mode
=
5
;
else
if
(
id
->
eide_pio_modes
&
2
)
pio_mode
=
4
;
else
pio_mode
=
3
;
}
}
else
{
cycle_time
=
id
->
eide_pio
;
}
}
#if 0
if (drive->id->major_rev_num & 0x0004) printk("ATA-2 ");
#endif
/*
* Conservative "downgrade" for all pre-ATA2 drives
*/
if
(
pio_mode
&&
pio_mode
<
4
)
{
pio_mode
--
;
overridden
=
1
;
#if 0
use_iordy = (pio_mode > 2);
#endif
if
(
cycle_time
&&
cycle_time
<
ide_pio_timings
[
pio_mode
].
cycle_time
)
cycle_time
=
0
;
/* use standard timing */
}
}
if
(
pio_mode
>
max_mode
)
{
pio_mode
=
max_mode
;
cycle_time
=
0
;
}
if
(
d
)
{
d
->
pio_mode
=
pio_mode
;
d
->
cycle_time
=
cycle_time
?
cycle_time
:
ide_pio_timings
[
pio_mode
].
cycle_time
;
d
->
use_iordy
=
use_iordy
;
d
->
overridden
=
overridden
;
d
->
blacklisted
=
blacklisted
;
}
return
pio_mode
;
}
#endif
/* _IDE_C */
#endif
/* CONFIG_BLK_DEV_IDE_MODES */
#endif
/* _IDE_MODES_H */
drivers/ide/legacy/Makefile
View file @
c9c13c7b
...
...
@@ -19,6 +19,7 @@ obj-$(CONFIG_BLK_DEV_Q40IDE) += q40ide.o
obj-$(CONFIG_BLK_DEV_IDECS)
+=
ide-cs.o
# Last of all
obj-$(CONFIG_BLK_DEV_HD)
+=
hd.o
EXTRA_CFLAGS
:=
-I
../
...
...
drivers/ide/legacy/hd.c
View file @
c9c13c7b
...
...
@@ -870,3 +870,4 @@ static int parse_hd_setup (char *line) {
}
__setup
(
"hd="
,
parse_hd_setup
);
module_init
(
hd_init
);
drivers/ide/pci/Makefile
View file @
c9c13c7b
...
...
@@ -12,7 +12,6 @@ obj-$(CONFIG_BLK_DEV_CMD640) += cmd640.o
obj-$(CONFIG_BLK_DEV_CMD64X)
+=
cmd64x.o
obj-$(CONFIG_BLK_DEV_CS5530)
+=
cs5530.o
obj-$(CONFIG_BLK_DEV_CY82C693)
+=
cy82c693.o
obj-$(CONFIG_BLK_DEV_GENERIC)
+=
generic.o
obj-$(CONFIG_BLK_DEV_HPT34X)
+=
hpt34x.o
obj-$(CONFIG_BLK_DEV_HPT366)
+=
hpt366.o
#obj-$(CONFIG_BLK_DEV_HPT37X) += hpt37x.o
...
...
@@ -34,6 +33,9 @@ obj-$(CONFIG_BLK_DEV_SLC90E66) += slc90e66.o
obj-$(CONFIG_BLK_DEV_TRM290)
+=
trm290.o
obj-$(CONFIG_BLK_DEV_VIA82CXXX)
+=
via82cxxx.o
# Must appear at the end of the block
obj-$(CONFIG_BLK_DEV_GENERIC)
+=
generic.o
EXTRA_CFLAGS
:=
-I
../
include
$(TOPDIR)/Rules.make
drivers/ide/pci/aec62xx.c
View file @
c9c13c7b
...
...
@@ -38,8 +38,6 @@ static int aec62xx_get_info (char *buffer, char **addr, off_t offset, int count)
char
*
chipset_nums
[]
=
{
"error"
,
"error"
,
"error"
,
"error"
,
"error"
,
"error"
,
"850UF"
,
"860"
,
"860R"
,
"865"
,
"865R"
,
"error"
};
// char *modes_33[] = {};
// char *modes_34[] = {};
int
i
;
for
(
i
=
0
;
i
<
n_aec_devs
;
i
++
)
{
...
...
@@ -516,22 +514,69 @@ static void __init init_setup_aec6x80 (struct pci_dev *dev, ide_pci_device_t *d)
ide_setup_pci_device
(
dev
,
d
);
}
int
__init
aec62xx_scan_pcidev
(
struct
pci_dev
*
dev
)
/**
* aec62xx_init_one - called when a AEC is found
* @dev: the aec62xx device
* @id: the matching pci id
*
* Called when the PCI registration layer (or the IDE initialization)
* finds a device matching our IDE device tables.
*/
static
int
__devinit
aec62xx_init_one
(
struct
pci_dev
*
dev
,
const
struct
pci_device_id
*
id
)
{
ide_pci_device_t
*
d
;
ide_pci_device_t
*
d
=
&
aec62xx_chipsets
[
id
->
driver_data
]
;
if
(
dev
->
vendor
!=
PCI_VENDOR_ID_ARTOP
)
return
0
;
for
(
d
=
aec62xx_chipsets
;
d
&&
d
->
vendor
&&
d
->
device
;
++
d
)
{
if
(((
d
->
vendor
==
dev
->
vendor
)
&&
(
d
->
device
==
dev
->
device
))
&&
(
d
->
init_setup
))
{
d
->
init_setup
(
dev
,
d
);
return
1
;
}
}
if
(
dev
->
device
!=
d
->
device
)
BUG
();
d
->
init_setup
(
dev
,
d
);
return
0
;
}
/**
* aec62xx_remove_one - called when an AEC is unplugged
* @dev: the device that was removed
*
* Disconnect an AEC device that has been unplugged either by hotplug
* or by a more civilized notification scheme. Not yet supported.
*/
static
void
aec62xx_remove_one
(
struct
pci_dev
*
dev
)
{
panic
(
"AEC62xx removal not yet supported"
);
}
static
struct
pci_device_id
aec62xx_pci_tbl
[]
__devinitdata
=
{
{
PCI_VENDOR_ID_ARTOP
,
PCI_DEVICE_ID_ARTOP_ATP850UF
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
0
},
{
PCI_VENDOR_ID_ARTOP
,
PCI_DEVICE_ID_ARTOP_ATP860
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
1
},
{
PCI_VENDOR_ID_ARTOP
,
PCI_DEVICE_ID_ARTOP_ATP860R
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
2
},
{
PCI_VENDOR_ID_ARTOP
,
PCI_DEVICE_ID_ARTOP_ATP865
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
3
},
{
PCI_VENDOR_ID_ARTOP
,
PCI_DEVICE_ID_ARTOP_ATP865R
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
4
},
{
0
,
},
};
static
struct
pci_driver
driver
=
{
name:
"AEC62xx IDE"
,
id_table:
aec62xx_pci_tbl
,
probe:
aec62xx_init_one
,
remove:
__devexit_p
(
aec62xx_remove_one
),
};
static
int
aec62xx_ide_init
(
void
)
{
return
ide_pci_register_driver
(
&
driver
);
}
static
void
aec62xx_ide_exit
(
void
)
{
ide_pci_unregister_driver
(
&
driver
);
}
module_init
(
aec62xx_ide_init
);
module_exit
(
aec62xx_ide_exit
);
MODULE_AUTHOR
(
"Andre Hedrick"
);
MODULE_DESCRIPTION
(
"PCI driver module for ARTOP AEC62xx IDE"
);
MODULE_LICENSE
(
"GPL"
);
EXPORT_NO_SYMBOLS
;
drivers/ide/pci/aec62xx.h
View file @
c9c13c7b
...
...
@@ -99,7 +99,7 @@ static void init_hwif_aec62xx(ide_hwif_t *);
static
void
init_dma_aec62xx
(
ide_hwif_t
*
,
unsigned
long
);
static
ide_pci_device_t
aec62xx_chipsets
[]
__initdata
=
{
{
{
/* 0 */
vendor:
PCI_VENDOR_ID_ARTOP
,
device:
PCI_DEVICE_ID_ARTOP_ATP850UF
,
name:
"AEC6210"
,
...
...
@@ -113,7 +113,7 @@ static ide_pci_device_t aec62xx_chipsets[] __initdata = {
enablebits:
{{
0x4a
,
0x02
,
0x02
},
{
0x4a
,
0x04
,
0x04
}},
bootable:
OFF_BOARD
,
extra:
0
,
},{
},{
/* 1 */
vendor:
PCI_VENDOR_ID_ARTOP
,
device:
PCI_DEVICE_ID_ARTOP_ATP860
,
name:
"AEC6260"
,
...
...
@@ -127,7 +127,7 @@ static ide_pci_device_t aec62xx_chipsets[] __initdata = {
enablebits:
{{
0x00
,
0x00
,
0x00
},
{
0x00
,
0x00
,
0x00
}},
bootable:
OFF_BOARD
,
extra:
0
,
},{
},{
/* 2 */
vendor:
PCI_VENDOR_ID_ARTOP
,
device:
PCI_DEVICE_ID_ARTOP_ATP860R
,
name:
"AEC6260R"
,
...
...
@@ -141,7 +141,7 @@ static ide_pci_device_t aec62xx_chipsets[] __initdata = {
enablebits:
{{
0x4a
,
0x02
,
0x02
},
{
0x4a
,
0x04
,
0x04
}},
bootable:
NEVER_BOARD
,
extra:
0
,
},{
},{
/* 3 */
vendor:
PCI_VENDOR_ID_ARTOP
,
device:
PCI_DEVICE_ID_ARTOP_ATP865
,
name:
"AEC6X80"
,
...
...
@@ -155,7 +155,7 @@ static ide_pci_device_t aec62xx_chipsets[] __initdata = {
enablebits:
{{
0x00
,
0x00
,
0x00
},
{
0x00
,
0x00
,
0x00
}},
bootable:
OFF_BOARD
,
extra:
0
,
},{
},{
/* 4 */
vendor:
PCI_VENDOR_ID_ARTOP
,
device:
PCI_DEVICE_ID_ARTOP_ATP865R
,
name:
"AEC6X80R"
,
...
...
@@ -169,11 +169,6 @@ static ide_pci_device_t aec62xx_chipsets[] __initdata = {
enablebits:
{{
0x4a
,
0x02
,
0x02
},
{
0x4a
,
0x04
,
0x04
}},
bootable:
OFF_BOARD
,
extra:
0
,
},{
vendor:
0
,
device:
0
,
channels:
0
,
bootable:
EOL
,
}
};
...
...
drivers/ide/pci/alim15x3.c
View file @
c9c13c7b
...
...
@@ -22,6 +22,7 @@
*/
#include <linux/config.h>
#include <linux/module.h>
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/pci.h>
...
...
@@ -623,9 +624,11 @@ static unsigned int __init init_chipset_ali15x3 (struct pci_dev *dev, const char
/*
* We should only tune the 1533 enable if we are using an ALi
* North bridge
* North bridge. We might have no north found on some zany
* box without a device at 0:0.0. The ALi bridge will be at
* 0:0.0 so if we didn't find one we know what is cooking.
*/
if
(
north
->
vendor
!=
PCI_VENDOR_ID_AL
)
{
if
(
north
&&
north
->
vendor
!=
PCI_VENDOR_ID_AL
)
{
local_irq_restore
(
flags
);
return
0
;
}
...
...
@@ -841,45 +844,64 @@ extern void ide_setup_pci_device(struct pci_dev *, ide_pci_device_t *);
/**
*
init_setup_ali15x3
- set up an ALi15x3 IDE controller
*
alim15x3_init_one
- set up an ALi15x3 IDE controller
* @dev: PCI device to set up
* @d: IDE PCI structures
*
* Perform the actual set up for the ALi15x3.
* Perform the actual set up for an ALi15x3 that has been found by the
* hot plug layer.
*/
static
void
__init
init_setup_ali15x3
(
struct
pci_dev
*
dev
,
ide_pci_device_t
*
d
)
static
int
__devinit
alim15x3_init_one
(
struct
pci_dev
*
dev
,
const
struct
pci_device_id
*
i
d
)
{
ide_pci_device_t
*
d
=
&
ali15x3_chipsets
[
id
->
driver_data
];
#if defined(CONFIG_SPARC64)
d
->
init_hwif
=
init_hwif_common_ali15x3
;
#endif
/* CONFIG_SPARC64 */
ide_setup_pci_device
(
dev
,
d
);
return
0
;
}
/**
* ali15x3_
scan_pcidev - check for ali pci ide
* @dev:
device found by IDE ordered scan
* ali15x3_
remove_one - called with an ALi is unplugged
* @dev:
the device that was removed
*
* If the device is a known ALi IDE controller we set it up and
* then return 1. If we do not know it, or set up fails we return 0
* and it will be offered to other drivers or taken generic
* Disconnect an ALi device that has been unplugged either by hotplug
* or by a more civilized notification scheme. Not yet supported.
*/
int
__init
ali15x3_scan_pcidev
(
struct
pci_dev
*
dev
)
static
void
ali15x3_remove_one
(
struct
pci_dev
*
dev
)
{
ide_pci_device_t
*
d
;
panic
(
"ALi removal not yet supported"
);
}
if
(
dev
->
vendor
!=
PCI_VENDOR_ID_AL
)
return
0
;
static
struct
pci_device_id
alim15x3_pci_tbl
[]
__devinitdata
=
{
{
PCI_VENDOR_ID_AL
,
PCI_DEVICE_ID_AL_M5229
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
0
},
{
0
,
},
};
for
(
d
=
ali15x3_chipsets
;
d
&&
d
->
vendor
&&
d
->
device
;
++
d
)
{
if
(((
d
->
vendor
==
dev
->
vendor
)
&&
(
d
->
device
==
dev
->
device
))
&&
(
d
->
init_setup
))
{
d
->
init_setup
(
dev
,
d
);
return
1
;
}
}
return
0
;
static
struct
pci_driver
driver
=
{
name:
"ALI15x3 IDE"
,
id_table:
alim15x3_pci_tbl
,
probe:
alim15x3_init_one
,
remove:
__devexit_p
(
ali15x3_remove_one
),
};
static
int
ali15x3_ide_init
(
void
)
{
return
ide_pci_register_driver
(
&
driver
);
}
static
void
ali15x3_ide_exit
(
void
)
{
ide_pci_unregister_driver
(
&
driver
);
}
module_init
(
ali15x3_ide_init
);
module_exit
(
ali15x3_ide_exit
);
MODULE_AUTHOR
(
"Michael Aubry, Andrzej Krzysztofowicz, CJ, Andre Hedrick, Alan Cox"
);
MODULE_DESCRIPTION
(
"PCI driver module for ALi 15x3 IDE"
);
MODULE_LICENSE
(
"GPL"
);
EXPORT_NO_SYMBOLS
;
drivers/ide/pci/alim15x3.h
View file @
c9c13c7b
...
...
@@ -25,18 +25,16 @@ static ide_pci_host_proc_t ali_procs[] __initdata = {
};
#endif
/* DISPLAY_ALI_TIMINGS && CONFIG_PROC_FS */
static
void
init_setup_ali15x3
(
struct
pci_dev
*
,
ide_pci_device_t
*
);
static
unsigned
int
init_chipset_ali15x3
(
struct
pci_dev
*
,
const
char
*
);
static
void
init_hwif_common_ali15x3
(
ide_hwif_t
*
);
static
void
init_hwif_ali15x3
(
ide_hwif_t
*
);
static
void
init_dma_ali15x3
(
ide_hwif_t
*
,
unsigned
long
);
static
ide_pci_device_t
ali15x3_chipsets
[]
__initdata
=
{
{
{
/* 0 */
vendor:
PCI_VENDOR_ID_AL
,
device:
PCI_DEVICE_ID_AL_M5229
,
name:
"ALI15X3"
,
init_setup:
init_setup_ali15x3
,
init_chipset:
init_chipset_ali15x3
,
init_iops:
NULL
,
init_hwif:
init_hwif_ali15x3
,
...
...
drivers/ide/pci/amd74xx.c
View file @
c9c13c7b
...
...
@@ -7,6 +7,7 @@
*/
#include <linux/config.h>
#include <linux/module.h>
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/delay.h>
...
...
@@ -392,26 +393,60 @@ static void __init init_dma_amd74xx (ide_hwif_t *hwif, unsigned long dmabase)
extern
void
ide_setup_pci_device
(
struct
pci_dev
*
,
ide_pci_device_t
*
);
static
void
__init
init_setup_amd74xx
(
struct
pci_dev
*
dev
,
ide_pci_device_t
*
d
)
static
int
__devinit
amd74xx_init_one
(
struct
pci_dev
*
dev
,
const
struct
pci_device_id
*
id
)
{
ide_pci_device_t
*
d
=
&
amd74xx_chipsets
[
id
->
driver_data
];
if
(
dev
->
device
!=
d
->
device
)
BUG
();
ide_setup_pci_device
(
dev
,
d
);
return
0
;
}
int
__init
amd74xx_scan_pcidev
(
struct
pci_dev
*
dev
)
/**
* amd74xx_remove_one - called with an AMD IDE is unplugged
* @dev: the device that was removed
*
* Disconnect an AMD IDE device that has been unplugged either by hotplug
* or by a more civilized notification scheme. Not yet supported.
*/
static
void
amd74xx_remove_one
(
struct
pci_dev
*
dev
)
{
ide_pci_device_t
*
d
;
panic
(
"AMD IDE removal not yet supported"
);
}
if
(
dev
->
vendor
!=
PCI_VENDOR_ID_AMD
)
return
0
;
static
struct
pci_device_id
amd74xx_pci_tbl
[]
__devinitdata
=
{
{
PCI_VENDOR_ID_AMD
,
PCI_DEVICE_ID_AMD_COBRA_7401
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
0
},
{
PCI_VENDOR_ID_AMD
,
PCI_DEVICE_ID_AMD_VIPER_7409
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
1
},
{
PCI_VENDOR_ID_AMD
,
PCI_DEVICE_ID_AMD_VIPER_7411
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
2
},
{
PCI_VENDOR_ID_AMD
,
PCI_DEVICE_ID_AMD_OPUS_7441
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
3
},
{
PCI_VENDOR_ID_AMD
,
PCI_DEVICE_ID_AMD_8111_IDE
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
4
},
{
0
,
},
};
static
struct
pci_driver
driver
=
{
name:
"AMD IDE"
,
id_table:
amd74xx_pci_tbl
,
probe:
amd74xx_init_one
,
remove:
__devexit_p
(
amd74xx_remove_one
),
};
static
int
amd74xx_ide_init
(
void
)
{
return
ide_pci_register_driver
(
&
driver
);
}
for
(
d
=
amd74xx_chipsets
;
d
&&
d
->
vendor
&&
d
->
device
;
++
d
)
{
if
(((
d
->
vendor
==
dev
->
vendor
)
&&
(
d
->
device
==
dev
->
device
))
&&
(
d
->
init_setup
))
{
d
->
init_setup
(
dev
,
d
);
return
1
;
}
}
return
0
;
static
void
amd74xx_ide_exit
(
void
)
{
ide_pci_unregister_driver
(
&
driver
);
}
module_init
(
amd74xx_ide_init
);
module_exit
(
amd74xx_ide_exit
);
MODULE_AUTHOR
(
"Andre Hedrick"
);
MODULE_DESCRIPTION
(
"PCI driver module for AMD IDE"
);
MODULE_LICENSE
(
"GPL"
);
EXPORT_NO_SYMBOLS
;
drivers/ide/pci/amd74xx.h
View file @
c9c13c7b
...
...
@@ -25,17 +25,15 @@ static ide_pci_host_proc_t amd74xx_procs[] __initdata = {
};
#endif
/* defined(DISPLAY_VIPER_TIMINGS) && defined(CONFIG_PROC_FS) */
static
void
init_setup_amd74xx
(
struct
pci_dev
*
,
ide_pci_device_t
*
);
static
unsigned
int
init_chipset_amd74xx
(
struct
pci_dev
*
,
const
char
*
);
static
void
init_hwif_amd74xx
(
ide_hwif_t
*
);
static
void
init_dma_amd74xx
(
ide_hwif_t
*
,
unsigned
long
);
static
ide_pci_device_t
amd74xx_chipsets
[]
__initdata
=
{
{
{
/* 0 */
vendor:
PCI_VENDOR_ID_AMD
,
device:
PCI_DEVICE_ID_AMD_COBRA_7401
,
name:
"AMD7401"
,
init_setup:
init_setup_amd74xx
,
init_chipset:
init_chipset_amd74xx
,
init_iops:
NULL
,
init_hwif:
init_hwif_amd74xx
,
...
...
@@ -45,11 +43,10 @@ static ide_pci_device_t amd74xx_chipsets[] __initdata = {
enablebits:
{{
0x40
,
0x01
,
0x01
},
{
0x40
,
0x02
,
0x02
}},
bootable:
ON_BOARD
,
extra:
0
},{
},{
/* 1 */
vendor:
PCI_VENDOR_ID_AMD
,
device:
PCI_DEVICE_ID_AMD_VIPER_7409
,
name:
"AMD7409"
,
init_setup:
init_setup_amd74xx
,
init_chipset:
init_chipset_amd74xx
,
init_iops:
NULL
,
init_hwif:
init_hwif_amd74xx
,
...
...
@@ -59,11 +56,10 @@ static ide_pci_device_t amd74xx_chipsets[] __initdata = {
enablebits:
{{
0x40
,
0x01
,
0x01
},
{
0x40
,
0x02
,
0x02
}},
bootable:
ON_BOARD
,
extra:
0
},{
},{
/* 2 */
vendor:
PCI_VENDOR_ID_AMD
,
device:
PCI_DEVICE_ID_AMD_VIPER_7411
,
name:
"AMD7411"
,
init_setup:
init_setup_amd74xx
,
init_chipset:
init_chipset_amd74xx
,
init_iops:
NULL
,
init_hwif:
init_hwif_amd74xx
,
...
...
@@ -73,11 +69,10 @@ static ide_pci_device_t amd74xx_chipsets[] __initdata = {
enablebits:
{{
0x40
,
0x01
,
0x01
},
{
0x40
,
0x02
,
0x02
}},
bootable:
ON_BOARD
,
extra:
0
},{
},{
/* 3 */
vendor:
PCI_VENDOR_ID_AMD
,
device:
PCI_DEVICE_ID_AMD_OPUS_7441
,
name:
"AMD7441"
,
init_setup:
init_setup_amd74xx
,
init_chipset:
init_chipset_amd74xx
,
init_iops:
NULL
,
init_hwif:
init_hwif_amd74xx
,
...
...
@@ -87,11 +82,10 @@ static ide_pci_device_t amd74xx_chipsets[] __initdata = {
enablebits:
{{
0x40
,
0x01
,
0x01
},
{
0x40
,
0x02
,
0x02
}},
bootable:
ON_BOARD
,
extra:
0
},{
},{
/* 4 */
vendor:
PCI_VENDOR_ID_AMD
,
device:
PCI_DEVICE_ID_AMD_8111_IDE
,
name:
"AMD8111"
,
init_setup:
init_setup_amd74xx
,
init_chipset:
init_chipset_amd74xx
,
init_iops:
NULL
,
init_hwif:
init_hwif_amd74xx
,
...
...
drivers/ide/pci/cmd64x.c
View file @
c9c13c7b
/* $Id: cmd64x.c,v 1.21 2000/01/30 23:23:16
*
* linux/drivers/ide/cmd64x.c Version 1.
22 June 9, 2000
* linux/drivers/ide/cmd64x.c Version 1.
30 Sept 10, 2002
*
* cmd64x.c: Enable interrupts at initialization time on Ultra/PCI machines.
* Note, this driver is not used at all on other systems because
...
...
@@ -15,6 +15,7 @@
*/
#include <linux/config.h>
#include <linux/module.h>
#include <linux/types.h>
#include <linux/pci.h>
#include <linux/delay.h>
...
...
@@ -727,10 +728,12 @@ static void __init init_hwif_cmd64x (ide_hwif_t *hwif)
if
(
dev
->
device
==
PCI_DEVICE_ID_CMD_643
)
hwif
->
ultra_mask
=
0x80
;
if
(
dev
->
device
==
PCI_DEVICE_ID_CMD_646
)
{
if
(
class_rev
>
0x04
)
hwif
->
ultra_mask
=
0x07
;
else
hwif
->
ultra_mask
=
0x80
;
}
#ifdef CONFIG_BLK_DEV_IDEDMA
hwif
->
ide_dma_check
=
&
cmd64x_config_drive_for_dma
;
...
...
@@ -758,10 +761,6 @@ static void __init init_hwif_cmd64x (ide_hwif_t *hwif)
#endif
/* CONFIG_BLK_DEV_IDEDMA */
}
/**
* FIXME: not required ?
*/
static
void
__init
init_dma_cmd64x
(
ide_hwif_t
*
hwif
,
unsigned
long
dmabase
)
{
ide_setup_dma
(
hwif
,
dmabase
,
8
);
...
...
@@ -769,30 +768,59 @@ static void __init init_dma_cmd64x (ide_hwif_t *hwif, unsigned long dmabase)
extern
void
ide_setup_pci_device
(
struct
pci_dev
*
,
ide_pci_device_t
*
);
static
int
__devinit
cmd64x_init_one
(
struct
pci_dev
*
dev
,
const
struct
pci_device_id
*
id
)
{
ide_pci_device_t
*
d
=
&
cmd64x_chipsets
[
id
->
driver_data
];
if
(
dev
->
device
!=
d
->
device
)
BUG
();
ide_setup_pci_device
(
dev
,
d
);
return
0
;
}
/**
* FIXME: not required either ?
* cmd64x_remove_one - called with an CMD64x is unplugged
* @dev: the device that was removed
*
* Disconnect a CMD64x device that has been unplugged either by hotplug
* or by a more civilized notification scheme. Not yet supported.
*/
static
void
__init
init_setup_cmd64x
(
struct
pci_dev
*
dev
,
ide_pci_device_t
*
d
)
static
void
cmd64x_remove_one
(
struct
pci_dev
*
dev
)
{
ide_setup_pci_device
(
dev
,
d
);
panic
(
"CMD64x removal not yet supported"
);
}
int
__init
cmd64x_scan_pcidev
(
struct
pci_dev
*
dev
)
static
struct
pci_device_id
cmd64x_pci_tbl
[]
__devinitdata
=
{
{
PCI_VENDOR_ID_CMD
,
PCI_DEVICE_ID_CMD_643
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
0
},
{
PCI_VENDOR_ID_CMD
,
PCI_DEVICE_ID_CMD_646
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
1
},
{
PCI_VENDOR_ID_CMD
,
PCI_DEVICE_ID_CMD_648
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
2
},
{
PCI_VENDOR_ID_CMD
,
PCI_DEVICE_ID_CMD_649
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
3
},
{
0
,
},
};
static
struct
pci_driver
driver
=
{
name:
"CMD64x IDE"
,
id_table:
cmd64x_pci_tbl
,
probe:
cmd64x_init_one
,
remove:
__devexit_p
(
cmd64x_remove_one
),
};
static
int
cmd64x_ide_init
(
void
)
{
ide_pci_device_t
*
d
;
if
(
dev
->
vendor
!=
PCI_VENDOR_ID_CMD
)
return
0
;
return
ide_pci_register_driver
(
&
driver
);
}
for
(
d
=
cmd64x_chipsets
;
d
&&
d
->
vendor
&&
d
->
device
;
++
d
)
{
if
(((
d
->
vendor
==
dev
->
vendor
)
&&
(
d
->
device
==
dev
->
device
))
&&
(
d
->
init_setup
))
{
d
->
init_setup
(
dev
,
d
);
return
1
;
}
}
return
0
;
static
void
cmd64x_ide_exit
(
void
)
{
ide_pci_unregister_driver
(
&
driver
);
}
module_init
(
cmd64x_ide_init
);
module_exit
(
cmd64x_ide_exit
);
MODULE_AUTHOR
(
"Eddie Dost, David Miller, Andre Hedrick"
);
MODULE_DESCRIPTION
(
"PCI driver module for CMD64x IDE"
);
MODULE_LICENSE
(
"GPL"
);
EXPORT_NO_SYMBOLS
;
drivers/ide/pci/cmd64x.h
View file @
c9c13c7b
...
...
@@ -79,17 +79,15 @@ static ide_pci_host_proc_t cmd64x_procs[] __initdata = {
};
#endif
/* defined(DISPLAY_CMD64X_TIMINGS) && defined(CONFIG_PROC_FS) */
static
void
init_setup_cmd64x
(
struct
pci_dev
*
,
ide_pci_device_t
*
);
static
unsigned
int
init_chipset_cmd64x
(
struct
pci_dev
*
,
const
char
*
);
static
void
init_hwif_cmd64x
(
ide_hwif_t
*
);
static
void
init_dma_cmd64x
(
ide_hwif_t
*
,
unsigned
long
);
static
ide_pci_device_t
cmd64x_chipsets
[]
__initdata
=
{
{
{
/* 0 */
vendor:
PCI_VENDOR_ID_CMD
,
device:
PCI_DEVICE_ID_CMD_643
,
name:
"CMD643"
,
init_setup:
init_setup_cmd64x
,
init_chipset:
init_chipset_cmd64x
,
init_iops:
NULL
,
init_hwif:
init_hwif_cmd64x
,
...
...
@@ -99,11 +97,10 @@ static ide_pci_device_t cmd64x_chipsets[] __initdata = {
enablebits:
{{
0x00
,
0x00
,
0x00
},
{
0x00
,
0x00
,
0x00
}},
bootable:
ON_BOARD
,
extra:
0
,
},{
},{
/* 1 */
vendor:
PCI_VENDOR_ID_CMD
,
device:
PCI_DEVICE_ID_CMD_646
,
name:
"CMD646"
,
init_setup:
init_setup_cmd64x
,
init_chipset:
init_chipset_cmd64x
,
init_iops:
NULL
,
init_hwif:
init_hwif_cmd64x
,
...
...
@@ -113,11 +110,10 @@ static ide_pci_device_t cmd64x_chipsets[] __initdata = {
enablebits:
{{
0x00
,
0x00
,
0x00
},
{
0x51
,
0x80
,
0x80
}},
bootable:
ON_BOARD
,
extra:
0
,
},{
},{
/* 2 */
vendor:
PCI_VENDOR_ID_CMD
,
device:
PCI_DEVICE_ID_CMD_648
,
name:
"CMD648"
,
init_setup:
init_setup_cmd64x
,
init_chipset:
init_chipset_cmd64x
,
init_iops:
NULL
,
init_hwif:
init_hwif_cmd64x
,
...
...
@@ -131,7 +127,6 @@ static ide_pci_device_t cmd64x_chipsets[] __initdata = {
vendor:
PCI_VENDOR_ID_CMD
,
device:
PCI_DEVICE_ID_CMD_649
,
name:
"CMD649"
,
init_setup:
init_setup_cmd64x
,
init_chipset:
init_chipset_cmd64x
,
init_iops:
NULL
,
init_hwif:
init_hwif_cmd64x
,
...
...
drivers/ide/pci/cs5530.c
View file @
c9c13c7b
/*
* linux/drivers/ide/cs5530.c Version 0.
6 Mar. 18, 2000
* linux/drivers/ide/cs5530.c Version 0.
7 Sept 10, 2002
*
* Copyright (C) 2000 Andre Hedrick <andre@linux-ide.org>
* Ditto of GNU General Public License.
...
...
@@ -12,6 +12,7 @@
*/
#include <linux/config.h>
#include <linux/module.h>
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/delay.h>
...
...
@@ -419,44 +420,56 @@ static void __init init_dma_cs5530 (ide_hwif_t *hwif, unsigned long dmabase)
extern
void
ide_setup_pci_device
(
struct
pci_dev
*
,
ide_pci_device_t
*
);
/**
* init_setup_cs5530 - set up a CS5530 IDE
* @dev: PCI device
* @d: PCI ide device info
*
* FIXME: this function can go away too
*/
static
void
__init
init_setup_cs5530
(
struct
pci_dev
*
dev
,
ide_pci_device_t
*
d
)
static
int
__devinit
cs5530_init_one
(
struct
pci_dev
*
dev
,
const
struct
pci_device_id
*
id
)
{
ide_pci_device_t
*
d
=
&
cs5530_chipsets
[
id
->
driver_data
];
if
(
dev
->
device
!=
d
->
device
)
BUG
();
ide_setup_pci_device
(
dev
,
d
);
return
0
;
}
/**
* cs5530_
scan_pcidev - set up any CS5530 device
* @dev:
pci device to check
* cs5530_
remove_one - called when a CS5530 is unplugged
* @dev:
the device that was removed
*
* Check if the device is a 5530 IDE controller. If it is then
* claim and set up the interface. Return 1 if we claimed the
* interface or zero if it is not ours
* Disconnect an Cyrix device that has been unplugged either by hotplug
* or by a more civilized notification scheme. Not yet supported.
*/
int
__init
cs5530_scan_pcidev
(
struct
pci_dev
*
dev
)
static
void
cs5530_remove_one
(
struct
pci_dev
*
dev
)
{
ide_pci_device_t
*
d
;
panic
(
"Cyrix removal not yet supported"
);
}
if
(
dev
->
vendor
!=
PCI_VENDOR_ID_CYRIX
)
return
0
;
static
struct
pci_device_id
cs5530_pci_tbl
[]
__devinitdata
=
{
{
PCI_VENDOR_ID_CYRIX
,
PCI_DEVICE_ID_CYRIX_5530_IDE
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
0
},
{
0
,
},
};
for
(
d
=
cs5530_chipsets
;
d
&&
d
->
vendor
&&
d
->
device
;
++
d
)
{
if
(((
d
->
vendor
==
dev
->
vendor
)
&&
(
d
->
device
==
dev
->
device
))
&&
(
d
->
init_setup
))
{
d
->
init_setup
(
dev
,
d
);
return
1
;
}
}
return
0
;
static
struct
pci_driver
driver
=
{
name:
"CS5530 IDE"
,
id_table:
cs5530_pci_tbl
,
probe:
cs5530_init_one
,
remove:
__devexit_p
(
cs5530_remove_one
),
};
static
int
cs5530_ide_init
(
void
)
{
return
ide_pci_register_driver
(
&
driver
);
}
static
void
cs5530_ide_exit
(
void
)
{
ide_pci_unregister_driver
(
&
driver
);
}
module_init
(
cs5530_ide_init
);
module_exit
(
cs5530_ide_exit
);
MODULE_AUTHOR
(
"Mark Lord"
);
MODULE_DESCRIPTION
(
"PCI driver module for Cyrix/NS 5530 IDE"
);
MODULE_LICENSE
(
"GPL"
);
EXPORT_NO_SYMBOLS
;
drivers/ide/pci/cs5530.h
View file @
c9c13c7b
...
...
@@ -25,17 +25,15 @@ static ide_pci_host_proc_t cs5530_procs[] __initdata = {
};
#endif
/* DISPLAY_CS5530_TIMINGS && CONFIG_PROC_FS */
static
void
init_setup_cs5530
(
struct
pci_dev
*
,
ide_pci_device_t
*
);
static
unsigned
int
init_chipset_cs5530
(
struct
pci_dev
*
,
const
char
*
);
static
void
init_hwif_cs5530
(
ide_hwif_t
*
);
static
void
init_dma_cs5530
(
ide_hwif_t
*
,
unsigned
long
);
static
ide_pci_device_t
cs5530_chipsets
[]
__initdata
=
{
{
{
/* 0 */
vendor:
PCI_VENDOR_ID_CYRIX
,
device:
PCI_DEVICE_ID_CYRIX_5530_IDE
,
name:
"CS5530"
,
init_setup:
init_setup_cs5530
,
init_chipset:
init_chipset_cs5530
,
init_iops:
NULL
,
init_hwif:
init_hwif_cs5530
,
...
...
drivers/ide/pci/cy82c693.c
View file @
c9c13c7b
/*
* linux/drivers/ide/cy82c693.c Version 0.
34 Dec. 13, 1999
* linux/drivers/ide/cy82c693.c Version 0.
40 Sep. 10, 2002
*
* Copyright (C) 1998-2000 Andreas S. Krebs (akrebs@altavista.net), Maintainer
* Copyright (C) 1998-2002 Andre Hedrick <andre@linux-ide.org>, Integrater
...
...
@@ -29,8 +29,7 @@
* - first tests with DMA look okay, they seem to work, but there is a
* problem with sound - the BusMaster IDE TimeOut should fixed this
*
*
* History:
* Ancient History:
* AMH@1999-08-24: v0.34 init_cy82c693_chip moved to pci_init_cy82c693
* ASK@1999-01-23: v0.33 made a few minor code clean ups
* removed DMA clock speed setting by default
...
...
@@ -46,6 +45,7 @@
*/
#include <linux/config.h>
#include <linux/module.h>
#include <linux/types.h>
#include <linux/pci.h>
#include <linux/delay.h>
...
...
@@ -418,29 +418,56 @@ void __init init_dma_cy82c693 (ide_hwif_t *hwif, unsigned long dmabase)
extern
void
ide_setup_pci_device
(
struct
pci_dev
*
,
ide_pci_device_t
*
);
void
__init
init_setup_cy82c693
(
struct
pci_dev
*
dev
,
ide_pci_device_t
*
d
)
static
int
__devinit
cy82c693_init_one
(
struct
pci_dev
*
dev
,
const
struct
pci_device_id
*
i
d
)
{
ide_pci_device_t
*
d
=
&
cy82c693_chipsets
[
id
->
driver_data
];
if
((
!
(
PCI_FUNC
(
dev
->
devfn
)
&
1
)
||
(
!
((
dev
->
class
>>
8
)
==
PCI_CLASS_STORAGE_IDE
))))
return
;
/* CY82C693 is more than only a IDE controller */
return
0
;
/* CY82C693 is more than only a IDE controller */
ide_setup_pci_device
(
dev
,
d
);
return
0
;
}
int
__init
cy82c693_scan_pcidev
(
struct
pci_dev
*
dev
)
/**
* cy82c693_remove_one - called with an Cypress is unplugged
* @dev: the device that was removed
*
* Disconnect an Cypress device that has been unplugged either by hotplug
* or by a more civilized notification scheme. Not yet supported.
*/
static
void
cy82c693_remove_one
(
struct
pci_dev
*
dev
)
{
ide_pci_device_t
*
d
;
panic
(
"Cypress removal not yet supported"
);
}
if
(
dev
->
vendor
!=
PCI_VENDOR_ID_CONTAQ
)
return
0
;
static
struct
pci_device_id
cy82c693_pci_tbl
[]
__devinitdata
=
{
{
PCI_VENDOR_ID_NVIDIA
,
PCI_DEVICE_ID_NVIDIA_NFORCE_IDE
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
0
},
{
0
,
},
};
for
(
d
=
cy82c693_chipsets
;
d
&&
d
->
vendor
&&
d
->
device
;
++
d
)
{
if
(((
d
->
vendor
==
dev
->
vendor
)
&&
(
d
->
device
==
dev
->
device
))
&&
(
d
->
init_setup
))
{
d
->
init_setup
(
dev
,
d
);
return
1
;
}
}
return
0
;
static
struct
pci_driver
driver
=
{
name:
"Cypress IDE"
,
id_table:
cy82c693_pci_tbl
,
probe:
cy82c693_init_one
,
remove:
__devexit_p
(
cy82c693_remove_one
),
};
static
int
cy82c693_ide_init
(
void
)
{
return
ide_pci_register_driver
(
&
driver
);
}
static
void
cy82c693_ide_exit
(
void
)
{
ide_pci_unregister_driver
(
&
driver
);
}
module_init
(
cy82c693_ide_init
);
module_exit
(
cy82c693_ide_exit
);
MODULE_AUTHOR
(
"Andreas Krebs, Andre Hedrick"
);
MODULE_DESCRIPTION
(
"PCI driver module for the Cypress CY82C693 IDE"
);
MODULE_LICENSE
(
"GPL"
);
EXPORT_NO_SYMBOLS
;
drivers/ide/pci/cy82c693.h
View file @
c9c13c7b
...
...
@@ -64,17 +64,15 @@ typedef struct pio_clocks_s {
u8
time_8
;
/* clocks for 8bit (0xF0=Active/data, 0x0F=Recovery) */
}
pio_clocks_t
;
extern
void
init_setup_cy82c693
(
struct
pci_dev
*
,
ide_pci_device_t
*
);
extern
unsigned
int
init_chipset_cy82c693
(
struct
pci_dev
*
,
const
char
*
);
extern
void
init_hwif_cy82c693
(
ide_hwif_t
*
);
extern
void
init_dma_cy82c693
(
ide_hwif_t
*
,
unsigned
long
);
static
ide_pci_device_t
cy82c693_chipsets
[]
__initdata
=
{
{
{
/* 0 */
vendor:
PCI_VENDOR_ID_CONTAQ
,
device:
PCI_DEVICE_ID_CONTAQ_82C693
,
name:
"CY82C693"
,
init_setup:
init_setup_cy82c693
,
init_chipset:
init_chipset_cy82c693
,
init_iops:
NULL
,
init_hwif:
init_hwif_cy82c693
,
...
...
drivers/ide/pci/generic.c
View file @
c9c13c7b
/*
* linux/drivers/ide/
pci-orphan.c Version 0.01 December 8, 1997
* linux/drivers/ide/
generic.c Version 0.10 Sept 11, 2002
*
* Copyright (C) 2001-2002 Andre Hedrick <andre@linux-ide.org>
*/
...
...
@@ -9,6 +9,7 @@
#include <linux/config.h>
/* for CONFIG_BLK_DEV_IDEPCI */
#include <linux/types.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/delay.h>
#include <linux/timer.h>
...
...
@@ -84,19 +85,10 @@ static void __init init_setup_unknown (struct pci_dev *dev, ide_pci_device_t *d)
ide_setup_pci_device
(
dev
,
d
);
}
int
__init
generic_scan_pcidev
(
struct
pci_dev
*
dev
)
{
ide_pci_device_t
*
d
;
for
(
d
=
generic_chipsets
;
d
&&
d
->
vendor
&&
d
->
device
;
++
d
)
{
if
(((
d
->
vendor
==
dev
->
vendor
)
&&
(
d
->
device
==
dev
->
device
))
&&
(
d
->
init_setup
))
{
d
->
init_setup
(
dev
,
d
);
return
1
;
}
}
#if 0
/* Logic to add back later on */
if ((dev->class >> 8) == PCI_CLASS_STORAGE_IDE) {
ide_pci_device_t *unknown = unknown_chipset;
// unknown->vendor = dev->vendor;
...
...
@@ -105,5 +97,75 @@ int __init generic_scan_pcidev (struct pci_dev *dev)
return 1;
}
return 0;
#endif
/**
* generic_init_one - called when a PIIX is found
* @dev: the generic device
* @id: the matching pci id
*
* Called when the PCI registration layer (or the IDE initialization)
* finds a device matching our IDE device tables.
*/
static
int
__devinit
generic_init_one
(
struct
pci_dev
*
dev
,
const
struct
pci_device_id
*
id
)
{
ide_pci_device_t
*
d
=
&
generic_chipsets
[
id
->
driver_data
];
if
(
dev
->
device
!=
d
->
device
)
BUG
();
d
->
init_setup
(
dev
,
d
);
return
0
;
}
/**
* generic_remove_one - called when PCI IDE is unplugged
* @dev: the device that was removed
*
* Disconnect an IDE device that has been unplugged either by hotplug
* or by a more civilized notification scheme. Not yet supported.
*/
static
void
generic_remove_one
(
struct
pci_dev
*
dev
)
{
panic
(
"PCI IDE removal not yet supported"
);
}
static
struct
pci_device_id
generic_pci_tbl
[]
__devinitdata
=
{
{
PCI_VENDOR_ID_NS
,
PCI_DEVICE_ID_NS_87410
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
0
},
{
PCI_VENDOR_ID_PCTECH
,
PCI_DEVICE_ID_PCTECH_SAMURAI_IDE
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
1
},
{
PCI_VENDOR_ID_HOLTEK
,
PCI_DEVICE_ID_HOLTEK_6565
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
2
},
{
PCI_VENDOR_ID_UMC
,
PCI_DEVICE_ID_UMC_UM8673F
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
3
},
{
PCI_VENDOR_ID_UMC
,
PCI_DEVICE_ID_UMC_UM8886A
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
4
},
{
PCI_VENDOR_ID_UMC
,
PCI_DEVICE_ID_UMC_UM8886BF
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
5
},
{
PCI_VENDOR_ID_HINT
,
PCI_DEVICE_ID_HINT_VXPROII_IDE
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
6
},
{
PCI_VENDOR_ID_VIA
,
PCI_DEVICE_ID_VIA_82C561
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
7
},
{
PCI_VENDOR_ID_OPTI
,
PCI_DEVICE_ID_OPTI_82C558
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
8
},
{
0
,
},
};
static
struct
pci_driver
driver
=
{
name:
"PCI IDE"
,
id_table:
generic_pci_tbl
,
probe:
generic_init_one
,
remove:
__devexit_p
(
generic_remove_one
),
};
static
int
generic_ide_init
(
void
)
{
return
ide_pci_register_driver
(
&
driver
);
}
static
void
generic_ide_exit
(
void
)
{
ide_pci_unregister_driver
(
&
driver
);
}
module_init
(
generic_ide_init
);
module_exit
(
generic_ide_exit
);
MODULE_AUTHOR
(
"Andre Hedrick"
);
MODULE_DESCRIPTION
(
"PCI driver module for generic PCI IDE"
);
MODULE_LICENSE
(
"GPL"
);
EXPORT_NO_SYMBOLS
;
drivers/ide/pci/generic.h
View file @
c9c13c7b
...
...
@@ -11,7 +11,7 @@ static void init_hwif_generic(ide_hwif_t *);
static
void
init_dma_generic
(
ide_hwif_t
*
,
unsigned
long
);
static
ide_pci_device_t
generic_chipsets
[]
__initdata
=
{
{
{
/* 0 */
vendor:
PCI_VENDOR_ID_NS
,
device:
PCI_DEVICE_ID_NS_87410
,
name:
"NS87410"
,
...
...
@@ -25,7 +25,7 @@ static ide_pci_device_t generic_chipsets[] __initdata = {
enablebits:
{{
0x43
,
0x08
,
0x08
},
{
0x47
,
0x08
,
0x08
}},
bootable:
ON_BOARD
,
extra:
0
,
},{
},{
/* 1 */
vendor:
PCI_VENDOR_ID_PCTECH
,
device:
PCI_DEVICE_ID_PCTECH_SAMURAI_IDE
,
name:
"SAMURAI"
,
...
...
@@ -39,7 +39,7 @@ static ide_pci_device_t generic_chipsets[] __initdata = {
enablebits:
{{
0x00
,
0x00
,
0x00
},
{
0x00
,
0x00
,
0x00
}},
bootable:
ON_BOARD
,
extra:
0
,
},{
},{
/* 2 */
vendor:
PCI_VENDOR_ID_HOLTEK
,
device:
PCI_DEVICE_ID_HOLTEK_6565
,
name:
"HT6565"
,
...
...
@@ -53,7 +53,7 @@ static ide_pci_device_t generic_chipsets[] __initdata = {
enablebits:
{{
0x00
,
0x00
,
0x00
},
{
0x00
,
0x00
,
0x00
}},
bootable:
ON_BOARD
,
extra:
0
,
},{
},{
/* 3 */
vendor:
PCI_VENDOR_ID_UMC
,
device:
PCI_DEVICE_ID_UMC_UM8673F
,
name:
"UM8673F"
,
...
...
@@ -67,7 +67,7 @@ static ide_pci_device_t generic_chipsets[] __initdata = {
enablebits:
{{
0x00
,
0x00
,
0x00
},
{
0x00
,
0x00
,
0x00
}},
bootable:
ON_BOARD
,
extra:
0
,
},{
},{
/* 4 */
vendor:
PCI_VENDOR_ID_UMC
,
device:
PCI_DEVICE_ID_UMC_UM8886A
,
name:
"UM8886A"
,
...
...
@@ -81,7 +81,7 @@ static ide_pci_device_t generic_chipsets[] __initdata = {
enablebits:
{{
0x00
,
0x00
,
0x00
},
{
0x00
,
0x00
,
0x00
}},
bootable:
ON_BOARD
,
extra:
0
,
},{
},{
/* 5 */
vendor:
PCI_VENDOR_ID_UMC
,
device:
PCI_DEVICE_ID_UMC_UM8886BF
,
name:
"UM8886BF"
,
...
...
@@ -95,7 +95,7 @@ static ide_pci_device_t generic_chipsets[] __initdata = {
enablebits:
{{
0x00
,
0x00
,
0x00
},
{
0x00
,
0x00
,
0x00
}},
bootable:
ON_BOARD
,
extra:
0
,
},{
},{
/* 6 */
vendor:
PCI_VENDOR_ID_HINT
,
device:
PCI_DEVICE_ID_HINT_VXPROII_IDE
,
name:
"HINT_IDE"
,
...
...
@@ -109,7 +109,7 @@ static ide_pci_device_t generic_chipsets[] __initdata = {
enablebits:
{{
0x00
,
0x00
,
0x00
},
{
0x00
,
0x00
,
0x00
}},
bootable:
ON_BOARD
,
extra:
0
,
},{
},{
/* 7 */
vendor:
PCI_VENDOR_ID_VIA
,
device:
PCI_DEVICE_ID_VIA_82C561
,
name:
"VIA_IDE"
,
...
...
@@ -123,7 +123,7 @@ static ide_pci_device_t generic_chipsets[] __initdata = {
enablebits:
{{
0x00
,
0x00
,
0x00
},
{
0x00
,
0x00
,
0x00
}},
bootable:
ON_BOARD
,
extra:
0
,
},{
},{
/* 8 */
vendor:
PCI_VENDOR_ID_OPTI
,
device:
PCI_DEVICE_ID_OPTI_82C558
,
name:
"OPTI621V"
,
...
...
@@ -146,7 +146,7 @@ static ide_pci_device_t generic_chipsets[] __initdata = {
};
static
ide_pci_device_t
unknown_chipset
[]
__initdata
=
{
{
{
/* 0 */
vendor:
0
,
device:
0
,
name:
"PCI_IDE"
,
...
...
drivers/ide/pci/hpt34x.c
View file @
c9c13c7b
/*
* linux/drivers/ide/hpt34x.c Version 0.
31 June. 9, 2000
* linux/drivers/ide/hpt34x.c Version 0.
40 Sept 10, 2002
*
* Copyright (C) 1998-2000 Andre Hedrick <andre@linux-ide.org>
* May be copied or modified under the terms of the GNU General Public License
...
...
@@ -25,6 +25,7 @@
*/
#include <linux/config.h>
#include <linux/module.h>
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/delay.h>
...
...
@@ -321,34 +322,61 @@ static void __init init_dma_hpt34x (ide_hwif_t *hwif, unsigned long dmabase)
extern
void
ide_setup_pci_device
(
struct
pci_dev
*
,
ide_pci_device_t
*
);
static
void
__init
init_setup_hpt34x
(
struct
pci_dev
*
dev
,
ide_pci_device_t
*
d
)
static
int
__devinit
hpt34x_init_one
(
struct
pci_dev
*
dev
,
const
struct
pci_device_id
*
i
d
)
{
char
*
chipset_names
[]
=
{
"HPT343"
,
"HPT345"
};
ide_pci_device_t
*
d
=
&
hpt34x_chipsets
[
id
->
driver_data
];
static
char
*
chipset_names
[]
=
{
"HPT343"
,
"HPT345"
};
u16
pcicmd
=
0
;
pci_read_config_word
(
dev
,
PCI_COMMAND
,
&
pcicmd
);
strcpy
(
d
->
name
,
chipset_names
[(
pcicmd
&
PCI_COMMAND_MEMORY
)
?
1
:
0
])
;
d
->
name
=
chipset_names
[(
pcicmd
&
PCI_COMMAND_MEMORY
)
?
1
:
0
]
;
d
->
bootable
=
(
pcicmd
&
PCI_COMMAND_MEMORY
)
?
OFF_BOARD
:
NEVER_BOARD
;
ide_setup_pci_device
(
dev
,
d
);
return
0
;
}
int
__init
hpt34x_scan_pcidev
(
struct
pci_dev
*
dev
)
/**
* hpt34x_remove_one - called with an hpt34x is unplugged
* @dev: the device that was removed
*
* Disconnect an hpt34x device that has been unplugged either by hotplug
* or by a more civilized notification scheme. Not yet supported.
*/
static
void
hpt34x_remove_one
(
struct
pci_dev
*
dev
)
{
ide_pci_device_t
*
d
;
panic
(
"hpt34x removal not yet supported"
);
}
if
(
dev
->
vendor
!=
PCI_VENDOR_ID_TTI
)
return
0
;
static
struct
pci_device_id
hpt34x_pci_tbl
[]
__devinitdata
=
{
{
PCI_VENDOR_ID_TTI
,
PCI_DEVICE_ID_TTI_HPT343
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
0
},
{
0
,
},
};
for
(
d
=
hpt34x_chipsets
;
d
&&
d
->
vendor
&&
d
->
device
;
++
d
)
{
if
(((
d
->
vendor
==
dev
->
vendor
)
&&
(
d
->
device
==
dev
->
device
))
&&
(
d
->
init_setup
))
{
d
->
init_setup
(
dev
,
d
);
return
1
;
}
}
return
0
;
static
struct
pci_driver
driver
=
{
name:
"HPT34x IDE"
,
id_table:
hpt34x_pci_tbl
,
probe:
hpt34x_init_one
,
remove:
__devexit_p
(
hpt34x_remove_one
),
};
static
int
hpt34x_ide_init
(
void
)
{
return
ide_pci_register_driver
(
&
driver
);
}
static
void
hpt34x_ide_exit
(
void
)
{
ide_pci_unregister_driver
(
&
driver
);
}
module_init
(
hpt34x_ide_init
);
module_exit
(
hpt34x_ide_exit
);
MODULE_AUTHOR
(
"Andre Hedrick"
);
MODULE_DESCRIPTION
(
"PCI driver module for Highpoint 34x IDE"
);
MODULE_LICENSE
(
"GPL"
);
EXPORT_NO_SYMBOLS
;
drivers/ide/pci/hpt34x.h
View file @
c9c13c7b
...
...
@@ -31,17 +31,15 @@ static ide_pci_host_proc_t hpt34x_procs[] __initdata = {
};
#endif
/* defined(DISPLAY_HPT34X_TIMINGS) && defined(CONFIG_PROC_FS) */
static
void
init_setup_hpt34x
(
struct
pci_dev
*
,
ide_pci_device_t
*
);
static
unsigned
int
init_chipset_hpt34x
(
struct
pci_dev
*
,
const
char
*
);
static
void
init_hwif_hpt34x
(
ide_hwif_t
*
);
static
void
init_dma_hpt34x
(
ide_hwif_t
*
,
unsigned
long
);
static
ide_pci_device_t
hpt34x_chipsets
[]
__initdata
=
{
{
{
/* 0 */
vendor:
PCI_VENDOR_ID_TTI
,
device:
PCI_DEVICE_ID_TTI_HPT343
,
name:
"HPT34X"
,
init_setup:
init_setup_hpt34x
,
init_chipset:
init_chipset_hpt34x
,
init_iops:
NULL
,
init_hwif:
init_hwif_hpt34x
,
...
...
drivers/ide/pci/hpt366.c
View file @
c9c13c7b
...
...
@@ -44,6 +44,7 @@
#include <linux/config.h>
#include <linux/types.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/delay.h>
#include <linux/timer.h>
...
...
@@ -1167,23 +1168,70 @@ static void __init init_setup_hpt366 (struct pci_dev *dev, ide_pci_device_t *d)
ide_setup_pci_device
(
dev
,
d
);
}
int
__init
hpt366_scan_pcidev
(
struct
pci_dev
*
dev
)
{
ide_pci_device_t
*
d
;
if
(
dev
->
vendor
!=
PCI_VENDOR_ID_TTI
)
return
0
;
if
(
dev
->
device
==
PCI_DEVICE_ID_TTI_HPT343
)
return
0
;
/**
* hpt366_init_one - called when an HPT366 is found
* @dev: the hpt366 device
* @id: the matching pci id
*
* Called when the PCI registration layer (or the IDE initialization)
* finds a device matching our IDE device tables.
*/
static
int
__devinit
hpt366_init_one
(
struct
pci_dev
*
dev
,
const
struct
pci_device_id
*
id
)
{
ide_pci_device_t
*
d
=
&
hpt366_chipsets
[
id
->
driver_data
];
for
(
d
=
hpt366_chipsets
;
d
&&
d
->
vendor
&&
d
->
device
;
++
d
)
{
if
(((
d
->
vendor
==
dev
->
vendor
)
&&
(
d
->
device
==
dev
->
device
))
&&
(
d
->
init_setup
))
{
d
->
init_setup
(
dev
,
d
);
return
1
;
}
}
if
(
dev
->
device
!=
d
->
device
)
BUG
();
d
->
init_setup
(
dev
,
d
);
return
0
;
}
/**
* hpt366_remove_one - called when an HPT366 is unplugged
* @dev: the device that was removed
*
* Disconnect a HPT366 device that has been unplugged either by hotplug
* or by a more civilized notification scheme. Not yet supported.
*/
static
void
hpt366_remove_one
(
struct
pci_dev
*
dev
)
{
panic
(
"HPT366 removal not yet supported"
);
}
static
struct
pci_device_id
hpt366_pci_tbl
[]
__devinitdata
=
{
{
PCI_VENDOR_ID_TTI
,
PCI_DEVICE_ID_TTI_HPT366
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
0
},
{
PCI_VENDOR_ID_TTI
,
PCI_DEVICE_ID_TTI_HPT372
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
1
},
{
PCI_VENDOR_ID_TTI
,
PCI_DEVICE_ID_TTI_HPT302
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
2
},
{
PCI_VENDOR_ID_TTI
,
PCI_DEVICE_ID_TTI_HPT371
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
3
},
{
PCI_VENDOR_ID_TTI
,
PCI_DEVICE_ID_TTI_HPT374
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
15
},
{
0
,
},
};
static
struct
pci_driver
driver
=
{
name:
"HPT366 IDE"
,
id_table:
hpt366_pci_tbl
,
probe:
hpt366_init_one
,
remove:
__devexit_p
(
hpt366_remove_one
),
};
static
int
hpt366_ide_init
(
void
)
{
return
ide_pci_register_driver
(
&
driver
);
}
static
void
hpt366_ide_exit
(
void
)
{
ide_pci_unregister_driver
(
&
driver
);
}
module_init
(
hpt366_ide_init
);
module_exit
(
hpt366_ide_exit
);
MODULE_AUTHOR
(
"Andre Hedrick"
);
MODULE_DESCRIPTION
(
"PCI driver module for Highpoint HPT366 IDE"
);
MODULE_LICENSE
(
"GPL"
);
EXPORT_NO_SYMBOLS
;
drivers/ide/pci/hpt366.h
View file @
c9c13c7b
...
...
@@ -442,7 +442,7 @@ static void init_hwif_hpt366(ide_hwif_t *);
static
void
init_dma_hpt366
(
ide_hwif_t
*
,
unsigned
long
);
static
ide_pci_device_t
hpt366_chipsets
[]
__initdata
=
{
{
{
/* 0 */
vendor:
PCI_VENDOR_ID_TTI
,
device:
PCI_DEVICE_ID_TTI_HPT366
,
name:
"HPT366"
,
...
...
@@ -456,7 +456,7 @@ static ide_pci_device_t hpt366_chipsets[] __initdata = {
enablebits:
{{
0x00
,
0x00
,
0x00
},
{
0x00
,
0x00
,
0x00
}},
bootable:
OFF_BOARD
,
extra:
240
},{
},{
/* 1 */
vendor:
PCI_VENDOR_ID_TTI
,
device:
PCI_DEVICE_ID_TTI_HPT372
,
name:
"HPT372A"
,
...
...
@@ -470,7 +470,7 @@ static ide_pci_device_t hpt366_chipsets[] __initdata = {
enablebits:
{{
0x00
,
0x00
,
0x00
},
{
0x00
,
0x00
,
0x00
}},
bootable:
OFF_BOARD
,
extra:
0
},{
},{
/* 2 */
vendor:
PCI_VENDOR_ID_TTI
,
device:
PCI_DEVICE_ID_TTI_HPT302
,
name:
"HPT302"
,
...
...
@@ -484,7 +484,7 @@ static ide_pci_device_t hpt366_chipsets[] __initdata = {
enablebits:
{{
0x00
,
0x00
,
0x00
},
{
0x00
,
0x00
,
0x00
}},
bootable:
OFF_BOARD
,
extra:
0
},{
},{
/* 3 */
vendor:
PCI_VENDOR_ID_TTI
,
device:
PCI_DEVICE_ID_TTI_HPT371
,
name:
"HPT371"
,
...
...
@@ -498,7 +498,7 @@ static ide_pci_device_t hpt366_chipsets[] __initdata = {
enablebits:
{{
0x00
,
0x00
,
0x00
},
{
0x00
,
0x00
,
0x00
}},
bootable:
OFF_BOARD
,
extra:
0
},{
},{
/* 4 */
vendor:
PCI_VENDOR_ID_TTI
,
device:
PCI_DEVICE_ID_TTI_HPT374
,
name:
"HPT374"
,
...
...
drivers/ide/pci/it8172.c
View file @
c9c13c7b
...
...
@@ -29,6 +29,7 @@
*/
#include <linux/config.h>
#include <linux/module.h>
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/ioport.h>
...
...
@@ -297,29 +298,56 @@ static void __init init_dma_it8172 (ide_hwif_t *hwif, unsigned long dmabase)
extern
void
ide_setup_pci_device
(
struct
pci_dev
*
,
ide_pci_device_t
*
);
static
void
__init
init_setup_it8172
(
struct
pci_dev
*
dev
,
ide_pci_device_t
*
d
)
static
int
__devinit
it8172_init_one
(
struct
pci_dev
*
dev
,
const
struct
pci_device_id
*
i
d
)
{
ide_pci_device_t
*
d
=
&
it8172_chipsets
[
id
->
driver_data
];
if
((
!
(
PCI_FUNC
(
dev
->
devfn
)
&
1
)
||
(
!
((
dev
->
class
>>
8
)
==
PCI_CLASS_STORAGE_IDE
))))
return
;
/* IT8172 is more than only a IDE controller */
return
0
;
/* IT8172 is more than only a IDE controller */
ide_setup_pci_device
(
dev
,
d
);
return
0
;
}
static
int
__init
it8172_scan_pcidev
(
struct
pci_dev
*
dev
)
/**
* it8172_remove_one - called with an IT8172 is unplugged
* @dev: the device that was removed
*
* Disconnect an IT8172 device that has been unplugged either by hotplug
* or by a more civilized notification scheme. Not yet supported.
*/
static
void
it8172_remove_one
(
struct
pci_dev
*
dev
)
{
ide_pci_device_t
*
d
;
panic
(
"IT8172 removal not yet supported"
);
}
if
(
dev
->
vendor
!=
PCI_VENDOR_ID_ITE
)
return
0
;
static
struct
pci_device_id
it8172_pci_tbl
[]
__devinitdata
=
{
{
PCI_VENDOR_ID_ITE
,
PCI_DEVICE_ID_ITE_IT8172G
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
0
},
{
0
,
},
};
for
(
d
=
it8172_chipsets
;
d
&&
d
->
vendor
&&
d
->
device
;
++
d
)
{
if
(((
d
->
vendor
==
dev
->
vendor
)
&&
(
d
->
device
==
dev
->
device
))
&&
(
d
->
init_setup
))
{
d
->
init_setup
(
dev
,
d
);
return
1
;
}
}
return
0
;
static
struct
pci_driver
driver
=
{
name:
"IT8172IDE"
,
id_table:
it8172_pci_tbl
,
probe:
it8172_init_one
,
remove:
__devexit_p
(
it8172_remove_one
),
};
static
int
it8172_ide_init
(
void
)
{
return
ide_pci_register_driver
(
&
driver
);
}
static
void
it8172_ide_exit
(
void
)
{
ide_pci_unregister_driver
(
&
driver
);
}
module_init
(
it8172_ide_init
);
module_exit
(
it8172_ide_exit
);
MODULE_AUTHOR
(
"SteveL@mvista.com"
);
MODULE_DESCRIPTION
(
"PCI driver module for ITE 8172 IDE"
);
MODULE_LICENSE
(
"GPL"
);
EXPORT_NO_SYMBOLS
;
drivers/ide/pci/it8172.h
View file @
c9c13c7b
...
...
@@ -20,7 +20,7 @@ static void init_hwif_it8172(ide_hwif_t *);
static
void
init_dma_it8172
(
ide_hwif_t
*
,
unsigned
long
);
static
ide_pci_device_t
it8172_chipsets
[]
__initdata
=
{
{
{
/* 0 */
vendor:
PCI_VENDOR_ID_ITE
,
device:
PCI_DEVICE_ID_ITE_IT8172G
,
name:
"IT8172G"
,
...
...
drivers/ide/pci/ns87415.c
View file @
c9c13c7b
/*
* linux/drivers/ide/ns87415.c Version
1.01 Mar. 18, 2000
* linux/drivers/ide/ns87415.c Version
2.00 Sep. 10, 2002
*
* Copyright (C) 1997-1998 Mark Lord <mlord@pobox.com>
* Copyright (C) 1998 Eddie C. Dost <ecd@skynet.be>
...
...
@@ -9,6 +9,7 @@
*/
#include <linux/config.h>
#include <linux/module.h>
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/timer.h>
...
...
@@ -229,26 +230,55 @@ static void __init init_dma_ns87415 (ide_hwif_t *hwif, unsigned long dmabase)
extern
void
ide_setup_pci_device
(
struct
pci_dev
*
,
ide_pci_device_t
*
);
static
void
__init
init_setup_ns87415
(
struct
pci_dev
*
dev
,
ide_pci_device_t
*
d
)
static
int
__devinit
ns87415_init_one
(
struct
pci_dev
*
dev
,
const
struct
pci_device_id
*
i
d
)
{
ide_pci_device_t
*
d
=
&
ns87415_chipsets
[
id
->
driver_data
];
if
(
dev
->
device
!=
d
->
device
)
BUG
();
ide_setup_pci_device
(
dev
,
d
);
return
0
;
}
int
__init
ns87415_scan_pcidev
(
struct
pci_dev
*
dev
)
/**
* ns87415_remove_one - called with an NS87415 is unplugged
* @dev: the device that was removed
*
* Disconnect an NS87415 device that has been unplugged either by hotplug
* or by a more civilized notification scheme. Not yet supported.
*/
static
void
ns87415_remove_one
(
struct
pci_dev
*
dev
)
{
ide_pci_device_t
*
d
;
panic
(
"NS87415 removal not yet supported"
);
}
if
(
dev
->
vendor
!=
PCI_VENDOR_ID_NS
)
return
0
;
static
struct
pci_device_id
ns87415_pci_tbl
[]
__devinitdata
=
{
{
PCI_VENDOR_ID_NS
,
PCI_DEVICE_ID_NS_87415
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
0
},
{
0
,
},
};
for
(
d
=
ns87415_chipsets
;
d
&&
d
->
vendor
&&
d
->
device
;
++
d
)
{
if
(((
d
->
vendor
==
dev
->
vendor
)
&&
(
d
->
device
==
dev
->
device
))
&&
(
d
->
init_setup
))
{
d
->
init_setup
(
dev
,
d
);
return
1
;
}
}
return
0
;
static
struct
pci_driver
driver
=
{
name:
"NS87415IDE"
,
id_table:
ns87415_pci_tbl
,
probe:
ns87415_init_one
,
remove:
__devexit_p
(
ns87415_remove_one
),
};
static
int
ns87415_ide_init
(
void
)
{
return
ide_pci_register_driver
(
&
driver
);
}
static
void
ns87415_ide_exit
(
void
)
{
ide_pci_unregister_driver
(
&
driver
);
}
module_init
(
ns87415_ide_init
);
module_exit
(
ns87415_ide_exit
);
MODULE_AUTHOR
(
"Mark Lord, Eddie Dost, Andre Hedrick"
);
MODULE_DESCRIPTION
(
"PCI driver module for NS87415 IDE"
);
MODULE_LICENSE
(
"GPL"
);
EXPORT_NO_SYMBOLS
;
drivers/ide/pci/ns87415.h
View file @
c9c13c7b
...
...
@@ -5,16 +5,14 @@
#include <linux/pci.h>
#include <linux/ide.h>
static
void
init_setup_ns87415
(
struct
pci_dev
*
,
ide_pci_device_t
*
);
static
void
init_hwif_ns87415
(
ide_hwif_t
*
);
static
void
init_dma_ns87415
(
ide_hwif_t
*
,
unsigned
long
);
static
ide_pci_device_t
ns87415_chipsets
[]
__initdata
=
{
{
{
/* 0 */
vendor:
PCI_VENDOR_ID_NS
,
device:
PCI_DEVICE_ID_NS_87415
,
name:
"NS87415"
,
init_setup:
init_setup_ns87415
,
init_chipset:
NULL
,
init_iops:
NULL
,
init_hwif:
init_hwif_ns87415
,
...
...
drivers/ide/pci/nvidia.c
View file @
c9c13c7b
...
...
@@ -7,6 +7,7 @@
*/
#include <linux/config.h>
#include <linux/module.h>
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/delay.h>
...
...
@@ -91,8 +92,8 @@ static u8 nforce_ratemask (ide_drive_t *drive)
*/
static
int
nforce_tune_chipset
(
ide_drive_t
*
drive
,
u8
xferspeed
)
{
u8
drive_pci
[]
=
{
0x63
,
0x62
,
0x61
,
0x60
};
u8
drive_pci2
[]
=
{
0x5b
,
0x5a
,
0x59
,
0x58
};
static
const
u8
drive_pci
[]
=
{
0x63
,
0x62
,
0x61
,
0x60
};
static
const
u8
drive_pci2
[]
=
{
0x5b
,
0x5a
,
0x59
,
0x58
};
ide_hwif_t
*
hwif
=
HWIF
(
drive
);
struct
pci_dev
*
dev
=
hwif
->
pci_dev
;
...
...
@@ -336,27 +337,55 @@ static void __init init_dma_nforce (ide_hwif_t *hwif, unsigned long dmabase)
extern
void
ide_setup_pci_device
(
struct
pci_dev
*
,
ide_pci_device_t
*
);
/* FIXME - not needed */
static
void
__init
init_setup_nforce
(
struct
pci_dev
*
dev
,
ide_pci_device_t
*
d
)
static
int
__devinit
nforce_init_one
(
struct
pci_dev
*
dev
,
const
struct
pci_device_id
*
id
)
{
ide_pci_device_t
*
d
=
&
nvidia_chipsets
[
id
->
driver_data
];
if
(
dev
->
device
!=
d
->
device
)
BUG
();
ide_setup_pci_device
(
dev
,
d
);
return
0
;
}
int
__init
nforce_scan_pcidev
(
struct
pci_dev
*
dev
)
/**
* nforce_remove_one - called with an nForce is unplugged
* @dev: the device that was removed
*
* Disconnect an nForce device that has been unplugged either by hotplug
* or by a more civilized notification scheme. Not yet supported.
*/
static
void
nforce_remove_one
(
struct
pci_dev
*
dev
)
{
ide_pci_device_t
*
d
;
panic
(
"nForce removal not yet supported"
);
}
if
(
dev
->
vendor
!=
PCI_VENDOR_ID_NVIDIA
)
return
0
;
static
struct
pci_device_id
nforce_pci_tbl
[]
__devinitdata
=
{
{
PCI_VENDOR_ID_NVIDIA
,
PCI_DEVICE_ID_NVIDIA_NFORCE_IDE
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
0
},
{
0
,
},
};
for
(
d
=
nvidia_chipsets
;
d
&&
d
->
vendor
&&
d
->
device
;
++
d
)
{
if
(((
d
->
vendor
==
dev
->
vendor
)
&&
(
d
->
device
==
dev
->
device
))
&&
(
d
->
init_setup
))
{
d
->
init_setup
(
dev
,
d
);
return
1
;
}
}
return
0
;
static
struct
pci_driver
driver
=
{
name:
"nForce IDE"
,
id_table:
nforce_pci_tbl
,
probe:
nforce_init_one
,
remove:
__devexit_p
(
nforce_remove_one
),
};
static
int
nforce_ide_init
(
void
)
{
return
ide_pci_register_driver
(
&
driver
);
}
static
void
nforce_ide_exit
(
void
)
{
ide_pci_unregister_driver
(
&
driver
);
}
module_init
(
nforce_ide_init
);
module_exit
(
nforce_ide_exit
);
MODULE_AUTHOR
(
"Andre Hedrick"
);
MODULE_DESCRIPTION
(
"PCI driver module for nVidia nForce IDE"
);
MODULE_LICENSE
(
"GPL"
);
EXPORT_NO_SYMBOLS
;
drivers/ide/pci/nvidia.h
View file @
c9c13c7b
...
...
@@ -25,7 +25,6 @@ static ide_pci_host_proc_t nforce_procs[] __initdata = {
};
#endif
/* defined(DISPLAY_NFORCE_TIMINGS) && defined(CONFIG_PROC_FS) */
static
void
init_setup_nforce
(
struct
pci_dev
*
,
ide_pci_device_t
*
);
static
unsigned
int
init_chipset_nforce
(
struct
pci_dev
*
,
const
char
*
);
static
void
init_hwif_nforce
(
ide_hwif_t
*
);
static
void
init_dma_nforce
(
ide_hwif_t
*
,
unsigned
long
);
...
...
@@ -35,7 +34,6 @@ static ide_pci_device_t nvidia_chipsets[] __initdata = {
vendor:
PCI_VENDOR_ID_NVIDIA
,
device:
PCI_DEVICE_ID_NVIDIA_NFORCE_IDE
,
name:
"NFORCE"
,
init_setup:
init_setup_nforce
,
init_chipset:
init_chipset_nforce
,
init_iops:
NULL
,
init_hwif:
init_hwif_nforce
,
...
...
@@ -45,12 +43,8 @@ static ide_pci_device_t nvidia_chipsets[] __initdata = {
enablebits:
{{
0x50
,
0x01
,
0x01
},
{
0x50
,
0x02
,
0x02
}},
bootable:
ON_BOARD
,
extra:
0
,
},{
vendor:
0
,
device:
0
,
channels:
0
,
bootable:
EOL
,
}
};
#endif
/* NFORCE_H */
drivers/ide/pci/opti621.c
View file @
c9c13c7b
/*
* linux/drivers/ide/opti621.c Version 0.
6 Jan 02, 1999
* linux/drivers/ide/opti621.c Version 0.
7 Sept 10, 2002
*
* Copyright (C) 1996-1998 Linus Torvalds & authors (see below)
*/
...
...
@@ -91,6 +91,7 @@
#define OPTI621_DEBUG
/* define for debug messages */
#include <linux/types.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/delay.h>
#include <linux/timer.h>
...
...
@@ -363,21 +364,56 @@ static void __init init_setup_opti621 (struct pci_dev *dev, ide_pci_device_t *d)
ide_setup_pci_device
(
dev
,
d
);
}
int
__init
opti621_scan_pcidev
(
struct
pci_dev
*
dev
)
static
int
__devinit
opti621_init_one
(
struct
pci_dev
*
dev
,
const
struct
pci_device_id
*
id
)
{
ide_pci_device_t
*
d
;
ide_pci_device_t
*
d
=
&
opti621_chipsets
[
id
->
driver_data
];
if
(
dev
->
device
!=
d
->
device
)
BUG
();
ide_setup_pci_device
(
dev
,
d
);
return
0
;
}
if
(
dev
->
vendor
!=
PCI_VENDOR_ID_OPTI
)
return
0
;
/**
* opti621_remove_one - called with an Opti621 is unplugged
* @dev: the device that was removed
*
* Disconnect an Opti621 device that has been unplugged either by hotplug
* or by a more civilized notification scheme. Not yet supported.
*/
static
void
opti621_remove_one
(
struct
pci_dev
*
dev
)
{
panic
(
"Opti621 removal not yet supported"
);
}
for
(
d
=
opti621_chipsets
;
d
&&
d
->
vendor
&&
d
->
device
;
++
d
)
{
if
(((
d
->
vendor
==
dev
->
vendor
)
&&
(
d
->
device
==
dev
->
device
))
&&
(
d
->
init_setup
))
{
d
->
init_setup
(
dev
,
d
);
return
1
;
}
}
return
0
;
static
struct
pci_device_id
opti621_pci_tbl
[]
__devinitdata
=
{
{
PCI_VENDOR_ID_OPTI
,
PCI_DEVICE_ID_OPTI_82C621
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
0
},
{
PCI_VENDOR_ID_OPTI
,
PCI_DEVICE_ID_OPTI_82C825
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
1
},
{
0
,
},
};
static
struct
pci_driver
driver
=
{
name:
"Opti621 IDE"
,
id_table:
opti621_pci_tbl
,
probe:
opti621_init_one
,
remove:
__devexit_p
(
opti621_remove_one
),
};
static
int
opti621_ide_init
(
void
)
{
return
ide_pci_register_driver
(
&
driver
);
}
static
void
opti621_ide_exit
(
void
)
{
ide_pci_unregister_driver
(
&
driver
);
}
module_init
(
opti621_ide_init
);
module_exit
(
opti621_ide_exit
);
MODULE_AUTHOR
(
"Jaromir Koutek, Jan Harkes, Mark Lord"
);
MODULE_DESCRIPTION
(
"PCI driver module for Opti621 IDE"
);
MODULE_LICENSE
(
"GPL"
);
EXPORT_NO_SYMBOLS
;
drivers/ide/pci/opti621.h
View file @
c9c13c7b
...
...
@@ -10,7 +10,7 @@ static void init_hwif_opti621(ide_hwif_t *);
static
void
init_dma_opti621
(
ide_hwif_t
*
,
unsigned
long
);
static
ide_pci_device_t
opti621_chipsets
[]
__initdata
=
{
{
{
/* 0 */
vendor:
PCI_VENDOR_ID_OPTI
,
device:
PCI_DEVICE_ID_OPTI_82C621
,
name:
"OPTI621"
,
...
...
@@ -24,7 +24,7 @@ static ide_pci_device_t opti621_chipsets[] __initdata = {
enablebits:
{{
0x45
,
0x80
,
0x00
},
{
0x40
,
0x08
,
0x00
}},
bootable:
ON_BOARD
,
extra:
0
,
},{
},{
/* 1 */
vendor:
PCI_VENDOR_ID_OPTI
,
device:
PCI_DEVICE_ID_OPTI_82C825
,
name:
"OPTI621X"
,
...
...
drivers/ide/pci/pdc202xx.c
deleted
100644 → 0
View file @
f67dd842
/*
* linux/drivers/ide/pdc202xx.c Version 0.35 Mar. 30, 2002
*
* Copyright (C) 1998-2002 Andre Hedrick <andre@linux-ide.org>
*
* Promise Ultra33 cards with BIOS v1.20 through 1.28 will need this
* compiled into the kernel if you have more than one card installed.
* Note that BIOS v1.29 is reported to fix the problem. Since this is
* safe chipset tuning, including this support is harmless
*
* Promise Ultra66 cards with BIOS v1.11 this
* compiled into the kernel if you have more than one card installed.
*
* Promise Ultra100 cards.
*
* The latest chipset code will support the following ::
* Three Ultra33 controllers and 12 drives.
* 8 are UDMA supported and 4 are limited to DMA mode 2 multi-word.
* The 8/4 ratio is a BIOS code limit by promise.
*
* UNLESS you enable "CONFIG_PDC202XX_BURST"
*
*/
/*
* Portions Copyright (C) 1999 Promise Technology, Inc.
* Author: Frank Tiernan (frankt@promise.com)
* Released under terms of General Public License
*/
#include <linux/config.h>
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/delay.h>
#include <linux/timer.h>
#include <linux/mm.h>
#include <linux/ioport.h>
#include <linux/blkdev.h>
#include <linux/hdreg.h>
#include <linux/interrupt.h>
#include <linux/pci.h>
#include <linux/init.h>
#include <linux/ide.h>
#include <asm/io.h>
#include <asm/irq.h>
#include "ide_modes.h"
#include "pdc202xx.h"
#define PDC202_DEBUG_CABLE 0
#if defined(DISPLAY_PDC202XX_TIMINGS) && defined(CONFIG_PROC_FS)
#include <linux/stat.h>
#include <linux/proc_fs.h>
static
u8
pdc202xx_proc
=
0
;
#define PDC202_MAX_DEVS 5
static
struct
pci_dev
*
pdc202_devs
[
PDC202_MAX_DEVS
];
static
int
n_pdc202_devs
;
static
char
*
pdc202xx_info
(
char
*
buf
,
struct
pci_dev
*
dev
)
{
char
*
p
=
buf
;
u32
bibma
=
pci_resource_start
(
dev
,
4
);
u32
reg60h
=
0
,
reg64h
=
0
,
reg68h
=
0
,
reg6ch
=
0
;
u16
reg50h
=
0
,
pmask
=
(
1
<<
10
),
smask
=
(
1
<<
11
);
u8
hi
=
0
,
lo
=
0
;
/*
* at that point bibma+0x2 et bibma+0xa are byte registers
* to investigate:
*/
u8
c0
=
inb_p
((
u16
)
bibma
+
0x02
);
u8
c1
=
inb_p
((
u16
)
bibma
+
0x0a
);
u8
sc11
=
inb_p
((
u16
)
bibma
+
0x11
);
u8
sc1a
=
inb_p
((
u16
)
bibma
+
0x1a
);
u8
sc1b
=
inb_p
((
u16
)
bibma
+
0x1b
);
u8
sc1c
=
inb_p
((
u16
)
bibma
+
0x1c
);
u8
sc1d
=
inb_p
((
u16
)
bibma
+
0x1d
);
u8
sc1e
=
inb_p
((
u16
)
bibma
+
0x1e
);
u8
sc1f
=
inb_p
((
u16
)
bibma
+
0x1f
);
pci_read_config_word
(
dev
,
0x50
,
&
reg50h
);
pci_read_config_dword
(
dev
,
0x60
,
&
reg60h
);
pci_read_config_dword
(
dev
,
0x64
,
&
reg64h
);
pci_read_config_dword
(
dev
,
0x68
,
&
reg68h
);
pci_read_config_dword
(
dev
,
0x6c
,
&
reg6ch
);
p
+=
sprintf
(
p
,
"
\n
"
);
switch
(
dev
->
device
)
{
case
PCI_DEVICE_ID_PROMISE_20267
:
p
+=
sprintf
(
p
,
"Ultra100"
);
break
;
case
PCI_DEVICE_ID_PROMISE_20265
:
p
+=
sprintf
(
p
,
"Ultra100 on M/B"
);
break
;
case
PCI_DEVICE_ID_PROMISE_20263
:
p
+=
sprintf
(
p
,
"FastTrak 66"
);
break
;
case
PCI_DEVICE_ID_PROMISE_20262
:
p
+=
sprintf
(
p
,
"Ultra66"
);
break
;
case
PCI_DEVICE_ID_PROMISE_20246
:
p
+=
sprintf
(
p
,
"Ultra33"
);
reg50h
|=
0x0c00
;
break
;
default:
p
+=
sprintf
(
p
,
"Ultra Series"
);
break
;
}
p
+=
sprintf
(
p
,
" Chipset.
\n
"
);
p
+=
sprintf
(
p
,
"------------------------------- General Status "
"---------------------------------
\n
"
);
p
+=
sprintf
(
p
,
"Burst Mode : %sabled
\n
"
,
(
sc1f
&
0x01
)
?
"en"
:
"dis"
);
p
+=
sprintf
(
p
,
"Host Mode : %s
\n
"
,
(
sc1f
&
0x08
)
?
"Tri-Stated"
:
"Normal"
);
p
+=
sprintf
(
p
,
"Bus Clocking : %s
\n
"
,
((
sc1f
&
0xC0
)
==
0xC0
)
?
"100 External"
:
((
sc1f
&
0x80
)
==
0x80
)
?
"66 External"
:
((
sc1f
&
0x40
)
==
0x40
)
?
"33 External"
:
"33 PCI Internal"
);
p
+=
sprintf
(
p
,
"IO pad select : %s mA
\n
"
,
((
sc1c
&
0x03
)
==
0x03
)
?
"10"
:
((
sc1c
&
0x02
)
==
0x02
)
?
"8"
:
((
sc1c
&
0x01
)
==
0x01
)
?
"6"
:
((
sc1c
&
0x00
)
==
0x00
)
?
"4"
:
"??"
);
SPLIT_BYTE
(
sc1e
,
hi
,
lo
);
p
+=
sprintf
(
p
,
"Status Polling Period : %d
\n
"
,
hi
);
p
+=
sprintf
(
p
,
"Interrupt Check Status Polling Delay : %d
\n
"
,
lo
);
p
+=
sprintf
(
p
,
"--------------- Primary Channel "
"---------------- Secondary Channel "
"-------------
\n
"
);
p
+=
sprintf
(
p
,
" %s %s
\n
"
,
(
c0
&
0x80
)
?
"disabled"
:
"enabled "
,
(
c1
&
0x80
)
?
"disabled"
:
"enabled "
);
p
+=
sprintf
(
p
,
"66 Clocking %s %s
\n
"
,
(
sc11
&
0x02
)
?
"enabled "
:
"disabled"
,
(
sc11
&
0x08
)
?
"enabled "
:
"disabled"
);
p
+=
sprintf
(
p
,
" Mode %s Mode %s
\n
"
,
(
sc1a
&
0x01
)
?
"MASTER"
:
"PCI "
,
(
sc1b
&
0x01
)
?
"MASTER"
:
"PCI "
);
p
+=
sprintf
(
p
,
" %s %s
\n
"
,
(
sc1d
&
0x08
)
?
"Error "
:
((
sc1d
&
0x05
)
==
0x05
)
?
"Not My INTR "
:
(
sc1d
&
0x04
)
?
"Interrupting"
:
(
sc1d
&
0x02
)
?
"FIFO Full "
:
(
sc1d
&
0x01
)
?
"FIFO Empty "
:
"????????????"
,
(
sc1d
&
0x80
)
?
"Error "
:
((
sc1d
&
0x50
)
==
0x50
)
?
"Not My INTR "
:
(
sc1d
&
0x40
)
?
"Interrupting"
:
(
sc1d
&
0x20
)
?
"FIFO Full "
:
(
sc1d
&
0x10
)
?
"FIFO Empty "
:
"????????????"
);
p
+=
sprintf
(
p
,
"--------------- drive0 --------- drive1 "
"-------- drive0 ---------- drive1 ------
\n
"
);
p
+=
sprintf
(
p
,
"DMA enabled: %s %s "
" %s %s
\n
"
,
(
c0
&
0x20
)
?
"yes"
:
"no "
,
(
c0
&
0x40
)
?
"yes"
:
"no "
,
(
c1
&
0x20
)
?
"yes"
:
"no "
,
(
c1
&
0x40
)
?
"yes"
:
"no "
);
p
+=
sprintf
(
p
,
"DMA Mode: %s %s "
" %s %s
\n
"
,
pdc202xx_ultra_verbose
(
reg60h
,
(
reg50h
&
pmask
)),
pdc202xx_ultra_verbose
(
reg64h
,
(
reg50h
&
pmask
)),
pdc202xx_ultra_verbose
(
reg68h
,
(
reg50h
&
smask
)),
pdc202xx_ultra_verbose
(
reg6ch
,
(
reg50h
&
smask
)));
p
+=
sprintf
(
p
,
"PIO Mode: %s %s "
" %s %s
\n
"
,
pdc202xx_pio_verbose
(
reg60h
),
pdc202xx_pio_verbose
(
reg64h
),
pdc202xx_pio_verbose
(
reg68h
),
pdc202xx_pio_verbose
(
reg6ch
));
#if 0
p += sprintf(p, "--------------- Can ATAPI DMA ---------------\n");
#endif
return
(
char
*
)
p
;
}
static
char
*
pdc202xx_info_new
(
char
*
buf
,
struct
pci_dev
*
dev
)
{
char
*
p
=
buf
;
// u32 bibma = pci_resource_start(dev, 4);
// u32 reg60h = 0, reg64h = 0, reg68h = 0, reg6ch = 0;
// u16 reg50h = 0, word88 = 0;
// int udmasel[4]={0,0,0,0}, piosel[4]={0,0,0,0}, i=0, hd=0;
p
+=
sprintf
(
p
,
"
\n
"
);
switch
(
dev
->
device
)
{
case
PCI_DEVICE_ID_PROMISE_20277
:
p
+=
sprintf
(
p
,
"SBFastTrak 133 Lite"
);
break
;
case
PCI_DEVICE_ID_PROMISE_20276
:
p
+=
sprintf
(
p
,
"MBFastTrak 133 Lite"
);
break
;
case
PCI_DEVICE_ID_PROMISE_20275
:
p
+=
sprintf
(
p
,
"MBUltra133"
);
break
;
case
PCI_DEVICE_ID_PROMISE_20271
:
p
+=
sprintf
(
p
,
"FastTrak TX2000"
);
break
;
case
PCI_DEVICE_ID_PROMISE_20270
:
p
+=
sprintf
(
p
,
"FastTrak LP/TX2/TX4"
);
break
;
case
PCI_DEVICE_ID_PROMISE_20269
:
p
+=
sprintf
(
p
,
"Ultra133 TX2"
);
break
;
case
PCI_DEVICE_ID_PROMISE_20268
:
p
+=
sprintf
(
p
,
"Ultra100 TX2"
);
break
;
default:
p
+=
sprintf
(
p
,
"Ultra series"
);
break
;
break
;
}
p
+=
sprintf
(
p
,
" Chipset.
\n
"
);
return
(
char
*
)
p
;
}
static
int
pdc202xx_get_info
(
char
*
buffer
,
char
**
addr
,
off_t
offset
,
int
count
)
{
char
*
p
=
buffer
;
int
i
;
for
(
i
=
0
;
i
<
n_pdc202_devs
;
i
++
)
{
struct
pci_dev
*
dev
=
pdc202_devs
[
i
];
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_20268
:
case
PCI_DEVICE_ID_PROMISE_20270
:
p
=
pdc202xx_info_new
(
buffer
,
dev
);
break
;
default:
p
=
pdc202xx_info
(
buffer
,
dev
);
break
;
}
}
return
p
-
buffer
;
/* => must be less than 4k! */
}
#endif
/* defined(DISPLAY_PDC202XX_TIMINGS) && defined(CONFIG_PROC_FS) */
static
u8
pdc202xx_ratemask
(
ide_drive_t
*
drive
)
{
u8
mode
;
switch
(
HWIF
(
drive
)
->
pci_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
:
mode
=
4
;
break
;
case
PCI_DEVICE_ID_PROMISE_20270
:
case
PCI_DEVICE_ID_PROMISE_20268
:
mode
=
3
;
break
;
case
PCI_DEVICE_ID_PROMISE_20267
:
case
PCI_DEVICE_ID_PROMISE_20265
:
mode
=
3
;
break
;
case
PCI_DEVICE_ID_PROMISE_20263
:
case
PCI_DEVICE_ID_PROMISE_20262
:
mode
=
2
;
break
;
case
PCI_DEVICE_ID_PROMISE_20246
:
return
1
;
default:
return
0
;
}
if
(
!
eighty_ninty_three
(
drive
))
mode
=
min
(
mode
,
(
u8
)
1
);
return
mode
;
}
static
int
check_in_drive_lists
(
ide_drive_t
*
drive
,
const
char
**
list
)
{
struct
hd_driveid
*
id
=
drive
->
id
;
if
(
pdc_quirk_drives
==
list
)
{
while
(
*
list
)
{
if
(
strstr
(
id
->
model
,
*
list
++
))
{
return
2
;
}
}
}
else
{
while
(
*
list
)
{
if
(
!
strcmp
(
*
list
++
,
id
->
model
))
{
return
1
;
}
}
}
return
0
;
}
static
int
pdc202xx_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
(
pdc202xx_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
);
}
#ifdef CONFIG_BLK_DEV_IDEDMA
}
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
);
}
#endif
/* CONFIG_BLK_DEV_IDEDMA */
}
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
)
{
#ifdef CONFIG_BLK_DEV_IDEDMA
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
;
#endif
/* CONFIG_BLK_DEV_IDEDMA */
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
);
#ifdef CONFIG_BLK_DEV_IDEDMA
}
else
{
pci_write_config_byte
(
dev
,
(
drive_pci
)
|
0x01
,
BP
|
TB
);
pci_write_config_byte
(
dev
,
(
drive_pci
)
|
0x02
,
CP
|
TC
);
#endif
/* CONFIG_BLK_DEV_IDEDMA */
}
#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
(
"%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
pdc202xx_new_tune_chipset
(
ide_drive_t
*
drive
,
u8
xferspeed
)
{
ide_hwif_t
*
hwif
=
HWIF
(
drive
);
#ifdef CONFIG_BLK_DEV_IDEDMA
u32
indexreg
=
hwif
->
dma_vendor1
;
u32
datareg
=
hwif
->
dma_vendor3
;
#else
/* !CONFIG_BLK_DEV_IDEDMA */
struct
pci_dev
*
dev
=
hwif
->
pci_dev
;
u32
high_16
=
pci_resource_start
(
dev
,
4
);
u32
indexreg
=
high_16
+
(
hwif
->
channel
?
0x09
:
0x01
);
u32
datareg
=
(
indexreg
+
2
);
#endif
/* CONFIG_BLK_DEV_IDEDMA */
u8
thold
=
0x10
;
u8
adj
=
(
drive
->
dn
%
2
)
?
0x08
:
0x00
;
u8
speed
=
ide_rate_filter
(
pdc202xx_ratemask
(
drive
),
xferspeed
);
#ifdef CONFIG_BLK_DEV_IDEDMA
if
(
speed
==
XFER_UDMA_2
)
{
hwif
->
OUTB
((
thold
+
adj
),
indexreg
);
hwif
->
OUTB
((
hwif
->
INB
(
datareg
)
&
0x7f
),
datareg
);
}
#endif
/* CONFIG_BLK_DEV_IDEDMA */
switch
(
speed
)
{
#ifdef CONFIG_BLK_DEV_IDEDMA
case
XFER_UDMA_7
:
speed
=
XFER_UDMA_6
;
case
XFER_UDMA_6
:
set_ultra
(
0x1a
,
0x01
,
0xcb
);
break
;
case
XFER_UDMA_5
:
set_ultra
(
0x1a
,
0x02
,
0xcb
);
break
;
case
XFER_UDMA_4
:
set_ultra
(
0x1a
,
0x03
,
0xcd
);
break
;
case
XFER_UDMA_3
:
set_ultra
(
0x1a
,
0x05
,
0xcd
);
break
;
case
XFER_UDMA_2
:
set_ultra
(
0x2a
,
0x07
,
0xcd
);
break
;
case
XFER_UDMA_1
:
set_ultra
(
0x3a
,
0x0a
,
0xd0
);
break
;
case
XFER_UDMA_0
:
set_ultra
(
0x4a
,
0x0f
,
0xd5
);
break
;
case
XFER_MW_DMA_2
:
set_ata2
(
0x69
,
0x25
);
break
;
case
XFER_MW_DMA_1
:
set_ata2
(
0x6b
,
0x27
);
break
;
case
XFER_MW_DMA_0
:
set_ata2
(
0xdf
,
0x5f
);
break
;
#endif
/* CONFIG_BLK_DEV_IDEDMA */
case
XFER_PIO_4
:
set_pio
(
0x23
,
0x09
,
0x25
);
break
;
case
XFER_PIO_3
:
set_pio
(
0x27
,
0x0d
,
0x35
);
break
;
case
XFER_PIO_2
:
set_pio
(
0x23
,
0x26
,
0x64
);
break
;
case
XFER_PIO_1
:
set_pio
(
0x46
,
0x29
,
0xa4
);
break
;
case
XFER_PIO_0
:
set_pio
(
0xfb
,
0x2b
,
0xac
);
break
;
default:
;
}
return
(
ide_config_drive_speed
(
drive
,
speed
));
}
/* 0 1 2 3 4 5 6 7 8
* 960, 480, 390, 300, 240, 180, 120, 90, 60
* 180, 150, 120, 90, 60
* DMA_Speed
* 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
)
{
u8
speed
=
0
;
pio
=
(
pio
==
5
)
?
4
:
pio
;
speed
=
XFER_PIO_0
+
ide_get_best_pio_mode
(
drive
,
255
,
pio
,
NULL
);
return
((
int
)
pdc202xx_tune_chipset
(
drive
,
speed
));
}
static
void
pdc202xx_tune_drive
(
ide_drive_t
*
drive
,
u8
pio
)
{
(
void
)
config_chipset_for_pio
(
drive
,
pio
);
}
#ifdef CONFIG_BLK_DEV_IDEDMA
static
u8
pdc202xx_new_cable_detect
(
ide_hwif_t
*
hwif
)
{
hwif
->
OUTB
(
0x0b
,
hwif
->
dma_vendor1
);
return
((
u8
)((
hwif
->
INB
(
hwif
->
dma_vendor3
)
&
0x04
)));
}
static
u8
pdc202xx_old_cable_detect
(
ide_hwif_t
*
hwif
)
{
u16
CIS
=
0
,
mask
=
(
hwif
->
channel
)
?
(
1
<<
11
)
:
(
1
<<
10
);
pci_read_config_word
(
hwif
->
pci_dev
,
0x50
,
&
CIS
);
return
((
u8
)(
CIS
&
mask
));
}
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
;
u32
drive_conf
=
0
;
u8
mask
=
hwif
->
channel
?
0x08
:
0x02
;
u8
drive_pci
=
0x60
+
(
drive
->
dn
<<
2
);
u8
test1
=
0
,
test2
=
0
,
speed
=
-
1
;
u8
AP
=
0
,
CLKSPD
=
0
,
jumpbit
=
0
,
cable
=
0
;
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
=
pdc202xx_new_cable_detect
(
hwif
);
#if PDC202_DEBUG_CABLE
printk
(
"%s: %s-pin cable, %s-pin cable, %d
\n
"
,
hwif
->
name
,
hwif
->
udma_four
?
"80"
:
"40"
,
cable
?
"40"
:
"80"
,
cable
);
#endif
/* PDC202_DEBUG_CABLE */
jumpbit
=
1
;
break
;
case
PCI_DEVICE_ID_PROMISE_20267
:
case
PCI_DEVICE_ID_PROMISE_20265
:
case
PCI_DEVICE_ID_PROMISE_20263
:
case
PCI_DEVICE_ID_PROMISE_20262
:
cable
=
pdc202xx_old_cable_detect
(
hwif
);
#if PDC202_DEBUG_CABLE
printk
(
"%s: %s-pin cable, %s-pin cable, %d
\n
"
,
hwif
->
name
,
hwif
->
udma_four
?
"80"
:
"40"
,
cable
?
"40"
:
"80"
,
cable
);
#endif
/* PDC202_DEBUG_CABLE */
jumpbit
=
0
;
break
;
default:
cable
=
1
;
jumpbit
=
0
;
break
;
}
if
(
!
jumpbit
)
CLKSPD
=
hwif
->
INB
(
hwif
->
dma_master
+
0x11
);
/*
* 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, seperating 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
(
"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
(
" Switching to Ultra33 mode.
\n
"
);
#endif
/* DEBUG */
/* Primary : zero out second bit */
/* Secondary : zero out fourth bit */
if
(
!
jumpbit
)
hwif
->
OUTB
(
CLKSPD
&
~
mask
,
(
hwif
->
dma_master
+
0x11
));
printk
(
"Warning: %s channel requires an 80-pin cable for operation.
\n
"
,
hwif
->
channel
?
"Secondary"
:
"Primary"
);
printk
(
"%s reduced to Ultra33 mode.
\n
"
,
drive
->
name
);
}
else
{
if
(
ultra_66
)
{
/*
* check to make sure drive on same channel
* is u66 capable
*/
if
(
hwif
->
drives
[
!
(
drive
->
dn
%
2
)].
id
)
{
if
(
hwif
->
drives
[
!
(
drive
->
dn
%
2
)].
id
->
dma_ultra
&
0x0078
)
{
if
(
!
jumpbit
)
hwif
->
OUTB
(
CLKSPD
|
mask
,
(
hwif
->
dma_master
+
0x11
));
}
else
{
if
(
!
jumpbit
)
hwif
->
OUTB
(
CLKSPD
&
~
mask
,
(
hwif
->
dma_master
+
0x11
));
}
}
else
{
/* udma4 drive by itself */
if
(
!
jumpbit
)
hwif
->
OUTB
(
CLKSPD
|
mask
,
(
hwif
->
dma_master
+
0x11
));
}
}
}
if
(
jumpbit
)
{
if
(
drive
->
media
!=
ide_disk
)
return
0
;
if
(
id
->
capability
&
4
)
{
/* IORDY_EN & PREFETCH_EN */
hwif
->
OUTB
((
0x13
+
((
drive
->
dn
%
2
)
?
0x08
:
0x00
)),
hwif
->
dma_vendor1
);
hwif
->
OUTB
((
hwif
->
INB
(
hwif
->
dma_vendor3
)
|
0x03
),
hwif
->
dma_vendor3
);
}
goto
jumpbit_is_set
;
}
drive_pci
=
0x60
+
(
drive
->
dn
<<
2
);
pci_read_config_dword
(
dev
,
drive_pci
,
&
drive_conf
);
if
((
drive_conf
!=
0x004ff304
)
&&
(
drive_conf
!=
0x004ff3c4
))
goto
chipset_is_set
;
pci_read_config_byte
(
dev
,
drive_pci
,
&
test1
);
if
(
!
(
test1
&
SYNC_ERRDY_EN
))
{
if
(
drive
->
select
.
b
.
unit
&
0x01
)
{
pci_read_config_byte
(
dev
,
drive_pci
-
4
,
&
test2
);
if
((
test2
&
SYNC_ERRDY_EN
)
&&
!
(
test1
&
SYNC_ERRDY_EN
))
{
pci_write_config_byte
(
dev
,
drive_pci
,
test1
|
SYNC_ERRDY_EN
);
}
}
else
{
pci_write_config_byte
(
dev
,
drive_pci
,
test1
|
SYNC_ERRDY_EN
);
}
}
chipset_is_set:
if
(
drive
->
media
==
ide_disk
)
{
pci_read_config_byte
(
dev
,
(
drive_pci
),
&
AP
);
if
(
id
->
capability
&
4
)
/* IORDY_EN */
pci_write_config_byte
(
dev
,
(
drive_pci
),
AP
|
IORDY_EN
);
pci_read_config_byte
(
dev
,
(
drive_pci
),
&
AP
);
if
(
drive
->
media
==
ide_disk
)
/* PREFETCH_EN */
pci_write_config_byte
(
dev
,
(
drive_pci
),
AP
|
PREFETCH_EN
);
}
jumpbit_is_set:
speed
=
ide_dma_speed
(
drive
,
pdc202xx_ratemask
(
drive
));
if
(
!
(
speed
))
{
/* restore original pci-config space */
if
(
!
jumpbit
)
pci_write_config_dword
(
dev
,
drive_pci
,
drive_conf
);
hwif
->
tuneproc
(
drive
,
5
);
return
0
;
}
(
void
)
hwif
->
speedproc
(
drive
,
speed
);
return
ide_dma_enable
(
drive
);
}
static
int
pdc202xx_config_drive_xfer_rate
(
ide_drive_t
*
drive
)
{
ide_hwif_t
*
hwif
=
HWIF
(
drive
);
struct
hd_driveid
*
id
=
drive
->
id
;
drive
->
init_speed
=
0
;
if
(
id
&&
(
id
->
capability
&
1
)
&&
drive
->
autodma
)
{
/* Consult the list of known "bad" drives */
if
(
hwif
->
ide_dma_bad_drive
(
drive
))
goto
fast_ata_pio
;
if
(
id
->
field_valid
&
4
)
{
if
(
id
->
dma_ultra
&
hwif
->
ultra_mask
)
{
/* Force if Capable UltraDMA */
int
dma
=
config_chipset_for_dma
(
drive
);
if
((
id
->
field_valid
&
2
)
&&
!
dma
)
goto
try_dma_modes
;
}
}
else
if
(
id
->
field_valid
&
2
)
{
try_dma_modes:
if
((
id
->
dma_mword
&
hwif
->
mwdma_mask
)
||
(
id
->
dma_1word
&
hwif
->
swdma_mask
))
{
/* Force if Capable regular DMA modes */
if
(
!
config_chipset_for_dma
(
drive
))
goto
no_dma_set
;
}
}
else
if
(
hwif
->
ide_dma_good_drive
(
drive
)
&&
(
id
->
eide_dma_time
<
150
))
{
goto
no_dma_set
;
/* Consult the list of known "good" drives */
if
(
!
config_chipset_for_dma
(
drive
))
goto
no_dma_set
;
}
else
{
goto
fast_ata_pio
;
}
}
else
if
((
id
->
capability
&
8
)
||
(
id
->
field_valid
&
2
))
{
fast_ata_pio:
no_dma_set:
hwif
->
tuneproc
(
drive
,
5
);
return
hwif
->
ide_dma_off_quietly
(
drive
);
}
return
hwif
->
ide_dma_on
(
drive
);
}
static
int
pdc202xx_quirkproc
(
ide_drive_t
*
drive
)
{
return
((
int
)
check_in_drive_lists
(
drive
,
pdc_quirk_drives
));
}
static
int
pdc202xx_old_ide_dma_begin
(
ide_drive_t
*
drive
)
{
if
(
drive
->
addressing
==
1
)
{
struct
request
*
rq
=
HWGROUP
(
drive
)
->
rq
;
ide_hwif_t
*
hwif
=
HWIF
(
drive
);
struct
pci_dev
*
dev
=
hwif
->
pci_dev
;
u32
high_16
=
pci_resource_start
(
dev
,
4
);
u32
atapi_reg
=
high_16
+
(
hwif
->
channel
?
0x24
:
0x20
);
u32
word_count
=
0
;
u8
clock
=
hwif
->
INB
(
high_16
+
0x11
);
hwif
->
OUTB
(
clock
|
(
hwif
->
channel
?
0x08
:
0x02
),
high_16
+
0x11
);
word_count
=
(
rq
->
nr_sectors
<<
8
);
word_count
=
(
rq
->
cmd
==
READ
)
?
word_count
|
0x05000000
:
word_count
|
0x06000000
;
hwif
->
OUTL
(
word_count
,
atapi_reg
);
}
return
__ide_dma_begin
(
drive
);
}
static
int
pdc202xx_old_ide_dma_end
(
ide_drive_t
*
drive
)
{
if
(
drive
->
addressing
==
1
)
{
ide_hwif_t
*
hwif
=
HWIF
(
drive
);
u32
high_16
=
pci_resource_start
(
hwif
->
pci_dev
,
4
);
u32
atapi_reg
=
high_16
+
(
hwif
->
channel
?
0x24
:
0x20
);
u8
clock
=
0
;
hwif
->
OUTL
(
0
,
atapi_reg
);
/* zero out extra */
clock
=
hwif
->
INB
(
high_16
+
0x11
);
hwif
->
OUTB
(
clock
&
~
(
hwif
->
channel
?
0x08
:
0x02
),
high_16
+
0x11
);
}
return
__ide_dma_end
(
drive
);
}
static
int
pdc202xx_old_ide_dma_test_irq
(
ide_drive_t
*
drive
)
{
ide_hwif_t
*
hwif
=
HWIF
(
drive
);
struct
pci_dev
*
dev
=
hwif
->
pci_dev
;
unsigned
long
high_16
=
pci_resource_start
(
dev
,
4
);
u8
dma_stat
=
hwif
->
INB
(
hwif
->
dma_status
);
u8
sc1d
=
hwif
->
INB
((
high_16
+
0x001d
));
if
(
hwif
->
channel
)
{
if
((
sc1d
&
0x50
)
==
0x50
)
goto
somebody_else
;
else
if
((
sc1d
&
0x40
)
==
0x40
)
return
(
dma_stat
&
4
)
==
4
;
}
else
{
if
((
sc1d
&
0x05
)
==
0x05
)
goto
somebody_else
;
else
if
((
sc1d
&
0x04
)
==
0x04
)
return
(
dma_stat
&
4
)
==
4
;
}
somebody_else:
return
(
dma_stat
&
4
)
==
4
;
/* return 1 if INTR asserted */
}
static
int
pdc202xx_ide_dma_lostirq
(
ide_drive_t
*
drive
)
{
if
(
HWIF
(
drive
)
->
resetproc
!=
NULL
)
HWIF
(
drive
)
->
resetproc
(
drive
);
return
__ide_dma_lostirq
(
drive
);
}
static
int
pdc202xx_ide_dma_timeout
(
ide_drive_t
*
drive
)
{
if
(
HWIF
(
drive
)
->
resetproc
!=
NULL
)
HWIF
(
drive
)
->
resetproc
(
drive
);
return
__ide_dma_timeout
(
drive
);
}
#endif
/* CONFIG_BLK_DEV_IDEDMA */
static
void
pdc202xx_new_reset
(
ide_drive_t
*
drive
)
{
/*
* Deleted this because it is redundant from the caller.
*/
printk
(
"PDC202XX: %s channel reset.
\n
"
,
HWIF
(
drive
)
->
channel
?
"Secondary"
:
"Primary"
);
}
static
void
pdc202xx_reset_host
(
ide_hwif_t
*
hwif
)
{
#ifdef CONFIG_BLK_DEV_IDEDMA
// unsigned long high_16 = hwif->dma_base - (8*(hwif->channel));
unsigned
long
high_16
=
hwif
->
dma_master
;
#else
/* !CONFIG_BLK_DEV_IDEDMA */
unsigned
long
high_16
=
pci_resource_start
(
hwif
->
pci_dev
,
4
);
#endif
/* CONFIG_BLK_DEV_IDEDMA */
u8
udma_speed_flag
=
hwif
->
INB
(
high_16
|
0x001f
);
hwif
->
OUTB
((
udma_speed_flag
|
0x10
),
(
high_16
|
0x001f
));
mdelay
(
100
);
hwif
->
OUTB
((
udma_speed_flag
&
~
0x10
),
(
high_16
|
0x001f
));
mdelay
(
2000
);
/* 2 seconds ?! */
printk
(
"PDC202XX: %s channel reset.
\n
"
,
hwif
->
channel
?
"Secondary"
:
"Primary"
);
}
void
pdc202xx_reset
(
ide_drive_t
*
drive
)
{
ide_hwif_t
*
hwif
=
HWIF
(
drive
);
ide_hwif_t
*
mate
=
hwif
->
mate
;
pdc202xx_reset_host
(
hwif
);
pdc202xx_reset_host
(
mate
);
#if 0
/*
* FIXME: Have to kick all the drives again :-/
* What a pain in the ACE!
*/
if (hwif->present) {
u16 hunit = 0;
hwif->initializing = 1;
for (hunit = 0; hunit < MAX_DRIVES; ++hunit) {
ide_drive_t *hdrive = &hwif->drives[hunit];
if (hdrive->present) {
if (hwif->ide_dma_check)
hwif->ide_dma_check(hdrive);
else
hwif->tuneproc(hdrive, 5);
}
}
hwif->initializing = 0;
}
if (mate->present) {
u16 munit = 0;
mate->initializing = 1;
for (munit = 0; munit < MAX_DRIVES; ++munit) {
ide_drive_t *mdrive = &mate->drives[munit];
if (mdrive->present) {
if (mate->ide_dma_check)
mate->ide_dma_check(mdrive);
else
mate->tuneproc(mdrive, 5);
}
}
mate->initializing = 0;
}
#else
hwif
->
tuneproc
(
drive
,
5
);
#endif
}
/*
* Since SUN Cobalt is attempting to do this operation, I should disclose
* this has been a long time ago Thu Jul 27 16:40:57 2000 was the patch date
* HOTSWAP ATA Infrastructure.
*/
static
int
pdc202xx_tristate
(
ide_drive_t
*
drive
,
int
state
)
{
ide_hwif_t
*
hwif
=
HWIF
(
drive
);
#ifdef CONFIG_BLK_DEV_IDEDMA
// unsigned long high_16 = hwif->dma_base - (8*(hwif->channel));
unsigned
long
high_16
=
hwif
->
dma_master
;
#else
/* !CONFIG_BLK_DEV_IDEDMA */
unsigned
long
high_16
=
pci_resource_start
(
hwif
->
pci_dev
,
4
);
#endif
/* CONFIG_BLK_DEV_IDEDMA */
u8
sc1f
=
hwif
->
INB
(
high_16
|
0x001f
);
if
(
!
hwif
)
return
-
EINVAL
;
// hwif->bus_state = state;
if
(
state
)
{
hwif
->
OUTB
(
sc1f
|
0x08
,
(
high_16
|
0x001f
));
}
else
{
hwif
->
OUTB
(
sc1f
&
~
0x08
,
(
high_16
|
0x001f
));
}
return
0
;
}
static
unsigned
int
__init
init_chipset_pdc202xx
(
struct
pci_dev
*
dev
,
const
char
*
name
)
{
if
(
dev
->
resource
[
PCI_ROM_RESOURCE
].
start
)
{
pci_write_config_dword
(
dev
,
PCI_ROM_ADDRESS
,
dev
->
resource
[
PCI_ROM_RESOURCE
].
start
|
PCI_ROM_ADDRESS_ENABLE
);
printk
(
"%s: ROM enabled at 0x%08lx
\n
"
,
name
,
dev
->
resource
[
PCI_ROM_RESOURCE
].
start
);
}
#if defined(DISPLAY_PDC202XX_TIMINGS) && defined(CONFIG_PROC_FS)
pdc202_devs
[
n_pdc202_devs
++
]
=
dev
;
if
(
!
pdc202xx_proc
)
{
pdc202xx_proc
=
1
;
ide_pci_register_host_proc
(
&
pdc202xx_procs
[
0
]);
}
#endif
/* DISPLAY_PDC202XX_TIMINGS && CONFIG_PROC_FS */
/*
* software reset - this is required because the bios
* will set UDMA timing on if the hdd supports it. The
* user may want to turn udma off. A bug in the pdc20262
* is that it cannot handle a downgrade in timing from
* UDMA to DMA. Disk accesses after issuing a set
* feature command will result in errors. A software
* reset leaves the timing registers intact,
* but resets the drives.
*/
#if 0
if ((dev->device == PCI_DEVICE_ID_PROMISE_20267) ||
(dev->device == PCI_DEVICE_ID_PROMISE_20265) ||
(dev->device == PCI_DEVICE_ID_PROMISE_20263) ||
(dev->device == PCI_DEVICE_ID_PROMISE_20262)) {
unsigned long high_16 = pci_resource_start(dev, 4);
byte udma_speed_flag = inb(high_16 + 0x001f);
outb(udma_speed_flag | 0x10, high_16 + 0x001f);
mdelay(100);
outb(udma_speed_flag & ~0x10, high_16 + 0x001f);
mdelay(2000); /* 2 seconds ?! */
}
#endif
return
dev
->
irq
;
}
static
void
__init
init_hwif_pdc202xx
(
ide_hwif_t
*
hwif
)
{
hwif
->
autodma
=
0
;
hwif
->
tuneproc
=
&
pdc202xx_tune_drive
;
hwif
->
quirkproc
=
&
pdc202xx_quirkproc
;
if
(
hwif
->
pci_dev
->
device
==
PCI_DEVICE_ID_PROMISE_20267
)
hwif
->
addressing
=
(
hwif
->
channel
)
?
0
:
1
;
if
(
hwif
->
pci_dev
->
device
==
PCI_DEVICE_ID_PROMISE_20265
)
hwif
->
addressing
=
(
hwif
->
channel
)
?
0
:
1
;
if
(
hwif
->
pci_dev
->
device
!=
PCI_DEVICE_ID_PROMISE_20246
)
{
hwif
->
busproc
=
&
pdc202xx_tristate
;
hwif
->
resetproc
=
&
pdc202xx_reset
;
}
hwif
->
speedproc
=
&
pdc202xx_tune_chipset
;
if
(
!
hwif
->
dma_base
)
{
hwif
->
drives
[
0
].
autotune
=
hwif
->
drives
[
1
].
autotune
=
1
;
return
;
}
hwif
->
ultra_mask
=
0x3f
;
hwif
->
mwdma_mask
=
0x07
;
hwif
->
swdma_mask
=
0x07
;
#ifdef CONFIG_BLK_DEV_IDEDMA
hwif
->
ide_dma_check
=
&
pdc202xx_config_drive_xfer_rate
;
hwif
->
ide_dma_lostirq
=
&
pdc202xx_ide_dma_lostirq
;
hwif
->
ide_dma_timeout
=
&
pdc202xx_ide_dma_timeout
;
if
(
hwif
->
pci_dev
->
device
!=
PCI_DEVICE_ID_PROMISE_20246
)
{
if
(
!
(
hwif
->
udma_four
))
hwif
->
udma_four
=
(
pdc202xx_old_cable_detect
(
hwif
))
?
0
:
1
;
hwif
->
ide_dma_begin
=
&
pdc202xx_old_ide_dma_begin
;
hwif
->
ide_dma_end
=
&
pdc202xx_old_ide_dma_end
;
}
hwif
->
ide_dma_test_irq
=
&
pdc202xx_old_ide_dma_test_irq
;
if
(
!
noautodma
)
hwif
->
autodma
=
1
;
hwif
->
drives
[
0
].
autodma
=
hwif
->
drives
[
1
].
autodma
=
hwif
->
autodma
;
#endif
/* CONFIG_BLK_DEV_IDEDMA */
#if PDC202_DEBUG_CABLE
printk
(
"%s: %s-pin cable
\n
"
,
hwif
->
name
,
hwif
->
udma_four
?
"80"
:
"40"
);
#endif
/* PDC202_DEBUG_CABLE */
}
static
void
__init
init_hwif_pdc202new
(
ide_hwif_t
*
hwif
)
{
hwif
->
autodma
=
0
;
hwif
->
tuneproc
=
&
pdc202xx_tune_drive
;
hwif
->
quirkproc
=
&
pdc202xx_quirkproc
;
hwif
->
speedproc
=
&
pdc202xx_new_tune_chipset
;
hwif
->
resetproc
=
&
pdc202xx_new_reset
;
if
(
!
hwif
->
dma_base
)
{
hwif
->
drives
[
0
].
autotune
=
hwif
->
drives
[
1
].
autotune
=
1
;
return
;
}
hwif
->
ultra_mask
=
0x7f
;
hwif
->
mwdma_mask
=
0x07
;
#ifdef CONFIG_BLK_DEV_IDEDMA
hwif
->
ide_dma_check
=
&
pdc202xx_config_drive_xfer_rate
;
hwif
->
ide_dma_lostirq
=
&
pdc202xx_ide_dma_lostirq
;
hwif
->
ide_dma_timeout
=
&
pdc202xx_ide_dma_timeout
;
if
(
!
(
hwif
->
udma_four
))
hwif
->
udma_four
=
(
pdc202xx_new_cable_detect
(
hwif
))
?
0
:
1
;
if
(
!
noautodma
)
hwif
->
autodma
=
1
;
hwif
->
drives
[
0
].
autodma
=
hwif
->
drives
[
1
].
autodma
=
hwif
->
autodma
;
#endif
/* CONFIG_BLK_DEV_IDEDMA */
#if PDC202_DEBUG_CABLE
printk
(
"%s: %s-pin cable
\n
"
,
hwif
->
name
,
hwif
->
udma_four
?
"80"
:
"40"
);
#endif
/* PDC202_DEBUG_CABLE */
}
static
void
__init
init_dma_pdc202xx
(
ide_hwif_t
*
hwif
,
unsigned
long
dmabase
)
{
u8
udma_speed_flag
=
0
,
primary_mode
=
0
,
secondary_mode
=
0
;
if
(
hwif
->
channel
)
{
ide_setup_dma
(
hwif
,
dmabase
,
8
);
return
;
}
udma_speed_flag
=
hwif
->
INB
((
dmabase
|
0x1f
));
primary_mode
=
hwif
->
INB
((
dmabase
|
0x1a
));
secondary_mode
=
hwif
->
INB
((
dmabase
|
0x1b
));
printk
(
"%s: (U)DMA Burst Bit %sABLED "
\
"Primary %s Mode "
\
"Secondary %s Mode.
\n
"
,
hwif
->
cds
->
name
,
(
udma_speed_flag
&
1
)
?
"EN"
:
"DIS"
,
(
primary_mode
&
1
)
?
"MASTER"
:
"PCI"
,
(
secondary_mode
&
1
)
?
"MASTER"
:
"PCI"
);
#ifdef CONFIG_PDC202XX_BURST
if
(
!
(
udma_speed_flag
&
1
))
{
printk
(
"%s: FORCING BURST BIT 0x%02x->0x%02x "
,
hwif
->
cds
->
name
,
udma_speed_flag
,
(
udma_speed_flag
|
1
));
hwif
->
OUTB
(
udma_speed_flag
|
1
,(
dmabase
|
0x1f
));
printk
(
"%sACTIVE
\n
"
,
(
hwif
->
INB
(
dmabase
|
0x1f
)
&
1
)
?
""
:
"IN"
);
}
#endif
/* CONFIG_PDC202XX_BURST */
#ifdef CONFIG_PDC202XX_MASTER
if
(
!
(
primary_mode
&
1
))
{
printk
(
"%s: FORCING PRIMARY MODE BIT "
"0x%02x -> 0x%02x "
,
hwif
->
cds
->
name
,
primary_mode
,
(
primary_mode
|
1
));
hwif
->
OUTB
(
primary_mode
|
1
,
(
dmabase
|
0x1a
));
printk
(
"%s
\n
"
,
(
hwif
->
INB
((
dmabase
|
0x1a
))
&
1
)
?
"MASTER"
:
"PCI"
);
}
if
(
!
(
secondary_mode
&
1
))
{
printk
(
"%s: FORCING SECONDARY MODE BIT "
"0x%02x -> 0x%02x "
,
hwif
->
cds
->
name
,
secondary_mode
,
(
secondary_mode
|
1
));
hwif
->
OUTB
(
secondary_mode
|
1
,
(
dmabase
|
0x1b
));
printk
(
"%s
\n
"
,
(
hwif
->
INB
((
dmabase
|
0x1b
))
&
1
)
?
"MASTER"
:
"PCI"
);
}
#endif
/* CONFIG_PDC202XX_MASTER */
ide_setup_dma
(
hwif
,
dmabase
,
8
);
}
static
void
__init
init_dma_pdc202new
(
ide_hwif_t
*
hwif
,
unsigned
long
dmabase
)
{
ide_setup_dma
(
hwif
,
dmabase
,
8
);
}
extern
void
ide_setup_pci_device
(
struct
pci_dev
*
,
ide_pci_device_t
*
);
extern
void
ide_setup_pci_devices
(
struct
pci_dev
*
,
struct
pci_dev
*
,
ide_pci_device_t
*
);
static
void
__init
init_setup_pdc202ata4
(
struct
pci_dev
*
dev
,
ide_pci_device_t
*
d
)
{
if
((
dev
->
class
>>
8
)
!=
PCI_CLASS_STORAGE_IDE
)
{
u8
irq
=
0
,
irq2
=
0
;
pci_read_config_byte
(
dev
,
PCI_INTERRUPT_LINE
,
&
irq
);
/* 0xbc */
pci_read_config_byte
(
dev
,
(
PCI_INTERRUPT_LINE
)
|
0x80
,
&
irq2
);
if
(
irq
!=
irq2
)
{
pci_write_config_byte
(
dev
,
(
PCI_INTERRUPT_LINE
)
|
0x80
,
irq
);
/* 0xbc */
printk
(
"%s: pci-config space interrupt "
"mirror fixed.
\n
"
,
d
->
name
);
}
}
#if 0
if (dev->device == PCI_DEVICE_ID_PROMISE_20262)
if (e->reg && (pci_read_config_byte(dev, e->reg, &tmp) ||
(tmp & e->mask) != e->val))
if (d->enablebits[0].reg != d->enablebits[1].reg) {
d->enablebits[0].reg = d->enablebits[1].reg;
d->enablebits[0].mask = d->enablebits[1].mask;
d->enablebits[0].val = d->enablebits[1].val;
}
#endif
ide_setup_pci_device
(
dev
,
d
);
}
static
void
__init
init_setup_pdc20265
(
struct
pci_dev
*
dev
,
ide_pci_device_t
*
d
)
{
if
((
dev
->
bus
->
self
)
&&
(
dev
->
bus
->
self
->
vendor
==
PCI_VENDOR_ID_INTEL
)
&&
((
dev
->
bus
->
self
->
device
==
PCI_DEVICE_ID_INTEL_I960
)
||
(
dev
->
bus
->
self
->
device
==
PCI_DEVICE_ID_INTEL_I960RM
)))
{
printk
(
KERN_INFO
"ide: Skipping Promise PDC20265 "
"attached to I2O RAID controller.
\n
"
);
return
;
}
#if 0
{
u8 pri = 0, sec = 0;
if (e->reg && (pci_read_config_byte(dev, e->reg, &tmp) ||
(tmp & e->mask) != e->val))
if (d->enablebits[0].reg != d->enablebits[1].reg) {
d->enablebits[0].reg = d->enablebits[1].reg;
d->enablebits[0].mask = d->enablebits[1].mask;
d->enablebits[0].val = d->enablebits[1].val;
}
}
#endif
ide_setup_pci_device
(
dev
,
d
);
}
static
void
__init
init_setup_pdc202xx
(
struct
pci_dev
*
dev
,
ide_pci_device_t
*
d
)
{
ide_setup_pci_device
(
dev
,
d
);
}
static
void
__init
init_setup_pdc20270
(
struct
pci_dev
*
dev
,
ide_pci_device_t
*
d
)
{
struct
pci_dev
*
findev
;
if
((
dev
->
bus
->
self
&&
dev
->
bus
->
self
->
vendor
==
PCI_VENDOR_ID_DEC
)
&&
(
dev
->
bus
->
self
->
device
==
PCI_DEVICE_ID_DEC_21150
))
{
if
(
PCI_SLOT
(
dev
->
devfn
)
&
2
)
{
return
;
}
d
->
extra
=
0
;
pci_for_each_dev
(
findev
)
{
if
((
findev
->
vendor
==
dev
->
vendor
)
&&
(
findev
->
device
==
dev
->
device
)
&&
(
PCI_SLOT
(
findev
->
devfn
)
&
2
))
{
u8
irq
=
0
,
irq2
=
0
;
pci_read_config_byte
(
dev
,
PCI_INTERRUPT_LINE
,
&
irq
);
pci_read_config_byte
(
findev
,
PCI_INTERRUPT_LINE
,
&
irq2
);
if
(
irq
!=
irq2
)
{
findev
->
irq
=
dev
->
irq
;
pci_write_config_byte
(
findev
,
PCI_INTERRUPT_LINE
,
irq
);
}
ide_setup_pci_devices
(
dev
,
findev
,
d
);
return
;
}
}
}
ide_setup_pci_device
(
dev
,
d
);
}
static
void
__init
init_setup_pdc20276
(
struct
pci_dev
*
dev
,
ide_pci_device_t
*
d
)
{
if
((
dev
->
bus
->
self
)
&&
(
dev
->
bus
->
self
->
vendor
==
PCI_VENDOR_ID_INTEL
)
&&
((
dev
->
bus
->
self
->
device
==
PCI_DEVICE_ID_INTEL_I960
)
||
(
dev
->
bus
->
self
->
device
==
PCI_DEVICE_ID_INTEL_I960RM
)))
{
printk
(
KERN_INFO
"ide: Skipping Promise PDC20276 "
"attached to I2O RAID controller.
\n
"
);
return
;
}
ide_setup_pci_device
(
dev
,
d
);
}
int
__init
pdc202xx_scan_pcidev
(
struct
pci_dev
*
dev
)
{
ide_pci_device_t
*
d
;
if
(
dev
->
vendor
!=
PCI_VENDOR_ID_PROMISE
)
return
0
;
for
(
d
=
pdc202xx_chipsets
;
d
&&
d
->
vendor
&&
d
->
device
;
++
d
)
{
if
(((
d
->
vendor
==
dev
->
vendor
)
&&
(
d
->
device
==
dev
->
device
))
&&
(
d
->
init_setup
))
{
d
->
init_setup
(
dev
,
d
);
return
1
;
}
}
return
0
;
}
drivers/ide/pci/pdc202xx_new.c
View file @
c9c13c7b
...
...
@@ -15,6 +15,7 @@
*/
#include <linux/config.h>
#include <linux/module.h>
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/delay.h>
...
...
@@ -646,21 +647,71 @@ static void __init init_setup_pdc20276 (struct pci_dev *dev, ide_pci_device_t *d
ide_setup_pci_device
(
dev
,
d
);
}
int
__init
pdcnew_scan_pcidev
(
struct
pci_dev
*
dev
)
/**
* pdc202new_init_one - called when a pdc202xx is found
* @dev: the pdc202new device
* @id: the matching pci id
*
* Called when the PCI registration layer (or the IDE initialization)
* finds a device matching our IDE device tables.
*/
static
int
__devinit
pdc202new_init_one
(
struct
pci_dev
*
dev
,
const
struct
pci_device_id
*
id
)
{
ide_pci_device_t
*
d
;
ide_pci_device_t
*
d
=
&
pdcnew_chipsets
[
id
->
driver_data
]
;
if
(
dev
->
vendor
!=
PCI_VENDOR_ID_PROMISE
)
return
0
;
for
(
d
=
pdcnew_chipsets
;
d
&&
d
->
vendor
&&
d
->
device
;
++
d
)
{
if
(((
d
->
vendor
==
dev
->
vendor
)
&&
(
d
->
device
==
dev
->
device
))
&&
(
d
->
init_setup
))
{
d
->
init_setup
(
dev
,
d
);
return
1
;
}
}
if
(
dev
->
device
!=
d
->
device
)
BUG
();
d
->
init_setup
(
dev
,
d
);
return
0
;
}
/**
* pdc202new_remove_one - called when a pdc202xx is unplugged
* @dev: the device that was removed
*
* Disconnect an IDE device that has been unplugged either by hotplug
* or by a more civilized notification scheme. Not yet supported.
*/
static
void
pdc202new_remove_one
(
struct
pci_dev
*
dev
)
{
panic
(
"Promise IDE removal not yet supported"
);
}
static
struct
pci_device_id
pdc202new_pci_tbl
[]
__devinitdata
=
{
{
PCI_VENDOR_ID_PROMISE
,
PCI_DEVICE_ID_PROMISE_20268
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
0
},
{
PCI_VENDOR_ID_PROMISE
,
PCI_DEVICE_ID_PROMISE_20269
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
1
},
{
PCI_VENDOR_ID_PROMISE
,
PCI_DEVICE_ID_PROMISE_20270
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
2
},
{
PCI_VENDOR_ID_PROMISE
,
PCI_DEVICE_ID_PROMISE_20271
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
3
},
{
PCI_VENDOR_ID_PROMISE
,
PCI_DEVICE_ID_PROMISE_20275
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
4
},
{
PCI_VENDOR_ID_PROMISE
,
PCI_DEVICE_ID_PROMISE_20276
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
5
},
{
PCI_VENDOR_ID_PROMISE
,
PCI_DEVICE_ID_PROMISE_20277
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
6
},
{
0
,
},
};
static
struct
pci_driver
driver
=
{
name:
"Promise IDE"
,
id_table:
pdc202new_pci_tbl
,
probe:
pdc202new_init_one
,
remove:
__devexit_p
(
pdc202new_remove_one
),
};
static
int
pdc202new_ide_init
(
void
)
{
return
ide_pci_register_driver
(
&
driver
);
}
static
void
pdc202new_ide_exit
(
void
)
{
ide_pci_unregister_driver
(
&
driver
);
}
module_init
(
pdc202new_ide_init
);
module_exit
(
pdc202new_ide_exit
);
MODULE_AUTHOR
(
"Andre Hedrick, Frank Tiernan"
);
MODULE_DESCRIPTION
(
"PCI driver module for Promise PDC20268 and higher"
);
MODULE_LICENSE
(
"GPL"
);
EXPORT_NO_SYMBOLS
;
drivers/ide/pci/pdc202xx_new.h
View file @
c9c13c7b
...
...
@@ -226,7 +226,7 @@ static void init_hwif_pdc202new(ide_hwif_t *);
static
void
init_dma_pdc202new
(
ide_hwif_t
*
,
unsigned
long
);
static
ide_pci_device_t
pdcnew_chipsets
[]
__initdata
=
{
{
{
/* 0 */
vendor:
PCI_VENDOR_ID_PROMISE
,
device:
PCI_DEVICE_ID_PROMISE_20268
,
name:
"PDC20268"
,
...
...
@@ -240,7 +240,7 @@ static ide_pci_device_t pdcnew_chipsets[] __initdata = {
enablebits:
{{
0x00
,
0x00
,
0x00
},
{
0x00
,
0x00
,
0x00
}},
bootable:
OFF_BOARD
,
extra:
0
,
},{
},{
/* 1 */
vendor:
PCI_VENDOR_ID_PROMISE
,
device:
PCI_DEVICE_ID_PROMISE_20269
,
name:
"PDC20269"
,
...
...
@@ -254,7 +254,7 @@ static ide_pci_device_t pdcnew_chipsets[] __initdata = {
enablebits:
{{
0x00
,
0x00
,
0x00
},
{
0x00
,
0x00
,
0x00
}},
bootable:
OFF_BOARD
,
extra:
0
,
},{
},{
/* 2 */
vendor:
PCI_VENDOR_ID_PROMISE
,
device:
PCI_DEVICE_ID_PROMISE_20270
,
name:
"PDC20270"
,
...
...
@@ -272,7 +272,7 @@ static ide_pci_device_t pdcnew_chipsets[] __initdata = {
#endif
bootable:
OFF_BOARD
,
extra:
0
,
},{
},{
/* 3 */
vendor:
PCI_VENDOR_ID_PROMISE
,
device:
PCI_DEVICE_ID_PROMISE_20271
,
name:
"PDC20271"
,
...
...
@@ -286,7 +286,7 @@ static ide_pci_device_t pdcnew_chipsets[] __initdata = {
enablebits:
{{
0x00
,
0x00
,
0x00
},
{
0x00
,
0x00
,
0x00
}},
bootable:
OFF_BOARD
,
extra:
0
,
},{
},{
/* 4 */
vendor:
PCI_VENDOR_ID_PROMISE
,
device:
PCI_DEVICE_ID_PROMISE_20275
,
name:
"PDC20275"
,
...
...
@@ -300,7 +300,7 @@ static ide_pci_device_t pdcnew_chipsets[] __initdata = {
enablebits:
{{
0x00
,
0x00
,
0x00
},
{
0x00
,
0x00
,
0x00
}},
bootable:
OFF_BOARD
,
extra:
0
,
},{
},{
/* 5 */
vendor:
PCI_VENDOR_ID_PROMISE
,
device:
PCI_DEVICE_ID_PROMISE_20276
,
name:
"PDC20276"
,
...
...
@@ -318,7 +318,7 @@ static ide_pci_device_t pdcnew_chipsets[] __initdata = {
#endif
bootable:
OFF_BOARD
,
extra:
0
,
},{
},{
/* 6 */
vendor:
PCI_VENDOR_ID_PROMISE
,
device:
PCI_DEVICE_ID_PROMISE_20277
,
name:
"PDC20277"
,
...
...
drivers/ide/pci/pdc202xx_old.c
View file @
c9c13c7b
/*
* linux/drivers/ide/pdc202xx.c Version 0.3
5 Mar. 30
, 2002
* linux/drivers/ide/pdc202xx.c Version 0.3
6 Sept 11
, 2002
*
* Copyright (C) 1998-2002 Andre Hedrick <andre@linux-ide.org>
*
...
...
@@ -30,6 +30,7 @@
#include <linux/config.h>
#include <linux/types.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/delay.h>
#include <linux/timer.h>
...
...
@@ -918,21 +919,69 @@ static void __init init_setup_pdc202xx (struct pci_dev *dev, ide_pci_device_t *d
ide_setup_pci_device
(
dev
,
d
);
}
int
__init
pdc202xx_scan_pcidev
(
struct
pci_dev
*
dev
)
/**
* pdc202xx_init_one - called when a PDC202xx is found
* @dev: the pdc202xx device
* @id: the matching pci id
*
* Called when the PCI registration layer (or the IDE initialization)
* finds a device matching our IDE device tables.
*/
static
int
__devinit
pdc202xx_init_one
(
struct
pci_dev
*
dev
,
const
struct
pci_device_id
*
id
)
{
ide_pci_device_t
*
d
;
ide_pci_device_t
*
d
=
&
pdc202xx_chipsets
[
id
->
driver_data
]
;
if
(
dev
->
vendor
!=
PCI_VENDOR_ID_PROMISE
)
return
0
;
for
(
d
=
pdc202xx_chipsets
;
d
&&
d
->
vendor
&&
d
->
device
;
++
d
)
{
if
(((
d
->
vendor
==
dev
->
vendor
)
&&
(
d
->
device
==
dev
->
device
))
&&
(
d
->
init_setup
))
{
d
->
init_setup
(
dev
,
d
);
return
1
;
}
}
if
(
dev
->
device
!=
d
->
device
)
BUG
();
d
->
init_setup
(
dev
,
d
);
return
0
;
}
/**
* pdc202xx_remove_one - called with the IDE to be unplugged
* @dev: the device that was removed
*
* Disconnect an IDE device that has been unplugged either by hotplug
* or by a more civilized notification scheme. Not yet supported.
*/
static
void
pdc202xx_remove_one
(
struct
pci_dev
*
dev
)
{
panic
(
"Promise IDE removal not yet supported"
);
}
static
struct
pci_device_id
pdc202xx_pci_tbl
[]
__devinitdata
=
{
{
PCI_VENDOR_ID_PROMISE
,
PCI_DEVICE_ID_PROMISE_20246
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
0
},
{
PCI_VENDOR_ID_PROMISE
,
PCI_DEVICE_ID_PROMISE_20262
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
1
},
{
PCI_VENDOR_ID_PROMISE
,
PCI_DEVICE_ID_PROMISE_20263
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
2
},
{
PCI_VENDOR_ID_PROMISE
,
PCI_DEVICE_ID_PROMISE_20265
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
3
},
{
PCI_VENDOR_ID_PROMISE
,
PCI_DEVICE_ID_PROMISE_20267
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
4
},
{
0
,
},
};
static
struct
pci_driver
driver
=
{
name:
"Promise Old IDE"
,
id_table:
pdc202xx_pci_tbl
,
probe:
pdc202xx_init_one
,
remove:
__devexit_p
(
pdc202xx_remove_one
),
};
static
int
pdc202xx_ide_init
(
void
)
{
return
ide_pci_register_driver
(
&
driver
);
}
static
void
pdc202xx_ide_exit
(
void
)
{
ide_pci_unregister_driver
(
&
driver
);
}
module_init
(
pdc202xx_ide_init
);
module_exit
(
pdc202xx_ide_exit
);
MODULE_AUTHOR
(
"Andre Hedrick, Frank Tiernan"
);
MODULE_DESCRIPTION
(
"PCI driver module for older Promise IDE"
);
MODULE_LICENSE
(
"GPL"
);
EXPORT_NO_SYMBOLS
;
drivers/ide/pci/pdc202xx_old.h
View file @
c9c13c7b
...
...
@@ -226,7 +226,7 @@ static void init_hwif_pdc202xx(ide_hwif_t *);
static
void
init_dma_pdc202xx
(
ide_hwif_t
*
,
unsigned
long
);
static
ide_pci_device_t
pdc202xx_chipsets
[]
__initdata
=
{
{
{
/* 0 */
vendor:
PCI_VENDOR_ID_PROMISE
,
device:
PCI_DEVICE_ID_PROMISE_20246
,
name:
"PDC20246"
,
...
...
@@ -244,7 +244,7 @@ static ide_pci_device_t pdc202xx_chipsets[] __initdata = {
#endif
bootable:
OFF_BOARD
,
extra:
16
,
},{
},{
/* 1 */
vendor:
PCI_VENDOR_ID_PROMISE
,
device:
PCI_DEVICE_ID_PROMISE_20262
,
name:
"PDC20262"
,
...
...
@@ -262,7 +262,7 @@ static ide_pci_device_t pdc202xx_chipsets[] __initdata = {
#endif
bootable:
OFF_BOARD
,
extra:
48
,
},{
},{
/* 2 */
vendor:
PCI_VENDOR_ID_PROMISE
,
device:
PCI_DEVICE_ID_PROMISE_20263
,
name:
"PDC20263"
,
...
...
@@ -280,7 +280,7 @@ static ide_pci_device_t pdc202xx_chipsets[] __initdata = {
#endif
bootable:
OFF_BOARD
,
extra:
48
,
},{
},{
/* 3 */
vendor:
PCI_VENDOR_ID_PROMISE
,
device:
PCI_DEVICE_ID_PROMISE_20265
,
name:
"PDC20265"
,
...
...
@@ -297,7 +297,7 @@ static ide_pci_device_t pdc202xx_chipsets[] __initdata = {
#endif
bootable:
OFF_BOARD
,
extra:
48
,
},{
},{
/* 4 */
vendor:
PCI_VENDOR_ID_PROMISE
,
device:
PCI_DEVICE_ID_PROMISE_20267
,
name:
"PDC20267"
,
...
...
drivers/ide/pci/pdcadma.c
View file @
c9c13c7b
/*
* linux/drivers/ide/pdcadma.c Version 0.0
1 June 21, 2001
* linux/drivers/ide/pdcadma.c Version 0.0
5 Sept 10, 2002
*
* Copyright (C) 1999-2000 Andre Hedrick <andre@linux-ide.org>
* May be copied or modified under the terms of the GNU General Public License
...
...
@@ -127,26 +127,55 @@ static void __init init_dma_pdcadma (ide_hwif_t *hwif, unsigned long dmabase)
extern
void
ide_setup_pci_device
(
struct
pci_dev
*
,
ide_pci_device_t
*
);
static
void
__init
init_setup_pdcadma
(
struct
pci_dev
*
dev
,
ide_pci_device_t
*
d
)
static
int
__devinit
pdcadma_init_one
(
struct
pci_dev
*
dev
,
const
struct
pci_device_id
*
i
d
)
{
ide_pci_device_t
*
d
=
&
pdcadma_chipsets
[
id
->
driver_data
];
if
(
dev
->
device
!=
d
->
device
)
BUG
();
ide_setup_pci_device
(
dev
,
d
);
return
1
;
}
int
__init
pdcadma_scan_pcidev
(
struct
pci_dev
*
dev
)
/**
* pdcadma_remove_one - called when a PDCADMA is unplugged
* @dev: the device that was removed
*
* Disconnect a PDCADMA device that has been unplugged either by hotplug
* or by a more civilized notification scheme. Not yet supported.
*/
static
void
pdcadma_remove_one
(
struct
pci_dev
*
dev
)
{
ide_pci_device_t
*
d
;
if
(
dev
->
vendor
!=
PCI_VENDOR_ID_PDC
)
return
0
;
for
(
d
=
pdcadma_chipsets
;
d
&&
d
->
vendor
&&
d
->
device
;
++
d
)
{
if
(((
d
->
vendor
==
dev
->
vendor
)
&&
(
d
->
device
==
dev
->
device
))
&&
(
d
->
init_setup
))
{
d
->
init_setup
(
dev
,
d
);
return
1
;
}
}
return
0
;
panic
(
"PDCADMA removal not yet supported"
);
}
static
struct
pci_device_id
pdcadma_pci_tbl
[]
__devinitdata
=
{
{
PCI_VENDOR_ID_PDC
,
PCI_DEVICE_ID_PDC_1841
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
0
},
{
0
,
},
};
static
struct
pci_driver
driver
=
{
name:
"PDCADMA-IDE"
,
id_table:
pdcadma_pci_tbl
,
probe:
pdcadma_init_one
,
remove:
__devexit_p
(
pdcadma_remove_one
),
};
static
int
pdcadma_ide_init
(
void
)
{
return
ide_pci_register_driver
(
&
driver
);
}
static
void
pdcadma_ide_exit
(
void
)
{
ide_pci_unregister_driver
(
&
driver
);
}
module_init
(
pdcadma_ide_init
);
module_exit
(
pdcadma_ide_exit
);
MODULE_AUTHOR
(
"Andre Hedrick"
);
MODULE_DESCRIPTION
(
"PCI driver module for PDCADMA IDE"
);
MODULE_LICENSE
(
"GPL"
);
EXPORT_NO_SYMBOLS
;
drivers/ide/pci/pdcadma.h
View file @
c9c13c7b
...
...
@@ -31,7 +31,7 @@ static void init_hwif_pdcadma(ide_hwif_t *);
static
void
init_dma_pdcadma
(
ide_hwif_t
*
,
unsigned
long
);
static
ide_pci_device_t
pdcadma_chipsets
[]
__initdata
=
{
{
{
/* 0 */
vendor:
PCI_VENDOR_ID_PDC
,
device:
PCI_DEVICE_ID_PDC_1841
,
name:
"PDCADMA"
,
...
...
drivers/ide/pci/piix.c
View file @
c9c13c7b
...
...
@@ -55,6 +55,7 @@
#include <linux/config.h>
#include <linux/types.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/ioport.h>
#include <linux/pci.h>
...
...
@@ -664,29 +665,79 @@ static void __init init_setup_piix (struct pci_dev *dev, ide_pci_device_t *d)
}
/**
* piix_scan_pcidev - Check for and initialize PIIX IDE
* @dev: PCI device to check
* piix_init_one - called when a PIIX is found
* @dev: the piix device
* @id: the matching pci id
*
* Checks if the passed device is an Intel PIIX device. If so the
* hardware is initialized and we return 1 to claim the device. If not
* we return 0.
* Called when the PCI registration layer (or the IDE initialization)
* finds a device matching our IDE device tables.
*/
int
__init
piix_scan_pcidev
(
struct
pci_dev
*
dev
)
static
int
__devinit
piix_init_one
(
struct
pci_dev
*
dev
,
const
struct
pci_device_id
*
id
)
{
ide_pci_device_t
*
d
;
ide_pci_device_t
*
d
=
&
piix_pci_info
[
id
->
driver_data
]
;
if
(
dev
->
vendor
!=
PCI_VENDOR_ID_INTEL
)
return
0
;
for
(
d
=
piix_chipsets
;
d
&&
d
->
vendor
&&
d
->
device
;
++
d
)
{
if
(((
d
->
vendor
==
dev
->
vendor
)
&&
(
d
->
device
==
dev
->
device
))
&&
(
d
->
init_setup
))
{
d
->
init_setup
(
dev
,
d
);
return
1
;
}
}
if
(
dev
->
device
!=
d
->
device
)
BUG
();
d
->
init_setup
(
dev
,
d
);
return
0
;
}
/**
* piix_remove_one - called with a PIIX is unplugged
* @dev: the device that was removed
*
* Disconnect a PIIX device that has been unplugged either by hotplug
* or by a more civilized notification scheme. Not yet supported.
*/
static
void
piix_remove_one
(
struct
pci_dev
*
dev
)
{
panic
(
"PIIX removal not yet supported"
);
}
static
struct
pci_device_id
piix_pci_tbl
[]
__devinitdata
=
{
{
PCI_VENDOR_ID_INTEL
,
PCI_DEVICE_ID_INTEL_82371FB_0
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
0
},
{
PCI_VENDOR_ID_INTEL
,
PCI_DEVICE_ID_INTEL_82371FB_1
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
1
},
{
PCI_VENDOR_ID_INTEL
,
PCI_DEVICE_ID_INTEL_82371MX
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
2
},
{
PCI_VENDOR_ID_INTEL
,
PCI_DEVICE_ID_INTEL_82371SB_1
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
3
},
{
PCI_VENDOR_ID_INTEL
,
PCI_DEVICE_ID_INTEL_82371AB
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
4
},
{
PCI_VENDOR_ID_INTEL
,
PCI_DEVICE_ID_INTEL_82801AB_1
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
5
},
{
PCI_VENDOR_ID_INTEL
,
PCI_DEVICE_ID_INTEL_82443MX_1
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
6
},
{
PCI_VENDOR_ID_INTEL
,
PCI_DEVICE_ID_INTEL_82801AA_1
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
7
},
{
PCI_VENDOR_ID_INTEL
,
PCI_DEVICE_ID_INTEL_82372FB_1
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
8
},
{
PCI_VENDOR_ID_INTEL
,
PCI_DEVICE_ID_INTEL_82451NX
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
9
},
{
PCI_VENDOR_ID_INTEL
,
PCI_DEVICE_ID_INTEL_82801BA_9
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
10
},
{
PCI_VENDOR_ID_INTEL
,
PCI_DEVICE_ID_INTEL_82801BA_8
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
11
},
{
PCI_VENDOR_ID_INTEL
,
PCI_DEVICE_ID_INTEL_82801CA_10
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
12
},
{
PCI_VENDOR_ID_INTEL
,
PCI_DEVICE_ID_INTEL_82801CA_11
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
13
},
{
PCI_VENDOR_ID_INTEL
,
PCI_DEVICE_ID_INTEL_82801DB_11
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
14
},
{
PCI_VENDOR_ID_INTEL
,
PCI_DEVICE_ID_INTEL_82801E_11
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
15
},
{
0
,
},
};
static
struct
pci_driver
driver
=
{
name:
"PIIX IDE"
,
id_table:
piix_pci_tbl
,
probe:
piix_init_one
,
remove:
__devexit_p
(
piix_remove_one
),
};
static
int
piix_ide_init
(
void
)
{
return
ide_pci_register_driver
(
&
driver
);
}
static
void
piix_ide_exit
(
void
)
{
ide_pci_unregister_driver
(
&
driver
);
}
module_init
(
piix_ide_init
);
module_exit
(
piix_ide_exit
);
MODULE_AUTHOR
(
"Andre Hedrick, Andrzej Krzysztofowicz"
);
MODULE_DESCRIPTION
(
"PCI driver module for Intel PIIX IDE"
);
MODULE_LICENSE
(
"GPL"
);
EXPORT_NO_SYMBOLS
;
drivers/ide/pci/piix.h
View file @
c9c13c7b
...
...
@@ -28,12 +28,18 @@ static ide_pci_host_proc_t piix_procs[] __initdata = {
#endif
/* defined(DISPLAY_PIIX_TIMINGS) && defined(CONFIG_PROC_FS) */
static
void
init_setup_piix
(
struct
pci_dev
*
,
ide_pci_device_t
*
);
static
unsigned
int
init_chipset_piix
(
struct
pci_dev
*
,
const
char
*
);
static
unsigned
int
__init
init_chipset_piix
(
struct
pci_dev
*
,
const
char
*
);
static
void
init_hwif_piix
(
ide_hwif_t
*
);
static
void
init_dma_piix
(
ide_hwif_t
*
,
unsigned
long
);
static
ide_pci_device_t
piix_chipsets
[]
__initdata
=
{
{
/*
* Table of the various PIIX capability blocks
*
*/
static
ide_pci_device_t
piix_pci_info
[]
__initdata
=
{
{
/* 0 */
vendor:
PCI_VENDOR_ID_INTEL
,
device:
PCI_DEVICE_ID_INTEL_82371FB_0
,
name:
"PIIXa"
,
...
...
@@ -47,7 +53,7 @@ static ide_pci_device_t piix_chipsets[] __initdata = {
enablebits:
{{
0x41
,
0x80
,
0x80
},
{
0x43
,
0x80
,
0x80
}},
bootable:
ON_BOARD
,
extra:
0
,
},{
},{
/* 1 */
vendor:
PCI_VENDOR_ID_INTEL
,
device:
PCI_DEVICE_ID_INTEL_82371FB_1
,
name:
"PIIXb"
,
...
...
@@ -61,7 +67,7 @@ static ide_pci_device_t piix_chipsets[] __initdata = {
enablebits:
{{
0x41
,
0x80
,
0x80
},
{
0x43
,
0x80
,
0x80
}},
bootable:
ON_BOARD
,
extra:
0
,
},{
},{
/* 2 */
vendor:
PCI_VENDOR_ID_INTEL
,
device:
PCI_DEVICE_ID_INTEL_82371MX
,
name:
"MPIIX"
,
...
...
@@ -75,7 +81,7 @@ static ide_pci_device_t piix_chipsets[] __initdata = {
enablebits:
{{
0x6D
,
0x80
,
0x80
},
{
0x6F
,
0x80
,
0x80
}},
bootable:
ON_BOARD
,
extra:
0
,
},{
},{
/* 3 */
vendor:
PCI_VENDOR_ID_INTEL
,
device:
PCI_DEVICE_ID_INTEL_82371SB_1
,
name:
"PIIX3"
,
...
...
@@ -89,7 +95,7 @@ static ide_pci_device_t piix_chipsets[] __initdata = {
enablebits:
{{
0x41
,
0x80
,
0x80
},
{
0x43
,
0x80
,
0x80
}},
bootable:
ON_BOARD
,
extra:
0
,
},{
},{
/* 4 */
vendor:
PCI_VENDOR_ID_INTEL
,
device:
PCI_DEVICE_ID_INTEL_82371AB
,
name:
"PIIX4"
,
...
...
@@ -103,7 +109,7 @@ static ide_pci_device_t piix_chipsets[] __initdata = {
enablebits:
{{
0x41
,
0x80
,
0x80
},
{
0x43
,
0x80
,
0x80
}},
bootable:
ON_BOARD
,
extra:
0
,
},{
},{
/* 5 */
vendor:
PCI_VENDOR_ID_INTEL
,
device:
PCI_DEVICE_ID_INTEL_82801AB_1
,
name:
"ICH0"
,
...
...
@@ -117,7 +123,7 @@ static ide_pci_device_t piix_chipsets[] __initdata = {
enablebits:
{{
0x41
,
0x80
,
0x80
},
{
0x43
,
0x80
,
0x80
}},
bootable:
ON_BOARD
,
extra:
0
,
},{
},{
/* 6 */
vendor:
PCI_VENDOR_ID_INTEL
,
device:
PCI_DEVICE_ID_INTEL_82443MX_1
,
name:
"PIIX4"
,
...
...
@@ -131,7 +137,7 @@ static ide_pci_device_t piix_chipsets[] __initdata = {
enablebits:
{{
0x41
,
0x80
,
0x80
},
{
0x43
,
0x80
,
0x80
}},
bootable:
ON_BOARD
,
extra:
0
,
},{
},{
/* 7 */
vendor:
PCI_VENDOR_ID_INTEL
,
device:
PCI_DEVICE_ID_INTEL_82801AA_1
,
name:
"ICH"
,
...
...
@@ -145,7 +151,7 @@ static ide_pci_device_t piix_chipsets[] __initdata = {
enablebits:
{{
0x41
,
0x80
,
0x80
},
{
0x43
,
0x80
,
0x80
}},
bootable:
ON_BOARD
,
extra:
0
,
},{
},{
/* 8 */
vendor:
PCI_VENDOR_ID_INTEL
,
device:
PCI_DEVICE_ID_INTEL_82372FB_1
,
name:
"PIIX4"
,
...
...
@@ -159,7 +165,7 @@ static ide_pci_device_t piix_chipsets[] __initdata = {
enablebits:
{{
0x41
,
0x80
,
0x80
},
{
0x43
,
0x80
,
0x80
}},
bootable:
ON_BOARD
,
extra:
0
,
},{
},{
/* 9 */
vendor:
PCI_VENDOR_ID_INTEL
,
device:
PCI_DEVICE_ID_INTEL_82451NX
,
name:
"PIIX4"
,
...
...
@@ -173,7 +179,7 @@ static ide_pci_device_t piix_chipsets[] __initdata = {
enablebits:
{{
0x41
,
0x80
,
0x80
},
{
0x43
,
0x80
,
0x80
}},
bootable:
ON_BOARD
,
extra:
0
,
},{
},{
/* 10 */
vendor:
PCI_VENDOR_ID_INTEL
,
device:
PCI_DEVICE_ID_INTEL_82801BA_9
,
name:
"ICH2"
,
...
...
@@ -187,7 +193,7 @@ static ide_pci_device_t piix_chipsets[] __initdata = {
enablebits:
{{
0x41
,
0x80
,
0x80
},
{
0x43
,
0x80
,
0x80
}},
bootable:
ON_BOARD
,
extra:
0
,
},{
},{
/* 11 */
vendor:
PCI_VENDOR_ID_INTEL
,
device:
PCI_DEVICE_ID_INTEL_82801BA_8
,
name:
"ICH2M"
,
...
...
@@ -201,7 +207,7 @@ static ide_pci_device_t piix_chipsets[] __initdata = {
enablebits:
{{
0x41
,
0x80
,
0x80
},
{
0x43
,
0x80
,
0x80
}},
bootable:
ON_BOARD
,
extra:
0
,
},{
},{
/* 12 */
vendor:
PCI_VENDOR_ID_INTEL
,
device:
PCI_DEVICE_ID_INTEL_82801CA_10
,
name:
"ICH3M"
,
...
...
@@ -215,7 +221,7 @@ static ide_pci_device_t piix_chipsets[] __initdata = {
enablebits:
{{
0x41
,
0x80
,
0x80
},
{
0x43
,
0x80
,
0x80
}},
bootable:
ON_BOARD
,
extra:
0
,
},{
},{
/* 13 */
vendor:
PCI_VENDOR_ID_INTEL
,
device:
PCI_DEVICE_ID_INTEL_82801CA_11
,
name:
"ICH3"
,
...
...
@@ -229,7 +235,7 @@ static ide_pci_device_t piix_chipsets[] __initdata = {
enablebits:
{{
0x41
,
0x80
,
0x80
},
{
0x43
,
0x80
,
0x80
}},
bootable:
ON_BOARD
,
extra:
0
,
},{
},{
/* 14 */
vendor:
PCI_VENDOR_ID_INTEL
,
device:
PCI_DEVICE_ID_INTEL_82801DB_11
,
name:
"ICH4"
,
...
...
@@ -243,7 +249,7 @@ static ide_pci_device_t piix_chipsets[] __initdata = {
enablebits:
{{
0x41
,
0x80
,
0x80
},
{
0x43
,
0x80
,
0x80
}},
bootable:
ON_BOARD
,
extra:
0
,
},{
},{
/* 15 */
vendor:
PCI_VENDOR_ID_INTEL
,
device:
PCI_DEVICE_ID_INTEL_82801E_11
,
name:
"C-ICH"
,
...
...
drivers/ide/pci/rz1000.c
View file @
c9c13c7b
...
...
@@ -19,6 +19,7 @@
#include <linux/config.h>
/* for CONFIG_BLK_DEV_IDEPCI */
#include <linux/types.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/delay.h>
#include <linux/timer.h>
...
...
@@ -55,26 +56,57 @@ static void __init init_hwif_rz1000 (ide_hwif_t *hwif)
extern
void
ide_setup_pci_device
(
struct
pci_dev
*
,
ide_pci_device_t
*
);
static
void
__init
init_setup_rz1000
(
struct
pci_dev
*
dev
,
ide_pci_device_t
*
d
)
static
int
__devinit
rz1000_init_one
(
struct
pci_dev
*
dev
,
const
struct
pci_device_id
*
i
d
)
{
ide_pci_device_t
*
d
=
&
rz1000_chipsets
[
id
->
driver_data
];
if
(
dev
->
device
!=
d
->
device
)
BUG
();
ide_setup_pci_device
(
dev
,
d
);
return
0
;
}
int
__init
rz1000_scan_pcidev
(
struct
pci_dev
*
dev
)
/**
* rz1000_remove_one - called with an RZ1000 is unplugged
* @dev: the device that was removed
*
* Disconnect an RZ1000 device that has been unplugged either by hotplug
* or by a more civilized notification scheme. Not yet supported.
*/
static
void
rz1000_remove_one
(
struct
pci_dev
*
dev
)
{
ide_pci_device_t
*
d
;
if
(
dev
->
vendor
!=
PCI_VENDOR_ID_PCTECH
)
return
0
;
for
(
d
=
rz1000_chipsets
;
d
&&
d
->
vendor
&&
d
->
device
;
++
d
)
{
if
(((
d
->
vendor
==
dev
->
vendor
)
&&
(
d
->
device
==
dev
->
device
))
&&
(
d
->
init_setup
))
{
d
->
init_setup
(
dev
,
d
);
return
1
;
}
}
return
0
;
panic
(
"RZ1000 removal not yet supported"
);
}
static
struct
pci_device_id
rz1000_pci_tbl
[]
__devinitdata
=
{
{
PCI_VENDOR_ID_PCTECH
,
PCI_DEVICE_ID_PCTECH_RZ1000
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
0
},
{
PCI_VENDOR_ID_PCTECH
,
PCI_DEVICE_ID_PCTECH_RZ1001
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
1
},
{
0
,
},
};
static
struct
pci_driver
driver
=
{
name:
"RZ1000 IDE"
,
id_table:
rz1000_pci_tbl
,
probe:
rz1000_init_one
,
remove:
__devexit_p
(
rz1000_remove_one
),
};
static
int
rz1000_ide_init
(
void
)
{
return
ide_pci_register_driver
(
&
driver
);
}
static
void
rz1000_ide_exit
(
void
)
{
ide_pci_unregister_driver
(
&
driver
);
}
module_init
(
rz1000_ide_init
);
module_exit
(
rz1000_ide_exit
);
MODULE_AUTHOR
(
"Andre Hedrick"
);
MODULE_DESCRIPTION
(
"PCI driver module for RZ1000 IDE"
);
MODULE_LICENSE
(
"GPL"
);
EXPORT_NO_SYMBOLS
;
drivers/ide/pci/rz1000.h
View file @
c9c13c7b
...
...
@@ -5,7 +5,6 @@
#include <linux/pci.h>
#include <linux/ide.h>
static
void
init_setup_rz1000
(
struct
pci_dev
*
,
ide_pci_device_t
*
);
static
void
init_hwif_rz1000
(
ide_hwif_t
*
);
static
ide_pci_device_t
rz1000_chipsets
[]
__initdata
=
{
...
...
@@ -13,7 +12,6 @@ static ide_pci_device_t rz1000_chipsets[] __initdata = {
vendor:
PCI_VENDOR_ID_PCTECH
,
device:
PCI_DEVICE_ID_PCTECH_RZ1000
,
name:
"RZ1000"
,
init_setup:
init_setup_rz1000
,
init_chipset:
NULL
,
init_iops:
NULL
,
init_hwif:
init_hwif_rz1000
,
...
...
@@ -27,7 +25,6 @@ static ide_pci_device_t rz1000_chipsets[] __initdata = {
vendor:
PCI_VENDOR_ID_PCTECH
,
device:
PCI_DEVICE_ID_PCTECH_RZ1001
,
name:
"RZ1001"
,
init_setup:
init_setup_rz1000
,
init_chipset:
NULL
,
init_iops:
NULL
,
init_hwif:
init_hwif_rz1000
,
...
...
drivers/ide/pci/serverworks.c
View file @
c9c13c7b
/*
* linux/drivers/ide/serverworks.c Version 0.
6 05 April
2002
* linux/drivers/ide/serverworks.c Version 0.
7 10 Sept
2002
*
* Copyright (C) 1998-2000 Michel Aubry
* Copyright (C) 1998-2000 Andrzej Krzysztofowicz
...
...
@@ -25,6 +25,7 @@
#include <linux/config.h>
#include <linux/types.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/ioport.h>
#include <linux/pci.h>
...
...
@@ -766,21 +767,73 @@ static void __init init_setup_csb6 (struct pci_dev *dev, ide_pci_device_t *d)
ide_setup_pci_device
(
dev
,
d
);
}
int
__init
serverworks_scan_pcidev
(
struct
pci_dev
*
dev
)
{
ide_pci_device_t
*
d
;
if
(
dev
->
vendor
!=
PCI_VENDOR_ID_SERVERWORKS
)
return
0
;
/**
* svwks_init_one - called when a OSB/CSB is found
* @dev: the svwks device
* @id: the matching pci id
*
* Called when the PCI registration layer (or the IDE initialization)
* finds a device matching our IDE device tables.
*/
static
int
__devinit
svwks_init_one
(
struct
pci_dev
*
dev
,
const
struct
pci_device_id
*
id
)
{
ide_pci_device_t
*
d
=
&
serverworks_chipsets
[
id
->
driver_data
];
for
(
d
=
serverworks_chipsets
;
d
&&
d
->
vendor
&&
d
->
device
;
++
d
)
{
if
(((
d
->
vendor
==
dev
->
vendor
)
&&
(
d
->
device
==
dev
->
device
))
&&
(
d
->
init_setup
))
{
d
->
init_setup
(
dev
,
d
);
return
1
;
}
}
if
(
dev
->
device
!=
d
->
device
)
BUG
();
d
->
init_setup
(
dev
,
d
);
return
0
;
}
/**
* svwks_remove_one - called when an OSB/CSB is unplugged
* @dev: the device that was removed
*
* Disconnect a SVWKS device that has been unplugged either by hotplug
* or by a more civilized notification scheme. Not yet supported.
*/
static
void
svwks_remove_one
(
struct
pci_dev
*
dev
)
{
panic
(
"SVWKS removal not yet supported"
);
}
static
struct
pci_device_id
svwks_pci_tbl
[]
__devinitdata
=
{
{
PCI_VENDOR_ID_SERVERWORKS
,
PCI_DEVICE_ID_SERVERWORKS_OSB4IDE
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
0
},
{
PCI_VENDOR_ID_SERVERWORKS
,
PCI_DEVICE_ID_SERVERWORKS_CSB5IDE
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
1
},
{
PCI_VENDOR_ID_SERVERWORKS
,
PCI_DEVICE_ID_SERVERWORKS_CSB6IDE
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
2
},
{
PCI_VENDOR_ID_SERVERWORKS
,
PCI_DEVICE_ID_SERVERWORKS_CSB6IDE2
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
3
},
{
0
,
},
};
static
struct
pci_driver
driver
=
{
name:
"Serverworks IDE"
,
id_table:
svwks_pci_tbl
,
probe:
svwks_init_one
,
remove:
__devexit_p
(
svwks_remove_one
),
#if 0 /* FIXME: implement */
suspend: ,
resume: ,
#endif
};
static
int
svwks_ide_init
(
void
)
{
return
ide_pci_register_driver
(
&
driver
);
}
static
void
svwks_ide_exit
(
void
)
{
ide_pci_unregister_driver
(
&
driver
);
}
module_init
(
svwks_ide_init
);
module_exit
(
svwks_ide_exit
);
MODULE_AUTHOR
(
"Michael Aubry. Andrzej Krzysztofowicz, Andre Hedrick"
);
MODULE_DESCRIPTION
(
"PCI driver module for Serverworks OSB4/CSB5/CSB6 IDE"
);
MODULE_LICENSE
(
"GPL"
);
EXPORT_NO_SYMBOLS
;
drivers/ide/pci/serverworks.h
View file @
c9c13c7b
...
...
@@ -38,7 +38,7 @@ static void init_hwif_svwks(ide_hwif_t *);
static
void
init_dma_svwks
(
ide_hwif_t
*
,
unsigned
long
);
static
ide_pci_device_t
serverworks_chipsets
[]
__initdata
=
{
{
{
/* 0 */
vendor:
PCI_VENDOR_ID_SERVERWORKS
,
device:
PCI_DEVICE_ID_SERVERWORKS_OSB4IDE
,
name:
"SvrWks OSB4"
,
...
...
@@ -52,7 +52,7 @@ static ide_pci_device_t serverworks_chipsets[] __initdata = {
enablebits:
{{
0x00
,
0x00
,
0x00
},
{
0x00
,
0x00
,
0x00
}},
bootable:
ON_BOARD
,
extra:
0
,
},{
},{
/* 1 */
vendor:
PCI_VENDOR_ID_SERVERWORKS
,
device:
PCI_DEVICE_ID_SERVERWORKS_CSB5IDE
,
name:
"SvrWks CSB5"
,
...
...
@@ -66,7 +66,7 @@ static ide_pci_device_t serverworks_chipsets[] __initdata = {
enablebits:
{{
0x00
,
0x00
,
0x00
},
{
0x00
,
0x00
,
0x00
}},
bootable:
ON_BOARD
,
extra:
0
,
},{
},{
/* 2 */
vendor:
PCI_VENDOR_ID_SERVERWORKS
,
device:
PCI_DEVICE_ID_SERVERWORKS_CSB6IDE
,
name:
"SvrWks CSB6"
,
...
...
@@ -80,7 +80,7 @@ static ide_pci_device_t serverworks_chipsets[] __initdata = {
enablebits:
{{
0x00
,
0x00
,
0x00
},
{
0x00
,
0x00
,
0x00
}},
bootable:
ON_BOARD
,
extra:
0
,
},{
},{
/* 3 */
vendor:
PCI_VENDOR_ID_SERVERWORKS
,
device:
PCI_DEVICE_ID_SERVERWORKS_CSB6IDE2
,
name:
"SvrWks CSB6"
,
...
...
drivers/ide/pci/siimage.c
View file @
c9c13c7b
/*
* linux/drivers/ide/siimage.c Version 1.0
0 May 9
, 2002
* linux/drivers/ide/siimage.c Version 1.0
1 Sept 11
, 2002
*
* Copyright (C) 2001-2002 Andre Hedrick <andre@linux-ide.org>
*/
#include <linux/config.h>
#include <linux/types.h>
#include <linux/module.h>
#include <linux/pci.h>
#include <linux/delay.h>
#include <linux/hdreg.h>
...
...
@@ -836,26 +837,57 @@ static void __init init_dma_siimage (ide_hwif_t *hwif, unsigned long dmabase)
extern
void
ide_setup_pci_device
(
struct
pci_dev
*
,
ide_pci_device_t
*
);
static
void
__init
init_setup_siimage
(
struct
pci_dev
*
dev
,
ide_pci_device_t
*
d
)
static
int
__devinit
siimage_init_one
(
struct
pci_dev
*
dev
,
const
struct
pci_device_id
*
id
)
{
ide_pci_device_t
*
d
=
&
siimage_chipsets
[
id
->
driver_data
];
if
(
dev
->
device
!=
d
->
device
)
BUG
();
ide_setup_pci_device
(
dev
,
d
);
return
0
;
}
int
__init
siimage_scan_pcidev
(
struct
pci_dev
*
dev
)
/**
* siimage_remove_one - called when an SI IDE is unplugged
* @dev: the device that was removed
*
* Disconnect an IDE device that has been unplugged either by hotplug
* or by a more civilized notification scheme. Not yet supported.
*/
static
void
siimage_remove_one
(
struct
pci_dev
*
dev
)
{
ide_pci_device_t
*
d
;
panic
(
"SiImage IDE removal not yet supported"
);
}
if
(
dev
->
vendor
!=
PCI_VENDOR_ID_CMD
)
return
0
;
static
struct
pci_device_id
siimage_pci_tbl
[]
__devinitdata
=
{
{
PCI_VENDOR_ID_CMD
,
PCI_DEVICE_ID_SII_680
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
0
},
{
PCI_VENDOR_ID_CMD
,
PCI_DEVICE_ID_SII_3112
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
1
},
{
0
,
},
};
for
(
d
=
siimage_chipsets
;
d
&&
d
->
vendor
&&
d
->
device
;
++
d
)
{
if
(((
d
->
vendor
==
dev
->
vendor
)
&&
(
d
->
device
==
dev
->
device
))
&&
(
d
->
init_setup
))
{
d
->
init_setup
(
dev
,
d
);
return
1
;
}
}
return
0
;
static
struct
pci_driver
driver
=
{
name:
"SiI IDE"
,
id_table:
siimage_pci_tbl
,
probe:
siimage_init_one
,
remove:
__devexit_p
(
siimage_remove_one
),
};
static
int
siimage_ide_init
(
void
)
{
return
ide_pci_register_driver
(
&
driver
);
}
static
void
siimage_ide_exit
(
void
)
{
ide_pci_unregister_driver
(
&
driver
);
}
module_init
(
siimage_ide_init
);
module_exit
(
siimage_ide_exit
);
MODULE_AUTHOR
(
"Andre Hedrick"
);
MODULE_DESCRIPTION
(
"PCI driver module for SiI IDE"
);
MODULE_LICENSE
(
"GPL"
);
EXPORT_NO_SYMBOLS
;
drivers/ide/pci/siimage.h
View file @
c9c13c7b
...
...
@@ -107,18 +107,16 @@ static ide_pci_host_proc_t siimage_procs[] __initdata = {
};
#endif
/* DISPLAY_SIIMAGE_TIMINGS && CONFIG_PROC_FS */
static
void
init_setup_siimage
(
struct
pci_dev
*
,
ide_pci_device_t
*
);
static
unsigned
int
init_chipset_siimage
(
struct
pci_dev
*
,
const
char
*
);
static
void
init_iops_siimage
(
ide_hwif_t
*
);
static
void
init_hwif_siimage
(
ide_hwif_t
*
);
static
void
init_dma_siimage
(
ide_hwif_t
*
,
unsigned
long
);
static
ide_pci_device_t
siimage_chipsets
[]
__initdata
=
{
{
{
/* 0 */
vendor:
PCI_VENDOR_ID_CMD
,
device:
PCI_DEVICE_ID_SII_680
,
name:
"SiI680"
,
init_setup:
init_setup_siimage
,
init_chipset:
init_chipset_siimage
,
init_iops:
init_iops_siimage
,
init_hwif:
init_hwif_siimage
,
...
...
@@ -128,11 +126,10 @@ static ide_pci_device_t siimage_chipsets[] __initdata = {
enablebits:
{{
0x00
,
0x00
,
0x00
},
{
0x00
,
0x00
,
0x00
}},
bootable:
ON_BOARD
,
extra:
0
,
},{
},{
/* 1 */
vendor:
PCI_VENDOR_ID_CMD
,
device:
PCI_DEVICE_ID_SII_3112
,
name:
"SiI3112 Serial ATA"
,
init_setup:
init_setup_siimage
,
init_chipset:
init_chipset_siimage
,
init_iops:
init_iops_siimage
,
init_hwif:
init_hwif_siimage
,
...
...
drivers/ide/pci/sis5513.c
View file @
c9c13c7b
/*
* linux/drivers/ide/sis5513.c Version 0.14
July 24
, 2002
* linux/drivers/ide/sis5513.c Version 0.14
ac Sept 11
, 2002
*
* Copyright (C) 1999-2000 Andre Hedrick <andre@linux-ide.org>
* Copyright (C) 2002 Lionel Bouton <Lionel.Bouton@inet6.fr>, Maintainer
...
...
@@ -34,6 +34,7 @@
#include <linux/config.h>
#include <linux/types.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/delay.h>
#include <linux/timer.h>
...
...
@@ -1022,26 +1023,56 @@ static void __init init_dma_sis5513 (ide_hwif_t *hwif, unsigned long dmabase)
extern
void
ide_setup_pci_device
(
struct
pci_dev
*
,
ide_pci_device_t
*
);
static
void
__init
init_setup_sis5513
(
struct
pci_dev
*
dev
,
ide_pci_device_t
*
d
)
static
int
__devinit
sis5513_init_one
(
struct
pci_dev
*
dev
,
const
struct
pci_device_id
*
id
)
{
ide_pci_device_t
*
d
=
&
sis5513_chipsets
[
id
->
driver_data
];
if
(
dev
->
device
!=
d
->
device
)
BUG
();
ide_setup_pci_device
(
dev
,
d
);
return
0
;
}
int
__init
sis5513_scan_pcidev
(
struct
pci_dev
*
dev
)
/**
* sis5513_remove_one - called when SIS IDE is unplugged
* @dev: the device that was removed
*
* Disconnect a SIS IDE device that has been unplugged either by hotplug
* or by a more civilized notification scheme. Not yet supported.
*/
static
void
sis5513_remove_one
(
struct
pci_dev
*
dev
)
{
ide_pci_device_t
*
d
;
panic
(
"SIS IDE removal not yet supported"
);
}
if
(
dev
->
vendor
!=
PCI_VENDOR_ID_SI
)
return
0
;
static
struct
pci_device_id
sis5513_pci_tbl
[]
__devinitdata
=
{
{
PCI_VENDOR_ID_SI
,
PCI_DEVICE_ID_SI_5513
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
0
},
{
0
,
},
};
for
(
d
=
sis5513_chipsets
;
d
&&
d
->
vendor
&&
d
->
device
;
++
d
)
{
if
(((
d
->
vendor
==
dev
->
vendor
)
&&
(
d
->
device
==
dev
->
device
))
&&
(
d
->
init_setup
))
{
d
->
init_setup
(
dev
,
d
);
return
1
;
}
}
return
0
;
static
struct
pci_driver
driver
=
{
name:
"SIS IDE"
,
id_table:
sis5513_pci_tbl
,
probe:
sis5513_init_one
,
remove:
__devexit_p
(
sis5513_remove_one
),
};
static
int
sis5513_ide_init
(
void
)
{
return
ide_pci_register_driver
(
&
driver
);
}
static
void
sis5513_ide_exit
(
void
)
{
ide_pci_unregister_driver
(
&
driver
);
}
module_init
(
sis5513_ide_init
);
module_exit
(
sis5513_ide_exit
);
MODULE_AUTHOR
(
"Lionel Bouton, L C Chang, Andre Hedrick"
);
MODULE_DESCRIPTION
(
"PCI driver module for SIS IDE"
);
MODULE_LICENSE
(
"GPL"
);
EXPORT_NO_SYMBOLS
;
drivers/ide/pci/sis5513.h
View file @
c9c13c7b
...
...
@@ -25,17 +25,15 @@ static ide_pci_host_proc_t sis_procs[] __initdata = {
};
#endif
/* defined(DISPLAY_SIS_TIMINGS) && defined(CONFIG_PROC_FS) */
static
void
init_setup_sis5513
(
struct
pci_dev
*
,
ide_pci_device_t
*
);
static
unsigned
int
init_chipset_sis5513
(
struct
pci_dev
*
,
const
char
*
);
static
void
init_hwif_sis5513
(
ide_hwif_t
*
);
static
void
init_dma_sis5513
(
ide_hwif_t
*
,
unsigned
long
);
static
ide_pci_device_t
sis5513_chipsets
[]
__initdata
=
{
{
{
/* 0 */
vendor:
PCI_VENDOR_ID_SI
,
device:
PCI_DEVICE_ID_SI_5513
,
name:
"SIS5513"
,
init_setup:
init_setup_sis5513
,
init_chipset:
init_chipset_sis5513
,
init_iops:
NULL
,
init_hwif:
init_hwif_sis5513
,
...
...
drivers/ide/pci/sl82c105.c
View file @
c9c13c7b
...
...
@@ -11,6 +11,7 @@
#include <linux/config.h>
#include <linux/types.h>
#include <linuyx/module.h>
#include <linux/kernel.h>
#include <linux/timer.h>
#include <linux/mm.h>
...
...
@@ -281,26 +282,54 @@ static void __init init_hwif_sl82c105(ide_hwif_t *hwif)
extern
void
ide_setup_pci_device
(
struct
pci_dev
*
,
ide_pci_device_t
*
);
static
void
__init
init_setup_sl82c105
(
struct
pci_dev
*
dev
,
ide_pci_device_t
*
d
)
static
int
__devinit
sl82c105_init_one
(
struct
pci_dev
*
dev
,
const
struct
pci_device_id
*
i
d
)
{
ide_pci_device_t
*
d
=
&
slc82c105_chipsets
[
id
->
driver_data
];
if
(
dev
->
device
!=
d
->
device
)
BUG
();
ide_setup_pci_device
(
dev
,
d
);
return
0
;
}
int
__init
sl82c105_scan_pcidev
(
struct
pci_dev
*
dev
)
/**
* sl82c105_remove_one - called with an SLC82c105 is unplugged
* @dev: the device that was removed
*
* Disconnect an W82C105 device that has been unplugged either by hotplug
* or by a more civilized notification scheme. Not yet supported.
*/
static
void
sl82c105_remove_one
(
struct
pci_dev
*
dev
)
{
ide_pci_device_t
*
d
;
panic
(
"W82C105 removal not yet supported"
);
}
if
(
dev
->
vendor
!=
PCI_VENDOR_ID_WINBOND
)
return
0
;
static
struct
pci_device_id
sl82c105_pci_tbl
[]
__devinitdata
=
{
{
PCI_VENDOR_ID_WINBOND
,
PCI_DEVICE_ID_WINBOND_82C105
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
0
},
{
0
,
},
};
for
(
d
=
sl82c105_chipsets
;
d
&&
d
->
vendor
&&
d
->
device
;
++
d
)
{
if
(((
d
->
vendor
==
dev
->
vendor
)
&&
(
d
->
device
==
dev
->
device
))
&&
(
d
->
init_setup
))
{
d
->
init_setup
(
dev
,
d
);
return
1
;
}
}
return
0
;
static
struct
pci_driver
driver
=
{
name:
"W82C105 IDE"
,
id_table:
sl82c105_pci_tbl
,
probe:
sl82c105_init_one
,
remove:
__devexit_p
(
sl82c105_remove_one
),
};
static
int
sl82c105_ide_init
(
void
)
{
return
ide_pci_register_driver
(
&
driver
);
}
static
void
sl82c105_ide_exit
(
void
)
{
ide_pci_unregister_driver
(
&
driver
);
}
module_init
(
sl82c105_ide_init
);
module_exit
(
sl82c105_ide_exit
);
MODULE_DESCRIPTION
(
"PCI driver module for W82C105 IDE"
);
MODULE_LICENSE
(
"GPL"
);
EXPORT_NO_SYMBOLS
;
drivers/ide/pci/sl82c105.h
View file @
c9c13c7b
...
...
@@ -5,17 +5,15 @@
#include <linux/pci.h>
#include <linux/ide.h>
static
void
init_setup_sl82c105
(
struct
pci_dev
*
,
ide_pci_device_t
*
);
static
unsigned
int
init_chipset_sl82c105
(
struct
pci_dev
*
,
const
char
*
);
static
void
init_hwif_sl82c105
(
ide_hwif_t
*
);
static
void
init_dma_sl82c105
(
ide_hwif_t
*
,
unsigned
long
);
static
ide_pci_device_t
sl82c105_chipsets
[]
__initdata
=
{
{
{
/* 0 */
vendor:
PCI_VENDOR_ID_WINBOND
,
device:
PCI_DEVICE_ID_WINBOND_82C105
,
name:
"W82C105"
,
init_setup:
init_setup_sl82c105
,
init_chipset:
init_chipset_sl82c105
,
init_iops:
NULL
,
init_hwif:
init_hwif_sl82c105
,
...
...
drivers/ide/pci/slc90e66.c
View file @
c9c13c7b
/*
* linux/drivers/ide/slc90e66.c Version 0.1
0 October 4, 2000
* linux/drivers/ide/slc90e66.c Version 0.1
1 September 11, 2002
*
* Copyright (C) 2000-2002 Andre Hedrick <andre@linux-ide.org>
*
...
...
@@ -10,6 +10,7 @@
#include <linux/config.h>
#include <linux/types.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/ioport.h>
#include <linux/pci.h>
...
...
@@ -364,26 +365,56 @@ static void __init init_dma_slc90e66 (ide_hwif_t *hwif, unsigned long dmabase)
extern
void
ide_setup_pci_device
(
struct
pci_dev
*
,
ide_pci_device_t
*
);
static
void
__init
init_setup_slc90e66
(
struct
pci_dev
*
dev
,
ide_pci_device_t
*
d
)
static
int
__devinit
slc90e66_init_one
(
struct
pci_dev
*
dev
,
const
struct
pci_device_id
*
id
)
{
ide_pci_device_t
*
d
=
&
slc90e66_chipsets
[
id
->
driver_data
];
if
(
dev
->
device
!=
d
->
device
)
BUG
();
ide_setup_pci_device
(
dev
,
d
);
return
0
;
}
int
__init
slc90e66_scan_pcidev
(
struct
pci_dev
*
dev
)
/**
* slc90e66_remove_one - called with an slc90e66 is unplugged
* @dev: the device that was removed
*
* Disconnect an slc90e66 device that has been unplugged either by hotplug
* or by a more civilized notification scheme. Not yet supported.
*/
static
void
slc90e66_remove_one
(
struct
pci_dev
*
dev
)
{
ide_pci_device_t
*
d
;
panic
(
"slc90e66 removal not yet supported"
);
}
if
(
dev
->
vendor
!=
PCI_VENDOR_ID_EFAR
)
return
0
;
static
struct
pci_device_id
slc90e66_pci_tbl
[]
__devinitdata
=
{
{
PCI_VENDOR_ID_EFAR
,
PCI_DEVICE_ID_EFAR_SLC90E66_1
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
0
},
{
0
,
},
};
for
(
d
=
slc90e66_chipsets
;
d
&&
d
->
vendor
&&
d
->
device
;
++
d
)
{
if
(((
d
->
vendor
==
dev
->
vendor
)
&&
(
d
->
device
==
dev
->
device
))
&&
(
d
->
init_setup
))
{
d
->
init_setup
(
dev
,
d
);
return
1
;
}
}
return
0
;
static
struct
pci_driver
driver
=
{
name:
"SLC90e66 IDE"
,
id_table:
slc90e66_pci_tbl
,
probe:
slc90e66_init_one
,
remove:
__devexit_p
(
slc90e66_remove_one
),
};
static
int
slc90e66_ide_init
(
void
)
{
return
ide_pci_register_driver
(
&
driver
);
}
static
void
slc90e66_ide_exit
(
void
)
{
ide_pci_unregister_driver
(
&
driver
);
}
module_init
(
slc90e66_ide_init
);
module_exit
(
slc90e66_ide_exit
);
MODULE_AUTHOR
(
"Andre Hedrick"
);
MODULE_DESCRIPTION
(
"PCI driver module for SLC90E66 IDE"
);
MODULE_LICENSE
(
"GPL"
);
EXPORT_NO_SYMBOLS
;
drivers/ide/pci/slc90e66.h
View file @
c9c13c7b
...
...
@@ -27,17 +27,15 @@ static ide_pci_host_proc_t slc90e66_procs[] __initdata = {
};
#endif
/* defined(DISPLAY_SLC90E66_TIMINGS) && defined(CONFIG_PROC_FS) */
static
void
init_setup_slc90e66
(
struct
pci_dev
*
,
ide_pci_device_t
*
);
static
unsigned
int
init_chipset_slc90e66
(
struct
pci_dev
*
,
const
char
*
);
static
void
init_hwif_slc90e66
(
ide_hwif_t
*
);
static
void
init_dma_slc90e66
(
ide_hwif_t
*
,
unsigned
long
);
static
ide_pci_device_t
slc90e66_chipsets
[]
__initdata
=
{
{
{
/* 0 */
vendor:
PCI_VENDOR_ID_EFAR
,
device:
PCI_DEVICE_ID_EFAR_SLC90E66_1
,
name:
"SLC90E66"
,
init_setup:
init_setup_slc90e66
,
init_chipset:
init_chipset_slc90e66
,
init_iops:
NULL
,
init_hwif:
init_hwif_slc90e66
,
...
...
drivers/ide/pci/trm290.c
View file @
c9c13c7b
...
...
@@ -126,6 +126,7 @@
#include <linux/config.h>
#include <linux/types.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/mm.h>
#include <linux/ioport.h>
...
...
@@ -191,7 +192,7 @@ static int trm290_ide_dma_write (ide_drive_t *drive /*, struct request *rq */)
trm290_prepare_drive
(
drive
,
0
);
/* select PIO xfer */
return
1
;
#endif
if
(
!
(
count
=
ide_build_dmatable
(
drive
,
rq
)))
{
if
(
!
(
count
=
ide_build_dmatable
(
drive
,
rq
,
PCI_DMA_TODEVICE
)))
{
/* try PIO instead of DMA */
trm290_prepare_drive
(
drive
,
0
);
/* select PIO xfer */
return
1
;
...
...
@@ -235,7 +236,7 @@ static int trm290_ide_dma_read (ide_drive_t *drive /*, struct request *rq */)
task_ioreg_t
command
=
WIN_NOP
;
unsigned
int
count
,
reading
=
2
,
writing
=
0
;
if
(
!
(
count
=
ide_build_dmatable
(
drive
,
rq
)))
{
if
(
!
(
count
=
ide_build_dmatable
(
drive
,
rq
,
PCI_DMA_FROMDEVICE
)))
{
/* try PIO instead of DMA */
trm290_prepare_drive
(
drive
,
0
);
/* select PIO xfer */
return
1
;
...
...
@@ -396,26 +397,55 @@ void __init init_hwif_trm290 (ide_hwif_t *hwif)
extern
void
ide_setup_pci_device
(
struct
pci_dev
*
,
ide_pci_device_t
*
);
void
__init
init_setup_trm290
(
struct
pci_dev
*
dev
,
ide_pci_device_t
*
d
)
static
int
__devinit
trm290_init_one
(
struct
pci_dev
*
dev
,
const
struct
pci_device_id
*
i
d
)
{
ide_pci_device_t
*
d
=
&
trm290_chipsets
[
id
->
driver_data
];
if
(
dev
->
device
!=
d
->
device
)
BUG
();
ide_setup_pci_device
(
dev
,
d
);
return
0
;
}
int
__init
trm290_scan_pcidev
(
struct
pci_dev
*
dev
)
/**
* trm290_remove_one - called when an trm290 is unplugged
* @dev: the device that was removed
*
* Disconnect a trm290 device that has been unplugged either by hotplug
* or by a more civilized notification scheme. Not yet supported.
*/
static
void
trm290_remove_one
(
struct
pci_dev
*
dev
)
{
ide_pci_device_t
*
d
;
panic
(
"trm290 removal not yet supported"
);
}
if
(
dev
->
vendor
!=
PCI_VENDOR_ID_TEKRAM
)
return
0
;
static
struct
pci_device_id
trm290_pci_tbl
[]
__devinitdata
=
{
{
PCI_VENDOR_ID_TEKRAM
,
PCI_DEVICE_ID_TEKRAM_DC290
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
0
},
{
0
,
},
};
for
(
d
=
trm290_chipsets
;
d
&&
d
->
vendor
&&
d
->
device
;
++
d
)
{
if
(((
d
->
vendor
==
dev
->
vendor
)
&&
(
d
->
device
==
dev
->
device
))
&&
(
d
->
init_setup
))
{
d
->
init_setup
(
dev
,
d
);
return
1
;
}
}
return
0
;
static
struct
pci_driver
driver
=
{
name:
"TRM290 IDE"
,
id_table:
trm290_pci_tbl
,
probe:
trm290_init_one
,
remove:
__devexit_p
(
trm290_remove_one
),
};
static
int
trm290_ide_init
(
void
)
{
return
ide_pci_register_driver
(
&
driver
);
}
static
void
trm290_ide_exit
(
void
)
{
ide_pci_unregister_driver
(
&
driver
);
}
module_init
(
trm290_ide_init
);
module_exit
(
trm290_ide_exit
);
MODULE_AUTHOR
(
"Mark Lord"
);
MODULE_DESCRIPTION
(
"PCI driver module for Tekram TRM290 IDE"
);
MODULE_LICENSE
(
"GPL"
);
EXPORT_NO_SYMBOLS
;
drivers/ide/pci/trm290.h
View file @
c9c13c7b
...
...
@@ -5,15 +5,13 @@
#include <linux/pci.h>
#include <linux/ide.h>
extern
void
init_setup_trm290
(
struct
pci_dev
*
,
ide_pci_device_t
*
);
extern
void
init_hwif_trm290
(
ide_hwif_t
*
);
static
ide_pci_device_t
trm290_chipsets
[]
__initdata
=
{
{
{
/* 0 */
vendor:
PCI_VENDOR_ID_TEKRAM
,
device:
PCI_DEVICE_ID_TEKRAM_DC290
,
name:
"TRM290"
,
init_setup:
init_setup_trm290
,
init_chipset:
NULL
,
init_iops:
NULL
,
init_hwif:
init_hwif_trm290
,
...
...
drivers/ide/pci/via82cxxx.c
View file @
c9c13c7b
/*
* $Id: via82cxxx.c,v 3.35-ac
1 2002/08/19
Alan Exp $
* $Id: via82cxxx.c,v 3.35-ac
2 2002/09/111
Alan Exp $
*
* Copyright (c) 2000-2001 Vojtech Pavlik
*
...
...
@@ -33,6 +33,7 @@
*/
#include <linux/config.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/ioport.h>
#include <linux/blkdev.h>
...
...
@@ -161,7 +162,7 @@ static int via_get_info(char *buffer, char **addr, off_t offset, int count)
via_print
(
"Highest DMA rate: %s"
,
via_dma
[
via_config
->
flags
&
VIA_UDMA
]);
via_print
(
"BM-DMA base: %#x"
,
via_base
);
via_print
(
"BM-DMA base: %#
l
x"
,
via_base
);
via_print
(
"PCI clock: %d.%dMHz"
,
via_clock
/
1000
,
via_clock
/
100
%
10
);
...
...
@@ -634,38 +635,56 @@ static void __init init_dma_via82cxxx(ide_hwif_t *hwif, unsigned long dmabase)
extern
void
ide_setup_pci_device
(
struct
pci_dev
*
,
ide_pci_device_t
*
);
/*
* FIXME: should not be needed
*/
static
void
__init
init_setup_via82cxxx
(
struct
pci_dev
*
dev
,
ide_pci_device_t
*
d
)
static
int
__devinit
via_init_one
(
struct
pci_dev
*
dev
,
const
struct
pci_device_id
*
id
)
{
ide_pci_device_t
*
d
=
&
via82cxxx_chipsets
[
id
->
driver_data
];
if
(
dev
->
device
!=
d
->
device
)
BUG
();
ide_setup_pci_device
(
dev
,
d
);
return
0
;
}
/**
* via
82cxxx_scan_pcidev - set up any via devices
* @dev:
PCI device we are offer
ed
* via
_remove_one - called with a VIA IDE interface is unplugged
* @dev:
the device that was remov
ed
*
*
Any controller we are offered that we can configure we set up
*
and return 1. Anything we cannot drive we return 0
*
Disconnect a VIA IDE device that has been unplugged either by hotplug
*
or by a more civilized notification scheme. Not yet supported.
*/
int
__init
via82cxxx_scan_pcidev
(
struct
pci_dev
*
dev
)
static
void
via_remove_one
(
struct
pci_dev
*
dev
)
{
ide_pci_device_t
*
d
;
panic
(
"VIA IDE removal not yet supported"
);
}
if
(
dev
->
vendor
!=
PCI_VENDOR_ID_VIA
)
return
0
;
static
struct
pci_device_id
via_pci_tbl
[]
__devinitdata
=
{
{
PCI_VENDOR_ID_VIA
,
PCI_DEVICE_ID_VIA_82C576_1
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
0
},
{
PCI_VENDOR_ID_VIA
,
PCI_DEVICE_ID_VIA_82C586_1
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
1
},
{
0
,
},
};
for
(
d
=
via82cxxx_chipsets
;
d
&&
d
->
vendor
&&
d
->
device
;
++
d
)
{
if
(((
d
->
vendor
==
dev
->
vendor
)
&&
(
d
->
device
==
dev
->
device
))
&&
(
d
->
init_setup
))
{
d
->
init_setup
(
dev
,
d
);
return
1
;
}
}
return
0
;
static
struct
pci_driver
driver
=
{
name:
"VIA IDE"
,
id_table:
via_pci_tbl
,
probe:
via_init_one
,
remove:
__devexit_p
(
via_remove_one
),
};
static
int
via_ide_init
(
void
)
{
return
ide_pci_register_driver
(
&
driver
);
}
static
void
via_ide_exit
(
void
)
{
ide_pci_unregister_driver
(
&
driver
);
}
module_init
(
via_ide_init
);
module_exit
(
via_ide_exit
);
MODULE_AUTHOR
(
"Vojtech Pavlik, Michel Aubry, Jeff Garzik, Andre Hedrick"
);
MODULE_DESCRIPTION
(
"PCI driver module for VIA IDE"
);
MODULE_LICENSE
(
"GPL"
);
EXPORT_NO_SYMBOLS
;
drivers/ide/pci/via82cxxx.h
View file @
c9c13c7b
...
...
@@ -25,17 +25,15 @@ static ide_pci_host_proc_t via_procs[] __initdata = {
};
#endif
/* DISPLAY_VIA_TIMINGS && CONFIG_PROC_FS */
static
void
init_setup_via82cxxx
(
struct
pci_dev
*
,
ide_pci_device_t
*
);
static
unsigned
int
init_chipset_via82cxxx
(
struct
pci_dev
*
,
const
char
*
);
static
void
init_hwif_via82cxxx
(
ide_hwif_t
*
);
static
void
init_dma_via82cxxx
(
ide_hwif_t
*
,
unsigned
long
);
static
ide_pci_device_t
via82cxxx_chipsets
[]
__initdata
=
{
{
{
/* 0 */
vendor:
PCI_VENDOR_ID_VIA
,
device:
PCI_DEVICE_ID_VIA_82C576_1
,
name:
"VP_IDE"
,
init_setup:
init_setup_via82cxxx
,
init_chipset:
init_chipset_via82cxxx
,
init_iops:
NULL
,
init_hwif:
init_hwif_via82cxxx
,
...
...
@@ -45,11 +43,10 @@ static ide_pci_device_t via82cxxx_chipsets[] __initdata = {
enablebits:
{{
0x40
,
0x02
,
0x02
},
{
0x40
,
0x01
,
0x01
}},
bootable:
ON_BOARD
,
extra:
0
,
},{
},{
/* 1 */
vendor:
PCI_VENDOR_ID_VIA
,
device:
PCI_DEVICE_ID_VIA_82C586_1
,
name:
"VP_IDE"
,
init_setup:
init_setup_via82cxxx
,
init_chipset:
init_chipset_via82cxxx
,
init_iops:
NULL
,
init_hwif:
init_hwif_via82cxxx
,
...
...
drivers/ide/setup-pci.c
View file @
c9c13c7b
...
...
@@ -712,6 +712,8 @@ void ide_setup_pci_device (struct pci_dev *dev, ide_pci_device_t *d)
probe_hwif_init
(
&
ide_hwifs
[
index_list
.
b
.
high
]);
}
EXPORT_SYMBOL_GPL
(
ide_setup_pci_device
);
void
ide_setup_pci_devices
(
struct
pci_dev
*
dev
,
struct
pci_dev
*
dev2
,
ide_pci_device_t
*
d
)
{
ata_index_t
index_list
=
do_ide_setup_pci_device
(
dev
,
d
,
1
);
...
...
@@ -727,152 +729,10 @@ void ide_setup_pci_devices (struct pci_dev *dev, struct pci_dev *dev2, ide_pci_d
probe_hwif_init
(
&
ide_hwifs
[
index_list2
.
b
.
high
]);
}
/*
* ide_scan_pcibus() gets invoked at boot time from ide.c.
* It finds all PCI IDE controllers and calls ide_setup_pci_device for them.
*/
void
__init
ide_scan_pcidev
(
struct
pci_dev
*
dev
)
{
#if 0
printk(" PCI slot %s, VID=%04x, DID=%04x\n",
dev->slot_name, dev->vendor, dev->device);
#endif
if
((
dev
->
vendor
==
PCI_VENDOR_ID_CMD
)
&&
(
dev
->
device
==
PCI_DEVICE_ID_CMD_640
))
{
return
;
#ifdef CONFIG_BLK_DEV_ALI15X3
}{
extern
int
ali15x3_scan_pcidev
(
struct
pci_dev
*
dev
);
if
(
ali15x3_scan_pcidev
(
dev
))
return
;
#endif
/* CONFIG_BLK_DEV_ALI15X3 */
#ifdef CONFIG_BLK_DEV_AMD74XX
}{
extern
int
amd74xx_scan_pcidev
(
struct
pci_dev
*
dev
);
if
(
amd74xx_scan_pcidev
(
dev
))
return
;
#endif
/* CONFIG_BLK_DEV_AMD74XX */
#ifdef CONFIG_BLK_DEV_CS5530
}{
extern
int
cs5530_scan_pcidev
(
struct
pci_dev
*
dev
);
if
(
cs5530_scan_pcidev
(
dev
))
return
;
#endif
/* CONFIG_BLK_DEV_CS5530 */
#ifdef CONFIG_BLK_DEV_CY82C693
}{
extern
int
cy82c693_scan_pcidev
(
struct
pci_dev
*
dev
);
if
(
cy82c693_scan_pcidev
(
dev
))
return
;
#endif
/* CONFIG_BLK_DEV_CY82C693 */
#ifdef CONFIG_BLK_DEV_IT8172
}{
extern
int
it8172_scan_pcidev
(
struct
pci_dev
*
dev
);
if
(
it8172_scan_pcidev
(
dev
))
return
;
#endif
/* CONFIG_BLK_DEV_IT8172 */
#ifdef CONFIG_BLK_DEV_NFORCE
}{
extern
int
nforce_scan_pcidev
(
struct
pci_dev
*
dev
);
if
(
nforce_scan_pcidev
(
dev
))
return
;
#endif
/* CONFIG_BLK_DEV_NFORCE */
#ifdef CONFIG_BLK_DEV_NS87415
}{
extern
int
ns87415_scan_pcidev
(
struct
pci_dev
*
dev
);
if
(
ns87415_scan_pcidev
(
dev
))
return
;
#endif
/* CONFIG_BLK_DEV_NS87415 */
#ifdef CONFIG_BLK_DEV_OPTI621
}{
extern
int
opti621_scan_pcidev
(
struct
pci_dev
*
dev
);
if
(
opti621_scan_pcidev
(
dev
))
return
;
#endif
/* CONFIG_BLK_DEV_OPTI621 */
#ifdef CONFIG_BLK_DEV_PIIX
}{
extern
int
piix_scan_pcidev
(
struct
pci_dev
*
dev
);
if
(
piix_scan_pcidev
(
dev
))
return
;
#endif
/* CONFIG_BLK_DEV_PIIX */
#ifdef CONFIG_BLK_DEV_RZ1000
}{
extern
int
rz1000_scan_pcidev
(
struct
pci_dev
*
dev
);
if
(
rz1000_scan_pcidev
(
dev
))
return
;
#endif
/* CONFIG_BLK_DEV_RZ1000 */
#ifdef CONFIG_BLK_DEV_SVWKS
}{
extern
int
serverworks_scan_pcidev
(
struct
pci_dev
*
dev
);
if
(
serverworks_scan_pcidev
(
dev
))
return
;
#endif
/* CONFIG_BLK_DEV_SVWKS */
#ifdef CONFIG_BLK_DEV_SIS5513
}{
extern
int
sis5513_scan_pcidev
(
struct
pci_dev
*
dev
);
if
(
sis5513_scan_pcidev
(
dev
))
return
;
#endif
/* CONFIG_BLK_DEV_SIS5513 */
#ifdef CONFIG_BLK_DEV_SLC90E66
}{
extern
int
slc90e66_scan_pcidev
(
struct
pci_dev
*
dev
);
if
(
slc90e66_scan_pcidev
(
dev
))
return
;
#endif
/* CONFIG_BLK_DEV_SLC90E66 */
#ifdef CONFIG_BLK_DEV_VIA82CXXX
}{
extern
int
via82cxxx_scan_pcidev
(
struct
pci_dev
*
dev
);
if
(
via82cxxx_scan_pcidev
(
dev
))
return
;
#endif
/* CONFIG_BLK_DEV_VIA82CXXX */
#ifdef CONFIG_BLK_DEV_AEC62XX
}{
extern
int
aec62xx_scan_pcidev
(
struct
pci_dev
*
dev
);
if
(
aec62xx_scan_pcidev
(
dev
))
return
;
#endif
/* CONFIG_BLK_DEV_AEC62XX */
#ifdef CONFIG_BLK_DEV_CMD64X
}{
extern
int
cmd64x_scan_pcidev
(
struct
pci_dev
*
dev
);
if
(
cmd64x_scan_pcidev
(
dev
))
return
;
#endif
/* CONFIG_BLK_DEV_CMD64X */
#ifdef CONFIG_BLK_DEV_HPT34X
}{
extern
int
hpt34x_scan_pcidev
(
struct
pci_dev
*
dev
);
if
(
hpt34x_scan_pcidev
(
dev
))
return
;
#endif
/* CONFIG_BLK_DEV_HPT34X */
#ifdef CONFIG_BLK_DEV_HPT366
}{
extern
int
hpt366_scan_pcidev
(
struct
pci_dev
*
dev
);
if
(
hpt366_scan_pcidev
(
dev
))
return
;
#endif
/* CONFIG_BLK_DEV_HPT366 */
#ifdef CONFIG_BLK_DEV_PDC202XX_OLD
}{
extern
int
pdc202xx_scan_pcidev
(
struct
pci_dev
*
dev
);
if
(
pdc202xx_scan_pcidev
(
dev
))
return
;
#endif
/* CONFIG_BLK_DEV_PDC202XX_OLD */
#ifdef CONFIG_BLK_DEV_PDC202XX_NEW
}{
extern
int
pdcnew_scan_pcidev
(
struct
pci_dev
*
dev
);
if
(
pdcnew_scan_pcidev
(
dev
))
return
;
#endif
/* CONFIG_BLK_DEV_PDC202XX_NEW */
#ifdef CONFIG_BLK_DEV_PDC_ADMA
}{
extern
int
pdcadma_scan_pcidev
(
struct
pci_dev
*
dev
);
if
(
pdcadma_scan_pcidev
(
dev
))
return
;
#endif
/* CONFIG_BLK_DEV_PDC_ADMA */
#ifdef CONFIG_BLK_DEV_SIIMAGE
}{
extern
int
siimage_scan_pcidev
(
struct
pci_dev
*
dev
);
if
(
siimage_scan_pcidev
(
dev
))
return
;
#endif
/* CONFIG_BLK_DEV_SIIMAGE */
#ifdef CONFIG_BLK_DEV_SL82C105
}{
extern
int
sl82c105_scan_pcidev
(
struct
pci_dev
*
dev
);
if
(
sl82c105_scan_pcidev
(
dev
))
return
;
#endif
/* CONFIG_BLK_DEV_SL82C105 */
#ifdef CONFIG_BLK_DEV_TRM290
}{
extern
int
trm290_scan_pcidev
(
struct
pci_dev
*
dev
);
if
(
trm290_scan_pcidev
(
dev
))
return
;
#endif
/* CONFIG_BLK_DEV_TRM290 */
#ifdef CONFIG_BLK_DEV_GENERIC
}{
extern
int
generic_scan_pcidev
(
struct
pci_dev
*
dev
);
if
(
generic_scan_pcidev
(
dev
))
return
;
#endif
/* CONFIG_BLK_DEV_GENERIC */
}
}
EXPORT_SYMBOL_GPL
(
ide_setup_pci_devices
);
/*
* Module interfaces
- not yet functional.
* Module interfaces
*/
static
int
pre_init
=
1
;
/* Before first ordered IDE scan */
...
...
@@ -893,15 +753,15 @@ static LIST_HEAD(ide_pci_drivers);
* Returns are the same as for pci_register_driver
*/
int
ide_
register_pci
_driver
(
struct
pci_driver
*
driver
)
int
ide_
pci_register
_driver
(
struct
pci_driver
*
driver
)
{
if
(
!
pre_init
)
return
pci_
register_driver
(
driver
);
return
pci_
module_init
(
driver
);
list_add_tail
(
&
driver
->
node
,
&
ide_pci_drivers
);
return
0
;
}
EXPORT_SYMBOL
(
ide_register_pci
_driver
);
EXPORT_SYMBOL
_GPL
(
ide_pci_register
_driver
);
/**
* ide_unregister_pci_driver - unregister an IDE driver
...
...
@@ -911,7 +771,7 @@ EXPORT_SYMBOL(ide_register_pci_driver);
* as for pci_unregister_driver
*/
void
ide_
unregister_pci
_driver
(
struct
pci_driver
*
driver
)
void
ide_
pci_unregister
_driver
(
struct
pci_driver
*
driver
)
{
if
(
!
pre_init
)
pci_unregister_driver
(
driver
);
...
...
@@ -919,7 +779,40 @@ void ide_unregister_pci_driver(struct pci_driver *driver)
list_del
(
&
driver
->
node
);
}
EXPORT_SYMBOL
(
ide_unregister_pci_driver
);
EXPORT_SYMBOL_GPL
(
ide_pci_unregister_driver
);
/**
* ide_scan_pcidev - find an IDE driver for a device
* @dev: PCI device to check
*
* Look for an IDE driver to handle the device we are considering.
* This is only used during boot up to get the ordering correct. After
* boot up the pci layer takes over the job.
*/
static
int
__init
ide_scan_pcidev
(
struct
pci_dev
*
dev
)
{
struct
list_head
*
l
;
struct
pci_driver
*
d
;
list_for_each
(
l
,
&
ide_pci_drivers
)
{
d
=
list_entry
(
l
,
struct
pci_driver
,
node
);
if
(
d
->
id_table
)
{
const
struct
pci_device_id
*
id
=
pci_match_device
(
d
->
id_table
,
dev
);
if
(
id
!=
NULL
)
{
if
(
d
->
probe
(
dev
,
id
)
>=
0
)
{
dev
->
driver
=
d
;
return
1
;
}
}
}
}
return
0
;
}
/**
* ide_scan_pcibus - perform the initial IDE driver scan
...
...
@@ -933,6 +826,8 @@ EXPORT_SYMBOL(ide_unregister_pci_driver);
void
__init
ide_scan_pcibus
(
int
scan_direction
)
{
struct
pci_dev
*
dev
;
struct
pci_driver
*
d
;
struct
list_head
*
l
,
*
n
;
pre_init
=
0
;
if
(
!
scan_direction
)
{
...
...
@@ -944,5 +839,16 @@ void __init ide_scan_pcibus (int scan_direction)
ide_scan_pcidev
(
dev
);
}
}
/* FIXME: now add the drivers list to the real pci probe list */
/*
* Hand the drivers over to the PCI layer now we
* are post init.
*/
list_for_each_safe
(
l
,
n
,
&
ide_pci_drivers
)
{
list_del
(
l
);
d
=
list_entry
(
l
,
struct
pci_driver
,
node
);
pci_register_driver
(
d
);
}
}
fs/bio.c
View file @
c9c13c7b
...
...
@@ -33,7 +33,7 @@ static kmem_cache_t *bio_slab;
#define BIOVEC_NR_POOLS 6
struct
biovec_pool
{
int
size
;
int
nr_vecs
;
char
*
name
;
kmem_cache_t
*
slab
;
mempool_t
*
pool
;
...
...
@@ -88,7 +88,7 @@ static inline struct bio_vec *bvec_alloc(int gfp_mask, int nr, int *idx)
bvl
=
mempool_alloc
(
bp
->
pool
,
gfp_mask
);
if
(
bvl
)
memset
(
bvl
,
0
,
bp
->
size
);
memset
(
bvl
,
0
,
bp
->
nr_vecs
*
sizeof
(
struct
bio_vec
)
);
return
bvl
;
}
...
...
@@ -457,27 +457,55 @@ void bio_endio(struct bio *bio, int uptodate)
bio
->
bi_end_io
(
bio
);
}
static
void
__init
biovec_init_pool
(
void
)
static
void
__init
biovec_init_pool
s
(
void
)
{
int
i
,
size
;
int
i
,
size
,
megabytes
,
pool_entries
=
BIO_POOL_SIZE
;
int
scale
=
BIOVEC_NR_POOLS
;
megabytes
=
nr_free_pages
()
>>
(
20
-
PAGE_SHIFT
);
/*
* find out where to start scaling
*/
if
(
megabytes
<=
16
)
scale
=
0
;
else
if
(
megabytes
<=
32
)
scale
=
1
;
else
if
(
megabytes
<=
64
)
scale
=
2
;
else
if
(
megabytes
<=
96
)
scale
=
3
;
else
if
(
megabytes
<=
128
)
scale
=
4
;
/*
* scale number of entries
*/
pool_entries
=
megabytes
*
2
;
if
(
pool_entries
>
256
)
pool_entries
=
256
;
for
(
i
=
0
;
i
<
BIOVEC_NR_POOLS
;
i
++
)
{
struct
biovec_pool
*
bp
=
bvec_array
+
i
;
size
=
bp
->
size
*
sizeof
(
struct
bio_vec
);
printk
(
"biovec: init pool %d, %d entries, %d bytes
\n
"
,
i
,
bp
->
size
,
size
);
size
=
bp
->
nr_vecs
*
sizeof
(
struct
bio_vec
);
bp
->
slab
=
kmem_cache_create
(
bp
->
name
,
size
,
0
,
SLAB_HWCACHE_ALIGN
,
NULL
,
NULL
);
if
(
!
bp
->
slab
)
panic
(
"biovec: can't init slab cache
\n
"
);
bp
->
pool
=
mempool_create
(
BIO_POOL_SIZE
,
slab_pool_alloc
,
if
(
i
>=
scale
)
pool_entries
>>=
1
;
bp
->
pool
=
mempool_create
(
pool_entries
,
slab_pool_alloc
,
slab_pool_free
,
bp
->
slab
);
if
(
!
bp
->
pool
)
panic
(
"biovec: can't init mempool
\n
"
);
bp
->
size
=
size
;
printk
(
"biovec pool[%d]: %3d bvecs: %3d entries (%d bytes)
\n
"
,
i
,
bp
->
nr_vecs
,
pool_entries
,
size
);
}
}
...
...
@@ -493,7 +521,7 @@ static int __init init_bio(void)
printk
(
"BIO: pool of %d setup, %ZuKb (%Zd bytes/bio)
\n
"
,
BIO_POOL_SIZE
,
BIO_POOL_SIZE
*
sizeof
(
struct
bio
)
>>
10
,
sizeof
(
struct
bio
));
biovec_init_pool
();
biovec_init_pool
s
();
return
0
;
}
...
...
include/linux/elevator.h
View file @
c9c13c7b
...
...
@@ -4,8 +4,6 @@
typedef
int
(
elevator_merge_fn
)
(
request_queue_t
*
,
struct
request
**
,
struct
bio
*
);
typedef
void
(
elevator_merge_cleanup_fn
)
(
request_queue_t
*
,
struct
request
*
,
int
);
typedef
void
(
elevator_merge_req_fn
)
(
request_queue_t
*
,
struct
request
*
,
struct
request
*
);
typedef
struct
request
*
(
elevator_next_req_fn
)
(
request_queue_t
*
);
...
...
@@ -21,7 +19,6 @@ typedef void (elevator_exit_fn) (request_queue_t *, elevator_t *);
struct
elevator_s
{
elevator_merge_fn
*
elevator_merge_fn
;
elevator_merge_cleanup_fn
*
elevator_merge_cleanup_fn
;
elevator_merge_req_fn
*
elevator_merge_req_fn
;
elevator_next_req_fn
*
elevator_next_req_fn
;
...
...
@@ -42,7 +39,6 @@ struct elevator_s
*/
extern
void
__elv_add_request
(
request_queue_t
*
,
struct
request
*
,
struct
list_head
*
);
extern
void
elv_merge_cleanup
(
request_queue_t
*
,
struct
request
*
,
int
);
extern
int
elv_merge
(
request_queue_t
*
,
struct
request
**
,
struct
bio
*
);
extern
void
elv_merge_requests
(
request_queue_t
*
,
struct
request
*
,
struct
request
*
);
...
...
@@ -61,6 +57,7 @@ extern elevator_t elevator_noop;
*/
extern
elevator_t
elevator_linus
;
#define elv_linus_sequence(rq) ((long)(rq)->elevator_private)
#define ELV_LINUS_SEEK_COST 16
/*
* use the /proc/iosched interface, all the below is history ->
...
...
include/linux/ide.h
View file @
c9c13c7b
...
...
@@ -17,6 +17,7 @@
#include <linux/interrupt.h>
#include <linux/bitops.h>
#include <linux/bio.h>
#include <linux/pci.h>
#include <asm/byteorder.h>
#include <asm/system.h>
#include <asm/hdreg.h>
...
...
@@ -904,9 +905,7 @@ extern inline void ide_unmap_buffer(struct request *rq, char *buffer, unsigned l
((1<<ide_pci)|(1<<ide_cmd646)|(1<<ide_ali14xx))
#define IDE_CHIPSET_IS_PCI(c) ((IDE_CHIPSET_PCI_MASK >> (c)) & 1)
#ifdef CONFIG_BLK_DEV_IDEPCI
struct
ide_pci_device_s
;
#endif
/* CONFIG_BLK_DEV_IDEPCI */
typedef
struct
hwif_s
{
struct
hwif_s
*
next
;
/* for linked-list in ide_hwgroup_t */
...
...
@@ -937,10 +936,8 @@ typedef struct hwif_s {
hwif_chipset_t
chipset
;
/* sub-module for tuning.. */
#ifdef CONFIG_BLK_DEV_IDEPCI
struct
pci_dev
*
pci_dev
;
/* for pci chipsets */
struct
ide_pci_device_s
*
cds
;
/* chipset device struct */
#endif
/* CONFIG_BLK_DEV_IDEPCI */
#if 0
ide_hwif_ops_t *hwifops;
...
...
@@ -1108,12 +1105,10 @@ typedef struct hwgroup_s {
/* ptr to current hwif in linked-list */
ide_hwif_t
*
hwif
;
#ifdef CONFIG_BLK_DEV_IDEPCI
/* for pci chipsets */
struct
pci_dev
*
pci_dev
;
/* chipset device struct */
struct
ide_pci_device_s
*
cds
;
#endif
/* CONFIG_BLK_DEV_IDEPCI */
/* current request */
struct
request
*
rq
;
...
...
@@ -1637,23 +1632,16 @@ extern void ide_intr(int irq, void *dev_id, struct pt_regs *regs);
extern
void
do_ide_request
(
request_queue_t
*
);
extern
void
ide_init_subdrivers
(
void
);
#ifndef _IDE_C
extern
struct
block_device_operations
ide_fops
[];
extern
ide_proc_entry_t
generic_subdriver_entries
[];
#endif
extern
int
ata_attach
(
ide_drive_t
*
);
#ifdef _IDE_C
#ifdef CONFIG_BLK_DEV_IDE
extern
int
ideprobe_init
(
void
);
#ifdef CONFIG_BLK_DEV_IDEPCI
extern
void
ide_scan_pcibus
(
int
scan_direction
)
__init
;
#endif
/* CONFIG_BLK_DEV_IDEPCI */
#endif
/* CONFIG_BLK_DEV_IDE */
#endif
/* _IDE_C */
extern
int
ide_pci_register_driver
(
struct
pci_driver
*
driver
);
extern
void
ide_pci_unregister_driver
(
struct
pci_driver
*
driver
);
extern
void
default_hwif_iops
(
ide_hwif_t
*
);
extern
void
default_hwif_mmiops
(
ide_hwif_t
*
);
...
...
@@ -1665,8 +1653,6 @@ int ide_register_subdriver (ide_drive_t *drive, ide_driver_t *driver, int versio
int
ide_unregister_subdriver
(
ide_drive_t
*
drive
);
int
ide_replace_subdriver
(
ide_drive_t
*
drive
,
const
char
*
driver
);
#ifdef CONFIG_BLK_DEV_IDEPCI
#ifdef CONFIG_PROC_FS
typedef
struct
ide_pci_host_proc_s
{
char
*
name
;
...
...
@@ -1716,14 +1702,9 @@ typedef struct ide_pci_device_s {
struct
ide_pci_device_s
*
next
;
}
ide_pci_device_t
;
#ifdef LINUX_PCI_H
extern
void
ide_setup_pci_device
(
struct
pci_dev
*
,
ide_pci_device_t
*
);
extern
void
ide_setup_pci_devices
(
struct
pci_dev
*
,
struct
pci_dev
*
,
ide_pci_device_t
*
);
#endif
/* LINUX_PCI_H */
#endif
/* CONFIG_BLK_DEV_IDEPCI */
#ifdef CONFIG_BLK_DEV_IDEDMA
#define BAD_DMA_DRIVE 0
#define GOOD_DMA_DRIVE 1
extern
int
ide_build_dmatable
(
ide_drive_t
*
,
struct
request
*
);
...
...
@@ -1750,7 +1731,6 @@ extern int __ide_dma_verbose(ide_drive_t *);
extern
int
__ide_dma_retune
(
ide_drive_t
*
);
extern
int
__ide_dma_lostirq
(
ide_drive_t
*
);
extern
int
__ide_dma_timeout
(
ide_drive_t
*
);
#endif
/* CONFIG_BLK_DEV_IDEDMA */
extern
void
hwif_unregister
(
ide_hwif_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