Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
10
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Open sidebar
xcap
xcap-capability-linux
Commits
38a9a621
Commit
38a9a621
authored
Oct 28, 2005
by
James Bottomley
Browse files
Options
Browse Files
Download
Plain Diff
Merge HEAD from ../scsi-misc-2.6-old
parents
27d1097d
e75d5176
Changes
16
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
16 changed files
with
6095 additions
and
443 deletions
+6095
-443
drivers/scsi/Kconfig
drivers/scsi/Kconfig
+25
-1
drivers/scsi/Makefile
drivers/scsi/Makefile
+1
-0
drivers/scsi/aacraid/aachba.c
drivers/scsi/aacraid/aachba.c
+42
-15
drivers/scsi/aacraid/aacraid.h
drivers/scsi/aacraid/aacraid.h
+1
-1
drivers/scsi/aacraid/commctrl.c
drivers/scsi/aacraid/commctrl.c
+3
-3
drivers/scsi/aacraid/linit.c
drivers/scsi/aacraid/linit.c
+5
-5
drivers/scsi/dc395x.c
drivers/scsi/dc395x.c
+13
-0
drivers/scsi/iscsi_tcp.c
drivers/scsi/iscsi_tcp.c
+3642
-0
drivers/scsi/iscsi_tcp.h
drivers/scsi/iscsi_tcp.h
+322
-0
drivers/scsi/ncr53c8xx.c
drivers/scsi/ncr53c8xx.c
+11
-11
drivers/scsi/scsi_transport_iscsi.c
drivers/scsi/scsi_transport_iscsi.c
+1133
-247
drivers/scsi/sym53c8xx_defs.h
drivers/scsi/sym53c8xx_defs.h
+0
-13
drivers/scsi/tmscsim.c
drivers/scsi/tmscsim.c
+8
-0
include/scsi/iscsi_if.h
include/scsi/iscsi_if.h
+245
-0
include/scsi/iscsi_proto.h
include/scsi/iscsi_proto.h
+589
-0
include/scsi/scsi_transport_iscsi.h
include/scsi/scsi_transport_iscsi.h
+55
-147
No files found.
drivers/scsi/Kconfig
View file @
38a9a621
...
@@ -229,7 +229,7 @@ config SCSI_FC_ATTRS
...
@@ -229,7 +229,7 @@ config SCSI_FC_ATTRS
config
SCSI_ISCSI_ATTRS
config
SCSI_ISCSI_ATTRS
tristate
"iSCSI Transport Attributes"
tristate
"iSCSI Transport Attributes"
depends
on
SCSI
depends
on
SCSI
&&
NET
help
help
If
you
wish
to
export
transport
-
specific
information
about
If
you
wish
to
export
transport
-
specific
information
about
each
attached
iSCSI
device
to
sysfs
,
say
Y
.
each
attached
iSCSI
device
to
sysfs
,
say
Y
.
...
@@ -247,6 +247,30 @@ endmenu
...
@@ -247,6 +247,30 @@ endmenu
menu
"SCSI low-level drivers"
menu
"SCSI low-level drivers"
depends
on
SCSI
!=n
depends
on
SCSI
!=n
config
ISCSI_TCP
tristate
"iSCSI Initiator over TCP/IP"
depends
on
SCSI
&&
INET
select
CRYPTO
select
CRYPTO_MD5
select
CRYPTO_CRC32C
select
SCSI_ISCSI_ATTRS
help
The
iSCSI
Driver
provides
a
host
with
the
ability
to
access
storage
through
an
IP
network
.
The
driver
uses
the
iSCSI
protocol
to
transport
SCSI
requests
and
responses
over
a
TCP
/
IP
network
between
the
host
(
the
"initiator"
)
and
"targets"
.
Architecturally
,
the
iSCSI
driver
combines
with
the
host
's TCP/IP stack, network drivers, and Network
Interface Card (NIC) to provide the same functions as a SCSI or a
Fibre Channel (FC) adapter driver with a Host Bus Adapter (HBA).
To compile this driver as a module, choose M here: the
module will be called iscsi_tcp.
The userspace component needed to initialize the driver, documentation,
and sample configuration files can be found here:
http://linux-iscsi.sf.net
config SGIWD93_SCSI
config SGIWD93_SCSI
tristate "SGI WD93C93 SCSI Driver"
tristate "SGI WD93C93 SCSI Driver"
depends on SGI_IP22 && SCSI
depends on SGI_IP22 && SCSI
...
...
drivers/scsi/Makefile
View file @
38a9a621
...
@@ -33,6 +33,7 @@ obj-$(CONFIG_SCSI_FC_ATTRS) += scsi_transport_fc.o
...
@@ -33,6 +33,7 @@ obj-$(CONFIG_SCSI_FC_ATTRS) += scsi_transport_fc.o
obj-$(CONFIG_SCSI_ISCSI_ATTRS)
+=
scsi_transport_iscsi.o
obj-$(CONFIG_SCSI_ISCSI_ATTRS)
+=
scsi_transport_iscsi.o
obj-$(CONFIG_SCSI_SAS_ATTRS)
+=
scsi_transport_sas.o
obj-$(CONFIG_SCSI_SAS_ATTRS)
+=
scsi_transport_sas.o
obj-$(CONFIG_ISCSI_TCP)
+=
iscsi_tcp.o
obj-$(CONFIG_SCSI_AMIGA7XX)
+=
amiga7xx.o 53c7xx.o
obj-$(CONFIG_SCSI_AMIGA7XX)
+=
amiga7xx.o 53c7xx.o
obj-$(CONFIG_A3000_SCSI)
+=
a3000.o wd33c93.o
obj-$(CONFIG_A3000_SCSI)
+=
a3000.o wd33c93.o
obj-$(CONFIG_A2091_SCSI)
+=
a2091.o wd33c93.o
obj-$(CONFIG_A2091_SCSI)
+=
a2091.o wd33c93.o
...
...
drivers/scsi/aacraid/aachba.c
View file @
38a9a621
...
@@ -608,17 +608,43 @@ static char *container_types[] = {
...
@@ -608,17 +608,43 @@ static char *container_types[] = {
* files instead of in OS dependant driver source.
* files instead of in OS dependant driver source.
*/
*/
static
void
setinqstr
(
int
devtype
,
void
*
data
,
int
tindex
)
static
void
setinqstr
(
struct
aac_dev
*
dev
,
void
*
data
,
int
tindex
)
{
{
struct
scsi_inq
*
str
;
struct
scsi_inq
*
str
;
struct
aac_driver_ident
*
mp
;
mp
=
aac_get_driver_ident
(
devtype
);
str
=
(
struct
scsi_inq
*
)(
data
);
/* cast data to scsi inq block */
str
=
(
struct
scsi_inq
*
)(
data
);
/* cast data to scsi inq block */
memset
(
str
,
' '
,
sizeof
(
*
str
));
inqstrcpy
(
mp
->
vname
,
str
->
vid
);
inqstrcpy
(
mp
->
model
,
str
->
pid
);
/* last six chars reserved for vol type */
if
(
dev
->
supplement_adapter_info
.
AdapterTypeText
[
0
])
{
char
*
cp
=
dev
->
supplement_adapter_info
.
AdapterTypeText
;
int
c
=
sizeof
(
str
->
vid
);
while
(
*
cp
&&
*
cp
!=
' '
&&
--
c
)
++
cp
;
c
=
*
cp
;
*
cp
=
'\0'
;
inqstrcpy
(
dev
->
supplement_adapter_info
.
AdapterTypeText
,
str
->
vid
);
*
cp
=
c
;
while
(
*
cp
&&
*
cp
!=
' '
)
++
cp
;
while
(
*
cp
==
' '
)
++
cp
;
/* last six chars reserved for vol type */
c
=
0
;
if
(
strlen
(
cp
)
>
sizeof
(
str
->
pid
))
{
c
=
cp
[
sizeof
(
str
->
pid
)];
cp
[
sizeof
(
str
->
pid
)]
=
'\0'
;
}
inqstrcpy
(
cp
,
str
->
pid
);
if
(
c
)
cp
[
sizeof
(
str
->
pid
)]
=
c
;
}
else
{
struct
aac_driver_ident
*
mp
=
aac_get_driver_ident
(
dev
->
cardtype
);
inqstrcpy
(
mp
->
vname
,
str
->
vid
);
/* last six chars reserved for vol type */
inqstrcpy
(
mp
->
model
,
str
->
pid
);
}
if
(
tindex
<
(
sizeof
(
container_types
)
/
sizeof
(
char
*
))){
if
(
tindex
<
(
sizeof
(
container_types
)
/
sizeof
(
char
*
))){
char
*
findit
=
str
->
pid
;
char
*
findit
=
str
->
pid
;
...
@@ -627,7 +653,9 @@ static void setinqstr(int devtype, void *data, int tindex)
...
@@ -627,7 +653,9 @@ static void setinqstr(int devtype, void *data, int tindex)
/* RAID is superfluous in the context of a RAID device */
/* RAID is superfluous in the context of a RAID device */
if
(
memcmp
(
findit
-
4
,
"RAID"
,
4
)
==
0
)
if
(
memcmp
(
findit
-
4
,
"RAID"
,
4
)
==
0
)
*
(
findit
-=
4
)
=
' '
;
*
(
findit
-=
4
)
=
' '
;
inqstrcpy
(
container_types
[
tindex
],
findit
+
1
);
if
(((
findit
-
str
->
pid
)
+
strlen
(
container_types
[
tindex
]))
<
(
sizeof
(
str
->
pid
)
+
sizeof
(
str
->
prl
)))
inqstrcpy
(
container_types
[
tindex
],
findit
+
1
);
}
}
inqstrcpy
(
"V1.0"
,
str
->
prl
);
inqstrcpy
(
"V1.0"
,
str
->
prl
);
}
}
...
@@ -822,12 +850,12 @@ int aac_get_adapter_info(struct aac_dev* dev)
...
@@ -822,12 +850,12 @@ int aac_get_adapter_info(struct aac_dev* dev)
dev
->
dac_support
=
(
dacmode
!=
0
);
dev
->
dac_support
=
(
dacmode
!=
0
);
}
}
if
(
dev
->
dac_support
!=
0
)
{
if
(
dev
->
dac_support
!=
0
)
{
if
(
!
pci_set_dma_mask
(
dev
->
pdev
,
0xFFFFFFFFFFFFFFFFULL
)
&&
if
(
!
pci_set_dma_mask
(
dev
->
pdev
,
DMA_64BIT_MASK
)
&&
!
pci_set_consistent_dma_mask
(
dev
->
pdev
,
0xFFFFFFFFFFFFFFFFULL
))
{
!
pci_set_consistent_dma_mask
(
dev
->
pdev
,
DMA_64BIT_MASK
))
{
printk
(
KERN_INFO
"%s%d: 64 Bit DAC enabled
\n
"
,
printk
(
KERN_INFO
"%s%d: 64 Bit DAC enabled
\n
"
,
dev
->
name
,
dev
->
id
);
dev
->
name
,
dev
->
id
);
}
else
if
(
!
pci_set_dma_mask
(
dev
->
pdev
,
0xFFFFFFFFULL
)
&&
}
else
if
(
!
pci_set_dma_mask
(
dev
->
pdev
,
DMA_32BIT_MASK
)
&&
!
pci_set_consistent_dma_mask
(
dev
->
pdev
,
0xFFFFFFFFULL
))
{
!
pci_set_consistent_dma_mask
(
dev
->
pdev
,
DMA_32BIT_MASK
))
{
printk
(
KERN_INFO
"%s%d: DMA mask set failed, 64 Bit DAC disabled
\n
"
,
printk
(
KERN_INFO
"%s%d: DMA mask set failed, 64 Bit DAC disabled
\n
"
,
dev
->
name
,
dev
->
id
);
dev
->
name
,
dev
->
id
);
dev
->
dac_support
=
0
;
dev
->
dac_support
=
0
;
...
@@ -1438,7 +1466,6 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd)
...
@@ -1438,7 +1466,6 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd)
struct
Scsi_Host
*
host
=
scsicmd
->
device
->
host
;
struct
Scsi_Host
*
host
=
scsicmd
->
device
->
host
;
struct
aac_dev
*
dev
=
(
struct
aac_dev
*
)
host
->
hostdata
;
struct
aac_dev
*
dev
=
(
struct
aac_dev
*
)
host
->
hostdata
;
struct
fsa_dev_info
*
fsa_dev_ptr
=
dev
->
fsa_dev
;
struct
fsa_dev_info
*
fsa_dev_ptr
=
dev
->
fsa_dev
;
int
cardtype
=
dev
->
cardtype
;
int
ret
;
int
ret
;
/*
/*
...
@@ -1542,14 +1569,14 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd)
...
@@ -1542,14 +1569,14 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd)
* see: <vendor>.c i.e. aac.c
* see: <vendor>.c i.e. aac.c
*/
*/
if
(
scsicmd
->
device
->
id
==
host
->
this_id
)
{
if
(
scsicmd
->
device
->
id
==
host
->
this_id
)
{
setinqstr
(
cardtype
,
(
void
*
)
(
inq_data
.
inqd_vid
),
(
sizeof
(
container_types
)
/
sizeof
(
char
*
)));
setinqstr
(
dev
,
(
void
*
)
(
inq_data
.
inqd_vid
),
(
sizeof
(
container_types
)
/
sizeof
(
char
*
)));
inq_data
.
inqd_pdt
=
INQD_PDT_PROC
;
/* Processor device */
inq_data
.
inqd_pdt
=
INQD_PDT_PROC
;
/* Processor device */
aac_internal_transfer
(
scsicmd
,
&
inq_data
,
0
,
sizeof
(
inq_data
));
aac_internal_transfer
(
scsicmd
,
&
inq_data
,
0
,
sizeof
(
inq_data
));
scsicmd
->
result
=
DID_OK
<<
16
|
COMMAND_COMPLETE
<<
8
|
SAM_STAT_GOOD
;
scsicmd
->
result
=
DID_OK
<<
16
|
COMMAND_COMPLETE
<<
8
|
SAM_STAT_GOOD
;
scsicmd
->
scsi_done
(
scsicmd
);
scsicmd
->
scsi_done
(
scsicmd
);
return
0
;
return
0
;
}
}
setinqstr
(
cardtype
,
(
void
*
)
(
inq_data
.
inqd_vid
),
fsa_dev_ptr
[
cid
].
type
);
setinqstr
(
dev
,
(
void
*
)
(
inq_data
.
inqd_vid
),
fsa_dev_ptr
[
cid
].
type
);
inq_data
.
inqd_pdt
=
INQD_PDT_DA
;
/* Direct/random access device */
inq_data
.
inqd_pdt
=
INQD_PDT_DA
;
/* Direct/random access device */
aac_internal_transfer
(
scsicmd
,
&
inq_data
,
0
,
sizeof
(
inq_data
));
aac_internal_transfer
(
scsicmd
,
&
inq_data
,
0
,
sizeof
(
inq_data
));
return
aac_get_container_name
(
scsicmd
,
cid
);
return
aac_get_container_name
(
scsicmd
,
cid
);
...
...
drivers/scsi/aacraid/aacraid.h
View file @
38a9a621
...
@@ -1560,7 +1560,7 @@ struct fib_ioctl
...
@@ -1560,7 +1560,7 @@ struct fib_ioctl
struct
revision
struct
revision
{
{
__le
32
compat
;
u
32
compat
;
__le32
version
;
__le32
version
;
__le32
build
;
__le32
build
;
};
};
...
...
drivers/scsi/aacraid/commctrl.c
View file @
38a9a621
...
@@ -408,7 +408,7 @@ static int check_revision(struct aac_dev *dev, void __user *arg)
...
@@ -408,7 +408,7 @@ static int check_revision(struct aac_dev *dev, void __user *arg)
char
*
driver_version
=
aac_driver_version
;
char
*
driver_version
=
aac_driver_version
;
u32
version
;
u32
version
;
response
.
compat
=
cpu_to_le32
(
1
)
;
response
.
compat
=
1
;
version
=
(
simple_strtol
(
driver_version
,
version
=
(
simple_strtol
(
driver_version
,
&
driver_version
,
10
)
<<
24
)
|
0x00000400
;
&
driver_version
,
10
)
<<
24
)
|
0x00000400
;
version
+=
simple_strtol
(
driver_version
+
1
,
&
driver_version
,
10
)
<<
16
;
version
+=
simple_strtol
(
driver_version
+
1
,
&
driver_version
,
10
)
<<
16
;
...
@@ -574,7 +574,7 @@ static int aac_send_raw_srb(struct aac_dev* dev, void __user * arg)
...
@@ -574,7 +574,7 @@ static int aac_send_raw_srb(struct aac_dev* dev, void __user * arg)
rcode
=
-
ENOMEM
;
rcode
=
-
ENOMEM
;
goto
cleanup
;
goto
cleanup
;
}
}
sg_user
[
i
]
=
(
void
__user
*
)
usg
->
sg
[
i
].
addr
;
sg_user
[
i
]
=
(
void
__user
*
)
(
long
)
usg
->
sg
[
i
].
addr
;
sg_list
[
i
]
=
p
;
// save so we can clean up later
sg_list
[
i
]
=
p
;
// save so we can clean up later
sg_indx
=
i
;
sg_indx
=
i
;
...
@@ -624,7 +624,7 @@ static int aac_send_raw_srb(struct aac_dev* dev, void __user * arg)
...
@@ -624,7 +624,7 @@ static int aac_send_raw_srb(struct aac_dev* dev, void __user * arg)
rcode
=
-
ENOMEM
;
rcode
=
-
ENOMEM
;
goto
cleanup
;
goto
cleanup
;
}
}
sg_user
[
i
]
=
(
void
__user
*
)
upsg
->
sg
[
i
].
addr
;
sg_user
[
i
]
=
(
void
__user
*
)
(
long
)
upsg
->
sg
[
i
].
addr
;
sg_list
[
i
]
=
p
;
// save so we can clean up later
sg_list
[
i
]
=
p
;
// save so we can clean up later
sg_indx
=
i
;
sg_indx
=
i
;
...
...
drivers/scsi/aacraid/linit.c
View file @
38a9a621
...
@@ -752,8 +752,8 @@ static int __devinit aac_probe_one(struct pci_dev *pdev,
...
@@ -752,8 +752,8 @@ static int __devinit aac_probe_one(struct pci_dev *pdev,
if
(
error
)
if
(
error
)
goto
out
;
goto
out
;
if
(
pci_set_dma_mask
(
pdev
,
0xFFFFFFFFULL
)
||
if
(
pci_set_dma_mask
(
pdev
,
DMA_32BIT_MASK
)
||
pci_set_consistent_dma_mask
(
pdev
,
0xFFFFFFFFULL
))
pci_set_consistent_dma_mask
(
pdev
,
DMA_32BIT_MASK
))
goto
out
;
goto
out
;
/*
/*
* If the quirk31 bit is set, the adapter needs adapter
* If the quirk31 bit is set, the adapter needs adapter
...
@@ -797,9 +797,9 @@ static int __devinit aac_probe_one(struct pci_dev *pdev,
...
@@ -797,9 +797,9 @@ static int __devinit aac_probe_one(struct pci_dev *pdev,
* address space.
* address space.
*/
*/
if
(
aac_drivers
[
index
].
quirks
&
AAC_QUIRK_31BIT
)
if
(
aac_drivers
[
index
].
quirks
&
AAC_QUIRK_31BIT
)
if
(
pci_set_dma_mask
(
pdev
,
0xFFFFFFFFULL
))
if
(
pci_set_dma_mask
(
pdev
,
DMA_32BIT_MASK
))
goto
out_
free_fibs
;
goto
out_
deinit
;
aac
->
maximum_num_channels
=
aac_drivers
[
index
].
channels
;
aac
->
maximum_num_channels
=
aac_drivers
[
index
].
channels
;
error
=
aac_get_adapter_info
(
aac
);
error
=
aac_get_adapter_info
(
aac
);
if
(
error
<
0
)
if
(
error
<
0
)
...
...
drivers/scsi/dc395x.c
View file @
38a9a621
...
@@ -976,6 +976,16 @@ static void send_srb(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb)
...
@@ -976,6 +976,16 @@ static void send_srb(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb)
}
}
}
}
static
inline
void
pio_trigger
(
void
)
{
static
int
feedback_requested
;
if
(
!
feedback_requested
)
{
feedback_requested
=
1
;
printk
(
KERN_WARNING
"%s: Please, contact <linux-scsi@vger.kernel.org> "
"to help improve support for your system.
\n
"
,
__FILE__
);
}
}
/* Prepare SRB for being sent to Device DCB w/ command *cmd */
/* Prepare SRB for being sent to Device DCB w/ command *cmd */
static
void
build_srb
(
struct
scsi_cmnd
*
cmd
,
struct
DeviceCtlBlk
*
dcb
,
static
void
build_srb
(
struct
scsi_cmnd
*
cmd
,
struct
DeviceCtlBlk
*
dcb
,
...
@@ -2320,6 +2330,7 @@ static void data_in_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
...
@@ -2320,6 +2330,7 @@ static void data_in_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
CFG2_WIDEFIFO
);
CFG2_WIDEFIFO
);
while
(
DC395x_read8
(
acb
,
TRM_S1040_SCSI_FIFOCNT
)
!=
0x40
)
{
while
(
DC395x_read8
(
acb
,
TRM_S1040_SCSI_FIFOCNT
)
!=
0x40
)
{
u8
byte
=
DC395x_read8
(
acb
,
TRM_S1040_SCSI_FIFO
);
u8
byte
=
DC395x_read8
(
acb
,
TRM_S1040_SCSI_FIFO
);
pio_trigger
();
*
(
srb
->
virt_addr
)
++
=
byte
;
*
(
srb
->
virt_addr
)
++
=
byte
;
if
(
debug_enabled
(
DBG_PIO
))
if
(
debug_enabled
(
DBG_PIO
))
printk
(
" %02x"
,
byte
);
printk
(
" %02x"
,
byte
);
...
@@ -2331,6 +2342,7 @@ static void data_in_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
...
@@ -2331,6 +2342,7 @@ static void data_in_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
/* Read the last byte ... */
/* Read the last byte ... */
if
(
srb
->
total_xfer_length
>
0
)
{
if
(
srb
->
total_xfer_length
>
0
)
{
u8
byte
=
DC395x_read8
(
acb
,
TRM_S1040_SCSI_FIFO
);
u8
byte
=
DC395x_read8
(
acb
,
TRM_S1040_SCSI_FIFO
);
pio_trigger
();
*
(
srb
->
virt_addr
)
++
=
byte
;
*
(
srb
->
virt_addr
)
++
=
byte
;
srb
->
total_xfer_length
--
;
srb
->
total_xfer_length
--
;
if
(
debug_enabled
(
DBG_PIO
))
if
(
debug_enabled
(
DBG_PIO
))
...
@@ -2507,6 +2519,7 @@ static void data_io_transfer(struct AdapterCtlBlk *acb,
...
@@ -2507,6 +2519,7 @@ static void data_io_transfer(struct AdapterCtlBlk *acb,
if
(
debug_enabled
(
DBG_PIO
))
if
(
debug_enabled
(
DBG_PIO
))
printk
(
" %02x"
,
(
unsigned
char
)
*
(
srb
->
virt_addr
));
printk
(
" %02x"
,
(
unsigned
char
)
*
(
srb
->
virt_addr
));
pio_trigger
();
DC395x_write8
(
acb
,
TRM_S1040_SCSI_FIFO
,
DC395x_write8
(
acb
,
TRM_S1040_SCSI_FIFO
,
*
(
srb
->
virt_addr
)
++
);
*
(
srb
->
virt_addr
)
++
);
...
...
drivers/scsi/iscsi_tcp.c
0 → 100644
View file @
38a9a621
This diff is collapsed.
Click to expand it.
drivers/scsi/iscsi_tcp.h
0 → 100644
View file @
38a9a621
/*
* iSCSI Initiator TCP Transport
* Copyright (C) 2004 Dmitry Yusupov
* Copyright (C) 2004 Alex Aizman
* Copyright (C) 2005 Mike Christie
* maintained by open-iscsi@googlegroups.com
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published
* by the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* See the file COPYING included with this distribution for more details.
*/
#ifndef ISCSI_TCP_H
#define ISCSI_TCP_H
/* Session's states */
#define ISCSI_STATE_FREE 1
#define ISCSI_STATE_LOGGED_IN 2
#define ISCSI_STATE_FAILED 3
#define ISCSI_STATE_TERMINATE 4
/* Connection's states */
#define ISCSI_CONN_INITIAL_STAGE 0
#define ISCSI_CONN_STARTED 1
#define ISCSI_CONN_STOPPED 2
#define ISCSI_CONN_CLEANUP_WAIT 3
/* Connection suspend "bit" */
#define SUSPEND_BIT 1
/* Socket's Receive state machine */
#define IN_PROGRESS_WAIT_HEADER 0x0
#define IN_PROGRESS_HEADER_GATHER 0x1
#define IN_PROGRESS_DATA_RECV 0x2
#define IN_PROGRESS_DDIGEST_RECV 0x3
/* Task Mgmt states */
#define TMABORT_INITIAL 0x0
#define TMABORT_SUCCESS 0x1
#define TMABORT_FAILED 0x2
#define TMABORT_TIMEDOUT 0x3
/* xmit state machine */
#define XMSTATE_IDLE 0x0
#define XMSTATE_R_HDR 0x1
#define XMSTATE_W_HDR 0x2
#define XMSTATE_IMM_HDR 0x4
#define XMSTATE_IMM_DATA 0x8
#define XMSTATE_UNS_INIT 0x10
#define XMSTATE_UNS_HDR 0x20
#define XMSTATE_UNS_DATA 0x40
#define XMSTATE_SOL_HDR 0x80
#define XMSTATE_SOL_DATA 0x100
#define XMSTATE_W_PAD 0x200
#define XMSTATE_DATA_DIGEST 0x400
#define ISCSI_CONN_MAX 1
#define ISCSI_CONN_RCVBUF_MIN 262144
#define ISCSI_CONN_SNDBUF_MIN 262144
#define ISCSI_PAD_LEN 4
#define ISCSI_R2T_MAX 16
#define ISCSI_XMIT_CMDS_MAX 128
/* must be power of 2 */
#define ISCSI_MGMT_CMDS_MAX 32
/* must be power of 2 */
#define ISCSI_MGMT_ITT_OFFSET 0xa00
#define ISCSI_SG_TABLESIZE SG_ALL
#define ISCSI_CMD_PER_LUN 128
#define ISCSI_TCP_MAX_CMD_LEN 16
#define ITT_MASK (0xfff)
#define CID_SHIFT 12
#define CID_MASK (0xffff<<CID_SHIFT)
#define AGE_SHIFT 28
#define AGE_MASK (0xf<<AGE_SHIFT)
struct
iscsi_queue
{
struct
kfifo
*
queue
;
/* FIFO Queue */
void
**
pool
;
/* Pool of elements */
int
max
;
/* Max number of elements */
};
struct
iscsi_session
;
struct
iscsi_cmd_task
;
struct
iscsi_mgmt_task
;
/* Socket connection recieve helper */
struct
iscsi_tcp_recv
{
struct
iscsi_hdr
*
hdr
;
struct
sk_buff
*
skb
;
int
offset
;
int
len
;
int
hdr_offset
;
int
copy
;
int
copied
;
int
padding
;
struct
iscsi_cmd_task
*
ctask
;
/* current cmd in progress */
/* copied and flipped values */
int
opcode
;
int
flags
;
int
cmd_status
;
int
ahslen
;
int
datalen
;
uint32_t
itt
;
int
datadgst
;
};
struct
iscsi_conn
{
struct
iscsi_hdr
hdr
;
/* header placeholder */
char
hdrext
[
4
*
sizeof
(
__u16
)
+
sizeof
(
__u32
)];
int
data_copied
;
char
*
data
;
/* data placeholder */
struct
socket
*
sock
;
/* TCP socket */
int
data_size
;
/* actual recv_dlength */
int
stop_stage
;
/* conn_stop() flag: *
* stop to recover, *
* stop to terminate */
/* iSCSI connection-wide sequencing */
uint32_t
exp_statsn
;
int
hdr_size
;
/* PDU header size */
unsigned
long
suspend_rx
;
/* suspend Rx */
struct
crypto_tfm
*
rx_tfm
;
/* CRC32C (Rx) */
struct
crypto_tfm
*
data_rx_tfm
;
/* CRC32C (Rx) for data */
/* control data */
int
senselen
;
/* scsi sense length */
int
id
;
/* CID */
struct
iscsi_tcp_recv
in
;
/* TCP receive context */
struct
iscsi_session
*
session
;
/* parent session */
struct
list_head
item
;
/* maintains list of conns */
int
in_progress
;
/* connection state machine */
int
c_stage
;
/* connection state */
struct
iscsi_mgmt_task
*
login_mtask
;
/* mtask used for login/text */
struct
iscsi_mgmt_task
*
mtask
;
/* xmit mtask in progress */
struct
iscsi_cmd_task
*
ctask
;
/* xmit ctask in progress */
spinlock_t
lock
;
/* FIXME: to be removed */
/* old values for socket callbacks */
void
(
*
old_data_ready
)(
struct
sock
*
,
int
);
void
(
*
old_state_change
)(
struct
sock
*
);
void
(
*
old_write_space
)(
struct
sock
*
);
/* xmit */
struct
crypto_tfm
*
tx_tfm
;
/* CRC32C (Tx) */
struct
crypto_tfm
*
data_tx_tfm
;
/* CRC32C (Tx) for data */
struct
kfifo
*
writequeue
;
/* write cmds for Data-Outs */
struct
kfifo
*
immqueue
;
/* immediate xmit queue */
struct
kfifo
*
mgmtqueue
;
/* mgmt (control) xmit queue */
struct
kfifo
*
xmitqueue
;
/* data-path cmd queue */
struct
work_struct
xmitwork
;
/* per-conn. xmit workqueue */
struct
semaphore
xmitsema
;
/* serializes connection xmit,
* access to kfifos: *
* xmitqueue, writequeue, *
* immqueue, mgmtqueue */
unsigned
long
suspend_tx
;
/* suspend Tx */
/* abort */
wait_queue_head_t
ehwait
;
/* used in eh_abort() */
struct
iscsi_tm
tmhdr
;
struct
timer_list
tmabort_timer
;
/* abort timer */
int
tmabort_state
;
/* see TMABORT_INITIAL, etc.*/
/* negotiated params */
int
max_recv_dlength
;
int
max_xmit_dlength
;
int
hdrdgst_en
;
int
datadgst_en
;
/* MIB-statistics */
uint64_t
txdata_octets
;
uint64_t
rxdata_octets
;
uint32_t
scsicmd_pdus_cnt
;
uint32_t
dataout_pdus_cnt
;
uint32_t
scsirsp_pdus_cnt
;
uint32_t
datain_pdus_cnt
;
uint32_t
r2t_pdus_cnt
;
uint32_t
tmfcmd_pdus_cnt
;
int32_t
tmfrsp_pdus_cnt
;
/* custom statistics */
uint32_t
sendpage_failures_cnt
;
uint32_t
discontiguous_hdr_cnt
;
uint32_t
eh_abort_cnt
;
};
struct
iscsi_session
{
/* iSCSI session-wide sequencing */
uint32_t
cmdsn
;
uint32_t
exp_cmdsn
;
uint32_t
max_cmdsn
;
/* configuration */
int
initial_r2t_en
;
int
max_r2t
;
int
imm_data_en
;
int
first_burst
;
int
max_burst
;
int
time2wait
;
int
time2retain
;
int
pdu_inorder_en
;
int
dataseq_inorder_en
;
int
erl
;
int
ifmarker_en
;
int
ofmarker_en
;
/* control data */
struct
Scsi_Host
*
host
;
int
id
;
struct
iscsi_conn
*
leadconn
;
/* leading connection */
spinlock_t
lock
;
/* protects session state, *
* sequence numbers, *
* session resources: *
* - cmdpool, *
* - mgmtpool, *
* - r2tpool */
int
state
;
/* session state */
struct
list_head
item
;
void
*
auth_client
;
int
conn_cnt
;
int
age
;
/* counts session re-opens */
struct
list_head
connections
;
/* list of connections */
int
cmds_max
;
/* size of cmds array */
struct
iscsi_cmd_task
**
cmds
;
/* Original Cmds arr */
struct
iscsi_queue
cmdpool
;
/* PDU's pool */
int
mgmtpool_max
;
/* size of mgmt array */
struct
iscsi_mgmt_task
**
mgmt_cmds
;
/* Original mgmt arr */
struct
iscsi_queue
mgmtpool
;
/* Mgmt PDU's pool */
};
struct
iscsi_buf
{
struct
scatterlist
sg
;
struct
kvec
iov
;
unsigned
int
sent
;
};
struct
iscsi_data_task
{
struct
iscsi_data
hdr
;
/* PDU */
char
hdrext
[
sizeof
(
__u32
)];
/* Header-Digest */
struct
list_head
item
;
/* data queue item */
struct
iscsi_buf
digestbuf
;
/* digest buffer */
uint32_t
digest
;
/* data digest */
};
#define ISCSI_DTASK_DEFAULT_MAX ISCSI_SG_TABLESIZE * PAGE_SIZE / 512
struct
iscsi_mgmt_task
{
struct
iscsi_hdr
hdr
;
/* mgmt. PDU */
char
hdrext
[
sizeof
(
__u32
)];
/* Header-Digest */
char
*
data
;
/* mgmt payload */
int
xmstate
;
/* mgmt xmit progress */
int
data_count
;
/* counts data to be sent */
struct
iscsi_buf
headbuf
;
/* header buffer */
struct
iscsi_buf
sendbuf
;
/* in progress buffer */
int
sent
;
uint32_t
itt
;
/* this ITT */
};
struct
iscsi_r2t_info
{
__be32
ttt
;
/* copied from R2T */
__be32
exp_statsn
;
/* copied from R2T */
uint32_t
data_length
;
/* copied from R2T */