mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-25 05:04:09 +08:00
Merge branch '6.1/scsi-queue' into 6.1/scsi-fixes
Include the patches that weren't included in the 6.1 pull request. Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
commit
47eee861fa
@ -2582,7 +2582,7 @@ static int lpfcdiag_loop_self_unreg(struct lpfc_hba *phba, uint16_t rpi)
|
||||
*
|
||||
* This function obtains the transmit and receive ids required to send
|
||||
* an unsolicited ct command with a payload. A special lpfc FsType and CmdRsp
|
||||
* flags are used to the unsolicted response handler is able to process
|
||||
* flags are used to the unsolicited response handler is able to process
|
||||
* the ct command sent on the same port.
|
||||
**/
|
||||
static int lpfcdiag_loop_get_xri(struct lpfc_hba *phba, uint16_t rpi,
|
||||
@ -2874,7 +2874,7 @@ out:
|
||||
* @len: Number of data bytes
|
||||
*
|
||||
* This function allocates and posts a data buffer of sufficient size to receive
|
||||
* an unsolicted CT command.
|
||||
* an unsolicited CT command.
|
||||
**/
|
||||
static int lpfcdiag_sli3_loop_post_rxbufs(struct lpfc_hba *phba, uint16_t rxxri,
|
||||
size_t len)
|
||||
|
@ -90,7 +90,7 @@ lpfc_ct_ignore_hbq_buffer(struct lpfc_hba *phba, struct lpfc_iocbq *piocbq,
|
||||
get_job_ulpstatus(phba, piocbq));
|
||||
}
|
||||
lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
|
||||
"0145 Ignoring unsolicted CT HBQ Size:%d "
|
||||
"0145 Ignoring unsolicited CT HBQ Size:%d "
|
||||
"status = x%x\n",
|
||||
size, get_job_ulpstatus(phba, piocbq));
|
||||
}
|
||||
|
@ -5874,10 +5874,6 @@ fallback:
|
||||
static
|
||||
int megasas_get_device_list(struct megasas_instance *instance)
|
||||
{
|
||||
memset(instance->pd_list, 0,
|
||||
(MEGASAS_MAX_PD * sizeof(struct megasas_pd_list)));
|
||||
memset(instance->ld_ids, 0xff, MEGASAS_MAX_LD_IDS);
|
||||
|
||||
if (instance->enable_fw_dev_list) {
|
||||
if (megasas_host_device_list_query(instance, true))
|
||||
return FAILED;
|
||||
@ -7220,7 +7216,7 @@ int megasas_alloc_ctrl_dma_buffers(struct megasas_instance *instance)
|
||||
|
||||
if (!fusion->ioc_init_request) {
|
||||
dev_err(&pdev->dev,
|
||||
"Failed to allocate PD list buffer\n");
|
||||
"Failed to allocate ioc init request\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
@ -7439,7 +7435,6 @@ static inline void megasas_init_ctrl_params(struct megasas_instance *instance)
|
||||
(instance->pdev->device == PCI_DEVICE_ID_LSI_SAS0071SKINNY))
|
||||
instance->flag_ieee = 1;
|
||||
|
||||
megasas_dbg_lvl = 0;
|
||||
instance->flag = 0;
|
||||
instance->unload = 1;
|
||||
instance->last_time = 0;
|
||||
@ -8762,33 +8757,26 @@ static
|
||||
int megasas_update_device_list(struct megasas_instance *instance,
|
||||
int event_type)
|
||||
{
|
||||
int dcmd_ret = DCMD_SUCCESS;
|
||||
int dcmd_ret;
|
||||
|
||||
if (instance->enable_fw_dev_list) {
|
||||
dcmd_ret = megasas_host_device_list_query(instance, false);
|
||||
if (dcmd_ret != DCMD_SUCCESS)
|
||||
goto out;
|
||||
return megasas_host_device_list_query(instance, false);
|
||||
} else {
|
||||
if (event_type & SCAN_PD_CHANNEL) {
|
||||
dcmd_ret = megasas_get_pd_list(instance);
|
||||
|
||||
if (dcmd_ret != DCMD_SUCCESS)
|
||||
goto out;
|
||||
return dcmd_ret;
|
||||
}
|
||||
|
||||
if (event_type & SCAN_VD_CHANNEL) {
|
||||
if (!instance->requestorId ||
|
||||
megasas_get_ld_vf_affiliation(instance, 0)) {
|
||||
dcmd_ret = megasas_ld_list_query(instance,
|
||||
return megasas_ld_list_query(instance,
|
||||
MR_LD_QUERY_TYPE_EXPOSED_TO_HOST);
|
||||
if (dcmd_ret != DCMD_SUCCESS)
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
out:
|
||||
return dcmd_ret;
|
||||
return DCMD_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -8918,7 +8906,7 @@ megasas_aen_polling(struct work_struct *work)
|
||||
sdev1 = scsi_device_lookup(instance->host,
|
||||
MEGASAS_MAX_PD_CHANNELS +
|
||||
(ld_target_id / MEGASAS_MAX_DEV_PER_CHANNEL),
|
||||
(ld_target_id - MEGASAS_MAX_DEV_PER_CHANNEL),
|
||||
(ld_target_id % MEGASAS_MAX_DEV_PER_CHANNEL),
|
||||
0);
|
||||
if (sdev1)
|
||||
megasas_remove_scsi_device(sdev1);
|
||||
@ -9016,6 +9004,7 @@ static int __init megasas_init(void)
|
||||
*/
|
||||
pr_info("megasas: %s\n", MEGASAS_VERSION);
|
||||
|
||||
megasas_dbg_lvl = 0;
|
||||
support_poll_for_event = 2;
|
||||
support_device_change = 1;
|
||||
support_nvme_encapsulation = true;
|
||||
|
@ -951,9 +951,9 @@ qla2x00_sysfs_read_dcbx_tlv(struct file *filp, struct kobject *kobj,
|
||||
if (!capable(CAP_SYS_ADMIN) || off != 0 || count > DCBX_TLV_DATA_SIZE)
|
||||
return 0;
|
||||
|
||||
mutex_lock(&vha->hw->optrom_mutex);
|
||||
if (ha->dcbx_tlv)
|
||||
goto do_read;
|
||||
mutex_lock(&vha->hw->optrom_mutex);
|
||||
if (qla2x00_chip_is_down(vha)) {
|
||||
mutex_unlock(&vha->hw->optrom_mutex);
|
||||
return 0;
|
||||
@ -3330,11 +3330,34 @@ struct fc_function_template qla2xxx_transport_vport_functions = {
|
||||
.bsg_timeout = qla24xx_bsg_timeout,
|
||||
};
|
||||
|
||||
static uint
|
||||
qla2x00_get_host_supported_speeds(scsi_qla_host_t *vha, uint speeds)
|
||||
{
|
||||
uint supported_speeds = FC_PORTSPEED_UNKNOWN;
|
||||
|
||||
if (speeds & FDMI_PORT_SPEED_64GB)
|
||||
supported_speeds |= FC_PORTSPEED_64GBIT;
|
||||
if (speeds & FDMI_PORT_SPEED_32GB)
|
||||
supported_speeds |= FC_PORTSPEED_32GBIT;
|
||||
if (speeds & FDMI_PORT_SPEED_16GB)
|
||||
supported_speeds |= FC_PORTSPEED_16GBIT;
|
||||
if (speeds & FDMI_PORT_SPEED_8GB)
|
||||
supported_speeds |= FC_PORTSPEED_8GBIT;
|
||||
if (speeds & FDMI_PORT_SPEED_4GB)
|
||||
supported_speeds |= FC_PORTSPEED_4GBIT;
|
||||
if (speeds & FDMI_PORT_SPEED_2GB)
|
||||
supported_speeds |= FC_PORTSPEED_2GBIT;
|
||||
if (speeds & FDMI_PORT_SPEED_1GB)
|
||||
supported_speeds |= FC_PORTSPEED_1GBIT;
|
||||
|
||||
return supported_speeds;
|
||||
}
|
||||
|
||||
void
|
||||
qla2x00_init_host_attr(scsi_qla_host_t *vha)
|
||||
{
|
||||
struct qla_hw_data *ha = vha->hw;
|
||||
u32 speeds = FC_PORTSPEED_UNKNOWN;
|
||||
u32 speeds = 0, fdmi_speed = 0;
|
||||
|
||||
fc_host_dev_loss_tmo(vha->host) = ha->port_down_retry_count;
|
||||
fc_host_node_name(vha->host) = wwn_to_u64(vha->node_name);
|
||||
@ -3344,7 +3367,8 @@ qla2x00_init_host_attr(scsi_qla_host_t *vha)
|
||||
fc_host_max_npiv_vports(vha->host) = ha->max_npiv_vports;
|
||||
fc_host_npiv_vports_inuse(vha->host) = ha->cur_vport_count;
|
||||
|
||||
speeds = qla25xx_fdmi_port_speed_capability(ha);
|
||||
fdmi_speed = qla25xx_fdmi_port_speed_capability(ha);
|
||||
speeds = qla2x00_get_host_supported_speeds(vha, fdmi_speed);
|
||||
|
||||
fc_host_supported_speeds(vha->host) = speeds;
|
||||
}
|
||||
|
@ -284,6 +284,25 @@ void target_pr_kref_release(struct kref *kref)
|
||||
complete(&deve->pr_comp);
|
||||
}
|
||||
|
||||
/*
|
||||
* Establish UA condition on SCSI device - all LUNs
|
||||
*/
|
||||
void target_dev_ua_allocate(struct se_device *dev, u8 asc, u8 ascq)
|
||||
{
|
||||
struct se_dev_entry *se_deve;
|
||||
struct se_lun *lun;
|
||||
|
||||
spin_lock(&dev->se_port_lock);
|
||||
list_for_each_entry(lun, &dev->dev_sep_list, lun_dev_link) {
|
||||
|
||||
spin_lock(&lun->lun_deve_lock);
|
||||
list_for_each_entry(se_deve, &lun->lun_deve_list, lun_link)
|
||||
core_scsi3_ua_allocate(se_deve, asc, ascq);
|
||||
spin_unlock(&lun->lun_deve_lock);
|
||||
}
|
||||
spin_unlock(&dev->se_port_lock);
|
||||
}
|
||||
|
||||
static void
|
||||
target_luns_data_has_changed(struct se_node_acl *nacl, struct se_dev_entry *new,
|
||||
bool skip_new)
|
||||
|
@ -230,14 +230,12 @@ static void iblock_unplug_device(struct se_dev_plug *se_plug)
|
||||
clear_bit(IBD_PLUGF_PLUGGED, &ib_dev_plug->flags);
|
||||
}
|
||||
|
||||
static unsigned long long iblock_emulate_read_cap_with_block_size(
|
||||
struct se_device *dev,
|
||||
struct block_device *bd,
|
||||
struct request_queue *q)
|
||||
static sector_t iblock_get_blocks(struct se_device *dev)
|
||||
{
|
||||
u32 block_size = bdev_logical_block_size(bd);
|
||||
struct iblock_dev *ib_dev = IBLOCK_DEV(dev);
|
||||
u32 block_size = bdev_logical_block_size(ib_dev->ibd_bd);
|
||||
unsigned long long blocks_long =
|
||||
div_u64(bdev_nr_bytes(bd), block_size) - 1;
|
||||
div_u64(bdev_nr_bytes(ib_dev->ibd_bd), block_size) - 1;
|
||||
|
||||
if (block_size == dev->dev_attrib.block_size)
|
||||
return blocks_long;
|
||||
@ -829,15 +827,6 @@ fail:
|
||||
return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
|
||||
}
|
||||
|
||||
static sector_t iblock_get_blocks(struct se_device *dev)
|
||||
{
|
||||
struct iblock_dev *ib_dev = IBLOCK_DEV(dev);
|
||||
struct block_device *bd = ib_dev->ibd_bd;
|
||||
struct request_queue *q = bdev_get_queue(bd);
|
||||
|
||||
return iblock_emulate_read_cap_with_block_size(dev, bd, q);
|
||||
}
|
||||
|
||||
static sector_t iblock_get_alignment_offset_lbas(struct se_device *dev)
|
||||
{
|
||||
struct iblock_dev *ib_dev = IBLOCK_DEV(dev);
|
||||
|
@ -89,6 +89,7 @@ int target_configure_device(struct se_device *dev);
|
||||
void target_free_device(struct se_device *);
|
||||
int target_for_each_device(int (*fn)(struct se_device *dev, void *data),
|
||||
void *data);
|
||||
void target_dev_ua_allocate(struct se_device *dev, u8 asc, u8 ascq);
|
||||
|
||||
/* target_core_configfs.c */
|
||||
extern struct configfs_item_operations target_core_dev_item_ops;
|
||||
|
@ -2956,13 +2956,28 @@ core_scsi3_pro_preempt(struct se_cmd *cmd, int type, int scope, u64 res_key,
|
||||
__core_scsi3_complete_pro_preempt(dev, pr_reg_n,
|
||||
(preempt_type == PREEMPT_AND_ABORT) ? &preempt_and_abort_list : NULL,
|
||||
type, scope, preempt_type);
|
||||
|
||||
if (preempt_type == PREEMPT_AND_ABORT)
|
||||
core_scsi3_release_preempt_and_abort(
|
||||
&preempt_and_abort_list, pr_reg_n);
|
||||
}
|
||||
|
||||
spin_unlock(&dev->dev_reservation_lock);
|
||||
|
||||
/*
|
||||
* SPC-4 5.12.11.2.6 Preempting and aborting
|
||||
* The actions described in this subclause shall be performed
|
||||
* for all I_T nexuses that are registered with the non-zero
|
||||
* SERVICE ACTION RESERVATION KEY value, without regard for
|
||||
* whether the preempted I_T nexuses hold the persistent
|
||||
* reservation. If the SERVICE ACTION RESERVATION KEY field is
|
||||
* set to zero and an all registrants persistent reservation is
|
||||
* present, the device server shall abort all commands for all
|
||||
* registered I_T nexuses.
|
||||
*/
|
||||
if (preempt_type == PREEMPT_AND_ABORT) {
|
||||
core_tmr_lun_reset(dev, NULL, &preempt_and_abort_list,
|
||||
cmd);
|
||||
core_scsi3_release_preempt_and_abort(
|
||||
&preempt_and_abort_list, pr_reg_n);
|
||||
}
|
||||
|
||||
if (pr_tmpl->pr_aptpl_active)
|
||||
core_scsi3_update_and_write_aptpl(cmd->se_dev, true);
|
||||
|
||||
@ -3022,7 +3037,7 @@ core_scsi3_pro_preempt(struct se_cmd *cmd, int type, int scope, u64 res_key,
|
||||
if (calling_it_nexus)
|
||||
continue;
|
||||
|
||||
if (pr_reg->pr_res_key != sa_res_key)
|
||||
if (sa_res_key && pr_reg->pr_res_key != sa_res_key)
|
||||
continue;
|
||||
|
||||
pr_reg_nacl = pr_reg->pr_reg_nacl;
|
||||
@ -3425,8 +3440,6 @@ after_iport_check:
|
||||
* transport protocols where port names are not required;
|
||||
* d) Register the reservation key specified in the SERVICE ACTION
|
||||
* RESERVATION KEY field;
|
||||
* e) Retain the reservation key specified in the SERVICE ACTION
|
||||
* RESERVATION KEY field and associated information;
|
||||
*
|
||||
* Also, It is not an error for a REGISTER AND MOVE service action to
|
||||
* register an I_T nexus that is already registered with the same
|
||||
@ -3448,6 +3461,12 @@ after_iport_check:
|
||||
dest_pr_reg = __core_scsi3_locate_pr_reg(dev, dest_node_acl,
|
||||
iport_ptr);
|
||||
new_reg = 1;
|
||||
} else {
|
||||
/*
|
||||
* e) Retain the reservation key specified in the SERVICE ACTION
|
||||
* RESERVATION KEY field and associated information;
|
||||
*/
|
||||
dest_pr_reg->pr_res_key = sa_res_key;
|
||||
}
|
||||
/*
|
||||
* f) Release the persistent reservation for the persistent reservation
|
||||
|
@ -3531,8 +3531,7 @@ static void target_tmr_work(struct work_struct *work)
|
||||
tmr->response = (!ret) ? TMR_FUNCTION_COMPLETE :
|
||||
TMR_FUNCTION_REJECTED;
|
||||
if (tmr->response == TMR_FUNCTION_COMPLETE) {
|
||||
target_ua_allocate_lun(cmd->se_sess->se_node_acl,
|
||||
cmd->orig_fe_lun, 0x29,
|
||||
target_dev_ua_allocate(dev, 0x29,
|
||||
ASCQ_29H_BUS_DEVICE_RESET_FUNCTION_OCCURRED);
|
||||
}
|
||||
break;
|
||||
|
@ -616,7 +616,7 @@ static void ufshpb_activate_subregion(struct ufshpb_lu *hpb,
|
||||
static enum rq_end_io_ret ufshpb_umap_req_compl_fn(struct request *req,
|
||||
blk_status_t error)
|
||||
{
|
||||
struct ufshpb_req *umap_req = (struct ufshpb_req *)req->end_io_data;
|
||||
struct ufshpb_req *umap_req = req->end_io_data;
|
||||
|
||||
ufshpb_put_req(umap_req->hpb, umap_req);
|
||||
return RQ_END_IO_NONE;
|
||||
@ -625,7 +625,7 @@ static enum rq_end_io_ret ufshpb_umap_req_compl_fn(struct request *req,
|
||||
static enum rq_end_io_ret ufshpb_map_req_compl_fn(struct request *req,
|
||||
blk_status_t error)
|
||||
{
|
||||
struct ufshpb_req *map_req = (struct ufshpb_req *) req->end_io_data;
|
||||
struct ufshpb_req *map_req = req->end_io_data;
|
||||
struct ufshpb_lu *hpb = map_req->hpb;
|
||||
struct ufshpb_subregion *srgn;
|
||||
unsigned long flags;
|
||||
|
@ -118,7 +118,6 @@ int ufs_qcom_ice_init(struct ufs_qcom_host *host)
|
||||
host->ice_mmio = devm_ioremap_resource(dev, res);
|
||||
if (IS_ERR(host->ice_mmio)) {
|
||||
err = PTR_ERR(host->ice_mmio);
|
||||
dev_err(dev, "Failed to map ICE registers; err=%d\n", err);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user