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
451a0b69
Commit
451a0b69
authored
Feb 13, 2003
by
Alan Cox
Committed by
David Woodhouse
Feb 13, 2003
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[PATCH] Fix ibm MCA adapter for new scsi, use mca_legacy for now
parent
ff0fd342
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
25 additions
and
24 deletions
+25
-24
drivers/scsi/ibmmca.c
drivers/scsi/ibmmca.c
+25
-24
No files found.
drivers/scsi/ibmmca.c
View file @
451a0b69
...
@@ -39,6 +39,7 @@
...
@@ -39,6 +39,7 @@
#include <linux/string.h>
#include <linux/string.h>
#include <linux/spinlock.h>
#include <linux/spinlock.h>
#include <linux/init.h>
#include <linux/init.h>
#include <linux/mca-legacy.h>
#include <asm/system.h>
#include <asm/system.h>
#include <asm/io.h>
#include <asm/io.h>
...
@@ -668,8 +669,8 @@ static void interrupt_handler(int irq, void *dev_id, struct pt_regs *regs)
...
@@ -668,8 +669,8 @@ static void interrupt_handler(int irq, void *dev_id, struct pt_regs *regs)
ld
(
ihost_index
)[
ldn
].
cmd
=
NULL
;
ld
(
ihost_index
)[
ldn
].
cmd
=
NULL
;
#ifdef IM_DEBUG_TIMEOUT
#ifdef IM_DEBUG_TIMEOUT
if
(
cmd
)
{
if
(
cmd
)
{
if
((
cmd
->
target
==
TIMEOUT_PUN
)
&&
(
cmd
->
lun
==
TIMEOUT_LUN
))
{
if
((
cmd
->
target
==
TIMEOUT_PUN
)
&&
(
cmd
->
device
->
lun
==
TIMEOUT_LUN
))
{
printk
(
"IBM MCA SCSI: Ignoring interrupt from pun=%x, lun=%x.
\n
"
,
cmd
->
target
,
cmd
->
lun
);
printk
(
"IBM MCA SCSI: Ignoring interrupt from pun=%x, lun=%x.
\n
"
,
cmd
->
target
,
cmd
->
device
->
lun
);
return
;
return
;
}
}
}
}
...
@@ -1824,7 +1825,7 @@ static int ibmmca_queuecommand(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *))
...
@@ -1824,7 +1825,7 @@ static int ibmmca_queuecommand(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *))
int
i
;
int
i
;
struct
scatterlist
*
sl
;
struct
scatterlist
*
sl
;
shpnt
=
cmd
->
host
;
shpnt
=
cmd
->
device
->
host
;
/* search for the right hostadapter */
/* search for the right hostadapter */
for
(
host_index
=
0
;
hosts
[
host_index
]
&&
hosts
[
host_index
]
->
host_no
!=
shpnt
->
host_no
;
host_index
++
);
for
(
host_index
=
0
;
hosts
[
host_index
]
&&
hosts
[
host_index
]
->
host_no
!=
shpnt
->
host_no
;
host_index
++
);
...
@@ -1836,16 +1837,16 @@ static int ibmmca_queuecommand(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *))
...
@@ -1836,16 +1837,16 @@ static int ibmmca_queuecommand(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *))
}
}
max_pun
=
subsystem_maxid
(
host_index
);
max_pun
=
subsystem_maxid
(
host_index
);
if
(
ibm_ansi_order
)
{
if
(
ibm_ansi_order
)
{
target
=
max_pun
-
1
-
cmd
->
target
;
target
=
max_pun
-
1
-
cmd
->
device
->
id
;
if
((
target
<=
subsystem_pun
(
host_index
))
&&
(
cmd
->
target
<=
subsystem_pun
(
host_index
)))
if
((
target
<=
subsystem_pun
(
host_index
))
&&
(
cmd
->
device
->
id
<=
subsystem_pun
(
host_index
)))
target
--
;
target
--
;
else
if
((
target
>=
subsystem_pun
(
host_index
))
&&
(
cmd
->
target
>=
subsystem_pun
(
host_index
)))
else
if
((
target
>=
subsystem_pun
(
host_index
))
&&
(
cmd
->
device
->
id
>=
subsystem_pun
(
host_index
)))
target
++
;
target
++
;
}
else
}
else
target
=
cmd
->
target
;
target
=
cmd
->
device
->
id
;
/* if (target,lun) is NO LUN or not existing at all, return error */
/* if (target,lun) is NO LUN or not existing at all, return error */
if
((
get_scsi
(
host_index
)[
target
][
cmd
->
lun
]
==
TYPE_NO_LUN
)
||
(
get_scsi
(
host_index
)[
target
][
cmd
->
lun
]
==
TYPE_NO_DEVICE
))
{
if
((
get_scsi
(
host_index
)[
target
][
cmd
->
device
->
lun
]
==
TYPE_NO_LUN
)
||
(
get_scsi
(
host_index
)[
target
][
cmd
->
device
->
lun
]
==
TYPE_NO_DEVICE
))
{
cmd
->
result
=
DID_NO_CONNECT
<<
16
;
cmd
->
result
=
DID_NO_CONNECT
<<
16
;
if
(
done
)
if
(
done
)
done
(
cmd
);
done
(
cmd
);
...
@@ -1853,7 +1854,7 @@ static int ibmmca_queuecommand(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *))
...
@@ -1853,7 +1854,7 @@ static int ibmmca_queuecommand(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *))
}
}
/*if (target,lun) unassigned, do further checks... */
/*if (target,lun) unassigned, do further checks... */
ldn
=
get_ldn
(
host_index
)[
target
][
cmd
->
lun
];
ldn
=
get_ldn
(
host_index
)[
target
][
cmd
->
device
->
lun
];
if
(
ldn
>=
MAX_LOG_DEV
)
{
/* on invalid ldn do special stuff */
if
(
ldn
>=
MAX_LOG_DEV
)
{
/* on invalid ldn do special stuff */
if
(
ldn
>
MAX_LOG_DEV
)
{
/* dynamical remapping if ldn unassigned */
if
(
ldn
>
MAX_LOG_DEV
)
{
/* dynamical remapping if ldn unassigned */
current_ldn
=
next_ldn
(
host_index
);
/* stop-value for one circle */
current_ldn
=
next_ldn
(
host_index
);
/* stop-value for one circle */
...
@@ -1864,7 +1865,7 @@ static int ibmmca_queuecommand(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *))
...
@@ -1864,7 +1865,7 @@ static int ibmmca_queuecommand(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *))
next_ldn
(
host_index
)
=
7
;
next_ldn
(
host_index
)
=
7
;
if
(
current_ldn
==
next_ldn
(
host_index
))
{
/* One circle done ? */
if
(
current_ldn
==
next_ldn
(
host_index
))
{
/* One circle done ? */
/* no non-processing ldn found */
/* no non-processing ldn found */
printk
(
"IBM MCA SCSI: Cannot assign SCSI-device dynamically!
\n
"
" On ldn 7-14 SCSI-commands everywhere in progress.
\n
"
" Reporting DID_NO_CONNECT for device (%d,%d).
\n
"
,
target
,
cmd
->
lun
);
printk
(
"IBM MCA SCSI: Cannot assign SCSI-device dynamically!
\n
"
" On ldn 7-14 SCSI-commands everywhere in progress.
\n
"
" Reporting DID_NO_CONNECT for device (%d,%d).
\n
"
,
target
,
cmd
->
device
->
lun
);
cmd
->
result
=
DID_NO_CONNECT
<<
16
;
/* return no connect */
cmd
->
result
=
DID_NO_CONNECT
<<
16
;
/* return no connect */
if
(
done
)
if
(
done
)
done
(
cmd
);
done
(
cmd
);
...
@@ -1884,26 +1885,26 @@ static int ibmmca_queuecommand(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *))
...
@@ -1884,26 +1885,26 @@ static int ibmmca_queuecommand(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *))
/* set reduced interrupt_handler-mode for checking */
/* set reduced interrupt_handler-mode for checking */
local_checking_phase_flag
(
host_index
)
=
1
;
local_checking_phase_flag
(
host_index
)
=
1
;
/* map found ldn to pun,lun */
/* map found ldn to pun,lun */
get_ldn
(
host_index
)[
target
][
cmd
->
lun
]
=
next_ldn
(
host_index
);
get_ldn
(
host_index
)[
target
][
cmd
->
device
->
lun
]
=
next_ldn
(
host_index
);
/* change ldn to the right value, that is now next_ldn */
/* change ldn to the right value, that is now next_ldn */
ldn
=
next_ldn
(
host_index
);
ldn
=
next_ldn
(
host_index
);
/* unassign all ldns (pun,lun,ldn does not matter for remove) */
/* unassign all ldns (pun,lun,ldn does not matter for remove) */
immediate_assign
(
host_index
,
0
,
0
,
0
,
REMOVE_LDN
);
immediate_assign
(
host_index
,
0
,
0
,
0
,
REMOVE_LDN
);
/* set only LDN for remapped device */
/* set only LDN for remapped device */
immediate_assign
(
host_index
,
target
,
cmd
->
lun
,
ldn
,
SET_LDN
);
immediate_assign
(
host_index
,
target
,
cmd
->
device
->
lun
,
ldn
,
SET_LDN
);
/* get device information for ld[ldn] */
/* get device information for ld[ldn] */
if
(
device_exists
(
host_index
,
ldn
,
&
ld
(
host_index
)[
ldn
].
block_length
,
&
ld
(
host_index
)[
ldn
].
device_type
))
{
if
(
device_exists
(
host_index
,
ldn
,
&
ld
(
host_index
)[
ldn
].
block_length
,
&
ld
(
host_index
)[
ldn
].
device_type
))
{
ld
(
host_index
)[
ldn
].
cmd
=
NULL
;
/* To prevent panic set 0, because
ld
(
host_index
)[
ldn
].
cmd
=
NULL
;
/* To prevent panic set 0, because
devices that were not assigned,
devices that were not assigned,
should have nothing in progress. */
should have nothing in progress. */
get_scsi
(
host_index
)[
target
][
cmd
->
lun
]
=
ld
(
host_index
)[
ldn
].
device_type
;
get_scsi
(
host_index
)[
target
][
cmd
->
device
->
lun
]
=
ld
(
host_index
)[
ldn
].
device_type
;
/* increase assignment counters for statistics in /proc */
/* increase assignment counters for statistics in /proc */
IBM_DS
(
host_index
).
dynamical_assignments
++
;
IBM_DS
(
host_index
).
dynamical_assignments
++
;
IBM_DS
(
host_index
).
ldn_assignments
[
ldn
]
++
;
IBM_DS
(
host_index
).
ldn_assignments
[
ldn
]
++
;
}
else
}
else
/* panic here, because a device, found at boottime has
/* panic here, because a device, found at boottime has
vanished */
vanished */
panic
(
"IBM MCA SCSI: ldn=0x%x, SCSI-device on (%d,%d) vanished!
\n
"
,
ldn
,
target
,
cmd
->
lun
);
panic
(
"IBM MCA SCSI: ldn=0x%x, SCSI-device on (%d,%d) vanished!
\n
"
,
ldn
,
target
,
cmd
->
device
->
lun
);
/* unassign again all ldns (pun,lun,ldn does not matter for remove) */
/* unassign again all ldns (pun,lun,ldn does not matter for remove) */
immediate_assign
(
host_index
,
0
,
0
,
0
,
REMOVE_LDN
);
immediate_assign
(
host_index
,
0
,
0
,
0
,
REMOVE_LDN
);
/* remap all ldns, as written in the pun/lun table */
/* remap all ldns, as written in the pun/lun table */
...
@@ -1919,7 +1920,7 @@ static int ibmmca_queuecommand(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *))
...
@@ -1919,7 +1920,7 @@ static int ibmmca_queuecommand(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *))
local_checking_phase_flag
(
host_index
)
=
0
;
local_checking_phase_flag
(
host_index
)
=
0
;
#ifdef IM_DEBUG_PROBE
#ifdef IM_DEBUG_PROBE
/* Information on syslog terminal */
/* Information on syslog terminal */
printk
(
"IBM MCA SCSI: ldn=0x%x dynamically reassigned to (%d,%d).
\n
"
,
ldn
,
target
,
cmd
->
lun
);
printk
(
"IBM MCA SCSI: ldn=0x%x dynamically reassigned to (%d,%d).
\n
"
,
ldn
,
target
,
cmd
->
device
->
lun
);
#endif
#endif
/* increase next_ldn for next dynamical assignment */
/* increase next_ldn for next dynamical assignment */
next_ldn
(
host_index
)
++
;
next_ldn
(
host_index
)
++
;
...
@@ -2141,7 +2142,7 @@ static int ibmmca_abort(Scsi_Cmnd * cmd)
...
@@ -2141,7 +2142,7 @@ static int ibmmca_abort(Scsi_Cmnd * cmd)
printk
(
"IBM MCA SCSI: Abort subroutine called...
\n
"
);
printk
(
"IBM MCA SCSI: Abort subroutine called...
\n
"
);
#endif
#endif
shpnt
=
cmd
->
host
;
shpnt
=
cmd
->
device
->
host
;
/* search for the right hostadapter */
/* search for the right hostadapter */
for
(
host_index
=
0
;
hosts
[
host_index
]
&&
hosts
[
host_index
]
->
host_no
!=
shpnt
->
host_no
;
host_index
++
);
for
(
host_index
=
0
;
hosts
[
host_index
]
&&
hosts
[
host_index
]
->
host_no
!=
shpnt
->
host_no
;
host_index
++
);
...
@@ -2149,7 +2150,7 @@ static int ibmmca_abort(Scsi_Cmnd * cmd)
...
@@ -2149,7 +2150,7 @@ static int ibmmca_abort(Scsi_Cmnd * cmd)
cmd
->
result
=
DID_NO_CONNECT
<<
16
;
cmd
->
result
=
DID_NO_CONNECT
<<
16
;
if
(
cmd
->
scsi_done
)
if
(
cmd
->
scsi_done
)
(
cmd
->
scsi_done
)
(
cmd
);
(
cmd
->
scsi_done
)
(
cmd
);
shpnt
=
cmd
->
host
;
shpnt
=
cmd
->
device
->
host
;
#ifdef IM_DEBUG_PROBE
#ifdef IM_DEBUG_PROBE
printk
(
KERN_DEBUG
"IBM MCA SCSI: Abort adapter selection failed!
\n
"
);
printk
(
KERN_DEBUG
"IBM MCA SCSI: Abort adapter selection failed!
\n
"
);
#endif
#endif
...
@@ -2157,17 +2158,17 @@ static int ibmmca_abort(Scsi_Cmnd * cmd)
...
@@ -2157,17 +2158,17 @@ static int ibmmca_abort(Scsi_Cmnd * cmd)
}
}
max_pun
=
subsystem_maxid
(
host_index
);
max_pun
=
subsystem_maxid
(
host_index
);
if
(
ibm_ansi_order
)
{
if
(
ibm_ansi_order
)
{
target
=
max_pun
-
1
-
cmd
->
target
;
target
=
max_pun
-
1
-
cmd
->
device
->
id
;
if
((
target
<=
subsystem_pun
(
host_index
))
&&
(
cmd
->
target
<=
subsystem_pun
(
host_index
)))
if
((
target
<=
subsystem_pun
(
host_index
))
&&
(
cmd
->
device
->
id
<=
subsystem_pun
(
host_index
)))
target
--
;
target
--
;
else
if
((
target
>=
subsystem_pun
(
host_index
))
&&
(
cmd
->
target
>=
subsystem_pun
(
host_index
)))
else
if
((
target
>=
subsystem_pun
(
host_index
))
&&
(
cmd
->
device
->
id
>=
subsystem_pun
(
host_index
)))
target
++
;
target
++
;
}
else
}
else
target
=
cmd
->
target
;
target
=
cmd
->
device
->
id
;
/* get logical device number, and disable system interrupts */
/* get logical device number, and disable system interrupts */
printk
(
KERN_WARNING
"IBM MCA SCSI: Sending abort to device pun=%d, lun=%d.
\n
"
,
target
,
cmd
->
lun
);
printk
(
KERN_WARNING
"IBM MCA SCSI: Sending abort to device pun=%d, lun=%d.
\n
"
,
target
,
cmd
->
device
->
lun
);
ldn
=
get_ldn
(
host_index
)[
target
][
cmd
->
lun
];
ldn
=
get_ldn
(
host_index
)[
target
][
cmd
->
device
->
lun
];
/*if cmd for this ldn has already finished, no need to abort */
/*if cmd for this ldn has already finished, no need to abort */
if
(
!
ld
(
host_index
)[
ldn
].
cmd
)
{
if
(
!
ld
(
host_index
)[
ldn
].
cmd
)
{
...
@@ -2242,7 +2243,7 @@ static int ibmmca_host_reset(Scsi_Cmnd * cmd)
...
@@ -2242,7 +2243,7 @@ static int ibmmca_host_reset(Scsi_Cmnd * cmd)
BUG
();
BUG
();
ticks
=
IM_RESET_DELAY
*
HZ
;
ticks
=
IM_RESET_DELAY
*
HZ
;
shpnt
=
cmd
->
host
;
shpnt
=
cmd
->
device
->
host
;
/* search for the right hostadapter */
/* search for the right hostadapter */
for
(
host_index
=
0
;
hosts
[
host_index
]
&&
hosts
[
host_index
]
->
host_no
!=
shpnt
->
host_no
;
host_index
++
);
for
(
host_index
=
0
;
hosts
[
host_index
]
&&
hosts
[
host_index
]
->
host_no
!=
shpnt
->
host_no
;
host_index
++
);
...
...
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