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
35d91f75
Commit
35d91f75
authored
Sep 12, 2005
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge master.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-for-linus-2.6
parents
9401c705
70c83e11
Changes
22
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
22 changed files
with
1648 additions
and
146 deletions
+1648
-146
Documentation/scsi/00-INDEX
Documentation/scsi/00-INDEX
+2
-0
Documentation/scsi/scsi_eh.txt
Documentation/scsi/scsi_eh.txt
+479
-0
drivers/block/scsi_ioctl.c
drivers/block/scsi_ioctl.c
+1
-0
drivers/ieee1394/sbp2.c
drivers/ieee1394/sbp2.c
+4
-4
drivers/scsi/3w-9xxx.c
drivers/scsi/3w-9xxx.c
+24
-6
drivers/scsi/Kconfig
drivers/scsi/Kconfig
+7
-0
drivers/scsi/Makefile
drivers/scsi/Makefile
+1
-0
drivers/scsi/lpfc/lpfc_attr.c
drivers/scsi/lpfc/lpfc_attr.c
+10
-12
drivers/scsi/lpfc/lpfc_hbadisc.c
drivers/scsi/lpfc/lpfc_hbadisc.c
+2
-5
drivers/scsi/lpfc/lpfc_hw.h
drivers/scsi/lpfc/lpfc_hw.h
+11
-6
drivers/scsi/lpfc/lpfc_init.c
drivers/scsi/lpfc/lpfc_init.c
+2
-5
drivers/scsi/qla2xxx/qla_attr.c
drivers/scsi/qla2xxx/qla_attr.c
+8
-10
drivers/scsi/qla2xxx/qla_init.c
drivers/scsi/qla2xxx/qla_init.c
+2
-2
drivers/scsi/scsi_lib.c
drivers/scsi/scsi_lib.c
+88
-50
drivers/scsi/scsi_priv.h
drivers/scsi/scsi_priv.h
+1
-0
drivers/scsi/scsi_scan.c
drivers/scsi/scsi_scan.c
+59
-29
drivers/scsi/scsi_sysfs.c
drivers/scsi/scsi_sysfs.c
+15
-13
drivers/scsi/scsi_transport_sas.c
drivers/scsi/scsi_transport_sas.c
+820
-0
drivers/scsi/sg.c
drivers/scsi/sg.c
+2
-2
include/scsi/scsi_device.h
include/scsi/scsi_device.h
+2
-2
include/scsi/scsi_transport_fc.h
include/scsi/scsi_transport_fc.h
+8
-0
include/scsi/scsi_transport_sas.h
include/scsi/scsi_transport_sas.h
+100
-0
No files found.
Documentation/scsi/00-INDEX
View file @
35d91f75
...
...
@@ -60,6 +60,8 @@ scsi.txt
- short blurb on using SCSI support as a module.
scsi_mid_low_api.txt
- info on API between SCSI layer and low level drivers
scsi_eh.txt
- info on SCSI midlayer error handling infrastructure
st.txt
- info on scsi tape driver
sym53c500_cs.txt
...
...
Documentation/scsi/scsi_eh.txt
0 → 100644
View file @
35d91f75
This diff is collapsed.
Click to expand it.
drivers/block/scsi_ioctl.c
View file @
35d91f75
...
...
@@ -123,6 +123,7 @@ static int verify_command(struct file *file, unsigned char *cmd)
safe_for_read
(
READ_12
),
safe_for_read
(
READ_16
),
safe_for_read
(
READ_BUFFER
),
safe_for_read
(
READ_DEFECT_DATA
),
safe_for_read
(
READ_LONG
),
safe_for_read
(
INQUIRY
),
safe_for_read
(
MODE_SENSE
),
...
...
drivers/ieee1394/sbp2.c
View file @
35d91f75
...
...
@@ -790,7 +790,7 @@ static void sbp2_host_reset(struct hpsb_host *host)
static
int
sbp2_start_device
(
struct
scsi_id_instance_data
*
scsi_id
)
{
struct
sbp2scsi_host_info
*
hi
=
scsi_id
->
hi
;
struct
scsi_device
*
sdev
;
int
error
;
SBP2_DEBUG
(
"sbp2_start_device"
);
...
...
@@ -939,10 +939,10 @@ static int sbp2_start_device(struct scsi_id_instance_data *scsi_id)
sbp2_max_speed_and_size
(
scsi_id
);
/* Add this device to the scsi layer now */
sdev
=
scsi_add_device
(
scsi_id
->
scsi_host
,
0
,
scsi_id
->
ud
->
id
,
0
);
if
(
IS_ERR
(
sdev
)
)
{
error
=
scsi_add_device
(
scsi_id
->
scsi_host
,
0
,
scsi_id
->
ud
->
id
,
0
);
if
(
error
)
{
SBP2_ERR
(
"scsi_add_device failed"
);
return
PTR_ERR
(
sdev
)
;
return
error
;
}
return
0
;
...
...
drivers/scsi/3w-9xxx.c
View file @
35d91f75
...
...
@@ -59,6 +59,7 @@
Fix 'handled=1' ISR usage, remove bogus IRQ check.
Remove un-needed eh_abort handler.
Add support for embedded firmware error strings.
2.26.02.003 - Correctly handle single sgl's with use_sg=1.
*/
#include <linux/module.h>
...
...
@@ -81,7 +82,7 @@
#include "3w-9xxx.h"
/* Globals */
#define TW_DRIVER_VERSION "2.26.02.00
2
"
#define TW_DRIVER_VERSION "2.26.02.00
3
"
static
TW_Device_Extension
*
twa_device_extension_list
[
TW_MAX_SLOT
];
static
unsigned
int
twa_device_extension_count
;
static
int
twa_major
=
-
1
;
...
...
@@ -1805,6 +1806,8 @@ static int twa_scsiop_execute_scsi(TW_Device_Extension *tw_dev, int request_id,
if
(
tw_dev
->
srb
[
request_id
]
->
request_bufflen
<
TW_MIN_SGL_LENGTH
)
{
command_packet
->
sg_list
[
0
].
address
=
tw_dev
->
generic_buffer_phys
[
request_id
];
command_packet
->
sg_list
[
0
].
length
=
TW_MIN_SGL_LENGTH
;
if
(
tw_dev
->
srb
[
request_id
]
->
sc_data_direction
==
DMA_TO_DEVICE
||
tw_dev
->
srb
[
request_id
]
->
sc_data_direction
==
DMA_BIDIRECTIONAL
)
memcpy
(
tw_dev
->
generic_buffer_virt
[
request_id
],
tw_dev
->
srb
[
request_id
]
->
request_buffer
,
tw_dev
->
srb
[
request_id
]
->
request_bufflen
);
}
else
{
buffaddr
=
twa_map_scsi_single_data
(
tw_dev
,
request_id
);
if
(
buffaddr
==
0
)
...
...
@@ -1823,6 +1826,12 @@ static int twa_scsiop_execute_scsi(TW_Device_Extension *tw_dev, int request_id,
if
(
tw_dev
->
srb
[
request_id
]
->
use_sg
>
0
)
{
if
((
tw_dev
->
srb
[
request_id
]
->
use_sg
==
1
)
&&
(
tw_dev
->
srb
[
request_id
]
->
request_bufflen
<
TW_MIN_SGL_LENGTH
))
{
if
(
tw_dev
->
srb
[
request_id
]
->
sc_data_direction
==
DMA_TO_DEVICE
||
tw_dev
->
srb
[
request_id
]
->
sc_data_direction
==
DMA_BIDIRECTIONAL
)
{
struct
scatterlist
*
sg
=
(
struct
scatterlist
*
)
tw_dev
->
srb
[
request_id
]
->
request_buffer
;
char
*
buf
=
kmap_atomic
(
sg
->
page
,
KM_IRQ0
)
+
sg
->
offset
;
memcpy
(
tw_dev
->
generic_buffer_virt
[
request_id
],
buf
,
sg
->
length
);
kunmap_atomic
(
buf
-
sg
->
offset
,
KM_IRQ0
);
}
command_packet
->
sg_list
[
0
].
address
=
tw_dev
->
generic_buffer_phys
[
request_id
];
command_packet
->
sg_list
[
0
].
length
=
TW_MIN_SGL_LENGTH
;
}
else
{
...
...
@@ -1888,11 +1897,20 @@ static int twa_scsiop_execute_scsi(TW_Device_Extension *tw_dev, int request_id,
/* This function completes an execute scsi operation */
static
void
twa_scsiop_execute_scsi_complete
(
TW_Device_Extension
*
tw_dev
,
int
request_id
)
{
/* Copy the response if too small */
if
((
tw_dev
->
srb
[
request_id
]
->
request_buffer
)
&&
(
tw_dev
->
srb
[
request_id
]
->
request_bufflen
<
TW_MIN_SGL_LENGTH
))
{
memcpy
(
tw_dev
->
srb
[
request_id
]
->
request_buffer
,
tw_dev
->
generic_buffer_virt
[
request_id
],
tw_dev
->
srb
[
request_id
]
->
request_bufflen
);
if
(
tw_dev
->
srb
[
request_id
]
->
request_bufflen
<
TW_MIN_SGL_LENGTH
&&
(
tw_dev
->
srb
[
request_id
]
->
sc_data_direction
==
DMA_FROM_DEVICE
||
tw_dev
->
srb
[
request_id
]
->
sc_data_direction
==
DMA_BIDIRECTIONAL
))
{
if
(
tw_dev
->
srb
[
request_id
]
->
use_sg
==
0
)
{
memcpy
(
tw_dev
->
srb
[
request_id
]
->
request_buffer
,
tw_dev
->
generic_buffer_virt
[
request_id
],
tw_dev
->
srb
[
request_id
]
->
request_bufflen
);
}
if
(
tw_dev
->
srb
[
request_id
]
->
use_sg
==
1
)
{
struct
scatterlist
*
sg
=
(
struct
scatterlist
*
)
tw_dev
->
srb
[
request_id
]
->
request_buffer
;
char
*
buf
=
kmap_atomic
(
sg
->
page
,
KM_IRQ0
)
+
sg
->
offset
;
memcpy
(
buf
,
tw_dev
->
generic_buffer_virt
[
request_id
],
sg
->
length
);
kunmap_atomic
(
buf
-
sg
->
offset
,
KM_IRQ0
);
}
}
}
/* End twa_scsiop_execute_scsi_complete() */
...
...
drivers/scsi/Kconfig
View file @
35d91f75
...
...
@@ -235,6 +235,13 @@ config SCSI_ISCSI_ATTRS
each
attached
iSCSI
device
to
sysfs
,
say
Y
.
Otherwise
,
say
N
.
config
SCSI_SAS_ATTRS
tristate
"SAS Transport Attributes"
depends
on
SCSI
help
If
you
wish
to
export
transport
-
specific
information
about
each
attached
SAS
device
to
sysfs
,
say
Y
.
endmenu
menu
"SCSI low-level drivers"
...
...
drivers/scsi/Makefile
View file @
35d91f75
...
...
@@ -31,6 +31,7 @@ obj-$(CONFIG_RAID_ATTRS) += raid_class.o
obj-$(CONFIG_SCSI_SPI_ATTRS)
+=
scsi_transport_spi.o
obj-$(CONFIG_SCSI_FC_ATTRS)
+=
scsi_transport_fc.o
obj-$(CONFIG_SCSI_ISCSI_ATTRS)
+=
scsi_transport_iscsi.o
obj-$(CONFIG_SCSI_SAS_ATTRS)
+=
scsi_transport_sas.o
obj-$(CONFIG_SCSI_AMIGA7XX)
+=
amiga7xx.o 53c7xx.o
obj-$(CONFIG_A3000_SCSI)
+=
a3000.o wd33c93.o
...
...
drivers/scsi/lpfc/lpfc_attr.c
View file @
35d91f75
...
...
@@ -966,21 +966,21 @@ static void
lpfc_get_host_fabric_name
(
struct
Scsi_Host
*
shost
)
{
struct
lpfc_hba
*
phba
=
(
struct
lpfc_hba
*
)
shost
->
hostdata
[
0
];
u64
nodename
;
u64
node
_
name
;
spin_lock_irq
(
shost
->
host_lock
);
if
((
phba
->
fc_flag
&
FC_FABRIC
)
||
((
phba
->
fc_topology
==
TOPOLOGY_LOOP
)
&&
(
phba
->
fc_flag
&
FC_PUBLIC_LOOP
)))
memcpy
(
&
nodename
,
&
phba
->
fc_fabparam
.
nodeName
,
sizeof
(
u64
)
);
node_name
=
wwn_to_u64
(
phba
->
fc_fabparam
.
nodeName
.
wwn
);
else
/* fabric is local port if there is no F/FL_Port */
memcpy
(
&
nodename
,
&
phba
->
fc_nodename
,
sizeof
(
u64
)
);
node_name
=
wwn_to_u64
(
phba
->
fc_nodename
.
wwn
);
spin_unlock_irq
(
shost
->
host_lock
);
fc_host_fabric_name
(
shost
)
=
be64_to_cpu
(
nodename
)
;
fc_host_fabric_name
(
shost
)
=
node_name
;
}
...
...
@@ -1103,21 +1103,20 @@ lpfc_get_starget_node_name(struct scsi_target *starget)
{
struct
Scsi_Host
*
shost
=
dev_to_shost
(
starget
->
dev
.
parent
);
struct
lpfc_hba
*
phba
=
(
struct
lpfc_hba
*
)
shost
->
hostdata
[
0
];
u
int64_t
node_name
=
0
;
u
64
node_name
=
0
;
struct
lpfc_nodelist
*
ndlp
=
NULL
;
spin_lock_irq
(
shost
->
host_lock
);
/* Search the mapped list for this target ID */
list_for_each_entry
(
ndlp
,
&
phba
->
fc_nlpmap_list
,
nlp_listp
)
{
if
(
starget
->
id
==
ndlp
->
nlp_sid
)
{
memcpy
(
&
node_name
,
&
ndlp
->
nlp_nodename
,
sizeof
(
struct
lpfc_name
));
node_name
=
wwn_to_u64
(
ndlp
->
nlp_nodename
.
wwn
);
break
;
}
}
spin_unlock_irq
(
shost
->
host_lock
);
fc_starget_node_name
(
starget
)
=
be64_to_cpu
(
node_name
)
;
fc_starget_node_name
(
starget
)
=
node_name
;
}
static
void
...
...
@@ -1125,21 +1124,20 @@ lpfc_get_starget_port_name(struct scsi_target *starget)
{
struct
Scsi_Host
*
shost
=
dev_to_shost
(
starget
->
dev
.
parent
);
struct
lpfc_hba
*
phba
=
(
struct
lpfc_hba
*
)
shost
->
hostdata
[
0
];
u
int64_t
port_name
=
0
;
u
64
port_name
=
0
;
struct
lpfc_nodelist
*
ndlp
=
NULL
;
spin_lock_irq
(
shost
->
host_lock
);
/* Search the mapped list for this target ID */
list_for_each_entry
(
ndlp
,
&
phba
->
fc_nlpmap_list
,
nlp_listp
)
{
if
(
starget
->
id
==
ndlp
->
nlp_sid
)
{
memcpy
(
&
port_name
,
&
ndlp
->
nlp_portname
,
sizeof
(
struct
lpfc_name
));
port_name
=
wwn_to_u64
(
ndlp
->
nlp_portname
.
wwn
);
break
;
}
}
spin_unlock_irq
(
shost
->
host_lock
);
fc_starget_port_name
(
starget
)
=
be64_to_cpu
(
port_name
)
;
fc_starget_port_name
(
starget
)
=
port_name
;
}
static
void
...
...
drivers/scsi/lpfc/lpfc_hbadisc.c
View file @
35d91f75
...
...
@@ -1017,13 +1017,10 @@ lpfc_register_remote_port(struct lpfc_hba * phba,
struct
fc_rport
*
rport
;
struct
lpfc_rport_data
*
rdata
;
struct
fc_rport_identifiers
rport_ids
;
uint64_t
wwn
;
/* Remote port has reappeared. Re-register w/ FC transport */
memcpy
(
&
wwn
,
&
ndlp
->
nlp_nodename
,
sizeof
(
uint64_t
));
rport_ids
.
node_name
=
be64_to_cpu
(
wwn
);
memcpy
(
&
wwn
,
&
ndlp
->
nlp_portname
,
sizeof
(
uint64_t
));
rport_ids
.
port_name
=
be64_to_cpu
(
wwn
);
rport_ids
.
node_name
=
wwn_to_u64
(
ndlp
->
nlp_nodename
.
wwn
);
rport_ids
.
port_name
=
wwn_to_u64
(
ndlp
->
nlp_portname
.
wwn
);
rport_ids
.
port_id
=
ndlp
->
nlp_DID
;
rport_ids
.
roles
=
FC_RPORT_ROLE_UNKNOWN
;
if
(
ndlp
->
nlp_type
&
NLP_FCP_TARGET
)
...
...
drivers/scsi/lpfc/lpfc_hw.h
View file @
35d91f75
...
...
@@ -262,12 +262,14 @@ struct lpfc_sli_ct_request {
#define FF_FRAME_SIZE 2048
struct
lpfc_name
{
union
{
struct
{
#ifdef __BIG_ENDIAN_BITFIELD
uint8_t
nameType
:
4
;
/* FC Word 0, bit 28:31 */
uint8_t
IEEEextMsn
:
4
;
/* FC Word 0, bit 24:27, bit 8:11 of IEEE ext */
uint8_t
nameType
:
4
;
/* FC Word 0, bit 28:31 */
uint8_t
IEEEextMsn
:
4
;
/* FC Word 0, bit 24:27, bit 8:11 of IEEE ext */
#else
/* __LITTLE_ENDIAN_BITFIELD */
uint8_t
IEEEextMsn
:
4
;
/* FC Word 0, bit 24:27, bit 8:11 of IEEE ext */
uint8_t
nameType
:
4
;
/* FC Word 0, bit 28:31 */
uint8_t
IEEEextMsn
:
4
;
/* FC Word 0, bit 24:27, bit 8:11 of IEEE ext */
uint8_t
nameType
:
4
;
/* FC Word 0, bit 28:31 */
#endif
#define NAME_IEEE 0x1
/* IEEE name - nameType */
...
...
@@ -276,8 +278,11 @@ struct lpfc_name {
#define NAME_IP_TYPE 0x4
/* IP address */
#define NAME_CCITT_TYPE 0xC
#define NAME_CCITT_GR_TYPE 0xE
uint8_t
IEEEextLsb
;
/* FC Word 0, bit 16:23, IEEE extended Lsb */
uint8_t
IEEE
[
6
];
/* FC IEEE address */
uint8_t
IEEEextLsb
;
/* FC Word 0, bit 16:23, IEEE extended Lsb */
uint8_t
IEEE
[
6
];
/* FC IEEE address */
};
uint8_t
wwn
[
8
];
};
};
struct
csp
{
...
...
drivers/scsi/lpfc/lpfc_init.c
View file @
35d91f75
...
...
@@ -1333,7 +1333,6 @@ lpfc_pci_probe_one(struct pci_dev *pdev, const struct pci_device_id *pid)
unsigned
long
bar0map_len
,
bar2map_len
;
int
error
=
-
ENODEV
,
retval
;
int
i
;
u64
wwname
;
if
(
pci_enable_device
(
pdev
))
goto
out
;
...
...
@@ -1524,10 +1523,8 @@ lpfc_pci_probe_one(struct pci_dev *pdev, const struct pci_device_id *pid)
* Must done after lpfc_sli_hba_setup()
*/
memcpy
(
&
wwname
,
&
phba
->
fc_nodename
,
sizeof
(
u64
));
fc_host_node_name
(
host
)
=
be64_to_cpu
(
wwname
);
memcpy
(
&
wwname
,
&
phba
->
fc_portname
,
sizeof
(
u64
));
fc_host_port_name
(
host
)
=
be64_to_cpu
(
wwname
);
fc_host_node_name
(
host
)
=
wwn_to_u64
(
phba
->
fc_nodename
.
wwn
);
fc_host_port_name
(
host
)
=
wwn_to_u64
(
phba
->
fc_portname
.
wwn
);
fc_host_supported_classes
(
host
)
=
FC_COS_CLASS3
;
memset
(
fc_host_supported_fc4s
(
host
),
0
,
...
...
drivers/scsi/qla2xxx/qla_attr.c
View file @
35d91f75
...
...
@@ -360,16 +360,16 @@ qla2x00_get_starget_node_name(struct scsi_target *starget)
struct
Scsi_Host
*
host
=
dev_to_shost
(
starget
->
dev
.
parent
);
scsi_qla_host_t
*
ha
=
to_qla_host
(
host
);
fc_port_t
*
fcport
;
u
int64_t
node_name
=
0
;
u
64
node_name
=
0
;
list_for_each_entry
(
fcport
,
&
ha
->
fcports
,
list
)
{
if
(
starget
->
id
==
fcport
->
os_target_id
)
{
node_name
=
*
(
uint64_t
*
)
fcport
->
node_name
;
node_name
=
wwn_to_u64
(
fcport
->
node_name
)
;
break
;
}
}
fc_starget_node_name
(
starget
)
=
be64_to_cpu
(
node_name
)
;
fc_starget_node_name
(
starget
)
=
node_name
;
}
static
void
...
...
@@ -378,16 +378,16 @@ qla2x00_get_starget_port_name(struct scsi_target *starget)
struct
Scsi_Host
*
host
=
dev_to_shost
(
starget
->
dev
.
parent
);
scsi_qla_host_t
*
ha
=
to_qla_host
(
host
);
fc_port_t
*
fcport
;
u
int64_t
port_name
=
0
;
u
64
port_name
=
0
;
list_for_each_entry
(
fcport
,
&
ha
->
fcports
,
list
)
{
if
(
starget
->
id
==
fcport
->
os_target_id
)
{
port_name
=
*
(
uint64_t
*
)
fcport
->
port_name
;
port_name
=
wwn_to_u64
(
fcport
->
port_name
)
;
break
;
}
}
fc_starget_port_name
(
starget
)
=
be64_to_cpu
(
port_name
)
;
fc_starget_port_name
(
starget
)
=
port_name
;
}
static
void
...
...
@@ -460,9 +460,7 @@ struct fc_function_template qla2xxx_transport_functions = {
void
qla2x00_init_host_attr
(
scsi_qla_host_t
*
ha
)
{
fc_host_node_name
(
ha
->
host
)
=
be64_to_cpu
(
*
(
uint64_t
*
)
ha
->
init_cb
->
node_name
);
fc_host_port_name
(
ha
->
host
)
=
be64_to_cpu
(
*
(
uint64_t
*
)
ha
->
init_cb
->
port_name
);
fc_host_node_name
(
ha
->
host
)
=
wwn_to_u64
(
ha
->
init_cb
->
node_name
);
fc_host_port_name
(
ha
->
host
)
=
wwn_to_u64
(
ha
->
init_cb
->
port_name
);
fc_host_supported_classes
(
ha
->
host
)
=
FC_COS_CLASS3
;
}
drivers/scsi/qla2xxx/qla_init.c
View file @
35d91f75
...
...
@@ -2066,8 +2066,8 @@ qla2x00_reg_remote_port(scsi_qla_host_t *ha, fc_port_t *fcport)
return
;
}
rport_ids
.
node_name
=
be64_to_cpu
(
*
(
uint64_t
*
)
fcport
->
node_name
);
rport_ids
.
port_name
=
be64_to_cpu
(
*
(
uint64_t
*
)
fcport
->
port_name
);
rport_ids
.
node_name
=
wwn_to_u64
(
fcport
->
node_name
);
rport_ids
.
port_name
=
wwn_to_u64
(
fcport
->
port_name
);
rport_ids
.
port_id
=
fcport
->
d_id
.
b
.
domain
<<
16
|
fcport
->
d_id
.
b
.
area
<<
8
|
fcport
->
d_id
.
b
.
al_pa
;
rport_ids
.
roles
=
FC_RPORT_ROLE_UNKNOWN
;
...
...
drivers/scsi/scsi_lib.c
View file @
35d91f75
This diff is collapsed.
Click to expand it.
drivers/scsi/scsi_priv.h
View file @
35d91f75
...
...
@@ -124,6 +124,7 @@ extern void scsi_sysfs_unregister(void);
extern
void
scsi_sysfs_device_initialize
(
struct
scsi_device
*
);
extern
int
scsi_sysfs_target_initialize
(
struct
scsi_device
*
);
extern
struct
scsi_transport_template
blank_transport_template
;
extern
void
__scsi_remove_device
(
struct
scsi_device
*
);
extern
struct
bus_type
scsi_bus_type
;
...
...
drivers/scsi/scsi_scan.c
View file @
35d91f75
...
...
@@ -870,8 +870,12 @@ static int scsi_probe_and_add_lun(struct scsi_target *starget,
out_free_sdev:
if
(
res
==
SCSI_SCAN_LUN_PRESENT
)
{
if
(
sdevp
)
{
scsi_device_get
(
sdev
);
*
sdevp
=
sdev
;
if
(
scsi_device_get
(
sdev
)
==
0
)
{
*
sdevp
=
sdev
;
}
else
{
__scsi_remove_device
(
sdev
);
res
=
SCSI_SCAN_NO_RESPONSE
;
}
}
}
else
{
if
(
sdev
->
host
->
hostt
->
slave_destroy
)
...
...
@@ -1260,6 +1264,19 @@ struct scsi_device *__scsi_add_device(struct Scsi_Host *shost, uint channel,
}
EXPORT_SYMBOL
(
__scsi_add_device
);
int
scsi_add_device
(
struct
Scsi_Host
*
host
,
uint
channel
,
uint
target
,
uint
lun
)
{
struct
scsi_device
*
sdev
=
__scsi_add_device
(
host
,
channel
,
target
,
lun
,
NULL
);
if
(
IS_ERR
(
sdev
))
return
PTR_ERR
(
sdev
);
scsi_device_put
(
sdev
);
return
0
;
}
EXPORT_SYMBOL
(
scsi_add_device
);
void
scsi_rescan_device
(
struct
device
*
dev
)
{
struct
scsi_driver
*
drv
;
...
...
@@ -1276,27 +1293,8 @@ void scsi_rescan_device(struct device *dev)
}
EXPORT_SYMBOL
(
scsi_rescan_device
);
/**
* scsi_scan_target - scan a target id, possibly including all LUNs on the
* target.
* @sdevsca: Scsi_Device handle for scanning
* @shost: host to scan
* @channel: channel to scan
* @id: target id to scan
*
* Description:
* Scan the target id on @shost, @channel, and @id. Scan at least LUN
* 0, and possibly all LUNs on the target id.
*
* Use the pre-allocated @sdevscan as a handle for the scanning. This
* function sets sdevscan->host, sdevscan->id and sdevscan->lun; the
* scanning functions modify sdevscan->lun.
*
* First try a REPORT LUN scan, if that does not scan the target, do a
* sequential scan of LUNs on the target id.
**/
void
scsi_scan_target
(
struct
device
*
parent
,
unsigned
int
channel
,
unsigned
int
id
,
unsigned
int
lun
,
int
rescan
)
static
void
__scsi_scan_target
(
struct
device
*
parent
,
unsigned
int
channel
,
unsigned
int
id
,
unsigned
int
lun
,
int
rescan
)
{
struct
Scsi_Host
*
shost
=
dev_to_shost
(
parent
);
int
bflags
=
0
;
...
...
@@ -1310,9 +1308,7 @@ void scsi_scan_target(struct device *parent, unsigned int channel,
*/
return
;
starget
=
scsi_alloc_target
(
parent
,
channel
,
id
);
if
(
!
starget
)
return
;
...
...
@@ -1358,6 +1354,33 @@ void scsi_scan_target(struct device *parent, unsigned int channel,
put_device
(
&
starget
->
dev
);
}
/**
* scsi_scan_target - scan a target id, possibly including all LUNs on the
* target.
* @parent: host to scan
* @channel: channel to scan
* @id: target id to scan
* @lun: Specific LUN to scan or SCAN_WILD_CARD
* @rescan: passed to LUN scanning routines
*
* Description:
* Scan the target id on @parent, @channel, and @id. Scan at least LUN 0,
* and possibly all LUNs on the target id.
*
* First try a REPORT LUN scan, if that does not scan the target, do a
* sequential scan of LUNs on the target id.
**/
void
scsi_scan_target
(
struct
device
*
parent
,
unsigned
int
channel
,
unsigned
int
id
,
unsigned
int
lun
,
int
rescan
)
{
struct
Scsi_Host
*
shost
=
dev_to_shost
(
parent
);
down
(
&
shost
->
scan_mutex
);
if
(
scsi_host_scan_allowed
(
shost
))
__scsi_scan_target
(
parent
,
channel
,
id
,
lun
,
rescan
);
up
(
&
shost
->
scan_mutex
);
}
EXPORT_SYMBOL
(
scsi_scan_target
);
static
void
scsi_scan_channel
(
struct
Scsi_Host
*
shost
,
unsigned
int
channel
,
...
...
@@ -1383,10 +1406,12 @@ static void scsi_scan_channel(struct Scsi_Host *shost, unsigned int channel,
order_id
=
shost
->
max_id
-
id
-
1
;
else
order_id
=
id
;
scsi_scan_target
(
&
shost
->
shost_gendev
,
channel
,
order_id
,
lun
,
rescan
);
__scsi_scan_target
(
&
shost
->
shost_gendev
,
channel
,
order_id
,
lun
,
rescan
);
}
else
scsi_scan_target
(
&
shost
->
shost_gendev
,
channel
,
id
,
lun
,
rescan
);
__scsi_scan_target
(
&
shost
->
shost_gendev
,
channel
,
id
,
lun
,
rescan
);
}
int
scsi_scan_host_selected
(
struct
Scsi_Host
*
shost
,
unsigned
int
channel
,
...
...
@@ -1484,12 +1509,15 @@ void scsi_forget_host(struct Scsi_Host *shost)
*/
struct
scsi_device
*
scsi_get_host_dev
(
struct
Scsi_Host
*
shost
)
{
struct
scsi_device
*
sdev
;
struct
scsi_device
*
sdev
=
NULL
;
struct
scsi_target
*
starget
;
down
(
&
shost
->
scan_mutex
);
if
(
!
scsi_host_scan_allowed
(
shost
))
goto
out
;
starget
=
scsi_alloc_target
(
&
shost
->
shost_gendev
,
0
,
shost
->
this_id
);
if
(
!
starget
)
return
NULL
;
goto
out
;
sdev
=
scsi_alloc_sdev
(
starget
,
0
,
NULL
);
if
(
sdev
)
{
...
...
@@ -1497,6 +1525,8 @@ struct scsi_device *scsi_get_host_dev(struct Scsi_Host *shost)
sdev
->
borken
=
0
;
}
put_device
(
&
starget
->
dev
);
out:
up
(
&
shost
->
scan_mutex
);
return
sdev
;
}
EXPORT_SYMBOL
(
scsi_get_host_dev
);
...
...
drivers/scsi/scsi_sysfs.c
View file @
35d91f75
...
...
@@ -653,7 +653,7 @@ int scsi_sysfs_add_sdev(struct scsi_device *sdev)
error
=
attr_add
(
&
sdev
->
sdev_gendev
,
sdev
->
host
->
hostt
->
sdev_attrs
[
i
]);
if
(
error
)
{
scsi_remove_device
(
sdev
);
__
scsi_remove_device
(
sdev
);
goto
out
;
}
}
...
...
@@ -667,7 +667,7 @@ int scsi_sysfs_add_sdev(struct scsi_device *sdev)
scsi_sysfs_sdev_attrs
[
i
]);
error
=
device_create_file
(
&
sdev
->
sdev_gendev
,
attr
);
if
(
error
)
{
scsi_remove_device
(
sdev
);
__
scsi_remove_device
(
sdev
);
goto
out
;
}
}
...
...
@@ -687,17 +687,10 @@ int scsi_sysfs_add_sdev(struct scsi_device *sdev)
return
error
;
}
/**
* scsi_remove_device - unregister a device from the scsi bus
* @sdev: scsi_device to unregister
**/
void
scsi_remove_device
(
struct
scsi_device
*
sdev
)
void
__scsi_remove_device
(
struct
scsi_device
*
sdev
)
{
struct
Scsi_Host
*
shost
=
sdev
->
host
;
down
(
&
shost
->
scan_mutex
);
if
(
scsi_device_set_state
(
sdev
,
SDEV_CANCEL
)
!=
0
)
goto
out
;
return
;
class_device_unregister
(
&
sdev
->
sdev_classdev
);
device_del
(
&
sdev
->
sdev_gendev
);
...
...
@@ -706,8 +699,17 @@ void scsi_remove_device(struct scsi_device *sdev)
sdev
->
host
->
hostt
->
slave_destroy
(
sdev
);
transport_unregister_device
(
&
sdev
->
sdev_gendev
);
put_device
(
&
sdev
->
sdev_gendev
);
out:
up
(
&
shost
->
scan_mutex
);
}
/**
* scsi_remove_device - unregister a device from the scsi bus
* @sdev: scsi_device to unregister
**/
void
scsi_remove_device
(
struct
scsi_device
*
sdev
)
{
down
(
&
sdev
->
host
->
scan_mutex
);
__scsi_remove_device
(
sdev
);
up
(
&
sdev
->
host
->
scan_mutex
);
}
EXPORT_SYMBOL
(
scsi_remove_device
);
...
...
drivers/scsi/scsi_transport_sas.c
0 → 100644
View file @
35d91f75
This diff is collapsed.
Click to expand it.
drivers/scsi/sg.c
View file @
35d91f75
...
...
@@ -61,7 +61,7 @@ static int sg_version_num = 30533; /* 2 digits for each component */
#ifdef CONFIG_SCSI_PROC_FS
#include <linux/proc_fs.h>
static
char
*
sg_version_date
=
"2005090
1
"
;
static
char
*
sg_version_date
=
"2005090
8
"
;
static
int
sg_proc_init
(
void
);
static
void
sg_proc_cleanup
(
void
);
...
...
@@ -1299,7 +1299,7 @@ sg_mmap(struct file *filp, struct vm_area_struct *vma)
sg_rb_correct4mmap
(
rsv_schp
,
1
);
/* do only once per fd lifetime */
sfp
->
mmap_called
=
1
;
}
vma
->
vm_flags
|=
(
VM_RESERVED
|
VM_IO
)
;
vma
->
vm_flags
|=
VM_RESERVED
;
vma
->
vm_private_data
=
sfp
;
vma
->
vm_ops
=
&
sg_mmap_vm_ops
;
return
0
;
...
...
include/scsi/scsi_device.h
View file @
35d91f75
...
...
@@ -178,8 +178,8 @@ static inline struct scsi_target *scsi_target(struct scsi_device *sdev)
extern
struct
scsi_device
*
__scsi_add_device
(
struct
Scsi_Host
*
,
uint
,
uint
,
uint
,
void
*
hostdata
);
#define scsi_add_device(host, channel, target, lun) \
__scsi_add_device(host, channel, target, lun, NULL)
extern
int
scsi_add_device
(
struct
Scsi_Host
*
host
,
uint
channel
,
uint
target
,
uint
lun
);
extern
void
scsi_remove_device
(
struct
scsi_device
*
);
extern
int
scsi_device_cancel
(
struct
scsi_device
*
,
int
);
...
...
include/scsi/scsi_transport_fc.h
View file @
35d91f75
...
...
@@ -439,4 +439,12 @@ int fc_remote_port_block(struct fc_rport *rport);
void
fc_remote_port_unblock
(
struct
fc_rport
*
rport
);
int
scsi_is_fc_rport
(
const
struct
device
*
);
static
inline
u64
wwn_to_u64
(
u8
*
wwn
)
{
return
(
u64
)
wwn
[
0
]
<<
56
|
(
u64
)
wwn
[
1
]
<<
48
|
(
u64
)
wwn
[
2
]
<<
40
|
(
u64
)
wwn
[
3
]
<<
32
|
(
u64
)
wwn
[
4
]
<<
24
|
(
u64
)
wwn
[
5
]
<<
16
|
(
u64
)
wwn
[
6
]
<<
8
|
(
u64
)
wwn
[
7
];
}
#endif
/* SCSI_TRANSPORT_FC_H */
include/scsi/scsi_transport_sas.h
0 → 100644
View file @
35d91f75
#ifndef SCSI_TRANSPORT_SAS_H
#define SCSI_TRANSPORT_SAS_H
#include <linux/transport_class.h>
#include <linux/types.h>
struct
scsi_transport_template
;
struct
sas_rphy
;
enum
sas_device_type
{
SAS_PHY_UNUSED
,
SAS_END_DEVICE
,
SAS_EDGE_EXPANDER_DEVICE
,
SAS_FANOUT_EXPANDER_DEVICE
,
};
enum
sas_protocol
{
SAS_PROTOCOL_SATA
=
0x01
,
SAS_PROTOCOL_SMP
=
0x02
,
SAS_PROTOCOL_STP
=
0x04
,
SAS_PROTOCOL_SSP
=
0x08
,
};
enum
sas_linkrate
{
SAS_LINK_RATE_UNKNOWN
,
SAS_PHY_DISABLED
,
SAS_LINK_RATE_FAILED
,
SAS_SATA_SPINUP_HOLD
,
SAS_SATA_PORT_SELECTOR
,
SAS_LINK_RATE_1_5_GBPS
,
SAS_LINK_RATE_3_0_GBPS
,
SAS_LINK_VIRTUAL
,
};
struct
sas_identify
{
enum
sas_device_type
device_type
;
enum
sas_protocol
initiator_port_protocols
;
enum
sas_protocol
target_port_protocols
;
u64
sas_address
;
u8
phy_identifier
;
};
/* The functions by which the transport class and the driver communicate */
struct
sas_function_template
{
};
struct
sas_phy
{
struct
device
dev
;
int
number
;
struct
sas_identify
identify
;
enum
sas_linkrate
negotiated_linkrate
;
enum
sas_linkrate
minimum_linkrate_hw
;
enum
sas_linkrate
minimum_linkrate
;
enum
sas_linkrate
maximum_linkrate_hw
;
enum
sas_linkrate
maximum_linkrate
;
u8
port_identifier
;
struct
sas_rphy
*
rphy
;
};
#define dev_to_phy(d) \
container_of((d), struct sas_phy, dev)
#define transport_class_to_phy(cdev) \
dev_to_phy((cdev)->dev)
#define phy_to_shost(phy) \
dev_to_shost((phy)->dev.parent)
struct
sas_rphy
{
struct
device
dev
;
struct
sas_identify
identify
;
struct
list_head
list
;
u32
scsi_target_id
;
};
#define dev_to_rphy(d) \
container_of((d), struct sas_rphy, dev)
#define transport_class_to_rphy(cdev) \
dev_to_rphy((cdev)->dev)
#define rphy_to_shost(rphy) \
dev_to_shost((rphy)->dev.parent)
extern
void
sas_remove_host
(
struct
Scsi_Host
*
);
extern
struct
sas_phy
*
sas_phy_alloc
(
struct
device
*
,
int
);
extern
void
sas_phy_free
(
struct
sas_phy
*
);
extern
int
sas_phy_add
(
struct
sas_phy
*
);
extern
void
sas_phy_delete
(
struct
sas_phy
*
);
extern
int
scsi_is_sas_phy
(
const
struct
device
*
);
extern
struct
sas_rphy
*
sas_rphy_alloc
(
struct
sas_phy
*
);
void
sas_rphy_free
(
struct
sas_rphy
*
);
extern
int
sas_rphy_add
(
struct
sas_rphy
*
);
extern
void
sas_rphy_delete
(
struct
sas_rphy
*
);
extern
int
scsi_is_sas_rphy
(
const
struct
device
*
);
extern
struct
scsi_transport_template
*
sas_attach_transport
(
struct
sas_function_template
*
);
extern
void
sas_release_transport
(
struct
scsi_transport_template
*
);
#endif
/* SCSI_TRANSPORT_SAS_H */
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