Merge git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6: (204 commits) [SCSI] qla4xxx: export address/port of connection (fix udev disk names) [SCSI] ipr: Fix BUG on adapter dump timeout [SCSI] megaraid_sas: Fix instance access in megasas_reset_timer [SCSI] hpsa: change confusing message to be more clear [SCSI] iscsi class: fix vlan configuration [SCSI] qla4xxx: fix data alignment and use nl helpers [SCSI] iscsi class: fix link local mispelling [SCSI] iscsi class: Replace iscsi_get_next_target_id with IDA [SCSI] aacraid: use lower snprintf() limit [SCSI] lpfc 8.3.27: Change driver version to 8.3.27 [SCSI] lpfc 8.3.27: T10 additions for SLI4 [SCSI] lpfc 8.3.27: Fix queue allocation failure recovery [SCSI] lpfc 8.3.27: Change algorithm for getting physical port name [SCSI] lpfc 8.3.27: Changed worst case mailbox timeout [SCSI] lpfc 8.3.27: Miscellanous logic and interface fixes [SCSI] megaraid_sas: Changelog and version update [SCSI] megaraid_sas: Add driver workaround for PERC5/1068 kdump kernel panic [SCSI] megaraid_sas: Add multiple MSI-X vector/multiple reply queue support [SCSI] megaraid_sas: Add support for MegaRAID 9360/9380 12GB/s controllers [SCSI] megaraid_sas: Clear FUSION_IN_RESET before enabling interrupts ...
This commit is contained in:
commit
ec7ae51753
162 changed files with 14203 additions and 3413 deletions
|
|
@ -206,3 +206,16 @@ Description:
|
|||
when a discarded area is read the discard_zeroes_data
|
||||
parameter will be set to one. Otherwise it will be 0 and
|
||||
the result of reading a discarded area is undefined.
|
||||
What: /sys/block/<disk>/alias
|
||||
Date: Aug 2011
|
||||
Contact: Nao Nishijima <nao.nishijima.xt@hitachi.com>
|
||||
Description:
|
||||
A raw device name of a disk does not always point a same disk
|
||||
each boot-up time. Therefore, users have to use persistent
|
||||
device names, which udev creates when the kernel finds a disk,
|
||||
instead of raw device name. However, kernel doesn't show those
|
||||
persistent names on its messages (e.g. dmesg).
|
||||
This file can store an alias of the disk and it would be
|
||||
appeared in kernel messages if it is set. A disk can have an
|
||||
alias which length is up to 255bytes. Users can use alphabets,
|
||||
numbers, "-" and "_" in alias name. This file is writeonce.
|
||||
|
|
|
|||
|
|
@ -28,6 +28,8 @@ LICENSE.FlashPoint
|
|||
- Licence of the Flashpoint driver
|
||||
LICENSE.qla2xxx
|
||||
- License for QLogic Linux Fibre Channel HBA Driver firmware.
|
||||
LICENSE.qla4xxx
|
||||
- License for QLogic Linux iSCSI HBA Driver.
|
||||
Mylex.txt
|
||||
- info on driver for Mylex adapters
|
||||
NinjaSCSI.txt
|
||||
|
|
|
|||
|
|
@ -1,3 +1,18 @@
|
|||
Release Date : Wed. Oct 5, 2011 17:00:00 PST 2010 -
|
||||
(emaild-id:megaraidlinux@lsi.com)
|
||||
Adam Radford
|
||||
Current Version : 00.00.06.12-rc1
|
||||
Old Version : 00.00.05.40-rc1
|
||||
1. Continue booting immediately if FW in FAULT at driver load time.
|
||||
2. Increase default cmds per lun to 256.
|
||||
3. Fix mismatch in megasas_reset_fusion() mutex lock-unlock.
|
||||
4. Remove some un-necessary code.
|
||||
5. Clear state change interrupts for Fusion/Invader.
|
||||
6. Clear FUSION_IN_RESET before enabling interrupts.
|
||||
7. Add support for MegaRAID 9360/9380 12GB/s controllers.
|
||||
8. Add multiple MSI-X vector/multiple reply queue support.
|
||||
9. Add driver workaround for PERC5/1068 kdump kernel panic.
|
||||
-------------------------------------------------------------------------------
|
||||
Release Date : Tue. Jul 26, 2011 17:00:00 PST 2010 -
|
||||
(emaild-id:megaraidlinux@lsi.com)
|
||||
Adam Radford
|
||||
|
|
|
|||
310
Documentation/scsi/LICENSE.qla4xxx
Normal file
310
Documentation/scsi/LICENSE.qla4xxx
Normal file
|
|
@ -0,0 +1,310 @@
|
|||
Copyright (c) 2003-2011 QLogic Corporation
|
||||
QLogic Linux iSCSI HBA Driver
|
||||
|
||||
This program includes a device driver for Linux 3.x.
|
||||
You may modify and redistribute the device driver code under the
|
||||
GNU General Public License (a copy of which is attached hereto as
|
||||
Exhibit A) published by the Free Software Foundation (version 2).
|
||||
|
||||
REGARDLESS OF WHAT LICENSING MECHANISM IS USED OR APPLICABLE,
|
||||
THIS PROGRAM IS PROVIDED BY QLOGIC CORPORATION "AS IS'' AND ANY
|
||||
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR
|
||||
BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
||||
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
USER ACKNOWLEDGES AND AGREES THAT USE OF THIS PROGRAM WILL NOT
|
||||
CREATE OR GIVE GROUNDS FOR A LICENSE BY IMPLICATION, ESTOPPEL, OR
|
||||
OTHERWISE IN ANY INTELLECTUAL PROPERTY RIGHTS (PATENT, COPYRIGHT,
|
||||
TRADE SECRET, MASK WORK, OR OTHER PROPRIETARY RIGHT) EMBODIED IN
|
||||
ANY OTHER QLOGIC HARDWARE OR SOFTWARE EITHER SOLELY OR IN
|
||||
COMBINATION WITH THIS PROGRAM.
|
||||
|
||||
|
||||
EXHIBIT A
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Lesser General Public License instead.) You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
this service if you wish), that you receive source code or can get it
|
||||
if you want it, that you can change the software or use pieces of it
|
||||
in new free programs; and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the software, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. You must make sure that they, too, receive or can get the
|
||||
source code. And you must show them these terms so they know their
|
||||
rights.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that redistributors of a free
|
||||
program will individually obtain patent licenses, in effect making the
|
||||
program proprietary. To prevent this, we have made it clear that any
|
||||
patent must be licensed for everyone's free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains
|
||||
a notice placed by the copyright holder saying it may be distributed
|
||||
under the terms of this General Public License. The "Program", below,
|
||||
refers to any such program or work, and a "work based on the Program"
|
||||
means either the Program or any derivative work under copyright law:
|
||||
that is to say, a work containing the Program or a portion of it,
|
||||
either verbatim or with modifications and/or translated into another
|
||||
language. (Hereinafter, translation is included without limitation in
|
||||
the term "modification".) Each licensee is addressed as "you".
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running the Program is not restricted, and the output from the Program
|
||||
is covered only if its contents constitute a work based on the
|
||||
Program (independent of having been made by running the Program).
|
||||
Whether that is true depends on what the Program does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's
|
||||
source code as you receive it, in any medium, provided that you
|
||||
conspicuously and appropriately publish on each copy an appropriate
|
||||
copyright notice and disclaimer of warranty; keep intact all the
|
||||
notices that refer to this License and to the absence of any warranty;
|
||||
and give any other recipients of the Program a copy of this License
|
||||
along with the Program.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and
|
||||
you may at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion
|
||||
of it, thus forming a work based on the Program, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) You must cause the modified files to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
b) You must cause any work that you distribute or publish, that in
|
||||
whole or in part contains or is derived from the Program or any
|
||||
part thereof, to be licensed as a whole at no charge to all third
|
||||
parties under the terms of this License.
|
||||
|
||||
c) If the modified program normally reads commands interactively
|
||||
when run, you must cause it, when started running for such
|
||||
interactive use in the most ordinary way, to print or display an
|
||||
announcement including an appropriate copyright notice and a
|
||||
notice that there is no warranty (or else, saying that you provide
|
||||
a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Program, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Program.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program
|
||||
with the Program (or with a work based on the Program) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may copy and distribute the Program (or a work based on it,
|
||||
under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you also do one of the following:
|
||||
|
||||
a) Accompany it with the complete corresponding machine-readable
|
||||
source code, which must be distributed under the terms of Sections
|
||||
1 and 2 above on a medium customarily used for software interchange; or,
|
||||
|
||||
b) Accompany it with a written offer, valid for at least three
|
||||
years, to give any third party, for a charge no more than your
|
||||
cost of physically performing source distribution, a complete
|
||||
machine-readable copy of the corresponding source code, to be
|
||||
distributed under the terms of Sections 1 and 2 above on a medium
|
||||
customarily used for software interchange; or,
|
||||
|
||||
c) Accompany it with the information you received as to the offer
|
||||
to distribute corresponding source code. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form with such
|
||||
an offer, in accord with Subsection b above.)
|
||||
|
||||
The source code for a work means the preferred form of the work for
|
||||
making modifications to it. For an executable work, complete source
|
||||
code means all the source code for all modules it contains, plus any
|
||||
associated interface definition files, plus the scripts used to
|
||||
control compilation and installation of the executable. However, as a
|
||||
special exception, the source code distributed need not include
|
||||
anything that is normally distributed (in either source or binary
|
||||
form) with the major components (compiler, kernel, and so on) of the
|
||||
operating system on which the executable runs, unless that component
|
||||
itself accompanies the executable.
|
||||
|
||||
If distribution of executable or object code is made by offering
|
||||
access to copy from a designated place, then offering equivalent
|
||||
access to copy the source code from the same place counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program is
|
||||
void, and will automatically terminate your rights under this License.
|
||||
However, parties who have received copies, or rights, from you under
|
||||
this License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
|
||||
5. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Program or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Program (or any work based on the
|
||||
Program), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Program or works based on it.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute or modify the Program subject to
|
||||
these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Program at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Program by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Program.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under
|
||||
any particular circumstance, the balance of the section is intended to
|
||||
apply and the section as a whole is intended to apply in other
|
||||
circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system, which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program under this License
|
||||
may add an explicit geographical distribution limitation excluding
|
||||
those countries, so that distribution is permitted only in or among
|
||||
countries not thus excluded. In such case, this License incorporates
|
||||
the limitation as if written in the body of this License.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions
|
||||
of the General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program
|
||||
specifies a version number of this License which applies to it and "any
|
||||
later version", you have the option of following the terms and conditions
|
||||
either of that version or of any later version published by the Free
|
||||
Software Foundation. If the Program does not specify a version number of
|
||||
this License, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
|
||||
10. If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free
|
||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||
make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||
REPAIR OR CORRECTION.
|
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
75
Documentation/scsi/bnx2fc.txt
Normal file
75
Documentation/scsi/bnx2fc.txt
Normal file
|
|
@ -0,0 +1,75 @@
|
|||
Operating FCoE using bnx2fc
|
||||
===========================
|
||||
Broadcom FCoE offload through bnx2fc is full stateful hardware offload that
|
||||
cooperates with all interfaces provided by the Linux ecosystem for FC/FCoE and
|
||||
SCSI controllers. As such, FCoE functionality, once enabled is largely
|
||||
transparent. Devices discovered on the SAN will be registered and unregistered
|
||||
automatically with the upper storage layers.
|
||||
|
||||
Despite the fact that the Broadcom's FCoE offload is fully offloaded, it does
|
||||
depend on the state of the network interfaces to operate. As such, the network
|
||||
interface (e.g. eth0) associated with the FCoE offload initiator must be 'up'.
|
||||
It is recommended that the network interfaces be configured to be brought up
|
||||
automatically at boot time.
|
||||
|
||||
Furthermore, the Broadcom FCoE offload solution creates VLAN interfaces to
|
||||
support the VLANs that have been discovered for FCoE operation (e.g.
|
||||
eth0.1001-fcoe). Do not delete or disable these interfaces or FCoE operation
|
||||
will be disrupted.
|
||||
|
||||
Driver Usage Model:
|
||||
===================
|
||||
|
||||
1. Ensure that fcoe-utils package is installed.
|
||||
|
||||
2. Configure the interfaces on which bnx2fc driver has to operate on.
|
||||
Here are the steps to configure:
|
||||
a. cd /etc/fcoe
|
||||
b. copy cfg-ethx to cfg-eth5 if FCoE has to be enabled on eth5.
|
||||
c. Repeat this for all the interfaces where FCoE has to be enabled.
|
||||
d. Edit all the cfg-eth files to set "no" for DCB_REQUIRED** field, and
|
||||
"yes" for AUTO_VLAN.
|
||||
e. Other configuration parameters should be left as default
|
||||
|
||||
3. Ensure that "bnx2fc" is in SUPPORTED_DRIVERS list in /etc/fcoe/config.
|
||||
|
||||
4. Start fcoe service. (service fcoe start). If Broadcom devices are present in
|
||||
the system, bnx2fc driver would automatically claim the interfaces, starts vlan
|
||||
discovery and log into the targets.
|
||||
|
||||
5. "Symbolic Name" in 'fcoeadm -i' output would display if bnx2fc has claimed
|
||||
the interface.
|
||||
Eg:
|
||||
[root@bh2 ~]# fcoeadm -i
|
||||
Description: NetXtreme II BCM57712 10 Gigabit Ethernet
|
||||
Revision: 01
|
||||
Manufacturer: Broadcom Corporation
|
||||
Serial Number: 0010186FD558
|
||||
Driver: bnx2x 1.70.00-0
|
||||
Number of Ports: 2
|
||||
|
||||
Symbolic Name: bnx2fc v1.0.5 over eth5.4
|
||||
OS Device Name: host11
|
||||
Node Name: 0x10000010186FD559
|
||||
Port Name: 0x20000010186FD559
|
||||
FabricName: 0x2001000DECB3B681
|
||||
Speed: 10 Gbit
|
||||
Supported Speed: 10 Gbit
|
||||
MaxFrameSize: 2048
|
||||
FC-ID (Port ID): 0x0F0377
|
||||
State: Online
|
||||
|
||||
6. Verify the vlan discovery is performed by running ifconfig and notice
|
||||
<INTERFACE>.<VLAN>-fcoe interfaces are automatically created.
|
||||
|
||||
Refer to fcoeadm manpage for more information on fcoeadm operations to
|
||||
create/destroy interfaces or to display lun/target information.
|
||||
|
||||
NOTE:
|
||||
====
|
||||
** Broadcom FCoE capable devices implement a DCBX/LLDP client on-chip. Only one
|
||||
LLDP client is allowed per interface. For proper operation all host software
|
||||
based DCBX/LLDP clients (e.g. lldpad) must be disabled. To disable lldpad on a
|
||||
given interface, run the following command:
|
||||
|
||||
lldptool set-lldp -i <interface_name> adminStatus=disabled
|
||||
|
|
@ -46,6 +46,8 @@ struct qdesfmt0 {
|
|||
u32 : 16;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
#define QDR_AC_MULTI_BUFFER_ENABLE 0x01
|
||||
|
||||
/**
|
||||
* struct qdr - queue description record (QDR)
|
||||
* @qfmt: queue format
|
||||
|
|
@ -256,6 +258,8 @@ struct slsb {
|
|||
u8 val[QDIO_MAX_BUFFERS_PER_Q];
|
||||
} __attribute__ ((packed, aligned(256)));
|
||||
|
||||
#define CHSC_AC2_MULTI_BUFFER_AVAILABLE 0x0080
|
||||
#define CHSC_AC2_MULTI_BUFFER_ENABLED 0x0040
|
||||
#define CHSC_AC2_DATA_DIV_AVAILABLE 0x0010
|
||||
#define CHSC_AC2_DATA_DIV_ENABLED 0x0002
|
||||
|
||||
|
|
@ -357,6 +361,7 @@ typedef void qdio_handler_t(struct ccw_device *, unsigned int, int,
|
|||
struct qdio_initialize {
|
||||
struct ccw_device *cdev;
|
||||
unsigned char q_format;
|
||||
unsigned char qdr_ac;
|
||||
unsigned char adapter_name[8];
|
||||
unsigned int qib_param_field_format;
|
||||
unsigned char *qib_param_field;
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@
|
|||
#include <linux/mutex.h>
|
||||
#include <linux/idr.h>
|
||||
#include <linux/log2.h>
|
||||
#include <linux/ctype.h>
|
||||
|
||||
#include "blk.h"
|
||||
|
||||
|
|
@ -909,6 +910,74 @@ static int __init genhd_device_init(void)
|
|||
|
||||
subsys_initcall(genhd_device_init);
|
||||
|
||||
static ssize_t alias_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct gendisk *disk = dev_to_disk(dev);
|
||||
ssize_t ret = 0;
|
||||
|
||||
if (disk->alias)
|
||||
ret = snprintf(buf, ALIAS_LEN, "%s\n", disk->alias);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static ssize_t alias_store(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct gendisk *disk = dev_to_disk(dev);
|
||||
char *alias;
|
||||
char *envp[] = { NULL, NULL };
|
||||
unsigned char c;
|
||||
int i;
|
||||
ssize_t ret = count;
|
||||
|
||||
if (!count)
|
||||
return -EINVAL;
|
||||
|
||||
if (count >= ALIAS_LEN) {
|
||||
printk(KERN_ERR "alias: alias is too long\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Validation check */
|
||||
for (i = 0; i < count; i++) {
|
||||
c = buf[i];
|
||||
if (i == count - 1 && c == '\n')
|
||||
break;
|
||||
if (!isalnum(c) && c != '_' && c != '-') {
|
||||
printk(KERN_ERR "alias: invalid alias\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
if (disk->alias) {
|
||||
printk(KERN_INFO "alias: %s is already assigned (%s)\n",
|
||||
disk->disk_name, disk->alias);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
alias = kasprintf(GFP_KERNEL, "%s", buf);
|
||||
if (!alias)
|
||||
return -ENOMEM;
|
||||
|
||||
if (alias[count - 1] == '\n')
|
||||
alias[count - 1] = '\0';
|
||||
|
||||
envp[0] = kasprintf(GFP_KERNEL, "ALIAS=%s", alias);
|
||||
if (!envp[0]) {
|
||||
kfree(alias);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
disk->alias = alias;
|
||||
printk(KERN_INFO "alias: assigned %s to %s\n", alias, disk->disk_name);
|
||||
|
||||
kobject_uevent_env(&dev->kobj, KOBJ_ADD, envp);
|
||||
|
||||
kfree(envp[0]);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static ssize_t disk_range_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
|
|
@ -968,6 +1037,7 @@ static ssize_t disk_discard_alignment_show(struct device *dev,
|
|||
return sprintf(buf, "%d\n", queue_discard_alignment(disk->queue));
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(alias, S_IRUGO|S_IWUSR, alias_show, alias_store);
|
||||
static DEVICE_ATTR(range, S_IRUGO, disk_range_show, NULL);
|
||||
static DEVICE_ATTR(ext_range, S_IRUGO, disk_ext_range_show, NULL);
|
||||
static DEVICE_ATTR(removable, S_IRUGO, disk_removable_show, NULL);
|
||||
|
|
@ -990,6 +1060,7 @@ static struct device_attribute dev_attr_fail_timeout =
|
|||
#endif
|
||||
|
||||
static struct attribute *disk_attrs[] = {
|
||||
&dev_attr_alias.attr,
|
||||
&dev_attr_range.attr,
|
||||
&dev_attr_ext_range.attr,
|
||||
&dev_attr_removable.attr,
|
||||
|
|
|
|||
|
|
@ -6713,6 +6713,7 @@ EXPORT_SYMBOL_GPL(ata_scsi_queuecmd);
|
|||
EXPORT_SYMBOL_GPL(ata_scsi_slave_config);
|
||||
EXPORT_SYMBOL_GPL(ata_scsi_slave_destroy);
|
||||
EXPORT_SYMBOL_GPL(ata_scsi_change_queue_depth);
|
||||
EXPORT_SYMBOL_GPL(__ata_change_queue_depth);
|
||||
EXPORT_SYMBOL_GPL(sata_scr_valid);
|
||||
EXPORT_SYMBOL_GPL(sata_scr_read);
|
||||
EXPORT_SYMBOL_GPL(sata_scr_write);
|
||||
|
|
|
|||
|
|
@ -1215,25 +1215,15 @@ void ata_scsi_slave_destroy(struct scsi_device *sdev)
|
|||
}
|
||||
|
||||
/**
|
||||
* ata_scsi_change_queue_depth - SCSI callback for queue depth config
|
||||
* @sdev: SCSI device to configure queue depth for
|
||||
* @queue_depth: new queue depth
|
||||
* @reason: calling context
|
||||
* __ata_change_queue_depth - helper for ata_scsi_change_queue_depth
|
||||
*
|
||||
* This is libata standard hostt->change_queue_depth callback.
|
||||
* SCSI will call into this callback when user tries to set queue
|
||||
* depth via sysfs.
|
||||
* libsas and libata have different approaches for associating a sdev to
|
||||
* its ata_port.
|
||||
*
|
||||
* LOCKING:
|
||||
* SCSI layer (we don't care)
|
||||
*
|
||||
* RETURNS:
|
||||
* Newly configured queue depth.
|
||||
*/
|
||||
int ata_scsi_change_queue_depth(struct scsi_device *sdev, int queue_depth,
|
||||
int reason)
|
||||
int __ata_change_queue_depth(struct ata_port *ap, struct scsi_device *sdev,
|
||||
int queue_depth, int reason)
|
||||
{
|
||||
struct ata_port *ap = ata_shost_to_port(sdev->host);
|
||||
struct ata_device *dev;
|
||||
unsigned long flags;
|
||||
|
||||
|
|
@ -1268,6 +1258,30 @@ int ata_scsi_change_queue_depth(struct scsi_device *sdev, int queue_depth,
|
|||
return queue_depth;
|
||||
}
|
||||
|
||||
/**
|
||||
* ata_scsi_change_queue_depth - SCSI callback for queue depth config
|
||||
* @sdev: SCSI device to configure queue depth for
|
||||
* @queue_depth: new queue depth
|
||||
* @reason: calling context
|
||||
*
|
||||
* This is libata standard hostt->change_queue_depth callback.
|
||||
* SCSI will call into this callback when user tries to set queue
|
||||
* depth via sysfs.
|
||||
*
|
||||
* LOCKING:
|
||||
* SCSI layer (we don't care)
|
||||
*
|
||||
* RETURNS:
|
||||
* Newly configured queue depth.
|
||||
*/
|
||||
int ata_scsi_change_queue_depth(struct scsi_device *sdev, int queue_depth,
|
||||
int reason)
|
||||
{
|
||||
struct ata_port *ap = ata_shost_to_port(sdev->host);
|
||||
|
||||
return __ata_change_queue_depth(ap, sdev, queue_depth, reason);
|
||||
}
|
||||
|
||||
/**
|
||||
* ata_scsi_start_stop_xlat - Translate SCSI START STOP UNIT command
|
||||
* @qc: Storage for translated ATA taskfile
|
||||
|
|
|
|||
|
|
@ -632,6 +632,59 @@ iscsi_iser_ep_disconnect(struct iscsi_endpoint *ep)
|
|||
iser_conn_terminate(ib_conn);
|
||||
}
|
||||
|
||||
static mode_t iser_attr_is_visible(int param_type, int param)
|
||||
{
|
||||
switch (param_type) {
|
||||
case ISCSI_HOST_PARAM:
|
||||
switch (param) {
|
||||
case ISCSI_HOST_PARAM_NETDEV_NAME:
|
||||
case ISCSI_HOST_PARAM_HWADDRESS:
|
||||
case ISCSI_HOST_PARAM_INITIATOR_NAME:
|
||||
return S_IRUGO;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
case ISCSI_PARAM:
|
||||
switch (param) {
|
||||
case ISCSI_PARAM_MAX_RECV_DLENGTH:
|
||||
case ISCSI_PARAM_MAX_XMIT_DLENGTH:
|
||||
case ISCSI_PARAM_HDRDGST_EN:
|
||||
case ISCSI_PARAM_DATADGST_EN:
|
||||
case ISCSI_PARAM_CONN_ADDRESS:
|
||||
case ISCSI_PARAM_CONN_PORT:
|
||||
case ISCSI_PARAM_EXP_STATSN:
|
||||
case ISCSI_PARAM_PERSISTENT_ADDRESS:
|
||||
case ISCSI_PARAM_PERSISTENT_PORT:
|
||||
case ISCSI_PARAM_PING_TMO:
|
||||
case ISCSI_PARAM_RECV_TMO:
|
||||
case ISCSI_PARAM_INITIAL_R2T_EN:
|
||||
case ISCSI_PARAM_MAX_R2T:
|
||||
case ISCSI_PARAM_IMM_DATA_EN:
|
||||
case ISCSI_PARAM_FIRST_BURST:
|
||||
case ISCSI_PARAM_MAX_BURST:
|
||||
case ISCSI_PARAM_PDU_INORDER_EN:
|
||||
case ISCSI_PARAM_DATASEQ_INORDER_EN:
|
||||
case ISCSI_PARAM_TARGET_NAME:
|
||||
case ISCSI_PARAM_TPGT:
|
||||
case ISCSI_PARAM_USERNAME:
|
||||
case ISCSI_PARAM_PASSWORD:
|
||||
case ISCSI_PARAM_USERNAME_IN:
|
||||
case ISCSI_PARAM_PASSWORD_IN:
|
||||
case ISCSI_PARAM_FAST_ABORT:
|
||||
case ISCSI_PARAM_ABORT_TMO:
|
||||
case ISCSI_PARAM_LU_RESET_TMO:
|
||||
case ISCSI_PARAM_TGT_RESET_TMO:
|
||||
case ISCSI_PARAM_IFACE_NAME:
|
||||
case ISCSI_PARAM_INITIATOR_NAME:
|
||||
return S_IRUGO;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct scsi_host_template iscsi_iser_sht = {
|
||||
.module = THIS_MODULE,
|
||||
.name = "iSCSI Initiator over iSER, v." DRV_VER,
|
||||
|
|
@ -653,32 +706,6 @@ static struct iscsi_transport iscsi_iser_transport = {
|
|||
.owner = THIS_MODULE,
|
||||
.name = "iser",
|
||||
.caps = CAP_RECOVERY_L0 | CAP_MULTI_R2T,
|
||||
.param_mask = ISCSI_MAX_RECV_DLENGTH |
|
||||
ISCSI_MAX_XMIT_DLENGTH |
|
||||
ISCSI_HDRDGST_EN |
|
||||
ISCSI_DATADGST_EN |
|
||||
ISCSI_INITIAL_R2T_EN |
|
||||
ISCSI_MAX_R2T |
|
||||
ISCSI_IMM_DATA_EN |
|
||||
ISCSI_FIRST_BURST |
|
||||
ISCSI_MAX_BURST |
|
||||
ISCSI_PDU_INORDER_EN |
|
||||
ISCSI_DATASEQ_INORDER_EN |
|
||||
ISCSI_CONN_PORT |
|
||||
ISCSI_CONN_ADDRESS |
|
||||
ISCSI_EXP_STATSN |
|
||||
ISCSI_PERSISTENT_PORT |
|
||||
ISCSI_PERSISTENT_ADDRESS |
|
||||
ISCSI_TARGET_NAME | ISCSI_TPGT |
|
||||
ISCSI_USERNAME | ISCSI_PASSWORD |
|
||||
ISCSI_USERNAME_IN | ISCSI_PASSWORD_IN |
|
||||
ISCSI_FAST_ABORT | ISCSI_ABORT_TMO |
|
||||
ISCSI_LU_RESET_TMO | ISCSI_TGT_RESET_TMO |
|
||||
ISCSI_PING_TMO | ISCSI_RECV_TMO |
|
||||
ISCSI_IFACE_NAME | ISCSI_INITIATOR_NAME,
|
||||
.host_param_mask = ISCSI_HOST_HWADDRESS |
|
||||
ISCSI_HOST_NETDEV_NAME |
|
||||
ISCSI_HOST_INITIATOR_NAME,
|
||||
/* session management */
|
||||
.create_session = iscsi_iser_session_create,
|
||||
.destroy_session = iscsi_iser_session_destroy,
|
||||
|
|
@ -686,6 +713,7 @@ static struct iscsi_transport iscsi_iser_transport = {
|
|||
.create_conn = iscsi_iser_conn_create,
|
||||
.bind_conn = iscsi_iser_conn_bind,
|
||||
.destroy_conn = iscsi_iser_conn_destroy,
|
||||
.attr_is_visible = iser_attr_is_visible,
|
||||
.set_param = iscsi_iser_set_param,
|
||||
.get_conn_param = iscsi_conn_get_param,
|
||||
.get_ep_param = iscsi_iser_get_ep_param,
|
||||
|
|
|
|||
|
|
@ -63,6 +63,8 @@
|
|||
#ifdef CONFIG_MTRR
|
||||
#include <asm/mtrr.h>
|
||||
#endif
|
||||
#include <linux/kthread.h>
|
||||
#include <scsi/scsi_host.h>
|
||||
|
||||
#include "mptbase.h"
|
||||
#include "lsi/mpi_log_fc.h"
|
||||
|
|
@ -323,6 +325,32 @@ mpt_is_discovery_complete(MPT_ADAPTER *ioc)
|
|||
return rc;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* mpt_remove_dead_ioc_func - kthread context to remove dead ioc
|
||||
* @arg: input argument, used to derive ioc
|
||||
*
|
||||
* Return 0 if controller is removed from pci subsystem.
|
||||
* Return -1 for other case.
|
||||
*/
|
||||
static int mpt_remove_dead_ioc_func(void *arg)
|
||||
{
|
||||
MPT_ADAPTER *ioc = (MPT_ADAPTER *)arg;
|
||||
struct pci_dev *pdev;
|
||||
|
||||
if ((ioc == NULL))
|
||||
return -1;
|
||||
|
||||
pdev = ioc->pcidev;
|
||||
if ((pdev == NULL))
|
||||
return -1;
|
||||
|
||||
pci_remove_bus_device(pdev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* mpt_fault_reset_work - work performed on workq after ioc fault
|
||||
* @work: input argument, used to derive ioc
|
||||
|
|
@ -336,12 +364,45 @@ mpt_fault_reset_work(struct work_struct *work)
|
|||
u32 ioc_raw_state;
|
||||
int rc;
|
||||
unsigned long flags;
|
||||
MPT_SCSI_HOST *hd;
|
||||
struct task_struct *p;
|
||||
|
||||
if (ioc->ioc_reset_in_progress || !ioc->active)
|
||||
goto out;
|
||||
|
||||
|
||||
ioc_raw_state = mpt_GetIocState(ioc, 0);
|
||||
if ((ioc_raw_state & MPI_IOC_STATE_MASK) == MPI_IOC_STATE_FAULT) {
|
||||
if ((ioc_raw_state & MPI_IOC_STATE_MASK) == MPI_IOC_STATE_MASK) {
|
||||
printk(MYIOC_s_INFO_FMT "%s: IOC is non-operational !!!!\n",
|
||||
ioc->name, __func__);
|
||||
|
||||
/*
|
||||
* Call mptscsih_flush_pending_cmds callback so that we
|
||||
* flush all pending commands back to OS.
|
||||
* This call is required to aovid deadlock at block layer.
|
||||
* Dead IOC will fail to do diag reset,and this call is safe
|
||||
* since dead ioc will never return any command back from HW.
|
||||
*/
|
||||
hd = shost_priv(ioc->sh);
|
||||
ioc->schedule_dead_ioc_flush_running_cmds(hd);
|
||||
|
||||
/*Remove the Dead Host */
|
||||
p = kthread_run(mpt_remove_dead_ioc_func, ioc,
|
||||
"mpt_dead_ioc_%d", ioc->id);
|
||||
if (IS_ERR(p)) {
|
||||
printk(MYIOC_s_ERR_FMT
|
||||
"%s: Running mpt_dead_ioc thread failed !\n",
|
||||
ioc->name, __func__);
|
||||
} else {
|
||||
printk(MYIOC_s_WARN_FMT
|
||||
"%s: Running mpt_dead_ioc thread success !\n",
|
||||
ioc->name, __func__);
|
||||
}
|
||||
return; /* don't rearm timer */
|
||||
}
|
||||
|
||||
if ((ioc_raw_state & MPI_IOC_STATE_MASK)
|
||||
== MPI_IOC_STATE_FAULT) {
|
||||
printk(MYIOC_s_WARN_FMT "IOC is in FAULT state (%04xh)!!!\n",
|
||||
ioc->name, ioc_raw_state & MPI_DOORBELL_DATA_MASK);
|
||||
printk(MYIOC_s_WARN_FMT "Issuing HardReset from %s!!\n",
|
||||
|
|
@ -6413,8 +6474,19 @@ mpt_config(MPT_ADAPTER *ioc, CONFIGPARMS *pCfg)
|
|||
pReq->Action, ioc->mptbase_cmds.status, timeleft));
|
||||
if (ioc->mptbase_cmds.status & MPT_MGMT_STATUS_DID_IOCRESET)
|
||||
goto out;
|
||||
if (!timeleft)
|
||||
if (!timeleft) {
|
||||
spin_lock_irqsave(&ioc->taskmgmt_lock, flags);
|
||||
if (ioc->ioc_reset_in_progress) {
|
||||
spin_unlock_irqrestore(&ioc->taskmgmt_lock,
|
||||
flags);
|
||||
printk(MYIOC_s_INFO_FMT "%s: host reset in"
|
||||
" progress mpt_config timed out.!!\n",
|
||||
__func__, ioc->name);
|
||||
return -EFAULT;
|
||||
}
|
||||
spin_unlock_irqrestore(&ioc->taskmgmt_lock, flags);
|
||||
issue_hard_reset = 1;
|
||||
}
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
|
@ -7128,7 +7200,18 @@ mpt_HardResetHandler(MPT_ADAPTER *ioc, int sleepFlag)
|
|||
spin_lock_irqsave(&ioc->taskmgmt_lock, flags);
|
||||
if (ioc->ioc_reset_in_progress) {
|
||||
spin_unlock_irqrestore(&ioc->taskmgmt_lock, flags);
|
||||
return 0;
|
||||
ioc->wait_on_reset_completion = 1;
|
||||
do {
|
||||
ssleep(1);
|
||||
} while (ioc->ioc_reset_in_progress == 1);
|
||||
ioc->wait_on_reset_completion = 0;
|
||||
return ioc->reset_status;
|
||||
}
|
||||
if (ioc->wait_on_reset_completion) {
|
||||
spin_unlock_irqrestore(&ioc->taskmgmt_lock, flags);
|
||||
rc = 0;
|
||||
time_count = jiffies;
|
||||
goto exit;
|
||||
}
|
||||
ioc->ioc_reset_in_progress = 1;
|
||||
if (ioc->alt_ioc)
|
||||
|
|
@ -7165,6 +7248,7 @@ mpt_HardResetHandler(MPT_ADAPTER *ioc, int sleepFlag)
|
|||
ioc->ioc_reset_in_progress = 0;
|
||||
ioc->taskmgmt_quiesce_io = 0;
|
||||
ioc->taskmgmt_in_progress = 0;
|
||||
ioc->reset_status = rc;
|
||||
if (ioc->alt_ioc) {
|
||||
ioc->alt_ioc->ioc_reset_in_progress = 0;
|
||||
ioc->alt_ioc->taskmgmt_quiesce_io = 0;
|
||||
|
|
@ -7180,7 +7264,7 @@ mpt_HardResetHandler(MPT_ADAPTER *ioc, int sleepFlag)
|
|||
ioc->alt_ioc, MPT_IOC_POST_RESET);
|
||||
}
|
||||
}
|
||||
|
||||
exit:
|
||||
dtmprintk(ioc,
|
||||
printk(MYIOC_s_DEBUG_FMT
|
||||
"HardResetHandler: completed (%d seconds): %s\n", ioc->name,
|
||||
|
|
|
|||
|
|
@ -76,8 +76,8 @@
|
|||
#define COPYRIGHT "Copyright (c) 1999-2008 " MODULEAUTHOR
|
||||
#endif
|
||||
|
||||
#define MPT_LINUX_VERSION_COMMON "3.04.19"
|
||||
#define MPT_LINUX_PACKAGE_NAME "@(#)mptlinux-3.04.19"
|
||||
#define MPT_LINUX_VERSION_COMMON "3.04.20"
|
||||
#define MPT_LINUX_PACKAGE_NAME "@(#)mptlinux-3.04.20"
|
||||
#define WHAT_MAGIC_STRING "@" "(" "#" ")"
|
||||
|
||||
#define show_mptmod_ver(s,ver) \
|
||||
|
|
@ -554,10 +554,47 @@ struct mptfc_rport_info
|
|||
u8 flags;
|
||||
};
|
||||
|
||||
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
|
||||
|
||||
/*
|
||||
* MPT_SCSI_HOST defines - Used by the IOCTL and the SCSI drivers
|
||||
* Private to the driver.
|
||||
*/
|
||||
|
||||
#define MPT_HOST_BUS_UNKNOWN (0xFF)
|
||||
#define MPT_HOST_TOO_MANY_TM (0x05)
|
||||
#define MPT_HOST_NVRAM_INVALID (0xFFFFFFFF)
|
||||
#define MPT_HOST_NO_CHAIN (0xFFFFFFFF)
|
||||
#define MPT_NVRAM_MASK_TIMEOUT (0x000000FF)
|
||||
#define MPT_NVRAM_SYNC_MASK (0x0000FF00)
|
||||
#define MPT_NVRAM_SYNC_SHIFT (8)
|
||||
#define MPT_NVRAM_DISCONNECT_ENABLE (0x00010000)
|
||||
#define MPT_NVRAM_ID_SCAN_ENABLE (0x00020000)
|
||||
#define MPT_NVRAM_LUN_SCAN_ENABLE (0x00040000)
|
||||
#define MPT_NVRAM_TAG_QUEUE_ENABLE (0x00080000)
|
||||
#define MPT_NVRAM_WIDE_DISABLE (0x00100000)
|
||||
#define MPT_NVRAM_BOOT_CHOICE (0x00200000)
|
||||
|
||||
typedef enum {
|
||||
FC,
|
||||
SPI,
|
||||
SAS
|
||||
} BUS_TYPE;
|
||||
|
||||
typedef struct _MPT_SCSI_HOST {
|
||||
struct _MPT_ADAPTER *ioc;
|
||||
ushort sel_timeout[MPT_MAX_FC_DEVICES];
|
||||
char *info_kbuf;
|
||||
long last_queue_full;
|
||||
u16 spi_pending;
|
||||
struct list_head target_reset_list;
|
||||
} MPT_SCSI_HOST;
|
||||
|
||||
typedef void (*MPT_ADD_SGE)(void *pAddr, u32 flagslength, dma_addr_t dma_addr);
|
||||
typedef void (*MPT_ADD_CHAIN)(void *pAddr, u8 next, u16 length,
|
||||
dma_addr_t dma_addr);
|
||||
typedef void (*MPT_SCHEDULE_TARGET_RESET)(void *ioc);
|
||||
typedef void (*MPT_FLUSH_RUNNING_CMDS)(MPT_SCSI_HOST *hd);
|
||||
|
||||
/*
|
||||
* Adapter Structure - pci_dev specific. Maximum: MPT_MAX_ADAPTERS
|
||||
|
|
@ -716,7 +753,10 @@ typedef struct _MPT_ADAPTER
|
|||
int taskmgmt_in_progress;
|
||||
u8 taskmgmt_quiesce_io;
|
||||
u8 ioc_reset_in_progress;
|
||||
u8 reset_status;
|
||||
u8 wait_on_reset_completion;
|
||||
MPT_SCHEDULE_TARGET_RESET schedule_target_reset;
|
||||
MPT_FLUSH_RUNNING_CMDS schedule_dead_ioc_flush_running_cmds;
|
||||
struct work_struct sas_persist_task;
|
||||
|
||||
struct work_struct fc_setup_reset_work;
|
||||
|
|
@ -830,19 +870,6 @@ typedef struct _MPT_LOCAL_REPLY {
|
|||
u32 pad;
|
||||
} MPT_LOCAL_REPLY;
|
||||
|
||||
#define MPT_HOST_BUS_UNKNOWN (0xFF)
|
||||
#define MPT_HOST_TOO_MANY_TM (0x05)
|
||||
#define MPT_HOST_NVRAM_INVALID (0xFFFFFFFF)
|
||||
#define MPT_HOST_NO_CHAIN (0xFFFFFFFF)
|
||||
#define MPT_NVRAM_MASK_TIMEOUT (0x000000FF)
|
||||
#define MPT_NVRAM_SYNC_MASK (0x0000FF00)
|
||||
#define MPT_NVRAM_SYNC_SHIFT (8)
|
||||
#define MPT_NVRAM_DISCONNECT_ENABLE (0x00010000)
|
||||
#define MPT_NVRAM_ID_SCAN_ENABLE (0x00020000)
|
||||
#define MPT_NVRAM_LUN_SCAN_ENABLE (0x00040000)
|
||||
#define MPT_NVRAM_TAG_QUEUE_ENABLE (0x00080000)
|
||||
#define MPT_NVRAM_WIDE_DISABLE (0x00100000)
|
||||
#define MPT_NVRAM_BOOT_CHOICE (0x00200000)
|
||||
|
||||
/* The TM_STATE variable is used to provide strict single threading of TM
|
||||
* requests as well as communicate TM error conditions.
|
||||
|
|
@ -851,21 +878,6 @@ typedef struct _MPT_LOCAL_REPLY {
|
|||
#define TM_STATE_IN_PROGRESS (1)
|
||||
#define TM_STATE_ERROR (2)
|
||||
|
||||
typedef enum {
|
||||
FC,
|
||||
SPI,
|
||||
SAS
|
||||
} BUS_TYPE;
|
||||
|
||||
typedef struct _MPT_SCSI_HOST {
|
||||
MPT_ADAPTER *ioc;
|
||||
ushort sel_timeout[MPT_MAX_FC_DEVICES];
|
||||
char *info_kbuf;
|
||||
long last_queue_full;
|
||||
u16 spi_pending;
|
||||
struct list_head target_reset_list;
|
||||
} MPT_SCSI_HOST;
|
||||
|
||||
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
|
||||
/*
|
||||
* More Dynamic Multi-Pathing stuff...
|
||||
|
|
|
|||
|
|
@ -92,6 +92,11 @@ static int max_lun = MPTSAS_MAX_LUN;
|
|||
module_param(max_lun, int, 0);
|
||||
MODULE_PARM_DESC(max_lun, " max lun, default=16895 ");
|
||||
|
||||
static int mpt_loadtime_max_sectors = 8192;
|
||||
module_param(mpt_loadtime_max_sectors, int, 0);
|
||||
MODULE_PARM_DESC(mpt_loadtime_max_sectors,
|
||||
" Maximum sector define for Host Bus Adaptor.Range 64 to 8192 default=8192");
|
||||
|
||||
static u8 mptsasDoneCtx = MPT_MAX_PROTOCOL_DRIVERS;
|
||||
static u8 mptsasTaskCtx = MPT_MAX_PROTOCOL_DRIVERS;
|
||||
static u8 mptsasInternalCtx = MPT_MAX_PROTOCOL_DRIVERS; /* Used only for internal commands */
|
||||
|
|
@ -285,10 +290,11 @@ mptsas_add_fw_event(MPT_ADAPTER *ioc, struct fw_event_work *fw_event,
|
|||
spin_lock_irqsave(&ioc->fw_event_lock, flags);
|
||||
list_add_tail(&fw_event->list, &ioc->fw_event_list);
|
||||
INIT_DELAYED_WORK(&fw_event->work, mptsas_firmware_event_work);
|
||||
devtprintk(ioc, printk(MYIOC_s_DEBUG_FMT "%s: add (fw_event=0x%p)\n",
|
||||
ioc->name, __func__, fw_event));
|
||||
queue_delayed_work(ioc->fw_event_q, &fw_event->work,
|
||||
delay);
|
||||
devtprintk(ioc, printk(MYIOC_s_DEBUG_FMT "%s: add (fw_event=0x%p)"
|
||||
"on cpuid %d\n", ioc->name, __func__,
|
||||
fw_event, smp_processor_id()));
|
||||
queue_delayed_work_on(smp_processor_id(), ioc->fw_event_q,
|
||||
&fw_event->work, delay);
|
||||
spin_unlock_irqrestore(&ioc->fw_event_lock, flags);
|
||||
}
|
||||
|
||||
|
|
@ -300,10 +306,11 @@ mptsas_requeue_fw_event(MPT_ADAPTER *ioc, struct fw_event_work *fw_event,
|
|||
unsigned long flags;
|
||||
spin_lock_irqsave(&ioc->fw_event_lock, flags);
|
||||
devtprintk(ioc, printk(MYIOC_s_DEBUG_FMT "%s: reschedule task "
|
||||
"(fw_event=0x%p)\n", ioc->name, __func__, fw_event));
|
||||
"(fw_event=0x%p)on cpuid %d\n", ioc->name, __func__,
|
||||
fw_event, smp_processor_id()));
|
||||
fw_event->retries++;
|
||||
queue_delayed_work(ioc->fw_event_q, &fw_event->work,
|
||||
msecs_to_jiffies(delay));
|
||||
queue_delayed_work_on(smp_processor_id(), ioc->fw_event_q,
|
||||
&fw_event->work, msecs_to_jiffies(delay));
|
||||
spin_unlock_irqrestore(&ioc->fw_event_lock, flags);
|
||||
}
|
||||
|
||||
|
|
@ -1943,6 +1950,15 @@ static enum blk_eh_timer_return mptsas_eh_timed_out(struct scsi_cmnd *sc)
|
|||
goto done;
|
||||
}
|
||||
|
||||
/* In case if IOC is in reset from internal context.
|
||||
* Do not execute EEH for the same IOC. SML should to reset timer.
|
||||
*/
|
||||
if (ioc->ioc_reset_in_progress) {
|
||||
dtmprintk(ioc, printk(MYIOC_s_WARN_FMT ": %s: ioc is in reset,"
|
||||
"SML need to reset the timer (sc=%p)\n",
|
||||
ioc->name, __func__, sc));
|
||||
rc = BLK_EH_RESET_TIMER;
|
||||
}
|
||||
vdevice = sc->device->hostdata;
|
||||
if (vdevice && vdevice->vtarget && (vdevice->vtarget->inDMD
|
||||
|| vdevice->vtarget->deleted)) {
|
||||
|
|
@ -5142,6 +5158,8 @@ mptsas_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
|||
ioc->TaskCtx = mptsasTaskCtx;
|
||||
ioc->InternalCtx = mptsasInternalCtx;
|
||||
ioc->schedule_target_reset = &mptsas_schedule_target_reset;
|
||||
ioc->schedule_dead_ioc_flush_running_cmds =
|
||||
&mptscsih_flush_running_cmds;
|
||||
/* Added sanity check on readiness of the MPT adapter.
|
||||
*/
|
||||
if (ioc->last_state != MPI_IOC_STATE_OPERATIONAL) {
|
||||
|
|
@ -5239,6 +5257,21 @@ mptsas_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
|||
sh->sg_tablesize = numSGE;
|
||||
}
|
||||
|
||||
if (mpt_loadtime_max_sectors) {
|
||||
if (mpt_loadtime_max_sectors < 64 ||
|
||||
mpt_loadtime_max_sectors > 8192) {
|
||||
printk(MYIOC_s_INFO_FMT "Invalid value passed for"
|
||||
"mpt_loadtime_max_sectors %d."
|
||||
"Range from 64 to 8192\n", ioc->name,
|
||||
mpt_loadtime_max_sectors);
|
||||
}
|
||||
mpt_loadtime_max_sectors &= 0xFFFFFFFE;
|
||||
dprintk(ioc, printk(MYIOC_s_DEBUG_FMT
|
||||
"Resetting max sector to %d from %d\n",
|
||||
ioc->name, mpt_loadtime_max_sectors, sh->max_sectors));
|
||||
sh->max_sectors = mpt_loadtime_max_sectors;
|
||||
}
|
||||
|
||||
hd = shost_priv(sh);
|
||||
hd->ioc = ioc;
|
||||
|
||||
|
|
|
|||
|
|
@ -830,7 +830,8 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
|
|||
if ((pScsiReq->CDB[0] == READ_6 && ((pScsiReq->CDB[1] & 0x02) == 0)) ||
|
||||
pScsiReq->CDB[0] == READ_10 ||
|
||||
pScsiReq->CDB[0] == READ_12 ||
|
||||
pScsiReq->CDB[0] == READ_16 ||
|
||||
(pScsiReq->CDB[0] == READ_16 &&
|
||||
((pScsiReq->CDB[1] & 0x02) == 0)) ||
|
||||
pScsiReq->CDB[0] == VERIFY ||
|
||||
pScsiReq->CDB[0] == VERIFY_16) {
|
||||
if (scsi_bufflen(sc) !=
|
||||
|
|
@ -1024,7 +1025,7 @@ out:
|
|||
*
|
||||
* Must be called while new I/Os are being queued.
|
||||
*/
|
||||
static void
|
||||
void
|
||||
mptscsih_flush_running_cmds(MPT_SCSI_HOST *hd)
|
||||
{
|
||||
MPT_ADAPTER *ioc = hd->ioc;
|
||||
|
|
@ -1055,6 +1056,7 @@ mptscsih_flush_running_cmds(MPT_SCSI_HOST *hd)
|
|||
sc->scsi_done(sc);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(mptscsih_flush_running_cmds);
|
||||
|
||||
/*
|
||||
* mptscsih_search_running_cmds - Delete any commands associated
|
||||
|
|
@ -1629,7 +1631,13 @@ mptscsih_IssueTaskMgmt(MPT_SCSI_HOST *hd, u8 type, u8 channel, u8 id, int lun,
|
|||
return 0;
|
||||
}
|
||||
|
||||
if (ioc_raw_state & MPI_DOORBELL_ACTIVE) {
|
||||
/* DOORBELL ACTIVE check is not required if
|
||||
* MPI_IOCFACTS_CAPABILITY_HIGH_PRI_Q is supported.
|
||||
*/
|
||||
|
||||
if (!((ioc->facts.IOCCapabilities & MPI_IOCFACTS_CAPABILITY_HIGH_PRI_Q)
|
||||
&& (ioc->facts.MsgVersion >= MPI_VERSION_01_05)) &&
|
||||
(ioc_raw_state & MPI_DOORBELL_ACTIVE)) {
|
||||
printk(MYIOC_s_WARN_FMT
|
||||
"TaskMgmt type=%x: ioc_state: "
|
||||
"DOORBELL_ACTIVE (0x%x)!\n",
|
||||
|
|
@ -1728,7 +1736,9 @@ mptscsih_IssueTaskMgmt(MPT_SCSI_HOST *hd, u8 type, u8 channel, u8 id, int lun,
|
|||
printk(MYIOC_s_WARN_FMT
|
||||
"Issuing Reset from %s!! doorbell=0x%08x\n",
|
||||
ioc->name, __func__, mpt_GetIocState(ioc, 0));
|
||||
retval = mpt_Soft_Hard_ResetHandler(ioc, CAN_SLEEP);
|
||||
retval = (ioc->bus_type == SAS) ?
|
||||
mpt_HardResetHandler(ioc, CAN_SLEEP) :
|
||||
mpt_Soft_Hard_ResetHandler(ioc, CAN_SLEEP);
|
||||
mpt_free_msg_frame(ioc, mf);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -135,3 +135,4 @@ extern int mptscsih_is_phys_disk(MPT_ADAPTER *ioc, u8 channel, u8 id);
|
|||
extern struct device_attribute *mptscsih_host_attrs[];
|
||||
extern struct scsi_cmnd *mptscsih_get_scsi_lookup(MPT_ADAPTER *ioc, int i);
|
||||
extern void mptscsih_taskmgmt_response_code(MPT_ADAPTER *ioc, u8 response_code);
|
||||
extern void mptscsih_flush_running_cmds(MPT_SCSI_HOST *hd);
|
||||
|
|
|
|||
|
|
@ -160,7 +160,8 @@ again:
|
|||
DBF_ERROR("%3d%3d%2d", count, tmp_count, nr);
|
||||
q->handler(q->irq_ptr->cdev,
|
||||
QDIO_ERROR_ACTIVATE_CHECK_CONDITION,
|
||||
0, -1, -1, q->irq_ptr->int_parm);
|
||||
q->nr, q->first_to_kick, count,
|
||||
q->irq_ptr->int_parm);
|
||||
return 0;
|
||||
}
|
||||
return count - tmp_count;
|
||||
|
|
@ -206,7 +207,8 @@ again:
|
|||
DBF_ERROR("%3d%3d%2d", count, tmp_count, nr);
|
||||
q->handler(q->irq_ptr->cdev,
|
||||
QDIO_ERROR_ACTIVATE_CHECK_CONDITION,
|
||||
0, -1, -1, q->irq_ptr->int_parm);
|
||||
q->nr, q->first_to_kick, count,
|
||||
q->irq_ptr->int_parm);
|
||||
return 0;
|
||||
}
|
||||
WARN_ON(tmp_count);
|
||||
|
|
@ -1070,6 +1072,7 @@ static void qdio_handle_activate_check(struct ccw_device *cdev,
|
|||
{
|
||||
struct qdio_irq *irq_ptr = cdev->private->qdio_data;
|
||||
struct qdio_q *q;
|
||||
int count;
|
||||
|
||||
DBF_ERROR("%4x ACT CHECK", irq_ptr->schid.sch_no);
|
||||
DBF_ERROR("intp :%lx", intparm);
|
||||
|
|
@ -1083,8 +1086,10 @@ static void qdio_handle_activate_check(struct ccw_device *cdev,
|
|||
dump_stack();
|
||||
goto no_handler;
|
||||
}
|
||||
|
||||
count = sub_buf(q->first_to_check, q->first_to_kick);
|
||||
q->handler(q->irq_ptr->cdev, QDIO_ERROR_ACTIVATE_CHECK_CONDITION,
|
||||
0, -1, -1, irq_ptr->int_parm);
|
||||
q->nr, q->first_to_kick, count, irq_ptr->int_parm);
|
||||
no_handler:
|
||||
qdio_set_state(irq_ptr, QDIO_IRQ_STATE_STOPPED);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -381,6 +381,7 @@ static void setup_qdr(struct qdio_irq *irq_ptr,
|
|||
int i;
|
||||
|
||||
irq_ptr->qdr->qfmt = qdio_init->q_format;
|
||||
irq_ptr->qdr->ac = qdio_init->qdr_ac;
|
||||
irq_ptr->qdr->iqdcnt = qdio_init->no_input_qs;
|
||||
irq_ptr->qdr->oqdcnt = qdio_init->no_output_qs;
|
||||
irq_ptr->qdr->iqdsz = sizeof(struct qdesfmt0) / 4; /* size in words */
|
||||
|
|
|
|||
|
|
@ -163,6 +163,42 @@ void zfcp_dbf_hba_bit_err(char *tag, struct zfcp_fsf_req *req)
|
|||
spin_unlock_irqrestore(&dbf->hba_lock, flags);
|
||||
}
|
||||
|
||||
/**
|
||||
* zfcp_dbf_hba_def_err - trace event for deferred error messages
|
||||
* @adapter: pointer to struct zfcp_adapter
|
||||
* @req_id: request id which caused the deferred error message
|
||||
* @scount: number of sbals incl. the signaling sbal
|
||||
* @pl: array of all involved sbals
|
||||
*/
|
||||
void zfcp_dbf_hba_def_err(struct zfcp_adapter *adapter, u64 req_id, u16 scount,
|
||||
void **pl)
|
||||
{
|
||||
struct zfcp_dbf *dbf = adapter->dbf;
|
||||
struct zfcp_dbf_pay *payload = &dbf->pay_buf;
|
||||
unsigned long flags;
|
||||
u16 length;
|
||||
|
||||
if (!pl)
|
||||
return;
|
||||
|
||||
spin_lock_irqsave(&dbf->pay_lock, flags);
|
||||
memset(payload, 0, sizeof(*payload));
|
||||
|
||||
memcpy(payload->area, "def_err", 7);
|
||||
payload->fsf_req_id = req_id;
|
||||
payload->counter = 0;
|
||||
length = min((u16)sizeof(struct qdio_buffer),
|
||||
(u16)ZFCP_DBF_PAY_MAX_REC);
|
||||
|
||||
while ((char *)pl[payload->counter] && payload->counter < scount) {
|
||||
memcpy(payload->data, (char *)pl[payload->counter], length);
|
||||
debug_event(dbf->pay, 1, payload, zfcp_dbf_plen(length));
|
||||
payload->counter++;
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&dbf->pay_lock, flags);
|
||||
}
|
||||
|
||||
static void zfcp_dbf_set_common(struct zfcp_dbf_rec *rec,
|
||||
struct zfcp_adapter *adapter,
|
||||
struct zfcp_port *port,
|
||||
|
|
|
|||
|
|
@ -72,6 +72,7 @@ struct zfcp_reqlist;
|
|||
#define ZFCP_STATUS_COMMON_NOESC 0x00200000
|
||||
|
||||
/* adapter status */
|
||||
#define ZFCP_STATUS_ADAPTER_MB_ACT 0x00000001
|
||||
#define ZFCP_STATUS_ADAPTER_QDIOUP 0x00000002
|
||||
#define ZFCP_STATUS_ADAPTER_SIOSL_ISSUED 0x00000004
|
||||
#define ZFCP_STATUS_ADAPTER_XCONFIG_OK 0x00000008
|
||||
|
|
@ -314,4 +315,10 @@ struct zfcp_fsf_req {
|
|||
void (*handler)(struct zfcp_fsf_req *);
|
||||
};
|
||||
|
||||
static inline
|
||||
int zfcp_adapter_multi_buffer_active(struct zfcp_adapter *adapter)
|
||||
{
|
||||
return atomic_read(&adapter->status) & ZFCP_STATUS_ADAPTER_MB_ACT;
|
||||
}
|
||||
|
||||
#endif /* ZFCP_DEF_H */
|
||||
|
|
|
|||
|
|
@ -53,6 +53,7 @@ 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_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 **);
|
||||
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 *);
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue