You've already forked linux-rockchip
mirror of
https://github.com/armbian/linux-rockchip.git
synced 2026-01-06 11:08:10 -08:00
Merge tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi
Pull SCSI updates from James Bottomley: "This series consists of the usual driver updates (ufs, ibmvfc, megaraid_sas, lpfc, elx, mpi3mr, qedi, iscsi, storvsc, mpt3sas) with elx and mpi3mr being new drivers. The major core change is a rework to drop the status byte handling macros and the old bit shifted definitions and the rest of the updates are minor fixes" * tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi: (287 commits) scsi: aha1740: Avoid over-read of sense buffer scsi: arcmsr: Avoid over-read of sense buffer scsi: ips: Avoid over-read of sense buffer scsi: ufs: ufs-mediatek: Add missing of_node_put() in ufs_mtk_probe() scsi: elx: libefc: Fix IRQ restore in efc_domain_dispatch_frame() scsi: elx: libefc: Fix less than zero comparison of a unsigned int scsi: elx: efct: Fix pointer error checking in debugfs init scsi: elx: efct: Fix is_originator return code type scsi: elx: efct: Fix link error for _bad_cmpxchg scsi: elx: efct: Eliminate unnecessary boolean check in efct_hw_command_cancel() scsi: elx: efct: Do not use id uninitialized in efct_lio_setup_session() scsi: elx: efct: Fix error handling in efct_hw_init() scsi: elx: efct: Remove redundant initialization of variable lun scsi: elx: efct: Fix spelling mistake "Unexected" -> "Unexpected" scsi: lpfc: Fix build error in lpfc_scsi.c scsi: target: iscsi: Remove redundant continue statement scsi: qla4xxx: Remove redundant continue statement scsi: ppa: Switch to use module_parport_driver() scsi: imm: Switch to use module_parport_driver() scsi: mpt3sas: Fix error return value in _scsih_expander_add() ...
This commit is contained in:
@@ -995,6 +995,132 @@ Description: This entry shows the target state of an UFS UIC link
|
||||
|
||||
The file is read only.
|
||||
|
||||
What: /sys/bus/platform/drivers/ufshcd/*/monitor/monitor_enable
|
||||
Date: January 2021
|
||||
Contact: Can Guo <cang@codeaurora.org>
|
||||
Description: This file shows the status of performance monitor enablement
|
||||
and it can be used to start/stop the monitor. When the monitor
|
||||
is stopped, the performance data collected is also cleared.
|
||||
|
||||
What: /sys/bus/platform/drivers/ufshcd/*/monitor/monitor_chunk_size
|
||||
Date: January 2021
|
||||
Contact: Can Guo <cang@codeaurora.org>
|
||||
Description: This file tells the monitor to focus on requests transferring
|
||||
data of specific chunk size (in Bytes). 0 means any chunk size.
|
||||
It can only be changed when monitor is disabled.
|
||||
|
||||
What: /sys/bus/platform/drivers/ufshcd/*/monitor/read_total_sectors
|
||||
Date: January 2021
|
||||
Contact: Can Guo <cang@codeaurora.org>
|
||||
Description: This file shows how many sectors (in 512 Bytes) have been
|
||||
sent from device to host after monitor gets started.
|
||||
|
||||
The file is read only.
|
||||
|
||||
What: /sys/bus/platform/drivers/ufshcd/*/monitor/read_total_busy
|
||||
Date: January 2021
|
||||
Contact: Can Guo <cang@codeaurora.org>
|
||||
Description: This file shows how long (in micro seconds) has been spent
|
||||
sending data from device to host after monitor gets started.
|
||||
|
||||
The file is read only.
|
||||
|
||||
What: /sys/bus/platform/drivers/ufshcd/*/monitor/read_nr_requests
|
||||
Date: January 2021
|
||||
Contact: Can Guo <cang@codeaurora.org>
|
||||
Description: This file shows how many read requests have been sent after
|
||||
monitor gets started.
|
||||
|
||||
The file is read only.
|
||||
|
||||
What: /sys/bus/platform/drivers/ufshcd/*/monitor/read_req_latency_max
|
||||
Date: January 2021
|
||||
Contact: Can Guo <cang@codeaurora.org>
|
||||
Description: This file shows the maximum latency (in micro seconds) of
|
||||
read requests after monitor gets started.
|
||||
|
||||
The file is read only.
|
||||
|
||||
What: /sys/bus/platform/drivers/ufshcd/*/monitor/read_req_latency_min
|
||||
Date: January 2021
|
||||
Contact: Can Guo <cang@codeaurora.org>
|
||||
Description: This file shows the minimum latency (in micro seconds) of
|
||||
read requests after monitor gets started.
|
||||
|
||||
The file is read only.
|
||||
|
||||
What: /sys/bus/platform/drivers/ufshcd/*/monitor/read_req_latency_avg
|
||||
Date: January 2021
|
||||
Contact: Can Guo <cang@codeaurora.org>
|
||||
Description: This file shows the average latency (in micro seconds) of
|
||||
read requests after monitor gets started.
|
||||
|
||||
The file is read only.
|
||||
|
||||
What: /sys/bus/platform/drivers/ufshcd/*/monitor/read_req_latency_sum
|
||||
Date: January 2021
|
||||
Contact: Can Guo <cang@codeaurora.org>
|
||||
Description: This file shows the total latency (in micro seconds) of
|
||||
read requests sent after monitor gets started.
|
||||
|
||||
The file is read only.
|
||||
|
||||
What: /sys/bus/platform/drivers/ufshcd/*/monitor/write_total_sectors
|
||||
Date: January 2021
|
||||
Contact: Can Guo <cang@codeaurora.org>
|
||||
Description: This file shows how many sectors (in 512 Bytes) have been sent
|
||||
from host to device after monitor gets started.
|
||||
|
||||
The file is read only.
|
||||
|
||||
What: /sys/bus/platform/drivers/ufshcd/*/monitor/write_total_busy
|
||||
Date: January 2021
|
||||
Contact: Can Guo <cang@codeaurora.org>
|
||||
Description: This file shows how long (in micro seconds) has been spent
|
||||
sending data from host to device after monitor gets started.
|
||||
|
||||
The file is read only.
|
||||
|
||||
What: /sys/bus/platform/drivers/ufshcd/*/monitor/write_nr_requests
|
||||
Date: January 2021
|
||||
Contact: Can Guo <cang@codeaurora.org>
|
||||
Description: This file shows how many write requests have been sent after
|
||||
monitor gets started.
|
||||
|
||||
The file is read only.
|
||||
|
||||
What: /sys/bus/platform/drivers/ufshcd/*/monitor/write_req_latency_max
|
||||
Date: January 2021
|
||||
Contact: Can Guo <cang@codeaurora.org>
|
||||
Description: This file shows the maximum latency (in micro seconds) of write
|
||||
requests after monitor gets started.
|
||||
|
||||
The file is read only.
|
||||
|
||||
What: /sys/bus/platform/drivers/ufshcd/*/monitor/write_req_latency_min
|
||||
Date: January 2021
|
||||
Contact: Can Guo <cang@codeaurora.org>
|
||||
Description: This file shows the minimum latency (in micro seconds) of write
|
||||
requests after monitor gets started.
|
||||
|
||||
The file is read only.
|
||||
|
||||
What: /sys/bus/platform/drivers/ufshcd/*/monitor/write_req_latency_avg
|
||||
Date: January 2021
|
||||
Contact: Can Guo <cang@codeaurora.org>
|
||||
Description: This file shows the average latency (in micro seconds) of write
|
||||
requests after monitor gets started.
|
||||
|
||||
The file is read only.
|
||||
|
||||
What: /sys/bus/platform/drivers/ufshcd/*/monitor/write_req_latency_sum
|
||||
Date: January 2021
|
||||
Contact: Can Guo <cang@codeaurora.org>
|
||||
Description: This file shows the total latency (in micro seconds) of write
|
||||
requests after monitor gets started.
|
||||
|
||||
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>
|
||||
|
||||
@@ -1172,10 +1172,9 @@ Members of interest:
|
||||
of 0 implies a successfully completed command (and all
|
||||
data (if any) has been transferred to or from the SCSI
|
||||
target device). 'result' is a 32 bit unsigned integer that
|
||||
can be viewed as 4 related bytes. The SCSI status value is
|
||||
in the LSB. See include/scsi/scsi.h status_byte(),
|
||||
msg_byte(), host_byte() and driver_byte() macros and
|
||||
related constants.
|
||||
can be viewed as 2 related bytes. The SCSI status value is
|
||||
in the LSB. See include/scsi/scsi.h status_byte() and
|
||||
host_byte() macros and related constants.
|
||||
sense_buffer
|
||||
- an array (maximum size: SCSI_SENSE_BUFFERSIZE bytes) that
|
||||
should be written when the SCSI status (LSB of 'result')
|
||||
|
||||
@@ -6800,6 +6800,15 @@ S: Supported
|
||||
W: http://www.broadcom.com
|
||||
F: drivers/scsi/lpfc/
|
||||
|
||||
EMULEX/BROADCOM EFCT FC/FCOE SCSI TARGET DRIVER
|
||||
M: James Smart <james.smart@broadcom.com>
|
||||
M: Ram Vegesna <ram.vegesna@broadcom.com>
|
||||
L: linux-scsi@vger.kernel.org
|
||||
L: target-devel@vger.kernel.org
|
||||
S: Supported
|
||||
W: http://www.broadcom.com
|
||||
F: drivers/scsi/elx/
|
||||
|
||||
ENE CB710 FLASH CARD READER DRIVER
|
||||
M: Michał Mirosław <mirq-linux@rere.qmqm.pl>
|
||||
S: Maintained
|
||||
|
||||
@@ -151,6 +151,15 @@ config BLK_CGROUP_IOLATENCY
|
||||
|
||||
Note, this is an experimental interface and could be changed someday.
|
||||
|
||||
config BLK_CGROUP_FC_APPID
|
||||
bool "Enable support to track FC I/O Traffic across cgroup applications"
|
||||
depends on BLK_CGROUP=y
|
||||
help
|
||||
Enabling this option enables the support to track FC I/O traffic across
|
||||
cgroup applications. It enables the Fabric and the storage targets to
|
||||
identify, monitor, and handle FC traffic based on VM tags by inserting
|
||||
application specific identification into the FC frame.
|
||||
|
||||
config BLK_CGROUP_IOCOST
|
||||
bool "Enable support for cost model based cgroup IO controller"
|
||||
depends on BLK_CGROUP=y
|
||||
|
||||
@@ -84,7 +84,7 @@ static int bsg_transport_complete_rq(struct request *rq, struct sg_io_v4 *hdr)
|
||||
*/
|
||||
hdr->device_status = job->result & 0xff;
|
||||
hdr->transport_status = host_byte(job->result);
|
||||
hdr->driver_status = driver_byte(job->result);
|
||||
hdr->driver_status = 0;
|
||||
hdr->info = 0;
|
||||
if (hdr->device_status || hdr->transport_status || hdr->driver_status)
|
||||
hdr->info |= SG_INFO_CHECK;
|
||||
|
||||
@@ -96,7 +96,9 @@ static int bsg_scsi_complete_rq(struct request *rq, struct sg_io_v4 *hdr)
|
||||
*/
|
||||
hdr->device_status = sreq->result & 0xff;
|
||||
hdr->transport_status = host_byte(sreq->result);
|
||||
hdr->driver_status = driver_byte(sreq->result);
|
||||
hdr->driver_status = 0;
|
||||
if (scsi_status_is_check_condition(sreq->result))
|
||||
hdr->driver_status = DRIVER_SENSE;
|
||||
hdr->info = 0;
|
||||
if (hdr->device_status || hdr->transport_status || hdr->driver_status)
|
||||
hdr->info |= SG_INFO_CHECK;
|
||||
|
||||
@@ -254,9 +254,11 @@ static int blk_complete_sghdr_rq(struct request *rq, struct sg_io_hdr *hdr,
|
||||
*/
|
||||
hdr->status = req->result & 0xff;
|
||||
hdr->masked_status = status_byte(req->result);
|
||||
hdr->msg_status = msg_byte(req->result);
|
||||
hdr->msg_status = COMMAND_COMPLETE;
|
||||
hdr->host_status = host_byte(req->result);
|
||||
hdr->driver_status = driver_byte(req->result);
|
||||
hdr->driver_status = 0;
|
||||
if (scsi_status_is_check_condition(hdr->status))
|
||||
hdr->driver_status = DRIVER_SENSE;
|
||||
hdr->info = 0;
|
||||
if (hdr->masked_status || hdr->host_status || hdr->driver_status)
|
||||
hdr->info |= SG_INFO_CHECK;
|
||||
@@ -484,9 +486,10 @@ int sg_scsi_ioctl(struct request_queue *q, struct gendisk *disk, fmode_t mode,
|
||||
break;
|
||||
}
|
||||
|
||||
if (bytes && blk_rq_map_kern(q, rq, buffer, bytes, GFP_NOIO)) {
|
||||
err = DRIVER_ERROR << 24;
|
||||
goto error;
|
||||
if (bytes) {
|
||||
err = blk_rq_map_kern(q, rq, buffer, bytes, GFP_NOIO);
|
||||
if (err)
|
||||
goto error;
|
||||
}
|
||||
|
||||
blk_execute_rq(disk, rq, 0);
|
||||
|
||||
@@ -196,9 +196,7 @@ void ata_scsi_set_sense(struct ata_device *dev, struct scsi_cmnd *cmd,
|
||||
if (!cmd)
|
||||
return;
|
||||
|
||||
cmd->result = (DRIVER_SENSE << 24) | SAM_STAT_CHECK_CONDITION;
|
||||
|
||||
scsi_build_sense_buffer(d_sense, cmd->sense_buffer, sk, asc, ascq);
|
||||
scsi_build_sense(cmd, d_sense, sk, asc, ascq);
|
||||
}
|
||||
|
||||
void ata_scsi_set_sense_information(struct ata_device *dev,
|
||||
@@ -409,13 +407,16 @@ int ata_cmd_ioctl(struct scsi_device *scsidev, void __user *arg)
|
||||
cmd_result = scsi_execute(scsidev, scsi_cmd, data_dir, argbuf, argsize,
|
||||
sensebuf, &sshdr, (10*HZ), 5, 0, 0, NULL);
|
||||
|
||||
if (driver_byte(cmd_result) == DRIVER_SENSE) {/* sense data available */
|
||||
if (cmd_result < 0) {
|
||||
rc = cmd_result;
|
||||
goto error;
|
||||
}
|
||||
if (scsi_sense_valid(&sshdr)) {/* sense data available */
|
||||
u8 *desc = sensebuf + 8;
|
||||
cmd_result &= ~(0xFF<<24); /* DRIVER_SENSE is not an error */
|
||||
|
||||
/* If we set cc then ATA pass-through will cause a
|
||||
* check condition even if no error. Filter that. */
|
||||
if (cmd_result & SAM_STAT_CHECK_CONDITION) {
|
||||
if (scsi_status_is_check_condition(cmd_result)) {
|
||||
if (sshdr.sense_key == RECOVERED_ERROR &&
|
||||
sshdr.asc == 0 && sshdr.ascq == 0x1d)
|
||||
cmd_result &= ~SAM_STAT_CHECK_CONDITION;
|
||||
@@ -490,9 +491,12 @@ int ata_task_ioctl(struct scsi_device *scsidev, void __user *arg)
|
||||
cmd_result = scsi_execute(scsidev, scsi_cmd, DMA_NONE, NULL, 0,
|
||||
sensebuf, &sshdr, (10*HZ), 5, 0, 0, NULL);
|
||||
|
||||
if (driver_byte(cmd_result) == DRIVER_SENSE) {/* sense data available */
|
||||
if (cmd_result < 0) {
|
||||
rc = cmd_result;
|
||||
goto error;
|
||||
}
|
||||
if (scsi_sense_valid(&sshdr)) {/* sense data available */
|
||||
u8 *desc = sensebuf + 8;
|
||||
cmd_result &= ~(0xFF<<24); /* DRIVER_SENSE is not an error */
|
||||
|
||||
/* If we set cc then ATA pass-through will cause a
|
||||
* check condition even if no error. Filter that. */
|
||||
@@ -638,7 +642,7 @@ static struct ata_queued_cmd *ata_scsi_qc_new(struct ata_device *dev,
|
||||
if (cmd->request->rq_flags & RQF_QUIET)
|
||||
qc->flags |= ATA_QCFLAG_QUIET;
|
||||
} else {
|
||||
cmd->result = (DID_OK << 16) | (QUEUE_FULL << 1);
|
||||
cmd->result = (DID_OK << 16) | SAM_STAT_TASK_SET_FULL;
|
||||
cmd->scsi_done(cmd);
|
||||
}
|
||||
|
||||
@@ -858,8 +862,6 @@ static void ata_gen_passthru_sense(struct ata_queued_cmd *qc)
|
||||
|
||||
memset(sb, 0, SCSI_SENSE_BUFFERSIZE);
|
||||
|
||||
cmd->result = (DRIVER_SENSE << 24) | SAM_STAT_CHECK_CONDITION;
|
||||
|
||||
/*
|
||||
* Use ata_to_sense_error() to map status register bits
|
||||
* onto sense key, asc & ascq.
|
||||
@@ -874,8 +876,7 @@ static void ata_gen_passthru_sense(struct ata_queued_cmd *qc)
|
||||
* ATA PASS-THROUGH INFORMATION AVAILABLE
|
||||
* Always in descriptor format sense.
|
||||
*/
|
||||
scsi_build_sense_buffer(1, cmd->sense_buffer,
|
||||
RECOVERED_ERROR, 0, 0x1D);
|
||||
scsi_build_sense(cmd, 1, RECOVERED_ERROR, 0, 0x1D);
|
||||
}
|
||||
|
||||
if ((cmd->sense_buffer[0] & 0x7f) >= 0x72) {
|
||||
@@ -957,8 +958,6 @@ static void ata_gen_ata_sense(struct ata_queued_cmd *qc)
|
||||
|
||||
memset(sb, 0, SCSI_SENSE_BUFFERSIZE);
|
||||
|
||||
cmd->result = (DRIVER_SENSE << 24) | SAM_STAT_CHECK_CONDITION;
|
||||
|
||||
if (ata_dev_disabled(dev)) {
|
||||
/* Device disabled after error recovery */
|
||||
/* LOGICAL UNIT NOT READY, HARD RESET REQUIRED */
|
||||
@@ -4196,7 +4195,6 @@ void ata_scsi_simulate(struct ata_device *dev, struct scsi_cmnd *cmd)
|
||||
|
||||
case REQUEST_SENSE:
|
||||
ata_scsi_set_sense(dev, cmd, 0, 0, 0);
|
||||
cmd->result = (DRIVER_SENSE << 24);
|
||||
break;
|
||||
|
||||
/* if we reach this, then writeback caching is disabled,
|
||||
|
||||
@@ -506,6 +506,7 @@ iscsi_iser_conn_bind(struct iscsi_cls_session *cls_session,
|
||||
iser_conn->iscsi_conn = conn;
|
||||
|
||||
out:
|
||||
iscsi_put_endpoint(ep);
|
||||
mutex_unlock(&iser_conn->state_mutex);
|
||||
return error;
|
||||
}
|
||||
@@ -1002,6 +1003,7 @@ static struct iscsi_transport iscsi_iser_transport = {
|
||||
/* connection management */
|
||||
.create_conn = iscsi_iser_conn_create,
|
||||
.bind_conn = iscsi_iser_conn_bind,
|
||||
.unbind_conn = iscsi_conn_unbind,
|
||||
.destroy_conn = iscsi_conn_teardown,
|
||||
.attr_is_visible = iser_attr_is_visible,
|
||||
.set_param = iscsi_iser_set_param,
|
||||
|
||||
@@ -2209,7 +2209,7 @@ static int srp_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *scmnd)
|
||||
* to reduce queue depth temporarily.
|
||||
*/
|
||||
scmnd->result = len == -ENOMEM ?
|
||||
DID_OK << 16 | QUEUE_FULL << 1 : DID_ERROR << 16;
|
||||
DID_OK << 16 | SAM_STAT_TASK_SET_FULL : DID_ERROR << 16;
|
||||
goto err_iu;
|
||||
}
|
||||
|
||||
|
||||
@@ -6993,8 +6993,6 @@ mpt_SoftResetHandler(MPT_ADAPTER *ioc, int sleepFlag)
|
||||
ioc->ioc_reset_in_progress = 1;
|
||||
spin_unlock_irqrestore(&ioc->taskmgmt_lock, flags);
|
||||
|
||||
rc = -1;
|
||||
|
||||
for (cb_idx = MPT_MAX_PROTOCOL_DRIVERS-1; cb_idx; cb_idx--) {
|
||||
if (MptResetHandlers[cb_idx])
|
||||
mpt_signal_reset(cb_idx, ioc, MPT_IOC_SETUP_RESET);
|
||||
|
||||
@@ -86,7 +86,7 @@ MODULE_PARM_DESC(mpt_pt_clear,
|
||||
" Clear persistency table: enable=1 "
|
||||
"(default=MPTSCSIH_PT_CLEAR=0)");
|
||||
|
||||
/* scsi-mid layer global parmeter is max_report_luns, which is 511 */
|
||||
/* scsi-mid layer global parameter is max_report_luns, which is 511 */
|
||||
#define MPTSAS_MAX_LUN (16895)
|
||||
static int max_lun = MPTSAS_MAX_LUN;
|
||||
module_param(max_lun, int, 0);
|
||||
@@ -420,12 +420,14 @@ mptsas_find_portinfo_by_handle(MPT_ADAPTER *ioc, u16 handle)
|
||||
}
|
||||
|
||||
/**
|
||||
* mptsas_find_portinfo_by_sas_address -
|
||||
* mptsas_find_portinfo_by_sas_address - find and return portinfo for
|
||||
* this sas_address
|
||||
* @ioc: Pointer to MPT_ADAPTER structure
|
||||
* @handle:
|
||||
* @sas_address: expander sas address
|
||||
*
|
||||
* This function should be called with the sas_topology_mutex already held
|
||||
* This function should be called with the sas_topology_mutex already held.
|
||||
*
|
||||
* Return: %NULL if not found.
|
||||
**/
|
||||
static struct mptsas_portinfo *
|
||||
mptsas_find_portinfo_by_sas_address(MPT_ADAPTER *ioc, u64 sas_address)
|
||||
@@ -567,12 +569,14 @@ starget)
|
||||
}
|
||||
|
||||
/**
|
||||
* mptsas_add_device_component -
|
||||
* mptsas_add_device_component - adds a new device component to our lists
|
||||
* @ioc: Pointer to MPT_ADAPTER structure
|
||||
* @channel: fw mapped id's
|
||||
* @id:
|
||||
* @sas_address:
|
||||
* @device_info:
|
||||
* @channel: channel number
|
||||
* @id: Logical Target ID for reset (if appropriate)
|
||||
* @sas_address: expander sas address
|
||||
* @device_info: specific bits (flags) for devices
|
||||
* @slot: enclosure slot ID
|
||||
* @enclosure_logical_id: enclosure WWN
|
||||
*
|
||||
**/
|
||||
static void
|
||||
@@ -634,10 +638,10 @@ mptsas_add_device_component(MPT_ADAPTER *ioc, u8 channel, u8 id,
|
||||
}
|
||||
|
||||
/**
|
||||
* mptsas_add_device_component_by_fw -
|
||||
* mptsas_add_device_component_by_fw - adds a new device component by FW ID
|
||||
* @ioc: Pointer to MPT_ADAPTER structure
|
||||
* @channel: fw mapped id's
|
||||
* @id:
|
||||
* @channel: channel number
|
||||
* @id: Logical Target ID
|
||||
*
|
||||
**/
|
||||
static void
|
||||
@@ -668,8 +672,7 @@ mptsas_add_device_component_by_fw(MPT_ADAPTER *ioc, u8 channel, u8 id)
|
||||
/**
|
||||
* mptsas_add_device_component_starget_ir - Handle Integrated RAID, adding each individual device to list
|
||||
* @ioc: Pointer to MPT_ADAPTER structure
|
||||
* @channel: fw mapped id's
|
||||
* @id:
|
||||
* @starget: SCSI target for this SCSI device
|
||||
*
|
||||
**/
|
||||
static void
|
||||
@@ -771,9 +774,9 @@ mptsas_add_device_component_starget_ir(MPT_ADAPTER *ioc,
|
||||
}
|
||||
|
||||
/**
|
||||
* mptsas_add_device_component_starget -
|
||||
* mptsas_add_device_component_starget - adds a SCSI target device component
|
||||
* @ioc: Pointer to MPT_ADAPTER structure
|
||||
* @starget:
|
||||
* @starget: SCSI target for this SCSI device
|
||||
*
|
||||
**/
|
||||
static void
|
||||
@@ -806,7 +809,7 @@ mptsas_add_device_component_starget(MPT_ADAPTER *ioc,
|
||||
* mptsas_del_device_component_by_os - Once a device has been removed, we mark the entry in the list as being cached
|
||||
* @ioc: Pointer to MPT_ADAPTER structure
|
||||
* @channel: os mapped id's
|
||||
* @id:
|
||||
* @id: Logical Target ID
|
||||
*
|
||||
**/
|
||||
static void
|
||||
@@ -978,11 +981,12 @@ mptsas_setup_wide_ports(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info)
|
||||
}
|
||||
|
||||
/**
|
||||
* csmisas_find_vtarget
|
||||
* mptsas_find_vtarget - find a virtual target device (FC LUN device or
|
||||
* SCSI target device)
|
||||
*
|
||||
* @ioc
|
||||
* @volume_id
|
||||
* @volume_bus
|
||||
* @ioc: Pointer to MPT_ADAPTER structure
|
||||
* @channel: channel number
|
||||
* @id: Logical Target ID
|
||||
*
|
||||
**/
|
||||
static VirtTarget *
|
||||
@@ -1047,15 +1051,14 @@ mptsas_queue_rescan(MPT_ADAPTER *ioc)
|
||||
|
||||
|
||||
/**
|
||||
* mptsas_target_reset
|
||||
* mptsas_target_reset - Issues TARGET_RESET to end device using
|
||||
* handshaking method
|
||||
*
|
||||
* Issues TARGET_RESET to end device using handshaking method
|
||||
* @ioc: Pointer to MPT_ADAPTER structure
|
||||
* @channel: channel number
|
||||
* @id: Logical Target ID for reset
|
||||
*
|
||||
* @ioc
|
||||
* @channel
|
||||
* @id
|
||||
*
|
||||
* Returns (1) success
|
||||
* Return: (1) success
|
||||
* (0) failure
|
||||
*
|
||||
**/
|
||||
@@ -1119,15 +1122,15 @@ mptsas_block_io_starget(struct scsi_target *starget)
|
||||
}
|
||||
|
||||
/**
|
||||
* mptsas_target_reset_queue
|
||||
* mptsas_target_reset_queue - queue a target reset
|
||||
*
|
||||
* Receive request for TARGET_RESET after receiving an firmware
|
||||
* @ioc: Pointer to MPT_ADAPTER structure
|
||||
* @sas_event_data: SAS Device Status Change Event data
|
||||
*
|
||||
* Receive request for TARGET_RESET after receiving a firmware
|
||||
* event NOT_RESPONDING_EVENT, then put command in link list
|
||||
* and queue if task_queue already in use.
|
||||
*
|
||||
* @ioc
|
||||
* @sas_event_data
|
||||
*
|
||||
**/
|
||||
static void
|
||||
mptsas_target_reset_queue(MPT_ADAPTER *ioc,
|
||||
@@ -1207,9 +1210,11 @@ mptsas_schedule_target_reset(void *iocp)
|
||||
/**
|
||||
* mptsas_taskmgmt_complete - complete SAS task management function
|
||||
* @ioc: Pointer to MPT_ADAPTER structure
|
||||
* @mf: MPT message frame
|
||||
* @mr: SCSI Task Management Reply structure ptr (may be %NULL)
|
||||
*
|
||||
* Completion for TARGET_RESET after NOT_RESPONDING_EVENT, enable work
|
||||
* queue to finish off removing device from upper layers. then send next
|
||||
* queue to finish off removing device from upper layers, then send next
|
||||
* TARGET_RESET in the queue.
|
||||
**/
|
||||
static int
|
||||
@@ -1300,10 +1305,10 @@ mptsas_taskmgmt_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
|
||||
}
|
||||
|
||||
/**
|
||||
* mptscsih_ioc_reset
|
||||
* mptsas_ioc_reset - issue an IOC reset for this reset phase
|
||||
*
|
||||
* @ioc
|
||||
* @reset_phase
|
||||
* @ioc: Pointer to MPT_ADAPTER structure
|
||||
* @reset_phase: id of phase of reset
|
||||
*
|
||||
**/
|
||||
static int
|
||||
@@ -1350,7 +1355,7 @@ mptsas_ioc_reset(MPT_ADAPTER *ioc, int reset_phase)
|
||||
|
||||
|
||||
/**
|
||||
* enum device_state -
|
||||
* enum device_state - TUR device state
|
||||
* @DEVICE_RETRY: need to retry the TUR
|
||||
* @DEVICE_ERROR: TUR return error, don't add device
|
||||
* @DEVICE_READY: device can be added
|
||||
@@ -1941,7 +1946,7 @@ mptsas_qcmd(struct Scsi_Host *shost, struct scsi_cmnd *SCpnt)
|
||||
}
|
||||
|
||||
/**
|
||||
* mptsas_mptsas_eh_timed_out - resets the scsi_cmnd timeout
|
||||
* mptsas_eh_timed_out - resets the scsi_cmnd timeout
|
||||
* if the device under question is currently in the
|
||||
* device removal delay.
|
||||
* @sc: scsi command that the midlayer is about to time out
|
||||
@@ -2839,14 +2844,15 @@ struct rep_manu_reply{
|
||||
};
|
||||
|
||||
/**
|
||||
* mptsas_exp_repmanufacture_info -
|
||||
* mptsas_exp_repmanufacture_info - sets expander manufacturer info
|
||||
* @ioc: per adapter object
|
||||
* @sas_address: expander sas address
|
||||
* @edev: the sas_expander_device object
|
||||
*
|
||||
* Fills in the sas_expander_device object when SMP port is created.
|
||||
* For an edge expander or a fanout expander:
|
||||
* fills in the sas_expander_device object when SMP port is created.
|
||||
*
|
||||
* Returns 0 for success, non-zero for failure.
|
||||
* Return: 0 for success, non-zero for failure.
|
||||
*/
|
||||
static int
|
||||
mptsas_exp_repmanufacture_info(MPT_ADAPTER *ioc,
|
||||
@@ -3284,7 +3290,7 @@ static int mptsas_probe_one_phy(struct device *dev,
|
||||
rphy_to_expander_device(rphy));
|
||||
}
|
||||
|
||||
/* If the device exists,verify it wasn't previously flagged
|
||||
/* If the device exists, verify it wasn't previously flagged
|
||||
as a missing device. If so, clear it */
|
||||
vtarget = mptsas_find_vtarget(ioc,
|
||||
phy_info->attached.channel,
|
||||
@@ -3611,8 +3617,7 @@ static void mptsas_expander_delete(MPT_ADAPTER *ioc,
|
||||
|
||||
/**
|
||||
* mptsas_send_expander_event - expanders events
|
||||
* @ioc: Pointer to MPT_ADAPTER structure
|
||||
* @expander_data: event data
|
||||
* @fw_event: event data
|
||||
*
|
||||
*
|
||||
* This function handles adding, removing, and refreshing
|
||||
@@ -3657,9 +3662,9 @@ mptsas_send_expander_event(struct fw_event_work *fw_event)
|
||||
|
||||
|
||||
/**
|
||||
* mptsas_expander_add -
|
||||
* mptsas_expander_add - adds a newly discovered expander
|
||||
* @ioc: Pointer to MPT_ADAPTER structure
|
||||
* @handle:
|
||||
* @handle: device handle
|
||||
*
|
||||
*/
|
||||
static struct mptsas_portinfo *
|
||||
@@ -4000,9 +4005,9 @@ mptsas_probe_devices(MPT_ADAPTER *ioc)
|
||||
}
|
||||
|
||||
/**
|
||||
* mptsas_scan_sas_topology -
|
||||
* mptsas_scan_sas_topology - scans new SAS topology
|
||||
* (part of probe or rescan)
|
||||
* @ioc: Pointer to MPT_ADAPTER structure
|
||||
* @sas_address:
|
||||
*
|
||||
**/
|
||||
static void
|
||||
@@ -4150,11 +4155,12 @@ mptsas_find_phyinfo_by_sas_address(MPT_ADAPTER *ioc, u64 sas_address)
|
||||
}
|
||||
|
||||
/**
|
||||
* mptsas_find_phyinfo_by_phys_disk_num -
|
||||
* mptsas_find_phyinfo_by_phys_disk_num - find phyinfo for the
|
||||
* specified @phys_disk_num
|
||||
* @ioc: Pointer to MPT_ADAPTER structure
|
||||
* @phys_disk_num:
|
||||
* @channel:
|
||||
* @id:
|
||||
* @phys_disk_num: (hot plug) physical disk number (for RAID support)
|
||||
* @channel: channel number
|
||||
* @id: Logical Target ID
|
||||
*
|
||||
**/
|
||||
static struct mptsas_phyinfo *
|
||||
@@ -4773,8 +4779,9 @@ mptsas_send_raid_event(struct fw_event_work *fw_event)
|
||||
* @lun: Logical unit for reset (if appropriate)
|
||||
* @task_context: Context for the task to be aborted
|
||||
* @timeout: timeout for task management control
|
||||
* @issue_reset: set to 1 on return if reset is needed, else 0
|
||||
*
|
||||
* return 0 on success and -1 on failure:
|
||||
* Return: 0 on success or -1 on failure.
|
||||
*
|
||||
*/
|
||||
static int
|
||||
@@ -4847,9 +4854,9 @@ mptsas_issue_tm(MPT_ADAPTER *ioc, u8 type, u8 channel, u8 id, u64 lun,
|
||||
|
||||
/**
|
||||
* mptsas_broadcast_primitive_work - Handle broadcast primitives
|
||||
* @work: work queue payload containing info describing the event
|
||||
* @fw_event: work queue payload containing info describing the event
|
||||
*
|
||||
* this will be handled in workqueue context.
|
||||
* This will be handled in workqueue context.
|
||||
*/
|
||||
static void
|
||||
mptsas_broadcast_primitive_work(struct fw_event_work *fw_event)
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
#include <uapi/scsi/fc/fc_els.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/overflow.h>
|
||||
|
||||
#include <linux/blk-cgroup.h>
|
||||
#include "nvme.h"
|
||||
#include "fabrics.h"
|
||||
#include <linux/nvme-fc-driver.h>
|
||||
@@ -3808,10 +3808,80 @@ process_local_list:
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
/* Parse the cgroup id from a buf and return the length of cgrpid */
|
||||
static int fc_parse_cgrpid(const char *buf, u64 *id)
|
||||
{
|
||||
char cgrp_id[16+1];
|
||||
int cgrpid_len, j;
|
||||
|
||||
memset(cgrp_id, 0x0, sizeof(cgrp_id));
|
||||
for (cgrpid_len = 0, j = 0; cgrpid_len < 17; cgrpid_len++) {
|
||||
if (buf[cgrpid_len] != ':')
|
||||
cgrp_id[cgrpid_len] = buf[cgrpid_len];
|
||||
else {
|
||||
j = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!j)
|
||||
return -EINVAL;
|
||||
if (kstrtou64(cgrp_id, 16, id) < 0)
|
||||
return -EINVAL;
|
||||
return cgrpid_len;
|
||||
}
|
||||
|
||||
/*
|
||||
* fc_update_appid: Parse and update the appid in the blkcg associated with
|
||||
* cgroupid.
|
||||
* @buf: buf contains both cgrpid and appid info
|
||||
* @count: size of the buffer
|
||||
*/
|
||||
static int fc_update_appid(const char *buf, size_t count)
|
||||
{
|
||||
u64 cgrp_id;
|
||||
int appid_len = 0;
|
||||
int cgrpid_len = 0;
|
||||
char app_id[FC_APPID_LEN];
|
||||
int ret = 0;
|
||||
|
||||
if (buf[count-1] == '\n')
|
||||
count--;
|
||||
|
||||
if ((count > (16+1+FC_APPID_LEN)) || (!strchr(buf, ':')))
|
||||
return -EINVAL;
|
||||
|
||||
cgrpid_len = fc_parse_cgrpid(buf, &cgrp_id);
|
||||
if (cgrpid_len < 0)
|
||||
return -EINVAL;
|
||||
appid_len = count - cgrpid_len - 1;
|
||||
if (appid_len > FC_APPID_LEN)
|
||||
return -EINVAL;
|
||||
|
||||
memset(app_id, 0x0, sizeof(app_id));
|
||||
memcpy(app_id, &buf[cgrpid_len+1], appid_len);
|
||||
ret = blkcg_set_fc_appid(app_id, cgrp_id, sizeof(app_id));
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t fc_appid_store(struct device *dev,
|
||||
struct device_attribute *attr, const char *buf, size_t count)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
ret = fc_update_appid(buf, count);
|
||||
if (ret < 0)
|
||||
return -EINVAL;
|
||||
return count;
|
||||
}
|
||||
static DEVICE_ATTR(nvme_discovery, 0200, NULL, nvme_fc_nvme_discovery_store);
|
||||
static DEVICE_ATTR(appid_store, 0200, NULL, fc_appid_store);
|
||||
|
||||
static struct attribute *nvme_fc_attrs[] = {
|
||||
&dev_attr_nvme_discovery.attr,
|
||||
&dev_attr_appid_store.attr,
|
||||
NULL
|
||||
};
|
||||
|
||||
|
||||
@@ -856,10 +856,7 @@ void zfcp_scsi_set_prot(struct zfcp_adapter *adapter)
|
||||
*/
|
||||
void zfcp_scsi_dif_sense_error(struct scsi_cmnd *scmd, int ascq)
|
||||
{
|
||||
scsi_build_sense_buffer(1, scmd->sense_buffer,
|
||||
ILLEGAL_REQUEST, 0x10, ascq);
|
||||
set_driver_byte(scmd, DRIVER_SENSE);
|
||||
scmd->result |= SAM_STAT_CHECK_CONDITION;
|
||||
scsi_build_sense(scmd, 1, ILLEGAL_REQUEST, 0x10, ascq);
|
||||
set_host_byte(scmd, DID_SOFT_ERROR);
|
||||
}
|
||||
|
||||
|
||||
@@ -303,10 +303,10 @@ static int twa_aen_drain_queue(TW_Device_Extension *tw_dev, int no_check_reset)
|
||||
|
||||
/* Initialize sglist */
|
||||
memset(&sglist, 0, sizeof(TW_SG_Entry));
|
||||
sglist[0].length = TW_SECTOR_SIZE;
|
||||
sglist[0].address = tw_dev->generic_buffer_phys[request_id];
|
||||
sglist[0].length = cpu_to_le32(TW_SECTOR_SIZE);
|
||||
sglist[0].address = TW_CPU_TO_SGL(tw_dev->generic_buffer_phys[request_id]);
|
||||
|
||||
if (sglist[0].address & TW_ALIGNMENT_9000_SGL) {
|
||||
if (tw_dev->generic_buffer_phys[request_id] & TW_ALIGNMENT_9000_SGL) {
|
||||
TW_PRINTK(tw_dev->host, TW_DRIVER, 0x1, "Found unaligned address during AEN drain");
|
||||
goto out;
|
||||
}
|
||||
@@ -440,8 +440,8 @@ static int twa_aen_read_queue(TW_Device_Extension *tw_dev, int request_id)
|
||||
|
||||
/* Initialize sglist */
|
||||
memset(&sglist, 0, sizeof(TW_SG_Entry));
|
||||
sglist[0].length = TW_SECTOR_SIZE;
|
||||
sglist[0].address = tw_dev->generic_buffer_phys[request_id];
|
||||
sglist[0].length = cpu_to_le32(TW_SECTOR_SIZE);
|
||||
sglist[0].address = TW_CPU_TO_SGL(tw_dev->generic_buffer_phys[request_id]);
|
||||
|
||||
/* Mark internal command */
|
||||
tw_dev->srb[request_id] = NULL;
|
||||
@@ -501,9 +501,8 @@ static void twa_aen_sync_time(TW_Device_Extension *tw_dev, int request_id)
|
||||
Sunday 12:00AM */
|
||||
local_time = (ktime_get_real_seconds() - (sys_tz.tz_minuteswest * 60));
|
||||
div_u64_rem(local_time - (3 * 86400), 604800, &schedulertime);
|
||||
schedulertime = cpu_to_le32(schedulertime % 604800);
|
||||
|
||||
memcpy(param->data, &schedulertime, sizeof(u32));
|
||||
memcpy(param->data, &(__le32){cpu_to_le32(schedulertime)}, sizeof(__le32));
|
||||
|
||||
/* Mark internal command */
|
||||
tw_dev->srb[request_id] = NULL;
|
||||
@@ -676,7 +675,9 @@ static long twa_chrdev_ioctl(struct file *file, unsigned int cmd, unsigned long
|
||||
data_buffer_length_adjusted = (driver_command.buffer_length + 511) & ~511;
|
||||
|
||||
/* Now allocate ioctl buf memory */
|
||||
cpu_addr = dma_alloc_coherent(&tw_dev->tw_pci_dev->dev, data_buffer_length_adjusted+sizeof(TW_Ioctl_Buf_Apache) - 1, &dma_handle, GFP_KERNEL);
|
||||
cpu_addr = dma_alloc_coherent(&tw_dev->tw_pci_dev->dev,
|
||||
sizeof(TW_Ioctl_Buf_Apache) + data_buffer_length_adjusted,
|
||||
&dma_handle, GFP_KERNEL);
|
||||
if (!cpu_addr) {
|
||||
retval = TW_IOCTL_ERROR_OS_ENOMEM;
|
||||
goto out2;
|
||||
@@ -685,7 +686,7 @@ static long twa_chrdev_ioctl(struct file *file, unsigned int cmd, unsigned long
|
||||
tw_ioctl = (TW_Ioctl_Buf_Apache *)cpu_addr;
|
||||
|
||||
/* Now copy down the entire ioctl */
|
||||
if (copy_from_user(tw_ioctl, argp, driver_command.buffer_length + sizeof(TW_Ioctl_Buf_Apache) - 1))
|
||||
if (copy_from_user(tw_ioctl, argp, sizeof(TW_Ioctl_Buf_Apache) + driver_command.buffer_length))
|
||||
goto out3;
|
||||
|
||||
/* See which ioctl we are doing */
|
||||
@@ -867,11 +868,13 @@ static long twa_chrdev_ioctl(struct file *file, unsigned int cmd, unsigned long
|
||||
}
|
||||
|
||||
/* Now copy the entire response to userspace */
|
||||
if (copy_to_user(argp, tw_ioctl, sizeof(TW_Ioctl_Buf_Apache) + driver_command.buffer_length - 1) == 0)
|
||||
if (copy_to_user(argp, tw_ioctl, sizeof(TW_Ioctl_Buf_Apache) + driver_command.buffer_length) == 0)
|
||||
retval = 0;
|
||||
out3:
|
||||
/* Now free ioctl buf memory */
|
||||
dma_free_coherent(&tw_dev->tw_pci_dev->dev, data_buffer_length_adjusted+sizeof(TW_Ioctl_Buf_Apache) - 1, cpu_addr, dma_handle);
|
||||
dma_free_coherent(&tw_dev->tw_pci_dev->dev,
|
||||
sizeof(TW_Ioctl_Buf_Apache) + data_buffer_length_adjusted,
|
||||
cpu_addr, dma_handle);
|
||||
out2:
|
||||
mutex_unlock(&tw_dev->ioctl_lock);
|
||||
out:
|
||||
@@ -1000,19 +1003,13 @@ static int twa_fill_sense(TW_Device_Extension *tw_dev, int request_id, int copy_
|
||||
if (print_host)
|
||||
printk(KERN_WARNING "3w-9xxx: scsi%d: ERROR: (0x%02X:0x%04X): %s:%s.\n",
|
||||
tw_dev->host->host_no,
|
||||
TW_MESSAGE_SOURCE_CONTROLLER_ERROR,
|
||||
full_command_packet->header.status_block.error,
|
||||
error_str[0] == '\0' ?
|
||||
twa_string_lookup(twa_error_table,
|
||||
full_command_packet->header.status_block.error) : error_str,
|
||||
TW_MESSAGE_SOURCE_CONTROLLER_ERROR, error,
|
||||
error_str[0] ? error_str : twa_string_lookup(twa_error_table, error),
|
||||
full_command_packet->header.err_specific_desc);
|
||||
else
|
||||
printk(KERN_WARNING "3w-9xxx: ERROR: (0x%02X:0x%04X): %s:%s.\n",
|
||||
TW_MESSAGE_SOURCE_CONTROLLER_ERROR,
|
||||
full_command_packet->header.status_block.error,
|
||||
error_str[0] == '\0' ?
|
||||
twa_string_lookup(twa_error_table,
|
||||
full_command_packet->header.status_block.error) : error_str,
|
||||
TW_MESSAGE_SOURCE_CONTROLLER_ERROR, error,
|
||||
error_str[0] ? error_str : twa_string_lookup(twa_error_table, error),
|
||||
full_command_packet->header.err_specific_desc);
|
||||
}
|
||||
|
||||
@@ -1129,12 +1126,11 @@ static int twa_initconnection(TW_Device_Extension *tw_dev, int message_credits,
|
||||
tw_initconnect->opcode__reserved = TW_OPRES_IN(0, TW_OP_INIT_CONNECTION);
|
||||
tw_initconnect->request_id = request_id;
|
||||
tw_initconnect->message_credits = cpu_to_le16(message_credits);
|
||||
tw_initconnect->features = set_features;
|
||||
|
||||
/* Turn on 64-bit sgl support if we need to */
|
||||
tw_initconnect->features |= sizeof(dma_addr_t) > 4 ? 1 : 0;
|
||||
set_features |= sizeof(dma_addr_t) > 4 ? 1 : 0;
|
||||
|
||||
tw_initconnect->features = cpu_to_le32(tw_initconnect->features);
|
||||
tw_initconnect->features = cpu_to_le32(set_features);
|
||||
|
||||
if (set_features & TW_EXTENDED_INIT_CONNECT) {
|
||||
tw_initconnect->size = TW_INIT_COMMAND_PACKET_SIZE_EXTENDED;
|
||||
@@ -1342,13 +1338,15 @@ static irqreturn_t twa_interrupt(int irq, void *dev_instance)
|
||||
/* If error, command failed */
|
||||
if (error == 1) {
|
||||
/* Ask for a host reset */
|
||||
cmd->result = (DID_OK << 16) | (CHECK_CONDITION << 1);
|
||||
cmd->result = (DID_OK << 16) | SAM_STAT_CHECK_CONDITION;
|
||||
}
|
||||
|
||||
/* Report residual bytes for single sgl */
|
||||
if ((scsi_sg_count(cmd) <= 1) && (full_command_packet->command.newcommand.status == 0)) {
|
||||
if (full_command_packet->command.newcommand.sg_list[0].length < scsi_bufflen(tw_dev->srb[request_id]))
|
||||
scsi_set_resid(cmd, scsi_bufflen(cmd) - full_command_packet->command.newcommand.sg_list[0].length);
|
||||
u32 length = le32_to_cpu(full_command_packet->command.newcommand.sg_list[0].length);
|
||||
|
||||
if (length < scsi_bufflen(cmd))
|
||||
scsi_set_resid(cmd, scsi_bufflen(cmd) - length);
|
||||
}
|
||||
|
||||
/* Now complete the io */
|
||||
@@ -1390,13 +1388,13 @@ static void twa_load_sgl(TW_Device_Extension *tw_dev, TW_Command_Full *full_comm
|
||||
if (TW_OP_OUT(full_command_packet->command.newcommand.opcode__reserved) == TW_OP_EXECUTE_SCSI) {
|
||||
newcommand = &full_command_packet->command.newcommand;
|
||||
newcommand->request_id__lunl =
|
||||
cpu_to_le16(TW_REQ_LUN_IN(TW_LUN_OUT(newcommand->request_id__lunl), request_id));
|
||||
TW_REQ_LUN_IN(TW_LUN_OUT(newcommand->request_id__lunl), request_id);
|
||||
if (length) {
|
||||
newcommand->sg_list[0].address = TW_CPU_TO_SGL(dma_handle + sizeof(TW_Ioctl_Buf_Apache) - 1);
|
||||
newcommand->sg_list[0].address = TW_CPU_TO_SGL(dma_handle + sizeof(TW_Ioctl_Buf_Apache));
|
||||
newcommand->sg_list[0].length = cpu_to_le32(length);
|
||||
}
|
||||
newcommand->sgl_entries__lunh =
|
||||
cpu_to_le16(TW_REQ_LUN_IN(TW_LUN_OUT(newcommand->sgl_entries__lunh), length ? 1 : 0));
|
||||
TW_REQ_LUN_IN(TW_LUN_OUT(newcommand->sgl_entries__lunh), length ? 1 : 0);
|
||||
} else {
|
||||
oldcommand = &full_command_packet->command.oldcommand;
|
||||
oldcommand->request_id = request_id;
|
||||
@@ -1407,7 +1405,7 @@ static void twa_load_sgl(TW_Device_Extension *tw_dev, TW_Command_Full *full_comm
|
||||
sgl = (TW_SG_Entry *)((u32 *)oldcommand+oldcommand->size - (sizeof(TW_SG_Entry)/4) + pae);
|
||||
else
|
||||
sgl = (TW_SG_Entry *)((u32 *)oldcommand+TW_SGL_OUT(oldcommand->opcode__sgloffset));
|
||||
sgl->address = TW_CPU_TO_SGL(dma_handle + sizeof(TW_Ioctl_Buf_Apache) - 1);
|
||||
sgl->address = TW_CPU_TO_SGL(dma_handle + sizeof(TW_Ioctl_Buf_Apache));
|
||||
sgl->length = cpu_to_le32(length);
|
||||
|
||||
oldcommand->size += pae;
|
||||
@@ -1831,10 +1829,10 @@ static int twa_scsiop_execute_scsi(TW_Device_Extension *tw_dev, int request_id,
|
||||
if (srb) {
|
||||
command_packet->unit = srb->device->id;
|
||||
command_packet->request_id__lunl =
|
||||
cpu_to_le16(TW_REQ_LUN_IN(srb->device->lun, request_id));
|
||||
TW_REQ_LUN_IN(srb->device->lun, request_id);
|
||||
} else {
|
||||
command_packet->request_id__lunl =
|
||||
cpu_to_le16(TW_REQ_LUN_IN(0, request_id));
|
||||
TW_REQ_LUN_IN(0, request_id);
|
||||
command_packet->unit = 0;
|
||||
}
|
||||
|
||||
@@ -1866,19 +1864,19 @@ static int twa_scsiop_execute_scsi(TW_Device_Extension *tw_dev, int request_id,
|
||||
}
|
||||
}
|
||||
}
|
||||
command_packet->sgl_entries__lunh = cpu_to_le16(TW_REQ_LUN_IN((srb->device->lun >> 4), scsi_sg_count(tw_dev->srb[request_id])));
|
||||
command_packet->sgl_entries__lunh = TW_REQ_LUN_IN((srb->device->lun >> 4), scsi_sg_count(tw_dev->srb[request_id]));
|
||||
}
|
||||
} else {
|
||||
/* Internal cdb post */
|
||||
for (i = 0; i < use_sg; i++) {
|
||||
command_packet->sg_list[i].address = TW_CPU_TO_SGL(sglistarg[i].address);
|
||||
command_packet->sg_list[i].length = cpu_to_le32(sglistarg[i].length);
|
||||
command_packet->sg_list[i].address = sglistarg[i].address;
|
||||
command_packet->sg_list[i].length = sglistarg[i].length;
|
||||
if (command_packet->sg_list[i].address & TW_CPU_TO_SGL(TW_ALIGNMENT_9000_SGL)) {
|
||||
TW_PRINTK(tw_dev->host, TW_DRIVER, 0x2f, "Found unaligned sgl address during internal post");
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
command_packet->sgl_entries__lunh = cpu_to_le16(TW_REQ_LUN_IN(0, use_sg));
|
||||
command_packet->sgl_entries__lunh = TW_REQ_LUN_IN(0, use_sg);
|
||||
}
|
||||
|
||||
if (srb) {
|
||||
@@ -2103,7 +2101,7 @@ static int twa_probe(struct pci_dev *pdev, const struct pci_device_id *dev_id)
|
||||
TW_PARAM_FWVER, TW_PARAM_FWVER_LENGTH),
|
||||
(char *)twa_get_param(tw_dev, 1, TW_VERSION_TABLE,
|
||||
TW_PARAM_BIOSVER, TW_PARAM_BIOSVER_LENGTH),
|
||||
le32_to_cpu(*(int *)twa_get_param(tw_dev, 2, TW_INFORMATION_TABLE,
|
||||
le32_to_cpu(*(__le32 *)twa_get_param(tw_dev, 2, TW_INFORMATION_TABLE,
|
||||
TW_PARAM_PORTCOUNT, TW_PARAM_PORTCOUNT_LENGTH)));
|
||||
|
||||
/* Try to enable MSI */
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
/* AEN string type */
|
||||
typedef struct TAG_twa_message_type {
|
||||
unsigned int code;
|
||||
char* text;
|
||||
char *text;
|
||||
} twa_message_type;
|
||||
|
||||
/* AEN strings */
|
||||
@@ -435,8 +435,8 @@ static twa_message_type twa_error_table[] = {
|
||||
|
||||
/* request_id: 12, lun: 4 */
|
||||
#define TW_REQ_LUN_IN(lun, request_id) \
|
||||
(((lun << 12) & 0xf000) | (request_id & 0xfff))
|
||||
#define TW_LUN_OUT(lun) ((lun >> 12) & 0xf)
|
||||
cpu_to_le16(((lun << 12) & 0xf000) | (request_id & 0xfff))
|
||||
#define TW_LUN_OUT(lun) ((le16_to_cpu(lun) >> 12) & 0xf)
|
||||
|
||||
/* Macros */
|
||||
#define TW_CONTROL_REG_ADDR(x) (x->base_addr)
|
||||
@@ -483,70 +483,75 @@ printk(KERN_WARNING "3w-9xxx: ERROR: (0x%02X:0x%04X): %s.\n",a,b,c); \
|
||||
#define TW_APACHE_MAX_SGL_LENGTH (sizeof(dma_addr_t) > 4 ? 72 : 109)
|
||||
#define TW_ESCALADE_MAX_SGL_LENGTH (sizeof(dma_addr_t) > 4 ? 41 : 62)
|
||||
#define TW_PADDING_LENGTH (sizeof(dma_addr_t) > 4 ? 8 : 0)
|
||||
#define TW_CPU_TO_SGL(x) (sizeof(dma_addr_t) > 4 ? cpu_to_le64(x) : cpu_to_le32(x))
|
||||
|
||||
#pragma pack(1)
|
||||
#if IS_ENABLED(CONFIG_ARCH_DMA_ADDR_T_64BIT)
|
||||
typedef __le64 twa_addr_t;
|
||||
#define TW_CPU_TO_SGL(x) cpu_to_le64(x)
|
||||
#else
|
||||
typedef __le32 twa_addr_t;
|
||||
#define TW_CPU_TO_SGL(x) cpu_to_le32(x)
|
||||
#endif
|
||||
|
||||
/* Scatter Gather List Entry */
|
||||
typedef struct TAG_TW_SG_Entry {
|
||||
dma_addr_t address;
|
||||
u32 length;
|
||||
} TW_SG_Entry;
|
||||
twa_addr_t address;
|
||||
__le32 length;
|
||||
} __packed TW_SG_Entry;
|
||||
|
||||
/* Command Packet */
|
||||
typedef struct TW_Command {
|
||||
unsigned char opcode__sgloffset;
|
||||
unsigned char size;
|
||||
unsigned char request_id;
|
||||
unsigned char unit__hostid;
|
||||
u8 opcode__sgloffset;
|
||||
u8 size;
|
||||
u8 request_id;
|
||||
u8 unit__hostid;
|
||||
/* Second DWORD */
|
||||
unsigned char status;
|
||||
unsigned char flags;
|
||||
u8 status;
|
||||
u8 flags;
|
||||
union {
|
||||
unsigned short block_count;
|
||||
unsigned short parameter_count;
|
||||
__le16 block_count;
|
||||
__le16 parameter_count;
|
||||
} byte6_offset;
|
||||
union {
|
||||
struct {
|
||||
u32 lba;
|
||||
TW_SG_Entry sgl[TW_ESCALADE_MAX_SGL_LENGTH];
|
||||
dma_addr_t padding;
|
||||
__le32 lba;
|
||||
TW_SG_Entry sgl[TW_ESCALADE_MAX_SGL_LENGTH];
|
||||
twa_addr_t padding;
|
||||
} io;
|
||||
struct {
|
||||
TW_SG_Entry sgl[TW_ESCALADE_MAX_SGL_LENGTH];
|
||||
u32 padding;
|
||||
dma_addr_t padding2;
|
||||
TW_SG_Entry sgl[TW_ESCALADE_MAX_SGL_LENGTH];
|
||||
__le32 padding;
|
||||
twa_addr_t padding2;
|
||||
} param;
|
||||
} byte8_offset;
|
||||
} TW_Command;
|
||||
|
||||
/* Command Packet for 9000+ controllers */
|
||||
typedef struct TAG_TW_Command_Apache {
|
||||
unsigned char opcode__reserved;
|
||||
unsigned char unit;
|
||||
unsigned short request_id__lunl;
|
||||
unsigned char status;
|
||||
unsigned char sgl_offset;
|
||||
unsigned short sgl_entries__lunh;
|
||||
unsigned char cdb[16];
|
||||
TW_SG_Entry sg_list[TW_APACHE_MAX_SGL_LENGTH];
|
||||
unsigned char padding[TW_PADDING_LENGTH];
|
||||
u8 opcode__reserved;
|
||||
u8 unit;
|
||||
__le16 request_id__lunl;
|
||||
u8 status;
|
||||
u8 sgl_offset;
|
||||
__le16 sgl_entries__lunh;
|
||||
u8 cdb[16];
|
||||
TW_SG_Entry sg_list[TW_APACHE_MAX_SGL_LENGTH];
|
||||
u8 padding[TW_PADDING_LENGTH];
|
||||
} TW_Command_Apache;
|
||||
|
||||
/* New command packet header */
|
||||
typedef struct TAG_TW_Command_Apache_Header {
|
||||
unsigned char sense_data[TW_SENSE_DATA_LENGTH];
|
||||
struct {
|
||||
char reserved[4];
|
||||
unsigned short error;
|
||||
unsigned char padding;
|
||||
unsigned char severity__reserved;
|
||||
u8 reserved[4];
|
||||
__le16 error;
|
||||
u8 padding;
|
||||
u8 severity__reserved;
|
||||
} status_block;
|
||||
unsigned char err_specific_desc[98];
|
||||
struct {
|
||||
unsigned char size_header;
|
||||
unsigned short reserved;
|
||||
unsigned char size_sense;
|
||||
u8 size_header;
|
||||
u8 reserved[2];
|
||||
u8 size_sense;
|
||||
} header_desc;
|
||||
} TW_Command_Apache_Header;
|
||||
|
||||
@@ -561,19 +566,19 @@ typedef struct TAG_TW_Command_Full {
|
||||
|
||||
/* Initconnection structure */
|
||||
typedef struct TAG_TW_Initconnect {
|
||||
unsigned char opcode__reserved;
|
||||
unsigned char size;
|
||||
unsigned char request_id;
|
||||
unsigned char res2;
|
||||
unsigned char status;
|
||||
unsigned char flags;
|
||||
unsigned short message_credits;
|
||||
u32 features;
|
||||
unsigned short fw_srl;
|
||||
unsigned short fw_arch_id;
|
||||
unsigned short fw_branch;
|
||||
unsigned short fw_build;
|
||||
u32 result;
|
||||
u8 opcode__reserved;
|
||||
u8 size;
|
||||
u8 request_id;
|
||||
u8 res2;
|
||||
u8 status;
|
||||
u8 flags;
|
||||
__le16 message_credits;
|
||||
__le32 features;
|
||||
__le16 fw_srl;
|
||||
__le16 fw_arch_id;
|
||||
__le16 fw_branch;
|
||||
__le16 fw_build;
|
||||
__le32 result;
|
||||
} TW_Initconnect;
|
||||
|
||||
/* Event info structure */
|
||||
@@ -602,7 +607,7 @@ typedef struct TAG_TW_Ioctl_Apache {
|
||||
TW_Ioctl_Driver_Command driver_command;
|
||||
char padding[488];
|
||||
TW_Command_Full firmware_command;
|
||||
char data_buffer[1];
|
||||
char data_buffer[];
|
||||
} TW_Ioctl_Buf_Apache;
|
||||
|
||||
/* Lock structure for ioctl get/release lock */
|
||||
@@ -614,11 +619,11 @@ typedef struct TAG_TW_Lock {
|
||||
|
||||
/* GetParam descriptor */
|
||||
typedef struct {
|
||||
unsigned short table_id;
|
||||
unsigned short parameter_id;
|
||||
unsigned short parameter_size_bytes;
|
||||
unsigned short actual_parameter_size_bytes;
|
||||
unsigned char data[1];
|
||||
__le16 table_id;
|
||||
__le16 parameter_id;
|
||||
__le16 parameter_size_bytes;
|
||||
__le16 actual_parameter_size_bytes;
|
||||
u8 data[];
|
||||
} TW_Param_Apache, *PTW_Param_Apache;
|
||||
|
||||
/* Response queue */
|
||||
@@ -645,8 +650,6 @@ typedef struct TAG_TW_Compatibility_Info
|
||||
unsigned short fw_on_ctlr_build;
|
||||
} TW_Compatibility_Info;
|
||||
|
||||
#pragma pack()
|
||||
|
||||
typedef struct TAG_TW_Device_Extension {
|
||||
u32 __iomem *base_addr;
|
||||
unsigned long *generic_buffer_virt[TW_Q_LENGTH];
|
||||
|
||||
@@ -429,7 +429,7 @@ static int tw_decode_sense(TW_Device_Extension *tw_dev, int request_id, int fill
|
||||
/* Additional sense code qualifier */
|
||||
tw_dev->srb[request_id]->sense_buffer[13] = tw_sense_table[i][3];
|
||||
|
||||
tw_dev->srb[request_id]->result = (DID_OK << 16) | (CHECK_CONDITION << 1);
|
||||
tw_dev->srb[request_id]->result = (DID_OK << 16) | SAM_STAT_CHECK_CONDITION;
|
||||
return TW_ISR_DONT_RESULT; /* Special case for isr to not over-write result */
|
||||
}
|
||||
}
|
||||
@@ -1977,7 +1977,7 @@ static int tw_scsi_queue_lck(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_c
|
||||
printk(KERN_NOTICE "3w-xxxx: scsi%d: Unknown scsi opcode: 0x%x\n", tw_dev->host->host_no, *command);
|
||||
tw_dev->state[request_id] = TW_S_COMPLETED;
|
||||
tw_state_request_finish(tw_dev, request_id);
|
||||
scsi_build_sense_buffer(1, SCpnt->sense_buffer, ILLEGAL_REQUEST, 0x20, 0);
|
||||
scsi_build_sense(SCpnt, 1, ILLEGAL_REQUEST, 0x20, 0);
|
||||
done(SCpnt);
|
||||
retval = 0;
|
||||
}
|
||||
@@ -2159,7 +2159,7 @@ static irqreturn_t tw_interrupt(int irq, void *dev_instance)
|
||||
/* If error, command failed */
|
||||
if (error == 1) {
|
||||
/* Ask for a host reset */
|
||||
tw_dev->srb[request_id]->result = (DID_OK << 16) | (CHECK_CONDITION << 1);
|
||||
tw_dev->srb[request_id]->result = (DID_OK << 16) | SAM_STAT_CHECK_CONDITION;
|
||||
}
|
||||
|
||||
/* Now complete the io */
|
||||
|
||||
@@ -978,10 +978,10 @@ process_script_interrupt(__u32 dsps, __u32 dsp, struct scsi_cmnd *SCp,
|
||||
if (NCR_700_get_tag_neg_state(SCp->device) == NCR_700_DURING_TAG_NEGOTIATION)
|
||||
NCR_700_set_tag_neg_state(SCp->device,
|
||||
NCR_700_FINISHED_TAG_NEGOTIATION);
|
||||
|
||||
|
||||
/* check for contingent allegiance conditions */
|
||||
if (hostdata->status[0] >> 1 == CHECK_CONDITION ||
|
||||
hostdata->status[0] >> 1 == COMMAND_TERMINATED) {
|
||||
if (hostdata->status[0] == SAM_STAT_CHECK_CONDITION ||
|
||||
hostdata->status[0] == SAM_STAT_COMMAND_TERMINATED) {
|
||||
struct NCR_700_command_slot *slot =
|
||||
(struct NCR_700_command_slot *)SCp->host_scribble;
|
||||
if(slot->flags == NCR_700_FLAG_AUTOSENSE) {
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -235,6 +235,19 @@ config SCSI_FC_ATTRS
|
||||
each attached FiberChannel device to sysfs, say Y.
|
||||
Otherwise, say N.
|
||||
|
||||
config FC_APPID
|
||||
bool "Enable support to track FC I/O Traffic"
|
||||
depends on BLOCK && BLK_CGROUP
|
||||
depends on SCSI
|
||||
select BLK_CGROUP_FC_APPID
|
||||
default y
|
||||
help
|
||||
If you say Y here, it enables the support to track
|
||||
FC I/O traffic over fabric. It enables the Fabric and the
|
||||
storage targets to identify, monitor, and handle FC traffic
|
||||
based on VM tags by inserting application specific
|
||||
identification into the FC frame.
|
||||
|
||||
config SCSI_ISCSI_ATTRS
|
||||
tristate "iSCSI Transport Attributes"
|
||||
depends on SCSI && NET
|
||||
@@ -311,7 +324,7 @@ source "drivers/scsi/cxlflash/Kconfig"
|
||||
config SGIWD93_SCSI
|
||||
tristate "SGI WD93C93 SCSI Driver"
|
||||
depends on SGI_HAS_WD93 && SCSI
|
||||
help
|
||||
help
|
||||
If you have a Western Digital WD93 SCSI controller on
|
||||
an SGI MIPS system, say Y. Otherwise, say N.
|
||||
|
||||
@@ -482,6 +495,7 @@ config SCSI_ARCMSR
|
||||
source "drivers/scsi/esas2r/Kconfig"
|
||||
source "drivers/scsi/megaraid/Kconfig.megaraid"
|
||||
source "drivers/scsi/mpt3sas/Kconfig"
|
||||
source "drivers/scsi/mpi3mr/Kconfig"
|
||||
source "drivers/scsi/smartpqi/Kconfig"
|
||||
source "drivers/scsi/ufs/Kconfig"
|
||||
|
||||
@@ -1157,6 +1171,8 @@ config SCSI_LPFC_DEBUG_FS
|
||||
This makes debugging information from the lpfc driver
|
||||
available via the debugfs filesystem.
|
||||
|
||||
source "drivers/scsi/elx/Kconfig"
|
||||
|
||||
config SCSI_SIM710
|
||||
tristate "Simple 53c710 SCSI support (Compaq, NCR machines)"
|
||||
depends on EISA && SCSI
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user