Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
1e4d4052
Commit
1e4d4052
authored
Oct 08, 2002
by
Alan Cox
Committed by
Linus Torvalds
Oct 08, 2002
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[PATCH] update fdomain scsi
parent
12610bb6
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
125 additions
and
301 deletions
+125
-301
drivers/scsi/fdomain.c
drivers/scsi/fdomain.c
+97
-278
drivers/scsi/fdomain.h
drivers/scsi/fdomain.h
+28
-23
No files found.
drivers/scsi/fdomain.c
View file @
1e4d4052
...
...
@@ -418,7 +418,7 @@ static int Write_SCSI_Data_port;
static
int
FIFO_Size
=
0x2000
;
/* 8k FIFO for
pre-tmc18c30 chips */
extern
void
do_fdomain_16x0_intr
(
int
irq
,
void
*
dev_id
,
static
void
do_fdomain_16x0_intr
(
int
irq
,
void
*
dev_id
,
struct
pt_regs
*
regs
);
#ifdef MODULE
...
...
@@ -528,16 +528,16 @@ static void print_banner( struct Scsi_Host *shpnt )
if
(
!
shpnt
)
return
;
/* This won't ever happen */
if
(
bios_major
<
0
&&
bios_minor
<
0
)
{
printk
(
"scsi%d: <fdomain> No BIOS; using scsi id %d
\n
"
,
shpnt
->
host_no
,
shpnt
->
this_id
);
printk
(
KERN_INFO
"scsi%d: <fdomain> No BIOS; using scsi id %d
\n
"
,
shpnt
->
host_no
,
shpnt
->
this_id
);
}
else
{
printk
(
"scsi%d: <fdomain> BIOS version "
,
shpnt
->
host_no
);
printk
(
KERN_INFO
"scsi%d: <fdomain> BIOS version "
,
shpnt
->
host_no
);
if
(
bios_major
>=
0
)
printk
(
"%d."
,
bios_major
);
else
printk
(
"?."
);
if
(
bios_major
>=
0
)
printk
(
"%d."
,
bios_major
);
else
printk
(
"?."
);
if
(
bios_minor
>=
0
)
printk
(
"%d"
,
bios_minor
);
else
printk
(
"?."
);
if
(
bios_minor
>=
0
)
printk
(
"%d"
,
bios_minor
);
else
printk
(
"?."
);
printk
(
" at 0x%lx using scsi id %d
\n
"
,
bios_base
,
shpnt
->
this_id
);
...
...
@@ -547,31 +547,28 @@ static void print_banner( struct Scsi_Host *shpnt )
boards, we will have to modify banner
for additional PCI cards, but for now if
it's PCI it's a TMC-3260 - JTM */
printk
(
"scsi%d: <fdomain> %s chip at 0x%x irq "
,
printk
(
KERN_INFO
"scsi%d: <fdomain> %s chip at 0x%x irq "
,
shpnt
->
host_no
,
chip
==
tmc1800
?
"TMC-1800"
:
(
chip
==
tmc18c50
?
"TMC-18C50"
:
(
chip
==
tmc18c30
?
(
PCI_bus
?
"TMC-36C70 (PCI bus)"
:
"TMC-18C30"
)
:
"Unknown"
)),
port_base
);
chip
==
tmc1800
?
"TMC-1800"
:
(
chip
==
tmc18c50
?
"TMC-18C50"
:
(
chip
==
tmc18c30
?
(
PCI_bus
?
"TMC-36C70 (PCI bus)"
:
"TMC-18C30"
)
:
"Unknown"
)),
port_base
);
if
(
interrupt_level
)
printk
(
"%d"
,
interrupt_level
);
else
printk
(
"<none>"
);
if
(
interrupt_level
)
printk
(
"%d"
,
interrupt_level
);
else
printk
(
"<none>"
);
printk
(
"
\n
"
);
}
static
int
__init
fdomain_setup
(
char
*
str
)
static
int
__init
fdomain_setup
(
char
*
str
)
{
int
ints
[
4
];
(
void
)
get_options
(
str
,
ARRAY_SIZE
(
ints
),
ints
);
if
(
setup_called
++
||
ints
[
0
]
<
2
||
ints
[
0
]
>
3
)
{
printk
(
"scsi: <fdomain>"
" Usage: fdomain=<PORT_BASE>,<IRQ>[,<ADAPTER_ID>]
\n
"
);
printk
(
"scsi: <fdomain> Bad LILO/INSMOD parameters?
\n
"
);
printk
(
KERN_INFO
"scsi: <fdomain> Usage: fdomain=<PORT_BASE>,<IRQ>[,<ADAPTER_ID>]
\n
"
);
printk
(
KERN_ERR
"scsi: <fdomain> Bad LILO/INSMOD parameters?
\n
"
);
return
0
;
}
...
...
@@ -587,9 +584,9 @@ static int __init fdomain_setup( char *str )
__setup
(
"fdomain="
,
fdomain_setup
);
static
void
do_pause
(
unsigned
amount
)
/* Pause for amount*10 milliseconds */
static
void
do_pause
(
unsigned
amount
)
/* Pause for amount*10 milliseconds */
{
mdelay
(
10
*
amount
);
mdelay
(
10
*
amount
);
}
inline
static
void
fdomain_make_bus_idle
(
void
)
...
...
@@ -672,22 +669,20 @@ static int fdomain_test_loopback( void )
static
int
fdomain_get_irq
(
int
base
)
{
int
options
=
inb
(
base
+
Configuration1
);
int
options
=
inb
(
base
+
Configuration1
);
#if DEBUG_DETECT
printk
(
"scsi: <fdomain> Options = %x
\n
"
,
options
);
printk
(
"scsi: <fdomain> Options = %x
\n
"
,
options
);
#endif
/* Check for board with lowest bios_base --
this isn't valid for the 18c30 or for
boards on the PCI bus, so just assume we
have the right board. */
if
(
chip
!=
tmc18c30
&&
!
PCI_bus
&&
addresses
[
(
options
&
0xc0
)
>>
6
]
!=
bios_base
)
return
0
;
/* Check for board with lowest bios_base --
this isn't valid for the 18c30 or for
boards on the PCI bus, so just assume we
have the right board. */
return
ints
[
(
options
&
0x0e
)
>>
1
];
if
(
chip
!=
tmc18c30
&&
!
PCI_bus
&&
addresses
[(
options
&
0xc0
)
>>
6
]
!=
bios_base
)
return
0
;
return
ints
[(
options
&
0x0e
)
>>
1
];
}
static
int
fdomain_isa_detect
(
int
*
irq
,
int
*
iobase
)
...
...
@@ -700,7 +695,6 @@ static int fdomain_isa_detect( int *irq, int *iobase )
printk
(
"scsi: <fdomain> fdomain_isa_detect:"
);
#endif
for
(
i
=
0
;
!
bios_base
&&
i
<
ADDRESS_COUNT
;
i
++
)
{
#if DEBUG_DETECT
printk
(
" %lx(%lx),"
,
addresses
[
i
],
bios_base
);
...
...
@@ -811,8 +805,6 @@ static int fdomain_pci_bios_detect( int *irq, int *iobase, struct pci_dev **ret_
unsigned
long
pci_base
;
/* PCI I/O base address */
struct
pci_dev
*
pdev
=
NULL
;
if
(
!
pci_present
())
return
0
;
#if DEBUG_DETECT
/* Tell how to print a list of the known PCI devices from bios32 and
list vendor and device IDs being used if in debug mode. */
...
...
@@ -824,10 +816,8 @@ static int fdomain_pci_bios_detect( int *irq, int *iobase, struct pci_dev **ret_
PCI_DEVICE_ID_FD_36C70
);
#endif
if
((
pdev
=
pci_find_device
(
PCI_VENDOR_ID_FD
,
PCI_DEVICE_ID_FD_36C70
,
pdev
))
==
NULL
)
return
0
;
if
((
pdev
=
pci_find_device
(
PCI_VENDOR_ID_FD
,
PCI_DEVICE_ID_FD_36C70
,
pdev
))
==
NULL
)
return
0
;
if
(
pci_enable_device
(
pdev
))
return
0
;
#if DEBUG_DETECT
...
...
@@ -857,8 +847,7 @@ static int fdomain_pci_bios_detect( int *irq, int *iobase, struct pci_dev **ret_
#endif
if
(
!
fdomain_is_valid_port
(
*
iobase
))
{
printk
(
"scsi: <fdomain>"
" PCI card detected, but driver not loaded (invalid port)
\n
"
);
printk
(
KERN_ERR
"scsi: <fdomain> PCI card detected, but driver not loaded (invalid port)
\n
"
);
return
0
;
}
...
...
@@ -872,7 +861,7 @@ static int fdomain_pci_bios_detect( int *irq, int *iobase, struct pci_dev **ret_
}
#endif
int
fdomain_16x0_detect
(
Scsi_Host_Template
*
tpnt
)
static
int
fdomain_16x0_detect
(
Scsi_Host_Template
*
tpnt
)
{
int
retcode
;
struct
Scsi_Host
*
shpnt
;
...
...
@@ -939,13 +928,12 @@ int fdomain_16x0_detect( Scsi_Host_Template *tpnt )
Write_FIFO_port
=
port_base
+
Write_FIFO
;
Write_SCSI_Data_port
=
port_base
+
Write_SCSI_Data
;
fdomain_16x0_
reset
(
NULL
,
0
);
fdomain_16x0_
bus_reset
(
NULL
);
if
(
fdomain_test_loopback
())
{
printk
(
"scsi: <fdomain> Detection failed"
" (loopback test failed at port base 0x%x)
\n
"
,
port_base
);
printk
(
KERN_ERR
"scsi: <fdomain> Detection failed (loopback test failed at port base 0x%x)
\n
"
,
port_base
);
if
(
setup_called
)
{
printk
(
"scsi: <fdomain> Bad LILO/INSMOD parameters?
\n
"
);
printk
(
KERN_ERR
"scsi: <fdomain> Bad LILO/INSMOD parameters?
\n
"
);
}
return
0
;
}
...
...
@@ -963,8 +951,8 @@ int fdomain_16x0_detect( Scsi_Host_Template *tpnt )
}
}
/* Print out a banner here in case we can't
get resources. */
/* Print out a banner here in case we can't
get resources. */
shpnt
=
scsi_register
(
tpnt
,
0
);
if
(
shpnt
==
NULL
)
...
...
@@ -975,10 +963,9 @@ int fdomain_16x0_detect( Scsi_Host_Template *tpnt )
shpnt
->
n_io_port
=
0x10
;
print_banner
(
shpnt
);
/* Log IRQ with kernel */
/* Log IRQ with kernel */
if
(
!
interrupt_level
)
{
printk
(
"scsi: <fdomain>"
" Card Detected, but driver not loaded (no IRQ)
\n
"
);
printk
(
KERN_ERR
"scsi: <fdomain> Card Detected, but driver not loaded (no IRQ)
\n
"
);
return
0
;
}
else
{
/* Register the IRQ with the kernel */
...
...
@@ -988,25 +975,23 @@ int fdomain_16x0_detect( Scsi_Host_Template *tpnt )
if
(
retcode
<
0
)
{
if
(
retcode
==
-
EINVAL
)
{
printk
(
"scsi: <fdomain> IRQ %d is bad!
\n
"
,
interrupt_level
);
printk
(
" This shouldn't happen!
\n
"
);
printk
(
" Send mail to faith@acm.org
\n
"
);
printk
(
KERN_ERR
"scsi: <fdomain> IRQ %d is bad!
\n
"
,
interrupt_level
);
printk
(
KERN_ERR
" This shouldn't happen!
\n
"
);
printk
(
KERN_ERR
" Send mail to faith@acm.org
\n
"
);
}
else
if
(
retcode
==
-
EBUSY
)
{
printk
(
"scsi: <fdomain> IRQ %d is already in use!
\n
"
,
interrupt_level
);
printk
(
" Please use another IRQ!
\n
"
);
printk
(
KERN_ERR
"scsi: <fdomain> IRQ %d is already in use!
\n
"
,
interrupt_level
);
printk
(
KERN_ERR
" Please use another IRQ!
\n
"
);
}
else
{
printk
(
"scsi: <fdomain> Error getting IRQ %d
\n
"
,
interrupt_level
);
printk
(
" This shouldn't happen!
\n
"
);
printk
(
" Send mail to faith@acm.org
\n
"
);
printk
(
KERN_ERR
"scsi: <fdomain> Error getting IRQ %d
\n
"
,
interrupt_level
);
printk
(
KERN_ERR
" This shouldn't happen!
\n
"
);
printk
(
KERN_ERR
" Send mail to faith@acm.org
\n
"
);
}
printk
(
"scsi: <fdomain> Detected, but driver not loaded (IRQ)
\n
"
);
printk
(
KERN_ERR
"scsi: <fdomain> Detected, but driver not loaded (IRQ)
\n
"
);
return
0
;
}
}
/* Log I/O ports with kernel */
/* Log I/O ports with kernel */
request_region
(
port_base
,
0x10
,
"fdomain"
);
#if DO_DETECT
...
...
@@ -1065,7 +1050,7 @@ int fdomain_16x0_detect( Scsi_Host_Template *tpnt )
return
1
;
/* Maximum of one adapter will be detected. */
}
const
char
*
fdomain_16x0_info
(
struct
Scsi_Host
*
ignore
)
static
const
char
*
fdomain_16x0_info
(
struct
Scsi_Host
*
ignore
)
{
static
char
buffer
[
128
];
char
*
pt
;
...
...
@@ -1097,7 +1082,7 @@ const char *fdomain_16x0_info( struct Scsi_Host *ignore )
* length: If inout==FALSE max number of bytes to be written into the buffer
* else number of bytes in the buffer
*/
int
fdomain_16x0_proc_info
(
char
*
buffer
,
char
**
start
,
off_t
offset
,
static
int
fdomain_16x0_proc_info
(
char
*
buffer
,
char
**
start
,
off_t
offset
,
int
length
,
int
hostno
,
int
inout
)
{
const
char
*
info
=
fdomain_16x0_info
(
NULL
);
...
...
@@ -1105,7 +1090,7 @@ int fdomain_16x0_proc_info( char *buffer, char **start, off_t offset,
int
pos
;
int
begin
;
if
(
inout
)
return
(
-
E
NOSYS
);
if
(
inout
)
return
(
-
E
INVAL
);
begin
=
0
;
strcpy
(
buffer
,
info
);
...
...
@@ -1200,7 +1185,7 @@ static int fdomain_select( int target )
return
1
;
}
void
my_done
(
int
error
)
static
void
my_done
(
int
error
)
{
if
(
in_command
)
{
in_command
=
0
;
...
...
@@ -1218,7 +1203,7 @@ void my_done( int error )
#endif
}
void
do_fdomain_16x0_intr
(
int
irq
,
void
*
dev_id
,
struct
pt_regs
*
regs
)
static
void
do_fdomain_16x0_intr
(
int
irq
,
void
*
dev_id
,
struct
pt_regs
*
regs
)
{
unsigned
long
flags
;
int
status
;
...
...
@@ -1376,167 +1361,18 @@ void do_fdomain_16x0_intr( int irq, void *dev_id, struct pt_regs * regs )
}
}
if
(
chip
==
tmc1800
&&
!
current_SC
->
SCp
.
have_data_in
&&
(
current_SC
->
SCp
.
sent_command
>=
current_SC
->
cmd_len
))
{
/* We have to get the FIFO direction
correct, so I've made a table based
on the SCSI Standard of which commands
appear to require a DATA OUT phase.
*/
/*
p. 94: Command for all device types
CHANGE DEFINITION 40 DATA OUT
COMPARE 39 DATA OUT
COPY 18 DATA OUT
COPY AND VERIFY 3a DATA OUT
INQUIRY 12
LOG SELECT 4c DATA OUT
LOG SENSE 4d
MODE SELECT (6) 15 DATA OUT
MODE SELECT (10) 55 DATA OUT
MODE SENSE (6) 1a
MODE SENSE (10) 5a
READ BUFFER 3c
RECEIVE DIAGNOSTIC RESULTS 1c
REQUEST SENSE 03
SEND DIAGNOSTIC 1d DATA OUT
TEST UNIT READY 00
WRITE BUFFER 3b DATA OUT
p.178: Commands for direct-access devices (not listed on p. 94)
FORMAT UNIT 04 DATA OUT
LOCK-UNLOCK CACHE 36
PRE-FETCH 34
PREVENT-ALLOW MEDIUM REMOVAL 1e
READ (6)/RECEIVE 08
READ (10) 3c
READ CAPACITY 25
READ DEFECT DATA (10) 37
READ LONG 3e
REASSIGN BLOCKS 07 DATA OUT
RELEASE 17
RESERVE 16 DATA OUT
REZERO UNIT/REWIND 01
SEARCH DATA EQUAL (10) 31 DATA OUT
SEARCH DATA HIGH (10) 30 DATA OUT
SEARCH DATA LOW (10) 32 DATA OUT
SEEK (6) 0b
SEEK (10) 2b
SET LIMITS (10) 33
START STOP UNIT 1b
SYNCHRONIZE CACHE 35
VERIFY (10) 2f
WRITE (6)/PRINT/SEND 0a DATA OUT
WRITE (10)/SEND 2a DATA OUT
WRITE AND VERIFY (10) 2e DATA OUT
WRITE LONG 3f DATA OUT
WRITE SAME 41 DATA OUT ?
p. 261: Commands for sequential-access devices (not previously listed)
ERASE 19
LOAD UNLOAD 1b
LOCATE 2b
READ BLOCK LIMITS 05
READ POSITION 34
READ REVERSE 0f
RECOVER BUFFERED DATA 14
SPACE 11
WRITE FILEMARKS 10 ?
p. 298: Commands for printer devices (not previously listed)
****** NOT SUPPORTED BY THIS DRIVER, since 0b is SEEK (6) *****
SLEW AND PRINT 0b DATA OUT -- same as seek
STOP PRINT 1b
SYNCHRONIZE BUFFER 10
p. 315: Commands for processor devices (not previously listed)
p. 321: Commands for write-once devices (not previously listed)
MEDIUM SCAN 38
READ (12) a8
SEARCH DATA EQUAL (12) b1 DATA OUT
SEARCH DATA HIGH (12) b0 DATA OUT
SEARCH DATA LOW (12) b2 DATA OUT
SET LIMITS (12) b3
VERIFY (12) af
WRITE (12) aa DATA OUT
WRITE AND VERIFY (12) ae DATA OUT
p. 332: Commands for CD-ROM devices (not previously listed)
PAUSE/RESUME 4b
PLAY AUDIO (10) 45
PLAY AUDIO (12) a5
PLAY AUDIO MSF 47
PLAY TRACK RELATIVE (10) 49
PLAY TRACK RELATIVE (12) a9
READ HEADER 44
READ SUB-CHANNEL 42
READ TOC 43
p. 370: Commands for scanner devices (not previously listed)
GET DATA BUFFER STATUS 34
GET WINDOW 25
OBJECT POSITION 31
SCAN 1b
SET WINDOW 24 DATA OUT
p. 391: Commands for optical memory devices (not listed)
ERASE (10) 2c
ERASE (12) ac
MEDIUM SCAN 38 DATA OUT
READ DEFECT DATA (12) b7
READ GENERATION 29
READ UPDATED BLOCK 2d
UPDATE BLOCK 3d DATA OUT
p. 419: Commands for medium changer devices (not listed)
EXCHANGE MEDIUM 46
INITIALIZE ELEMENT STATUS 07
MOVE MEDIUM a5
POSITION TO ELEMENT 2b
READ ELEMENT STATUS b8
REQUEST VOL. ELEMENT ADDRESS b5
SEND VOLUME TAG b6 DATA OUT
p. 454: Commands for communications devices (not listed previously)
GET MESSAGE (6) 08
GET MESSAGE (10) 28
GET MESSAGE (12) a8
*/
switch
(
current_SC
->
cmnd
[
0
])
{
case
CHANGE_DEFINITION
:
case
COMPARE
:
case
COPY
:
case
COPY_VERIFY
:
case
LOG_SELECT
:
case
MODE_SELECT
:
case
MODE_SELECT_10
:
case
SEND_DIAGNOSTIC
:
case
WRITE_BUFFER
:
case
FORMAT_UNIT
:
case
REASSIGN_BLOCKS
:
case
RESERVE
:
case
SEARCH_EQUAL
:
case
SEARCH_HIGH
:
case
SEARCH_LOW
:
case
WRITE_6
:
case
WRITE_10
:
case
WRITE_VERIFY
:
case
0x3f
:
case
0x41
:
case
0xb1
:
case
0xb0
:
case
0xb2
:
case
0xaa
:
case
0xae
:
case
0x24
:
case
0x38
:
case
0x3d
:
case
0xb6
:
case
0xea
:
/* alternate number for WRITE LONG */
if
(
chip
==
tmc1800
&&
!
current_SC
->
SCp
.
have_data_in
&&
(
current_SC
->
SCp
.
sent_command
>=
current_SC
->
cmd_len
))
{
if
(
scsi_to_pci_dma_dir
(
current_SC
->
sc_data_direction
)
==
PCI_DMA_TODEVICE
)
{
current_SC
->
SCp
.
have_data_in
=
-
1
;
outb
(
0xd0
|
PARITY_MASK
,
TMC_Cntl_port
);
break
;
case
0x00
:
default:
}
else
{
current_SC
->
SCp
.
have_data_in
=
1
;
outb
(
0x90
|
PARITY_MASK
,
TMC_Cntl_port
);
break
;
}
}
...
...
@@ -1565,7 +1401,7 @@ void do_fdomain_16x0_intr( int irq, void *dev_id, struct pt_regs * regs )
if
(
current_SC
->
SCp
.
buffers_residual
)
{
--
current_SC
->
SCp
.
buffers_residual
;
++
current_SC
->
SCp
.
buffer
;
current_SC
->
SCp
.
ptr
=
current_SC
->
SCp
.
buffer
->
address
;
current_SC
->
SCp
.
ptr
=
page_address
(
current_SC
->
SCp
.
buffer
->
page
)
+
current_SC
->
SCp
.
buffer
->
offset
;
current_SC
->
SCp
.
this_residual
=
current_SC
->
SCp
.
buffer
->
length
;
}
else
break
;
...
...
@@ -1598,7 +1434,7 @@ void do_fdomain_16x0_intr( int irq, void *dev_id, struct pt_regs * regs )
&&
current_SC
->
SCp
.
buffers_residual
)
{
--
current_SC
->
SCp
.
buffers_residual
;
++
current_SC
->
SCp
.
buffer
;
current_SC
->
SCp
.
ptr
=
current_SC
->
SCp
.
buffer
->
address
;
current_SC
->
SCp
.
ptr
=
page_address
(
current_SC
->
SCp
.
buffer
->
page
)
+
current_SC
->
SCp
.
buffer
->
offset
;
current_SC
->
SCp
.
this_residual
=
current_SC
->
SCp
.
buffer
->
length
;
}
}
...
...
@@ -1661,7 +1497,7 @@ void do_fdomain_16x0_intr( int irq, void *dev_id, struct pt_regs * regs )
return
;
}
int
fdomain_16x0_queue
(
Scsi_Cmnd
*
SCpnt
,
void
(
*
done
)(
Scsi_Cmnd
*
))
static
int
fdomain_16x0_queue
(
Scsi_Cmnd
*
SCpnt
,
void
(
*
done
)(
Scsi_Cmnd
*
))
{
if
(
in_command
)
{
panic
(
"scsi: <fdomain> fdomain_16x0_queue() NOT REENTRANT!
\n
"
);
...
...
@@ -1684,7 +1520,7 @@ int fdomain_16x0_queue( Scsi_Cmnd * SCpnt, void (*done)(Scsi_Cmnd *))
if
(
current_SC
->
use_sg
)
{
current_SC
->
SCp
.
buffer
=
(
struct
scatterlist
*
)
current_SC
->
request_buffer
;
current_SC
->
SCp
.
ptr
=
current_SC
->
SCp
.
buffer
->
address
;
current_SC
->
SCp
.
ptr
=
page_address
(
current_SC
->
SCp
.
buffer
->
page
)
+
current_SC
->
SCp
.
buffer
->
offset
;
current_SC
->
SCp
.
this_residual
=
current_SC
->
SCp
.
buffer
->
length
;
current_SC
->
SCp
.
buffers_residual
=
current_SC
->
use_sg
-
1
;
}
else
{
...
...
@@ -1719,45 +1555,45 @@ int fdomain_16x0_queue( Scsi_Cmnd * SCpnt, void (*done)(Scsi_Cmnd *))
static
volatile
int
internal_done_flag
=
0
;
static
volatile
int
internal_done_errcode
=
0
;
static
void
internal_done
(
Scsi_Cmnd
*
SCpnt
)
static
void
internal_done
(
Scsi_Cmnd
*
SCpnt
)
{
internal_done_errcode
=
SCpnt
->
result
;
++
internal_done_flag
;
}
int
fdomain_16x0_command
(
Scsi_Cmnd
*
SCpnt
)
static
int
fdomain_16x0_command
(
Scsi_Cmnd
*
SCpnt
)
{
fdomain_16x0_queue
(
SCpnt
,
internal_done
);
fdomain_16x0_queue
(
SCpnt
,
internal_done
);
while
(
!
internal_done_flag
)
;
cpu_relax
()
;
internal_done_flag
=
0
;
return
internal_done_errcode
;
}
/* End of code derived from Tommy Thorn's work. */
void
print_info
(
Scsi_Cmnd
*
SCpnt
)
static
void
print_info
(
Scsi_Cmnd
*
SCpnt
)
{
unsigned
int
imr
;
unsigned
int
irr
;
unsigned
int
isr
;
if
(
!
SCpnt
||
!
SCpnt
->
host
)
{
printk
(
"scsi: <fdomain> Cannot provide detailed information
\n
"
);
printk
(
KERN_WARNING
"scsi: <fdomain> Cannot provide detailed information
\n
"
);
return
;
}
printk
(
"%s
\n
"
,
fdomain_16x0_info
(
SCpnt
->
host
)
);
print_banner
(
SCpnt
->
host
);
printk
(
KERN_INFO
"%s
\n
"
,
fdomain_16x0_info
(
SCpnt
->
host
)
);
print_banner
(
SCpnt
->
host
);
switch
(
SCpnt
->
SCp
.
phase
)
{
case
in_arbitration
:
printk
(
"arbitration "
);
break
;
case
in_selection
:
printk
(
"selection "
);
break
;
case
in_other
:
printk
(
"other "
);
break
;
default:
printk
(
"unknown "
);
break
;
case
in_arbitration
:
printk
(
"arbitration"
);
break
;
case
in_selection
:
printk
(
"selection"
);
break
;
case
in_other
:
printk
(
"other"
);
break
;
default:
printk
(
"unknown"
);
break
;
}
printk
(
"(%d), target = %d cmnd = 0x%02x pieces = %d size = %u
\n
"
,
printk
(
"
(%d), target = %d cmnd = 0x%02x pieces = %d size = %u
\n
"
,
SCpnt
->
SCp
.
phase
,
SCpnt
->
target
,
*
(
unsigned
char
*
)
SCpnt
->
cmnd
,
...
...
@@ -1807,21 +1643,17 @@ void print_info( Scsi_Cmnd *SCpnt )
inb
(
port_base
+
Configuration2
)
);
}
int
fdomain_16x0_abort
(
Scsi_Cmnd
*
SCpnt
)
static
int
fdomain_16x0_abort
(
Scsi_Cmnd
*
SCpnt
)
{
unsigned
long
flags
;
#if EVERY_ACCESS || ERRORS_ONLY || DEBUG_ABORT
printk
(
"scsi: <fdomain> abort "
);
#endif
save_flags
(
flags
);
cli
();
if
(
!
in_command
)
{
#if EVERY_ACCESS || ERRORS_ONLY
printk
(
" (not in command)
\n
"
);
#endif
restore_flags
(
flags
);
return
SCSI_ABORT_NOT_RUNNING
;
return
FAILED
;
}
else
printk
(
"
\n
"
);
#if DEBUG_ABORT
...
...
@@ -1829,52 +1661,39 @@ int fdomain_16x0_abort( Scsi_Cmnd *SCpnt)
#endif
fdomain_make_bus_idle
();
current_SC
->
SCp
.
phase
|=
aborted
;
current_SC
->
result
=
DID_ABORT
<<
16
;
restore_flags
(
flags
);
/* Aborts are not done well. . . */
my_done
(
DID_ABORT
<<
16
);
return
SCSI_ABORT_SUCCESS
;
my_done
(
DID_ABORT
<<
16
);
return
SUCCESS
;
}
int
fdomain_16x0_reset
(
Scsi_Cmnd
*
SCpnt
,
unsigned
int
ignored
)
static
int
fdomain_16x0_bus_reset
(
Scsi_Cmnd
*
SCpnt
)
{
#if DEBUG_RESET
static
int
called_once
=
0
;
#endif
#if ERRORS_ONLY
if
(
SCpnt
)
printk
(
"scsi: <fdomain> SCSI Bus Reset
\n
"
);
#endif
#if DEBUG_RESET
if
(
called_once
)
print_info
(
current_SC
);
called_once
=
1
;
#endif
outb
(
1
,
SCSI_Cntl_port
);
do_pause
(
2
);
outb
(
0
,
SCSI_Cntl_port
);
do_pause
(
115
);
outb
(
0
,
SCSI_Mode_Cntl_port
);
outb
(
PARITY_MASK
,
TMC_Cntl_port
);
return
SUCCESS
;
}
/* Unless this is the very first call (i.e., SCPnt == NULL), everything
is probably hosed at this point. We will, however, try to keep
things going by informing the high-level code that we need help. */
static
int
fdomain_16x0_host_reset
(
Scsi_Cmnd
*
SCpnt
)
{
return
FAILED
;
}
return
SCSI_RESET_WAKEUP
;
static
int
fdomain_16x0_device_reset
(
Scsi_Cmnd
*
SCpnt
)
{
return
FAILED
;
}
#include "sd.h"
#include <scsi/scsi_ioctl.h>
int
fdomain_16x0_biosparam
(
Scsi_Disk
*
disk
,
struct
block_device
*
bdev
,
int
*
info_array
)
static
int
fdomain_16x0_biosparam
(
Scsi_Disk
*
disk
,
struct
block_device
*
bdev
,
int
*
info_array
)
{
int
drive
;
unsigned
char
buf
[
512
+
sizeof
(
Scsi_Ioctl_Command
)];
...
...
@@ -2036,7 +1855,7 @@ int fdomain_16x0_biosparam( Scsi_Disk *disk, struct block_device *bdev, int *inf
return
0
;
}
int
fdomain_16x0_release
(
struct
Scsi_Host
*
shpnt
)
static
int
fdomain_16x0_release
(
struct
Scsi_Host
*
shpnt
)
{
if
(
shpnt
->
irq
)
free_irq
(
shpnt
->
irq
,
shpnt
);
...
...
drivers/scsi/fdomain.h
View file @
1e4d4052
...
...
@@ -25,29 +25,34 @@
#ifndef _FDOMAIN_H
#define _FDOMAIN_H
int
fdomain_16x0_detect
(
Scsi_Host_Template
*
);
int
fdomain_16x0_command
(
Scsi_Cmnd
*
);
int
fdomain_16x0_abort
(
Scsi_Cmnd
*
);
const
char
*
fdomain_16x0_info
(
struct
Scsi_Host
*
);
int
fdomain_16x0_reset
(
Scsi_Cmnd
*
,
unsigned
int
);
int
fdomain_16x0_queue
(
Scsi_Cmnd
*
,
void
(
*
done
)(
Scsi_Cmnd
*
)
);
int
fdomain_16x0_biosparam
(
Disk
*
,
struct
block_device
*
,
int
*
);
int
fdomain_16x0_proc_info
(
char
*
buffer
,
char
**
start
,
off_t
offset
,
static
int
fdomain_16x0_detect
(
Scsi_Host_Template
*
);
static
int
fdomain_16x0_command
(
Scsi_Cmnd
*
);
static
int
fdomain_16x0_abort
(
Scsi_Cmnd
*
);
static
const
char
*
fdomain_16x0_info
(
struct
Scsi_Host
*
);
static
int
fdomain_16x0_bus_reset
(
Scsi_Cmnd
*
);
static
int
fdomain_16x0_host_reset
(
Scsi_Cmnd
*
);
static
int
fdomain_16x0_device_reset
(
Scsi_Cmnd
*
);
static
int
fdomain_16x0_queue
(
Scsi_Cmnd
*
,
void
(
*
done
)(
Scsi_Cmnd
*
));
static
int
fdomain_16x0_biosparam
(
Disk
*
,
struct
block_device
*
,
int
*
);
static
int
fdomain_16x0_proc_info
(
char
*
buffer
,
char
**
start
,
off_t
offset
,
int
length
,
int
hostno
,
int
inout
);
int
fdomain_16x0_release
(
struct
Scsi_Host
*
shpnt
);
static
int
fdomain_16x0_release
(
struct
Scsi_Host
*
shpnt
);
#define FDOMAIN_16X0 { proc_info: fdomain_16x0_proc_info, \
detect: fdomain_16x0_detect, \
info: fdomain_16x0_info, \
command: fdomain_16x0_command, \
queuecommand: fdomain_16x0_queue, \
abort: fdomain_16x0_abort, \
reset: fdomain_16x0_reset, \
bios_param: fdomain_16x0_biosparam, \
release: fdomain_16x0_release, \
can_queue: 1, \
this_id: 6, \
sg_tablesize: 64, \
cmd_per_lun: 1, \
use_clustering: DISABLE_CLUSTERING }
#define FDOMAIN_16X0 { proc_info: fdomain_16x0_proc_info, \
detect: fdomain_16x0_detect, \
info: fdomain_16x0_info, \
command: fdomain_16x0_command, \
queuecommand: fdomain_16x0_queue, \
eh_abort_handler: fdomain_16x0_abort, \
eh_bus_reset_handler: fdomain_16x0_bus_reset, \
eh_device_reset_handler: fdomain_16x0_device_reset, \
eh_host_reset_handler: fdomain_16x0_host_reset, \
bios_param: fdomain_16x0_biosparam, \
release: fdomain_16x0_release, \
can_queue: 1, \
this_id: 6, \
sg_tablesize: 64, \
cmd_per_lun: 1, \
use_clustering: DISABLE_CLUSTERING \
}
#endif
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