]> rtime.felk.cvut.cz Git - zynq/linux.git/commitdiff
Merge tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi
authorLinus Torvalds <torvalds@linux-foundation.org>
Sat, 16 Mar 2019 19:51:50 +0000 (12:51 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sat, 16 Mar 2019 19:51:50 +0000 (12:51 -0700)
Pull more SCSI updates from James Bottomley:
 "This is the final round of mostly small fixes and performance
  improvements to our initial submit.

  The main regression fix is the ia64 simscsi build failure which was
  missed in the serial number elimination conversion"

* tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi: (24 commits)
  scsi: ia64: simscsi: use request tag instead of serial_number
  scsi: aacraid: Fix performance issue on logical drives
  scsi: lpfc: Fix error codes in lpfc_sli4_pci_mem_setup()
  scsi: libiscsi: Hold back_lock when calling iscsi_complete_task
  scsi: hisi_sas: Change SERDES_CFG init value to increase reliability of HiLink
  scsi: hisi_sas: Send HARD RESET to clear the previous affiliation of STP target port
  scsi: hisi_sas: Set PHY linkrate when disconnected
  scsi: hisi_sas: print PHY RX errors count for later revision of v3 hw
  scsi: hisi_sas: Fix a timeout race of driver internal and SMP IO
  scsi: hisi_sas: Change return variable type in phy_up_v3_hw()
  scsi: qla2xxx: check for kstrtol() failure
  scsi: lpfc: fix 32-bit format string warning
  scsi: lpfc: fix unused variable warning
  scsi: target: tcmu: Switch to bitmap_zalloc()
  scsi: libiscsi: fall back to sendmsg for slab pages
  scsi: qla2xxx: avoid printf format warning
  scsi: lpfc: resolve static checker warning in lpfc_sli4_hba_unset
  scsi: lpfc: Correct __lpfc_sli_issue_iocb_s4 lockdep check
  scsi: ufs: hisi: fix ufs_hba_variant_ops passing
  scsi: qla2xxx: Fix panic in qla_dfs_tgt_counters_show
  ...

22 files changed:
arch/ia64/hp/sim/simscsi.c
drivers/scsi/aacraid/linit.c
drivers/scsi/hisi_sas/hisi_sas.h
drivers/scsi/hisi_sas/hisi_sas_main.c
drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
drivers/scsi/libiscsi.c
drivers/scsi/libiscsi_tcp.c
drivers/scsi/lpfc/lpfc_init.c
drivers/scsi/lpfc/lpfc_nvme.c
drivers/scsi/lpfc/lpfc_sli.c
drivers/scsi/megaraid/megaraid_sas_base.c
drivers/scsi/qla2xxx/qla_attr.c
drivers/scsi/qla2xxx/qla_dfs.c
drivers/scsi/qla2xxx/qla_iocb.c
drivers/scsi/smartpqi/smartpqi_init.c
drivers/scsi/ufs/ufs-hisi.c
drivers/scsi/ufs/ufshcd-pltfrm.c
drivers/scsi/ufs/ufshcd-pltfrm.h
drivers/scsi/ufs/ufshcd.h
drivers/scsi/virtio_scsi.c
drivers/target/target_core_user.c

index f86844fc0725bd1c25e1b5b9cb3fac6f2176b43a..0a8a7427117306a922fbcd3f72de5ccccdab96c1 100644 (file)
@@ -105,7 +105,8 @@ simscsi_interrupt (unsigned long val)
                atomic_dec(&num_reqs);
                queue[rd].sc = NULL;
                if (DBG)
-                       printk("simscsi_interrupt: done with %ld\n", sc->serial_number);
+                       printk("simscsi_interrupt: done with %u\n",
+                              sc->request->tag);
                (*sc->scsi_done)(sc);
                rd = (rd + 1) % SIMSCSI_REQ_QUEUE_LEN;
        }
@@ -214,8 +215,8 @@ simscsi_queuecommand_lck (struct scsi_cmnd *sc, void (*done)(struct scsi_cmnd *)
        register long sp asm ("sp");
 
        if (DBG)
-               printk("simscsi_queuecommand: target=%d,cmnd=%u,sc=%lu,sp=%lx,done=%p\n",
-                      target_id, sc->cmnd[0], sc->serial_number, sp, done);
+               printk("simscsi_queuecommand: target=%d,cmnd=%u,sc=%u,sp=%lx,done=%p\n",
+                      target_id, sc->cmnd[0], sc->request->tag, sp, done);
 #endif
 
        sc->result = DID_BAD_TARGET << 16;
index a45f81ec80cec911f6a95e095bd21249c34ea535..8e28a505f7e8c0f8c18c30d59574da564ac698be 100644 (file)
@@ -413,13 +413,16 @@ static int aac_slave_configure(struct scsi_device *sdev)
        if (chn < AAC_MAX_BUSES && tid < AAC_MAX_TARGETS && aac->sa_firmware) {
                devtype = aac->hba_map[chn][tid].devtype;
 
-               if (devtype == AAC_DEVTYPE_NATIVE_RAW)
+               if (devtype == AAC_DEVTYPE_NATIVE_RAW) {
                        depth = aac->hba_map[chn][tid].qd_limit;
-               else if (devtype == AAC_DEVTYPE_ARC_RAW)
+                       set_timeout = 1;
+                       goto common_config;
+               }
+               if (devtype == AAC_DEVTYPE_ARC_RAW) {
                        set_qd_dev_type = true;
-
-               set_timeout = 1;
-               goto common_config;
+                       set_timeout = 1;
+                       goto common_config;
+               }
        }
 
        if (aac->jbod && (sdev->type == TYPE_DISK))
index 6c87bd34509af127039f743ce1251af5480432e0..9bfa9f12d81e8ab4fe81f0032fb05ad72dff191a 100644 (file)
@@ -18,6 +18,7 @@
 #include <linux/dmapool.h>
 #include <linux/iopoll.h>
 #include <linux/lcm.h>
+#include <linux/libata.h>
 #include <linux/mfd/syscon.h>
 #include <linux/module.h>
 #include <linux/of_address.h>
@@ -94,6 +95,11 @@ enum {
        PORT_TYPE_SATA = (1U << 0),
 };
 
+enum dev_status {
+       HISI_SAS_DEV_INIT,
+       HISI_SAS_DEV_NORMAL,
+};
+
 enum {
        HISI_SAS_INT_ABT_CMD = 0,
        HISI_SAS_INT_ABT_DEV = 1,
@@ -161,6 +167,7 @@ struct hisi_sas_phy {
        u8              in_reset;
        u8              reserved[2];
        u32             phy_type;
+       u32             code_violation_err_count;
        enum sas_linkrate       minimum_linkrate;
        enum sas_linkrate       maximum_linkrate;
 };
@@ -194,6 +201,7 @@ struct hisi_sas_device {
        struct hisi_sas_dq      *dq;
        struct list_head        list;
        enum sas_device_type    dev_type;
+       enum dev_status dev_status;
        int device_id;
        int sata_idx;
        spinlock_t lock; /* For protecting slots */
index 13ca5a0bdf6be336cd6f3754c15632440995d765..3c3cf89f713fbfaf8a7c15fbca17120af609fe87 100644 (file)
@@ -10,6 +10,7 @@
  */
 
 #include "hisi_sas.h"
+#include "../libsas/sas_internal.h"
 #define DRV_NAME "hisi_sas"
 
 #define DEV_IS_GONE(dev) \
@@ -707,6 +708,7 @@ static struct hisi_sas_device *hisi_sas_alloc_dev(struct domain_device *device)
 
                        hisi_hba->devices[i].device_id = i;
                        sas_dev = &hisi_hba->devices[i];
+                       sas_dev->dev_status = HISI_SAS_DEV_INIT;
                        sas_dev->dev_type = device->dev_type;
                        sas_dev->hisi_hba = hisi_hba;
                        sas_dev->sas_device = device;
@@ -731,6 +733,8 @@ static int hisi_sas_init_device(struct domain_device *device)
        struct hisi_sas_tmf_task tmf_task;
        int retry = HISI_SAS_SRST_ATA_DISK_CNT;
        struct hisi_hba *hisi_hba = dev_to_hisi_hba(device);
+       struct device *dev = hisi_hba->dev;
+       struct sas_phy *local_phy;
 
        switch (device->dev_type) {
        case SAS_END_DEVICE:
@@ -746,6 +750,31 @@ static int hisi_sas_init_device(struct domain_device *device)
        case SAS_SATA_PM:
        case SAS_SATA_PM_PORT:
        case SAS_SATA_PENDING:
+               /*
+                * send HARD RESET to clear previous affiliation of
+                * STP target port
+                */
+               local_phy = sas_get_local_phy(device);
+               if (!scsi_is_sas_phy_local(local_phy)) {
+                       unsigned long deadline = ata_deadline(jiffies, 20000);
+                       struct sata_device *sata_dev = &device->sata_dev;
+                       struct ata_host *ata_host = sata_dev->ata_host;
+                       struct ata_port_operations *ops = ata_host->ops;
+                       struct ata_port *ap = sata_dev->ap;
+                       struct ata_link *link;
+                       unsigned int classes;
+
+                       ata_for_each_link(link, ap, EDGE)
+                               rc = ops->hardreset(link, &classes,
+                                                   deadline);
+               }
+               sas_put_local_phy(local_phy);
+               if (rc) {
+                       dev_warn(dev, "SATA disk hardreset fail: 0x%x\n",
+                                rc);
+                       return rc;
+               }
+
                while (retry-- > 0) {
                        rc = hisi_sas_softreset_ata_disk(device);
                        if (!rc)
@@ -808,6 +837,7 @@ static int hisi_sas_dev_found(struct domain_device *device)
        rc = hisi_sas_init_device(device);
        if (rc)
                goto err_out;
+       sas_dev->dev_status = HISI_SAS_DEV_NORMAL;
        return 0;
 
 err_out:
@@ -980,7 +1010,8 @@ static void hisi_sas_do_release_task(struct hisi_hba *hisi_hba, struct sas_task
                spin_lock_irqsave(&task->task_state_lock, flags);
                task->task_state_flags &=
                        ~(SAS_TASK_STATE_PENDING | SAS_TASK_AT_INITIATOR);
-               task->task_state_flags |= SAS_TASK_STATE_DONE;
+               if (!slot->is_internal && task->task_proto != SAS_PROTOCOL_SMP)
+                       task->task_state_flags |= SAS_TASK_STATE_DONE;
                spin_unlock_irqrestore(&task->task_state_lock, flags);
        }
 
@@ -1713,20 +1744,23 @@ static int hisi_sas_clear_aca(struct domain_device *device, u8 *lun)
 static int hisi_sas_debug_I_T_nexus_reset(struct domain_device *device)
 {
        struct sas_phy *local_phy = sas_get_local_phy(device);
-       int rc, reset_type = (device->dev_type == SAS_SATA_DEV ||
-                       (device->tproto & SAS_PROTOCOL_STP)) ? 0 : 1;
+       struct hisi_sas_device *sas_dev = device->lldd_dev;
        struct hisi_hba *hisi_hba = dev_to_hisi_hba(device);
        struct sas_ha_struct *sas_ha = &hisi_hba->sha;
        struct asd_sas_phy *sas_phy = sas_ha->sas_phy[local_phy->number];
        struct hisi_sas_phy *phy = container_of(sas_phy,
                        struct hisi_sas_phy, sas_phy);
        DECLARE_COMPLETION_ONSTACK(phyreset);
+       int rc, reset_type;
 
        if (scsi_is_sas_phy_local(local_phy)) {
                phy->in_reset = 1;
                phy->reset_completion = &phyreset;
        }
 
+       reset_type = (sas_dev->dev_status == HISI_SAS_DEV_INIT ||
+                     !dev_is_sata(device)) ? 1 : 0;
+
        rc = sas_phy_reset(local_phy, reset_type);
        sas_put_local_phy(local_phy);
 
@@ -1742,8 +1776,13 @@ static int hisi_sas_debug_I_T_nexus_reset(struct domain_device *device)
                /* report PHY down if timed out */
                if (!ret)
                        hisi_sas_phy_down(hisi_hba, sas_phy->id, 0);
-       } else
+       } else if (sas_dev->dev_status != HISI_SAS_DEV_INIT) {
+               /*
+                * If in init state, we rely on caller to wait for link to be
+                * ready; otherwise, delay.
+                */
                msleep(2000);
+       }
 
        return rc;
 }
@@ -2125,9 +2164,18 @@ static int hisi_sas_write_gpio(struct sas_ha_struct *sha, u8 reg_type,
 
 static void hisi_sas_phy_disconnected(struct hisi_sas_phy *phy)
 {
+       struct asd_sas_phy *sas_phy = &phy->sas_phy;
+       struct sas_phy *sphy = sas_phy->phy;
+       struct sas_phy_data *d = sphy->hostdata;
+
        phy->phy_attached = 0;
        phy->phy_type = 0;
        phy->port = NULL;
+
+       if (d->enable)
+               sphy->negotiated_linkrate = SAS_LINK_RATE_UNKNOWN;
+       else
+               sphy->negotiated_linkrate = SAS_PHY_DISABLED;
 }
 
 void hisi_sas_phy_down(struct hisi_hba *hisi_hba, int phy_no, int rdy)
@@ -2253,6 +2301,7 @@ int hisi_sas_alloc(struct hisi_hba *hisi_hba)
        for (i = 0; i < HISI_SAS_MAX_DEVICES; i++) {
                hisi_hba->devices[i].dev_type = SAS_PHY_UNUSED;
                hisi_hba->devices[i].device_id = i;
+               hisi_hba->devices[i].dev_status = HISI_SAS_DEV_INIT;
        }
 
        for (i = 0; i < hisi_hba->queue_count; i++) {
index e40cc6b3b67be09cfc84d7daeed41f4f428db2f5..89160ab3efb05648dc6a7b23acd8a45e87ca61a6 100644 (file)
@@ -868,6 +868,7 @@ hisi_sas_device *alloc_dev_quirk_v2_hw(struct domain_device *device)
 
                        hisi_hba->devices[i].device_id = i;
                        sas_dev = &hisi_hba->devices[i];
+                       sas_dev->dev_status = HISI_SAS_DEV_INIT;
                        sas_dev->dev_type = device->dev_type;
                        sas_dev->hisi_hba = hisi_hba;
                        sas_dev->sas_device = device;
index 9ec8848ec54139248033fa332a70da64195a1f24..086695a4099fc13bd4c555309c5a7bffe6a18e82 100644 (file)
 #define PHY_CTRL_RESET_MSK             (0x1 << PHY_CTRL_RESET_OFF)
 #define CMD_HDR_PIR_OFF                        8
 #define CMD_HDR_PIR_MSK                        (0x1 << CMD_HDR_PIR_OFF)
+#define SERDES_CFG                     (PORT_BASE + 0x1c)
 #define SL_CFG                         (PORT_BASE + 0x84)
 #define AIP_LIMIT                      (PORT_BASE + 0x90)
 #define SL_CONTROL                     (PORT_BASE + 0x94)
 #define CHL_INT1_DMAC_RX_AXI_RD_ERR_OFF        22
 #define CHL_INT2                       (PORT_BASE + 0x1bc)
 #define CHL_INT2_SL_IDAF_TOUT_CONF_OFF 0
+#define CHL_INT2_RX_DISP_ERR_OFF       28
+#define CHL_INT2_RX_CODE_ERR_OFF       29
 #define CHL_INT2_RX_INVLD_DW_OFF       30
 #define CHL_INT2_STP_LINK_TIMEOUT_OFF  31
 #define CHL_INT0_MSK                   (PORT_BASE + 0x1c0)
@@ -523,6 +526,7 @@ static void init_reg_v3_hw(struct hisi_hba *hisi_hba)
                }
                hisi_sas_phy_write32(hisi_hba, i, PROG_PHY_LINK_RATE,
                        prog_phy_link_rate);
+               hisi_sas_phy_write32(hisi_hba, i, SERDES_CFG, 0xffc00);
                hisi_sas_phy_write32(hisi_hba, i, SAS_RX_TRAIN_TIMER, 0x13e80);
                hisi_sas_phy_write32(hisi_hba, i, CHL_INT0, 0xffffffff);
                hisi_sas_phy_write32(hisi_hba, i, CHL_INT1, 0xffffffff);
@@ -544,6 +548,8 @@ static void init_reg_v3_hw(struct hisi_hba *hisi_hba)
                hisi_sas_phy_write32(hisi_hba, i, STP_LINK_TIMER, 0x7f7a120);
                hisi_sas_phy_write32(hisi_hba, i, CON_CFG_DRIVER, 0x2a0a01);
                hisi_sas_phy_write32(hisi_hba, i, SAS_SSP_CON_TIMER_CFG, 0x32);
+               hisi_sas_phy_write32(hisi_hba, i, SAS_EC_INT_COAL_TIME,
+                                    0x30f4240);
                /* used for 12G negotiate */
                hisi_sas_phy_write32(hisi_hba, i, COARSETUNE_TIME, 0x1e);
                hisi_sas_phy_write32(hisi_hba, i, AIP_LIMIT, 0x2ffff);
@@ -1344,7 +1350,8 @@ static void prep_abort_v3_hw(struct hisi_hba *hisi_hba,
 
 static irqreturn_t phy_up_v3_hw(int phy_no, struct hisi_hba *hisi_hba)
 {
-       int i, res;
+       int i;
+       irqreturn_t res;
        u32 context, port_id, link_rate;
        struct hisi_sas_phy *phy = &hisi_hba->phy[phy_no];
        struct asd_sas_phy *sas_phy = &phy->sas_phy;
@@ -1575,6 +1582,39 @@ static void handle_chl_int1_v3_hw(struct hisi_hba *hisi_hba, int phy_no)
        hisi_sas_phy_write32(hisi_hba, phy_no, CHL_INT1, irq_value);
 }
 
+static void phy_get_events_v3_hw(struct hisi_hba *hisi_hba, int phy_no)
+{
+       struct hisi_sas_phy *phy = &hisi_hba->phy[phy_no];
+       struct asd_sas_phy *sas_phy = &phy->sas_phy;
+       struct sas_phy *sphy = sas_phy->phy;
+       unsigned long flags;
+       u32 reg_value;
+
+       spin_lock_irqsave(&phy->lock, flags);
+
+       /* loss dword sync */
+       reg_value = hisi_sas_phy_read32(hisi_hba, phy_no, ERR_CNT_DWS_LOST);
+       sphy->loss_of_dword_sync_count += reg_value;
+
+       /* phy reset problem */
+       reg_value = hisi_sas_phy_read32(hisi_hba, phy_no, ERR_CNT_RESET_PROB);
+       sphy->phy_reset_problem_count += reg_value;
+
+       /* invalid dword */
+       reg_value = hisi_sas_phy_read32(hisi_hba, phy_no, ERR_CNT_INVLD_DW);
+       sphy->invalid_dword_count += reg_value;
+
+       /* disparity err */
+       reg_value = hisi_sas_phy_read32(hisi_hba, phy_no, ERR_CNT_DISP_ERR);
+       sphy->running_disparity_error_count += reg_value;
+
+       /* code violation error */
+       reg_value = hisi_sas_phy_read32(hisi_hba, phy_no, ERR_CNT_CODE_ERR);
+       phy->code_violation_err_count += reg_value;
+
+       spin_unlock_irqrestore(&phy->lock, flags);
+}
+
 static void handle_chl_int2_v3_hw(struct hisi_hba *hisi_hba, int phy_no)
 {
        u32 irq_msk = hisi_sas_phy_read32(hisi_hba, phy_no, CHL_INT2_MSK);
@@ -1582,6 +1622,9 @@ static void handle_chl_int2_v3_hw(struct hisi_hba *hisi_hba, int phy_no)
        struct hisi_sas_phy *phy = &hisi_hba->phy[phy_no];
        struct pci_dev *pci_dev = hisi_hba->pci_dev;
        struct device *dev = hisi_hba->dev;
+       static const u32 msk = BIT(CHL_INT2_RX_DISP_ERR_OFF) |
+                       BIT(CHL_INT2_RX_CODE_ERR_OFF) |
+                       BIT(CHL_INT2_RX_INVLD_DW_OFF);
 
        irq_value &= ~irq_msk;
        if (!irq_value)
@@ -1602,6 +1645,25 @@ static void handle_chl_int2_v3_hw(struct hisi_hba *hisi_hba, int phy_no)
                        hisi_sas_notify_phy_event(phy, HISI_PHYE_LINK_RESET);
        }
 
+       if (pci_dev->revision > 0x20 && (irq_value & msk)) {
+               struct asd_sas_phy *sas_phy = &phy->sas_phy;
+               struct sas_phy *sphy = sas_phy->phy;
+
+               phy_get_events_v3_hw(hisi_hba, phy_no);
+
+               if (irq_value & BIT(CHL_INT2_RX_INVLD_DW_OFF))
+                       dev_info(dev, "phy%d invalid dword cnt:   %u\n", phy_no,
+                                sphy->invalid_dword_count);
+
+               if (irq_value & BIT(CHL_INT2_RX_CODE_ERR_OFF))
+                       dev_info(dev, "phy%d code violation cnt:  %u\n", phy_no,
+                                phy->code_violation_err_count);
+
+               if (irq_value & BIT(CHL_INT2_RX_DISP_ERR_OFF))
+                       dev_info(dev, "phy%d disparity error cnt: %u\n", phy_no,
+                                sphy->running_disparity_error_count);
+       }
+
        if ((irq_value & BIT(CHL_INT2_RX_INVLD_DW_OFF)) &&
            (pci_dev->revision == 0x20)) {
                u32 reg_value;
@@ -2230,31 +2292,6 @@ static u32 get_phys_state_v3_hw(struct hisi_hba *hisi_hba)
        return hisi_sas_read32(hisi_hba, PHY_STATE);
 }
 
-static void phy_get_events_v3_hw(struct hisi_hba *hisi_hba, int phy_no)
-{
-       struct hisi_sas_phy *phy = &hisi_hba->phy[phy_no];
-       struct asd_sas_phy *sas_phy = &phy->sas_phy;
-       struct sas_phy *sphy = sas_phy->phy;
-       u32 reg_value;
-
-       /* loss dword sync */
-       reg_value = hisi_sas_phy_read32(hisi_hba, phy_no, ERR_CNT_DWS_LOST);
-       sphy->loss_of_dword_sync_count += reg_value;
-
-       /* phy reset problem */
-       reg_value = hisi_sas_phy_read32(hisi_hba, phy_no, ERR_CNT_RESET_PROB);
-       sphy->phy_reset_problem_count += reg_value;
-
-       /* invalid dword */
-       reg_value = hisi_sas_phy_read32(hisi_hba, phy_no, ERR_CNT_INVLD_DW);
-       sphy->invalid_dword_count += reg_value;
-
-       /* disparity err */
-       reg_value = hisi_sas_phy_read32(hisi_hba, phy_no, ERR_CNT_DISP_ERR);
-       sphy->running_disparity_error_count += reg_value;
-
-}
-
 static int disable_host_v3_hw(struct hisi_hba *hisi_hba)
 {
        struct device *dev = hisi_hba->dev;
index 21309d5b456ddaf6eb39a57f98b932ba05fa1da8..e893949a3d118421481d3fb5de90f170a70440af 100644 (file)
@@ -798,7 +798,7 @@ EXPORT_SYMBOL_GPL(iscsi_conn_send_pdu);
  * @datalen: len of buffer
  *
  * iscsi_cmd_rsp sets up the scsi_cmnd fields based on the PDU and
- * then completes the command and task.
+ * then completes the command and task. called under back_lock
  **/
 static void iscsi_scsi_cmd_rsp(struct iscsi_conn *conn, struct iscsi_hdr *hdr,
                               struct iscsi_task *task, char *data,
@@ -894,6 +894,9 @@ out:
  * @conn: iscsi connection
  * @hdr:  iscsi pdu
  * @task: scsi command task
+ *
+ * iscsi_data_in_rsp sets up the scsi_cmnd fields based on the data received
+ * then completes the command and task. called under back_lock
  **/
 static void
 iscsi_data_in_rsp(struct iscsi_conn *conn, struct iscsi_hdr *hdr,
@@ -978,6 +981,16 @@ static int iscsi_send_nopout(struct iscsi_conn *conn, struct iscsi_nopin *rhdr)
        return 0;
 }
 
+/**
+ * iscsi_nop_out_rsp - SCSI NOP Response processing
+ * @task: scsi command task
+ * @nop: the nop structure
+ * @data: where to put the data
+ * @datalen: length of data
+ *
+ * iscsi_nop_out_rsp handles nop response from use or
+ * from user space. called under back_lock
+ **/
 static int iscsi_nop_out_rsp(struct iscsi_task *task,
                             struct iscsi_nopin *nop, char *data, int datalen)
 {
@@ -1750,7 +1763,9 @@ int iscsi_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *sc)
        return 0;
 
 prepd_reject:
+       spin_lock_bh(&session->back_lock);
        iscsi_complete_task(task, ISCSI_TASK_REQUEUE_SCSIQ);
+       spin_unlock_bh(&session->back_lock);
 reject:
        spin_unlock_bh(&session->frwd_lock);
        ISCSI_DBG_SESSION(session, "cmd 0x%x rejected (%d)\n",
@@ -1758,7 +1773,9 @@ reject:
        return SCSI_MLQUEUE_TARGET_BUSY;
 
 prepd_fault:
+       spin_lock_bh(&session->back_lock);
        iscsi_complete_task(task, ISCSI_TASK_REQUEUE_SCSIQ);
+       spin_unlock_bh(&session->back_lock);
 fault:
        spin_unlock_bh(&session->frwd_lock);
        ISCSI_DBG_SESSION(session, "iscsi: cmd 0x%x is not queued (%d)\n",
@@ -3075,8 +3092,9 @@ fail_mgmt_tasks(struct iscsi_session *session, struct iscsi_conn *conn)
                state = ISCSI_TASK_ABRT_SESS_RECOV;
                if (task->state == ISCSI_TASK_PENDING)
                        state = ISCSI_TASK_COMPLETED;
+               spin_lock_bh(&session->back_lock);
                iscsi_complete_task(task, state);
-
+               spin_unlock_bh(&session->back_lock);
        }
 }
 
index 9923e9e3b8843b44e6a4212a7411628946892f69..c3fe3f3a78f591a50c640dd810a719cebc83049a 100644 (file)
@@ -129,12 +129,17 @@ static void iscsi_tcp_segment_map(struct iscsi_segment *segment, int recv)
        BUG_ON(sg->length == 0);
 
        /*
+        * We always map for the recv path.
+        *
         * If the page count is greater than one it is ok to send
         * to the network layer's zero copy send path. If not we
-        * have to go the slow sendmsg path. We always map for the
-        * recv path.
+        * have to go the slow sendmsg path.
+        *
+        * Same goes for slab pages: skb_can_coalesce() allows
+        * coalescing neighboring slab objects into a single frag which
+        * triggers one of hardened usercopy checks.
         */
-       if (page_count(sg_page(sg)) >= 1 && !recv)
+       if (!recv && page_count(sg_page(sg)) >= 1 && !PageSlab(sg_page(sg)))
                return;
 
        if (recv) {
index 3b5873f6751e86cfa1c6252bf6d51d7eb0b9414c..7fcdaed3fa945539a64fc78e349a00387cd41ea2 100644 (file)
@@ -4090,7 +4090,7 @@ lpfc_new_io_buf(struct lpfc_hba *phba, int num_to_alloc)
        /* Sanity check to ensure our sizing is right for both SCSI and NVME */
        if (sizeof(struct lpfc_io_buf) > LPFC_COMMON_IO_BUF_SZ) {
                lpfc_printf_log(phba, KERN_ERR, LOG_FCP,
-                               "6426 Common buffer size %ld exceeds %d\n",
+                               "6426 Common buffer size %zd exceeds %d\n",
                                sizeof(struct lpfc_io_buf),
                                LPFC_COMMON_IO_BUF_SZ);
                return 0;
@@ -10052,7 +10052,7 @@ lpfc_sli4_pci_mem_setup(struct lpfc_hba *phba)
 {
        struct pci_dev *pdev = phba->pcidev;
        unsigned long bar0map_len, bar1map_len, bar2map_len;
-       int error = -ENODEV;
+       int error;
        uint32_t if_type;
 
        if (!pdev)
@@ -10071,7 +10071,7 @@ lpfc_sli4_pci_mem_setup(struct lpfc_hba *phba)
         */
        if (pci_read_config_dword(pdev, LPFC_SLI_INTF,
                                  &phba->sli4_hba.sli_intf.word0)) {
-               return error;
+               return -ENODEV;
        }
 
        /* There is no SLI3 failback for SLI4 devices. */
@@ -10081,7 +10081,7 @@ lpfc_sli4_pci_mem_setup(struct lpfc_hba *phba)
                                "2894 SLI_INTF reg contents invalid "
                                "sli_intf reg 0x%x\n",
                                phba->sli4_hba.sli_intf.word0);
-               return error;
+               return -ENODEV;
        }
 
        if_type = bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf);
@@ -10105,7 +10105,7 @@ lpfc_sli4_pci_mem_setup(struct lpfc_hba *phba)
                        dev_printk(KERN_ERR, &pdev->dev,
                                   "ioremap failed for SLI4 PCI config "
                                   "registers.\n");
-                       goto out;
+                       return -ENODEV;
                }
                phba->pci_bar0_memmap_p = phba->sli4_hba.conf_regs_memmap_p;
                /* Set up BAR0 PCI config space register memory map */
@@ -10116,7 +10116,7 @@ lpfc_sli4_pci_mem_setup(struct lpfc_hba *phba)
                if (if_type >= LPFC_SLI_INTF_IF_TYPE_2) {
                        dev_printk(KERN_ERR, &pdev->dev,
                           "FATAL - No BAR0 mapping for SLI4, if_type 2\n");
-                       goto out;
+                       return -ENODEV;
                }
                phba->sli4_hba.conf_regs_memmap_p =
                                ioremap(phba->pci_bar0_map, bar0map_len);
@@ -10124,7 +10124,7 @@ lpfc_sli4_pci_mem_setup(struct lpfc_hba *phba)
                        dev_printk(KERN_ERR, &pdev->dev,
                                "ioremap failed for SLI4 PCI config "
                                "registers.\n");
-                       goto out;
+                       return -ENODEV;
                }
                lpfc_sli4_bar0_register_memmap(phba, if_type);
        }
@@ -10170,6 +10170,7 @@ lpfc_sli4_pci_mem_setup(struct lpfc_hba *phba)
                if (!phba->sli4_hba.drbl_regs_memmap_p) {
                        dev_err(&pdev->dev,
                           "ioremap failed for SLI4 HBA doorbell registers.\n");
+                       error = -ENOMEM;
                        goto out_iounmap_conf;
                }
                phba->pci_bar2_memmap_p = phba->sli4_hba.drbl_regs_memmap_p;
@@ -10219,6 +10220,7 @@ lpfc_sli4_pci_mem_setup(struct lpfc_hba *phba)
                if (!phba->sli4_hba.dpp_regs_memmap_p) {
                        dev_err(&pdev->dev,
                           "ioremap failed for SLI4 HBA dpp registers.\n");
+                       error = -ENOMEM;
                        goto out_iounmap_ctrl;
                }
                phba->pci_bar4_memmap_p = phba->sli4_hba.dpp_regs_memmap_p;
@@ -10249,7 +10251,7 @@ out_iounmap_ctrl:
        iounmap(phba->sli4_hba.ctrl_regs_memmap_p);
 out_iounmap_conf:
        iounmap(phba->sli4_hba.conf_regs_memmap_p);
-out:
+
        return error;
 }
 
@@ -11137,7 +11139,8 @@ lpfc_sli4_hba_unset(struct lpfc_hba *phba)
                lpfc_sli4_ras_dma_free(phba);
 
        /* Stop the SLI4 device port */
-       phba->pport->work_port_events = 0;
+       if (phba->pport)
+               phba->pport->work_port_events = 0;
 }
 
  /**
index 55ab9d3ee4ba09a217da7889f9bf8de19dfd7d77..1aa00d2c3f74e329341114562527c3f78914f6ec 100644 (file)
@@ -965,7 +965,7 @@ lpfc_nvme_io_cmd_wqe_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *pwqeIn,
        struct lpfc_nodelist *ndlp;
        struct lpfc_nvme_fcpreq_priv *freqpriv;
        struct lpfc_nvme_lport *lport;
-       uint32_t code, status, idx, cpu;
+       uint32_t code, status, idx;
        uint16_t cid, sqhd, data;
        uint32_t *ptr;
 
@@ -1138,6 +1138,7 @@ out_err:
                lpfc_nvme_ktime(phba, lpfc_ncmd);
        }
        if (phba->cpucheck_on & LPFC_CHECK_NVME_IO) {
+               uint32_t cpu;
                idx = lpfc_ncmd->cur_iocbq.hba_wqidx;
                cpu = smp_processor_id();
                if (cpu < LPFC_CHECK_CPU_CNT) {
index d0817facdae36a6d188dfa7cf3dcb48d014cc591..57b4a463b5892d2f0cd0f56697d3a4b168b9a500 100644 (file)
@@ -9881,7 +9881,7 @@ __lpfc_sli_issue_iocb_s4(struct lpfc_hba *phba, uint32_t ring_number,
         * The WQE can be either 64 or 128 bytes,
         */
 
-       lockdep_assert_held(&phba->hbalock);
+       lockdep_assert_held(&pring->ring_lock);
 
        if (piocb->sli4_xritag == NO_XRI) {
                if (piocb->iocb.ulpCommand == CMD_ABORT_XRI_CN ||
index dace907744a5dc02edca5751441f97ff37432b12..293f5cf524d7a3918f7151661dc6fae0af8da26e 100644 (file)
@@ -3924,12 +3924,12 @@ megasas_transition_to_ready(struct megasas_instance *instance, int ocr)
                /*
                 * The cur_state should not last for more than max_wait secs
                 */
-               for (i = 0; i < max_wait; i++) {
+               for (i = 0; i < max_wait * 50; i++) {
                        curr_abs_state = instance->instancet->
                                read_fw_status_reg(instance);
 
                        if (abs_state == curr_abs_state) {
-                               msleep(1000);
+                               msleep(20);
                        } else
                                break;
                }
index 2eb1ae721a7d3663512d1b4b18850b4cd7c500c5..f928c4d3a1efe3f5b8a5441344e358aaa9875fd0 100644 (file)
@@ -1652,6 +1652,8 @@ qla2x00_port_speed_store(struct device *dev, struct device_attribute *attr,
        }
 
        rval = kstrtol(buf, 10, &type);
+       if (rval)
+               return rval;
        speed = type;
        if (type == 40 || type == 80 || type == 160 ||
            type == 320) {
index ead17288e2a77b4a7b2ea155f976604e35390108..5819a45ac5ef719f0ab5eb77f9d8e508e4a9da1b 100644 (file)
@@ -193,6 +193,8 @@ qla_dfs_tgt_counters_show(struct seq_file *s, void *unused)
 
        for (i = 0; i < vha->hw->max_qpairs; i++) {
                qpair = vha->hw->queue_pair_map[i];
+               if (!qpair)
+                       continue;
                qla_core_sbt_cmd += qpair->tgt_counters.qla_core_sbt_cmd;
                core_qla_que_buf += qpair->tgt_counters.core_qla_que_buf;
                qla_core_ret_ctio += qpair->tgt_counters.qla_core_ret_ctio;
index 63f8e3c1984163343109c5760bf68eb58892f0c6..456a41d2e2c6c1958ce519c09c598eb09655925b 100644 (file)
@@ -1132,7 +1132,7 @@ qla24xx_walk_and_build_prot_sglist(struct qla_hw_data *ha, srb_t *sp,
        /* if initiator doing write or target doing read */
        if (direction_to_device) {
                for_each_sg(sgl, sg, tot_dsds, i) {
-                       dma_addr_t sle_phys = sg_phys(sg);
+                       u64 sle_phys = sg_phys(sg);
 
                        /* If SGE addr + len flips bits in upper 32-bits */
                        if (MSD(sle_phys + sg->length) ^ MSD(sle_phys)) {
@@ -1178,7 +1178,7 @@ qla24xx_walk_and_build_prot_sglist(struct qla_hw_data *ha, srb_t *sp,
 
                        ql_dbg(ql_dbg_tgt + ql_dbg_verbose, vha, 0xe023,
                            "%s: sg[%x] (phys=%llx sglen=%x) ldma_sg_len: %x dif_bundl_len: %x ldma_needed: %x\n",
-                           __func__, i, sg_phys(sg), sglen, ldma_sg_len,
+                           __func__, i, (u64)sg_phys(sg), sglen, ldma_sg_len,
                            difctx->dif_bundl_len, ldma_needed);
 
                        while (sglen) {
index 5d9ccbab75815b43bc6238a96ee0e120f368649c..75ec43aa8df381c0f82a75ecd393fc19c4251c14 100644 (file)
@@ -2764,6 +2764,12 @@ static void pqi_process_raid_io_error(struct pqi_io_request *io_request)
                                sshdr.sense_key == HARDWARE_ERROR &&
                                sshdr.asc == 0x3e &&
                                sshdr.ascq == 0x1) {
+                       struct pqi_ctrl_info *ctrl_info = shost_to_hba(scmd->device->host);
+                       struct pqi_scsi_dev *device = scmd->device->hostdata;
+
+                       if (printk_ratelimit())
+                               scmd_printk(KERN_ERR, scmd, "received 'logical unit failure' from controller for scsi %d:%d:%d:%d\n",
+                                       ctrl_info->scsi_host->host_no, device->bus, device->target, device->lun);
                        pqi_take_device_offline(scmd->device, "RAID");
                        host_byte = DID_NO_CONNECT;
                }
index f2d3df357a973ab2ad13cc4ac22819a4affb7538..0e855b5afe82a7d93b1183cee2b9223bf0b150c4 100644 (file)
@@ -640,7 +640,7 @@ static int ufs_hi3670_init(struct ufs_hba *hba)
        return 0;
 }
 
-static struct ufs_hba_variant_ops ufs_hba_hi3660_vops = {
+static const struct ufs_hba_variant_ops ufs_hba_hi3660_vops = {
        .name = "hi3660",
        .init = ufs_hi3660_init,
        .link_startup_notify = ufs_hisi_link_startup_notify,
@@ -649,7 +649,7 @@ static struct ufs_hba_variant_ops ufs_hba_hi3660_vops = {
        .resume = ufs_hisi_resume,
 };
 
-static struct ufs_hba_variant_ops ufs_hba_hi3670_vops = {
+static const struct ufs_hba_variant_ops ufs_hba_hi3670_vops = {
        .name = "hi3670",
        .init = ufs_hi3670_init,
        .link_startup_notify = ufs_hisi_link_startup_notify,
@@ -669,13 +669,10 @@ MODULE_DEVICE_TABLE(of, ufs_hisi_of_match);
 static int ufs_hisi_probe(struct platform_device *pdev)
 {
        const struct of_device_id *of_id;
-       struct ufs_hba_variant_ops *vops;
-       struct device *dev = &pdev->dev;
 
-       of_id = of_match_node(ufs_hisi_of_match, dev->of_node);
-       vops = (struct ufs_hba_variant_ops *)of_id->data;
+       of_id = of_match_node(ufs_hisi_of_match, pdev->dev.of_node);
 
-       return ufshcd_pltfrm_init(pdev, vops);
+       return ufshcd_pltfrm_init(pdev, of_id->data);
 }
 
 static int ufs_hisi_remove(struct platform_device *pdev)
index 895a9b5ac98993ecac1c7c3ff2621548b3dd6cea..27213676329c039281becc3bd3d97a1128b3b62c 100644 (file)
@@ -297,7 +297,7 @@ static void ufshcd_init_lanes_per_dir(struct ufs_hba *hba)
  * Returns 0 on success, non-zero value on failure
  */
 int ufshcd_pltfrm_init(struct platform_device *pdev,
-                      struct ufs_hba_variant_ops *vops)
+                      const struct ufs_hba_variant_ops *vops)
 {
        struct ufs_hba *hba;
        void __iomem *mmio_base;
index df64c418034046bd9810cc66bb5ca655a50da2b4..1f29e1fd6d5206f579193759792370a6dec91b26 100644 (file)
@@ -17,7 +17,7 @@
 #include "ufshcd.h"
 
 int ufshcd_pltfrm_init(struct platform_device *pdev,
-                      struct ufs_hba_variant_ops *vops);
+                      const struct ufs_hba_variant_ops *vops);
 void ufshcd_pltfrm_shutdown(struct platform_device *pdev);
 
 #ifdef CONFIG_PM
index 69ba7445d2b3705556c441ceb84b7aeb964d18f2..ecfa898b9ccc060de3cad2bd08084b2554a39a9f 100644 (file)
@@ -546,7 +546,7 @@ struct ufs_hba {
        int nutrs;
        int nutmrs;
        u32 ufs_version;
-       struct ufs_hba_variant_ops *vops;
+       const struct ufs_hba_variant_ops *vops;
        void *priv;
        unsigned int irq;
        bool is_irq_enabled;
index 1a6f150cd2d873682d21e58660958d2c7bb51893..8af01777d09c74f344ad325256dbd30248febe32 100644 (file)
@@ -586,7 +586,6 @@ static int virtscsi_device_reset(struct scsi_cmnd *sc)
                return FAILED;
 
        memset(cmd, 0, sizeof(*cmd));
-       cmd->sc = sc;
        cmd->req.tmf = (struct virtio_scsi_ctrl_tmf_req){
                .type = VIRTIO_SCSI_T_TMF,
                .subtype = cpu_to_virtio32(vscsi->vdev,
@@ -645,7 +644,6 @@ static int virtscsi_abort(struct scsi_cmnd *sc)
                return FAILED;
 
        memset(cmd, 0, sizeof(*cmd));
-       cmd->sc = sc;
        cmd->req.tmf = (struct virtio_scsi_ctrl_tmf_req){
                .type = VIRTIO_SCSI_T_TMF,
                .subtype = VIRTIO_SCSI_T_TMF_ABORT_TASK,
index 5831e0eecea120f9157cb566311839b9273755ce..9704b135a7bc5f10fee7b37140686485ed24d59b 100644 (file)
@@ -1663,7 +1663,7 @@ static void tcmu_dev_kref_release(struct kref *kref)
        WARN_ON(!all_expired);
 
        tcmu_blocks_release(&udev->data_blocks, 0, udev->dbi_max + 1);
-       kfree(udev->data_bitmap);
+       bitmap_free(udev->data_bitmap);
        mutex_unlock(&udev->cmdr_lock);
 
        call_rcu(&dev->rcu_head, tcmu_dev_call_rcu);
@@ -1794,11 +1794,12 @@ static int tcmu_netlink_event_send(struct tcmu_dev *udev,
 
        ret = genlmsg_multicast_allns(&tcmu_genl_family, skb, 0,
                                      TCMU_MCGRP_CONFIG, GFP_KERNEL);
-       /* We don't care if no one is listening */
-       if (ret == -ESRCH)
-               ret = 0;
-       if (!ret)
-               ret = tcmu_wait_genl_cmd_reply(udev);
+
+       /* Wait during an add as the listener may not be up yet */
+       if (ret == 0 ||
+          (ret == -ESRCH && cmd == TCMU_CMD_ADDED_DEVICE))
+               return tcmu_wait_genl_cmd_reply(udev);
+
        return ret;
 }
 
@@ -1870,9 +1871,7 @@ static int tcmu_configure_device(struct se_device *dev)
        info = &udev->uio_info;
 
        mutex_lock(&udev->cmdr_lock);
-       udev->data_bitmap = kcalloc(BITS_TO_LONGS(udev->max_blocks),
-                                   sizeof(unsigned long),
-                                   GFP_KERNEL);
+       udev->data_bitmap = bitmap_zalloc(udev->max_blocks, GFP_KERNEL);
        mutex_unlock(&udev->cmdr_lock);
        if (!udev->data_bitmap) {
                ret = -ENOMEM;
@@ -1959,7 +1958,7 @@ err_register:
        vfree(udev->mb_addr);
        udev->mb_addr = NULL;
 err_vzalloc:
-       kfree(udev->data_bitmap);
+       bitmap_free(udev->data_bitmap);
        udev->data_bitmap = NULL;
 err_bitmap_alloc:
        kfree(info->name);