Pull SCSI fixes from James Bottomley: "24 fixes, all in drivers. The lion's share (16) are qla2xxx and the rest are iscsi (3), ufs (2), smarpqi, lpfc and libsas" * tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi: (24 commits) scsi: iscsi: Avoid potential deadlock in iscsi_if_rx func scsi: iscsi: Fix a potential deadlock in the timeout handler scsi: smartpqi: Update attribute name to `driver_version` scsi: libsas: stop discovering if oob mode is disconnected scsi: ufs: Disable autohibern8 feature in Cadence UFS scsi: iscsi: qla4xxx: fix double free in probe scsi: ufs: Give an unique ID to each ufs-bsg scsi: qla2xxx: Add debug dump of LOGO payload and ELS IOCB scsi: qla2xxx: Ignore PORT UPDATE after N2N PLOGI scsi: qla2xxx: Don't defer relogin unconditonally scsi: qla2xxx: Send Notify ACK after N2N PLOGI scsi: qla2xxx: Configure local loop for N2N target scsi: qla2xxx: Fix PLOGI payload and ELS IOCB dump length scsi: qla2xxx: Don't call qlt_async_event twice scsi: qla2xxx: Allow PLOGI in target mode scsi: qla2xxx: Change discovery state before PLOGI scsi: qla2xxx: Drop superfluous INIT_WORK of del_work scsi: qla2xxx: Initialize free_work before flushing it scsi: qla2xxx: Use explicit LOGO in target mode scsi: qla2xxx: Ignore NULL pointer in tcm_qla2xxx_free_mcmd ...
Unified · Split
| @@ -29,7 +29,7 @@ smartpqi specific entries in /sys · 28 unmodified lines | |||
| 29 | smartpqi host attributes: | 29 | smartpqi host attributes: |
| 30 | ------------------------- | 30 | ------------------------- |
| 31 | /sys/class/scsi_host/host*/rescan | 31 | /sys/class/scsi_host/host*/rescan |
| 32 | /sys/class/scsi_host/host*/version | 32 | /sys/class/scsi_host/host*/driver_version |
| 33 | 33 | ||
| 34 | The host rescan attribute is a write only attribute. Writing to this | 34 | The host rescan attribute is a write only attribute. Writing to this |
| 35 | attribute will trigger the driver to scan for new, changed, or removed | 35 | attribute will trigger the driver to scan for new, changed, or removed |
| @@ -1945,7 +1945,7 @@ enum blk_eh_timer_return iscsi_eh_cmd_timed_out(struct scsi_cmnd *sc) · 1944 unmodified lines | |||
| 1945 | 1945 | ||
| 1946 | ISCSI_DBG_EH(session, "scsi cmd %p timedout\n", sc); | 1946 | ISCSI_DBG_EH(session, "scsi cmd %p timedout\n", sc); |
| 1947 | 1947 | ||
| 1948 | spin_lock(&session->frwd_lock); | 1948 | spin_lock_bh(&session->frwd_lock); |
| 1949 | task = (struct iscsi_task *)sc->SCp.ptr; | 1949 | task = (struct iscsi_task *)sc->SCp.ptr; |
| 1950 | if (!task) { | 1950 | if (!task) { |
| 1951 | /* | 1951 | /* |
| @@ -2072,7 +2072,7 @@ enum blk_eh_timer_return iscsi_eh_cmd_timed_out(struct scsi_cmnd *sc) · 120 unmodified lines | |||
| 2072 | done: | 2072 | done: |
| 2073 | if (task) | 2073 | if (task) |
| 2074 | task->last_timeout = jiffies; | 2074 | task->last_timeout = jiffies; |
| 2075 | spin_unlock(&session->frwd_lock); | 2075 | spin_unlock_bh(&session->frwd_lock); |
| 2076 | ISCSI_DBG_EH(session, "return %s\n", rc == BLK_EH_RESET_TIMER ? | 2076 | ISCSI_DBG_EH(session, "return %s\n", rc == BLK_EH_RESET_TIMER ? |
| 2077 | "timer reset" : "shutdown or nh"); | 2077 | "timer reset" : "shutdown or nh"); |
| 2078 | return rc; | 2078 | return rc; |
| @@ -81,12 +81,21 @@ static int sas_get_port_device(struct asd_sas_port *port) · 80 unmodified lines | |||
| 81 | else | 81 | else |
| 82 | dev->dev_type = SAS_SATA_DEV; | 82 | dev->dev_type = SAS_SATA_DEV; |
| 83 | dev->tproto = SAS_PROTOCOL_SATA; | 83 | dev->tproto = SAS_PROTOCOL_SATA; |
| 84 | } else { | 84 | } else if (port->oob_mode == SAS_OOB_MODE) { |
| 85 | struct sas_identify_frame *id = | 85 | struct sas_identify_frame *id = |
| 86 | (struct sas_identify_frame *) dev->frame_rcvd; | 86 | (struct sas_identify_frame *) dev->frame_rcvd; |
| 87 | dev->dev_type = id->dev_type; | 87 | dev->dev_type = id->dev_type; |
| 88 | dev->iproto = id->initiator_bits; | 88 | dev->iproto = id->initiator_bits; |
| 89 | dev->tproto = id->target_bits; | 89 | dev->tproto = id->target_bits; |
| 90 | } else { | ||
| 91 | /* If the oob mode is OOB_NOT_CONNECTED, the port is | ||
| 92 | * disconnected due to race with PHY down. We cannot | ||
| 93 | * continue to discover this port | ||
| 94 | */ | ||
| 95 | sas_put_device(dev); | ||
| 96 | pr_warn("Port %016llx is disconnected when discovering\n", | ||
| 97 | SAS_ADDR(port->attached_sas_addr)); | ||
| 98 | return -ENODEV; | ||
| 90 | } | 99 | } |
| 91 | 100 | ||
| 92 | sas_init_dev(dev); | 101 | sas_init_dev(dev); |
| @@ -4489,12 +4489,6 @@ lpfc_bsg_write_ebuf_set(struct lpfc_hba *phba, struct bsg_job *job, · 4488 unmodified lines | |||
| 4489 | phba->mbox_ext_buf_ctx.seqNum++; | 4489 | phba->mbox_ext_buf_ctx.seqNum++; |
| 4490 | nemb_tp = phba->mbox_ext_buf_ctx.nembType; | 4490 | nemb_tp = phba->mbox_ext_buf_ctx.nembType; |
| 4491 | 4491 | ||
| 4492 | dd_data = kmalloc(sizeof(struct bsg_job_data), GFP_KERNEL); | ||
| 4493 | if (!dd_data) { | ||
| 4494 | rc = -ENOMEM; | ||
| 4495 | goto job_error; | ||
| 4496 | } | ||
| 4497 | |||
| 4498 | pbuf = (uint8_t *)dmabuf->virt; | 4492 | pbuf = (uint8_t *)dmabuf->virt; |
| 4499 | size = job->request_payload.payload_len; | 4493 | size = job->request_payload.payload_len; |
| 4500 | sg_copy_to_buffer(job->request_payload.sg_list, | 4494 | sg_copy_to_buffer(job->request_payload.sg_list, |
| @@ -4531,6 +4525,13 @@ lpfc_bsg_write_ebuf_set(struct lpfc_hba *phba, struct bsg_job *job, · 30 unmodified lines | |||
| 4531 | "2968 SLI_CONFIG ext-buffer wr all %d " | 4525 | "2968 SLI_CONFIG ext-buffer wr all %d " |
| 4532 | "ebuffers received\n", | 4526 | "ebuffers received\n", |
| 4533 | phba->mbox_ext_buf_ctx.numBuf); | 4527 | phba->mbox_ext_buf_ctx.numBuf); |
| 4528 | |||
| 4529 | dd_data = kmalloc(sizeof(struct bsg_job_data), GFP_KERNEL); | ||
| 4530 | if (!dd_data) { | ||
| 4531 | rc = -ENOMEM; | ||
| 4532 | goto job_error; | ||
| 4533 | } | ||
| 4534 | |||
| 4534 | /* mailbox command structure for base driver */ | 4535 | /* mailbox command structure for base driver */ |
| 4535 | pmboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); | 4536 | pmboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); |
| 4536 | if (!pmboxq) { | 4537 | if (!pmboxq) { |
| @@ -4579,6 +4580,8 @@ lpfc_bsg_write_ebuf_set(struct lpfc_hba *phba, struct bsg_job *job, · 42 unmodified lines | |||
| 4579 | return SLI_CONFIG_HANDLED; | 4580 | return SLI_CONFIG_HANDLED; |
| 4580 | 4581 | ||
| 4581 | job_error: | 4582 | job_error: |
| 4583 | if (pmboxq) | ||
| 4584 | mempool_free(pmboxq, phba->mbox_mem_pool); | ||
| 4582 | lpfc_bsg_dma_page_free(phba, dmabuf); | 4585 | lpfc_bsg_dma_page_free(phba, dmabuf); |
| 4583 | kfree(dd_data); | 4586 | kfree(dd_data); |
| 4584 | 4587 | ||
| @@ -178,6 +178,7 @@ qla2x00_sysfs_read_nvram(struct file *filp, struct kobject *kobj, · 177 unmodified lines | |||
| 178 | 178 | ||
| 179 | faddr = ha->flt_region_nvram; | 179 | faddr = ha->flt_region_nvram; |
| 180 | if (IS_QLA28XX(ha)) { | 180 | if (IS_QLA28XX(ha)) { |
| 181 | qla28xx_get_aux_images(vha, &active_regions); | ||
| 181 | if (active_regions.aux.vpd_nvram == QLA27XX_SECONDARY_IMAGE) | 182 | if (active_regions.aux.vpd_nvram == QLA27XX_SECONDARY_IMAGE) |
| 182 | faddr = ha->flt_region_nvram_sec; | 183 | faddr = ha->flt_region_nvram_sec; |
| 183 | } | 184 | } |
| @@ -2399,7 +2399,7 @@ qla2x00_get_flash_image_status(struct bsg_job *bsg_job) · 2398 unmodified lines | |||
| 2399 | struct qla_active_regions regions = { }; | 2399 | struct qla_active_regions regions = { }; |
| 2400 | struct active_regions active_regions = { }; | 2400 | struct active_regions active_regions = { }; |
| 2401 | 2401 | ||
| 2402 | qla28xx_get_aux_images(vha, &active_regions); | 2402 | qla27xx_get_active_image(vha, &active_regions); |
| 2403 | regions.global_image = active_regions.global; | 2403 | regions.global_image = active_regions.global; |
| 2404 | 2404 | ||
| 2405 | if (IS_QLA28XX(ha)) { | 2405 | if (IS_QLA28XX(ha)) { |
| @@ -2401,6 +2401,7 @@ typedef struct fc_port { · 2400 unmodified lines | |||
| 2401 | unsigned int id_changed:1; | 2401 | unsigned int id_changed:1; |
| 2402 | unsigned int scan_needed:1; | 2402 | unsigned int scan_needed:1; |
| 2403 | unsigned int n2n_flag:1; | 2403 | unsigned int n2n_flag:1; |
| 2404 | unsigned int explicit_logout:1; | ||
| 2404 | 2405 | ||
| 2405 | struct completion nvme_del_done; | 2406 | struct completion nvme_del_done; |
| 2406 | uint32_t nvme_prli_service_param; | 2407 | uint32_t nvme_prli_service_param; |
| @@ -1523,6 +1523,10 @@ struct qla_flt_header { · 1522 unmodified lines | |||
| 1523 | #define FLT_REG_NVRAM_SEC_28XX_1 0x10F | 1523 | #define FLT_REG_NVRAM_SEC_28XX_1 0x10F |
| 1524 | #define FLT_REG_NVRAM_SEC_28XX_2 0x111 | 1524 | #define FLT_REG_NVRAM_SEC_28XX_2 0x111 |
| 1525 | #define FLT_REG_NVRAM_SEC_28XX_3 0x113 | 1525 | #define FLT_REG_NVRAM_SEC_28XX_3 0x113 |
| 1526 | #define FLT_REG_MPI_PRI_28XX 0xD3 | ||
| 1527 | #define FLT_REG_MPI_SEC_28XX 0xF0 | ||
| 1528 | #define FLT_REG_PEP_PRI_28XX 0xD1 | ||
| 1529 | #define FLT_REG_PEP_SEC_28XX 0xF1 | ||
| 1526 | 1530 | ||
| 1527 | struct qla_flt_region { | 1531 | struct qla_flt_region { |
| 1528 | uint16_t code; | 1532 | uint16_t code; |
| @@ -533,6 +533,7 @@ static int qla_post_els_plogi_work(struct scsi_qla_host *vha, fc_port_t *fcport) · 532 unmodified lines | |||
| 533 | 533 | ||
| 534 | e->u.fcport.fcport = fcport; | 534 | e->u.fcport.fcport = fcport; |
| 535 | fcport->flags |= FCF_ASYNC_ACTIVE; | 535 | fcport->flags |= FCF_ASYNC_ACTIVE; |
| 536 | fcport->disc_state = DSC_LOGIN_PEND; | ||
| 536 | return qla2x00_post_work(vha, e); | 537 | return qla2x00_post_work(vha, e); |
| 537 | } | 538 | } |
| 538 | 539 | ||
| @@ -1526,8 +1527,8 @@ int qla24xx_fcport_handle_login(struct scsi_qla_host *vha, fc_port_t *fcport) · 987 unmodified lines | |||
| 1526 | } | 1527 | } |
| 1527 | } | 1528 | } |
| 1528 | 1529 | ||
| 1529 | /* for pure Target Mode. Login will not be initiated */ | 1530 | /* Target won't initiate port login if fabric is present */ |
| 1530 | if (vha->host->active_mode == MODE_TARGET) | 1531 | if (vha->host->active_mode == MODE_TARGET && !N2N_TOPO(vha->hw)) |
| 1531 | return 0; | 1532 | return 0; |
| 1532 | 1533 | ||
| 1533 | if (fcport->flags & FCF_ASYNC_SENT) { | 1534 | if (fcport->flags & FCF_ASYNC_SENT) { |
| @@ -1719,6 +1720,10 @@ void qla24xx_handle_relogin_event(scsi_qla_host_t *vha, · 185 unmodified lines | |||
| 1719 | void qla_handle_els_plogi_done(scsi_qla_host_t *vha, | 1720 | void qla_handle_els_plogi_done(scsi_qla_host_t *vha, |
| 1720 | struct event_arg *ea) | 1721 | struct event_arg *ea) |
| 1721 | { | 1722 | { |
| 1723 | /* for pure Target Mode, PRLI will not be initiated */ | ||
| 1724 | if (vha->host->active_mode == MODE_TARGET) | ||
| 1725 | return; | ||
| 1726 | |||
| 1722 | ql_dbg(ql_dbg_disc, vha, 0x2118, | 1727 | ql_dbg(ql_dbg_disc, vha, 0x2118, |
| 1723 | "%s %d %8phC post PRLI\n", | 1728 | "%s %d %8phC post PRLI\n", |
| 1724 | __func__, __LINE__, ea->fcport->port_name); | 1729 | __func__, __LINE__, ea->fcport->port_name); |
| @@ -4852,6 +4857,7 @@ qla2x00_alloc_fcport(scsi_qla_host_t *vha, gfp_t flags) · 3127 unmodified lines | |||
| 4852 | } | 4857 | } |
| 4853 | 4858 | ||
| 4854 | INIT_WORK(&fcport->del_work, qla24xx_delete_sess_fn); | 4859 | INIT_WORK(&fcport->del_work, qla24xx_delete_sess_fn); |
| 4860 | INIT_WORK(&fcport->free_work, qlt_free_session_done); | ||
| 4855 | INIT_WORK(&fcport->reg_work, qla_register_fcport_fn); | 4861 | INIT_WORK(&fcport->reg_work, qla_register_fcport_fn); |
| 4856 | INIT_LIST_HEAD(&fcport->gnl_entry); | 4862 | INIT_LIST_HEAD(&fcport->gnl_entry); |
| 4857 | INIT_LIST_HEAD(&fcport->list); | 4863 | INIT_LIST_HEAD(&fcport->list); |
| @@ -4930,14 +4936,8 @@ qla2x00_configure_loop(scsi_qla_host_t *vha) · 72 unmodified lines | |||
| 4930 | set_bit(RSCN_UPDATE, &flags); | 4936 | set_bit(RSCN_UPDATE, &flags); |
| 4931 | clear_bit(LOCAL_LOOP_UPDATE, &flags); | 4937 | clear_bit(LOCAL_LOOP_UPDATE, &flags); |
| 4932 | 4938 | ||
| 4933 | } else if (ha->current_topology == ISP_CFG_N) { | 4939 | } else if (ha->current_topology == ISP_CFG_NL || |
| 4934 | clear_bit(RSCN_UPDATE, &flags); | 4940 | ha->current_topology == ISP_CFG_N) { |
| 4935 | if (qla_tgt_mode_enabled(vha)) { | ||
| 4936 | /* allow the other side to start the login */ | ||
| 4937 | clear_bit(LOCAL_LOOP_UPDATE, &flags); | ||
| 4938 | set_bit(RELOGIN_NEEDED, &vha->dpc_flags); | ||
| 4939 | } | ||
| 4940 | } else if (ha->current_topology == ISP_CFG_NL) { | ||
| 4941 | clear_bit(RSCN_UPDATE, &flags); | 4941 | clear_bit(RSCN_UPDATE, &flags); |
| 4942 | set_bit(LOCAL_LOOP_UPDATE, &flags); | 4942 | set_bit(LOCAL_LOOP_UPDATE, &flags); |
| 4943 | } else if (!vha->flags.online || | 4943 | } else if (!vha->flags.online || |
| @@ -5054,7 +5054,6 @@ qla2x00_configure_local_loop(scsi_qla_host_t *vha) · 110 unmodified lines | |||
| 5054 | memcpy(&ha->plogi_els_payld.data, | 5054 | memcpy(&ha->plogi_els_payld.data, |
| 5055 | (void *)ha->init_cb, | 5055 | (void *)ha->init_cb, |
| 5056 | sizeof(ha->plogi_els_payld.data)); | 5056 | sizeof(ha->plogi_els_payld.data)); |
| 5057 | set_bit(RELOGIN_NEEDED, &vha->dpc_flags); | ||
| 5058 | } else { | 5057 | } else { |
| 5059 | ql_dbg(ql_dbg_init, vha, 0x00d1, | 5058 | ql_dbg(ql_dbg_init, vha, 0x00d1, |
| 5060 | "PLOGI ELS param read fail.\n"); | 5059 | "PLOGI ELS param read fail.\n"); |
| @@ -2405,11 +2405,19 @@ qla2x00_login_iocb(srb_t *sp, struct mbx_entry *mbx) · 2404 unmodified lines | |||
| 2405 | static void | 2405 | static void |
| 2406 | qla24xx_logout_iocb(srb_t *sp, struct logio_entry_24xx *logio) | 2406 | qla24xx_logout_iocb(srb_t *sp, struct logio_entry_24xx *logio) |
| 2407 | { | 2407 | { |
| 2408 | u16 control_flags = LCF_COMMAND_LOGO; | ||
| 2408 | logio->entry_type = LOGINOUT_PORT_IOCB_TYPE; | 2409 | logio->entry_type = LOGINOUT_PORT_IOCB_TYPE; |
| 2409 | logio->control_flags = | 2410 | |
| 2410 | cpu_to_le16(LCF_COMMAND_LOGO|LCF_IMPL_LOGO); | 2411 | if (sp->fcport->explicit_logout) { |
| 2411 | if (!sp->fcport->keep_nport_handle) | 2412 | control_flags |= LCF_EXPL_LOGO|LCF_FREE_NPORT; |
| 2412 | logio->control_flags |= cpu_to_le16(LCF_FREE_NPORT); | 2413 | } else { |
| 2414 | control_flags |= LCF_IMPL_LOGO; | ||
| 2415 | |||
| 2416 | if (!sp->fcport->keep_nport_handle) | ||
| 2417 | control_flags |= LCF_FREE_NPORT; | ||
| 2418 | } | ||
| 2419 | |||
| 2420 | logio->control_flags = cpu_to_le16(control_flags); | ||
| 2413 | logio->nport_handle = cpu_to_le16(sp->fcport->loop_id); | 2421 | logio->nport_handle = cpu_to_le16(sp->fcport->loop_id); |
| 2414 | logio->port_id[0] = sp->fcport->d_id.b.al_pa; | 2422 | logio->port_id[0] = sp->fcport->d_id.b.al_pa; |
| 2415 | logio->port_id[1] = sp->fcport->d_id.b.area; | 2423 | logio->port_id[1] = sp->fcport->d_id.b.area; |
| @@ -2617,6 +2625,10 @@ qla24xx_els_dcmd_iocb(scsi_qla_host_t *vha, int els_opcode, · 201 unmodified lines | |||
| 2617 | 2625 | ||
| 2618 | memcpy(elsio->u.els_logo.els_logo_pyld, &logo_pyld, | 2626 | memcpy(elsio->u.els_logo.els_logo_pyld, &logo_pyld, |
| 2619 | sizeof(struct els_logo_payload)); | 2627 | sizeof(struct els_logo_payload)); |
| 2628 | ql_dbg(ql_dbg_disc + ql_dbg_buffer, vha, 0x3075, "LOGO buffer:"); | ||
| 2629 | ql_dump_buffer(ql_dbg_disc + ql_dbg_buffer, vha, 0x010a, | ||
| 2630 | elsio->u.els_logo.els_logo_pyld, | ||
| 2631 | sizeof(*elsio->u.els_logo.els_logo_pyld)); | ||
| 2620 | 2632 | ||
| 2621 | rval = qla2x00_start_sp(sp); | 2633 | rval = qla2x00_start_sp(sp); |
| 2622 | if (rval != QLA_SUCCESS) { | 2634 | if (rval != QLA_SUCCESS) { |
| @@ -2676,7 +2688,8 @@ qla24xx_els_logo_iocb(srb_t *sp, struct els_entry_24xx *els_iocb) · 53 unmodified lines | |||
| 2676 | ql_dbg(ql_dbg_io + ql_dbg_buffer, vha, 0x3073, | 2688 | ql_dbg(ql_dbg_io + ql_dbg_buffer, vha, 0x3073, |
| 2677 | "PLOGI ELS IOCB:\n"); | 2689 | "PLOGI ELS IOCB:\n"); |
| 2678 | ql_dump_buffer(ql_log_info, vha, 0x0109, | 2690 | ql_dump_buffer(ql_log_info, vha, 0x0109, |
| 2679 | (uint8_t *)els_iocb, 0x70); | 2691 | (uint8_t *)els_iocb, |
| 2692 | sizeof(*els_iocb)); | ||
| 2680 | } else { | 2693 | } else { |
| 2681 | els_iocb->control_flags = 1 << 13; | 2694 | els_iocb->control_flags = 1 << 13; |
| 2682 | els_iocb->tx_byte_count = | 2695 | els_iocb->tx_byte_count = |
| @@ -2688,6 +2701,11 @@ qla24xx_els_logo_iocb(srb_t *sp, struct els_entry_24xx *els_iocb) · 5 unmodified lines | |||
| 2688 | els_iocb->rx_byte_count = 0; | 2701 | els_iocb->rx_byte_count = 0; |
| 2689 | els_iocb->rx_address = 0; | 2702 | els_iocb->rx_address = 0; |
| 2690 | els_iocb->rx_len = 0; | 2703 | els_iocb->rx_len = 0; |
| 2704 | ql_dbg(ql_dbg_io + ql_dbg_buffer, vha, 0x3076, | ||
| 2705 | "LOGO ELS IOCB:"); | ||
| 2706 | ql_dump_buffer(ql_log_info, vha, 0x010b, | ||
| 2707 | els_iocb, | ||
| 2708 | sizeof(*els_iocb)); | ||
| 2691 | } | 2709 | } |
| 2692 | 2710 | ||
| 2693 | sp->vha->qla_stats.control_requests++; | 2711 | sp->vha->qla_stats.control_requests++; |
| @@ -2934,7 +2952,8 @@ qla24xx_els_dcmd2_iocb(scsi_qla_host_t *vha, int els_opcode, · 240 unmodified lines | |||
| 2934 | 2952 | ||
| 2935 | ql_dbg(ql_dbg_disc + ql_dbg_buffer, vha, 0x3073, "PLOGI buffer:\n"); | 2953 | ql_dbg(ql_dbg_disc + ql_dbg_buffer, vha, 0x3073, "PLOGI buffer:\n"); |
| 2936 | ql_dump_buffer(ql_dbg_disc + ql_dbg_buffer, vha, 0x0109, | 2954 | ql_dump_buffer(ql_dbg_disc + ql_dbg_buffer, vha, 0x0109, |
| 2937 | (uint8_t *)elsio->u.els_plogi.els_plogi_pyld, 0x70); | 2955 | (uint8_t *)elsio->u.els_plogi.els_plogi_pyld, |
| 2956 | sizeof(*elsio->u.els_plogi.els_plogi_pyld)); | ||
| 2938 | 2957 | ||
| 2939 | rval = qla2x00_start_sp(sp); | 2958 | rval = qla2x00_start_sp(sp); |
| 2940 | if (rval != QLA_SUCCESS) { | 2959 | if (rval != QLA_SUCCESS) { |
| @@ -1061,8 +1061,6 @@ global_port_update: · 1060 unmodified lines | |||
| 1061 | ql_dbg(ql_dbg_async, vha, 0x5011, | 1061 | ql_dbg(ql_dbg_async, vha, 0x5011, |
| 1062 | "Asynchronous PORT UPDATE ignored %04x/%04x/%04x.\n", | 1062 | "Asynchronous PORT UPDATE ignored %04x/%04x/%04x.\n", |
| 1063 | mb[1], mb[2], mb[3]); | 1063 | mb[1], mb[2], mb[3]); |
| 1064 | |||
| 1065 | qlt_async_event(mb[0], vha, mb); | ||
| 1066 | break; | 1064 | break; |
| 1067 | } | 1065 | } |
| 1068 | 1066 | ||
| @@ -1079,8 +1077,6 @@ global_port_update: · 10 unmodified lines | |||
| 1079 | set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags); | 1077 | set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags); |
| 1080 | set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags); | 1078 | set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags); |
| 1081 | set_bit(VP_CONFIG_OK, &vha->vp_flags); | 1079 | set_bit(VP_CONFIG_OK, &vha->vp_flags); |
| 1082 | |||
| 1083 | qlt_async_event(mb[0], vha, mb); | ||
| 1084 | break; | 1080 | break; |
| 1085 | 1081 | ||
| 1086 | case MBA_RSCN_UPDATE: /* State Change Registration */ | 1082 | case MBA_RSCN_UPDATE: /* State Change Registration */ |
| @@ -3921,6 +3921,7 @@ qla24xx_report_id_acquisition(scsi_qla_host_t *vha, · 3920 unmodified lines | |||
| 3921 | vha->d_id.b24 = 0; | 3921 | vha->d_id.b24 = 0; |
| 3922 | vha->d_id.b.al_pa = 1; | 3922 | vha->d_id.b.al_pa = 1; |
| 3923 | ha->flags.n2n_bigger = 1; | 3923 | ha->flags.n2n_bigger = 1; |
| 3924 | ha->flags.n2n_ae = 0; | ||
| 3924 | 3925 | ||
| 3925 | id.b.al_pa = 2; | 3926 | id.b.al_pa = 2; |
| 3926 | ql_dbg(ql_dbg_async, vha, 0x5075, | 3927 | ql_dbg(ql_dbg_async, vha, 0x5075, |
| @@ -3931,6 +3932,7 @@ qla24xx_report_id_acquisition(scsi_qla_host_t *vha, · 4 unmodified lines | |||
| 3931 | "Format 1: Remote login - Waiting for WWPN %8phC.\n", | 3932 | "Format 1: Remote login - Waiting for WWPN %8phC.\n", |
| 3932 | rptid_entry->u.f1.port_name); | 3933 | rptid_entry->u.f1.port_name); |
| 3933 | ha->flags.n2n_bigger = 0; | 3934 | ha->flags.n2n_bigger = 0; |
| 3935 | ha->flags.n2n_ae = 1; | ||
| 3934 | } | 3936 | } |
| 3935 | qla24xx_post_newsess_work(vha, &id, | 3937 | qla24xx_post_newsess_work(vha, &id, |
| 3936 | rptid_entry->u.f1.port_name, | 3938 | rptid_entry->u.f1.port_name, |
| @@ -3942,7 +3944,6 @@ qla24xx_report_id_acquisition(scsi_qla_host_t *vha, · 5 unmodified lines | |||
| 3942 | /* if our portname is higher then initiate N2N login */ | 3944 | /* if our portname is higher then initiate N2N login */ |
| 3943 | 3945 | ||
| 3944 | set_bit(N2N_LOGIN_NEEDED, &vha->dpc_flags); | 3946 | set_bit(N2N_LOGIN_NEEDED, &vha->dpc_flags); |
| 3945 | ha->flags.n2n_ae = 1; | ||
| 3946 | return; | 3947 | return; |
| 3947 | break; | 3948 | break; |
| 3948 | case TOPO_FL: | 3949 | case TOPO_FL: |
| @@ -847,15 +847,15 @@ qla2xxx_get_flt_info(scsi_qla_host_t *vha, uint32_t flt_addr) · 846 unmodified lines | |||
| 847 | ha->flt_region_img_status_pri = start; | 847 | ha->flt_region_img_status_pri = start; |
| 848 | break; | 848 | break; |
| 849 | case FLT_REG_IMG_SEC_27XX: | 849 | case FLT_REG_IMG_SEC_27XX: |
| 850 | if (IS_QLA27XX(ha) && !IS_QLA28XX(ha)) | 850 | if (IS_QLA27XX(ha) || IS_QLA28XX(ha)) |
| 851 | ha->flt_region_img_status_sec = start; | 851 | ha->flt_region_img_status_sec = start; |
| 852 | break; | 852 | break; |
| 853 | case FLT_REG_FW_SEC_27XX: | 853 | case FLT_REG_FW_SEC_27XX: |
| 854 | if (IS_QLA27XX(ha) && !IS_QLA28XX(ha)) | 854 | if (IS_QLA27XX(ha) || IS_QLA28XX(ha)) |
| 855 | ha->flt_region_fw_sec = start; | 855 | ha->flt_region_fw_sec = start; |
| 856 | break; | 856 | break; |
| 857 | case FLT_REG_BOOTLOAD_SEC_27XX: | 857 | case FLT_REG_BOOTLOAD_SEC_27XX: |
| 858 | if (IS_QLA27XX(ha) && !IS_QLA28XX(ha)) | 858 | if (IS_QLA27XX(ha) || IS_QLA28XX(ha)) |
| 859 | ha->flt_region_boot_sec = start; | 859 | ha->flt_region_boot_sec = start; |
| 860 | break; | 860 | break; |
| 861 | case FLT_REG_AUX_IMG_PRI_28XX: | 861 | case FLT_REG_AUX_IMG_PRI_28XX: |
| @@ -2725,8 +2725,11 @@ qla28xx_write_flash_data(scsi_qla_host_t *vha, uint32_t *dwptr, uint32_t faddr, · 1863 unmodified lines | |||
| 2725 | ql_log(ql_log_warn + ql_dbg_verbose, vha, 0xffff, | 2725 | ql_log(ql_log_warn + ql_dbg_verbose, vha, 0xffff, |
| 2726 | "Region %x is secure\n", region.code); | 2726 | "Region %x is secure\n", region.code); |
| 2727 | 2727 | ||
| 2728 | if (region.code == FLT_REG_FW || | 2728 | switch (region.code) { |
| 2729 | region.code == FLT_REG_FW_SEC_27XX) { | 2729 | case FLT_REG_FW: |
| 2730 | case FLT_REG_FW_SEC_27XX: | ||
| 2731 | case FLT_REG_MPI_PRI_28XX: | ||
| 2732 | case FLT_REG_MPI_SEC_28XX: | ||
| 2730 | fw_array = dwptr; | 2733 | fw_array = dwptr; |
| 2731 | 2734 | ||
| 2732 | /* 1st fw array */ | 2735 | /* 1st fw array */ |
| @@ -2757,9 +2760,23 @@ qla28xx_write_flash_data(scsi_qla_host_t *vha, uint32_t *dwptr, uint32_t faddr, · 24 unmodified lines | |||
| 2757 | buf_size_without_sfub += risc_size; | 2760 | buf_size_without_sfub += risc_size; |
| 2758 | fw_array += risc_size; | 2761 | fw_array += risc_size; |
| 2759 | } | 2762 | } |
| 2760 | } else { | 2763 | break; |
| 2761 | ql_log(ql_log_warn + ql_dbg_verbose, vha, 0xffff, | 2764 | |
| 2762 | "Secure region %x not supported\n", | 2765 | case FLT_REG_PEP_PRI_28XX: |
| 2766 | case FLT_REG_PEP_SEC_28XX: | ||
| 2767 | fw_array = dwptr; | ||
| 2768 | |||
| 2769 | /* 1st fw array */ | ||
| 2770 | risc_size = be32_to_cpu(fw_array[3]); | ||
| 2771 | risc_attr = be32_to_cpu(fw_array[9]); | ||
| 2772 | |||
| 2773 | buf_size_without_sfub = risc_size; | ||
| 2774 | fw_array += risc_size; | ||
| 2775 | break; | ||
| 2776 | |||
| 2777 | default: | ||
| 2778 | ql_log(ql_log_warn + ql_dbg_verbose, vha, | ||
| 2779 | 0xffff, "Secure region %x not supported\n", | ||
| 2763 | region.code); | 2780 | region.code); |
| 2764 | rval = QLA_COMMAND_ERROR; | 2781 | rval = QLA_COMMAND_ERROR; |
| 2765 | goto done; | 2782 | goto done; |
| @@ -2880,7 +2897,7 @@ qla28xx_write_flash_data(scsi_qla_host_t *vha, uint32_t *dwptr, uint32_t faddr, · 114 unmodified lines | |||
| 2880 | "Sending Secure Flash MB Cmd\n"); | 2897 | "Sending Secure Flash MB Cmd\n"); |
| 2881 | rval = qla28xx_secure_flash_update(vha, 0, region.code, | 2898 | rval = qla28xx_secure_flash_update(vha, 0, region.code, |
| 2882 | buf_size_without_sfub, sfub_dma, | 2899 | buf_size_without_sfub, sfub_dma, |
| 2883 | sizeof(struct secure_flash_update_block)); | 2900 | sizeof(struct secure_flash_update_block) >> 2); |
| 2884 | if (rval != QLA_SUCCESS) { | 2901 | if (rval != QLA_SUCCESS) { |
| 2885 | ql_log(ql_log_warn, vha, 0xffff, | 2902 | ql_log(ql_log_warn, vha, 0xffff, |
| 2886 | "Secure Flash MB Cmd failed %x.", rval); | 2903 | "Secure Flash MB Cmd failed %x.", rval); |
| @@ -1104,6 +1104,7 @@ void qlt_free_session_done(struct work_struct *work) · 1103 unmodified lines | |||
| 1104 | } | 1104 | } |
| 1105 | } | 1105 | } |
| 1106 | 1106 | ||
| 1107 | sess->explicit_logout = 0; | ||
| 1107 | spin_unlock_irqrestore(&ha->tgt.sess_lock, flags); | 1108 | spin_unlock_irqrestore(&ha->tgt.sess_lock, flags); |
| 1108 | sess->free_pending = 0; | 1109 | sess->free_pending = 0; |
| 1109 | 1110 | ||
| @@ -1160,7 +1161,6 @@ void qlt_unreg_sess(struct fc_port *sess) · 50 unmodified lines | |||
| 1160 | sess->last_rscn_gen = sess->rscn_gen; | 1161 | sess->last_rscn_gen = sess->rscn_gen; |
| 1161 | sess->last_login_gen = sess->login_gen; | 1162 | sess->last_login_gen = sess->login_gen; |
| 1162 | 1163 | ||
| 1163 | INIT_WORK(&sess->free_work, qlt_free_session_done); | ||
| 1164 | queue_work(sess->vha->hw->wq, &sess->free_work); | 1164 | queue_work(sess->vha->hw->wq, &sess->free_work); |
| 1165 | } | 1165 | } |
| 1166 | EXPORT_SYMBOL(qlt_unreg_sess); | 1166 | EXPORT_SYMBOL(qlt_unreg_sess); |
| @@ -1265,7 +1265,6 @@ void qlt_schedule_sess_for_deletion(struct fc_port *sess) · 98 unmodified lines | |||
| 1265 | "Scheduling sess %p for deletion %8phC\n", | 1265 | "Scheduling sess %p for deletion %8phC\n", |
| 1266 | sess, sess->port_name); | 1266 | sess, sess->port_name); |
| 1267 | 1267 | ||
| 1268 | INIT_WORK(&sess->del_work, qla24xx_delete_sess_fn); | ||
| 1269 | WARN_ON(!queue_work(sess->vha->hw->wq, &sess->del_work)); | 1268 | WARN_ON(!queue_work(sess->vha->hw->wq, &sess->del_work)); |
| 1270 | } | 1269 | } |
| 1271 | 1270 | ||
| @@ -4804,6 +4803,7 @@ static int qlt_handle_login(struct scsi_qla_host *vha, · 3532 unmodified lines | |||
| 4804 | 4803 | ||
| 4805 | switch (sess->disc_state) { | 4804 | switch (sess->disc_state) { |
| 4806 | case DSC_DELETED: | 4805 | case DSC_DELETED: |
| 4806 | case DSC_LOGIN_PEND: | ||
| 4807 | qlt_plogi_ack_unref(vha, pla); | 4807 | qlt_plogi_ack_unref(vha, pla); |
| 4808 | break; | 4808 | break; |
| 4809 | 4809 | ||
| @@ -246,6 +246,8 @@ static void tcm_qla2xxx_complete_mcmd(struct work_struct *work) · 245 unmodified lines | |||
| 246 | */ | 246 | */ |
| 247 | static void tcm_qla2xxx_free_mcmd(struct qla_tgt_mgmt_cmd *mcmd) | 247 | static void tcm_qla2xxx_free_mcmd(struct qla_tgt_mgmt_cmd *mcmd) |
| 248 | { | 248 | { |
| 249 | if (!mcmd) | ||
| 250 | return; | ||
| 249 | INIT_WORK(&mcmd->free_work, tcm_qla2xxx_complete_mcmd); | 251 | INIT_WORK(&mcmd->free_work, tcm_qla2xxx_complete_mcmd); |
| 250 | queue_work(tcm_qla2xxx_free_wq, &mcmd->free_work); | 252 | queue_work(tcm_qla2xxx_free_wq, &mcmd->free_work); |
| 251 | } | 253 | } |
| @@ -348,6 +350,7 @@ static void tcm_qla2xxx_close_session(struct se_session *se_sess) · 96 unmodified lines | |||
| 348 | target_sess_cmd_list_set_waiting(se_sess); | 350 | target_sess_cmd_list_set_waiting(se_sess); |
| 349 | spin_unlock_irqrestore(&vha->hw->tgt.sess_lock, flags); | 351 | spin_unlock_irqrestore(&vha->hw->tgt.sess_lock, flags); |
| 350 | 352 | ||
| 353 | sess->explicit_logout = 1; | ||
| 351 | tcm_qla2xxx_put_sess(sess); | 354 | tcm_qla2xxx_put_sess(sess); |
| 352 | } | 355 | } |
| 353 | 356 | ||
| @@ -4275,7 +4275,6 @@ static int qla4xxx_mem_alloc(struct scsi_qla_host *ha) · 4274 unmodified lines | |||
| 4275 | return QLA_SUCCESS; | 4275 | return QLA_SUCCESS; |
| 4276 | 4276 | ||
| 4277 | mem_alloc_error_exit: | 4277 | mem_alloc_error_exit: |
| 4278 | qla4xxx_mem_free(ha); | ||
| 4279 | return QLA_ERROR; | 4278 | return QLA_ERROR; |
| 4280 | } | 4279 | } |
| 4281 | 4280 | ||
| @@ -24,6 +24,8 @@ · 23 unmodified lines | |||
| 24 | 24 | ||
| 25 | #define ISCSI_TRANSPORT_VERSION "2.0-870" | 25 | #define ISCSI_TRANSPORT_VERSION "2.0-870" |
| 26 | 26 | ||
| 27 | #define ISCSI_SEND_MAX_ALLOWED 10 | ||
| 28 | |||
| 27 | #define CREATE_TRACE_POINTS | 29 | #define CREATE_TRACE_POINTS |
| 28 | #include <trace/events/iscsi.h> | 30 | #include <trace/events/iscsi.h> |
| 29 | 31 | ||
| @@ -3682,6 +3684,7 @@ iscsi_if_rx(struct sk_buff *skb) · 3652 unmodified lines | |||
| 3682 | struct nlmsghdr *nlh; | 3684 | struct nlmsghdr *nlh; |
| 3683 | struct iscsi_uevent *ev; | 3685 | struct iscsi_uevent *ev; |
| 3684 | uint32_t group; | 3686 | uint32_t group; |
| 3687 | int retries = ISCSI_SEND_MAX_ALLOWED; | ||
| 3685 | 3688 | ||
| 3686 | nlh = nlmsg_hdr(skb); | 3689 | nlh = nlmsg_hdr(skb); |
| 3687 | if (nlh->nlmsg_len < sizeof(*nlh) + sizeof(*ev) || | 3690 | if (nlh->nlmsg_len < sizeof(*nlh) + sizeof(*ev) || |
| @@ -3712,6 +3715,10 @@ iscsi_if_rx(struct sk_buff *skb) · 24 unmodified lines | |||
| 3712 | break; | 3715 | break; |
| 3713 | err = iscsi_if_send_reply(portid, nlh->nlmsg_type, | 3716 | err = iscsi_if_send_reply(portid, nlh->nlmsg_type, |
| 3714 | ev, sizeof(*ev)); | 3717 | ev, sizeof(*ev)); |
| 3718 | if (err == -EAGAIN && --retries < 0) { | ||
| 3719 | printk(KERN_WARNING "Send reply failed, error %d\n", err); | ||
| 3720 | break; | ||
| 3721 | } | ||
| 3715 | } while (err < 0 && err != -ECONNREFUSED && err != -ESRCH); | 3722 | } while (err < 0 && err != -ECONNREFUSED && err != -ESRCH); |
| 3716 | skb_pull(skb, rlen); | 3723 | skb_pull(skb, rlen); |
| 3717 | } | 3724 | } |
| @@ -99,6 +99,12 @@ static int cdns_ufs_link_startup_notify(struct ufs_hba *hba, · 98 unmodified lines | |||
| 99 | */ | 99 | */ |
| 100 | ufshcd_dme_set(hba, UIC_ARG_MIB(PA_LOCAL_TX_LCC_ENABLE), 0); | 100 | ufshcd_dme_set(hba, UIC_ARG_MIB(PA_LOCAL_TX_LCC_ENABLE), 0); |
| 101 | 101 | ||
| 102 | /* | ||
| 103 | * Disabling Autohibern8 feature in cadence UFS | ||
| 104 | * to mask unexpected interrupt trigger. | ||
| 105 | */ | ||
| 106 | hba->ahit = 0; | ||
| 107 | |||
| 102 | return 0; | 108 | return 0; |
| 103 | } | 109 | } |
| 104 | 110 | ||
| @@ -203,7 +203,7 @@ int ufs_bsg_probe(struct ufs_hba *hba) · 202 unmodified lines | |||
| 203 | bsg_dev->parent = get_device(parent); | 203 | bsg_dev->parent = get_device(parent); |
| 204 | bsg_dev->release = ufs_bsg_node_release; | 204 | bsg_dev->release = ufs_bsg_node_release; |
| 205 | 205 | ||
| 206 | dev_set_name(bsg_dev, "ufs-bsg"); | 206 | dev_set_name(bsg_dev, "ufs-bsg%u", shost->host_no); |
| 207 | 207 | ||
| 208 | ret = device_add(bsg_dev); | 208 | ret = device_add(bsg_dev); |
| 209 | if (ret) | 209 | if (ret) |