SCSI misc on 20161006
This update includes the usual round of major driver updates (hpsa, be2iscsi, hisi_sas, zfcp, cxlflash). There's a new incarnation of hpsa called smartpqi for which a driver is added, there's some cleanup work of the ibm vscsi target and updates to libfc, plus a whole host of minor fixes and updates and finally the removal of several ISA drivers which seem not to have been used for years. Signed-off-by: James Bottomley <jejb@linux.vnet.ibm.com> -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQIcBAABAgAGBQJX9fZGAAoJEAVr7HOZEZN4TfkP/2bOHBGqyQ16P9jRjWXtC6pJ Fp/ZfU6ZrSpcGN49Wr9vyPbpvYKdtIZg3oUs6XhKmnfP+lbeIIJ5jxlEnwBVwWya JOOD91o8lLN7zRMuyfYIfgnm4dIU3GSLpnWIyfAhoMH1utiLLcq7s2XEM5girDft dVUL20XprtJkVsg2C+hhRAI8PMjWFInadj2eRIHdxJIDC8fXR+w8ojBShou+lf6Q /zYPgckTCBlZWIc/ohI3j52r4qmkChgX+3/jR+v9i5bGXjFfpmh0GzxM7tscESSa 4Y/ZLTg72j/colYkA1jt04YLxA2dQCa6b8DmJIcUTL0WStsJUQH5hFFFHt3mSafI HirqRfHpmadHbfi5Kiyx688S5b0oVN4bMxvMoEOAUy7WVaLEr84GJ5VYhoAwkPhL USaDx6Hsa1OT0lGYAtyRKOUT/d55grztEOnSxBFiQgRoB8wrGX616Xg8VONy7JZS wEZtf1v5K0+ZXJiu4NtY+/RzQdOwu7OQHKfN5mLri8tJ+eo8d88ZwSARJxEZetSM P4EVR2ZjhL+Ct78v3i4Yj8FVMXHSzzulj530KQ/U7z/l4c2S54mtEKijDmXmto8k baiIah/wgaS/fznoOsJw+Iy/2HqsAtNZsReNcgNPLzfabTBXKSBXJDLmO4d3g/3s zwj1m3JtzAx2j3kQrkSv =cyTO -----END PGP SIGNATURE----- Merge tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi Pull SCSI updates from James Bottomley: "This update includes the usual round of major driver updates (hpsa, be2iscsi, hisi_sas, zfcp, cxlflash). There's a new incarnation of hpsa called smartpqi for which a driver is added, there's some cleanup work of the ibm vscsi target and updates to libfc, plus a whole host of minor fixes and updates and finally the removal of several ISA drivers which seem not to have been used for years" * tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi: (173 commits) scsi: mvsas: Mark symbols static where possible scsi: pm8001: Mark symbols static where possible scsi: arcmsr: Simplify user_len checking scsi: fcoe: fix off by one in eth2fc_speed() scsi: dtc: remove from tree scsi: t128: remove from tree scsi: pas16: remove from tree scsi: u14-34f: remove from tree scsi: ultrastor: remove from tree scsi: in2000: remove from tree scsi: wd7000: remove from tree scsi: scsi_dh_alua: Fix memory leak in alua_rtpg() scsi: lpfc: Mark symbols static where possible scsi: hpsa: correct call to hpsa_do_reset scsi: ufs: Get a TM service response from the correct offset scsi: ibmvfc: Fix I/O hang when port is not mapped scsi: megaraid_sas: clean function declarations in megaraid_sas_base.c up scsi: ipr: Remove redundant messages at adapter init time scsi: ipr: Don't log unnecessary 9084 error details scsi: smartpqi: raid bypass lba calculation fix ...
This commit is contained in:
commit
4dfddf5036
117 changed files with 12923 additions and 13623 deletions
|
|
@ -121,7 +121,7 @@ Block library API
|
|||
below.
|
||||
|
||||
The block library can be found on GitHub:
|
||||
http://www.github.com/mikehollinger/ibmcapikv
|
||||
http://github.com/open-power/capiflash
|
||||
|
||||
|
||||
CXL Flash Driver IOCTLs
|
||||
|
|
@ -171,11 +171,30 @@ DK_CXLFLASH_ATTACH
|
|||
destroyed, the tokens are to be considered stale and subsequent
|
||||
usage will result in errors.
|
||||
|
||||
- When a context is no longer needed, the user shall detach from
|
||||
the context via the DK_CXLFLASH_DETACH ioctl.
|
||||
- A valid adapter file descriptor (fd2 >= 0) is only returned on
|
||||
the initial attach for a context. Subsequent attaches to an
|
||||
existing context (DK_CXLFLASH_ATTACH_REUSE_CONTEXT flag present)
|
||||
do not provide the adapter file descriptor as it was previously
|
||||
made known to the application.
|
||||
|
||||
- A close on fd2 will invalidate the tokens. This operation is not
|
||||
required by the user.
|
||||
- When a context is no longer needed, the user shall detach from
|
||||
the context via the DK_CXLFLASH_DETACH ioctl. When this ioctl
|
||||
returns with a valid adapter file descriptor and the return flag
|
||||
DK_CXLFLASH_APP_CLOSE_ADAP_FD is present, the application _must_
|
||||
close the adapter file descriptor following a successful detach.
|
||||
|
||||
- When this ioctl returns with a valid fd2 and the return flag
|
||||
DK_CXLFLASH_APP_CLOSE_ADAP_FD is present, the application _must_
|
||||
close fd2 in the following circumstances:
|
||||
|
||||
+ Following a successful detach of the last user of the context
|
||||
+ Following a successful recovery on the context's original fd2
|
||||
+ In the child process of a fork(), following a clone ioctl,
|
||||
on the fd2 associated with the source context
|
||||
|
||||
- At any time, a close on fd2 will invalidate the tokens. Applications
|
||||
should exercise caution to only close fd2 when appropriate (outlined
|
||||
in the previous bullet) to avoid premature loss of I/O.
|
||||
|
||||
DK_CXLFLASH_USER_DIRECT
|
||||
-----------------------
|
||||
|
|
@ -254,6 +273,10 @@ DK_CXLFLASH_DETACH
|
|||
success, all "tokens" which had been provided to the user from the
|
||||
DK_CXLFLASH_ATTACH onward are no longer valid.
|
||||
|
||||
When the DK_CXLFLASH_APP_CLOSE_ADAP_FD flag was returned on a successful
|
||||
attach, the application _must_ close the fd2 associated with the context
|
||||
following the detach of the final user of the context.
|
||||
|
||||
DK_CXLFLASH_VLUN_CLONE
|
||||
----------------------
|
||||
This ioctl is responsible for cloning a previously created
|
||||
|
|
@ -261,7 +284,7 @@ DK_CXLFLASH_VLUN_CLONE
|
|||
support maintaining user space access to storage after a process
|
||||
forks. Upon success, the child process (which invoked the ioctl)
|
||||
will have access to the same LUNs via the same resource handle(s)
|
||||
and fd2 as the parent, but under a different context.
|
||||
as the parent, but under a different context.
|
||||
|
||||
Context sharing across processes is not supported with CXL and
|
||||
therefore each fork must be met with establishing a new context
|
||||
|
|
@ -275,6 +298,12 @@ DK_CXLFLASH_VLUN_CLONE
|
|||
translation tables are copied from the parent context to the child's
|
||||
and then synced with the AFU.
|
||||
|
||||
When the DK_CXLFLASH_APP_CLOSE_ADAP_FD flag was returned on a successful
|
||||
attach, the application _must_ close the fd2 associated with the source
|
||||
context (still resident/accessible in the parent process) following the
|
||||
clone. This is to avoid a stale entry in the file descriptor table of the
|
||||
child process.
|
||||
|
||||
DK_CXLFLASH_VERIFY
|
||||
------------------
|
||||
This ioctl is used to detect various changes such as the capacity of
|
||||
|
|
@ -309,6 +338,11 @@ DK_CXLFLASH_RECOVER_AFU
|
|||
at which time the context/resources they held will be freed as part of
|
||||
the release fop.
|
||||
|
||||
When the DK_CXLFLASH_APP_CLOSE_ADAP_FD flag was returned on a successful
|
||||
attach, the application _must_ unmap and close the fd2 associated with the
|
||||
original context following this ioctl returning success and indicating that
|
||||
the context was recovered (DK_CXLFLASH_RECOVER_AFU_CONTEXT_RESET).
|
||||
|
||||
DK_CXLFLASH_MANAGE_LUN
|
||||
----------------------
|
||||
This ioctl is used to switch a LUN from a mode where it is available
|
||||
|
|
|
|||
|
|
@ -64,8 +64,6 @@ hpsa.txt
|
|||
- HP Smart Array Controller SCSI driver.
|
||||
hptiop.txt
|
||||
- HIGHPOINT ROCKETRAID 3xxx RAID DRIVER
|
||||
in2000.txt
|
||||
- info on in2000 driver
|
||||
libsas.txt
|
||||
- Serial Attached SCSI management layer.
|
||||
link_power_management_policy.txt
|
||||
|
|
|
|||
|
|
@ -1,43 +0,0 @@
|
|||
README file for the Linux DTC3180/3280 scsi driver.
|
||||
by Ray Van Tassle (rayvt@comm.mot.com) March 1996
|
||||
Based on the generic & core NCR5380 code by Drew Eckhard
|
||||
|
||||
SCSI device driver for the DTC 3180/3280.
|
||||
Data Technology Corp---a division of Qume.
|
||||
|
||||
The 3280 has a standard floppy interface.
|
||||
|
||||
The 3180 does not. Otherwise, they are identical.
|
||||
|
||||
The DTC3x80 does not support DMA but it does have Pseudo-DMA which is
|
||||
supported by the driver.
|
||||
|
||||
Its DTC406 scsi chip is supposedly compatible with the NCR 53C400.
|
||||
It is memory mapped, uses an IRQ, but no dma or io-port. There is
|
||||
internal DMA, between SCSI bus and an on-chip 128-byte buffer. Double
|
||||
buffering is done automagically by the chip. Data is transferred
|
||||
between the on-chip buffer and CPU/RAM via memory moves.
|
||||
|
||||
The driver detects the possible memory addresses (jumper selectable):
|
||||
CC00, DC00, C800, and D800
|
||||
The possible IRQ's (jumper selectable) are:
|
||||
IRQ 10, 11, 12, 15
|
||||
Parity is supported by the chip, but not by this driver.
|
||||
Information can be obtained from /proc/scsi/dtc3c80/N.
|
||||
|
||||
Note on interrupts:
|
||||
|
||||
The documentation says that it can be set to interrupt whenever the
|
||||
on-chip buffer needs CPU attention. I couldn't get this to work. So
|
||||
the driver polls for data-ready in the pseudo-DMA transfer routine.
|
||||
The interrupt support routines in the NCR3280.c core modules handle
|
||||
scsi disconnect/reconnect, and this (mostly) works. However..... I
|
||||
have tested it with 4 totally different hard drives (both SCSI-1 and
|
||||
SCSI-2), and one CDROM drive. Interrupts works great for all but one
|
||||
specific hard drive. For this one, the driver will eventually hang in
|
||||
the transfer state. I have tested with: "dd bs=4k count=2k
|
||||
of=/dev/null if=/dev/sdb". It reads ok for a while, then hangs.
|
||||
After beating my head against this for a couple of weeks, getting
|
||||
nowhere, I give up. So.....This driver does NOT use interrupts, even
|
||||
if you have the card jumpered to an IRQ. Probably nobody will ever
|
||||
care.
|
||||
|
|
@ -1,202 +0,0 @@
|
|||
|
||||
UPDATE NEWS: version 1.33 - 26 Aug 98
|
||||
|
||||
Interrupt management in this driver has become, over
|
||||
time, increasingly odd and difficult to explain - this
|
||||
has been mostly due to my own mental inadequacies. In
|
||||
recent kernels, it has failed to function at all when
|
||||
compiled for SMP. I've fixed that problem, and after
|
||||
taking a fresh look at interrupts in general, greatly
|
||||
reduced the number of places where they're fiddled
|
||||
with. Done some heavy testing and it looks very good.
|
||||
The driver now makes use of the __initfunc() and
|
||||
__initdata macros to save about 4k of kernel memory.
|
||||
Once again, the same code works for both 2.0.xx and
|
||||
2.1.xx kernels.
|
||||
|
||||
UPDATE NEWS: version 1.32 - 28 Mar 98
|
||||
|
||||
Removed the check for legal IN2000 hardware versions:
|
||||
It appears that the driver works fine with serial
|
||||
EPROMs (the 8-pin chip that defines hardware rev) as
|
||||
old as 2.1, so we'll assume that all cards are OK.
|
||||
|
||||
UPDATE NEWS: version 1.31 - 6 Jul 97
|
||||
|
||||
Fixed a bug that caused incorrect SCSI status bytes to be
|
||||
returned from commands sent to LUNs greater than 0. This
|
||||
means that CDROM changers work now! Fixed a bug in the
|
||||
handling of command-line arguments when loaded as a module.
|
||||
Also put all the header data in in2000.h where it belongs.
|
||||
There are no longer any differences between this driver in
|
||||
the 2.1.xx source tree and the 2.0.xx tree, as of 2.0.31
|
||||
and 2.1.45 (or is it .46?) - this makes things much easier
|
||||
for me...
|
||||
|
||||
UPDATE NEWS: version 1.30 - 14 Oct 96
|
||||
|
||||
Fixed a bug in the code that sets the transfer direction
|
||||
bit (DESTID_DPD in the WD_DESTINATION_ID register). There
|
||||
are quite a few SCSI commands that do a write-to-device;
|
||||
now we deal with all of them correctly. Thanks to Joerg
|
||||
Dorchain for catching this one.
|
||||
|
||||
UPDATE NEWS: version 1.29 - 24 Sep 96
|
||||
|
||||
The memory-mapped hardware on the card is now accessed via
|
||||
the 'readb()' and 'readl()' macros - required by the new
|
||||
memory management scheme in the 2.1.x kernel series.
|
||||
As suggested by Andries Brouwer, 'bios_param()' no longer
|
||||
forces an artificial 1023 track limit on drives. Also
|
||||
removed some kludge-code left over from struggles with
|
||||
older (buggy) compilers.
|
||||
|
||||
UPDATE NEWS: version 1.28 - 07 May 96
|
||||
|
||||
Tightened up the "interrupts enabled/disabled" discipline
|
||||
in 'in2000_queuecommand()' and maybe 1 or 2 other places.
|
||||
I _think_ it may have been a little too lax, causing an
|
||||
occasional crash during full moon. A fully functional
|
||||
/proc interface is now in place - if you want to play
|
||||
with it, start by doing 'cat /proc/scsi/in2000/0'. You
|
||||
can also use it to change a few run-time parameters on
|
||||
the fly, but it's mostly for debugging. The curious
|
||||
should take a good look at 'in2000_proc_info()' in the
|
||||
in2000.c file to get an understanding of what it's all
|
||||
about; I figure that people who are really into it will
|
||||
want to add features suited to their own needs...
|
||||
Also, sync is now DISABLED by default.
|
||||
|
||||
UPDATE NEWS: version 1.27 - 10 Apr 96
|
||||
|
||||
Fixed a well-hidden bug in the adaptive-disconnect code
|
||||
that would show up every now and then during extreme
|
||||
heavy loads involving 2 or more simultaneously active
|
||||
devices. Thanks to Joe Mack for keeping my nose to the
|
||||
grindstone on this one.
|
||||
|
||||
UPDATE NEWS: version 1.26 - 07 Mar 96
|
||||
|
||||
1.25 had a nasty bug that bit people with swap partitions
|
||||
and tape drives. Also, in my attempt to guess my way
|
||||
through Intel assembly language, I made an error in the
|
||||
inline code for IO writes. Made a few other changes and
|
||||
repairs - this version (fingers crossed) should work well.
|
||||
|
||||
UPDATE NEWS: version 1.25 - 05 Mar 96
|
||||
|
||||
Kernel 1.3.70 interrupt mods added; old kernels still OK.
|
||||
Big help from Bill Earnest and David Willmore on speed
|
||||
testing and optimizing: I think there's a real improvement
|
||||
in this area.
|
||||
New! User-friendly command-line interface for LILO and
|
||||
module loading - the old method is gone, so you'll need
|
||||
to read the comments for 'setup_strings' near the top
|
||||
of in2000.c. For people with CDROM's or other devices
|
||||
that have a tough time with sync negotiation, you can
|
||||
now selectively disable sync on individual devices -
|
||||
search for the 'nosync' keyword in the command-line
|
||||
comments. Some of you disable the BIOS on the card, which
|
||||
caused the auto-detect function to fail; there is now a
|
||||
command-line option to force detection of a ROM-less card.
|
||||
|
||||
UPDATE NEWS: version 1.24a - 24 Feb 96
|
||||
|
||||
There was a bug in the synchronous transfer code. Only
|
||||
a few people downloaded before I caught it - could have
|
||||
been worse.
|
||||
|
||||
UPDATE NEWS: version 1.24 - 23 Feb 96
|
||||
|
||||
Lots of good changes. Advice from Bill Earnest resulted
|
||||
in much better detection of cards, more efficient usage
|
||||
of the fifo, and (hopefully) faster data transfers. The
|
||||
jury is still out on speed - I hope it's improved some.
|
||||
One nifty new feature is a cool way of doing disconnect/
|
||||
reselect. The driver defaults to what I'm calling
|
||||
'adaptive disconnect' - meaning that each command is
|
||||
evaluated individually as to whether or not it should be
|
||||
run with the option to disconnect/reselect (if the device
|
||||
chooses), or as a "SCSI-bus-hog". When several devices
|
||||
are operating simultaneously, disconnects are usually an
|
||||
advantage. In a single device system, or if only 1 device
|
||||
is being accessed, transfers usually go faster if disconnects
|
||||
are not allowed.
|
||||
|
||||
|
||||
|
||||
The default arguments (you get these when you don't give an 'in2000'
|
||||
command-line argument, or you give a blank argument) will cause
|
||||
the driver to do adaptive disconnect, synchronous transfers, and a
|
||||
minimum of debug messages. If you want to fool with the options,
|
||||
search for 'setup_strings' near the top of the in2000.c file and
|
||||
check the 'hostdata->args' section in in2000.h - but be warned! Not
|
||||
everything is working yet (some things will never work, probably).
|
||||
I believe that disabling disconnects (DIS_NEVER) will allow you
|
||||
to choose a LEVEL2 value higher than 'L2_BASIC', but I haven't
|
||||
spent a lot of time testing this. You might try 'ENABLE_CLUSTERING'
|
||||
to see what happens: my tests showed little difference either way.
|
||||
There's also a define called 'DEFAULT_SX_PER'; this sets the data
|
||||
transfer speed for the asynchronous mode. I've put it at 500 ns
|
||||
despite the fact that the card could handle settings of 376 or
|
||||
252, because higher speeds may be a problem with poor quality
|
||||
cables or improper termination; 500 ns is a compromise. You can
|
||||
choose your own default through the command-line with the
|
||||
'period' keyword.
|
||||
|
||||
|
||||
------------------------------------------------
|
||||
*********** DIP switch settings **************
|
||||
------------------------------------------------
|
||||
|
||||
sw1-1 sw1-2 BIOS address (hex)
|
||||
-----------------------------------------
|
||||
off off C8000 - CBFF0
|
||||
on off D8000 - DBFF0
|
||||
off on D0000 - D3FF0
|
||||
on on BIOS disabled
|
||||
|
||||
sw1-3 sw1-4 IO port address (hex)
|
||||
------------------------------------
|
||||
off off 220 - 22F
|
||||
on off 200 - 20F
|
||||
off on 110 - 11F
|
||||
on on 100 - 10F
|
||||
|
||||
sw1-5 sw1-6 sw1-7 Interrupt
|
||||
------------------------------
|
||||
off off off 15
|
||||
off on off 14
|
||||
off off on 11
|
||||
off on on 10
|
||||
on - - disabled
|
||||
|
||||
sw1-8 function depends on BIOS version. In earlier versions this
|
||||
controlled synchronous data transfer support for MSDOS:
|
||||
off = disabled
|
||||
on = enabled
|
||||
In later ROMs (starting with 01.3 in April 1994) sw1-8 controls
|
||||
the "greater than 2 disk drive" feature that first appeared in
|
||||
MSDOS 5.0 (ignored by Linux):
|
||||
off = 2 drives maximum
|
||||
on = 7 drives maximum
|
||||
|
||||
sw1-9 Floppy controller
|
||||
--------------------------
|
||||
off disabled
|
||||
on enabled
|
||||
|
||||
------------------------------------------------
|
||||
|
||||
I should mention that Drew Eckhardt's 'Generic NCR5380' sources
|
||||
were my main inspiration, with lots of reference to the IN2000
|
||||
driver currently distributed in the kernel source. I also owe
|
||||
much to a driver written by Hamish Macdonald for Linux-m68k(!).
|
||||
And to Eric Wright for being an ALPHA guinea pig. And to Bill
|
||||
Earnest for 2 tons of great input and information. And to David
|
||||
Willmore for extensive 'bonnie' testing. And to Joe Mack for
|
||||
continual testing and feedback.
|
||||
|
||||
|
||||
John Shifflett jshiffle@netcom.com
|
||||
|
||||
|
|
@ -34,9 +34,6 @@ parameters may be changed at runtime by the command
|
|||
See drivers/scsi/BusLogic.c, comment before function
|
||||
BusLogic_ParseDriverOptions().
|
||||
|
||||
dtc3181e= [HW,SCSI]
|
||||
See Documentation/scsi/g_NCR5380.txt.
|
||||
|
||||
eata= [HW,SCSI]
|
||||
|
||||
fdomain= [HW,SCSI]
|
||||
|
|
@ -47,9 +44,6 @@ parameters may be changed at runtime by the command
|
|||
|
||||
gvp11= [HW,SCSI]
|
||||
|
||||
in2000= [HW,SCSI]
|
||||
See header of drivers/scsi/in2000.c.
|
||||
|
||||
ips= [HW,SCSI] Adaptec / IBM ServeRAID controller
|
||||
See header of drivers/scsi/ips.c.
|
||||
|
||||
|
|
@ -83,9 +77,6 @@ parameters may be changed at runtime by the command
|
|||
Format: <buffer_size>,<write_threshold>
|
||||
See also Documentation/scsi/st.txt.
|
||||
|
||||
pas16= [HW,SCSI]
|
||||
See header of drivers/scsi/pas16.c.
|
||||
|
||||
scsi_debug_*= [SCSI]
|
||||
See drivers/scsi/scsi_debug.c.
|
||||
|
||||
|
|
@ -119,18 +110,9 @@ parameters may be changed at runtime by the command
|
|||
sym53c416= [HW,SCSI]
|
||||
See header of drivers/scsi/sym53c416.c.
|
||||
|
||||
t128= [HW,SCSI]
|
||||
See header of drivers/scsi/t128.c.
|
||||
|
||||
tmscsim= [HW,SCSI]
|
||||
See comment before function dc390_setup() in
|
||||
drivers/scsi/tmscsim.c.
|
||||
|
||||
u14-34f= [HW,SCSI] UltraStor 14F/34F SCSI host adapter
|
||||
See header of drivers/scsi/u14-34f.c.
|
||||
|
||||
wd33c93= [HW,SCSI]
|
||||
See header of drivers/scsi/wd33c93.c.
|
||||
|
||||
wd7000= [HW,SCSI]
|
||||
See header of drivers/scsi/wd7000.c.
|
||||
|
|
|
|||
80
Documentation/scsi/smartpqi.txt
Normal file
80
Documentation/scsi/smartpqi.txt
Normal file
|
|
@ -0,0 +1,80 @@
|
|||
|
||||
SMARTPQI - Microsemi Smart PQI Driver
|
||||
-----------------------------------------
|
||||
|
||||
This file describes the smartpqi SCSI driver for Microsemi
|
||||
(http://www.microsemi.com) PQI controllers. The smartpqi driver
|
||||
is the next generation SCSI driver for Microsemi Corp. The smartpqi
|
||||
driver is the first SCSI driver to implement the PQI queuing model.
|
||||
|
||||
The smartpqi driver will replace the aacraid driver for Adaptec Series 9
|
||||
controllers. Customers running an older kernel (Pre-4.9) using an Adaptec
|
||||
Series 9 controller will have to configure the smartpqi driver or their
|
||||
volumes will not be added to the OS.
|
||||
|
||||
For Microsemi smartpqi controller support, enable the smartpqi driver
|
||||
when configuring the kernel.
|
||||
|
||||
For more information on the PQI Queuing Interface, please see:
|
||||
http://www.t10.org/drafts.htm
|
||||
http://www.t10.org/members/w_pqi2.htm
|
||||
|
||||
Supported devices:
|
||||
------------------
|
||||
<Controller names to be added as they become publically available.>
|
||||
|
||||
smartpqi specific entries in /sys
|
||||
-----------------------------
|
||||
|
||||
smartpqi host attributes:
|
||||
-------------------------
|
||||
/sys/class/scsi_host/host*/rescan
|
||||
/sys/class/scsi_host/host*/version
|
||||
|
||||
The host rescan attribute is a write only attribute. Writing to this
|
||||
attribute will trigger the driver to scan for new, changed, or removed
|
||||
devices and notify the SCSI mid-layer of any changes detected.
|
||||
|
||||
The version attribute is read-only and will return the driver version
|
||||
and the controller firmware version.
|
||||
For example:
|
||||
driver: 0.9.13-370
|
||||
firmware: 0.01-522
|
||||
|
||||
smartpqi sas device attributes
|
||||
------------------------------
|
||||
HBA devices are added to the SAS transport layer. These attributes are
|
||||
automatically added by the SAS transport layer.
|
||||
|
||||
/sys/class/sas_device/end_device-X:X/sas_address
|
||||
/sys/class/sas_device/end_device-X:X/enclosure_identifier
|
||||
/sys/class/sas_device/end_device-X:X/scsi_target_id
|
||||
|
||||
smartpqi specific ioctls:
|
||||
-------------------------
|
||||
|
||||
For compatibility with applications written for the cciss protocol.
|
||||
|
||||
CCISS_DEREGDISK
|
||||
CCISS_REGNEWDISK
|
||||
CCISS_REGNEWD
|
||||
|
||||
The above three ioctls all do exactly the same thing, which is to cause the driver
|
||||
to rescan for new devices. This does exactly the same thing as writing to the
|
||||
smartpqi specific host "rescan" attribute.
|
||||
|
||||
CCISS_GETPCIINFO
|
||||
|
||||
Returns PCI domain, bus, device and function and "board ID" (PCI subsystem ID).
|
||||
|
||||
CCISS_GETDRIVVER
|
||||
|
||||
Returns driver version in three bytes encoded as:
|
||||
(DRIVER_MAJOR << 28) | (DRIVER_MINOR << 24) | (DRIVER_RELEASE << 16) | DRIVER_REVISION;
|
||||
|
||||
CCISS_PASSTHRU
|
||||
|
||||
Allows "BMIC" and "CISS" commands to be passed through to the Smart Storage Array.
|
||||
These are used extensively by the SSA Array Configuration Utility, SNMP storage
|
||||
agents, etc.
|
||||
|
||||
38
MAINTAINERS
38
MAINTAINERS
|
|
@ -7973,6 +7973,18 @@ W: http://www.melexis.com
|
|||
S: Supported
|
||||
F: drivers/iio/temperature/mlx90614.c
|
||||
|
||||
MICROSEMI SMART ARRAY SMARTPQI DRIVER (smartpqi)
|
||||
M: Don Brace <don.brace@microsemi.com>
|
||||
L: esc.storagedev@microsemi.com
|
||||
L: linux-scsi@vger.kernel.org
|
||||
S: Supported
|
||||
F: drivers/scsi/smartpqi/smartpqi*.[ch]
|
||||
F: drivers/scsi/smartpqi/Kconfig
|
||||
F: drivers/scsi/smartpqi/Makefile
|
||||
F: include/linux/cciss*.h
|
||||
F: include/uapi/linux/cciss*.h
|
||||
F: Documentation/scsi/smartpqi.txt
|
||||
|
||||
MN88472 MEDIA DRIVER
|
||||
M: Antti Palosaari <crope@iki.fi>
|
||||
L: linux-media@vger.kernel.org
|
||||
|
|
@ -8185,20 +8197,16 @@ M: Michael Schmitz <schmitzmic@gmail.com>
|
|||
L: linux-scsi@vger.kernel.org
|
||||
S: Maintained
|
||||
F: Documentation/scsi/g_NCR5380.txt
|
||||
F: Documentation/scsi/dtc3x80.txt
|
||||
F: drivers/scsi/NCR5380.*
|
||||
F: drivers/scsi/arm/cumana_1.c
|
||||
F: drivers/scsi/arm/oak.c
|
||||
F: drivers/scsi/atari_scsi.*
|
||||
F: drivers/scsi/dmx3191d.c
|
||||
F: drivers/scsi/dtc.*
|
||||
F: drivers/scsi/g_NCR5380.*
|
||||
F: drivers/scsi/g_NCR5380_mmio.c
|
||||
F: drivers/scsi/mac_scsi.*
|
||||
F: drivers/scsi/pas16.*
|
||||
F: drivers/scsi/sun3_scsi.*
|
||||
F: drivers/scsi/sun3_scsi_vme.c
|
||||
F: drivers/scsi/t128.*
|
||||
|
||||
NCR DUAL 700 SCSI DRIVER (MICROCHANNEL)
|
||||
M: "James E.J. Bottomley" <James.Bottomley@HansenPartnership.com>
|
||||
|
|
@ -10740,12 +10748,12 @@ S: Maintained
|
|||
F: drivers/misc/phantom.c
|
||||
F: include/uapi/linux/phantom.h
|
||||
|
||||
SERVER ENGINES 10Gbps iSCSI - BladeEngine 2 DRIVER
|
||||
M: Jayamohan Kallickal <jayamohan.kallickal@avagotech.com>
|
||||
M: Ketan Mukadam <ketan.mukadam@avagotech.com>
|
||||
M: John Soni Jose <sony.john@avagotech.com>
|
||||
Emulex 10Gbps iSCSI - OneConnect DRIVER
|
||||
M: Subbu Seetharaman <subbu.seetharaman@broadcom.com>
|
||||
M: Ketan Mukadam <ketan.mukadam@broadcom.com>
|
||||
M: Jitendra Bhivare <jitendra.bhivare@broadcom.com>
|
||||
L: linux-scsi@vger.kernel.org
|
||||
W: http://www.avagotech.com
|
||||
W: http://www.broadcom.com
|
||||
S: Supported
|
||||
F: drivers/scsi/be2iscsi/
|
||||
|
||||
|
|
@ -12143,12 +12151,6 @@ S: Maintained
|
|||
F: drivers/tc/
|
||||
F: include/linux/tc.h
|
||||
|
||||
U14-34F SCSI DRIVER
|
||||
M: Dario Ballabio <ballabio_dario@emc.com>
|
||||
L: linux-scsi@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/scsi/u14-34f.c
|
||||
|
||||
UBI FILE SYSTEM (UBIFS)
|
||||
M: Richard Weinberger <richard@nod.at>
|
||||
M: Artem Bityutskiy <dedekind1@gmail.com>
|
||||
|
|
@ -12876,12 +12878,6 @@ F: drivers/watchdog/
|
|||
F: include/linux/watchdog.h
|
||||
F: include/uapi/linux/watchdog.h
|
||||
|
||||
WD7000 SCSI DRIVER
|
||||
M: Miroslav Zagorac <zaga@fly.cc.fer.hr>
|
||||
L: linux-scsi@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/scsi/wd7000.c
|
||||
|
||||
WIIMOTE HID DRIVER
|
||||
M: David Herrmann <dh.herrmann@googlemail.com>
|
||||
L: linux-input@vger.kernel.org
|
||||
|
|
|
|||
|
|
@ -1865,8 +1865,8 @@ mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id)
|
|||
|
||||
snprintf(ioc->reset_work_q_name, MPT_KOBJ_NAME_LEN,
|
||||
"mpt_poll_%d", ioc->id);
|
||||
ioc->reset_work_q =
|
||||
create_singlethread_workqueue(ioc->reset_work_q_name);
|
||||
ioc->reset_work_q = alloc_workqueue(ioc->reset_work_q_name,
|
||||
WQ_MEM_RECLAIM, 0);
|
||||
if (!ioc->reset_work_q) {
|
||||
printk(MYIOC_s_ERR_FMT "Insufficient memory to add adapter!\n",
|
||||
ioc->name);
|
||||
|
|
@ -1992,7 +1992,8 @@ mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id)
|
|||
INIT_LIST_HEAD(&ioc->fw_event_list);
|
||||
spin_lock_init(&ioc->fw_event_lock);
|
||||
snprintf(ioc->fw_event_q_name, MPT_KOBJ_NAME_LEN, "mpt/%d", ioc->id);
|
||||
ioc->fw_event_q = create_singlethread_workqueue(ioc->fw_event_q_name);
|
||||
ioc->fw_event_q = alloc_workqueue(ioc->fw_event_q_name,
|
||||
WQ_MEM_RECLAIM, 0);
|
||||
if (!ioc->fw_event_q) {
|
||||
printk(MYIOC_s_ERR_FMT "Insufficient memory to add adapter!\n",
|
||||
ioc->name);
|
||||
|
|
|
|||
|
|
@ -1324,9 +1324,12 @@ mptfc_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
|||
snprintf(ioc->fc_rescan_work_q_name, sizeof(ioc->fc_rescan_work_q_name),
|
||||
"mptfc_wq_%d", sh->host_no);
|
||||
ioc->fc_rescan_work_q =
|
||||
create_singlethread_workqueue(ioc->fc_rescan_work_q_name);
|
||||
if (!ioc->fc_rescan_work_q)
|
||||
alloc_ordered_workqueue(ioc->fc_rescan_work_q_name,
|
||||
WQ_MEM_RECLAIM);
|
||||
if (!ioc->fc_rescan_work_q) {
|
||||
error = -ENOMEM;
|
||||
goto out_mptfc_probe;
|
||||
}
|
||||
|
||||
/*
|
||||
* Pre-fetch FC port WWN and stuff...
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
*
|
||||
* Debug traces for zfcp.
|
||||
*
|
||||
* Copyright IBM Corp. 2002, 2013
|
||||
* Copyright IBM Corp. 2002, 2016
|
||||
*/
|
||||
|
||||
#define KMSG_COMPONENT "zfcp"
|
||||
|
|
@ -65,7 +65,7 @@ void zfcp_dbf_pl_write(struct zfcp_dbf *dbf, void *data, u16 length, char *area,
|
|||
* @tag: tag indicating which kind of unsolicited status has been received
|
||||
* @req: request for which a response was received
|
||||
*/
|
||||
void zfcp_dbf_hba_fsf_res(char *tag, struct zfcp_fsf_req *req)
|
||||
void zfcp_dbf_hba_fsf_res(char *tag, int level, struct zfcp_fsf_req *req)
|
||||
{
|
||||
struct zfcp_dbf *dbf = req->adapter->dbf;
|
||||
struct fsf_qtcb_prefix *q_pref = &req->qtcb->prefix;
|
||||
|
|
@ -85,6 +85,8 @@ void zfcp_dbf_hba_fsf_res(char *tag, struct zfcp_fsf_req *req)
|
|||
rec->u.res.req_issued = req->issued;
|
||||
rec->u.res.prot_status = q_pref->prot_status;
|
||||
rec->u.res.fsf_status = q_head->fsf_status;
|
||||
rec->u.res.port_handle = q_head->port_handle;
|
||||
rec->u.res.lun_handle = q_head->lun_handle;
|
||||
|
||||
memcpy(rec->u.res.prot_status_qual, &q_pref->prot_status_qual,
|
||||
FSF_PROT_STATUS_QUAL_SIZE);
|
||||
|
|
@ -97,7 +99,7 @@ void zfcp_dbf_hba_fsf_res(char *tag, struct zfcp_fsf_req *req)
|
|||
rec->pl_len, "fsf_res", req->req_id);
|
||||
}
|
||||
|
||||
debug_event(dbf->hba, 1, rec, sizeof(*rec));
|
||||
debug_event(dbf->hba, level, rec, sizeof(*rec));
|
||||
spin_unlock_irqrestore(&dbf->hba_lock, flags);
|
||||
}
|
||||
|
||||
|
|
@ -241,7 +243,8 @@ static void zfcp_dbf_set_common(struct zfcp_dbf_rec *rec,
|
|||
if (sdev) {
|
||||
rec->lun_status = atomic_read(&sdev_to_zfcp(sdev)->status);
|
||||
rec->lun = zfcp_scsi_dev_lun(sdev);
|
||||
}
|
||||
} else
|
||||
rec->lun = ZFCP_DBF_INVALID_LUN;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -320,13 +323,48 @@ void zfcp_dbf_rec_run(char *tag, struct zfcp_erp_action *erp)
|
|||
spin_unlock_irqrestore(&dbf->rec_lock, flags);
|
||||
}
|
||||
|
||||
/**
|
||||
* zfcp_dbf_rec_run_wka - trace wka port event with info like running recovery
|
||||
* @tag: identifier for event
|
||||
* @wka_port: well known address port
|
||||
* @req_id: request ID to correlate with potential HBA trace record
|
||||
*/
|
||||
void zfcp_dbf_rec_run_wka(char *tag, struct zfcp_fc_wka_port *wka_port,
|
||||
u64 req_id)
|
||||
{
|
||||
struct zfcp_dbf *dbf = wka_port->adapter->dbf;
|
||||
struct zfcp_dbf_rec *rec = &dbf->rec_buf;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&dbf->rec_lock, flags);
|
||||
memset(rec, 0, sizeof(*rec));
|
||||
|
||||
rec->id = ZFCP_DBF_REC_RUN;
|
||||
memcpy(rec->tag, tag, ZFCP_DBF_TAG_LEN);
|
||||
rec->port_status = wka_port->status;
|
||||
rec->d_id = wka_port->d_id;
|
||||
rec->lun = ZFCP_DBF_INVALID_LUN;
|
||||
|
||||
rec->u.run.fsf_req_id = req_id;
|
||||
rec->u.run.rec_status = ~0;
|
||||
rec->u.run.rec_step = ~0;
|
||||
rec->u.run.rec_action = ~0;
|
||||
rec->u.run.rec_count = ~0;
|
||||
|
||||
debug_event(dbf->rec, 1, rec, sizeof(*rec));
|
||||
spin_unlock_irqrestore(&dbf->rec_lock, flags);
|
||||
}
|
||||
|
||||
static inline
|
||||
void zfcp_dbf_san(char *tag, struct zfcp_dbf *dbf, void *data, u8 id, u16 len,
|
||||
u64 req_id, u32 d_id)
|
||||
void zfcp_dbf_san(char *tag, struct zfcp_dbf *dbf,
|
||||
char *paytag, struct scatterlist *sg, u8 id, u16 len,
|
||||
u64 req_id, u32 d_id, u16 cap_len)
|
||||
{
|
||||
struct zfcp_dbf_san *rec = &dbf->san_buf;
|
||||
u16 rec_len;
|
||||
unsigned long flags;
|
||||
struct zfcp_dbf_pay *payload = &dbf->pay_buf;
|
||||
u16 pay_sum = 0;
|
||||
|
||||
spin_lock_irqsave(&dbf->san_lock, flags);
|
||||
memset(rec, 0, sizeof(*rec));
|
||||
|
|
@ -334,10 +372,41 @@ void zfcp_dbf_san(char *tag, struct zfcp_dbf *dbf, void *data, u8 id, u16 len,
|
|||
rec->id = id;
|
||||
rec->fsf_req_id = req_id;
|
||||
rec->d_id = d_id;
|
||||
rec_len = min(len, (u16)ZFCP_DBF_SAN_MAX_PAYLOAD);
|
||||
memcpy(rec->payload, data, rec_len);
|
||||
memcpy(rec->tag, tag, ZFCP_DBF_TAG_LEN);
|
||||
rec->pl_len = len; /* full length even if we cap pay below */
|
||||
if (!sg)
|
||||
goto out;
|
||||
rec_len = min_t(unsigned int, sg->length, ZFCP_DBF_SAN_MAX_PAYLOAD);
|
||||
memcpy(rec->payload, sg_virt(sg), rec_len); /* part of 1st sg entry */
|
||||
if (len <= rec_len)
|
||||
goto out; /* skip pay record if full content in rec->payload */
|
||||
|
||||
/* if (len > rec_len):
|
||||
* dump data up to cap_len ignoring small duplicate in rec->payload
|
||||
*/
|
||||
spin_lock_irqsave(&dbf->pay_lock, flags);
|
||||
memset(payload, 0, sizeof(*payload));
|
||||
memcpy(payload->area, paytag, ZFCP_DBF_TAG_LEN);
|
||||
payload->fsf_req_id = req_id;
|
||||
payload->counter = 0;
|
||||
for (; sg && pay_sum < cap_len; sg = sg_next(sg)) {
|
||||
u16 pay_len, offset = 0;
|
||||
|
||||
while (offset < sg->length && pay_sum < cap_len) {
|
||||
pay_len = min((u16)ZFCP_DBF_PAY_MAX_REC,
|
||||
(u16)(sg->length - offset));
|
||||
/* cap_len <= pay_sum < cap_len+ZFCP_DBF_PAY_MAX_REC */
|
||||
memcpy(payload->data, sg_virt(sg) + offset, pay_len);
|
||||
debug_event(dbf->pay, 1, payload,
|
||||
zfcp_dbf_plen(pay_len));
|
||||
payload->counter++;
|
||||
offset += pay_len;
|
||||
pay_sum += pay_len;
|
||||
}
|
||||
}
|
||||
spin_unlock(&dbf->pay_lock);
|
||||
|
||||
out:
|
||||
debug_event(dbf->san, 1, rec, sizeof(*rec));
|
||||
spin_unlock_irqrestore(&dbf->san_lock, flags);
|
||||
}
|
||||
|
|
@ -354,9 +423,62 @@ void zfcp_dbf_san_req(char *tag, struct zfcp_fsf_req *fsf, u32 d_id)
|
|||
struct zfcp_fsf_ct_els *ct_els = fsf->data;
|
||||
u16 length;
|
||||
|
||||
length = (u16)(ct_els->req->length + FC_CT_HDR_LEN);
|
||||
zfcp_dbf_san(tag, dbf, sg_virt(ct_els->req), ZFCP_DBF_SAN_REQ, length,
|
||||
fsf->req_id, d_id);
|
||||
length = (u16)zfcp_qdio_real_bytes(ct_els->req);
|
||||
zfcp_dbf_san(tag, dbf, "san_req", ct_els->req, ZFCP_DBF_SAN_REQ,
|
||||
length, fsf->req_id, d_id, length);
|
||||
}
|
||||
|
||||
static u16 zfcp_dbf_san_res_cap_len_if_gpn_ft(char *tag,
|
||||
struct zfcp_fsf_req *fsf,
|
||||
u16 len)
|
||||
{
|
||||
struct zfcp_fsf_ct_els *ct_els = fsf->data;
|
||||
struct fc_ct_hdr *reqh = sg_virt(ct_els->req);
|
||||
struct fc_ns_gid_ft *reqn = (struct fc_ns_gid_ft *)(reqh + 1);
|
||||
struct scatterlist *resp_entry = ct_els->resp;
|
||||
struct fc_gpn_ft_resp *acc;
|
||||
int max_entries, x, last = 0;
|
||||
|
||||
if (!(memcmp(tag, "fsscth2", 7) == 0
|
||||
&& ct_els->d_id == FC_FID_DIR_SERV
|
||||
&& reqh->ct_rev == FC_CT_REV
|
||||
&& reqh->ct_in_id[0] == 0
|
||||
&& reqh->ct_in_id[1] == 0
|
||||
&& reqh->ct_in_id[2] == 0
|
||||
&& reqh->ct_fs_type == FC_FST_DIR
|
||||
&& reqh->ct_fs_subtype == FC_NS_SUBTYPE
|
||||
&& reqh->ct_options == 0
|
||||
&& reqh->_ct_resvd1 == 0
|
||||
&& reqh->ct_cmd == FC_NS_GPN_FT
|
||||
/* reqh->ct_mr_size can vary so do not match but read below */
|
||||
&& reqh->_ct_resvd2 == 0
|
||||
&& reqh->ct_reason == 0
|
||||
&& reqh->ct_explan == 0
|
||||
&& reqh->ct_vendor == 0
|
||||
&& reqn->fn_resvd == 0
|
||||
&& reqn->fn_domain_id_scope == 0
|
||||
&& reqn->fn_area_id_scope == 0
|
||||
&& reqn->fn_fc4_type == FC_TYPE_FCP))
|
||||
return len; /* not GPN_FT response so do not cap */
|
||||
|
||||
acc = sg_virt(resp_entry);
|
||||
max_entries = (reqh->ct_mr_size * 4 / sizeof(struct fc_gpn_ft_resp))
|
||||
+ 1 /* zfcp_fc_scan_ports: bytes correct, entries off-by-one
|
||||
* to account for header as 1st pseudo "entry" */;
|
||||
|
||||
/* the basic CT_IU preamble is the same size as one entry in the GPN_FT
|
||||
* response, allowing us to skip special handling for it - just skip it
|
||||
*/
|
||||
for (x = 1; x < max_entries && !last; x++) {
|
||||
if (x % (ZFCP_FC_GPN_FT_ENT_PAGE + 1))
|
||||
acc++;
|
||||
else
|
||||
acc = sg_virt(++resp_entry);
|
||||
|
||||
last = acc->fp_flags & FC_NS_FID_LAST;
|
||||
}
|
||||
len = min(len, (u16)(x * sizeof(struct fc_gpn_ft_resp)));
|
||||
return len; /* cap after last entry */
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -370,9 +492,10 @@ void zfcp_dbf_san_res(char *tag, struct zfcp_fsf_req *fsf)
|
|||
struct zfcp_fsf_ct_els *ct_els = fsf->data;
|
||||
u16 length;
|
||||
|
||||
length = (u16)(ct_els->resp->length + FC_CT_HDR_LEN);
|
||||
zfcp_dbf_san(tag, dbf, sg_virt(ct_els->resp), ZFCP_DBF_SAN_RES, length,
|
||||
fsf->req_id, 0);
|
||||
length = (u16)zfcp_qdio_real_bytes(ct_els->resp);
|
||||
zfcp_dbf_san(tag, dbf, "san_res", ct_els->resp, ZFCP_DBF_SAN_RES,
|
||||
length, fsf->req_id, ct_els->d_id,
|
||||
zfcp_dbf_san_res_cap_len_if_gpn_ft(tag, fsf, length));
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -386,11 +509,13 @@ void zfcp_dbf_san_in_els(char *tag, struct zfcp_fsf_req *fsf)
|
|||
struct fsf_status_read_buffer *srb =
|
||||
(struct fsf_status_read_buffer *) fsf->data;
|
||||
u16 length;
|
||||
struct scatterlist sg;
|
||||
|
||||
length = (u16)(srb->length -
|
||||
offsetof(struct fsf_status_read_buffer, payload));
|
||||
zfcp_dbf_san(tag, dbf, srb->payload.data, ZFCP_DBF_SAN_ELS, length,
|
||||
fsf->req_id, ntoh24(srb->d_id));
|
||||
sg_init_one(&sg, srb->payload.data, length);
|
||||
zfcp_dbf_san(tag, dbf, "san_els", &sg, ZFCP_DBF_SAN_ELS, length,
|
||||
fsf->req_id, ntoh24(srb->d_id), length);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -399,7 +524,8 @@ void zfcp_dbf_san_in_els(char *tag, struct zfcp_fsf_req *fsf)
|
|||
* @sc: pointer to struct scsi_cmnd
|
||||
* @fsf: pointer to struct zfcp_fsf_req
|
||||
*/
|
||||
void zfcp_dbf_scsi(char *tag, struct scsi_cmnd *sc, struct zfcp_fsf_req *fsf)
|
||||
void zfcp_dbf_scsi(char *tag, int level, struct scsi_cmnd *sc,
|
||||
struct zfcp_fsf_req *fsf)
|
||||
{
|
||||
struct zfcp_adapter *adapter =
|
||||
(struct zfcp_adapter *) sc->device->host->hostdata[0];
|
||||
|
|
@ -442,7 +568,7 @@ void zfcp_dbf_scsi(char *tag, struct scsi_cmnd *sc, struct zfcp_fsf_req *fsf)
|
|||
}
|
||||
}
|
||||
|
||||
debug_event(dbf->scsi, 1, rec, sizeof(*rec));
|
||||
debug_event(dbf->scsi, level, rec, sizeof(*rec));
|
||||
spin_unlock_irqrestore(&dbf->scsi_lock, flags);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
* zfcp device driver
|
||||
* debug feature declarations
|
||||
*
|
||||
* Copyright IBM Corp. 2008, 2010
|
||||
* Copyright IBM Corp. 2008, 2015
|
||||
*/
|
||||
|
||||
#ifndef ZFCP_DBF_H
|
||||
|
|
@ -17,6 +17,11 @@
|
|||
|
||||
#define ZFCP_DBF_INVALID_LUN 0xFFFFFFFFFFFFFFFFull
|
||||
|
||||
enum zfcp_dbf_pseudo_erp_act_type {
|
||||
ZFCP_PSEUDO_ERP_ACTION_RPORT_ADD = 0xff,
|
||||
ZFCP_PSEUDO_ERP_ACTION_RPORT_DEL = 0xfe,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct zfcp_dbf_rec_trigger - trace record for triggered recovery action
|
||||
* @ready: number of ready recovery actions
|
||||
|
|
@ -110,6 +115,7 @@ struct zfcp_dbf_san {
|
|||
u32 d_id;
|
||||
#define ZFCP_DBF_SAN_MAX_PAYLOAD (FC_CT_HDR_LEN + 32)
|
||||
char payload[ZFCP_DBF_SAN_MAX_PAYLOAD];
|
||||
u16 pl_len;
|
||||
} __packed;
|
||||
|
||||
/**
|
||||
|
|
@ -126,6 +132,8 @@ struct zfcp_dbf_hba_res {
|
|||
u8 prot_status_qual[FSF_PROT_STATUS_QUAL_SIZE];
|
||||
u32 fsf_status;
|
||||
u8 fsf_status_qual[FSF_STATUS_QUALIFIER_SIZE];
|
||||
u32 port_handle;
|
||||
u32 lun_handle;
|
||||
} __packed;
|
||||
|
||||
/**
|
||||
|
|
@ -279,7 +287,7 @@ static inline
|
|||
void zfcp_dbf_hba_fsf_resp(char *tag, int level, struct zfcp_fsf_req *req)
|
||||
{
|
||||
if (debug_level_enabled(req->adapter->dbf->hba, level))
|
||||
zfcp_dbf_hba_fsf_res(tag, req);
|
||||
zfcp_dbf_hba_fsf_res(tag, level, req);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -318,7 +326,7 @@ void _zfcp_dbf_scsi(char *tag, int level, struct scsi_cmnd *scmd,
|
|||
scmd->device->host->hostdata[0];
|
||||
|
||||
if (debug_level_enabled(adapter->dbf->scsi, level))
|
||||
zfcp_dbf_scsi(tag, scmd, req);
|
||||
zfcp_dbf_scsi(tag, level, scmd, req);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
*
|
||||
* Error Recovery Procedures (ERP).
|
||||
*
|
||||
* Copyright IBM Corp. 2002, 2010
|
||||
* Copyright IBM Corp. 2002, 2015
|
||||
*/
|
||||
|
||||
#define KMSG_COMPONENT "zfcp"
|
||||
|
|
@ -1217,8 +1217,14 @@ static void zfcp_erp_action_cleanup(struct zfcp_erp_action *act, int result)
|
|||
break;
|
||||
|
||||
case ZFCP_ERP_ACTION_REOPEN_PORT:
|
||||
if (result == ZFCP_ERP_SUCCEEDED)
|
||||
zfcp_scsi_schedule_rport_register(port);
|
||||
/* This switch case might also happen after a forced reopen
|
||||
* was successfully done and thus overwritten with a new
|
||||
* non-forced reopen at `ersfs_2'. In this case, we must not
|
||||
* do the clean-up of the non-forced version.
|
||||
*/
|
||||
if (act->step != ZFCP_ERP_STEP_UNINITIALIZED)
|
||||
if (result == ZFCP_ERP_SUCCEEDED)
|
||||
zfcp_scsi_schedule_rport_register(port);
|
||||
/* fall through */
|
||||
case ZFCP_ERP_ACTION_REOPEN_PORT_FORCED:
|
||||
put_device(&port->dev);
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
*
|
||||
* External function declarations.
|
||||
*
|
||||
* Copyright IBM Corp. 2002, 2010
|
||||
* Copyright IBM Corp. 2002, 2015
|
||||
*/
|
||||
|
||||
#ifndef ZFCP_EXT_H
|
||||
|
|
@ -35,8 +35,9 @@ extern void zfcp_dbf_adapter_unregister(struct zfcp_adapter *);
|
|||
extern void zfcp_dbf_rec_trig(char *, struct zfcp_adapter *,
|
||||
struct zfcp_port *, struct scsi_device *, u8, u8);
|
||||
extern void zfcp_dbf_rec_run(char *, struct zfcp_erp_action *);
|
||||
extern void zfcp_dbf_rec_run_wka(char *, struct zfcp_fc_wka_port *, u64);
|
||||
extern void zfcp_dbf_hba_fsf_uss(char *, struct zfcp_fsf_req *);
|
||||
extern void zfcp_dbf_hba_fsf_res(char *, struct zfcp_fsf_req *);
|
||||
extern void zfcp_dbf_hba_fsf_res(char *, int, struct zfcp_fsf_req *);
|
||||
extern void zfcp_dbf_hba_bit_err(char *, struct zfcp_fsf_req *);
|
||||
extern void zfcp_dbf_hba_berr(struct zfcp_dbf *, struct zfcp_fsf_req *);
|
||||
extern void zfcp_dbf_hba_def_err(struct zfcp_adapter *, u64, u16, void **);
|
||||
|
|
@ -44,7 +45,8 @@ extern void zfcp_dbf_hba_basic(char *, struct zfcp_adapter *);
|
|||
extern void zfcp_dbf_san_req(char *, struct zfcp_fsf_req *, u32);
|
||||
extern void zfcp_dbf_san_res(char *, struct zfcp_fsf_req *);
|
||||
extern void zfcp_dbf_san_in_els(char *, struct zfcp_fsf_req *);
|
||||
extern void zfcp_dbf_scsi(char *, struct scsi_cmnd *, struct zfcp_fsf_req *);
|
||||
extern void zfcp_dbf_scsi(char *, int, struct scsi_cmnd *,
|
||||
struct zfcp_fsf_req *);
|
||||
|
||||
/* zfcp_erp.c */
|
||||
extern void zfcp_erp_set_adapter_status(struct zfcp_adapter *, u32);
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
*
|
||||
* Implementation of FSF commands.
|
||||
*
|
||||
* Copyright IBM Corp. 2002, 2013
|
||||
* Copyright IBM Corp. 2002, 2015
|
||||
*/
|
||||
|
||||
#define KMSG_COMPONENT "zfcp"
|
||||
|
|
@ -508,7 +508,10 @@ static int zfcp_fsf_exchange_config_evaluate(struct zfcp_fsf_req *req)
|
|||
fc_host_port_type(shost) = FC_PORTTYPE_PTP;
|
||||
break;
|
||||
case FSF_TOPO_FABRIC:
|
||||
fc_host_port_type(shost) = FC_PORTTYPE_NPORT;
|
||||
if (bottom->connection_features & FSF_FEATURE_NPIV_MODE)
|
||||
fc_host_port_type(shost) = FC_PORTTYPE_NPIV;
|
||||
else
|
||||
fc_host_port_type(shost) = FC_PORTTYPE_NPORT;
|
||||
break;
|
||||
case FSF_TOPO_AL:
|
||||
fc_host_port_type(shost) = FC_PORTTYPE_NLPORT;
|
||||
|
|
@ -613,7 +616,6 @@ static void zfcp_fsf_exchange_port_evaluate(struct zfcp_fsf_req *req)
|
|||
|
||||
if (adapter->connection_features & FSF_FEATURE_NPIV_MODE) {
|
||||
fc_host_permanent_port_name(shost) = bottom->wwpn;
|
||||
fc_host_port_type(shost) = FC_PORTTYPE_NPIV;
|
||||
} else
|
||||
fc_host_permanent_port_name(shost) = fc_host_port_name(shost);
|
||||
fc_host_maxframe_size(shost) = bottom->maximum_frame_size;
|
||||
|
|
@ -982,8 +984,12 @@ static int zfcp_fsf_setup_ct_els_sbals(struct zfcp_fsf_req *req,
|
|||
if (zfcp_adapter_multi_buffer_active(adapter)) {
|
||||
if (zfcp_qdio_sbals_from_sg(qdio, &req->qdio_req, sg_req))
|
||||
return -EIO;
|
||||
qtcb->bottom.support.req_buf_length =
|
||||
zfcp_qdio_real_bytes(sg_req);
|
||||
if (zfcp_qdio_sbals_from_sg(qdio, &req->qdio_req, sg_resp))
|
||||
return -EIO;
|
||||
qtcb->bottom.support.resp_buf_length =
|
||||
zfcp_qdio_real_bytes(sg_resp);
|
||||
|
||||
zfcp_qdio_set_data_div(qdio, &req->qdio_req,
|
||||
zfcp_qdio_sbale_count(sg_req));
|
||||
|
|
@ -1073,6 +1079,7 @@ int zfcp_fsf_send_ct(struct zfcp_fc_wka_port *wka_port,
|
|||
|
||||
req->handler = zfcp_fsf_send_ct_handler;
|
||||
req->qtcb->header.port_handle = wka_port->handle;
|
||||
ct->d_id = wka_port->d_id;
|
||||
req->data = ct;
|
||||
|
||||
zfcp_dbf_san_req("fssct_1", req, wka_port->d_id);
|
||||
|
|
@ -1169,6 +1176,7 @@ int zfcp_fsf_send_els(struct zfcp_adapter *adapter, u32 d_id,
|
|||
|
||||
hton24(req->qtcb->bottom.support.d_id, d_id);
|
||||
req->handler = zfcp_fsf_send_els_handler;
|
||||
els->d_id = d_id;
|
||||
req->data = els;
|
||||
|
||||
zfcp_dbf_san_req("fssels1", req, d_id);
|
||||
|
|
@ -1575,7 +1583,7 @@ out:
|
|||
int zfcp_fsf_open_wka_port(struct zfcp_fc_wka_port *wka_port)
|
||||
{
|
||||
struct zfcp_qdio *qdio = wka_port->adapter->qdio;
|
||||
struct zfcp_fsf_req *req;
|
||||
struct zfcp_fsf_req *req = NULL;
|
||||
int retval = -EIO;
|
||||
|
||||
spin_lock_irq(&qdio->req_q_lock);
|
||||
|
|
@ -1604,6 +1612,8 @@ int zfcp_fsf_open_wka_port(struct zfcp_fc_wka_port *wka_port)
|
|||
zfcp_fsf_req_free(req);
|
||||
out:
|
||||
spin_unlock_irq(&qdio->req_q_lock);
|
||||
if (req && !IS_ERR(req))
|
||||
zfcp_dbf_rec_run_wka("fsowp_1", wka_port, req->req_id);
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
|
@ -1628,7 +1638,7 @@ static void zfcp_fsf_close_wka_port_handler(struct zfcp_fsf_req *req)
|
|||
int zfcp_fsf_close_wka_port(struct zfcp_fc_wka_port *wka_port)
|
||||
{
|
||||
struct zfcp_qdio *qdio = wka_port->adapter->qdio;
|
||||
struct zfcp_fsf_req *req;
|
||||
struct zfcp_fsf_req *req = NULL;
|
||||
int retval = -EIO;
|
||||
|
||||
spin_lock_irq(&qdio->req_q_lock);
|
||||
|
|
@ -1657,6 +1667,8 @@ int zfcp_fsf_close_wka_port(struct zfcp_fc_wka_port *wka_port)
|
|||
zfcp_fsf_req_free(req);
|
||||
out:
|
||||
spin_unlock_irq(&qdio->req_q_lock);
|
||||
if (req && !IS_ERR(req))
|
||||
zfcp_dbf_rec_run_wka("fscwp_1", wka_port, req->req_id);
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
*
|
||||
* Interface to the FSF support functions.
|
||||
*
|
||||
* Copyright IBM Corp. 2002, 2010
|
||||
* Copyright IBM Corp. 2002, 2015
|
||||
*/
|
||||
|
||||
#ifndef FSF_H
|
||||
|
|
@ -436,6 +436,7 @@ struct zfcp_blk_drv_data {
|
|||
* @handler_data: data passed to handler function
|
||||
* @port: Optional pointer to port for zfcp internal ELS (only test link ADISC)
|
||||
* @status: used to pass error status to calling function
|
||||
* @d_id: Destination ID of either open WKA port for CT or of D_ID for ELS
|
||||
*/
|
||||
struct zfcp_fsf_ct_els {
|
||||
struct scatterlist *req;
|
||||
|
|
@ -444,6 +445,7 @@ struct zfcp_fsf_ct_els {
|
|||
void *handler_data;
|
||||
struct zfcp_port *port;
|
||||
int status;
|
||||
u32 d_id;
|
||||
};
|
||||
|
||||
#endif /* FSF_H */
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
*
|
||||
* Interface to Linux SCSI midlayer.
|
||||
*
|
||||
* Copyright IBM Corp. 2002, 2013
|
||||
* Copyright IBM Corp. 2002, 2015
|
||||
*/
|
||||
|
||||
#define KMSG_COMPONENT "zfcp"
|
||||
|
|
@ -556,6 +556,9 @@ static void zfcp_scsi_rport_register(struct zfcp_port *port)
|
|||
ids.port_id = port->d_id;
|
||||
ids.roles = FC_RPORT_ROLE_FCP_TARGET;
|
||||
|
||||
zfcp_dbf_rec_trig("scpaddy", port->adapter, port, NULL,
|
||||
ZFCP_PSEUDO_ERP_ACTION_RPORT_ADD,
|
||||
ZFCP_PSEUDO_ERP_ACTION_RPORT_ADD);
|
||||
rport = fc_remote_port_add(port->adapter->scsi_host, 0, &ids);
|
||||
if (!rport) {
|
||||
dev_err(&port->adapter->ccw_device->dev,
|
||||
|
|
@ -577,6 +580,9 @@ static void zfcp_scsi_rport_block(struct zfcp_port *port)
|
|||
struct fc_rport *rport = port->rport;
|
||||
|
||||
if (rport) {
|
||||
zfcp_dbf_rec_trig("scpdely", port->adapter, port, NULL,
|
||||
ZFCP_PSEUDO_ERP_ACTION_RPORT_DEL,
|
||||
ZFCP_PSEUDO_ERP_ACTION_RPORT_DEL);
|
||||
fc_remote_port_delete(rport);
|
||||
port->rport = NULL;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -396,18 +396,6 @@ config SCSI_3W_SAS
|
|||
Please read the comments at the top of
|
||||
<file:drivers/scsi/3w-sas.c>.
|
||||
|
||||
config SCSI_7000FASST
|
||||
tristate "7000FASST SCSI support"
|
||||
depends on ISA && SCSI && ISA_DMA_API
|
||||
select CHECK_SIGNATURE
|
||||
help
|
||||
This driver supports the Western Digital 7000 SCSI host adapter
|
||||
family. Some information is in the source:
|
||||
<file:drivers/scsi/wd7000.c>.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called wd7000.
|
||||
|
||||
config SCSI_ACARD
|
||||
tristate "ACARD SCSI support"
|
||||
depends on PCI && SCSI
|
||||
|
|
@ -512,18 +500,6 @@ config SCSI_ADVANSYS
|
|||
To compile this driver as a module, choose M here: the
|
||||
module will be called advansys.
|
||||
|
||||
config SCSI_IN2000
|
||||
tristate "Always IN2000 SCSI support"
|
||||
depends on ISA && SCSI
|
||||
help
|
||||
This is support for an ISA bus SCSI host adapter. You'll find more
|
||||
information in <file:Documentation/scsi/in2000.txt>. If it doesn't work
|
||||
out of the box, you may have to change the jumpers for IRQ or
|
||||
address selection.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called in2000.
|
||||
|
||||
config SCSI_ARCMSR
|
||||
tristate "ARECA (ARC11xx/12xx/13xx/16xx) SATA/SAS RAID Host Adapter"
|
||||
depends on PCI && SCSI
|
||||
|
|
@ -540,6 +516,7 @@ config SCSI_ARCMSR
|
|||
source "drivers/scsi/esas2r/Kconfig"
|
||||
source "drivers/scsi/megaraid/Kconfig.megaraid"
|
||||
source "drivers/scsi/mpt3sas/Kconfig"
|
||||
source "drivers/scsi/smartpqi/Kconfig"
|
||||
source "drivers/scsi/ufs/Kconfig"
|
||||
|
||||
config SCSI_HPTIOP
|
||||
|
|
@ -660,20 +637,6 @@ config SCSI_DMX3191D
|
|||
To compile this driver as a module, choose M here: the
|
||||
module will be called dmx3191d.
|
||||
|
||||
config SCSI_DTC3280
|
||||
tristate "DTC3180/3280 SCSI support"
|
||||
depends on ISA && SCSI
|
||||
select SCSI_SPI_ATTRS
|
||||
select CHECK_SIGNATURE
|
||||
help
|
||||
This is support for DTC 3180/3280 SCSI Host Adapters. Please read
|
||||
the SCSI-HOWTO, available from
|
||||
<http://www.tldp.org/docs.html#howto>, and the file
|
||||
<file:Documentation/scsi/dtc3x80.txt>.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called dtc.
|
||||
|
||||
config SCSI_EATA
|
||||
tristate "EATA ISA/EISA/PCI (DPT and generic EATA/DMA-compliant boards) support"
|
||||
depends on (ISA || EISA || PCI) && SCSI && ISA_DMA_API
|
||||
|
|
@ -1248,20 +1211,6 @@ config SCSI_NCR53C8XX_NO_DISCONNECT
|
|||
not allow targets to disconnect is not reasonable if there is more
|
||||
than 1 device on a SCSI bus. The normal answer therefore is N.
|
||||
|
||||
config SCSI_PAS16
|
||||
tristate "PAS16 SCSI support"
|
||||
depends on ISA && SCSI
|
||||
select SCSI_SPI_ATTRS
|
||||
---help---
|
||||
This is support for a SCSI host adapter. It is explained in section
|
||||
3.10 of the SCSI-HOWTO, available from
|
||||
<http://www.tldp.org/docs.html#howto>. If it doesn't work out
|
||||
of the box, you may have to change some settings in
|
||||
<file:drivers/scsi/pas16.h>.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called pas16.
|
||||
|
||||
config SCSI_QLOGIC_FAS
|
||||
tristate "Qlogic FAS SCSI support"
|
||||
depends on ISA && SCSI
|
||||
|
|
@ -1382,89 +1331,6 @@ config SCSI_AM53C974
|
|||
To compile this driver as a module, choose M here: the
|
||||
module will be called am53c974.
|
||||
|
||||
config SCSI_T128
|
||||
tristate "Trantor T128/T128F/T228 SCSI support"
|
||||
depends on ISA && SCSI
|
||||
select SCSI_SPI_ATTRS
|
||||
select CHECK_SIGNATURE
|
||||
---help---
|
||||
This is support for a SCSI host adapter. It is explained in section
|
||||
3.11 of the SCSI-HOWTO, available from
|
||||
<http://www.tldp.org/docs.html#howto>. If it doesn't work out
|
||||
of the box, you may have to change some settings in
|
||||
<file:drivers/scsi/t128.h>. Note that Trantor was purchased by
|
||||
Adaptec, and some former Trantor products are being sold under the
|
||||
Adaptec name.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called t128.
|
||||
|
||||
config SCSI_U14_34F
|
||||
tristate "UltraStor 14F/34F support"
|
||||
depends on ISA && SCSI && ISA_DMA_API
|
||||
---help---
|
||||
This is support for the UltraStor 14F and 34F SCSI-2 host adapters.
|
||||
The source at <file:drivers/scsi/u14-34f.c> contains some
|
||||
information about this hardware. If the driver doesn't work out of
|
||||
the box, you may have to change some settings in
|
||||
<file: drivers/scsi/u14-34f.c>. Read the SCSI-HOWTO, available from
|
||||
<http://www.tldp.org/docs.html#howto>. Note that there is also
|
||||
another driver for the same hardware: "UltraStor SCSI support",
|
||||
below. You should say Y to both only if you want 24F support as
|
||||
well.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called u14-34f.
|
||||
|
||||
config SCSI_U14_34F_TAGGED_QUEUE
|
||||
bool "enable tagged command queueing"
|
||||
depends on SCSI_U14_34F
|
||||
help
|
||||
This is a feature of SCSI-2 which improves performance: the host
|
||||
adapter can send several SCSI commands to a device's queue even if
|
||||
previous commands haven't finished yet.
|
||||
This is equivalent to the "u14-34f=tc:y" boot option.
|
||||
|
||||
config SCSI_U14_34F_LINKED_COMMANDS
|
||||
bool "enable elevator sorting"
|
||||
depends on SCSI_U14_34F
|
||||
help
|
||||
This option enables elevator sorting for all probed SCSI disks and
|
||||
CD-ROMs. It definitely reduces the average seek distance when doing
|
||||
random seeks, but this does not necessarily result in a noticeable
|
||||
performance improvement: your mileage may vary...
|
||||
This is equivalent to the "u14-34f=lc:y" boot option.
|
||||
|
||||
config SCSI_U14_34F_MAX_TAGS
|
||||
int "maximum number of queued commands"
|
||||
depends on SCSI_U14_34F
|
||||
default "8"
|
||||
help
|
||||
This specifies how many SCSI commands can be maximally queued for
|
||||
each probed SCSI device. You should reduce the default value of 8
|
||||
only if you have disks with buggy or limited tagged command support.
|
||||
Minimum is 2 and maximum is 14. This value is also the window size
|
||||
used by the elevator sorting option above. The effective value used
|
||||
by the driver for each probed SCSI device is reported at boot time.
|
||||
This is equivalent to the "u14-34f=mq:8" boot option.
|
||||
|
||||
config SCSI_ULTRASTOR
|
||||
tristate "UltraStor SCSI support"
|
||||
depends on X86 && ISA && SCSI && ISA_DMA_API
|
||||
---help---
|
||||
This is support for the UltraStor 14F, 24F and 34F SCSI-2 host
|
||||
adapter family. This driver is explained in section 3.12 of the
|
||||
SCSI-HOWTO, available from
|
||||
<http://www.tldp.org/docs.html#howto>. If it doesn't work out
|
||||
of the box, you may have to change some settings in
|
||||
<file:drivers/scsi/ultrastor.h>.
|
||||
|
||||
Note that there is also another driver for the same hardware:
|
||||
"UltraStor 14F/34F support", above.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called ultrastor.
|
||||
|
||||
config SCSI_NSP32
|
||||
tristate "Workbit NinjaSCSI-32Bi/UDE support"
|
||||
depends on PCI && SCSI && !64BIT
|
||||
|
|
|
|||
|
|
@ -61,9 +61,7 @@ obj-$(CONFIG_SCSI_SIM710) += 53c700.o sim710.o
|
|||
obj-$(CONFIG_SCSI_ADVANSYS) += advansys.o
|
||||
obj-$(CONFIG_SCSI_BUSLOGIC) += BusLogic.o
|
||||
obj-$(CONFIG_SCSI_DPT_I2O) += dpt_i2o.o
|
||||
obj-$(CONFIG_SCSI_U14_34F) += u14-34f.o
|
||||
obj-$(CONFIG_SCSI_ARCMSR) += arcmsr/
|
||||
obj-$(CONFIG_SCSI_ULTRASTOR) += ultrastor.o
|
||||
obj-$(CONFIG_SCSI_AHA152X) += aha152x.o
|
||||
obj-$(CONFIG_SCSI_AHA1542) += aha1542.o
|
||||
obj-$(CONFIG_SCSI_AHA1740) += aha1740.o
|
||||
|
|
@ -75,7 +73,6 @@ obj-$(CONFIG_SCSI_PM8001) += pm8001/
|
|||
obj-$(CONFIG_SCSI_ISCI) += isci/
|
||||
obj-$(CONFIG_SCSI_IPS) += ips.o
|
||||
obj-$(CONFIG_SCSI_FUTURE_DOMAIN)+= fdomain.o
|
||||
obj-$(CONFIG_SCSI_IN2000) += in2000.o
|
||||
obj-$(CONFIG_SCSI_GENERIC_NCR5380) += g_NCR5380.o
|
||||
obj-$(CONFIG_SCSI_GENERIC_NCR5380_MMIO) += g_NCR5380_mmio.o
|
||||
obj-$(CONFIG_SCSI_NCR53C406A) += NCR53c406a.o
|
||||
|
|
@ -90,15 +87,12 @@ obj-$(CONFIG_SCSI_QLA_ISCSI) += libiscsi.o qla4xxx/
|
|||
obj-$(CONFIG_SCSI_LPFC) += lpfc/
|
||||
obj-$(CONFIG_SCSI_BFA_FC) += bfa/
|
||||
obj-$(CONFIG_SCSI_CHELSIO_FCOE) += csiostor/
|
||||
obj-$(CONFIG_SCSI_PAS16) += pas16.o
|
||||
obj-$(CONFIG_SCSI_T128) += t128.o
|
||||
obj-$(CONFIG_SCSI_DMX3191D) += dmx3191d.o
|
||||
obj-$(CONFIG_SCSI_HPSA) += hpsa.o
|
||||
obj-$(CONFIG_SCSI_DTC3280) += dtc.o
|
||||
obj-$(CONFIG_SCSI_SMARTPQI) += smartpqi/
|
||||
obj-$(CONFIG_SCSI_SYM53C8XX_2) += sym53c8xx_2/
|
||||
obj-$(CONFIG_SCSI_ZALON) += zalon7xx.o
|
||||
obj-$(CONFIG_SCSI_EATA_PIO) += eata_pio.o
|
||||
obj-$(CONFIG_SCSI_7000FASST) += wd7000.o
|
||||
obj-$(CONFIG_SCSI_EATA) += eata.o
|
||||
obj-$(CONFIG_SCSI_DC395x) += dc395x.o
|
||||
obj-$(CONFIG_SCSI_AM53C974) += esp_scsi.o am53c974.o
|
||||
|
|
|
|||
|
|
@ -230,13 +230,6 @@ static int NCR5380_poll_politely2(struct Scsi_Host *instance,
|
|||
return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
static inline int NCR5380_poll_politely(struct Scsi_Host *instance,
|
||||
int reg, int bit, int val, int wait)
|
||||
{
|
||||
return NCR5380_poll_politely2(instance, reg, bit, val,
|
||||
reg, bit, val, wait);
|
||||
}
|
||||
|
||||
#if NDEBUG
|
||||
static struct {
|
||||
unsigned char mask;
|
||||
|
|
@ -1854,11 +1847,11 @@ static void NCR5380_information_transfer(struct Scsi_Host *instance)
|
|||
/* XXX - need to source or sink data here, as appropriate */
|
||||
}
|
||||
} else {
|
||||
/* Break up transfer into 3 ms chunks,
|
||||
* presuming 6 accesses per handshake.
|
||||
/* Transfer a small chunk so that the
|
||||
* irq mode lock is not held too long.
|
||||
*/
|
||||
transfersize = min((unsigned long)cmd->SCp.this_residual,
|
||||
hostdata->accesses_per_ms / 2);
|
||||
transfersize = min(cmd->SCp.this_residual,
|
||||
NCR5380_PIO_CHUNK_SIZE);
|
||||
len = transfersize;
|
||||
NCR5380_transfer_pio(instance, &phase, &len,
|
||||
(unsigned char **)&cmd->SCp.ptr);
|
||||
|
|
|
|||
|
|
@ -250,6 +250,8 @@ struct NCR5380_cmd {
|
|||
|
||||
#define NCR5380_CMD_SIZE (sizeof(struct NCR5380_cmd))
|
||||
|
||||
#define NCR5380_PIO_CHUNK_SIZE 256
|
||||
|
||||
static inline struct scsi_cmnd *NCR5380_to_scmd(struct NCR5380_cmd *ncmd_ptr)
|
||||
{
|
||||
return ((struct scsi_cmnd *)ncmd_ptr) - 1;
|
||||
|
|
@ -292,8 +294,14 @@ static void NCR5380_reselect(struct Scsi_Host *instance);
|
|||
static struct scsi_cmnd *NCR5380_select(struct Scsi_Host *, struct scsi_cmnd *);
|
||||
static int NCR5380_transfer_dma(struct Scsi_Host *instance, unsigned char *phase, int *count, unsigned char **data);
|
||||
static int NCR5380_transfer_pio(struct Scsi_Host *instance, unsigned char *phase, int *count, unsigned char **data);
|
||||
static int NCR5380_poll_politely(struct Scsi_Host *, int, int, int, int);
|
||||
static int NCR5380_poll_politely2(struct Scsi_Host *, int, int, int, int, int, int, int);
|
||||
|
||||
static inline int NCR5380_poll_politely(struct Scsi_Host *instance,
|
||||
int reg, int bit, int val, int wait)
|
||||
{
|
||||
return NCR5380_poll_politely2(instance, reg, bit, val,
|
||||
reg, bit, val, wait);
|
||||
}
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
#endif /* NCR5380_H */
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue