SCSI misc on 20250126
Updates to the usual drivers (ufs, lpfc, fnic, qla2xx, mpi3mr) The major core change is the renaming of the slave_ methods plus a bit of constification. The rest are minor updates and fixes. Signed-off-by: James E.J. Bottomley <James.Bottomley@HansenPartnership.com> -----BEGIN PGP SIGNATURE----- iJwEABMIAEQWIQTnYEDbdso9F2cI+arnQslM7pishQUCZ5ZQKSYcamFtZXMuYm90 dG9tbGV5QGhhbnNlbnBhcnRuZXJzaGlwLmNvbQAKCRDnQslM7pishQMdAQCyVlDZ v/3EFCuC4U1l70mMu8t+F4RPvqYxM3QPCi5dDQEA751YN/kaqxeXZDqGUKCAOE3K Nl4XFTfLEkDVrQFFqPc= =9sV8 -----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: "Updates to the usual drivers (ufs, lpfc, fnic, qla2xx, mpi3mr). The major core change is the renaming of the slave_ methods plus a bit of constification. The rest are minor updates and fixes" * tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi: (103 commits) scsi: fnic: Propagate SCSI error code from fnic_scsi_drv_init() scsi: fnic: Test for memory allocation failure and return error code scsi: fnic: Return appropriate error code from failure of scsi drv init scsi: fnic: Return appropriate error code for mem alloc failure scsi: fnic: Remove always-true IS_FNIC_FCP_INITIATOR macro scsi: fnic: Fix use of uninitialized value in debug message scsi: fnic: Delete incorrect debugfs error handling scsi: fnic: Remove unnecessary else to fix warning in FDLS FIP scsi: fnic: Remove extern definition from .c files scsi: fnic: Remove unnecessary else and unnecessary break in FDLS scsi: mpi3mr: Fix possible crash when setting up bsg fails scsi: ufs: bsg: Set bsg_queue to NULL after removal scsi: ufs: bsg: Delete bsg_dev when setting up bsg fails scsi: st: Don't set pos_unknown just after device recognition scsi: aic7xxx: Fix build 'aicasm' warning scsi: Revert "scsi: ufs: core: Probe for EXT_IID support" scsi: storvsc: Ratelimit warning logs to prevent VM denial of service scsi: scsi_debug: Constify sdebug_driver_template scsi: documentation: Corrections for struct updates scsi: driver-api: documentation: Change what is added to docbook ...
This commit is contained in:
commit
88e45067a3
189 changed files with 11000 additions and 3553 deletions
|
@ -126,7 +126,7 @@ Manage scsi_dev_info_list, which tracks blacklisted and whitelisted
|
|||
devices.
|
||||
|
||||
.. kernel-doc:: drivers/scsi/scsi_devinfo.c
|
||||
:internal:
|
||||
:export:
|
||||
|
||||
drivers/scsi/scsi_ioctl.c
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
@ -162,7 +162,6 @@ statistics and to pass information directly to the lowlevel driver. I.E.
|
|||
plumbing to manage /proc/scsi/\*
|
||||
|
||||
.. kernel-doc:: drivers/scsi/scsi_proc.c
|
||||
:internal:
|
||||
|
||||
drivers/scsi/scsi_netlink.c
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
@ -193,7 +192,7 @@ else, sequentially scan LUNs up until some maximum is reached, or a LUN
|
|||
is seen that cannot have a device attached to it.
|
||||
|
||||
.. kernel-doc:: drivers/scsi/scsi_scan.c
|
||||
:internal:
|
||||
:export:
|
||||
|
||||
drivers/scsi/scsi_sysctl.c
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
|
|
@ -54,13 +54,13 @@ invoking hostt->queuecommand() or the block layer will time it out.
|
|||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
For all non-EH commands, scsi_done() is the completion callback. It
|
||||
just calls blk_complete_request() to delete the block layer timer and
|
||||
raise SCSI_SOFTIRQ
|
||||
just calls blk_mq_complete_request() to delete the block layer timer and
|
||||
raise BLOCK_SOFTIRQ.
|
||||
|
||||
SCSI_SOFTIRQ handler scsi_softirq calls scsi_decide_disposition() to
|
||||
determine what to do with the command. scsi_decide_disposition()
|
||||
looks at the scmd->result value and sense data to determine what to do
|
||||
with the command.
|
||||
The BLOCK_SOFTIRQ indirectly calls scsi_complete(), which calls
|
||||
scsi_decide_disposition() to determine what to do with the command.
|
||||
scsi_decide_disposition() looks at the scmd->result value and sense
|
||||
data to determine what to do with the command.
|
||||
|
||||
- SUCCESS
|
||||
|
||||
|
@ -110,7 +110,7 @@ The timeout handler is scsi_timeout(). When a timeout occurs, this function
|
|||
retry which failed), when retries are exceeded, or when the EH deadline is
|
||||
expired. In these cases Step #3 is taken.
|
||||
|
||||
3. scsi_eh_scmd_add(scmd, SCSI_EH_CANCEL_CMD) is invoked for the
|
||||
3. scsi_eh_scmd_add(scmd) is invoked for the
|
||||
command. See [1-4] for more information.
|
||||
|
||||
1.3 Asynchronous command aborts
|
||||
|
@ -277,7 +277,6 @@ scmd->allowed.
|
|||
|
||||
:ACTION: scsi_eh_finish_cmd() is invoked to EH-finish scmd
|
||||
|
||||
- scsi_setup_cmd_retry()
|
||||
- move from local eh_work_q to local eh_done_q
|
||||
|
||||
:LOCKING: none
|
||||
|
@ -317,7 +316,7 @@ scmd->allowed.
|
|||
``scsi_eh_get_sense``
|
||||
|
||||
This action is taken for each error-completed
|
||||
(!SCSI_EH_CANCEL_CMD) commands without valid sense data. Most
|
||||
command without valid sense data. Most
|
||||
SCSI transports/LLDDs automatically acquire sense data on
|
||||
command failures (autosense). Autosense is recommended for
|
||||
performance reasons and as sense information could get out of
|
||||
|
@ -347,30 +346,6 @@ scmd->allowed.
|
|||
- otherwise
|
||||
No action.
|
||||
|
||||
3. If !list_empty(&eh_work_q), invoke scsi_eh_abort_cmds().
|
||||
|
||||
``scsi_eh_abort_cmds``
|
||||
|
||||
This action is taken for each timed out command when
|
||||
no_async_abort is enabled in the host template.
|
||||
hostt->eh_abort_handler() is invoked for each scmd. The
|
||||
handler returns SUCCESS if it has succeeded to make LLDD and
|
||||
all related hardware forget about the scmd.
|
||||
|
||||
If a timedout scmd is successfully aborted and the sdev is
|
||||
either offline or ready, scsi_eh_finish_cmd() is invoked for
|
||||
the scmd. Otherwise, the scmd is left in eh_work_q for
|
||||
higher-severity actions.
|
||||
|
||||
Note that both offline and ready status mean that the sdev is
|
||||
ready to process new scmds, where processing also implies
|
||||
immediate failing; thus, if a sdev is in one of the two
|
||||
states, no further recovery action is needed.
|
||||
|
||||
Device readiness is tested using scsi_eh_tur() which issues
|
||||
TEST_UNIT_READY command. Note that the scmd must have been
|
||||
aborted successfully before reusing it for TEST_UNIT_READY.
|
||||
|
||||
4. If !list_empty(&eh_work_q), invoke scsi_eh_ready_devs()
|
||||
|
||||
``scsi_eh_ready_devs``
|
||||
|
@ -384,7 +359,7 @@ scmd->allowed.
|
|||
|
||||
For each sdev which has failed scmds with valid sense data
|
||||
of which scsi_check_sense()'s verdict is FAILED,
|
||||
START_STOP_UNIT command is issued w/ start=1. Note that
|
||||
START STOP UNIT command is issued w/ start=1. Note that
|
||||
as we explicitly choose error-completed scmds, it is known
|
||||
that lower layers have forgotten about the scmd and we can
|
||||
reuse it for STU.
|
||||
|
@ -478,9 +453,6 @@ except for #1 must be implemented by eh_strategy_handler().
|
|||
|
||||
- shost->host_failed is zero.
|
||||
|
||||
- Each scmd is in such a state that scsi_setup_cmd_retry() on the
|
||||
scmd doesn't make any difference.
|
||||
|
||||
- shost->eh_cmd_q is cleared.
|
||||
|
||||
- Each scmd->eh_entry is cleared.
|
||||
|
|
|
@ -101,7 +101,7 @@ supplied functions" below.
|
|||
Those functions in group b) are listed in a section entitled "Interface
|
||||
functions" below. Their function pointers are placed in the members of
|
||||
"struct scsi_host_template", an instance of which is passed to
|
||||
scsi_host_alloc() [#]_. Those interface functions that the LLD does not
|
||||
scsi_host_alloc(). Those interface functions that the LLD does not
|
||||
wish to supply should have NULL placed in the corresponding member of
|
||||
struct scsi_host_template. Defining an instance of struct
|
||||
scsi_host_template at file scope will cause NULL to be placed in function
|
||||
|
@ -112,12 +112,9 @@ Those usages in group c) should be handled with care, especially in a
|
|||
that are shared with the mid level and other layers.
|
||||
|
||||
All functions defined within an LLD and all data defined at file scope
|
||||
should be static. For example the slave_alloc() function in an LLD
|
||||
should be static. For example the sdev_init() function in an LLD
|
||||
called "xxx" could be defined as
|
||||
``static int xxx_slave_alloc(struct scsi_device * sdev) { /* code */ }``
|
||||
|
||||
.. [#] the scsi_host_alloc() function is a replacement for the rather vaguely
|
||||
named scsi_register() function in most situations.
|
||||
``static int xxx_sdev_init(struct scsi_device * sdev) { /* code */ }``
|
||||
|
||||
|
||||
Hotplug initialization model
|
||||
|
@ -149,21 +146,21 @@ scsi devices of which only the first 2 respond::
|
|||
scsi_add_host() ---->
|
||||
scsi_scan_host() -------+
|
||||
|
|
||||
slave_alloc()
|
||||
slave_configure() --> scsi_change_queue_depth()
|
||||
sdev_init()
|
||||
sdev_configure() --> scsi_change_queue_depth()
|
||||
|
|
||||
slave_alloc()
|
||||
slave_configure()
|
||||
sdev_init()
|
||||
sdev_configure()
|
||||
|
|
||||
slave_alloc() ***
|
||||
slave_destroy() ***
|
||||
sdev_init() ***
|
||||
sdev_destroy() ***
|
||||
|
||||
|
||||
*** For scsi devices that the mid level tries to scan but do not
|
||||
respond, a slave_alloc(), slave_destroy() pair is called.
|
||||
respond, a sdev_init(), sdev_destroy() pair is called.
|
||||
|
||||
If the LLD wants to adjust the default queue settings, it can invoke
|
||||
scsi_change_queue_depth() in its slave_configure() routine.
|
||||
scsi_change_queue_depth() in its sdev_configure() routine.
|
||||
|
||||
When an HBA is being removed it could be as part of an orderly shutdown
|
||||
associated with the LLD module being unloaded (e.g. with the "rmmod"
|
||||
|
@ -176,8 +173,8 @@ same::
|
|||
===----------------------=========-----------------===------
|
||||
scsi_remove_host() ---------+
|
||||
|
|
||||
slave_destroy()
|
||||
slave_destroy()
|
||||
sdev_destroy()
|
||||
sdev_destroy()
|
||||
scsi_host_put()
|
||||
|
||||
It may be useful for a LLD to keep track of struct Scsi_Host instances
|
||||
|
@ -202,8 +199,8 @@ An LLD can use this sequence to make the mid level aware of a SCSI device::
|
|||
===-------------------=========--------------------===------
|
||||
scsi_add_device() ------+
|
||||
|
|
||||
slave_alloc()
|
||||
slave_configure() [--> scsi_change_queue_depth()]
|
||||
sdev_init()
|
||||
sdev_configure() [--> scsi_change_queue_depth()]
|
||||
|
||||
In a similar fashion, an LLD may become aware that a SCSI device has been
|
||||
removed (unplugged) or the connection to it has been interrupted. Some
|
||||
|
@ -218,12 +215,12 @@ upper layers with this sequence::
|
|||
===----------------------=========-----------------===------
|
||||
scsi_remove_device() -------+
|
||||
|
|
||||
slave_destroy()
|
||||
sdev_destroy()
|
||||
|
||||
It may be useful for an LLD to keep track of struct scsi_device instances
|
||||
(a pointer is passed as the parameter to slave_alloc() and
|
||||
slave_configure() callbacks). Such instances are "owned" by the mid-level.
|
||||
struct scsi_device instances are freed after slave_destroy().
|
||||
(a pointer is passed as the parameter to sdev_init() and
|
||||
sdev_configure() callbacks). Such instances are "owned" by the mid-level.
|
||||
struct scsi_device instances are freed after sdev_destroy().
|
||||
|
||||
|
||||
Reference Counting
|
||||
|
@ -302,14 +299,12 @@ Summary:
|
|||
- scsi_host_alloc - return a new scsi_host instance whose refcount==1
|
||||
- scsi_host_get - increments Scsi_Host instance's refcount
|
||||
- scsi_host_put - decrements Scsi_Host instance's refcount (free if 0)
|
||||
- scsi_register - create and register a scsi host adapter instance.
|
||||
- scsi_remove_device - detach and remove a SCSI device
|
||||
- scsi_remove_host - detach and remove all SCSI devices owned by host
|
||||
- scsi_report_bus_reset - report scsi _bus_ reset observed
|
||||
- scsi_scan_host - scan SCSI bus
|
||||
- scsi_track_queue_full - track successive QUEUE_FULL events
|
||||
- scsi_unblock_requests - allow further commands to be queued to given host
|
||||
- scsi_unregister - [calls scsi_host_put()]
|
||||
|
||||
|
||||
Details::
|
||||
|
@ -331,7 +326,7 @@ Details::
|
|||
* bus scan when an HBA is added (i.e. scsi_scan_host()). So it
|
||||
* should only be called if the HBA becomes aware of a new scsi
|
||||
* device (lu) after scsi_scan_host() has completed. If successful
|
||||
* this call can lead to slave_alloc() and slave_configure() callbacks
|
||||
* this call can lead to sdev_init() and sdev_configure() callbacks
|
||||
* into the LLD.
|
||||
*
|
||||
* Defined in: drivers/scsi/scsi_scan.c
|
||||
|
@ -374,8 +369,8 @@ Details::
|
|||
* Might block: no
|
||||
*
|
||||
* Notes: Can be invoked any time on a SCSI device controlled by this
|
||||
* LLD. [Specifically during and after slave_configure() and prior to
|
||||
* slave_destroy().] Can safely be invoked from interrupt code.
|
||||
* LLD. [Specifically during and after sdev_configure() and prior to
|
||||
* sdev_destroy().] Can safely be invoked from interrupt code.
|
||||
*
|
||||
* Defined in: drivers/scsi/scsi.c [see source code for more notes]
|
||||
*
|
||||
|
@ -474,27 +469,6 @@ Details::
|
|||
void scsi_host_put(struct Scsi_Host *shost)
|
||||
|
||||
|
||||
/**
|
||||
* scsi_register - create and register a scsi host adapter instance.
|
||||
* @sht: pointer to scsi host template
|
||||
* @privsize: extra bytes to allocate in hostdata array (which is the
|
||||
* last member of the returned Scsi_Host instance)
|
||||
*
|
||||
* Returns pointer to new Scsi_Host instance or NULL on failure
|
||||
*
|
||||
* Might block: yes
|
||||
*
|
||||
* Notes: When this call returns to the LLD, the SCSI bus scan on
|
||||
* this host has _not_ yet been done.
|
||||
* The hostdata array (by default zero length) is a per host scratch
|
||||
* area for the LLD.
|
||||
*
|
||||
* Defined in: drivers/scsi/hosts.c .
|
||||
**/
|
||||
struct Scsi_Host * scsi_register(struct scsi_host_template * sht,
|
||||
int privsize)
|
||||
|
||||
|
||||
/**
|
||||
* scsi_remove_device - detach and remove a SCSI device
|
||||
* @sdev: a pointer to a scsi device instance
|
||||
|
@ -506,7 +480,7 @@ Details::
|
|||
* Notes: If an LLD becomes aware that a scsi device (lu) has
|
||||
* been removed but its host is still present then it can request
|
||||
* the removal of that scsi device. If successful this call will
|
||||
* lead to the slave_destroy() callback being invoked. sdev is an
|
||||
* lead to the sdev_destroy() callback being invoked. sdev is an
|
||||
* invalid pointer after this call.
|
||||
*
|
||||
* Defined in: drivers/scsi/scsi_sysfs.c .
|
||||
|
@ -524,7 +498,7 @@ Details::
|
|||
*
|
||||
* Notes: Should only be invoked if the "hotplug initialization
|
||||
* model" is being used. It should be called _prior_ to
|
||||
* scsi_unregister().
|
||||
* calling scsi_host_put().
|
||||
*
|
||||
* Defined in: drivers/scsi/hosts.c .
|
||||
**/
|
||||
|
@ -601,43 +575,24 @@ Details::
|
|||
void scsi_unblock_requests(struct Scsi_Host * shost)
|
||||
|
||||
|
||||
/**
|
||||
* scsi_unregister - unregister and free memory used by host instance
|
||||
* @shp: pointer to scsi host instance to unregister.
|
||||
*
|
||||
* Returns nothing
|
||||
*
|
||||
* Might block: no
|
||||
*
|
||||
* Notes: Should not be invoked if the "hotplug initialization
|
||||
* model" is being used. Called internally by exit_this_scsi_driver()
|
||||
* in the "passive initialization model". Hence a LLD has no need to
|
||||
* call this function directly.
|
||||
*
|
||||
* Defined in: drivers/scsi/hosts.c .
|
||||
**/
|
||||
void scsi_unregister(struct Scsi_Host * shp)
|
||||
|
||||
|
||||
|
||||
|
||||
Interface Functions
|
||||
===================
|
||||
Interface functions are supplied (defined) by LLDs and their function
|
||||
pointers are placed in an instance of struct scsi_host_template which
|
||||
is passed to scsi_host_alloc() [or scsi_register() / init_this_scsi_driver()].
|
||||
is passed to scsi_host_alloc().
|
||||
Some are mandatory. Interface functions should be declared static. The
|
||||
accepted convention is that driver "xyz" will declare its slave_configure()
|
||||
accepted convention is that driver "xyz" will declare its sdev_configure()
|
||||
function as::
|
||||
|
||||
static int xyz_slave_configure(struct scsi_device * sdev);
|
||||
static int xyz_sdev_configure(struct scsi_device * sdev);
|
||||
|
||||
and so forth for all interface functions listed below.
|
||||
|
||||
A pointer to this function should be placed in the 'slave_configure' member
|
||||
A pointer to this function should be placed in the 'sdev_configure' member
|
||||
of a "struct scsi_host_template" instance. A pointer to such an instance
|
||||
should be passed to the mid level's scsi_host_alloc() [or scsi_register() /
|
||||
init_this_scsi_driver()].
|
||||
should be passed to the mid level's scsi_host_alloc().
|
||||
.
|
||||
|
||||
The interface functions are also described in the include/scsi/scsi_host.h
|
||||
file immediately above their definition point in "struct scsi_host_template".
|
||||
|
@ -657,9 +612,9 @@ Summary:
|
|||
- ioctl - driver can respond to ioctls
|
||||
- proc_info - supports /proc/scsi/{driver_name}/{host_no}
|
||||
- queuecommand - queue scsi command, invoke 'done' on completion
|
||||
- slave_alloc - prior to any commands being sent to a new device
|
||||
- slave_configure - driver fine tuning for given device after attach
|
||||
- slave_destroy - given device is about to be shut down
|
||||
- sdev_init - prior to any commands being sent to a new device
|
||||
- sdev_configure - driver fine tuning for given device after attach
|
||||
- sdev_destroy - given device is about to be shut down
|
||||
|
||||
|
||||
Details::
|
||||
|
@ -728,11 +683,7 @@ Details::
|
|||
*
|
||||
* Calling context: kernel thread
|
||||
*
|
||||
* Notes: If 'no_async_abort' is defined this callback
|
||||
* will be invoked from scsi_eh thread. No other commands
|
||||
* will then be queued on current host during eh.
|
||||
* Otherwise it will be called whenever scsi_timeout()
|
||||
* is called due to a command timeout.
|
||||
* Notes: This is called only for a command that has timed out.
|
||||
*
|
||||
* Optionally defined in: LLD
|
||||
**/
|
||||
|
@ -817,10 +768,6 @@ Details::
|
|||
* The SCSI_IOCTL_PROBE_HOST ioctl yields the string returned by this
|
||||
* function (or struct Scsi_Host::name if this function is not
|
||||
* available).
|
||||
* In a similar manner, init_this_scsi_driver() outputs to the console
|
||||
* each host's "info" (or name) for the driver it is registering.
|
||||
* Also if proc_info() is not supplied, the output of this function
|
||||
* is used instead.
|
||||
*
|
||||
* Optionally defined in: LLD
|
||||
**/
|
||||
|
@ -960,7 +907,7 @@ Details::
|
|||
|
||||
|
||||
/**
|
||||
* slave_alloc - prior to any commands being sent to a new device
|
||||
* sdev_init - prior to any commands being sent to a new device
|
||||
* (i.e. just prior to scan) this call is made
|
||||
* @sdp: pointer to new device (about to be scanned)
|
||||
*
|
||||
|
@ -975,24 +922,24 @@ Details::
|
|||
* prior to its initial scan. The corresponding scsi device may not
|
||||
* exist but the mid level is just about to scan for it (i.e. send
|
||||
* and INQUIRY command plus ...). If a device is found then
|
||||
* slave_configure() will be called while if a device is not found
|
||||
* slave_destroy() is called.
|
||||
* sdev_configure() will be called while if a device is not found
|
||||
* sdev_destroy() is called.
|
||||
* For more details see the include/scsi/scsi_host.h file.
|
||||
*
|
||||
* Optionally defined in: LLD
|
||||
**/
|
||||
int slave_alloc(struct scsi_device *sdp)
|
||||
int sdev_init(struct scsi_device *sdp)
|
||||
|
||||
|
||||
/**
|
||||
* slave_configure - driver fine tuning for given device just after it
|
||||
* sdev_configure - driver fine tuning for given device just after it
|
||||
* has been first scanned (i.e. it responded to an
|
||||
* INQUIRY)
|
||||
* @sdp: device that has just been attached
|
||||
*
|
||||
* Returns 0 if ok. Any other return is assumed to be an error and
|
||||
* the device is taken offline. [offline devices will _not_ have
|
||||
* slave_destroy() called on them so clean up resources.]
|
||||
* sdev_destroy() called on them so clean up resources.]
|
||||
*
|
||||
* Locks: none
|
||||
*
|
||||
|
@ -1004,11 +951,11 @@ Details::
|
|||
*
|
||||
* Optionally defined in: LLD
|
||||
**/
|
||||
int slave_configure(struct scsi_device *sdp)
|
||||
int sdev_configure(struct scsi_device *sdp)
|
||||
|
||||
|
||||
/**
|
||||
* slave_destroy - given device is about to be shut down. All
|
||||
* sdev_destroy - given device is about to be shut down. All
|
||||
* activity has ceased on this device.
|
||||
* @sdp: device that is about to be shut down
|
||||
*
|
||||
|
@ -1023,12 +970,12 @@ Details::
|
|||
* by this driver for given device should be freed now. No further
|
||||
* commands will be sent for this sdp instance. [However the device
|
||||
* could be re-attached in the future in which case a new instance
|
||||
* of struct scsi_device would be supplied by future slave_alloc()
|
||||
* and slave_configure() calls.]
|
||||
* of struct scsi_device would be supplied by future sdev_init()
|
||||
* and sdev_configure() calls.]
|
||||
*
|
||||
* Optionally defined in: LLD
|
||||
**/
|
||||
void slave_destroy(struct scsi_device *sdp)
|
||||
void sdev_destroy(struct scsi_device *sdp)
|
||||
|
||||
|
||||
|
||||
|
@ -1039,7 +986,7 @@ struct scsi_host_template
|
|||
There is one "struct scsi_host_template" instance per LLD [#]_. It is
|
||||
typically initialized as a file scope static in a driver's header file. That
|
||||
way members that are not explicitly initialized will be set to 0 or NULL.
|
||||
Member of interest:
|
||||
Members of interest:
|
||||
|
||||
name
|
||||
- name of driver (may contain spaces, please limit to
|
||||
|
@ -1055,6 +1002,13 @@ Member of interest:
|
|||
- primary callback that the mid level uses to inject
|
||||
SCSI commands into an LLD.
|
||||
|
||||
vendor_id
|
||||
- a unique value that identifies the vendor supplying
|
||||
the LLD for the Scsi_Host. Used most often in validating
|
||||
vendor-specific message requests. Value consists of an
|
||||
identifier type and a vendor-specific value.
|
||||
See scsi_netlink.h for a description of valid formats.
|
||||
|
||||
The structure is defined and commented in include/scsi/scsi_host.h
|
||||
|
||||
.. [#] In extreme situations a single driver may have several instances
|
||||
|
@ -1095,9 +1049,6 @@ of interest:
|
|||
- maximum number of commands that can be queued on devices
|
||||
controlled by the host. Overridden by LLD calls to
|
||||
scsi_change_queue_depth().
|
||||
no_async_abort
|
||||
- 1=>Asynchronous aborts are not supported
|
||||
- 0=>Timed-out commands will be aborted asynchronously
|
||||
hostt
|
||||
- pointer to driver's struct scsi_host_template from which
|
||||
this struct Scsi_Host instance was spawned
|
||||
|
@ -1106,22 +1057,10 @@ of interest:
|
|||
transportt
|
||||
- pointer to driver's struct scsi_transport_template instance
|
||||
(if any). FC and SPI transports currently supported.
|
||||
sh_list
|
||||
- a double linked list of pointers to all struct Scsi_Host
|
||||
instances (currently ordered by ascending host_no)
|
||||
my_devices
|
||||
- a double linked list of pointers to struct scsi_device
|
||||
instances that belong to this host.
|
||||
hostdata[0]
|
||||
- area reserved for LLD at end of struct Scsi_Host. Size
|
||||
is set by the second argument (named 'xtr_bytes') to
|
||||
scsi_host_alloc() or scsi_register().
|
||||
vendor_id
|
||||
- a unique value that identifies the vendor supplying
|
||||
the LLD for the Scsi_Host. Used most often in validating
|
||||
vendor-specific message requests. Value consists of an
|
||||
identifier type and a vendor-specific value.
|
||||
See scsi_netlink.h for a description of valid formats.
|
||||
is set by the second argument (named 'privsize') to
|
||||
scsi_host_alloc().
|
||||
|
||||
The scsi_host structure is defined in include/scsi/scsi_host.h
|
||||
|
||||
|
@ -1143,30 +1082,11 @@ Members of interest:
|
|||
|
||||
cmnd
|
||||
- array containing SCSI command
|
||||
cmnd_len
|
||||
cmd_len
|
||||
- length (in bytes) of SCSI command
|
||||
sc_data_direction
|
||||
- direction of data transfer in data phase. See
|
||||
"enum dma_data_direction" in include/linux/dma-mapping.h
|
||||
request_bufflen
|
||||
- number of data bytes to transfer (0 if no data phase)
|
||||
use_sg
|
||||
- ==0 -> no scatter gather list, hence transfer data
|
||||
to/from request_buffer
|
||||
- >0 -> scatter gather list (actually an array) in
|
||||
request_buffer with use_sg elements
|
||||
request_buffer
|
||||
- either contains data buffer or scatter gather list
|
||||
depending on the setting of use_sg. Scatter gather
|
||||
elements are defined by 'struct scatterlist' found
|
||||
in include/linux/scatterlist.h .
|
||||
done
|
||||
- function pointer that should be invoked by LLD when the
|
||||
SCSI command is completed (successfully or otherwise).
|
||||
Should only be called by an LLD if the LLD has accepted
|
||||
the command (i.e. queuecommand() returned or will return
|
||||
0). The LLD may invoke 'done' prior to queuecommand()
|
||||
finishing.
|
||||
result
|
||||
- should be set by LLD prior to calling 'done'. A value
|
||||
of 0 implies a successfully completed command (and all
|
||||
|
@ -1189,13 +1109,13 @@ Members of interest:
|
|||
device
|
||||
- pointer to scsi_device object that this command is
|
||||
associated with.
|
||||
resid
|
||||
resid_len (access by calling scsi_set_resid() / scsi_get_resid())
|
||||
- an LLD should set this unsigned integer to the requested
|
||||
transfer length (i.e. 'request_bufflen') less the number
|
||||
of bytes that are actually transferred. 'resid' is
|
||||
of bytes that are actually transferred. 'resid_len' is
|
||||
preset to 0 so an LLD can ignore it if it cannot detect
|
||||
underruns (overruns should not be reported). An LLD
|
||||
should set 'resid' prior to invoking 'done'. The most
|
||||
should set 'resid_len' prior to invoking 'done'. The most
|
||||
interesting case is data transfers from a SCSI target
|
||||
device (e.g. READs) that underrun.
|
||||
underflow
|
||||
|
@ -1204,10 +1124,10 @@ Members of interest:
|
|||
figure. Not many LLDs implement this check and some that
|
||||
do just output an error message to the log rather than
|
||||
report a DID_ERROR. Better for an LLD to implement
|
||||
'resid'.
|
||||
'resid_len'.
|
||||
|
||||
It is recommended that a LLD set 'resid' on data transfers from a SCSI
|
||||
target device (e.g. READs). It is especially important that 'resid' is set
|
||||
It is recommended that a LLD set 'resid_len' on data transfers from a SCSI
|
||||
target device (e.g. READs). It is especially important that 'resid_len' is set
|
||||
when such data transfers have sense keys of MEDIUM ERROR and HARDWARE ERROR
|
||||
(and possibly RECOVERED ERROR). In these cases if a LLD is in doubt how much
|
||||
data has been received then the safest approach is to indicate no bytes have
|
||||
|
@ -1217,7 +1137,7 @@ a LLD might use these helpers::
|
|||
scsi_set_resid(SCpnt, scsi_bufflen(SCpnt));
|
||||
|
||||
where 'SCpnt' is a pointer to a scsi_cmnd object. To indicate only three 512
|
||||
bytes blocks has been received 'resid' could be set like this::
|
||||
bytes blocks have been received 'resid_len' could be set like this::
|
||||
|
||||
scsi_set_resid(SCpnt, scsi_bufflen(SCpnt) - (3 * 512));
|
||||
|
||||
|
|
|
@ -11511,9 +11511,8 @@ F: drivers/mfd/intel_pmc_bxt.c
|
|||
F: include/linux/mfd/intel_pmc_bxt.h
|
||||
|
||||
INTEL C600 SERIES SAS CONTROLLER DRIVER
|
||||
M: Artur Paszkiewicz <artur.paszkiewicz@intel.com>
|
||||
L: linux-scsi@vger.kernel.org
|
||||
S: Supported
|
||||
S: Orphan
|
||||
T: git git://git.code.sf.net/p/intel-sas/isci
|
||||
F: drivers/scsi/isci/
|
||||
|
||||
|
@ -20781,8 +20780,7 @@ F: arch/s390/include/uapi/asm/zcrypt.h
|
|||
F: drivers/s390/crypto/
|
||||
|
||||
S390 ZFCP DRIVER
|
||||
M: Steffen Maier <maier@linux.ibm.com>
|
||||
M: Benjamin Block <bblock@linux.ibm.com>
|
||||
M: Nihar Panda <niharp@linux.ibm.com>
|
||||
L: linux-s390@vger.kernel.org
|
||||
S: Supported
|
||||
F: drivers/s390/scsi/zfcp_*
|
||||
|
|
|
@ -397,7 +397,7 @@ extern const struct attribute_group *ahci_sdev_groups[];
|
|||
.sdev_groups = ahci_sdev_groups, \
|
||||
.change_queue_depth = ata_scsi_change_queue_depth, \
|
||||
.tag_alloc_policy_rr = true, \
|
||||
.device_configure = ata_scsi_device_configure
|
||||
.sdev_configure = ata_scsi_sdev_configure
|
||||
|
||||
extern struct ata_port_operations ahci_ops;
|
||||
extern struct ata_port_operations ahci_platform_ops;
|
||||
|
|
|
@ -1313,7 +1313,7 @@ int ata_scsi_change_queue_depth(struct scsi_device *sdev, int queue_depth)
|
|||
EXPORT_SYMBOL_GPL(ata_scsi_change_queue_depth);
|
||||
|
||||
/**
|
||||
* ata_sas_device_configure - Default device_configure routine for libata
|
||||
* ata_sas_sdev_configure - Default sdev_configure routine for libata
|
||||
* devices
|
||||
* @sdev: SCSI device to configure
|
||||
* @lim: queue limits
|
||||
|
@ -1323,14 +1323,14 @@ EXPORT_SYMBOL_GPL(ata_scsi_change_queue_depth);
|
|||
* Zero.
|
||||
*/
|
||||
|
||||
int ata_sas_device_configure(struct scsi_device *sdev, struct queue_limits *lim,
|
||||
struct ata_port *ap)
|
||||
int ata_sas_sdev_configure(struct scsi_device *sdev, struct queue_limits *lim,
|
||||
struct ata_port *ap)
|
||||
{
|
||||
ata_scsi_sdev_config(sdev);
|
||||
|
||||
return ata_scsi_dev_config(sdev, lim, ap->link.device);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_sas_device_configure);
|
||||
EXPORT_SYMBOL_GPL(ata_sas_sdev_configure);
|
||||
|
||||
/**
|
||||
* ata_sas_queuecmd - Issue SCSI cdb to libata-managed device
|
||||
|
|
|
@ -1133,7 +1133,7 @@ int ata_scsi_dev_config(struct scsi_device *sdev, struct queue_limits *lim,
|
|||
}
|
||||
|
||||
/**
|
||||
* ata_scsi_slave_alloc - Early setup of SCSI device
|
||||
* ata_scsi_sdev_init - Early setup of SCSI device
|
||||
* @sdev: SCSI device to examine
|
||||
*
|
||||
* This is called from scsi_alloc_sdev() when the scsi device
|
||||
|
@ -1143,7 +1143,7 @@ int ata_scsi_dev_config(struct scsi_device *sdev, struct queue_limits *lim,
|
|||
* Defined by SCSI layer. We don't really care.
|
||||
*/
|
||||
|
||||
int ata_scsi_slave_alloc(struct scsi_device *sdev)
|
||||
int ata_scsi_sdev_init(struct scsi_device *sdev)
|
||||
{
|
||||
struct ata_port *ap = ata_shost_to_port(sdev->host);
|
||||
struct device_link *link;
|
||||
|
@ -1166,10 +1166,10 @@ int ata_scsi_slave_alloc(struct scsi_device *sdev)
|
|||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_scsi_slave_alloc);
|
||||
EXPORT_SYMBOL_GPL(ata_scsi_sdev_init);
|
||||
|
||||
/**
|
||||
* ata_scsi_device_configure - Set SCSI device attributes
|
||||
* ata_scsi_sdev_configure - Set SCSI device attributes
|
||||
* @sdev: SCSI device to examine
|
||||
* @lim: queue limits
|
||||
*
|
||||
|
@ -1181,8 +1181,7 @@ EXPORT_SYMBOL_GPL(ata_scsi_slave_alloc);
|
|||
* Defined by SCSI layer. We don't really care.
|
||||
*/
|
||||
|
||||
int ata_scsi_device_configure(struct scsi_device *sdev,
|
||||
struct queue_limits *lim)
|
||||
int ata_scsi_sdev_configure(struct scsi_device *sdev, struct queue_limits *lim)
|
||||
{
|
||||
struct ata_port *ap = ata_shost_to_port(sdev->host);
|
||||
struct ata_device *dev = __ata_scsi_find_dev(ap, sdev);
|
||||
|
@ -1192,10 +1191,10 @@ int ata_scsi_device_configure(struct scsi_device *sdev,
|
|||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_scsi_device_configure);
|
||||
EXPORT_SYMBOL_GPL(ata_scsi_sdev_configure);
|
||||
|
||||
/**
|
||||
* ata_scsi_slave_destroy - SCSI device is about to be destroyed
|
||||
* ata_scsi_sdev_destroy - SCSI device is about to be destroyed
|
||||
* @sdev: SCSI device to be destroyed
|
||||
*
|
||||
* @sdev is about to be destroyed for hot/warm unplugging. If
|
||||
|
@ -1208,7 +1207,7 @@ EXPORT_SYMBOL_GPL(ata_scsi_device_configure);
|
|||
* LOCKING:
|
||||
* Defined by SCSI layer. We don't really care.
|
||||
*/
|
||||
void ata_scsi_slave_destroy(struct scsi_device *sdev)
|
||||
void ata_scsi_sdev_destroy(struct scsi_device *sdev)
|
||||
{
|
||||
struct ata_port *ap = ata_shost_to_port(sdev->host);
|
||||
unsigned long flags;
|
||||
|
@ -1228,7 +1227,7 @@ void ata_scsi_slave_destroy(struct scsi_device *sdev)
|
|||
|
||||
kfree(sdev->dma_drain_buf);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_scsi_slave_destroy);
|
||||
EXPORT_SYMBOL_GPL(ata_scsi_sdev_destroy);
|
||||
|
||||
/**
|
||||
* ata_scsi_start_stop_xlat - Translate SCSI START STOP UNIT command
|
||||
|
|
|
@ -812,8 +812,8 @@ static void pata_macio_reset_hw(struct pata_macio_priv *priv, int resume)
|
|||
/* Hook the standard slave config to fixup some HW related alignment
|
||||
* restrictions
|
||||
*/
|
||||
static int pata_macio_device_configure(struct scsi_device *sdev,
|
||||
struct queue_limits *lim)
|
||||
static int pata_macio_sdev_configure(struct scsi_device *sdev,
|
||||
struct queue_limits *lim)
|
||||
{
|
||||
struct ata_port *ap = ata_shost_to_port(sdev->host);
|
||||
struct pata_macio_priv *priv = ap->private_data;
|
||||
|
@ -822,7 +822,7 @@ static int pata_macio_device_configure(struct scsi_device *sdev,
|
|||
int rc;
|
||||
|
||||
/* First call original */
|
||||
rc = ata_scsi_device_configure(sdev, lim);
|
||||
rc = ata_scsi_sdev_configure(sdev, lim);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
|
@ -932,7 +932,7 @@ static const struct scsi_host_template pata_macio_sht = {
|
|||
/* We may not need that strict one */
|
||||
.dma_boundary = ATA_DMA_BOUNDARY,
|
||||
.max_segment_size = PATA_MACIO_MAX_SEGMENT_SIZE,
|
||||
.device_configure = pata_macio_device_configure,
|
||||
.sdev_configure = pata_macio_sdev_configure,
|
||||
.sdev_groups = ata_common_sdev_groups,
|
||||
.can_queue = ATA_DEF_QUEUE,
|
||||
.tag_alloc_policy_rr = true,
|
||||
|
|
|
@ -673,7 +673,7 @@ static const struct scsi_host_template mv6_sht = {
|
|||
.sdev_groups = ata_ncq_sdev_groups,
|
||||
.change_queue_depth = ata_scsi_change_queue_depth,
|
||||
.tag_alloc_policy_rr = true,
|
||||
.device_configure = ata_scsi_device_configure
|
||||
.sdev_configure = ata_scsi_sdev_configure
|
||||
};
|
||||
|
||||
static struct ata_port_operations mv5_ops = {
|
||||
|
|
|
@ -296,8 +296,8 @@ static void nv_nf2_freeze(struct ata_port *ap);
|
|||
static void nv_nf2_thaw(struct ata_port *ap);
|
||||
static void nv_ck804_freeze(struct ata_port *ap);
|
||||
static void nv_ck804_thaw(struct ata_port *ap);
|
||||
static int nv_adma_device_configure(struct scsi_device *sdev,
|
||||
struct queue_limits *lim);
|
||||
static int nv_adma_sdev_configure(struct scsi_device *sdev,
|
||||
struct queue_limits *lim);
|
||||
static int nv_adma_check_atapi_dma(struct ata_queued_cmd *qc);
|
||||
static enum ata_completion_errors nv_adma_qc_prep(struct ata_queued_cmd *qc);
|
||||
static unsigned int nv_adma_qc_issue(struct ata_queued_cmd *qc);
|
||||
|
@ -319,8 +319,8 @@ static void nv_adma_tf_read(struct ata_port *ap, struct ata_taskfile *tf);
|
|||
static void nv_mcp55_thaw(struct ata_port *ap);
|
||||
static void nv_mcp55_freeze(struct ata_port *ap);
|
||||
static void nv_swncq_error_handler(struct ata_port *ap);
|
||||
static int nv_swncq_device_configure(struct scsi_device *sdev,
|
||||
struct queue_limits *lim);
|
||||
static int nv_swncq_sdev_configure(struct scsi_device *sdev,
|
||||
struct queue_limits *lim);
|
||||
static int nv_swncq_port_start(struct ata_port *ap);
|
||||
static enum ata_completion_errors nv_swncq_qc_prep(struct ata_queued_cmd *qc);
|
||||
static void nv_swncq_fill_sg(struct ata_queued_cmd *qc);
|
||||
|
@ -382,7 +382,7 @@ static const struct scsi_host_template nv_adma_sht = {
|
|||
.can_queue = NV_ADMA_MAX_CPBS,
|
||||
.sg_tablesize = NV_ADMA_SGTBL_TOTAL_LEN,
|
||||
.dma_boundary = NV_ADMA_DMA_BOUNDARY,
|
||||
.device_configure = nv_adma_device_configure,
|
||||
.sdev_configure = nv_adma_sdev_configure,
|
||||
.sdev_groups = ata_ncq_sdev_groups,
|
||||
.change_queue_depth = ata_scsi_change_queue_depth,
|
||||
.tag_alloc_policy_rr = true,
|
||||
|
@ -393,7 +393,7 @@ static const struct scsi_host_template nv_swncq_sht = {
|
|||
.can_queue = ATA_MAX_QUEUE - 1,
|
||||
.sg_tablesize = LIBATA_MAX_PRD,
|
||||
.dma_boundary = ATA_DMA_BOUNDARY,
|
||||
.device_configure = nv_swncq_device_configure,
|
||||
.sdev_configure = nv_swncq_sdev_configure,
|
||||
.sdev_groups = ata_ncq_sdev_groups,
|
||||
.change_queue_depth = ata_scsi_change_queue_depth,
|
||||
.tag_alloc_policy_rr = true,
|
||||
|
@ -663,8 +663,8 @@ static void nv_adma_mode(struct ata_port *ap)
|
|||
pp->flags &= ~NV_ADMA_PORT_REGISTER_MODE;
|
||||
}
|
||||
|
||||
static int nv_adma_device_configure(struct scsi_device *sdev,
|
||||
struct queue_limits *lim)
|
||||
static int nv_adma_sdev_configure(struct scsi_device *sdev,
|
||||
struct queue_limits *lim)
|
||||
{
|
||||
struct ata_port *ap = ata_shost_to_port(sdev->host);
|
||||
struct nv_adma_port_priv *pp = ap->private_data;
|
||||
|
@ -676,7 +676,7 @@ static int nv_adma_device_configure(struct scsi_device *sdev,
|
|||
int adma_enable;
|
||||
u32 current_reg, new_reg, config_mask;
|
||||
|
||||
rc = ata_scsi_device_configure(sdev, lim);
|
||||
rc = ata_scsi_sdev_configure(sdev, lim);
|
||||
|
||||
if (sdev->id >= ATA_MAX_DEVICES || sdev->channel || sdev->lun)
|
||||
/* Not a proper libata device, ignore */
|
||||
|
@ -1871,8 +1871,8 @@ static void nv_swncq_host_init(struct ata_host *host)
|
|||
writel(~0x0, mmio + NV_INT_STATUS_MCP55);
|
||||
}
|
||||
|
||||
static int nv_swncq_device_configure(struct scsi_device *sdev,
|
||||
struct queue_limits *lim)
|
||||
static int nv_swncq_sdev_configure(struct scsi_device *sdev,
|
||||
struct queue_limits *lim)
|
||||
{
|
||||
struct ata_port *ap = ata_shost_to_port(sdev->host);
|
||||
struct pci_dev *pdev = to_pci_dev(ap->host->dev);
|
||||
|
@ -1882,7 +1882,7 @@ static int nv_swncq_device_configure(struct scsi_device *sdev,
|
|||
u8 check_maxtor = 0;
|
||||
unsigned char model_num[ATA_ID_PROD_LEN + 1];
|
||||
|
||||
rc = ata_scsi_device_configure(sdev, lim);
|
||||
rc = ata_scsi_sdev_configure(sdev, lim);
|
||||
if (sdev->id >= ATA_MAX_DEVICES || sdev->channel || sdev->lun)
|
||||
/* Not a proper libata device, ignore */
|
||||
return rc;
|
||||
|
|
|
@ -380,7 +380,7 @@ static const struct scsi_host_template sil24_sht = {
|
|||
.dma_boundary = ATA_DMA_BOUNDARY,
|
||||
.sdev_groups = ata_ncq_sdev_groups,
|
||||
.change_queue_depth = ata_scsi_change_queue_depth,
|
||||
.device_configure = ata_scsi_device_configure
|
||||
.sdev_configure = ata_scsi_sdev_configure
|
||||
};
|
||||
|
||||
static struct ata_port_operations sil24_ops = {
|
||||
|
|
|
@ -1490,7 +1490,7 @@ static int sbp2_scsi_queuecommand(struct Scsi_Host *shost,
|
|||
return retval;
|
||||
}
|
||||
|
||||
static int sbp2_scsi_slave_alloc(struct scsi_device *sdev)
|
||||
static int sbp2_scsi_sdev_init(struct scsi_device *sdev)
|
||||
{
|
||||
struct sbp2_logical_unit *lu = sdev->hostdata;
|
||||
|
||||
|
@ -1506,8 +1506,8 @@ static int sbp2_scsi_slave_alloc(struct scsi_device *sdev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int sbp2_scsi_device_configure(struct scsi_device *sdev,
|
||||
struct queue_limits *lim)
|
||||
static int sbp2_scsi_sdev_configure(struct scsi_device *sdev,
|
||||
struct queue_limits *lim)
|
||||
{
|
||||
struct sbp2_logical_unit *lu = sdev->hostdata;
|
||||
|
||||
|
@ -1590,8 +1590,8 @@ static const struct scsi_host_template scsi_driver_template = {
|
|||
.name = "SBP-2 IEEE-1394",
|
||||
.proc_name = "sbp2",
|
||||
.queuecommand = sbp2_scsi_queuecommand,
|
||||
.slave_alloc = sbp2_scsi_slave_alloc,
|
||||
.device_configure = sbp2_scsi_device_configure,
|
||||
.sdev_init = sbp2_scsi_sdev_init,
|
||||
.sdev_configure = sbp2_scsi_sdev_configure,
|
||||
.eh_abort_handler = sbp2_scsi_abort,
|
||||
.this_id = -1,
|
||||
.sg_tablesize = SG_ALL,
|
||||
|
|
|
@ -2844,7 +2844,8 @@ static int srp_target_alloc(struct scsi_target *starget)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int srp_slave_configure(struct scsi_device *sdev)
|
||||
static int srp_sdev_configure(struct scsi_device *sdev,
|
||||
struct queue_limits *lim)
|
||||
{
|
||||
struct Scsi_Host *shost = sdev->host;
|
||||
struct srp_target_port *target = host_to_target(shost);
|
||||
|
@ -3067,7 +3068,7 @@ static const struct scsi_host_template srp_template = {
|
|||
.name = "InfiniBand SRP initiator",
|
||||
.proc_name = DRV_NAME,
|
||||
.target_alloc = srp_target_alloc,
|
||||
.slave_configure = srp_slave_configure,
|
||||
.sdev_configure = srp_sdev_configure,
|
||||
.info = srp_target_info,
|
||||
.init_cmd_priv = srp_init_cmd_priv,
|
||||
.exit_cmd_priv = srp_exit_cmd_priv,
|
||||
|
|
|
@ -96,7 +96,7 @@ static u8 mptfcTaskCtx = MPT_MAX_PROTOCOL_DRIVERS;
|
|||
static u8 mptfcInternalCtx = MPT_MAX_PROTOCOL_DRIVERS;
|
||||
|
||||
static int mptfc_target_alloc(struct scsi_target *starget);
|
||||
static int mptfc_slave_alloc(struct scsi_device *sdev);
|
||||
static int mptfc_sdev_init(struct scsi_device *sdev);
|
||||
static int mptfc_qcmd(struct Scsi_Host *shost, struct scsi_cmnd *SCpnt);
|
||||
static void mptfc_target_destroy(struct scsi_target *starget);
|
||||
static void mptfc_set_rport_loss_tmo(struct fc_rport *rport, uint32_t timeout);
|
||||
|
@ -113,10 +113,10 @@ static const struct scsi_host_template mptfc_driver_template = {
|
|||
.info = mptscsih_info,
|
||||
.queuecommand = mptfc_qcmd,
|
||||
.target_alloc = mptfc_target_alloc,
|
||||
.slave_alloc = mptfc_slave_alloc,
|
||||
.slave_configure = mptscsih_slave_configure,
|
||||
.sdev_init = mptfc_sdev_init,
|
||||
.sdev_configure = mptscsih_sdev_configure,
|
||||
.target_destroy = mptfc_target_destroy,
|
||||
.slave_destroy = mptscsih_slave_destroy,
|
||||
.sdev_destroy = mptscsih_sdev_destroy,
|
||||
.change_queue_depth = mptscsih_change_queue_depth,
|
||||
.eh_timed_out = fc_eh_timed_out,
|
||||
.eh_abort_handler = mptfc_abort,
|
||||
|
@ -503,7 +503,7 @@ mptfc_register_dev(MPT_ADAPTER *ioc, int channel, FCDevicePage0_t *pg0)
|
|||
/*
|
||||
* if already mapped, remap here. If not mapped,
|
||||
* target_alloc will allocate vtarget and map,
|
||||
* slave_alloc will fill in vdevice from vtarget.
|
||||
* sdev_init will fill in vdevice from vtarget.
|
||||
*/
|
||||
if (ri->starget) {
|
||||
vtarget = ri->starget->hostdata;
|
||||
|
@ -631,7 +631,7 @@ mptfc_dump_lun_info(MPT_ADAPTER *ioc, struct fc_rport *rport, struct scsi_device
|
|||
* Init memory once per LUN.
|
||||
*/
|
||||
static int
|
||||
mptfc_slave_alloc(struct scsi_device *sdev)
|
||||
mptfc_sdev_init(struct scsi_device *sdev)
|
||||
{
|
||||
MPT_SCSI_HOST *hd;
|
||||
VirtTarget *vtarget;
|
||||
|
@ -651,7 +651,7 @@ mptfc_slave_alloc(struct scsi_device *sdev)
|
|||
|
||||
vdevice = kzalloc(sizeof(VirtDevice), GFP_KERNEL);
|
||||
if (!vdevice) {
|
||||
printk(MYIOC_s_ERR_FMT "slave_alloc kmalloc(%zd) FAILED!\n",
|
||||
printk(MYIOC_s_ERR_FMT "sdev_init kmalloc(%zd) FAILED!\n",
|
||||
ioc->name, sizeof(VirtDevice));
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
|
|
@ -1710,7 +1710,7 @@ mptsas_firmware_event_work(struct work_struct *work)
|
|||
|
||||
|
||||
static int
|
||||
mptsas_slave_configure(struct scsi_device *sdev)
|
||||
mptsas_sdev_configure(struct scsi_device *sdev, struct queue_limits *lim)
|
||||
{
|
||||
struct Scsi_Host *host = sdev->host;
|
||||
MPT_SCSI_HOST *hd = shost_priv(host);
|
||||
|
@ -1736,7 +1736,7 @@ mptsas_slave_configure(struct scsi_device *sdev)
|
|||
mptsas_add_device_component_starget(ioc, scsi_target(sdev));
|
||||
|
||||
out:
|
||||
return mptscsih_slave_configure(sdev);
|
||||
return mptscsih_sdev_configure(sdev, lim);
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -1867,7 +1867,7 @@ mptsas_target_destroy(struct scsi_target *starget)
|
|||
|
||||
|
||||
static int
|
||||
mptsas_slave_alloc(struct scsi_device *sdev)
|
||||
mptsas_sdev_init(struct scsi_device *sdev)
|
||||
{
|
||||
struct Scsi_Host *host = sdev->host;
|
||||
MPT_SCSI_HOST *hd = shost_priv(host);
|
||||
|
@ -1880,7 +1880,7 @@ mptsas_slave_alloc(struct scsi_device *sdev)
|
|||
|
||||
vdevice = kzalloc(sizeof(VirtDevice), GFP_KERNEL);
|
||||
if (!vdevice) {
|
||||
printk(MYIOC_s_ERR_FMT "slave_alloc kzalloc(%zd) FAILED!\n",
|
||||
printk(MYIOC_s_ERR_FMT "sdev_init kzalloc(%zd) FAILED!\n",
|
||||
ioc->name, sizeof(VirtDevice));
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
@ -2005,10 +2005,10 @@ static const struct scsi_host_template mptsas_driver_template = {
|
|||
.info = mptscsih_info,
|
||||
.queuecommand = mptsas_qcmd,
|
||||
.target_alloc = mptsas_target_alloc,
|
||||
.slave_alloc = mptsas_slave_alloc,
|
||||
.slave_configure = mptsas_slave_configure,
|
||||
.sdev_init = mptsas_sdev_init,
|
||||
.sdev_configure = mptsas_sdev_configure,
|
||||
.target_destroy = mptsas_target_destroy,
|
||||
.slave_destroy = mptscsih_slave_destroy,
|
||||
.sdev_destroy = mptscsih_sdev_destroy,
|
||||
.change_queue_depth = mptscsih_change_queue_depth,
|
||||
.eh_timed_out = mptsas_eh_timed_out,
|
||||
.eh_abort_handler = mptscsih_abort,
|
||||
|
|
|
@ -1071,7 +1071,7 @@ EXPORT_SYMBOL(mptscsih_flush_running_cmds);
|
|||
*
|
||||
* Returns: None.
|
||||
*
|
||||
* Called from slave_destroy.
|
||||
* Called from sdev_destroy.
|
||||
*/
|
||||
static void
|
||||
mptscsih_search_running_cmds(MPT_SCSI_HOST *hd, VirtDevice *vdevice)
|
||||
|
@ -2331,7 +2331,7 @@ EXPORT_SYMBOL(mptscsih_raid_id_to_num);
|
|||
* Called if no device present or device being unloaded
|
||||
*/
|
||||
void
|
||||
mptscsih_slave_destroy(struct scsi_device *sdev)
|
||||
mptscsih_sdev_destroy(struct scsi_device *sdev)
|
||||
{
|
||||
struct Scsi_Host *host = sdev->host;
|
||||
MPT_SCSI_HOST *hd = shost_priv(host);
|
||||
|
@ -2399,7 +2399,7 @@ mptscsih_change_queue_depth(struct scsi_device *sdev, int qdepth)
|
|||
* Return non-zero if fails.
|
||||
*/
|
||||
int
|
||||
mptscsih_slave_configure(struct scsi_device *sdev)
|
||||
mptscsih_sdev_configure(struct scsi_device *sdev, struct queue_limits *lim)
|
||||
{
|
||||
struct Scsi_Host *sh = sdev->host;
|
||||
VirtTarget *vtarget;
|
||||
|
@ -3302,8 +3302,8 @@ EXPORT_SYMBOL(mptscsih_resume);
|
|||
EXPORT_SYMBOL(mptscsih_show_info);
|
||||
EXPORT_SYMBOL(mptscsih_info);
|
||||
EXPORT_SYMBOL(mptscsih_qcmd);
|
||||
EXPORT_SYMBOL(mptscsih_slave_destroy);
|
||||
EXPORT_SYMBOL(mptscsih_slave_configure);
|
||||
EXPORT_SYMBOL(mptscsih_sdev_destroy);
|
||||
EXPORT_SYMBOL(mptscsih_sdev_configure);
|
||||
EXPORT_SYMBOL(mptscsih_abort);
|
||||
EXPORT_SYMBOL(mptscsih_dev_reset);
|
||||
EXPORT_SYMBOL(mptscsih_target_reset);
|
||||
|
|
|
@ -116,8 +116,9 @@ extern const char * mptscsih_info(struct Scsi_Host *SChost);
|
|||
extern int mptscsih_qcmd(struct scsi_cmnd *SCpnt);
|
||||
extern int mptscsih_IssueTaskMgmt(MPT_SCSI_HOST *hd, u8 type, u8 channel,
|
||||
u8 id, u64 lun, int ctx2abort, ulong timeout);
|
||||
extern void mptscsih_slave_destroy(struct scsi_device *device);
|
||||
extern int mptscsih_slave_configure(struct scsi_device *device);
|
||||
extern void mptscsih_sdev_destroy(struct scsi_device *device);
|
||||
extern int mptscsih_sdev_configure(struct scsi_device *device,
|
||||
struct queue_limits *lim);
|
||||
extern int mptscsih_abort(struct scsi_cmnd * SCpnt);
|
||||
extern int mptscsih_dev_reset(struct scsi_cmnd * SCpnt);
|
||||
extern int mptscsih_target_reset(struct scsi_cmnd * SCpnt);
|
||||
|
|
|
@ -713,7 +713,7 @@ static void mptspi_dv_device(struct _MPT_SCSI_HOST *hd,
|
|||
mptspi_read_parameters(sdev->sdev_target);
|
||||
}
|
||||
|
||||
static int mptspi_slave_alloc(struct scsi_device *sdev)
|
||||
static int mptspi_sdev_init(struct scsi_device *sdev)
|
||||
{
|
||||
MPT_SCSI_HOST *hd = shost_priv(sdev->host);
|
||||
VirtTarget *vtarget;
|
||||
|
@ -727,7 +727,7 @@ static int mptspi_slave_alloc(struct scsi_device *sdev)
|
|||
|
||||
vdevice = kzalloc(sizeof(VirtDevice), GFP_KERNEL);
|
||||
if (!vdevice) {
|
||||
printk(MYIOC_s_ERR_FMT "slave_alloc kmalloc(%zd) FAILED!\n",
|
||||
printk(MYIOC_s_ERR_FMT "sdev_init kmalloc(%zd) FAILED!\n",
|
||||
ioc->name, sizeof(VirtDevice));
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
@ -746,7 +746,8 @@ static int mptspi_slave_alloc(struct scsi_device *sdev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int mptspi_slave_configure(struct scsi_device *sdev)
|
||||
static int mptspi_sdev_configure(struct scsi_device *sdev,
|
||||
struct queue_limits *lim)
|
||||
{
|
||||
struct _MPT_SCSI_HOST *hd = shost_priv(sdev->host);
|
||||
VirtTarget *vtarget = scsi_target(sdev)->hostdata;
|
||||
|
@ -754,7 +755,7 @@ static int mptspi_slave_configure(struct scsi_device *sdev)
|
|||
|
||||
mptspi_initTarget(hd, vtarget, sdev);
|
||||
|
||||
ret = mptscsih_slave_configure(sdev);
|
||||
ret = mptscsih_sdev_configure(sdev, lim);
|
||||
|
||||
if (ret)
|
||||
return ret;
|
||||
|
@ -799,7 +800,7 @@ mptspi_qcmd(struct Scsi_Host *shost, struct scsi_cmnd *SCpnt)
|
|||
return mptscsih_qcmd(SCpnt);
|
||||
}
|
||||
|
||||
static void mptspi_slave_destroy(struct scsi_device *sdev)
|
||||
static void mptspi_sdev_destroy(struct scsi_device *sdev)
|
||||
{
|
||||
struct scsi_target *starget = scsi_target(sdev);
|
||||
VirtTarget *vtarget = starget->hostdata;
|
||||
|
@ -817,7 +818,7 @@ static void mptspi_slave_destroy(struct scsi_device *sdev)
|
|||
mptspi_write_spi_device_pg1(starget, &pg1);
|
||||
}
|
||||
|
||||
mptscsih_slave_destroy(sdev);
|
||||
mptscsih_sdev_destroy(sdev);
|
||||
}
|
||||
|
||||
static const struct scsi_host_template mptspi_driver_template = {
|
||||
|
@ -828,10 +829,10 @@ static const struct scsi_host_template mptspi_driver_template = {
|
|||
.info = mptscsih_info,
|
||||
.queuecommand = mptspi_qcmd,
|
||||
.target_alloc = mptspi_target_alloc,
|
||||
.slave_alloc = mptspi_slave_alloc,
|
||||
.slave_configure = mptspi_slave_configure,
|
||||
.sdev_init = mptspi_sdev_init,
|
||||
.sdev_configure = mptspi_sdev_configure,
|
||||
.target_destroy = mptspi_target_destroy,
|
||||
.slave_destroy = mptspi_slave_destroy,
|
||||
.sdev_destroy = mptspi_sdev_destroy,
|
||||
.change_queue_depth = mptscsih_change_queue_depth,
|
||||
.eh_abort_handler = mptscsih_abort,
|
||||
.eh_device_reset_handler = mptscsih_dev_reset,
|
||||
|
|
|
@ -537,6 +537,11 @@ static void zfcp_fc_adisc_handler(void *data)
|
|||
/* port is still good, nothing to do */
|
||||
out:
|
||||
atomic_andnot(ZFCP_STATUS_PORT_LINK_TEST, &port->status);
|
||||
/*
|
||||
* port ref comes from get_device() in zfcp_fc_test_link() and
|
||||
* work item zfcp_fc_link_test_work() passes ref via
|
||||
* zfcp_fc_adisc() to here, if zfcp_fc_adisc() could send ADISC
|
||||
*/
|
||||
put_device(&port->dev);
|
||||
kmem_cache_free(zfcp_fc_req_cache, fc_req);
|
||||
}
|
||||
|
@ -603,7 +608,7 @@ void zfcp_fc_link_test_work(struct work_struct *work)
|
|||
|
||||
retval = zfcp_fc_adisc(port);
|
||||
if (retval == 0)
|
||||
return;
|
||||
return; /* port ref passed to zfcp_fc_adisc(), no put here */
|
||||
|
||||
/* send of ADISC was not possible */
|
||||
atomic_andnot(ZFCP_STATUS_PORT_LINK_TEST, &port->status);
|
||||
|
|
|
@ -1218,7 +1218,7 @@ static int zfcp_fsf_setup_ct_els(struct zfcp_fsf_req *req,
|
|||
/**
|
||||
* zfcp_fsf_send_ct - initiate a Generic Service request (FC-GS)
|
||||
* @wka_port: pointer to zfcp WKA port to send CT/GS to
|
||||
* @ct: pointer to struct zfcp_send_ct with data for request
|
||||
* @ct: pointer to struct zfcp_fsf_ct_els with data for CT request
|
||||
* @pool: if non-null this mempool is used to allocate struct zfcp_fsf_req
|
||||
* @timeout: timeout that hardware should use, and a later software timeout
|
||||
*/
|
||||
|
@ -1316,7 +1316,7 @@ skip_fsfstatus:
|
|||
* zfcp_fsf_send_els - initiate an ELS command (FC-FS)
|
||||
* @adapter: pointer to zfcp adapter
|
||||
* @d_id: N_Port_ID to send ELS to
|
||||
* @els: pointer to struct zfcp_send_els with data for the command
|
||||
* @els: pointer to struct zfcp_fsf_ct_els with data for the ELS command
|
||||
* @timeout: timeout that hardware should use, and a later software timeout
|
||||
*/
|
||||
int zfcp_fsf_send_els(struct zfcp_adapter *adapter, u32 d_id,
|
||||
|
|
|
@ -37,11 +37,11 @@ static bool allow_lun_scan = true;
|
|||
module_param(allow_lun_scan, bool, 0600);
|
||||
MODULE_PARM_DESC(allow_lun_scan, "For NPIV, scan and attach all storage LUNs");
|
||||
|
||||
static void zfcp_scsi_slave_destroy(struct scsi_device *sdev)
|
||||
static void zfcp_scsi_sdev_destroy(struct scsi_device *sdev)
|
||||
{
|
||||
struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(sdev);
|
||||
|
||||
/* if previous slave_alloc returned early, there is nothing to do */
|
||||
/* if previous sdev_init returned early, there is nothing to do */
|
||||
if (!zfcp_sdev->port)
|
||||
return;
|
||||
|
||||
|
@ -49,7 +49,8 @@ static void zfcp_scsi_slave_destroy(struct scsi_device *sdev)
|
|||
put_device(&zfcp_sdev->port->dev);
|
||||
}
|
||||
|
||||
static int zfcp_scsi_slave_configure(struct scsi_device *sdp)
|
||||
static int zfcp_scsi_sdev_configure(struct scsi_device *sdp,
|
||||
struct queue_limits *lim)
|
||||
{
|
||||
if (sdp->tagged_supported)
|
||||
scsi_change_queue_depth(sdp, default_depth);
|
||||
|
@ -110,7 +111,7 @@ int zfcp_scsi_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *scpnt)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int zfcp_scsi_slave_alloc(struct scsi_device *sdev)
|
||||
static int zfcp_scsi_sdev_init(struct scsi_device *sdev)
|
||||
{
|
||||
struct fc_rport *rport = starget_to_rport(scsi_target(sdev));
|
||||
struct zfcp_adapter *adapter =
|
||||
|
@ -427,9 +428,9 @@ static const struct scsi_host_template zfcp_scsi_host_template = {
|
|||
.eh_device_reset_handler = zfcp_scsi_eh_device_reset_handler,
|
||||
.eh_target_reset_handler = zfcp_scsi_eh_target_reset_handler,
|
||||
.eh_host_reset_handler = zfcp_scsi_eh_host_reset_handler,
|
||||
.slave_alloc = zfcp_scsi_slave_alloc,
|
||||
.slave_configure = zfcp_scsi_slave_configure,
|
||||
.slave_destroy = zfcp_scsi_slave_destroy,
|
||||
.sdev_init = zfcp_scsi_sdev_init,
|
||||
.sdev_configure = zfcp_scsi_sdev_configure,
|
||||
.sdev_destroy = zfcp_scsi_sdev_destroy,
|
||||
.change_queue_depth = scsi_change_queue_depth,
|
||||
.host_reset = zfcp_scsi_sysfs_host_reset,
|
||||
.proc_name = "zfcp",
|
||||
|
|
|
@ -284,7 +284,7 @@ static bool zfcp_sysfs_port_in_use(struct zfcp_port *const port)
|
|||
goto unlock_host_lock;
|
||||
}
|
||||
|
||||
/* port is about to be removed, so no more unit_add or slave_alloc */
|
||||
/* port is about to be removed, so no more unit_add or sdev_init */
|
||||
zfcp_sysfs_port_set_removing(port);
|
||||
in_use = false;
|
||||
|
||||
|
|
|
@ -170,7 +170,7 @@ int zfcp_unit_add(struct zfcp_port *port, u64 fcp_lun)
|
|||
write_unlock_irq(&port->unit_list_lock);
|
||||
/*
|
||||
* lock order: shost->scan_mutex before zfcp_sysfs_port_units_mutex
|
||||
* due to zfcp_unit_scsi_scan() => zfcp_scsi_slave_alloc()
|
||||
* due to zfcp_unit_scsi_scan() => zfcp_scsi_sdev_init()
|
||||
*/
|
||||
mutex_unlock(&zfcp_sysfs_port_units_mutex);
|
||||
|
||||
|
|
|
@ -1968,13 +1968,14 @@ static char *twa_string_lookup(twa_message_type *table, unsigned int code)
|
|||
} /* End twa_string_lookup() */
|
||||
|
||||
/* This function gets called when a disk is coming on-line */
|
||||
static int twa_slave_configure(struct scsi_device *sdev)
|
||||
static int twa_sdev_configure(struct scsi_device *sdev,
|
||||
struct queue_limits *lim)
|
||||
{
|
||||
/* Force 60 second timeout */
|
||||
blk_queue_rq_timeout(sdev->request_queue, 60 * HZ);
|
||||
|
||||
return 0;
|
||||
} /* End twa_slave_configure() */
|
||||
} /* End twa_sdev_configure() */
|
||||
|
||||
static const struct scsi_host_template driver_template = {
|
||||
.module = THIS_MODULE,
|
||||
|
@ -1984,7 +1985,7 @@ static const struct scsi_host_template driver_template = {
|
|||
.bios_param = twa_scsi_biosparam,
|
||||
.change_queue_depth = scsi_change_queue_depth,
|
||||
.can_queue = TW_Q_LENGTH-2,
|
||||
.slave_configure = twa_slave_configure,
|
||||
.sdev_configure = twa_sdev_configure,
|
||||
.this_id = -1,
|
||||
.sg_tablesize = TW_APACHE_MAX_SGL_LENGTH,
|
||||
.max_sectors = TW_MAX_SECTORS,
|
||||
|
@ -2260,7 +2261,7 @@ out_disable_device:
|
|||
} /* End twa_resume() */
|
||||
|
||||
/* PCI Devices supported by this driver */
|
||||
static struct pci_device_id twa_pci_tbl[] = {
|
||||
static const struct pci_device_id twa_pci_tbl[] = {
|
||||
{ PCI_VENDOR_ID_3WARE, PCI_DEVICE_ID_3WARE_9000,
|
||||
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
|
||||
{ PCI_VENDOR_ID_3WARE, PCI_DEVICE_ID_3WARE_9550SX,
|
||||
|
|
|
@ -96,7 +96,7 @@ static int twl_reset_device_extension(TW_Device_Extension *tw_dev, int ioctl_res
|
|||
|
||||
/* This function returns AENs through sysfs */
|
||||
static ssize_t twl_sysfs_aen_read(struct file *filp, struct kobject *kobj,
|
||||
struct bin_attribute *bin_attr,
|
||||
const struct bin_attribute *bin_attr,
|
||||
char *outbuf, loff_t offset, size_t count)
|
||||
{
|
||||
struct device *dev = container_of(kobj, struct device, kobj);
|
||||
|
@ -116,18 +116,18 @@ static ssize_t twl_sysfs_aen_read(struct file *filp, struct kobject *kobj,
|
|||
} /* End twl_sysfs_aen_read() */
|
||||
|
||||
/* aen_read sysfs attribute initializer */
|
||||
static struct bin_attribute twl_sysfs_aen_read_attr = {
|
||||
static const struct bin_attribute twl_sysfs_aen_read_attr = {
|
||||
.attr = {
|
||||
.name = "3ware_aen_read",
|
||||
.mode = S_IRUSR,
|
||||
},
|
||||
.size = 0,
|
||||
.read = twl_sysfs_aen_read
|
||||
.read_new = twl_sysfs_aen_read
|
||||
};
|
||||
|
||||
/* This function returns driver compatibility info through sysfs */
|
||||
static ssize_t twl_sysfs_compat_info(struct file *filp, struct kobject *kobj,
|
||||
struct bin_attribute *bin_attr,
|
||||
const struct bin_attribute *bin_attr,
|
||||
char *outbuf, loff_t offset, size_t count)
|
||||
{
|
||||
struct device *dev = container_of(kobj, struct device, kobj);
|
||||
|
@ -147,13 +147,13 @@ static ssize_t twl_sysfs_compat_info(struct file *filp, struct kobject *kobj,
|
|||
} /* End twl_sysfs_compat_info() */
|
||||
|
||||
/* compat_info sysfs attribute initializer */
|
||||
static struct bin_attribute twl_sysfs_compat_info_attr = {
|
||||
static const struct bin_attribute twl_sysfs_compat_info_attr = {
|
||||
.attr = {
|
||||
.name = "3ware_compat_info",
|
||||
.mode = S_IRUSR,
|
||||
},
|
||||
.size = 0,
|
||||
.read = twl_sysfs_compat_info
|
||||
.read_new = twl_sysfs_compat_info
|
||||
};
|
||||
|
||||
/* Show some statistics about the card */
|
||||
|
@ -1523,13 +1523,14 @@ static void twl_shutdown(struct pci_dev *pdev)
|
|||
} /* End twl_shutdown() */
|
||||
|
||||
/* This function configures unit settings when a unit is coming on-line */
|
||||
static int twl_slave_configure(struct scsi_device *sdev)
|
||||
static int twl_sdev_configure(struct scsi_device *sdev,
|
||||
struct queue_limits *lim)
|
||||
{
|
||||
/* Force 60 second timeout */
|
||||
blk_queue_rq_timeout(sdev->request_queue, 60 * HZ);
|
||||
|
||||
return 0;
|
||||
} /* End twl_slave_configure() */
|
||||
} /* End twl_sdev_configure() */
|
||||
|
||||
static const struct scsi_host_template driver_template = {
|
||||
.module = THIS_MODULE,
|
||||
|
@ -1539,7 +1540,7 @@ static const struct scsi_host_template driver_template = {
|
|||
.bios_param = twl_scsi_biosparam,
|
||||
.change_queue_depth = scsi_change_queue_depth,
|
||||
.can_queue = TW_Q_LENGTH-2,
|
||||
.slave_configure = twl_slave_configure,
|
||||
.sdev_configure = twl_sdev_configure,
|
||||
.this_id = -1,
|
||||
.sg_tablesize = TW_LIBERATOR_MAX_SGL_LENGTH,
|
||||
.max_sectors = TW_MAX_SECTORS,
|
||||
|
@ -1821,7 +1822,7 @@ out_disable_device:
|
|||
} /* End twl_resume() */
|
||||
|
||||
/* PCI Devices supported by this driver */
|
||||
static struct pci_device_id twl_pci_tbl[] = {
|
||||
static const struct pci_device_id twl_pci_tbl[] = {
|
||||
{ PCI_VDEVICE(3WARE, PCI_DEVICE_ID_3WARE_9750) },
|
||||
{ }
|
||||
};
|
||||
|
|
|
@ -172,7 +172,7 @@
|
|||
Initialize queues correctly when loading with no valid units.
|
||||
1.02.00.034 - Fix tw_decode_bits() to handle multiple errors.
|
||||
Add support for user configurable cmd_per_lun.
|
||||
Add support for sht->slave_configure().
|
||||
Add support for sht->sdev_configure().
|
||||
1.02.00.035 - Improve tw_allocate_memory() memory allocation.
|
||||
Fix tw_chrdev_ioctl() to sleep correctly.
|
||||
1.02.00.036 - Increase character ioctl timeout to 60 seconds.
|
||||
|
@ -2221,13 +2221,13 @@ static void tw_shutdown(struct pci_dev *pdev)
|
|||
} /* End tw_shutdown() */
|
||||
|
||||
/* This function gets called when a disk is coming online */
|
||||
static int tw_slave_configure(struct scsi_device *sdev)
|
||||
static int tw_sdev_configure(struct scsi_device *sdev, struct queue_limits *lim)
|
||||
{
|
||||
/* Force 60 second timeout */
|
||||
blk_queue_rq_timeout(sdev->request_queue, 60 * HZ);
|
||||
|
||||
return 0;
|
||||
} /* End tw_slave_configure() */
|
||||
} /* End tw_sdev_configure() */
|
||||
|
||||
static const struct scsi_host_template driver_template = {
|
||||
.module = THIS_MODULE,
|
||||
|
@ -2237,7 +2237,7 @@ static const struct scsi_host_template driver_template = {
|
|||
.bios_param = tw_scsi_biosparam,
|
||||
.change_queue_depth = scsi_change_queue_depth,
|
||||
.can_queue = TW_Q_LENGTH-2,
|
||||
.slave_configure = tw_slave_configure,
|
||||
.sdev_configure = tw_sdev_configure,
|
||||
.this_id = -1,
|
||||
.sg_tablesize = TW_MAX_SGL_LENGTH,
|
||||
.max_sectors = TW_MAX_SECTORS,
|
||||
|
@ -2393,7 +2393,7 @@ static void tw_remove(struct pci_dev *pdev)
|
|||
} /* End tw_remove() */
|
||||
|
||||
/* PCI Devices supported by this driver */
|
||||
static struct pci_device_id tw_pci_tbl[] = {
|
||||
static const struct pci_device_id tw_pci_tbl[] = {
|
||||
{ PCI_VENDOR_ID_3WARE, PCI_DEVICE_ID_3WARE_1000,
|
||||
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
|
||||
{ PCI_VENDOR_ID_3WARE, PCI_DEVICE_ID_3WARE_7000,
|
||||
|
|
|
@ -158,9 +158,10 @@ STATIC int NCR_700_abort(struct scsi_cmnd * SCpnt);
|
|||
STATIC int NCR_700_host_reset(struct scsi_cmnd * SCpnt);
|
||||
STATIC void NCR_700_chip_setup(struct Scsi_Host *host);
|
||||
STATIC void NCR_700_chip_reset(struct Scsi_Host *host);
|
||||
STATIC int NCR_700_slave_alloc(struct scsi_device *SDpnt);
|
||||
STATIC int NCR_700_slave_configure(struct scsi_device *SDpnt);
|
||||
STATIC void NCR_700_slave_destroy(struct scsi_device *SDpnt);
|
||||
STATIC int NCR_700_sdev_init(struct scsi_device *SDpnt);
|
||||
STATIC int NCR_700_sdev_configure(struct scsi_device *SDpnt,
|
||||
struct queue_limits *lim);
|
||||
STATIC void NCR_700_sdev_destroy(struct scsi_device *SDpnt);
|
||||
static int NCR_700_change_queue_depth(struct scsi_device *SDpnt, int depth);
|
||||
|
||||
STATIC const struct attribute_group *NCR_700_dev_groups[];
|
||||
|
@ -330,9 +331,9 @@ NCR_700_detect(struct scsi_host_template *tpnt,
|
|||
tpnt->can_queue = NCR_700_COMMAND_SLOTS_PER_HOST;
|
||||
tpnt->sg_tablesize = NCR_700_SG_SEGMENTS;
|
||||
tpnt->cmd_per_lun = NCR_700_CMD_PER_LUN;
|
||||
tpnt->slave_configure = NCR_700_slave_configure;
|
||||
tpnt->slave_destroy = NCR_700_slave_destroy;
|
||||
tpnt->slave_alloc = NCR_700_slave_alloc;
|
||||
tpnt->sdev_configure = NCR_700_sdev_configure;
|
||||
tpnt->sdev_destroy = NCR_700_sdev_destroy;
|
||||
tpnt->sdev_init = NCR_700_sdev_init;
|
||||
tpnt->change_queue_depth = NCR_700_change_queue_depth;
|
||||
|
||||
if(tpnt->name == NULL)
|
||||
|
@ -2017,7 +2018,7 @@ NCR_700_set_offset(struct scsi_target *STp, int offset)
|
|||
}
|
||||
|
||||
STATIC int
|
||||
NCR_700_slave_alloc(struct scsi_device *SDp)
|
||||
NCR_700_sdev_init(struct scsi_device *SDp)
|
||||
{
|
||||
SDp->hostdata = kzalloc(sizeof(struct NCR_700_Device_Parameters),
|
||||
GFP_KERNEL);
|
||||
|
@ -2029,7 +2030,7 @@ NCR_700_slave_alloc(struct scsi_device *SDp)
|
|||
}
|
||||
|
||||
STATIC int
|
||||
NCR_700_slave_configure(struct scsi_device *SDp)
|
||||
NCR_700_sdev_configure(struct scsi_device *SDp, struct queue_limits *lim)
|
||||
{
|
||||
struct NCR_700_Host_Parameters *hostdata =
|
||||
(struct NCR_700_Host_Parameters *)SDp->host->hostdata[0];
|
||||
|
@ -2052,7 +2053,7 @@ NCR_700_slave_configure(struct scsi_device *SDp)
|
|||
}
|
||||
|
||||
STATIC void
|
||||
NCR_700_slave_destroy(struct scsi_device *SDp)
|
||||
NCR_700_sdev_destroy(struct scsi_device *SDp)
|
||||
{
|
||||
kfree(SDp->hostdata);
|
||||
SDp->hostdata = NULL;
|
||||
|
|
|
@ -2153,14 +2153,15 @@ static void __init blogic_inithoststruct(struct blogic_adapter *adapter,
|
|||
}
|
||||
|
||||
/*
|
||||
blogic_slaveconfig will actually set the queue depth on individual
|
||||
blogic_sdev_configure will actually set the queue depth on individual
|
||||
scsi devices as they are permanently added to the device chain. We
|
||||
shamelessly rip off the SelectQueueDepths code to make this work mostly
|
||||
like it used to. Since we don't get called once at the end of the scan
|
||||
but instead get called for each device, we have to do things a bit
|
||||
differently.
|
||||
*/
|
||||
static int blogic_slaveconfig(struct scsi_device *dev)
|
||||
static int blogic_sdev_configure(struct scsi_device *dev,
|
||||
struct queue_limits *lim)
|
||||
{
|
||||
struct blogic_adapter *adapter =
|
||||
(struct blogic_adapter *) dev->host->hostdata;
|
||||
|
@ -3672,7 +3673,7 @@ static const struct scsi_host_template blogic_template = {
|
|||
.name = "BusLogic",
|
||||
.info = blogic_drvr_info,
|
||||
.queuecommand = blogic_qcmd,
|
||||
.slave_configure = blogic_slaveconfig,
|
||||
.sdev_configure = blogic_sdev_configure,
|
||||
.bios_param = blogic_diskparam,
|
||||
.eh_host_reset_handler = blogic_hostreset,
|
||||
#if 0
|
||||
|
@ -3715,7 +3716,7 @@ static void __exit blogic_exit(void)
|
|||
__setup("BusLogic=", blogic_setup);
|
||||
|
||||
#ifdef MODULE
|
||||
/*static struct pci_device_id blogic_pci_tbl[] = {
|
||||
/*static const struct pci_device_id blogic_pci_tbl[] = {
|
||||
{ PCI_VENDOR_ID_BUSLOGIC, PCI_DEVICE_ID_BUSLOGIC_MULTIMASTER,
|
||||
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
|
||||
{ PCI_VENDOR_ID_BUSLOGIC, PCI_DEVICE_ID_BUSLOGIC_MULTIMASTER_NC,
|
||||
|
|
|
@ -1274,7 +1274,8 @@ static inline void blogic_incszbucket(unsigned int *cmdsz_buckets,
|
|||
static const char *blogic_drvr_info(struct Scsi_Host *);
|
||||
static int blogic_qcmd(struct Scsi_Host *h, struct scsi_cmnd *);
|
||||
static int blogic_diskparam(struct scsi_device *, struct block_device *, sector_t, int *);
|
||||
static int blogic_slaveconfig(struct scsi_device *);
|
||||
static int blogic_sdev_configure(struct scsi_device *,
|
||||
struct queue_limits *lim);
|
||||
static void blogic_qcompleted_ccb(struct blogic_ccb *);
|
||||
static irqreturn_t blogic_inthandler(int, void *);
|
||||
static int blogic_resetadapter(struct blogic_adapter *, bool hard_reset);
|
||||
|
|
|
@ -1206,7 +1206,7 @@ static void inia100_remove_one(struct pci_dev *pdev)
|
|||
scsi_host_put(shost);
|
||||
}
|
||||
|
||||
static struct pci_device_id inia100_pci_tbl[] = {
|
||||
static const struct pci_device_id inia100_pci_tbl[] = {
|
||||
{PCI_VENDOR_ID_INIT, 0x1060, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
|
||||
{0,}
|
||||
};
|
||||
|
|
|
@ -377,15 +377,17 @@ static int aac_biosparm(struct scsi_device *sdev, struct block_device *bdev,
|
|||
}
|
||||
|
||||
/**
|
||||
* aac_slave_configure - compute queue depths
|
||||
* aac_sdev_configure - compute queue depths
|
||||
* @sdev: SCSI device we are considering
|
||||
* @lim: Request queue limits
|
||||
*
|
||||
* Selects queue depths for each target device based on the host adapter's
|
||||
* total capacity and the queue depth supported by the target device.
|
||||
* A queue depth of one automatically disables tagged queueing.
|
||||
*/
|
||||
|
||||
static int aac_slave_configure(struct scsi_device *sdev)
|
||||
static int aac_sdev_configure(struct scsi_device *sdev,
|
||||
struct queue_limits *lim)
|
||||
{
|
||||
struct aac_dev *aac = (struct aac_dev *)sdev->host->hostdata;
|
||||
int chn, tid;
|
||||
|
@ -1487,7 +1489,7 @@ static const struct scsi_host_template aac_driver_template = {
|
|||
.queuecommand = aac_queuecommand,
|
||||
.bios_param = aac_biosparm,
|
||||
.shost_groups = aac_host_groups,
|
||||
.slave_configure = aac_slave_configure,
|
||||
.sdev_configure = aac_sdev_configure,
|
||||
.change_queue_depth = aac_change_queue_depth,
|
||||
.sdev_groups = aac_dev_groups,
|
||||
.eh_abort_handler = aac_eh_abort,
|
||||
|
|
|
@ -4496,7 +4496,7 @@ static int AdvInitAsc3550Driver(ADV_DVC_VAR *asc_dvc)
|
|||
|
||||
/*
|
||||
* Microcode operating variables for WDTR, SDTR, and command tag
|
||||
* queuing will be set in slave_configure() based on what a
|
||||
* queuing will be set in sdev_configure() based on what a
|
||||
* device reports it is capable of in Inquiry byte 7.
|
||||
*
|
||||
* If SCSI Bus Resets have been disabled, then directly set
|
||||
|
@ -5013,7 +5013,7 @@ static int AdvInitAsc38C0800Driver(ADV_DVC_VAR *asc_dvc)
|
|||
|
||||
/*
|
||||
* Microcode operating variables for WDTR, SDTR, and command tag
|
||||
* queuing will be set in slave_configure() based on what a
|
||||
* queuing will be set in sdev_configure() based on what a
|
||||
* device reports it is capable of in Inquiry byte 7.
|
||||
*
|
||||
* If SCSI Bus Resets have been disabled, then directly set
|
||||
|
@ -5508,7 +5508,7 @@ static int AdvInitAsc38C1600Driver(ADV_DVC_VAR *asc_dvc)
|
|||
|
||||
/*
|
||||
* Microcode operating variables for WDTR, SDTR, and command tag
|
||||
* queuing will be set in slave_configure() based on what a
|
||||
* queuing will be set in sdev_configure() based on what a
|
||||
* device reports it is capable of in Inquiry byte 7.
|
||||
*
|
||||
* If SCSI Bus Resets have been disabled, then directly set
|
||||
|
@ -7219,7 +7219,7 @@ static void AscAsyncFix(ASC_DVC_VAR *asc_dvc, struct scsi_device *sdev)
|
|||
}
|
||||
|
||||
static void
|
||||
advansys_narrow_slave_configure(struct scsi_device *sdev, ASC_DVC_VAR *asc_dvc)
|
||||
advansys_narrow_sdev_configure(struct scsi_device *sdev, ASC_DVC_VAR *asc_dvc)
|
||||
{
|
||||
ASC_SCSI_BIT_ID_TYPE tid_bit = 1 << sdev->id;
|
||||
ASC_SCSI_BIT_ID_TYPE orig_use_tagged_qng = asc_dvc->use_tagged_qng;
|
||||
|
@ -7345,7 +7345,7 @@ static void advansys_wide_enable_ppr(ADV_DVC_VAR *adv_dvc,
|
|||
}
|
||||
|
||||
static void
|
||||
advansys_wide_slave_configure(struct scsi_device *sdev, ADV_DVC_VAR *adv_dvc)
|
||||
advansys_wide_sdev_configure(struct scsi_device *sdev, ADV_DVC_VAR *adv_dvc)
|
||||
{
|
||||
AdvPortAddr iop_base = adv_dvc->iop_base;
|
||||
unsigned short tidmask = 1 << sdev->id;
|
||||
|
@ -7391,16 +7391,17 @@ advansys_wide_slave_configure(struct scsi_device *sdev, ADV_DVC_VAR *adv_dvc)
|
|||
* Set the number of commands to queue per device for the
|
||||
* specified host adapter.
|
||||
*/
|
||||
static int advansys_slave_configure(struct scsi_device *sdev)
|
||||
static int advansys_sdev_configure(struct scsi_device *sdev,
|
||||
struct queue_limits *lim)
|
||||
{
|
||||
struct asc_board *boardp = shost_priv(sdev->host);
|
||||
|
||||
if (ASC_NARROW_BOARD(boardp))
|
||||
advansys_narrow_slave_configure(sdev,
|
||||
&boardp->dvc_var.asc_dvc_var);
|
||||
advansys_narrow_sdev_configure(sdev,
|
||||
&boardp->dvc_var.asc_dvc_var);
|
||||
else
|
||||
advansys_wide_slave_configure(sdev,
|
||||
&boardp->dvc_var.adv_dvc_var);
|
||||
advansys_wide_sdev_configure(sdev,
|
||||
&boardp->dvc_var.adv_dvc_var);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -10612,7 +10613,7 @@ static const struct scsi_host_template advansys_template = {
|
|||
.queuecommand = advansys_queuecommand,
|
||||
.eh_host_reset_handler = advansys_reset,
|
||||
.bios_param = advansys_biosparam,
|
||||
.slave_configure = advansys_slave_configure,
|
||||
.sdev_configure = advansys_sdev_configure,
|
||||
.cmd_size = sizeof(struct advansys_cmd),
|
||||
};
|
||||
|
||||
|
@ -11408,7 +11409,7 @@ static struct eisa_driver advansys_eisa_driver = {
|
|||
};
|
||||
|
||||
/* PCI Devices supported by this driver */
|
||||
static struct pci_device_id advansys_pci_tbl[] = {
|
||||
static const struct pci_device_id advansys_pci_tbl[] = {
|
||||
{PCI_VENDOR_ID_ASP, PCI_DEVICE_ID_ASP_1200A,
|
||||
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
|
||||
{PCI_VENDOR_ID_ASP, PCI_DEVICE_ID_ASP_ABP940,
|
||||
|
|
|
@ -672,7 +672,7 @@ ahd_linux_target_destroy(struct scsi_target *starget)
|
|||
}
|
||||
|
||||
static int
|
||||
ahd_linux_slave_alloc(struct scsi_device *sdev)
|
||||
ahd_linux_sdev_init(struct scsi_device *sdev)
|
||||
{
|
||||
struct ahd_softc *ahd =
|
||||
*((struct ahd_softc **)sdev->host->hostdata);
|
||||
|
@ -701,7 +701,7 @@ ahd_linux_slave_alloc(struct scsi_device *sdev)
|
|||
}
|
||||
|
||||
static int
|
||||
ahd_linux_slave_configure(struct scsi_device *sdev)
|
||||
ahd_linux_sdev_configure(struct scsi_device *sdev, struct queue_limits *lim)
|
||||
{
|
||||
if (bootverbose)
|
||||
sdev_printk(KERN_INFO, sdev, "Slave Configure\n");
|
||||
|
@ -906,8 +906,8 @@ struct scsi_host_template aic79xx_driver_template = {
|
|||
.this_id = -1,
|
||||
.max_sectors = 8192,
|
||||
.cmd_per_lun = 2,
|
||||
.slave_alloc = ahd_linux_slave_alloc,
|
||||
.slave_configure = ahd_linux_slave_configure,
|
||||
.sdev_init = ahd_linux_sdev_init,
|
||||
.sdev_configure = ahd_linux_sdev_configure,
|
||||
.target_alloc = ahd_linux_target_alloc,
|
||||
.target_destroy = ahd_linux_target_destroy,
|
||||
};
|
||||
|
|
|
@ -632,7 +632,7 @@ ahc_linux_target_destroy(struct scsi_target *starget)
|
|||
}
|
||||
|
||||
static int
|
||||
ahc_linux_slave_alloc(struct scsi_device *sdev)
|
||||
ahc_linux_sdev_init(struct scsi_device *sdev)
|
||||
{
|
||||
struct ahc_softc *ahc =
|
||||
*((struct ahc_softc **)sdev->host->hostdata);
|
||||
|
@ -664,7 +664,7 @@ ahc_linux_slave_alloc(struct scsi_device *sdev)
|
|||
}
|
||||
|
||||
static int
|
||||
ahc_linux_slave_configure(struct scsi_device *sdev)
|
||||
ahc_linux_sdev_configure(struct scsi_device *sdev, struct queue_limits *lim)
|
||||
{
|
||||
if (bootverbose)
|
||||
sdev_printk(KERN_INFO, sdev, "Slave Configure\n");
|
||||
|
@ -791,8 +791,8 @@ struct scsi_host_template aic7xxx_driver_template = {
|
|||
.this_id = -1,
|
||||
.max_sectors = 8192,
|
||||
.cmd_per_lun = 2,
|
||||
.slave_alloc = ahc_linux_slave_alloc,
|
||||
.slave_configure = ahc_linux_slave_configure,
|
||||
.sdev_init = ahc_linux_sdev_init,
|
||||
.sdev_configure = ahc_linux_sdev_configure,
|
||||
.target_alloc = ahc_linux_target_alloc,
|
||||
.target_destroy = ahc_linux_target_destroy,
|
||||
};
|
||||
|
|
|
@ -102,6 +102,7 @@ static void add_conditional(symbol_t *symbol);
|
|||
static void add_version(const char *verstring);
|
||||
static int is_download_const(expression_t *immed);
|
||||
static int is_location_address(symbol_t *symbol);
|
||||
int yylex();
|
||||
void yyerror(const char *string);
|
||||
|
||||
#define SRAM_SYMNAME "SRAM_BASE"
|
||||
|
|
|
@ -61,6 +61,7 @@
|
|||
static symbol_t *macro_symbol;
|
||||
|
||||
static void add_macro_arg(const char *argtext, int position);
|
||||
int mmlex();
|
||||
void mmerror(const char *string);
|
||||
|
||||
%}
|
||||
|
|
|
@ -64,6 +64,9 @@ static char *string_buf_ptr;
|
|||
static int parren_count;
|
||||
static int quote_count;
|
||||
static char buf[255];
|
||||
void mm_switch_to_buffer(YY_BUFFER_STATE);
|
||||
void mmparse();
|
||||
void mm_delete_buffer(YY_BUFFER_STATE);
|
||||
%}
|
||||
|
||||
PATH ([/]*[-A-Za-z0-9_.])+
|
||||
|
|
|
@ -513,7 +513,7 @@ static void pci_esp_remove_one(struct pci_dev *pdev)
|
|||
scsi_host_put(esp->host);
|
||||
}
|
||||
|
||||
static struct pci_device_id am53c974_pci_tbl[] = {
|
||||
static const struct pci_device_id am53c974_pci_tbl[] = {
|
||||
{ PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_SCSI,
|
||||
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
|
||||
{ }
|
||||
|
|
|
@ -60,7 +60,7 @@
|
|||
|
||||
static ssize_t arcmsr_sysfs_iop_message_read(struct file *filp,
|
||||
struct kobject *kobj,
|
||||
struct bin_attribute *bin,
|
||||
const struct bin_attribute *bin,
|
||||
char *buf, loff_t off,
|
||||
size_t count)
|
||||
{
|
||||
|
@ -107,7 +107,7 @@ static ssize_t arcmsr_sysfs_iop_message_read(struct file *filp,
|
|||
|
||||
static ssize_t arcmsr_sysfs_iop_message_write(struct file *filp,
|
||||
struct kobject *kobj,
|
||||
struct bin_attribute *bin,
|
||||
const struct bin_attribute *bin,
|
||||
char *buf, loff_t off,
|
||||
size_t count)
|
||||
{
|
||||
|
@ -155,7 +155,7 @@ static ssize_t arcmsr_sysfs_iop_message_write(struct file *filp,
|
|||
|
||||
static ssize_t arcmsr_sysfs_iop_message_clear(struct file *filp,
|
||||
struct kobject *kobj,
|
||||
struct bin_attribute *bin,
|
||||
const struct bin_attribute *bin,
|
||||
char *buf, loff_t off,
|
||||
size_t count)
|
||||
{
|
||||
|
@ -194,7 +194,7 @@ static const struct bin_attribute arcmsr_sysfs_message_read_attr = {
|
|||
.mode = S_IRUSR ,
|
||||
},
|
||||
.size = ARCMSR_API_DATA_BUFLEN,
|
||||
.read = arcmsr_sysfs_iop_message_read,
|
||||
.read_new = arcmsr_sysfs_iop_message_read,
|
||||
};
|
||||
|
||||
static const struct bin_attribute arcmsr_sysfs_message_write_attr = {
|
||||
|
@ -203,7 +203,7 @@ static const struct bin_attribute arcmsr_sysfs_message_write_attr = {
|
|||
.mode = S_IWUSR,
|
||||
},
|
||||
.size = ARCMSR_API_DATA_BUFLEN,
|
||||
.write = arcmsr_sysfs_iop_message_write,
|
||||
.write_new = arcmsr_sysfs_iop_message_write,
|
||||
};
|
||||
|
||||
static const struct bin_attribute arcmsr_sysfs_message_clear_attr = {
|
||||
|
@ -212,7 +212,7 @@ static const struct bin_attribute arcmsr_sysfs_message_clear_attr = {
|
|||
.mode = S_IWUSR,
|
||||
},
|
||||
.size = 1,
|
||||
.write = arcmsr_sysfs_iop_message_clear,
|
||||
.write_new = arcmsr_sysfs_iop_message_clear,
|
||||
};
|
||||
|
||||
int arcmsr_alloc_sysfs_attr(struct AdapterControlBlock *acb)
|
||||
|
|
|
@ -143,7 +143,8 @@ static irqreturn_t arcmsr_interrupt(struct AdapterControlBlock *acb);
|
|||
static void arcmsr_free_irq(struct pci_dev *, struct AdapterControlBlock *);
|
||||
static void arcmsr_wait_firmware_ready(struct AdapterControlBlock *acb);
|
||||
static void arcmsr_set_iop_datetime(struct timer_list *);
|
||||
static int arcmsr_slave_config(struct scsi_device *sdev);
|
||||
static int arcmsr_sdev_configure(struct scsi_device *sdev,
|
||||
struct queue_limits *lim);
|
||||
static int arcmsr_adjust_disk_queue_depth(struct scsi_device *sdev, int queue_depth)
|
||||
{
|
||||
if (queue_depth > ARCMSR_MAX_CMD_PERLUN)
|
||||
|
@ -160,7 +161,7 @@ static const struct scsi_host_template arcmsr_scsi_host_template = {
|
|||
.eh_abort_handler = arcmsr_abort,
|
||||
.eh_bus_reset_handler = arcmsr_bus_reset,
|
||||
.bios_param = arcmsr_bios_param,
|
||||
.slave_configure = arcmsr_slave_config,
|
||||
.sdev_configure = arcmsr_sdev_configure,
|
||||
.change_queue_depth = arcmsr_adjust_disk_queue_depth,
|
||||
.can_queue = ARCMSR_DEFAULT_OUTSTANDING_CMD,
|
||||
.this_id = ARCMSR_SCSI_INITIATOR_ID,
|
||||
|
@ -171,7 +172,7 @@ static const struct scsi_host_template arcmsr_scsi_host_template = {
|
|||
.no_write_same = 1,
|
||||
};
|
||||
|
||||
static struct pci_device_id arcmsr_device_id_table[] = {
|
||||
static const struct pci_device_id arcmsr_device_id_table[] = {
|
||||
{PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1110),
|
||||
.driver_data = ACB_ADAPTER_TYPE_A},
|
||||
{PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1120),
|
||||
|
@ -3344,7 +3345,8 @@ static int arcmsr_queue_command_lck(struct scsi_cmnd *cmd)
|
|||
|
||||
static DEF_SCSI_QCMD(arcmsr_queue_command)
|
||||
|
||||
static int arcmsr_slave_config(struct scsi_device *sdev)
|
||||
static int arcmsr_sdev_configure(struct scsi_device *sdev,
|
||||
struct queue_limits *lim)
|
||||
{
|
||||
unsigned int dev_timeout;
|
||||
|
||||
|
|
|
@ -1743,7 +1743,7 @@ static const struct scsi_host_template atp870u_template = {
|
|||
.max_sectors = ATP870U_MAX_SECTORS,
|
||||
};
|
||||
|
||||
static struct pci_device_id atp870u_id_table[] = {
|
||||
static const struct pci_device_id atp870u_id_table[] = {
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_ARTOP, ATP885_DEVID) },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_ARTOP, ATP880_DEVID1) },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_ARTOP, ATP880_DEVID2) },
|
||||
|
|
|
@ -25,7 +25,7 @@ struct scsi_transport_template *bfad_im_scsi_transport_template;
|
|||
struct scsi_transport_template *bfad_im_scsi_vport_transport_template;
|
||||
static void bfad_im_itnim_work_handler(struct work_struct *work);
|
||||
static int bfad_im_queuecommand(struct Scsi_Host *h, struct scsi_cmnd *cmnd);
|
||||
static int bfad_im_slave_alloc(struct scsi_device *sdev);
|
||||
static int bfad_im_sdev_init(struct scsi_device *sdev);
|
||||
static void bfad_im_fc_rport_add(struct bfad_im_port_s *im_port,
|
||||
struct bfad_itnim_s *itnim);
|
||||
|
||||
|
@ -404,10 +404,10 @@ bfad_im_reset_target_handler(struct scsi_cmnd *cmnd)
|
|||
}
|
||||
|
||||
/*
|
||||
* Scsi_Host template entry slave_destroy.
|
||||
* Scsi_Host template entry sdev_destroy.
|
||||
*/
|
||||
static void
|
||||
bfad_im_slave_destroy(struct scsi_device *sdev)
|
||||
bfad_im_sdev_destroy(struct scsi_device *sdev)
|
||||
{
|
||||
sdev->hostdata = NULL;
|
||||
return;
|
||||
|
@ -783,7 +783,7 @@ bfad_thread_workq(struct bfad_s *bfad)
|
|||
* Return non-zero if fails.
|
||||
*/
|
||||
static int
|
||||
bfad_im_slave_configure(struct scsi_device *sdev)
|
||||
bfad_im_sdev_configure(struct scsi_device *sdev, struct queue_limits *lim)
|
||||
{
|
||||
scsi_change_queue_depth(sdev, bfa_lun_queue_depth);
|
||||
return 0;
|
||||
|
@ -800,9 +800,9 @@ struct scsi_host_template bfad_im_scsi_host_template = {
|
|||
.eh_device_reset_handler = bfad_im_reset_lun_handler,
|
||||
.eh_target_reset_handler = bfad_im_reset_target_handler,
|
||||
|
||||
.slave_alloc = bfad_im_slave_alloc,
|
||||
.slave_configure = bfad_im_slave_configure,
|
||||
.slave_destroy = bfad_im_slave_destroy,
|
||||
.sdev_init = bfad_im_sdev_init,
|
||||
.sdev_configure = bfad_im_sdev_configure,
|
||||
.sdev_destroy = bfad_im_sdev_destroy,
|
||||
|
||||
.this_id = -1,
|
||||
.sg_tablesize = BFAD_IO_MAX_SGE,
|
||||
|
@ -823,9 +823,9 @@ struct scsi_host_template bfad_im_vport_template = {
|
|||
.eh_device_reset_handler = bfad_im_reset_lun_handler,
|
||||
.eh_target_reset_handler = bfad_im_reset_target_handler,
|
||||
|
||||
.slave_alloc = bfad_im_slave_alloc,
|
||||
.slave_configure = bfad_im_slave_configure,
|
||||
.slave_destroy = bfad_im_slave_destroy,
|
||||
.sdev_init = bfad_im_sdev_init,
|
||||
.sdev_configure = bfad_im_sdev_configure,
|
||||
.sdev_destroy = bfad_im_sdev_destroy,
|
||||
|
||||
.this_id = -1,
|
||||
.sg_tablesize = BFAD_IO_MAX_SGE,
|
||||
|
@ -915,7 +915,7 @@ bfad_get_itnim(struct bfad_im_port_s *im_port, int id)
|
|||
}
|
||||
|
||||
/*
|
||||
* Function is invoked from the SCSI Host Template slave_alloc() entry point.
|
||||
* Function is invoked from the SCSI Host Template sdev_init() entry point.
|
||||
* Has the logic to query the LUN Mask database to check if this LUN needs to
|
||||
* be made visible to the SCSI mid-layer or not.
|
||||
*
|
||||
|
@ -946,10 +946,10 @@ bfad_im_check_if_make_lun_visible(struct scsi_device *sdev,
|
|||
}
|
||||
|
||||
/*
|
||||
* Scsi_Host template entry slave_alloc
|
||||
* Scsi_Host template entry sdev_init
|
||||
*/
|
||||
static int
|
||||
bfad_im_slave_alloc(struct scsi_device *sdev)
|
||||
bfad_im_sdev_init(struct scsi_device *sdev)
|
||||
{
|
||||
struct fc_rport *rport = starget_to_rport(scsi_target(sdev));
|
||||
struct bfad_itnim_data_s *itnim_data;
|
||||
|
|
|
@ -2610,14 +2610,11 @@ static int bnx2fc_cpu_online(unsigned int cpu)
|
|||
|
||||
p = &per_cpu(bnx2fc_percpu, cpu);
|
||||
|
||||
thread = kthread_create_on_node(bnx2fc_percpu_io_thread,
|
||||
(void *)p, cpu_to_node(cpu),
|
||||
"bnx2fc_thread/%d", cpu);
|
||||
thread = kthread_create_on_cpu(bnx2fc_percpu_io_thread,
|
||||
(void *)p, cpu, "bnx2fc_thread/%d");
|
||||
if (IS_ERR(thread))
|
||||
return PTR_ERR(thread);
|
||||
|
||||
/* bind thread to the cpu */
|
||||
kthread_bind(thread, cpu);
|
||||
p->iothread = thread;
|
||||
wake_up_process(thread);
|
||||
return 0;
|
||||
|
@ -2652,7 +2649,8 @@ static int bnx2fc_cpu_offline(unsigned int cpu)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int bnx2fc_slave_configure(struct scsi_device *sdev)
|
||||
static int bnx2fc_sdev_configure(struct scsi_device *sdev,
|
||||
struct queue_limits *lim)
|
||||
{
|
||||
if (!bnx2fc_queue_depth)
|
||||
return 0;
|
||||
|
@ -2951,7 +2949,7 @@ static struct scsi_host_template bnx2fc_shost_template = {
|
|||
.eh_device_reset_handler = bnx2fc_eh_device_reset, /* lun reset */
|
||||
.eh_target_reset_handler = bnx2fc_eh_target_reset, /* tgt reset */
|
||||
.eh_host_reset_handler = fc_eh_host_reset,
|
||||
.slave_alloc = fc_slave_alloc,
|
||||
.sdev_init = fc_sdev_init,
|
||||
.change_queue_depth = scsi_change_queue_depth,
|
||||
.this_id = -1,
|
||||
.cmd_per_lun = 3,
|
||||
|
@ -2959,7 +2957,7 @@ static struct scsi_host_template bnx2fc_shost_template = {
|
|||
.dma_boundary = 0x7fff,
|
||||
.max_sectors = 0x3fbf,
|
||||
.track_queue_depth = 1,
|
||||
.slave_configure = bnx2fc_slave_configure,
|
||||
.sdev_configure = bnx2fc_sdev_configure,
|
||||
.shost_groups = bnx2fc_host_groups,
|
||||
.cmd_size = sizeof(struct bnx2fc_priv),
|
||||
};
|
||||
|
|
|
@ -415,14 +415,11 @@ static int bnx2i_cpu_online(unsigned int cpu)
|
|||
|
||||
p = &per_cpu(bnx2i_percpu, cpu);
|
||||
|
||||
thread = kthread_create_on_node(bnx2i_percpu_io_thread, (void *)p,
|
||||
cpu_to_node(cpu),
|
||||
"bnx2i_thread/%d", cpu);
|
||||
thread = kthread_create_on_cpu(bnx2i_percpu_io_thread, (void *)p,
|
||||
cpu, "bnx2i_thread/%d");
|
||||
if (IS_ERR(thread))
|
||||
return PTR_ERR(thread);
|
||||
|
||||
/* bind thread to the cpu */
|
||||
kthread_bind(thread, cpu);
|
||||
p->iothread = thread;
|
||||
wake_up_process(thread);
|
||||
return 0;
|
||||
|
|
|
@ -800,7 +800,7 @@ csio_scsis_io_active(struct csio_ioreq *req, enum csio_scsi_ev evt)
|
|||
rn = req->rnode;
|
||||
/*
|
||||
* FW says remote device is lost, but rnode
|
||||
* doesnt reflect it.
|
||||
* doesn't reflect it.
|
||||
*/
|
||||
if (csio_scsi_itnexus_loss_error(req->wr_status) &&
|
||||
csio_is_rnode_ready(rn)) {
|
||||
|
@ -2224,7 +2224,7 @@ fail:
|
|||
}
|
||||
|
||||
static int
|
||||
csio_slave_alloc(struct scsi_device *sdev)
|
||||
csio_sdev_init(struct scsi_device *sdev)
|
||||
{
|
||||
struct fc_rport *rport = starget_to_rport(scsi_target(sdev));
|
||||
|
||||
|
@ -2237,14 +2237,14 @@ csio_slave_alloc(struct scsi_device *sdev)
|
|||
}
|
||||
|
||||
static int
|
||||
csio_slave_configure(struct scsi_device *sdev)
|
||||
csio_sdev_configure(struct scsi_device *sdev, struct queue_limits *lim)
|
||||
{
|
||||
scsi_change_queue_depth(sdev, csio_lun_qdepth);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
csio_slave_destroy(struct scsi_device *sdev)
|
||||
csio_sdev_destroy(struct scsi_device *sdev)
|
||||
{
|
||||
sdev->hostdata = NULL;
|
||||
}
|
||||
|
@ -2276,9 +2276,9 @@ struct scsi_host_template csio_fcoe_shost_template = {
|
|||
.eh_timed_out = fc_eh_timed_out,
|
||||
.eh_abort_handler = csio_eh_abort_handler,
|
||||
.eh_device_reset_handler = csio_eh_lun_reset_handler,
|
||||
.slave_alloc = csio_slave_alloc,
|
||||
.slave_configure = csio_slave_configure,
|
||||
.slave_destroy = csio_slave_destroy,
|
||||
.sdev_init = csio_sdev_init,
|
||||
.sdev_configure = csio_sdev_configure,
|
||||
.sdev_destroy = csio_sdev_destroy,
|
||||
.scan_finished = csio_scan_finished,
|
||||
.this_id = -1,
|
||||
.sg_tablesize = CSIO_SCSI_MAX_SGE,
|
||||
|
@ -2295,9 +2295,9 @@ struct scsi_host_template csio_fcoe_shost_vport_template = {
|
|||
.eh_timed_out = fc_eh_timed_out,
|
||||
.eh_abort_handler = csio_eh_abort_handler,
|
||||
.eh_device_reset_handler = csio_eh_lun_reset_handler,
|
||||
.slave_alloc = csio_slave_alloc,
|
||||
.slave_configure = csio_slave_configure,
|
||||
.slave_destroy = csio_slave_destroy,
|
||||
.sdev_init = csio_sdev_init,
|
||||
.sdev_configure = csio_sdev_configure,
|
||||
.sdev_destroy = csio_sdev_destroy,
|
||||
.scan_finished = csio_scan_finished,
|
||||
.this_id = -1,
|
||||
.sg_tablesize = CSIO_SCSI_MAX_SGE,
|
||||
|
|
|
@ -3177,7 +3177,7 @@ static struct dev_dependent_vals dev_briard_vals = { CXLFLASH_MAX_SECTORS,
|
|||
/*
|
||||
* PCI device binding table
|
||||
*/
|
||||
static struct pci_device_id cxlflash_pci_table[] = {
|
||||
static const struct pci_device_id cxlflash_pci_table[] = {
|
||||
{PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_CORSA,
|
||||
PCI_ANY_ID, PCI_ANY_ID, 0, 0, (kernel_ulong_t)&dev_corsa_vals},
|
||||
{PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_FLASH_GT,
|
||||
|
|
|
@ -3715,13 +3715,13 @@ static void adapter_remove_and_free_all_devices(struct AdapterCtlBlk* acb)
|
|||
|
||||
|
||||
/**
|
||||
* dc395x_slave_alloc - Called by the scsi mid layer to tell us about a new
|
||||
* dc395x_sdev_init - Called by the scsi mid layer to tell us about a new
|
||||
* scsi device that we need to deal with. We allocate a new device and then
|
||||
* insert that device into the adapters device list.
|
||||
*
|
||||
* @scsi_device: The new scsi device that we need to handle.
|
||||
**/
|
||||
static int dc395x_slave_alloc(struct scsi_device *scsi_device)
|
||||
static int dc395x_sdev_init(struct scsi_device *scsi_device)
|
||||
{
|
||||
struct AdapterCtlBlk *acb = (struct AdapterCtlBlk *)scsi_device->host->hostdata;
|
||||
struct DeviceCtlBlk *dcb;
|
||||
|
@ -3736,12 +3736,12 @@ static int dc395x_slave_alloc(struct scsi_device *scsi_device)
|
|||
|
||||
|
||||
/**
|
||||
* dc395x_slave_destroy - Called by the scsi mid layer to tell us about a
|
||||
* dc395x_sdev_destroy - Called by the scsi mid layer to tell us about a
|
||||
* device that is going away.
|
||||
*
|
||||
* @scsi_device: The new scsi device that we need to handle.
|
||||
**/
|
||||
static void dc395x_slave_destroy(struct scsi_device *scsi_device)
|
||||
static void dc395x_sdev_destroy(struct scsi_device *scsi_device)
|
||||
{
|
||||
struct AdapterCtlBlk *acb = (struct AdapterCtlBlk *)scsi_device->host->hostdata;
|
||||
struct DeviceCtlBlk *dcb = find_dcb(acb, scsi_device->id, scsi_device->lun);
|
||||
|
@ -4547,8 +4547,8 @@ static const struct scsi_host_template dc395x_driver_template = {
|
|||
.show_info = dc395x_show_info,
|
||||
.name = DC395X_BANNER " " DC395X_VERSION,
|
||||
.queuecommand = dc395x_queue_command,
|
||||
.slave_alloc = dc395x_slave_alloc,
|
||||
.slave_destroy = dc395x_slave_destroy,
|
||||
.sdev_init = dc395x_sdev_init,
|
||||
.sdev_destroy = dc395x_sdev_destroy,
|
||||
.can_queue = DC395x_MAX_CAN_QUEUE,
|
||||
.this_id = 7,
|
||||
.sg_tablesize = DC395x_MAX_SG_TABLESIZE,
|
||||
|
@ -4668,7 +4668,7 @@ static void dc395x_remove_one(struct pci_dev *dev)
|
|||
}
|
||||
|
||||
|
||||
static struct pci_device_id dc395x_pci_table[] = {
|
||||
static const struct pci_device_id dc395x_pci_table[] = {
|
||||
{
|
||||
.vendor = PCI_VENDOR_ID_TEKRAM,
|
||||
.device = PCI_DEVICE_ID_TEKRAM_TRMS1040,
|
||||
|
|
|
@ -127,7 +127,7 @@ static void dmx3191d_remove_one(struct pci_dev *pdev)
|
|||
pci_disable_device(pdev);
|
||||
}
|
||||
|
||||
static struct pci_device_id dmx3191d_pci_tbl[] = {
|
||||
static const struct pci_device_id dmx3191d_pci_tbl[] = {
|
||||
{PCI_VENDOR_ID_DOMEX, PCI_DEVICE_ID_DOMEX_DMX3191D,
|
||||
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 4},
|
||||
{ }
|
||||
|
|
|
@ -470,7 +470,7 @@ out:
|
|||
return rc;
|
||||
}
|
||||
|
||||
static struct pci_device_id efct_pci_table[] = {
|
||||
static const struct pci_device_id efct_pci_table[] = {
|
||||
{PCI_DEVICE(EFCT_VENDOR_ID, EFCT_DEVICE_LANCER_G6), 0},
|
||||
{PCI_DEVICE(EFCT_VENDOR_ID, EFCT_DEVICE_LANCER_G7), 0},
|
||||
{} /* terminate list */
|
||||
|
|
|
@ -1411,11 +1411,11 @@ static inline void esas2r_comp_list_drain(struct esas2r_adapter *a,
|
|||
}
|
||||
|
||||
/* sysfs handlers */
|
||||
extern struct bin_attribute bin_attr_fw;
|
||||
extern struct bin_attribute bin_attr_fs;
|
||||
extern struct bin_attribute bin_attr_vda;
|
||||
extern struct bin_attribute bin_attr_hw;
|
||||
extern struct bin_attribute bin_attr_live_nvram;
|
||||
extern struct bin_attribute bin_attr_default_nvram;
|
||||
extern const struct bin_attribute bin_attr_fw;
|
||||
extern const struct bin_attribute bin_attr_fs;
|
||||
extern const struct bin_attribute bin_attr_vda;
|
||||
extern const struct bin_attribute bin_attr_hw;
|
||||
extern const struct bin_attribute bin_attr_live_nvram;
|
||||
extern const struct bin_attribute bin_attr_default_nvram;
|
||||
|
||||
#endif /* ESAS2R_H */
|
||||
|
|
|
@ -66,7 +66,7 @@ static struct esas2r_adapter *esas2r_adapter_from_kobj(struct kobject *kobj)
|
|||
}
|
||||
|
||||
static ssize_t read_fw(struct file *file, struct kobject *kobj,
|
||||
struct bin_attribute *attr,
|
||||
const struct bin_attribute *attr,
|
||||
char *buf, loff_t off, size_t count)
|
||||
{
|
||||
struct esas2r_adapter *a = esas2r_adapter_from_kobj(kobj);
|
||||
|
@ -75,7 +75,7 @@ static ssize_t read_fw(struct file *file, struct kobject *kobj,
|
|||
}
|
||||
|
||||
static ssize_t write_fw(struct file *file, struct kobject *kobj,
|
||||
struct bin_attribute *attr,
|
||||
const struct bin_attribute *attr,
|
||||
char *buf, loff_t off, size_t count)
|
||||
{
|
||||
struct esas2r_adapter *a = esas2r_adapter_from_kobj(kobj);
|
||||
|
@ -84,7 +84,7 @@ static ssize_t write_fw(struct file *file, struct kobject *kobj,
|
|||
}
|
||||
|
||||
static ssize_t read_fs(struct file *file, struct kobject *kobj,
|
||||
struct bin_attribute *attr,
|
||||
const struct bin_attribute *attr,
|
||||
char *buf, loff_t off, size_t count)
|
||||
{
|
||||
struct esas2r_adapter *a = esas2r_adapter_from_kobj(kobj);
|
||||
|
@ -93,7 +93,7 @@ static ssize_t read_fs(struct file *file, struct kobject *kobj,
|
|||
}
|
||||
|
||||
static ssize_t write_fs(struct file *file, struct kobject *kobj,
|
||||
struct bin_attribute *attr,
|
||||
const struct bin_attribute *attr,
|
||||
char *buf, loff_t off, size_t count)
|
||||
{
|
||||
struct esas2r_adapter *a = esas2r_adapter_from_kobj(kobj);
|
||||
|
@ -109,7 +109,7 @@ static ssize_t write_fs(struct file *file, struct kobject *kobj,
|
|||
}
|
||||
|
||||
static ssize_t read_vda(struct file *file, struct kobject *kobj,
|
||||
struct bin_attribute *attr,
|
||||
const struct bin_attribute *attr,
|
||||
char *buf, loff_t off, size_t count)
|
||||
{
|
||||
struct esas2r_adapter *a = esas2r_adapter_from_kobj(kobj);
|
||||
|
@ -118,7 +118,7 @@ static ssize_t read_vda(struct file *file, struct kobject *kobj,
|
|||
}
|
||||
|
||||
static ssize_t write_vda(struct file *file, struct kobject *kobj,
|
||||
struct bin_attribute *attr,
|
||||
const struct bin_attribute *attr,
|
||||
char *buf, loff_t off, size_t count)
|
||||
{
|
||||
struct esas2r_adapter *a = esas2r_adapter_from_kobj(kobj);
|
||||
|
@ -127,7 +127,7 @@ static ssize_t write_vda(struct file *file, struct kobject *kobj,
|
|||
}
|
||||
|
||||
static ssize_t read_live_nvram(struct file *file, struct kobject *kobj,
|
||||
struct bin_attribute *attr,
|
||||
const struct bin_attribute *attr,
|
||||
char *buf, loff_t off, size_t count)
|
||||
{
|
||||
struct esas2r_adapter *a = esas2r_adapter_from_kobj(kobj);
|
||||
|
@ -138,7 +138,7 @@ static ssize_t read_live_nvram(struct file *file, struct kobject *kobj,
|
|||
}
|
||||
|
||||
static ssize_t write_live_nvram(struct file *file, struct kobject *kobj,
|
||||
struct bin_attribute *attr,
|
||||
const struct bin_attribute *attr,
|
||||
char *buf, loff_t off, size_t count)
|
||||
{
|
||||
struct esas2r_adapter *a = esas2r_adapter_from_kobj(kobj);
|
||||
|
@ -158,7 +158,7 @@ static ssize_t write_live_nvram(struct file *file, struct kobject *kobj,
|
|||
}
|
||||
|
||||
static ssize_t read_default_nvram(struct file *file, struct kobject *kobj,
|
||||
struct bin_attribute *attr,
|
||||
const struct bin_attribute *attr,
|
||||
char *buf, loff_t off, size_t count)
|
||||
{
|
||||
struct esas2r_adapter *a = esas2r_adapter_from_kobj(kobj);
|
||||
|
@ -169,7 +169,7 @@ static ssize_t read_default_nvram(struct file *file, struct kobject *kobj,
|
|||
}
|
||||
|
||||
static ssize_t read_hw(struct file *file, struct kobject *kobj,
|
||||
struct bin_attribute *attr,
|
||||
const struct bin_attribute *attr,
|
||||
char *buf, loff_t off, size_t count)
|
||||
{
|
||||
struct esas2r_adapter *a = esas2r_adapter_from_kobj(kobj);
|
||||
|
@ -187,7 +187,7 @@ static ssize_t read_hw(struct file *file, struct kobject *kobj,
|
|||
}
|
||||
|
||||
static ssize_t write_hw(struct file *file, struct kobject *kobj,
|
||||
struct bin_attribute *attr,
|
||||
const struct bin_attribute *attr,
|
||||
char *buf, loff_t off, size_t count)
|
||||
{
|
||||
struct esas2r_adapter *a = esas2r_adapter_from_kobj(kobj);
|
||||
|
@ -211,12 +211,12 @@ static ssize_t write_hw(struct file *file, struct kobject *kobj,
|
|||
}
|
||||
|
||||
#define ESAS2R_RW_BIN_ATTR(_name) \
|
||||
struct bin_attribute bin_attr_ ## _name = { \
|
||||
const struct bin_attribute bin_attr_ ## _name = { \
|
||||
.attr = \
|
||||
{ .name = __stringify(_name), .mode = S_IRUSR | S_IWUSR }, \
|
||||
.size = 0, \
|
||||
.read = read_ ## _name, \
|
||||
.write = write_ ## _name }
|
||||
.read_new = read_ ## _name, \
|
||||
.write_new = write_ ## _name }
|
||||
|
||||
ESAS2R_RW_BIN_ATTR(fw);
|
||||
ESAS2R_RW_BIN_ATTR(fs);
|
||||
|
@ -224,10 +224,10 @@ ESAS2R_RW_BIN_ATTR(vda);
|
|||
ESAS2R_RW_BIN_ATTR(hw);
|
||||
ESAS2R_RW_BIN_ATTR(live_nvram);
|
||||
|
||||
struct bin_attribute bin_attr_default_nvram = {
|
||||
const struct bin_attribute bin_attr_default_nvram = {
|
||||
.attr = { .name = "default_nvram", .mode = S_IRUGO },
|
||||
.size = 0,
|
||||
.read = read_default_nvram,
|
||||
.read_new = read_default_nvram,
|
||||
.write = NULL
|
||||
};
|
||||
|
||||
|
|
|
@ -2261,7 +2261,7 @@ static void esp_init_swstate(struct esp *esp)
|
|||
INIT_LIST_HEAD(&esp->active_cmds);
|
||||
INIT_LIST_HEAD(&esp->esp_cmd_pool);
|
||||
|
||||
/* Start with a clear state, domain validation (via ->slave_configure,
|
||||
/* Start with a clear state, domain validation (via ->sdev_configure,
|
||||
* spi_dv_device()) will attempt to enable SYNC, WIDE, and tagged
|
||||
* commands.
|
||||
*/
|
||||
|
@ -2441,7 +2441,7 @@ static void esp_target_destroy(struct scsi_target *starget)
|
|||
tp->starget = NULL;
|
||||
}
|
||||
|
||||
static int esp_slave_alloc(struct scsi_device *dev)
|
||||
static int esp_sdev_init(struct scsi_device *dev)
|
||||
{
|
||||
struct esp *esp = shost_priv(dev->host);
|
||||
struct esp_target_data *tp = &esp->target[dev->id];
|
||||
|
@ -2463,7 +2463,7 @@ static int esp_slave_alloc(struct scsi_device *dev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int esp_slave_configure(struct scsi_device *dev)
|
||||
static int esp_sdev_configure(struct scsi_device *dev, struct queue_limits *lim)
|
||||
{
|
||||
struct esp *esp = shost_priv(dev->host);
|
||||
struct esp_target_data *tp = &esp->target[dev->id];
|
||||
|
@ -2479,7 +2479,7 @@ static int esp_slave_configure(struct scsi_device *dev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void esp_slave_destroy(struct scsi_device *dev)
|
||||
static void esp_sdev_destroy(struct scsi_device *dev)
|
||||
{
|
||||
struct esp_lun_data *lp = dev->hostdata;
|
||||
|
||||
|
@ -2667,9 +2667,9 @@ const struct scsi_host_template scsi_esp_template = {
|
|||
.queuecommand = esp_queuecommand,
|
||||
.target_alloc = esp_target_alloc,
|
||||
.target_destroy = esp_target_destroy,
|
||||
.slave_alloc = esp_slave_alloc,
|
||||
.slave_configure = esp_slave_configure,
|
||||
.slave_destroy = esp_slave_destroy,
|
||||
.sdev_init = esp_sdev_init,
|
||||
.sdev_configure = esp_sdev_configure,
|
||||
.sdev_destroy = esp_sdev_destroy,
|
||||
.eh_abort_handler = esp_eh_abort_handler,
|
||||
.eh_bus_reset_handler = esp_eh_bus_reset_handler,
|
||||
.eh_host_reset_handler = esp_eh_host_reset_handler,
|
||||
|
|
|
@ -80,7 +80,7 @@
|
|||
|
||||
/* ESP config register 4 read-write */
|
||||
#define ESP_CONFIG4_BBTE 0x01 /* Back-to-back transfers (fsc) */
|
||||
#define ESP_CONGIG4_TEST 0x02 /* Transfer counter test mode (fsc) */
|
||||
#define ESP_CONFIG4_TEST 0x02 /* Transfer counter test mode (fsc) */
|
||||
#define ESP_CONFIG4_RADE 0x04 /* Active negation (am53c974/fsc) */
|
||||
#define ESP_CONFIG4_RAE 0x08 /* Act. negation REQ/ACK (am53c974) */
|
||||
#define ESP_CONFIG4_PWD 0x20 /* Reduced power feature (am53c974) */
|
||||
|
|
|
@ -269,7 +269,7 @@ static const struct scsi_host_template fcoe_shost_template = {
|
|||
.eh_abort_handler = fc_eh_abort,
|
||||
.eh_device_reset_handler = fc_eh_device_reset,
|
||||
.eh_host_reset_handler = fc_eh_host_reset,
|
||||
.slave_alloc = fc_slave_alloc,
|
||||
.sdev_init = fc_sdev_init,
|
||||
.change_queue_depth = scsi_change_queue_depth,
|
||||
.this_id = -1,
|
||||
.cmd_per_lun = 3,
|
||||
|
|
|
@ -47,7 +47,7 @@ static void fdomain_pci_remove(struct pci_dev *pdev)
|
|||
pci_disable_device(pdev);
|
||||
}
|
||||
|
||||
static struct pci_device_id fdomain_pci_table[] = {
|
||||
static const struct pci_device_id fdomain_pci_table[] = {
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_FD, PCI_DEVICE_ID_FD_36C70) },
|
||||
{}
|
||||
};
|
||||
|
|
|
@ -2,11 +2,13 @@
|
|||
obj-$(CONFIG_FCOE_FNIC) += fnic.o
|
||||
|
||||
fnic-y := \
|
||||
fip.o\
|
||||
fnic_attrs.o \
|
||||
fnic_isr.o \
|
||||
fnic_main.o \
|
||||
fnic_res.o \
|
||||
fnic_fcs.o \
|
||||
fdls_disc.o \
|
||||
fnic_scsi.o \
|
||||
fnic_trace.o \
|
||||
fnic_debugfs.o \
|
||||
|
@ -15,4 +17,5 @@ fnic-y := \
|
|||
vnic_intr.o \
|
||||
vnic_rq.o \
|
||||
vnic_wq_copy.o \
|
||||
vnic_wq.o
|
||||
vnic_wq.o \
|
||||
fnic_pci_subsys_devid.o
|
||||
|
|
4997
drivers/scsi/fnic/fdls_disc.c
Normal file
4997
drivers/scsi/fnic/fdls_disc.c
Normal file
File diff suppressed because it is too large
Load diff
253
drivers/scsi/fnic/fdls_fc.h
Normal file
253
drivers/scsi/fnic/fdls_fc.h
Normal file
|
@ -0,0 +1,253 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Copyright 2008 Cisco Systems, Inc. All rights reserved.
|
||||
* Copyright 2007 Nuova Systems, Inc. All rights reserved.
|
||||
*/
|
||||
|
||||
#ifndef _FDLS_FC_H_
|
||||
#define _FDLS_FC_H_
|
||||
|
||||
/* This file contains the declarations for FC fabric services
|
||||
* and target discovery
|
||||
*
|
||||
* Request and Response for
|
||||
* 1. FLOGI
|
||||
* 2. PLOGI to Fabric Controller
|
||||
* 3. GPN_ID, GPN_FT
|
||||
* 4. RSCN
|
||||
* 5. PLOGI to Target
|
||||
* 6. PRLI to Target
|
||||
*/
|
||||
|
||||
#include <scsi/scsi.h>
|
||||
#include <scsi/fc/fc_els.h>
|
||||
#include <uapi/scsi/fc/fc_fs.h>
|
||||
#include <uapi/scsi/fc/fc_ns.h>
|
||||
#include <uapi/scsi/fc/fc_gs.h>
|
||||
#include <uapi/linux/if_ether.h>
|
||||
#include <scsi/fc/fc_ms.h>
|
||||
#include <linux/minmax.h>
|
||||
#include <linux/if_ether.h>
|
||||
#include <scsi/fc/fc_encaps.h>
|
||||
#include <scsi/fc/fc_fcoe.h>
|
||||
|
||||
#define FDLS_MIN_FRAMES (32)
|
||||
#define FDLS_MIN_FRAME_ELEM (4)
|
||||
#define FNIC_FCP_SP_RD_XRDY_DIS 0x00000002
|
||||
#define FNIC_FCP_SP_TARGET 0x00000010
|
||||
#define FNIC_FCP_SP_INITIATOR 0x00000020
|
||||
#define FNIC_FCP_SP_CONF_CMPL 0x00000080
|
||||
#define FNIC_FCP_SP_RETRY 0x00000100
|
||||
|
||||
#define FNIC_FC_CONCUR_SEQS (0xFF)
|
||||
#define FNIC_FC_RO_INFO (0x1F)
|
||||
|
||||
/* Little Endian */
|
||||
#define FNIC_UNASSIGNED_OXID (0xffff)
|
||||
#define FNIC_UNASSIGNED_RXID (0xffff)
|
||||
#define FNIC_ELS_REQ_FCTL (0x000029)
|
||||
#define FNIC_ELS_REP_FCTL (0x000099)
|
||||
|
||||
#define FNIC_FCP_RSP_FCTL (0x000099)
|
||||
#define FNIC_REQ_ABTS_FCTL (0x000009)
|
||||
|
||||
#define FNIC_FC_PH_VER_HI (0x20)
|
||||
#define FNIC_FC_PH_VER_LO (0x20)
|
||||
#define FNIC_FC_PH_VER (0x2020)
|
||||
#define FNIC_FC_B2B_CREDIT (0x0A)
|
||||
#define FNIC_FC_B2B_RDF_SZ (0x0800)
|
||||
|
||||
#define FNIC_LOGI_RDF_SIZE(_logi) ((_logi).fl_csp.sp_bb_data)
|
||||
#define FNIC_LOGI_R_A_TOV(_logi) ((_logi).fl_csp.sp_r_a_tov)
|
||||
#define FNIC_LOGI_E_D_TOV(_logi) ((_logi).fl_csp.sp_e_d_tov)
|
||||
#define FNIC_LOGI_FEATURES(_logi) (be16_to_cpu((_logi).fl_csp.sp_features))
|
||||
#define FNIC_LOGI_PORT_NAME(_logi) ((_logi).fl_wwpn)
|
||||
#define FNIC_LOGI_NODE_NAME(_logi) ((_logi).fl_wwnn)
|
||||
|
||||
#define FNIC_LOGI_SET_RDF_SIZE(_logi, _rdf_size) \
|
||||
(FNIC_LOGI_RDF_SIZE(_logi) = cpu_to_be16(_rdf_size))
|
||||
#define FNIC_LOGI_SET_E_D_TOV(_logi, _e_d_tov) \
|
||||
(FNIC_LOGI_E_D_TOV(_logi) = cpu_to_be32(_e_d_tov))
|
||||
#define FNIC_LOGI_SET_R_A_TOV(_logi, _r_a_tov) \
|
||||
(FNIC_LOGI_R_A_TOV(_logi) = cpu_to_be32(_r_a_tov))
|
||||
|
||||
#define FNIC_STD_SET_S_ID(_fchdr, _sid) memcpy((_fchdr).fh_s_id, _sid, 3)
|
||||
#define FNIC_STD_SET_D_ID(_fchdr, _did) memcpy((_fchdr).fh_d_id, _did, 3)
|
||||
#define FNIC_STD_SET_OX_ID(_fchdr, _oxid) ((_fchdr).fh_ox_id = cpu_to_be16(_oxid))
|
||||
#define FNIC_STD_SET_RX_ID(_fchdr, _rxid) ((_fchdr).fh_rx_id = cpu_to_be16(_rxid))
|
||||
|
||||
#define FNIC_STD_SET_R_CTL(_fchdr, _rctl) ((_fchdr).fh_r_ctl = _rctl)
|
||||
#define FNIC_STD_SET_TYPE(_fchdr, _type) ((_fchdr).fh_type = _type)
|
||||
#define FNIC_STD_SET_F_CTL(_fchdr, _fctl) \
|
||||
put_unaligned_be24(_fctl, &((_fchdr).fh_f_ctl))
|
||||
|
||||
#define FNIC_STD_SET_NPORT_NAME(_ptr, _wwpn) put_unaligned_be64(_wwpn, _ptr)
|
||||
#define FNIC_STD_SET_NODE_NAME(_ptr, _wwnn) put_unaligned_be64(_wwnn, _ptr)
|
||||
#define FNIC_STD_SET_PORT_ID(__req, __portid) \
|
||||
memcpy(__req.fr_fid.fp_fid, __portid, 3)
|
||||
#define FNIC_STD_SET_PORT_NAME(_req, _pName) \
|
||||
(put_unaligned_be64(_pName, &_req.fr_wwn))
|
||||
|
||||
#define FNIC_STD_GET_OX_ID(_fchdr) (be16_to_cpu((_fchdr)->fh_ox_id))
|
||||
#define FNIC_STD_GET_RX_ID(_fchdr) (be16_to_cpu((_fchdr)->fh_rx_id))
|
||||
#define FNIC_STD_GET_S_ID(_fchdr) ((_fchdr)->fh_s_id)
|
||||
#define FNIC_STD_GET_D_ID(_fchdr) ((_fchdr)->fh_d_id)
|
||||
#define FNIC_STD_GET_TYPE(_fchdr) ((_fchdr)->fh_type)
|
||||
#define FNIC_STD_GET_F_CTL(_fchdr) ((_fchdr)->fh_f_ctl)
|
||||
#define FNIC_STD_GET_R_CTL(_fchdr) ((_fchdr)->fh_r_ctl)
|
||||
|
||||
#define FNIC_STD_GET_FC_CT_CMD(__fcct_hdr) (be16_to_cpu(__fcct_hdr->ct_cmd))
|
||||
|
||||
#define FNIC_FCOE_MAX_FRAME_SZ (2048)
|
||||
#define FNIC_FCOE_MIN_FRAME_SZ (280)
|
||||
#define FNIC_FC_MAX_PAYLOAD_LEN (2048)
|
||||
#define FNIC_MIN_DATA_FIELD_SIZE (256)
|
||||
|
||||
#define FNIC_FC_EDTOV_NSEC (0x400)
|
||||
#define FNIC_NSEC_TO_MSEC (0x1000000)
|
||||
#define FCP_PRLI_FUNC_TARGET (0x0010)
|
||||
|
||||
#define FNIC_FC_R_CTL_SOLICITED_DATA (0x21)
|
||||
#define FNIC_FC_F_CTL_LAST_END_SEQ (0x98)
|
||||
#define FNIC_FC_F_CTL_LAST_END_SEQ_INT (0x99)
|
||||
#define FNIC_FC_F_CTL_FIRST_LAST_SEQINIT (0x29)
|
||||
#define FNIC_FC_R_CTL_FC4_SCTL (0x03)
|
||||
#define FNIC_FC_CS_CTL (0x00)
|
||||
|
||||
#define FNIC_FC_FRAME_UNSOLICITED(_fchdr) \
|
||||
(_fchdr->fh_r_ctl == FC_RCTL_ELS_REQ)
|
||||
#define FNIC_FC_FRAME_SOLICITED_DATA(_fchdr) \
|
||||
(_fchdr->fh_r_ctl == FNIC_FC_R_CTL_SOLICITED_DATA)
|
||||
#define FNIC_FC_FRAME_SOLICITED_CTRL_REPLY(_fchdr) \
|
||||
(_fchdr->fh_r_ctl == FC_RCTL_ELS_REP)
|
||||
#define FNIC_FC_FRAME_FCTL_LAST_END_SEQ(_fchdr) \
|
||||
(_fchdr->fh_f_ctl[0] == FNIC_FC_F_CTL_LAST_END_SEQ)
|
||||
#define FNIC_FC_FRAME_FCTL_LAST_END_SEQ_INT(_fchdr) \
|
||||
(_fchdr->fh_f_ctl[0] == FNIC_FC_F_CTL_LAST_END_SEQ_INT)
|
||||
#define FNIC_FC_FRAME_FCTL_FIRST_LAST_SEQINIT(_fchdr) \
|
||||
(_fchdr->fh_f_ctl[0] == FNIC_FC_F_CTL_FIRST_LAST_SEQINIT)
|
||||
#define FNIC_FC_FRAME_FC4_SCTL(_fchdr) \
|
||||
(_fchdr->fh_r_ctl == FNIC_FC_R_CTL_FC4_SCTL)
|
||||
#define FNIC_FC_FRAME_TYPE_BLS(_fchdr) (_fchdr->fh_type == FC_TYPE_BLS)
|
||||
#define FNIC_FC_FRAME_TYPE_ELS(_fchdr) (_fchdr->fh_type == FC_TYPE_ELS)
|
||||
#define FNIC_FC_FRAME_TYPE_FC_GS(_fchdr) (_fchdr->fh_type == FC_TYPE_CT)
|
||||
#define FNIC_FC_FRAME_CS_CTL(_fchdr) (_fchdr->fh_cs_ctl == FNIC_FC_CS_CTL)
|
||||
|
||||
#define FNIC_FC_C3_RDF (0xfff)
|
||||
#define FNIC_FC_PLOGI_RSP_RDF(_plogi_rsp) \
|
||||
(min(_plogi_rsp->u.csp_plogi.b2b_rdf_size, \
|
||||
(_plogi_rsp->spc3[4] & FNIC_FC_C3_RDF)))
|
||||
#define FNIC_FC_PLOGI_RSP_CONCUR_SEQ(_plogi_rsp) \
|
||||
(min((uint16_t) (be16_to_cpu(_plogi_rsp->els.fl_csp.sp_tot_seq)), \
|
||||
(uint16_t) (be16_to_cpu(_plogi_rsp->els.fl_cssp[2].cp_con_seq) & 0xff)))
|
||||
|
||||
/* FLOGI/PLOGI struct */
|
||||
struct fc_std_flogi {
|
||||
struct fc_frame_header fchdr;
|
||||
struct fc_els_flogi els;
|
||||
} __packed;
|
||||
|
||||
struct fc_std_els_acc_rsp {
|
||||
struct fc_frame_header fchdr;
|
||||
struct fc_els_ls_acc acc;
|
||||
} __packed;
|
||||
|
||||
struct fc_std_els_rjt_rsp {
|
||||
struct fc_frame_header fchdr;
|
||||
struct fc_els_ls_rjt rej;
|
||||
} __packed;
|
||||
|
||||
struct fc_std_els_adisc {
|
||||
struct fc_frame_header fchdr;
|
||||
struct fc_els_adisc els;
|
||||
} __packed;
|
||||
|
||||
struct fc_std_rls_acc {
|
||||
struct fc_frame_header fchdr;
|
||||
struct fc_els_rls_resp els;
|
||||
} __packed;
|
||||
|
||||
struct fc_std_abts_ba_acc {
|
||||
struct fc_frame_header fchdr;
|
||||
struct fc_ba_acc acc;
|
||||
} __packed;
|
||||
|
||||
struct fc_std_abts_ba_rjt {
|
||||
struct fc_frame_header fchdr;
|
||||
struct fc_ba_rjt rjt;
|
||||
} __packed;
|
||||
|
||||
struct fc_std_els_prli {
|
||||
struct fc_frame_header fchdr;
|
||||
struct fc_els_prli els_prli;
|
||||
struct fc_els_spp sp;
|
||||
} __packed;
|
||||
|
||||
struct fc_std_rpn_id {
|
||||
struct fc_frame_header fchdr;
|
||||
struct fc_ct_hdr fc_std_ct_hdr;
|
||||
struct fc_ns_rn_id rpn_id;
|
||||
} __packed;
|
||||
|
||||
struct fc_std_fdmi_rhba {
|
||||
struct fc_frame_header fchdr;
|
||||
struct fc_ct_hdr fc_std_ct_hdr;
|
||||
struct fc_fdmi_rhba rhba;
|
||||
} __packed;
|
||||
|
||||
struct fc_std_fdmi_rpa {
|
||||
struct fc_frame_header fchdr;
|
||||
struct fc_ct_hdr fc_std_ct_hdr;
|
||||
struct fc_fdmi_rpa rpa;
|
||||
} __packed;
|
||||
|
||||
struct fc_std_rft_id {
|
||||
struct fc_frame_header fchdr;
|
||||
struct fc_ct_hdr fc_std_ct_hdr;
|
||||
struct fc_ns_rft_id rft_id;
|
||||
} __packed;
|
||||
|
||||
struct fc_std_rff_id {
|
||||
struct fc_frame_header fchdr;
|
||||
struct fc_ct_hdr fc_std_ct_hdr;
|
||||
struct fc_ns_rff_id rff_id;
|
||||
} __packed;
|
||||
|
||||
struct fc_std_gpn_ft {
|
||||
struct fc_frame_header fchdr;
|
||||
struct fc_ct_hdr fc_std_ct_hdr;
|
||||
struct fc_ns_gid_ft gpn_ft;
|
||||
} __packed;
|
||||
|
||||
/* Accept CT_IU for GPN_FT */
|
||||
struct fc_gpn_ft_rsp_iu {
|
||||
uint8_t ctrl;
|
||||
uint8_t fcid[3];
|
||||
uint32_t rsvd;
|
||||
__be64 wwpn;
|
||||
} __packed;
|
||||
|
||||
struct fc_std_rls {
|
||||
struct fc_frame_header fchdr;
|
||||
struct fc_els_rls els;
|
||||
} __packed;
|
||||
|
||||
struct fc_std_scr {
|
||||
struct fc_frame_header fchdr;
|
||||
struct fc_els_scr scr;
|
||||
} __packed;
|
||||
|
||||
struct fc_std_rscn {
|
||||
struct fc_frame_header fchdr;
|
||||
struct fc_els_rscn els;
|
||||
} __packed;
|
||||
|
||||
struct fc_std_logo {
|
||||
struct fc_frame_header fchdr;
|
||||
struct fc_els_logo els;
|
||||
} __packed;
|
||||
|
||||
#define FNIC_ETH_FCOE_HDRS_OFFSET \
|
||||
(sizeof(struct ethhdr) + sizeof(struct fcoe_hdr))
|
||||
|
||||
#endif /* _FDLS_FC_H */
|
1005
drivers/scsi/fnic/fip.c
Normal file
1005
drivers/scsi/fnic/fip.c
Normal file
File diff suppressed because it is too large
Load diff
159
drivers/scsi/fnic/fip.h
Normal file
159
drivers/scsi/fnic/fip.h
Normal file
|
@ -0,0 +1,159 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Copyright 2008 Cisco Systems, Inc. All rights reserved.
|
||||
* Copyright 2007 Nuova Systems, Inc. All rights reserved.
|
||||
*/
|
||||
#ifndef _FIP_H_
|
||||
#define _FIP_H_
|
||||
|
||||
#include "fdls_fc.h"
|
||||
#include "fnic_fdls.h"
|
||||
#include <scsi/fc/fc_fip.h>
|
||||
|
||||
/* Drop the cast from the standard definition */
|
||||
#define FCOE_ALL_FCFS_MAC {0x01, 0x10, 0x18, 0x01, 0x00, 0x02}
|
||||
#define FCOE_MAX_SIZE 0x082E
|
||||
|
||||
#define FCOE_CTLR_FIPVLAN_TOV (3*1000)
|
||||
#define FCOE_CTLR_FCS_TOV (3*1000)
|
||||
#define FCOE_CTLR_MAX_SOL (5*1000)
|
||||
|
||||
#define FIP_DISC_SOL_LEN (6)
|
||||
#define FIP_VLAN_REQ_LEN (2)
|
||||
#define FIP_ENODE_KA_LEN (2)
|
||||
#define FIP_VN_KA_LEN (7)
|
||||
#define FIP_FLOGI_LEN (38)
|
||||
|
||||
enum fdls_vlan_state {
|
||||
FIP_VLAN_AVAIL,
|
||||
FIP_VLAN_SENT
|
||||
};
|
||||
|
||||
enum fdls_fip_state {
|
||||
FDLS_FIP_INIT,
|
||||
FDLS_FIP_VLAN_DISCOVERY_STARTED,
|
||||
FDLS_FIP_FCF_DISCOVERY_STARTED,
|
||||
FDLS_FIP_FLOGI_STARTED,
|
||||
FDLS_FIP_FLOGI_COMPLETE,
|
||||
};
|
||||
|
||||
/*
|
||||
* VLAN entry.
|
||||
*/
|
||||
struct fcoe_vlan {
|
||||
struct list_head list;
|
||||
uint16_t vid; /* vlan ID */
|
||||
uint16_t sol_count; /* no. of sols sent */
|
||||
uint16_t state; /* state */
|
||||
};
|
||||
|
||||
struct fip_vlan_req {
|
||||
struct ethhdr eth;
|
||||
struct fip_header fip;
|
||||
struct fip_mac_desc mac_desc;
|
||||
} __packed;
|
||||
|
||||
struct fip_vlan_notif {
|
||||
struct fip_header fip;
|
||||
struct fip_vlan_desc vlans_desc[];
|
||||
} __packed;
|
||||
|
||||
struct fip_vn_port_ka {
|
||||
struct ethhdr eth;
|
||||
struct fip_header fip;
|
||||
struct fip_mac_desc mac_desc;
|
||||
struct fip_vn_desc vn_port_desc;
|
||||
} __packed;
|
||||
|
||||
struct fip_enode_ka {
|
||||
struct ethhdr eth;
|
||||
struct fip_header fip;
|
||||
struct fip_mac_desc mac_desc;
|
||||
} __packed;
|
||||
|
||||
struct fip_cvl {
|
||||
struct fip_header fip;
|
||||
struct fip_mac_desc fcf_mac_desc;
|
||||
struct fip_wwn_desc name_desc;
|
||||
struct fip_vn_desc vn_ports_desc[];
|
||||
} __packed;
|
||||
|
||||
struct fip_flogi_desc {
|
||||
struct fip_desc fd_desc;
|
||||
uint16_t rsvd;
|
||||
struct fc_std_flogi flogi;
|
||||
} __packed;
|
||||
|
||||
struct fip_flogi_rsp_desc {
|
||||
struct fip_desc fd_desc;
|
||||
uint16_t rsvd;
|
||||
struct fc_std_flogi flogi;
|
||||
} __packed;
|
||||
|
||||
struct fip_flogi {
|
||||
struct ethhdr eth;
|
||||
struct fip_header fip;
|
||||
struct fip_flogi_desc flogi_desc;
|
||||
struct fip_mac_desc mac_desc;
|
||||
} __packed;
|
||||
|
||||
struct fip_flogi_rsp {
|
||||
struct fip_header fip;
|
||||
struct fip_flogi_rsp_desc rsp_desc;
|
||||
struct fip_mac_desc mac_desc;
|
||||
} __packed;
|
||||
|
||||
struct fip_discovery {
|
||||
struct ethhdr eth;
|
||||
struct fip_header fip;
|
||||
struct fip_mac_desc mac_desc;
|
||||
struct fip_wwn_desc name_desc;
|
||||
struct fip_size_desc fcoe_desc;
|
||||
} __packed;
|
||||
|
||||
struct fip_disc_adv {
|
||||
struct fip_header fip;
|
||||
struct fip_pri_desc prio_desc;
|
||||
struct fip_mac_desc mac_desc;
|
||||
struct fip_wwn_desc name_desc;
|
||||
struct fip_fab_desc fabric_desc;
|
||||
struct fip_fka_desc fka_adv_desc;
|
||||
} __packed;
|
||||
|
||||
void fnic_fcoe_process_vlan_resp(struct fnic *fnic, struct fip_header *fiph);
|
||||
void fnic_fcoe_fip_discovery_resp(struct fnic *fnic, struct fip_header *fiph);
|
||||
void fnic_fcoe_process_flogi_resp(struct fnic *fnic, struct fip_header *fiph);
|
||||
void fnic_work_on_fip_timer(struct work_struct *work);
|
||||
void fnic_work_on_fcs_ka_timer(struct work_struct *work);
|
||||
void fnic_fcoe_send_vlan_req(struct fnic *fnic);
|
||||
void fnic_fcoe_start_fcf_discovery(struct fnic *fnic);
|
||||
void fnic_fcoe_start_flogi(struct fnic *fnic);
|
||||
void fnic_fcoe_process_cvl(struct fnic *fnic, struct fip_header *fiph);
|
||||
void fnic_vlan_discovery_timeout(struct fnic *fnic);
|
||||
|
||||
extern struct workqueue_struct *fnic_fip_queue;
|
||||
|
||||
#ifdef FNIC_DEBUG
|
||||
static inline void
|
||||
fnic_debug_dump_fip_frame(struct fnic *fnic, struct ethhdr *eth,
|
||||
int len, char *pfx)
|
||||
{
|
||||
struct fip_header *fiph = (struct fip_header *)(eth + 1);
|
||||
u16 op = be16_to_cpu(fiph->fip_op);
|
||||
u8 sub = fiph->fip_subcode;
|
||||
|
||||
FNIC_FCS_DBG(KERN_DEBUG, fnic->host, fnic->fnic_num,
|
||||
"FIP %s packet contents: op: 0x%x sub: 0x%x (len = %d)",
|
||||
pfx, op, sub, len);
|
||||
|
||||
fnic_debug_dump(fnic, (uint8_t *)eth, len);
|
||||
}
|
||||
|
||||
#else /* FNIC_DEBUG */
|
||||
|
||||
static inline void
|
||||
fnic_debug_dump_fip_frame(struct fnic *fnic, struct ethhdr *eth,
|
||||
int len, char *pfx) {}
|
||||
#endif /* FNIC_DEBUG */
|
||||
|
||||
#endif /* _FIP_H_ */
|
|
@ -10,8 +10,10 @@
|
|||
#include <linux/netdevice.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <scsi/libfc.h>
|
||||
#include <scsi/libfcoe.h>
|
||||
#include <scsi/scsi_cmnd.h>
|
||||
#include <scsi/scsi_transport.h>
|
||||
#include <scsi/scsi_transport_fc.h>
|
||||
#include <scsi/fc_frame.h>
|
||||
#include "fnic_io.h"
|
||||
#include "fnic_res.h"
|
||||
#include "fnic_trace.h"
|
||||
|
@ -24,13 +26,15 @@
|
|||
#include "vnic_intr.h"
|
||||
#include "vnic_stats.h"
|
||||
#include "vnic_scsi.h"
|
||||
#include "fnic_fdls.h"
|
||||
|
||||
#define DRV_NAME "fnic"
|
||||
#define DRV_DESCRIPTION "Cisco FCoE HBA Driver"
|
||||
#define DRV_VERSION "1.7.0.0"
|
||||
#define DRV_VERSION "1.8.0.0"
|
||||
#define PFX DRV_NAME ": "
|
||||
#define DFX DRV_NAME "%d: "
|
||||
|
||||
#define FABRIC_LOGO_MAX_RETRY 3
|
||||
#define DESC_CLEAN_LOW_WATERMARK 8
|
||||
#define FNIC_UCSM_DFLT_THROTTLE_CNT_BLD 16 /* UCSM default throttle count */
|
||||
#define FNIC_MIN_IO_REQ 256 /* Min IO throttle count */
|
||||
|
@ -38,6 +42,7 @@
|
|||
#define FNIC_DFLT_IO_REQ 256 /* Default scsi_cmnd tag map entries */
|
||||
#define FNIC_DFLT_QUEUE_DEPTH 256
|
||||
#define FNIC_STATS_RATE_LIMIT 4 /* limit rate at which stats are pulled up */
|
||||
#define LUN0_DELAY_TIME 9
|
||||
|
||||
/*
|
||||
* Tag bits used for special requests.
|
||||
|
@ -75,6 +80,77 @@
|
|||
#define FNIC_DEV_RST_TERM_DONE BIT(20)
|
||||
#define FNIC_DEV_RST_ABTS_PENDING BIT(21)
|
||||
|
||||
#define FNIC_FW_RESET_TIMEOUT 60000 /* mSec */
|
||||
#define FNIC_FCOE_MAX_CMD_LEN 16
|
||||
/* Retry supported by rport (returned by PRLI service parameters) */
|
||||
#define FNIC_FC_RP_FLAGS_RETRY 0x1
|
||||
|
||||
/* Cisco vendor id */
|
||||
#define PCI_VENDOR_ID_CISCO 0x1137
|
||||
#define PCI_DEVICE_ID_CISCO_VIC_FC 0x0045 /* fc vnic */
|
||||
|
||||
/* sereno pcie switch */
|
||||
#define PCI_DEVICE_ID_CISCO_SERENO 0x004e
|
||||
#define PCI_DEVICE_ID_CISCO_CRUZ 0x007a /* Cruz */
|
||||
#define PCI_DEVICE_ID_CISCO_BODEGA 0x0131 /* Bodega */
|
||||
#define PCI_DEVICE_ID_CISCO_BEVERLY 0x025f /* Beverly */
|
||||
|
||||
/* Sereno */
|
||||
#define PCI_SUBDEVICE_ID_CISCO_VASONA 0x004f /* vasona mezz */
|
||||
#define PCI_SUBDEVICE_ID_CISCO_COTATI 0x0084 /* cotati mlom */
|
||||
#define PCI_SUBDEVICE_ID_CISCO_LEXINGTON 0x0085 /* lexington pcie */
|
||||
#define PCI_SUBDEVICE_ID_CISCO_ICEHOUSE 0x00cd /* Icehouse */
|
||||
#define PCI_SUBDEVICE_ID_CISCO_KIRKWOODLAKE 0x00ce /* KirkwoodLake pcie */
|
||||
#define PCI_SUBDEVICE_ID_CISCO_SUSANVILLE 0x012e /* Susanville MLOM */
|
||||
#define PCI_SUBDEVICE_ID_CISCO_TORRANCE 0x0139 /* Torrance MLOM */
|
||||
|
||||
/* Cruz */
|
||||
#define PCI_SUBDEVICE_ID_CISCO_CALISTOGA 0x012c /* Calistoga MLOM */
|
||||
#define PCI_SUBDEVICE_ID_CISCO_MOUNTAINVIEW 0x0137 /* Cruz Mezz */
|
||||
/* Cruz MountTian SIOC */
|
||||
#define PCI_SUBDEVICE_ID_CISCO_MOUNTTIAN 0x014b
|
||||
#define PCI_SUBDEVICE_ID_CISCO_CLEARLAKE 0x014d /* ClearLake pcie */
|
||||
/* Cruz MountTian2 SIOC */
|
||||
#define PCI_SUBDEVICE_ID_CISCO_MOUNTTIAN2 0x0157
|
||||
#define PCI_SUBDEVICE_ID_CISCO_CLAREMONT 0x015d /* Claremont MLOM */
|
||||
|
||||
/* Bodega */
|
||||
/* VIC 1457 PCIe mLOM */
|
||||
#define PCI_SUBDEVICE_ID_CISCO_BRADBURY 0x0218
|
||||
#define PCI_SUBDEVICE_ID_CISCO_BRENTWOOD 0x0217 /* VIC 1455 PCIe */
|
||||
/* VIC 1487 PCIe mLOM */
|
||||
#define PCI_SUBDEVICE_ID_CISCO_BURLINGAME 0x021a
|
||||
#define PCI_SUBDEVICE_ID_CISCO_BAYSIDE 0x0219 /* VIC 1485 PCIe */
|
||||
/* VIC 1440 Mezz mLOM */
|
||||
#define PCI_SUBDEVICE_ID_CISCO_BAKERSFIELD 0x0215
|
||||
#define PCI_SUBDEVICE_ID_CISCO_BOONVILLE 0x0216 /* VIC 1480 Mezz */
|
||||
#define PCI_SUBDEVICE_ID_CISCO_BENICIA 0x024a /* VIC 1495 */
|
||||
#define PCI_SUBDEVICE_ID_CISCO_BEAUMONT 0x024b /* VIC 1497 */
|
||||
#define PCI_SUBDEVICE_ID_CISCO_BRISBANE 0x02af /* VIC 1467 */
|
||||
#define PCI_SUBDEVICE_ID_CISCO_BENTON 0x02b0 /* VIC 1477 */
|
||||
#define PCI_SUBDEVICE_ID_CISCO_TWIN_RIVER 0x02cf /* VIC 14425 */
|
||||
#define PCI_SUBDEVICE_ID_CISCO_TWIN_PEAK 0x02d0 /* VIC 14825 */
|
||||
|
||||
/* Beverly */
|
||||
#define PCI_SUBDEVICE_ID_CISCO_BERN 0x02de /* VIC 15420 */
|
||||
#define PCI_SUBDEVICE_ID_CISCO_STOCKHOLM 0x02dd /* VIC 15428 */
|
||||
#define PCI_SUBDEVICE_ID_CISCO_KRAKOW 0x02dc /* VIC 15411 */
|
||||
#define PCI_SUBDEVICE_ID_CISCO_LUCERNE 0x02db /* VIC 15231 */
|
||||
#define PCI_SUBDEVICE_ID_CISCO_TURKU 0x02e8 /* VIC 15238 */
|
||||
#define PCI_SUBDEVICE_ID_CISCO_TURKU_PLUS 0x02f3 /* VIC 15237 */
|
||||
#define PCI_SUBDEVICE_ID_CISCO_ZURICH 0x02df /* VIC 15230 */
|
||||
#define PCI_SUBDEVICE_ID_CISCO_RIGA 0x02e0 /* VIC 15427 */
|
||||
#define PCI_SUBDEVICE_ID_CISCO_GENEVA 0x02e1 /* VIC 15422 */
|
||||
#define PCI_SUBDEVICE_ID_CISCO_HELSINKI 0x02e4 /* VIC 15235 */
|
||||
#define PCI_SUBDEVICE_ID_CISCO_GOTHENBURG 0x02f2 /* VIC 15425 */
|
||||
|
||||
struct fnic_pcie_device {
|
||||
u32 device;
|
||||
u8 *desc;
|
||||
u32 subsystem_device;
|
||||
u8 *subsys_desc;
|
||||
};
|
||||
|
||||
/*
|
||||
* fnic private data per SCSI command.
|
||||
* These fields are locked by the hashed io_req_lock.
|
||||
|
@ -127,8 +203,38 @@ static inline u64 fnic_flags_and_state(struct scsi_cmnd *cmd)
|
|||
#define fnic_clear_state_flags(fnicp, st_flags) \
|
||||
__fnic_set_state_flags(fnicp, st_flags, 1)
|
||||
|
||||
enum reset_states {
|
||||
NOT_IN_PROGRESS = 0,
|
||||
IN_PROGRESS,
|
||||
RESET_ERROR
|
||||
};
|
||||
|
||||
enum rscn_type {
|
||||
NOT_PC_RSCN = 0,
|
||||
PC_RSCN
|
||||
};
|
||||
|
||||
enum pc_rscn_handling_status {
|
||||
PC_RSCN_HANDLING_NOT_IN_PROGRESS = 0,
|
||||
PC_RSCN_HANDLING_IN_PROGRESS
|
||||
};
|
||||
|
||||
enum pc_rscn_handling_feature {
|
||||
PC_RSCN_HANDLING_FEATURE_OFF = 0,
|
||||
PC_RSCN_HANDLING_FEATURE_ON
|
||||
};
|
||||
|
||||
extern unsigned int fnic_fdmi_support;
|
||||
extern unsigned int fnic_log_level;
|
||||
extern unsigned int io_completions;
|
||||
extern struct workqueue_struct *fnic_event_queue;
|
||||
|
||||
extern unsigned int pc_rscn_handling_feature_flag;
|
||||
extern spinlock_t reset_fnic_list_lock;
|
||||
extern struct list_head reset_fnic_list;
|
||||
extern struct workqueue_struct *reset_fnic_work_queue;
|
||||
extern struct work_struct reset_fnic_work;
|
||||
|
||||
|
||||
#define FNIC_MAIN_LOGGING 0x01
|
||||
#define FNIC_FCS_LOGGING 0x02
|
||||
|
@ -155,6 +261,12 @@ do { \
|
|||
"fnic<%d>: %s: %d: " fmt, fnic_num,\
|
||||
__func__, __LINE__, ##args);)
|
||||
|
||||
#define FNIC_FIP_DBG(kern_level, host, fnic_num, fmt, args...) \
|
||||
FNIC_CHECK_LOGGING(FNIC_FCS_LOGGING, \
|
||||
shost_printk(kern_level, host, \
|
||||
"fnic<%d>: %s: %d: " fmt, fnic_num,\
|
||||
__func__, __LINE__, ##args);)
|
||||
|
||||
#define FNIC_SCSI_DBG(kern_level, host, fnic_num, fmt, args...) \
|
||||
FNIC_CHECK_LOGGING(FNIC_SCSI_LOGGING, \
|
||||
shost_printk(kern_level, host, \
|
||||
|
@ -213,12 +325,26 @@ enum fnic_state {
|
|||
|
||||
struct mempool;
|
||||
|
||||
enum fnic_role_e {
|
||||
FNIC_ROLE_FCP_INITIATOR = 0,
|
||||
};
|
||||
|
||||
enum fnic_evt {
|
||||
FNIC_EVT_START_VLAN_DISC = 1,
|
||||
FNIC_EVT_START_FCF_DISC = 2,
|
||||
FNIC_EVT_MAX,
|
||||
};
|
||||
|
||||
struct fnic_frame_list {
|
||||
/*
|
||||
* Link to frame lists
|
||||
*/
|
||||
struct list_head links;
|
||||
void *fp;
|
||||
int frame_len;
|
||||
int rx_ethhdr_stripped;
|
||||
};
|
||||
|
||||
struct fnic_event {
|
||||
struct list_head list;
|
||||
struct fnic *fnic;
|
||||
|
@ -235,8 +361,9 @@ struct fnic_cpy_wq {
|
|||
/* Per-instance private data structure */
|
||||
struct fnic {
|
||||
int fnic_num;
|
||||
struct fc_lport *lport;
|
||||
struct fcoe_ctlr ctlr; /* FIP FCoE controller structure */
|
||||
enum fnic_role_e role;
|
||||
struct fnic_iport_s iport;
|
||||
struct Scsi_Host *host;
|
||||
struct vnic_dev_bar bar0;
|
||||
|
||||
struct fnic_msix_entry msix[FNIC_MSIX_INTR_MAX];
|
||||
|
@ -255,6 +382,7 @@ struct fnic {
|
|||
unsigned int wq_count;
|
||||
unsigned int cq_count;
|
||||
|
||||
struct completion reset_completion_wait;
|
||||
struct mutex sgreset_mutex;
|
||||
spinlock_t sgreset_lock; /* lock for sgreset */
|
||||
struct scsi_cmnd *sgreset_sc;
|
||||
|
@ -268,25 +396,27 @@ struct fnic {
|
|||
u32 vlan_hw_insert:1; /* let hw insert the tag */
|
||||
u32 in_remove:1; /* fnic device in removal */
|
||||
u32 stop_rx_link_events:1; /* stop proc. rx frames, link events */
|
||||
u32 link_events:1; /* set when we get any link event*/
|
||||
|
||||
struct completion *remove_wait; /* device remove thread blocks */
|
||||
|
||||
struct completion *fw_reset_done;
|
||||
u32 reset_in_progress;
|
||||
atomic_t in_flight; /* io counter */
|
||||
bool internal_reset_inprogress;
|
||||
u32 _reserved; /* fill hole */
|
||||
unsigned long state_flags; /* protected by host lock */
|
||||
enum fnic_state state;
|
||||
spinlock_t fnic_lock;
|
||||
unsigned long lock_flags;
|
||||
|
||||
u16 vlan_id; /* VLAN tag including priority */
|
||||
u8 data_src_addr[ETH_ALEN];
|
||||
u64 fcp_input_bytes; /* internal statistic */
|
||||
u64 fcp_output_bytes; /* internal statistic */
|
||||
u32 link_down_cnt;
|
||||
u32 soft_reset_count;
|
||||
int link_status;
|
||||
|
||||
struct list_head list;
|
||||
struct list_head links;
|
||||
struct pci_dev *pdev;
|
||||
struct vnic_fc_config config;
|
||||
struct vnic_dev *vdev;
|
||||
|
@ -306,19 +436,29 @@ struct fnic {
|
|||
struct work_struct link_work;
|
||||
struct work_struct frame_work;
|
||||
struct work_struct flush_work;
|
||||
struct sk_buff_head frame_queue;
|
||||
struct sk_buff_head tx_queue;
|
||||
struct list_head frame_queue;
|
||||
struct list_head tx_queue;
|
||||
mempool_t *frame_pool;
|
||||
mempool_t *frame_elem_pool;
|
||||
struct work_struct tport_work;
|
||||
struct list_head tport_event_list;
|
||||
|
||||
char subsys_desc[14];
|
||||
int subsys_desc_len;
|
||||
int pc_rscn_handling_status;
|
||||
|
||||
/*** FIP related data members -- start ***/
|
||||
void (*set_vlan)(struct fnic *, u16 vlan);
|
||||
struct work_struct fip_frame_work;
|
||||
struct sk_buff_head fip_frame_queue;
|
||||
struct work_struct fip_timer_work;
|
||||
struct list_head fip_frame_queue;
|
||||
struct timer_list fip_timer;
|
||||
struct list_head vlans;
|
||||
spinlock_t vlans_lock;
|
||||
|
||||
struct work_struct event_work;
|
||||
struct list_head evlist;
|
||||
struct timer_list retry_fip_timer;
|
||||
struct timer_list fcs_ka_timer;
|
||||
struct timer_list enode_ka_timer;
|
||||
struct timer_list vn_ka_timer;
|
||||
struct list_head vlan_list;
|
||||
/*** FIP related data members -- end ***/
|
||||
|
||||
/* copy work queue cache line section */
|
||||
|
@ -341,11 +481,6 @@ struct fnic {
|
|||
____cacheline_aligned struct vnic_intr intr[FNIC_MSIX_INTR_MAX];
|
||||
};
|
||||
|
||||
static inline struct fnic *fnic_from_ctlr(struct fcoe_ctlr *fip)
|
||||
{
|
||||
return container_of(fip, struct fnic, ctlr);
|
||||
}
|
||||
|
||||
extern struct workqueue_struct *fnic_event_queue;
|
||||
extern struct workqueue_struct *fnic_fip_queue;
|
||||
extern const struct attribute_group *fnic_host_groups[];
|
||||
|
@ -356,29 +491,29 @@ int fnic_set_intr_mode_msix(struct fnic *fnic);
|
|||
void fnic_free_intr(struct fnic *fnic);
|
||||
int fnic_request_intr(struct fnic *fnic);
|
||||
|
||||
int fnic_send(struct fc_lport *, struct fc_frame *);
|
||||
void fnic_free_wq_buf(struct vnic_wq *wq, struct vnic_wq_buf *buf);
|
||||
void fnic_handle_frame(struct work_struct *work);
|
||||
void fnic_tport_event_handler(struct work_struct *work);
|
||||
void fnic_handle_link(struct work_struct *work);
|
||||
void fnic_handle_event(struct work_struct *work);
|
||||
void fdls_reclaim_oxid_handler(struct work_struct *work);
|
||||
void fdls_schedule_oxid_free(struct fnic_iport_s *iport, uint16_t *active_oxid);
|
||||
void fdls_schedule_oxid_free_retry_work(struct work_struct *work);
|
||||
int fnic_rq_cmpl_handler(struct fnic *fnic, int);
|
||||
int fnic_alloc_rq_frame(struct vnic_rq *rq);
|
||||
void fnic_free_rq_buf(struct vnic_rq *rq, struct vnic_rq_buf *buf);
|
||||
void fnic_flush_tx(struct work_struct *work);
|
||||
void fnic_eth_send(struct fcoe_ctlr *, struct sk_buff *skb);
|
||||
void fnic_set_port_id(struct fc_lport *, u32, struct fc_frame *);
|
||||
void fnic_update_mac(struct fc_lport *, u8 *new);
|
||||
void fnic_update_mac_locked(struct fnic *, u8 *new);
|
||||
|
||||
int fnic_queuecommand(struct Scsi_Host *, struct scsi_cmnd *);
|
||||
int fnic_abort_cmd(struct scsi_cmnd *);
|
||||
int fnic_device_reset(struct scsi_cmnd *);
|
||||
int fnic_host_reset(struct scsi_cmnd *);
|
||||
int fnic_reset(struct Scsi_Host *);
|
||||
void fnic_scsi_cleanup(struct fc_lport *);
|
||||
void fnic_scsi_abort_io(struct fc_lport *);
|
||||
void fnic_empty_scsi_cleanup(struct fc_lport *);
|
||||
void fnic_exch_mgr_reset(struct fc_lport *, u32, u32);
|
||||
int fnic_eh_host_reset_handler(struct scsi_cmnd *sc);
|
||||
int fnic_host_reset(struct Scsi_Host *shost);
|
||||
void fnic_reset(struct Scsi_Host *shost);
|
||||
int fnic_issue_fc_host_lip(struct Scsi_Host *shost);
|
||||
void fnic_get_host_port_state(struct Scsi_Host *shost);
|
||||
void fnic_scsi_fcpio_reset(struct fnic *fnic);
|
||||
int fnic_wq_copy_cmpl_handler(struct fnic *fnic, int copy_work_to_do, unsigned int cq_index);
|
||||
int fnic_wq_cmpl_handler(struct fnic *fnic, int);
|
||||
int fnic_flogi_reg_handler(struct fnic *fnic, u32);
|
||||
|
@ -390,14 +525,15 @@ const char *fnic_state_to_str(unsigned int state);
|
|||
void fnic_mq_map_queues_cpus(struct Scsi_Host *host);
|
||||
void fnic_log_q_error(struct fnic *fnic);
|
||||
void fnic_handle_link_event(struct fnic *fnic);
|
||||
|
||||
int fnic_stats_debugfs_init(struct fnic *fnic);
|
||||
void fnic_stats_debugfs_remove(struct fnic *fnic);
|
||||
int fnic_is_abts_pending(struct fnic *, struct scsi_cmnd *);
|
||||
|
||||
void fnic_handle_fip_frame(struct work_struct *work);
|
||||
void fnic_reset_work_handler(struct work_struct *work);
|
||||
void fnic_handle_fip_event(struct fnic *fnic);
|
||||
void fnic_fcoe_reset_vlans(struct fnic *fnic);
|
||||
void fnic_fcoe_evlist_free(struct fnic *fnic);
|
||||
extern void fnic_handle_fip_timer(struct fnic *fnic);
|
||||
extern void fnic_handle_fip_timer(struct timer_list *t);
|
||||
|
||||
static inline int
|
||||
fnic_chk_state_flags_locked(struct fnic *fnic, unsigned long st_flags)
|
||||
|
@ -406,4 +542,90 @@ fnic_chk_state_flags_locked(struct fnic *fnic, unsigned long st_flags)
|
|||
}
|
||||
void __fnic_set_state_flags(struct fnic *, unsigned long, unsigned long);
|
||||
void fnic_dump_fchost_stats(struct Scsi_Host *, struct fc_host_statistics *);
|
||||
void fnic_free_txq(struct list_head *head);
|
||||
int fnic_get_desc_by_devid(struct pci_dev *pdev, char **desc,
|
||||
char **subsys_desc);
|
||||
void fnic_fdls_link_status_change(struct fnic *fnic, int linkup);
|
||||
void fnic_delete_fcp_tports(struct fnic *fnic);
|
||||
void fnic_flush_tport_event_list(struct fnic *fnic);
|
||||
int fnic_count_ioreqs_wq(struct fnic *fnic, u32 hwq, u32 portid);
|
||||
unsigned int fnic_count_ioreqs(struct fnic *fnic, u32 portid);
|
||||
unsigned int fnic_count_all_ioreqs(struct fnic *fnic);
|
||||
unsigned int fnic_count_lun_ioreqs_wq(struct fnic *fnic, u32 hwq,
|
||||
struct scsi_device *device);
|
||||
unsigned int fnic_count_lun_ioreqs(struct fnic *fnic,
|
||||
struct scsi_device *device);
|
||||
void fnic_scsi_unload(struct fnic *fnic);
|
||||
void fnic_scsi_unload_cleanup(struct fnic *fnic);
|
||||
int fnic_get_debug_info(struct stats_debug_info *info,
|
||||
struct fnic *fnic);
|
||||
|
||||
struct fnic_scsi_iter_data {
|
||||
struct fnic *fnic;
|
||||
void *data1;
|
||||
void *data2;
|
||||
bool (*fn)(struct fnic *fnic, struct scsi_cmnd *sc,
|
||||
void *data1, void *data2);
|
||||
};
|
||||
|
||||
static inline bool
|
||||
fnic_io_iter_handler(struct scsi_cmnd *sc, void *iter_data)
|
||||
{
|
||||
struct fnic_scsi_iter_data *iter = iter_data;
|
||||
|
||||
return iter->fn(iter->fnic, sc, iter->data1, iter->data2);
|
||||
}
|
||||
|
||||
static inline void
|
||||
fnic_scsi_io_iter(struct fnic *fnic,
|
||||
bool (*fn)(struct fnic *fnic, struct scsi_cmnd *sc,
|
||||
void *data1, void *data2),
|
||||
void *data1, void *data2)
|
||||
{
|
||||
struct fnic_scsi_iter_data iter_data = {
|
||||
.fn = fn,
|
||||
.fnic = fnic,
|
||||
.data1 = data1,
|
||||
.data2 = data2,
|
||||
};
|
||||
scsi_host_busy_iter(fnic->host, fnic_io_iter_handler, &iter_data);
|
||||
}
|
||||
|
||||
#ifdef FNIC_DEBUG
|
||||
static inline void
|
||||
fnic_debug_dump(struct fnic *fnic, uint8_t *u8arr, int len)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < len; i = i+8) {
|
||||
FNIC_FCS_DBG(KERN_DEBUG, fnic->host, fnic->fnic_num,
|
||||
"%d: %02x %02x %02x %02x %02x %02x %02x %02x", i / 8,
|
||||
u8arr[i + 0], u8arr[i + 1], u8arr[i + 2], u8arr[i + 3],
|
||||
u8arr[i + 4], u8arr[i + 5], u8arr[i + 6], u8arr[i + 7]);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void
|
||||
fnic_debug_dump_fc_frame(struct fnic *fnic, struct fc_frame_header *fchdr,
|
||||
int len, char *pfx)
|
||||
{
|
||||
uint32_t s_id, d_id;
|
||||
|
||||
s_id = ntoh24(fchdr->fh_s_id);
|
||||
d_id = ntoh24(fchdr->fh_d_id);
|
||||
FNIC_FCS_DBG(KERN_DEBUG, fnic->host, fnic->fnic_num,
|
||||
"%s packet contents: sid/did/type/oxid = 0x%x/0x%x/0x%x/0x%x (len = %d)\n",
|
||||
pfx, s_id, d_id, fchdr->fh_type,
|
||||
FNIC_STD_GET_OX_ID(fchdr), len);
|
||||
|
||||
fnic_debug_dump(fnic, (uint8_t *)fchdr, len);
|
||||
|
||||
}
|
||||
#else /* FNIC_DEBUG */
|
||||
static inline void
|
||||
fnic_debug_dump(struct fnic *fnic, uint8_t *u8arr, int len) {}
|
||||
static inline void
|
||||
fnic_debug_dump_fc_frame(struct fnic *fnic, struct fc_frame_header *fchdr,
|
||||
uint32_t len, char *pfx) {}
|
||||
#endif /* FNIC_DEBUG */
|
||||
#endif /* _FNIC_H_ */
|
||||
|
|
|
@ -11,8 +11,8 @@
|
|||
static ssize_t fnic_show_state(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct fc_lport *lp = shost_priv(class_to_shost(dev));
|
||||
struct fnic *fnic = lport_priv(lp);
|
||||
struct fnic *fnic =
|
||||
*((struct fnic **) shost_priv(class_to_shost(dev)));
|
||||
|
||||
return sysfs_emit(buf, "%s\n", fnic_state_str[fnic->state]);
|
||||
}
|
||||
|
@ -26,9 +26,13 @@ static ssize_t fnic_show_drv_version(struct device *dev,
|
|||
static ssize_t fnic_show_link_state(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct fc_lport *lp = shost_priv(class_to_shost(dev));
|
||||
struct fnic *fnic =
|
||||
*((struct fnic **) shost_priv(class_to_shost(dev)));
|
||||
|
||||
return sysfs_emit(buf, "%s\n", (lp->link_up) ? "Link Up" : "Link Down");
|
||||
return sysfs_emit(buf, "%s\n",
|
||||
((fnic->iport.state != FNIC_IPORT_STATE_INIT) &&
|
||||
(fnic->iport.state != FNIC_IPORT_STATE_LINK_WAIT)) ?
|
||||
"Link Up" : "Link Down");
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(fnic_state, S_IRUGO, fnic_show_state, NULL);
|
||||
|
|
|
@ -7,6 +7,9 @@
|
|||
#include <linux/vmalloc.h>
|
||||
#include "fnic.h"
|
||||
|
||||
extern int fnic_get_debug_info(struct stats_debug_info *debug_buffer,
|
||||
struct fnic *fnic);
|
||||
|
||||
static struct dentry *fnic_trace_debugfs_root;
|
||||
static struct dentry *fnic_trace_debugfs_file;
|
||||
static struct dentry *fnic_trace_enable;
|
||||
|
@ -593,6 +596,7 @@ static int fnic_stats_debugfs_open(struct inode *inode,
|
|||
debug->buf_size = buf_size;
|
||||
memset((void *)debug->debug_buffer, 0, buf_size);
|
||||
debug->buffer_len = fnic_get_stats_data(debug, fnic_stats);
|
||||
debug->buffer_len += fnic_get_debug_info(debug, fnic);
|
||||
|
||||
file->private_data = debug;
|
||||
|
||||
|
@ -673,26 +677,25 @@ static const struct file_operations fnic_reset_debugfs_fops = {
|
|||
* It will create file stats and reset_stats under statistics/host# directory
|
||||
* to log per fnic stats.
|
||||
*/
|
||||
void fnic_stats_debugfs_init(struct fnic *fnic)
|
||||
int fnic_stats_debugfs_init(struct fnic *fnic)
|
||||
{
|
||||
char name[16];
|
||||
|
||||
snprintf(name, sizeof(name), "host%d", fnic->lport->host->host_no);
|
||||
snprintf(name, sizeof(name), "host%d", fnic->host->host_no);
|
||||
|
||||
fnic->fnic_stats_debugfs_host = debugfs_create_dir(name,
|
||||
fnic_stats_debugfs_root);
|
||||
|
||||
fnic->fnic_stats_debugfs_file = debugfs_create_file("stats",
|
||||
S_IFREG|S_IRUGO|S_IWUSR,
|
||||
fnic->fnic_stats_debugfs_host,
|
||||
fnic,
|
||||
&fnic_stats_debugfs_fops);
|
||||
|
||||
fnic->fnic_reset_debugfs_file = debugfs_create_file("reset_stats",
|
||||
S_IFREG|S_IRUGO|S_IWUSR,
|
||||
fnic->fnic_stats_debugfs_host,
|
||||
fnic,
|
||||
&fnic_reset_debugfs_fops);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
File diff suppressed because it is too large
Load diff
434
drivers/scsi/fnic/fnic_fdls.h
Normal file
434
drivers/scsi/fnic/fnic_fdls.h
Normal file
|
@ -0,0 +1,434 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Copyright 2008 Cisco Systems, Inc. All rights reserved.
|
||||
* Copyright 2007 Nuova Systems, Inc. All rights reserved.
|
||||
*/
|
||||
|
||||
#ifndef _FNIC_FDLS_H_
|
||||
#define _FNIC_FDLS_H_
|
||||
|
||||
#include "fnic_stats.h"
|
||||
#include "fdls_fc.h"
|
||||
|
||||
/* FDLS - Fabric discovery and login services
|
||||
* -> VLAN discovery
|
||||
* -> retry every retry delay seconds until it succeeds.
|
||||
* <- List of VLANs
|
||||
*
|
||||
* -> Solicitation
|
||||
* <- Solicitation response (Advertisement)
|
||||
*
|
||||
* -> FCF selection & FLOGI ( FLOGI timeout - 2 * E_D_TOV)
|
||||
* <- FLOGI response
|
||||
*
|
||||
* -> FCF keep alive
|
||||
* <- FCF keep alive
|
||||
*
|
||||
* -> PLOGI to FFFFFC (DNS) (PLOGI timeout - 2 * R_A_TOV)
|
||||
* -> ABTS if timeout (ABTS tomeout - 2 * R_A_TOV)
|
||||
* <- PLOGI response
|
||||
* -> Retry PLOGI to FFFFFC (DNS) - Number of retries from vnic.cfg
|
||||
*
|
||||
* -> SCR to FFFFFC (DNS) (SCR timeout - 2 * R_A_TOV)
|
||||
* -> ABTS if timeout (ABTS tomeout - 2 * R_A_TOV)
|
||||
* <- SCR response
|
||||
* -> Retry SCR - Number of retries 2
|
||||
*
|
||||
* -> GPN_FT to FFFFFC (GPN_FT timeout - 2 * R_A_TOV)a
|
||||
* -> Retry on BUSY until it succeeds
|
||||
* -> Retry on BUSY until it succeeds
|
||||
* -> 2 retries on timeout
|
||||
*
|
||||
* -> RFT_ID to FFFFFC (DNS) (RFT_ID timeout - 3 * R_A_TOV)
|
||||
* -> ABTS if timeout (ABTS tomeout - 2 * R_A_TOV)
|
||||
* -> Retry RFT_ID to FFFFFC (DNS) (Number of retries 2 )
|
||||
* -> Ignore if both retires fail.
|
||||
*
|
||||
* Session establishment with targets
|
||||
* For each PWWN
|
||||
* -> PLOGI to FCID of that PWWN (PLOGI timeout 2 * R_A_TOV)
|
||||
* -> ABTS if timeout (ABTS tomeout - 2 * R_A_TOV)
|
||||
* <- PLOGI response
|
||||
* -> Retry PLOGI. Num retries using vnic.cfg
|
||||
*
|
||||
* -> PRLI to FCID of that PWWN (PRLI timeout 2 * R_A_TOV)
|
||||
* -> ABTS if timeout (ABTS tomeout - 2 * R_A_TOV)
|
||||
* <- PRLI response
|
||||
* -> Retry PRLI. Num retries using vnic.cfg
|
||||
*
|
||||
*/
|
||||
|
||||
#define FDLS_RETRY_COUNT 2
|
||||
|
||||
/*
|
||||
* OXID encoding:
|
||||
* bits 0-8: oxid idx - allocated from poool
|
||||
* bits 9-13: oxid frame code from fnic_oxid_frame_type_e
|
||||
* bits 14-15: all zeros
|
||||
*/
|
||||
#define FNIC_OXID_POOL_SZ (512) /* always power of 2 */
|
||||
#define FNIC_OXID_ENCODE(idx, frame_type) (frame_type | idx)
|
||||
#define FNIC_FRAME_MASK 0xFE00
|
||||
#define FNIC_FRAME_TYPE(oxid) (oxid & FNIC_FRAME_MASK)
|
||||
#define FNIC_OXID_IDX(oxid) ((oxid) & (FNIC_OXID_POOL_SZ - 1))
|
||||
|
||||
#define OXID_RECLAIM_TOV(iport) (2 * iport->r_a_tov) /* in milliseconds */
|
||||
|
||||
#define FNIC_FDLS_FABRIC_ABORT_ISSUED 0x1
|
||||
#define FNIC_FDLS_FPMA_LEARNT 0x2
|
||||
|
||||
/* tport flags */
|
||||
#define FNIC_FDLS_TPORT_IN_GPN_FT_LIST 0x1
|
||||
#define FNIC_FDLS_TGT_ABORT_ISSUED 0x2
|
||||
#define FNIC_FDLS_TPORT_SEND_ADISC 0x4
|
||||
#define FNIC_FDLS_RETRY_FRAME 0x8
|
||||
#define FNIC_FDLS_TPORT_BUSY 0x10
|
||||
#define FNIC_FDLS_TPORT_TERMINATING 0x20
|
||||
#define FNIC_FDLS_TPORT_DELETED 0x40
|
||||
#define FNIC_FDLS_SCSI_REGISTERED 0x200
|
||||
|
||||
/* Retry supported by rport(returned by prli service parameters) */
|
||||
#define FDLS_FC_RP_FLAGS_RETRY 0x1
|
||||
|
||||
#define fdls_set_state(_fdls_fabric, _state) ((_fdls_fabric)->state = _state)
|
||||
#define fdls_get_state(_fdls_fabric) ((_fdls_fabric)->state)
|
||||
|
||||
#define FNIC_FDMI_ACTIVE 0x8
|
||||
#define FNIC_FIRST_LINK_UP 0x2
|
||||
|
||||
#define fdls_set_tport_state(_tport, _state) (_tport->state = _state)
|
||||
#define fdls_get_tport_state(_tport) (_tport->state)
|
||||
|
||||
#define FNIC_PORTSPEED_10GBIT 1
|
||||
#define FNIC_FRAME_HT_ROOM (2148)
|
||||
#define FNIC_FCOE_FRAME_MAXSZ (2112)
|
||||
|
||||
|
||||
#define FNIC_FRAME_TYPE_FABRIC_FLOGI 0x1000
|
||||
#define FNIC_FRAME_TYPE_FABRIC_PLOGI 0x1200
|
||||
#define FNIC_FRAME_TYPE_FABRIC_RPN 0x1400
|
||||
#define FNIC_FRAME_TYPE_FABRIC_RFT 0x1600
|
||||
#define FNIC_FRAME_TYPE_FABRIC_RFF 0x1800
|
||||
#define FNIC_FRAME_TYPE_FABRIC_SCR 0x1A00
|
||||
#define FNIC_FRAME_TYPE_FABRIC_GPN_FT 0x1C00
|
||||
#define FNIC_FRAME_TYPE_FABRIC_LOGO 0x1E00
|
||||
#define FNIC_FRAME_TYPE_FDMI_PLOGI 0x2000
|
||||
#define FNIC_FRAME_TYPE_FDMI_RHBA 0x2200
|
||||
#define FNIC_FRAME_TYPE_FDMI_RPA 0x2400
|
||||
#define FNIC_FRAME_TYPE_TGT_PLOGI 0x2600
|
||||
#define FNIC_FRAME_TYPE_TGT_PRLI 0x2800
|
||||
#define FNIC_FRAME_TYPE_TGT_ADISC 0x2A00
|
||||
#define FNIC_FRAME_TYPE_TGT_LOGO 0x2C00
|
||||
|
||||
struct fnic_fip_fcf_s {
|
||||
uint16_t vlan_id;
|
||||
uint8_t fcf_mac[6];
|
||||
uint8_t fcf_priority;
|
||||
uint32_t fka_adv_period;
|
||||
uint8_t ka_disabled;
|
||||
};
|
||||
|
||||
enum fnic_fdls_state_e {
|
||||
FDLS_STATE_INIT = 0,
|
||||
FDLS_STATE_LINKDOWN,
|
||||
FDLS_STATE_FABRIC_LOGO,
|
||||
FDLS_STATE_FLOGO_DONE,
|
||||
FDLS_STATE_FABRIC_FLOGI,
|
||||
FDLS_STATE_FABRIC_PLOGI,
|
||||
FDLS_STATE_RPN_ID,
|
||||
FDLS_STATE_REGISTER_FC4_TYPES,
|
||||
FDLS_STATE_REGISTER_FC4_FEATURES,
|
||||
FDLS_STATE_SCR,
|
||||
FDLS_STATE_GPN_FT,
|
||||
FDLS_STATE_TGT_DISCOVERY,
|
||||
FDLS_STATE_RSCN_GPN_FT,
|
||||
FDLS_STATE_SEND_GPNFT
|
||||
};
|
||||
|
||||
struct fnic_fdls_fabric_s {
|
||||
enum fnic_fdls_state_e state;
|
||||
uint32_t flags;
|
||||
struct list_head tport_list; /* List of discovered tports */
|
||||
struct timer_list retry_timer;
|
||||
int del_timer_inprogress;
|
||||
int del_fdmi_timer_inprogress;
|
||||
int retry_counter;
|
||||
int timer_pending;
|
||||
int fdmi_retry;
|
||||
struct timer_list fdmi_timer;
|
||||
int fdmi_pending;
|
||||
};
|
||||
|
||||
struct fnic_fdls_fip_s {
|
||||
uint32_t state;
|
||||
uint32_t flogi_retry;
|
||||
};
|
||||
|
||||
/* Message to tport_event_handler */
|
||||
enum fnic_tgt_msg_id {
|
||||
TGT_EV_NONE = 0,
|
||||
TGT_EV_RPORT_ADD,
|
||||
TGT_EV_RPORT_DEL,
|
||||
TGT_EV_TPORT_DELETE,
|
||||
TGT_EV_REMOVE
|
||||
};
|
||||
|
||||
struct fnic_tport_event_s {
|
||||
struct list_head links;
|
||||
enum fnic_tgt_msg_id event;
|
||||
void *arg1;
|
||||
};
|
||||
|
||||
enum fdls_tgt_state_e {
|
||||
FDLS_TGT_STATE_INIT = 0,
|
||||
FDLS_TGT_STATE_PLOGI,
|
||||
FDLS_TGT_STATE_PRLI,
|
||||
FDLS_TGT_STATE_READY,
|
||||
FDLS_TGT_STATE_LOGO_RECEIVED,
|
||||
FDLS_TGT_STATE_ADISC,
|
||||
FDL_TGT_STATE_PLOGO,
|
||||
FDLS_TGT_STATE_OFFLINING,
|
||||
FDLS_TGT_STATE_OFFLINE
|
||||
};
|
||||
|
||||
struct fnic_tport_s {
|
||||
struct list_head links; /* To link the tports */
|
||||
enum fdls_tgt_state_e state;
|
||||
uint32_t flags;
|
||||
uint32_t fcid;
|
||||
uint64_t wwpn;
|
||||
uint64_t wwnn;
|
||||
uint16_t active_oxid;
|
||||
uint16_t tgt_flags;
|
||||
atomic_t in_flight; /* io counter */
|
||||
uint16_t max_payload_size;
|
||||
uint16_t r_a_tov;
|
||||
uint16_t e_d_tov;
|
||||
uint16_t lun0_delay;
|
||||
int max_concur_seqs;
|
||||
uint32_t fcp_csp;
|
||||
struct timer_list retry_timer;
|
||||
int del_timer_inprogress;
|
||||
int retry_counter;
|
||||
int timer_pending;
|
||||
unsigned int num_pending_cmds;
|
||||
int nexus_restart_count;
|
||||
int exch_reset_in_progress;
|
||||
void *iport;
|
||||
struct work_struct tport_del_work;
|
||||
struct completion *tport_del_done;
|
||||
struct fc_rport *rport;
|
||||
char str_wwpn[20];
|
||||
char str_wwnn[20];
|
||||
};
|
||||
|
||||
/* OXID pool related structures */
|
||||
struct reclaim_entry_s {
|
||||
struct list_head links;
|
||||
/* oxid that needs to be freed after 2*r_a_tov */
|
||||
uint16_t oxid_idx;
|
||||
/* in jiffies. Use this to waiting time */
|
||||
unsigned long expires;
|
||||
unsigned long *bitmap;
|
||||
};
|
||||
|
||||
/* used for allocating oxids for fabric and fdmi requests */
|
||||
struct fnic_oxid_pool_s {
|
||||
DECLARE_BITMAP(bitmap, FNIC_OXID_POOL_SZ);
|
||||
int sz; /* size of the pool or block */
|
||||
int next_idx; /* used for cycling through the oxid pool */
|
||||
|
||||
/* retry schedule free */
|
||||
DECLARE_BITMAP(pending_schedule_free, FNIC_OXID_POOL_SZ);
|
||||
struct delayed_work schedule_oxid_free_retry;
|
||||
|
||||
/* List of oxids that need to be freed and reclaimed.
|
||||
* This list is shared by all the oxid pools
|
||||
*/
|
||||
struct list_head oxid_reclaim_list;
|
||||
/* Work associated with reclaim list */
|
||||
struct delayed_work oxid_reclaim_work;
|
||||
};
|
||||
|
||||
/* iport */
|
||||
enum fnic_iport_state_e {
|
||||
FNIC_IPORT_STATE_INIT = 0,
|
||||
FNIC_IPORT_STATE_LINK_WAIT,
|
||||
FNIC_IPORT_STATE_FIP,
|
||||
FNIC_IPORT_STATE_FABRIC_DISC,
|
||||
FNIC_IPORT_STATE_READY
|
||||
};
|
||||
|
||||
struct fnic_iport_s {
|
||||
enum fnic_iport_state_e state;
|
||||
struct fnic *fnic;
|
||||
uint64_t boot_time;
|
||||
uint32_t flags;
|
||||
int usefip;
|
||||
uint8_t hwmac[6]; /* HW MAC Addr */
|
||||
uint8_t fpma[6]; /* Fabric Provided MA */
|
||||
uint8_t fcfmac[6]; /* MAC addr of Fabric */
|
||||
uint16_t vlan_id;
|
||||
uint32_t fcid;
|
||||
|
||||
/* oxid pool */
|
||||
struct fnic_oxid_pool_s oxid_pool;
|
||||
|
||||
/*
|
||||
* fabric reqs are serialized and only one req at a time.
|
||||
* Tracking the oxid for sending abort
|
||||
*/
|
||||
uint16_t active_oxid_fabric_req;
|
||||
/* fdmi only */
|
||||
uint16_t active_oxid_fdmi_plogi;
|
||||
uint16_t active_oxid_fdmi_rhba;
|
||||
uint16_t active_oxid_fdmi_rpa;
|
||||
|
||||
struct fnic_fip_fcf_s selected_fcf;
|
||||
struct fnic_fdls_fip_s fip;
|
||||
struct fnic_fdls_fabric_s fabric;
|
||||
struct list_head tport_list;
|
||||
struct list_head tport_list_pending_del;
|
||||
/* list of tports for which we are yet to send PLOGO */
|
||||
struct list_head inprocess_tport_list;
|
||||
struct list_head deleted_tport_list;
|
||||
struct work_struct tport_event_work;
|
||||
uint32_t e_d_tov; /* msec */
|
||||
uint32_t r_a_tov; /* msec */
|
||||
uint32_t link_supported_speeds;
|
||||
uint32_t max_flogi_retries;
|
||||
uint32_t max_plogi_retries;
|
||||
uint32_t plogi_timeout;
|
||||
uint32_t service_params;
|
||||
uint64_t wwpn;
|
||||
uint64_t wwnn;
|
||||
uint16_t max_payload_size;
|
||||
spinlock_t deleted_tport_lst_lock;
|
||||
struct completion *flogi_reg_done;
|
||||
struct fnic_iport_stats iport_stats;
|
||||
char str_wwpn[20];
|
||||
char str_wwnn[20];
|
||||
};
|
||||
|
||||
struct rport_dd_data_s {
|
||||
struct fnic_tport_s *tport;
|
||||
struct fnic_iport_s *iport;
|
||||
};
|
||||
|
||||
enum fnic_recv_frame_type_e {
|
||||
FNIC_FABRIC_FLOGI_RSP = 1,
|
||||
FNIC_FABRIC_PLOGI_RSP,
|
||||
FNIC_FABRIC_RPN_RSP,
|
||||
FNIC_FABRIC_RFT_RSP,
|
||||
FNIC_FABRIC_RFF_RSP,
|
||||
FNIC_FABRIC_SCR_RSP,
|
||||
FNIC_FABRIC_GPN_FT_RSP,
|
||||
FNIC_FABRIC_BLS_ABTS_RSP,
|
||||
FNIC_FDMI_PLOGI_RSP,
|
||||
FNIC_FDMI_REG_HBA_RSP,
|
||||
FNIC_FDMI_RPA_RSP,
|
||||
FNIC_FDMI_BLS_ABTS_RSP,
|
||||
FNIC_FABRIC_LOGO_RSP,
|
||||
|
||||
/* responses to target requests */
|
||||
FNIC_TPORT_PLOGI_RSP,
|
||||
FNIC_TPORT_PRLI_RSP,
|
||||
FNIC_TPORT_ADISC_RSP,
|
||||
FNIC_TPORT_BLS_ABTS_RSP,
|
||||
FNIC_TPORT_LOGO_RSP,
|
||||
|
||||
/* unsolicited requests */
|
||||
FNIC_BLS_ABTS_REQ,
|
||||
FNIC_ELS_PLOGI_REQ,
|
||||
FNIC_ELS_RSCN_REQ,
|
||||
FNIC_ELS_LOGO_REQ,
|
||||
FNIC_ELS_ECHO_REQ,
|
||||
FNIC_ELS_ADISC,
|
||||
FNIC_ELS_RLS,
|
||||
FNIC_ELS_RRQ,
|
||||
FNIC_ELS_UNSUPPORTED_REQ,
|
||||
};
|
||||
|
||||
enum fnic_port_speeds {
|
||||
DCEM_PORTSPEED_NONE = 0,
|
||||
DCEM_PORTSPEED_1G = 1000,
|
||||
DCEM_PORTSPEED_2G = 2000,
|
||||
DCEM_PORTSPEED_4G = 4000,
|
||||
DCEM_PORTSPEED_8G = 8000,
|
||||
DCEM_PORTSPEED_10G = 10000,
|
||||
DCEM_PORTSPEED_16G = 16000,
|
||||
DCEM_PORTSPEED_20G = 20000,
|
||||
DCEM_PORTSPEED_25G = 25000,
|
||||
DCEM_PORTSPEED_32G = 32000,
|
||||
DCEM_PORTSPEED_40G = 40000,
|
||||
DCEM_PORTSPEED_4x10G = 41000,
|
||||
DCEM_PORTSPEED_50G = 50000,
|
||||
DCEM_PORTSPEED_64G = 64000,
|
||||
DCEM_PORTSPEED_100G = 100000,
|
||||
DCEM_PORTSPEED_128G = 128000,
|
||||
};
|
||||
|
||||
/* Function Declarations */
|
||||
/* fdls_disc.c */
|
||||
void fnic_fdls_disc_init(struct fnic_iport_s *iport);
|
||||
void fnic_fdls_disc_start(struct fnic_iport_s *iport);
|
||||
void fnic_fdls_recv_frame(struct fnic_iport_s *iport, void *rx_frame,
|
||||
int len, int fchdr_offset);
|
||||
void fnic_fdls_link_down(struct fnic_iport_s *iport);
|
||||
int fdls_init_frame_pool(struct fnic_iport_s *iport);
|
||||
uint8_t *fdls_alloc_frame(struct fnic_iport_s *iport);
|
||||
uint16_t fdls_alloc_oxid(struct fnic_iport_s *iport, int oxid_frame_type,
|
||||
uint16_t *active_oxid);
|
||||
void fdls_free_oxid(struct fnic_iport_s *iport,
|
||||
uint16_t oxid, uint16_t *active_oxid);
|
||||
void fdls_tgt_logout(struct fnic_iport_s *iport,
|
||||
struct fnic_tport_s *tport);
|
||||
void fnic_del_fabric_timer_sync(struct fnic *fnic);
|
||||
void fnic_del_tport_timer_sync(struct fnic *fnic,
|
||||
struct fnic_tport_s *tport);
|
||||
void fdls_send_fabric_logo(struct fnic_iport_s *iport);
|
||||
int fnic_fdls_validate_and_get_frame_type(struct fnic_iport_s *iport,
|
||||
struct fc_frame_header *fchdr);
|
||||
void fdls_send_tport_abts(struct fnic_iport_s *iport,
|
||||
struct fnic_tport_s *tport);
|
||||
bool fdls_delete_tport(struct fnic_iport_s *iport,
|
||||
struct fnic_tport_s *tport);
|
||||
void fdls_fdmi_timer_callback(struct timer_list *t);
|
||||
|
||||
/* fnic_fcs.c */
|
||||
void fnic_fdls_init(struct fnic *fnic, int usefip);
|
||||
void fnic_send_fcoe_frame(struct fnic_iport_s *iport, void *frame,
|
||||
int frame_size);
|
||||
void fnic_fcoe_send_vlan_req(struct fnic *fnic);
|
||||
int fnic_send_fip_frame(struct fnic_iport_s *iport,
|
||||
void *frame, int frame_size);
|
||||
void fnic_fdls_learn_fcoe_macs(struct fnic_iport_s *iport, void *rx_frame,
|
||||
uint8_t *fcid);
|
||||
void fnic_fdls_add_tport(struct fnic_iport_s *iport,
|
||||
struct fnic_tport_s *tport, unsigned long flags);
|
||||
void fnic_fdls_remove_tport(struct fnic_iport_s *iport,
|
||||
struct fnic_tport_s *tport,
|
||||
unsigned long flags);
|
||||
|
||||
/* fip.c */
|
||||
void fnic_fcoe_send_vlan_req(struct fnic *fnic);
|
||||
void fnic_common_fip_cleanup(struct fnic *fnic);
|
||||
int fdls_fip_recv_frame(struct fnic *fnic, void *frame);
|
||||
void fnic_handle_fcs_ka_timer(struct timer_list *t);
|
||||
void fnic_handle_enode_ka_timer(struct timer_list *t);
|
||||
void fnic_handle_vn_ka_timer(struct timer_list *t);
|
||||
void fnic_handle_fip_timer(struct timer_list *t);
|
||||
extern void fdls_fabric_timer_callback(struct timer_list *t);
|
||||
|
||||
/* fnic_scsi.c */
|
||||
void fnic_scsi_fcpio_reset(struct fnic *fnic);
|
||||
extern void fdls_fabric_timer_callback(struct timer_list *t);
|
||||
void fnic_rport_exch_reset(struct fnic *fnic, u32 fcid);
|
||||
int fnic_fdls_register_portid(struct fnic_iport_s *iport, u32 port_id,
|
||||
void *fp);
|
||||
struct fnic_tport_s *fnic_find_tport_by_fcid(struct fnic_iport_s *iport,
|
||||
uint32_t fcid);
|
||||
struct fnic_tport_s *fnic_find_tport_by_wwpn(struct fnic_iport_s *iport,
|
||||
uint64_t wwpn);
|
||||
|
||||
#endif /* _FNIC_FDLS_H_ */
|
|
@ -1,48 +0,0 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Copyright 2008 Cisco Systems, Inc. All rights reserved.
|
||||
* Copyright 2007 Nuova Systems, Inc. All rights reserved.
|
||||
*/
|
||||
|
||||
#ifndef _FNIC_FIP_H_
|
||||
#define _FNIC_FIP_H_
|
||||
|
||||
|
||||
#define FCOE_CTLR_START_DELAY 2000 /* ms after first adv. to choose FCF */
|
||||
#define FCOE_CTLR_FIPVLAN_TOV 2000 /* ms after FIP VLAN disc */
|
||||
#define FCOE_CTLR_MAX_SOL 8
|
||||
|
||||
#define FINC_MAX_FLOGI_REJECTS 8
|
||||
|
||||
struct vlan {
|
||||
__be16 vid;
|
||||
__be16 type;
|
||||
};
|
||||
|
||||
/*
|
||||
* VLAN entry.
|
||||
*/
|
||||
struct fcoe_vlan {
|
||||
struct list_head list;
|
||||
u16 vid; /* vlan ID */
|
||||
u16 sol_count; /* no. of sols sent */
|
||||
u16 state; /* state */
|
||||
};
|
||||
|
||||
enum fip_vlan_state {
|
||||
FIP_VLAN_AVAIL = 0, /* don't do anything */
|
||||
FIP_VLAN_SENT = 1, /* sent */
|
||||
FIP_VLAN_USED = 2, /* succeed */
|
||||
FIP_VLAN_FAILED = 3, /* failed to response */
|
||||
};
|
||||
|
||||
struct fip_vlan {
|
||||
struct ethhdr eth;
|
||||
struct fip_header fip;
|
||||
struct {
|
||||
struct fip_mac_desc mac;
|
||||
struct fip_wwn_desc wwnn;
|
||||
} desc;
|
||||
};
|
||||
|
||||
#endif /* __FINC_FIP_H_ */
|
|
@ -7,6 +7,7 @@
|
|||
#define _FNIC_IO_H_
|
||||
|
||||
#include <scsi/fc/fc_fcp.h>
|
||||
#include "fnic_fdls.h"
|
||||
|
||||
#define FNIC_DFLT_SG_DESC_CNT 32
|
||||
#define FNIC_MAX_SG_DESC_CNT 256 /* Maximum descriptors per sgl */
|
||||
|
@ -41,6 +42,8 @@ enum fnic_ioreq_state {
|
|||
};
|
||||
|
||||
struct fnic_io_req {
|
||||
struct fnic_iport_s *iport;
|
||||
struct fnic_tport_s *tport;
|
||||
struct host_sg_desc *sgl_list; /* sgl list */
|
||||
void *sgl_list_alloc; /* sgl list address used for free */
|
||||
dma_addr_t sense_buf_pa; /* dma address for sense buffer*/
|
||||
|
@ -55,15 +58,4 @@ struct fnic_io_req {
|
|||
unsigned int tag;
|
||||
struct scsi_cmnd *sc; /* midlayer's cmd pointer */
|
||||
};
|
||||
|
||||
enum fnic_port_speeds {
|
||||
DCEM_PORTSPEED_NONE = 0,
|
||||
DCEM_PORTSPEED_1G = 1000,
|
||||
DCEM_PORTSPEED_10G = 10000,
|
||||
DCEM_PORTSPEED_20G = 20000,
|
||||
DCEM_PORTSPEED_25G = 25000,
|
||||
DCEM_PORTSPEED_40G = 40000,
|
||||
DCEM_PORTSPEED_4x10G = 41000,
|
||||
DCEM_PORTSPEED_100G = 100000,
|
||||
};
|
||||
#endif /* _FNIC_IO_H_ */
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
#include <linux/errno.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <scsi/libfc.h>
|
||||
#include <scsi/scsi_transport_fc.h>
|
||||
#include <scsi/fc_frame.h>
|
||||
#include "vnic_dev.h"
|
||||
#include "vnic_intr.h"
|
||||
|
@ -222,7 +222,7 @@ int fnic_request_intr(struct fnic *fnic)
|
|||
fnic->msix[i].devname,
|
||||
fnic->msix[i].devid);
|
||||
if (err) {
|
||||
FNIC_ISR_DBG(KERN_ERR, fnic->lport->host, fnic->fnic_num,
|
||||
FNIC_ISR_DBG(KERN_ERR, fnic->host, fnic->fnic_num,
|
||||
"request_irq failed with error: %d\n",
|
||||
err);
|
||||
fnic_free_intr(fnic);
|
||||
|
@ -250,10 +250,10 @@ int fnic_set_intr_mode_msix(struct fnic *fnic)
|
|||
* We need n RQs, m WQs, o Copy WQs, n+m+o CQs, and n+m+o+1 INTRs
|
||||
* (last INTR is used for WQ/RQ errors and notification area)
|
||||
*/
|
||||
FNIC_ISR_DBG(KERN_INFO, fnic->lport->host, fnic->fnic_num,
|
||||
FNIC_ISR_DBG(KERN_INFO, fnic->host, fnic->fnic_num,
|
||||
"rq-array size: %d wq-array size: %d copy-wq array size: %d\n",
|
||||
n, m, o);
|
||||
FNIC_ISR_DBG(KERN_INFO, fnic->lport->host, fnic->fnic_num,
|
||||
FNIC_ISR_DBG(KERN_INFO, fnic->host, fnic->fnic_num,
|
||||
"rq_count: %d raw_wq_count: %d wq_copy_count: %d cq_count: %d\n",
|
||||
fnic->rq_count, fnic->raw_wq_count,
|
||||
fnic->wq_copy_count, fnic->cq_count);
|
||||
|
@ -265,17 +265,17 @@ int fnic_set_intr_mode_msix(struct fnic *fnic)
|
|||
|
||||
vec_count = pci_alloc_irq_vectors(fnic->pdev, min_irqs, vecs,
|
||||
PCI_IRQ_MSIX | PCI_IRQ_AFFINITY);
|
||||
FNIC_ISR_DBG(KERN_INFO, fnic->lport->host, fnic->fnic_num,
|
||||
FNIC_ISR_DBG(KERN_INFO, fnic->host, fnic->fnic_num,
|
||||
"allocated %d MSI-X vectors\n",
|
||||
vec_count);
|
||||
|
||||
if (vec_count > 0) {
|
||||
if (vec_count < vecs) {
|
||||
FNIC_ISR_DBG(KERN_ERR, fnic->lport->host, fnic->fnic_num,
|
||||
FNIC_ISR_DBG(KERN_ERR, fnic->host, fnic->fnic_num,
|
||||
"interrupts number mismatch: vec_count: %d vecs: %d\n",
|
||||
vec_count, vecs);
|
||||
if (vec_count < min_irqs) {
|
||||
FNIC_ISR_DBG(KERN_ERR, fnic->lport->host, fnic->fnic_num,
|
||||
FNIC_ISR_DBG(KERN_ERR, fnic->host, fnic->fnic_num,
|
||||
"no interrupts for copy wq\n");
|
||||
return 1;
|
||||
}
|
||||
|
@ -287,7 +287,7 @@ int fnic_set_intr_mode_msix(struct fnic *fnic)
|
|||
fnic->wq_copy_count = vec_count - n - m - 1;
|
||||
fnic->wq_count = fnic->raw_wq_count + fnic->wq_copy_count;
|
||||
if (fnic->cq_count != vec_count - 1) {
|
||||
FNIC_ISR_DBG(KERN_ERR, fnic->lport->host, fnic->fnic_num,
|
||||
FNIC_ISR_DBG(KERN_ERR, fnic->host, fnic->fnic_num,
|
||||
"CQ count: %d does not match MSI-X vector count: %d\n",
|
||||
fnic->cq_count, vec_count);
|
||||
fnic->cq_count = vec_count - 1;
|
||||
|
@ -295,23 +295,23 @@ int fnic_set_intr_mode_msix(struct fnic *fnic)
|
|||
fnic->intr_count = vec_count;
|
||||
fnic->err_intr_offset = fnic->rq_count + fnic->wq_count;
|
||||
|
||||
FNIC_ISR_DBG(KERN_INFO, fnic->lport->host, fnic->fnic_num,
|
||||
FNIC_ISR_DBG(KERN_INFO, fnic->host, fnic->fnic_num,
|
||||
"rq_count: %d raw_wq_count: %d copy_wq_base: %d\n",
|
||||
fnic->rq_count,
|
||||
fnic->raw_wq_count, fnic->copy_wq_base);
|
||||
|
||||
FNIC_ISR_DBG(KERN_INFO, fnic->lport->host, fnic->fnic_num,
|
||||
FNIC_ISR_DBG(KERN_INFO, fnic->host, fnic->fnic_num,
|
||||
"wq_copy_count: %d wq_count: %d cq_count: %d\n",
|
||||
fnic->wq_copy_count,
|
||||
fnic->wq_count, fnic->cq_count);
|
||||
|
||||
FNIC_ISR_DBG(KERN_INFO, fnic->lport->host, fnic->fnic_num,
|
||||
FNIC_ISR_DBG(KERN_INFO, fnic->host, fnic->fnic_num,
|
||||
"intr_count: %d err_intr_offset: %u",
|
||||
fnic->intr_count,
|
||||
fnic->err_intr_offset);
|
||||
|
||||
vnic_dev_set_intr_mode(fnic->vdev, VNIC_DEV_INTR_MODE_MSIX);
|
||||
FNIC_ISR_DBG(KERN_INFO, fnic->lport->host, fnic->fnic_num,
|
||||
FNIC_ISR_DBG(KERN_INFO, fnic->host, fnic->fnic_num,
|
||||
"fnic using MSI-X\n");
|
||||
return 0;
|
||||
}
|
||||
|
@ -351,7 +351,7 @@ int fnic_set_intr_mode(struct fnic *fnic)
|
|||
fnic->intr_count = 1;
|
||||
fnic->err_intr_offset = 0;
|
||||
|
||||
FNIC_ISR_DBG(KERN_DEBUG, fnic->lport->host, fnic->fnic_num,
|
||||
FNIC_ISR_DBG(KERN_DEBUG, fnic->host, fnic->fnic_num,
|
||||
"Using MSI Interrupts\n");
|
||||
vnic_dev_set_intr_mode(fnic->vdev, VNIC_DEV_INTR_MODE_MSI);
|
||||
|
||||
|
@ -377,7 +377,7 @@ int fnic_set_intr_mode(struct fnic *fnic)
|
|||
fnic->cq_count = 3;
|
||||
fnic->intr_count = 3;
|
||||
|
||||
FNIC_ISR_DBG(KERN_DEBUG, fnic->lport->host, fnic->fnic_num,
|
||||
FNIC_ISR_DBG(KERN_DEBUG, fnic->host, fnic->fnic_num,
|
||||
"Using Legacy Interrupts\n");
|
||||
vnic_dev_set_intr_mode(fnic->vdev, VNIC_DEV_INTR_MODE_INTX);
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load diff
131
drivers/scsi/fnic/fnic_pci_subsys_devid.c
Normal file
131
drivers/scsi/fnic/fnic_pci_subsys_devid.c
Normal file
|
@ -0,0 +1,131 @@
|
|||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright 2008 Cisco Systems, Inc. All rights reserved.
|
||||
* Copyright 2007 Nuova Systems, Inc. All rights reserved.
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/mempool.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/kthread.h>
|
||||
#include <linux/if_ether.h>
|
||||
#include "fnic.h"
|
||||
|
||||
static struct fnic_pcie_device fnic_pcie_device_table[] = {
|
||||
{PCI_DEVICE_ID_CISCO_SERENO, "Sereno", PCI_SUBDEVICE_ID_CISCO_VASONA,
|
||||
"VIC 1280"},
|
||||
{PCI_DEVICE_ID_CISCO_SERENO, "Sereno", PCI_SUBDEVICE_ID_CISCO_COTATI,
|
||||
"VIC 1240"},
|
||||
{PCI_DEVICE_ID_CISCO_SERENO, "Sereno",
|
||||
PCI_SUBDEVICE_ID_CISCO_LEXINGTON, "VIC 1225"},
|
||||
{PCI_DEVICE_ID_CISCO_SERENO, "Sereno", PCI_SUBDEVICE_ID_CISCO_ICEHOUSE,
|
||||
"VIC 1285"},
|
||||
{PCI_DEVICE_ID_CISCO_SERENO, "Sereno",
|
||||
PCI_SUBDEVICE_ID_CISCO_KIRKWOODLAKE, "VIC 1225T"},
|
||||
{PCI_DEVICE_ID_CISCO_SERENO, "Sereno",
|
||||
PCI_SUBDEVICE_ID_CISCO_SUSANVILLE, "VIC 1227"},
|
||||
{PCI_DEVICE_ID_CISCO_SERENO, "Sereno", PCI_SUBDEVICE_ID_CISCO_TORRANCE,
|
||||
"VIC 1227T"},
|
||||
|
||||
{PCI_DEVICE_ID_CISCO_CRUZ, "Cruz", PCI_SUBDEVICE_ID_CISCO_CALISTOGA,
|
||||
"VIC 1340"},
|
||||
{PCI_DEVICE_ID_CISCO_CRUZ, "Cruz", PCI_SUBDEVICE_ID_CISCO_MOUNTAINVIEW,
|
||||
"VIC 1380"},
|
||||
{PCI_DEVICE_ID_CISCO_CRUZ, "Cruz", PCI_SUBDEVICE_ID_CISCO_MOUNTTIAN,
|
||||
"C3260-SIOC"},
|
||||
{PCI_DEVICE_ID_CISCO_CRUZ, "Cruz", PCI_SUBDEVICE_ID_CISCO_CLEARLAKE,
|
||||
"VIC 1385"},
|
||||
{PCI_DEVICE_ID_CISCO_CRUZ, "Cruz", PCI_SUBDEVICE_ID_CISCO_MOUNTTIAN2,
|
||||
"C3260-SIOC"},
|
||||
{PCI_DEVICE_ID_CISCO_CRUZ, "Cruz", PCI_SUBDEVICE_ID_CISCO_CLAREMONT,
|
||||
"VIC 1387"},
|
||||
|
||||
{PCI_DEVICE_ID_CISCO_BODEGA, "Bodega", PCI_SUBDEVICE_ID_CISCO_BRADBURY,
|
||||
"VIC 1457"},
|
||||
{PCI_DEVICE_ID_CISCO_BODEGA, "Bodega",
|
||||
PCI_SUBDEVICE_ID_CISCO_BRENTWOOD, "VIC 1455"},
|
||||
{PCI_DEVICE_ID_CISCO_BODEGA, "Bodega",
|
||||
PCI_SUBDEVICE_ID_CISCO_BURLINGAME, "VIC 1487"},
|
||||
{PCI_DEVICE_ID_CISCO_BODEGA, "Bodega", PCI_SUBDEVICE_ID_CISCO_BAYSIDE,
|
||||
"VIC 1485"},
|
||||
{PCI_DEVICE_ID_CISCO_BODEGA, "Bodega",
|
||||
PCI_SUBDEVICE_ID_CISCO_BAKERSFIELD, "VIC 1440"},
|
||||
{PCI_DEVICE_ID_CISCO_BODEGA, "Bodega",
|
||||
PCI_SUBDEVICE_ID_CISCO_BOONVILLE, "VIC 1480"},
|
||||
{PCI_DEVICE_ID_CISCO_BODEGA, "Bodega", PCI_SUBDEVICE_ID_CISCO_BENICIA,
|
||||
"VIC 1495"},
|
||||
{PCI_DEVICE_ID_CISCO_BODEGA, "Bodega", PCI_SUBDEVICE_ID_CISCO_BEAUMONT,
|
||||
"VIC 1497"},
|
||||
{PCI_DEVICE_ID_CISCO_BODEGA, "Bodega", PCI_SUBDEVICE_ID_CISCO_BRISBANE,
|
||||
"VIC 1467"},
|
||||
{PCI_DEVICE_ID_CISCO_BODEGA, "Bodega", PCI_SUBDEVICE_ID_CISCO_BENTON,
|
||||
"VIC 1477"},
|
||||
{PCI_DEVICE_ID_CISCO_BODEGA, "Bodega",
|
||||
PCI_SUBDEVICE_ID_CISCO_TWIN_RIVER, "VIC 14425"},
|
||||
{PCI_DEVICE_ID_CISCO_BODEGA, "Bodega",
|
||||
PCI_SUBDEVICE_ID_CISCO_TWIN_PEAK, "VIC 14825"},
|
||||
|
||||
{PCI_DEVICE_ID_CISCO_BEVERLY, "Beverly", PCI_SUBDEVICE_ID_CISCO_BERN,
|
||||
"VIC 15420"},
|
||||
{PCI_DEVICE_ID_CISCO_BEVERLY, "Beverly",
|
||||
PCI_SUBDEVICE_ID_CISCO_STOCKHOLM, "VIC 15428"},
|
||||
{PCI_DEVICE_ID_CISCO_BEVERLY, "Beverly", PCI_SUBDEVICE_ID_CISCO_KRAKOW,
|
||||
"VIC 15411"},
|
||||
{PCI_DEVICE_ID_CISCO_BEVERLY, "Beverly",
|
||||
PCI_SUBDEVICE_ID_CISCO_LUCERNE, "VIC 15231"},
|
||||
{PCI_DEVICE_ID_CISCO_BEVERLY, "Beverly", PCI_SUBDEVICE_ID_CISCO_TURKU,
|
||||
"VIC 15238"},
|
||||
{PCI_DEVICE_ID_CISCO_BEVERLY, "Beverly", PCI_SUBDEVICE_ID_CISCO_GENEVA,
|
||||
"VIC 15422"},
|
||||
{PCI_DEVICE_ID_CISCO_BEVERLY, "Beverly",
|
||||
PCI_SUBDEVICE_ID_CISCO_HELSINKI, "VIC 15235"},
|
||||
{PCI_DEVICE_ID_CISCO_BEVERLY, "Beverly",
|
||||
PCI_SUBDEVICE_ID_CISCO_GOTHENBURG, "VIC 15425"},
|
||||
{PCI_DEVICE_ID_CISCO_BEVERLY, "Beverly",
|
||||
PCI_SUBDEVICE_ID_CISCO_TURKU_PLUS, "VIC 15237"},
|
||||
{PCI_DEVICE_ID_CISCO_BEVERLY, "Beverly", PCI_SUBDEVICE_ID_CISCO_ZURICH,
|
||||
"VIC 15230"},
|
||||
{PCI_DEVICE_ID_CISCO_BEVERLY, "Beverly", PCI_SUBDEVICE_ID_CISCO_RIGA,
|
||||
"VIC 15427"},
|
||||
|
||||
{0,}
|
||||
};
|
||||
|
||||
int fnic_get_desc_by_devid(struct pci_dev *pdev, char **desc,
|
||||
char **subsys_desc)
|
||||
{
|
||||
unsigned short device = PCI_DEVICE_ID_CISCO_VIC_FC;
|
||||
int max = ARRAY_SIZE(fnic_pcie_device_table);
|
||||
struct fnic_pcie_device *t = fnic_pcie_device_table;
|
||||
int index = 0;
|
||||
|
||||
if (pdev->device != device)
|
||||
return 1;
|
||||
|
||||
while (t->device != 0) {
|
||||
if (memcmp
|
||||
((char *) &pdev->subsystem_device,
|
||||
(char *) &t->subsystem_device, sizeof(short)) == 0)
|
||||
break;
|
||||
t++;
|
||||
index++;
|
||||
}
|
||||
|
||||
if (index >= max - 1) {
|
||||
*desc = NULL;
|
||||
*subsys_desc = NULL;
|
||||
return 1;
|
||||
}
|
||||
|
||||
*desc = fnic_pcie_device_table[index].desc;
|
||||
*subsys_desc = fnic_pcie_device_table[index].subsys_desc;
|
||||
return 0;
|
||||
}
|
|
@ -30,9 +30,7 @@ int fnic_get_vnic_config(struct fnic *fnic)
|
|||
offsetof(struct vnic_fc_config, m), \
|
||||
sizeof(c->m), &c->m); \
|
||||
if (err) { \
|
||||
shost_printk(KERN_ERR, fnic->lport->host, \
|
||||
"Error getting %s, %d\n", #m, \
|
||||
err); \
|
||||
dev_err(&fnic->pdev->dev, "Error getting %s, %d\n", #m, err); \
|
||||
return err; \
|
||||
} \
|
||||
} while (0);
|
||||
|
@ -60,6 +58,11 @@ int fnic_get_vnic_config(struct fnic *fnic)
|
|||
GET_CONFIG(intr_mode);
|
||||
GET_CONFIG(wq_copy_count);
|
||||
|
||||
if ((c->flags & (VFCF_FC_INITIATOR)) == 0) {
|
||||
dev_info(&fnic->pdev->dev, "vNIC role not defined (def role: FC Init)\n");
|
||||
c->flags |= VFCF_FC_INITIATOR;
|
||||
}
|
||||
|
||||
c->wq_enet_desc_count =
|
||||
min_t(u32, VNIC_FNIC_WQ_DESCS_MAX,
|
||||
max_t(u32, VNIC_FNIC_WQ_DESCS_MIN,
|
||||
|
@ -139,40 +142,28 @@ int fnic_get_vnic_config(struct fnic *fnic)
|
|||
|
||||
c->wq_copy_count = min_t(u16, FNIC_WQ_COPY_MAX, c->wq_copy_count);
|
||||
|
||||
shost_printk(KERN_INFO, fnic->lport->host,
|
||||
"vNIC MAC addr %pM "
|
||||
"wq/wq_copy/rq %d/%d/%d\n",
|
||||
fnic->ctlr.ctl_src_addr,
|
||||
dev_info(&fnic->pdev->dev, "fNIC MAC addr %p wq/wq_copy/rq %d/%d/%d\n",
|
||||
fnic->data_src_addr,
|
||||
c->wq_enet_desc_count, c->wq_copy_desc_count,
|
||||
c->rq_desc_count);
|
||||
shost_printk(KERN_INFO, fnic->lport->host,
|
||||
"vNIC node wwn %llx port wwn %llx\n",
|
||||
dev_info(&fnic->pdev->dev, "fNIC node wwn 0x%llx port wwn 0x%llx\n",
|
||||
c->node_wwn, c->port_wwn);
|
||||
shost_printk(KERN_INFO, fnic->lport->host,
|
||||
"vNIC ed_tov %d ra_tov %d\n",
|
||||
dev_info(&fnic->pdev->dev, "fNIC ed_tov %d ra_tov %d\n",
|
||||
c->ed_tov, c->ra_tov);
|
||||
shost_printk(KERN_INFO, fnic->lport->host,
|
||||
"vNIC mtu %d intr timer %d\n",
|
||||
dev_info(&fnic->pdev->dev, "fNIC mtu %d intr timer %d\n",
|
||||
c->maxdatafieldsize, c->intr_timer);
|
||||
shost_printk(KERN_INFO, fnic->lport->host,
|
||||
"vNIC flags 0x%x luns per tgt %d\n",
|
||||
dev_info(&fnic->pdev->dev, "fNIC flags 0x%x luns per tgt %d\n",
|
||||
c->flags, c->luns_per_tgt);
|
||||
shost_printk(KERN_INFO, fnic->lport->host,
|
||||
"vNIC flogi_retries %d flogi timeout %d\n",
|
||||
dev_info(&fnic->pdev->dev, "fNIC flogi_retries %d flogi timeout %d\n",
|
||||
c->flogi_retries, c->flogi_timeout);
|
||||
shost_printk(KERN_INFO, fnic->lport->host,
|
||||
"vNIC plogi retries %d plogi timeout %d\n",
|
||||
dev_info(&fnic->pdev->dev, "fNIC plogi retries %d plogi timeout %d\n",
|
||||
c->plogi_retries, c->plogi_timeout);
|
||||
shost_printk(KERN_INFO, fnic->lport->host,
|
||||
"vNIC io throttle count %d link dn timeout %d\n",
|
||||
dev_info(&fnic->pdev->dev, "fNIC io throttle count %d link dn timeout %d\n",
|
||||
c->io_throttle_count, c->link_down_timeout);
|
||||
shost_printk(KERN_INFO, fnic->lport->host,
|
||||
"vNIC port dn io retries %d port dn timeout %d\n",
|
||||
dev_info(&fnic->pdev->dev, "fNIC port dn io retries %d port dn timeout %d\n",
|
||||
c->port_down_io_retries, c->port_down_timeout);
|
||||
shost_printk(KERN_INFO, fnic->lport->host,
|
||||
"vNIC wq_copy_count: %d\n", c->wq_copy_count);
|
||||
shost_printk(KERN_INFO, fnic->lport->host,
|
||||
"vNIC intr mode: %d\n", c->intr_mode);
|
||||
dev_info(&fnic->pdev->dev, "fNIC wq_copy_count: %d\n", c->wq_copy_count);
|
||||
dev_info(&fnic->pdev->dev, "fNIC intr mode: %d\n", c->intr_mode);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -206,18 +197,12 @@ void fnic_get_res_counts(struct fnic *fnic)
|
|||
fnic->intr_count = vnic_dev_get_res_count(fnic->vdev,
|
||||
RES_TYPE_INTR_CTRL);
|
||||
|
||||
shost_printk(KERN_INFO, fnic->lport->host,
|
||||
"vNIC fw resources wq_count: %d\n", fnic->wq_count);
|
||||
shost_printk(KERN_INFO, fnic->lport->host,
|
||||
"vNIC fw resources raw_wq_count: %d\n", fnic->raw_wq_count);
|
||||
shost_printk(KERN_INFO, fnic->lport->host,
|
||||
"vNIC fw resources wq_copy_count: %d\n", fnic->wq_copy_count);
|
||||
shost_printk(KERN_INFO, fnic->lport->host,
|
||||
"vNIC fw resources rq_count: %d\n", fnic->rq_count);
|
||||
shost_printk(KERN_INFO, fnic->lport->host,
|
||||
"vNIC fw resources cq_count: %d\n", fnic->cq_count);
|
||||
shost_printk(KERN_INFO, fnic->lport->host,
|
||||
"vNIC fw resources intr_count: %d\n", fnic->intr_count);
|
||||
dev_info(&fnic->pdev->dev, "vNIC fw resources wq_count: %d\n", fnic->wq_count);
|
||||
dev_info(&fnic->pdev->dev, "vNIC fw resources raw_wq_count: %d\n", fnic->raw_wq_count);
|
||||
dev_info(&fnic->pdev->dev, "vNIC fw resources wq_copy_count: %d\n", fnic->wq_copy_count);
|
||||
dev_info(&fnic->pdev->dev, "vNIC fw resources rq_count: %d\n", fnic->rq_count);
|
||||
dev_info(&fnic->pdev->dev, "vNIC fw resources cq_count: %d\n", fnic->cq_count);
|
||||
dev_info(&fnic->pdev->dev, "vNIC fw resources intr_count: %d\n", fnic->intr_count);
|
||||
}
|
||||
|
||||
void fnic_free_vnic_resources(struct fnic *fnic)
|
||||
|
@ -253,19 +238,17 @@ int fnic_alloc_vnic_resources(struct fnic *fnic)
|
|||
|
||||
intr_mode = vnic_dev_get_intr_mode(fnic->vdev);
|
||||
|
||||
shost_printk(KERN_INFO, fnic->lport->host, "vNIC interrupt mode: %s\n",
|
||||
dev_info(&fnic->pdev->dev, "vNIC interrupt mode: %s\n",
|
||||
intr_mode == VNIC_DEV_INTR_MODE_INTX ? "legacy PCI INTx" :
|
||||
intr_mode == VNIC_DEV_INTR_MODE_MSI ? "MSI" :
|
||||
intr_mode == VNIC_DEV_INTR_MODE_MSIX ?
|
||||
"MSI-X" : "unknown");
|
||||
|
||||
shost_printk(KERN_INFO, fnic->lport->host,
|
||||
"vNIC resources avail: wq %d cp_wq %d raw_wq %d rq %d",
|
||||
dev_info(&fnic->pdev->dev, "res avail: wq %d cp_wq %d raw_wq %d rq %d",
|
||||
fnic->wq_count, fnic->wq_copy_count,
|
||||
fnic->raw_wq_count, fnic->rq_count);
|
||||
|
||||
shost_printk(KERN_INFO, fnic->lport->host,
|
||||
"vNIC resources avail: cq %d intr %d cpy-wq desc count %d\n",
|
||||
dev_info(&fnic->pdev->dev, "res avail: cq %d intr %d cpy-wq desc count %d\n",
|
||||
fnic->cq_count, fnic->intr_count,
|
||||
fnic->config.wq_copy_desc_count);
|
||||
|
||||
|
@ -340,8 +323,7 @@ int fnic_alloc_vnic_resources(struct fnic *fnic)
|
|||
RES_TYPE_INTR_PBA_LEGACY, 0);
|
||||
|
||||
if (!fnic->legacy_pba && intr_mode == VNIC_DEV_INTR_MODE_INTX) {
|
||||
shost_printk(KERN_ERR, fnic->lport->host,
|
||||
"Failed to hook legacy pba resource\n");
|
||||
dev_err(&fnic->pdev->dev, "Failed to hook legacy pba resource\n");
|
||||
err = -ENODEV;
|
||||
goto err_out_cleanup;
|
||||
}
|
||||
|
@ -444,8 +426,7 @@ int fnic_alloc_vnic_resources(struct fnic *fnic)
|
|||
/* init the stats memory by making the first call here */
|
||||
err = vnic_dev_stats_dump(fnic->vdev, &fnic->stats);
|
||||
if (err) {
|
||||
shost_printk(KERN_ERR, fnic->lport->host,
|
||||
"vnic_dev_stats_dump failed - x%x\n", err);
|
||||
dev_err(&fnic->pdev->dev, "vnic_dev_stats_dump failed - x%x\n", err);
|
||||
goto err_out_cleanup;
|
||||
}
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -3,6 +3,7 @@
|
|||
#ifndef _FNIC_STATS_H_
|
||||
#define _FNIC_STATS_H_
|
||||
#define FNIC_MQ_MAX_QUEUES 64
|
||||
#include <scsi/scsi_transport_fc.h>
|
||||
|
||||
struct stats_timestamps {
|
||||
struct timespec64 last_reset_time;
|
||||
|
@ -63,6 +64,7 @@ struct reset_stats {
|
|||
atomic64_t fw_resets;
|
||||
atomic64_t fw_reset_completions;
|
||||
atomic64_t fw_reset_failures;
|
||||
atomic64_t fw_reset_timeouts;
|
||||
atomic64_t fnic_resets;
|
||||
atomic64_t fnic_reset_completions;
|
||||
atomic64_t fnic_reset_failures;
|
||||
|
@ -102,10 +104,51 @@ struct misc_stats {
|
|||
atomic64_t no_icmnd_itmf_cmpls;
|
||||
atomic64_t check_condition;
|
||||
atomic64_t queue_fulls;
|
||||
atomic64_t rport_not_ready;
|
||||
atomic64_t tport_not_ready;
|
||||
atomic64_t iport_not_ready;
|
||||
atomic64_t frame_errors;
|
||||
atomic64_t current_port_speed;
|
||||
atomic64_t intx_dummy;
|
||||
atomic64_t port_speed_in_mbps;
|
||||
};
|
||||
|
||||
struct fnic_iport_stats {
|
||||
atomic64_t num_linkdn;
|
||||
atomic64_t num_linkup;
|
||||
atomic64_t link_failure_count;
|
||||
atomic64_t num_rscns;
|
||||
atomic64_t rscn_redisc;
|
||||
atomic64_t rscn_not_redisc;
|
||||
atomic64_t frame_err;
|
||||
atomic64_t num_rnid;
|
||||
atomic64_t fabric_flogi_sent;
|
||||
atomic64_t fabric_flogi_ls_accepts;
|
||||
atomic64_t fabric_flogi_ls_rejects;
|
||||
atomic64_t fabric_flogi_misc_rejects;
|
||||
atomic64_t fabric_plogi_sent;
|
||||
atomic64_t fabric_plogi_ls_accepts;
|
||||
atomic64_t fabric_plogi_ls_rejects;
|
||||
atomic64_t fabric_plogi_misc_rejects;
|
||||
atomic64_t fabric_scr_sent;
|
||||
atomic64_t fabric_scr_ls_accepts;
|
||||
atomic64_t fabric_scr_ls_rejects;
|
||||
atomic64_t fabric_scr_misc_rejects;
|
||||
atomic64_t fabric_logo_sent;
|
||||
atomic64_t tport_alive;
|
||||
atomic64_t tport_plogi_sent;
|
||||
atomic64_t tport_plogi_ls_accepts;
|
||||
atomic64_t tport_plogi_ls_rejects;
|
||||
atomic64_t tport_plogi_misc_rejects;
|
||||
atomic64_t tport_prli_sent;
|
||||
atomic64_t tport_prli_ls_accepts;
|
||||
atomic64_t tport_prli_ls_rejects;
|
||||
atomic64_t tport_prli_misc_rejects;
|
||||
atomic64_t tport_adisc_sent;
|
||||
atomic64_t tport_adisc_ls_accepts;
|
||||
atomic64_t tport_adisc_ls_rejects;
|
||||
atomic64_t tport_logo_sent;
|
||||
atomic64_t unsupported_frames_ls_rejects;
|
||||
atomic64_t unsupported_frames_dropped;
|
||||
};
|
||||
|
||||
struct fnic_stats {
|
||||
|
@ -116,6 +159,7 @@ struct fnic_stats {
|
|||
struct reset_stats reset_stats;
|
||||
struct fw_stats fw_stats;
|
||||
struct vlan_stats vlan_stats;
|
||||
struct fc_host_statistics host_stats;
|
||||
struct misc_stats misc_stats;
|
||||
};
|
||||
|
||||
|
@ -127,6 +171,5 @@ struct stats_debug_info {
|
|||
};
|
||||
|
||||
int fnic_get_stats_data(struct stats_debug_info *, struct fnic_stats *);
|
||||
void fnic_stats_debugfs_init(struct fnic *);
|
||||
void fnic_stats_debugfs_remove(struct fnic *);
|
||||
const char *fnic_role_to_str(unsigned int role);
|
||||
#endif /* _FNIC_STATS_H_ */
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
#include <linux/kallsyms.h>
|
||||
#include <linux/time.h>
|
||||
#include <linux/vmalloc.h>
|
||||
#include <scsi/scsi_transport_fc.h>
|
||||
#include "fnic_io.h"
|
||||
#include "fnic.h"
|
||||
|
||||
|
@ -29,6 +30,17 @@ int fnic_fc_tracing_enabled = 1;
|
|||
int fnic_fc_trace_cleared = 1;
|
||||
static DEFINE_SPINLOCK(fnic_fc_trace_lock);
|
||||
|
||||
static const char * const fnic_role_str[] = {
|
||||
[FNIC_ROLE_FCP_INITIATOR] = "FCP_Initiator",
|
||||
};
|
||||
|
||||
const char *fnic_role_to_str(unsigned int role)
|
||||
{
|
||||
if (role >= ARRAY_SIZE(fnic_role_str) || !fnic_role_str[role])
|
||||
return "Unknown";
|
||||
|
||||
return fnic_role_str[role];
|
||||
}
|
||||
|
||||
/*
|
||||
* fnic_trace_get_buf - Give buffer pointer to user to fill up trace information
|
||||
|
@ -423,7 +435,8 @@ int fnic_get_stats_data(struct stats_debug_info *debug,
|
|||
"Number of Check Conditions encountered: %lld\n"
|
||||
"Number of QUEUE Fulls: %lld\n"
|
||||
"Number of rport not ready: %lld\n"
|
||||
"Number of receive frame errors: %lld\n",
|
||||
"Number of receive frame errors: %lld\n"
|
||||
"Port speed (in Mbps): %lld\n",
|
||||
(u64)stats->misc_stats.last_isr_time,
|
||||
(s64)val1.tv_sec, val1.tv_nsec,
|
||||
(u64)stats->misc_stats.last_ack_time,
|
||||
|
@ -446,18 +459,68 @@ int fnic_get_stats_data(struct stats_debug_info *debug,
|
|||
(u64)atomic64_read(&stats->misc_stats.no_icmnd_itmf_cmpls),
|
||||
(u64)atomic64_read(&stats->misc_stats.check_condition),
|
||||
(u64)atomic64_read(&stats->misc_stats.queue_fulls),
|
||||
(u64)atomic64_read(&stats->misc_stats.rport_not_ready),
|
||||
(u64)atomic64_read(&stats->misc_stats.frame_errors));
|
||||
|
||||
len += scnprintf(debug->debug_buffer + len, buf_size - len,
|
||||
"Firmware reported port speed: %llu\n",
|
||||
(u64)atomic64_read(
|
||||
&stats->misc_stats.current_port_speed));
|
||||
(u64)atomic64_read(&stats->misc_stats.tport_not_ready),
|
||||
(u64)atomic64_read(&stats->misc_stats.frame_errors),
|
||||
(u64)atomic64_read(&stats->misc_stats.port_speed_in_mbps));
|
||||
|
||||
return len;
|
||||
|
||||
}
|
||||
|
||||
int fnic_get_debug_info(struct stats_debug_info *info, struct fnic *fnic)
|
||||
{
|
||||
struct fnic_iport_s *iport = &fnic->iport;
|
||||
int buf_size = info->buf_size;
|
||||
int len = info->buffer_len;
|
||||
struct fnic_tport_s *tport, *next;
|
||||
unsigned long flags;
|
||||
|
||||
len += snprintf(info->debug_buffer + len, buf_size - len,
|
||||
"------------------------------------------\n"
|
||||
"\t\t Debug Info\n"
|
||||
"------------------------------------------\n");
|
||||
len += snprintf(info->debug_buffer + len, buf_size - len,
|
||||
"fnic Name:%s number:%d Role:%s State:%s\n",
|
||||
fnic->name, fnic->fnic_num,
|
||||
fnic_role_to_str(fnic->role),
|
||||
fnic_state_to_str(fnic->state));
|
||||
len +=
|
||||
snprintf(info->debug_buffer + len, buf_size - len,
|
||||
"iport State:%d Flags:0x%x vlan_id:%d fcid:0x%x\n",
|
||||
iport->state, iport->flags, iport->vlan_id, iport->fcid);
|
||||
len +=
|
||||
snprintf(info->debug_buffer + len, buf_size - len,
|
||||
"usefip:%d fip_state:%d fip_flogi_retry:%d\n",
|
||||
iport->usefip, iport->fip.state, iport->fip.flogi_retry);
|
||||
len +=
|
||||
snprintf(info->debug_buffer + len, buf_size - len,
|
||||
"fpma %02x:%02x:%02x:%02x:%02x:%02x",
|
||||
iport->fpma[5], iport->fpma[4], iport->fpma[3],
|
||||
iport->fpma[2], iport->fpma[1], iport->fpma[0]);
|
||||
len +=
|
||||
snprintf(info->debug_buffer + len, buf_size - len,
|
||||
"fcfmac %02x:%02x:%02x:%02x:%02x:%02x\n",
|
||||
iport->fcfmac[5], iport->fcfmac[4], iport->fcfmac[3],
|
||||
iport->fcfmac[2], iport->fcfmac[1], iport->fcfmac[0]);
|
||||
len +=
|
||||
snprintf(info->debug_buffer + len, buf_size - len,
|
||||
"fabric state:%d flags:0x%x retry_counter:%d e_d_tov:%d r_a_tov:%d\n",
|
||||
iport->fabric.state, iport->fabric.flags,
|
||||
iport->fabric.retry_counter, iport->e_d_tov,
|
||||
iport->r_a_tov);
|
||||
|
||||
spin_lock_irqsave(&fnic->fnic_lock, flags);
|
||||
list_for_each_entry_safe(tport, next, &iport->tport_list, links) {
|
||||
len += snprintf(info->debug_buffer + len, buf_size - len,
|
||||
"tport fcid:0x%x state:%d flags:0x%x inflight:%d retry_counter:%d\n",
|
||||
tport->fcid, tport->state, tport->flags,
|
||||
atomic_read(&tport->in_flight),
|
||||
tport->retry_counter);
|
||||
}
|
||||
spin_unlock_irqrestore(&fnic->fnic_lock, flags);
|
||||
return len;
|
||||
}
|
||||
|
||||
/*
|
||||
* fnic_trace_buf_init - Initialize fnic trace buffer logging facility
|
||||
*
|
||||
|
@ -485,8 +548,7 @@ int fnic_trace_buf_init(void)
|
|||
}
|
||||
|
||||
fnic_trace_entries.page_offset =
|
||||
vmalloc(array_size(fnic_max_trace_entries,
|
||||
sizeof(unsigned long)));
|
||||
vcalloc(fnic_max_trace_entries, sizeof(unsigned long));
|
||||
if (!fnic_trace_entries.page_offset) {
|
||||
printk(KERN_ERR PFX "Failed to allocate memory for"
|
||||
" page_offset\n");
|
||||
|
@ -497,8 +559,6 @@ int fnic_trace_buf_init(void)
|
|||
err = -ENOMEM;
|
||||
goto err_fnic_trace_buf_init;
|
||||
}
|
||||
memset((void *)fnic_trace_entries.page_offset, 0,
|
||||
(fnic_max_trace_entries * sizeof(unsigned long)));
|
||||
fnic_trace_entries.wr_idx = fnic_trace_entries.rd_idx = 0;
|
||||
fnic_buf_head = fnic_trace_buf_p;
|
||||
|
||||
|
@ -559,8 +619,7 @@ int fnic_fc_trace_init(void)
|
|||
fc_trace_max_entries = (fnic_fc_trace_max_pages * PAGE_SIZE)/
|
||||
FC_TRC_SIZE_BYTES;
|
||||
fnic_fc_ctlr_trace_buf_p =
|
||||
(unsigned long)vmalloc(array_size(PAGE_SIZE,
|
||||
fnic_fc_trace_max_pages));
|
||||
(unsigned long)vcalloc(fnic_fc_trace_max_pages, PAGE_SIZE);
|
||||
if (!fnic_fc_ctlr_trace_buf_p) {
|
||||
pr_err("fnic: Failed to allocate memory for "
|
||||
"FC Control Trace Buf\n");
|
||||
|
@ -568,13 +627,9 @@ int fnic_fc_trace_init(void)
|
|||
goto err_fnic_fc_ctlr_trace_buf_init;
|
||||
}
|
||||
|
||||
memset((void *)fnic_fc_ctlr_trace_buf_p, 0,
|
||||
fnic_fc_trace_max_pages * PAGE_SIZE);
|
||||
|
||||
/* Allocate memory for page offset */
|
||||
fc_trace_entries.page_offset =
|
||||
vmalloc(array_size(fc_trace_max_entries,
|
||||
sizeof(unsigned long)));
|
||||
vcalloc(fc_trace_max_entries, sizeof(unsigned long));
|
||||
if (!fc_trace_entries.page_offset) {
|
||||
pr_err("fnic:Failed to allocate memory for page_offset\n");
|
||||
if (fnic_fc_ctlr_trace_buf_p) {
|
||||
|
@ -585,8 +640,6 @@ int fnic_fc_trace_init(void)
|
|||
err = -ENOMEM;
|
||||
goto err_fnic_fc_ctlr_trace_buf_init;
|
||||
}
|
||||
memset((void *)fc_trace_entries.page_offset, 0,
|
||||
(fc_trace_max_entries * sizeof(unsigned long)));
|
||||
|
||||
fc_trace_entries.rd_idx = fc_trace_entries.wr_idx = 0;
|
||||
fc_trace_buf_head = fnic_fc_ctlr_trace_buf_p;
|
||||
|
@ -688,7 +741,7 @@ int fnic_fc_trace_set_data(u32 host_no, u8 frame_type,
|
|||
*/
|
||||
if (frame_type == FNIC_FC_RECV) {
|
||||
eth_fcoe_hdr_len = sizeof(struct ethhdr) +
|
||||
sizeof(struct fcoe_hdr);
|
||||
sizeof(struct fcoe_hdr);
|
||||
memset((char *)fc_trace, 0xff, eth_fcoe_hdr_len);
|
||||
/* Copy the rest of data frame */
|
||||
memcpy((char *)(fc_trace + eth_fcoe_hdr_len), (void *)frame,
|
||||
|
|
|
@ -643,9 +643,8 @@ extern int hisi_sas_probe(struct platform_device *pdev,
|
|||
const struct hisi_sas_hw *ops);
|
||||
extern void hisi_sas_remove(struct platform_device *pdev);
|
||||
|
||||
int hisi_sas_device_configure(struct scsi_device *sdev,
|
||||
struct queue_limits *lim);
|
||||
extern int hisi_sas_slave_alloc(struct scsi_device *sdev);
|
||||
int hisi_sas_sdev_configure(struct scsi_device *sdev, struct queue_limits *lim);
|
||||
extern int hisi_sas_sdev_init(struct scsi_device *sdev);
|
||||
extern int hisi_sas_scan_finished(struct Scsi_Host *shost, unsigned long time);
|
||||
extern void hisi_sas_scan_start(struct Scsi_Host *shost);
|
||||
extern int hisi_sas_host_reset(struct Scsi_Host *shost, int reset_type);
|
||||
|
|
|
@ -805,13 +805,13 @@ static int hisi_sas_init_device(struct domain_device *device)
|
|||
return rc;
|
||||
}
|
||||
|
||||
int hisi_sas_slave_alloc(struct scsi_device *sdev)
|
||||
int hisi_sas_sdev_init(struct scsi_device *sdev)
|
||||
{
|
||||
struct domain_device *ddev = sdev_to_domain_dev(sdev);
|
||||
struct hisi_sas_device *sas_dev = ddev->lldd_dev;
|
||||
int rc;
|
||||
|
||||
rc = sas_slave_alloc(sdev);
|
||||
rc = sas_sdev_init(sdev);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
|
@ -821,7 +821,7 @@ int hisi_sas_slave_alloc(struct scsi_device *sdev)
|
|||
sas_dev->dev_status = HISI_SAS_DEV_NORMAL;
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(hisi_sas_slave_alloc);
|
||||
EXPORT_SYMBOL_GPL(hisi_sas_sdev_init);
|
||||
|
||||
static int hisi_sas_dev_found(struct domain_device *device)
|
||||
{
|
||||
|
@ -868,11 +868,10 @@ err_out:
|
|||
return rc;
|
||||
}
|
||||
|
||||
int hisi_sas_device_configure(struct scsi_device *sdev,
|
||||
struct queue_limits *lim)
|
||||
int hisi_sas_sdev_configure(struct scsi_device *sdev, struct queue_limits *lim)
|
||||
{
|
||||
struct domain_device *dev = sdev_to_domain_dev(sdev);
|
||||
int ret = sas_device_configure(sdev, lim);
|
||||
int ret = sas_sdev_configure(sdev, lim);
|
||||
|
||||
if (ret)
|
||||
return ret;
|
||||
|
@ -881,7 +880,7 @@ int hisi_sas_device_configure(struct scsi_device *sdev,
|
|||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(hisi_sas_device_configure);
|
||||
EXPORT_SYMBOL_GPL(hisi_sas_sdev_configure);
|
||||
|
||||
void hisi_sas_scan_start(struct Scsi_Host *shost)
|
||||
{
|
||||
|
|
|
@ -1753,11 +1753,11 @@ static int check_fw_info_v1_hw(struct hisi_hba *hisi_hba)
|
|||
|
||||
static const struct scsi_host_template sht_v1_hw = {
|
||||
LIBSAS_SHT_BASE_NO_SLAVE_INIT
|
||||
.device_configure = hisi_sas_device_configure,
|
||||
.sdev_configure = hisi_sas_sdev_configure,
|
||||
.scan_finished = hisi_sas_scan_finished,
|
||||
.scan_start = hisi_sas_scan_start,
|
||||
.sg_tablesize = HISI_SAS_SGE_PAGE_CNT,
|
||||
.slave_alloc = hisi_sas_slave_alloc,
|
||||
.sdev_init = hisi_sas_sdev_init,
|
||||
.shost_groups = host_v1_hw_groups,
|
||||
.host_reset = hisi_sas_host_reset,
|
||||
};
|
||||
|
|
|
@ -3585,11 +3585,11 @@ static int check_fw_info_v2_hw(struct hisi_hba *hisi_hba)
|
|||
|
||||
static const struct scsi_host_template sht_v2_hw = {
|
||||
LIBSAS_SHT_BASE_NO_SLAVE_INIT
|
||||
.device_configure = hisi_sas_device_configure,
|
||||
.sdev_configure = hisi_sas_sdev_configure,
|
||||
.scan_finished = hisi_sas_scan_finished,
|
||||
.scan_start = hisi_sas_scan_start,
|
||||
.sg_tablesize = HISI_SAS_SGE_PAGE_CNT,
|
||||
.slave_alloc = hisi_sas_slave_alloc,
|
||||
.sdev_init = hisi_sas_sdev_init,
|
||||
.shost_groups = host_v2_hw_groups,
|
||||
.sdev_groups = sdev_groups_v2_hw,
|
||||
.host_reset = hisi_sas_host_reset,
|
||||
|
|
|
@ -2908,12 +2908,12 @@ static ssize_t iopoll_q_cnt_v3_hw_show(struct device *dev,
|
|||
}
|
||||
static DEVICE_ATTR_RO(iopoll_q_cnt_v3_hw);
|
||||
|
||||
static int device_configure_v3_hw(struct scsi_device *sdev,
|
||||
struct queue_limits *lim)
|
||||
static int sdev_configure_v3_hw(struct scsi_device *sdev,
|
||||
struct queue_limits *lim)
|
||||
{
|
||||
struct Scsi_Host *shost = dev_to_shost(&sdev->sdev_gendev);
|
||||
struct hisi_hba *hisi_hba = shost_priv(shost);
|
||||
int ret = hisi_sas_device_configure(sdev, lim);
|
||||
int ret = hisi_sas_sdev_configure(sdev, lim);
|
||||
struct device *dev = hisi_hba->dev;
|
||||
|
||||
if (ret)
|
||||
|
@ -3336,13 +3336,13 @@ static void hisi_sas_map_queues(struct Scsi_Host *shost)
|
|||
|
||||
static const struct scsi_host_template sht_v3_hw = {
|
||||
LIBSAS_SHT_BASE_NO_SLAVE_INIT
|
||||
.device_configure = device_configure_v3_hw,
|
||||
.sdev_configure = sdev_configure_v3_hw,
|
||||
.scan_finished = hisi_sas_scan_finished,
|
||||
.scan_start = hisi_sas_scan_start,
|
||||
.map_queues = hisi_sas_map_queues,
|
||||
.sg_tablesize = HISI_SAS_SGE_PAGE_CNT,
|
||||
.sg_prot_tablesize = HISI_SAS_SGE_PAGE_CNT,
|
||||
.slave_alloc = hisi_sas_slave_alloc,
|
||||
.sdev_init = hisi_sas_sdev_init,
|
||||
.shost_groups = host_v3_hw_groups,
|
||||
.sdev_groups = sdev_groups_v3_hw,
|
||||
.tag_alloc_policy_rr = true,
|
||||
|
|
|
@ -283,9 +283,10 @@ static int hpsa_scan_finished(struct Scsi_Host *sh,
|
|||
static int hpsa_change_queue_depth(struct scsi_device *sdev, int qdepth);
|
||||
|
||||
static int hpsa_eh_device_reset_handler(struct scsi_cmnd *scsicmd);
|
||||
static int hpsa_slave_alloc(struct scsi_device *sdev);
|
||||
static int hpsa_slave_configure(struct scsi_device *sdev);
|
||||
static void hpsa_slave_destroy(struct scsi_device *sdev);
|
||||
static int hpsa_sdev_init(struct scsi_device *sdev);
|
||||
static int hpsa_sdev_configure(struct scsi_device *sdev,
|
||||
struct queue_limits *lim);
|
||||
static void hpsa_sdev_destroy(struct scsi_device *sdev);
|
||||
|
||||
static void hpsa_update_scsi_devices(struct ctlr_info *h);
|
||||
static int check_for_unit_attention(struct ctlr_info *h,
|
||||
|
@ -978,9 +979,9 @@ static const struct scsi_host_template hpsa_driver_template = {
|
|||
.this_id = -1,
|
||||
.eh_device_reset_handler = hpsa_eh_device_reset_handler,
|
||||
.ioctl = hpsa_ioctl,
|
||||
.slave_alloc = hpsa_slave_alloc,
|
||||
.slave_configure = hpsa_slave_configure,
|
||||
.slave_destroy = hpsa_slave_destroy,
|
||||
.sdev_init = hpsa_sdev_init,
|
||||
.sdev_configure = hpsa_sdev_configure,
|
||||
.sdev_destroy = hpsa_sdev_destroy,
|
||||
#ifdef CONFIG_COMPAT
|
||||
.compat_ioctl = hpsa_compat_ioctl,
|
||||
#endif
|
||||
|
@ -2107,7 +2108,7 @@ static struct hpsa_scsi_dev_t *lookup_hpsa_scsi_dev(struct ctlr_info *h,
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static int hpsa_slave_alloc(struct scsi_device *sdev)
|
||||
static int hpsa_sdev_init(struct scsi_device *sdev)
|
||||
{
|
||||
struct hpsa_scsi_dev_t *sd = NULL;
|
||||
unsigned long flags;
|
||||
|
@ -2142,7 +2143,8 @@ static int hpsa_slave_alloc(struct scsi_device *sdev)
|
|||
|
||||
/* configure scsi device based on internal per-device structure */
|
||||
#define CTLR_TIMEOUT (120 * HZ)
|
||||
static int hpsa_slave_configure(struct scsi_device *sdev)
|
||||
static int hpsa_sdev_configure(struct scsi_device *sdev,
|
||||
struct queue_limits *lim)
|
||||
{
|
||||
struct hpsa_scsi_dev_t *sd;
|
||||
int queue_depth;
|
||||
|
@ -2173,7 +2175,7 @@ static int hpsa_slave_configure(struct scsi_device *sdev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void hpsa_slave_destroy(struct scsi_device *sdev)
|
||||
static void hpsa_sdev_destroy(struct scsi_device *sdev)
|
||||
{
|
||||
struct hpsa_scsi_dev_t *hdev = NULL;
|
||||
|
||||
|
|
|
@ -1151,8 +1151,8 @@ static struct attribute *hptiop_host_attrs[] = {
|
|||
|
||||
ATTRIBUTE_GROUPS(hptiop_host);
|
||||
|
||||
static int hptiop_device_configure(struct scsi_device *sdev,
|
||||
struct queue_limits *lim)
|
||||
static int hptiop_sdev_configure(struct scsi_device *sdev,
|
||||
struct queue_limits *lim)
|
||||
{
|
||||
if (sdev->type == TYPE_TAPE)
|
||||
lim->max_hw_sectors = 8192;
|
||||
|
@ -1168,7 +1168,7 @@ static const struct scsi_host_template driver_template = {
|
|||
.emulated = 0,
|
||||
.proc_name = driver_name,
|
||||
.shost_groups = hptiop_host_groups,
|
||||
.device_configure = hptiop_device_configure,
|
||||
.sdev_configure = hptiop_sdev_configure,
|
||||
.this_id = -1,
|
||||
.change_queue_depth = hptiop_adjust_disk_queue_depth,
|
||||
.cmd_size = sizeof(struct hpt_cmd_priv),
|
||||
|
@ -1634,7 +1634,7 @@ static struct hptiop_adapter_ops hptiop_mvfrey_ops = {
|
|||
.host_phy_flag = cpu_to_le64(1),
|
||||
};
|
||||
|
||||
static struct pci_device_id hptiop_id_table[] = {
|
||||
static const struct pci_device_id hptiop_id_table[] = {
|
||||
{ PCI_VDEVICE(TTI, 0x3220), (kernel_ulong_t)&hptiop_itl_ops },
|
||||
{ PCI_VDEVICE(TTI, 0x3320), (kernel_ulong_t)&hptiop_itl_ops },
|
||||
{ PCI_VDEVICE(TTI, 0x3410), (kernel_ulong_t)&hptiop_itl_ops },
|
||||
|
|
|
@ -3393,7 +3393,7 @@ static int ibmvfc_scan_finished(struct Scsi_Host *shost, unsigned long time)
|
|||
}
|
||||
|
||||
/**
|
||||
* ibmvfc_slave_alloc - Setup the device's task set value
|
||||
* ibmvfc_sdev_init - Setup the device's task set value
|
||||
* @sdev: struct scsi_device device to configure
|
||||
*
|
||||
* Set the device's task set value so that error handling works as
|
||||
|
@ -3402,7 +3402,7 @@ static int ibmvfc_scan_finished(struct Scsi_Host *shost, unsigned long time)
|
|||
* Returns:
|
||||
* 0 on success / -ENXIO if device does not exist
|
||||
**/
|
||||
static int ibmvfc_slave_alloc(struct scsi_device *sdev)
|
||||
static int ibmvfc_sdev_init(struct scsi_device *sdev)
|
||||
{
|
||||
struct Scsi_Host *shost = sdev->host;
|
||||
struct fc_rport *rport = starget_to_rport(scsi_target(sdev));
|
||||
|
@ -3441,8 +3441,9 @@ static int ibmvfc_target_alloc(struct scsi_target *starget)
|
|||
}
|
||||
|
||||
/**
|
||||
* ibmvfc_slave_configure - Configure the device
|
||||
* ibmvfc_sdev_configure - Configure the device
|
||||
* @sdev: struct scsi_device device to configure
|
||||
* @lim: Request queue limits
|
||||
*
|
||||
* Enable allow_restart for a device if it is a disk. Adjust the
|
||||
* queue_depth here also.
|
||||
|
@ -3450,7 +3451,8 @@ static int ibmvfc_target_alloc(struct scsi_target *starget)
|
|||
* Returns:
|
||||
* 0
|
||||
**/
|
||||
static int ibmvfc_slave_configure(struct scsi_device *sdev)
|
||||
static int ibmvfc_sdev_configure(struct scsi_device *sdev,
|
||||
struct queue_limits *lim)
|
||||
{
|
||||
struct Scsi_Host *shost = sdev->host;
|
||||
unsigned long flags = 0;
|
||||
|
@ -3639,7 +3641,7 @@ static DEVICE_ATTR(nr_scsi_channels, S_IRUGO | S_IWUSR,
|
|||
* number of bytes printed to buffer
|
||||
**/
|
||||
static ssize_t ibmvfc_read_trace(struct file *filp, struct kobject *kobj,
|
||||
struct bin_attribute *bin_attr,
|
||||
const struct bin_attribute *bin_attr,
|
||||
char *buf, loff_t off, size_t count)
|
||||
{
|
||||
struct device *dev = kobj_to_dev(kobj);
|
||||
|
@ -3662,13 +3664,13 @@ static ssize_t ibmvfc_read_trace(struct file *filp, struct kobject *kobj,
|
|||
return count;
|
||||
}
|
||||
|
||||
static struct bin_attribute ibmvfc_trace_attr = {
|
||||
static const struct bin_attribute ibmvfc_trace_attr = {
|
||||
.attr = {
|
||||
.name = "trace",
|
||||
.mode = S_IRUGO,
|
||||
},
|
||||
.size = 0,
|
||||
.read = ibmvfc_read_trace,
|
||||
.read_new = ibmvfc_read_trace,
|
||||
};
|
||||
#endif
|
||||
|
||||
|
@ -3696,8 +3698,8 @@ static const struct scsi_host_template driver_template = {
|
|||
.eh_device_reset_handler = ibmvfc_eh_device_reset_handler,
|
||||
.eh_target_reset_handler = ibmvfc_eh_target_reset_handler,
|
||||
.eh_host_reset_handler = ibmvfc_eh_host_reset_handler,
|
||||
.slave_alloc = ibmvfc_slave_alloc,
|
||||
.slave_configure = ibmvfc_slave_configure,
|
||||
.sdev_init = ibmvfc_sdev_init,
|
||||
.sdev_configure = ibmvfc_sdev_configure,
|
||||
.target_alloc = ibmvfc_target_alloc,
|
||||
.scan_finished = ibmvfc_scan_finished,
|
||||
.change_queue_depth = ibmvfc_change_queue_depth,
|
||||
|
|
|
@ -1860,14 +1860,16 @@ static void ibmvscsi_handle_crq(struct viosrp_crq *crq,
|
|||
}
|
||||
|
||||
/**
|
||||
* ibmvscsi_slave_configure: Set the "allow_restart" flag for each disk.
|
||||
* ibmvscsi_sdev_configure: Set the "allow_restart" flag for each disk.
|
||||
* @sdev: struct scsi_device device to configure
|
||||
* @lim: Request queue limits
|
||||
*
|
||||
* Enable allow_restart for a device if it is a disk. Adjust the
|
||||
* queue_depth here also as is required by the documentation for
|
||||
* struct scsi_host_template.
|
||||
*/
|
||||
static int ibmvscsi_slave_configure(struct scsi_device *sdev)
|
||||
static int ibmvscsi_sdev_configure(struct scsi_device *sdev,
|
||||
struct queue_limits *lim)
|
||||
{
|
||||
struct Scsi_Host *shost = sdev->host;
|
||||
unsigned long lock_flags = 0;
|
||||
|
@ -2091,7 +2093,7 @@ static struct scsi_host_template driver_template = {
|
|||
.eh_abort_handler = ibmvscsi_eh_abort_handler,
|
||||
.eh_device_reset_handler = ibmvscsi_eh_device_reset_handler,
|
||||
.eh_host_reset_handler = ibmvscsi_eh_host_reset_handler,
|
||||
.slave_configure = ibmvscsi_slave_configure,
|
||||
.sdev_configure = ibmvscsi_sdev_configure,
|
||||
.change_queue_depth = ibmvscsi_change_queue_depth,
|
||||
.host_reset = ibmvscsi_host_reset,
|
||||
.cmd_per_lun = IBMVSCSI_CMDS_PER_LUN_DEFAULT,
|
||||
|
|
|
@ -2941,7 +2941,7 @@ static void initio_remove_one(struct pci_dev *pdev)
|
|||
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
static struct pci_device_id initio_pci_tbl[] = {
|
||||
static const struct pci_device_id initio_pci_tbl[] = {
|
||||
{PCI_VENDOR_ID_INIT, 0x9500, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
|
||||
{PCI_VENDOR_ID_INIT, 0x9400, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
|
||||
{PCI_VENDOR_ID_INIT, 0x9401, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
|
||||
|
|
|
@ -3366,7 +3366,7 @@ static void ipr_worker_thread(struct work_struct *work)
|
|||
* number of bytes printed to buffer
|
||||
**/
|
||||
static ssize_t ipr_read_trace(struct file *filp, struct kobject *kobj,
|
||||
struct bin_attribute *bin_attr,
|
||||
const struct bin_attribute *bin_attr,
|
||||
char *buf, loff_t off, size_t count)
|
||||
{
|
||||
struct device *dev = kobj_to_dev(kobj);
|
||||
|
@ -3383,13 +3383,13 @@ static ssize_t ipr_read_trace(struct file *filp, struct kobject *kobj,
|
|||
return ret;
|
||||
}
|
||||
|
||||
static struct bin_attribute ipr_trace_attr = {
|
||||
static const struct bin_attribute ipr_trace_attr = {
|
||||
.attr = {
|
||||
.name = "trace",
|
||||
.mode = S_IRUGO,
|
||||
},
|
||||
.size = 0,
|
||||
.read = ipr_read_trace,
|
||||
.read_new = ipr_read_trace,
|
||||
};
|
||||
#endif
|
||||
|
||||
|
@ -4087,7 +4087,7 @@ static struct device_attribute ipr_ioa_fw_type_attr = {
|
|||
};
|
||||
|
||||
static ssize_t ipr_read_async_err_log(struct file *filep, struct kobject *kobj,
|
||||
struct bin_attribute *bin_attr, char *buf,
|
||||
const struct bin_attribute *bin_attr, char *buf,
|
||||
loff_t off, size_t count)
|
||||
{
|
||||
struct device *cdev = kobj_to_dev(kobj);
|
||||
|
@ -4111,7 +4111,7 @@ static ssize_t ipr_read_async_err_log(struct file *filep, struct kobject *kobj,
|
|||
}
|
||||
|
||||
static ssize_t ipr_next_async_err_log(struct file *filep, struct kobject *kobj,
|
||||
struct bin_attribute *bin_attr, char *buf,
|
||||
const struct bin_attribute *bin_attr, char *buf,
|
||||
loff_t off, size_t count)
|
||||
{
|
||||
struct device *cdev = kobj_to_dev(kobj);
|
||||
|
@ -4134,14 +4134,14 @@ static ssize_t ipr_next_async_err_log(struct file *filep, struct kobject *kobj,
|
|||
return count;
|
||||
}
|
||||
|
||||
static struct bin_attribute ipr_ioa_async_err_log = {
|
||||
static const struct bin_attribute ipr_ioa_async_err_log = {
|
||||
.attr = {
|
||||
.name = "async_err_log",
|
||||
.mode = S_IRUGO | S_IWUSR,
|
||||
},
|
||||
.size = 0,
|
||||
.read = ipr_read_async_err_log,
|
||||
.write = ipr_next_async_err_log
|
||||
.read_new = ipr_read_async_err_log,
|
||||
.write_new = ipr_next_async_err_log
|
||||
};
|
||||
|
||||
static struct attribute *ipr_ioa_attrs[] = {
|
||||
|
@ -4172,7 +4172,7 @@ ATTRIBUTE_GROUPS(ipr_ioa);
|
|||
* number of bytes printed to buffer
|
||||
**/
|
||||
static ssize_t ipr_read_dump(struct file *filp, struct kobject *kobj,
|
||||
struct bin_attribute *bin_attr,
|
||||
const struct bin_attribute *bin_attr,
|
||||
char *buf, loff_t off, size_t count)
|
||||
{
|
||||
struct device *cdev = kobj_to_dev(kobj);
|
||||
|
@ -4361,7 +4361,7 @@ static int ipr_free_dump(struct ipr_ioa_cfg *ioa_cfg)
|
|||
* number of bytes printed to buffer
|
||||
**/
|
||||
static ssize_t ipr_write_dump(struct file *filp, struct kobject *kobj,
|
||||
struct bin_attribute *bin_attr,
|
||||
const struct bin_attribute *bin_attr,
|
||||
char *buf, loff_t off, size_t count)
|
||||
{
|
||||
struct device *cdev = kobj_to_dev(kobj);
|
||||
|
@ -4385,14 +4385,14 @@ static ssize_t ipr_write_dump(struct file *filp, struct kobject *kobj,
|
|||
return count;
|
||||
}
|
||||
|
||||
static struct bin_attribute ipr_dump_attr = {
|
||||
static const struct bin_attribute ipr_dump_attr = {
|
||||
.attr = {
|
||||
.name = "dump",
|
||||
.mode = S_IRUSR | S_IWUSR,
|
||||
},
|
||||
.size = 0,
|
||||
.read = ipr_read_dump,
|
||||
.write = ipr_write_dump
|
||||
.read_new = ipr_read_dump,
|
||||
.write_new = ipr_write_dump
|
||||
};
|
||||
#else
|
||||
static int ipr_free_dump(struct ipr_ioa_cfg *ioa_cfg) { return 0; };
|
||||
|
@ -4745,13 +4745,13 @@ static struct ipr_resource_entry *ipr_find_sdev(struct scsi_device *sdev)
|
|||
}
|
||||
|
||||
/**
|
||||
* ipr_slave_destroy - Unconfigure a SCSI device
|
||||
* ipr_sdev_destroy - Unconfigure a SCSI device
|
||||
* @sdev: scsi device struct
|
||||
*
|
||||
* Return value:
|
||||
* nothing
|
||||
**/
|
||||
static void ipr_slave_destroy(struct scsi_device *sdev)
|
||||
static void ipr_sdev_destroy(struct scsi_device *sdev)
|
||||
{
|
||||
struct ipr_resource_entry *res;
|
||||
struct ipr_ioa_cfg *ioa_cfg;
|
||||
|
@ -4769,7 +4769,7 @@ static void ipr_slave_destroy(struct scsi_device *sdev)
|
|||
}
|
||||
|
||||
/**
|
||||
* ipr_device_configure - Configure a SCSI device
|
||||
* ipr_sdev_configure - Configure a SCSI device
|
||||
* @sdev: scsi device struct
|
||||
* @lim: queue limits
|
||||
*
|
||||
|
@ -4778,8 +4778,8 @@ static void ipr_slave_destroy(struct scsi_device *sdev)
|
|||
* Return value:
|
||||
* 0 on success
|
||||
**/
|
||||
static int ipr_device_configure(struct scsi_device *sdev,
|
||||
struct queue_limits *lim)
|
||||
static int ipr_sdev_configure(struct scsi_device *sdev,
|
||||
struct queue_limits *lim)
|
||||
{
|
||||
struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *) sdev->host->hostdata;
|
||||
struct ipr_resource_entry *res;
|
||||
|
@ -4815,7 +4815,7 @@ static int ipr_device_configure(struct scsi_device *sdev,
|
|||
}
|
||||
|
||||
/**
|
||||
* ipr_slave_alloc - Prepare for commands to a device.
|
||||
* ipr_sdev_init - Prepare for commands to a device.
|
||||
* @sdev: scsi device struct
|
||||
*
|
||||
* This function saves a pointer to the resource entry
|
||||
|
@ -4826,7 +4826,7 @@ static int ipr_device_configure(struct scsi_device *sdev,
|
|||
* Return value:
|
||||
* 0 on success / -ENXIO if device does not exist
|
||||
**/
|
||||
static int ipr_slave_alloc(struct scsi_device *sdev)
|
||||
static int ipr_sdev_init(struct scsi_device *sdev)
|
||||
{
|
||||
struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *) sdev->host->hostdata;
|
||||
struct ipr_resource_entry *res;
|
||||
|
@ -6398,9 +6398,9 @@ static const struct scsi_host_template driver_template = {
|
|||
.eh_abort_handler = ipr_eh_abort,
|
||||
.eh_device_reset_handler = ipr_eh_dev_reset,
|
||||
.eh_host_reset_handler = ipr_eh_host_reset,
|
||||
.slave_alloc = ipr_slave_alloc,
|
||||
.device_configure = ipr_device_configure,
|
||||
.slave_destroy = ipr_slave_destroy,
|
||||
.sdev_init = ipr_sdev_init,
|
||||
.sdev_configure = ipr_sdev_configure,
|
||||
.sdev_destroy = ipr_sdev_destroy,
|
||||
.scan_finished = ipr_scan_finished,
|
||||
.target_destroy = ipr_target_destroy,
|
||||
.change_queue_depth = ipr_change_queue_depth,
|
||||
|
@ -9844,7 +9844,7 @@ static void ipr_shutdown(struct pci_dev *pdev)
|
|||
}
|
||||
}
|
||||
|
||||
static struct pci_device_id ipr_pci_table[] = {
|
||||
static const struct pci_device_id ipr_pci_table[] = {
|
||||
{ PCI_VENDOR_ID_MYLEX, PCI_DEVICE_ID_IBM_GEMSTONE,
|
||||
PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_5702, 0, 0, 0 },
|
||||
{ PCI_VENDOR_ID_MYLEX, PCI_DEVICE_ID_IBM_GEMSTONE,
|
||||
|
|
|
@ -364,7 +364,7 @@ static struct scsi_host_template ips_driver_template = {
|
|||
.proc_name = "ips",
|
||||
.show_info = ips_show_info,
|
||||
.write_info = ips_write_info,
|
||||
.slave_configure = ips_slave_configure,
|
||||
.sdev_configure = ips_sdev_configure,
|
||||
.bios_param = ips_biosparam,
|
||||
.this_id = -1,
|
||||
.sg_tablesize = IPS_MAX_SG,
|
||||
|
@ -1166,7 +1166,7 @@ static int ips_biosparam(struct scsi_device *sdev, struct block_device *bdev,
|
|||
|
||||
/****************************************************************************/
|
||||
/* */
|
||||
/* Routine Name: ips_slave_configure */
|
||||
/* Routine Name: ips_sdev_configure */
|
||||
/* */
|
||||
/* Routine Description: */
|
||||
/* */
|
||||
|
@ -1174,7 +1174,7 @@ static int ips_biosparam(struct scsi_device *sdev, struct block_device *bdev,
|
|||
/* */
|
||||
/****************************************************************************/
|
||||
static int
|
||||
ips_slave_configure(struct scsi_device * SDptr)
|
||||
ips_sdev_configure(struct scsi_device *SDptr, struct queue_limits *lim)
|
||||
{
|
||||
ips_ha_t *ha;
|
||||
int min;
|
||||
|
|
|
@ -400,7 +400,8 @@
|
|||
*/
|
||||
static int ips_biosparam(struct scsi_device *sdev, struct block_device *bdev,
|
||||
sector_t capacity, int geom[]);
|
||||
static int ips_slave_configure(struct scsi_device *SDptr);
|
||||
static int ips_sdev_configure(struct scsi_device *SDptr,
|
||||
struct queue_limits *lim);
|
||||
|
||||
/*
|
||||
* Raid Command Formats
|
||||
|
|
|
@ -422,21 +422,6 @@ enum sci_status sci_remote_device_reset(struct isci_remote_device *idev)
|
|||
}
|
||||
}
|
||||
|
||||
enum sci_status sci_remote_device_reset_complete(struct isci_remote_device *idev)
|
||||
{
|
||||
struct sci_base_state_machine *sm = &idev->sm;
|
||||
enum sci_remote_device_states state = sm->current_state_id;
|
||||
|
||||
if (state != SCI_DEV_RESETTING) {
|
||||
dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %s\n",
|
||||
__func__, dev_state_name(state));
|
||||
return SCI_FAILURE_INVALID_STATE;
|
||||
}
|
||||
|
||||
sci_change_state(sm, SCI_DEV_READY);
|
||||
return SCI_SUCCESS;
|
||||
}
|
||||
|
||||
enum sci_status sci_remote_device_frame_handler(struct isci_remote_device *idev,
|
||||
u32 frame_index)
|
||||
{
|
||||
|
@ -1694,20 +1679,6 @@ enum sci_status sci_remote_device_abort_requests_pending_abort(
|
|||
return sci_remote_device_terminate_reqs_checkabort(idev, 1);
|
||||
}
|
||||
|
||||
enum sci_status isci_remote_device_reset_complete(
|
||||
struct isci_host *ihost,
|
||||
struct isci_remote_device *idev)
|
||||
{
|
||||
unsigned long flags;
|
||||
enum sci_status status;
|
||||
|
||||
spin_lock_irqsave(&ihost->scic_lock, flags);
|
||||
status = sci_remote_device_reset_complete(idev);
|
||||
spin_unlock_irqrestore(&ihost->scic_lock, flags);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
void isci_dev_set_hang_detection_timeout(
|
||||
struct isci_remote_device *idev,
|
||||
u32 timeout)
|
||||
|
|
|
@ -174,19 +174,6 @@ enum sci_status sci_remote_device_stop(
|
|||
enum sci_status sci_remote_device_reset(
|
||||
struct isci_remote_device *idev);
|
||||
|
||||
/**
|
||||
* sci_remote_device_reset_complete() - This method informs the device object
|
||||
* that the reset operation is complete and the device can resume operation
|
||||
* again.
|
||||
* @remote_device: This parameter specifies the device which is to be informed
|
||||
* of the reset complete operation.
|
||||
*
|
||||
* An indication that the device is resuming operation. SCI_SUCCESS the device
|
||||
* is resuming operation.
|
||||
*/
|
||||
enum sci_status sci_remote_device_reset_complete(
|
||||
struct isci_remote_device *idev);
|
||||
|
||||
/**
|
||||
* enum sci_remote_device_states - This enumeration depicts all the states
|
||||
* for the common remote device state machine.
|
||||
|
@ -364,10 +351,6 @@ enum sci_status isci_remote_device_reset(
|
|||
struct isci_host *ihost,
|
||||
struct isci_remote_device *idev);
|
||||
|
||||
enum sci_status isci_remote_device_reset_complete(
|
||||
struct isci_host *ihost,
|
||||
struct isci_remote_device *idev);
|
||||
|
||||
enum sci_status isci_remote_device_suspend_terminate(
|
||||
struct isci_host *ihost,
|
||||
struct isci_remote_device *idev,
|
||||
|
|
|
@ -1057,8 +1057,8 @@ static umode_t iscsi_sw_tcp_attr_is_visible(int param_type, int param)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int iscsi_sw_tcp_device_configure(struct scsi_device *sdev,
|
||||
struct queue_limits *lim)
|
||||
static int iscsi_sw_tcp_sdev_configure(struct scsi_device *sdev,
|
||||
struct queue_limits *lim)
|
||||
{
|
||||
struct iscsi_sw_tcp_host *tcp_sw_host = iscsi_host_priv(sdev->host);
|
||||
struct iscsi_session *session = tcp_sw_host->session;
|
||||
|
@ -1083,7 +1083,7 @@ static const struct scsi_host_template iscsi_sw_tcp_sht = {
|
|||
.eh_device_reset_handler= iscsi_eh_device_reset,
|
||||
.eh_target_reset_handler = iscsi_eh_recover_target,
|
||||
.dma_boundary = PAGE_SIZE - 1,
|
||||
.device_configure = iscsi_sw_tcp_device_configure,
|
||||
.sdev_configure = iscsi_sw_tcp_sdev_configure,
|
||||
.proc_name = "iscsi_tcp",
|
||||
.this_id = -1,
|
||||
.track_queue_depth = 1,
|
||||
|
|
|
@ -2222,13 +2222,13 @@ int fc_eh_host_reset(struct scsi_cmnd *sc_cmd)
|
|||
EXPORT_SYMBOL(fc_eh_host_reset);
|
||||
|
||||
/**
|
||||
* fc_slave_alloc() - Configure the queue depth of a Scsi_Host
|
||||
* fc_sdev_init() - Configure the queue depth of a Scsi_Host
|
||||
* @sdev: The SCSI device that identifies the SCSI host
|
||||
*
|
||||
* Configures queue depth based on host's cmd_per_len. If not set
|
||||
* then we use the libfc default.
|
||||
*/
|
||||
int fc_slave_alloc(struct scsi_device *sdev)
|
||||
int fc_sdev_init(struct scsi_device *sdev)
|
||||
{
|
||||
struct fc_rport *rport = starget_to_rport(scsi_target(sdev));
|
||||
|
||||
|
@ -2238,7 +2238,7 @@ int fc_slave_alloc(struct scsi_device *sdev)
|
|||
scsi_change_queue_depth(sdev, FC_FCP_DFLT_QUEUE_DEPTH);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(fc_slave_alloc);
|
||||
EXPORT_SYMBOL(fc_sdev_init);
|
||||
|
||||
/**
|
||||
* fc_fcp_destroy() - Tear down the FCP layer for a given local port
|
||||
|
|
|
@ -804,15 +804,14 @@ EXPORT_SYMBOL_GPL(sas_target_alloc);
|
|||
|
||||
#define SAS_DEF_QD 256
|
||||
|
||||
int sas_device_configure(struct scsi_device *scsi_dev,
|
||||
struct queue_limits *lim)
|
||||
int sas_sdev_configure(struct scsi_device *scsi_dev, struct queue_limits *lim)
|
||||
{
|
||||
struct domain_device *dev = sdev_to_domain_dev(scsi_dev);
|
||||
|
||||
BUG_ON(dev->rphy->identify.device_type != SAS_END_DEVICE);
|
||||
|
||||
if (dev_is_sata(dev)) {
|
||||
ata_sas_device_configure(scsi_dev, lim, dev->sata_dev.ap);
|
||||
ata_sas_sdev_configure(scsi_dev, lim, dev->sata_dev.ap);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -830,7 +829,7 @@ int sas_device_configure(struct scsi_device *scsi_dev,
|
|||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(sas_device_configure);
|
||||
EXPORT_SYMBOL_GPL(sas_sdev_configure);
|
||||
|
||||
int sas_change_queue_depth(struct scsi_device *sdev, int depth)
|
||||
{
|
||||
|
@ -1194,14 +1193,14 @@ void sas_task_abort(struct sas_task *task)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(sas_task_abort);
|
||||
|
||||
int sas_slave_alloc(struct scsi_device *sdev)
|
||||
int sas_sdev_init(struct scsi_device *sdev)
|
||||
{
|
||||
if (dev_is_sata(sdev_to_domain_dev(sdev)) && sdev->lun)
|
||||
return -ENXIO;
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(sas_slave_alloc);
|
||||
EXPORT_SYMBOL_GPL(sas_sdev_init);
|
||||
|
||||
void sas_target_destroy(struct scsi_target *starget)
|
||||
{
|
||||
|
|
|
@ -6185,7 +6185,7 @@ const struct attribute_group *lpfc_vport_groups[] = {
|
|||
**/
|
||||
static ssize_t
|
||||
sysfs_ctlreg_write(struct file *filp, struct kobject *kobj,
|
||||
struct bin_attribute *bin_attr,
|
||||
const struct bin_attribute *bin_attr,
|
||||
char *buf, loff_t off, size_t count)
|
||||
{
|
||||
size_t buf_off;
|
||||
|
@ -6244,7 +6244,7 @@ sysfs_ctlreg_write(struct file *filp, struct kobject *kobj,
|
|||
**/
|
||||
static ssize_t
|
||||
sysfs_ctlreg_read(struct file *filp, struct kobject *kobj,
|
||||
struct bin_attribute *bin_attr,
|
||||
const struct bin_attribute *bin_attr,
|
||||
char *buf, loff_t off, size_t count)
|
||||
{
|
||||
size_t buf_off;
|
||||
|
@ -6280,14 +6280,14 @@ sysfs_ctlreg_read(struct file *filp, struct kobject *kobj,
|
|||
return count;
|
||||
}
|
||||
|
||||
static struct bin_attribute sysfs_ctlreg_attr = {
|
||||
static const struct bin_attribute sysfs_ctlreg_attr = {
|
||||
.attr = {
|
||||
.name = "ctlreg",
|
||||
.mode = S_IRUSR | S_IWUSR,
|
||||
},
|
||||
.size = 256,
|
||||
.read = sysfs_ctlreg_read,
|
||||
.write = sysfs_ctlreg_write,
|
||||
.read_new = sysfs_ctlreg_read,
|
||||
.write_new = sysfs_ctlreg_write,
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -6308,7 +6308,7 @@ static struct bin_attribute sysfs_ctlreg_attr = {
|
|||
**/
|
||||
static ssize_t
|
||||
sysfs_mbox_write(struct file *filp, struct kobject *kobj,
|
||||
struct bin_attribute *bin_attr,
|
||||
const struct bin_attribute *bin_attr,
|
||||
char *buf, loff_t off, size_t count)
|
||||
{
|
||||
return -EPERM;
|
||||
|
@ -6332,20 +6332,20 @@ sysfs_mbox_write(struct file *filp, struct kobject *kobj,
|
|||
**/
|
||||
static ssize_t
|
||||
sysfs_mbox_read(struct file *filp, struct kobject *kobj,
|
||||
struct bin_attribute *bin_attr,
|
||||
const struct bin_attribute *bin_attr,
|
||||
char *buf, loff_t off, size_t count)
|
||||
{
|
||||
return -EPERM;
|
||||
}
|
||||
|
||||
static struct bin_attribute sysfs_mbox_attr = {
|
||||
static const struct bin_attribute sysfs_mbox_attr = {
|
||||
.attr = {
|
||||
.name = "mbox",
|
||||
.mode = S_IRUSR | S_IWUSR,
|
||||
},
|
||||
.size = MAILBOX_SYSFS_MAX,
|
||||
.read = sysfs_mbox_read,
|
||||
.write = sysfs_mbox_write,
|
||||
.read_new = sysfs_mbox_read,
|
||||
.write_new = sysfs_mbox_write,
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
@ -120,6 +120,16 @@ enum ELX_LOOPBACK_CMD {
|
|||
#define ELX_LOOPBACK_HEADER_SZ \
|
||||
(size_t)(&((struct lpfc_sli_ct_request *)NULL)->un)
|
||||
|
||||
/* For non-embedded read object command */
|
||||
#define READ_OBJ_EMB0_SCHEME_0 {1, 10, 256, 128}
|
||||
#define READ_OBJ_EMB0_SCHEME_1 {11, LPFC_EMB0_MAX_RD_OBJ_HBD_CNT, 512, 192}
|
||||
static const struct lpfc_read_object_cmd_scheme {
|
||||
u32 min_hbd_cnt;
|
||||
u32 max_hbd_cnt;
|
||||
u32 cmd_size;
|
||||
u32 payload_word_offset;
|
||||
} rd_obj_scheme[2] = {READ_OBJ_EMB0_SCHEME_0, READ_OBJ_EMB0_SCHEME_1};
|
||||
|
||||
struct lpfc_dmabufext {
|
||||
struct lpfc_dmabuf dma;
|
||||
uint32_t size;
|
||||
|
@ -3538,6 +3548,103 @@ lpfc_bsg_mbox_ext_session_reset(struct lpfc_hba *phba)
|
|||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* lpfc_rd_obj_emb0_handle_job - Handles completion for non-embedded
|
||||
* READ_OBJECT_V0 mailbox commands
|
||||
* @phba: pointer to lpfc_hba data struct
|
||||
* @pmb_buf: pointer to mailbox buffer
|
||||
* @sli_cfg_mbx: pointer to SLI_CONFIG mailbox memory region
|
||||
* @job: pointer to bsg_job struct
|
||||
* @bsg_reply: point to bsg_reply struct
|
||||
*
|
||||
* Given a non-embedded READ_OBJECT_V0's HBD_CNT, this routine copies
|
||||
* a READ_OBJECT_V0 mailbox command's read data payload into a bsg_job
|
||||
* structure for passing back to application layer.
|
||||
*
|
||||
* Return codes
|
||||
* 0 - successful
|
||||
* -EINVAL - invalid HBD_CNT
|
||||
* -ENODEV - pointer to bsg_job struct is NULL
|
||||
**/
|
||||
static int
|
||||
lpfc_rd_obj_emb0_handle_job(struct lpfc_hba *phba, u8 *pmb_buf,
|
||||
struct lpfc_sli_config_mbox *sli_cfg_mbx,
|
||||
struct bsg_job *job,
|
||||
struct fc_bsg_reply *bsg_reply)
|
||||
{
|
||||
struct lpfc_dmabuf *curr_dmabuf, *next_dmabuf;
|
||||
struct lpfc_sli_config_emb0_subsys *emb0_subsys;
|
||||
u32 hbd_cnt;
|
||||
u32 dma_buf_len;
|
||||
u8 i = 0;
|
||||
size_t extra_bytes;
|
||||
off_t skip = 0;
|
||||
|
||||
if (!job) {
|
||||
lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
|
||||
"2496 NULL job\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
if (!bsg_reply) {
|
||||
lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
|
||||
"2498 NULL bsg_reply\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
emb0_subsys = &sli_cfg_mbx->un.sli_config_emb0_subsys;
|
||||
|
||||
hbd_cnt = bsg_bf_get(lpfc_emb0_subcmnd_rd_obj_hbd_cnt,
|
||||
emb0_subsys);
|
||||
|
||||
/* Calculate where the read object's read data payload is located based
|
||||
* on HBD count scheme.
|
||||
*/
|
||||
if (hbd_cnt >= rd_obj_scheme[0].min_hbd_cnt &&
|
||||
hbd_cnt <= rd_obj_scheme[0].max_hbd_cnt) {
|
||||
skip = rd_obj_scheme[0].payload_word_offset * 4;
|
||||
} else if (hbd_cnt >= rd_obj_scheme[1].min_hbd_cnt &&
|
||||
hbd_cnt <= rd_obj_scheme[1].max_hbd_cnt) {
|
||||
skip = rd_obj_scheme[1].payload_word_offset * 4;
|
||||
} else {
|
||||
lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
|
||||
"2497 bad hbd_count 0x%08x\n",
|
||||
hbd_cnt);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Copy SLI_CONFIG command and READ_OBJECT response first */
|
||||
bsg_reply->reply_payload_rcv_len =
|
||||
sg_copy_from_buffer(job->reply_payload.sg_list,
|
||||
job->reply_payload.sg_cnt,
|
||||
pmb_buf, skip);
|
||||
|
||||
/* Copy data from hbds */
|
||||
list_for_each_entry_safe(curr_dmabuf, next_dmabuf,
|
||||
&phba->mbox_ext_buf_ctx.ext_dmabuf_list,
|
||||
list) {
|
||||
dma_buf_len = emb0_subsys->hbd[i].buf_len;
|
||||
|
||||
/* Use sg_copy_buffer to specify a skip offset */
|
||||
extra_bytes = sg_copy_buffer(job->reply_payload.sg_list,
|
||||
job->reply_payload.sg_cnt,
|
||||
curr_dmabuf->virt,
|
||||
dma_buf_len, skip, false);
|
||||
|
||||
bsg_reply->reply_payload_rcv_len += extra_bytes;
|
||||
|
||||
skip += extra_bytes;
|
||||
|
||||
lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
|
||||
"2499 copied hbd[%d] "
|
||||
"0x%zx bytes\n",
|
||||
i, extra_bytes);
|
||||
i++;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* lpfc_bsg_issue_mbox_ext_handle_job - job handler for multi-buffer mbox cmpl
|
||||
* @phba: Pointer to HBA context object.
|
||||
|
@ -3551,10 +3658,10 @@ lpfc_bsg_issue_mbox_ext_handle_job(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmboxq)
|
|||
{
|
||||
struct bsg_job_data *dd_data;
|
||||
struct bsg_job *job;
|
||||
struct fc_bsg_reply *bsg_reply;
|
||||
struct fc_bsg_reply *bsg_reply = NULL;
|
||||
uint8_t *pmb, *pmb_buf;
|
||||
unsigned long flags;
|
||||
uint32_t size;
|
||||
u32 size, opcode;
|
||||
int rc = 0;
|
||||
struct lpfc_dmabuf *dmabuf;
|
||||
struct lpfc_sli_config_mbox *sli_cfg_mbx;
|
||||
|
@ -3591,6 +3698,24 @@ lpfc_bsg_issue_mbox_ext_handle_job(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmboxq)
|
|||
lpfc_sli_pcimem_bcopy(&pmbx[sizeof(MAILBOX_t)],
|
||||
&pmbx[sizeof(MAILBOX_t)],
|
||||
sli_cfg_mbx->un.sli_config_emb0_subsys.mse[0].buf_len);
|
||||
|
||||
/* Special handling for non-embedded READ_OBJECT */
|
||||
opcode = bsg_bf_get(lpfc_emb0_subcmnd_opcode,
|
||||
&sli_cfg_mbx->un.sli_config_emb0_subsys);
|
||||
switch (opcode) {
|
||||
case COMN_OPCODE_READ_OBJECT:
|
||||
if (job) {
|
||||
rc = lpfc_rd_obj_emb0_handle_job(phba, pmb_buf,
|
||||
sli_cfg_mbx,
|
||||
job,
|
||||
bsg_reply);
|
||||
bsg_reply->result = rc;
|
||||
goto done;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Complete the job if the job is still active */
|
||||
|
@ -3604,12 +3729,14 @@ lpfc_bsg_issue_mbox_ext_handle_job(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmboxq)
|
|||
|
||||
/* result for successful */
|
||||
bsg_reply->result = 0;
|
||||
done:
|
||||
|
||||
lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
|
||||
"2937 SLI_CONFIG ext-buffer mailbox command "
|
||||
"(x%x/x%x) complete bsg job done, bsize:%d\n",
|
||||
phba->mbox_ext_buf_ctx.nembType,
|
||||
phba->mbox_ext_buf_ctx.mboxType, size);
|
||||
phba->mbox_ext_buf_ctx.mboxType,
|
||||
job->reply_payload.payload_len);
|
||||
lpfc_idiag_mbxacc_dump_bsg_mbox(phba,
|
||||
phba->mbox_ext_buf_ctx.nembType,
|
||||
phba->mbox_ext_buf_ctx.mboxType,
|
||||
|
@ -3819,14 +3946,16 @@ lpfc_bsg_sli_cfg_read_cmd_ext(struct lpfc_hba *phba, struct bsg_job *job,
|
|||
{
|
||||
struct fc_bsg_request *bsg_request = job->request;
|
||||
struct lpfc_sli_config_mbox *sli_cfg_mbx;
|
||||
struct lpfc_sli_config_emb0_subsys *emb0_subsys;
|
||||
struct list_head *ext_dmabuf_list;
|
||||
struct dfc_mbox_req *mbox_req;
|
||||
struct lpfc_dmabuf *curr_dmabuf, *next_dmabuf;
|
||||
uint32_t ext_buf_cnt, ext_buf_index;
|
||||
u32 ext_buf_cnt, ext_buf_index, hbd_cnt;
|
||||
struct lpfc_dmabuf *ext_dmabuf = NULL;
|
||||
struct bsg_job_data *dd_data = NULL;
|
||||
LPFC_MBOXQ_t *pmboxq = NULL;
|
||||
MAILBOX_t *pmb;
|
||||
uint8_t *pmbx;
|
||||
u8 *pmbx, opcode;
|
||||
int rc, i;
|
||||
|
||||
mbox_req =
|
||||
|
@ -3836,8 +3965,9 @@ lpfc_bsg_sli_cfg_read_cmd_ext(struct lpfc_hba *phba, struct bsg_job *job,
|
|||
sli_cfg_mbx = (struct lpfc_sli_config_mbox *)dmabuf->virt;
|
||||
|
||||
if (nemb_tp == nemb_mse) {
|
||||
emb0_subsys = &sli_cfg_mbx->un.sli_config_emb0_subsys;
|
||||
ext_buf_cnt = bsg_bf_get(lpfc_mbox_hdr_mse_cnt,
|
||||
&sli_cfg_mbx->un.sli_config_emb0_subsys.sli_config_hdr);
|
||||
&emb0_subsys->sli_config_hdr);
|
||||
if (ext_buf_cnt > LPFC_MBX_SLI_CONFIG_MAX_MSE) {
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_LIBDFC,
|
||||
"2945 Handled SLI_CONFIG(mse) rd, "
|
||||
|
@ -3847,6 +3977,57 @@ lpfc_bsg_sli_cfg_read_cmd_ext(struct lpfc_hba *phba, struct bsg_job *job,
|
|||
rc = -ERANGE;
|
||||
goto job_error;
|
||||
}
|
||||
|
||||
/* Special handling for non-embedded READ_OBJECT */
|
||||
opcode = bsg_bf_get(lpfc_emb0_subcmnd_opcode, emb0_subsys);
|
||||
switch (opcode) {
|
||||
case COMN_OPCODE_READ_OBJECT:
|
||||
hbd_cnt = bsg_bf_get(lpfc_emb0_subcmnd_rd_obj_hbd_cnt,
|
||||
emb0_subsys);
|
||||
lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
|
||||
"2449 SLI_CONFIG(mse) rd non-embedded "
|
||||
"hbd count = %d\n",
|
||||
hbd_cnt);
|
||||
|
||||
ext_dmabuf_list =
|
||||
&phba->mbox_ext_buf_ctx.ext_dmabuf_list;
|
||||
|
||||
/* Allocate hbds */
|
||||
for (i = 0; i < hbd_cnt; i++) {
|
||||
ext_dmabuf = lpfc_bsg_dma_page_alloc(phba);
|
||||
if (!ext_dmabuf) {
|
||||
rc = -ENOMEM;
|
||||
goto job_error;
|
||||
}
|
||||
list_add_tail(&ext_dmabuf->list,
|
||||
ext_dmabuf_list);
|
||||
}
|
||||
|
||||
/* Fill out the physical memory addresses for the
|
||||
* hbds
|
||||
*/
|
||||
i = 0;
|
||||
list_for_each_entry_safe(curr_dmabuf, next_dmabuf,
|
||||
ext_dmabuf_list, list) {
|
||||
emb0_subsys->hbd[i].pa_hi =
|
||||
putPaddrHigh(curr_dmabuf->phys);
|
||||
emb0_subsys->hbd[i].pa_lo =
|
||||
putPaddrLow(curr_dmabuf->phys);
|
||||
|
||||
lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
|
||||
"2495 SLI_CONFIG(hbd)[%d], "
|
||||
"bufLen:%d, addrHi:x%x, "
|
||||
"addrLo:x%x\n", i,
|
||||
emb0_subsys->hbd[i].buf_len,
|
||||
emb0_subsys->hbd[i].pa_hi,
|
||||
emb0_subsys->hbd[i].pa_lo);
|
||||
i++;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
|
||||
"2941 Handled SLI_CONFIG(mse) rd, "
|
||||
"ext_buf_cnt:%d\n", ext_buf_cnt);
|
||||
|
@ -4223,6 +4404,7 @@ lpfc_bsg_handle_sli_cfg_mbox(struct lpfc_hba *phba, struct bsg_job *job,
|
|||
case COMN_OPCODE_GET_CNTL_ATTRIBUTES:
|
||||
case COMN_OPCODE_GET_PROFILE_CONFIG:
|
||||
case COMN_OPCODE_SET_FEATURES:
|
||||
case COMN_OPCODE_READ_OBJECT:
|
||||
lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
|
||||
"3106 Handled SLI_CONFIG "
|
||||
"subsys_comn, opcode:x%x\n",
|
||||
|
@ -4665,8 +4847,7 @@ lpfc_bsg_issue_mbox(struct lpfc_hba *phba, struct bsg_job *job,
|
|||
bsg_reply->reply_payload_rcv_len = 0;
|
||||
|
||||
/* sanity check to protect driver */
|
||||
if (job->reply_payload.payload_len > BSG_MBOX_SIZE ||
|
||||
job->request_payload.payload_len > BSG_MBOX_SIZE) {
|
||||
if (job->request_payload.payload_len > BSG_MBOX_SIZE) {
|
||||
rc = -ERANGE;
|
||||
goto job_done;
|
||||
}
|
||||
|
@ -4737,6 +4918,19 @@ lpfc_bsg_issue_mbox(struct lpfc_hba *phba, struct bsg_job *job,
|
|||
pmb->mbxOwner = OWN_HOST;
|
||||
pmboxq->vport = vport;
|
||||
|
||||
/* non-embedded SLI_CONFIG requests already parsed, check others */
|
||||
if (unlikely(job->reply_payload.payload_len > BSG_MBOX_SIZE)) {
|
||||
lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
|
||||
"2729 Cmd x%x (x%x/x%x) request has "
|
||||
"out-of-range reply payload length x%x\n",
|
||||
pmb->mbxCommand,
|
||||
lpfc_sli_config_mbox_subsys_get(phba, pmboxq),
|
||||
lpfc_sli_config_mbox_opcode_get(phba, pmboxq),
|
||||
job->reply_payload.payload_len);
|
||||
rc = -ERANGE;
|
||||
goto job_done;
|
||||
}
|
||||
|
||||
/* If HBA encountered an error attention, allow only DUMP
|
||||
* or RESTART mailbox commands until the HBA is restarted.
|
||||
*/
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*******************************************************************
|
||||
* This file is part of the Emulex Linux Device Driver for *
|
||||
* Fibre Channel Host Bus Adapters. *
|
||||
* Copyright (C) 2017-2022 Broadcom. All Rights Reserved. The term *
|
||||
* Copyright (C) 2017-2024 Broadcom. All Rights Reserved. The term *
|
||||
* “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. *
|
||||
* Copyright (C) 2010-2015 Emulex. All rights reserved. *
|
||||
* EMULEX and SLI are trademarks of Emulex. *
|
||||
|
@ -239,12 +239,27 @@ struct lpfc_sli_config_emb0_subsys {
|
|||
uint32_t timeout; /* comn_set_feature timeout */
|
||||
uint32_t request_length; /* comn_set_feature request len */
|
||||
uint32_t version; /* comn_set_feature version */
|
||||
uint32_t csf_feature; /* comn_set_feature feature */
|
||||
uint32_t word68; /* comn_set_feature feature */
|
||||
#define lpfc_emb0_subcmnd_csf_feat_SHIFT 0
|
||||
#define lpfc_emb0_subcmnd_csf_feat_MASK 0xffffffff
|
||||
#define lpfc_emb0_subcmnd_csf_feat_WORD word68
|
||||
#define lpfc_emb0_subcmnd_rd_obj_des_rd_len_SHIFT 0
|
||||
#define lpfc_emb0_subcmnd_rd_obj_des_rd_len_MASK 0x00ffffff
|
||||
#define lpfc_emb0_subcmnd_rd_obj_des_rd_len_WORD word68
|
||||
uint32_t word69; /* comn_set_feature parameter len */
|
||||
uint32_t word70; /* comn_set_feature parameter val0 */
|
||||
#define lpfc_emb0_subcmnd_csf_p0_SHIFT 0
|
||||
#define lpfc_emb0_subcmnd_csf_p0_MASK 0x3
|
||||
#define lpfc_emb0_subcmnd_csf_p0_WORD word70
|
||||
uint32_t reserved71[25];
|
||||
uint32_t word96; /* rd_obj hbd_count */
|
||||
#define lpfc_emb0_subcmnd_rd_obj_hbd_cnt_SHIFT 0
|
||||
#define lpfc_emb0_subcmnd_rd_obj_hbd_cnt_MASK 0xffffffff
|
||||
#define lpfc_emb0_subcmnd_rd_obj_hbd_cnt_WORD word96
|
||||
#define LPFC_EMB0_MAX_RD_OBJ_HBD_CNT 31
|
||||
struct lpfc_sli_config_hbd hbd[LPFC_EMB0_MAX_RD_OBJ_HBD_CNT];
|
||||
uint32_t word190;
|
||||
uint32_t word191;
|
||||
};
|
||||
|
||||
struct lpfc_sli_config_emb1_subsys {
|
||||
|
|
|
@ -1646,14 +1646,12 @@ out:
|
|||
/* If the caller wanted a synchronous DA_ID completion, signal the
|
||||
* wait obj and clear flag to reset the vport.
|
||||
*/
|
||||
if (ndlp->save_flags & NLP_WAIT_FOR_DA_ID) {
|
||||
if (test_bit(NLP_WAIT_FOR_DA_ID, &ndlp->save_flags)) {
|
||||
if (ndlp->da_id_waitq)
|
||||
wake_up(ndlp->da_id_waitq);
|
||||
}
|
||||
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
ndlp->save_flags &= ~NLP_WAIT_FOR_DA_ID;
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
clear_bit(NLP_WAIT_FOR_DA_ID, &ndlp->save_flags);
|
||||
|
||||
lpfc_ct_free_iocb(phba, cmdiocb);
|
||||
lpfc_nlp_put(ndlp);
|
||||
|
|
|
@ -85,13 +85,13 @@ enum lpfc_fc4_xpt_flags {
|
|||
NLP_XPT_HAS_HH = 0x10
|
||||
};
|
||||
|
||||
enum lpfc_nlp_save_flags {
|
||||
enum lpfc_nlp_save_flags { /* mask bits */
|
||||
/* devloss occurred during recovery */
|
||||
NLP_IN_RECOV_POST_DEV_LOSS = 0x1,
|
||||
NLP_IN_RECOV_POST_DEV_LOSS,
|
||||
/* wait for outstanding LOGO to cmpl */
|
||||
NLP_WAIT_FOR_LOGO = 0x2,
|
||||
NLP_WAIT_FOR_LOGO,
|
||||
/* wait for outstanding DA_ID to finish */
|
||||
NLP_WAIT_FOR_DA_ID = 0x4
|
||||
NLP_WAIT_FOR_DA_ID
|
||||
};
|
||||
|
||||
struct lpfc_nodelist {
|
||||
|
@ -154,7 +154,7 @@ struct lpfc_nodelist {
|
|||
uint32_t fc4_prli_sent;
|
||||
|
||||
/* flags to keep ndlp alive until special conditions are met */
|
||||
enum lpfc_nlp_save_flags save_flags;
|
||||
unsigned long save_flags;
|
||||
|
||||
enum lpfc_fc4_xpt_flags fc4_xpt_flags;
|
||||
|
||||
|
@ -208,7 +208,6 @@ enum lpfc_nlp_flag {
|
|||
NPR list */
|
||||
NLP_RM_DFLT_RPI = 26, /* need to remove leftover dflt RPI */
|
||||
NLP_NODEV_REMOVE = 27, /* Defer removal till discovery ends */
|
||||
NLP_TARGET_REMOVE = 28, /* Target remove in process */
|
||||
NLP_SC_REQ = 29, /* Target requires authentication */
|
||||
NLP_FIRSTBURST = 30, /* Target supports FirstBurst */
|
||||
NLP_RPI_REGISTERED = 31 /* nlp_rpi is valid */
|
||||
|
|
|
@ -2988,12 +2988,8 @@ lpfc_cmpl_els_logo(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
|||
}
|
||||
|
||||
clear_bit(NLP_LOGO_SND, &ndlp->nlp_flag);
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
if (ndlp->save_flags & NLP_WAIT_FOR_LOGO) {
|
||||
if (test_and_clear_bit(NLP_WAIT_FOR_LOGO, &ndlp->save_flags))
|
||||
wake_up_waiter = 1;
|
||||
ndlp->save_flags &= ~NLP_WAIT_FOR_LOGO;
|
||||
}
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
|
||||
lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
|
||||
"LOGO cmpl: status:x%x/x%x did:x%x",
|
||||
|
@ -3035,19 +3031,6 @@ lpfc_cmpl_els_logo(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
|||
/* Call state machine. This will unregister the rpi if needed. */
|
||||
lpfc_disc_state_machine(vport, ndlp, cmdiocb, NLP_EVT_CMPL_LOGO);
|
||||
|
||||
if (skip_recovery)
|
||||
goto out;
|
||||
|
||||
/* The driver sets this flag for an NPIV instance that doesn't want to
|
||||
* log into the remote port.
|
||||
*/
|
||||
if (test_bit(NLP_TARGET_REMOVE, &ndlp->nlp_flag)) {
|
||||
clear_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag);
|
||||
lpfc_disc_state_machine(vport, ndlp, cmdiocb,
|
||||
NLP_EVT_DEVICE_RM);
|
||||
goto out_rsrc_free;
|
||||
}
|
||||
|
||||
out:
|
||||
/* At this point, the LOGO processing is complete. NOTE: For a
|
||||
* pt2pt topology, we are assuming the NPortID will only change
|
||||
|
@ -3091,7 +3074,7 @@ out:
|
|||
lpfc_disc_state_machine(vport, ndlp, cmdiocb,
|
||||
NLP_EVT_DEVICE_RM);
|
||||
}
|
||||
out_rsrc_free:
|
||||
|
||||
/* Driver is done with the I/O. */
|
||||
lpfc_els_free_iocb(phba, cmdiocb);
|
||||
lpfc_nlp_put(ndlp);
|
||||
|
@ -4583,6 +4566,7 @@ lpfc_els_retry(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
|||
int link_reset = 0, rc;
|
||||
u32 ulp_status = get_job_ulpstatus(phba, rspiocb);
|
||||
u32 ulp_word4 = get_job_word4(phba, rspiocb);
|
||||
u8 rsn_code_exp = 0;
|
||||
|
||||
|
||||
/* Note: cmd_dmabuf may be 0 for internal driver abort
|
||||
|
@ -4798,11 +4782,22 @@ lpfc_els_retry(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
|||
break;
|
||||
|
||||
case LSRJT_LOGICAL_BSY:
|
||||
rsn_code_exp = stat.un.b.lsRjtRsnCodeExp;
|
||||
if ((cmd == ELS_CMD_PLOGI) ||
|
||||
(cmd == ELS_CMD_PRLI) ||
|
||||
(cmd == ELS_CMD_NVMEPRLI)) {
|
||||
delay = 1000;
|
||||
maxretry = 48;
|
||||
|
||||
/* An authentication LS_RJT reason code
|
||||
* explanation means some error in the
|
||||
* security settings end-to-end. Reduce
|
||||
* the retry count to allow lpfc to clear
|
||||
* RSCN mode and not race with dev_loss.
|
||||
*/
|
||||
if (cmd == ELS_CMD_PLOGI &&
|
||||
rsn_code_exp == LSEXP_AUTH_REQ)
|
||||
maxretry = 8;
|
||||
} else if (cmd == ELS_CMD_FDISC) {
|
||||
/* FDISC retry policy */
|
||||
maxretry = 48;
|
||||
|
@ -4831,6 +4826,20 @@ lpfc_els_retry(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
|||
"0820 FLOGI (x%x). "
|
||||
"BBCredit Not Supported\n",
|
||||
stat.un.lsRjtError);
|
||||
} else if (cmd == ELS_CMD_PLOGI) {
|
||||
rsn_code_exp = stat.un.b.lsRjtRsnCodeExp;
|
||||
|
||||
/* An authentication LS_RJT reason code
|
||||
* explanation means some error in the
|
||||
* security settings end-to-end. Reduce
|
||||
* the retry count to allow lpfc to clear
|
||||
* RSCN mode and not race with dev_loss.
|
||||
*/
|
||||
if (rsn_code_exp == LSEXP_AUTH_REQ) {
|
||||
delay = 1000;
|
||||
retry = 1;
|
||||
maxretry = 8;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -10411,8 +10420,6 @@ lpfc_els_unsol_buffer(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
|
|||
}
|
||||
}
|
||||
|
||||
clear_bit(NLP_TARGET_REMOVE, &ndlp->nlp_flag);
|
||||
|
||||
lpfc_disc_state_machine(vport, ndlp, elsiocb,
|
||||
NLP_EVT_RCV_PLOGI);
|
||||
|
||||
|
@ -11498,15 +11505,13 @@ lpfc_cmpl_els_npiv_logo(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
|||
lpfc_can_disctmo(vport);
|
||||
}
|
||||
|
||||
if (ndlp->save_flags & NLP_WAIT_FOR_LOGO) {
|
||||
if (test_bit(NLP_WAIT_FOR_LOGO, &ndlp->save_flags)) {
|
||||
/* Wake up lpfc_vport_delete if waiting...*/
|
||||
if (ndlp->logo_waitq)
|
||||
wake_up(ndlp->logo_waitq);
|
||||
clear_bit(NLP_ISSUE_LOGO, &ndlp->nlp_flag);
|
||||
clear_bit(NLP_LOGO_SND, &ndlp->nlp_flag);
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
ndlp->save_flags &= ~NLP_WAIT_FOR_LOGO;
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
clear_bit(NLP_WAIT_FOR_LOGO, &ndlp->save_flags);
|
||||
}
|
||||
|
||||
/* Safe to release resources now. */
|
||||
|
|
|
@ -414,12 +414,7 @@ void
|
|||
lpfc_check_nlp_post_devloss(struct lpfc_vport *vport,
|
||||
struct lpfc_nodelist *ndlp)
|
||||
{
|
||||
unsigned long iflags;
|
||||
|
||||
spin_lock_irqsave(&ndlp->lock, iflags);
|
||||
if (ndlp->save_flags & NLP_IN_RECOV_POST_DEV_LOSS) {
|
||||
ndlp->save_flags &= ~NLP_IN_RECOV_POST_DEV_LOSS;
|
||||
spin_unlock_irqrestore(&ndlp->lock, iflags);
|
||||
if (test_and_clear_bit(NLP_IN_RECOV_POST_DEV_LOSS, &ndlp->save_flags)) {
|
||||
lpfc_nlp_get(ndlp);
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY | LOG_NODE,
|
||||
"8438 Devloss timeout reversed on DID x%x "
|
||||
|
@ -427,9 +422,7 @@ lpfc_check_nlp_post_devloss(struct lpfc_vport *vport,
|
|||
"port_state = x%x\n",
|
||||
ndlp->nlp_DID, kref_read(&ndlp->kref), ndlp,
|
||||
ndlp->nlp_flag, vport->port_state);
|
||||
return;
|
||||
}
|
||||
spin_unlock_irqrestore(&ndlp->lock, iflags);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -546,9 +539,7 @@ lpfc_dev_loss_tmo_handler(struct lpfc_nodelist *ndlp)
|
|||
ndlp->nlp_DID, kref_read(&ndlp->kref),
|
||||
ndlp, ndlp->nlp_flag,
|
||||
vport->port_state);
|
||||
spin_lock_irqsave(&ndlp->lock, iflags);
|
||||
ndlp->save_flags |= NLP_IN_RECOV_POST_DEV_LOSS;
|
||||
spin_unlock_irqrestore(&ndlp->lock, iflags);
|
||||
set_bit(NLP_IN_RECOV_POST_DEV_LOSS, &ndlp->save_flags);
|
||||
return fcf_inuse;
|
||||
} else if (ndlp->nlp_state == NLP_STE_UNMAPPED_NODE) {
|
||||
/* Fabric node fully recovered before this dev_loss_tmo
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*******************************************************************
|
||||
* This file is part of the Emulex Linux Device Driver for *
|
||||
* Fibre Channel Host Bus Adapters. *
|
||||
* Copyright (C) 2017-2023 Broadcom. All Rights Reserved. The term *
|
||||
* Copyright (C) 2017-2024 Broadcom. All Rights Reserved. The term *
|
||||
* “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. *
|
||||
* Copyright (C) 2004-2016 Emulex. All rights reserved. *
|
||||
* EMULEX and SLI are trademarks of Emulex. *
|
||||
|
@ -724,6 +724,7 @@ struct ls_rjt { /* Structure is in Big Endian format */
|
|||
#define LSEXP_OUT_OF_RESOURCE 0x29
|
||||
#define LSEXP_CANT_GIVE_DATA 0x2A
|
||||
#define LSEXP_REQ_UNSUPPORTED 0x2C
|
||||
#define LSEXP_AUTH_REQ 0x48
|
||||
#define LSEXP_NO_RSRC_ASSIGN 0x52
|
||||
uint8_t vendorUnique; /* FC Word 0, bit 0: 7 */
|
||||
} b;
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue