Skip to content
GitLab
Menu
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
xenomai
ipipe-arm64
Commits
38a9a621
Commit
38a9a621
authored
Oct 28, 2005
by
James Bottomley
Browse files
Merge HEAD from ../scsi-misc-2.6-old
parents
27d1097d
e75d5176
Changes
16
Expand all
Hide whitespace changes
Inline
Side-by-side
drivers/scsi/Kconfig
View file @
38a9a621
...
...
@@ -229,7 +229,7 @@ config SCSI_FC_ATTRS
config
SCSI_ISCSI_ATTRS
tristate
"iSCSI Transport Attributes"
depends
on
SCSI
depends
on
SCSI
&&
NET
help
If
you
wish
to
export
transport
-
specific
information
about
each
attached
iSCSI
device
to
sysfs
,
say
Y
.
...
...
@@ -247,6 +247,30 @@ endmenu
menu
"SCSI low-level drivers"
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
tristate "SGI WD93C93 SCSI Driver"
depends on SGI_IP22 && SCSI
...
...
drivers/scsi/Makefile
View file @
38a9a621
...
...
@@ -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_SAS_ATTRS)
+=
scsi_transport_sas.o
obj-$(CONFIG_ISCSI_TCP)
+=
iscsi_tcp.o
obj-$(CONFIG_SCSI_AMIGA7XX)
+=
amiga7xx.o 53c7xx.o
obj-$(CONFIG_A3000_SCSI)
+=
a3000.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[] = {
* 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
aac_driver_ident
*
mp
;
mp
=
aac_get_driver_ident
(
devtype
);
str
=
(
struct
scsi_inq
*
)(
data
);
/* cast data to scsi inq block */
inqstrcpy
(
mp
->
vname
,
str
->
vid
);
inqstrcpy
(
mp
->
model
,
str
->
pid
);
/* last six chars reserved for vol type */
memset
(
str
,
' '
,
sizeof
(
*
str
));
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
*
))){
char
*
findit
=
str
->
pid
;
...
...
@@ -627,7 +653,9 @@ static void setinqstr(int devtype, void *data, int tindex)
/* RAID is superfluous in the context of a RAID device */
if
(
memcmp
(
findit
-
4
,
"RAID"
,
4
)
==
0
)
*
(
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
);
}
...
...
@@ -822,12 +850,12 @@ int aac_get_adapter_info(struct aac_dev* dev)
dev
->
dac_support
=
(
dacmode
!=
0
);
}
if
(
dev
->
dac_support
!=
0
)
{
if
(
!
pci_set_dma_mask
(
dev
->
pdev
,
0xFFFFFFFFFFFFFFFFULL
)
&&
!
pci_set_consistent_dma_mask
(
dev
->
pdev
,
0xFFFFFFFFFFFFFFFFULL
))
{
if
(
!
pci_set_dma_mask
(
dev
->
pdev
,
DMA_64BIT_MASK
)
&&
!
pci_set_consistent_dma_mask
(
dev
->
pdev
,
DMA_64BIT_MASK
))
{
printk
(
KERN_INFO
"%s%d: 64 Bit DAC enabled
\n
"
,
dev
->
name
,
dev
->
id
);
}
else
if
(
!
pci_set_dma_mask
(
dev
->
pdev
,
0xFFFFFFFFULL
)
&&
!
pci_set_consistent_dma_mask
(
dev
->
pdev
,
0xFFFFFFFFULL
))
{
}
else
if
(
!
pci_set_dma_mask
(
dev
->
pdev
,
DMA_32BIT_MASK
)
&&
!
pci_set_consistent_dma_mask
(
dev
->
pdev
,
DMA_32BIT_MASK
))
{
printk
(
KERN_INFO
"%s%d: DMA mask set failed, 64 Bit DAC disabled
\n
"
,
dev
->
name
,
dev
->
id
);
dev
->
dac_support
=
0
;
...
...
@@ -1438,7 +1466,6 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd)
struct
Scsi_Host
*
host
=
scsicmd
->
device
->
host
;
struct
aac_dev
*
dev
=
(
struct
aac_dev
*
)
host
->
hostdata
;
struct
fsa_dev_info
*
fsa_dev_ptr
=
dev
->
fsa_dev
;
int
cardtype
=
dev
->
cardtype
;
int
ret
;
/*
...
...
@@ -1542,14 +1569,14 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd)
* see: <vendor>.c i.e. aac.c
*/
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 */
aac_internal_transfer
(
scsicmd
,
&
inq_data
,
0
,
sizeof
(
inq_data
));
scsicmd
->
result
=
DID_OK
<<
16
|
COMMAND_COMPLETE
<<
8
|
SAM_STAT_GOOD
;
scsicmd
->
scsi_done
(
scsicmd
);
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 */
aac_internal_transfer
(
scsicmd
,
&
inq_data
,
0
,
sizeof
(
inq_data
));
return
aac_get_container_name
(
scsicmd
,
cid
);
...
...
drivers/scsi/aacraid/aacraid.h
View file @
38a9a621
...
...
@@ -1560,7 +1560,7 @@ struct fib_ioctl
struct
revision
{
__le
32
compat
;
u
32
compat
;
__le32
version
;
__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)
char
*
driver_version
=
aac_driver_version
;
u32
version
;
response
.
compat
=
cpu_to_le32
(
1
)
;
response
.
compat
=
1
;
version
=
(
simple_strtol
(
driver_version
,
&
driver_version
,
10
)
<<
24
)
|
0x00000400
;
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)
rcode
=
-
ENOMEM
;
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_indx
=
i
;
...
...
@@ -624,7 +624,7 @@ static int aac_send_raw_srb(struct aac_dev* dev, void __user * arg)
rcode
=
-
ENOMEM
;
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_indx
=
i
;
...
...
drivers/scsi/aacraid/linit.c
View file @
38a9a621
...
...
@@ -752,8 +752,8 @@ static int __devinit aac_probe_one(struct pci_dev *pdev,
if
(
error
)
goto
out
;
if
(
pci_set_dma_mask
(
pdev
,
0xFFFFFFFFULL
)
||
pci_set_consistent_dma_mask
(
pdev
,
0xFFFFFFFFULL
))
if
(
pci_set_dma_mask
(
pdev
,
DMA_32BIT_MASK
)
||
pci_set_consistent_dma_mask
(
pdev
,
DMA_32BIT_MASK
))
goto
out
;
/*
* If the quirk31 bit is set, the adapter needs adapter
...
...
@@ -797,9 +797,9 @@ static int __devinit aac_probe_one(struct pci_dev *pdev,
* address space.
*/
if
(
aac_drivers
[
index
].
quirks
&
AAC_QUIRK_31BIT
)
if
(
pci_set_dma_mask
(
pdev
,
0xFFFFFFFFULL
))
goto
out_
free_fibs
;
if
(
pci_set_dma_mask
(
pdev
,
DMA_32BIT_MASK
))
goto
out_
deinit
;
aac
->
maximum_num_channels
=
aac_drivers
[
index
].
channels
;
error
=
aac_get_adapter_info
(
aac
);
if
(
error
<
0
)
...
...
drivers/scsi/dc395x.c
View file @
38a9a621
...
...
@@ -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 */
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,
CFG2_WIDEFIFO
);
while
(
DC395x_read8
(
acb
,
TRM_S1040_SCSI_FIFOCNT
)
!=
0x40
)
{
u8
byte
=
DC395x_read8
(
acb
,
TRM_S1040_SCSI_FIFO
);
pio_trigger
();
*
(
srb
->
virt_addr
)
++
=
byte
;
if
(
debug_enabled
(
DBG_PIO
))
printk
(
" %02x"
,
byte
);
...
...
@@ -2331,6 +2342,7 @@ static void data_in_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
/* Read the last byte ... */
if
(
srb
->
total_xfer_length
>
0
)
{
u8
byte
=
DC395x_read8
(
acb
,
TRM_S1040_SCSI_FIFO
);
pio_trigger
();
*
(
srb
->
virt_addr
)
++
=
byte
;
srb
->
total_xfer_length
--
;
if
(
debug_enabled
(
DBG_PIO
))
...
...
@@ -2507,6 +2519,7 @@ static void data_io_transfer(struct AdapterCtlBlk *acb,
if
(
debug_enabled
(
DBG_PIO
))
printk
(
" %02x"
,
(
unsigned
char
)
*
(
srb
->
virt_addr
));
pio_trigger
();
DC395x_write8
(
acb
,
TRM_S1040_SCSI_FIFO
,
*
(
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 */
uint32_t
data_offset
;
/* copied from R2T */
struct
iscsi_buf
headbuf
;
/* Data-Out Header Buffer */
struct
iscsi_buf
sendbuf
;
/* Data-Out in progress buffer*/
int
sent
;
/* R2T sequence progress */
int
data_count
;
/* DATA-Out payload progress */
struct
scatterlist
*
sg
;
/* per-R2T SG list */
int
solicit_datasn
;
struct
iscsi_data_task
*
dtask
;
/* which data task */
};
struct
iscsi_cmd_task
{
struct
iscsi_cmd
hdr
;
/* iSCSI PDU header */
char
hdrext
[
4
*
sizeof
(
__u16
)
+
/* AHS */
sizeof
(
__u32
)];
/* HeaderDigest */
char
pad
[
ISCSI_PAD_LEN
];
int
itt
;
/* this ITT */
int
datasn
;
/* DataSN */
struct
iscsi_buf
headbuf
;
/* header buf (xmit) */
struct
iscsi_buf
sendbuf
;
/* in progress buffer*/
int
sent
;
struct
scatterlist
*
sg
;
/* per-cmd SG list */
struct
scatterlist
*
bad_sg
;
/* assert statement */
int
sg_count
;
/* SG's to process */
uint32_t
unsol_datasn
;
uint32_t
exp_r2tsn
;
int
xmstate
;
/* xmit xtate machine */
int
imm_count
;
/* imm-data (bytes) */
int
unsol_count
;
/* unsolicited (bytes)*/
int
r2t_data_count
;
/* R2T Data-Out bytes */
int
data_count
;
/* remaining Data-Out */
int
pad_count
;
/* padded bytes */
struct
scsi_cmnd
*
sc
;
/* associated SCSI cmd*/
int
total_length
;
int
data_offset
;
struct
iscsi_conn
*
conn
;
/* used connection */
struct
iscsi_mgmt_task
*
mtask
;
/* tmf mtask in progr */
struct
iscsi_r2t_info
*
r2t
;
/* in progress R2T */
struct
iscsi_queue
r2tpool
;
struct
kfifo
*
r2tqueue
;
struct
iscsi_r2t_info
**
r2ts
;
struct
list_head
dataqueue
;
/* Data-Out dataqueue */
mempool_t
*
datapool
;
uint32_t
datadigest
;
/* for recover digest */
int
digest_count
;
uint32_t
immdigest
;
/* for imm data */
struct
iscsi_buf
immbuf
;
/* for imm data digest */
struct
iscsi_data_task
*
dtask
;
/* data task in progress*/
int
digest_offset
;
/* for partial buff digest */
};
#endif
/* ISCSI_H */
drivers/scsi/ncr53c8xx.c
View file @
38a9a621
...
...
@@ -3481,8 +3481,8 @@ static int ncr_queue_command (struct ncb *np, struct scsi_cmnd *cmd)
**----------------------------------------------------
*/
if
(
np
->
settle_time
&&
cmd
->
timeout_per_command
>=
HZ
)
{
u_long
tlimit
=
ktime_get
(
cmd
->
timeout_per_command
-
HZ
)
;
if
(
k
time_
dif
(
np
->
settle_time
,
tlimit
)
>
0
)
u_long
tlimit
=
jiffies
+
cmd
->
timeout_per_command
-
HZ
;
if
(
time_
after
(
np
->
settle_time
,
tlimit
))
np
->
settle_time
=
tlimit
;
}
...
...
@@ -3516,7 +3516,7 @@ static int ncr_queue_command (struct ncb *np, struct scsi_cmnd *cmd)
** Force ordered tag if necessary to avoid timeouts
** and to preserve interactivity.
*/
if
(
lp
&&
k
time_
exp
(
lp
->
tags_stime
))
{
if
(
lp
&&
time_
after
(
jiffies
,
lp
->
tags_stime
))
{
if
(
lp
->
tags_smap
)
{
order
=
M_ORDERED_TAG
;
if
((
DEBUG_FLAGS
&
DEBUG_TAGS
)
||
bootverbose
>
2
){
...
...
@@ -3524,7 +3524,7 @@ static int ncr_queue_command (struct ncb *np, struct scsi_cmnd *cmd)
"ordered tag forced.
\n
"
);
}
}
lp
->
tags_stime
=
ktime_get
(
3
*
HZ
)
;
lp
->
tags_stime
=
jiffies
+
3
*
HZ
;
lp
->
tags_smap
=
lp
->
tags_umap
;
}
...
...
@@ -3792,7 +3792,7 @@ static int ncr_reset_scsi_bus(struct ncb *np, int enab_int, int settle_delay)
u32
term
;
int
retv
=
0
;
np
->
settle_time
=
ktime_get
(
settle_delay
*
HZ
)
;
np
->
settle_time
=
jiffies
+
settle_delay
*
HZ
;
if
(
bootverbose
>
1
)
printk
(
"%s: resetting, "
...
...
@@ -5044,7 +5044,7 @@ static void ncr_setup_tags (struct ncb *np, struct scsi_device *sdev)
static
void
ncr_timeout
(
struct
ncb
*
np
)
{
u_long
thistime
=
ktime_get
(
0
)
;
u_long
thistime
=
jiffies
;