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
788c551c
Commit
788c551c
authored
Nov 04, 2002
by
James Bottomley
Browse files
Options
Browse Files
Download
Plain Diff
Merge mulgrave.(none):/home/jejb/BK/scsi-drivers-2.5
into mulgrave.(none):/home/jejb/BK/scsi-for-linus-2.5
parents
a0f3a291
000aec7b
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
235 additions
and
267 deletions
+235
-267
drivers/scsi/megaraid.c
drivers/scsi/megaraid.c
+4
-185
drivers/scsi/megaraid.h
drivers/scsi/megaraid.h
+0
-4
drivers/scsi/scsi_debug.c
drivers/scsi/scsi_debug.c
+218
-70
drivers/scsi/scsi_debug.h
drivers/scsi/scsi_debug.h
+13
-8
No files found.
drivers/scsi/megaraid.c
View file @
788c551c
...
...
@@ -2865,16 +2865,14 @@ static int mega_findCard (Scsi_Host_Template * pHostTmpl,
pciDevFun
=
pdev
->
devfn
;
#endif
if
((
flag
&
BOARD_QUARTZ
)
&&
(
skip_id
==
-
1
))
{
pcibios_read_config_word
(
pciBus
,
pciDevFun
,
PCI_CONF_AMISIG
,
&
magic
);
pci_read_config_word
(
pdev
,
PCI_CONF_AMISIG
,
&
magic
);
if
((
magic
!=
AMI_SIGNATURE
)
&&
(
magic
!=
AMI_SIGNATURE_471
))
{
pciIdx
++
;
continue
;
/* not an AMI board */
}
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
pcibios_read_config_dword
(
pciBus
,
pciDevFun
,
PCI_CONF_AMISIG64
,
&
magic64
);
pci_read_config_dword
(
pdev
,
PCI_CONF_AMISIG64
,
&
magic64
);
if
(
magic64
==
AMI_64BIT_SIGNATURE
)
flag
|=
BOARD_64BIT
;
...
...
@@ -3215,7 +3213,6 @@ int megaraid_detect (Scsi_Host_Template * pHostTmpl)
count
+=
mega_findCard
(
pHostTmpl
,
PCI_VENDOR_ID_AMI
,
PCI_DEVICE_ID_AMI_MEGARAID3
,
BOARD_QUARTZ
);
mega_reorder_hosts
();
#ifdef CONFIG_PROC_FS
if
(
count
)
{
...
...
@@ -3481,173 +3478,6 @@ mega_get_boot_ldrv(mega_host_config *megacfg)
}
static
void
mega_reorder_hosts
(
void
)
{
struct
Scsi_Host
*
shpnt
;
struct
Scsi_Host
*
shone
;
struct
Scsi_Host
*
shtwo
;
mega_host_config
*
boot_host
;
int
i
;
/*
* Find the (first) host which has it's BIOS enabled
*/
boot_host
=
NULL
;
for
(
i
=
0
;
i
<
MAX_CONTROLLERS
;
i
++
)
{
if
(
mega_hbas
[
i
].
is_bios_enabled
)
{
boot_host
=
mega_hbas
[
i
].
hostdata_addr
;
break
;
}
}
if
(
boot_host
==
NULL
)
{
printk
(
KERN_WARNING
"megaraid: no BIOS enabled.
\n
"
);
return
;
}
/*
* Traverse through the list of SCSI hosts for our HBA locations
*/
shone
=
shtwo
=
NULL
;
for
(
shpnt
=
scsi_hostlist
;
shpnt
;
shpnt
=
shpnt
->
next
)
{
/* Is it one of ours? */
for
(
i
=
0
;
i
<
MAX_CONTROLLERS
;
i
++
)
{
if
((
mega_host_config
*
)
shpnt
->
hostdata
==
mega_hbas
[
i
].
hostdata_addr
)
{
/* Does this one has BIOS enabled */
if
(
mega_hbas
[
i
].
hostdata_addr
==
boot_host
)
{
/* Are we first */
if
(
shtwo
==
NULL
)
/* Yes! */
return
;
else
{
/* :-( */
shone
=
shpnt
;
}
}
else
{
if
(
!
shtwo
)
{
/* were we here before? xchng first */
shtwo
=
shpnt
;
}
}
break
;
}
}
/*
* Have we got the boot host and one which does not have the bios
* enabled.
*/
if
(
shone
&&
shtwo
)
break
;
}
if
(
shone
&&
shtwo
)
{
mega_swap_hosts
(
shone
,
shtwo
);
}
return
;
}
static
void
mega_swap_hosts
(
struct
Scsi_Host
*
shone
,
struct
Scsi_Host
*
shtwo
)
{
struct
Scsi_Host
*
prevtoshtwo
;
struct
Scsi_Host
*
prevtoshone
;
struct
Scsi_Host
*
save
=
NULL
;;
/* Are these two nodes adjacent */
if
(
shtwo
->
next
==
shone
)
{
if
(
shtwo
==
scsi_hostlist
&&
shone
->
next
==
NULL
)
{
/* just two nodes */
scsi_hostlist
=
shone
;
shone
->
next
=
shtwo
;
shtwo
->
next
=
NULL
;
}
else
if
(
shtwo
==
scsi_hostlist
)
{
/* first two nodes of the list */
scsi_hostlist
=
shone
;
shtwo
->
next
=
shone
->
next
;
scsi_hostlist
->
next
=
shtwo
;
}
else
if
(
shone
->
next
==
NULL
)
{
/* last two nodes of the list */
prevtoshtwo
=
scsi_hostlist
;
while
(
prevtoshtwo
->
next
!=
shtwo
)
prevtoshtwo
=
prevtoshtwo
->
next
;
prevtoshtwo
->
next
=
shone
;
shone
->
next
=
shtwo
;
shtwo
->
next
=
NULL
;
}
else
{
prevtoshtwo
=
scsi_hostlist
;
while
(
prevtoshtwo
->
next
!=
shtwo
)
prevtoshtwo
=
prevtoshtwo
->
next
;
prevtoshtwo
->
next
=
shone
;
shtwo
->
next
=
shone
->
next
;
shone
->
next
=
shtwo
;
}
}
else
if
(
shtwo
==
scsi_hostlist
&&
shone
->
next
==
NULL
)
{
/* shtwo at head, shone at tail, not adjacent */
prevtoshone
=
scsi_hostlist
;
while
(
prevtoshone
->
next
!=
shone
)
prevtoshone
=
prevtoshone
->
next
;
scsi_hostlist
=
shone
;
shone
->
next
=
shtwo
->
next
;
prevtoshone
->
next
=
shtwo
;
shtwo
->
next
=
NULL
;
}
else
if
(
shtwo
==
scsi_hostlist
&&
shone
->
next
!=
NULL
)
{
/* shtwo at head, shone is not at tail */
prevtoshone
=
scsi_hostlist
;
while
(
prevtoshone
->
next
!=
shone
)
prevtoshone
=
prevtoshone
->
next
;
scsi_hostlist
=
shone
;
prevtoshone
->
next
=
shtwo
;
save
=
shtwo
->
next
;
shtwo
->
next
=
shone
->
next
;
shone
->
next
=
save
;
}
else
if
(
shone
->
next
==
NULL
)
{
/* shtwo not at head, shone at tail */
prevtoshtwo
=
scsi_hostlist
;
prevtoshone
=
scsi_hostlist
;
while
(
prevtoshtwo
->
next
!=
shtwo
)
prevtoshtwo
=
prevtoshtwo
->
next
;
while
(
prevtoshone
->
next
!=
shone
)
prevtoshone
=
prevtoshone
->
next
;
prevtoshtwo
->
next
=
shone
;
shone
->
next
=
shtwo
->
next
;
prevtoshone
->
next
=
shtwo
;
shtwo
->
next
=
NULL
;
}
else
{
prevtoshtwo
=
scsi_hostlist
;
prevtoshone
=
scsi_hostlist
;
save
=
NULL
;;
while
(
prevtoshtwo
->
next
!=
shtwo
)
prevtoshtwo
=
prevtoshtwo
->
next
;
while
(
prevtoshone
->
next
!=
shone
)
prevtoshone
=
prevtoshone
->
next
;
prevtoshtwo
->
next
=
shone
;
save
=
shone
->
next
;
shone
->
next
=
shtwo
->
next
;
prevtoshone
->
next
=
shtwo
;
shtwo
->
next
=
save
;
}
return
;
}
static
inline
void
mega_freeSgList
(
mega_host_config
*
megaCfg
)
{
int
i
;
...
...
@@ -4293,7 +4123,6 @@ mega_partsize(struct block_device *bdev, sector_t capacity, int *geom)
struct
partition
*
p
,
*
largest
=
NULL
;
int
i
,
largest_cyl
;
int
heads
,
cyls
,
sectors
;
int
capacity
=
capacity
;
unsigned
char
*
buf
;
if
(
!
(
buf
=
scsi_bios_ptable
(
bdev
)))
...
...
@@ -4683,12 +4512,7 @@ static int megadev_ioctl (struct inode *inode, struct file *filep,
/*
* Find this host
*/
for
(
shpnt
=
scsi_hostlist
;
shpnt
;
shpnt
=
shpnt
->
next
)
{
if
(
shpnt
->
hostdata
==
(
unsigned
long
*
)
megaCtlrs
[
adapno
]
)
{
megacfg
=
(
mega_host_config
*
)
shpnt
->
hostdata
;
break
;
}
}
shpnt
=
megaCtlrs
[
adapno
]
->
host
;
if
(
shpnt
==
NULL
)
return
-
ENODEV
;
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
...
...
@@ -4803,12 +4627,7 @@ static int megadev_ioctl (struct inode *inode, struct file *filep,
/*
* Find this host
*/
for
(
shpnt
=
scsi_hostlist
;
shpnt
;
shpnt
=
shpnt
->
next
)
{
if
(
shpnt
->
hostdata
==
(
unsigned
long
*
)
megaCtlrs
[
adapno
]
)
{
megacfg
=
(
mega_host_config
*
)
shpnt
->
hostdata
;
break
;
}
}
shpnt
=
megaCtlrs
[
adapno
]
->
host
;
if
(
shpnt
==
NULL
)
return
-
ENODEV
;
/*
...
...
drivers/scsi/megaraid.h
View file @
788c551c
...
...
@@ -214,8 +214,6 @@
info: megaraid_info,
/* Driver Info Function */
\
command: megaraid_command,
/* Command Function */
\
queuecommand: megaraid_queue,
/* Queue Command Function */
\
abort: megaraid_abort,
/* Abort Command Function */
\
reset: megaraid_reset,
/* Reset Command Function */
\
bios_param: megaraid_biosparam,
/* Disk BIOS Parameters */
\
can_queue: MAX_COMMANDS,
/* Can Queue */
\
this_id: 7,
/* HBA Target ID */
\
...
...
@@ -989,8 +987,6 @@ static void enq_scb_freelist (mega_host_config *, mega_scb *,
int
lock
,
int
intr
);
static
int
mega_is_bios_enabled
(
mega_host_config
*
);
static
void
mega_reorder_hosts
(
void
);
static
void
mega_swap_hosts
(
struct
Scsi_Host
*
,
struct
Scsi_Host
*
);
static
void
mega_create_proc_entry
(
int
index
,
struct
proc_dir_entry
*
);
static
int
mega_support_ext_cdb
(
mega_host_config
*
);
...
...
drivers/scsi/scsi_debug.c
View file @
788c551c
...
...
@@ -17,6 +17,7 @@
* forked for lk 2.5 series [20011216, 20020101]
* use vmalloc() more inquiry+mode_sense [20020302]
* add timers for delayed responses [20020721]
* Patrick Mansfield <patmans@us.ibm.com> max_luns+scsi_level [20021031]
*/
#include <linux/config.h>
...
...
@@ -49,7 +50,7 @@
#include "scsi_debug.h"
static
const
char
*
scsi_debug_version_str
=
"Version: 1.6
2 (20020812
)"
;
static
const
char
*
scsi_debug_version_str
=
"Version: 1.6
3 (20021103
)"
;
#define DRIVERFS_SUPPORT 1
/* comment out whole line to disable */
...
...
@@ -60,9 +61,8 @@ static const char * scsi_debug_version_str = "Version: 1.62 (20020812)";
#ifndef SCSI_CMD_WRITE_16
#define SCSI_CMD_WRITE_16 0x8a
#endif
#ifndef REPORT_LUNS
#define REPORT_LUNS 0xa0
#endif
#define SDEBUG_TAGGED_QUEUING 0
/* 0 | MSG_SIMPLE_TAG | MSG_ORDERED_TAG */
/* A few options that we want selected */
#define DEF_NR_FAKE_DEVS 1
...
...
@@ -70,6 +70,8 @@ static const char * scsi_debug_version_str = "Version: 1.62 (20020812)";
#define DEF_FAKE_BLK0 0
#define DEF_EVERY_NTH 100
#define DEF_DELAY 1
#define DEF_MAX_LUNS 2
#define DEF_SCSI_LEVEL 3
#define DEF_OPTS 0
#define SCSI_DEBUG_OPT_NOISE 1
...
...
@@ -83,8 +85,11 @@ static int scsi_debug_opts = DEF_OPTS;
static
int
scsi_debug_every_nth
=
DEF_EVERY_NTH
;
static
int
scsi_debug_cmnd_count
=
0
;
static
int
scsi_debug_delay
=
DEF_DELAY
;
static
int
scsi_debug_max_luns
=
DEF_MAX_LUNS
;
static
int
scsi_debug_scsi_level
=
DEF_SCSI_LEVEL
;
#define NR_HOSTS_PRESENT (((scsi_debug_num_devs - 1) / 7) + 1)
/* This assumes one lun used per allocated target id */
#define N_HEAD 8
#define N_SECTOR 32
#define DEV_READONLY(TGT) (0)
...
...
@@ -118,7 +123,7 @@ struct sdebug_dev_info {
};
static
struct
sdebug_dev_info
*
devInfop
;
typedef
void
(
*
done_funct_t
)
(
Scsi_C
mnd
*
);
typedef
void
(
*
done_funct_t
)
(
struct
scsi_c
mnd
*
);
struct
sdebug_queued_cmd
{
int
in_use
;
...
...
@@ -131,7 +136,7 @@ static struct sdebug_queued_cmd queued_arr[SCSI_DEBUG_CANQUEUE];
static
unsigned
char
*
fake_storep
;
/* ramdisk storage */
static
unsigned
char
broken
_buff
[
SDEBUG_SENSE_LEN
];
static
unsigned
char
spare
_buff
[
SDEBUG_SENSE_LEN
];
static
int
num_aborts
=
0
;
static
int
num_dev_resets
=
0
;
...
...
@@ -151,17 +156,18 @@ static int resp_inquiry(unsigned char * cmd, int target, unsigned char * buff,
static
int
resp_mode_sense
(
unsigned
char
*
cmd
,
int
target
,
unsigned
char
*
buff
,
int
bufflen
,
struct
sdebug_dev_info
*
devip
);
static
int
resp_read
(
Scsi_C
mnd
*
SCpnt
,
int
upper_blk
,
int
block
,
static
int
resp_read
(
struct
scsi_c
mnd
*
SCpnt
,
int
upper_blk
,
int
block
,
int
num
,
struct
sdebug_dev_info
*
devip
);
static
int
resp_write
(
Scsi_Cmnd
*
SCpnt
,
int
upper_blk
,
int
block
,
int
num
,
struct
sdebug_dev_info
*
devip
);
static
int
resp_write
(
struct
scsi_cmnd
*
SCpnt
,
int
upper_blk
,
int
block
,
int
num
,
struct
sdebug_dev_info
*
devip
);
static
int
resp_report_luns
(
unsigned
char
*
cmd
,
unsigned
char
*
buff
,
int
bufflen
,
struct
sdebug_dev_info
*
devip
);
static
void
timer_intr_handler
(
unsigned
long
);
static
struct
sdebug_dev_info
*
devInfoReg
(
Scsi_C
mnd
*
scmd
);
static
struct
sdebug_dev_info
*
devInfoReg
(
struct
scsi_c
mnd
*
scmd
);
static
void
mk_sense_buffer
(
struct
sdebug_dev_info
*
devip
,
int
key
,
int
asc
,
int
asq
,
int
inbandLen
);
static
int
check_reset
(
Scsi_Cmnd
*
SCpnt
,
struct
sdebug_dev_info
*
devip
);
static
int
check_reset
(
struct
scsi_cmnd
*
SCpnt
,
struct
sdebug_dev_info
*
devip
);
static
int
schedule_resp
(
struct
scsi_cmnd
*
cmnd
,
struct
sdebug_dev_info
*
devip
,
done_funct_t
done
,
int
scsi_result
,
int
delta_jiff
);
...
...
@@ -188,7 +194,7 @@ static unsigned char * scatg2virt(const struct scatterlist * sclp)
}
static
int
scsi_debug_queuecommand
(
Scsi_C
mnd
*
SCpnt
,
done_funct_t
done
)
int
scsi_debug_queuecommand
(
struct
scsi_c
mnd
*
SCpnt
,
done_funct_t
done
)
{
unsigned
char
*
cmd
=
(
unsigned
char
*
)
SCpnt
->
cmnd
;
int
block
;
...
...
@@ -215,8 +221,7 @@ int scsi_debug_queuecommand(Scsi_Cmnd * SCpnt, done_funct_t done)
else
buff
=
(
unsigned
char
*
)
SCpnt
->
request_buffer
;
if
(
NULL
==
buff
)
{
printk
(
KERN_WARNING
"scsi_debug:qc: buff was NULL??
\n
"
);
buff
=
broken_buff
;
/* just point at dummy */
buff
=
spare_buff
;
/* assume cmd moves no data */
bufflen
=
SDEBUG_SENSE_LEN
;
}
...
...
@@ -226,11 +231,11 @@ int scsi_debug_queuecommand(Scsi_Cmnd * SCpnt, done_funct_t done)
return
schedule_resp
(
SCpnt
,
NULL
,
done
,
0
,
0
);
}
if
(
SCpnt
->
lun
!=
0
)
if
(
SCpnt
->
lun
>=
scsi_debug_max_luns
)
return
schedule_resp
(
SCpnt
,
NULL
,
done
,
DID_NO_CONNECT
<<
16
,
0
);
#if 0
printk(KERN_INFO "sdebug:qc: host_no=%
d, id=%d
, sdp=%p, cmd=0x%x\n",
printk(KERN_INFO "sdebug:qc: host_no=%
u, id=%u
, sdp=%p, cmd=0x%x\n",
(int)SCpnt->device->host->host_no, (int)SCpnt->device->id,
SCpnt->device, (int)*cmd);
#endif
...
...
@@ -248,9 +253,6 @@ int scsi_debug_queuecommand(Scsi_Cmnd * SCpnt, done_funct_t done)
switch
(
*
cmd
)
{
case
INQUIRY
:
/* mandatory */
/* assume INQUIRY called first so setup max_cmd_len */
if
(
SCpnt
->
host
->
max_cmd_len
!=
SCSI_DEBUG_MAX_CMD_LEN
)
SCpnt
->
host
->
max_cmd_len
=
SCSI_DEBUG_MAX_CMD_LEN
;
errsts
=
resp_inquiry
(
cmd
,
target
,
buff
,
bufflen
,
devip
);
break
;
case
REQUEST_SENSE
:
/* mandatory */
...
...
@@ -380,6 +382,9 @@ int scsi_debug_queuecommand(Scsi_Cmnd * SCpnt, done_funct_t done)
case
MODE_SENSE_10
:
errsts
=
resp_mode_sense
(
cmd
,
target
,
buff
,
bufflen
,
devip
);
break
;
case
SYNCHRONIZE_CACHE
:
memset
(
buff
,
0
,
bufflen
);
break
;
default:
#if 0
printk(KERN_INFO "scsi_debug: Unsupported command, "
...
...
@@ -394,7 +399,7 @@ int scsi_debug_queuecommand(Scsi_Cmnd * SCpnt, done_funct_t done)
return
schedule_resp
(
SCpnt
,
devip
,
done
,
errsts
,
scsi_debug_delay
);
}
static
int
scsi_debug_ioctl
(
Scsi_D
evice
*
dev
,
int
cmd
,
void
*
arg
)
static
int
scsi_debug_ioctl
(
struct
scsi_d
evice
*
dev
,
int
cmd
,
void
*
arg
)
{
if
(
SCSI_DEBUG_OPT_NOISE
&
scsi_debug_opts
)
{
printk
(
KERN_INFO
"scsi_debug: ioctl: cmd=0x%x
\n
"
,
cmd
);
...
...
@@ -403,7 +408,7 @@ static int scsi_debug_ioctl(Scsi_Device *dev, int cmd, void *arg)
/* return -ENOTTY; // correct return but upsets fdisk */
}
static
int
check_reset
(
Scsi_C
mnd
*
SCpnt
,
struct
sdebug_dev_info
*
devip
)
static
int
check_reset
(
struct
scsi_c
mnd
*
SCpnt
,
struct
sdebug_dev_info
*
devip
)
{
if
(
devip
->
reset
)
{
devip
->
reset
=
0
;
...
...
@@ -474,8 +479,8 @@ static int resp_inquiry(unsigned char * cmd, int target, unsigned char * buff,
int
dev_id_num
,
len
;
char
dev_id_str
[
6
];
dev_id_num
=
((
devip
->
host
->
host_no
+
1
)
*
1000
)
+
devip
->
target
;
dev_id_num
=
((
devip
->
host
->
host_no
+
1
)
*
2000
)
+
(
devip
->
target
*
1000
)
+
devip
->
lun
;
len
=
snprintf
(
dev_id_str
,
6
,
"%d"
,
dev_id_num
);
len
=
(
len
>
6
)
?
6
:
len
;
if
(
0
==
cmd
[
2
])
{
/* supported vital product data pages */
...
...
@@ -501,7 +506,7 @@ static int resp_inquiry(unsigned char * cmd, int target, unsigned char * buff,
}
/* drops through here for a standard inquiry */
arr
[
1
]
=
DEV_REMOVEABLE
(
target
)
?
0x80
:
0
;
/* Removable disk */
arr
[
2
]
=
3
;
/* claim SCSI 3 */
arr
[
2
]
=
scsi_debug_scsi_level
;
arr
[
4
]
=
SDEBUG_LONG_INQ_SZ
-
5
;
arr
[
7
]
=
0x3a
;
/* claim: WBUS16, SYNC, LINKED + CMDQUE */
memcpy
(
&
arr
[
8
],
vendor_id
,
8
);
...
...
@@ -643,6 +648,7 @@ static int resp_mode_sense(unsigned char * cmd, int target,
case
0x3f
:
/* Read all Mode pages */
len
=
resp_err_recov_pg
(
ap
,
pcontrol
,
target
);
len
+=
resp_disconnect_pg
(
ap
+
len
,
pcontrol
,
target
);
len
+=
resp_format_pg
(
ap
+
len
,
pcontrol
,
target
);
len
+=
resp_caching_pg
(
ap
+
len
,
pcontrol
,
target
);
len
+=
resp_ctrl_m_pg
(
ap
+
len
,
pcontrol
,
target
);
offset
+=
len
;
...
...
@@ -662,8 +668,8 @@ static int resp_mode_sense(unsigned char * cmd, int target,
return
0
;
}
static
int
resp_read
(
Scsi_Cmnd
*
SCpnt
,
int
upper_blk
,
int
block
,
int
num
,
struct
sdebug_dev_info
*
devip
)
static
int
resp_read
(
struct
scsi_cmnd
*
SCpnt
,
int
upper_blk
,
int
block
,
int
num
,
struct
sdebug_dev_info
*
devip
)
{
unsigned
char
*
buff
=
(
unsigned
char
*
)
SCpnt
->
request_buffer
;
int
nbytes
,
sgcount
;
...
...
@@ -711,8 +717,8 @@ static int resp_read(Scsi_Cmnd * SCpnt, int upper_blk, int block, int num,
return
0
;
}
static
int
resp_write
(
Scsi_Cmnd
*
SCpnt
,
int
upper_blk
,
int
block
,
int
num
,
struct
sdebug_dev_info
*
devip
)
static
int
resp_write
(
struct
scsi_cmnd
*
SCpnt
,
int
upper_blk
,
int
block
,
int
num
,
struct
sdebug_dev_info
*
devip
)
{
unsigned
char
*
buff
=
(
unsigned
char
*
)
SCpnt
->
request_buffer
;
int
nbytes
,
sgcount
;
...
...
@@ -756,8 +762,9 @@ static int resp_write(Scsi_Cmnd * SCpnt, int upper_blk, int block, int num,
static
int
resp_report_luns
(
unsigned
char
*
cmd
,
unsigned
char
*
buff
,
int
bufflen
,
struct
sdebug_dev_info
*
devip
)
{
unsigned
int
alloc_len
;
unsigned
int
alloc_len
,
lun_cnt
,
i
;
int
select_report
=
(
int
)
cmd
[
2
];
ScsiLun
*
one_lun
;
alloc_len
=
cmd
[
9
]
+
(
cmd
[
8
]
<<
8
)
+
(
cmd
[
7
]
<<
16
)
+
(
cmd
[
6
]
<<
24
);
if
((
alloc_len
<
16
)
||
(
select_report
>
2
))
{
...
...
@@ -765,8 +772,13 @@ static int resp_report_luns(unsigned char * cmd, unsigned char * buff,
return
(
COMMAND_COMPLETE
<<
8
)
|
(
CHECK_CONDITION
<<
1
);
}
if
(
bufflen
>
3
)
{
lun_cnt
=
min
((
int
)(
bufflen
/
sizeof
(
ScsiLun
)),
(
int
)
scsi_debug_max_luns
);
memset
(
buff
,
0
,
bufflen
);
buff
[
3
]
=
8
;
buff
[
3
]
=
8
*
lun_cnt
;
one_lun
=
(
ScsiLun
*
)
&
buff
[
0
];
for
(
i
=
0
;
i
<
lun_cnt
;
i
++
)
one_lun
[
i
].
scsi_lun
[
1
]
=
i
;
}
return
0
;
}
...
...
@@ -798,12 +810,13 @@ static void timer_intr_handler(unsigned long indx)
}
static
int
initialized
=
0
;
static
int
num_present
=
0
;
static
int
num_
hosts_
present
=
0
;
static
const
char
*
sdebug_proc_name
=
"scsi_debug"
;
static
int
scsi_debug_detect
(
Scsi_Host_Template
*
tpnt
)
static
int
scsi_debug_detect
(
struct
SHT
*
tpnt
)
{
int
k
,
sz
;
struct
Scsi_Host
*
hpnt
;
if
(
SCSI_DEBUG_OPT_NOISE
&
scsi_debug_opts
)
printk
(
KERN_INFO
"scsi_debug: detect
\n
"
);
...
...
@@ -813,7 +826,7 @@ static int scsi_debug_detect(Scsi_Host_Template * tpnt)
devInfop
=
vmalloc
(
sz
);
if
(
NULL
==
devInfop
)
{
printk
(
KERN_ERR
"scsi_debug_detect: out of "
"memory
, 0.5
\n
"
);
"memory
\n
"
);
return
0
;
}
memset
(
devInfop
,
0
,
sz
);
...
...
@@ -821,28 +834,31 @@ static int scsi_debug_detect(Scsi_Host_Template * tpnt)
fake_storep
=
vmalloc
(
sz
);
if
(
NULL
==
fake_storep
)
{
printk
(
KERN_ERR
"scsi_debug_detect: out of memory"
",
0
\n
"
);
",
1
\n
"
);
return
0
;
}
memset
(
fake_storep
,
0
,
sz
);
init_all_queued
();
#ifdef DRIVERFS_SUPPORT
sdebug_driverfs_driver
.
name
=
(
char
*
)
sdebug_proc_name
;
sdebug_driverfs_driver
.
bus
=
&
scsi_driverfs_bus_type
;
driver_register
(
&
sdebug_driverfs_driver
);
do_create_driverfs_files
();
#endif
tpnt
->
proc_name
=
(
char
*
)
sdebug_proc_name
;
for
(
num_present
=
0
,
k
=
0
;
k
<
NR_HOSTS_PRESENT
;
k
++
)
{
if
(
NULL
==
scsi_register
(
tpnt
,
0
)
)
for
(
num_
hosts_
present
=
0
,
k
=
0
;
k
<
NR_HOSTS_PRESENT
;
k
++
)
{
if
(
(
hpnt
=
scsi_register
(
tpnt
,
0
))
==
NULL
)
printk
(
KERN_ERR
"scsi_debug_detect: "
"scsi_register failed k=%d
\n
"
,
k
);
else
++
num_present
;
}
#ifdef DRIVERFS_SUPPORT
if
(
num_present
)
{
sdebug_driverfs_driver
.
name
=
(
char
*
)
sdebug_proc_name
;
sdebug_driverfs_driver
.
bus
=
&
scsi_driverfs_bus_type
;
driver_register
(
&
sdebug_driverfs_driver
);
do_create_driverfs_files
();
else
{
hpnt
->
max_lun
=
scsi_debug_max_luns
;
++
num_hosts_present
;
}
}
#endif
return
num_present
;
if
(
SCSI_DEBUG_OPT_NOISE
&
scsi_debug_opts
)
printk
(
KERN_INFO
"scsi_debug: ... built %d host(s)
\n
"
,
num_hosts_present
);
return
num_hosts_present
;
}
else
{
printk
(
KERN_WARNING
"scsi_debug_detect: called again
\n
"
);
return
0
;
...
...
@@ -854,11 +870,15 @@ static int num_releases = 0;
static
int
scsi_debug_release
(
struct
Scsi_Host
*
hpnt
)
{
if
(
SCSI_DEBUG_OPT_NOISE
&
scsi_debug_opts
)
printk
(
KERN_INFO
"scsi_debug: release
\n
"
);
stop_all_queued
();
scsi_unregister
(
hpnt
);
if
(
++
num_releases
==
num_present
)
{
int
host_no
=
hpnt
->
host_no
;
if
(
++
num_releases
==
num_hosts_present
)
{
if
(
SCSI_DEBUG_OPT_NOISE
&
scsi_debug_opts
)
printk
(
KERN_INFO
"scsi_debug: [last] release, "
"host_no=%u
\n
"
,
host_no
);
num_releases
=
0
;
initialized
=
0
;
stop_all_queued
();
#ifdef DRIVERFS_SUPPORT
do_remove_driverfs_files
();
driver_unregister
(
&
sdebug_driverfs_driver
);
...
...
@@ -866,14 +886,65 @@ static int scsi_debug_release(struct Scsi_Host * hpnt)
vfree
(
fake_storep
);
vfree
(
devInfop
);
}
else
{
if
(
SCSI_DEBUG_OPT_NOISE
&
scsi_debug_opts
)
printk
(
KERN_INFO
"scsi_debug: release, host_no=%u
\n
"
,
host_no
);
}
scsi_unregister
(
hpnt
);
return
0
;
}
static
struct
sdebug_dev_info
*
devInfoReg
(
Scsi_Cmnd
*
scmd
)
static
int
scsi_debug_slave_attach
(
struct
scsi_device
*
sdp
)
{
int
k
;
struct
sdebug_dev_info
*
devip
;
struct
sdebug_dev_info
*
devip
;
if
(
SCSI_DEBUG_OPT_NOISE
&
scsi_debug_opts
)
printk
(
KERN_INFO
"scsi_debug: slave_attach <%u %u %u %u>
\n
"
,
sdp
->
host
->
host_no
,
sdp
->
channel
,
sdp
->
id
,
sdp
->
lun
);
if
(
sdp
->
host
->
max_cmd_len
!=
SCSI_DEBUG_MAX_CMD_LEN
)
sdp
->
host
->
max_cmd_len
=
SCSI_DEBUG_MAX_CMD_LEN
;
for
(
k
=
0
;
k
<
scsi_debug_num_devs
;
++
k
)
{
devip
=
&
devInfop
[
k
];
if
((
devip
->
channel
==
sdp
->
channel
)
&&
(
devip
->
target
==
sdp
->
id
)
&&
(
devip
->
lun
==
sdp
->
lun
)
&&
(
devip
->
host
==
sdp
->
host
))
{
sdp
->
hostdata
=
devip
;
break
;
}
}
if
(
sdp
->
host
->
cmd_per_lun
)
scsi_adjust_queue_depth
(
sdp
,
SDEBUG_TAGGED_QUEUING
,
sdp
->
host
->
cmd_per_lun
);
return
0
;
}
static
void
scsi_debug_slave_detach
(
struct
scsi_device
*
sdp
)
{
struct
sdebug_dev_info
*
devip
=
(
struct
sdebug_dev_info
*
)
sdp
->
hostdata
;
if
(
SCSI_DEBUG_OPT_NOISE
&
scsi_debug_opts
)
printk
(
KERN_INFO
"scsi_debug: slave_detach <%u %u %u %u>
\n
"
,
sdp
->
host
->
host_no
,
sdp
->
channel
,
sdp
->
id
,
sdp
->
lun
);
if
(
devip
)
{
/* make this slot avaliable for re-use */
memset
(
devip
,
0
,
sizeof
(
struct
sdebug_dev_info
));
sdp
->
hostdata
=
NULL
;
}
}
static
struct
sdebug_dev_info
*
devInfoReg
(
struct
scsi_cmnd
*
scmd
)
{
int
k
;
struct
scsi_device
*
sdp
=
scmd
->
device
;
struct
sdebug_dev_info
*
devip
=
(
struct
sdebug_dev_info
*
)
sdp
->
hostdata
;
if
(
devip
)
return
devip
;
for
(
k
=
0
;
k
<
scsi_debug_num_devs
;
++
k
)
{
devip
=
&
devInfop
[
k
];
if
((
devip
->
channel
==
scmd
->
channel
)
&&
...
...
@@ -915,7 +986,7 @@ static void mk_sense_buffer(struct sdebug_dev_info * devip, int key,
sbuff
[
13
]
=
asq
;
}
static
int
scsi_debug_abort
(
Scsi_C
mnd
*
SCpnt
)
static
int
scsi_debug_abort
(
struct
scsi_c
mnd
*
SCpnt
)
{
if
(
SCSI_DEBUG_OPT_NOISE
&
scsi_debug_opts
)
printk
(
KERN_INFO
"scsi_debug: abort
\n
"
);
...
...
@@ -938,7 +1009,7 @@ static int scsi_debug_biosparam(struct scsi_device *sdev,
return
0
;
}
static
int
scsi_debug_device_reset
(
Scsi_C
mnd
*
SCpnt
)
static
int
scsi_debug_device_reset
(
struct
scsi_c
mnd
*
SCpnt
)
{
struct
sdebug_dev_info
*
devip
;
...
...
@@ -953,9 +1024,9 @@ static int scsi_debug_device_reset(Scsi_Cmnd * SCpnt)
return
SUCCESS
;
}
static
int
scsi_debug_bus_reset
(
Scsi_C
mnd
*
SCpnt
)
static
int
scsi_debug_bus_reset
(
struct
scsi_c
mnd
*
SCpnt
)
{
Scsi_D
evice
*
sdp
;
struct
scsi_d
evice
*
sdp
;
struct
Scsi_Host
*
hp
;
int
k
;
...
...
@@ -971,7 +1042,7 @@ static int scsi_debug_bus_reset(Scsi_Cmnd * SCpnt)
return
SUCCESS
;
}
static
int
scsi_debug_host_reset
(
Scsi_C
mnd
*
SCpnt
)
static
int
scsi_debug_host_reset
(
struct
scsi_c
mnd
*
SCpnt
)
{
int
k
;
...
...
@@ -1048,11 +1119,18 @@ static int schedule_resp(struct scsi_cmnd * cmnd,
{
int
k
,
num
;
if
(
SCSI_DEBUG_OPT_NOISE
&
scsi_debug_opts
)
{
if
(
(
SCSI_DEBUG_OPT_NOISE
&
scsi_debug_opts
)
&&
cmnd
)
{
printk
(
KERN_INFO
"scsi_debug: cmd "
);
for
(
k
=
0
,
num
=
cmnd
->
cmd_len
;
k
<
num
;
++
k
)
printk
(
"%02x "
,
(
int
)
cmnd
->
cmnd
[
k
]);
printk
(
"result=0x%x
\n
"
,
scsi_result
);
printk
(
"
\n
"
);
if
(
scsi_result
)
{
struct
scsi_device
*
sdp
=
cmnd
->
device
;
printk
(
KERN_INFO
"scsi_debug: ... <%u %u %u %u> "
"non-zero result=0x%x
\n
"
,
sdp
->
host
->
host_no
,
sdp
->
channel
,
sdp
->
id
,
sdp
->
lun
,
scsi_result
);
}
}
if
(
cmnd
&&
devip
)
{
/* simulate autosense by this driver */
...
...
@@ -1113,6 +1191,38 @@ static int __init num_devs_setup(char *str)
}
__setup
(
"scsi_debug_num_devs="
,
num_devs_setup
);
static
int
__init
max_luns_setup
(
char
*
str
)
{
int
tmp
;
if
(
get_option
(
&
str
,
&
tmp
)
==
1
)
{
if
(
tmp
>
0
)
scsi_debug_max_luns
=
tmp
;
return
1
;
}
else
{
printk
(
KERN_INFO
"scsi_debug_max_luns: usage scsi_debug_max_luns=<n> "
"(<n> is a postive integer (def=2))
\n
"
);
return
0
;
}
}
__setup
(
"scsi_debug_max_luns="
,
max_luns_setup
);
static
int
__init
scsi_level_setup
(
char
*
str
)
{
int
tmp
;
if
(
get_option
(
&
str
,
&
tmp
)
==
1
)
{
if
(
tmp
>
0
)
scsi_debug_scsi_level
=
tmp
;
return
1
;
}
else
{
printk
(
KERN_INFO
"scsi_debug_scsi_level: usage "
"scsi_debug_scsi_level=<n> (<n> is 1..4 (def=3))
\n
"
);
return
0
;
}
}
__setup
(
"scsi_debug_scsi_level="
,
scsi_level_setup
);
static
int
__init
dev_size_mb_setup
(
char
*
str
)
{
int
tmp
;
...
...
@@ -1186,6 +1296,10 @@ MODULE_AUTHOR("Eric Youngdale + Douglas Gilbert");
MODULE_DESCRIPTION
(
"SCSI debug adapter driver"
);
MODULE_PARM
(
scsi_debug_num_devs
,
"i"
);
MODULE_PARM_DESC
(
scsi_debug_num_devs
,
"number of SCSI devices to simulate"
);
MODULE_PARM
(
scsi_debug_max_luns
,
"i"
);
MODULE_PARM_DESC
(
scsi_debug_max_luns
,
"number of SCSI LUNs per target to simulate"
);
MODULE_PARM
(
scsi_debug_scsi_level
,
"i"
);
MODULE_PARM_DESC
(
scsi_debug_scsi_level
,
"SCSI level to simulate"
);
MODULE_PARM
(
scsi_debug_dev_size_mb
,
"i"
);
MODULE_PARM_DESC
(
scsi_debug_dev_size_mb
,
"size in MB of ram shared by devs"
);
MODULE_PARM
(
scsi_debug_opts
,
"i"
);
...
...
@@ -1237,13 +1351,15 @@ static int scsi_debug_proc_info(char *buffer, char **start, off_t offset,
pos
=
len
=
sprintf
(
buffer
,
"scsi_debug adapter driver, %s
\n
"
"num_devs=%d, shared (ram) size=%d MB, opts=0x%x, "
"every_nth=%d(curr:%d)
\n
"
"sector_size=%d bytes, cylinders=%d, heads=%d, sectors=%d, "
"delay=%d
\n
number of aborts=%d, device_reset=%d, bus_resets=%d, "
"delay=%d, max_luns=%d, scsi_level=%d
\n
"
"sector_size=%d bytes, cylinders=%d, heads=%d, sectors=%d
\n
"
"number of aborts=%d, device_reset=%d, bus_resets=%d, "
"host_resets=%d
\n
"
,
scsi_debug_version_str
,
scsi_debug_num_devs
,
scsi_debug_dev_size_mb
,
scsi_debug_opts
,
scsi_debug_every_nth
,
scsi_debug_cmnd_count
,
SECT_SIZE
,
N_CYLINDER
,
N_HEAD
,
N_SECTOR
,
scsi_debug_delay
,
scsi_debug_cmnd_count
,
scsi_debug_delay
,
scsi_debug_max_luns
,
scsi_debug_scsi_level
,
SECT_SIZE
,
N_CYLINDER
,
N_HEAD
,
N_SECTOR
,
num_aborts
,
num_dev_resets
,
num_bus_resets
,
num_host_resets
);
if
(
pos
<
offset
)
{
len
=
0
;
...
...
@@ -1253,8 +1369,7 @@ static int scsi_debug_proc_info(char *buffer, char **start, off_t offset,
len
-=
(
offset
-
begin
);
if
(
len
>
length
)
len
=
length
;
return
(
len
);
return
len
;
}
#ifdef DRIVERFS_SUPPORT
...
...
@@ -1280,7 +1395,6 @@ static ssize_t sdebug_delay_write(struct device_driver * ddp,
}
return
-
EINVAL
;
}
DRIVER_ATTR
(
delay
,
S_IRUGO
|
S_IWUSR
,
sdebug_delay_read
,
sdebug_delay_write
)
...
...
@@ -1312,7 +1426,6 @@ static ssize_t sdebug_opts_write(struct device_driver * ddp,
scsi_debug_opts
=
opts
;
return
count
;
}
DRIVER_ATTR
(
opts
,
S_IRUGO
|
S_IWUSR
,
sdebug_opts_read
,
sdebug_opts_write
)
...
...
@@ -1321,18 +1434,53 @@ static ssize_t sdebug_num_devs_read(struct device_driver * ddp, char * buf,
{
return
off
?
0
:
snprintf
(
buf
,
count
,
"%d
\n
"
,
scsi_debug_num_devs
);
}
DRIVER_ATTR
(
num_devs
,
S_IRUGO
,
sdebug_num_devs_read
,
NULL
)
static
ssize_t
sdebug_dev_size_mb_read
(
struct
device_driver
*
ddp
,
char
*
buf
,
size_t
count
,
loff_t
off
)
{
return
off
?
0
:
snprintf
(
buf
,
count
,
"%d
\n
"
,
scsi_debug_dev_size_mb
);
}
DRIVER_ATTR
(
dev_size_mb
,
S_IRUGO
,
sdebug_dev_size_mb_read
,
NULL
)
static
ssize_t
sdebug_every_nth_read
(
struct
device_driver
*
ddp
,
char
*
buf
,
size_t
count
,
loff_t
off
)
{
return
off
?
0
:
snprintf
(
buf
,
count
,
"%d
\n
"
,
scsi_debug_every_nth
);
}
DRIVER_ATTR
(
every_nth
,
S_IRUGO
,
sdebug_every_nth_read
,
NULL
)
static
ssize_t
sdebug_max_luns_read
(
struct
device_driver
*
ddp
,
char
*
buf
,
size_t
count
,
loff_t
off
)
{
return
off
?
0
:
snprintf
(
buf
,
count
,
"%d
\n
"
,
scsi_debug_max_luns
);
}
DRIVER_ATTR
(
max_luns
,
S_IRUGO
,
sdebug_max_luns_read
,
NULL
)
static
ssize_t
sdebug_scsi_level_read
(
struct
device_driver
*
ddp
,
char
*
buf
,
size_t
count
,
loff_t
off
)
{
return
off
?
0
:
snprintf
(
buf
,
count
,
"%d
\n
"
,
scsi_debug_scsi_level
);
}
DRIVER_ATTR
(
scsi_level
,
S_IRUGO
,
sdebug_scsi_level_read
,
NULL
)
static
void
do_create_driverfs_files
()
{
driver_create_file
(
&
sdebug_driverfs_driver
,
&
driver_attr_delay
);
driver_create_file
(
&
sdebug_driverfs_driver
,
&
driver_attr_opts
);
driver_create_file
(
&
sdebug_driverfs_driver
,
&
driver_attr_num_devs
);
driver_create_file
(
&
sdebug_driverfs_driver
,
&
driver_attr_dev_size_mb
);
driver_create_file
(
&
sdebug_driverfs_driver
,
&
driver_attr_every_nth
);
driver_create_file
(
&
sdebug_driverfs_driver
,
&
driver_attr_max_luns
);
driver_create_file
(
&
sdebug_driverfs_driver
,
&
driver_attr_scsi_level
);
}
static
void
do_remove_driverfs_files
()
{
driver_remove_file
(
&
sdebug_driverfs_driver
,
&
driver_attr_scsi_level
);
driver_remove_file
(
&
sdebug_driverfs_driver
,
&
driver_attr_max_luns
);
driver_remove_file
(
&
sdebug_driverfs_driver
,
&
driver_attr_every_nth
);
driver_remove_file
(
&
sdebug_driverfs_driver
,
&
driver_attr_dev_size_mb
);
driver_remove_file
(
&
sdebug_driverfs_driver
,
&
driver_attr_num_devs
);
driver_remove_file
(
&
sdebug_driverfs_driver
,
&
driver_attr_opts
);
driver_remove_file
(
&
sdebug_driverfs_driver
,
&
driver_attr_delay
);
...
...
drivers/scsi/scsi_debug.h
View file @
788c551c
...
...
@@ -3,17 +3,20 @@
#include <linux/types.h>
#include <linux/kdev_t.h>
static
int
scsi_debug_detect
(
Scsi_Host_Template
*
);
static
int
scsi_debug_detect
(
struct
SHT
*
);
static
int
scsi_debug_slave_attach
(
struct
scsi_device
*
);
static
void
scsi_debug_slave_detach
(
struct
scsi_device
*
);
static
int
scsi_debug_release
(
struct
Scsi_Host
*
);
/* static int scsi_debug_command(Scsi_Cmnd *); */
static
int
scsi_debug_queuecommand
(
Scsi_Cmnd
*
,
void
(
*
done
)
(
Scsi_Cmnd
*
));
static
int
scsi_debug_ioctl
(
Scsi_Device
*
,
int
,
void
*
);
/* static int scsi_debug_command(struct scsi_cmnd *); */
static
int
scsi_debug_queuecommand
(
struct
scsi_cmnd
*
,
void
(
*
done
)
(
struct
scsi_cmnd
*
));
static
int
scsi_debug_ioctl
(
struct
scsi_device
*
,
int
,
void
*
);
static
int
scsi_debug_biosparam
(
struct
scsi_device
*
,
struct
block_device
*
,
sector_t
,
int
[]);
static
int
scsi_debug_abort
(
Scsi_C
mnd
*
);
static
int
scsi_debug_bus_reset
(
Scsi_C
mnd
*
);
static
int
scsi_debug_device_reset
(
Scsi_C
mnd
*
);
static
int
scsi_debug_host_reset
(
Scsi_C
mnd
*
);
static
int
scsi_debug_abort
(
struct
scsi_c
mnd
*
);
static
int
scsi_debug_bus_reset
(
struct
scsi_c
mnd
*
);
static
int
scsi_debug_device_reset
(
struct
scsi_c
mnd
*
);
static
int
scsi_debug_host_reset
(
struct
scsi_c
mnd
*
);
static
int
scsi_debug_proc_info
(
char
*
,
char
**
,
off_t
,
int
,
int
,
int
);
static
const
char
*
scsi_debug_info
(
struct
Scsi_Host
*
);
...
...
@@ -33,6 +36,8 @@ static Scsi_Host_Template driver_template = {
.
name
=
"SCSI DEBUG"
,
.
info
=
scsi_debug_info
,
.
detect
=
scsi_debug_detect
,
.
slave_attach
=
scsi_debug_slave_attach
,
.
slave_detach
=
scsi_debug_slave_detach
,
.
release
=
scsi_debug_release
,
.
ioctl
=
scsi_debug_ioctl
,
.
queuecommand
=
scsi_debug_queuecommand
,
...
...
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