forked from Minki/linux
SCSI misc on 20200806
This series consists of the usual driver updates (ufs, qla2xxx, tcmu, lpfc, hpsa, zfcp, scsi_debug) and minor bug fixes. We also have a huge docbook fix update like most other subsystems and no major update to the core (the few non trivial updates are either minor fixes or removing an unused feature [scsi_sdb_cache]). Signed-off-by: James E.J. Bottomley <jejb@linux.ibm.com> -----BEGIN PGP SIGNATURE----- iJwEABMIAEQWIQTnYEDbdso9F2cI+arnQslM7pishQUCXyxq1yYcamFtZXMuYm90 dG9tbGV5QGhhbnNlbnBhcnRuZXJzaGlwLmNvbQAKCRDnQslM7pishSoAAQChZ4i8 ZqYW3pL33JO3fA8vdjvLuyC489Hj4wzIsl3/bQEAxYyM6BSLvMoLWR2Plq/JmTLm 4W/LDptarpTiDI3NuDc= =4b0W -----END PGP SIGNATURE----- Merge tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi Pull SCSI updates from James Bottomley: "This consists of the usual driver updates (ufs, qla2xxx, tcmu, lpfc, hpsa, zfcp, scsi_debug) and minor bug fixes. We also have a huge docbook fix update like most other subsystems and no major update to the core (the few non trivial updates are either minor fixes or removing an unused feature [scsi_sdb_cache])" * tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi: (307 commits) scsi: scsi_transport_srp: Sanitize scsi_target_block/unblock sequences scsi: ufs-mediatek: Apply DELAY_AFTER_LPM quirk to Micron devices scsi: ufs: Introduce device quirk "DELAY_AFTER_LPM" scsi: virtio-scsi: Correctly handle the case where all LUNs are unplugged scsi: scsi_debug: Implement tur_ms_to_ready parameter scsi: scsi_debug: Fix request sense scsi: lpfc: Fix typo in comment for ULP scsi: ufs-mediatek: Prevent LPM operation on undeclared VCC scsi: iscsi: Do not put host in iscsi_set_flashnode_param() scsi: hpsa: Correct ctrl queue depth scsi: target: tcmu: Make TMR notification optional scsi: target: tcmu: Implement tmr_notify callback scsi: target: tcmu: Fix and simplify timeout handling scsi: target: tcmu: Factor out new helper ring_insert_padding scsi: target: tcmu: Do not queue aborted commands scsi: target: tcmu: Use priv pointer in se_cmd scsi: target: Add tmr_notify backend function scsi: target: Modify core_tmr_abort_task() scsi: target: iscsi: Fix inconsistent debug message scsi: target: iscsi: Fix login error when receiving ...
This commit is contained in:
commit
dfdf16ecfd
@ -883,3 +883,139 @@ Contact: Subhash Jadavani <subhashj@codeaurora.org>
|
||||
Description: This entry shows the target state of an UFS UIC link
|
||||
for the chosen system power management level.
|
||||
The file is read only.
|
||||
|
||||
What: /sys/bus/platform/drivers/ufshcd/*/device_descriptor/wb_presv_us_en
|
||||
Date: June 2020
|
||||
Contact: Asutosh Das <asutoshd@codeaurora.org>
|
||||
Description: This entry shows if preserve user-space was configured
|
||||
The file is read only.
|
||||
|
||||
What: /sys/bus/platform/drivers/ufshcd/*/device_descriptor/wb_shared_alloc_units
|
||||
Date: June 2020
|
||||
Contact: Asutosh Das <asutoshd@codeaurora.org>
|
||||
Description: This entry shows the shared allocated units of WB buffer
|
||||
The file is read only.
|
||||
|
||||
What: /sys/bus/platform/drivers/ufshcd/*/device_descriptor/wb_type
|
||||
Date: June 2020
|
||||
Contact: Asutosh Das <asutoshd@codeaurora.org>
|
||||
Description: This entry shows the configured WB type.
|
||||
0x1 for shared buffer mode. 0x0 for dedicated buffer mode.
|
||||
The file is read only.
|
||||
|
||||
What: /sys/bus/platform/drivers/ufshcd/*/geometry_descriptor/wb_buff_cap_adj
|
||||
Date: June 2020
|
||||
Contact: Asutosh Das <asutoshd@codeaurora.org>
|
||||
Description: This entry shows the total user-space decrease in shared
|
||||
buffer mode.
|
||||
The value of this parameter is 3 for TLC NAND when SLC mode
|
||||
is used as WriteBooster Buffer. 2 for MLC NAND.
|
||||
The file is read only.
|
||||
|
||||
What: /sys/bus/platform/drivers/ufshcd/*/geometry_descriptor/wb_max_alloc_units
|
||||
Date: June 2020
|
||||
Contact: Asutosh Das <asutoshd@codeaurora.org>
|
||||
Description: This entry shows the Maximum total WriteBooster Buffer size
|
||||
which is supported by the entire device.
|
||||
The file is read only.
|
||||
|
||||
What: /sys/bus/platform/drivers/ufshcd/*/geometry_descriptor/wb_max_wb_luns
|
||||
Date: June 2020
|
||||
Contact: Asutosh Das <asutoshd@codeaurora.org>
|
||||
Description: This entry shows the maximum number of luns that can support
|
||||
WriteBooster.
|
||||
The file is read only.
|
||||
|
||||
What: /sys/bus/platform/drivers/ufshcd/*/geometry_descriptor/wb_sup_red_type
|
||||
Date: June 2020
|
||||
Contact: Asutosh Das <asutoshd@codeaurora.org>
|
||||
Description: The supportability of user space reduction mode
|
||||
and preserve user space mode.
|
||||
00h: WriteBooster Buffer can be configured only in
|
||||
user space reduction type.
|
||||
01h: WriteBooster Buffer can be configured only in
|
||||
preserve user space type.
|
||||
02h: Device can be configured in either user space
|
||||
reduction type or preserve user space type.
|
||||
The file is read only.
|
||||
|
||||
What: /sys/bus/platform/drivers/ufshcd/*/geometry_descriptor/wb_sup_wb_type
|
||||
Date: June 2020
|
||||
Contact: Asutosh Das <asutoshd@codeaurora.org>
|
||||
Description: The supportability of WriteBooster Buffer type.
|
||||
00h: LU based WriteBooster Buffer configuration
|
||||
01h: Single shared WriteBooster Buffer
|
||||
configuration
|
||||
02h: Supporting both LU based WriteBooster
|
||||
Buffer and Single shared WriteBooster Buffer
|
||||
configuration
|
||||
The file is read only.
|
||||
|
||||
What: /sys/bus/platform/drivers/ufshcd/*/flags/wb_enable
|
||||
Date: June 2020
|
||||
Contact: Asutosh Das <asutoshd@codeaurora.org>
|
||||
Description: This entry shows the status of WriteBooster.
|
||||
0: WriteBooster is not enabled.
|
||||
1: WriteBooster is enabled
|
||||
The file is read only.
|
||||
|
||||
What: /sys/bus/platform/drivers/ufshcd/*/flags/wb_flush_en
|
||||
Date: June 2020
|
||||
Contact: Asutosh Das <asutoshd@codeaurora.org>
|
||||
Description: This entry shows if flush is enabled.
|
||||
0: Flush operation is not performed.
|
||||
1: Flush operation is performed.
|
||||
The file is read only.
|
||||
|
||||
What: /sys/bus/platform/drivers/ufshcd/*/flags/wb_flush_during_h8
|
||||
Date: June 2020
|
||||
Contact: Asutosh Das <asutoshd@codeaurora.org>
|
||||
Description: Flush WriteBooster Buffer during hibernate state.
|
||||
0: Device is not allowed to flush the
|
||||
WriteBooster Buffer during link hibernate
|
||||
state.
|
||||
1: Device is allowed to flush the
|
||||
WriteBooster Buffer during link hibernate
|
||||
state
|
||||
The file is read only.
|
||||
|
||||
What: /sys/bus/platform/drivers/ufshcd/*/attributes/wb_avail_buf
|
||||
Date: June 2020
|
||||
Contact: Asutosh Das <asutoshd@codeaurora.org>
|
||||
Description: This entry shows the amount of unused WriteBooster buffer
|
||||
available.
|
||||
The file is read only.
|
||||
|
||||
What: /sys/bus/platform/drivers/ufshcd/*/attributes/wb_cur_buf
|
||||
Date: June 2020
|
||||
Contact: Asutosh Das <asutoshd@codeaurora.org>
|
||||
Description: This entry shows the amount of unused current buffer.
|
||||
The file is read only.
|
||||
|
||||
What: /sys/bus/platform/drivers/ufshcd/*/attributes/wb_flush_status
|
||||
Date: June 2020
|
||||
Contact: Asutosh Das <asutoshd@codeaurora.org>
|
||||
Description: This entry shows the flush operation status.
|
||||
00h: idle
|
||||
01h: Flush operation in progress
|
||||
02h: Flush operation stopped prematurely.
|
||||
03h: Flush operation completed successfully
|
||||
04h: Flush operation general failure
|
||||
The file is read only.
|
||||
|
||||
What: /sys/bus/platform/drivers/ufshcd/*/attributes/wb_life_time_est
|
||||
Date: June 2020
|
||||
Contact: Asutosh Das <asutoshd@codeaurora.org>
|
||||
Description: This entry shows an indication of the WriteBooster Buffer
|
||||
lifetime based on the amount of performed program/erase cycles
|
||||
01h: 0% - 10% WriteBooster Buffer life time used
|
||||
...
|
||||
0Ah: 90% - 100% WriteBooster Buffer life time used
|
||||
The file is read only.
|
||||
|
||||
What: /sys/class/scsi_device/*/device/unit_descriptor/wb_buf_alloc_units
|
||||
Date: June 2020
|
||||
Contact: Asutosh Das <asutoshd@codeaurora.org>
|
||||
Description: This entry shows the configured size of WriteBooster buffer.
|
||||
0400h corresponds to 4GB.
|
||||
The file is read only.
|
||||
|
@ -125,7 +125,7 @@ The following constants can be defined in the source file.
|
||||
c. klogd is started with the appropriate -c parameter
|
||||
(e.g. klogd -c 8)
|
||||
|
||||
This will cause printk() messages to be be displayed on the
|
||||
This will cause printk() messages to be displayed on the
|
||||
current console. Refer to the klogd(8) and syslogd(8) man pages
|
||||
for details.
|
||||
|
||||
|
@ -94,7 +94,7 @@ parameters may be changed at runtime by the command
|
||||
(/proc/sys/dev/scsi/logging_level).
|
||||
There is also a nice 'scsi_logging_level' script in the
|
||||
S390-tools package, available for download at
|
||||
http://www-128.ibm.com/developerworks/linux/linux390/s390-tools-1.5.4.html
|
||||
https://github.com/ibm-s390-tools/s390-tools/blob/master/scripts/scsi_logging_level
|
||||
|
||||
scsi_mod.scan= [SCSI] sync (default) scans SCSI busses as they are
|
||||
discovered. async scans them in kernel threads,
|
||||
|
@ -2309,7 +2309,7 @@ F: drivers/pci/controller/dwc/pcie-qcom.c
|
||||
F: drivers/phy/qualcomm/
|
||||
F: drivers/power/*/msm*
|
||||
F: drivers/reset/reset-qcom-*
|
||||
F: drivers/scsi/ufs/ufs-qcom.*
|
||||
F: drivers/scsi/ufs/ufs-qcom*
|
||||
F: drivers/spi/spi-geni-qcom.c
|
||||
F: drivers/spi/spi-qcom-qspi.c
|
||||
F: drivers/spi/spi-qup.c
|
||||
|
@ -164,9 +164,8 @@ EXPORT_SYMBOL(blk_pre_runtime_resume);
|
||||
*
|
||||
* Description:
|
||||
* Update the queue's runtime status according to the return value of the
|
||||
* device's runtime_resume function. If it is successfully resumed, process
|
||||
* the requests that are queued into the device's queue when it is resuming
|
||||
* and then mark last busy and initiate autosuspend for it.
|
||||
* device's runtime_resume function. If the resume was successful, call
|
||||
* blk_set_runtime_active() to do the real work of restarting the queue.
|
||||
*
|
||||
* This function should be called near the end of the device's
|
||||
* runtime_resume callback.
|
||||
@ -175,19 +174,13 @@ void blk_post_runtime_resume(struct request_queue *q, int err)
|
||||
{
|
||||
if (!q->dev)
|
||||
return;
|
||||
|
||||
spin_lock_irq(&q->queue_lock);
|
||||
if (!err) {
|
||||
q->rpm_status = RPM_ACTIVE;
|
||||
pm_runtime_mark_last_busy(q->dev);
|
||||
pm_request_autosuspend(q->dev);
|
||||
blk_set_runtime_active(q);
|
||||
} else {
|
||||
spin_lock_irq(&q->queue_lock);
|
||||
q->rpm_status = RPM_SUSPENDED;
|
||||
spin_unlock_irq(&q->queue_lock);
|
||||
}
|
||||
spin_unlock_irq(&q->queue_lock);
|
||||
|
||||
if (!err)
|
||||
blk_clear_pm_only(q);
|
||||
}
|
||||
EXPORT_SYMBOL(blk_post_runtime_resume);
|
||||
|
||||
@ -204,15 +197,25 @@ EXPORT_SYMBOL(blk_post_runtime_resume);
|
||||
* This function can be used in driver's resume hook to correct queue
|
||||
* runtime PM status and re-enable peeking requests from the queue. It
|
||||
* should be called before first request is added to the queue.
|
||||
*
|
||||
* This function is also called by blk_post_runtime_resume() for successful
|
||||
* runtime resumes. It does everything necessary to restart the queue.
|
||||
*/
|
||||
void blk_set_runtime_active(struct request_queue *q)
|
||||
{
|
||||
if (q->dev) {
|
||||
spin_lock_irq(&q->queue_lock);
|
||||
q->rpm_status = RPM_ACTIVE;
|
||||
pm_runtime_mark_last_busy(q->dev);
|
||||
pm_request_autosuspend(q->dev);
|
||||
spin_unlock_irq(&q->queue_lock);
|
||||
}
|
||||
int old_status;
|
||||
|
||||
if (!q->dev)
|
||||
return;
|
||||
|
||||
spin_lock_irq(&q->queue_lock);
|
||||
old_status = q->rpm_status;
|
||||
q->rpm_status = RPM_ACTIVE;
|
||||
pm_runtime_mark_last_busy(q->dev);
|
||||
pm_request_autosuspend(q->dev);
|
||||
spin_unlock_irq(&q->queue_lock);
|
||||
|
||||
if (old_status != RPM_ACTIVE)
|
||||
blk_clear_pm_only(q);
|
||||
}
|
||||
EXPORT_SYMBOL(blk_set_runtime_active);
|
||||
|
@ -922,6 +922,107 @@ int qcom_scm_ocmem_unlock(enum qcom_scm_ocmem_client id, u32 offset, u32 size)
|
||||
}
|
||||
EXPORT_SYMBOL(qcom_scm_ocmem_unlock);
|
||||
|
||||
/**
|
||||
* qcom_scm_ice_available() - Is the ICE key programming interface available?
|
||||
*
|
||||
* Return: true iff the SCM calls wrapped by qcom_scm_ice_invalidate_key() and
|
||||
* qcom_scm_ice_set_key() are available.
|
||||
*/
|
||||
bool qcom_scm_ice_available(void)
|
||||
{
|
||||
return __qcom_scm_is_call_available(__scm->dev, QCOM_SCM_SVC_ES,
|
||||
QCOM_SCM_ES_INVALIDATE_ICE_KEY) &&
|
||||
__qcom_scm_is_call_available(__scm->dev, QCOM_SCM_SVC_ES,
|
||||
QCOM_SCM_ES_CONFIG_SET_ICE_KEY);
|
||||
}
|
||||
EXPORT_SYMBOL(qcom_scm_ice_available);
|
||||
|
||||
/**
|
||||
* qcom_scm_ice_invalidate_key() - Invalidate an inline encryption key
|
||||
* @index: the keyslot to invalidate
|
||||
*
|
||||
* The UFSHCI standard defines a standard way to do this, but it doesn't work on
|
||||
* these SoCs; only this SCM call does.
|
||||
*
|
||||
* Return: 0 on success; -errno on failure.
|
||||
*/
|
||||
int qcom_scm_ice_invalidate_key(u32 index)
|
||||
{
|
||||
struct qcom_scm_desc desc = {
|
||||
.svc = QCOM_SCM_SVC_ES,
|
||||
.cmd = QCOM_SCM_ES_INVALIDATE_ICE_KEY,
|
||||
.arginfo = QCOM_SCM_ARGS(1),
|
||||
.args[0] = index,
|
||||
.owner = ARM_SMCCC_OWNER_SIP,
|
||||
};
|
||||
|
||||
return qcom_scm_call(__scm->dev, &desc, NULL);
|
||||
}
|
||||
EXPORT_SYMBOL(qcom_scm_ice_invalidate_key);
|
||||
|
||||
/**
|
||||
* qcom_scm_ice_set_key() - Set an inline encryption key
|
||||
* @index: the keyslot into which to set the key
|
||||
* @key: the key to program
|
||||
* @key_size: the size of the key in bytes
|
||||
* @cipher: the encryption algorithm the key is for
|
||||
* @data_unit_size: the encryption data unit size, i.e. the size of each
|
||||
* individual plaintext and ciphertext. Given in 512-byte
|
||||
* units, e.g. 1 = 512 bytes, 8 = 4096 bytes, etc.
|
||||
*
|
||||
* Program a key into a keyslot of Qualcomm ICE (Inline Crypto Engine), where it
|
||||
* can then be used to encrypt/decrypt UFS I/O requests inline.
|
||||
*
|
||||
* The UFSHCI standard defines a standard way to do this, but it doesn't work on
|
||||
* these SoCs; only this SCM call does.
|
||||
*
|
||||
* Return: 0 on success; -errno on failure.
|
||||
*/
|
||||
int qcom_scm_ice_set_key(u32 index, const u8 *key, u32 key_size,
|
||||
enum qcom_scm_ice_cipher cipher, u32 data_unit_size)
|
||||
{
|
||||
struct qcom_scm_desc desc = {
|
||||
.svc = QCOM_SCM_SVC_ES,
|
||||
.cmd = QCOM_SCM_ES_CONFIG_SET_ICE_KEY,
|
||||
.arginfo = QCOM_SCM_ARGS(5, QCOM_SCM_VAL, QCOM_SCM_RW,
|
||||
QCOM_SCM_VAL, QCOM_SCM_VAL,
|
||||
QCOM_SCM_VAL),
|
||||
.args[0] = index,
|
||||
.args[2] = key_size,
|
||||
.args[3] = cipher,
|
||||
.args[4] = data_unit_size,
|
||||
.owner = ARM_SMCCC_OWNER_SIP,
|
||||
};
|
||||
void *keybuf;
|
||||
dma_addr_t key_phys;
|
||||
int ret;
|
||||
|
||||
/*
|
||||
* 'key' may point to vmalloc()'ed memory, but we need to pass a
|
||||
* physical address that's been properly flushed. The sanctioned way to
|
||||
* do this is by using the DMA API. But as is best practice for crypto
|
||||
* keys, we also must wipe the key after use. This makes kmemdup() +
|
||||
* dma_map_single() not clearly correct, since the DMA API can use
|
||||
* bounce buffers. Instead, just use dma_alloc_coherent(). Programming
|
||||
* keys is normally rare and thus not performance-critical.
|
||||
*/
|
||||
|
||||
keybuf = dma_alloc_coherent(__scm->dev, key_size, &key_phys,
|
||||
GFP_KERNEL);
|
||||
if (!keybuf)
|
||||
return -ENOMEM;
|
||||
memcpy(keybuf, key, key_size);
|
||||
desc.args[1] = key_phys;
|
||||
|
||||
ret = qcom_scm_call(__scm->dev, &desc, NULL);
|
||||
|
||||
memzero_explicit(keybuf, key_size);
|
||||
|
||||
dma_free_coherent(__scm->dev, key_size, keybuf, key_phys);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(qcom_scm_ice_set_key);
|
||||
|
||||
/**
|
||||
* qcom_scm_hdcp_available() - Check if secure environment supports HDCP.
|
||||
*
|
||||
|
@ -103,6 +103,10 @@ extern int scm_legacy_call(struct device *dev, const struct qcom_scm_desc *desc,
|
||||
#define QCOM_SCM_OCMEM_LOCK_CMD 0x01
|
||||
#define QCOM_SCM_OCMEM_UNLOCK_CMD 0x02
|
||||
|
||||
#define QCOM_SCM_SVC_ES 0x10 /* Enterprise Security */
|
||||
#define QCOM_SCM_ES_INVALIDATE_ICE_KEY 0x03
|
||||
#define QCOM_SCM_ES_CONFIG_SET_ICE_KEY 0x04
|
||||
|
||||
#define QCOM_SCM_SVC_HDCP 0x11
|
||||
#define QCOM_SCM_HDCP_INVOKE 0x01
|
||||
|
||||
|
@ -124,13 +124,12 @@ static void zfcp_ccw_remove(struct ccw_device *cdev)
|
||||
return;
|
||||
|
||||
write_lock_irq(&adapter->port_list_lock);
|
||||
list_for_each_entry_safe(port, p, &adapter->port_list, list) {
|
||||
list_for_each_entry(port, &adapter->port_list, list) {
|
||||
write_lock(&port->unit_list_lock);
|
||||
list_for_each_entry_safe(unit, u, &port->unit_list, list)
|
||||
list_move(&unit->list, &unit_remove_lh);
|
||||
list_splice_init(&port->unit_list, &unit_remove_lh);
|
||||
write_unlock(&port->unit_list_lock);
|
||||
list_move(&port->list, &port_remove_lh);
|
||||
}
|
||||
list_splice_init(&adapter->port_list, &port_remove_lh);
|
||||
write_unlock_irq(&adapter->port_list_lock);
|
||||
zfcp_ccw_adapter_put(adapter); /* put from zfcp_ccw_adapter_by_cdev */
|
||||
|
||||
|
@ -68,7 +68,7 @@ static void zfcp_erp_action_ready(struct zfcp_erp_action *act)
|
||||
{
|
||||
struct zfcp_adapter *adapter = act->adapter;
|
||||
|
||||
list_move(&act->list, &act->adapter->erp_ready_head);
|
||||
list_move(&act->list, &adapter->erp_ready_head);
|
||||
zfcp_dbf_rec_run("erardy1", act);
|
||||
wake_up(&adapter->erp_ready_wq);
|
||||
zfcp_dbf_rec_run("erardy2", act);
|
||||
|
@ -48,7 +48,7 @@ unsigned int zfcp_fc_port_scan_backoff(void)
|
||||
{
|
||||
if (!port_scan_backoff)
|
||||
return 0;
|
||||
return get_random_int() % port_scan_backoff;
|
||||
return prandom_u32_max(port_scan_backoff);
|
||||
}
|
||||
|
||||
static void zfcp_fc_port_scan_time(struct zfcp_adapter *adapter)
|
||||
|
@ -246,7 +246,7 @@ int zfcp_qdio_sbal_get(struct zfcp_qdio *qdio)
|
||||
}
|
||||
|
||||
/**
|
||||
* zfcp_qdio_send - set PCI flag in first SBALE and send req to QDIO
|
||||
* zfcp_qdio_send - send req to QDIO
|
||||
* @qdio: pointer to struct zfcp_qdio
|
||||
* @q_req: pointer to struct zfcp_qdio_req
|
||||
* Returns: 0 on success, error otherwise
|
||||
@ -260,17 +260,20 @@ int zfcp_qdio_send(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req)
|
||||
zfcp_qdio_account(qdio);
|
||||
spin_unlock(&qdio->stat_lock);
|
||||
|
||||
atomic_sub(sbal_number, &qdio->req_q_free);
|
||||
|
||||
retval = do_QDIO(qdio->adapter->ccw_device, QDIO_FLAG_SYNC_OUTPUT, 0,
|
||||
q_req->sbal_first, sbal_number);
|
||||
|
||||
if (unlikely(retval)) {
|
||||
/* Failed to submit the IO, roll back our modifications. */
|
||||
atomic_add(sbal_number, &qdio->req_q_free);
|
||||
zfcp_qdio_zero_sbals(qdio->req_q, q_req->sbal_first,
|
||||
sbal_number);
|
||||
return retval;
|
||||
}
|
||||
|
||||
/* account for transferred buffers */
|
||||
atomic_sub(sbal_number, &qdio->req_q_free);
|
||||
qdio->req_q_idx += sbal_number;
|
||||
qdio->req_q_idx %= QDIO_MAX_BUFFERS_PER_Q;
|
||||
|
||||
|
@ -1154,6 +1154,7 @@ source "drivers/scsi/qedf/Kconfig"
|
||||
config SCSI_LPFC
|
||||
tristate "Emulex LightPulse Fibre Channel Support"
|
||||
depends on PCI && SCSI
|
||||
depends on CPU_FREQ
|
||||
depends on SCSI_FC_ATTRS
|
||||
depends on NVME_TARGET_FC || NVME_TARGET_FC=n
|
||||
depends on NVME_FC || NVME_FC=n
|
||||
@ -1469,14 +1470,19 @@ config SCSI_SUNESP
|
||||
module will be called sun_esp.
|
||||
|
||||
config ZFCP
|
||||
tristate "FCP host bus adapter driver for IBM eServer zSeries"
|
||||
tristate "FCP host bus adapter driver for IBM mainframes"
|
||||
depends on S390 && QDIO && SCSI
|
||||
depends on SCSI_FC_ATTRS
|
||||
help
|
||||
If you want to access SCSI devices attached to your IBM eServer
|
||||
zSeries by means of Fibre Channel interfaces say Y.
|
||||
For details please refer to the documentation provided by IBM at
|
||||
<http://oss.software.ibm.com/developerworks/opensource/linux390>
|
||||
If you want to access SCSI devices attached to your IBM mainframe by
|
||||
means of Fibre Channel Protocol host bus adapters say Y.
|
||||
|
||||
Supported HBAs include different models of the FICON Express and FCP
|
||||
Express I/O cards.
|
||||
|
||||
For a more complete list, and for more details about setup and
|
||||
operation refer to the IBM publication "Device Drivers, Features, and
|
||||
Commands", SC33-8411.
|
||||
|
||||
This driver is also available as a module. This module will be
|
||||
called zfcp. If you want to compile it as a module, say M here
|
||||
|
@ -350,7 +350,8 @@ static inline int aac_valid_context(struct scsi_cmnd *scsicmd,
|
||||
|
||||
/**
|
||||
* aac_get_config_status - check the adapter configuration
|
||||
* @common: adapter to query
|
||||
* @dev: aac driver data
|
||||
* @commit_flag: force sending CT_COMMIT_CONFIG
|
||||
*
|
||||
* Query config status, and commit the configuration if needed.
|
||||
*/
|
||||
@ -442,7 +443,7 @@ static void aac_expose_phy_device(struct scsi_cmnd *scsicmd)
|
||||
|
||||
/**
|
||||
* aac_get_containers - list containers
|
||||
* @common: adapter to probe
|
||||
* @dev: aac driver data
|
||||
*
|
||||
* Make a list of all containers on this controller
|
||||
*/
|
||||
@ -561,7 +562,7 @@ static void get_container_name_callback(void *context, struct fib * fibptr)
|
||||
scsicmd->scsi_done(scsicmd);
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* aac_get_container_name - get container name, none blocking.
|
||||
*/
|
||||
static int aac_get_container_name(struct scsi_cmnd * scsicmd)
|
||||
@ -786,8 +787,7 @@ static int _aac_probe_container(struct scsi_cmnd * scsicmd, int (*callback)(stru
|
||||
|
||||
/**
|
||||
* aac_probe_container - query a logical volume
|
||||
* @dev: device to query
|
||||
* @cid: container identifier
|
||||
* @scsicmd: the scsi command block
|
||||
*
|
||||
* Queries the controller about the given volume. The volume information
|
||||
* is updated in the struct fsa_dev_info structure rather than returned.
|
||||
@ -1098,7 +1098,7 @@ static void get_container_serial_callback(void *context, struct fib * fibptr)
|
||||
scsicmd->scsi_done(scsicmd);
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* aac_get_container_serial - get container serial, none blocking.
|
||||
*/
|
||||
static int aac_get_container_serial(struct scsi_cmnd * scsicmd)
|
||||
@ -1952,8 +1952,6 @@ free_identify_resp:
|
||||
/**
|
||||
* aac_set_safw_attr_all_targets- update current hba map with data from FW
|
||||
* @dev: aac_dev structure
|
||||
* @phys_luns: FW information from report phys luns
|
||||
* @rescan: Indicates scan type
|
||||
*
|
||||
* Update our hba map with the information gathered from the FW
|
||||
*/
|
||||
@ -3391,15 +3389,12 @@ int aac_dev_ioctl(struct aac_dev *dev, unsigned int cmd, void __user *arg)
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* aac_srb_callback
|
||||
* @context: the context set in the fib - here it is scsi cmd
|
||||
* @fibptr: pointer to the fib
|
||||
*
|
||||
* Handles the completion of a scsi command to a non dasd device
|
||||
*
|
||||
*/
|
||||
|
||||
static void aac_srb_callback(void *context, struct fib * fibptr)
|
||||
{
|
||||
struct aac_srb_reply *srbreply;
|
||||
@ -3684,13 +3679,11 @@ static void hba_resp_task_failure(struct aac_dev *dev,
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* aac_hba_callback
|
||||
* @context: the context set in the fib - here it is scsi cmd
|
||||
* @fibptr: pointer to the fib
|
||||
*
|
||||
* Handles the completion of a native HBA scsi command
|
||||
*
|
||||
*/
|
||||
void aac_hba_callback(void *context, struct fib *fibptr)
|
||||
{
|
||||
@ -3749,14 +3742,12 @@ out:
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* aac_send_srb_fib
|
||||
* @scsicmd: the scsi command block
|
||||
*
|
||||
* This routine will form a FIB and fill in the aac_srb from the
|
||||
* scsicmd passed in.
|
||||
*/
|
||||
|
||||
static int aac_send_srb_fib(struct scsi_cmnd* scsicmd)
|
||||
{
|
||||
struct fib* cmd_fibcontext;
|
||||
@ -3792,7 +3783,6 @@ static int aac_send_srb_fib(struct scsi_cmnd* scsicmd)
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* aac_send_hba_fib
|
||||
* @scsicmd: the scsi command block
|
||||
*
|
||||
|
@ -32,6 +32,8 @@
|
||||
|
||||
#include "aacraid.h"
|
||||
|
||||
# define AAC_DEBUG_PREAMBLE KERN_INFO
|
||||
# define AAC_DEBUG_POSTAMBLE
|
||||
/**
|
||||
* ioctl_send_fib - send a FIB from userspace
|
||||
* @dev: adapter is being processed
|
||||
@ -40,9 +42,6 @@
|
||||
* This routine sends a fib to the adapter on behalf of a user level
|
||||
* program.
|
||||
*/
|
||||
# define AAC_DEBUG_PREAMBLE KERN_INFO
|
||||
# define AAC_DEBUG_POSTAMBLE
|
||||
|
||||
static int ioctl_send_fib(struct aac_dev * dev, void __user *arg)
|
||||
{
|
||||
struct hw_fib * kfib;
|
||||
@ -158,11 +157,12 @@ cleanup:
|
||||
|
||||
/**
|
||||
* open_getadapter_fib - Get the next fib
|
||||
* @dev: adapter is being processed
|
||||
* @arg: arguments to the open call
|
||||
*
|
||||
* This routine will get the next Fib, if available, from the AdapterFibContext
|
||||
* passed in from the user.
|
||||
*/
|
||||
|
||||
static int open_getadapter_fib(struct aac_dev * dev, void __user *arg)
|
||||
{
|
||||
struct aac_fib_context * fibctx;
|
||||
@ -234,7 +234,6 @@ static int open_getadapter_fib(struct aac_dev * dev, void __user *arg)
|
||||
* This routine will get the next Fib, if available, from the AdapterFibContext
|
||||
* passed in from the user.
|
||||
*/
|
||||
|
||||
static int next_getadapter_fib(struct aac_dev * dev, void __user *arg)
|
||||
{
|
||||
struct fib_ioctl f;
|
||||
@ -455,11 +454,10 @@ static int check_revision(struct aac_dev *dev, void __user *arg)
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
* aac_send_raw_scb
|
||||
*
|
||||
* @dev: adapter is being processed
|
||||
* @arg: arguments to the send call
|
||||
*/
|
||||
|
||||
static int aac_send_raw_srb(struct aac_dev* dev, void __user * arg)
|
||||
{
|
||||
struct fib* srbfib;
|
||||
|
@ -214,6 +214,7 @@ int aac_fib_setup(struct aac_dev * dev)
|
||||
/**
|
||||
* aac_fib_alloc_tag-allocate a fib using tags
|
||||
* @dev: Adapter to allocate the fib for
|
||||
* @scmd: SCSI command
|
||||
*
|
||||
* Allocate a fib from the adapter fib pool using tags
|
||||
* from the blk layer.
|
||||
@ -405,8 +406,8 @@ static int aac_get_entry (struct aac_dev * dev, u32 qid, struct aac_entry **entr
|
||||
* aac_queue_get - get the next free QE
|
||||
* @dev: Adapter
|
||||
* @index: Returned index
|
||||
* @priority: Priority of fib
|
||||
* @fib: Fib to associate with the queue entry
|
||||
* @qid: Queue number
|
||||
* @hw_fib: Fib to associate with the queue entry
|
||||
* @wait: Wait if queue full
|
||||
* @fibptr: Driver fib object to go with fib
|
||||
* @nonotify: Don't notify the adapter
|
||||
@ -934,7 +935,7 @@ int aac_fib_adapter_complete(struct fib *fibptr, unsigned short size)
|
||||
|
||||
/**
|
||||
* aac_fib_complete - fib completion handler
|
||||
* @fib: FIB to complete
|
||||
* @fibptr: FIB to complete
|
||||
*
|
||||
* Will do all necessary work to complete a FIB.
|
||||
*/
|
||||
@ -1049,6 +1050,7 @@ static void aac_handle_aif_bu(struct aac_dev *dev, struct aac_aifcmd *aifcmd)
|
||||
}
|
||||
}
|
||||
|
||||
#define AIF_SNIFF_TIMEOUT (500*HZ)
|
||||
/**
|
||||
* aac_handle_aif - Handle a message from the firmware
|
||||
* @dev: Which adapter this fib is from
|
||||
@ -1057,8 +1059,6 @@ static void aac_handle_aif_bu(struct aac_dev *dev, struct aac_aifcmd *aifcmd)
|
||||
* This routine handles a driver notify fib from the adapter and
|
||||
* dispatches it to the appropriate routine for handling.
|
||||
*/
|
||||
|
||||
#define AIF_SNIFF_TIMEOUT (500*HZ)
|
||||
static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr)
|
||||
{
|
||||
struct hw_fib * hw_fib = fibptr->hw_fib_va;
|
||||
@ -2416,7 +2416,7 @@ out:
|
||||
|
||||
/**
|
||||
* aac_command_thread - command processing thread
|
||||
* @dev: Adapter to monitor
|
||||
* @data: Adapter to monitor
|
||||
*
|
||||
* Waits on the commandready event in it's queue. When the event gets set
|
||||
* it will pull FIBs off it's queue. It will continue to pull FIBs off
|
||||
|
@ -99,10 +99,11 @@ unsigned int aac_response_normal(struct aac_queue * q)
|
||||
}
|
||||
if (hwfib->header.XferState & cpu_to_le32(NoResponseExpected | Async))
|
||||
{
|
||||
if (hwfib->header.XferState & cpu_to_le32(NoResponseExpected))
|
||||
if (hwfib->header.XferState & cpu_to_le32(NoResponseExpected)) {
|
||||
FIB_COUNTER_INCREMENT(aac_config.NoResponseRecved);
|
||||
else
|
||||
} else {
|
||||
FIB_COUNTER_INCREMENT(aac_config.AsyncRecved);
|
||||
}
|
||||
/*
|
||||
* NOTE: we cannot touch the fib after this
|
||||
* call, because it may have been deallocated.
|
||||
@ -229,7 +230,6 @@ static void aac_aif_callback(void *context, struct fib * fibptr)
|
||||
struct fib *fibctx;
|
||||
struct aac_dev *dev;
|
||||
struct aac_aifcmd *cmd;
|
||||
int status;
|
||||
|
||||
fibctx = (struct fib *)context;
|
||||
BUG_ON(fibptr == NULL);
|
||||
@ -249,7 +249,7 @@ static void aac_aif_callback(void *context, struct fib * fibptr)
|
||||
cmd = (struct aac_aifcmd *) fib_data(fibctx);
|
||||
cmd->command = cpu_to_le32(AifReqEvent);
|
||||
|
||||
status = aac_fib_send(AifRequest,
|
||||
aac_fib_send(AifRequest,
|
||||
fibctx,
|
||||
sizeof(struct hw_fib)-sizeof(struct aac_fibhdr),
|
||||
FsaNormal,
|
||||
@ -258,7 +258,7 @@ static void aac_aif_callback(void *context, struct fib * fibptr)
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
/*
|
||||
* aac_intr_normal - Handle command replies
|
||||
* @dev: Device
|
||||
* @index: completion reference
|
||||
@ -403,12 +403,13 @@ unsigned int aac_intr_normal(struct aac_dev *dev, u32 index, int isAif,
|
||||
if (hwfib->header.XferState &
|
||||
cpu_to_le32(NoResponseExpected | Async)) {
|
||||
if (hwfib->header.XferState & cpu_to_le32(
|
||||
NoResponseExpected))
|
||||
NoResponseExpected)) {
|
||||
FIB_COUNTER_INCREMENT(
|
||||
aac_config.NoResponseRecved);
|
||||
else
|
||||
} else {
|
||||
FIB_COUNTER_INCREMENT(
|
||||
aac_config.AsyncRecved);
|
||||
}
|
||||
start_callback = 1;
|
||||
} else {
|
||||
unsigned long flagv;
|
||||
|
@ -230,8 +230,8 @@ static struct aac_driver_ident aac_drivers[] = {
|
||||
|
||||
/**
|
||||
* aac_queuecommand - queue a SCSI command
|
||||
* @shost: Scsi host to queue command on
|
||||
* @cmd: SCSI command to queue
|
||||
* @done: Function to call on command completion
|
||||
*
|
||||
* Queues a command for execution by the associated Host Adapter.
|
||||
*
|
||||
@ -363,9 +363,10 @@ static int aac_biosparm(struct scsi_device *sdev, struct block_device *bdev,
|
||||
|
||||
param->cylinders = cap_to_cyls(capacity, param->heads * param->sectors);
|
||||
if (num < 4 && end_sec == param->sectors) {
|
||||
if (param->cylinders != saved_cylinders)
|
||||
if (param->cylinders != saved_cylinders) {
|
||||
dprintk((KERN_DEBUG "Adopting geometry: heads=%d, sectors=%d from partition table %d.\n",
|
||||
param->heads, param->sectors, num));
|
||||
}
|
||||
} else if (end_head > 0 || end_sec > 0) {
|
||||
dprintk((KERN_DEBUG "Strange geometry: heads=%d, sectors=%d in partition table %d.\n",
|
||||
end_head + 1, end_sec, num));
|
||||
@ -1159,7 +1160,6 @@ static int aac_cfg_open(struct inode *inode, struct file *file)
|
||||
|
||||
/**
|
||||
* aac_cfg_ioctl - AAC configuration request
|
||||
* @inode: inode of device
|
||||
* @file: file handle
|
||||
* @cmd: ioctl command code
|
||||
* @arg: argument
|
||||
|
@ -24,6 +24,7 @@
|
||||
|
||||
/**
|
||||
* aac_nark_ioremap
|
||||
* @dev: device to ioremap
|
||||
* @size: mapping resize request
|
||||
*
|
||||
*/
|
||||
|
@ -57,6 +57,7 @@ static int aac_rkt_select_comm(struct aac_dev *dev, int comm)
|
||||
|
||||
/**
|
||||
* aac_rkt_ioremap
|
||||
* @dev: device to ioremap
|
||||
* @size: mapping resize request
|
||||
*
|
||||
*/
|
||||
@ -77,8 +78,8 @@ static int aac_rkt_ioremap(struct aac_dev * dev, u32 size)
|
||||
* aac_rkt_init - initialize an i960 based AAC card
|
||||
* @dev: device to configure
|
||||
*
|
||||
* Allocate and set up resources for the i960 based AAC variants. The
|
||||
* device_interface in the commregion will be allocated and linked
|
||||
* Allocate and set up resources for the i960 based AAC variants. The
|
||||
* device_interface in the commregion will be allocated and linked
|
||||
* to the comm region.
|
||||
*/
|
||||
|
||||
|
@ -144,7 +144,16 @@ static void aac_rx_enable_interrupt_message(struct aac_dev *dev)
|
||||
* @dev: Adapter
|
||||
* @command: Command to execute
|
||||
* @p1: first parameter
|
||||
* @ret: adapter status
|
||||
* @p2: second parameter
|
||||
* @p3: third parameter
|
||||
* @p4: forth parameter
|
||||
* @p5: fifth parameter
|
||||
* @p6: sixth parameter
|
||||
* @status: adapter status
|
||||
* @r1: first return value
|
||||
* @r2: second return value
|
||||
* @r3: third return value
|
||||
* @r4: forth return value
|
||||
*
|
||||
* This routine will send a synchronous command to the adapter and wait
|
||||
* for its completion.
|
||||
@ -443,6 +452,7 @@ static int aac_rx_deliver_message(struct fib * fib)
|
||||
|
||||
/**
|
||||
* aac_rx_ioremap
|
||||
* @dev: adapter
|
||||
* @size: mapping resize request
|
||||
*
|
||||
*/
|
||||
|
@ -135,13 +135,21 @@ static void aac_sa_notify_adapter(struct aac_dev *dev, u32 event)
|
||||
* @dev: Adapter
|
||||
* @command: Command to execute
|
||||
* @p1: first parameter
|
||||
* @p2: second parameter
|
||||
* @p3: third parameter
|
||||
* @p4: forth parameter
|
||||
* @p5: fifth parameter
|
||||
* @p6: sixth parameter
|
||||
* @ret: adapter status
|
||||
* @r1: first return value
|
||||
* @r2: second return value
|
||||
* @r3: third return value
|
||||
* @r4: forth return value
|
||||
*
|
||||
* This routine will send a synchronous command to the adapter and wait
|
||||
* This routine will send a synchronous command to the adapter and wait
|
||||
* for its completion.
|
||||
*/
|
||||
|
||||
static int sa_sync_cmd(struct aac_dev *dev, u32 command,
|
||||
static int sa_sync_cmd(struct aac_dev *dev, u32 command,
|
||||
u32 p1, u32 p2, u32 p3, u32 p4, u32 p5, u32 p6,
|
||||
u32 *ret, u32 *r1, u32 *r2, u32 *r3, u32 *r4)
|
||||
{
|
||||
@ -283,6 +291,7 @@ static int aac_sa_check_health(struct aac_dev *dev)
|
||||
|
||||
/**
|
||||
* aac_sa_ioremap
|
||||
* @dev: device to ioremap
|
||||
* @size: mapping resize request
|
||||
*
|
||||
*/
|
||||
@ -300,8 +309,8 @@ static int aac_sa_ioremap(struct aac_dev * dev, u32 size)
|
||||
* aac_sa_init - initialize an ARM based AAC card
|
||||
* @dev: device to configure
|
||||
*
|
||||
* Allocate and set up resources for the ARM based AAC variants. The
|
||||
* device_interface in the commregion will be allocated and linked
|
||||
* Allocate and set up resources for the ARM based AAC variants. The
|
||||
* device_interface in the commregion will be allocated and linked
|
||||
* to the comm region.
|
||||
*/
|
||||
|
||||
|
@ -191,7 +191,16 @@ static void aac_src_enable_interrupt_message(struct aac_dev *dev)
|
||||
* @dev: Adapter
|
||||
* @command: Command to execute
|
||||
* @p1: first parameter
|
||||
* @ret: adapter status
|
||||
* @p2: second parameter
|
||||
* @p3: third parameter
|
||||
* @p4: forth parameter
|
||||
* @p5: fifth parameter
|
||||
* @p6: sixth parameter
|
||||
* @status: adapter status
|
||||
* @r1: first return value
|
||||
* @r2: second return valu
|
||||
* @r3: third return value
|
||||
* @r4: forth return value
|
||||
*
|
||||
* This routine will send a synchronous command to the adapter and wait
|
||||
* for its completion.
|
||||
@ -602,6 +611,7 @@ static int aac_src_deliver_message(struct fib *fib)
|
||||
|
||||
/**
|
||||
* aac_src_ioremap
|
||||
* @dev: device ioremap
|
||||
* @size: mapping resize request
|
||||
*
|
||||
*/
|
||||
@ -632,6 +642,7 @@ static int aac_src_ioremap(struct aac_dev *dev, u32 size)
|
||||
|
||||
/**
|
||||
* aac_srcv_ioremap
|
||||
* @dev: device ioremap
|
||||
* @size: mapping resize request
|
||||
*
|
||||
*/
|
||||
|
@ -2030,8 +2030,7 @@ static void datai_run(struct Scsi_Host *shpnt)
|
||||
fifodata, GETPORT(FIFOSTAT));
|
||||
SETPORT(DMACNTRL0, ENDMA|_8BIT);
|
||||
while(fifodata>0) {
|
||||
int data;
|
||||
data=GETPORT(DATAPORT);
|
||||
GETPORT(DATAPORT);
|
||||
fifodata--;
|
||||
DATA_LEN++;
|
||||
}
|
||||
|
@ -1735,10 +1735,8 @@ ahd_dump_sglist(struct scb *scb)
|
||||
sg_list = (struct ahd_dma64_seg*)scb->sg_list;
|
||||
for (i = 0; i < scb->sg_count; i++) {
|
||||
uint64_t addr;
|
||||
uint32_t len;
|
||||
|
||||
addr = ahd_le64toh(sg_list[i].addr);
|
||||
len = ahd_le32toh(sg_list[i].len);
|
||||
printk("sg[%d] - Addr 0x%x%x : Length %d%s\n",
|
||||
i,
|
||||
(uint32_t)((addr >> 32) & 0xFFFFFFFF),
|
||||
@ -1906,9 +1904,6 @@ ahd_handle_seqint(struct ahd_softc *ahd, u_int intstat)
|
||||
{
|
||||
struct ahd_devinfo devinfo;
|
||||
struct scb *scb;
|
||||
struct ahd_initiator_tinfo *targ_info;
|
||||
struct ahd_tmode_tstate *tstate;
|
||||
struct ahd_transinfo *tinfo;
|
||||
u_int scbid;
|
||||
|
||||
/*
|
||||
@ -1936,12 +1931,6 @@ ahd_handle_seqint(struct ahd_softc *ahd, u_int intstat)
|
||||
SCB_GET_LUN(scb),
|
||||
SCB_GET_CHANNEL(ahd, scb),
|
||||
ROLE_INITIATOR);
|
||||
targ_info = ahd_fetch_transinfo(ahd,
|
||||
devinfo.channel,
|
||||
devinfo.our_scsiid,
|
||||
devinfo.target,
|
||||
&tstate);
|
||||
tinfo = &targ_info->curr;
|
||||
ahd_set_width(ahd, &devinfo, MSG_EXT_WDTR_BUS_8_BIT,
|
||||
AHD_TRANS_ACTIVE, /*paused*/TRUE);
|
||||
ahd_set_syncrate(ahd, &devinfo, /*period*/0,
|
||||
@ -2669,7 +2658,6 @@ ahd_handle_transmission_error(struct ahd_softc *ahd)
|
||||
struct scb *scb;
|
||||
u_int scbid;
|
||||
u_int lqistat1;
|
||||
u_int lqistat2;
|
||||
u_int msg_out;
|
||||
u_int curphase;
|
||||
u_int lastphase;
|
||||
@ -2680,7 +2668,7 @@ ahd_handle_transmission_error(struct ahd_softc *ahd)
|
||||
scb = NULL;
|
||||
ahd_set_modes(ahd, AHD_MODE_SCSI, AHD_MODE_SCSI);
|
||||
lqistat1 = ahd_inb(ahd, LQISTAT1) & ~(LQIPHASE_LQ|LQIPHASE_NLQ);
|
||||
lqistat2 = ahd_inb(ahd, LQISTAT2);
|
||||
ahd_inb(ahd, LQISTAT2);
|
||||
if ((lqistat1 & (LQICRCI_NLQ|LQICRCI_LQ)) == 0
|
||||
&& (ahd->bugs & AHD_NLQICRC_DELAYED_BUG) != 0) {
|
||||
u_int lqistate;
|
||||
@ -4218,13 +4206,11 @@ ahd_update_pending_scbs(struct ahd_softc *ahd)
|
||||
pending_scb_count = 0;
|
||||
LIST_FOREACH(pending_scb, &ahd->pending_scbs, pending_links) {
|
||||
struct ahd_devinfo devinfo;
|
||||
struct ahd_initiator_tinfo *tinfo;
|
||||
struct ahd_tmode_tstate *tstate;
|
||||
|
||||
ahd_scb_devinfo(ahd, &devinfo, pending_scb);
|
||||
tinfo = ahd_fetch_transinfo(ahd, devinfo.channel,
|
||||
devinfo.our_scsiid,
|
||||
devinfo.target, &tstate);
|
||||
ahd_fetch_transinfo(ahd, devinfo.channel, devinfo.our_scsiid,
|
||||
devinfo.target, &tstate);
|
||||
if ((tstate->auto_negotiate & devinfo.target_mask) == 0
|
||||
&& (pending_scb->flags & SCB_AUTO_NEGOTIATE) != 0) {
|
||||
pending_scb->flags &= ~SCB_AUTO_NEGOTIATE;
|
||||
|
@ -700,9 +700,6 @@ ahd_linux_slave_alloc(struct scsi_device *sdev)
|
||||
static int
|
||||
ahd_linux_slave_configure(struct scsi_device *sdev)
|
||||
{
|
||||
struct ahd_softc *ahd;
|
||||
|
||||
ahd = *((struct ahd_softc **)sdev->host->hostdata);
|
||||
if (bootverbose)
|
||||
sdev_printk(KERN_INFO, sdev, "Slave Configure\n");
|
||||
|
||||
@ -778,16 +775,13 @@ ahd_linux_dev_reset(struct scsi_cmnd *cmd)
|
||||
struct scb *reset_scb;
|
||||
u_int cdb_byte;
|
||||
int retval = SUCCESS;
|
||||
int paused;
|
||||
int wait;
|
||||
struct ahd_initiator_tinfo *tinfo;
|
||||
struct ahd_tmode_tstate *tstate;
|
||||
unsigned long flags;
|
||||
DECLARE_COMPLETION_ONSTACK(done);
|
||||
|
||||
reset_scb = NULL;
|
||||
paused = FALSE;
|
||||
wait = FALSE;
|
||||
|
||||
ahd = *(struct ahd_softc **)cmd->device->host->hostdata;
|
||||
|
||||
scmd_printk(KERN_INFO, cmd,
|
||||
@ -1793,10 +1787,12 @@ ahd_done(struct ahd_softc *ahd, struct scb *scb)
|
||||
*/
|
||||
cmd->sense_buffer[0] = 0;
|
||||
if (ahd_get_transaction_status(scb) == CAM_REQ_INPROG) {
|
||||
#ifdef AHD_REPORT_UNDERFLOWS
|
||||
uint32_t amount_xferred;
|
||||
|
||||
amount_xferred =
|
||||
ahd_get_transfer_length(scb) - ahd_get_residual(scb);
|
||||
#endif
|
||||
if ((scb->flags & SCB_TRANSMISSION_ERROR) != 0) {
|
||||
#ifdef AHD_DEBUG
|
||||
if ((ahd_debug & AHD_SHOW_MISC) != 0) {
|
||||
@ -2147,7 +2143,7 @@ ahd_linux_queue_abort_cmd(struct scsi_cmnd *cmd)
|
||||
u_int last_phase;
|
||||
u_int saved_scsiid;
|
||||
u_int cdb_byte;
|
||||
int retval;
|
||||
int retval = SUCCESS;
|
||||
int was_paused;
|
||||
int paused;
|
||||
int wait;
|
||||
@ -2185,8 +2181,7 @@ ahd_linux_queue_abort_cmd(struct scsi_cmnd *cmd)
|
||||
* so we must not still own the command.
|
||||
*/
|
||||
scmd_printk(KERN_INFO, cmd, "Is not an active device\n");
|
||||
retval = SUCCESS;
|
||||
goto no_cmd;
|
||||
goto done;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -2199,7 +2194,7 @@ ahd_linux_queue_abort_cmd(struct scsi_cmnd *cmd)
|
||||
|
||||
if (pending_scb == NULL) {
|
||||
scmd_printk(KERN_INFO, cmd, "Command not found\n");
|
||||
goto no_cmd;
|
||||
goto done;
|
||||
}
|
||||
|
||||
if ((pending_scb->flags & SCB_RECOVERY_SCB) != 0) {
|
||||
@ -2207,7 +2202,7 @@ ahd_linux_queue_abort_cmd(struct scsi_cmnd *cmd)
|
||||
* We can't queue two recovery actions using the same SCB
|
||||
*/
|
||||
retval = FAILED;
|
||||
goto done;
|
||||
goto done;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -2222,7 +2217,7 @@ ahd_linux_queue_abort_cmd(struct scsi_cmnd *cmd)
|
||||
|
||||
if ((pending_scb->flags & SCB_ACTIVE) == 0) {
|
||||
scmd_printk(KERN_INFO, cmd, "Command already completed\n");
|
||||
goto no_cmd;
|
||||
goto done;
|
||||
}
|
||||
|
||||
printk("%s: At time of recovery, card was %spaused\n",
|
||||
@ -2239,7 +2234,6 @@ ahd_linux_queue_abort_cmd(struct scsi_cmnd *cmd)
|
||||
printk("%s:%d:%d:%d: Cmd aborted from QINFIFO\n",
|
||||
ahd_name(ahd), cmd->device->channel,
|
||||
cmd->device->id, (u8)cmd->device->lun);
|
||||
retval = SUCCESS;
|
||||
goto done;
|
||||
}
|
||||
|
||||
@ -2336,17 +2330,10 @@ ahd_linux_queue_abort_cmd(struct scsi_cmnd *cmd)
|
||||
} else {
|
||||
scmd_printk(KERN_INFO, cmd, "Unable to deliver message\n");
|
||||
retval = FAILED;
|
||||
goto done;
|
||||
}
|
||||
|
||||
no_cmd:
|
||||
/*
|
||||
* Our assumption is that if we don't have the command, no
|
||||
* recovery action was required, so we return success. Again,
|
||||
* the semantics of the mid-layer recovery engine are not
|
||||
* well defined, so this may change in time.
|
||||
*/
|
||||
retval = SUCCESS;
|
||||
|
||||
ahd_restore_modes(ahd, saved_modes);
|
||||
done:
|
||||
if (paused)
|
||||
ahd_unpause(ahd);
|
||||
|
@ -564,8 +564,6 @@ ahc_linux_target_alloc(struct scsi_target *starget)
|
||||
struct scsi_target **ahc_targp = ahc_linux_target_in_softc(starget);
|
||||
unsigned short scsirate;
|
||||
struct ahc_devinfo devinfo;
|
||||
struct ahc_initiator_tinfo *tinfo;
|
||||
struct ahc_tmode_tstate *tstate;
|
||||
char channel = starget->channel + 'A';
|
||||
unsigned int our_id = ahc->our_id;
|
||||
unsigned int target_offset;
|
||||
@ -612,9 +610,6 @@ ahc_linux_target_alloc(struct scsi_target *starget)
|
||||
spi_max_offset(starget) = 0;
|
||||
spi_min_period(starget) =
|
||||
ahc_find_period(ahc, scsirate, maxsync);
|
||||
|
||||
tinfo = ahc_fetch_transinfo(ahc, channel, ahc->our_id,
|
||||
starget->id, &tstate);
|
||||
}
|
||||
ahc_compile_devinfo(&devinfo, our_id, starget->id,
|
||||
CAM_LUN_WILDCARD, channel,
|
||||
@ -671,10 +666,6 @@ ahc_linux_slave_alloc(struct scsi_device *sdev)
|
||||
static int
|
||||
ahc_linux_slave_configure(struct scsi_device *sdev)
|
||||
{
|
||||
struct ahc_softc *ahc;
|
||||
|
||||
ahc = *((struct ahc_softc **)sdev->host->hostdata);
|
||||
|
||||
if (bootverbose)
|
||||
sdev_printk(KERN_INFO, sdev, "Slave Configure\n");
|
||||
|
||||
@ -1601,7 +1592,6 @@ ahc_send_async(struct ahc_softc *ahc, char channel,
|
||||
case AC_TRANSFER_NEG:
|
||||
{
|
||||
struct scsi_target *starget;
|
||||
struct ahc_linux_target *targ;
|
||||
struct ahc_initiator_tinfo *tinfo;
|
||||
struct ahc_tmode_tstate *tstate;
|
||||
int target_offset;
|
||||
@ -1635,7 +1625,6 @@ ahc_send_async(struct ahc_softc *ahc, char channel,
|
||||
starget = ahc->platform_data->starget[target_offset];
|
||||
if (starget == NULL)
|
||||
break;
|
||||
targ = scsi_transport_target_data(starget);
|
||||
|
||||
target_ppr_options =
|
||||
(spi_dt(starget) ? MSG_EXT_PPR_DT_REQ : 0)
|
||||
@ -1722,10 +1711,12 @@ ahc_done(struct ahc_softc *ahc, struct scb *scb)
|
||||
*/
|
||||
cmd->sense_buffer[0] = 0;
|
||||
if (ahc_get_transaction_status(scb) == CAM_REQ_INPROG) {
|
||||
#ifdef AHC_REPORT_UNDERFLOWS
|
||||
uint32_t amount_xferred;
|
||||
|
||||
amount_xferred =
|
||||
ahc_get_transfer_length(scb) - ahc_get_residual(scb);
|
||||
#endif
|
||||
if ((scb->flags & SCB_TRANSMISSION_ERROR) != 0) {
|
||||
#ifdef AHC_DEBUG
|
||||
if ((ahc_debug & AHC_SHOW_MISC) != 0) {
|
||||
|
@ -236,7 +236,7 @@ static int asd_init_sata_pm_table_ddb(struct domain_device *dev)
|
||||
|
||||
/**
|
||||
* asd_init_sata_pm_port_ddb -- SATA Port Multiplier Port
|
||||
* dev: pointer to domain device
|
||||
* @dev: pointer to domain device
|
||||
*
|
||||
* For SATA Port Multiplier Ports we need to allocate one SATA Port
|
||||
* Multiplier Port DDB and depending on whether the target on it
|
||||
@ -281,7 +281,7 @@ static int asd_init_initiator_ddb(struct domain_device *dev)
|
||||
|
||||
/**
|
||||
* asd_init_sata_pm_ddb -- SATA Port Multiplier
|
||||
* dev: pointer to domain device
|
||||
* @dev: pointer to domain device
|
||||
*
|
||||
* For STP and direct-attached SATA Port Multipliers we need
|
||||
* one target port DDB entry and one SATA PM table DDB entry.
|
||||
|
@ -575,7 +575,7 @@ static int asd_extend_cmdctx(struct asd_ha_struct *asd_ha)
|
||||
|
||||
/**
|
||||
* asd_init_ctxmem -- initialize context memory
|
||||
* asd_ha: pointer to host adapter structure
|
||||
* @asd_ha: pointer to host adapter structure
|
||||
*
|
||||
* This function sets the maximum number of SCBs and
|
||||
* DDBs which can be used by the sequencer. This is normally
|
||||
@ -1146,7 +1146,6 @@ static void asd_swap_head_scb(struct asd_ha_struct *asd_ha,
|
||||
/**
|
||||
* asd_start_timers -- (add and) start timers of SCBs
|
||||
* @list: pointer to struct list_head of the scbs
|
||||
* @to: timeout in jiffies
|
||||
*
|
||||
* If an SCB in the @list has no timer function, assign the default
|
||||
* one, then start the timer of the SCB. This function is
|
||||
|
@ -530,7 +530,7 @@ static int asd_create_ha_caches(struct asd_ha_struct *asd_ha)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* asd_free_edbs -- free empty data buffers
|
||||
* asd_ha: pointer to host adapter structure
|
||||
*/
|
||||
|
@ -123,8 +123,8 @@ static unsigned ord_phy(struct asd_ha_struct *asd_ha, struct asd_phy *phy)
|
||||
|
||||
/**
|
||||
* asd_get_attached_sas_addr -- extract/generate attached SAS address
|
||||
* phy: pointer to asd_phy
|
||||
* sas_addr: pointer to buffer where the SAS address is to be written
|
||||
* @phy: pointer to asd_phy
|
||||
* @sas_addr: pointer to buffer where the SAS address is to be written
|
||||
*
|
||||
* This function extracts the SAS address from an IDENTIFY frame
|
||||
* received. If OOB is SATA, then a SAS address is generated from the
|
||||
@ -847,7 +847,7 @@ void asd_build_initiate_link_adm_task(struct asd_ascb *ascb, int phy_id,
|
||||
|
||||
/**
|
||||
* asd_ascb_timedout -- called when a pending SCB's timer has expired
|
||||
* @data: unsigned long, a pointer to the ascb in question
|
||||
* @t: Timer context used to fetch the SCB
|
||||
*
|
||||
* This is the default timeout function which does the most necessary.
|
||||
* Upper layers can implement their own timeout function, say to free
|
||||
|
@ -582,6 +582,7 @@ static void asd_init_cseq_scratch(struct asd_ha_struct *asd_ha)
|
||||
/**
|
||||
* asd_init_lseq_mip -- initialize LSEQ Mode independent pages 0-3
|
||||
* @asd_ha: pointer to host adapter structure
|
||||
* @lseq: link sequencer
|
||||
*/
|
||||
static void asd_init_lseq_mip(struct asd_ha_struct *asd_ha, u8 lseq)
|
||||
{
|
||||
@ -669,6 +670,7 @@ static void asd_init_lseq_mip(struct asd_ha_struct *asd_ha, u8 lseq)
|
||||
/**
|
||||
* asd_init_lseq_mdp -- initialize LSEQ mode dependent pages.
|
||||
* @asd_ha: pointer to host adapter structure
|
||||
* @lseq: link sequencer
|
||||
*/
|
||||
static void asd_init_lseq_mdp(struct asd_ha_struct *asd_ha, int lseq)
|
||||
{
|
||||
@ -953,6 +955,7 @@ static void asd_init_cseq_cio(struct asd_ha_struct *asd_ha)
|
||||
/**
|
||||
* asd_init_lseq_cio -- initialize LmSEQ CIO registers
|
||||
* @asd_ha: pointer to host adapter structure
|
||||
* @lseq: link sequencer
|
||||
*/
|
||||
static void asd_init_lseq_cio(struct asd_ha_struct *asd_ha, int lseq)
|
||||
{
|
||||
@ -1345,7 +1348,8 @@ int asd_start_seqs(struct asd_ha_struct *asd_ha)
|
||||
|
||||
/**
|
||||
* asd_update_port_links -- update port_map_by_links and phy_is_up
|
||||
* @sas_phy: pointer to the phy which has been added to a port
|
||||
* @asd_ha: pointer to host adapter structure
|
||||
* @phy: pointer to the phy which has been added to a port
|
||||
*
|
||||
* 1) When a link reset has completed and we got BYTES DMAED with a
|
||||
* valid frame we call this function for that phy, to indicate that
|
||||
|
@ -673,7 +673,7 @@ int asd_lu_reset(struct domain_device *dev, u8 *lun)
|
||||
|
||||
/**
|
||||
* asd_query_task -- send a QUERY TASK TMF to an I_T_L_Q nexus
|
||||
* task: pointer to sas_task struct of interest
|
||||
* @task: pointer to sas_task struct of interest
|
||||
*
|
||||
* Returns: TMF_RESP_FUNC_COMPLETE if the task is not in the task set,
|
||||
* or TMF_RESP_FUNC_SUCC if the task is in the task set.
|
||||
|
@ -283,11 +283,10 @@ static bool arcmsr_remap_pciregion(struct AdapterControlBlock *acb)
|
||||
}
|
||||
case ACB_ADAPTER_TYPE_D: {
|
||||
void __iomem *mem_base0;
|
||||
unsigned long addr, range, flags;
|
||||
unsigned long addr, range;
|
||||
|
||||
addr = (unsigned long)pci_resource_start(pdev, 0);
|
||||
range = pci_resource_len(pdev, 0);
|
||||
flags = pci_resource_flags(pdev, 0);
|
||||
mem_base0 = ioremap(addr, range);
|
||||
if (!mem_base0) {
|
||||
pr_notice("arcmsr%d: memory mapping region fail\n",
|
||||
@ -1067,12 +1066,11 @@ static void arcmsr_free_irq(struct pci_dev *pdev,
|
||||
|
||||
static int arcmsr_suspend(struct pci_dev *pdev, pm_message_t state)
|
||||
{
|
||||
uint32_t intmask_org;
|
||||
struct Scsi_Host *host = pci_get_drvdata(pdev);
|
||||
struct AdapterControlBlock *acb =
|
||||
(struct AdapterControlBlock *)host->hostdata;
|
||||
|
||||
intmask_org = arcmsr_disable_outbound_ints(acb);
|
||||
arcmsr_disable_outbound_ints(acb);
|
||||
arcmsr_free_irq(pdev, acb);
|
||||
del_timer_sync(&acb->eternal_timer);
|
||||
if (set_date_time)
|
||||
@ -1407,7 +1405,7 @@ static void arcmsr_done4abort_postqueue(struct AdapterControlBlock *acb)
|
||||
struct ARCMSR_CDB *pARCMSR_CDB;
|
||||
bool error;
|
||||
struct CommandControlBlock *pCCB;
|
||||
unsigned long ccb_cdb_phy, cdb_phy_hipart;
|
||||
unsigned long ccb_cdb_phy;
|
||||
|
||||
switch (acb->adapter_type) {
|
||||
|
||||
@ -1489,8 +1487,6 @@ static void arcmsr_done4abort_postqueue(struct AdapterControlBlock *acb)
|
||||
((toggle ^ 0x4000) + 1);
|
||||
doneq_index = pmu->doneq_index;
|
||||
spin_unlock_irqrestore(&acb->doneq_lock, flags);
|
||||
cdb_phy_hipart = pmu->done_qbuffer[doneq_index &
|
||||
0xFFF].addressHigh;
|
||||
addressLow = pmu->done_qbuffer[doneq_index &
|
||||
0xFFF].addressLow;
|
||||
ccb_cdb_phy = (addressLow & 0xFFFFFFF0);
|
||||
@ -2445,7 +2441,7 @@ static void arcmsr_hbaD_postqueue_isr(struct AdapterControlBlock *acb)
|
||||
struct MessageUnit_D *pmu;
|
||||
struct ARCMSR_CDB *arcmsr_cdb;
|
||||
struct CommandControlBlock *ccb;
|
||||
unsigned long flags, ccb_cdb_phy, cdb_phy_hipart;
|
||||
unsigned long flags, ccb_cdb_phy;
|
||||
|
||||
spin_lock_irqsave(&acb->doneq_lock, flags);
|
||||
pmu = acb->pmuD;
|
||||
@ -2459,8 +2455,6 @@ static void arcmsr_hbaD_postqueue_isr(struct AdapterControlBlock *acb)
|
||||
pmu->doneq_index = index_stripped ? (index_stripped | toggle) :
|
||||
((toggle ^ 0x4000) + 1);
|
||||
doneq_index = pmu->doneq_index;
|
||||
cdb_phy_hipart = pmu->done_qbuffer[doneq_index &
|
||||
0xFFF].addressHigh;
|
||||
addressLow = pmu->done_qbuffer[doneq_index &
|
||||
0xFFF].addressLow;
|
||||
ccb_cdb_phy = (addressLow & 0xFFFFFFF0);
|
||||
@ -3495,7 +3489,7 @@ static int arcmsr_hbaD_polling_ccbdone(struct AdapterControlBlock *acb,
|
||||
bool error;
|
||||
uint32_t poll_ccb_done = 0, poll_count = 0, flag_ccb;
|
||||
int rtn, doneq_index, index_stripped, outbound_write_pointer, toggle;
|
||||
unsigned long flags, ccb_cdb_phy, cdb_phy_hipart;
|
||||
unsigned long flags, ccb_cdb_phy;
|
||||
struct ARCMSR_CDB *arcmsr_cdb;
|
||||
struct CommandControlBlock *pCCB;
|
||||
struct MessageUnit_D *pmu = acb->pmuD;
|
||||
@ -3527,8 +3521,6 @@ polling_hbaD_ccb_retry:
|
||||
((toggle ^ 0x4000) + 1);
|
||||
doneq_index = pmu->doneq_index;
|
||||
spin_unlock_irqrestore(&acb->doneq_lock, flags);
|
||||
cdb_phy_hipart = pmu->done_qbuffer[doneq_index &
|
||||
0xFFF].addressHigh;
|
||||
flag_ccb = pmu->done_qbuffer[doneq_index & 0xFFF].addressLow;
|
||||
ccb_cdb_phy = (flag_ccb & 0xFFFFFFF0);
|
||||
if (acb->cdb_phyadd_hipart)
|
||||
|
@ -450,7 +450,7 @@ static int cumanascsi2_probe(struct expansion_card *ec,
|
||||
|
||||
if (info->info.scsi.dma != NO_DMA)
|
||||
free_dma(info->info.scsi.dma);
|
||||
free_irq(ec->irq, host);
|
||||
free_irq(ec->irq, info);
|
||||
|
||||
out_release:
|
||||
fas216_release(host);
|
||||
|
@ -571,7 +571,7 @@ static int eesoxscsi_probe(struct expansion_card *ec, const struct ecard_id *id)
|
||||
|
||||
if (info->info.scsi.dma != NO_DMA)
|
||||
free_dma(info->info.scsi.dma);
|
||||
free_irq(ec->irq, host);
|
||||
free_irq(ec->irq, info);
|
||||
|
||||
out_remove:
|
||||
fas216_remove(host);
|
||||
|
@ -378,7 +378,7 @@ static int powertecscsi_probe(struct expansion_card *ec,
|
||||
|
||||
if (info->info.scsi.dma != NO_DMA)
|
||||
free_dma(info->info.scsi.dma);
|
||||
free_irq(ec->irq, host);
|
||||
free_irq(ec->irq, info);
|
||||
|
||||
out_release:
|
||||
fas216_release(host);
|
||||
|
@ -27,6 +27,7 @@ extern struct iscsi_transport beiscsi_iscsi_transport;
|
||||
|
||||
/**
|
||||
* beiscsi_session_create - creates a new iscsi session
|
||||
* @ep: pointer to iscsi ep
|
||||
* @cmds_max: max commands supported
|
||||
* @qdepth: max queue depth supported
|
||||
* @initial_cmdsn: initial iscsi CMDSN
|
||||
@ -164,6 +165,7 @@ beiscsi_conn_create(struct iscsi_cls_session *cls_session, u32 cid)
|
||||
* @cls_session: pointer to iscsi cls session
|
||||
* @cls_conn: pointer to iscsi cls conn
|
||||
* @transport_fd: EP handle(64 bit)
|
||||
* @is_leading: indicate if this is the session leading connection (MCS)
|
||||
*
|
||||
* This function binds the TCP Conn with iSCSI Connection and Session.
|
||||
*/
|
||||
@ -992,7 +994,7 @@ static void beiscsi_put_cid(struct beiscsi_hba *phba, unsigned short cid)
|
||||
|
||||
/**
|
||||
* beiscsi_free_ep - free endpoint
|
||||
* @ep: pointer to iscsi endpoint structure
|
||||
* @beiscsi_ep: pointer to device endpoint struct
|
||||
*/
|
||||
static void beiscsi_free_ep(struct beiscsi_endpoint *beiscsi_ep)
|
||||
{
|
||||
@ -1027,9 +1029,10 @@ static void beiscsi_free_ep(struct beiscsi_endpoint *beiscsi_ep)
|
||||
|
||||
/**
|
||||
* beiscsi_open_conn - Ask FW to open a TCP connection
|
||||
* @ep: endpoint to be used
|
||||
* @ep: pointer to device endpoint struct
|
||||
* @src_addr: The source IP address
|
||||
* @dst_addr: The Destination IP address
|
||||
* @non_blocking: blocking or non-blocking call
|
||||
*
|
||||
* Asks the FW to open a TCP connection
|
||||
*/
|
||||
@ -1123,7 +1126,7 @@ static int beiscsi_open_conn(struct iscsi_endpoint *ep,
|
||||
|
||||
/**
|
||||
* beiscsi_ep_connect - Ask chip to create TCP Conn
|
||||
* @scsi_host: Pointer to scsi_host structure
|
||||
* @shost: Pointer to scsi_host structure
|
||||
* @dst_addr: The IP address of Target
|
||||
* @non_blocking: blocking or non-blocking call
|
||||
*
|
||||
@ -1228,7 +1231,7 @@ static void beiscsi_flush_cq(struct beiscsi_hba *phba)
|
||||
|
||||
/**
|
||||
* beiscsi_conn_close - Invalidate and upload connection
|
||||
* @ep: The iscsi endpoint
|
||||
* @beiscsi_ep: pointer to device endpoint struct
|
||||
*
|
||||
* Returns 0 on success, -1 on failure.
|
||||
*/
|
||||
|
@ -977,7 +977,7 @@ beiscsi_get_wrb_handle(struct hwi_wrb_context *pwrb_context,
|
||||
* alloc_wrb_handle - To allocate a wrb handle
|
||||
* @phba: The hba pointer
|
||||
* @cid: The cid to use for allocation
|
||||
* @pwrb_context: ptr to ptr to wrb context
|
||||
* @pcontext: ptr to ptr to wrb context
|
||||
*
|
||||
* This happens under session_lock until submission to chip
|
||||
*/
|
||||
@ -1394,7 +1394,7 @@ static void hwi_complete_cmd(struct beiscsi_conn *beiscsi_conn,
|
||||
spin_unlock_bh(&session->back_lock);
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* ASYNC PDUs include
|
||||
* a. Unsolicited NOP-In (target initiated NOP-In)
|
||||
* b. ASYNC Messages
|
||||
|
@ -97,6 +97,7 @@ unsigned int mgmt_vendor_specific_fw_cmd(struct be_ctrl_info *ctrl,
|
||||
|
||||
/**
|
||||
* mgmt_open_connection()- Establish a TCP CXN
|
||||
* @phba: driver priv structure
|
||||
* @dst_addr: Destination Address
|
||||
* @beiscsi_ep: ptr to device endpoint struct
|
||||
* @nonemb_cmd: ptr to memory allocated for command
|
||||
@ -209,7 +210,7 @@ int mgmt_open_connection(struct beiscsi_hba *phba,
|
||||
return tag;
|
||||
}
|
||||
|
||||
/*
|
||||
/**
|
||||
* beiscsi_exec_nemb_cmd()- execute non-embedded MBX cmd
|
||||
* @phba: driver priv structure
|
||||
* @nonemb_cmd: DMA address of the MBX command to be issued
|
||||
|
@ -1237,7 +1237,7 @@ bfa_iocfc_disable_cb(void *bfa_arg, bfa_boolean_t compl)
|
||||
complete(&bfad->disable_comp);
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* configure queue registers from firmware response
|
||||
*/
|
||||
static void
|
||||
|
@ -2335,9 +2335,7 @@ bfa_fcpim_lunmask_delete(struct bfa_s *bfa, u16 vf_id, wwn_t *pwwn,
|
||||
wwn_t rpwwn, struct scsi_lun lun)
|
||||
{
|
||||
struct bfa_lun_mask_s *lunm_list;
|
||||
struct bfa_rport_s *rp = NULL;
|
||||
struct bfa_fcs_lport_s *port = NULL;
|
||||
struct bfa_fcs_rport_s *rp_fcs;
|
||||
int i;
|
||||
|
||||
/* in min cfg lunm_list could be NULL but no commands should run. */
|
||||
@ -2353,12 +2351,8 @@ bfa_fcpim_lunmask_delete(struct bfa_s *bfa, u16 vf_id, wwn_t *pwwn,
|
||||
port = bfa_fcs_lookup_port(
|
||||
&((struct bfad_s *)bfa->bfad)->bfa_fcs,
|
||||
vf_id, *pwwn);
|
||||
if (port) {
|
||||
if (port)
|
||||
*pwwn = port->port_cfg.pwwn;
|
||||
rp_fcs = bfa_fcs_lport_get_rport_by_pwwn(port, rpwwn);
|
||||
if (rp_fcs)
|
||||
rp = rp_fcs->bfa_rport;
|
||||
}
|
||||
}
|
||||
|
||||
lunm_list = bfa_get_lun_mask_list(bfa);
|
||||
@ -3818,7 +3812,7 @@ bfa_iotag_attach(struct bfa_fcp_mod_s *fcp)
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
/*
|
||||
* To send config req, first try to use throttle value from flash
|
||||
* If 0, then use driver parameter
|
||||
* We need to use min(flash_val, drv_val) because
|
||||
|
@ -2240,15 +2240,12 @@ bfa_fcs_rport_process_adisc(struct bfa_fcs_rport_s *rport,
|
||||
struct bfa_fcxp_s *fcxp;
|
||||
struct fchs_s fchs;
|
||||
struct bfa_fcs_lport_s *port = rport->port;
|
||||
struct fc_adisc_s *adisc;
|
||||
|
||||
bfa_trc(port->fcs, rx_fchs->s_id);
|
||||
bfa_trc(port->fcs, rx_fchs->d_id);
|
||||
|
||||
rport->stats.adisc_rcvd++;
|
||||
|
||||
adisc = (struct fc_adisc_s *) (rx_fchs + 1);
|
||||
|
||||
/*
|
||||
* Accept if the itnim for this rport is online.
|
||||
* Else reject the ADISC.
|
||||
|
@ -701,7 +701,7 @@ static void
|
||||
bfa_iocpf_sm_fwcheck_entry(struct bfa_iocpf_s *iocpf)
|
||||
{
|
||||
struct bfi_ioc_image_hdr_s fwhdr;
|
||||
u32 r32, fwstate, pgnum, pgoff, loff = 0;
|
||||
u32 r32, fwstate, pgnum, loff = 0;
|
||||
int i;
|
||||
|
||||
/*
|
||||
@ -731,7 +731,6 @@ bfa_iocpf_sm_fwcheck_entry(struct bfa_iocpf_s *iocpf)
|
||||
* Clear fwver hdr
|
||||
*/
|
||||
pgnum = PSS_SMEM_PGNUM(iocpf->ioc->ioc_regs.smem_pg0, loff);
|
||||
pgoff = PSS_SMEM_PGOFF(loff);
|
||||
writel(pgnum, iocpf->ioc->ioc_regs.host_page_num_fn);
|
||||
|
||||
for (i = 0; i < sizeof(struct bfi_ioc_image_hdr_s) / sizeof(u32); i++) {
|
||||
@ -1440,13 +1439,12 @@ bfa_ioc_lpu_stop(struct bfa_ioc_s *ioc)
|
||||
void
|
||||
bfa_ioc_fwver_get(struct bfa_ioc_s *ioc, struct bfi_ioc_image_hdr_s *fwhdr)
|
||||
{
|
||||
u32 pgnum, pgoff;
|
||||
u32 pgnum;
|
||||
u32 loff = 0;
|
||||
int i;
|
||||
u32 *fwsig = (u32 *) fwhdr;
|
||||
|
||||
pgnum = PSS_SMEM_PGNUM(ioc->ioc_regs.smem_pg0, loff);
|
||||
pgoff = PSS_SMEM_PGOFF(loff);
|
||||
writel(pgnum, ioc->ioc_regs.host_page_num_fn);
|
||||
|
||||
for (i = 0; i < (sizeof(struct bfi_ioc_image_hdr_s) / sizeof(u32));
|
||||
@ -1662,7 +1660,7 @@ bfa_status_t
|
||||
bfa_ioc_fwsig_invalidate(struct bfa_ioc_s *ioc)
|
||||
{
|
||||
|
||||
u32 pgnum, pgoff;
|
||||
u32 pgnum;
|
||||
u32 loff = 0;
|
||||
enum bfi_ioc_state ioc_fwstate;
|
||||
|
||||
@ -1671,7 +1669,6 @@ bfa_ioc_fwsig_invalidate(struct bfa_ioc_s *ioc)
|
||||
return BFA_STATUS_ADAPTER_ENABLED;
|
||||
|
||||
pgnum = PSS_SMEM_PGNUM(ioc->ioc_regs.smem_pg0, loff);
|
||||
pgoff = PSS_SMEM_PGOFF(loff);
|
||||
writel(pgnum, ioc->ioc_regs.host_page_num_fn);
|
||||
bfa_mem_write(ioc->ioc_regs.smem_page_start, loff, BFA_IOC_FW_INV_SIGN);
|
||||
|
||||
@ -1863,7 +1860,7 @@ bfa_ioc_download_fw(struct bfa_ioc_s *ioc, u32 boot_type,
|
||||
u32 boot_env)
|
||||
{
|
||||
u32 *fwimg;
|
||||
u32 pgnum, pgoff;
|
||||
u32 pgnum;
|
||||
u32 loff = 0;
|
||||
u32 chunkno = 0;
|
||||
u32 i;
|
||||
@ -1892,8 +1889,6 @@ bfa_ioc_download_fw(struct bfa_ioc_s *ioc, u32 boot_type,
|
||||
|
||||
|
||||
pgnum = PSS_SMEM_PGNUM(ioc->ioc_regs.smem_pg0, loff);
|
||||
pgoff = PSS_SMEM_PGOFF(loff);
|
||||
|
||||
writel(pgnum, ioc->ioc_regs.host_page_num_fn);
|
||||
|
||||
for (i = 0; i < fwimg_size; i++) {
|
||||
@ -4763,11 +4758,9 @@ bfa_diag_memtest_done(void *cbarg)
|
||||
struct bfa_ioc_s *ioc = diag->ioc;
|
||||
struct bfa_diag_memtest_result *res = diag->result;
|
||||
u32 loff = BFI_BOOT_MEMTEST_RES_ADDR;
|
||||
u32 pgnum, pgoff, i;
|
||||
u32 pgnum, i;
|
||||
|
||||
pgnum = PSS_SMEM_PGNUM(ioc->ioc_regs.smem_pg0, loff);
|
||||
pgoff = PSS_SMEM_PGOFF(loff);
|
||||
|
||||
writel(pgnum, ioc->ioc_regs.host_page_num_fn);
|
||||
|
||||
for (i = 0; i < (sizeof(struct bfa_diag_memtest_result) /
|
||||
@ -5026,7 +5019,7 @@ diag_portbeacon_comp(struct bfa_diag_s *diag)
|
||||
/*
|
||||
* Diag hmbox handler
|
||||
*/
|
||||
void
|
||||
static void
|
||||
bfa_diag_intr(void *diagarg, struct bfi_mbmsg_s *msg)
|
||||
{
|
||||
struct bfa_diag_s *diag = diagarg;
|
||||
@ -6649,8 +6642,8 @@ enum bfa_flash_cmd {
|
||||
BFA_FLASH_READ_STATUS = 0x05, /* read status */
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief hardware error definition
|
||||
/*
|
||||
* Hardware error definition
|
||||
*/
|
||||
enum bfa_flash_err {
|
||||
BFA_FLASH_NOT_PRESENT = -1, /*!< flash not present */
|
||||
@ -6664,8 +6657,8 @@ enum bfa_flash_err {
|
||||
BFA_FLASH_ERR_LEN = -9, /*!< invalid length */
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief flash command register data structure
|
||||
/*
|
||||
* Flash command register data structure
|
||||
*/
|
||||
union bfa_flash_cmd_reg_u {
|
||||
struct {
|
||||
@ -6688,8 +6681,8 @@ union bfa_flash_cmd_reg_u {
|
||||
u32 i;
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief flash device status register data structure
|
||||
/*
|
||||
* Flash device status register data structure
|
||||
*/
|
||||
union bfa_flash_dev_status_reg_u {
|
||||
struct {
|
||||
@ -6714,8 +6707,8 @@ union bfa_flash_dev_status_reg_u {
|
||||
u32 i;
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief flash address register data structure
|
||||
/*
|
||||
* Flash address register data structure
|
||||
*/
|
||||
union bfa_flash_addr_reg_u {
|
||||
struct {
|
||||
@ -6730,7 +6723,7 @@ union bfa_flash_addr_reg_u {
|
||||
u32 i;
|
||||
};
|
||||
|
||||
/**
|
||||
/*
|
||||
* dg flash_raw_private Flash raw private functions
|
||||
*/
|
||||
static void
|
||||
@ -6771,7 +6764,7 @@ bfa_flash_cmd_act_check(void __iomem *pci_bar)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* @brief
|
||||
* Flush FLI data fifo.
|
||||
*
|
||||
@ -6784,7 +6777,6 @@ static u32
|
||||
bfa_flash_fifo_flush(void __iomem *pci_bar)
|
||||
{
|
||||
u32 i;
|
||||
u32 t;
|
||||
union bfa_flash_dev_status_reg_u dev_status;
|
||||
|
||||
dev_status.i = readl(pci_bar + FLI_DEV_STATUS_REG);
|
||||
@ -6794,7 +6786,7 @@ bfa_flash_fifo_flush(void __iomem *pci_bar)
|
||||
|
||||
/* fifo counter in terms of words */
|
||||
for (i = 0; i < dev_status.r.fifo_cnt; i++)
|
||||
t = readl(pci_bar + FLI_RDDATA_REG);
|
||||
readl(pci_bar + FLI_RDDATA_REG);
|
||||
|
||||
/*
|
||||
* Check the device status. It may take some time.
|
||||
@ -6811,7 +6803,7 @@ bfa_flash_fifo_flush(void __iomem *pci_bar)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* @brief
|
||||
* Read flash status.
|
||||
*
|
||||
@ -6856,7 +6848,7 @@ bfa_flash_status_read(void __iomem *pci_bar)
|
||||
return ret_status;
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* @brief
|
||||
* Start flash read operation.
|
||||
*
|
||||
@ -6902,7 +6894,7 @@ bfa_flash_read_start(void __iomem *pci_bar, u32 offset, u32 len,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* @brief
|
||||
* Check flash read operation.
|
||||
*
|
||||
@ -6918,7 +6910,8 @@ bfa_flash_read_check(void __iomem *pci_bar)
|
||||
|
||||
return 0;
|
||||
}
|
||||
/**
|
||||
|
||||
/*
|
||||
* @brief
|
||||
* End flash read operation.
|
||||
*
|
||||
@ -6944,7 +6937,7 @@ bfa_flash_read_end(void __iomem *pci_bar, u32 len, char *buf)
|
||||
bfa_flash_fifo_flush(pci_bar);
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* @brief
|
||||
* Perform flash raw read.
|
||||
*
|
||||
@ -6970,7 +6963,7 @@ bfa_raw_sem_get(void __iomem *bar)
|
||||
|
||||
}
|
||||
|
||||
bfa_status_t
|
||||
static bfa_status_t
|
||||
bfa_flash_sem_get(void __iomem *bar)
|
||||
{
|
||||
u32 n = FLASH_BLOCKING_OP_MAX;
|
||||
@ -6983,7 +6976,7 @@ bfa_flash_sem_get(void __iomem *bar)
|
||||
return BFA_STATUS_OK;
|
||||
}
|
||||
|
||||
void
|
||||
static void
|
||||
bfa_flash_sem_put(void __iomem *bar)
|
||||
{
|
||||
writel(0, (bar + FLASH_SEM_LOCK_REG));
|
||||
|
@ -496,7 +496,7 @@ bfa_ioc_ct_sync_complete(struct bfa_ioc_s *ioc)
|
||||
return BFA_FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* Called from bfa_ioc_attach() to map asic specific calls.
|
||||
*/
|
||||
static void
|
||||
@ -517,7 +517,7 @@ bfa_ioc_set_ctx_hwif(struct bfa_ioc_s *ioc, struct bfa_ioc_hwif_s *hwif)
|
||||
hwif->ioc_get_alt_fwstate = bfa_ioc_ct_get_alt_ioc_fwstate;
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* Called from bfa_ioc_attach() to map asic specific calls.
|
||||
*/
|
||||
void
|
||||
@ -532,7 +532,7 @@ bfa_ioc_set_ct_hwif(struct bfa_ioc_s *ioc)
|
||||
ioc->ioc_hwif = &hwif_ct;
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* Called from bfa_ioc_attach() to map asic specific calls.
|
||||
*/
|
||||
void
|
||||
|
@ -756,7 +756,7 @@ bfa_cee_reset_stats(struct bfa_cee_s *cee,
|
||||
* @return void
|
||||
*/
|
||||
|
||||
void
|
||||
static void
|
||||
bfa_cee_isr(void *cbarg, struct bfi_mbmsg_s *m)
|
||||
{
|
||||
union bfi_cee_i2h_msg_u *msg;
|
||||
@ -792,7 +792,7 @@ bfa_cee_isr(void *cbarg, struct bfi_mbmsg_s *m)
|
||||
* @return void
|
||||
*/
|
||||
|
||||
void
|
||||
static void
|
||||
bfa_cee_notify(void *arg, enum bfa_ioc_event_e event)
|
||||
{
|
||||
struct bfa_cee_s *cee = (struct bfa_cee_s *) arg;
|
||||
|
@ -2718,7 +2718,7 @@ bfa_fcport_sm_ddport(struct bfa_fcport_s *fcport,
|
||||
case BFA_FCPORT_SM_DPORTDISABLE:
|
||||
case BFA_FCPORT_SM_ENABLE:
|
||||
case BFA_FCPORT_SM_START:
|
||||
/**
|
||||
/*
|
||||
* Ignore event for a port that is ddport
|
||||
*/
|
||||
break;
|
||||
@ -3839,7 +3839,7 @@ bfa_fcport_get_topology(struct bfa_s *bfa)
|
||||
return fcport->topology;
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* Get config topology.
|
||||
*/
|
||||
enum bfa_port_topology
|
||||
|
@ -15,7 +15,7 @@
|
||||
|
||||
BFA_TRC_FILE(LDRV, BSG);
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_ioc_enable(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
|
||||
@ -38,7 +38,7 @@ bfad_iocmd_ioc_enable(struct bfad_s *bfad, void *cmd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_ioc_disable(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
|
||||
@ -146,7 +146,7 @@ bfad_iocmd_ioc_get_stats(struct bfad_s *bfad, void *cmd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_ioc_get_fwstats(struct bfad_s *bfad, void *cmd,
|
||||
unsigned int payload_len)
|
||||
{
|
||||
@ -176,7 +176,7 @@ out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_ioc_reset_stats(struct bfad_s *bfad, void *cmd, unsigned int v_cmd)
|
||||
{
|
||||
struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
|
||||
@ -194,7 +194,7 @@ bfad_iocmd_ioc_reset_stats(struct bfad_s *bfad, void *cmd, unsigned int v_cmd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_ioc_set_name(struct bfad_s *bfad, void *cmd, unsigned int v_cmd)
|
||||
{
|
||||
struct bfa_bsg_ioc_name_s *iocmd = (struct bfa_bsg_ioc_name_s *) cmd;
|
||||
@ -208,7 +208,7 @@ bfad_iocmd_ioc_set_name(struct bfad_s *bfad, void *cmd, unsigned int v_cmd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_iocfc_get_attr(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_iocfc_attr_s *iocmd = (struct bfa_bsg_iocfc_attr_s *)cmd;
|
||||
@ -219,7 +219,7 @@ bfad_iocmd_iocfc_get_attr(struct bfad_s *bfad, void *cmd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_ioc_fw_sig_inv(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
|
||||
@ -231,7 +231,7 @@ bfad_iocmd_ioc_fw_sig_inv(struct bfad_s *bfad, void *cmd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_iocfc_set_intr(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_iocfc_intr_s *iocmd = (struct bfa_bsg_iocfc_intr_s *)cmd;
|
||||
@ -244,7 +244,7 @@ bfad_iocmd_iocfc_set_intr(struct bfad_s *bfad, void *cmd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_port_enable(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
|
||||
@ -265,7 +265,7 @@ bfad_iocmd_port_enable(struct bfad_s *bfad, void *cmd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_port_disable(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
|
||||
@ -315,7 +315,7 @@ bfad_iocmd_port_get_attr(struct bfad_s *bfad, void *cmd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_port_get_stats(struct bfad_s *bfad, void *cmd,
|
||||
unsigned int payload_len)
|
||||
{
|
||||
@ -349,7 +349,7 @@ out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_port_reset_stats(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
|
||||
@ -370,7 +370,7 @@ bfad_iocmd_port_reset_stats(struct bfad_s *bfad, void *cmd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_set_port_cfg(struct bfad_s *bfad, void *iocmd, unsigned int v_cmd)
|
||||
{
|
||||
struct bfa_bsg_port_cfg_s *cmd = (struct bfa_bsg_port_cfg_s *)iocmd;
|
||||
@ -390,7 +390,7 @@ bfad_iocmd_set_port_cfg(struct bfad_s *bfad, void *iocmd, unsigned int v_cmd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_port_cfg_maxfrsize(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_port_cfg_maxfrsize_s *iocmd =
|
||||
@ -404,7 +404,7 @@ bfad_iocmd_port_cfg_maxfrsize(struct bfad_s *bfad, void *cmd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_port_cfg_bbcr(struct bfad_s *bfad, unsigned int cmd, void *pcmd)
|
||||
{
|
||||
struct bfa_bsg_bbcr_enable_s *iocmd =
|
||||
@ -427,7 +427,7 @@ bfad_iocmd_port_cfg_bbcr(struct bfad_s *bfad, unsigned int cmd, void *pcmd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_port_get_bbcr_attr(struct bfad_s *bfad, void *pcmd)
|
||||
{
|
||||
struct bfa_bsg_bbcr_attr_s *iocmd = (struct bfa_bsg_bbcr_attr_s *) pcmd;
|
||||
@ -465,7 +465,7 @@ out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_lport_get_stats(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_fcs_lport_s *fcs_port;
|
||||
@ -489,7 +489,7 @@ out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_lport_reset_stats(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_fcs_lport_s *fcs_port;
|
||||
@ -523,7 +523,7 @@ out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_lport_get_iostats(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_fcs_lport_s *fcs_port;
|
||||
@ -548,7 +548,7 @@ out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_lport_get_rports(struct bfad_s *bfad, void *cmd,
|
||||
unsigned int payload_len)
|
||||
{
|
||||
@ -590,7 +590,7 @@ out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_rport_get_attr(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_rport_attr_s *iocmd = (struct bfa_bsg_rport_attr_s *)cmd;
|
||||
@ -676,7 +676,7 @@ out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_rport_get_stats(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_rport_stats_s *iocmd =
|
||||
@ -717,7 +717,7 @@ out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_rport_clr_stats(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_rport_reset_stats_s *iocmd =
|
||||
@ -753,7 +753,7 @@ out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_rport_set_speed(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_rport_set_speed_s *iocmd =
|
||||
@ -789,7 +789,7 @@ out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_vport_get_attr(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_fcs_vport_s *fcs_vport;
|
||||
@ -812,7 +812,7 @@ out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_vport_get_stats(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_fcs_vport_s *fcs_vport;
|
||||
@ -840,7 +840,7 @@ out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_vport_clr_stats(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_fcs_vport_s *fcs_vport;
|
||||
@ -907,7 +907,7 @@ out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_qos_set_bw(struct bfad_s *bfad, void *pcmd)
|
||||
{
|
||||
struct bfa_bsg_qos_bw_s *iocmd = (struct bfa_bsg_qos_bw_s *)pcmd;
|
||||
@ -920,7 +920,7 @@ bfad_iocmd_qos_set_bw(struct bfad_s *bfad, void *pcmd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_ratelim(struct bfad_s *bfad, unsigned int cmd, void *pcmd)
|
||||
{
|
||||
struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)pcmd;
|
||||
@ -949,7 +949,7 @@ bfad_iocmd_ratelim(struct bfad_s *bfad, unsigned int cmd, void *pcmd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_ratelim_speed(struct bfad_s *bfad, unsigned int cmd, void *pcmd)
|
||||
{
|
||||
struct bfa_bsg_trl_speed_s *iocmd = (struct bfa_bsg_trl_speed_s *)pcmd;
|
||||
@ -978,7 +978,7 @@ bfad_iocmd_ratelim_speed(struct bfad_s *bfad, unsigned int cmd, void *pcmd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_cfg_fcpim(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_fcpim_s *iocmd = (struct bfa_bsg_fcpim_s *)cmd;
|
||||
@ -991,7 +991,7 @@ bfad_iocmd_cfg_fcpim(struct bfad_s *bfad, void *cmd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_fcpim_get_modstats(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_fcpim_modstats_s *iocmd =
|
||||
@ -1013,7 +1013,7 @@ bfad_iocmd_fcpim_get_modstats(struct bfad_s *bfad, void *cmd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_fcpim_clr_modstats(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_fcpim_modstatsclr_s *iocmd =
|
||||
@ -1035,7 +1035,7 @@ bfad_iocmd_fcpim_clr_modstats(struct bfad_s *bfad, void *cmd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_fcpim_get_del_itn_stats(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_fcpim_del_itn_stats_s *iocmd =
|
||||
@ -1160,7 +1160,7 @@ bfad_iocmd_itnim_get_itnstats(struct bfad_s *bfad, void *cmd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_fcport_enable(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
|
||||
@ -1173,7 +1173,7 @@ bfad_iocmd_fcport_enable(struct bfad_s *bfad, void *cmd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_fcport_disable(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
|
||||
@ -1186,7 +1186,7 @@ bfad_iocmd_fcport_disable(struct bfad_s *bfad, void *cmd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_ioc_get_pcifn_cfg(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_pcifn_cfg_s *iocmd = (struct bfa_bsg_pcifn_cfg_s *)cmd;
|
||||
@ -1208,7 +1208,7 @@ out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_pcifn_create(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_pcifn_s *iocmd = (struct bfa_bsg_pcifn_s *)cmd;
|
||||
@ -1231,7 +1231,7 @@ out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_pcifn_delete(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_pcifn_s *iocmd = (struct bfa_bsg_pcifn_s *)cmd;
|
||||
@ -1253,7 +1253,7 @@ out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_pcifn_bw(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_pcifn_s *iocmd = (struct bfa_bsg_pcifn_s *)cmd;
|
||||
@ -1277,7 +1277,7 @@ out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_adapter_cfg_mode(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_adapter_cfg_mode_s *iocmd =
|
||||
@ -1300,7 +1300,7 @@ out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_port_cfg_mode(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_port_cfg_mode_s *iocmd =
|
||||
@ -1324,7 +1324,7 @@ out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_ablk_optrom(struct bfad_s *bfad, unsigned int cmd, void *pcmd)
|
||||
{
|
||||
struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)pcmd;
|
||||
@ -1350,7 +1350,7 @@ out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_faa_query(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_faa_attr_s *iocmd = (struct bfa_bsg_faa_attr_s *)cmd;
|
||||
@ -1373,7 +1373,7 @@ out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_cee_attr(struct bfad_s *bfad, void *cmd, unsigned int payload_len)
|
||||
{
|
||||
struct bfa_bsg_cee_attr_s *iocmd =
|
||||
@ -1409,7 +1409,7 @@ out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_cee_get_stats(struct bfad_s *bfad, void *cmd,
|
||||
unsigned int payload_len)
|
||||
{
|
||||
@ -1446,7 +1446,7 @@ out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_cee_reset_stats(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
|
||||
@ -1460,7 +1460,7 @@ bfad_iocmd_cee_reset_stats(struct bfad_s *bfad, void *cmd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_sfp_media(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_sfp_media_s *iocmd = (struct bfa_bsg_sfp_media_s *)cmd;
|
||||
@ -1482,7 +1482,7 @@ out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_sfp_speed(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_sfp_speed_s *iocmd = (struct bfa_bsg_sfp_speed_s *)cmd;
|
||||
@ -1503,7 +1503,7 @@ out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_flash_get_attr(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_flash_attr_s *iocmd =
|
||||
@ -1524,7 +1524,7 @@ out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_flash_erase_part(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_flash_s *iocmd = (struct bfa_bsg_flash_s *)cmd;
|
||||
@ -1544,7 +1544,7 @@ out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_flash_update_part(struct bfad_s *bfad, void *cmd,
|
||||
unsigned int payload_len)
|
||||
{
|
||||
@ -1576,7 +1576,7 @@ out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_flash_read_part(struct bfad_s *bfad, void *cmd,
|
||||
unsigned int payload_len)
|
||||
{
|
||||
@ -1608,7 +1608,7 @@ out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_diag_temp(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_diag_get_temp_s *iocmd =
|
||||
@ -1630,7 +1630,7 @@ out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_diag_memtest(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_diag_memtest_s *iocmd =
|
||||
@ -1653,7 +1653,7 @@ out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_diag_loopback(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_diag_loopback_s *iocmd =
|
||||
@ -1676,7 +1676,7 @@ out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_diag_fwping(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_diag_fwping_s *iocmd =
|
||||
@ -1700,7 +1700,7 @@ out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_diag_queuetest(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_diag_qtest_s *iocmd = (struct bfa_bsg_diag_qtest_s *)cmd;
|
||||
@ -1721,7 +1721,7 @@ out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_diag_sfp(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_sfp_show_s *iocmd =
|
||||
@ -1744,7 +1744,7 @@ out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_diag_led(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_diag_led_s *iocmd = (struct bfa_bsg_diag_led_s *)cmd;
|
||||
@ -1757,7 +1757,7 @@ bfad_iocmd_diag_led(struct bfad_s *bfad, void *cmd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_diag_beacon_lport(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_diag_beacon_s *iocmd =
|
||||
@ -1772,7 +1772,7 @@ bfad_iocmd_diag_beacon_lport(struct bfad_s *bfad, void *cmd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_diag_lb_stat(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_diag_lb_stat_s *iocmd =
|
||||
@ -1787,7 +1787,7 @@ bfad_iocmd_diag_lb_stat(struct bfad_s *bfad, void *cmd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_diag_dport_enable(struct bfad_s *bfad, void *pcmd)
|
||||
{
|
||||
struct bfa_bsg_dport_enable_s *iocmd =
|
||||
@ -1809,7 +1809,7 @@ bfad_iocmd_diag_dport_enable(struct bfad_s *bfad, void *pcmd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_diag_dport_disable(struct bfad_s *bfad, void *pcmd)
|
||||
{
|
||||
struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)pcmd;
|
||||
@ -1829,7 +1829,7 @@ bfad_iocmd_diag_dport_disable(struct bfad_s *bfad, void *pcmd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_diag_dport_start(struct bfad_s *bfad, void *pcmd)
|
||||
{
|
||||
struct bfa_bsg_dport_enable_s *iocmd =
|
||||
@ -1854,7 +1854,7 @@ bfad_iocmd_diag_dport_start(struct bfad_s *bfad, void *pcmd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_diag_dport_show(struct bfad_s *bfad, void *pcmd)
|
||||
{
|
||||
struct bfa_bsg_diag_dport_show_s *iocmd =
|
||||
@ -1869,7 +1869,7 @@ bfad_iocmd_diag_dport_show(struct bfad_s *bfad, void *pcmd)
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_phy_get_attr(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_phy_attr_s *iocmd =
|
||||
@ -1890,7 +1890,7 @@ out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_phy_get_stats(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_phy_stats_s *iocmd =
|
||||
@ -1911,7 +1911,7 @@ out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_phy_read(struct bfad_s *bfad, void *cmd, unsigned int payload_len)
|
||||
{
|
||||
struct bfa_bsg_phy_s *iocmd = (struct bfa_bsg_phy_s *)cmd;
|
||||
@ -1943,7 +1943,7 @@ out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_vhba_query(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_vhba_attr_s *iocmd =
|
||||
@ -1962,7 +1962,7 @@ bfad_iocmd_vhba_query(struct bfad_s *bfad, void *cmd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_phy_update(struct bfad_s *bfad, void *cmd, unsigned int payload_len)
|
||||
{
|
||||
struct bfa_bsg_phy_s *iocmd = (struct bfa_bsg_phy_s *)cmd;
|
||||
@ -1992,7 +1992,7 @@ out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_porglog_get(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_debug_s *iocmd = (struct bfa_bsg_debug_s *)cmd;
|
||||
@ -2012,7 +2012,7 @@ out:
|
||||
}
|
||||
|
||||
#define BFA_DEBUG_FW_CORE_CHUNK_SZ 0x4000U /* 16K chunks for FW dump */
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_debug_fw_core(struct bfad_s *bfad, void *cmd,
|
||||
unsigned int payload_len)
|
||||
{
|
||||
@ -2046,7 +2046,7 @@ out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_debug_ctl(struct bfad_s *bfad, void *cmd, unsigned int v_cmd)
|
||||
{
|
||||
struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
|
||||
@ -2067,7 +2067,7 @@ bfad_iocmd_debug_ctl(struct bfad_s *bfad, void *cmd, unsigned int v_cmd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_porglog_ctl(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_portlogctl_s *iocmd = (struct bfa_bsg_portlogctl_s *)cmd;
|
||||
@ -2081,7 +2081,7 @@ bfad_iocmd_porglog_ctl(struct bfad_s *bfad, void *cmd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_fcpim_cfg_profile(struct bfad_s *bfad, void *cmd, unsigned int v_cmd)
|
||||
{
|
||||
struct bfa_bsg_fcpim_profile_s *iocmd =
|
||||
@ -2125,7 +2125,7 @@ bfad_iocmd_itnim_get_ioprofile(struct bfad_s *bfad, void *cmd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_fcport_get_stats(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_fcport_stats_s *iocmd =
|
||||
@ -2150,7 +2150,7 @@ out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_fcport_reset_stats(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
|
||||
@ -2174,7 +2174,7 @@ out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_boot_cfg(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_boot_s *iocmd = (struct bfa_bsg_boot_s *)cmd;
|
||||
@ -2196,7 +2196,7 @@ out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_boot_query(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_boot_s *iocmd = (struct bfa_bsg_boot_s *)cmd;
|
||||
@ -2218,7 +2218,7 @@ out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_preboot_query(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_preboot_s *iocmd = (struct bfa_bsg_preboot_s *)cmd;
|
||||
@ -2237,7 +2237,7 @@ bfad_iocmd_preboot_query(struct bfad_s *bfad, void *cmd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_ethboot_cfg(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_ethboot_s *iocmd = (struct bfa_bsg_ethboot_s *)cmd;
|
||||
@ -2260,7 +2260,7 @@ out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_ethboot_query(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_ethboot_s *iocmd = (struct bfa_bsg_ethboot_s *)cmd;
|
||||
@ -2283,7 +2283,7 @@ out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_cfg_trunk(struct bfad_s *bfad, void *cmd, unsigned int v_cmd)
|
||||
{
|
||||
struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
|
||||
@ -2323,7 +2323,7 @@ bfad_iocmd_cfg_trunk(struct bfad_s *bfad, void *cmd, unsigned int v_cmd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_trunk_get_attr(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_trunk_attr_s *iocmd = (struct bfa_bsg_trunk_attr_s *)cmd;
|
||||
@ -2346,7 +2346,7 @@ bfad_iocmd_trunk_get_attr(struct bfad_s *bfad, void *cmd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_qos(struct bfad_s *bfad, void *cmd, unsigned int v_cmd)
|
||||
{
|
||||
struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
|
||||
@ -2374,7 +2374,7 @@ bfad_iocmd_qos(struct bfad_s *bfad, void *cmd, unsigned int v_cmd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_qos_get_attr(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_qos_attr_s *iocmd = (struct bfa_bsg_qos_attr_s *)cmd;
|
||||
@ -2400,7 +2400,7 @@ bfad_iocmd_qos_get_attr(struct bfad_s *bfad, void *cmd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_qos_get_vc_attr(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_qos_vc_attr_s *iocmd =
|
||||
@ -2432,7 +2432,7 @@ bfad_iocmd_qos_get_vc_attr(struct bfad_s *bfad, void *cmd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_qos_get_stats(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_fcport_stats_s *iocmd =
|
||||
@ -2464,7 +2464,7 @@ out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_qos_reset_stats(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
|
||||
@ -2495,7 +2495,7 @@ out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_vf_get_stats(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_vf_stats_s *iocmd =
|
||||
@ -2518,7 +2518,7 @@ out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_vf_clr_stats(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_vf_reset_stats_s *iocmd =
|
||||
@ -2555,7 +2555,7 @@ bfad_iocmd_lunmask_reset_lunscan_mode(struct bfad_s *bfad, int lunmask_cfg)
|
||||
bfad_reset_sdev_bflags(vport->drv_port.im_port, lunmask_cfg);
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_lunmask(struct bfad_s *bfad, void *pcmd, unsigned int v_cmd)
|
||||
{
|
||||
struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)pcmd;
|
||||
@ -2578,7 +2578,7 @@ bfad_iocmd_lunmask(struct bfad_s *bfad, void *pcmd, unsigned int v_cmd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_fcpim_lunmask_query(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_fcpim_lunmask_query_s *iocmd =
|
||||
@ -2592,7 +2592,7 @@ bfad_iocmd_fcpim_lunmask_query(struct bfad_s *bfad, void *cmd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_fcpim_cfg_lunmask(struct bfad_s *bfad, void *cmd, unsigned int v_cmd)
|
||||
{
|
||||
struct bfa_bsg_fcpim_lunmask_s *iocmd =
|
||||
@ -2611,7 +2611,7 @@ bfad_iocmd_fcpim_cfg_lunmask(struct bfad_s *bfad, void *cmd, unsigned int v_cmd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_fcpim_throttle_query(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_fcpim_throttle_s *iocmd =
|
||||
@ -2626,7 +2626,7 @@ bfad_iocmd_fcpim_throttle_query(struct bfad_s *bfad, void *cmd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_fcpim_throttle_set(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_fcpim_throttle_s *iocmd =
|
||||
@ -2641,7 +2641,7 @@ bfad_iocmd_fcpim_throttle_set(struct bfad_s *bfad, void *cmd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_tfru_read(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_tfru_s *iocmd =
|
||||
@ -2663,7 +2663,7 @@ bfad_iocmd_tfru_read(struct bfad_s *bfad, void *cmd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_tfru_write(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_tfru_s *iocmd =
|
||||
@ -2685,7 +2685,7 @@ bfad_iocmd_tfru_write(struct bfad_s *bfad, void *cmd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_fruvpd_read(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_fruvpd_s *iocmd =
|
||||
@ -2707,7 +2707,7 @@ bfad_iocmd_fruvpd_read(struct bfad_s *bfad, void *cmd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_fruvpd_update(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_fruvpd_s *iocmd =
|
||||
@ -2729,7 +2729,7 @@ bfad_iocmd_fruvpd_update(struct bfad_s *bfad, void *cmd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_iocmd_fruvpd_get_max_size(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_fruvpd_max_size_s *iocmd =
|
||||
@ -3177,7 +3177,7 @@ out:
|
||||
}
|
||||
|
||||
/* FC passthru call backs */
|
||||
u64
|
||||
static u64
|
||||
bfad_fcxp_get_req_sgaddr_cb(void *bfad_fcxp, int sgeid)
|
||||
{
|
||||
struct bfad_fcxp *drv_fcxp = bfad_fcxp;
|
||||
@ -3189,7 +3189,7 @@ bfad_fcxp_get_req_sgaddr_cb(void *bfad_fcxp, int sgeid)
|
||||
return addr;
|
||||
}
|
||||
|
||||
u32
|
||||
static u32
|
||||
bfad_fcxp_get_req_sglen_cb(void *bfad_fcxp, int sgeid)
|
||||
{
|
||||
struct bfad_fcxp *drv_fcxp = bfad_fcxp;
|
||||
@ -3199,7 +3199,7 @@ bfad_fcxp_get_req_sglen_cb(void *bfad_fcxp, int sgeid)
|
||||
return sge->sg_len;
|
||||
}
|
||||
|
||||
u64
|
||||
static u64
|
||||
bfad_fcxp_get_rsp_sgaddr_cb(void *bfad_fcxp, int sgeid)
|
||||
{
|
||||
struct bfad_fcxp *drv_fcxp = bfad_fcxp;
|
||||
@ -3211,7 +3211,7 @@ bfad_fcxp_get_rsp_sgaddr_cb(void *bfad_fcxp, int sgeid)
|
||||
return addr;
|
||||
}
|
||||
|
||||
u32
|
||||
static u32
|
||||
bfad_fcxp_get_rsp_sglen_cb(void *bfad_fcxp, int sgeid)
|
||||
{
|
||||
struct bfad_fcxp *drv_fcxp = bfad_fcxp;
|
||||
@ -3221,7 +3221,7 @@ bfad_fcxp_get_rsp_sglen_cb(void *bfad_fcxp, int sgeid)
|
||||
return sge->sg_len;
|
||||
}
|
||||
|
||||
void
|
||||
static void
|
||||
bfad_send_fcpt_cb(void *bfad_fcxp, struct bfa_fcxp_s *fcxp, void *cbarg,
|
||||
bfa_status_t req_status, u32 rsp_len, u32 resid_len,
|
||||
struct fchs_s *rsp_fchs)
|
||||
@ -3236,7 +3236,7 @@ bfad_send_fcpt_cb(void *bfad_fcxp, struct bfa_fcxp_s *fcxp, void *cbarg,
|
||||
complete(&drv_fcxp->comp);
|
||||
}
|
||||
|
||||
struct bfad_buf_info *
|
||||
static struct bfad_buf_info *
|
||||
bfad_fcxp_map_sg(struct bfad_s *bfad, void *payload_kbuf,
|
||||
uint32_t payload_len, uint32_t *num_sgles)
|
||||
{
|
||||
@ -3280,7 +3280,7 @@ out_free_mem:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void
|
||||
static void
|
||||
bfad_fcxp_free_mem(struct bfad_s *bfad, struct bfad_buf_info *buf_base,
|
||||
uint32_t num_sgles)
|
||||
{
|
||||
@ -3298,7 +3298,7 @@ bfad_fcxp_free_mem(struct bfad_s *bfad, struct bfad_buf_info *buf_base,
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_fcxp_bsg_send(struct bsg_job *job, struct bfad_fcxp *drv_fcxp,
|
||||
bfa_bsg_fcpt_t *bsg_fcpt)
|
||||
{
|
||||
@ -3338,7 +3338,7 @@ bfad_fcxp_bsg_send(struct bsg_job *job, struct bfad_fcxp *drv_fcxp,
|
||||
return BFA_STATUS_OK;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
bfad_im_bsg_els_ct_request(struct bsg_job *job)
|
||||
{
|
||||
struct bfa_bsg_data *bsg_data;
|
||||
|
@ -1071,9 +1071,8 @@ static int bnx2fc_fip_recv(struct sk_buff *skb, struct net_device *dev,
|
||||
/**
|
||||
* bnx2fc_update_src_mac - Update Ethernet MAC filters.
|
||||
*
|
||||
* @fip: FCoE controller.
|
||||
* @old: Unicast MAC address to delete if the MAC is non-zero.
|
||||
* @new: Unicast MAC address to add.
|
||||
* @lport: The local port
|
||||
* @addr: Location of data to copy
|
||||
*
|
||||
* Remove any previously-set unicast MAC filter.
|
||||
* Add secondary FCoE MAC address filter for our OUI.
|
||||
@ -1659,8 +1658,7 @@ static void __bnx2fc_destroy(struct bnx2fc_interface *interface)
|
||||
/**
|
||||
* bnx2fc_destroy - Destroy a bnx2fc FCoE interface
|
||||
*
|
||||
* @buffer: The name of the Ethernet interface to be destroyed
|
||||
* @kp: The associated kernel parameter
|
||||
* @netdev: The net device that the FCoE interface is on
|
||||
*
|
||||
* Called from sysfs.
|
||||
*
|
||||
@ -2101,7 +2099,7 @@ static int __bnx2fc_disable(struct fcoe_ctlr *ctlr)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* Deperecated: Use bnx2fc_enabled()
|
||||
*/
|
||||
static int bnx2fc_disable(struct net_device *netdev)
|
||||
@ -2229,7 +2227,7 @@ done:
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* Deprecated: Use bnx2fc_enabled()
|
||||
*/
|
||||
static int bnx2fc_enable(struct net_device *netdev)
|
||||
@ -2523,7 +2521,7 @@ static struct bnx2fc_hba *bnx2fc_hba_lookup(struct net_device
|
||||
/**
|
||||
* bnx2fc_ulp_exit - shuts down adapter instance and frees all resources
|
||||
*
|
||||
* @dev cnic device handle
|
||||
* @dev: cnic device handle
|
||||
*/
|
||||
static void bnx2fc_ulp_exit(struct cnic_dev *dev)
|
||||
{
|
||||
@ -2956,7 +2954,7 @@ static struct device_attribute *bnx2fc_host_attrs[] = {
|
||||
NULL,
|
||||
};
|
||||
|
||||
/**
|
||||
/*
|
||||
* scsi_host_template structure used while registering with SCSI-ml
|
||||
*/
|
||||
static struct scsi_host_template bnx2fc_shost_template = {
|
||||
@ -2989,7 +2987,7 @@ static struct libfc_function_template bnx2fc_libfc_fcn_templ = {
|
||||
.rport_event_callback = bnx2fc_rport_event_handler,
|
||||
};
|
||||
|
||||
/**
|
||||
/*
|
||||
* bnx2fc_cnic_cb - global template of bnx2fc - cnic driver interface
|
||||
* structure carrying callback function pointers
|
||||
*/
|
||||
|
@ -485,7 +485,7 @@ int bnx2fc_send_session_disable_req(struct fcoe_port *port,
|
||||
/**
|
||||
* bnx2fc_send_session_destroy_req - initiates FCoE Session destroy
|
||||
*
|
||||
* @port: port structure pointer
|
||||
* @hba: adapter structure pointer
|
||||
* @tgt: bnx2fc_rport structure pointer
|
||||
*/
|
||||
int bnx2fc_send_session_destroy_req(struct bnx2fc_hba *hba,
|
||||
@ -635,7 +635,6 @@ static void bnx2fc_process_unsol_compl(struct bnx2fc_rport *tgt, u16 wqe)
|
||||
struct bnx2fc_cmd *io_req = NULL;
|
||||
struct bnx2fc_interface *interface = tgt->port->priv;
|
||||
struct bnx2fc_hba *hba = interface->hba;
|
||||
int task_idx, index;
|
||||
int rc = 0;
|
||||
u64 err_warn_bit_map;
|
||||
u8 err_warn = 0xff;
|
||||
@ -701,15 +700,12 @@ static void bnx2fc_process_unsol_compl(struct bnx2fc_rport *tgt, u16 wqe)
|
||||
BNX2FC_TGT_DBG(tgt, "buf_offsets - tx = 0x%x, rx = 0x%x\n",
|
||||
err_entry->data.tx_buf_off, err_entry->data.rx_buf_off);
|
||||
|
||||
|
||||
if (xid > hba->max_xid) {
|
||||
BNX2FC_TGT_DBG(tgt, "xid(0x%x) out of FW range\n",
|
||||
xid);
|
||||
goto ret_err_rqe;
|
||||
}
|
||||
|
||||
task_idx = xid / BNX2FC_TASKS_PER_PAGE;
|
||||
index = xid % BNX2FC_TASKS_PER_PAGE;
|
||||
|
||||
io_req = (struct bnx2fc_cmd *)hba->cmd_mgr->cmds[xid];
|
||||
if (!io_req)
|
||||
@ -833,8 +829,6 @@ ret_err_rqe:
|
||||
}
|
||||
BNX2FC_TGT_DBG(tgt, "warn = 0x%x\n", err_warn);
|
||||
|
||||
task_idx = xid / BNX2FC_TASKS_PER_PAGE;
|
||||
index = xid % BNX2FC_TASKS_PER_PAGE;
|
||||
io_req = (struct bnx2fc_cmd *)hba->cmd_mgr->cmds[xid];
|
||||
if (!io_req)
|
||||
goto ret_warn_rqe;
|
||||
@ -1008,7 +1002,6 @@ static bool bnx2fc_pending_work(struct bnx2fc_rport *tgt, unsigned int wqe)
|
||||
unsigned char *rq_data = NULL;
|
||||
unsigned char rq_data_buff[BNX2FC_RQ_BUF_SZ];
|
||||
int task_idx, index;
|
||||
unsigned char *dummy;
|
||||
u16 xid;
|
||||
u8 num_rq;
|
||||
int i;
|
||||
@ -1038,7 +1031,7 @@ static bool bnx2fc_pending_work(struct bnx2fc_rport *tgt, unsigned int wqe)
|
||||
if (num_rq > 1) {
|
||||
/* We do not need extra sense data */
|
||||
for (i = 1; i < num_rq; i++)
|
||||
dummy = bnx2fc_get_next_rqe(tgt, 1);
|
||||
bnx2fc_get_next_rqe(tgt, 1);
|
||||
}
|
||||
|
||||
if (rq_data)
|
||||
@ -1341,8 +1334,8 @@ static void bnx2fc_init_failure(struct bnx2fc_hba *hba, u32 err_code)
|
||||
/**
|
||||
* bnx2fc_indicae_kcqe - process KCQE
|
||||
*
|
||||
* @hba: adapter structure pointer
|
||||
* @kcqe: kcqe pointer
|
||||
* @context: adapter structure pointer
|
||||
* @kcq: kcqe pointer
|
||||
* @num_cqe: Number of completion queue elements
|
||||
*
|
||||
* Generic KCQ event handler
|
||||
@ -1510,7 +1503,6 @@ void bnx2fc_init_seq_cleanup_task(struct bnx2fc_cmd *seq_clnp_req,
|
||||
u64 phys_addr = (u64)orig_io_req->bd_tbl->bd_tbl_dma;
|
||||
u32 orig_offset = offset;
|
||||
int bd_count;
|
||||
int orig_task_idx, index;
|
||||
int i;
|
||||
|
||||
memset(task, 0, sizeof(struct fcoe_task_ctx_entry));
|
||||
@ -1560,8 +1552,6 @@ void bnx2fc_init_seq_cleanup_task(struct bnx2fc_cmd *seq_clnp_req,
|
||||
offset; /* adjusted offset */
|
||||
task->txwr_only.sgl_ctx.sgl.mul_sgl.cur_sge_idx = i;
|
||||
} else {
|
||||
orig_task_idx = orig_xid / BNX2FC_TASKS_PER_PAGE;
|
||||
index = orig_xid % BNX2FC_TASKS_PER_PAGE;
|
||||
|
||||
/* Multiple SGEs were used for this IO */
|
||||
sgl = &task->rxwr_only.union_ctx.read_info.sgl_ctx.sgl;
|
||||
@ -2089,11 +2079,7 @@ static int bnx2fc_allocate_hash_table(struct bnx2fc_hba *hba)
|
||||
pbl = hba->hash_tbl_pbl;
|
||||
i = 0;
|
||||
while (*pbl && *(pbl + 1)) {
|
||||
u32 lo;
|
||||
u32 hi;
|
||||
lo = *pbl;
|
||||
++pbl;
|
||||
hi = *pbl;
|
||||
++pbl;
|
||||
++i;
|
||||
}
|
||||
|
@ -431,7 +431,7 @@ static int bnx2fc_init_tgt(struct bnx2fc_rport *tgt,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* This event_callback is called after successful completion of libfc
|
||||
* initiated target login. bnx2fc can proceed with initiating the session
|
||||
* establishment.
|
||||
@ -656,9 +656,8 @@ static void bnx2fc_free_conn_id(struct bnx2fc_hba *hba, u32 conn_id)
|
||||
spin_unlock_bh(&hba->hba_lock);
|
||||
}
|
||||
|
||||
/**
|
||||
*bnx2fc_alloc_session_resc - Allocate qp resources for the session
|
||||
*
|
||||
/*
|
||||
* bnx2fc_alloc_session_resc - Allocate qp resources for the session
|
||||
*/
|
||||
static int bnx2fc_alloc_session_resc(struct bnx2fc_hba *hba,
|
||||
struct bnx2fc_rport *tgt)
|
||||
|
@ -181,7 +181,7 @@ int bnx2i_arm_cq_event_coalescing(struct bnx2i_endpoint *ep, u8 action)
|
||||
|
||||
/**
|
||||
* bnx2i_get_rq_buf - copy RQ buffer contents to driver buffer
|
||||
* @conn: iscsi connection on which RQ event occurred
|
||||
* @bnx2i_conn: iscsi connection on which RQ event occurred
|
||||
* @ptr: driver buffer to which RQ buffer contents is to
|
||||
* be copied
|
||||
* @len: length of valid data inside RQ buf
|
||||
@ -223,7 +223,7 @@ static void bnx2i_ring_577xx_doorbell(struct bnx2i_conn *conn)
|
||||
|
||||
/**
|
||||
* bnx2i_put_rq_buf - Replenish RQ buffer, if required ring on chip doorbell
|
||||
* @conn: iscsi connection on which event to post
|
||||
* @bnx2i_conn: iscsi connection on which event to post
|
||||
* @count: number of RQ buffer being posted to chip
|
||||
*
|
||||
* No need to ring hardware doorbell for 57710 family of devices
|
||||
@ -258,7 +258,7 @@ void bnx2i_put_rq_buf(struct bnx2i_conn *bnx2i_conn, int count)
|
||||
|
||||
/**
|
||||
* bnx2i_ring_sq_dbell - Ring SQ doorbell to wake-up the processing engine
|
||||
* @conn: iscsi connection to which new SQ entries belong
|
||||
* @bnx2i_conn: iscsi connection to which new SQ entries belong
|
||||
* @count: number of SQ WQEs to post
|
||||
*
|
||||
* SQ DB is updated in host memory and TX Doorbell is rung for 57710 family
|
||||
@ -283,7 +283,7 @@ static void bnx2i_ring_sq_dbell(struct bnx2i_conn *bnx2i_conn, int count)
|
||||
|
||||
/**
|
||||
* bnx2i_ring_dbell_update_sq_params - update SQ driver parameters
|
||||
* @conn: iscsi connection to which new SQ entries belong
|
||||
* @bnx2i_conn: iscsi connection to which new SQ entries belong
|
||||
* @count: number of SQ WQEs to post
|
||||
*
|
||||
* this routine will update SQ driver parameters and ring the doorbell
|
||||
@ -320,9 +320,9 @@ static void bnx2i_ring_dbell_update_sq_params(struct bnx2i_conn *bnx2i_conn,
|
||||
|
||||
/**
|
||||
* bnx2i_send_iscsi_login - post iSCSI login request MP WQE to hardware
|
||||
* @conn: iscsi connection
|
||||
* @cmd: driver command structure which is requesting
|
||||
* a WQE to sent to chip for further processing
|
||||
* @bnx2i_conn: iscsi connection
|
||||
* @task: transport layer's command structure pointer which is requesting
|
||||
* a WQE to sent to chip for further processing
|
||||
*
|
||||
* prepare and post an iSCSI Login request WQE to CNIC firmware
|
||||
*/
|
||||
@ -373,7 +373,7 @@ int bnx2i_send_iscsi_login(struct bnx2i_conn *bnx2i_conn,
|
||||
|
||||
/**
|
||||
* bnx2i_send_iscsi_tmf - post iSCSI task management request MP WQE to hardware
|
||||
* @conn: iscsi connection
|
||||
* @bnx2i_conn: iscsi connection
|
||||
* @mtask: driver command structure which is requesting
|
||||
* a WQE to sent to chip for further processing
|
||||
*
|
||||
@ -447,7 +447,7 @@ int bnx2i_send_iscsi_tmf(struct bnx2i_conn *bnx2i_conn,
|
||||
|
||||
/**
|
||||
* bnx2i_send_iscsi_text - post iSCSI text WQE to hardware
|
||||
* @conn: iscsi connection
|
||||
* @bnx2i_conn: iscsi connection
|
||||
* @mtask: driver command structure which is requesting
|
||||
* a WQE to sent to chip for further processing
|
||||
*
|
||||
@ -495,7 +495,7 @@ int bnx2i_send_iscsi_text(struct bnx2i_conn *bnx2i_conn,
|
||||
|
||||
/**
|
||||
* bnx2i_send_iscsi_scsicmd - post iSCSI scsicmd request WQE to hardware
|
||||
* @conn: iscsi connection
|
||||
* @bnx2i_conn: iscsi connection
|
||||
* @cmd: driver command structure which is requesting
|
||||
* a WQE to sent to chip for further processing
|
||||
*
|
||||
@ -517,9 +517,9 @@ int bnx2i_send_iscsi_scsicmd(struct bnx2i_conn *bnx2i_conn,
|
||||
|
||||
/**
|
||||
* bnx2i_send_iscsi_nopout - post iSCSI NOPOUT request WQE to hardware
|
||||
* @conn: iscsi connection
|
||||
* @cmd: driver command structure which is requesting
|
||||
* a WQE to sent to chip for further processing
|
||||
* @bnx2i_conn: iscsi connection
|
||||
* @task: transport layer's command structure pointer which is
|
||||
* requesting a WQE to sent to chip for further processing
|
||||
* @datap: payload buffer pointer
|
||||
* @data_len: payload data length
|
||||
* @unsol: indicated whether nopout pdu is unsolicited pdu or
|
||||
@ -579,9 +579,9 @@ int bnx2i_send_iscsi_nopout(struct bnx2i_conn *bnx2i_conn,
|
||||
|
||||
/**
|
||||
* bnx2i_send_iscsi_logout - post iSCSI logout request WQE to hardware
|
||||
* @conn: iscsi connection
|
||||
* @cmd: driver command structure which is requesting
|
||||
* a WQE to sent to chip for further processing
|
||||
* @bnx2i_conn: iscsi connection
|
||||
* @task: transport layer's command structure pointer which is
|
||||
* requesting a WQE to sent to chip for further processing
|
||||
*
|
||||
* prepare and post logout request WQE to CNIC firmware
|
||||
*/
|
||||
@ -678,7 +678,8 @@ void bnx2i_update_iscsi_conn(struct iscsi_conn *conn)
|
||||
|
||||
/**
|
||||
* bnx2i_ep_ofld_timer - post iSCSI logout request WQE to hardware
|
||||
* @data: endpoint (transport handle) structure pointer
|
||||
* @t: timer context used to fetch the endpoint (transport
|
||||
* handle) structure pointer
|
||||
*
|
||||
* routine to handle connection offload/destroy request timeout
|
||||
*/
|
||||
@ -1662,7 +1663,7 @@ static void bnx2i_process_nopin_local_cmpl(struct iscsi_session *session,
|
||||
|
||||
/**
|
||||
* bnx2i_unsol_pdu_adjust_rq - makes adjustments to RQ after unsol pdu is recvd
|
||||
* @conn: iscsi connection
|
||||
* @bnx2i_conn: iscsi connection
|
||||
*
|
||||
* Firmware advances RQ producer index for every unsolicited PDU even if
|
||||
* payload data length is '0'. This function makes corresponding
|
||||
@ -1885,7 +1886,9 @@ int bnx2i_percpu_io_thread(void *arg)
|
||||
|
||||
/**
|
||||
* bnx2i_queue_scsi_cmd_resp - queue cmd completion to the percpu thread
|
||||
* @session: iscsi session
|
||||
* @bnx2i_conn: bnx2i connection
|
||||
* @cqe: pointer to newly DMA'ed CQE entry for processing
|
||||
*
|
||||
* this function is called by generic KCQ handler to queue all pending cmd
|
||||
* completion CQEs
|
||||
@ -2466,8 +2469,9 @@ static void bnx2i_process_ofld_cmpl(struct bnx2i_hba *hba,
|
||||
|
||||
/**
|
||||
* bnx2i_indicate_kcqe - process iscsi conn update completion KCQE
|
||||
* @hba: adapter structure pointer
|
||||
* @update_kcqe: kcqe pointer
|
||||
* @context: adapter structure pointer
|
||||
* @kcqe: kcqe pointer
|
||||
* @num_cqe: number of kcqes to process
|
||||
*
|
||||
* Generic KCQ event handler/dispatcher
|
||||
*/
|
||||
@ -2614,8 +2618,7 @@ static void bnx2i_cm_abort_cmpl(struct cnic_sock *cm_sk)
|
||||
|
||||
/**
|
||||
* bnx2i_cm_remote_close - process received TCP FIN
|
||||
* @hba: adapter structure pointer
|
||||
* @update_kcqe: kcqe pointer
|
||||
* @cm_sk: cnic sock structure pointer
|
||||
*
|
||||
* function callback exported via bnx2i - cnic driver interface to indicate
|
||||
* async TCP events such as FIN
|
||||
@ -2631,8 +2634,7 @@ static void bnx2i_cm_remote_close(struct cnic_sock *cm_sk)
|
||||
|
||||
/**
|
||||
* bnx2i_cm_remote_abort - process TCP RST and start conn cleanup
|
||||
* @hba: adapter structure pointer
|
||||
* @update_kcqe: kcqe pointer
|
||||
* @cm_sk: cnic sock structure pointer
|
||||
*
|
||||
* function callback exported via bnx2i - cnic driver interface to
|
||||
* indicate async TCP events (RST) sent by the peer.
|
||||
@ -2669,10 +2671,9 @@ static int bnx2i_send_nl_mesg(void *context, u32 msg_type,
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
/*
|
||||
* bnx2i_cnic_cb - global template of bnx2i - cnic driver interface structure
|
||||
* carrying callback function pointers
|
||||
*
|
||||
*/
|
||||
struct cnic_ulp_ops bnx2i_cnic_cb = {
|
||||
.cnic_init = bnx2i_ulp_init,
|
||||
|
@ -73,7 +73,7 @@ DEFINE_PER_CPU(struct bnx2i_percpu_s, bnx2i_percpu);
|
||||
/**
|
||||
* bnx2i_identify_device - identifies NetXtreme II device type
|
||||
* @hba: Adapter structure pointer
|
||||
* @cnic: Corresponding cnic device
|
||||
* @dev: Corresponding cnic device
|
||||
*
|
||||
* This function identifies the NX2 device type and sets appropriate
|
||||
* queue mailbox register access method, 5709 requires driver to
|
||||
|
@ -228,7 +228,7 @@ static void bnx2i_setup_cmd_wqe_template(struct bnx2i_cmd *cmd)
|
||||
/**
|
||||
* bnx2i_bind_conn_to_iscsi_cid - bind conn structure to 'iscsi_cid'
|
||||
* @hba: pointer to adapter instance
|
||||
* @conn: pointer to iscsi connection
|
||||
* @bnx2i_conn: pointer to iscsi connection
|
||||
* @iscsi_cid: iscsi context ID, range 0 - (MAX_CONN - 1)
|
||||
*
|
||||
* update iscsi cid table entry with connection pointer. This enables
|
||||
@ -463,7 +463,6 @@ static int bnx2i_alloc_bdt(struct bnx2i_hba *hba, struct iscsi_session *session,
|
||||
* bnx2i_destroy_cmd_pool - destroys iscsi command pool and release BD table
|
||||
* @hba: adapter instance pointer
|
||||
* @session: iscsi session pointer
|
||||
* @cmd: iscsi command structure
|
||||
*/
|
||||
static void bnx2i_destroy_cmd_pool(struct bnx2i_hba *hba,
|
||||
struct iscsi_session *session)
|
||||
@ -582,8 +581,7 @@ static void bnx2i_free_mp_bdt(struct bnx2i_hba *hba)
|
||||
|
||||
/**
|
||||
* bnx2i_drop_session - notifies iscsid of connection error.
|
||||
* @hba: adapter instance pointer
|
||||
* @session: iscsi session pointer
|
||||
* @cls_session: iscsi cls session pointer
|
||||
*
|
||||
* This notifies iscsid that there is a error, so it can initiate
|
||||
* recovery.
|
||||
@ -1277,7 +1275,8 @@ static int bnx2i_task_xmit(struct iscsi_task *task)
|
||||
|
||||
/**
|
||||
* bnx2i_session_create - create a new iscsi session
|
||||
* @cmds_max: max commands supported
|
||||
* @ep: pointer to iscsi endpoint
|
||||
* @cmds_max: user specified maximum commands
|
||||
* @qdepth: scsi queue depth to support
|
||||
* @initial_cmdsn: initial iscsi CMDSN to be used for this session
|
||||
*
|
||||
@ -1971,7 +1970,7 @@ static int bnx2i_ep_poll(struct iscsi_endpoint *ep, int timeout_ms)
|
||||
|
||||
/**
|
||||
* bnx2i_ep_tcp_conn_active - check EP state transition
|
||||
* @ep: endpoint pointer
|
||||
* @bnx2i_ep: endpoint pointer
|
||||
*
|
||||
* check if underlying TCP connection is active
|
||||
*/
|
||||
@ -2014,9 +2013,9 @@ static int bnx2i_ep_tcp_conn_active(struct bnx2i_endpoint *bnx2i_ep)
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
/**
|
||||
* bnx2i_hw_ep_disconnect - executes TCP connection teardown process in the hw
|
||||
* @ep: TCP connection (bnx2i endpoint) handle
|
||||
* @bnx2i_ep: TCP connection (bnx2i endpoint) handle
|
||||
*
|
||||
* executes TCP connection teardown process
|
||||
*/
|
||||
@ -2171,8 +2170,8 @@ out:
|
||||
|
||||
/**
|
||||
* bnx2i_nl_set_path - ISCSI_UEVENT_PATH_UPDATE user message handler
|
||||
* @buf: pointer to buffer containing iscsi path message
|
||||
*
|
||||
* @shost: scsi host pointer
|
||||
* @params: pointer to buffer containing iscsi path message
|
||||
*/
|
||||
static int bnx2i_nl_set_path(struct Scsi_Host *shost, struct iscsi_path *params)
|
||||
{
|
||||
|
@ -30,6 +30,7 @@ static inline struct bnx2i_hba *bnx2i_dev_to_hba(struct device *dev)
|
||||
/**
|
||||
* bnx2i_show_sq_info - return(s currently configured send queue (SQ) size
|
||||
* @dev: device pointer
|
||||
* @attr: device attribute (unused)
|
||||
* @buf: buffer to return current SQ size parameter
|
||||
*
|
||||
* Returns current SQ size parameter, this paramater determines the number
|
||||
@ -47,6 +48,7 @@ static ssize_t bnx2i_show_sq_info(struct device *dev,
|
||||
/**
|
||||
* bnx2i_set_sq_info - update send queue (SQ) size parameter
|
||||
* @dev: device pointer
|
||||
* @attr: device attribute (unused)
|
||||
* @buf: buffer to return current SQ size parameter
|
||||
* @count: parameter buffer size
|
||||
*
|
||||
@ -87,6 +89,7 @@ skip_config:
|
||||
/**
|
||||
* bnx2i_show_ccell_info - returns command cell (HQ) size
|
||||
* @dev: device pointer
|
||||
* @attr: device attribute (unused)
|
||||
* @buf: buffer to return current SQ size parameter
|
||||
*
|
||||
* returns per-connection TCP history queue size parameter
|
||||
@ -103,6 +106,7 @@ static ssize_t bnx2i_show_ccell_info(struct device *dev,
|
||||
/**
|
||||
* bnx2i_get_link_state - set command cell (HQ) size
|
||||
* @dev: device pointer
|
||||
* @attr: device attribute (unused)
|
||||
* @buf: buffer to return current SQ size parameter
|
||||
* @count: parameter buffer size
|
||||
*
|
||||
|
@ -306,7 +306,7 @@ csio_hw_get_vpd_params(struct csio_hw *hw, struct csio_vpd *p)
|
||||
uint8_t *vpd, csum;
|
||||
const struct t4_vpd_hdr *v;
|
||||
/* To get around compilation warning from strstrip */
|
||||
char *s;
|
||||
char __always_unused *s;
|
||||
|
||||
if (csio_is_valid_vpd(hw))
|
||||
return 0;
|
||||
|
@ -148,12 +148,11 @@ csio_t5_mc_read(struct csio_hw *hw, int idx, uint32_t addr, __be32 *data,
|
||||
{
|
||||
int i;
|
||||
uint32_t mc_bist_cmd_reg, mc_bist_cmd_addr_reg, mc_bist_cmd_len_reg;
|
||||
uint32_t mc_bist_status_rdata_reg, mc_bist_data_pattern_reg;
|
||||
uint32_t mc_bist_data_pattern_reg;
|
||||
|
||||
mc_bist_cmd_reg = MC_REG(MC_P_BIST_CMD_A, idx);
|
||||
mc_bist_cmd_addr_reg = MC_REG(MC_P_BIST_CMD_ADDR_A, idx);
|
||||
mc_bist_cmd_len_reg = MC_REG(MC_P_BIST_CMD_LEN_A, idx);
|
||||
mc_bist_status_rdata_reg = MC_REG(MC_P_BIST_STATUS_RDATA_A, idx);
|
||||
mc_bist_data_pattern_reg = MC_REG(MC_P_BIST_DATA_PATTERN_A, idx);
|
||||
|
||||
if (csio_rd_reg32(hw, mc_bist_cmd_reg) & START_BIST_F)
|
||||
@ -196,7 +195,7 @@ csio_t5_edc_read(struct csio_hw *hw, int idx, uint32_t addr, __be32 *data,
|
||||
{
|
||||
int i;
|
||||
uint32_t edc_bist_cmd_reg, edc_bist_cmd_addr_reg, edc_bist_cmd_len_reg;
|
||||
uint32_t edc_bist_cmd_data_pattern, edc_bist_status_rdata_reg;
|
||||
uint32_t edc_bist_cmd_data_pattern;
|
||||
|
||||
/*
|
||||
* These macro are missing in t4_regs.h file.
|
||||
@ -208,7 +207,6 @@ csio_t5_edc_read(struct csio_hw *hw, int idx, uint32_t addr, __be32 *data,
|
||||
edc_bist_cmd_addr_reg = EDC_REG_T5(EDC_H_BIST_CMD_ADDR_A, idx);
|
||||
edc_bist_cmd_len_reg = EDC_REG_T5(EDC_H_BIST_CMD_LEN_A, idx);
|
||||
edc_bist_cmd_data_pattern = EDC_REG_T5(EDC_H_BIST_DATA_PATTERN_A, idx);
|
||||
edc_bist_status_rdata_reg = EDC_REG_T5(EDC_H_BIST_STATUS_RDATA_A, idx);
|
||||
#undef EDC_REG_T5
|
||||
#undef EDC_STRIDE_T5
|
||||
|
||||
|
@ -582,7 +582,7 @@ csio_hw_free(struct csio_hw *hw)
|
||||
* @hw: The HW module.
|
||||
* @dev: The device associated with this invocation.
|
||||
* @probe: Called from probe context or not?
|
||||
* @os_pln: Parent lnode if any.
|
||||
* @pln: Parent lnode if any.
|
||||
*
|
||||
* Allocates lnode structure via scsi_host_alloc, initializes
|
||||
* shost, initializes lnode module and registers with SCSI ML
|
||||
|
@ -2068,10 +2068,9 @@ csio_ln_exit(struct csio_lnode *ln)
|
||||
ln->fcfinfo = NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* csio_lnode_init - Initialize the members of an lnode.
|
||||
* @ln: lnode
|
||||
*
|
||||
*/
|
||||
int
|
||||
csio_lnode_init(struct csio_lnode *ln, struct csio_hw *hw,
|
||||
|
@ -862,7 +862,7 @@ csio_rnode_devloss_handler(struct csio_rnode *rn)
|
||||
/**
|
||||
* csio_rnode_fwevt_handler - Event handler for firmware rnode events.
|
||||
* @rn: rnode
|
||||
*
|
||||
* @fwevt: firmware event to handle
|
||||
*/
|
||||
void
|
||||
csio_rnode_fwevt_handler(struct csio_rnode *rn, uint8_t fwevt)
|
||||
|
@ -361,7 +361,7 @@ static inline void make_tx_data_wr(struct cxgbi_sock *csk, struct sk_buff *skb,
|
||||
/* len includes the length of any HW ULP additions */
|
||||
req->len = htonl(len);
|
||||
/* V_TX_ULP_SUBMODE sets both the mode and submode */
|
||||
req->flags = htonl(V_TX_ULP_SUBMODE(cxgbi_skcb_ulp_mode(skb)) |
|
||||
req->flags = htonl(V_TX_ULP_SUBMODE(cxgbi_skcb_tx_ulp_mode(skb)) |
|
||||
V_TX_SHOVE((skb_peek(&csk->write_queue) ? 0 : 1)));
|
||||
req->sndseq = htonl(csk->snd_nxt);
|
||||
req->param = htonl(V_TX_PORT(l2t->smt_idx));
|
||||
@ -375,10 +375,8 @@ static inline void make_tx_data_wr(struct cxgbi_sock *csk, struct sk_buff *skb,
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* push_tx_frames -- start transmit
|
||||
* @c3cn: the offloaded connection
|
||||
* @req_completion: request wr_ack or not
|
||||
*
|
||||
* Prepends TX_DATA_WR or CPL_CLOSE_CON_REQ headers to buffers waiting in a
|
||||
* connection's send queue and sends them on to T3. Must be called with the
|
||||
@ -442,7 +440,7 @@ static int push_tx_frames(struct cxgbi_sock *csk, int req_completion)
|
||||
req_completion = 1;
|
||||
csk->wr_una_cred = 0;
|
||||
}
|
||||
len += cxgbi_ulp_extra_len(cxgbi_skcb_ulp_mode(skb));
|
||||
len += cxgbi_ulp_extra_len(cxgbi_skcb_tx_ulp_mode(skb));
|
||||
make_tx_data_wr(csk, skb, len, req_completion);
|
||||
csk->snd_nxt += len;
|
||||
cxgbi_skcb_clear_flag(skb, SKCBF_TX_NEED_HDR);
|
||||
@ -886,11 +884,6 @@ free_cpl_skbs:
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
/**
|
||||
* release_offload_resources - release offload resource
|
||||
* @c3cn: the offloaded iscsi tcp connection.
|
||||
* Release resources held by an offload connection (TID, L2T entry, etc.)
|
||||
*/
|
||||
static void l2t_put(struct cxgbi_sock *csk)
|
||||
{
|
||||
struct t3cdev *t3dev = (struct t3cdev *)csk->cdev->lldev;
|
||||
@ -902,6 +895,10 @@ static void l2t_put(struct cxgbi_sock *csk)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* release_offload_resources - release offload resource
|
||||
* Release resources held by an offload connection (TID, L2T entry, etc.)
|
||||
*/
|
||||
static void release_offload_resources(struct cxgbi_sock *csk)
|
||||
{
|
||||
struct t3cdev *t3dev = (struct t3cdev *)csk->cdev->lldev;
|
||||
|
@ -197,7 +197,10 @@ static inline bool is_ofld_imm(const struct sk_buff *skb)
|
||||
if (likely(cxgbi_skcb_test_flag(skb, SKCBF_TX_NEED_HDR)))
|
||||
len += sizeof(struct fw_ofld_tx_data_wr);
|
||||
|
||||
return len <= MAX_IMM_TX_PKT_LEN;
|
||||
if (likely(cxgbi_skcb_test_flag((struct sk_buff *)skb, SKCBF_TX_ISO)))
|
||||
len += sizeof(struct cpl_tx_data_iso);
|
||||
|
||||
return (len <= MAX_IMM_OFLD_TX_DATA_WR_LEN);
|
||||
}
|
||||
|
||||
static void send_act_open_req(struct cxgbi_sock *csk, struct sk_buff *skb,
|
||||
@ -641,7 +644,10 @@ static inline int send_tx_flowc_wr(struct cxgbi_sock *csk)
|
||||
flowc->mnemval[8].mnemonic = 0;
|
||||
flowc->mnemval[8].val = 0;
|
||||
flowc->mnemval[8].mnemonic = FW_FLOWC_MNEM_TXDATAPLEN_MAX;
|
||||
flowc->mnemval[8].val = 16384;
|
||||
if (csk->cdev->skb_iso_txhdr)
|
||||
flowc->mnemval[8].val = cpu_to_be32(CXGBI_MAX_ISO_DATA_IN_SKB);
|
||||
else
|
||||
flowc->mnemval[8].val = cpu_to_be32(16128);
|
||||
#ifdef CONFIG_CHELSIO_T4_DCB
|
||||
flowc->mnemval[9].mnemonic = FW_FLOWC_MNEM_DCBPRIO;
|
||||
if (vlan == CPL_L2T_VLAN_NONE) {
|
||||
@ -667,38 +673,86 @@ static inline int send_tx_flowc_wr(struct cxgbi_sock *csk)
|
||||
return flowclen16;
|
||||
}
|
||||
|
||||
static inline void make_tx_data_wr(struct cxgbi_sock *csk, struct sk_buff *skb,
|
||||
int dlen, int len, u32 credits, int compl)
|
||||
static void
|
||||
cxgb4i_make_tx_iso_cpl(struct sk_buff *skb, struct cpl_tx_data_iso *cpl)
|
||||
{
|
||||
struct cxgbi_iso_info *info = (struct cxgbi_iso_info *)skb->head;
|
||||
u32 imm_en = !!(info->flags & CXGBI_ISO_INFO_IMM_ENABLE);
|
||||
u32 fslice = !!(info->flags & CXGBI_ISO_INFO_FSLICE);
|
||||
u32 lslice = !!(info->flags & CXGBI_ISO_INFO_LSLICE);
|
||||
u32 pdu_type = (info->op == ISCSI_OP_SCSI_CMD) ? 0 : 1;
|
||||
u32 submode = cxgbi_skcb_tx_ulp_mode(skb) & 0x3;
|
||||
|
||||
cpl->op_to_scsi = cpu_to_be32(CPL_TX_DATA_ISO_OP_V(CPL_TX_DATA_ISO) |
|
||||
CPL_TX_DATA_ISO_FIRST_V(fslice) |
|
||||
CPL_TX_DATA_ISO_LAST_V(lslice) |
|
||||
CPL_TX_DATA_ISO_CPLHDRLEN_V(0) |
|
||||
CPL_TX_DATA_ISO_HDRCRC_V(submode & 1) |
|
||||
CPL_TX_DATA_ISO_PLDCRC_V(((submode >> 1) & 1)) |
|
||||
CPL_TX_DATA_ISO_IMMEDIATE_V(imm_en) |
|
||||
CPL_TX_DATA_ISO_SCSI_V(pdu_type));
|
||||
|
||||
cpl->ahs_len = info->ahs;
|
||||
cpl->mpdu = cpu_to_be16(DIV_ROUND_UP(info->mpdu, 4));
|
||||
cpl->burst_size = cpu_to_be32(info->burst_size);
|
||||
cpl->len = cpu_to_be32(info->len);
|
||||
cpl->reserved2_seglen_offset =
|
||||
cpu_to_be32(CPL_TX_DATA_ISO_SEGLEN_OFFSET_V(info->segment_offset));
|
||||
cpl->datasn_offset = cpu_to_be32(info->datasn_offset);
|
||||
cpl->buffer_offset = cpu_to_be32(info->buffer_offset);
|
||||
cpl->reserved3 = cpu_to_be32(0);
|
||||
log_debug(1 << CXGBI_DBG_ISCSI | 1 << CXGBI_DBG_PDU_TX,
|
||||
"iso: flags 0x%x, op %u, ahs %u, num_pdu %u, mpdu %u, "
|
||||
"burst_size %u, iso_len %u\n",
|
||||
info->flags, info->op, info->ahs, info->num_pdu,
|
||||
info->mpdu, info->burst_size << 2, info->len);
|
||||
}
|
||||
|
||||
static void
|
||||
cxgb4i_make_tx_data_wr(struct cxgbi_sock *csk, struct sk_buff *skb, int dlen,
|
||||
int len, u32 credits, int compl)
|
||||
{
|
||||
struct cxgbi_device *cdev = csk->cdev;
|
||||
struct cxgb4_lld_info *lldi = cxgbi_cdev_priv(cdev);
|
||||
struct fw_ofld_tx_data_wr *req;
|
||||
unsigned int submode = cxgbi_skcb_ulp_mode(skb) & 3;
|
||||
unsigned int wr_ulp_mode = 0, val;
|
||||
bool imm = is_ofld_imm(skb);
|
||||
struct cpl_tx_data_iso *cpl;
|
||||
u32 submode = cxgbi_skcb_tx_ulp_mode(skb) & 0x3;
|
||||
u32 wr_ulp_mode = 0;
|
||||
u32 hdr_size = sizeof(*req);
|
||||
u32 opcode = FW_OFLD_TX_DATA_WR;
|
||||
u32 immlen = 0;
|
||||
u32 force = is_t5(lldi->adapter_type) ? TX_FORCE_V(!submode) :
|
||||
T6_TX_FORCE_F;
|
||||
|
||||
req = __skb_push(skb, sizeof(*req));
|
||||
|
||||
if (imm) {
|
||||
req->op_to_immdlen = htonl(FW_WR_OP_V(FW_OFLD_TX_DATA_WR) |
|
||||
FW_WR_COMPL_F |
|
||||
FW_WR_IMMDLEN_V(dlen));
|
||||
req->flowid_len16 = htonl(FW_WR_FLOWID_V(csk->tid) |
|
||||
FW_WR_LEN16_V(credits));
|
||||
} else {
|
||||
req->op_to_immdlen =
|
||||
cpu_to_be32(FW_WR_OP_V(FW_OFLD_TX_DATA_WR) |
|
||||
FW_WR_COMPL_F |
|
||||
FW_WR_IMMDLEN_V(0));
|
||||
req->flowid_len16 =
|
||||
cpu_to_be32(FW_WR_FLOWID_V(csk->tid) |
|
||||
FW_WR_LEN16_V(credits));
|
||||
if (cxgbi_skcb_test_flag(skb, SKCBF_TX_ISO)) {
|
||||
hdr_size += sizeof(struct cpl_tx_data_iso);
|
||||
opcode = FW_ISCSI_TX_DATA_WR;
|
||||
immlen += sizeof(struct cpl_tx_data_iso);
|
||||
submode |= 8;
|
||||
}
|
||||
|
||||
if (is_ofld_imm(skb))
|
||||
immlen += dlen;
|
||||
|
||||
req = (struct fw_ofld_tx_data_wr *)__skb_push(skb, hdr_size);
|
||||
req->op_to_immdlen = cpu_to_be32(FW_WR_OP_V(opcode) |
|
||||
FW_WR_COMPL_V(compl) |
|
||||
FW_WR_IMMDLEN_V(immlen));
|
||||
req->flowid_len16 = cpu_to_be32(FW_WR_FLOWID_V(csk->tid) |
|
||||
FW_WR_LEN16_V(credits));
|
||||
req->plen = cpu_to_be32(len);
|
||||
cpl = (struct cpl_tx_data_iso *)(req + 1);
|
||||
|
||||
if (likely(cxgbi_skcb_test_flag(skb, SKCBF_TX_ISO)))
|
||||
cxgb4i_make_tx_iso_cpl(skb, cpl);
|
||||
|
||||
if (submode)
|
||||
wr_ulp_mode = FW_OFLD_TX_DATA_WR_ULPMODE_V(ULP2_MODE_ISCSI) |
|
||||
FW_OFLD_TX_DATA_WR_ULPSUBMODE_V(submode);
|
||||
val = skb_peek(&csk->write_queue) ? 0 : 1;
|
||||
req->tunnel_to_proxy = htonl(wr_ulp_mode |
|
||||
FW_OFLD_TX_DATA_WR_SHOVE_V(val));
|
||||
req->plen = htonl(len);
|
||||
FW_OFLD_TX_DATA_WR_ULPSUBMODE_V(submode);
|
||||
|
||||
req->tunnel_to_proxy = cpu_to_be32(wr_ulp_mode | force |
|
||||
FW_OFLD_TX_DATA_WR_SHOVE_V(1U));
|
||||
|
||||
if (!cxgbi_sock_flag(csk, CTPF_TX_DATA_SENT))
|
||||
cxgbi_sock_set_flag(csk, CTPF_TX_DATA_SENT);
|
||||
}
|
||||
@ -716,30 +770,34 @@ static int push_tx_frames(struct cxgbi_sock *csk, int req_completion)
|
||||
if (unlikely(csk->state < CTP_ESTABLISHED ||
|
||||
csk->state == CTP_CLOSE_WAIT_1 || csk->state >= CTP_ABORTING)) {
|
||||
log_debug(1 << CXGBI_DBG_TOE | 1 << CXGBI_DBG_SOCK |
|
||||
1 << CXGBI_DBG_PDU_TX,
|
||||
"csk 0x%p,%u,0x%lx,%u, in closing state.\n",
|
||||
csk, csk->state, csk->flags, csk->tid);
|
||||
1 << CXGBI_DBG_PDU_TX,
|
||||
"csk 0x%p,%u,0x%lx,%u, in closing state.\n",
|
||||
csk, csk->state, csk->flags, csk->tid);
|
||||
return 0;
|
||||
}
|
||||
|
||||
while (csk->wr_cred && (skb = skb_peek(&csk->write_queue)) != NULL) {
|
||||
int dlen = skb->len;
|
||||
int len = skb->len;
|
||||
unsigned int credits_needed;
|
||||
int flowclen16 = 0;
|
||||
while (csk->wr_cred && ((skb = skb_peek(&csk->write_queue)) != NULL)) {
|
||||
struct cxgbi_iso_info *iso_cpl;
|
||||
u32 dlen = skb->len;
|
||||
u32 len = skb->len;
|
||||
u32 iso_cpl_len = 0;
|
||||
u32 flowclen16 = 0;
|
||||
u32 credits_needed;
|
||||
u32 num_pdu = 1, hdr_len;
|
||||
|
||||
if (cxgbi_skcb_test_flag(skb, SKCBF_TX_ISO))
|
||||
iso_cpl_len = sizeof(struct cpl_tx_data_iso);
|
||||
|
||||
skb_reset_transport_header(skb);
|
||||
if (is_ofld_imm(skb))
|
||||
credits_needed = DIV_ROUND_UP(dlen, 16);
|
||||
credits_needed = DIV_ROUND_UP(dlen + iso_cpl_len, 16);
|
||||
else
|
||||
credits_needed = DIV_ROUND_UP(
|
||||
8 * calc_tx_flits_ofld(skb),
|
||||
16);
|
||||
credits_needed =
|
||||
DIV_ROUND_UP((8 * calc_tx_flits_ofld(skb)) +
|
||||
iso_cpl_len, 16);
|
||||
|
||||
if (likely(cxgbi_skcb_test_flag(skb, SKCBF_TX_NEED_HDR)))
|
||||
credits_needed += DIV_ROUND_UP(
|
||||
sizeof(struct fw_ofld_tx_data_wr),
|
||||
16);
|
||||
credits_needed +=
|
||||
DIV_ROUND_UP(sizeof(struct fw_ofld_tx_data_wr), 16);
|
||||
|
||||
/*
|
||||
* Assumes the initial credits is large enough to support
|
||||
@ -754,14 +812,19 @@ static int push_tx_frames(struct cxgbi_sock *csk, int req_completion)
|
||||
|
||||
if (csk->wr_cred < credits_needed) {
|
||||
log_debug(1 << CXGBI_DBG_PDU_TX,
|
||||
"csk 0x%p, skb %u/%u, wr %d < %u.\n",
|
||||
csk, skb->len, skb->data_len,
|
||||
credits_needed, csk->wr_cred);
|
||||
"csk 0x%p, skb %u/%u, wr %d < %u.\n",
|
||||
csk, skb->len, skb->data_len,
|
||||
credits_needed, csk->wr_cred);
|
||||
|
||||
csk->no_tx_credits++;
|
||||
break;
|
||||
}
|
||||
|
||||
csk->no_tx_credits = 0;
|
||||
|
||||
__skb_unlink(skb, &csk->write_queue);
|
||||
set_wr_txq(skb, CPL_PRIORITY_DATA, csk->port_id);
|
||||
skb->csum = credits_needed + flowclen16;
|
||||
skb->csum = (__force __wsum)(credits_needed + flowclen16);
|
||||
csk->wr_cred -= credits_needed;
|
||||
csk->wr_una_cred += credits_needed;
|
||||
cxgbi_sock_enqueue_wr(csk, skb);
|
||||
@ -771,25 +834,42 @@ static int push_tx_frames(struct cxgbi_sock *csk, int req_completion)
|
||||
csk, skb->len, skb->data_len, credits_needed,
|
||||
csk->wr_cred, csk->wr_una_cred);
|
||||
|
||||
if (!req_completion &&
|
||||
((csk->wr_una_cred >= (csk->wr_max_cred / 2)) ||
|
||||
after(csk->write_seq, (csk->snd_una + csk->snd_win / 2))))
|
||||
req_completion = 1;
|
||||
|
||||
if (likely(cxgbi_skcb_test_flag(skb, SKCBF_TX_NEED_HDR))) {
|
||||
len += cxgbi_ulp_extra_len(cxgbi_skcb_ulp_mode(skb));
|
||||
make_tx_data_wr(csk, skb, dlen, len, credits_needed,
|
||||
req_completion);
|
||||
u32 ulp_mode = cxgbi_skcb_tx_ulp_mode(skb);
|
||||
|
||||
if (cxgbi_skcb_test_flag(skb, SKCBF_TX_ISO)) {
|
||||
iso_cpl = (struct cxgbi_iso_info *)skb->head;
|
||||
num_pdu = iso_cpl->num_pdu;
|
||||
hdr_len = cxgbi_skcb_tx_iscsi_hdrlen(skb);
|
||||
len += (cxgbi_ulp_extra_len(ulp_mode) * num_pdu) +
|
||||
(hdr_len * (num_pdu - 1));
|
||||
} else {
|
||||
len += cxgbi_ulp_extra_len(ulp_mode);
|
||||
}
|
||||
|
||||
cxgb4i_make_tx_data_wr(csk, skb, dlen, len,
|
||||
credits_needed, req_completion);
|
||||
csk->snd_nxt += len;
|
||||
cxgbi_skcb_clear_flag(skb, SKCBF_TX_NEED_HDR);
|
||||
} else if (cxgbi_skcb_test_flag(skb, SKCBF_TX_FLAG_COMPL) &&
|
||||
(csk->wr_una_cred >= (csk->wr_max_cred / 2))) {
|
||||
struct cpl_close_con_req *req =
|
||||
(struct cpl_close_con_req *)skb->data;
|
||||
req->wr.wr_hi |= htonl(FW_WR_COMPL_F);
|
||||
|
||||
req->wr.wr_hi |= cpu_to_be32(FW_WR_COMPL_F);
|
||||
}
|
||||
|
||||
total_size += skb->truesize;
|
||||
t4_set_arp_err_handler(skb, csk, arp_failure_skb_discard);
|
||||
|
||||
log_debug(1 << CXGBI_DBG_TOE | 1 << CXGBI_DBG_PDU_TX,
|
||||
"csk 0x%p,%u,0x%lx,%u, skb 0x%p, %u.\n",
|
||||
csk, csk->state, csk->flags, csk->tid, skb, len);
|
||||
|
||||
"csk 0x%p,%u,0x%lx,%u, skb 0x%p, %u.\n",
|
||||
csk, csk->state, csk->flags, csk->tid, skb, len);
|
||||
cxgb4_l2t_send(csk->cdev->ports[csk->port_id], skb, csk->l2t);
|
||||
}
|
||||
return total_size;
|
||||
@ -2111,10 +2191,30 @@ static int cxgb4i_ddp_init(struct cxgbi_device *cdev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static bool is_memfree(struct adapter *adap)
|
||||
{
|
||||
u32 io;
|
||||
|
||||
io = t4_read_reg(adap, MA_TARGET_MEM_ENABLE_A);
|
||||
if (is_t5(adap->params.chip)) {
|
||||
if ((io & EXT_MEM0_ENABLE_F) || (io & EXT_MEM1_ENABLE_F))
|
||||
return false;
|
||||
} else if (io & EXT_MEM_ENABLE_F) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static void *t4_uld_add(const struct cxgb4_lld_info *lldi)
|
||||
{
|
||||
struct cxgbi_device *cdev;
|
||||
struct port_info *pi;
|
||||
struct net_device *ndev;
|
||||
struct adapter *adap;
|
||||
struct tid_info *t;
|
||||
u32 max_cmds = CXGB4I_SCSI_HOST_QDEPTH;
|
||||
u32 max_conn = CXGBI_MAX_CONN;
|
||||
int i, rc;
|
||||
|
||||
cdev = cxgbi_device_register(sizeof(*lldi), lldi->nports);
|
||||
@ -2154,14 +2254,40 @@ static void *t4_uld_add(const struct cxgb4_lld_info *lldi)
|
||||
pr_info("t4 0x%p ddp init failed %d.\n", cdev, rc);
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
ndev = cdev->ports[0];
|
||||
adap = netdev2adap(ndev);
|
||||
if (adap) {
|
||||
t = &adap->tids;
|
||||
if (t->ntids <= CXGBI_MAX_CONN)
|
||||
max_conn = t->ntids;
|
||||
|
||||
if (is_memfree(adap)) {
|
||||
cdev->flags |= CXGBI_FLAG_DEV_ISO_OFF;
|
||||
max_cmds = CXGB4I_SCSI_HOST_QDEPTH >> 2;
|
||||
|
||||
pr_info("%s: 0x%p, tid %u, SO adapter.\n",
|
||||
ndev->name, cdev, t->ntids);
|
||||
}
|
||||
} else {
|
||||
pr_info("%s, 0x%p, NO adapter struct.\n", ndev->name, cdev);
|
||||
}
|
||||
|
||||
/* ISO is enabled in T5/T6 firmware version >= 1.13.43.0 */
|
||||
if (!is_t4(lldi->adapter_type) &&
|
||||
(lldi->fw_vers >= 0x10d2b00) &&
|
||||
!(cdev->flags & CXGBI_FLAG_DEV_ISO_OFF))
|
||||
cdev->skb_iso_txhdr = sizeof(struct cpl_tx_data_iso);
|
||||
|
||||
rc = cxgb4i_ofld_init(cdev);
|
||||
if (rc) {
|
||||
pr_info("t4 0x%p ofld init failed.\n", cdev);
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
rc = cxgbi_hbas_add(cdev, CXGB4I_MAX_LUN, CXGBI_MAX_CONN,
|
||||
&cxgb4i_host_template, cxgb4i_stt);
|
||||
cxgb4i_host_template.can_queue = max_cmds;
|
||||
rc = cxgbi_hbas_add(cdev, CXGB4I_MAX_LUN, max_conn,
|
||||
&cxgb4i_host_template, cxgb4i_stt);
|
||||
if (rc)
|
||||
goto err_out;
|
||||
|
||||
|
@ -359,13 +359,15 @@ int cxgbi_hbas_add(struct cxgbi_device *cdev, u64 max_lun,
|
||||
shost->max_lun = max_lun;
|
||||
shost->max_id = max_id;
|
||||
shost->max_channel = 0;
|
||||
shost->max_cmd_len = 16;
|
||||
shost->max_cmd_len = SCSI_MAX_VARLEN_CDB_SIZE;
|
||||
|
||||
chba = iscsi_host_priv(shost);
|
||||
chba->cdev = cdev;
|
||||
chba->ndev = cdev->ports[i];
|
||||
chba->shost = shost;
|
||||
|
||||
shost->can_queue = sht->can_queue - ISCSI_MGMT_CMDS_MAX;
|
||||
|
||||
log_debug(1 << CXGBI_DBG_DEV,
|
||||
"cdev 0x%p, p#%d %s: chba 0x%p.\n",
|
||||
cdev, i, cdev->ports[i]->name, chba);
|
||||
@ -1136,82 +1138,6 @@ void cxgbi_sock_check_wr_invariants(const struct cxgbi_sock *csk)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(cxgbi_sock_check_wr_invariants);
|
||||
|
||||
static int cxgbi_sock_send_pdus(struct cxgbi_sock *csk, struct sk_buff *skb)
|
||||
{
|
||||
struct cxgbi_device *cdev = csk->cdev;
|
||||
struct sk_buff *next;
|
||||
int err, copied = 0;
|
||||
|
||||
spin_lock_bh(&csk->lock);
|
||||
|
||||
if (csk->state != CTP_ESTABLISHED) {
|
||||
log_debug(1 << CXGBI_DBG_PDU_TX,
|
||||
"csk 0x%p,%u,0x%lx,%u, EAGAIN.\n",
|
||||
csk, csk->state, csk->flags, csk->tid);
|
||||
err = -EAGAIN;
|
||||
goto out_err;
|
||||
}
|
||||
|
||||
if (csk->err) {
|
||||
log_debug(1 << CXGBI_DBG_PDU_TX,
|
||||
"csk 0x%p,%u,0x%lx,%u, EPIPE %d.\n",
|
||||
csk, csk->state, csk->flags, csk->tid, csk->err);
|
||||
err = -EPIPE;
|
||||
goto out_err;
|
||||
}
|
||||
|
||||
if (csk->write_seq - csk->snd_una >= csk->snd_win) {
|
||||
log_debug(1 << CXGBI_DBG_PDU_TX,
|
||||
"csk 0x%p,%u,0x%lx,%u, FULL %u-%u >= %u.\n",
|
||||
csk, csk->state, csk->flags, csk->tid, csk->write_seq,
|
||||
csk->snd_una, csk->snd_win);
|
||||
err = -ENOBUFS;
|
||||
goto out_err;
|
||||
}
|
||||
|
||||
while (skb) {
|
||||
int frags = skb_shinfo(skb)->nr_frags +
|
||||
(skb->len != skb->data_len);
|
||||
|
||||
if (unlikely(skb_headroom(skb) < cdev->skb_tx_rsvd)) {
|
||||
pr_err("csk 0x%p, skb head %u < %u.\n",
|
||||
csk, skb_headroom(skb), cdev->skb_tx_rsvd);
|
||||
err = -EINVAL;
|
||||
goto out_err;
|
||||
}
|
||||
|
||||
if (frags >= SKB_WR_LIST_SIZE) {
|
||||
pr_err("csk 0x%p, frags %d, %u,%u >%u.\n",
|
||||
csk, skb_shinfo(skb)->nr_frags, skb->len,
|
||||
skb->data_len, (uint)(SKB_WR_LIST_SIZE));
|
||||
err = -EINVAL;
|
||||
goto out_err;
|
||||
}
|
||||
|
||||
next = skb->next;
|
||||
skb->next = NULL;
|
||||
cxgbi_skcb_set_flag(skb, SKCBF_TX_NEED_HDR);
|
||||
cxgbi_sock_skb_entail(csk, skb);
|
||||
copied += skb->len;
|
||||
csk->write_seq += skb->len +
|
||||
cxgbi_ulp_extra_len(cxgbi_skcb_ulp_mode(skb));
|
||||
skb = next;
|
||||
}
|
||||
|
||||
if (likely(skb_queue_len(&csk->write_queue)))
|
||||
cdev->csk_push_tx_frames(csk, 1);
|
||||
done:
|
||||
spin_unlock_bh(&csk->lock);
|
||||
return copied;
|
||||
|
||||
out_err:
|
||||
if (copied == 0 && err == -EPIPE)
|
||||
copied = csk->err ? csk->err : -EPIPE;
|
||||
else
|
||||
copied = err;
|
||||
goto done;
|
||||
}
|
||||
|
||||
static inline void
|
||||
scmd_get_params(struct scsi_cmnd *sc, struct scatterlist **sgl,
|
||||
unsigned int *sgcnt, unsigned int *dlen,
|
||||
@ -1284,8 +1210,6 @@ EXPORT_SYMBOL_GPL(cxgbi_ddp_set_one_ppod);
|
||||
* APIs interacting with open-iscsi libraries
|
||||
*/
|
||||
|
||||
static unsigned char padding[4];
|
||||
|
||||
int cxgbi_ddp_ppm_setup(void **ppm_pp, struct cxgbi_device *cdev,
|
||||
struct cxgbi_tag_format *tformat,
|
||||
unsigned int iscsi_size, unsigned int llimit,
|
||||
@ -1833,9 +1757,10 @@ static int sgl_seek_offset(struct scatterlist *sgl, unsigned int sgcnt,
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
static int sgl_read_to_frags(struct scatterlist *sg, unsigned int sgoffset,
|
||||
unsigned int dlen, struct page_frag *frags,
|
||||
int frag_max)
|
||||
static int
|
||||
sgl_read_to_frags(struct scatterlist *sg, unsigned int sgoffset,
|
||||
unsigned int dlen, struct page_frag *frags,
|
||||
int frag_max, u32 *dlimit)
|
||||
{
|
||||
unsigned int datalen = dlen;
|
||||
unsigned int sglen = sg->length - sgoffset;
|
||||
@ -1867,6 +1792,7 @@ static int sgl_read_to_frags(struct scatterlist *sg, unsigned int sgoffset,
|
||||
if (i >= frag_max) {
|
||||
pr_warn("too many pages %u, dlen %u.\n",
|
||||
frag_max, dlen);
|
||||
*dlimit = dlen - datalen;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@ -1883,38 +1809,220 @@ static int sgl_read_to_frags(struct scatterlist *sg, unsigned int sgoffset,
|
||||
return i;
|
||||
}
|
||||
|
||||
int cxgbi_conn_alloc_pdu(struct iscsi_task *task, u8 opcode)
|
||||
static void cxgbi_task_data_sgl_check(struct iscsi_task *task)
|
||||
{
|
||||
struct iscsi_tcp_conn *tcp_conn = task->conn->dd_data;
|
||||
struct scsi_cmnd *sc = task->sc;
|
||||
struct cxgbi_task_data *tdata = iscsi_task_cxgbi_data(task);
|
||||
struct scatterlist *sg, *sgl = NULL;
|
||||
u32 sgcnt = 0;
|
||||
int i;
|
||||
|
||||
tdata->flags = CXGBI_TASK_SGL_CHECKED;
|
||||
if (!sc)
|
||||
return;
|
||||
|
||||
scmd_get_params(sc, &sgl, &sgcnt, &tdata->dlen, 0);
|
||||
if (!sgl || !sgcnt) {
|
||||
tdata->flags |= CXGBI_TASK_SGL_COPY;
|
||||
return;
|
||||
}
|
||||
|
||||
for_each_sg(sgl, sg, sgcnt, i) {
|
||||
if (page_count(sg_page(sg)) < 1) {
|
||||
tdata->flags |= CXGBI_TASK_SGL_COPY;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
cxgbi_task_data_sgl_read(struct iscsi_task *task, u32 offset, u32 count,
|
||||
u32 *dlimit)
|
||||
{
|
||||
struct scsi_cmnd *sc = task->sc;
|
||||
struct cxgbi_task_data *tdata = iscsi_task_cxgbi_data(task);
|
||||
struct scatterlist *sgl = NULL;
|
||||
struct scatterlist *sg;
|
||||
u32 dlen = 0;
|
||||
u32 sgcnt;
|
||||
int err;
|
||||
|
||||
if (!sc)
|
||||
return 0;
|
||||
|
||||
scmd_get_params(sc, &sgl, &sgcnt, &dlen, 0);
|
||||
if (!sgl || !sgcnt)
|
||||
return 0;
|
||||
|
||||
err = sgl_seek_offset(sgl, sgcnt, offset, &tdata->sgoffset, &sg);
|
||||
if (err < 0) {
|
||||
pr_warn("tpdu max, sgl %u, bad offset %u/%u.\n",
|
||||
sgcnt, offset, tdata->dlen);
|
||||
return err;
|
||||
}
|
||||
err = sgl_read_to_frags(sg, tdata->sgoffset, count,
|
||||
tdata->frags, MAX_SKB_FRAGS, dlimit);
|
||||
if (err < 0) {
|
||||
log_debug(1 << CXGBI_DBG_ISCSI,
|
||||
"sgl max limit, sgl %u, offset %u, %u/%u, dlimit %u.\n",
|
||||
sgcnt, offset, count, tdata->dlen, *dlimit);
|
||||
return err;
|
||||
}
|
||||
tdata->offset = offset;
|
||||
tdata->count = count;
|
||||
tdata->nr_frags = err;
|
||||
tdata->total_count = count;
|
||||
tdata->total_offset = offset;
|
||||
|
||||
log_debug(1 << CXGBI_DBG_ISCSI | 1 << CXGBI_DBG_PDU_TX,
|
||||
"%s: offset %u, count %u,\n"
|
||||
"err %u, total_count %u, total_offset %u\n",
|
||||
__func__, offset, count, err, tdata->total_count, tdata->total_offset);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int cxgbi_conn_alloc_pdu(struct iscsi_task *task, u8 op)
|
||||
{
|
||||
struct iscsi_conn *conn = task->conn;
|
||||
struct iscsi_session *session = task->conn->session;
|
||||
struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
|
||||
struct cxgbi_conn *cconn = tcp_conn->dd_data;
|
||||
struct cxgbi_device *cdev = cconn->chba->cdev;
|
||||
struct iscsi_conn *conn = task->conn;
|
||||
struct cxgbi_sock *csk = cconn->cep ? cconn->cep->csk : NULL;
|
||||
struct iscsi_tcp_task *tcp_task = task->dd_data;
|
||||
struct cxgbi_task_data *tdata = iscsi_task_cxgbi_data(task);
|
||||
struct scsi_cmnd *sc = task->sc;
|
||||
struct cxgbi_sock *csk = cconn->cep->csk;
|
||||
struct net_device *ndev = cdev->ports[csk->port_id];
|
||||
int headroom = SKB_TX_ISCSI_PDU_HEADER_MAX;
|
||||
u32 headroom = SKB_TX_ISCSI_PDU_HEADER_MAX;
|
||||
u32 max_txdata_len = conn->max_xmit_dlength;
|
||||
u32 iso_tx_rsvd = 0, local_iso_info = 0;
|
||||
u32 last_tdata_offset, last_tdata_count;
|
||||
int err = 0;
|
||||
|
||||
if (!tcp_task) {
|
||||
pr_err("task 0x%p, tcp_task 0x%p, tdata 0x%p.\n",
|
||||
task, tcp_task, tdata);
|
||||
return -ENOMEM;
|
||||
}
|
||||
if (!csk) {
|
||||
pr_err("task 0x%p, csk gone.\n", task);
|
||||
return -EPIPE;
|
||||
}
|
||||
|
||||
op &= ISCSI_OPCODE_MASK;
|
||||
|
||||
tcp_task->dd_data = tdata;
|
||||
task->hdr = NULL;
|
||||
|
||||
if (SKB_MAX_HEAD(cdev->skb_tx_rsvd) > (512 * MAX_SKB_FRAGS) &&
|
||||
(opcode == ISCSI_OP_SCSI_DATA_OUT ||
|
||||
(opcode == ISCSI_OP_SCSI_CMD &&
|
||||
sc->sc_data_direction == DMA_TO_DEVICE)))
|
||||
/* data could goes into skb head */
|
||||
headroom += min_t(unsigned int,
|
||||
SKB_MAX_HEAD(cdev->skb_tx_rsvd),
|
||||
conn->max_xmit_dlength);
|
||||
last_tdata_count = tdata->count;
|
||||
last_tdata_offset = tdata->offset;
|
||||
|
||||
tdata->skb = alloc_skb(cdev->skb_tx_rsvd + headroom, GFP_ATOMIC);
|
||||
if (!tdata->skb) {
|
||||
ndev->stats.tx_dropped++;
|
||||
return -ENOMEM;
|
||||
if ((op == ISCSI_OP_SCSI_DATA_OUT) ||
|
||||
((op == ISCSI_OP_SCSI_CMD) &&
|
||||
(sc->sc_data_direction == DMA_TO_DEVICE))) {
|
||||
u32 remaining_data_tosend, dlimit = 0;
|
||||
u32 max_pdu_size, max_num_pdu, num_pdu;
|
||||
u32 count;
|
||||
|
||||
/* Preserve conn->max_xmit_dlength because it can get updated to
|
||||
* ISO data size.
|
||||
*/
|
||||
if (task->state == ISCSI_TASK_PENDING)
|
||||
tdata->max_xmit_dlength = conn->max_xmit_dlength;
|
||||
|
||||
if (!tdata->offset)
|
||||
cxgbi_task_data_sgl_check(task);
|
||||
|
||||
remaining_data_tosend =
|
||||
tdata->dlen - tdata->offset - tdata->count;
|
||||
|
||||
recalculate_sgl:
|
||||
max_txdata_len = tdata->max_xmit_dlength;
|
||||
log_debug(1 << CXGBI_DBG_ISCSI | 1 << CXGBI_DBG_PDU_TX,
|
||||
"tdata->dlen %u, remaining to send %u "
|
||||
"conn->max_xmit_dlength %u, "
|
||||
"tdata->max_xmit_dlength %u\n",
|
||||
tdata->dlen, remaining_data_tosend,
|
||||
conn->max_xmit_dlength, tdata->max_xmit_dlength);
|
||||
|
||||
if (cdev->skb_iso_txhdr && !csk->disable_iso &&
|
||||
(remaining_data_tosend > tdata->max_xmit_dlength) &&
|
||||
!(remaining_data_tosend % 4)) {
|
||||
u32 max_iso_data;
|
||||
|
||||
if ((op == ISCSI_OP_SCSI_CMD) &&
|
||||
session->initial_r2t_en)
|
||||
goto no_iso;
|
||||
|
||||
max_pdu_size = tdata->max_xmit_dlength +
|
||||
ISCSI_PDU_NONPAYLOAD_LEN;
|
||||
max_iso_data = rounddown(CXGBI_MAX_ISO_DATA_IN_SKB,
|
||||
csk->advmss);
|
||||
max_num_pdu = max_iso_data / max_pdu_size;
|
||||
|
||||
num_pdu = (remaining_data_tosend +
|
||||
tdata->max_xmit_dlength - 1) /
|
||||
tdata->max_xmit_dlength;
|
||||
|
||||
if (num_pdu > max_num_pdu)
|
||||
num_pdu = max_num_pdu;
|
||||
|
||||
conn->max_xmit_dlength = tdata->max_xmit_dlength * num_pdu;
|
||||
max_txdata_len = conn->max_xmit_dlength;
|
||||
iso_tx_rsvd = cdev->skb_iso_txhdr;
|
||||
local_iso_info = sizeof(struct cxgbi_iso_info);
|
||||
|
||||
log_debug(1 << CXGBI_DBG_ISCSI | 1 << CXGBI_DBG_PDU_TX,
|
||||
"max_pdu_size %u, max_num_pdu %u, "
|
||||
"max_txdata %u, num_pdu %u\n",
|
||||
max_pdu_size, max_num_pdu,
|
||||
max_txdata_len, num_pdu);
|
||||
}
|
||||
no_iso:
|
||||
count = min_t(u32, max_txdata_len, remaining_data_tosend);
|
||||
err = cxgbi_task_data_sgl_read(task,
|
||||
tdata->offset + tdata->count,
|
||||
count, &dlimit);
|
||||
if (unlikely(err < 0)) {
|
||||
log_debug(1 << CXGBI_DBG_ISCSI,
|
||||
"task 0x%p, tcp_task 0x%p, tdata 0x%p, "
|
||||
"sgl err %d, count %u, dlimit %u\n",
|
||||
task, tcp_task, tdata, err, count, dlimit);
|
||||
if (dlimit) {
|
||||
remaining_data_tosend =
|
||||
rounddown(dlimit,
|
||||
tdata->max_xmit_dlength);
|
||||
if (!remaining_data_tosend)
|
||||
remaining_data_tosend = dlimit;
|
||||
|
||||
dlimit = 0;
|
||||
|
||||
conn->max_xmit_dlength = remaining_data_tosend;
|
||||
goto recalculate_sgl;
|
||||
}
|
||||
|
||||
pr_err("task 0x%p, tcp_task 0x%p, tdata 0x%p, "
|
||||
"sgl err %d\n",
|
||||
task, tcp_task, tdata, err);
|
||||
goto ret_err;
|
||||
}
|
||||
|
||||
if ((tdata->flags & CXGBI_TASK_SGL_COPY) ||
|
||||
(tdata->nr_frags > MAX_SKB_FRAGS))
|
||||
headroom += conn->max_xmit_dlength;
|
||||
}
|
||||
|
||||
skb_reserve(tdata->skb, cdev->skb_tx_rsvd);
|
||||
tdata->skb = alloc_skb(local_iso_info + cdev->skb_tx_rsvd +
|
||||
iso_tx_rsvd + headroom, GFP_ATOMIC);
|
||||
if (!tdata->skb) {
|
||||
tdata->count = last_tdata_count;
|
||||
tdata->offset = last_tdata_offset;
|
||||
err = -ENOMEM;
|
||||
goto ret_err;
|
||||
}
|
||||
|
||||
skb_reserve(tdata->skb, local_iso_info + cdev->skb_tx_rsvd +
|
||||
iso_tx_rsvd);
|
||||
|
||||
if (task->sc) {
|
||||
task->hdr = (struct iscsi_hdr *)tdata->skb->data;
|
||||
@ -1923,25 +2031,100 @@ int cxgbi_conn_alloc_pdu(struct iscsi_task *task, u8 opcode)
|
||||
if (!task->hdr) {
|
||||
__kfree_skb(tdata->skb);
|
||||
tdata->skb = NULL;
|
||||
ndev->stats.tx_dropped++;
|
||||
return -ENOMEM;
|
||||
}
|
||||
}
|
||||
task->hdr_max = SKB_TX_ISCSI_PDU_HEADER_MAX; /* BHS + AHS */
|
||||
|
||||
task->hdr_max = SKB_TX_ISCSI_PDU_HEADER_MAX;
|
||||
|
||||
if (iso_tx_rsvd)
|
||||
cxgbi_skcb_set_flag(tdata->skb, SKCBF_TX_ISO);
|
||||
|
||||
/* data_out uses scsi_cmd's itt */
|
||||
if (opcode != ISCSI_OP_SCSI_DATA_OUT)
|
||||
if (op != ISCSI_OP_SCSI_DATA_OUT)
|
||||
task_reserve_itt(task, &task->hdr->itt);
|
||||
|
||||
log_debug(1 << CXGBI_DBG_ISCSI | 1 << CXGBI_DBG_PDU_TX,
|
||||
"task 0x%p, op 0x%x, skb 0x%p,%u+%u/%u, itt 0x%x.\n",
|
||||
task, opcode, tdata->skb, cdev->skb_tx_rsvd, headroom,
|
||||
conn->max_xmit_dlength, ntohl(task->hdr->itt));
|
||||
"task 0x%p, op 0x%x, skb 0x%p,%u+%u/%u, itt 0x%x.\n",
|
||||
task, op, tdata->skb, cdev->skb_tx_rsvd, headroom,
|
||||
conn->max_xmit_dlength, be32_to_cpu(task->hdr->itt));
|
||||
|
||||
return 0;
|
||||
|
||||
ret_err:
|
||||
conn->max_xmit_dlength = tdata->max_xmit_dlength;
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(cxgbi_conn_alloc_pdu);
|
||||
|
||||
static int
|
||||
cxgbi_prep_iso_info(struct iscsi_task *task, struct sk_buff *skb,
|
||||
u32 count)
|
||||
{
|
||||
struct cxgbi_iso_info *iso_info = (struct cxgbi_iso_info *)skb->head;
|
||||
struct iscsi_r2t_info *r2t;
|
||||
struct cxgbi_task_data *tdata = iscsi_task_cxgbi_data(task);
|
||||
struct iscsi_conn *conn = task->conn;
|
||||
struct iscsi_session *session = conn->session;
|
||||
struct iscsi_tcp_task *tcp_task = task->dd_data;
|
||||
u32 burst_size = 0, r2t_dlength = 0, dlength;
|
||||
u32 max_pdu_len = tdata->max_xmit_dlength;
|
||||
u32 segment_offset = 0;
|
||||
u32 num_pdu;
|
||||
|
||||
if (unlikely(!cxgbi_skcb_test_flag(skb, SKCBF_TX_ISO)))
|
||||
return 0;
|
||||
|
||||
memset(iso_info, 0, sizeof(struct cxgbi_iso_info));
|
||||
|
||||
if (task->hdr->opcode == ISCSI_OP_SCSI_CMD && session->imm_data_en) {
|
||||
iso_info->flags |= CXGBI_ISO_INFO_IMM_ENABLE;
|
||||
burst_size = count;
|
||||
}
|
||||
|
||||
dlength = ntoh24(task->hdr->dlength);
|
||||
dlength = min(dlength, max_pdu_len);
|
||||
hton24(task->hdr->dlength, dlength);
|
||||
|
||||
num_pdu = (count + max_pdu_len - 1) / max_pdu_len;
|
||||
|
||||
if (iscsi_task_has_unsol_data(task))
|
||||
r2t = &task->unsol_r2t;
|
||||
else
|
||||
r2t = tcp_task->r2t;
|
||||
|
||||
if (r2t) {
|
||||
log_debug(1 << CXGBI_DBG_ISCSI | 1 << CXGBI_DBG_PDU_TX,
|
||||
"count %u, tdata->count %u, num_pdu %u,"
|
||||
"task->hdr_len %u, r2t->data_length %u, r2t->sent %u\n",
|
||||
count, tdata->count, num_pdu, task->hdr_len,
|
||||
r2t->data_length, r2t->sent);
|
||||
|
||||
r2t_dlength = r2t->data_length - r2t->sent;
|
||||
segment_offset = r2t->sent;
|
||||
r2t->datasn += num_pdu - 1;
|
||||
}
|
||||
|
||||
if (!r2t || !r2t->sent)
|
||||
iso_info->flags |= CXGBI_ISO_INFO_FSLICE;
|
||||
|
||||
if (task->hdr->flags & ISCSI_FLAG_CMD_FINAL)
|
||||
iso_info->flags |= CXGBI_ISO_INFO_LSLICE;
|
||||
|
||||
task->hdr->flags &= ~ISCSI_FLAG_CMD_FINAL;
|
||||
|
||||
iso_info->op = task->hdr->opcode;
|
||||
iso_info->ahs = task->hdr->hlength;
|
||||
iso_info->num_pdu = num_pdu;
|
||||
iso_info->mpdu = max_pdu_len;
|
||||
iso_info->burst_size = (burst_size + r2t_dlength) >> 2;
|
||||
iso_info->len = count + task->hdr_len;
|
||||
iso_info->segment_offset = segment_offset;
|
||||
|
||||
cxgbi_skcb_tx_iscsi_hdrlen(skb) = task->hdr_len;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void tx_skb_setmode(struct sk_buff *skb, int hcrc, int dcrc)
|
||||
{
|
||||
if (hcrc || dcrc) {
|
||||
@ -1951,133 +2134,260 @@ static inline void tx_skb_setmode(struct sk_buff *skb, int hcrc, int dcrc)
|
||||
submode |= 1;
|
||||
if (dcrc)
|
||||
submode |= 2;
|
||||
cxgbi_skcb_ulp_mode(skb) = (ULP2_MODE_ISCSI << 4) | submode;
|
||||
cxgbi_skcb_tx_ulp_mode(skb) = (ULP2_MODE_ISCSI << 4) | submode;
|
||||
} else
|
||||
cxgbi_skcb_ulp_mode(skb) = 0;
|
||||
cxgbi_skcb_tx_ulp_mode(skb) = 0;
|
||||
}
|
||||
|
||||
static struct page *rsvd_page;
|
||||
|
||||
int cxgbi_conn_init_pdu(struct iscsi_task *task, unsigned int offset,
|
||||
unsigned int count)
|
||||
{
|
||||
struct iscsi_conn *conn = task->conn;
|
||||
struct iscsi_tcp_task *tcp_task = task->dd_data;
|
||||
struct cxgbi_task_data *tdata = iscsi_task_cxgbi_data(task);
|
||||
struct sk_buff *skb = tdata->skb;
|
||||
unsigned int datalen = count;
|
||||
int i, padlen = iscsi_padding(count);
|
||||
struct sk_buff *skb;
|
||||
struct scsi_cmnd *sc = task->sc;
|
||||
u32 expected_count, expected_offset;
|
||||
u32 datalen = count, dlimit = 0;
|
||||
u32 i, padlen = iscsi_padding(count);
|
||||
struct page *pg;
|
||||
int err;
|
||||
|
||||
if (!tcp_task || (tcp_task->dd_data != tdata)) {
|
||||
pr_err("task 0x%p,0x%p, tcp_task 0x%p, tdata 0x%p/0x%p.\n",
|
||||
task, task->sc, tcp_task,
|
||||
tcp_task ? tcp_task->dd_data : NULL, tdata);
|
||||
return -EINVAL;
|
||||
}
|
||||
skb = tdata->skb;
|
||||
|
||||
log_debug(1 << CXGBI_DBG_ISCSI | 1 << CXGBI_DBG_PDU_TX,
|
||||
"task 0x%p,0x%p, skb 0x%p, 0x%x,0x%x,0x%x, %u+%u.\n",
|
||||
task, task->sc, skb, (*skb->data) & ISCSI_OPCODE_MASK,
|
||||
ntohl(task->cmdsn), ntohl(task->hdr->itt), offset, count);
|
||||
"task 0x%p,0x%p, skb 0x%p, 0x%x,0x%x,0x%x, %u+%u.\n",
|
||||
task, task->sc, skb, (*skb->data) & ISCSI_OPCODE_MASK,
|
||||
be32_to_cpu(task->cmdsn), be32_to_cpu(task->hdr->itt), offset, count);
|
||||
|
||||
skb_put(skb, task->hdr_len);
|
||||
tx_skb_setmode(skb, conn->hdrdgst_en, datalen ? conn->datadgst_en : 0);
|
||||
if (!count)
|
||||
return 0;
|
||||
|
||||
if (task->sc) {
|
||||
struct scsi_data_buffer *sdb = &task->sc->sdb;
|
||||
struct scatterlist *sg = NULL;
|
||||
int err;
|
||||
|
||||
tdata->offset = offset;
|
||||
if (!count) {
|
||||
tdata->count = count;
|
||||
err = sgl_seek_offset(
|
||||
sdb->table.sgl, sdb->table.nents,
|
||||
tdata->offset, &tdata->sgoffset, &sg);
|
||||
if (err < 0) {
|
||||
pr_warn("tpdu, sgl %u, bad offset %u/%u.\n",
|
||||
sdb->table.nents, tdata->offset, sdb->length);
|
||||
return err;
|
||||
}
|
||||
err = sgl_read_to_frags(sg, tdata->sgoffset, tdata->count,
|
||||
tdata->frags, MAX_PDU_FRAGS);
|
||||
if (err < 0) {
|
||||
pr_warn("tpdu, sgl %u, bad offset %u + %u.\n",
|
||||
sdb->table.nents, tdata->offset, tdata->count);
|
||||
return err;
|
||||
}
|
||||
tdata->nr_frags = err;
|
||||
tdata->offset = offset;
|
||||
tdata->nr_frags = 0;
|
||||
tdata->total_offset = 0;
|
||||
tdata->total_count = 0;
|
||||
if (tdata->max_xmit_dlength)
|
||||
conn->max_xmit_dlength = tdata->max_xmit_dlength;
|
||||
cxgbi_skcb_clear_flag(skb, SKCBF_TX_ISO);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (tdata->nr_frags > MAX_SKB_FRAGS ||
|
||||
(padlen && tdata->nr_frags == MAX_SKB_FRAGS)) {
|
||||
log_debug(1 << CXGBI_DBG_ISCSI | 1 << CXGBI_DBG_PDU_TX,
|
||||
"data->total_count %u, tdata->total_offset %u\n",
|
||||
tdata->total_count, tdata->total_offset);
|
||||
|
||||
expected_count = tdata->total_count;
|
||||
expected_offset = tdata->total_offset;
|
||||
|
||||
if ((count != expected_count) ||
|
||||
(offset != expected_offset)) {
|
||||
err = cxgbi_task_data_sgl_read(task, offset, count, &dlimit);
|
||||
if (err < 0) {
|
||||
pr_err("task 0x%p,0x%p, tcp_task 0x%p, tdata 0x%p/0x%p "
|
||||
"dlimit %u, sgl err %d.\n", task, task->sc,
|
||||
tcp_task, tcp_task ? tcp_task->dd_data : NULL,
|
||||
tdata, dlimit, err);
|
||||
return err;
|
||||
}
|
||||
}
|
||||
|
||||
/* Restore original value of conn->max_xmit_dlength because
|
||||
* it can get updated to ISO data size.
|
||||
*/
|
||||
conn->max_xmit_dlength = tdata->max_xmit_dlength;
|
||||
|
||||
if (sc) {
|
||||
struct page_frag *frag = tdata->frags;
|
||||
|
||||
if ((tdata->flags & CXGBI_TASK_SGL_COPY) ||
|
||||
(tdata->nr_frags > MAX_SKB_FRAGS) ||
|
||||
(padlen && (tdata->nr_frags ==
|
||||
MAX_SKB_FRAGS))) {
|
||||
char *dst = skb->data + task->hdr_len;
|
||||
struct page_frag *frag = tdata->frags;
|
||||
|
||||
/* data fits in the skb's headroom */
|
||||
for (i = 0; i < tdata->nr_frags; i++, frag++) {
|
||||
char *src = kmap_atomic(frag->page);
|
||||
|
||||
memcpy(dst, src+frag->offset, frag->size);
|
||||
memcpy(dst, src + frag->offset, frag->size);
|
||||
dst += frag->size;
|
||||
kunmap_atomic(src);
|
||||
}
|
||||
|
||||
if (padlen) {
|
||||
memset(dst, 0, padlen);
|
||||
padlen = 0;
|
||||
}
|
||||
skb_put(skb, count + padlen);
|
||||
} else {
|
||||
/* data fit into frag_list */
|
||||
for (i = 0; i < tdata->nr_frags; i++) {
|
||||
__skb_fill_page_desc(skb, i,
|
||||
tdata->frags[i].page,
|
||||
tdata->frags[i].offset,
|
||||
tdata->frags[i].size);
|
||||
skb_frag_ref(skb, i);
|
||||
for (i = 0; i < tdata->nr_frags; i++, frag++) {
|
||||
get_page(frag->page);
|
||||
skb_fill_page_desc(skb, i, frag->page,
|
||||
frag->offset, frag->size);
|
||||
}
|
||||
skb_shinfo(skb)->nr_frags = tdata->nr_frags;
|
||||
|
||||
skb->len += count;
|
||||
skb->data_len += count;
|
||||
skb->truesize += count;
|
||||
}
|
||||
|
||||
} else {
|
||||
pg = virt_to_page(task->data);
|
||||
|
||||
pg = virt_to_head_page(task->data);
|
||||
get_page(pg);
|
||||
skb_fill_page_desc(skb, 0, pg, offset_in_page(task->data),
|
||||
count);
|
||||
skb_fill_page_desc(skb, 0, pg,
|
||||
task->data - (char *)page_address(pg),
|
||||
count);
|
||||
skb->len += count;
|
||||
skb->data_len += count;
|
||||
skb->truesize += count;
|
||||
}
|
||||
|
||||
if (padlen) {
|
||||
i = skb_shinfo(skb)->nr_frags;
|
||||
get_page(rsvd_page);
|
||||
skb_fill_page_desc(skb, skb_shinfo(skb)->nr_frags,
|
||||
virt_to_page(padding), offset_in_page(padding),
|
||||
padlen);
|
||||
rsvd_page, 0, padlen);
|
||||
|
||||
skb->data_len += padlen;
|
||||
skb->truesize += padlen;
|
||||
skb->len += padlen;
|
||||
}
|
||||
|
||||
if (likely(count > tdata->max_xmit_dlength))
|
||||
cxgbi_prep_iso_info(task, skb, count);
|
||||
else
|
||||
cxgbi_skcb_clear_flag(skb, SKCBF_TX_ISO);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(cxgbi_conn_init_pdu);
|
||||
|
||||
static int cxgbi_sock_tx_queue_up(struct cxgbi_sock *csk, struct sk_buff *skb)
|
||||
{
|
||||
struct cxgbi_device *cdev = csk->cdev;
|
||||
struct cxgbi_iso_info *iso_cpl;
|
||||
u32 frags = skb_shinfo(skb)->nr_frags;
|
||||
u32 extra_len, num_pdu, hdr_len;
|
||||
u32 iso_tx_rsvd = 0;
|
||||
|
||||
if (csk->state != CTP_ESTABLISHED) {
|
||||
log_debug(1 << CXGBI_DBG_PDU_TX,
|
||||
"csk 0x%p,%u,0x%lx,%u, EAGAIN.\n",
|
||||
csk, csk->state, csk->flags, csk->tid);
|
||||
return -EPIPE;
|
||||
}
|
||||
|
||||
if (csk->err) {
|
||||
log_debug(1 << CXGBI_DBG_PDU_TX,
|
||||
"csk 0x%p,%u,0x%lx,%u, EPIPE %d.\n",
|
||||
csk, csk->state, csk->flags, csk->tid, csk->err);
|
||||
return -EPIPE;
|
||||
}
|
||||
|
||||
if ((cdev->flags & CXGBI_FLAG_DEV_T3) &&
|
||||
before((csk->snd_win + csk->snd_una), csk->write_seq)) {
|
||||
log_debug(1 << CXGBI_DBG_PDU_TX,
|
||||
"csk 0x%p,%u,0x%lx,%u, FULL %u-%u >= %u.\n",
|
||||
csk, csk->state, csk->flags, csk->tid, csk->write_seq,
|
||||
csk->snd_una, csk->snd_win);
|
||||
return -ENOBUFS;
|
||||
}
|
||||
|
||||
if (cxgbi_skcb_test_flag(skb, SKCBF_TX_ISO))
|
||||
iso_tx_rsvd = cdev->skb_iso_txhdr;
|
||||
|
||||
if (unlikely(skb_headroom(skb) < (cdev->skb_tx_rsvd + iso_tx_rsvd))) {
|
||||
pr_err("csk 0x%p, skb head %u < %u.\n",
|
||||
csk, skb_headroom(skb), cdev->skb_tx_rsvd);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (skb->len != skb->data_len)
|
||||
frags++;
|
||||
|
||||
if (frags >= SKB_WR_LIST_SIZE) {
|
||||
pr_err("csk 0x%p, frags %u, %u,%u >%lu.\n",
|
||||
csk, skb_shinfo(skb)->nr_frags, skb->len,
|
||||
skb->data_len, SKB_WR_LIST_SIZE);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
cxgbi_skcb_set_flag(skb, SKCBF_TX_NEED_HDR);
|
||||
skb_reset_transport_header(skb);
|
||||
cxgbi_sock_skb_entail(csk, skb);
|
||||
|
||||
extra_len = cxgbi_ulp_extra_len(cxgbi_skcb_tx_ulp_mode(skb));
|
||||
|
||||
if (likely(cxgbi_skcb_test_flag(skb, SKCBF_TX_ISO))) {
|
||||
iso_cpl = (struct cxgbi_iso_info *)skb->head;
|
||||
num_pdu = iso_cpl->num_pdu;
|
||||
hdr_len = cxgbi_skcb_tx_iscsi_hdrlen(skb);
|
||||
extra_len = (cxgbi_ulp_extra_len(cxgbi_skcb_tx_ulp_mode(skb)) *
|
||||
num_pdu) + (hdr_len * (num_pdu - 1));
|
||||
}
|
||||
|
||||
csk->write_seq += (skb->len + extra_len);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cxgbi_sock_send_skb(struct cxgbi_sock *csk, struct sk_buff *skb)
|
||||
{
|
||||
struct cxgbi_device *cdev = csk->cdev;
|
||||
int len = skb->len;
|
||||
int err;
|
||||
|
||||
spin_lock_bh(&csk->lock);
|
||||
err = cxgbi_sock_tx_queue_up(csk, skb);
|
||||
if (err < 0) {
|
||||
spin_unlock_bh(&csk->lock);
|
||||
return err;
|
||||
}
|
||||
|
||||
if (likely(skb_queue_len(&csk->write_queue)))
|
||||
cdev->csk_push_tx_frames(csk, 0);
|
||||
spin_unlock_bh(&csk->lock);
|
||||
return len;
|
||||
}
|
||||
|
||||
int cxgbi_conn_xmit_pdu(struct iscsi_task *task)
|
||||
{
|
||||
struct iscsi_tcp_conn *tcp_conn = task->conn->dd_data;
|
||||
struct cxgbi_conn *cconn = tcp_conn->dd_data;
|
||||
struct iscsi_tcp_task *tcp_task = task->dd_data;
|
||||
struct cxgbi_task_data *tdata = iscsi_task_cxgbi_data(task);
|
||||
struct cxgbi_task_tag_info *ttinfo = &tdata->ttinfo;
|
||||
struct sk_buff *skb = tdata->skb;
|
||||
struct sk_buff *skb;
|
||||
struct cxgbi_sock *csk = NULL;
|
||||
unsigned int datalen;
|
||||
u32 pdulen = 0;
|
||||
u32 datalen;
|
||||
int err;
|
||||
|
||||
if (!tcp_task || (tcp_task->dd_data != tdata)) {
|
||||
pr_err("task 0x%p,0x%p, tcp_task 0x%p, tdata 0x%p/0x%p.\n",
|
||||
task, task->sc, tcp_task,
|
||||
tcp_task ? tcp_task->dd_data : NULL, tdata);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
skb = tdata->skb;
|
||||
if (!skb) {
|
||||
log_debug(1 << CXGBI_DBG_ISCSI | 1 << CXGBI_DBG_PDU_TX,
|
||||
"task 0x%p\n", task);
|
||||
"task 0x%p, skb NULL.\n", task);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (cconn && cconn->cep)
|
||||
csk = cconn->cep->csk;
|
||||
|
||||
if (!csk) {
|
||||
log_debug(1 << CXGBI_DBG_ISCSI | 1 << CXGBI_DBG_PDU_TX,
|
||||
"task 0x%p, csk gone.\n", task);
|
||||
@ -2101,13 +2411,12 @@ int cxgbi_conn_xmit_pdu(struct iscsi_task *task)
|
||||
if (!task->sc)
|
||||
memcpy(skb->data, task->hdr, SKB_TX_ISCSI_PDU_HEADER_MAX);
|
||||
|
||||
err = cxgbi_sock_send_pdus(cconn->cep->csk, skb);
|
||||
err = cxgbi_sock_send_skb(csk, skb);
|
||||
if (err > 0) {
|
||||
int pdulen = err;
|
||||
pdulen += err;
|
||||
|
||||
log_debug(1 << CXGBI_DBG_PDU_TX,
|
||||
"task 0x%p,0x%p, skb 0x%p, len %u/%u, rv %d.\n",
|
||||
task, task->sc, skb, skb->len, skb->data_len, err);
|
||||
log_debug(1 << CXGBI_DBG_PDU_TX, "task 0x%p,0x%p, rv %d.\n",
|
||||
task, task->sc, err);
|
||||
|
||||
if (task->conn->hdrdgst_en)
|
||||
pdulen += ISCSI_DIGEST_SIZE;
|
||||
@ -2116,24 +2425,42 @@ int cxgbi_conn_xmit_pdu(struct iscsi_task *task)
|
||||
pdulen += ISCSI_DIGEST_SIZE;
|
||||
|
||||
task->conn->txdata_octets += pdulen;
|
||||
|
||||
if (unlikely(cxgbi_is_iso_config(csk) && cxgbi_is_iso_disabled(csk))) {
|
||||
if (time_after(jiffies, csk->prev_iso_ts + HZ)) {
|
||||
csk->disable_iso = false;
|
||||
csk->prev_iso_ts = 0;
|
||||
log_debug(1 << CXGBI_DBG_PDU_TX,
|
||||
"enable iso: csk 0x%p\n", csk);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (err == -EAGAIN || err == -ENOBUFS) {
|
||||
log_debug(1 << CXGBI_DBG_PDU_TX,
|
||||
"task 0x%p, skb 0x%p, len %u/%u, %d EAGAIN.\n",
|
||||
task, skb, skb->len, skb->data_len, err);
|
||||
"task 0x%p, skb 0x%p, len %u/%u, %d EAGAIN.\n",
|
||||
task, skb, skb->len, skb->data_len, err);
|
||||
/* reset skb to send when we are called again */
|
||||
tdata->skb = skb;
|
||||
|
||||
if (cxgbi_is_iso_config(csk) && !cxgbi_is_iso_disabled(csk) &&
|
||||
(csk->no_tx_credits++ >= 2)) {
|
||||
csk->disable_iso = true;
|
||||
csk->prev_iso_ts = jiffies;
|
||||
log_debug(1 << CXGBI_DBG_PDU_TX,
|
||||
"disable iso:csk 0x%p, ts:%lu\n",
|
||||
csk, csk->prev_iso_ts);
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
log_debug(1 << CXGBI_DBG_ISCSI | 1 << CXGBI_DBG_PDU_TX,
|
||||
"itt 0x%x, skb 0x%p, len %u/%u, xmit err %d.\n",
|
||||
task->itt, skb, skb->len, skb->data_len, err);
|
||||
|
||||
__kfree_skb(skb);
|
||||
|
||||
log_debug(1 << CXGBI_DBG_ISCSI | 1 << CXGBI_DBG_PDU_TX,
|
||||
"itt 0x%x, skb 0x%p, len %u/%u, xmit err %d.\n",
|
||||
task->itt, skb, skb->len, skb->data_len, err);
|
||||
iscsi_conn_printk(KERN_ERR, task->conn, "xmit err %d.\n", err);
|
||||
iscsi_conn_failure(task->conn, ISCSI_ERR_XMIT_FAILED);
|
||||
return err;
|
||||
@ -2145,7 +2472,7 @@ void cxgbi_cleanup_task(struct iscsi_task *task)
|
||||
struct iscsi_tcp_task *tcp_task = task->dd_data;
|
||||
struct cxgbi_task_data *tdata = iscsi_task_cxgbi_data(task);
|
||||
|
||||
if (!tcp_task || !tdata || (tcp_task->dd_data != tdata)) {
|
||||
if (!tcp_task || (tcp_task->dd_data != tdata)) {
|
||||
pr_info("task 0x%p,0x%p, tcp_task 0x%p, tdata 0x%p/0x%p.\n",
|
||||
task, task->sc, tcp_task,
|
||||
tcp_task ? tcp_task->dd_data : NULL, tdata);
|
||||
@ -2749,12 +3076,17 @@ static int __init libcxgbi_init_module(void)
|
||||
|
||||
BUILD_BUG_ON(sizeof_field(struct sk_buff, cb) <
|
||||
sizeof(struct cxgbi_skb_cb));
|
||||
rsvd_page = alloc_page(GFP_KERNEL | __GFP_ZERO);
|
||||
if (!rsvd_page)
|
||||
return -ENOMEM;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __exit libcxgbi_exit_module(void)
|
||||
{
|
||||
cxgbi_device_unregister_all(0xFF);
|
||||
put_page(rsvd_page);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -76,6 +76,14 @@ do { \
|
||||
#define ULP2_MAX_PDU_PAYLOAD \
|
||||
(ULP2_MAX_PKT_SIZE - ISCSI_PDU_NONPAYLOAD_LEN)
|
||||
|
||||
#define CXGBI_ULP2_MAX_ISO_PAYLOAD 65535
|
||||
|
||||
#define CXGBI_MAX_ISO_DATA_IN_SKB \
|
||||
min_t(u32, MAX_SKB_FRAGS << PAGE_SHIFT, CXGBI_ULP2_MAX_ISO_PAYLOAD)
|
||||
|
||||
#define cxgbi_is_iso_config(csk) ((csk)->cdev->skb_iso_txhdr)
|
||||
#define cxgbi_is_iso_disabled(csk) ((csk)->disable_iso)
|
||||
|
||||
/*
|
||||
* For iscsi connections HW may inserts digest bytes into the pdu. Those digest
|
||||
* bytes are not sent by the host but are part of the TCP payload and therefore
|
||||
@ -162,6 +170,10 @@ struct cxgbi_sock {
|
||||
u32 write_seq;
|
||||
u32 snd_win;
|
||||
u32 rcv_win;
|
||||
|
||||
bool disable_iso;
|
||||
u32 no_tx_credits;
|
||||
unsigned long prev_iso_ts;
|
||||
};
|
||||
|
||||
/*
|
||||
@ -203,6 +215,8 @@ struct cxgbi_skb_tx_cb {
|
||||
void *handle;
|
||||
void *arp_err_handler;
|
||||
struct sk_buff *wr_next;
|
||||
u16 iscsi_hdr_len;
|
||||
u8 ulp_mode;
|
||||
};
|
||||
|
||||
enum cxgbi_skcb_flags {
|
||||
@ -218,6 +232,7 @@ enum cxgbi_skcb_flags {
|
||||
SKCBF_RX_HCRC_ERR, /* header digest error */
|
||||
SKCBF_RX_DCRC_ERR, /* data digest error */
|
||||
SKCBF_RX_PAD_ERR, /* padding byte error */
|
||||
SKCBF_TX_ISO, /* iso cpl in tx skb */
|
||||
};
|
||||
|
||||
struct cxgbi_skb_cb {
|
||||
@ -225,18 +240,18 @@ struct cxgbi_skb_cb {
|
||||
struct cxgbi_skb_rx_cb rx;
|
||||
struct cxgbi_skb_tx_cb tx;
|
||||
};
|
||||
unsigned char ulp_mode;
|
||||
unsigned long flags;
|
||||
unsigned int seq;
|
||||
};
|
||||
|
||||
#define CXGBI_SKB_CB(skb) ((struct cxgbi_skb_cb *)&((skb)->cb[0]))
|
||||
#define cxgbi_skcb_flags(skb) (CXGBI_SKB_CB(skb)->flags)
|
||||
#define cxgbi_skcb_ulp_mode(skb) (CXGBI_SKB_CB(skb)->ulp_mode)
|
||||
#define cxgbi_skcb_tcp_seq(skb) (CXGBI_SKB_CB(skb)->seq)
|
||||
#define cxgbi_skcb_rx_ddigest(skb) (CXGBI_SKB_CB(skb)->rx.ddigest)
|
||||
#define cxgbi_skcb_rx_pdulen(skb) (CXGBI_SKB_CB(skb)->rx.pdulen)
|
||||
#define cxgbi_skcb_tx_wr_next(skb) (CXGBI_SKB_CB(skb)->tx.wr_next)
|
||||
#define cxgbi_skcb_tx_iscsi_hdrlen(skb) (CXGBI_SKB_CB(skb)->tx.iscsi_hdr_len)
|
||||
#define cxgbi_skcb_tx_ulp_mode(skb) (CXGBI_SKB_CB(skb)->tx.ulp_mode)
|
||||
|
||||
static inline void cxgbi_skcb_set_flag(struct sk_buff *skb,
|
||||
enum cxgbi_skcb_flags flag)
|
||||
@ -458,6 +473,7 @@ struct cxgbi_ports_map {
|
||||
#define CXGBI_FLAG_IPV4_SET 0x10
|
||||
#define CXGBI_FLAG_USE_PPOD_OFLDQ 0x40
|
||||
#define CXGBI_FLAG_DDP_OFF 0x100
|
||||
#define CXGBI_FLAG_DEV_ISO_OFF 0x400
|
||||
|
||||
struct cxgbi_device {
|
||||
struct list_head list_head;
|
||||
@ -477,6 +493,7 @@ struct cxgbi_device {
|
||||
unsigned int pfvf;
|
||||
unsigned int rx_credit_thres;
|
||||
unsigned int skb_tx_rsvd;
|
||||
u32 skb_iso_txhdr;
|
||||
unsigned int skb_rx_extra; /* for msg coalesced mode */
|
||||
unsigned int tx_max_size;
|
||||
unsigned int rx_max_size;
|
||||
@ -523,20 +540,41 @@ struct cxgbi_endpoint {
|
||||
struct cxgbi_sock *csk;
|
||||
};
|
||||
|
||||
#define MAX_PDU_FRAGS ((ULP2_MAX_PDU_PAYLOAD + 512 - 1) / 512)
|
||||
struct cxgbi_task_data {
|
||||
#define CXGBI_TASK_SGL_CHECKED 0x1
|
||||
#define CXGBI_TASK_SGL_COPY 0x2
|
||||
u8 flags;
|
||||
unsigned short nr_frags;
|
||||
struct page_frag frags[MAX_PDU_FRAGS];
|
||||
struct page_frag frags[MAX_SKB_FRAGS];
|
||||
struct sk_buff *skb;
|
||||
unsigned int dlen;
|
||||
unsigned int offset;
|
||||
unsigned int count;
|
||||
unsigned int sgoffset;
|
||||
u32 total_count;
|
||||
u32 total_offset;
|
||||
u32 max_xmit_dlength;
|
||||
struct cxgbi_task_tag_info ttinfo;
|
||||
};
|
||||
#define iscsi_task_cxgbi_data(task) \
|
||||
((task)->dd_data + sizeof(struct iscsi_tcp_task))
|
||||
|
||||
struct cxgbi_iso_info {
|
||||
#define CXGBI_ISO_INFO_FSLICE 0x1
|
||||
#define CXGBI_ISO_INFO_LSLICE 0x2
|
||||
#define CXGBI_ISO_INFO_IMM_ENABLE 0x4
|
||||
u8 flags;
|
||||
u8 op;
|
||||
u8 ahs;
|
||||
u8 num_pdu;
|
||||
u32 mpdu;
|
||||
u32 burst_size;
|
||||
u32 len;
|
||||
u32 segment_offset;
|
||||
u32 datasn_offset;
|
||||
u32 buffer_offset;
|
||||
};
|
||||
|
||||
static inline void *cxgbi_alloc_big_mem(unsigned int size,
|
||||
gfp_t gfp)
|
||||
{
|
||||
|
@ -1331,7 +1331,6 @@ static s32 adpt_i2o_reset_hba(adpt_hba* pHba)
|
||||
printk(KERN_ERR"IOP reset failed - no free memory.\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
memset(status,0,4);
|
||||
|
||||
msg[0]=EIGHT_WORD_MSG_SIZE|SGL_OFFSET_0;
|
||||
msg[1]=I2O_CMD_ADAPTER_RESET<<24|HOST_TID<<12|ADAPTER_TID;
|
||||
@ -2784,7 +2783,6 @@ static s32 adpt_i2o_init_outbound_q(adpt_hba* pHba)
|
||||
pHba->name);
|
||||
return -ENOMEM;
|
||||
}
|
||||
memset(status, 0, 4);
|
||||
|
||||
writel(EIGHT_WORD_MSG_SIZE| SGL_OFFSET_6, &msg[0]);
|
||||
writel(I2O_CMD_OUTBOUND_INIT<<24 | HOST_TID<<12 | ADAPTER_TID, &msg[1]);
|
||||
@ -2838,7 +2836,6 @@ static s32 adpt_i2o_init_outbound_q(adpt_hba* pHba)
|
||||
printk(KERN_ERR "%s: Could not allocate reply pool\n", pHba->name);
|
||||
return -ENOMEM;
|
||||
}
|
||||
memset(pHba->reply_pool, 0 , pHba->reply_fifo_size * REPLY_FRAME_SIZE * 4);
|
||||
|
||||
for(i = 0; i < pHba->reply_fifo_size; i++) {
|
||||
writel(pHba->reply_pool_pa + (i * REPLY_FRAME_SIZE * 4),
|
||||
@ -3073,7 +3070,6 @@ static int adpt_i2o_build_sys_table(void)
|
||||
printk(KERN_WARNING "SysTab Set failed. Out of memory.\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
memset(sys_tbl, 0, sys_tbl_len);
|
||||
|
||||
sys_tbl->num_entries = hba_count;
|
||||
sys_tbl->version = I2OVERSION;
|
||||
|
@ -1225,8 +1225,9 @@ static inline void esas2r_rq_init_request(struct esas2r_request *rq,
|
||||
|
||||
/* req_table entry should be NULL at this point - if not, halt */
|
||||
|
||||
if (a->req_table[LOWORD(vrq->scsi.handle)])
|
||||
if (a->req_table[LOWORD(vrq->scsi.handle)]) {
|
||||
esas2r_bugon();
|
||||
}
|
||||
|
||||
/* fill in the table for this handle so we can get back to the
|
||||
* request.
|
||||
|
@ -75,7 +75,7 @@ static char event_buffer[EVENT_LOG_BUFF_SIZE];
|
||||
/* A lock to protect the shared buffer used for formatting messages. */
|
||||
static DEFINE_SPINLOCK(event_buffer_lock);
|
||||
|
||||
/**
|
||||
/*
|
||||
* translates an esas2r-defined logging event level to a kernel logging level.
|
||||
*
|
||||
* @param [in] level the esas2r-defined logging event level to translate
|
||||
@ -101,7 +101,7 @@ static const char *translate_esas2r_event_level_to_kernel(const long level)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* the master logging function. this function will format the message as
|
||||
* outlined by the formatting string, the input device information and the
|
||||
* substitution arguments and output the resulting string to the system log.
|
||||
@ -170,7 +170,7 @@ static int esas2r_log_master(const long level,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* formats and logs a message to the system log.
|
||||
*
|
||||
* @param [in] level the event level of the message
|
||||
@ -193,7 +193,7 @@ int esas2r_log(const long level, const char *format, ...)
|
||||
return retval;
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* formats and logs a message to the system log. this message will include
|
||||
* device information.
|
||||
*
|
||||
@ -221,7 +221,7 @@ int esas2r_log_dev(const long level,
|
||||
return retval;
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* formats and logs a message to the system log. this message will include
|
||||
* device information.
|
||||
*
|
||||
|
@ -645,7 +645,7 @@ static int fcoe_lport_config(struct fc_lport *lport)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* fcoe_netdev_features_change - Updates the lport's offload flags based
|
||||
* on the LLD netdev's FCoE feature flags
|
||||
*/
|
||||
@ -2029,7 +2029,7 @@ static int fcoe_ctlr_enabled(struct fcoe_ctlr_device *cdev)
|
||||
|
||||
/**
|
||||
* fcoe_ctlr_mode() - Switch FIP mode
|
||||
* @cdev: The FCoE Controller that is being modified
|
||||
* @ctlr_dev: The FCoE Controller that is being modified
|
||||
*
|
||||
* When the FIP mode has been changed we need to update
|
||||
* the multicast addresses to ensure we get the correct
|
||||
@ -2136,9 +2136,7 @@ static bool fcoe_match(struct net_device *netdev)
|
||||
|
||||
/**
|
||||
* fcoe_dcb_create() - Initialize DCB attributes and hooks
|
||||
* @netdev: The net_device object of the L2 link that should be queried
|
||||
* @port: The fcoe_port to bind FCoE APP priority with
|
||||
* @
|
||||
* @fcoe: The new FCoE interface
|
||||
*/
|
||||
static void fcoe_dcb_create(struct fcoe_interface *fcoe)
|
||||
{
|
||||
@ -2609,7 +2607,7 @@ static void fcoe_logo_resp(struct fc_seq *seq, struct fc_frame *fp, void *arg)
|
||||
fc_lport_logo_resp(seq, fp, lport);
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* fcoe_elsct_send - FCoE specific ELS handler
|
||||
*
|
||||
* This does special case handling of FIP encapsualted ELS exchanges for FCoE,
|
||||
|
@ -134,6 +134,7 @@ static void fcoe_ctlr_map_dest(struct fcoe_ctlr *fip)
|
||||
/**
|
||||
* fcoe_ctlr_init() - Initialize the FCoE Controller instance
|
||||
* @fip: The FCoE controller to initialize
|
||||
* @mode: FIP mode to set
|
||||
*/
|
||||
void fcoe_ctlr_init(struct fcoe_ctlr *fip, enum fip_mode mode)
|
||||
{
|
||||
@ -336,7 +337,7 @@ static void fcoe_ctlr_announce(struct fcoe_ctlr *fip)
|
||||
printk(KERN_NOTICE "libfcoe: host%d: "
|
||||
"FIP Fibre-Channel Forwarder MAC %pM deselected\n",
|
||||
fip->lp->host->host_no, fip->dest_addr);
|
||||
memset(fip->dest_addr, 0, ETH_ALEN);
|
||||
eth_zero_addr(fip->dest_addr);
|
||||
}
|
||||
if (sel) {
|
||||
printk(KERN_INFO "libfcoe: host%d: FIP selected "
|
||||
@ -587,6 +588,7 @@ static void fcoe_ctlr_send_keep_alive(struct fcoe_ctlr *fip,
|
||||
/**
|
||||
* fcoe_ctlr_encaps() - Encapsulate an ELS frame for FIP, without sending it
|
||||
* @fip: The FCoE controller for the ELS frame
|
||||
* @lport: The local port
|
||||
* @dtype: The FIP descriptor type for the frame
|
||||
* @skb: The FCoE ELS frame including FC header but no FCoE headers
|
||||
* @d_id: The destination port ID.
|
||||
@ -1302,7 +1304,7 @@ drop:
|
||||
/**
|
||||
* fcoe_ctlr_recv_els() - Handle an incoming link reset frame
|
||||
* @fip: The FCoE controller that received the frame
|
||||
* @fh: The received FIP header
|
||||
* @skb: The received FIP packet
|
||||
*
|
||||
* There may be multiple VN_Port descriptors.
|
||||
* The overall length has already been checked.
|
||||
@ -1775,7 +1777,7 @@ unlock:
|
||||
|
||||
/**
|
||||
* fcoe_ctlr_timeout() - FIP timeout handler
|
||||
* @arg: The FCoE controller that timed out
|
||||
* @t: Timer context use to obtain the controller reference
|
||||
*/
|
||||
static void fcoe_ctlr_timeout(struct timer_list *t)
|
||||
{
|
||||
@ -1887,6 +1889,7 @@ static void fcoe_ctlr_recv_work(struct work_struct *recv_work)
|
||||
/**
|
||||
* fcoe_ctlr_recv_flogi() - Snoop pre-FIP receipt of FLOGI response
|
||||
* @fip: The FCoE controller
|
||||
* @lport: The local port
|
||||
* @fp: The FC frame to snoop
|
||||
*
|
||||
* Snoop potential response to FLOGI or even incoming FLOGI.
|
||||
@ -2158,7 +2161,7 @@ static struct fc_rport_operations fcoe_ctlr_vn_rport_ops = {
|
||||
|
||||
/**
|
||||
* fcoe_ctlr_disc_stop_locked() - stop discovery in VN2VN mode
|
||||
* @fip: The FCoE controller
|
||||
* @lport: The local port
|
||||
*
|
||||
* Called with ctlr_mutex held.
|
||||
*/
|
||||
@ -2179,7 +2182,7 @@ static void fcoe_ctlr_disc_stop_locked(struct fc_lport *lport)
|
||||
|
||||
/**
|
||||
* fcoe_ctlr_disc_stop() - stop discovery in VN2VN mode
|
||||
* @fip: The FCoE controller
|
||||
* @lport: The local port
|
||||
*
|
||||
* Called through the local port template for discovery.
|
||||
* Called without the ctlr_mutex held.
|
||||
@ -2195,7 +2198,7 @@ static void fcoe_ctlr_disc_stop(struct fc_lport *lport)
|
||||
|
||||
/**
|
||||
* fcoe_ctlr_disc_stop_final() - stop discovery for shutdown in VN2VN mode
|
||||
* @fip: The FCoE controller
|
||||
* @lport: The local port
|
||||
*
|
||||
* Called through the local port template for discovery.
|
||||
* Called without the ctlr_mutex held.
|
||||
@ -2262,7 +2265,7 @@ static void fcoe_ctlr_vn_start(struct fcoe_ctlr *fip)
|
||||
* fcoe_ctlr_vn_parse - parse probe request or response
|
||||
* @fip: The FCoE controller
|
||||
* @skb: incoming packet
|
||||
* @rdata: buffer for resulting parsed VN entry plus fcoe_rport
|
||||
* @frport: parsed FCoE rport from the probe request
|
||||
*
|
||||
* Returns non-zero error number on error.
|
||||
* Does not consume the packet.
|
||||
@ -2793,7 +2796,7 @@ drop:
|
||||
* fcoe_ctlr_vlan_parse - parse vlan discovery request or response
|
||||
* @fip: The FCoE controller
|
||||
* @skb: incoming packet
|
||||
* @rdata: buffer for resulting parsed VLAN entry plus fcoe_rport
|
||||
* @frport: parsed FCoE rport from the probe request
|
||||
*
|
||||
* Returns non-zero error number on error.
|
||||
* Does not consume the packet.
|
||||
@ -2892,7 +2895,6 @@ len_err:
|
||||
* @fip: The FCoE controller
|
||||
* @sub: sub-opcode for vlan notification or vn2vn vlan notification
|
||||
* @dest: The destination Ethernet MAC address
|
||||
* @min_len: minimum size of the Ethernet payload to be sent
|
||||
*/
|
||||
static void fcoe_ctlr_vlan_send(struct fcoe_ctlr *fip,
|
||||
enum fip_vlan_subcode sub,
|
||||
@ -2969,9 +2971,8 @@ static void fcoe_ctlr_vlan_disc_reply(struct fcoe_ctlr *fip,
|
||||
|
||||
/**
|
||||
* fcoe_ctlr_vlan_recv - vlan request receive handler for VN2VN mode.
|
||||
* @lport: The local port
|
||||
* @fp: The received frame
|
||||
*
|
||||
* @fip: The FCoE controller
|
||||
* @skb: The received FIP packet
|
||||
*/
|
||||
static int fcoe_ctlr_vlan_recv(struct fcoe_ctlr *fip, struct sk_buff *skb)
|
||||
{
|
||||
@ -3015,9 +3016,8 @@ static void fcoe_ctlr_disc_recv(struct fc_lport *lport, struct fc_frame *fp)
|
||||
fc_frame_free(fp);
|
||||
}
|
||||
|
||||
/**
|
||||
* fcoe_ctlr_disc_recv - start discovery for VN2VN mode.
|
||||
* @fip: The FCoE controller
|
||||
/*
|
||||
* fcoe_ctlr_disc_start - start discovery for VN2VN mode.
|
||||
*
|
||||
* This sets a flag indicating that remote ports should be created
|
||||
* and started for the peers we discover. We use the disc_callback
|
||||
|
@ -382,6 +382,7 @@ EXPORT_SYMBOL_GPL(fcoe_clean_pending_queue);
|
||||
/**
|
||||
* fcoe_check_wait_queue() - Attempt to clear the transmit backlog
|
||||
* @lport: The local port whose backlog is to be cleared
|
||||
* @skb: The received FIP packet
|
||||
*
|
||||
* This empties the wait_queue, dequeues the head of the wait_queue queue
|
||||
* and calls fcoe_start_io() for each packet. If all skb have been
|
||||
@ -439,7 +440,7 @@ EXPORT_SYMBOL_GPL(fcoe_check_wait_queue);
|
||||
|
||||
/**
|
||||
* fcoe_queue_timer() - The fcoe queue timer
|
||||
* @lport: The local port
|
||||
* @t: Timer context use to obtain the FCoE port
|
||||
*
|
||||
* Calls fcoe_check_wait_queue on timeout
|
||||
*/
|
||||
@ -672,6 +673,7 @@ static void fcoe_del_netdev_mapping(struct net_device *netdev)
|
||||
/**
|
||||
* fcoe_netdev_map_lookup - find the fcoe transport that matches the netdev on which
|
||||
* it was created
|
||||
* @netdev: The net device that the FCoE interface is on
|
||||
*
|
||||
* Returns : ptr to the fcoe transport that supports this netdev or NULL
|
||||
* if not found.
|
||||
|
@ -103,7 +103,7 @@ enum {
|
||||
#define REG_FIFO_COUNT 14 /* R: FIFO Data Count */
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
static const struct dev_pm_ops fdomain_pm_ops;
|
||||
static const struct dev_pm_ops __maybe_unused fdomain_pm_ops;
|
||||
#define FDOMAIN_PM_OPS (&fdomain_pm_ops)
|
||||
#else
|
||||
#define FDOMAIN_PM_OPS NULL
|
||||
|
@ -23,6 +23,7 @@
|
||||
#include <linux/scatterlist.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/if_ether.h>
|
||||
#include <linux/if_vlan.h>
|
||||
#include <linux/delay.h>
|
||||
@ -275,7 +276,7 @@ int fnic_flogi_reg_handler(struct fnic *fnic, u32 fc_id)
|
||||
}
|
||||
|
||||
if (fnic->ctlr.map_dest) {
|
||||
memset(gw_mac, 0xff, ETH_ALEN);
|
||||
eth_broadcast_addr(gw_mac);
|
||||
format = FCPIO_FLOGI_REG_DEF_DEST;
|
||||
} else {
|
||||
memcpy(gw_mac, fnic->ctlr.dest_addr, ETH_ALEN);
|
||||
|
@ -1258,8 +1258,10 @@ static void slot_complete_v1_hw(struct hisi_hba *hisi_hba,
|
||||
!(cmplt_hdr_data & CMPLT_HDR_RSPNS_XFRD_MSK)) {
|
||||
|
||||
slot_err_v1_hw(hisi_hba, task, slot);
|
||||
if (unlikely(slot->abort))
|
||||
if (unlikely(slot->abort)) {
|
||||
sas_task_abort(task);
|
||||
return;
|
||||
}
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
@ -2404,8 +2404,10 @@ static void slot_complete_v2_hw(struct hisi_hba *hisi_hba,
|
||||
error_info[0], error_info[1],
|
||||
error_info[2], error_info[3]);
|
||||
|
||||
if (unlikely(slot->abort))
|
||||
if (unlikely(slot->abort)) {
|
||||
sas_task_abort(task);
|
||||
return;
|
||||
}
|
||||
goto out;
|
||||
}
|
||||
|
||||
@ -3300,7 +3302,7 @@ static irq_handler_t fatal_interrupts[HISI_SAS_FATAL_INT_NR] = {
|
||||
fatal_axi_int_v2_hw
|
||||
};
|
||||
|
||||
/**
|
||||
/*
|
||||
* There is a limitation in the hip06 chipset that we need
|
||||
* to map in all mbigen interrupts, even if they are not used.
|
||||
*/
|
||||
|
@ -2235,8 +2235,10 @@ static void slot_complete_v3_hw(struct hisi_hba *hisi_hba,
|
||||
dw0, dw1, complete_hdr->act, dw3,
|
||||
error_info[0], error_info[1],
|
||||
error_info[2], error_info[3]);
|
||||
if (unlikely(slot->abort))
|
||||
if (unlikely(slot->abort)) {
|
||||
sas_task_abort(task);
|
||||
return;
|
||||
}
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
@ -272,8 +272,10 @@ int scsi_add_host_with_dma(struct Scsi_Host *shost, struct device *dev,
|
||||
if (shost->transportt->create_work_queue) {
|
||||
snprintf(shost->work_q_name, sizeof(shost->work_q_name),
|
||||
"scsi_wq_%d", shost->host_no);
|
||||
shost->work_q = create_singlethread_workqueue(
|
||||
shost->work_q_name);
|
||||
shost->work_q = alloc_workqueue("%s",
|
||||
WQ_SYSFS | __WQ_LEGACY | WQ_MEM_RECLAIM | WQ_UNBOUND,
|
||||
1, shost->work_q_name);
|
||||
|
||||
if (!shost->work_q) {
|
||||
error = -EINVAL;
|
||||
goto out_free_shost_data;
|
||||
@ -487,7 +489,7 @@ struct Scsi_Host *scsi_host_alloc(struct scsi_host_template *sht, int privsize)
|
||||
}
|
||||
|
||||
shost->tmf_work_q = alloc_workqueue("scsi_tmf_%d",
|
||||
WQ_UNBOUND | WQ_MEM_RECLAIM,
|
||||
WQ_UNBOUND | WQ_MEM_RECLAIM | WQ_SYSFS,
|
||||
1, shost->host_no);
|
||||
if (!shost->tmf_work_q) {
|
||||
shost_printk(KERN_WARNING, shost,
|
||||
|
@ -59,7 +59,7 @@
|
||||
* HPSA_DRIVER_VERSION must be 3 byte values (0-255) separated by '.'
|
||||
* with an optional trailing '-' followed by a byte value (0-255).
|
||||
*/
|
||||
#define HPSA_DRIVER_VERSION "3.4.20-170"
|
||||
#define HPSA_DRIVER_VERSION "3.4.20-200"
|
||||
#define DRIVER_NAME "HP HPSA Driver (v " HPSA_DRIVER_VERSION ")"
|
||||
#define HPSA "hpsa"
|
||||
|
||||
@ -2134,6 +2134,7 @@ 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)
|
||||
{
|
||||
struct hpsa_scsi_dev_t *sd;
|
||||
@ -2144,17 +2145,21 @@ static int hpsa_slave_configure(struct scsi_device *sdev)
|
||||
|
||||
if (sd) {
|
||||
sd->was_removed = 0;
|
||||
queue_depth = sd->queue_depth != 0 ?
|
||||
sd->queue_depth : sdev->host->can_queue;
|
||||
if (sd->external) {
|
||||
queue_depth = EXTERNAL_QD;
|
||||
sdev->eh_timeout = HPSA_EH_PTRAID_TIMEOUT;
|
||||
blk_queue_rq_timeout(sdev->request_queue,
|
||||
HPSA_EH_PTRAID_TIMEOUT);
|
||||
} else {
|
||||
queue_depth = sd->queue_depth != 0 ?
|
||||
sd->queue_depth : sdev->host->can_queue;
|
||||
}
|
||||
} else
|
||||
if (is_hba_lunid(sd->scsi3addr)) {
|
||||
sdev->eh_timeout = CTLR_TIMEOUT;
|
||||
blk_queue_rq_timeout(sdev->request_queue, CTLR_TIMEOUT);
|
||||
}
|
||||
} else {
|
||||
queue_depth = sdev->host->can_queue;
|
||||
}
|
||||
|
||||
scsi_change_queue_depth(sdev, queue_depth);
|
||||
|
||||
@ -3443,9 +3448,14 @@ static void hpsa_get_enclosure_info(struct ctlr_info *h,
|
||||
struct ErrorInfo *ei = NULL;
|
||||
struct bmic_sense_storage_box_params *bssbp = NULL;
|
||||
struct bmic_identify_physical_device *id_phys = NULL;
|
||||
struct ext_report_lun_entry *rle = &rlep->LUN[rle_index];
|
||||
struct ext_report_lun_entry *rle;
|
||||
u16 bmic_device_index = 0;
|
||||
|
||||
if (rle_index < 0 || rle_index >= HPSA_MAX_PHYS_LUN)
|
||||
return;
|
||||
|
||||
rle = &rlep->LUN[rle_index];
|
||||
|
||||
encl_dev->eli =
|
||||
hpsa_get_enclosure_logical_identifier(h, scsi3addr);
|
||||
|
||||
@ -4174,6 +4184,9 @@ static void hpsa_get_ioaccel_drive_info(struct ctlr_info *h,
|
||||
int rc;
|
||||
struct ext_report_lun_entry *rle;
|
||||
|
||||
if (rle_index < 0 || rle_index >= HPSA_MAX_PHYS_LUN)
|
||||
return;
|
||||
|
||||
rle = &rlep->LUN[rle_index];
|
||||
|
||||
dev->ioaccel_handle = rle->ioaccel_handle;
|
||||
@ -4198,7 +4211,12 @@ static void hpsa_get_path_info(struct hpsa_scsi_dev_t *this_device,
|
||||
struct ReportExtendedLUNdata *rlep, int rle_index,
|
||||
struct bmic_identify_physical_device *id_phys)
|
||||
{
|
||||
struct ext_report_lun_entry *rle = &rlep->LUN[rle_index];
|
||||
struct ext_report_lun_entry *rle;
|
||||
|
||||
if (rle_index < 0 || rle_index >= HPSA_MAX_PHYS_LUN)
|
||||
return;
|
||||
|
||||
rle = &rlep->LUN[rle_index];
|
||||
|
||||
if ((rle->device_flags & 0x08) && this_device->ioaccel_handle)
|
||||
this_device->hba_ioaccel_enabled = 1;
|
||||
@ -4420,7 +4438,8 @@ static void hpsa_update_scsi_devices(struct ctlr_info *h)
|
||||
/*
|
||||
* Skip over some devices such as a spare.
|
||||
*/
|
||||
if (!tmpdevice->external && physical_device) {
|
||||
if (phys_dev_index >= 0 && !tmpdevice->external &&
|
||||
physical_device) {
|
||||
skip_device = hpsa_skip_device(h, lunaddrbytes,
|
||||
&physdev_list->LUN[phys_dev_index]);
|
||||
if (skip_device)
|
||||
|
@ -57,7 +57,7 @@ struct hpsa_sas_phy {
|
||||
bool added_to_port;
|
||||
};
|
||||
|
||||
#define EXTERNAL_QD 7
|
||||
#define EXTERNAL_QD 128
|
||||
struct hpsa_scsi_dev_t {
|
||||
unsigned int devtype;
|
||||
int bus, target, lun; /* as presented to the OS */
|
||||
|
@ -1344,7 +1344,7 @@ static void ibmvfc_map_sg_list(struct scsi_cmnd *scmd, int nseg,
|
||||
}
|
||||
|
||||
/**
|
||||
* ibmvfc_map_sg_data - Maps dma for a scatterlist and initializes decriptor fields
|
||||
* ibmvfc_map_sg_data - Maps dma for a scatterlist and initializes descriptor fields
|
||||
* @scmd: struct scsi_cmnd with the scatterlist
|
||||
* @evt: ibmvfc event struct
|
||||
* @vfc_cmd: vfc_cmd that contains the memory descriptor
|
||||
|
@ -669,7 +669,7 @@ static int map_sg_list(struct scsi_cmnd *cmd, int nseg,
|
||||
}
|
||||
|
||||
/**
|
||||
* map_sg_data: - Maps dma for a scatterlist and initializes decriptor fields
|
||||
* map_sg_data: - Maps dma for a scatterlist and initializes descriptor fields
|
||||
* @cmd: struct scsi_cmnd with the scatterlist
|
||||
* @srp_cmd: srp_cmd that contains the memory descriptor
|
||||
* @dev: device for which to map dma memory
|
||||
|
@ -903,7 +903,6 @@ static int imm_engine(imm_struct *dev, struct scsi_cmnd *cmd)
|
||||
w_ctr(ppb, 0x4);
|
||||
}
|
||||
return 0; /* Finished */
|
||||
break;
|
||||
|
||||
default:
|
||||
printk("imm: Invalid scsi phase\n");
|
||||
@ -969,10 +968,8 @@ static int imm_abort(struct scsi_cmnd *cmd)
|
||||
case 1: /* Have not connected to interface */
|
||||
dev->cur_cmd = NULL; /* Forget the problem */
|
||||
return SUCCESS;
|
||||
break;
|
||||
default: /* SCSI command sent, can not abort */
|
||||
return FAILED;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -670,6 +670,7 @@ static void ipr_reinit_ipr_cmnd(struct ipr_cmnd *ipr_cmd)
|
||||
/**
|
||||
* ipr_init_ipr_cmnd - Initialize an IPR Cmnd block
|
||||
* @ipr_cmd: ipr command struct
|
||||
* @fast_done: fast done function call-back
|
||||
*
|
||||
* Return value:
|
||||
* none
|
||||
@ -687,7 +688,7 @@ static void ipr_init_ipr_cmnd(struct ipr_cmnd *ipr_cmd,
|
||||
|
||||
/**
|
||||
* __ipr_get_free_ipr_cmnd - Get a free IPR Cmnd block
|
||||
* @ioa_cfg: ioa config struct
|
||||
* @hrrq: hrr queue
|
||||
*
|
||||
* Return value:
|
||||
* pointer to ipr command struct
|
||||
@ -737,7 +738,6 @@ struct ipr_cmnd *ipr_get_free_ipr_cmnd(struct ipr_ioa_cfg *ioa_cfg)
|
||||
static void ipr_mask_and_clear_interrupts(struct ipr_ioa_cfg *ioa_cfg,
|
||||
u32 clr_ints)
|
||||
{
|
||||
volatile u32 int_reg;
|
||||
int i;
|
||||
|
||||
/* Stop new interrupts */
|
||||
@ -757,7 +757,7 @@ static void ipr_mask_and_clear_interrupts(struct ipr_ioa_cfg *ioa_cfg,
|
||||
if (ioa_cfg->sis64)
|
||||
writel(~0, ioa_cfg->regs.clr_interrupt_reg);
|
||||
writel(clr_ints, ioa_cfg->regs.clr_interrupt_reg32);
|
||||
int_reg = readl(ioa_cfg->regs.sense_interrupt_reg);
|
||||
readl(ioa_cfg->regs.sense_interrupt_reg);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1287,7 +1287,7 @@ static int ipr_is_same_device(struct ipr_resource_entry *res,
|
||||
/**
|
||||
* __ipr_format_res_path - Format the resource path for printing.
|
||||
* @res_path: resource path
|
||||
* @buf: buffer
|
||||
* @buffer: buffer
|
||||
* @len: length of buffer provided
|
||||
*
|
||||
* Return value:
|
||||
@ -1310,7 +1310,7 @@ static char *__ipr_format_res_path(u8 *res_path, char *buffer, int len)
|
||||
* ipr_format_res_path - Format the resource path for printing.
|
||||
* @ioa_cfg: ioa config struct
|
||||
* @res_path: resource path
|
||||
* @buf: buffer
|
||||
* @buffer: buffer
|
||||
* @len: length of buffer provided
|
||||
*
|
||||
* Return value:
|
||||
@ -1391,7 +1391,6 @@ static void ipr_update_res_entry(struct ipr_resource_entry *res,
|
||||
* ipr_clear_res_target - Clear the bit in the bit map representing the target
|
||||
* for the resource.
|
||||
* @res: resource entry struct
|
||||
* @cfgtew: config table entry wrapper struct
|
||||
*
|
||||
* Return value:
|
||||
* none
|
||||
@ -2667,7 +2666,7 @@ static void ipr_process_error(struct ipr_cmnd *ipr_cmd)
|
||||
|
||||
/**
|
||||
* ipr_timeout - An internally generated op has timed out.
|
||||
* @ipr_cmd: ipr command struct
|
||||
* @t: Timer context used to fetch ipr command struct
|
||||
*
|
||||
* This function blocks host requests and initiates an
|
||||
* adapter reset.
|
||||
@ -2700,7 +2699,7 @@ static void ipr_timeout(struct timer_list *t)
|
||||
|
||||
/**
|
||||
* ipr_oper_timeout - Adapter timed out transitioning to operational
|
||||
* @ipr_cmd: ipr command struct
|
||||
* @t: Timer context used to fetch ipr command struct
|
||||
*
|
||||
* This function blocks host requests and initiates an
|
||||
* adapter reset.
|
||||
@ -3484,6 +3483,7 @@ static struct bin_attribute ipr_trace_attr = {
|
||||
/**
|
||||
* ipr_show_fw_version - Show the firmware version
|
||||
* @dev: class device struct
|
||||
* @attr: device attribute (unused)
|
||||
* @buf: buffer
|
||||
*
|
||||
* Return value:
|
||||
@ -3518,6 +3518,7 @@ static struct device_attribute ipr_fw_version_attr = {
|
||||
/**
|
||||
* ipr_show_log_level - Show the adapter's error logging level
|
||||
* @dev: class device struct
|
||||
* @attr: device attribute (unused)
|
||||
* @buf: buffer
|
||||
*
|
||||
* Return value:
|
||||
@ -3540,7 +3541,9 @@ static ssize_t ipr_show_log_level(struct device *dev,
|
||||
/**
|
||||
* ipr_store_log_level - Change the adapter's error logging level
|
||||
* @dev: class device struct
|
||||
* @attr: device attribute (unused)
|
||||
* @buf: buffer
|
||||
* @count: buffer size
|
||||
*
|
||||
* Return value:
|
||||
* number of bytes printed to buffer
|
||||
@ -3571,6 +3574,7 @@ static struct device_attribute ipr_log_level_attr = {
|
||||
/**
|
||||
* ipr_store_diagnostics - IOA Diagnostics interface
|
||||
* @dev: device struct
|
||||
* @attr: device attribute (unused)
|
||||
* @buf: buffer
|
||||
* @count: buffer size
|
||||
*
|
||||
@ -3631,7 +3635,8 @@ static struct device_attribute ipr_diagnostics_attr = {
|
||||
|
||||
/**
|
||||
* ipr_show_adapter_state - Show the adapter's state
|
||||
* @class_dev: device struct
|
||||
* @dev: device struct
|
||||
* @attr: device attribute (unused)
|
||||
* @buf: buffer
|
||||
*
|
||||
* Return value:
|
||||
@ -3657,6 +3662,7 @@ static ssize_t ipr_show_adapter_state(struct device *dev,
|
||||
/**
|
||||
* ipr_store_adapter_state - Change adapter state
|
||||
* @dev: device struct
|
||||
* @attr: device attribute (unused)
|
||||
* @buf: buffer
|
||||
* @count: buffer size
|
||||
*
|
||||
@ -3708,6 +3714,7 @@ static struct device_attribute ipr_ioa_state_attr = {
|
||||
/**
|
||||
* ipr_store_reset_adapter - Reset the adapter
|
||||
* @dev: device struct
|
||||
* @attr: device attribute (unused)
|
||||
* @buf: buffer
|
||||
* @count: buffer size
|
||||
*
|
||||
@ -3749,6 +3756,7 @@ static int ipr_iopoll(struct irq_poll *iop, int budget);
|
||||
/**
|
||||
* ipr_show_iopoll_weight - Show ipr polling mode
|
||||
* @dev: class device struct
|
||||
* @attr: device attribute (unused)
|
||||
* @buf: buffer
|
||||
*
|
||||
* Return value:
|
||||
@ -3772,7 +3780,9 @@ static ssize_t ipr_show_iopoll_weight(struct device *dev,
|
||||
/**
|
||||
* ipr_store_iopoll_weight - Change the adapter's polling mode
|
||||
* @dev: class device struct
|
||||
* @attr: device attribute (unused)
|
||||
* @buf: buffer
|
||||
* @count: buffer size
|
||||
*
|
||||
* Return value:
|
||||
* number of bytes printed to buffer
|
||||
@ -3871,7 +3881,7 @@ static struct ipr_sglist *ipr_alloc_ucode_buffer(int buf_len)
|
||||
|
||||
/**
|
||||
* ipr_free_ucode_buffer - Frees a microcode download buffer
|
||||
* @p_dnld: scatter/gather list pointer
|
||||
* @sglist: scatter/gather list pointer
|
||||
*
|
||||
* Free a DMA'able ucode download buffer previously allocated with
|
||||
* ipr_alloc_ucode_buffer
|
||||
@ -4059,7 +4069,8 @@ static int ipr_update_ioa_ucode(struct ipr_ioa_cfg *ioa_cfg,
|
||||
|
||||
/**
|
||||
* ipr_store_update_fw - Update the firmware on the adapter
|
||||
* @class_dev: device struct
|
||||
* @dev: device struct
|
||||
* @attr: device attribute (unused)
|
||||
* @buf: buffer
|
||||
* @count: buffer size
|
||||
*
|
||||
@ -4139,6 +4150,7 @@ static struct device_attribute ipr_update_fw_attr = {
|
||||
/**
|
||||
* ipr_show_fw_type - Show the adapter's firmware type.
|
||||
* @dev: class device struct
|
||||
* @attr: device attribute (unused)
|
||||
* @buf: buffer
|
||||
*
|
||||
* Return value:
|
||||
@ -4480,7 +4492,6 @@ static int ipr_free_dump(struct ipr_ioa_cfg *ioa_cfg) { return 0; };
|
||||
* ipr_change_queue_depth - Change the device's queue depth
|
||||
* @sdev: scsi device struct
|
||||
* @qdepth: depth to set
|
||||
* @reason: calling context
|
||||
*
|
||||
* Return value:
|
||||
* actual depth set
|
||||
@ -4650,6 +4661,7 @@ static struct device_attribute ipr_resource_type_attr = {
|
||||
/**
|
||||
* ipr_show_raw_mode - Show the adapter's raw mode
|
||||
* @dev: class device struct
|
||||
* @attr: device attribute (unused)
|
||||
* @buf: buffer
|
||||
*
|
||||
* Return value:
|
||||
@ -4677,7 +4689,9 @@ static ssize_t ipr_show_raw_mode(struct device *dev,
|
||||
/**
|
||||
* ipr_store_raw_mode - Change the adapter's raw mode
|
||||
* @dev: class device struct
|
||||
* @attr: device attribute (unused)
|
||||
* @buf: buffer
|
||||
* @count: buffer size
|
||||
*
|
||||
* Return value:
|
||||
* number of bytes printed to buffer
|
||||
@ -5060,7 +5074,7 @@ static int ipr_match_lun(struct ipr_cmnd *ipr_cmd, void *device)
|
||||
|
||||
/**
|
||||
* ipr_cmnd_is_free - Check if a command is free or not
|
||||
* @ipr_cmd ipr command struct
|
||||
* @ipr_cmd: ipr command struct
|
||||
*
|
||||
* Returns:
|
||||
* true / false
|
||||
@ -5096,7 +5110,7 @@ static int ipr_match_res(struct ipr_cmnd *ipr_cmd, void *resource)
|
||||
|
||||
/**
|
||||
* ipr_wait_for_ops - Wait for matching commands to complete
|
||||
* @ipr_cmd: ipr command struct
|
||||
* @ioa_cfg: ioa config struct
|
||||
* @device: device to match (sdev)
|
||||
* @match: match function to use
|
||||
*
|
||||
@ -5261,6 +5275,7 @@ static int ipr_device_reset(struct ipr_ioa_cfg *ioa_cfg,
|
||||
* ipr_sata_reset - Reset the SATA port
|
||||
* @link: SATA link to reset
|
||||
* @classes: class of the attached device
|
||||
* @deadline: unused
|
||||
*
|
||||
* This function issues a SATA phy reset to the affected ATA link.
|
||||
*
|
||||
@ -5440,7 +5455,7 @@ static void ipr_bus_reset_done(struct ipr_cmnd *ipr_cmd)
|
||||
|
||||
/**
|
||||
* ipr_abort_timeout - An abort task has timed out
|
||||
* @ipr_cmd: ipr command struct
|
||||
* @t: Timer context used to fetch ipr command struct
|
||||
*
|
||||
* This function handles when an abort task times out. If this
|
||||
* happens we issue a bus reset since we have resources tied
|
||||
@ -5494,7 +5509,7 @@ static int ipr_cancel_op(struct scsi_cmnd *scsi_cmd)
|
||||
struct ipr_ioa_cfg *ioa_cfg;
|
||||
struct ipr_resource_entry *res;
|
||||
struct ipr_cmd_pkt *cmd_pkt;
|
||||
u32 ioasc, int_reg;
|
||||
u32 ioasc;
|
||||
int i, op_found = 0;
|
||||
struct ipr_hrr_queue *hrrq;
|
||||
|
||||
@ -5517,7 +5532,7 @@ static int ipr_cancel_op(struct scsi_cmnd *scsi_cmd)
|
||||
* by a still not detected EEH error. In such cases, reading a register will
|
||||
* trigger the EEH recovery infrastructure.
|
||||
*/
|
||||
int_reg = readl(ioa_cfg->regs.sense_interrupt_reg);
|
||||
readl(ioa_cfg->regs.sense_interrupt_reg);
|
||||
|
||||
if (!ipr_is_gscsi(res))
|
||||
return FAILED;
|
||||
@ -5569,7 +5584,8 @@ static int ipr_cancel_op(struct scsi_cmnd *scsi_cmd)
|
||||
|
||||
/**
|
||||
* ipr_eh_abort - Abort a single op
|
||||
* @scsi_cmd: scsi command struct
|
||||
* @shost: scsi host struct
|
||||
* @elapsed_time: elapsed time
|
||||
*
|
||||
* Return value:
|
||||
* 0 if scan in progress / 1 if scan is complete
|
||||
@ -5696,6 +5712,7 @@ static irqreturn_t ipr_handle_other_interrupt(struct ipr_ioa_cfg *ioa_cfg,
|
||||
* ipr_isr_eh - Interrupt service routine error handler
|
||||
* @ioa_cfg: ioa config struct
|
||||
* @msg: message to log
|
||||
* @number: various meanings depending on the caller/message
|
||||
*
|
||||
* Return value:
|
||||
* none
|
||||
@ -5762,7 +5779,6 @@ static int ipr_process_hrrq(struct ipr_hrr_queue *hrr_queue, int budget,
|
||||
|
||||
static int ipr_iopoll(struct irq_poll *iop, int budget)
|
||||
{
|
||||
struct ipr_ioa_cfg *ioa_cfg;
|
||||
struct ipr_hrr_queue *hrrq;
|
||||
struct ipr_cmnd *ipr_cmd, *temp;
|
||||
unsigned long hrrq_flags;
|
||||
@ -5770,7 +5786,6 @@ static int ipr_iopoll(struct irq_poll *iop, int budget)
|
||||
LIST_HEAD(doneq);
|
||||
|
||||
hrrq = container_of(iop, struct ipr_hrr_queue, iopoll);
|
||||
ioa_cfg = hrrq->ioa_cfg;
|
||||
|
||||
spin_lock_irqsave(hrrq->lock, hrrq_flags);
|
||||
completed_ops = ipr_process_hrrq(hrrq, budget, &doneq);
|
||||
@ -6268,8 +6283,7 @@ static void ipr_dump_ioasa(struct ipr_ioa_cfg *ioa_cfg,
|
||||
|
||||
/**
|
||||
* ipr_gen_sense - Generate SCSI sense data from an IOASA
|
||||
* @ioasa: IOASA
|
||||
* @sense_buf: sense data buffer
|
||||
* @ipr_cmd: ipr command struct
|
||||
*
|
||||
* Return value:
|
||||
* none
|
||||
@ -6702,7 +6716,7 @@ static int ipr_ioctl(struct scsi_device *sdev, unsigned int cmd,
|
||||
|
||||
/**
|
||||
* ipr_info - Get information about the card/driver
|
||||
* @scsi_host: scsi host struct
|
||||
* @host: scsi host struct
|
||||
*
|
||||
* Return value:
|
||||
* pointer to buffer with description string
|
||||
@ -7592,7 +7606,7 @@ static int ipr_ioafp_mode_select_page28(struct ipr_cmnd *ipr_cmd)
|
||||
/**
|
||||
* ipr_build_mode_sense - Builds a mode sense command
|
||||
* @ipr_cmd: ipr command struct
|
||||
* @res: resource entry struct
|
||||
* @res_handle: resource entry struct
|
||||
* @parm: Byte 2 of mode sense command
|
||||
* @dma_addr: DMA address of mode sense buffer
|
||||
* @xfer_len: Size of DMA buffer
|
||||
@ -7939,6 +7953,7 @@ static void ipr_build_ioa_service_action(struct ipr_cmnd *ipr_cmd,
|
||||
/**
|
||||
* ipr_ioafp_set_caching_parameters - Issue Set Cache parameters service
|
||||
* action
|
||||
* @ipr_cmd: ipr command struct
|
||||
*
|
||||
* Return value:
|
||||
* none
|
||||
@ -7975,6 +7990,10 @@ static int ipr_ioafp_set_caching_parameters(struct ipr_cmnd *ipr_cmd)
|
||||
/**
|
||||
* ipr_ioafp_inquiry - Send an Inquiry to the adapter.
|
||||
* @ipr_cmd: ipr command struct
|
||||
* @flags: flags to send
|
||||
* @page: page to inquire
|
||||
* @dma_addr: DMA address
|
||||
* @xfer_len: transfer data length
|
||||
*
|
||||
* This utility function sends an inquiry to the adapter.
|
||||
*
|
||||
@ -8265,7 +8284,7 @@ static int ipr_ioafp_identify_hrrq(struct ipr_cmnd *ipr_cmd)
|
||||
|
||||
/**
|
||||
* ipr_reset_timer_done - Adapter reset timer function
|
||||
* @ipr_cmd: ipr command struct
|
||||
* @t: Timer context used to fetch ipr command struct
|
||||
*
|
||||
* Description: This function is used in adapter reset processing
|
||||
* for timing events. If the reset_cmd pointer in the IOA
|
||||
@ -8659,7 +8678,6 @@ static int ipr_dump_mailbox_wait(struct ipr_cmnd *ipr_cmd)
|
||||
static int ipr_reset_restore_cfg_space(struct ipr_cmnd *ipr_cmd)
|
||||
{
|
||||
struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
|
||||
u32 int_reg;
|
||||
|
||||
ENTER;
|
||||
ioa_cfg->pdev->state_saved = true;
|
||||
@ -8675,7 +8693,7 @@ static int ipr_reset_restore_cfg_space(struct ipr_cmnd *ipr_cmd)
|
||||
if (ioa_cfg->sis64) {
|
||||
/* Set the adapter to the correct endian mode. */
|
||||
writel(IPR_ENDIAN_SWAP_KEY, ioa_cfg->regs.endian_swap_reg);
|
||||
int_reg = readl(ioa_cfg->regs.endian_swap_reg);
|
||||
readl(ioa_cfg->regs.endian_swap_reg);
|
||||
}
|
||||
|
||||
if (ioa_cfg->ioa_unit_checked) {
|
||||
@ -9483,7 +9501,6 @@ static pci_ers_result_t ipr_pci_error_detected(struct pci_dev *pdev,
|
||||
* Description: This is the second phase of adapter initialization
|
||||
* This function takes care of initilizing the adapter to the point
|
||||
* where it can accept new commands.
|
||||
|
||||
* Return value:
|
||||
* 0 on success / -EIO on failure
|
||||
**/
|
||||
@ -9597,7 +9614,7 @@ static void ipr_free_irqs(struct ipr_ioa_cfg *ioa_cfg)
|
||||
|
||||
/**
|
||||
* ipr_free_all_resources - Free all allocated resources for an adapter.
|
||||
* @ipr_cmd: ipr command struct
|
||||
* @ioa_cfg: ioa config struct
|
||||
*
|
||||
* This function frees all allocated resources for the
|
||||
* specified adapter.
|
||||
@ -10059,7 +10076,8 @@ static int ipr_request_other_msi_irqs(struct ipr_ioa_cfg *ioa_cfg,
|
||||
|
||||
/**
|
||||
* ipr_test_intr - Handle the interrupt generated in ipr_test_msi().
|
||||
* @pdev: PCI device struct
|
||||
* @devp: PCI device struct
|
||||
* @irq: IRQ number
|
||||
*
|
||||
* Description: Simply set the msi_received flag to 1 indicating that
|
||||
* Message Signaled Interrupts are supported.
|
||||
@ -10085,6 +10103,7 @@ static irqreturn_t ipr_test_intr(int irq, void *devp)
|
||||
|
||||
/**
|
||||
* ipr_test_msi - Test for Message Signaled Interrupt (MSI) support.
|
||||
* @ioa_cfg: ioa config struct
|
||||
* @pdev: PCI device struct
|
||||
*
|
||||
* Description: This routine sets up and initiates a test interrupt to determine
|
||||
@ -10097,7 +10116,6 @@ static irqreturn_t ipr_test_intr(int irq, void *devp)
|
||||
static int ipr_test_msi(struct ipr_ioa_cfg *ioa_cfg, struct pci_dev *pdev)
|
||||
{
|
||||
int rc;
|
||||
volatile u32 int_reg;
|
||||
unsigned long lock_flags = 0;
|
||||
int irq = pci_irq_vector(pdev, 0);
|
||||
|
||||
@ -10108,7 +10126,7 @@ static int ipr_test_msi(struct ipr_ioa_cfg *ioa_cfg, struct pci_dev *pdev)
|
||||
ioa_cfg->msi_received = 0;
|
||||
ipr_mask_and_clear_interrupts(ioa_cfg, ~IPR_PCII_IOA_TRANS_TO_OPER);
|
||||
writel(IPR_PCII_IO_DEBUG_ACKNOWLEDGE, ioa_cfg->regs.clr_interrupt_mask_reg32);
|
||||
int_reg = readl(ioa_cfg->regs.sense_interrupt_mask_reg);
|
||||
readl(ioa_cfg->regs.sense_interrupt_mask_reg);
|
||||
spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
|
||||
|
||||
rc = request_irq(irq, ipr_test_intr, 0, IPR_NAME, ioa_cfg);
|
||||
@ -10119,7 +10137,7 @@ static int ipr_test_msi(struct ipr_ioa_cfg *ioa_cfg, struct pci_dev *pdev)
|
||||
dev_info(&pdev->dev, "IRQ assigned: %d\n", irq);
|
||||
|
||||
writel(IPR_PCII_IO_DEBUG_ACKNOWLEDGE, ioa_cfg->regs.sense_interrupt_reg32);
|
||||
int_reg = readl(ioa_cfg->regs.sense_interrupt_reg);
|
||||
readl(ioa_cfg->regs.sense_interrupt_reg);
|
||||
wait_event_timeout(ioa_cfg->msi_wait_q, ioa_cfg->msi_received, HZ);
|
||||
spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
|
||||
ipr_mask_and_clear_interrupts(ioa_cfg, ~IPR_PCII_IOA_TRANS_TO_OPER);
|
||||
@ -10530,6 +10548,8 @@ static void ipr_remove(struct pci_dev *pdev)
|
||||
|
||||
/**
|
||||
* ipr_probe - Adapter hot plug add entry point
|
||||
* @pdev: pci device struct
|
||||
* @dev_id: pci device ID
|
||||
*
|
||||
* Return value:
|
||||
* 0 on success / non-zero on failure
|
||||
@ -10786,6 +10806,7 @@ static struct pci_driver ipr_driver = {
|
||||
|
||||
/**
|
||||
* ipr_halt_done - Shutdown prepare completion
|
||||
* @ipr_cmd: ipr command struct
|
||||
*
|
||||
* Return value:
|
||||
* none
|
||||
@ -10797,6 +10818,9 @@ static void ipr_halt_done(struct ipr_cmnd *ipr_cmd)
|
||||
|
||||
/**
|
||||
* ipr_halt - Issue shutdown prepare to all adapters
|
||||
* @nb: Notifier block
|
||||
* @event: Notifier event
|
||||
* @buf: Notifier data (unused)
|
||||
*
|
||||
* Return value:
|
||||
* NOTIFY_OK on success / NOTIFY_DONE on failure
|
||||
|
@ -1684,7 +1684,7 @@ struct ipr_dump_entry_header {
|
||||
struct ipr_dump_location_entry {
|
||||
struct ipr_dump_entry_header hdr;
|
||||
u8 location[20];
|
||||
}__attribute__((packed));
|
||||
}__attribute__((packed, aligned (4)));
|
||||
|
||||
struct ipr_dump_trace_entry {
|
||||
struct ipr_dump_entry_header hdr;
|
||||
@ -1708,7 +1708,7 @@ struct ipr_driver_dump {
|
||||
struct ipr_dump_location_entry location_entry;
|
||||
struct ipr_dump_ioa_type_entry ioa_type_entry;
|
||||
struct ipr_dump_trace_entry trace_entry;
|
||||
}__attribute__((packed));
|
||||
}__attribute__((packed, aligned (4)));
|
||||
|
||||
struct ipr_ioa_dump {
|
||||
struct ipr_dump_entry_header hdr;
|
||||
|
@ -2239,7 +2239,7 @@ ips_get_bios_version(ips_ha_t * ha, int intr)
|
||||
major = 0;
|
||||
minor = 0;
|
||||
|
||||
strncpy(ha->bios_version, " ?", 8);
|
||||
memcpy(ha->bios_version, " ?", 8);
|
||||
|
||||
if (ha->pcidev->device == IPS_DEVICEID_COPPERHEAD) {
|
||||
if (IPS_USE_MEMIO(ha)) {
|
||||
@ -3515,11 +3515,11 @@ ips_send_cmd(ips_ha_t * ha, ips_scb_t * scb)
|
||||
inquiry.Flags[1] =
|
||||
IPS_SCSI_INQ_WBus16 |
|
||||
IPS_SCSI_INQ_Sync;
|
||||
strncpy(inquiry.VendorId, "IBM ",
|
||||
memcpy(inquiry.VendorId, "IBM ",
|
||||
8);
|
||||
strncpy(inquiry.ProductId,
|
||||
memcpy(inquiry.ProductId,
|
||||
"SERVERAID ", 16);
|
||||
strncpy(inquiry.ProductRevisionLevel,
|
||||
memcpy(inquiry.ProductRevisionLevel,
|
||||
"1.00", 4);
|
||||
|
||||
ips_scmd_buf_write(scb->scsi_cmd,
|
||||
@ -4036,9 +4036,9 @@ ips_inquiry(ips_ha_t * ha, ips_scb_t * scb)
|
||||
inquiry.Flags[0] = IPS_SCSI_INQ_Address16;
|
||||
inquiry.Flags[1] =
|
||||
IPS_SCSI_INQ_WBus16 | IPS_SCSI_INQ_Sync | IPS_SCSI_INQ_CmdQue;
|
||||
strncpy(inquiry.VendorId, "IBM ", 8);
|
||||
strncpy(inquiry.ProductId, "SERVERAID ", 16);
|
||||
strncpy(inquiry.ProductRevisionLevel, "1.00", 4);
|
||||
memcpy(inquiry.VendorId, "IBM ", 8);
|
||||
memcpy(inquiry.ProductId, "SERVERAID ", 16);
|
||||
memcpy(inquiry.ProductRevisionLevel, "1.00", 4);
|
||||
|
||||
ips_scmd_buf_write(scb->scsi_cmd, &inquiry, sizeof (inquiry));
|
||||
|
||||
@ -4697,7 +4697,6 @@ ips_init_copperhead(ips_ha_t * ha)
|
||||
uint8_t Isr;
|
||||
uint8_t Cbsp;
|
||||
uint8_t PostByte[IPS_MAX_POST_BYTES];
|
||||
uint8_t ConfigByte[IPS_MAX_CONFIG_BYTES];
|
||||
int i, j;
|
||||
|
||||
METHOD_TRACE("ips_init_copperhead", 1);
|
||||
@ -4742,7 +4741,7 @@ ips_init_copperhead(ips_ha_t * ha)
|
||||
/* error occurred */
|
||||
return (0);
|
||||
|
||||
ConfigByte[i] = inb(ha->io_addr + IPS_REG_ISPR);
|
||||
inb(ha->io_addr + IPS_REG_ISPR);
|
||||
outb(Isr, ha->io_addr + IPS_REG_HISR);
|
||||
}
|
||||
|
||||
@ -4791,7 +4790,6 @@ ips_init_copperhead_memio(ips_ha_t * ha)
|
||||
uint8_t Isr = 0;
|
||||
uint8_t Cbsp;
|
||||
uint8_t PostByte[IPS_MAX_POST_BYTES];
|
||||
uint8_t ConfigByte[IPS_MAX_CONFIG_BYTES];
|
||||
int i, j;
|
||||
|
||||
METHOD_TRACE("ips_init_copperhead_memio", 1);
|
||||
@ -4836,7 +4834,7 @@ ips_init_copperhead_memio(ips_ha_t * ha)
|
||||
/* error occurred */
|
||||
return (0);
|
||||
|
||||
ConfigByte[i] = readb(ha->mem_ptr + IPS_REG_ISPR);
|
||||
readb(ha->mem_ptr + IPS_REG_ISPR);
|
||||
writeb(Isr, ha->mem_ptr + IPS_REG_HISR);
|
||||
}
|
||||
|
||||
@ -5622,10 +5620,10 @@ ips_write_driver_status(ips_ha_t * ha, int intr)
|
||||
/* change values (as needed) */
|
||||
ha->nvram->operating_system = IPS_OS_LINUX;
|
||||
ha->nvram->adapter_type = ha->ad_type;
|
||||
strncpy((char *) ha->nvram->driver_high, IPS_VERSION_HIGH, 4);
|
||||
strncpy((char *) ha->nvram->driver_low, IPS_VERSION_LOW, 4);
|
||||
strncpy((char *) ha->nvram->bios_high, ha->bios_version, 4);
|
||||
strncpy((char *) ha->nvram->bios_low, ha->bios_version + 4, 4);
|
||||
memcpy((char *) ha->nvram->driver_high, IPS_VERSION_HIGH, 4);
|
||||
memcpy((char *) ha->nvram->driver_low, IPS_VERSION_LOW, 4);
|
||||
memcpy((char *) ha->nvram->bios_high, ha->bios_version, 4);
|
||||
memcpy((char *) ha->nvram->bios_low, ha->bios_version + 4, 4);
|
||||
|
||||
ha->nvram->versioning = 0; /* Indicate the Driver Does Not Support Versioning */
|
||||
|
||||
@ -6835,8 +6833,6 @@ ips_init_phase1(struct pci_dev *pci_dev, int *indexPtr)
|
||||
uint32_t mem_addr;
|
||||
uint32_t io_len;
|
||||
uint32_t mem_len;
|
||||
uint8_t bus;
|
||||
uint8_t func;
|
||||
int j;
|
||||
int index;
|
||||
dma_addr_t dma_address;
|
||||
@ -6856,10 +6852,6 @@ ips_init_phase1(struct pci_dev *pci_dev, int *indexPtr)
|
||||
if (index >= IPS_MAX_ADAPTERS)
|
||||
return -1;
|
||||
|
||||
/* stuff that we get in dev */
|
||||
bus = pci_dev->bus->number;
|
||||
func = pci_dev->devfn;
|
||||
|
||||
/* Init MEM/IO addresses to 0 */
|
||||
mem_addr = 0;
|
||||
io_addr = 0;
|
||||
|
@ -3444,7 +3444,7 @@ struct isci_request *isci_tmf_request_from_tag(struct isci_host *ihost,
|
||||
int isci_request_execute(struct isci_host *ihost, struct isci_remote_device *idev,
|
||||
struct sas_task *task, u16 tag)
|
||||
{
|
||||
enum sci_status status = SCI_FAILURE_UNSUPPORTED_PROTOCOL;
|
||||
enum sci_status status;
|
||||
struct isci_request *ireq;
|
||||
unsigned long flags;
|
||||
int ret = 0;
|
||||
|
@ -337,7 +337,7 @@ static void fc_disc_error(struct fc_disc *disc, struct fc_frame *fp)
|
||||
|
||||
/**
|
||||
* fc_disc_gpn_ft_req() - Send Get Port Names by FC-4 type (GPN_FT) request
|
||||
* @lport: The discovery context
|
||||
* @disc: The discovery context
|
||||
*/
|
||||
static void fc_disc_gpn_ft_req(struct fc_disc *disc)
|
||||
{
|
||||
@ -370,7 +370,7 @@ err:
|
||||
|
||||
/**
|
||||
* fc_disc_gpn_ft_parse() - Parse the body of the dNS GPN_FT response.
|
||||
* @lport: The local port the GPN_FT was received on
|
||||
* @disc: The discovery context
|
||||
* @buf: The GPN_FT response buffer
|
||||
* @len: The size of response buffer
|
||||
*
|
||||
@ -488,7 +488,7 @@ static void fc_disc_timeout(struct work_struct *work)
|
||||
* fc_disc_gpn_ft_resp() - Handle a response frame from Get Port Names (GPN_FT)
|
||||
* @sp: The sequence that the GPN_FT response was received on
|
||||
* @fp: The GPN_FT response frame
|
||||
* @lp_arg: The discovery context
|
||||
* @disc_arg: The discovery context
|
||||
*
|
||||
* Locking Note: This function is called without disc mutex held, and
|
||||
* should do all its processing with the mutex held
|
||||
|
@ -49,6 +49,8 @@ static struct workqueue_struct *fc_exch_workqueue;
|
||||
* @total_exches: Total allocated exchanges
|
||||
* @lock: Exch pool lock
|
||||
* @ex_list: List of exchanges
|
||||
* @left: Cache of free slot in exch array
|
||||
* @right: Cache of free slot in exch array
|
||||
*
|
||||
* This structure manages per cpu exchanges in array of exchange pointers.
|
||||
* This array is allocated followed by struct fc_exch_pool memory for
|
||||
@ -60,7 +62,6 @@ struct fc_exch_pool {
|
||||
u16 next_index;
|
||||
u16 total_exches;
|
||||
|
||||
/* two cache of free slot in exch array */
|
||||
u16 left;
|
||||
u16 right;
|
||||
} ____cacheline_aligned_in_smp;
|
||||
@ -74,6 +75,7 @@ struct fc_exch_pool {
|
||||
* @ep_pool: Reserved exchange pointers
|
||||
* @pool_max_index: Max exch array index in exch pool
|
||||
* @pool: Per cpu exch pool
|
||||
* @lport: Local exchange port
|
||||
* @stats: Statistics structure
|
||||
*
|
||||
* This structure is the center for creating exchanges and sequences.
|
||||
@ -702,6 +704,9 @@ int fc_seq_exch_abort(const struct fc_seq *req_sp, unsigned int timer_msec)
|
||||
|
||||
/**
|
||||
* fc_invoke_resp() - invoke ep->resp()
|
||||
* @ep: The exchange to be operated on
|
||||
* @fp: The frame pointer to pass through to ->resp()
|
||||
* @sp: The sequence pointer to pass through to ->resp()
|
||||
*
|
||||
* Notes:
|
||||
* It is assumed that after initialization finished (this means the
|
||||
|
@ -289,6 +289,7 @@ static int fc_fcp_send_abort(struct fc_fcp_pkt *fsp)
|
||||
/**
|
||||
* fc_fcp_retry_cmd() - Retry a fcp_pkt
|
||||
* @fsp: The FCP packet to be retried
|
||||
* @status_code: The FCP status code to set
|
||||
*
|
||||
* Sets the status code to be FC_ERROR and then calls
|
||||
* fc_fcp_complete_locked() which in turn calls fc_io_compl().
|
||||
@ -580,7 +581,7 @@ err:
|
||||
/**
|
||||
* fc_fcp_send_data() - Send SCSI data to a target
|
||||
* @fsp: The FCP packet the data is on
|
||||
* @sp: The sequence the data is to be sent on
|
||||
* @seq: The sequence the data is to be sent on
|
||||
* @offset: The starting offset for this data request
|
||||
* @seq_blen: The burst length for this data request
|
||||
*
|
||||
@ -1283,7 +1284,7 @@ static int fc_fcp_pkt_abort(struct fc_fcp_pkt *fsp)
|
||||
|
||||
/**
|
||||
* fc_lun_reset_send() - Send LUN reset command
|
||||
* @data: The FCP packet that identifies the LUN to be reset
|
||||
* @t: Timer context used to fetch the FSP packet
|
||||
*/
|
||||
static void fc_lun_reset_send(struct timer_list *t)
|
||||
{
|
||||
@ -1409,7 +1410,7 @@ static void fc_fcp_cleanup(struct fc_lport *lport)
|
||||
|
||||
/**
|
||||
* fc_fcp_timeout() - Handler for fcp_pkt timeouts
|
||||
* @data: The FCP packet that has timed out
|
||||
* @t: Timer context used to fetch the FSP packet
|
||||
*
|
||||
* If REC is supported then just issue it and return. The REC exchange will
|
||||
* complete or time out and recovery can continue at that point. Otherwise,
|
||||
@ -1691,6 +1692,7 @@ out:
|
||||
/**
|
||||
* fc_fcp_recovery() - Handler for fcp_pkt recovery
|
||||
* @fsp: The FCP pkt that needs to be aborted
|
||||
* @code: The FCP status code to set
|
||||
*/
|
||||
static void fc_fcp_recovery(struct fc_fcp_pkt *fsp, u8 code)
|
||||
{
|
||||
@ -1709,6 +1711,7 @@ static void fc_fcp_recovery(struct fc_fcp_pkt *fsp, u8 code)
|
||||
* fc_fcp_srr() - Send a SRR request (Sequence Retransmission Request)
|
||||
* @fsp: The FCP packet the SRR is to be sent on
|
||||
* @r_ctl: The R_CTL field for the SRR request
|
||||
* @offset: The SRR relative offset
|
||||
* This is called after receiving status but insufficient data, or
|
||||
* when expecting status but the request has timed out.
|
||||
*/
|
||||
@ -1851,7 +1854,7 @@ static inline int fc_fcp_lport_queue_ready(struct fc_lport *lport)
|
||||
/**
|
||||
* fc_queuecommand() - The queuecommand function of the SCSI template
|
||||
* @shost: The Scsi_Host that the command was issued to
|
||||
* @cmd: The scsi_cmnd to be executed
|
||||
* @sc_cmd: The scsi_cmnd to be executed
|
||||
*
|
||||
* This is the i/o strategy routine, called by the SCSI layer.
|
||||
*/
|
||||
|
@ -405,7 +405,7 @@ static void fc_lport_recv_rlir_req(struct fc_lport *lport, struct fc_frame *fp)
|
||||
/**
|
||||
* fc_lport_recv_echo_req() - Handle received ECHO request
|
||||
* @lport: The local port receiving the ECHO
|
||||
* @fp: ECHO request frame
|
||||
* @in_fp: ECHO request frame
|
||||
*/
|
||||
static void fc_lport_recv_echo_req(struct fc_lport *lport,
|
||||
struct fc_frame *in_fp)
|
||||
@ -440,7 +440,7 @@ static void fc_lport_recv_echo_req(struct fc_lport *lport,
|
||||
/**
|
||||
* fc_lport_recv_rnid_req() - Handle received Request Node ID data request
|
||||
* @lport: The local port receiving the RNID
|
||||
* @fp: The RNID request frame
|
||||
* @in_fp: The RNID request frame
|
||||
*/
|
||||
static void fc_lport_recv_rnid_req(struct fc_lport *lport,
|
||||
struct fc_frame *in_fp)
|
||||
@ -1325,6 +1325,7 @@ static void fc_lport_enter_scr(struct fc_lport *lport)
|
||||
/**
|
||||
* fc_lport_enter_ns() - register some object with the name server
|
||||
* @lport: Fibre Channel local port to register
|
||||
* @state: Local port state
|
||||
*/
|
||||
static void fc_lport_enter_ns(struct fc_lport *lport, enum fc_lport_state state)
|
||||
{
|
||||
@ -1423,6 +1424,7 @@ err:
|
||||
/**
|
||||
* fc_lport_enter_ms() - management server commands
|
||||
* @lport: Fibre Channel local port to register
|
||||
* @state: Local port state
|
||||
*/
|
||||
static void fc_lport_enter_ms(struct fc_lport *lport, enum fc_lport_state state)
|
||||
{
|
||||
@ -1932,6 +1934,7 @@ static void fc_lport_bsg_resp(struct fc_seq *sp, struct fc_frame *fp,
|
||||
* @job: The BSG Passthrough job
|
||||
* @lport: The local port sending the request
|
||||
* @did: The destination port id
|
||||
* @tov: The timeout period (in ms)
|
||||
*/
|
||||
static int fc_lport_els_request(struct bsg_job *job,
|
||||
struct fc_lport *lport,
|
||||
|
@ -121,7 +121,7 @@ EXPORT_SYMBOL(fc_rport_lookup);
|
||||
/**
|
||||
* fc_rport_create() - Create a new remote port
|
||||
* @lport: The local port this remote port will be associated with
|
||||
* @ids: The identifiers for the new remote port
|
||||
* @port_id: The identifiers for the new remote port
|
||||
*
|
||||
* The remote port will start in the INIT state.
|
||||
*/
|
||||
@ -1445,7 +1445,7 @@ drop:
|
||||
* fc_rport_logo_resp() - Handler for logout (LOGO) responses
|
||||
* @sp: The sequence the LOGO was on
|
||||
* @fp: The LOGO response frame
|
||||
* @lport_arg: The local port
|
||||
* @rdata_arg: The remote port
|
||||
*/
|
||||
static void fc_rport_logo_resp(struct fc_seq *sp, struct fc_frame *fp,
|
||||
void *rdata_arg)
|
||||
|
@ -507,10 +507,23 @@ void sas_ata_end_eh(struct ata_port *ap)
|
||||
spin_unlock_irqrestore(&ha->lock, flags);
|
||||
}
|
||||
|
||||
static int sas_ata_prereset(struct ata_link *link, unsigned long deadline)
|
||||
{
|
||||
struct ata_port *ap = link->ap;
|
||||
struct domain_device *dev = ap->private_data;
|
||||
struct sas_phy *local_phy = sas_get_local_phy(dev);
|
||||
int res = 0;
|
||||
|
||||
if (!local_phy->enabled || test_bit(SAS_DEV_GONE, &dev->state))
|
||||
res = -ENOENT;
|
||||
sas_put_local_phy(local_phy);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
static struct ata_port_operations sas_sata_ops = {
|
||||
.prereset = ata_std_prereset,
|
||||
.prereset = sas_ata_prereset,
|
||||
.hardreset = sas_ata_hard_reset,
|
||||
.postreset = ata_std_postreset,
|
||||
.error_handler = ata_std_error_handler,
|
||||
.post_internal_cmd = sas_ata_post_internal,
|
||||
.qc_defer = ata_std_qc_defer,
|
||||
|
@ -427,7 +427,7 @@ out_err:
|
||||
static int sas_expander_discover(struct domain_device *dev)
|
||||
{
|
||||
struct expander_device *ex = &dev->ex_dev;
|
||||
int res = -ENOMEM;
|
||||
int res;
|
||||
|
||||
ex->ex_phy = kcalloc(ex->num_phys, sizeof(*ex->ex_phy), GFP_KERNEL);
|
||||
if (!ex->ex_phy)
|
||||
|
@ -627,6 +627,14 @@ struct lpfc_ras_fwlog {
|
||||
enum ras_state state; /* RAS logging running state */
|
||||
};
|
||||
|
||||
#define DBG_LOG_STR_SZ 256
|
||||
#define DBG_LOG_SZ 256
|
||||
|
||||
struct dbg_log_ent {
|
||||
char log[DBG_LOG_STR_SZ];
|
||||
u64 t_ns;
|
||||
};
|
||||
|
||||
enum lpfc_irq_chann_mode {
|
||||
/* Assign IRQs to all possible cpus that have hardware queues */
|
||||
NORMAL_MODE,
|
||||
@ -709,6 +717,9 @@ struct lpfc_hba {
|
||||
struct workqueue_struct *wq;
|
||||
struct delayed_work eq_delay_work;
|
||||
|
||||
#define LPFC_IDLE_STAT_DELAY 1000
|
||||
struct delayed_work idle_stat_delay_work;
|
||||
|
||||
struct lpfc_sli sli;
|
||||
uint8_t pci_dev_grp; /* lpfc PCI dev group: 0x0, 0x1, 0x2,... */
|
||||
uint32_t sli_rev; /* SLI2, SLI3, or SLI4 */
|
||||
@ -1237,6 +1248,10 @@ struct lpfc_hba {
|
||||
struct scsi_host_template port_template;
|
||||
/* SCSI host template information - for all vports */
|
||||
struct scsi_host_template vport_template;
|
||||
atomic_t dbg_log_idx;
|
||||
atomic_t dbg_log_cnt;
|
||||
atomic_t dbg_log_dmping;
|
||||
struct dbg_log_ent dbg_log[DBG_LOG_SZ];
|
||||
};
|
||||
|
||||
static inline struct Scsi_Host *
|
||||
|
@ -2404,33 +2404,27 @@ lpfc_sli4_bsg_link_diag_test(struct bsg_job *job)
|
||||
union lpfc_sli4_cfg_shdr *shdr;
|
||||
uint32_t shdr_status, shdr_add_status;
|
||||
struct diag_status *diag_status_reply;
|
||||
int mbxstatus, rc = 0;
|
||||
int mbxstatus, rc = -ENODEV, rc1 = 0;
|
||||
|
||||
shost = fc_bsg_to_shost(job);
|
||||
if (!shost) {
|
||||
rc = -ENODEV;
|
||||
if (!shost)
|
||||
goto job_error;
|
||||
}
|
||||
vport = shost_priv(shost);
|
||||
if (!vport) {
|
||||
rc = -ENODEV;
|
||||
goto job_error;
|
||||
}
|
||||
phba = vport->phba;
|
||||
if (!phba) {
|
||||
rc = -ENODEV;
|
||||
goto job_error;
|
||||
}
|
||||
|
||||
if (phba->sli_rev < LPFC_SLI_REV4) {
|
||||
rc = -ENODEV;
|
||||
vport = shost_priv(shost);
|
||||
if (!vport)
|
||||
goto job_error;
|
||||
}
|
||||
|
||||
phba = vport->phba;
|
||||
if (!phba)
|
||||
goto job_error;
|
||||
|
||||
|
||||
if (phba->sli_rev < LPFC_SLI_REV4)
|
||||
goto job_error;
|
||||
|
||||
if (bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) <
|
||||
LPFC_SLI_INTF_IF_TYPE_2) {
|
||||
rc = -ENODEV;
|
||||
LPFC_SLI_INTF_IF_TYPE_2)
|
||||
goto job_error;
|
||||
}
|
||||
|
||||
if (job->request_len < sizeof(struct fc_bsg_request) +
|
||||
sizeof(struct sli4_link_diag)) {
|
||||
@ -2465,8 +2459,10 @@ lpfc_sli4_bsg_link_diag_test(struct bsg_job *job)
|
||||
alloc_len = lpfc_sli4_config(phba, pmboxq, LPFC_MBOX_SUBSYSTEM_FCOE,
|
||||
LPFC_MBOX_OPCODE_FCOE_LINK_DIAG_STATE,
|
||||
req_len, LPFC_SLI4_MBX_EMBED);
|
||||
if (alloc_len != req_len)
|
||||
if (alloc_len != req_len) {
|
||||
rc = -ENOMEM;
|
||||
goto link_diag_test_exit;
|
||||
}
|
||||
|
||||
run_link_diag_test = &pmboxq->u.mqe.un.link_diag_test;
|
||||
bf_set(lpfc_mbx_run_diag_test_link_num, &run_link_diag_test->u.req,
|
||||
@ -2515,7 +2511,7 @@ lpfc_sli4_bsg_link_diag_test(struct bsg_job *job)
|
||||
diag_status_reply->shdr_add_status = shdr_add_status;
|
||||
|
||||
link_diag_test_exit:
|
||||
rc = lpfc_sli4_bsg_set_link_diag_state(phba, 0);
|
||||
rc1 = lpfc_sli4_bsg_set_link_diag_state(phba, 0);
|
||||
|
||||
if (pmboxq)
|
||||
mempool_free(pmboxq, phba->mbox_mem_pool);
|
||||
@ -2524,6 +2520,8 @@ link_diag_test_exit:
|
||||
|
||||
job_error:
|
||||
/* make error code available to userspace */
|
||||
if (rc1 && !rc)
|
||||
rc = rc1;
|
||||
bsg_reply->result = rc;
|
||||
/* complete the job back to userspace if no error */
|
||||
if (rc == 0)
|
||||
@ -4306,6 +4304,7 @@ lpfc_bsg_handle_sli_cfg_mbox(struct lpfc_hba *phba, struct bsg_job *job,
|
||||
case COMN_OPCODE_GET_CNTL_ADDL_ATTRIBUTES:
|
||||
case COMN_OPCODE_GET_CNTL_ATTRIBUTES:
|
||||
case COMN_OPCODE_GET_PROFILE_CONFIG:
|
||||
case COMN_OPCODE_SET_FEATURES:
|
||||
lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
|
||||
"3106 Handled SLI_CONFIG "
|
||||
"subsys_comn, opcode:x%x\n",
|
||||
|
@ -225,6 +225,10 @@ struct lpfc_sli_config_hdr {
|
||||
uint32_t reserved5;
|
||||
};
|
||||
|
||||
#define LPFC_CSF_BOOT_DEV 0x1D
|
||||
#define LPFC_CSF_QUERY 0
|
||||
#define LPFC_CSF_SAVE 1
|
||||
|
||||
struct lpfc_sli_config_emb0_subsys {
|
||||
struct lpfc_sli_config_hdr sli_config_hdr;
|
||||
#define LPFC_MBX_SLI_CONFIG_MAX_MSE 19
|
||||
@ -243,6 +247,15 @@ struct lpfc_sli_config_emb0_subsys {
|
||||
#define FCOE_OPCODE_ADD_FCF 0x09
|
||||
#define FCOE_OPCODE_SET_DPORT_MODE 0x27
|
||||
#define FCOE_OPCODE_GET_DPORT_RESULTS 0x28
|
||||
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 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
|
||||
};
|
||||
|
||||
struct lpfc_sli_config_emb1_subsys {
|
||||
@ -261,6 +274,7 @@ struct lpfc_sli_config_emb1_subsys {
|
||||
#define COMN_OPCODE_WRITE_OBJECT 0xAC
|
||||
#define COMN_OPCODE_READ_OBJECT_LIST 0xAD
|
||||
#define COMN_OPCODE_DELETE_OBJECT 0xAE
|
||||
#define COMN_OPCODE_SET_FEATURES 0xBF
|
||||
#define COMN_OPCODE_GET_CNTL_ADDL_ATTRIBUTES 0x79
|
||||
#define COMN_OPCODE_GET_CNTL_ATTRIBUTES 0x20
|
||||
uint32_t timeout;
|
||||
|
@ -386,7 +386,7 @@ void lpfc_rq_buf_free(struct lpfc_hba *phba, struct lpfc_dmabuf *mp);
|
||||
int lpfc_link_reset(struct lpfc_vport *vport);
|
||||
|
||||
/* Function prototypes. */
|
||||
int lpfc_check_pci_resettable(const struct lpfc_hba *phba);
|
||||
int lpfc_check_pci_resettable(struct lpfc_hba *phba);
|
||||
const char* lpfc_info(struct Scsi_Host *);
|
||||
int lpfc_scan_finished(struct Scsi_Host *, unsigned long);
|
||||
|
||||
|
@ -300,7 +300,7 @@ lpfc_ct_free_iocb(struct lpfc_hba *phba, struct lpfc_iocbq *ctiocb)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* lpfc_gen_req - Build and issue a GEN_REQUEST command to the SLI Layer
|
||||
* @vport: pointer to a host virtual N_Port data structure.
|
||||
* @bmp: Pointer to BPL for SLI command
|
||||
@ -394,7 +394,7 @@ lpfc_gen_req(struct lpfc_vport *vport, struct lpfc_dmabuf *bmp,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* lpfc_ct_cmd - Build and issue a CT command
|
||||
* @vport: pointer to a host virtual N_Port data structure.
|
||||
* @inmp: Pointer to data buffer for response data.
|
||||
@ -750,7 +750,7 @@ lpfc_cmpl_ct_cmd_gid_ft(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
if (vport->fc_flag & FC_RSCN_MODE)
|
||||
lpfc_els_flush_rscn(vport);
|
||||
lpfc_vport_set_state(vport, FC_VPORT_FAILED);
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"0257 GID_FT Query error: 0x%x 0x%x\n",
|
||||
irsp->ulpStatus, vport->fc_ns_retry);
|
||||
} else {
|
||||
@ -811,7 +811,7 @@ lpfc_cmpl_ct_cmd_gid_ft(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
|
||||
} else {
|
||||
/* NameServer Rsp Error */
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_DISCOVERY,
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"0241 NameServer Rsp Error "
|
||||
"Data: x%x x%x x%x x%x\n",
|
||||
CTrsp->CommandResponse.bits.CmdRsp,
|
||||
@ -951,7 +951,7 @@ lpfc_cmpl_ct_cmd_gid_pt(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
if (vport->fc_flag & FC_RSCN_MODE)
|
||||
lpfc_els_flush_rscn(vport);
|
||||
lpfc_vport_set_state(vport, FC_VPORT_FAILED);
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"4103 GID_FT Query error: 0x%x 0x%x\n",
|
||||
irsp->ulpStatus, vport->fc_ns_retry);
|
||||
} else {
|
||||
@ -1012,7 +1012,7 @@ lpfc_cmpl_ct_cmd_gid_pt(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
}
|
||||
} else {
|
||||
/* NameServer Rsp Error */
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_DISCOVERY,
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"4109 NameServer Rsp Error "
|
||||
"Data: x%x x%x x%x x%x\n",
|
||||
CTrsp->CommandResponse.bits.CmdRsp,
|
||||
@ -1143,7 +1143,7 @@ lpfc_cmpl_ct_cmd_gff_id(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
}
|
||||
}
|
||||
}
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_DISCOVERY,
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"0267 NameServer GFF Rsp "
|
||||
"x%x Error (%d %d) Data: x%x x%x\n",
|
||||
did, irsp->ulpStatus, irsp->un.ulpWord[4],
|
||||
@ -1271,7 +1271,7 @@ lpfc_cmpl_ct_cmd_gft_id(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
}
|
||||
}
|
||||
} else
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_DISCOVERY,
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"3065 GFT_ID failed x%08x\n", irsp->ulpStatus);
|
||||
|
||||
lpfc_ct_free_iocb(phba, cmdiocb);
|
||||
@ -1320,7 +1320,7 @@ lpfc_cmpl_ct(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
irsp->ulpStatus, irsp->un.ulpWord[4], cmdcode);
|
||||
|
||||
if (irsp->ulpStatus) {
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_DISCOVERY,
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"0268 NS cmd x%x Error (x%x x%x)\n",
|
||||
cmdcode, irsp->ulpStatus, irsp->un.ulpWord[4]);
|
||||
|
||||
@ -1843,7 +1843,7 @@ ns_cmd_free_mpvirt:
|
||||
ns_cmd_free_mp:
|
||||
kfree(mp);
|
||||
ns_cmd_exit:
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_DISCOVERY,
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"0266 Issue NameServer Req x%x err %d Data: x%x x%x\n",
|
||||
cmdcode, rc, vport->fc_flag, vport->fc_rscn_id_cnt);
|
||||
return 1;
|
||||
@ -3019,8 +3019,8 @@ int (*lpfc_fdmi_port_action[])
|
||||
* lpfc_fdmi_cmd - Build and send a FDMI cmd to the specified NPort
|
||||
* @vport: pointer to a host virtual N_Port data structure.
|
||||
* @ndlp: ndlp to send FDMI cmd to (if NULL use FDMI_DID)
|
||||
* cmdcode: FDMI command to send
|
||||
* mask: Mask of HBA or PORT Attributes to send
|
||||
* @cmdcode: FDMI command to send
|
||||
* @new_mask: Mask of HBA or PORT Attributes to send
|
||||
*
|
||||
* Builds and sends a FDMI command using the CT subsystem.
|
||||
*/
|
||||
@ -3262,7 +3262,7 @@ fdmi_cmd_exit:
|
||||
|
||||
/**
|
||||
* lpfc_delayed_disc_tmo - Timeout handler for delayed discovery timer.
|
||||
* @ptr - Context object of the timer.
|
||||
* @t: Context object of the timer.
|
||||
*
|
||||
* This function set the WORKER_DELAYED_DISC_TMO flag and wake up
|
||||
* the worker thread.
|
||||
|
@ -100,7 +100,7 @@ lpfc_els_chk_latt(struct lpfc_vport *vport)
|
||||
return 0;
|
||||
|
||||
/* Pending Link Event during Discovery */
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_DISCOVERY,
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"0237 Pending Link Event during "
|
||||
"Discovery: State x%x\n",
|
||||
phba->pport->port_state);
|
||||
@ -440,8 +440,9 @@ fail_free_mbox:
|
||||
|
||||
fail:
|
||||
lpfc_vport_set_state(vport, FC_VPORT_FAILED);
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
|
||||
"0249 Cannot issue Register Fabric login: Err %d\n", err);
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"0249 Cannot issue Register Fabric login: Err %d\n",
|
||||
err);
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
@ -524,8 +525,8 @@ fail:
|
||||
}
|
||||
|
||||
lpfc_vport_set_state(vport, FC_VPORT_FAILED);
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
|
||||
"0289 Issue Register VFI failed: Err %d\n", rc);
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"0289 Issue Register VFI failed: Err %d\n", rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
@ -550,7 +551,7 @@ lpfc_issue_unreg_vfi(struct lpfc_vport *vport)
|
||||
|
||||
mboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
|
||||
if (!mboxq) {
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_DISCOVERY|LOG_MBOX,
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"2556 UNREG_VFI mbox allocation failed"
|
||||
"HBA state x%x\n", phba->pport->port_state);
|
||||
return -ENOMEM;
|
||||
@ -562,7 +563,7 @@ lpfc_issue_unreg_vfi(struct lpfc_vport *vport)
|
||||
|
||||
rc = lpfc_sli_issue_mbox(phba, mboxq, MBX_NOWAIT);
|
||||
if (rc == MBX_NOT_FINISHED) {
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_DISCOVERY|LOG_MBOX,
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"2557 UNREG_VFI issue mbox failed rc x%x "
|
||||
"HBA state x%x\n",
|
||||
rc, phba->pport->port_state);
|
||||
@ -1041,18 +1042,18 @@ stop_rr_fcf_flogi:
|
||||
if (!(irsp->ulpStatus == IOSTAT_LOCAL_REJECT &&
|
||||
((irsp->un.ulpWord[4] & IOERR_PARAM_MASK) ==
|
||||
IOERR_LOOP_OPEN_FAILURE)))
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
|
||||
"2858 FLOGI failure Status:x%x/x%x "
|
||||
"TMO:x%x Data x%x x%x\n",
|
||||
irsp->ulpStatus, irsp->un.ulpWord[4],
|
||||
irsp->ulpTimeout, phba->hba_flag,
|
||||
phba->fcf.fcf_flag);
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"2858 FLOGI failure Status:x%x/x%x TMO"
|
||||
":x%x Data x%x x%x\n",
|
||||
irsp->ulpStatus, irsp->un.ulpWord[4],
|
||||
irsp->ulpTimeout, phba->hba_flag,
|
||||
phba->fcf.fcf_flag);
|
||||
|
||||
/* Check for retry */
|
||||
if (lpfc_els_retry(phba, cmdiocb, rspiocb))
|
||||
goto out;
|
||||
|
||||
lpfc_printf_vlog(vport, KERN_WARNING, LOG_ELS,
|
||||
lpfc_printf_vlog(vport, KERN_WARNING, LOG_TRACE_EVENT,
|
||||
"0150 FLOGI failure Status:x%x/x%x "
|
||||
"xri x%x TMO:x%x\n",
|
||||
irsp->ulpStatus, irsp->un.ulpWord[4],
|
||||
@ -1132,8 +1133,7 @@ stop_rr_fcf_flogi:
|
||||
else if (!(phba->hba_flag & HBA_FCOE_MODE))
|
||||
rc = lpfc_cmpl_els_flogi_nport(vport, ndlp, sp);
|
||||
else {
|
||||
lpfc_printf_vlog(vport, KERN_ERR,
|
||||
LOG_FIP | LOG_ELS,
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"2831 FLOGI response with cleared Fabric "
|
||||
"bit fcf_index 0x%x "
|
||||
"Switch Name %02x%02x%02x%02x%02x%02x%02x%02x "
|
||||
@ -1934,7 +1934,7 @@ lpfc_cmpl_els_rrq(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
|
||||
ndlp = lpfc_findnode_did(vport, irsp->un.elsreq64.remoteID);
|
||||
if (!ndlp || !NLP_CHK_NODE_ACT(ndlp) || ndlp != rrq->ndlp) {
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"2882 RRQ completes to NPort x%x "
|
||||
"with no ndlp. Data: x%x x%x x%x\n",
|
||||
irsp->un.elsreq64.remoteID,
|
||||
@ -1957,10 +1957,11 @@ lpfc_cmpl_els_rrq(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
(((irsp->un.ulpWord[4]) >> 16 != LSRJT_INVALID_CMD) &&
|
||||
((irsp->un.ulpWord[4]) >> 16 != LSRJT_UNABLE_TPC)) ||
|
||||
(phba)->pport->cfg_log_verbose & LOG_ELS)
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
|
||||
"2881 RRQ failure DID:%06X Status:x%x/x%x\n",
|
||||
ndlp->nlp_DID, irsp->ulpStatus,
|
||||
irsp->un.ulpWord[4]);
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"2881 RRQ failure DID:%06X Status:"
|
||||
"x%x/x%x\n",
|
||||
ndlp->nlp_DID, irsp->ulpStatus,
|
||||
irsp->un.ulpWord[4]);
|
||||
}
|
||||
out:
|
||||
if (rrq)
|
||||
@ -2010,7 +2011,7 @@ lpfc_cmpl_els_plogi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
|
||||
ndlp = lpfc_findnode_did(vport, irsp->un.elsreq64.remoteID);
|
||||
if (!ndlp || !NLP_CHK_NODE_ACT(ndlp)) {
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"0136 PLOGI completes to NPort x%x "
|
||||
"with no ndlp. Data: x%x x%x x%x\n",
|
||||
irsp->un.elsreq64.remoteID,
|
||||
@ -2059,7 +2060,7 @@ lpfc_cmpl_els_plogi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
(((irsp->un.ulpWord[4]) >> 16 != LSRJT_INVALID_CMD) &&
|
||||
((irsp->un.ulpWord[4]) >> 16 != LSRJT_UNABLE_TPC)) ||
|
||||
(phba)->pport->cfg_log_verbose & LOG_ELS)
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"2753 PLOGI failure DID:%06X Status:x%x/x%x\n",
|
||||
ndlp->nlp_DID, irsp->ulpStatus,
|
||||
irsp->un.ulpWord[4]);
|
||||
@ -2237,6 +2238,7 @@ lpfc_cmpl_els_prli(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
IOCB_t *irsp;
|
||||
struct lpfc_nodelist *ndlp;
|
||||
char *mode;
|
||||
u32 loglevel;
|
||||
|
||||
/* we pass cmdiocb to state machine which needs rspiocb as well */
|
||||
cmdiocb->context_un.rsp_iocb = rspiocb;
|
||||
@ -2278,13 +2280,16 @@ lpfc_cmpl_els_prli(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
* could be expected.
|
||||
*/
|
||||
if ((vport->fc_flag & FC_FABRIC) ||
|
||||
(vport->cfg_enable_fc4_type != LPFC_ENABLE_BOTH))
|
||||
(vport->cfg_enable_fc4_type != LPFC_ENABLE_BOTH)) {
|
||||
mode = KERN_ERR;
|
||||
else
|
||||
loglevel = LOG_TRACE_EVENT;
|
||||
} else {
|
||||
mode = KERN_INFO;
|
||||
loglevel = LOG_ELS;
|
||||
}
|
||||
|
||||
/* PRLI failed */
|
||||
lpfc_printf_vlog(vport, mode, LOG_ELS,
|
||||
lpfc_printf_vlog(vport, mode, loglevel,
|
||||
"2754 PRLI failure DID:%06X Status:x%x/x%x, "
|
||||
"data: x%x\n",
|
||||
ndlp->nlp_DID, irsp->ulpStatus,
|
||||
@ -2695,7 +2700,7 @@ lpfc_cmpl_els_adisc(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
goto out;
|
||||
}
|
||||
/* ADISC failed */
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"2755 ADISC failure DID:%06X Status:x%x/x%x\n",
|
||||
ndlp->nlp_DID, irsp->ulpStatus,
|
||||
irsp->un.ulpWord[4]);
|
||||
@ -2853,7 +2858,7 @@ lpfc_cmpl_els_logo(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
*/
|
||||
if (irsp->ulpStatus) {
|
||||
/* LOGO failed */
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"2756 LOGO failure, No Retry DID:%06X Status:x%x/x%x\n",
|
||||
ndlp->nlp_DID, irsp->ulpStatus,
|
||||
irsp->un.ulpWord[4]);
|
||||
@ -3597,7 +3602,7 @@ lpfc_cancel_retry_delay_tmo(struct lpfc_vport *vport, struct lpfc_nodelist *nlp)
|
||||
|
||||
/**
|
||||
* lpfc_els_retry_delay - Timer function with a ndlp delayed function timer
|
||||
* @ptr: holder for the pointer to the timer function associated data (ndlp).
|
||||
* @t: pointer to the timer function associated data (ndlp).
|
||||
*
|
||||
* This routine is invoked by the ndlp delayed-function timer to check
|
||||
* whether there is any pending ELS retry event(s) with the node. If not, it
|
||||
@ -3734,7 +3739,7 @@ lpfc_link_reset(struct lpfc_vport *vport)
|
||||
"2851 Attempt link reset\n");
|
||||
mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
|
||||
if (!mbox) {
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_MBOX,
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"2852 Failed to allocate mbox memory");
|
||||
return 1;
|
||||
}
|
||||
@ -3756,7 +3761,7 @@ lpfc_link_reset(struct lpfc_vport *vport)
|
||||
mbox->vport = vport;
|
||||
rc = lpfc_sli_issue_mbox(phba, mbox, MBX_NOWAIT);
|
||||
if ((rc != MBX_BUSY) && (rc != MBX_SUCCESS)) {
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_MBOX,
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"2853 Failed to issue INIT_LINK "
|
||||
"mbox command, rc:x%x\n", rc);
|
||||
mempool_free(mbox, phba->mbox_mem_pool);
|
||||
@ -3860,7 +3865,7 @@ lpfc_els_retry(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
break;
|
||||
|
||||
case IOERR_ILLEGAL_COMMAND:
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"0124 Retry illegal cmd x%x "
|
||||
"retry:x%x delay:x%x\n",
|
||||
cmd, cmdiocb->retry, delay);
|
||||
@ -3970,7 +3975,8 @@ lpfc_els_retry(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
if ((phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) &&
|
||||
(cmd == ELS_CMD_FDISC) &&
|
||||
(stat.un.b.lsRjtRsnCodeExp == LSEXP_OUT_OF_RESOURCE)){
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
|
||||
lpfc_printf_vlog(vport, KERN_ERR,
|
||||
LOG_TRACE_EVENT,
|
||||
"0125 FDISC Failed (x%x). "
|
||||
"Fabric out of resources\n",
|
||||
stat.un.lsRjtError);
|
||||
@ -4009,7 +4015,8 @@ lpfc_els_retry(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
LSEXP_NOTHING_MORE) {
|
||||
vport->fc_sparam.cmn.bbRcvSizeMsb &= 0xf;
|
||||
retry = 1;
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
|
||||
lpfc_printf_vlog(vport, KERN_ERR,
|
||||
LOG_TRACE_EVENT,
|
||||
"0820 FLOGI Failed (x%x). "
|
||||
"BBCredit Not Supported\n",
|
||||
stat.un.lsRjtError);
|
||||
@ -4022,7 +4029,8 @@ lpfc_els_retry(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
((stat.un.b.lsRjtRsnCodeExp == LSEXP_INVALID_PNAME) ||
|
||||
(stat.un.b.lsRjtRsnCodeExp == LSEXP_INVALID_NPORT_ID))
|
||||
) {
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
|
||||
lpfc_printf_vlog(vport, KERN_ERR,
|
||||
LOG_TRACE_EVENT,
|
||||
"0122 FDISC Failed (x%x). "
|
||||
"Fabric Detected Bad WWN\n",
|
||||
stat.un.lsRjtError);
|
||||
@ -4200,7 +4208,7 @@ out_retry:
|
||||
}
|
||||
/* No retry ELS command <elsCmd> to remote NPORT <did> */
|
||||
if (logerr) {
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"0137 No retry ELS command x%x to remote "
|
||||
"NPORT x%x: Out of Resources: Error:x%x/%x\n",
|
||||
cmd, did, irsp->ulpStatus,
|
||||
@ -4499,7 +4507,7 @@ lpfc_cmpl_els_rsp(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
irsp = &rspiocb->iocb;
|
||||
|
||||
if (!vport) {
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_ELS,
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"3177 ELS response failed\n");
|
||||
goto out;
|
||||
}
|
||||
@ -4605,7 +4613,7 @@ lpfc_cmpl_els_rsp(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
ndlp->nlp_flag &= ~NLP_REG_LOGIN_SEND;
|
||||
|
||||
/* ELS rsp: Cannot issue reg_login for <NPortid> */
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"0138 ELS rsp: Cannot issue reg_login for x%x "
|
||||
"Data: x%x x%x x%x\n",
|
||||
ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state,
|
||||
@ -4843,7 +4851,7 @@ lpfc_els_rsp_acc(struct lpfc_vport *vport, uint32_t flag,
|
||||
/**
|
||||
* lpfc_els_rsp_reject - Propare and issue a rjt response iocb command
|
||||
* @vport: pointer to a virtual N_Port data structure.
|
||||
* @rejectError:
|
||||
* @rejectError: reject response to issue
|
||||
* @oldiocb: pointer to the original lpfc command iocb data structure.
|
||||
* @ndlp: pointer to a node-list data structure.
|
||||
* @mbox: pointer to the driver internal queue element for mailbox command.
|
||||
@ -6411,8 +6419,8 @@ lpfc_els_rcv_lcb(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
|
||||
lcb_context->rx_id = cmdiocb->iocb.ulpContext;
|
||||
lcb_context->ndlp = lpfc_nlp_get(ndlp);
|
||||
if (lpfc_sli4_set_beacon(vport, lcb_context, state)) {
|
||||
lpfc_printf_vlog(ndlp->vport, KERN_ERR,
|
||||
LOG_ELS, "0193 failed to send mail box");
|
||||
lpfc_printf_vlog(ndlp->vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"0193 failed to send mail box");
|
||||
kfree(lcb_context);
|
||||
lpfc_nlp_put(ndlp);
|
||||
rjt_err = LSRJT_UNABLE_TPC;
|
||||
@ -6621,7 +6629,7 @@ lpfc_send_rscn_event(struct lpfc_vport *vport,
|
||||
rscn_event_data = kmalloc(sizeof(struct lpfc_rscn_event_header) +
|
||||
payload_len, GFP_KERNEL);
|
||||
if (!rscn_event_data) {
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"0147 Failed to allocate memory for RSCN event\n");
|
||||
return;
|
||||
}
|
||||
@ -6998,7 +7006,7 @@ lpfc_els_rcv_flogi(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
|
||||
|
||||
/* An FLOGI ELS command <elsCmd> was received from DID <did> in
|
||||
Loop Mode */
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"0113 An FLOGI ELS command x%x was "
|
||||
"received from DID x%x in Loop Mode\n",
|
||||
cmd, did);
|
||||
@ -7879,7 +7887,7 @@ lpfc_els_rcv_fan(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
|
||||
|
||||
/**
|
||||
* lpfc_els_timeout - Handler funciton to the els timer
|
||||
* @ptr: holder for the timer function associated data.
|
||||
* @t: timer context used to obtain the vport.
|
||||
*
|
||||
* This routine is invoked by the ELS timer after timeout. It posts the ELS
|
||||
* timer timeout event by setting the WORKER_ELS_TMO bit to the work port
|
||||
@ -7988,7 +7996,7 @@ lpfc_els_timeout_handler(struct lpfc_vport *vport)
|
||||
|
||||
list_for_each_entry_safe(piocb, tmp_iocb, &abort_list, dlist) {
|
||||
cmd = &piocb->iocb;
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"0127 ELS timeout Data: x%x x%x x%x "
|
||||
"x%x\n", els_command,
|
||||
remote_ID, cmd->ulpCommand, cmd->ulpIoTag);
|
||||
@ -8098,7 +8106,7 @@ lpfc_els_flush_cmd(struct lpfc_vport *vport)
|
||||
spin_unlock_irqrestore(&phba->hbalock, iflags);
|
||||
}
|
||||
if (!list_empty(&abort_list))
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"3387 abort list for txq not empty\n");
|
||||
INIT_LIST_HEAD(&abort_list);
|
||||
|
||||
@ -8252,7 +8260,7 @@ lpfc_send_els_failure_event(struct lpfc_hba *phba,
|
||||
* lpfc_send_els_event - Posts unsolicited els event
|
||||
* @vport: Pointer to vport object.
|
||||
* @ndlp: Pointer FC node object.
|
||||
* @cmd: ELS command code.
|
||||
* @payload: ELS command code type.
|
||||
*
|
||||
* This function posts an event when there is an incoming
|
||||
* unsolicited ELS command.
|
||||
@ -8269,7 +8277,7 @@ lpfc_send_els_event(struct lpfc_vport *vport,
|
||||
if (*payload == ELS_CMD_LOGO) {
|
||||
logo_data = kmalloc(sizeof(struct lpfc_logo_event), GFP_KERNEL);
|
||||
if (!logo_data) {
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"0148 Failed to allocate memory "
|
||||
"for LOGO event\n");
|
||||
return;
|
||||
@ -8279,7 +8287,7 @@ lpfc_send_els_event(struct lpfc_vport *vport,
|
||||
els_data = kmalloc(sizeof(struct lpfc_els_event_header),
|
||||
GFP_KERNEL);
|
||||
if (!els_data) {
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"0149 Failed to allocate memory "
|
||||
"for ELS event\n");
|
||||
return;
|
||||
@ -8337,7 +8345,7 @@ DECLARE_ENUM2STR_LOOKUP(lpfc_get_fpin_li_event_nm, fc_fpin_li_event_types,
|
||||
/**
|
||||
* lpfc_els_rcv_fpin_li - Process an FPIN Link Integrity Event.
|
||||
* @vport: Pointer to vport object.
|
||||
* @lnk_not: Pointer to the Link Integrity Notification Descriptor.
|
||||
* @tlv: Pointer to the Link Integrity Notification Descriptor.
|
||||
*
|
||||
* This function processes a link integrity FPIN event by
|
||||
* logging a message
|
||||
@ -8396,7 +8404,7 @@ lpfc_els_rcv_fpin(struct lpfc_vport *vport, struct fc_els_fpin *fpin,
|
||||
break;
|
||||
default:
|
||||
dtag_nm = lpfc_get_tlv_dtag_nm(dtag);
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"4678 skipped FPIN descriptor[%d]: "
|
||||
"tag x%x (%s)\n",
|
||||
desc_cnt, dtag, dtag_nm);
|
||||
@ -8811,7 +8819,7 @@ lpfc_els_unsol_buffer(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
|
||||
rjt_exp = LSEXP_NOTHING_MORE;
|
||||
|
||||
/* Unknown ELS command <elsCmd> received from NPORT <did> */
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"0115 Unknown ELS command x%x "
|
||||
"received from NPORT x%x\n", cmd, did);
|
||||
if (newnode)
|
||||
@ -8856,7 +8864,7 @@ lsrjt:
|
||||
|
||||
dropit:
|
||||
if (vport && !(vport->load_flag & FC_UNLOADING))
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"0111 Dropping received ELS cmd "
|
||||
"Data: x%x x%x x%x\n",
|
||||
icmd->ulpStatus, icmd->un.ulpWord[4], icmd->ulpTimeout);
|
||||
@ -9006,7 +9014,7 @@ lpfc_do_scr_ns_plogi(struct lpfc_hba *phba, struct lpfc_vport *vport)
|
||||
spin_lock_irq(shost->host_lock);
|
||||
if (vport->fc_flag & FC_DISC_DELAYED) {
|
||||
spin_unlock_irq(shost->host_lock);
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_DISCOVERY,
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"3334 Delay fc port discovery for %d seconds\n",
|
||||
phba->fc_ratov);
|
||||
mod_timer(&vport->delayed_disc_tmo,
|
||||
@ -9024,7 +9032,7 @@ lpfc_do_scr_ns_plogi(struct lpfc_hba *phba, struct lpfc_vport *vport)
|
||||
return;
|
||||
}
|
||||
lpfc_vport_set_state(vport, FC_VPORT_FAILED);
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"0251 NameServer login: no memory\n");
|
||||
return;
|
||||
}
|
||||
@ -9036,7 +9044,7 @@ lpfc_do_scr_ns_plogi(struct lpfc_hba *phba, struct lpfc_vport *vport)
|
||||
return;
|
||||
}
|
||||
lpfc_vport_set_state(vport, FC_VPORT_FAILED);
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"0348 NameServer login: node freed\n");
|
||||
return;
|
||||
}
|
||||
@ -9047,7 +9055,7 @@ lpfc_do_scr_ns_plogi(struct lpfc_hba *phba, struct lpfc_vport *vport)
|
||||
|
||||
if (lpfc_issue_els_plogi(vport, ndlp->nlp_DID, 0)) {
|
||||
lpfc_vport_set_state(vport, FC_VPORT_FAILED);
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"0252 Cannot issue NameServer login\n");
|
||||
return;
|
||||
}
|
||||
@ -9084,7 +9092,7 @@ lpfc_cmpl_reg_new_vport(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
|
||||
spin_unlock_irq(shost->host_lock);
|
||||
|
||||
if (mb->mbxStatus) {
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_MBOX,
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"0915 Register VPI failed : Status: x%x"
|
||||
" upd bit: x%x \n", mb->mbxStatus,
|
||||
mb->un.varRegVpi.upd);
|
||||
@ -9114,8 +9122,8 @@ lpfc_cmpl_reg_new_vport(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
|
||||
rc = lpfc_sli_issue_mbox(phba, pmb,
|
||||
MBX_NOWAIT);
|
||||
if (rc == MBX_NOT_FINISHED) {
|
||||
lpfc_printf_vlog(vport,
|
||||
KERN_ERR, LOG_MBOX,
|
||||
lpfc_printf_vlog(vport, KERN_ERR,
|
||||
LOG_TRACE_EVENT,
|
||||
"2732 Failed to issue INIT_VPI"
|
||||
" mailbox command\n");
|
||||
} else {
|
||||
@ -9203,12 +9211,12 @@ lpfc_register_new_vport(struct lpfc_hba *phba, struct lpfc_vport *vport,
|
||||
lpfc_nlp_put(ndlp);
|
||||
mempool_free(mbox, phba->mbox_mem_pool);
|
||||
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_MBOX,
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"0253 Register VPI: Can't send mbox\n");
|
||||
goto mbox_err_exit;
|
||||
}
|
||||
} else {
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_MBOX,
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"0254 Register VPI: no memory\n");
|
||||
goto mbox_err_exit;
|
||||
}
|
||||
@ -9370,7 +9378,7 @@ lpfc_cmpl_els_fdisc(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
if (lpfc_els_retry(phba, cmdiocb, rspiocb))
|
||||
goto out;
|
||||
/* FDISC failed */
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"0126 FDISC failed. (x%x/x%x)\n",
|
||||
irsp->ulpStatus, irsp->un.ulpWord[4]);
|
||||
goto fdisc_failed;
|
||||
@ -9492,7 +9500,7 @@ lpfc_issue_els_fdisc(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
ELS_CMD_FDISC);
|
||||
if (!elsiocb) {
|
||||
lpfc_vport_set_state(vport, FC_VPORT_FAILED);
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"0255 Issue FDISC: no IOCB\n");
|
||||
return 1;
|
||||
}
|
||||
@ -9546,7 +9554,7 @@ lpfc_issue_els_fdisc(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
if (rc == IOCB_ERROR) {
|
||||
lpfc_els_free_iocb(phba, elsiocb);
|
||||
lpfc_vport_set_state(vport, FC_VPORT_FAILED);
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"0256 Issue FDISC: Cannot send IOCB\n");
|
||||
return 1;
|
||||
}
|
||||
@ -9666,7 +9674,7 @@ lpfc_issue_els_npiv_logo(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp)
|
||||
|
||||
/**
|
||||
* lpfc_fabric_block_timeout - Handler function to the fabric block timer
|
||||
* @ptr: holder for the timer function associated data.
|
||||
* @t: timer context used to obtain the lpfc hba.
|
||||
*
|
||||
* This routine is invoked by the fabric iocb block timer after
|
||||
* timeout. It posts the fabric iocb block timeout event by setting the
|
||||
@ -10127,8 +10135,7 @@ lpfc_sli_abts_recover_port(struct lpfc_vport *vport,
|
||||
"rport in state 0x%x\n", ndlp->nlp_state);
|
||||
return;
|
||||
}
|
||||
lpfc_printf_log(phba, KERN_ERR,
|
||||
LOG_ELS | LOG_FCP_ERROR | LOG_NVME_IOERR,
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"3094 Start rport recovery on shost id 0x%x "
|
||||
"fc_id 0x%06x vpi 0x%x rpi 0x%x state 0x%x "
|
||||
"flags 0x%x\n",
|
||||
|
@ -155,17 +155,17 @@ lpfc_dev_loss_tmo_callbk(struct fc_rport *rport)
|
||||
return;
|
||||
|
||||
if (rport->port_name != wwn_to_u64(ndlp->nlp_portname.u.wwn))
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_NODE,
|
||||
"6789 rport name %llx != node port name %llx",
|
||||
rport->port_name,
|
||||
wwn_to_u64(ndlp->nlp_portname.u.wwn));
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"6789 rport name %llx != node port name %llx",
|
||||
rport->port_name,
|
||||
wwn_to_u64(ndlp->nlp_portname.u.wwn));
|
||||
|
||||
evtp = &ndlp->dev_loss_evt;
|
||||
|
||||
if (!list_empty(&evtp->evt_listp)) {
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_NODE,
|
||||
"6790 rport name %llx dev_loss_evt pending",
|
||||
rport->port_name);
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"6790 rport name %llx dev_loss_evt pending",
|
||||
rport->port_name);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -295,7 +295,7 @@ lpfc_dev_loss_tmo_handler(struct lpfc_nodelist *ndlp)
|
||||
}
|
||||
|
||||
if (warn_on) {
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_DISCOVERY,
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"0203 Devloss timeout on "
|
||||
"WWPN %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x "
|
||||
"NPort x%06x Data: x%x x%x x%x\n",
|
||||
@ -304,7 +304,7 @@ lpfc_dev_loss_tmo_handler(struct lpfc_nodelist *ndlp)
|
||||
ndlp->nlp_DID, ndlp->nlp_flag,
|
||||
ndlp->nlp_state, ndlp->nlp_rpi);
|
||||
} else {
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_TRACE_EVENT,
|
||||
"0204 Devloss timeout on "
|
||||
"WWPN %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x "
|
||||
"NPort x%06x Data: x%x x%x x%x\n",
|
||||
@ -755,7 +755,7 @@ lpfc_do_work(void *p)
|
||||
|| kthread_should_stop()));
|
||||
/* Signal wakeup shall terminate the worker thread */
|
||||
if (rc) {
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_ELS,
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"0433 Wakeup on signal: rc=x%x\n", rc);
|
||||
break;
|
||||
}
|
||||
@ -1092,7 +1092,7 @@ lpfc_mbx_cmpl_clear_la(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
|
||||
/* Check for error */
|
||||
if ((mb->mbxStatus) && (mb->mbxStatus != 0x1601)) {
|
||||
/* CLEAR_LA mbox error <mbxStatus> state <hba_state> */
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_MBOX,
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"0320 CLEAR_LA mbxStatus error x%x hba "
|
||||
"state x%x\n",
|
||||
mb->mbxStatus, vport->port_state);
|
||||
@ -1180,7 +1180,7 @@ lpfc_mbx_cmpl_local_config_link(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
|
||||
return;
|
||||
|
||||
out:
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_MBOX,
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"0306 CONFIG_LINK mbxStatus error x%x "
|
||||
"HBA state x%x\n",
|
||||
pmb->u.mb.mbxStatus, vport->port_state);
|
||||
@ -1188,7 +1188,7 @@ out:
|
||||
|
||||
lpfc_linkdown(phba);
|
||||
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_DISCOVERY,
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"0200 CONFIG_LINK bad hba state x%x\n",
|
||||
vport->port_state);
|
||||
|
||||
@ -1198,7 +1198,7 @@ out:
|
||||
|
||||
/**
|
||||
* lpfc_sli4_clear_fcf_rr_bmask
|
||||
* @phba pointer to the struct lpfc_hba for this port.
|
||||
* @phba: pointer to the struct lpfc_hba for this port.
|
||||
* This fucnction resets the round robin bit mask and clears the
|
||||
* fcf priority list. The list deletions are done while holding the
|
||||
* hbalock. The ON_LIST flag and the FLOGI_FAILED flags are cleared
|
||||
@ -1224,10 +1224,10 @@ lpfc_mbx_cmpl_reg_fcfi(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq)
|
||||
struct lpfc_vport *vport = mboxq->vport;
|
||||
|
||||
if (mboxq->u.mb.mbxStatus) {
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_MBOX,
|
||||
"2017 REG_FCFI mbxStatus error x%x "
|
||||
"HBA state x%x\n",
|
||||
mboxq->u.mb.mbxStatus, vport->port_state);
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"2017 REG_FCFI mbxStatus error x%x "
|
||||
"HBA state x%x\n", mboxq->u.mb.mbxStatus,
|
||||
vport->port_state);
|
||||
goto fail_out;
|
||||
}
|
||||
|
||||
@ -1297,7 +1297,7 @@ lpfc_fab_name_match(uint8_t *fab_name, struct fcf_record *new_fcf_record)
|
||||
|
||||
/**
|
||||
* lpfc_sw_name_match - Check if the fcf switch name match.
|
||||
* @fab_name: pointer to fabric name.
|
||||
* @sw_name: pointer to switch name.
|
||||
* @new_fcf_record: pointer to fcf record.
|
||||
*
|
||||
* This routine compare the fcf record's switch name with provided
|
||||
@ -1385,7 +1385,7 @@ __lpfc_update_fcf_record_pri(struct lpfc_hba *phba, uint16_t fcf_index,
|
||||
|
||||
/**
|
||||
* lpfc_copy_fcf_record - Copy fcf information to lpfc_hba.
|
||||
* @fcf: pointer to driver fcf record.
|
||||
* @fcf_rec: pointer to driver fcf record.
|
||||
* @new_fcf_record: pointer to fcf record.
|
||||
*
|
||||
* This routine copies the FCF information from the FCF
|
||||
@ -1848,7 +1848,7 @@ lpfc_sli4_fcf_rec_mbox_parse(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq,
|
||||
*/
|
||||
lpfc_sli4_mbx_sge_get(mboxq, 0, &sge);
|
||||
if (unlikely(!mboxq->sge_array)) {
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_MBOX,
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"2524 Failed to get the non-embedded SGE "
|
||||
"virtual address\n");
|
||||
return NULL;
|
||||
@ -1864,11 +1864,12 @@ lpfc_sli4_fcf_rec_mbox_parse(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq,
|
||||
if (shdr_status || shdr_add_status) {
|
||||
if (shdr_status == STATUS_FCF_TABLE_EMPTY ||
|
||||
if_type == LPFC_SLI_INTF_IF_TYPE_2)
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_FIP,
|
||||
lpfc_printf_log(phba, KERN_ERR,
|
||||
LOG_TRACE_EVENT,
|
||||
"2726 READ_FCF_RECORD Indicates empty "
|
||||
"FCF table.\n");
|
||||
else
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_FIP,
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"2521 READ_FCF_RECORD mailbox failed "
|
||||
"with status x%x add_status x%x, "
|
||||
"mbx\n", shdr_status, shdr_add_status);
|
||||
@ -1952,7 +1953,7 @@ lpfc_sli4_log_fcf_record_info(struct lpfc_hba *phba,
|
||||
}
|
||||
|
||||
/**
|
||||
lpfc_sli4_fcf_record_match - testing new FCF record for matching existing FCF
|
||||
* lpfc_sli4_fcf_record_match - testing new FCF record for matching existing FCF
|
||||
* @phba: pointer to lpfc hba data structure.
|
||||
* @fcf_rec: pointer to an existing FCF record.
|
||||
* @new_fcf_record: pointer to a new FCF record.
|
||||
@ -2066,7 +2067,7 @@ stop_flogi_current_fcf:
|
||||
/**
|
||||
* lpfc_sli4_fcf_pri_list_del
|
||||
* @phba: pointer to lpfc hba data structure.
|
||||
* @fcf_index the index of the fcf record to delete
|
||||
* @fcf_index: the index of the fcf record to delete
|
||||
* This routine checks the on list flag of the fcf_index to be deleted.
|
||||
* If it is one the list then it is removed from the list, and the flag
|
||||
* is cleared. This routine grab the hbalock before removing the fcf
|
||||
@ -2096,7 +2097,7 @@ static void lpfc_sli4_fcf_pri_list_del(struct lpfc_hba *phba,
|
||||
/**
|
||||
* lpfc_sli4_set_fcf_flogi_fail
|
||||
* @phba: pointer to lpfc hba data structure.
|
||||
* @fcf_index the index of the fcf record to update
|
||||
* @fcf_index: the index of the fcf record to update
|
||||
* This routine acquires the hbalock and then set the LPFC_FCF_FLOGI_FAILED
|
||||
* flag so the the round robin slection for the particular priority level
|
||||
* will try a different fcf record that does not have this bit set.
|
||||
@ -2116,7 +2117,8 @@ lpfc_sli4_set_fcf_flogi_fail(struct lpfc_hba *phba, uint16_t fcf_index)
|
||||
/**
|
||||
* lpfc_sli4_fcf_pri_list_add
|
||||
* @phba: pointer to lpfc hba data structure.
|
||||
* @fcf_index the index of the fcf record to add
|
||||
* @fcf_index: the index of the fcf record to add
|
||||
* @new_fcf_record: pointer to a new FCF record.
|
||||
* This routine checks the priority of the fcf_index to be added.
|
||||
* If it is a lower priority than the current head of the fcf_pri list
|
||||
* then it is added to the list in the right order.
|
||||
@ -2246,7 +2248,7 @@ lpfc_mbx_cmpl_fcf_scan_read_fcf_rec(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq)
|
||||
new_fcf_record = lpfc_sli4_fcf_rec_mbox_parse(phba, mboxq,
|
||||
&next_fcf_index);
|
||||
if (!new_fcf_record) {
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_FIP,
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"2765 Mailbox command READ_FCF_RECORD "
|
||||
"failed to retrieve a FCF record.\n");
|
||||
/* Let next new FCF event trigger fast failover */
|
||||
@ -2290,7 +2292,8 @@ lpfc_mbx_cmpl_fcf_scan_read_fcf_rec(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq)
|
||||
new_fcf_record, LPFC_FCOE_IGNORE_VID)) {
|
||||
if (bf_get(lpfc_fcf_record_fcf_index, new_fcf_record) !=
|
||||
phba->fcf.current_rec.fcf_indx) {
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_FIP,
|
||||
lpfc_printf_log(phba, KERN_ERR,
|
||||
LOG_TRACE_EVENT,
|
||||
"2862 FCF (x%x) matches property "
|
||||
"of in-use FCF (x%x)\n",
|
||||
bf_get(lpfc_fcf_record_fcf_index,
|
||||
@ -2360,7 +2363,7 @@ lpfc_mbx_cmpl_fcf_scan_read_fcf_rec(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq)
|
||||
phba->pport->fc_flag);
|
||||
goto out;
|
||||
} else
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_FIP,
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"2863 New FCF (x%x) matches "
|
||||
"property of in-use FCF (x%x)\n",
|
||||
bf_get(lpfc_fcf_record_fcf_index,
|
||||
@ -2774,10 +2777,9 @@ lpfc_init_vfi_cmpl(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq)
|
||||
(bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) !=
|
||||
LPFC_SLI_INTF_IF_TYPE_0) &&
|
||||
mboxq->u.mb.mbxStatus != MBX_VFI_IN_USE) {
|
||||
lpfc_printf_vlog(vport, KERN_ERR,
|
||||
LOG_MBOX,
|
||||
"2891 Init VFI mailbox failed 0x%x\n",
|
||||
mboxq->u.mb.mbxStatus);
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"2891 Init VFI mailbox failed 0x%x\n",
|
||||
mboxq->u.mb.mbxStatus);
|
||||
mempool_free(mboxq, phba->mbox_mem_pool);
|
||||
lpfc_vport_set_state(vport, FC_VPORT_FAILED);
|
||||
return;
|
||||
@ -2805,7 +2807,7 @@ lpfc_issue_init_vfi(struct lpfc_vport *vport)
|
||||
mboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
|
||||
if (!mboxq) {
|
||||
lpfc_printf_vlog(vport, KERN_ERR,
|
||||
LOG_MBOX, "2892 Failed to allocate "
|
||||
LOG_TRACE_EVENT, "2892 Failed to allocate "
|
||||
"init_vfi mailbox\n");
|
||||
return;
|
||||
}
|
||||
@ -2813,8 +2815,8 @@ lpfc_issue_init_vfi(struct lpfc_vport *vport)
|
||||
mboxq->mbox_cmpl = lpfc_init_vfi_cmpl;
|
||||
rc = lpfc_sli_issue_mbox(phba, mboxq, MBX_NOWAIT);
|
||||
if (rc == MBX_NOT_FINISHED) {
|
||||
lpfc_printf_vlog(vport, KERN_ERR,
|
||||
LOG_MBOX, "2893 Failed to issue init_vfi mailbox\n");
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"2893 Failed to issue init_vfi mailbox\n");
|
||||
mempool_free(mboxq, vport->phba->mbox_mem_pool);
|
||||
}
|
||||
}
|
||||
@ -2834,10 +2836,9 @@ lpfc_init_vpi_cmpl(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq)
|
||||
struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
|
||||
|
||||
if (mboxq->u.mb.mbxStatus) {
|
||||
lpfc_printf_vlog(vport, KERN_ERR,
|
||||
LOG_MBOX,
|
||||
"2609 Init VPI mailbox failed 0x%x\n",
|
||||
mboxq->u.mb.mbxStatus);
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"2609 Init VPI mailbox failed 0x%x\n",
|
||||
mboxq->u.mb.mbxStatus);
|
||||
mempool_free(mboxq, phba->mbox_mem_pool);
|
||||
lpfc_vport_set_state(vport, FC_VPORT_FAILED);
|
||||
return;
|
||||
@ -2851,7 +2852,7 @@ lpfc_init_vpi_cmpl(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq)
|
||||
ndlp = lpfc_findnode_did(vport, Fabric_DID);
|
||||
if (!ndlp)
|
||||
lpfc_printf_vlog(vport, KERN_ERR,
|
||||
LOG_DISCOVERY,
|
||||
LOG_TRACE_EVENT,
|
||||
"2731 Cannot find fabric "
|
||||
"controller node\n");
|
||||
else
|
||||
@ -2864,7 +2865,7 @@ lpfc_init_vpi_cmpl(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq)
|
||||
lpfc_initial_fdisc(vport);
|
||||
else {
|
||||
lpfc_vport_set_state(vport, FC_VPORT_NO_FABRIC_SUPP);
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"2606 No NPIV Fabric support\n");
|
||||
}
|
||||
mempool_free(mboxq, phba->mbox_mem_pool);
|
||||
@ -2887,8 +2888,7 @@ lpfc_issue_init_vpi(struct lpfc_vport *vport)
|
||||
if ((vport->port_type != LPFC_PHYSICAL_PORT) && (!vport->vpi)) {
|
||||
vpi = lpfc_alloc_vpi(vport->phba);
|
||||
if (!vpi) {
|
||||
lpfc_printf_vlog(vport, KERN_ERR,
|
||||
LOG_MBOX,
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"3303 Failed to obtain vport vpi\n");
|
||||
lpfc_vport_set_state(vport, FC_VPORT_FAILED);
|
||||
return;
|
||||
@ -2899,7 +2899,7 @@ lpfc_issue_init_vpi(struct lpfc_vport *vport)
|
||||
mboxq = mempool_alloc(vport->phba->mbox_mem_pool, GFP_KERNEL);
|
||||
if (!mboxq) {
|
||||
lpfc_printf_vlog(vport, KERN_ERR,
|
||||
LOG_MBOX, "2607 Failed to allocate "
|
||||
LOG_TRACE_EVENT, "2607 Failed to allocate "
|
||||
"init_vpi mailbox\n");
|
||||
return;
|
||||
}
|
||||
@ -2908,8 +2908,8 @@ lpfc_issue_init_vpi(struct lpfc_vport *vport)
|
||||
mboxq->mbox_cmpl = lpfc_init_vpi_cmpl;
|
||||
rc = lpfc_sli_issue_mbox(vport->phba, mboxq, MBX_NOWAIT);
|
||||
if (rc == MBX_NOT_FINISHED) {
|
||||
lpfc_printf_vlog(vport, KERN_ERR,
|
||||
LOG_MBOX, "2608 Failed to issue init_vpi mailbox\n");
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"2608 Failed to issue init_vpi mailbox\n");
|
||||
mempool_free(mboxq, vport->phba->mbox_mem_pool);
|
||||
}
|
||||
}
|
||||
@ -2953,7 +2953,7 @@ lpfc_start_fdiscs(struct lpfc_hba *phba)
|
||||
lpfc_vport_set_state(vports[i],
|
||||
FC_VPORT_NO_FABRIC_SUPP);
|
||||
lpfc_printf_vlog(vports[i], KERN_ERR,
|
||||
LOG_ELS,
|
||||
LOG_TRACE_EVENT,
|
||||
"0259 No NPIV "
|
||||
"Fabric support\n");
|
||||
}
|
||||
@ -2977,10 +2977,10 @@ lpfc_mbx_cmpl_reg_vfi(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq)
|
||||
(bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) !=
|
||||
LPFC_SLI_INTF_IF_TYPE_0) &&
|
||||
mboxq->u.mb.mbxStatus != MBX_VFI_IN_USE) {
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_MBOX,
|
||||
"2018 REG_VFI mbxStatus error x%x "
|
||||
"HBA state x%x\n",
|
||||
mboxq->u.mb.mbxStatus, vport->port_state);
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"2018 REG_VFI mbxStatus error x%x "
|
||||
"HBA state x%x\n",
|
||||
mboxq->u.mb.mbxStatus, vport->port_state);
|
||||
if (phba->fc_topology == LPFC_TOPOLOGY_LOOP) {
|
||||
/* FLOGI failed, use loop map to make discovery list */
|
||||
lpfc_disc_list_loopmap(vport);
|
||||
@ -3067,7 +3067,7 @@ lpfc_mbx_cmpl_read_sparam(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
|
||||
/* Check for error */
|
||||
if (mb->mbxStatus) {
|
||||
/* READ_SPARAM mbox error <mbxStatus> state <hba_state> */
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_MBOX,
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"0319 READ_SPARAM mbxStatus error x%x "
|
||||
"hba state x%x>\n",
|
||||
mb->mbxStatus, vport->port_state);
|
||||
@ -3286,7 +3286,7 @@ lpfc_mbx_process_link_up(struct lpfc_hba *phba, struct lpfc_mbx_read_top *la)
|
||||
GFP_KERNEL);
|
||||
if (unlikely(!fcf_record)) {
|
||||
lpfc_printf_log(phba, KERN_ERR,
|
||||
LOG_MBOX | LOG_SLI,
|
||||
LOG_TRACE_EVENT,
|
||||
"2554 Could not allocate memory for "
|
||||
"fcf record\n");
|
||||
rc = -ENODEV;
|
||||
@ -3298,7 +3298,7 @@ lpfc_mbx_process_link_up(struct lpfc_hba *phba, struct lpfc_mbx_read_top *la)
|
||||
rc = lpfc_sli4_add_fcf_record(phba, fcf_record);
|
||||
if (unlikely(rc)) {
|
||||
lpfc_printf_log(phba, KERN_ERR,
|
||||
LOG_MBOX | LOG_SLI,
|
||||
LOG_TRACE_EVENT,
|
||||
"2013 Could not manually add FCF "
|
||||
"record 0, status %d\n", rc);
|
||||
rc = -ENODEV;
|
||||
@ -3344,7 +3344,7 @@ lpfc_mbx_process_link_up(struct lpfc_hba *phba, struct lpfc_mbx_read_top *la)
|
||||
return;
|
||||
out:
|
||||
lpfc_vport_set_state(vport, FC_VPORT_FAILED);
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_MBOX,
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"0263 Discovery Mailbox error: state: 0x%x : x%px x%px\n",
|
||||
vport->port_state, sparam_mbox, cfglink_mbox);
|
||||
lpfc_issue_clear_la(phba, vport);
|
||||
@ -3617,7 +3617,7 @@ lpfc_mbx_cmpl_unreg_vpi(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
|
||||
break;
|
||||
/* If VPI is busy, reset the HBA */
|
||||
case 0x9700:
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_NODE,
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"2798 Unreg_vpi failed vpi 0x%x, mb status = 0x%x\n",
|
||||
vport->vpi, mb->mbxStatus);
|
||||
if (!(phba->pport->load_flag & FC_UNLOADING))
|
||||
@ -3655,7 +3655,7 @@ lpfc_mbx_unreg_vpi(struct lpfc_vport *vport)
|
||||
mbox->mbox_cmpl = lpfc_mbx_cmpl_unreg_vpi;
|
||||
rc = lpfc_sli_issue_mbox(phba, mbox, MBX_NOWAIT);
|
||||
if (rc == MBX_NOT_FINISHED) {
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_MBOX | LOG_VPORT,
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"1800 Could not issue unreg_vpi\n");
|
||||
mempool_free(mbox, phba->mbox_mem_pool);
|
||||
vport->unreg_vpi_cmpl = VPORT_ERROR;
|
||||
@ -3742,7 +3742,7 @@ lpfc_create_static_vport(struct lpfc_hba *phba)
|
||||
|
||||
pmb = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
|
||||
if (!pmb) {
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"0542 lpfc_create_static_vport failed to"
|
||||
" allocate mailbox memory\n");
|
||||
return;
|
||||
@ -3752,7 +3752,7 @@ lpfc_create_static_vport(struct lpfc_hba *phba)
|
||||
|
||||
vport_info = kzalloc(sizeof(struct static_vport_info), GFP_KERNEL);
|
||||
if (!vport_info) {
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"0543 lpfc_create_static_vport failed to"
|
||||
" allocate vport_info\n");
|
||||
mempool_free(pmb, phba->mbox_mem_pool);
|
||||
@ -3813,11 +3813,12 @@ lpfc_create_static_vport(struct lpfc_hba *phba)
|
||||
if ((le32_to_cpu(vport_info->signature) != VPORT_INFO_SIG) ||
|
||||
((le32_to_cpu(vport_info->rev) & VPORT_INFO_REV_MASK)
|
||||
!= VPORT_INFO_REV)) {
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
|
||||
"0545 lpfc_create_static_vport bad"
|
||||
" information header 0x%x 0x%x\n",
|
||||
le32_to_cpu(vport_info->signature),
|
||||
le32_to_cpu(vport_info->rev) & VPORT_INFO_REV_MASK);
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"0545 lpfc_create_static_vport bad"
|
||||
" information header 0x%x 0x%x\n",
|
||||
le32_to_cpu(vport_info->signature),
|
||||
le32_to_cpu(vport_info->rev) &
|
||||
VPORT_INFO_REV_MASK);
|
||||
|
||||
goto out;
|
||||
}
|
||||
@ -3881,7 +3882,7 @@ lpfc_mbx_cmpl_fabric_reg_login(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
|
||||
pmb->ctx_buf = NULL;
|
||||
|
||||
if (mb->mbxStatus) {
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_MBOX,
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"0258 Register Fabric login error: 0x%x\n",
|
||||
mb->mbxStatus);
|
||||
lpfc_mbuf_free(phba, mp->virt, mp->phys);
|
||||
@ -3954,7 +3955,8 @@ lpfc_issue_gidft(struct lpfc_vport *vport)
|
||||
/* Cannot issue NameServer FCP Query, so finish up
|
||||
* discovery
|
||||
*/
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_SLI,
|
||||
lpfc_printf_vlog(vport, KERN_ERR,
|
||||
LOG_TRACE_EVENT,
|
||||
"0604 %s FC TYPE %x %s\n",
|
||||
"Failed to issue GID_FT to ",
|
||||
FC_TYPE_FCP,
|
||||
@ -3970,7 +3972,8 @@ lpfc_issue_gidft(struct lpfc_vport *vport)
|
||||
/* Cannot issue NameServer NVME Query, so finish up
|
||||
* discovery
|
||||
*/
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_SLI,
|
||||
lpfc_printf_vlog(vport, KERN_ERR,
|
||||
LOG_TRACE_EVENT,
|
||||
"0605 %s FC_TYPE %x %s %d\n",
|
||||
"Failed to issue GID_FT to ",
|
||||
FC_TYPE_NVME,
|
||||
@ -4002,7 +4005,7 @@ lpfc_issue_gidpt(struct lpfc_vport *vport)
|
||||
/* Cannot issue NameServer FCP Query, so finish up
|
||||
* discovery
|
||||
*/
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_SLI,
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"0606 %s Port TYPE %x %s\n",
|
||||
"Failed to issue GID_PT to ",
|
||||
GID_PT_N_PORT,
|
||||
@ -4032,7 +4035,7 @@ lpfc_mbx_cmpl_ns_reg_login(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
|
||||
vport->gidft_inp = 0;
|
||||
|
||||
if (mb->mbxStatus) {
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"0260 Register NameServer error: 0x%x\n",
|
||||
mb->mbxStatus);
|
||||
|
||||
@ -4344,7 +4347,7 @@ lpfc_nlp_state_cleanup(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
GFP_KERNEL);
|
||||
|
||||
if (!ndlp->lat_data)
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_NODE,
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"0286 lpfc_nlp_state_cleanup failed to "
|
||||
"allocate statistical data buffer DID "
|
||||
"0x%x\n", ndlp->nlp_DID);
|
||||
@ -5013,8 +5016,8 @@ lpfc_unreg_hba_rpis(struct lpfc_hba *phba)
|
||||
|
||||
vports = lpfc_create_vport_work_array(phba);
|
||||
if (!vports) {
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_DISCOVERY,
|
||||
"2884 Vport array allocation failed \n");
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"2884 Vport array allocation failed \n");
|
||||
return;
|
||||
}
|
||||
for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) {
|
||||
@ -5057,9 +5060,10 @@ lpfc_unreg_all_rpis(struct lpfc_vport *vport)
|
||||
mempool_free(mbox, phba->mbox_mem_pool);
|
||||
|
||||
if ((rc == MBX_TIMEOUT) || (rc == MBX_NOT_FINISHED))
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_MBOX | LOG_VPORT,
|
||||
"1836 Could not issue "
|
||||
"unreg_login(all_rpis) status %d\n", rc);
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"1836 Could not issue "
|
||||
"unreg_login(all_rpis) status %d\n",
|
||||
rc);
|
||||
}
|
||||
}
|
||||
|
||||
@ -5086,7 +5090,7 @@ lpfc_unreg_default_rpis(struct lpfc_vport *vport)
|
||||
mempool_free(mbox, phba->mbox_mem_pool);
|
||||
|
||||
if ((rc == MBX_TIMEOUT) || (rc == MBX_NOT_FINISHED))
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_MBOX | LOG_VPORT,
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"1815 Could not issue "
|
||||
"unreg_did (default rpis) status %d\n",
|
||||
rc);
|
||||
@ -5907,7 +5911,8 @@ lpfc_disc_timeout_handler(struct lpfc_vport *vport)
|
||||
case LPFC_FLOGI:
|
||||
/* port_state is identically LPFC_FLOGI while waiting for FLOGI cmpl */
|
||||
/* Initial FLOGI timeout */
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_DISCOVERY,
|
||||
lpfc_printf_vlog(vport, KERN_ERR,
|
||||
LOG_TRACE_EVENT,
|
||||
"0222 Initial %s timeout\n",
|
||||
vport->vpi ? "FDISC" : "FLOGI");
|
||||
|
||||
@ -5925,7 +5930,8 @@ lpfc_disc_timeout_handler(struct lpfc_vport *vport)
|
||||
case LPFC_FABRIC_CFG_LINK:
|
||||
/* hba_state is identically LPFC_FABRIC_CFG_LINK while waiting for
|
||||
NameServer login */
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_DISCOVERY,
|
||||
lpfc_printf_vlog(vport, KERN_ERR,
|
||||
LOG_TRACE_EVENT,
|
||||
"0223 Timeout while waiting for "
|
||||
"NameServer login\n");
|
||||
/* Next look for NameServer ndlp */
|
||||
@ -5938,7 +5944,8 @@ lpfc_disc_timeout_handler(struct lpfc_vport *vport)
|
||||
|
||||
case LPFC_NS_QRY:
|
||||
/* Check for wait for NameServer Rsp timeout */
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_DISCOVERY,
|
||||
lpfc_printf_vlog(vport, KERN_ERR,
|
||||
LOG_TRACE_EVENT,
|
||||
"0224 NameServer Query timeout "
|
||||
"Data: x%x x%x\n",
|
||||
vport->fc_ns_retry, LPFC_MAX_NS_RETRY);
|
||||
@ -5971,7 +5978,8 @@ restart_disc:
|
||||
/* Setup and issue mailbox INITIALIZE LINK command */
|
||||
initlinkmbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
|
||||
if (!initlinkmbox) {
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_DISCOVERY,
|
||||
lpfc_printf_vlog(vport, KERN_ERR,
|
||||
LOG_TRACE_EVENT,
|
||||
"0206 Device Discovery "
|
||||
"completion error\n");
|
||||
phba->link_state = LPFC_HBA_ERROR;
|
||||
@ -5993,7 +6001,8 @@ restart_disc:
|
||||
|
||||
case LPFC_DISC_AUTH:
|
||||
/* Node Authentication timeout */
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_DISCOVERY,
|
||||
lpfc_printf_vlog(vport, KERN_ERR,
|
||||
LOG_TRACE_EVENT,
|
||||
"0227 Node Authentication timeout\n");
|
||||
lpfc_disc_flush_list(vport);
|
||||
|
||||
@ -6013,7 +6022,8 @@ restart_disc:
|
||||
|
||||
case LPFC_VPORT_READY:
|
||||
if (vport->fc_flag & FC_RSCN_MODE) {
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_DISCOVERY,
|
||||
lpfc_printf_vlog(vport, KERN_ERR,
|
||||
LOG_TRACE_EVENT,
|
||||
"0231 RSCN timeout Data: x%x "
|
||||
"x%x\n",
|
||||
vport->fc_ns_retry, LPFC_MAX_NS_RETRY);
|
||||
@ -6027,7 +6037,8 @@ restart_disc:
|
||||
break;
|
||||
|
||||
default:
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_DISCOVERY,
|
||||
lpfc_printf_vlog(vport, KERN_ERR,
|
||||
LOG_TRACE_EVENT,
|
||||
"0273 Unexpected discovery timeout, "
|
||||
"vport State x%x\n", vport->port_state);
|
||||
break;
|
||||
@ -6036,7 +6047,8 @@ restart_disc:
|
||||
switch (phba->link_state) {
|
||||
case LPFC_CLEAR_LA:
|
||||
/* CLEAR LA timeout */
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_DISCOVERY,
|
||||
lpfc_printf_vlog(vport, KERN_ERR,
|
||||
LOG_TRACE_EVENT,
|
||||
"0228 CLEAR LA timeout\n");
|
||||
clrlaerr = 1;
|
||||
break;
|
||||
@ -6050,7 +6062,8 @@ restart_disc:
|
||||
case LPFC_INIT_MBX_CMDS:
|
||||
case LPFC_LINK_DOWN:
|
||||
case LPFC_HBA_ERROR:
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_DISCOVERY,
|
||||
lpfc_printf_vlog(vport, KERN_ERR,
|
||||
LOG_TRACE_EVENT,
|
||||
"0230 Unexpected timeout, hba link "
|
||||
"state x%x\n", phba->link_state);
|
||||
clrlaerr = 1;
|
||||
@ -6241,9 +6254,9 @@ lpfc_find_vport_by_vpid(struct lpfc_hba *phba, uint16_t vpi)
|
||||
}
|
||||
|
||||
if (i >= phba->max_vpi) {
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_ELS,
|
||||
"2936 Could not find Vport mapped "
|
||||
"to vpi %d\n", vpi);
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"2936 Could not find Vport mapped "
|
||||
"to vpi %d\n", vpi);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
@ -6547,10 +6560,10 @@ lpfc_unregister_vfi_cmpl(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq)
|
||||
struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
|
||||
|
||||
if (mboxq->u.mb.mbxStatus) {
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_DISCOVERY|LOG_MBOX,
|
||||
"2555 UNREG_VFI mbxStatus error x%x "
|
||||
"HBA state x%x\n",
|
||||
mboxq->u.mb.mbxStatus, vport->port_state);
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"2555 UNREG_VFI mbxStatus error x%x "
|
||||
"HBA state x%x\n",
|
||||
mboxq->u.mb.mbxStatus, vport->port_state);
|
||||
}
|
||||
spin_lock_irq(shost->host_lock);
|
||||
phba->pport->fc_flag &= ~FC_VFI_REGISTERED;
|
||||
@ -6572,10 +6585,10 @@ lpfc_unregister_fcfi_cmpl(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq)
|
||||
struct lpfc_vport *vport = mboxq->vport;
|
||||
|
||||
if (mboxq->u.mb.mbxStatus) {
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_DISCOVERY|LOG_MBOX,
|
||||
"2550 UNREG_FCFI mbxStatus error x%x "
|
||||
"HBA state x%x\n",
|
||||
mboxq->u.mb.mbxStatus, vport->port_state);
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"2550 UNREG_FCFI mbxStatus error x%x "
|
||||
"HBA state x%x\n",
|
||||
mboxq->u.mb.mbxStatus, vport->port_state);
|
||||
}
|
||||
mempool_free(mboxq, phba->mbox_mem_pool);
|
||||
return;
|
||||
@ -6664,7 +6677,7 @@ lpfc_sli4_unregister_fcf(struct lpfc_hba *phba)
|
||||
|
||||
mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
|
||||
if (!mbox) {
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_DISCOVERY|LOG_MBOX,
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"2551 UNREG_FCFI mbox allocation failed"
|
||||
"HBA state x%x\n", phba->pport->port_state);
|
||||
return -ENOMEM;
|
||||
@ -6675,7 +6688,7 @@ lpfc_sli4_unregister_fcf(struct lpfc_hba *phba)
|
||||
rc = lpfc_sli_issue_mbox(phba, mbox, MBX_NOWAIT);
|
||||
|
||||
if (rc == MBX_NOT_FINISHED) {
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"2552 Unregister FCFI command failed rc x%x "
|
||||
"HBA state x%x\n",
|
||||
rc, phba->pport->port_state);
|
||||
@ -6699,7 +6712,7 @@ lpfc_unregister_fcf_rescan(struct lpfc_hba *phba)
|
||||
/* Preparation for unregistering fcf */
|
||||
rc = lpfc_unregister_fcf_prep(phba);
|
||||
if (rc) {
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_DISCOVERY,
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"2748 Failed to prepare for unregistering "
|
||||
"HBA's FCF record: rc=%d\n", rc);
|
||||
return;
|
||||
@ -6735,7 +6748,7 @@ lpfc_unregister_fcf_rescan(struct lpfc_hba *phba)
|
||||
spin_lock_irq(&phba->hbalock);
|
||||
phba->fcf.fcf_flag &= ~FCF_INIT_DISC;
|
||||
spin_unlock_irq(&phba->hbalock);
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_DISCOVERY|LOG_MBOX,
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"2553 lpfc_unregister_unused_fcf failed "
|
||||
"to read FCF record HBA state x%x\n",
|
||||
phba->pport->port_state);
|
||||
@ -6757,7 +6770,7 @@ lpfc_unregister_fcf(struct lpfc_hba *phba)
|
||||
/* Preparation for unregistering fcf */
|
||||
rc = lpfc_unregister_fcf_prep(phba);
|
||||
if (rc) {
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_DISCOVERY,
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"2749 Failed to prepare for unregistering "
|
||||
"HBA's FCF record: rc=%d\n", rc);
|
||||
return;
|
||||
@ -6844,9 +6857,9 @@ lpfc_read_fcf_conn_tbl(struct lpfc_hba *phba,
|
||||
conn_entry = kzalloc(sizeof(struct lpfc_fcf_conn_entry),
|
||||
GFP_KERNEL);
|
||||
if (!conn_entry) {
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
|
||||
"2566 Failed to allocate connection"
|
||||
" table entry\n");
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"2566 Failed to allocate connection"
|
||||
" table entry\n");
|
||||
return;
|
||||
}
|
||||
|
||||
@ -6990,7 +7003,7 @@ lpfc_parse_fcoe_conf(struct lpfc_hba *phba,
|
||||
|
||||
/* Check the region signature first */
|
||||
if (memcmp(buff, LPFC_REGION23_SIGNATURE, 4)) {
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"2567 Config region 23 has bad signature\n");
|
||||
return;
|
||||
}
|
||||
@ -6999,8 +7012,8 @@ lpfc_parse_fcoe_conf(struct lpfc_hba *phba,
|
||||
|
||||
/* Check the data structure version */
|
||||
if (buff[offset] != LPFC_REGION23_VERSION) {
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
|
||||
"2568 Config region 23 has bad version\n");
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"2568 Config region 23 has bad version\n");
|
||||
return;
|
||||
}
|
||||
offset += 4;
|
||||
|
@ -650,6 +650,9 @@ struct lpfc_register {
|
||||
#define lpfc_sliport_status_oti_SHIFT 29
|
||||
#define lpfc_sliport_status_oti_MASK 0x1
|
||||
#define lpfc_sliport_status_oti_WORD word0
|
||||
#define lpfc_sliport_status_dip_SHIFT 25
|
||||
#define lpfc_sliport_status_dip_MASK 0x1
|
||||
#define lpfc_sliport_status_dip_WORD word0
|
||||
#define lpfc_sliport_status_rn_SHIFT 24
|
||||
#define lpfc_sliport_status_rn_MASK 0x1
|
||||
#define lpfc_sliport_status_rn_WORD word0
|
||||
@ -3531,7 +3534,7 @@ struct lpfc_sli4_parameters {
|
||||
};
|
||||
|
||||
#define LPFC_SET_UE_RECOVERY 0x10
|
||||
#define LPFC_SET_MDS_DIAGS 0x11
|
||||
#define LPFC_SET_MDS_DIAGS 0x12
|
||||
#define LPFC_SET_DUAL_DUMP 0x1e
|
||||
struct lpfc_mbx_set_feature {
|
||||
struct mbox_header header;
|
||||
|
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user