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
4c244d1a
Commit
4c244d1a
authored
Dec 09, 2004
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
bk://linux-scsi.bkbits.net/scsi-for-linus-2.6
into ppc970.osdl.org:/home/torvalds/v2.6/linux
parents
821bc517
77340725
Changes
20
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
292 additions
and
671 deletions
+292
-671
drivers/message/fusion/mptbase.c
drivers/message/fusion/mptbase.c
+22
-61
drivers/message/fusion/mptbase.h
drivers/message/fusion/mptbase.h
+9
-27
drivers/message/fusion/mptctl.c
drivers/message/fusion/mptctl.c
+4
-4
drivers/message/fusion/mptscsih.c
drivers/message/fusion/mptscsih.c
+163
-472
drivers/message/fusion/mptscsih.h
drivers/message/fusion/mptscsih.h
+1
-10
drivers/s390/scsi/zfcp_def.h
drivers/s390/scsi/zfcp_def.h
+2
-2
drivers/s390/scsi/zfcp_erp.c
drivers/s390/scsi/zfcp_erp.c
+18
-20
drivers/s390/scsi/zfcp_ext.h
drivers/s390/scsi/zfcp_ext.h
+2
-2
drivers/s390/scsi/zfcp_fsf.c
drivers/s390/scsi/zfcp_fsf.c
+4
-49
drivers/s390/scsi/zfcp_scsi.c
drivers/s390/scsi/zfcp_scsi.c
+1
-2
drivers/scsi/Kconfig
drivers/scsi/Kconfig
+1
-1
drivers/scsi/aacraid/aachba.c
drivers/scsi/aacraid/aachba.c
+43
-3
drivers/scsi/aacraid/aacraid.h
drivers/scsi/aacraid/aacraid.h
+3
-0
drivers/scsi/aic7xxx/aic79xx_osm.h
drivers/scsi/aic7xxx/aic79xx_osm.h
+1
-1
drivers/scsi/aic7xxx/aic79xx_osm_pci.c
drivers/scsi/aic7xxx/aic79xx_osm_pci.c
+6
-8
drivers/scsi/aic7xxx/aic7xxx_osm.h
drivers/scsi/aic7xxx/aic7xxx_osm.h
+1
-1
drivers/scsi/aic7xxx/aic7xxx_osm_pci.c
drivers/scsi/aic7xxx/aic7xxx_osm_pci.c
+3
-4
drivers/scsi/scsi_devinfo.c
drivers/scsi/scsi_devinfo.c
+1
-0
drivers/scsi/scsi_lib.c
drivers/scsi/scsi_lib.c
+1
-1
drivers/scsi/scsi_transport_spi.c
drivers/scsi/scsi_transport_spi.c
+6
-3
No files found.
drivers/message/fusion/mptbase.c
View file @
4c244d1a
...
...
@@ -155,7 +155,6 @@ static MPT_EVHANDLER MptEvHandlers[MPT_MAX_PROTOCOL_DRIVERS];
static
MPT_RESETHANDLER
MptResetHandlers
[
MPT_MAX_PROTOCOL_DRIVERS
];
static
struct
mpt_pci_driver
*
MptDeviceDriverHandlers
[
MPT_MAX_PROTOCOL_DRIVERS
];
static
int
FusionInitCalled
=
0
;
static
int
mpt_base_index
=
-
1
;
static
int
last_drv_idx
=
-
1
;
...
...
@@ -337,15 +336,13 @@ mpt_interrupt(int irq, void *bus_id, struct pt_regs *r)
ioc_stat
=
le16_to_cpu
(
mr
->
u
.
reply
.
IOCStatus
);
if
(
ioc_stat
&
MPI_IOCSTATUS_FLAG_LOG_INFO_AVAILABLE
)
{
u32
log_info
=
le32_to_cpu
(
mr
->
u
.
reply
.
IOCLogInfo
);
if
(
(
int
)
ioc
->
chip_type
<=
(
int
)
FC929
)
if
(
ioc
->
bus_type
==
FC
)
mpt_fc_log_info
(
ioc
,
log_info
);
else
else
if
(
ioc
->
bus_type
==
SCSI
)
mpt_sp_log_info
(
ioc
,
log_info
);
}
if
(
ioc_stat
&
MPI_IOCSTATUS_MASK
)
{
if
((
int
)
ioc
->
chip_type
<=
(
int
)
FC929
)
;
else
if
(
ioc
->
bus_type
==
SCSI
)
mpt_sp_ioc_info
(
ioc
,
(
u32
)
ioc_stat
,
mf
);
}
}
else
{
...
...
@@ -392,7 +389,7 @@ mpt_interrupt(int irq, void *bus_id, struct pt_regs *r)
}
#ifdef MPT_DEBUG_IRQ
if
(
(
int
)
ioc
->
chip_type
>
(
int
)
FC929
)
{
if
(
ioc
->
bus_type
==
SCSI
)
{
/* Verify mf, mr are reasonable.
*/
if
((
mf
)
&&
((
mf
>=
MPT_INDEX_2_MFPTR
(
ioc
,
ioc
->
req_depth
))
...
...
@@ -603,22 +600,6 @@ mpt_register(MPT_CALLBACK cbfunc, MPT_DRIVER_CLASS dclass)
last_drv_idx
=
-
1
;
#ifndef MODULE
/*
* Handle possibility of the mptscsih_detect() routine getting
* called *before* fusion_init!
*/
if
(
!
FusionInitCalled
)
{
dprintk
((
KERN_INFO
MYNAM
": Hmmm, calling fusion_init from mpt_register!
\n
"
));
/*
* NOTE! We'll get recursion here, as fusion_init()
* calls mpt_register()!
*/
fusion_init
();
FusionInitCalled
++
;
}
#endif
/*
* Search for empty callback slot in this order: {N,...,7,6,5,...,1}
* (slot/handle 0 is reserved!)
...
...
@@ -1220,22 +1201,21 @@ mptbase_probe(struct pci_dev *pdev, const struct pci_device_id *id)
ioc
->
pio_chip
=
(
SYSIF_REGS
__iomem
*
)
pmem
;
}
ioc
->
chip_type
=
FCUNK
;
if
(
pdev
->
device
==
MPI_MANUFACTPAGE_DEVICEID_FC909
)
{
ioc
->
chip_type
=
FC909
;
ioc
->
prod_name
=
"LSIFC909"
;
ioc
->
bus_type
=
FC
;
}
if
(
pdev
->
device
==
MPI_MANUFACTPAGE_DEVICEID_FC929
)
{
ioc
->
chip_type
=
FC929
;
ioc
->
prod_name
=
"LSIFC929"
;
ioc
->
bus_type
=
FC
;
}
else
if
(
pdev
->
device
==
MPI_MANUFACTPAGE_DEVICEID_FC919
)
{
ioc
->
chip_type
=
FC919
;
ioc
->
prod_name
=
"LSIFC919"
;
ioc
->
bus_type
=
FC
;
}
else
if
(
pdev
->
device
==
MPI_MANUFACTPAGE_DEVICEID_FC929X
)
{
ioc
->
chip_type
=
FC929X
;
pci_read_config_byte
(
pdev
,
PCI_CLASS_REVISION
,
&
revision
);
ioc
->
bus_type
=
FC
;
if
(
revision
<
XL_929
)
{
ioc
->
prod_name
=
"LSIFC929X"
;
/* 929X Chip Fix. Set Split transactions level
...
...
@@ -1254,8 +1234,8 @@ mptbase_probe(struct pci_dev *pdev, const struct pci_device_id *id)
}
}
else
if
(
pdev
->
device
==
MPI_MANUFACTPAGE_DEVICEID_FC919X
)
{
ioc
->
chip_type
=
FC919X
;
ioc
->
prod_name
=
"LSIFC919X"
;
ioc
->
bus_type
=
FC
;
/* 919X Chip Fix. Set Split transactions level
* for PCIX. Set MOST bits to zero.
*/
...
...
@@ -1264,8 +1244,8 @@ mptbase_probe(struct pci_dev *pdev, const struct pci_device_id *id)
pci_write_config_byte
(
pdev
,
0x6a
,
pcixcmd
);
}
else
if
(
pdev
->
device
==
MPI_MANUFACTPAGE_DEVID_53C1030
)
{
ioc
->
chip_type
=
C1030
;
ioc
->
prod_name
=
"LSI53C1030"
;
ioc
->
bus_type
=
SCSI
;
/* 1030 Chip Fix. Disable Split transactions
* for PCIX. Set MOST bits to zero if Rev < C0( = 8).
*/
...
...
@@ -1277,8 +1257,8 @@ mptbase_probe(struct pci_dev *pdev, const struct pci_device_id *id)
}
}
else
if
(
pdev
->
device
==
MPI_MANUFACTPAGE_DEVID_1030_53C1035
)
{
ioc
->
chip_type
=
C1035
;
ioc
->
prod_name
=
"LSI53C1035"
;
ioc
->
bus_type
=
SCSI
;
}
sprintf
(
ioc
->
name
,
"ioc%d"
,
ioc
->
id
);
...
...
@@ -1326,9 +1306,7 @@ mptbase_probe(struct pci_dev *pdev, const struct pci_device_id *id)
/* NEW! 20010220 -sralston
* Check for "bound ports" (929, 929X, 1030, 1035) to reduce redundant resets.
*/
if
((
ioc
->
chip_type
==
FC929
)
||
(
ioc
->
chip_type
==
C1030
)
||
(
ioc
->
chip_type
==
C1035
)
||
(
ioc
->
chip_type
==
FC929X
))
mpt_detect_bound_ports
(
ioc
,
pdev
);
mpt_detect_bound_ports
(
ioc
,
pdev
);
if
((
r
=
mpt_do_ioc_recovery
(
ioc
,
MPT_HOSTEVENT_IOC_BRINGUP
,
CAN_SLEEP
))
!=
0
)
{
...
...
@@ -1760,7 +1738,7 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag)
* and we try GetLanConfigPages again...
*/
if
((
ret
==
0
)
&&
(
reason
==
MPT_HOSTEVENT_IOC_BRINGUP
))
{
if
(
(
int
)
ioc
->
chip_type
<=
(
int
)
FC929
)
{
if
(
ioc
->
bus_type
==
FC
)
{
/*
* Pre-fetch FC port WWN and stuff...
* (FCPortPage0_t stuff)
...
...
@@ -2103,20 +2081,8 @@ MakeIocReady(MPT_ADAPTER *ioc, int force, int sleepFlag)
}
/* Is it already READY? */
if
(
!
statefault
&&
(
ioc_state
&
MPI_IOC_STATE_MASK
)
==
MPI_IOC_STATE_READY
)
{
if
((
int
)
ioc
->
chip_type
<=
(
int
)
FC929
)
return
0
;
else
{
return
0
;
/* Workaround from broken 1030 FW.
* Force a diagnostic reset if fails.
*/
/* if ((r = SendIocReset(ioc, MPI_FUNCTION_IOC_MESSAGE_UNIT_RESET, sleepFlag)) == 0)
return 0;
else
statefault = 4; */
}
}
if
(
!
statefault
&&
(
ioc_state
&
MPI_IOC_STATE_MASK
)
==
MPI_IOC_STATE_READY
)
return
0
;
/*
* Check to see if IOC is in FAULT state.
...
...
@@ -2513,11 +2479,11 @@ SendIocInit(MPT_ADAPTER *ioc, int sleepFlag)
ddlprintk
((
MYIOC_s_INFO_FMT
"upload_fw %d facts.Flags=%x
\n
"
,
ioc
->
name
,
ioc
->
upload_fw
,
ioc
->
facts
.
Flags
));
if
(
(
int
)
ioc
->
chip_type
<=
(
int
)
FC929
)
{
if
(
ioc
->
bus_type
==
FC
)
ioc_init
.
MaxDevices
=
MPT_MAX_FC_DEVICES
;
}
else
{
else
ioc_init
.
MaxDevices
=
MPT_MAX_SCSI_DEVICES
;
}
ioc_init
.
MaxBuses
=
MPT_MAX_BUS
;
ioc_init
.
ReplyFrameSize
=
cpu_to_le16
(
ioc
->
reply_sz
);
/* in BYTES */
...
...
@@ -2622,7 +2588,7 @@ SendPortEnable(MPT_ADAPTER *ioc, int portnum, int sleepFlag)
/* RAID FW may take a long time to enable
*/
if
(
(
int
)
ioc
->
chip_type
<=
(
int
)
FC929
)
{
if
(
ioc
->
bus_type
==
FC
)
{
ii
=
mpt_handshake_req_reply_wait
(
ioc
,
req_sz
,
(
u32
*
)
&
port_enable
,
reply_sz
,
(
u16
*
)
&
reply_buf
,
65
/*seconds*/
,
sleepFlag
);
}
else
{
...
...
@@ -2992,7 +2958,7 @@ KickStart(MPT_ADAPTER *ioc, int force, int sleepFlag)
int
cnt
,
cntdn
;
dinitprintk
((
KERN_WARNING
MYNAM
": KickStarting %s!
\n
"
,
ioc
->
name
));
if
(
(
int
)
ioc
->
chip_type
>
(
int
)
FC929
)
{
if
(
ioc
->
bus_type
==
SCSI
)
{
/* Always issue a Msg Unit Reset first. This will clear some
* SCSI bus hang conditions.
*/
...
...
@@ -3420,7 +3386,7 @@ initChainBuffers(MPT_ADAPTER *ioc)
dinitprintk
((
KERN_INFO
MYNAM
": %s Now numSGE=%d num_sge=%d num_chain=%d
\n
"
,
ioc
->
name
,
numSGE
,
num_sge
,
num_chain
));
if
(
(
int
)
ioc
->
chip_type
>
(
int
)
FC929
)
if
(
ioc
->
bus_type
==
SCSI
)
num_chain
*=
MPT_SCSI_CAN_QUEUE
;
else
num_chain
*=
MPT_FC_CAN_QUEUE
;
...
...
@@ -5277,7 +5243,7 @@ procmpt_iocinfo_read(char *buf, char **start, off_t offset, int request, int *eo
len
+=
sprintf
(
buf
+
len
,
" PortNumber = %d (of %d)
\n
"
,
p
+
1
,
ioc
->
facts
.
NumberOfPorts
);
if
(
(
int
)
ioc
->
chip_type
<=
(
int
)
FC929
)
{
if
(
ioc
->
bus_type
==
FC
)
{
if
(
ioc
->
pfacts
[
p
].
ProtocolFlags
&
MPI_PORTFACTS_PROTOCOL_LAN
)
{
u8
*
a
=
(
u8
*
)
&
ioc
->
lan_cnfg_page1
.
HardwareAddressLow
;
len
+=
sprintf
(
buf
+
len
,
" LanAddr = %02X:%02X:%02X:%02X:%02X:%02X
\n
"
,
...
...
@@ -5921,11 +5887,6 @@ fusion_init(void)
int
i
;
int
r
;
if
(
FusionInitCalled
++
)
{
dprintk
((
KERN_INFO
MYNAM
": INFO - Driver late-init entry point called
\n
"
));
return
0
;
}
show_mptmod_ver
(
my_NAME
,
my_VERSION
);
printk
(
KERN_INFO
COPYRIGHT
"
\n
"
);
...
...
drivers/message/fusion/mptbase.h
View file @
4c244d1a
...
...
@@ -83,8 +83,8 @@
#define COPYRIGHT "Copyright (c) 1999-2004 " MODULEAUTHOR
#endif
#define MPT_LINUX_VERSION_COMMON "3.01.1
7
"
#define MPT_LINUX_PACKAGE_NAME "@(#)mptlinux-3.01.1
7
"
#define MPT_LINUX_VERSION_COMMON "3.01.1
8
"
#define MPT_LINUX_PACKAGE_NAME "@(#)mptlinux-3.01.1
8
"
#define WHAT_MAGIC_STRING "@" "(" "#" ")"
#define show_mptmod_ver(s,ver) \
...
...
@@ -296,23 +296,6 @@ typedef struct _MPT_SGL64_HDR {
SGESimple64_t
sge
[
1
];
}
MPT_SGL64_HDR
;
/*
* Chip-specific stuff... FC929 delineates break between
* FC and Parallel SCSI parts. Do NOT re-order.
*/
typedef
enum
{
FC919X
=
0x0819
,
FC929X
=
0x0829
,
FC909
=
0x0909
,
FC919
=
0x0919
,
FC929
=
0x0929
,
C1030
=
0x1030
,
C1035
=
0x1035
,
FCUNK
=
0xFBAD
}
CHIP_TYPE
;
/*
* System interface register set
*/
...
...
@@ -517,6 +500,7 @@ typedef struct _MPT_ADAPTER
char
*
prod_name
;
/* "LSIFC9x9" */
SYSIF_REGS
__iomem
*
chip
;
/* == c8817000 (mmap) */
SYSIF_REGS
__iomem
*
pio_chip
;
/* Programmed IO (downloadboot) */
u8
bus_type
;
u32
mem_phys
;
/* == f4020000 (mmap) */
u32
pio_mem_phys
;
/* Programmed IO (downloadboot) */
int
mem_size
;
/* mmap memory size */
...
...
@@ -543,7 +527,6 @@ typedef struct _MPT_ADAPTER
dma_addr_t
ChainBufferDMA
;
struct
list_head
FreeChainQ
;
spinlock_t
FreeChainQlock
;
CHIP_TYPE
chip_type
;
/* We (host driver) get to manage our own RequestQueue! */
dma_addr_t
req_frames_dma
;
MPT_FRAME_HDR
*
req_frames
;
/* Request msg frames - rounded up! */
...
...
@@ -573,12 +556,6 @@ typedef struct _MPT_ADAPTER
int
eventTypes
;
/* Event logging parameters */
int
eventContext
;
/* Next event context */
int
eventLogSize
;
/* Max number of cached events */
#ifdef MPTSCSIH_DBG_TIMEOUT
int
timeout_hard
;
int
timeout_delta
;
int
timeout_cnt
;
int
timeout_maxcnt
;
#endif
struct
_mpt_ioctl_events
*
events
;
/* pointer to event log */
u8
*
cached_fw
;
/* Pointer to FW */
dma_addr_t
cached_fw_dma
;
...
...
@@ -894,6 +871,12 @@ typedef struct _MPT_LOCAL_REPLY {
#define TM_STATE_IN_PROGRESS (1)
#define TM_STATE_ERROR (2)
typedef
enum
{
FC
,
SCSI
,
SAS
}
BUS_TYPE
;
typedef
struct
_MPT_SCSI_HOST
{
MPT_ADAPTER
*
ioc
;
int
port
;
...
...
@@ -909,7 +892,6 @@ typedef struct _MPT_SCSI_HOST {
*/
u8
tmPending
;
u8
resetPending
;
u8
is_spi
;
/* Parallel SCSI i/f */
u8
negoNvram
;
/* DV disabled, nego NVRAM */
u8
pad1
;
u8
tmState
;
...
...
drivers/message/fusion/mptctl.c
View file @
4c244d1a
...
...
@@ -1218,7 +1218,7 @@ mptctl_getiocinfo (unsigned long arg, unsigned int data_size)
/* Fill in the data and return the structure to the calling
* program
*/
if
(
(
int
)
ioc
->
chip_type
<=
(
int
)
FC929
)
if
(
ioc
->
bus_type
==
FC
)
karg
->
adapterType
=
MPT_IOCTL_INTERFACE_FC
;
else
karg
->
adapterType
=
MPT_IOCTL_INTERFACE_SCSI
;
...
...
@@ -1518,7 +1518,7 @@ mptctl_readtest (unsigned long arg)
#ifdef MFCNT
karg
.
chip_type
=
ioc
->
mfcnt
;
#else
karg
.
chip_type
=
ioc
->
chip_typ
e
;
karg
.
chip_type
=
ioc
->
pcidev
->
devic
e
;
#endif
strncpy
(
karg
.
name
,
ioc
->
name
,
MPT_MAX_NAME
);
karg
.
name
[
MPT_MAX_NAME
-
1
]
=
'\0'
;
...
...
@@ -2470,7 +2470,7 @@ mptctl_hp_hostinfo(unsigned long arg, unsigned int data_size)
karg
.
base_io_addr
=
pci_resource_start
(
pdev
,
0
);
if
(
(
int
)
ioc
->
chip_type
<=
(
int
)
FC929
)
if
(
ioc
->
bus_type
==
FC
)
karg
.
bus_phys_width
=
HP_BUS_WIDTH_UNK
;
else
karg
.
bus_phys_width
=
HP_BUS_WIDTH_16
;
...
...
@@ -2559,7 +2559,7 @@ mptctl_hp_targetinfo(unsigned long arg)
/* There is nothing to do for FCP parts.
*/
if
(
(
int
)
ioc
->
chip_type
<=
(
int
)
FC929
)
if
(
ioc
->
bus_type
==
FC
)
return
0
;
if
((
ioc
->
spi_data
.
sdp0length
==
0
)
||
(
ioc
->
sh
==
NULL
))
...
...
drivers/message/fusion/mptscsih.c
View file @
4c244d1a
...
...
@@ -96,10 +96,22 @@ MODULE_AUTHOR(MODULEAUTHOR);
MODULE_DESCRIPTION
(
my_NAME
);
MODULE_LICENSE
(
"GPL"
);
/* Set string for command line args from insmod */
#ifdef MODULE
char
*
mptscsih
=
NULL
;
module_param
(
mptscsih
,
charp
,
0
);
static
int
dv
=
MPTSCSIH_DOMAIN_VALIDATION
;
module_param
(
dv
,
int
,
0
);
MODULE_PARM_DESC
(
dv
,
"DV Algorithm: enhanced = 1, basic = 0 (default=MPTSCSIH_DOMAIN_VALIDATION=1)"
);
static
int
width
=
MPTSCSIH_MAX_WIDTH
;
module_param
(
width
,
int
,
0
);
MODULE_PARM_DESC
(
width
,
"Max Bus Width: wide = 1, narrow = 0 (default=MPTSCSIH_MAX_WIDTH=1)"
);
static
ushort
factor
=
MPTSCSIH_MIN_SYNC
;
module_param
(
factor
,
ushort
,
0
);
MODULE_PARM_DESC
(
factor
,
"Min Sync Factor: (default=MPTSCSIH_MIN_SYNC=0x08)"
);
static
int
saf_te
=
MPTSCSIH_SAF_TE
;
module_param
(
saf_te
,
int
,
0
);
MODULE_PARM_DESC
(
saf_te
,
"Force enabling SEP Processor: (default=MPTSCSIH_SAF_TE=0)"
);
#endif
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
...
...
@@ -200,9 +212,6 @@ static int mptscsih_doDv(MPT_SCSI_HOST *hd, int channel, int target);
static
void
mptscsih_dv_parms
(
MPT_SCSI_HOST
*
hd
,
DVPARAMETERS
*
dv
,
void
*
pPage
);
static
void
mptscsih_fillbuf
(
char
*
buffer
,
int
size
,
int
index
,
int
width
);
#endif
#ifdef MODULE
static
int
mptscsih_setup
(
char
*
str
);
#endif
/* module entry point */
static
int
__init
mptscsih_init
(
void
);
static
void
__exit
mptscsih_exit
(
void
);
...
...
@@ -245,15 +254,9 @@ static DECLARE_WAIT_QUEUE_HEAD (scandv_waitq);
static
int
scandv_wait_done
=
1
;
/* Driver
default setup
/* Driver
command line structure
*/
static
struct
mptscsih_driver_setup
driver_setup
=
MPTSCSIH_DRIVER_SETUP
;
#ifdef MPTSCSIH_DBG_TIMEOUT
static
struct
scsi_cmnd
*
foo_to
[
8
];
#endif
static
struct
mptscsih_driver_setup
driver_setup
;
static
struct
scsi_host_template
driver_template
;
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
...
...
@@ -653,27 +656,6 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
pScsiReq
=
(
SCSIIORequest_t
*
)
mf
;
pScsiReply
=
(
SCSIIOReply_t
*
)
mr
;
#ifdef MPTSCSIH_DBG_TIMEOUT
if
(
ioc
->
timeout_cnt
>
0
)
{
int
ii
,
left
=
0
;
for
(
ii
=
0
;
ii
<
8
;
ii
++
)
{
if
(
sc
==
foo_to
[
ii
])
{
printk
(
MYIOC_s_INFO_FMT
"complete (%p, %ld)
\n
"
,
ioc
->
name
,
sc
,
jiffies
);
foo_to
[
ii
]
=
NULL
;
}
if
(
foo_to
[
ii
]
!=
NULL
)
left
++
;
}
if
(
left
==
0
)
{
ioc
->
timeout_maxcnt
=
0
;
ioc
->
timeout_cnt
=
0
;
}
}
#endif
if
(
pScsiReply
==
NULL
)
{
/* special context reply handling */
;
...
...
@@ -686,13 +668,14 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
scsi_state
=
pScsiReply
->
SCSIState
;
scsi_status
=
pScsiReply
->
SCSIStatus
;
xfer_cnt
=
le32_to_cpu
(
pScsiReply
->
TransferCount
);
sc
->
resid
=
sc
->
request_bufflen
-
xfer_cnt
;
dreplyprintk
((
KERN_NOTICE
"
Reply (%d:%d:%d) mf=%p, mr=%p, sc=%p
\n
"
,
ioc
->
id
,
pScsiReq
->
TargetID
,
pScsiReq
->
LUN
[
1
],
mf
,
mr
,
sc
));
dreplyprintk
((
KERN_NOTICE
"IOCStatus=%04xh SCSIState=%02xh"
" SCSIStatus=%02xh xfer_cnt=%08xh
\n
"
,
status
,
scsi_state
,
scsi_status
,
xfer_cnt
));
dreplyprintk
((
KERN_NOTICE
"
Reply ha=%d id=%d lun=%d:
\n
"
"IOCStatus=%04xh SCSIState=%02xh SCSIStatus=%02xh
\n
"
"resid=%d bufflen=%d xfer_cnt=%d
\n
"
,
ioc
->
id
,
pScsiReq
->
TargetID
,
pScsiReq
->
LUN
[
1
],
status
,
scsi_state
,
scsi_status
,
sc
->
resid
,
sc
->
request_bufflen
,
xfer_cnt
));
if
(
scsi_state
&
MPI_SCSI_STATE_AUTOSENSE_VALID
)
copy_sense_data
(
sc
,
hd
,
mf
,
pScsiReply
);
...
...
@@ -737,12 +720,11 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
sc
->
result
=
DID_RESET
<<
16
;
/* GEM Workaround. */
if
(
hd
->
is_spi
)
if
(
ioc
->
bus_type
==
SCSI
)
mptscsih_no_negotiate
(
hd
,
sc
->
device
->
id
);
break
;
case
MPI_IOCSTATUS_SCSI_RESIDUAL_MISMATCH
:
/* 0x0049 */
sc
->
resid
=
sc
->
request_bufflen
-
xfer_cnt
;
if
(
xfer_cnt
>=
sc
->
underflow
)
{
/* Sufficient data transfer occurred */
sc
->
result
=
(
DID_OK
<<
16
)
|
scsi_status
;
...
...
@@ -771,7 +753,7 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
*/
;
}
else
{
if
(
(
xfer_cnt
==
0
)
||
(
sc
->
underflow
>
xfer_cnt
)
)
{
if
(
xfer_cnt
<
sc
->
underflow
)
{
sc
->
result
=
DID_SOFT_ERROR
<<
16
;
}
if
(
scsi_state
&
(
MPI_SCSI_STATE_AUTOSENSE_FAILED
|
MPI_SCSI_STATE_NO_SCSI_STATUS
))
{
...
...
@@ -785,15 +767,9 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
}
}
/* Give report and update residual count.
*/
dreplyprintk
((
KERN_NOTICE
" sc->underflow={report ERR if < %02xh bytes xfer'd}
\n
"
,
sc
->
underflow
));
dreplyprintk
((
KERN_NOTICE
" ActBytesXferd=%02xh
\n
"
,
xfer_cnt
));
sc
->
resid
=
sc
->
request_bufflen
-
xfer_cnt
;
dreplyprintk
((
KERN_NOTICE
" SET sc->resid=%02xh
\n
"
,
sc
->
resid
));
/* Report Queue Full
*/
if
(
scsi_status
==
MPI_SCSI_STATUS_TASK_SET_FULL
)
...
...
@@ -848,7 +824,7 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
break
;
case
MPI_IOCSTATUS_SCSI_PROTOCOL_ERROR
:
/* 0x0047 */
sc
->
result
=
DID_SOFT_ERROR
<<
16
;
sc
->
result
=
DID_SOFT_ERROR
<<
16
;
break
;
case
MPI_IOCSTATUS_INVALID_FUNCTION
:
/* 0x0001 */
...
...
@@ -1132,7 +1108,7 @@ mptscsih_probe(struct pci_dev *pdev, const struct pci_device_id *id)
* max_lun = 1 + actual last lun,
* see hosts.h :o(
*/
if
(
(
int
)
ioc
->
chip_type
>
(
int
)
FC929
)
{
if
(
ioc
->
bus_type
==
SCSI
)
{
sh
->
max_id
=
MPT_MAX_SCSI_DEVICES
;
}
else
{
/* For FC, increase the queue depth
...
...
@@ -1191,9 +1167,6 @@ mptscsih_probe(struct pci_dev *pdev, const struct pci_device_id *id)
hd
=
(
MPT_SCSI_HOST
*
)
sh
->
hostdata
;
hd
->
ioc
=
ioc
;
if
((
int
)
ioc
->
chip_type
>
(
int
)
FC929
)
hd
->
is_spi
=
1
;
/* SCSI needs scsi_cmnd lookup table!
* (with size equal to req_depth*PtrSz!)
*/
...
...
@@ -1259,15 +1232,7 @@ mptscsih_probe(struct pci_dev *pdev, const struct pci_device_id *id)
/* Moved Earlier Pam D */
/* ioc->sh = sh; */
#ifdef MPTSCSIH_DBG_TIMEOUT
ioc
->
timeout_hard
=
0
;
ioc
->
timeout_delta
=
30
*
HZ
;
ioc
->
timeout_maxcnt
=
0
;
ioc
->
timeout_cnt
=
0
;
for
(
ii
=
0
;
ii
<
8
;
ii
++
)
foo_to
[
ii
]
=
NULL
;
#endif
if
(
hd
->
is_spi
)
{
if
(
ioc
->
bus_type
==
SCSI
)
{
/* Update with the driver setup
* values.
*/
...
...
@@ -1278,9 +1243,9 @@ mptscsih_probe(struct pci_dev *pdev, const struct pci_device_id *id)
}
if
(
ioc
->
spi_data
.
minSyncFactor
<
driver_setup
.
min_sync_fac
)
{
driver_setup
.
min_sync_fac
tor
)
{
ioc
->
spi_data
.
minSyncFactor
=
driver_setup
.
min_sync_fac
;
driver_setup
.
min_sync_fac
tor
;
}
if
(
ioc
->
spi_data
.
minSyncFactor
==
MPT_ASYNC
)
{
...
...
@@ -1307,7 +1272,7 @@ mptscsih_probe(struct pci_dev *pdev, const struct pci_device_id *id)
"dv %x width %x factor %x saf_te %x
\n
"
,
ioc
->
name
,
driver_setup
.
dv
,
driver_setup
.
max_width
,
driver_setup
.
min_sync_fac
,
driver_setup
.
min_sync_fac
tor
,
driver_setup
.
saf_te
));
}
...
...
@@ -1374,11 +1339,11 @@ mptscsih_remove(struct pci_dev *pdev)
hd
=
(
MPT_SCSI_HOST
*
)
host
->
hostdata
;
if
(
hd
!=
NULL
)
{
int
sz1
,
sz3
,
sztarget
=
0
;
int
sz1
;
mptscsih_shutdown
(
&
pdev
->
dev
);
sz1
=
sz3
=
0
;
sz1
=
0
;
if
(
hd
->
ScsiLookup
!=
NULL
)
{
sz1
=
hd
->
ioc
->
req_depth
*
sizeof
(
void
*
);
...
...
@@ -1387,36 +1352,16 @@ mptscsih_remove(struct pci_dev *pdev)
}
if
(
hd
->
Targets
!=
NULL
)
{
int
max
,
ii
;
/*
* Free any target structures that were allocated.
*/
if
(
hd
->
is_spi
)
{
max
=
MPT_MAX_SCSI_DEVICES
;
}
else
{
max
=
MPT_MAX_FC_DEVICES
<
256
?
MPT_MAX_FC_DEVICES
:
255
;
}
for
(
ii
=
0
;
ii
<
max
;
ii
++
)
{
if
(
hd
->
Targets
[
ii
])
{
kfree
(
hd
->
Targets
[
ii
]);
hd
->
Targets
[
ii
]
=
NULL
;
sztarget
+=
sizeof
(
VirtDevice
);
}
}
/*
* Free pointer array.
*/
sz3
=
max
*
sizeof
(
void
*
);
kfree
(
hd
->
Targets
);
hd
->
Targets
=
NULL
;
}
dprintk
((
MYIOC_s_INFO_FMT
"Free'd ScsiLookup (%d) Target (%d+%d) memory
\n
"
,
hd
->
ioc
->
name
,
sz1
,
sz3
,
sztarget
));
dprintk
((
"Free'd done and free Q (%d) memory
\n
"
,
szQ
));
"Free'd ScsiLookup (%d) memory
\n
"
,
hd
->
ioc
->
name
,
sz1
));
/* NULL the Scsi_Host pointer
*/
...
...
@@ -1545,9 +1490,15 @@ mptscsih_init(void)
}
#ifdef MODULE
/* Evaluate the command line arguments, if any */
if
(
mptscsih
)
mptscsih_setup
(
mptscsih
);
dinitprintk
((
KERN_INFO
MYNAM
": Command Line Args: dv=%d max_width=%d "
"factor=0x%x saf_te=%d
\n
"
,
dv
,
width
,
factor
,
saf_te
));
driver_setup
.
dv
=
(
dv
)
?
1
:
0
;
driver_setup
.
max_width
=
(
width
)
?
1
:
0
;
driver_setup
.
min_sync_factor
=
factor
;
driver_setup
.
saf_te
=
(
saf_te
)
?
1
:
0
;;
#endif
if
(
mpt_device_driver_register
(
&
mptscsih_driver
,
...
...
@@ -1676,129 +1627,6 @@ static int mptscsih_host_info(MPT_ADAPTER *ioc, char *pbuf, off_t offset, int le
return
((
info
.
pos
>
info
.
offset
)
?
info
.
pos
-
info
.
offset
:
0
);
}
#ifndef MPTSCSIH_DBG_TIMEOUT
static
int
mptscsih_user_command
(
MPT_ADAPTER
*
ioc
,
char
*
pbuf
,
int
len
)
{
/* Not yet implemented */
return
len
;
}
#else
#define is_digit(c) ((c) >= '0' && (c) <= '9')
#define digit_to_bin(c) ((c) - '0')
#define is_space(c) ((c) == ' ' || (c) == '\t')
#define UC_DBG_TIMEOUT 0x01
#define UC_DBG_HARDRESET 0x02
static
int
skip_spaces
(
char
*
ptr
,
int
len
)
{
int
cnt
,
c
;
for
(
cnt
=
len
;
cnt
>
0
&&
(
c
=
*
ptr
++
)
&&
is_space
(
c
);
cnt
--
);
return
(
len
-
cnt
);
}
static
int
get_int_arg
(
char
*
ptr
,
int
len
,
ulong
*
pv
)
{
int
cnt
,
c
;
ulong
v
;
for
(
v
=
0
,
cnt
=
len
;
cnt
>
0
&&
(
c
=*
ptr
++
)
&&
is_digit
(
c
);
cnt
--
)
{
v
=
(
v
*
10
)
+
digit_to_bin
(
c
);
}
if
(
pv
)
*
pv
=
v
;
return
(
len
-
cnt
);
}
static
int
is_keyword
(
char
*
ptr
,
int
len
,
char
*
verb
)
{
int
verb_len
=
strlen
(
verb
);
if
(
len
>=
strlen
(
verb
)
&&
!
memcmp
(
verb
,
ptr
,
verb_len
))
return
verb_len
;
else
return
0
;
}
#define SKIP_SPACES(min_spaces) \
if ((arg_len = skip_spaces(ptr,len)) < (min_spaces)) \
return -EINVAL; \
ptr += arg_len; \
len -= arg_len;
#define GET_INT_ARG(v) \
if (!(arg_len = get_int_arg(ptr,len, &(v)))) \
return -EINVAL; \
ptr += arg_len; \
len -= arg_len;
static
int
mptscsih_user_command
(
MPT_ADAPTER
*
ioc
,
char
*
buffer
,
int
length
)
{
char
*
ptr
=
buffer
;
char
btmp
[
24
];
/* REMOVE */
int
arg_len
;
int
len
=
length
;
int
cmd
;
ulong
number
=
1
;
ulong
delta
=
10
;
if
((
len
>
0
)
&&
(
ptr
[
len
-
1
]
==
'\n'
))
--
len
;
if
(
len
<
22
)
{
strncpy
(
btmp
,
buffer
,
len
);
btmp
[
len
+
1
]
=
'\0'
;
}
else
{
strncpy
(
btmp
,
buffer
,
22
);
btmp
[
23
]
=
'\0'
;
}
printk
(
"user_command: ioc %d, buffer %s, length %d
\n
"
,
ioc
->
id
,
btmp
,
length
);
if
((
arg_len
=
is_keyword
(
ptr
,
len
,
"timeout"
))
!=
0
)
cmd
=
UC_DBG_TIMEOUT
;
else
if
((
arg_len
=
is_keyword
(
ptr
,
len
,
"hardreset"
))
!=
0
)
cmd
=
UC_DBG_HARDRESET
;
else
return
-
EINVAL
;
ptr
+=
arg_len
;
len
-=
arg_len
;
switch
(
cmd
)
{
case
UC_DBG_TIMEOUT
:
SKIP_SPACES
(
1
);
GET_INT_ARG
(
number
);
SKIP_SPACES
(
1
);
GET_INT_ARG
(
delta
);
break
;
}
printk
(
"user_command: cnt=%ld delta=%ld
\n
"
,
number
,
delta
);
if
(
len
)
return
-
EINVAL
;
else
{
if
(
cmd
==
UC_DBG_HARDRESET
)
{
ioc
->
timeout_hard
=
1
;
}
else
if
(
cmd
==
UC_DBG_TIMEOUT
)
{
/* process this command ...
*/
ioc
->
timeout_maxcnt
=
0
;
ioc
->
timeout_delta
=
delta
<
2
?
2
:
delta
;
ioc
->
timeout_cnt
=
0
;
ioc
->
timeout_maxcnt
=
number
<
8
?
number
:
8
;
}
}
/* Not yet implemented */
return
length
;
}
#endif
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
/**
* mptscsih_proc_info - Return information about MPT adapter
...
...
@@ -1812,7 +1640,7 @@ static int mptscsih_user_command(MPT_ADAPTER *ioc, char *buffer, int length)
* hostno: scsi host number
* func: if write = 1; if read = 0
*/
static
int
static
int
mptscsih_proc_info
(
struct
Scsi_Host
*
host
,
char
*
buffer
,
char
**
start
,
off_t
offset
,
int
length
,
int
func
)
{
...
...
@@ -1821,7 +1649,9 @@ mptscsih_proc_info(struct Scsi_Host *host, char *buffer, char **start, off_t off
int
size
=
0
;
if
(
func
)
{
size
=
mptscsih_user_command
(
ioc
,
buffer
,
length
);
/*
* write is not supported
*/
}
else
{
if
(
start
)
*
start
=
buffer
;
...
...
@@ -1832,7 +1662,6 @@ mptscsih_proc_info(struct Scsi_Host *host, char *buffer, char **start, off_t off
return
size
;
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
#define ADD_INDEX_LOG(req_ent) do { } while(0)
...
...
@@ -1863,11 +1692,7 @@ mptscsih_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))
u32
cmd_len
;
int
my_idx
;
int
ii
;
int
rc
;
int
did_errcode
;
int
issueCmd
;
did_errcode
=
0
;
hd
=
(
MPT_SCSI_HOST
*
)
SCpnt
->
device
->
host
->
hostdata
;
target
=
SCpnt
->
device
->
id
;
lun
=
SCpnt
->
device
->
lun
;
...
...
@@ -1966,84 +1791,66 @@ mptscsih_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))
/* Now add the SG list
* Always have a SGE even if null length.
*/
rc
=
SUCCESS
;
if
(
datalen
==
0
)
{
/* Add a NULL SGE */
mptscsih_add_sge
((
char
*
)
&
pScsiReq
->
SGL
,
MPT_SGE_FLAGS_SSIMPLE_READ
|
0
,
(
dma_addr_t
)
-
1
);
}
else
{
/* Add a 32 or 64 bit SGE */
rc
=
mptscsih_AddSGE
(
hd
->
ioc
,
SCpnt
,
pScsiReq
,
my_idx
);
if
(
mptscsih_AddSGE
(
hd
->
ioc
,
SCpnt
,
pScsiReq
,
my_idx
)
!=
SUCCESS
)
goto
fail
;
}
if
(
rc
==
SUCCESS
)
{
hd
->
ScsiLookup
[
my_idx
]
=
SCpnt
;
SCpnt
->
host_scribble
=
NULL
;
/* SCSI specific processing */
issueCmd
=
1
;
if
(
hd
->
is_spi
)
{
int
dvStatus
=
hd
->
ioc
->
spi_data
.
dvStatus
[
target
];
if
(
dvStatus
||
hd
->
ioc
->
spi_data
.
forceDv
)
{
hd
->
ScsiLookup
[
my_idx
]
=
SCpnt
;
SCpnt
->
host_scribble
=
NULL
;
#ifdef MPTSCSIH_ENABLE_DOMAIN_VALIDATION
if
((
dvStatus
&
MPT_SCSICFG_NEED_DV
)
||
(
hd
->
ioc
->
spi_data
.
forceDv
&
MPT_SCSICFG_NEED_DV
))
{
unsigned
long
lflags
;
/* Schedule DV if necessary */
spin_lock_irqsave
(
&
dvtaskQ_lock
,
lflags
);
if
(
!
dvtaskQ_active
)
{
dvtaskQ_active
=
1
;
spin_unlock_irqrestore
(
&
dvtaskQ_lock
,
lflags
);
INIT_WORK
(
&
mptscsih_dvTask
,
mptscsih_domainValidation
,
(
void
*
)
hd
);
schedule_work
(
&
mptscsih_dvTask
);
}
else
{
spin_unlock_irqrestore
(
&
dvtaskQ_lock
,
lflags
);
}
hd
->
ioc
->
spi_data
.
forceDv
&=
~
MPT_SCSICFG_NEED_DV
;
}
/* Trying to do DV to this target, extend timeout.
* Wait to issue until flag is clear
*/
if
(
dvStatus
&
MPT_SCSICFG_DV_PENDING
)
{
mod_timer
(
&
SCpnt
->
eh_timeout
,
jiffies
+
40
*
HZ
);
issueCmd
=
0
;
if
(
hd
->
ioc
->
bus_type
==
SCSI
)
{
int
dvStatus
=
hd
->
ioc
->
spi_data
.
dvStatus
[
target
];
int
issueCmd
=
1
;
if
(
dvStatus
||
hd
->
ioc
->
spi_data
.
forceDv
)
{
if
((
dvStatus
&
MPT_SCSICFG_NEED_DV
)
||
(
hd
->
ioc
->
spi_data
.
forceDv
&
MPT_SCSICFG_NEED_DV
))
{
unsigned
long
lflags
;
/* Schedule DV if necessary */
spin_lock_irqsave
(
&
dvtaskQ_lock
,
lflags
);
if
(
!
dvtaskQ_active
)
{
dvtaskQ_active
=
1
;
spin_unlock_irqrestore
(
&
dvtaskQ_lock
,
lflags
);
INIT_WORK
(
&
mptscsih_dvTask
,
mptscsih_domainValidation
,
(
void
*
)
hd
);
schedule_work
(
&
mptscsih_dvTask
);
}
else
{
spin_unlock_irqrestore
(
&
dvtaskQ_lock
,
lflags
);
}
hd
->
ioc
->
spi_data
.
forceDv
&=
~
MPT_SCSICFG_NEED_DV
;
}
/* Set the DV flags.
*/
if
(
dvStatus
&
MPT_SCSICFG_DV_NOT_DONE
)
mptscsih_set_dvflags
(
hd
,
pScsiReq
);
#endif
/* Trying to do DV to this target, extend timeout.
* Wait to issue until flag is clear
*/
if
(
dvStatus
&
MPT_SCSICFG_DV_PENDING
)
{
mod_timer
(
&
SCpnt
->
eh_timeout
,
jiffies
+
40
*
HZ
);
issueCmd
=
0
;
}
}
#ifdef MPTSCSIH_DBG_TIMEOUT
if
(
hd
->
ioc
->
timeout_cnt
<
hd
->
ioc
->
timeout_maxcnt
)
{
foo_to
[
hd
->
ioc
->
timeout_cnt
]
=
SCpnt
;
hd
->
ioc
->
timeout_cnt
++
;
//mod_timer(&SCpnt->eh_timeout, jiffies + hd->ioc->timeout_delta);
issueCmd
=
0
;
printk
(
MYIOC_s_WARN_FMT
"to pendingQ: (sc=%p, mf=%p, time=%ld)
\n
"
,
hd
->
ioc
->
name
,
SCpnt
,
mf
,
jiffies
);
/* Set the DV flags.
*/
if
(
dvStatus
&
MPT_SCSICFG_DV_NOT_DONE
)
mptscsih_set_dvflags
(
hd
,
pScsiReq
);
if
(
!
issueCmd
)
goto
fail
;
}
}
#endif
if
(
issueCmd
)
{
mpt_put_msg_frame
(
ScsiDoneCtx
,
hd
->
ioc
,
mf
);
dmfprintk
((
MYIOC_s_INFO_FMT
"Issued SCSI cmd (%p) mf=%p idx=%d
\n
"
,
hd
->
ioc
->
name
,
SCpnt
,
mf
,
my_idx
));
DBG_DUMP_REQUEST_FRAME
(
mf
)
}
else
goto
fail
;
}
else
goto
fail
;
mpt_put_msg_frame
(
ScsiDoneCtx
,
hd
->
ioc
,
mf
);
dmfprintk
((
MYIOC_s_INFO_FMT
"Issued SCSI cmd (%p) mf=%p idx=%d
\n
"
,
hd
->
ioc
->
name
,
SCpnt
,
mf
,
my_idx
));
DBG_DUMP_REQUEST_FRAME
(
mf
)
return
0
;
fail:
...
...
@@ -2216,11 +2023,6 @@ mptscsih_TMHandler(MPT_SCSI_HOST *hd, u8 type, u8 channel, u8 target, u8 lun, in
}
}
#ifdef MPTSCSIH_DBG_TIMEOUT
if
(
hd
->
ioc
->
timeout_hard
)
rc
=
1
;
#endif
/* Only fall through to the HRH if this is a bus reset
*/
if
((
type
==
MPI_SCSITASKMGMT_TASKTYPE_RESET_BUS
)
&&
(
rc
||
...
...
@@ -2457,9 +2259,9 @@ mptscsih_dev_reset(struct scsi_cmnd * SCpnt)
printk
(
KERN_WARNING
MYNAM
": %s: >> Attempting target reset! (sc=%p)
\n
"
,
hd
->
ioc
->
name
,
SCpnt
);
/*
Unsupported for SCSI. Supported for FCP
/*
Supported for FC only.
*/
if
(
hd
->
i
s_spi
)
if
(
hd
->
i
oc
->
bus_type
==
SCSI
)
return
FAILED
;
spin_unlock_irq
(
host_lock
);
...
...
@@ -2767,39 +2569,56 @@ static int
mptscsih_slave_alloc
(
struct
scsi_device
*
device
)
{
struct
Scsi_Host
*
host
=
device
->
host
;
MPT_SCSI_HOST
*
hd
;
MPT_SCSI_HOST
*
hd
=
(
MPT_SCSI_HOST
*
)
host
->
hostdata
;
VirtDevice
*
vdev
;
hd
=
(
MPT_SCSI_HOST
*
)
host
->
hostdata
;
uint
target
=
device
->
id
;
if
(
hd
==
NULL
)
return
-
ENODEV
;
if
((
vdev
=
hd
->
Targets
[
device
->
id
])
==
NULL
)
{
if
((
vdev
=
kmalloc
(
sizeof
(
VirtDevice
),
GFP_ATOMIC
))
==
NULL
)
{
printk
(
MYIOC_s_ERR_FMT
"slave_alloc kmalloc(%d) FAILED!
\n
"
,
hd
->
ioc
->
name
,
(
int
)
sizeof
(
VirtDevice
)
);
return
-
ENOMEM
;
}
else
{
memset
(
vdev
,
0
,
sizeof
(
VirtDevice
));
vdev
->
tflags
=
MPT_TARGET_FLAGS_Q_YES
;
vdev
->
ioc_id
=
hd
->
ioc
->
id
;
vdev
->
target_id
=
device
->
id
;
vdev
->
bus_id
=
device
->
channel
;
vdev
->
raidVolume
=
0
;
hd
->
Targets
[
device
->
id
]
=
vdev
;
if
(
hd
->
is_spi
)
{
if
(
hd
->
ioc
->
spi_data
.
isRaid
&
(
1
<<
device
->
id
))
{
vdev
->
raidVolume
=
1
;
ddvtprintk
((
KERN_INFO
"RAID Volume @ id %d
\n
"
,
device
->
id
));
}
}
else
{
vdev
->
tflags
|=
MPT_TARGET_FLAGS_VALID_INQUIRY
;
}
if
((
vdev
=
hd
->
Targets
[
target
])
!=
NULL
)
goto
out
;
vdev
=
kmalloc
(
sizeof
(
VirtDevice
),
GFP_KERNEL
);
if
(
!
vdev
)
{
printk
(
MYIOC_s_ERR_FMT
"slave_alloc kmalloc(%zd) FAILED!
\n
"
,
hd
->
ioc
->
name
,
sizeof
(
VirtDevice
));
return
-
ENOMEM
;
}
memset
(
vdev
,
0
,
sizeof
(
VirtDevice
))
;
vdev
->
tflags
=
MPT_TARGET_FLAGS_Q_YES
;
vdev
->
ioc_id
=
hd
->
ioc
->
id
;
vdev
->
target_id
=
device
->
id
;
vdev
->
bus_id
=
device
->
channel
;
vdev
->
raidVolume
=
0
;
hd
->
Targets
[
device
->
id
]
=
vdev
;
if
(
hd
->
ioc
->
bus_type
==
SCSI
)
{
if
(
hd
->
ioc
->
spi_data
.
isRaid
&
(
1
<<
device
->
id
))
{
vdev
->
raidVolume
=
1
;
ddvtprintk
((
KERN_INFO
"RAID Volume @ id %d
\n
"
,
device
->
id
));
}
}
else
{
vdev
->
tflags
|=
MPT_TARGET_FLAGS_VALID_INQUIRY
;
}
out:
vdev
->
num_luns
++
;
return
0
;
}
static
int
mptscsih_is_raid_volume
(
MPT_SCSI_HOST
*
hd
,
uint
id
)
{
int
i
;
if
(
!
hd
->
ioc
->
spi_data
.
isRaid
||
!
hd
->
ioc
->
spi_data
.
pIocPg3
)
return
0
;
for
(
i
=
0
;
i
<
hd
->
ioc
->
spi_data
.
pIocPg3
->
NumPhysDisks
;
i
++
)
{
if
(
id
==
hd
->
ioc
->
spi_data
.
pIocPg3
->
PhysDisk
[
i
].
PhysDiskID
)
return
1
;
}
return
0
;
}
...
...
@@ -2812,59 +2631,37 @@ static void
mptscsih_slave_destroy
(
struct
scsi_device
*
device
)
{
struct
Scsi_Host
*
host
=
device
->
host
;
MPT_SCSI_HOST
*
hd
;
MPT_SCSI_HOST
*
hd
=
(
MPT_SCSI_HOST
*
)
host
->
hostdata
;
VirtDevice
*
vdev
;
int
raid_volume
=
0
;
hd
=
(
MPT_SCSI_HOST
*
)
host
->
hostdata
;
uint
target
=
device
->
id
;
uint
lun
=
device
->
lun
;
if
(
hd
==
NULL
)
return
;
mptscsih_search_running_cmds
(
hd
,
device
->
id
,
device
->
lun
);
mptscsih_search_running_cmds
(
hd
,
target
,
lun
);
/* Free memory and reset all flags for this target
*/
if
((
vdev
=
hd
->
Targets
[
device
->
id
])
!=
NULL
)
{
vdev
->
num_luns
--
;
if
(
vdev
->
luns
[
0
]
&
(
1
<<
device
->
lun
))
vdev
->
luns
[
0
]
&=
~
(
1
<<
device
->
lun
);
/* Free device structure only if number of luns is 0.
*/
if
(
vdev
->
num_luns
==
0
)
{
kfree
(
hd
->
Targets
[
device
->
id
]);
hd
->
Targets
[
device
->
id
]
=
NULL
;
if
(
!
hd
->
is_spi
)
return
;
if
((
hd
->
ioc
->
spi_data
.
isRaid
)
&&
(
hd
->
ioc
->
spi_data
.
pIocPg3
))
{
int
i
;
for
(
i
=
0
;
i
<
hd
->
ioc
->
spi_data
.
pIocPg3
->
NumPhysDisks
&&
raid_volume
==
0
;
i
++
)
if
(
device
->
id
==
hd
->
ioc
->
spi_data
.
pIocPg3
->
PhysDisk
[
i
].
PhysDiskID
)
{
raid_volume
=
1
;
hd
->
ioc
->
spi_data
.
forceDv
|=
MPT_SCSICFG_RELOAD_IOC_PG3
;
}
}
vdev
=
hd
->
Targets
[
target
];
vdev
->
luns
[
0
]
&=
~
(
1
<<
lun
);
if
(
--
vdev
->
num_luns
)
return
;
if
(
!
raid_volume
){
hd
->
ioc
->
spi_data
.
dvStatus
[
device
->
id
]
=
kfree
(
hd
->
Targets
[
target
]);
hd
->
Targets
[
target
]
=
NULL
;
if
(
hd
->
ioc
->
bus_type
==
SCSI
)
{
if
(
mptscsih_is_raid_volume
(
hd
,
target
))
{
hd
->
ioc
->
spi_data
.
forceDv
|=
MPT_SCSICFG_RELOAD_IOC_PG3
;
}
else
{
hd
->
ioc
->
spi_data
.
dvStatus
[
target
]
=
MPT_SCSICFG_NEGOTIATE
;
if
(
hd
->
negoNvram
==
0
)
hd
->
ioc
->
spi_data
.
dvStatus
[
device
->
id
]
|=
MPT_SCSICFG_DV_NOT_DONE
;
if
(
!
hd
->
negoNvram
)
{
hd
->
ioc
->
spi_data
.
dvStatus
[
target
]
|=
MPT_SCSICFG_DV_NOT_DONE
;
}
}
}
return
;
}
static
void
...
...
@@ -2874,7 +2671,7 @@ mptscsih_set_queue_depth(struct scsi_device *device, MPT_SCSI_HOST *hd,
int
max_depth
;
int
tagged
;
if
(
hd
->
is_spi
)
{
if
(
hd
->
ioc
->
bus_type
==
SCSI
)
{
if
(
pTarget
->
tflags
&
MPT_TARGET_FLAGS_VALID_INQUIRY
)
{
if
(
!
(
pTarget
->
tflags
&
MPT_TARGET_FLAGS_Q_YES
))
max_depth
=
1
;
...
...
@@ -2989,7 +2786,6 @@ mptscsih_store_queue_depth(struct device *dev, const char *buf, size_t count)
return
count
;
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
/*
* Private routines...
...
...
@@ -3125,10 +2921,6 @@ mptscsih_ioc_reset(MPT_ADAPTER *ioc, int reset_phase)
mpt_free_msg_frame
(
ioc
,
hd
->
tmPtr
);
}
#ifdef MPTSCSIH_DBG_TIMEOUT
ioc
->
timeout_hard
=
0
;
#endif
dtmprintk
((
MYIOC_s_WARN_FMT
"Pre-Reset complete.
\n
"
,
ioc
->
name
));
}
else
{
...
...
@@ -3158,7 +2950,7 @@ mptscsih_ioc_reset(MPT_ADAPTER *ioc, int reset_phase)
/* 4. Renegotiate to all devices, if SCSI
*/
if
(
hd
->
is_spi
)
{
if
(
ioc
->
bus_type
==
SCSI
)
{
dnegoprintk
((
"writeSDP1: ALL_IDS USE_NVRAM
\n
"
));
mptscsih_writeSDP1
(
hd
,
0
,
0
,
MPT_SCSICFG_ALL_IDS
|
MPT_SCSICFG_USE_NVRAM
);
}
...
...
@@ -3187,7 +2979,7 @@ mptscsih_ioc_reset(MPT_ADAPTER *ioc, int reset_phase)
/* 7. Set flag to force DV and re-read IOC Page 3
*/
if
(
hd
->
is_spi
)
{
if
(
ioc
->
bus_type
==
SCSI
)
{
ioc
->
spi_data
.
forceDv
=
MPT_SCSICFG_NEED_DV
|
MPT_SCSICFG_RELOAD_IOC_PG3
;
ddvtprintk
((
"Set reload IOC Pg3 Flag
\n
"
));
}
...
...
@@ -3218,7 +3010,7 @@ mptscsih_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply)
hd
=
NULL
;
if
(
ioc
->
sh
)
{
hd
=
(
MPT_SCSI_HOST
*
)
ioc
->
sh
->
hostdata
;
if
(
hd
&&
(
hd
->
is_spi
)
&&
(
hd
->
soft_resets
<
-
1
))
if
(
hd
&&
(
ioc
->
bus_type
==
SCSI
)
&&
(
hd
->
soft_resets
<
-
1
))
hd
->
soft_resets
++
;
}
break
;
...
...
@@ -3247,7 +3039,7 @@ mptscsih_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply)
if
(
ioc
->
sh
)
hd
=
(
MPT_SCSI_HOST
*
)
ioc
->
sh
->
hostdata
;
if
(
hd
&&
(
hd
->
is_spi
)
&&
(
hd
->
negoNvram
==
0
))
{
if
(
hd
&&
(
ioc
->
bus_type
==
SCSI
)
&&
(
hd
->
negoNvram
==
0
))
{
ScsiCfgData
*
pSpi
;
Ioc3PhysDisk_t
*
pPDisk
;
int
numPDisk
;
...
...
@@ -3394,7 +3186,7 @@ mptscsih_initTarget(MPT_SCSI_HOST *hd, int bus_id, int target_id, u8 lun, char *
indexed_lun
=
(
lun
%
32
);
vdev
->
luns
[
lun_index
]
|=
(
1
<<
indexed_lun
);
if
(
hd
->
i
s_spi
)
{
if
(
hd
->
i
oc
->
bus_type
==
SCSI
)
{
if
((
data
[
0
]
==
TYPE_PROCESSOR
)
&&
(
hd
->
ioc
->
spi_data
.
Saf_Te
))
{
/* Treat all Processors as SAF-TE if
* command line option is set */
...
...
@@ -4675,7 +4467,7 @@ mptscsih_synchronize_cache(MPT_SCSI_HOST *hd, int portnum)
/* Write SDP1 for all SCSI devices
* Alloc memory and set up config buffer
*/
if
(
hd
->
is_spi
)
{
if
(
ioc
->
bus_type
==
SCSI
)
{
if
(
ioc
->
spi_data
.
sdp1length
>
0
)
{
pcfg1Data
=
(
SCSIDevicePage1_t
*
)
pci_alloc_consistent
(
ioc
->
pcidev
,
ioc
->
spi_data
.
sdp1length
*
4
,
&
cfg1_dma_addr
);
...
...
@@ -4818,7 +4610,7 @@ mptscsih_domainValidation(void *arg)
msleep
(
250
);
/* DV only to SCSI adapters */
if
(
(
int
)
ioc
->
chip_type
<=
(
int
)
FC929
)
if
(
ioc
->
bus_type
!=
SCSI
)
continue
;
/* Make sure everything looks ok */
...
...
@@ -6289,107 +6081,6 @@ mptscsih_fillbuf(char *buffer, int size, int index, int width)
#endif
/* ~MPTSCSIH_ENABLE_DOMAIN_VALIDATION */
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
/* Commandline Parsing routines and defines.
*
* insmod format:
* insmod mptscsih mptscsih="width:1 dv:n factor:0x09 saf-te:1"
* boot format:
* mptscsih=width:1,dv:n,factor:0x8,saf-te:1
*
*/
#ifdef MODULE
#define ARG_SEP ' '
#else
#define ARG_SEP ','
#endif
#ifdef MODULE
static
char
setup_token
[]
__initdata
=
"dv:"
"width:"
"factor:"
"saf-te:"
;
/* DO NOT REMOVE THIS ';' */
#endif
#define OPT_DV 1
#define OPT_MAX_WIDTH 2
#define OPT_MIN_SYNC_FACTOR 3
#define OPT_SAF_TE 4
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
#ifdef MODULE
static
int
get_setup_token
(
char
*
p
)
{
char
*
cur
=
setup_token
;
char
*
pc
;
int
i
=
0
;
while
(
cur
!=
NULL
&&
(
pc
=
strchr
(
cur
,
':'
))
!=
NULL
)
{
++
pc
;
++
i
;
if
(
!
strncmp
(
p
,
cur
,
pc
-
cur
))
return
i
;
cur
=
pc
;
}
return
0
;
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
static
int
mptscsih_setup
(
char
*
str
)
{
char
*
cur
=
str
;
char
*
pc
,
*
pv
;
unsigned
long
val
;
int
c
;
while
(
cur
!=
NULL
&&
(
pc
=
strchr
(
cur
,
':'
))
!=
NULL
)
{
char
*
pe
;
val
=
0
;
pv
=
pc
;
c
=
*++
pv
;
if
(
c
==
'n'
)
val
=
0
;
else
if
(
c
==
'y'
)
val
=
1
;
else
val
=
(
int
)
simple_strtoul
(
pv
,
&
pe
,
0
);
printk
(
"Found Token: %s, value %x
\n
"
,
cur
,
(
int
)
val
);
switch
(
get_setup_token
(
cur
))
{
case
OPT_DV
:
driver_setup
.
dv
=
val
;
break
;
case
OPT_MAX_WIDTH
:
driver_setup
.
max_width
=
val
;
break
;
case
OPT_MIN_SYNC_FACTOR
:
driver_setup
.
min_sync_fac
=
val
;
break
;
case
OPT_SAF_TE
:
driver_setup
.
saf_te
=
val
;
break
;
default:
printk
(
"mptscsih_setup: unexpected boot option '%.*s' ignored
\n
"
,
(
int
)(
pc
-
cur
+
1
),
cur
);
break
;
}
if
((
cur
=
strchr
(
cur
,
ARG_SEP
))
!=
NULL
)
++
cur
;
}
return
1
;
}
#endif
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
module_init
(
mptscsih_init
);
module_exit
(
mptscsih_exit
);
drivers/message/fusion/mptscsih.h
View file @
4c244d1a
...
...
@@ -95,17 +95,8 @@ struct mptscsih_driver_setup
{
u8
dv
;
u8
max_width
;
u8
min_sync_fac
;
u8
min_sync_fac
tor
;
u8
saf_te
;
};
#define MPTSCSIH_DRIVER_SETUP \
{ \
MPTSCSIH_DOMAIN_VALIDATION, \
MPTSCSIH_MAX_WIDTH, \
MPTSCSIH_MIN_SYNC, \
MPTSCSIH_SAF_TE, \
}
#endif
drivers/s390/scsi/zfcp_def.h
View file @
4c244d1a
...
...
@@ -34,8 +34,7 @@
#ifndef ZFCP_DEF_H
#define ZFCP_DEF_H
/* this drivers version (do not edit !!! generated and updated by cvs) */
#define ZFCP_DEF_REVISION "$Revision: 1.110 $"
#define ZFCP_DEF_REVISION "$Revision: 1.111 $"
/*************************** INCLUDES *****************************************/
...
...
@@ -70,6 +69,7 @@
/********************* GENERAL DEFINES *********************************/
/* zfcp version number, it consists of major, minor, and patch-level number */
#define ZFCP_VERSION "4.2.0"
/**
...
...
drivers/s390/scsi/zfcp_erp.c
View file @
4c244d1a
...
...
@@ -31,8 +31,7 @@
#define ZFCP_LOG_AREA ZFCP_LOG_AREA_ERP
/* this drivers version (do not edit !!! generated and updated by cvs) */
#define ZFCP_ERP_REVISION "$Revision: 1.83 $"
#define ZFCP_ERP_REVISION "$Revision: 1.85 $"
#include "zfcp_ext.h"
...
...
@@ -3482,9 +3481,8 @@ zfcp_erp_port_access_denied(struct zfcp_port *port)
debug_text_event
(
adapter
->
erp_dbf
,
3
,
"p_access_block"
);
debug_event
(
adapter
->
erp_dbf
,
3
,
&
port
->
wwpn
,
sizeof
(
wwn_t
));
read_lock_irqsave
(
&
zfcp_data
.
config_lock
,
flags
);
zfcp_erp_modify_port_status
(
port
,
ZFCP_STATUS_COMMON_ERP_FAILED
|
ZFCP_STATUS_COMMON_ACCESS_DENIED
,
ZFCP_SET
);
zfcp_erp_modify_port_status
(
port
,
ZFCP_STATUS_COMMON_ERP_FAILED
|
ZFCP_STATUS_COMMON_ACCESS_DENIED
,
ZFCP_SET
);
read_unlock_irqrestore
(
&
zfcp_data
.
config_lock
,
flags
);
}
...
...
@@ -3500,9 +3498,8 @@ zfcp_erp_unit_access_denied(struct zfcp_unit *unit)
debug_text_event
(
adapter
->
erp_dbf
,
3
,
"u_access_block"
);
debug_event
(
adapter
->
erp_dbf
,
3
,
&
unit
->
fcp_lun
,
sizeof
(
fcp_lun_t
));
zfcp_erp_modify_unit_status
(
unit
,
ZFCP_STATUS_COMMON_ERP_FAILED
|
ZFCP_STATUS_COMMON_ACCESS_DENIED
,
ZFCP_SET
);
zfcp_erp_modify_unit_status
(
unit
,
ZFCP_STATUS_COMMON_ERP_FAILED
|
ZFCP_STATUS_COMMON_ACCESS_DENIED
,
ZFCP_SET
);
}
/*
...
...
@@ -3541,19 +3538,21 @@ zfcp_erp_port_access_changed(struct zfcp_port *port)
debug_text_event
(
adapter
->
erp_dbf
,
3
,
"p_access_unblock"
);
debug_event
(
adapter
->
erp_dbf
,
3
,
&
port
->
wwpn
,
sizeof
(
wwn_t
));
if
(
!
atomic_test_mask
(
ZFCP_STATUS_COMMON_ACCESS_DENIED
,
&
port
->
status
))
{
if
(
!
atomic_test_mask
(
ZFCP_STATUS_COMMON_ACCESS_DENIED
,
&
port
->
status
))
{
if
(
!
atomic_test_mask
(
ZFCP_STATUS_PORT_WKA
,
&
port
->
status
))
list_for_each_entry
(
unit
,
&
port
->
unit_list_head
,
list
)
zfcp_erp_unit_access_changed
(
unit
);
return
;
}
ZFCP_LOG_NORMAL
(
"
Trying to reopen
port 0x%016Lx on adapter %s "
"
due to update to access control table
\n
"
,
ZFCP_LOG_NORMAL
(
"
reopen of
port 0x%016Lx on adapter %s "
"
(due to ACT update)
\n
"
,
port
->
wwpn
,
zfcp_get_busid_by_adapter
(
adapter
));
if
(
zfcp_erp_port_reopen
(
port
,
ZFCP_STATUS_COMMON_ERP_FAILED
)
!=
0
)
ZFCP_LOG_NORMAL
(
"Reopen of port 0x%016Lx on adapter %s failed
\n
"
,
port
->
wwpn
,
zfcp_get_busid_by_adapter
(
adapter
));
ZFCP_LOG_NORMAL
(
"failed reopen of port"
"(adapter %s, wwpn=0x%016Lx)
\n
"
,
zfcp_get_busid_by_adapter
(
adapter
),
port
->
wwpn
);
}
/*
...
...
@@ -3572,16 +3571,15 @@ zfcp_erp_unit_access_changed(struct zfcp_unit *unit)
if
(
!
atomic_test_mask
(
ZFCP_STATUS_COMMON_ACCESS_DENIED
,
&
unit
->
status
))
return
;
ZFCP_LOG_NORMAL
(
"Trying to reopen unit 0x%016Lx "
"on port 0x%016Lx on adapter %s "
"due to update to access control table
\n
"
,
ZFCP_LOG_NORMAL
(
"reopen of unit 0x%016Lx on port 0x%016Lx "
" on adapter %s (due to ACT update)
\n
"
,
unit
->
fcp_lun
,
unit
->
port
->
wwpn
,
zfcp_get_busid_by_adapter
(
adapter
));
if
(
zfcp_erp_unit_reopen
(
unit
,
ZFCP_STATUS_COMMON_ERP_FAILED
)
!=
0
)
ZFCP_LOG_NORMAL
(
"
Reopen of unit 0x%016Lx
"
"
on port 0x%016Lx on adapter %s failed
\n
"
,
unit
->
fcp_lun
,
unit
->
port
->
wwpn
,
zfcp_get_busid_by_adapter
(
adapter
)
);
ZFCP_LOG_NORMAL
(
"
failed reopen of unit (adapter %s,
"
"
wwpn=0x%016Lx, fcp_lun=0x%016Lx)
\n
"
,
zfcp_get_busid_by_adapter
(
adapter
)
,
unit
->
port
->
wwpn
,
unit
->
fcp_lun
);
}
#undef ZFCP_LOG_AREA
drivers/s390/scsi/zfcp_ext.h
View file @
4c244d1a
...
...
@@ -31,8 +31,8 @@
#ifndef ZFCP_EXT_H
#define ZFCP_EXT_H
/* this drivers version (do not edit !!! generated and updated by cvs) */
#define ZFCP_EXT_REVISION "$Revision: 1.6
1
$"
#define ZFCP_EXT_REVISION "$Revision: 1.6
2
$"
#include "zfcp_def.h"
...
...
drivers/s390/scsi/zfcp_fsf.c
View file @
4c244d1a
...
...
@@ -30,8 +30,7 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/* this drivers version (do not edit !!! generated and updated by cvs) */
#define ZFCP_FSF_C_REVISION "$Revision: 1.86 $"
#define ZFCP_FSF_C_REVISION "$Revision: 1.88 $"
#include "zfcp_ext.h"
...
...
@@ -1737,7 +1736,7 @@ zfcp_fsf_send_els(struct zfcp_send_els *els)
adapter
=
els
->
adapter
;
ret
=
zfcp_fsf_req_create
(
adapter
,
FSF_QTCB_SEND_ELS
,
ZFCP_
WAIT_FOR_SBAL
|
ZFCP_
REQ_AUTO_CLEANUP
,
ZFCP_REQ_AUTO_CLEANUP
,
NULL
,
&
lock_flags
,
&
fsf_req
);
if
(
ret
<
0
)
{
ZFCP_LOG_INFO
(
"error: creation of ELS request failed "
...
...
@@ -3094,57 +3093,11 @@ zfcp_fsf_open_unit_handler(struct zfcp_fsf_req *fsf_req)
exclusive
=
bottom
->
lun_access_info
&
FSF_UNIT_ACCESS_EXCLUSIVE
;
readwrite
=
bottom
->
lun_access_info
&
FSF_UNIT_ACCESS_OUTBOUND_TRANSFER
;
if
(
!
adapter
->
supported_features
&
FSF_FEATURE_CFDC
)
goto
no_cfdc
;
atomic_clear_mask
(
ZFCP_STATUS_COMMON_ACCESS_DENIED
|
ZFCP_STATUS_UNIT_SHARED
|
ZFCP_STATUS_UNIT_READONLY
,
&
unit
->
status
);
if
(
!
allowed
)
atomic_set_mask
(
ZFCP_STATUS_COMMON_ACCESS_DENIED
,
&
unit
->
status
);
if
(
!
adapter
->
supported_features
&
FSF_FEATURE_LUN_SHARING
)
goto
no_lun_sharing
;
if
(
!
exclusive
)
atomic_set_mask
(
ZFCP_STATUS_UNIT_SHARED
,
&
unit
->
status
);
if
(
!
readwrite
)
{
atomic_set_mask
(
ZFCP_STATUS_UNIT_READONLY
,
&
unit
->
status
);
ZFCP_LOG_NORMAL
(
"Unit 0x%016Lx on port 0x%016Lx on adapter %s "
"accessed read-only
\n
"
,
unit
->
fcp_lun
,
unit
->
port
->
wwpn
,
zfcp_get_busid_by_unit
(
unit
));
}
if
(
exclusive
&&
!
readwrite
)
{
ZFCP_LOG_NORMAL
(
"Exclusive access of read-only unit not "
"supported
\n
"
);
zfcp_erp_unit_failed
(
unit
);
fsf_req
->
status
|=
ZFCP_STATUS_FSFREQ_ERROR
;
goto
skip_fsfstatus
;
}
if
(
!
exclusive
&&
readwrite
)
{
ZFCP_LOG_NORMAL
(
"Shared access of read-write unit is not "
"supported
\n
"
);
zfcp_erp_unit_failed
(
unit
);
fsf_req
->
status
|=
ZFCP_STATUS_FSFREQ_ERROR
;
goto
skip_fsfstatus
;
}
no_lun_sharing:
no_cfdc:
if
(
!
(
adapter
->
supported_features
&
FSF_FEATURE_CFDC
)
&&
(
adapter
->
supported_features
&
FSF_FEATURE_LUN_SHARING
))
{
ZFCP_LOG_NORMAL
(
"LUN sharing without access control is not "
"supported.
\n
"
);
zfcp_erp_unit_failed
(
unit
);
fsf_req
->
status
|=
ZFCP_STATUS_FSFREQ_ERROR
;
goto
skip_fsfstatus
;
}
/* evaluate FSF status in QTCB */
switch
(
header
->
fsf_status
)
{
...
...
@@ -3196,6 +3149,8 @@ zfcp_fsf_open_unit_handler(struct zfcp_fsf_req *fsf_req)
}
debug_text_event
(
adapter
->
erp_dbf
,
1
,
"fsf_s_access"
);
zfcp_erp_unit_access_denied
(
unit
);
atomic_clear_mask
(
ZFCP_STATUS_UNIT_SHARED
,
&
unit
->
status
);
atomic_clear_mask
(
ZFCP_STATUS_UNIT_READONLY
,
&
unit
->
status
);
fsf_req
->
status
|=
ZFCP_STATUS_FSFREQ_ERROR
;
break
;
...
...
drivers/s390/scsi/zfcp_scsi.c
View file @
4c244d1a
...
...
@@ -31,8 +31,7 @@
#define ZFCP_LOG_AREA ZFCP_LOG_AREA_SCSI
/* this drivers version (do not edit !!! generated and updated by cvs) */
#define ZFCP_SCSI_REVISION "$Revision: 1.73 $"
#define ZFCP_SCSI_REVISION "$Revision: 1.74 $"
#include "zfcp_ext.h"
...
...
drivers/scsi/Kconfig
View file @
4c244d1a
...
...
@@ -1767,7 +1767,7 @@ config SCSI_SUNESP
config ZFCP
tristate "FCP host bus adapter driver for IBM eServer zSeries"
depends on ARCH_S390 && SCSI
depends on ARCH_S390 &&
QDIO &&
SCSI
select SCSI_FC_ATTRS
help
If you want to access SCSI devices attached to your IBM eServer
...
...
drivers/scsi/aacraid/aachba.c
View file @
4c244d1a
...
...
@@ -645,9 +645,31 @@ int aac_get_adapter_info(struct aac_dev* dev)
dev
->
adapter_info
.
serial
[
1
]);
dev
->
nondasd_support
=
0
;
dev
->
raid_scsi_mode
=
0
;
if
(
dev
->
adapter_info
.
options
&
AAC_OPT_NONDASD
){
dev
->
nondasd_support
=
1
;
}
/*
* If the firmware supports ROMB RAID/SCSI mode and we are currently
* in RAID/SCSI mode, set the flag. For now if in this mode we will
* force nondasd support on. If we decide to allow the non-dasd flag
* additional changes changes will have to be made to support
* RAID/SCSI. the function aac_scsi_cmd in this module will have to be
* changed to support the new dev->raid_scsi_mode flag instead of
* leaching off of the dev->nondasd_support flag. Also in linit.c the
* function aac_detect will have to be modified where it sets up the
* max number of channels based on the aac->nondasd_support flag only.
*/
if
((
dev
->
adapter_info
.
options
&
AAC_OPT_SCSI_MANAGED
)
&&
(
dev
->
adapter_info
.
options
&
AAC_OPT_RAID_SCSI_MODE
))
{
dev
->
nondasd_support
=
1
;
dev
->
raid_scsi_mode
=
1
;
}
if
(
dev
->
raid_scsi_mode
!=
0
)
printk
(
KERN_INFO
"%s%d: ROMB RAID/SCSI mode enabled
\n
"
,
dev
->
name
,
dev
->
id
);
if
(
nondasd
!=
-
1
)
{
dev
->
nondasd_support
=
(
nondasd
!=
0
);
}
...
...
@@ -1137,7 +1159,7 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd)
char
*
cp
;
dprintk
((
KERN_DEBUG
"READ CAPACITY command.
\n
"
));
if
(
fsa_dev_ptr
[
cid
].
size
<=
0x100000000
)
if
(
fsa_dev_ptr
[
cid
].
size
<=
0x100000000
LL
)
capacity
=
fsa_dev_ptr
[
cid
].
size
-
1
;
else
capacity
=
(
u32
)
-
1
;
...
...
@@ -1446,8 +1468,17 @@ static void aac_srb_callback(void *context, struct fib * fibptr)
if
(
b
==
TYPE_TAPE
||
b
==
TYPE_WORM
||
b
==
TYPE_ROM
||
b
==
TYPE_MOD
||
b
==
TYPE_MEDIUM_CHANGER
||
(
b
==
TYPE_DISK
&&
(
b1
&
0x80
))
){
scsicmd
->
result
=
DID_OK
<<
16
|
COMMAND_COMPLETE
<<
8
;
/*
* We will allow disk devices if in RAID/SCSI mode and
* the channel is 2
*/
}
else
if
((
dev
->
raid_scsi_mode
)
&&
(
scsicmd
->
device
->
channel
==
2
))
{
scsicmd
->
result
=
DID_OK
<<
16
|
COMMAND_COMPLETE
<<
8
;
}
else
{
scsicmd
->
result
=
DID_NO_CONNECT
<<
16
|
COMMAND_COMPLETE
<<
8
;
scsicmd
->
result
=
DID_NO_CONNECT
<<
16
|
COMMAND_COMPLETE
<<
8
;
}
}
else
{
scsicmd
->
result
=
DID_OK
<<
16
|
COMMAND_COMPLETE
<<
8
;
...
...
@@ -1479,8 +1510,17 @@ static void aac_srb_callback(void *context, struct fib * fibptr)
if
(
b
==
TYPE_TAPE
||
b
==
TYPE_WORM
||
b
==
TYPE_ROM
||
b
==
TYPE_MOD
||
b
==
TYPE_MEDIUM_CHANGER
||
(
b
==
TYPE_DISK
&&
(
b1
&
0x80
))
){
scsicmd
->
result
=
DID_OK
<<
16
|
COMMAND_COMPLETE
<<
8
;
/*
* We will allow disk devices if in RAID/SCSI mode and
* the channel is 2
*/
}
else
if
((
dev
->
raid_scsi_mode
)
&&
(
scsicmd
->
device
->
channel
==
2
))
{
scsicmd
->
result
=
DID_OK
<<
16
|
COMMAND_COMPLETE
<<
8
;
}
else
{
scsicmd
->
result
=
DID_NO_CONNECT
<<
16
|
COMMAND_COMPLETE
<<
8
;
scsicmd
->
result
=
DID_NO_CONNECT
<<
16
|
COMMAND_COMPLETE
<<
8
;
}
break
;
}
...
...
drivers/scsi/aacraid/aacraid.h
View file @
4c244d1a
...
...
@@ -805,6 +805,8 @@ struct aac_adapter_info
#define AAC_OPT_SGMAP_HOST64 cpu_to_le32(1<<10)
#define AAC_OPT_ALARM cpu_to_le32(1<<11)
#define AAC_OPT_NONDASD cpu_to_le32(1<<12)
#define AAC_OPT_SCSI_MANAGED cpu_to_le32(1<<13)
#define AAC_OPT_RAID_SCSI_MODE cpu_to_le32(1<<14)
struct
aac_dev
{
...
...
@@ -877,6 +879,7 @@ struct aac_dev
*/
u8
nondasd_support
;
u8
dac_support
;
u8
raid_scsi_mode
;
};
#define aac_adapter_interrupt(dev) \
...
...
drivers/scsi/aic7xxx/aic79xx_osm.h
View file @
4c244d1a
...
...
@@ -540,7 +540,7 @@ struct ahd_platform_data {
uint32_t
irq
;
/* IRQ for this adapter */
uint32_t
bios_address
;
uint32_t
mem_busaddr
;
/* Mem Base Addr */
dma_addr
_t
hw_dma_mask
;
uint64
_t
hw_dma_mask
;
ahd_linux_softc_flags
flags
;
};
...
...
drivers/scsi/aic7xxx/aic79xx_osm_pci.c
View file @
4c244d1a
...
...
@@ -170,24 +170,22 @@ ahd_linux_pci_dev_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
if
(
sizeof
(
dma_addr_t
)
>
4
)
{
uint64_t
memsize
;
dma_addr_t
mask_64bit
;
dma_addr_t
mask_39bit
;
const
uint64_t
mask_39bit
=
0x7FFFFFFFFFULL
;
memsize
=
ahd_linux_get_memsize
();
mask_64bit
=
(
dma_addr_t
)
0xFFFFFFFFFFFFFFFFULL
;
mask_39bit
=
(
dma_addr_t
)
0x7FFFFFFFFFULL
;
if
(
memsize
>=
0x8000000000ULL
&&
pci_set_dma_mask
(
pdev
,
mask_64bit
)
==
0
)
{
&&
pci_set_dma_mask
(
pdev
,
DMA_64BIT_MASK
)
==
0
)
{
ahd
->
flags
|=
AHD_64BIT_ADDRESSING
;
ahd
->
platform_data
->
hw_dma_mask
=
mask_64bit
;
ahd
->
platform_data
->
hw_dma_mask
=
DMA_64BIT_MASK
;
}
else
if
(
memsize
>
0x80000000
&&
pci_set_dma_mask
(
pdev
,
mask_39bit
)
==
0
)
{
ahd
->
flags
|=
AHD_39BIT_ADDRESSING
;
ahd
->
platform_data
->
hw_dma_mask
=
mask_39bit
;
}
}
else
{
pci_set_dma_mask
(
pdev
,
0xFFFFFFFF
);
ahd
->
platform_data
->
hw_dma_mask
=
0xFFFFFFFF
;
pci_set_dma_mask
(
pdev
,
DMA_32BIT_MASK
);
ahd
->
platform_data
->
hw_dma_mask
=
DMA_32BIT_MASK
;
}
ahd
->
dev_softc
=
pci
;
error
=
ahd_pci_config
(
ahd
,
entry
);
...
...
drivers/scsi/aic7xxx/aic7xxx_osm.h
View file @
4c244d1a
...
...
@@ -545,7 +545,7 @@ struct ahc_platform_data {
uint32_t
irq
;
/* IRQ for this adapter */
uint32_t
bios_address
;
uint32_t
mem_busaddr
;
/* Mem Base Addr */
dma_addr
_t
hw_dma_mask
;
uint64
_t
hw_dma_mask
;
ahc_linux_softc_flags
flags
;
};
...
...
drivers/scsi/aic7xxx/aic7xxx_osm_pci.c
View file @
4c244d1a
...
...
@@ -175,7 +175,7 @@ static int
ahc_linux_pci_dev_probe
(
struct
pci_dev
*
pdev
,
const
struct
pci_device_id
*
ent
)
{
char
buf
[
80
];
dma_addr_t
mask_39bit
;
const
uint64_t
mask_39bit
=
0x7FFFFFFFFFULL
;
struct
ahc_softc
*
ahc
;
ahc_dev_softc_t
pci
;
struct
ahc_pci_identity
*
entry
;
...
...
@@ -226,18 +226,17 @@ ahc_linux_pci_dev_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
}
pci_set_master
(
pdev
);
mask_39bit
=
0x7FFFFFFFFFULL
;
if
(
sizeof
(
dma_addr_t
)
>
4
&&
ahc_linux_get_memsize
()
>
0x80000000
&&
pci_set_dma_mask
(
pdev
,
mask_39bit
)
==
0
)
{
ahc
->
flags
|=
AHC_39BIT_ADDRESSING
;
ahc
->
platform_data
->
hw_dma_mask
=
mask_39bit
;
}
else
{
if
(
pci_set_dma_mask
(
pdev
,
0xFFFFFFFF
))
{
if
(
pci_set_dma_mask
(
pdev
,
DMA_32BIT_MASK
))
{
printk
(
KERN_WARNING
"aic7xxx: No suitable DMA available.
\n
"
);
return
(
-
ENODEV
);
}
ahc
->
platform_data
->
hw_dma_mask
=
0xFFFFFFFF
;
ahc
->
platform_data
->
hw_dma_mask
=
DMA_32BIT_MASK
;
}
#endif
ahc
->
dev_softc
=
pci
;
...
...
drivers/scsi/scsi_devinfo.c
View file @
4c244d1a
...
...
@@ -118,6 +118,7 @@ static struct {
* Other types of devices that have special flags.
* Note that all USB devices should have the BLIST_INQUIRY_36 flag.
*/
{
"3PARdata"
,
"VV"
,
NULL
,
BLIST_REPORTLUN2
},
{
"ADAPTEC"
,
"AACRAID"
,
NULL
,
BLIST_FORCELUN
},
{
"ADAPTEC"
,
"Adaptec 5400S"
,
NULL
,
BLIST_FORCELUN
},
{
"AFT PRO"
,
"-IX CF"
,
"0.0>"
,
BLIST_FORCELUN
},
...
...
drivers/scsi/scsi_lib.c
View file @
4c244d1a
...
...
@@ -728,7 +728,7 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes,
req
->
sense_len
=
len
;
}
}
else
req
->
data_len
-=
cmd
->
bufflen
;
req
->
data_len
=
cmd
->
resid
;
}
/*
...
...
drivers/scsi/scsi_transport_spi.c
View file @
4c244d1a
...
...
@@ -361,9 +361,8 @@ static ssize_t store_spi_host_signalling(struct class_device *cdev,
enum
spi_signal_type
type
=
spi_signal_to_value
(
buf
);
if
(
type
!=
SPI_SIGNAL_UNKNOWN
)
return
count
;
i
->
f
->
set_signalling
(
shost
,
type
)
;
i
->
f
->
set_signalling
(
shost
,
type
);
return
count
;
}
static
CLASS_DEVICE_ATTR
(
signalling
,
S_IRUGO
|
S_IWUSR
,
...
...
@@ -635,7 +634,11 @@ spi_dv_device_internal(struct scsi_request *sreq, u8 *buffer)
/* OK, now we have our initial speed set by the read only inquiry
* test, now try an echo buffer test (if the device allows it) */
if
((
len
=
spi_dv_device_get_echo_buffer
(
sreq
,
buffer
))
==
0
)
{
len
=
0
;
if
(
sdev
->
ppr
)
len
=
spi_dv_device_get_echo_buffer
(
sreq
,
buffer
);
if
(
len
==
0
)
{
SPI_PRINTK
(
sdev
->
sdev_target
,
KERN_INFO
,
"Domain Validation skipping write tests
\n
"
);
return
;
}
...
...
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