Home Home > GIT Browse
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichal Marek <mmarek@suse.com>2016-04-18 15:22:06 +0200
committerMichal Marek <mmarek@suse.com>2016-04-18 15:22:06 +0200
commit15e149c6fdc633c03fae97e31fd9b1e154c12bc4 (patch)
tree139ed629ca3598d59f61956c7b08fef2f7b8d157
parentb3b563f2eef0c23e505b05dacb76fa40d4b34179 (diff)
parent1d76dc6ef016ac01333835cee5a99d47672d1969 (diff)
Merge branch 'users/jthumshirn/SLE12-SP2/for-next' into SLE12-SP2
Pull hpsa and snic backports from Johannes Thumshirn (fate#319992, bsc#972413, fate#319760, bsc#964943).
-rw-r--r--patches.drivers/0001-snic-add-scsi-host-after-determining-max-ios.patch90
-rw-r--r--patches.drivers/0002-snic-fixing-race-in-the-hba-reset-and-io-tm-completion.patch71
-rw-r--r--patches.drivers/0003-snic-fix-for-missing-interrupts.patch166
-rw-r--r--patches.drivers/0004-hpsa-do-not-get-enclosure-info-for-external-devices.patch49
-rw-r--r--patches.drivers/0004-snic-target-cleanup-in-driver-unload-path.patch63
-rw-r--r--patches.drivers/0005-hpsa-add-smr-drive-support.patch78
-rw-r--r--patches.drivers/0005-snic-handling-control-path-queue-issues.patch102
-rw-r--r--patches.drivers/0006-hpsa-correct-abort-tmf-for-hba-devices.patch64
-rw-r--r--patches.drivers/0006-snic-lun-goes-offline-due-to-scsi-cmd-timeouts.patch67
-rw-r--r--patches.drivers/0007-hpsa-check-for-a-null-phys_disk-pointer-in-ioaccel2-path.patch39
-rw-r--r--patches.drivers/0007-snic-added-additional-stats.patch299
-rw-r--r--patches.drivers/0008-scsi-export-function-scsi_scan-c-sanitize_inquiry_string.patch85
-rw-r--r--patches.drivers/0008-snic-correctly-check-for-array-overrun-on-overly-long-version-number.patch37
-rw-r--r--patches.drivers/0009-hpsa-remove-function-definition-for-sanitize_inquiry_string.patch60
-rw-r--r--patches.drivers/0010-hpsa-update-copyright-information.patch80
-rw-r--r--series.conf17
16 files changed, 1367 insertions, 0 deletions
diff --git a/patches.drivers/0001-snic-add-scsi-host-after-determining-max-ios.patch b/patches.drivers/0001-snic-add-scsi-host-after-determining-max-ios.patch
new file mode 100644
index 0000000000..226788b7e4
--- /dev/null
+++ b/patches.drivers/0001-snic-add-scsi-host-after-determining-max-ios.patch
@@ -0,0 +1,90 @@
+From: Narsimhulu Musini <nmusini@cisco.com>
+Date: Thu, 17 Mar 2016 00:51:16 -0700
+Subject: snic: add scsi host after determining max IOs.
+Git-commit: be2a266d2a163a332666f396ea128a6bcc6882f7
+Patch-mainline: v4.7 or v4.6-rc5 (next release)
+References: FATE#319760, bsc#964943
+
+scsi host is added after negotiating the max number of IOs with
+Firmware.
+
+Signed-off-by: Narsimhulu Musini <nmusini@cisco.com>
+Signed-off-by: Sesidhar Baddela <sebaddel@cisco.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Acked-by: Johannes Thumshirn <jthumshirn@suse.com>
+---
+ drivers/scsi/snic/snic_main.c | 35 +++++++++++++++++------------------
+ 1 file changed, 17 insertions(+), 18 deletions(-)
+
+--- a/drivers/scsi/snic/snic_main.c
++++ b/drivers/scsi/snic/snic_main.c
+@@ -624,19 +624,6 @@ snic_probe(struct pci_dev *pdev, const s
+ goto err_free_tmreq_pool;
+ }
+
+- /*
+- * Initialization done with PCI system, hardware, firmware.
+- * Add shost to SCSI
+- */
+- ret = snic_add_host(shost, pdev);
+- if (ret) {
+- SNIC_HOST_ERR(shost,
+- "Adding scsi host Failed ... exiting. %d\n",
+- ret);
+-
+- goto err_notify_unset;
+- }
+-
+ spin_lock_irqsave(&snic_glob->snic_list_lock, flags);
+ list_add_tail(&snic->list, &snic_glob->snic_list);
+ spin_unlock_irqrestore(&snic_glob->snic_list_lock, flags);
+@@ -669,8 +656,6 @@ snic_probe(struct pci_dev *pdev, const s
+ for (i = 0; i < snic->intr_count; i++)
+ svnic_intr_unmask(&snic->intr[i]);
+
+- snic_set_state(snic, SNIC_ONLINE);
+-
+ /* Get snic params */
+ ret = snic_get_conf(snic);
+ if (ret) {
+@@ -681,6 +666,21 @@ snic_probe(struct pci_dev *pdev, const s
+ goto err_get_conf;
+ }
+
++ /*
++ * Initialization done with PCI system, hardware, firmware.
++ * Add shost to SCSI
++ */
++ ret = snic_add_host(shost, pdev);
++ if (ret) {
++ SNIC_HOST_ERR(shost,
++ "Adding scsi host Failed ... exiting. %d\n",
++ ret);
++
++ goto err_get_conf;
++ }
++
++ snic_set_state(snic, SNIC_ONLINE);
++
+ ret = snic_disc_start(snic);
+ if (ret) {
+ SNIC_HOST_ERR(shost, "snic_probe:Discovery Failed w err = %d\n",
+@@ -705,6 +705,8 @@ err_req_intr:
+ svnic_dev_disable(snic->vdev);
+
+ err_vdev_enable:
++ svnic_dev_notify_unset(snic->vdev);
++
+ for (i = 0; i < snic->wq_count; i++) {
+ int rc = 0;
+
+@@ -718,9 +720,6 @@ err_vdev_enable:
+ }
+ snic_del_host(snic->shost);
+
+-err_notify_unset:
+- svnic_dev_notify_unset(snic->vdev);
+-
+ err_free_tmreq_pool:
+ mempool_destroy(snic->req_pool[SNIC_REQ_TM_CACHE]);
+
diff --git a/patches.drivers/0002-snic-fixing-race-in-the-hba-reset-and-io-tm-completion.patch b/patches.drivers/0002-snic-fixing-race-in-the-hba-reset-and-io-tm-completion.patch
new file mode 100644
index 0000000000..33e70ec35f
--- /dev/null
+++ b/patches.drivers/0002-snic-fixing-race-in-the-hba-reset-and-io-tm-completion.patch
@@ -0,0 +1,71 @@
+From: Narsimhulu Musini <nmusini@cisco.com>
+Date: Thu, 17 Mar 2016 00:51:15 -0700
+Subject: snic: Fixing race in the hba reset and IO/TM completion
+Git-commit: 0da8519b2b1f08113cda65af88a4c9e35157dd53
+Patch-mainline: v4.7 or v4.6-rc5 (next release)
+References: FATE#319760, bsc#964943
+
+While HBA reset is in progress, if IO/TM completion is received for the
+same IO then IO/TM completion path releases the driver private resources
+associated with IO. This fix prevents releasing the resources in
+IO and TM completion path if HBA reset is in progress.
+
+Signed-off-by: Narsimhulu Musini <nmusini@cisco.com>
+Signed-off-by: Sesidhar Baddela <sebaddel@cisco.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Acked-by: Johannes Thumshirn <jthumshirn@suse.com>
+---
+ drivers/scsi/snic/snic.h | 5 ++++-
+ drivers/scsi/snic/snic_scsi.c | 11 +++++++++++
+ 2 files changed, 15 insertions(+), 1 deletion(-)
+
+--- a/drivers/scsi/snic/snic.h
++++ b/drivers/scsi/snic/snic.h
+@@ -95,6 +95,8 @@
+ #define SNIC_DEV_RST_NOTSUP BIT(25)
+ #define SNIC_SCSI_CLEANUP BIT(26)
+ #define SNIC_HOST_RESET_ISSUED BIT(27)
++#define SNIC_HOST_RESET_CMD_TERM \
++ (SNIC_DEV_RST_NOTSUP | SNIC_SCSI_CLEANUP | SNIC_HOST_RESET_ISSUED)
+
+ #define SNIC_ABTS_TIMEOUT 30000 /* msec */
+ #define SNIC_LUN_RESET_TIMEOUT 30000 /* msec */
+@@ -216,9 +218,10 @@ enum snic_msix_intr_index {
+ SNIC_MSIX_INTR_MAX,
+ };
+
++#define SNIC_INTRHDLR_NAMSZ (2 * IFNAMSIZ)
+ struct snic_msix_entry {
+ int requested;
+- char devname[IFNAMSIZ];
++ char devname[SNIC_INTRHDLR_NAMSZ];
+ irqreturn_t (*isr)(int, void *);
+ void *devid;
+ };
+--- a/drivers/scsi/snic/snic_scsi.c
++++ b/drivers/scsi/snic/snic_scsi.c
+@@ -598,6 +598,12 @@ snic_icmnd_cmpl_handler(struct snic *sni
+ sc->device->lun, sc, sc->cmnd[0], snic_cmd_tag(sc),
+ CMD_FLAGS(sc), rqi);
+
++ if (CMD_FLAGS(sc) & SNIC_HOST_RESET_CMD_TERM) {
++ spin_unlock_irqrestore(io_lock, flags);
++
++ return;
++ }
++
+ SNIC_BUG_ON(rqi != (struct snic_req_info *)ctx);
+ WARN_ON_ONCE(req);
+ if (!rqi) {
+@@ -779,6 +785,11 @@ snic_process_itmf_cmpl(struct snic *snic
+
+ io_lock = snic_io_lock_hash(snic, sc);
+ spin_lock_irqsave(io_lock, flags);
++ if (CMD_FLAGS(sc) & SNIC_HOST_RESET_CMD_TERM) {
++ spin_unlock_irqrestore(io_lock, flags);
++
++ return ret;
++ }
+ rqi = (struct snic_req_info *) CMD_SP(sc);
+ WARN_ON_ONCE(!rqi);
+
diff --git a/patches.drivers/0003-snic-fix-for-missing-interrupts.patch b/patches.drivers/0003-snic-fix-for-missing-interrupts.patch
new file mode 100644
index 0000000000..93478f4a92
--- /dev/null
+++ b/patches.drivers/0003-snic-fix-for-missing-interrupts.patch
@@ -0,0 +1,166 @@
+From: Narsimhulu Musini <nmusini@cisco.com>
+Date: Thu, 17 Mar 2016 00:51:14 -0700
+Subject: snic: Fix for missing interrupts
+Git-commit: c9747821f9bbff6c07fa36087b003d89d05245c8
+Patch-mainline: v4.7 or v4.6-rc5 (next release)
+References: FATE#319760, bsc#964943
+
+- On posting an IO to the firmware, adapter generates an interrupt.
+ Due to hardware issues, sometimes the adapter fails to generate
+ the interrupt. This behavior skips updating transmit queue-
+ counters, which in turn causes the queue full condition. The fix
+ addresses the queue full condition.
+
+- The fix also reserves a slot in transmit queue for hba reset.
+ when queue full is observed during IO, there will always be room
+ to post hba reset command.
+
+Signed-off-by: Narsimhulu Musini <nmusini@cisco.com>
+Signed-off-by: Sesidhar Baddela <sebaddel@cisco.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Acked-by: Johannes Thumshirn <jthumshirn@suse.com>
+---
+ drivers/scsi/snic/snic_fwint.h | 4 ++-
+ drivers/scsi/snic/snic_io.c | 62 ++++++++++++++++++++++++++++++++++++++----
+ 2 files changed, 59 insertions(+), 7 deletions(-)
+
+diff --git a/drivers/scsi/snic/snic_fwint.h b/drivers/scsi/snic/snic_fwint.h
+index 2cfaf2d..c5f9e19 100644
+--- a/drivers/scsi/snic/snic_fwint.h
++++ b/drivers/scsi/snic/snic_fwint.h
+@@ -414,7 +414,7 @@ enum snic_ev_type {
+ /* Payload 88 bytes = 128 - 24 - 16 */
+ #define SNIC_HOST_REQ_PAYLOAD ((int)(SNIC_HOST_REQ_LEN - \
+ sizeof(struct snic_io_hdr) - \
+- (2 * sizeof(u64))))
++ (2 * sizeof(u64)) - sizeof(ulong)))
+
+ /*
+ * snic_host_req: host -> firmware request
+@@ -448,6 +448,8 @@ struct snic_host_req {
+ /* hba reset */
+ struct snic_hba_reset reset;
+ } u;
++
++ ulong req_pa;
+ }; /* end of snic_host_req structure */
+
+
+diff --git a/drivers/scsi/snic/snic_io.c b/drivers/scsi/snic/snic_io.c
+index 993db7d..8e69548 100644
+--- a/drivers/scsi/snic/snic_io.c
++++ b/drivers/scsi/snic/snic_io.c
+@@ -48,7 +48,7 @@ snic_wq_cmpl_frame_send(struct vnic_wq *wq,
+ SNIC_TRC(snic->shost->host_no, 0, 0,
+ ((ulong)(buf->os_buf) - sizeof(struct snic_req_info)), 0, 0,
+ 0);
+- pci_unmap_single(snic->pdev, buf->dma_addr, buf->len, PCI_DMA_TODEVICE);
++
+ buf->os_buf = NULL;
+ }
+
+@@ -137,13 +137,36 @@ snic_select_wq(struct snic *snic)
+ return 0;
+ }
+
++static int
++snic_wqdesc_avail(struct snic *snic, int q_num, int req_type)
++{
++ int nr_wqdesc = snic->config.wq_enet_desc_count;
++
++ if (q_num > 0) {
++ /*
++ * Multi Queue case, additional care is required.
++ * Per WQ active requests need to be maintained.
++ */
++ SNIC_HOST_INFO(snic->shost, "desc_avail: Multi Queue case.\n");
++ SNIC_BUG_ON(q_num > 0);
++
++ return -1;
++ }
++
++ nr_wqdesc -= atomic64_read(&snic->s_stats.fw.actv_reqs);
++
++ return ((req_type == SNIC_REQ_HBA_RESET) ? nr_wqdesc : nr_wqdesc - 1);
++}
++
+ int
+ snic_queue_wq_desc(struct snic *snic, void *os_buf, u16 len)
+ {
+ dma_addr_t pa = 0;
+ unsigned long flags;
+ struct snic_fw_stats *fwstats = &snic->s_stats.fw;
++ struct snic_host_req *req = (struct snic_host_req *) os_buf;
+ long act_reqs;
++ long desc_avail = 0;
+ int q_num = 0;
+
+ snic_print_desc(__func__, os_buf, len);
+@@ -156,11 +179,15 @@ snic_queue_wq_desc(struct snic *snic, void *os_buf, u16 len)
+ return -ENOMEM;
+ }
+
++ req->req_pa = (ulong)pa;
++
+ q_num = snic_select_wq(snic);
+
+ spin_lock_irqsave(&snic->wq_lock[q_num], flags);
+- if (!svnic_wq_desc_avail(snic->wq)) {
++ desc_avail = snic_wqdesc_avail(snic, q_num, req->hdr.type);
++ if (desc_avail <= 0) {
+ pci_unmap_single(snic->pdev, pa, len, PCI_DMA_TODEVICE);
++ req->req_pa = 0;
+ spin_unlock_irqrestore(&snic->wq_lock[q_num], flags);
+ atomic64_inc(&snic->s_stats.misc.wq_alloc_fail);
+ SNIC_DBG("host = %d, WQ is Full\n", snic->shost->host_no);
+@@ -169,10 +196,13 @@ snic_queue_wq_desc(struct snic *snic, void *os_buf, u16 len)
+ }
+
+ snic_queue_wq_eth_desc(&snic->wq[q_num], os_buf, pa, len, 0, 0, 1);
++ /*
++ * Update stats
++ * note: when multi queue enabled, fw actv_reqs should be per queue.
++ */
++ act_reqs = atomic64_inc_return(&fwstats->actv_reqs);
+ spin_unlock_irqrestore(&snic->wq_lock[q_num], flags);
+
+- /* Update stats */
+- act_reqs = atomic64_inc_return(&fwstats->actv_reqs);
+ if (act_reqs > atomic64_read(&fwstats->max_actv_reqs))
+ atomic64_set(&fwstats->max_actv_reqs, act_reqs);
+
+@@ -318,11 +348,31 @@ snic_req_free(struct snic *snic, struct snic_req_info *rqi)
+ "Req_free:rqi %p:ioreq %p:abt %p:dr %p\n",
+ rqi, rqi->req, rqi->abort_req, rqi->dr_req);
+
+- if (rqi->abort_req)
++ if (rqi->abort_req) {
++ if (rqi->abort_req->req_pa)
++ pci_unmap_single(snic->pdev,
++ rqi->abort_req->req_pa,
++ sizeof(struct snic_host_req),
++ PCI_DMA_TODEVICE);
++
+ mempool_free(rqi->abort_req, snic->req_pool[SNIC_REQ_TM_CACHE]);
++ }
++
++ if (rqi->dr_req) {
++ if (rqi->dr_req->req_pa)
++ pci_unmap_single(snic->pdev,
++ rqi->dr_req->req_pa,
++ sizeof(struct snic_host_req),
++ PCI_DMA_TODEVICE);
+
+- if (rqi->dr_req)
+ mempool_free(rqi->dr_req, snic->req_pool[SNIC_REQ_TM_CACHE]);
++ }
++
++ if (rqi->req->req_pa)
++ pci_unmap_single(snic->pdev,
++ rqi->req->req_pa,
++ rqi->req_len,
++ PCI_DMA_TODEVICE);
+
+ mempool_free(rqi, snic->req_pool[rqi->rq_pool_type]);
+ }
+
diff --git a/patches.drivers/0004-hpsa-do-not-get-enclosure-info-for-external-devices.patch b/patches.drivers/0004-hpsa-do-not-get-enclosure-info-for-external-devices.patch
new file mode 100644
index 0000000000..ed5aecd0a4
--- /dev/null
+++ b/patches.drivers/0004-hpsa-do-not-get-enclosure-info-for-external-devices.patch
@@ -0,0 +1,49 @@
+From: Don Brace <don.brace@microsemi.com>
+Date: Tue, 23 Feb 2016 15:16:09 -0600
+Subject: hpsa: do not get enclosure info for external devices
+Git-commit: 17a9e54a99e68feb083b5ea0e6843686b7b327b8
+Patch-mainline: v4.6-rc1
+References: FATE#319992, bsc#972413
+
+Stop annoying "Error, could not get enclosure information"
+messages.
+
+Reviewed-by: Mahesh Rajashekhara <mahesh.rajashekhara@microsemi.com>
+Reviewed-by: Justin Lindley <justin.lindley@microsemi.com>
+Reviewed-by: Scott Teel <scott.teel@microsemi.com>
+Reviewed-by: Kevin Barnett <kevin.barnett@microsemi.com>
+Reviewed-by: Matthew R. Ochs <mrochs@linux.vnet.ibm.com>
+Signed-off-by: Don Brace <don.brace@microsemi.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Acked-by: Johannes Thumshirn <jthumshirn@suse.com>
+---
+ drivers/scsi/hpsa.c | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/scsi/hpsa.c b/drivers/scsi/hpsa.c
+index 38ce0e3..098e8de 100644
+--- a/drivers/scsi/hpsa.c
++++ b/drivers/scsi/hpsa.c
+@@ -3208,8 +3208,10 @@ static void hpsa_get_enclosure_info(struct ctlr_info *h,
+
+ bmic_device_index = GET_BMIC_DRIVE_NUMBER(&rle->lunid[0]);
+
+- if (bmic_device_index == 0xFF00)
++ if (bmic_device_index == 0xFF00 || MASKED_DEVICE(&rle->lunid[0])) {
++ rc = IO_OK;
+ goto out;
++ }
+
+ bssbp = kzalloc(sizeof(*bssbp), GFP_KERNEL);
+ if (!bssbp)
+@@ -4197,7 +4199,8 @@ static void hpsa_update_scsi_devices(struct ctlr_info *h)
+ ncurrent++;
+ break;
+ case TYPE_ENCLOSURE:
+- hpsa_get_enclosure_info(h, lunaddrbytes,
++ if (!this_device->external)
++ hpsa_get_enclosure_info(h, lunaddrbytes,
+ physdev_list, phys_dev_index,
+ this_device);
+ ncurrent++;
+
diff --git a/patches.drivers/0004-snic-target-cleanup-in-driver-unload-path.patch b/patches.drivers/0004-snic-target-cleanup-in-driver-unload-path.patch
new file mode 100644
index 0000000000..cc00a69c26
--- /dev/null
+++ b/patches.drivers/0004-snic-target-cleanup-in-driver-unload-path.patch
@@ -0,0 +1,63 @@
+From: Narsimhulu Musini <nmusini@cisco.com>
+Date: Thu, 17 Mar 2016 00:51:13 -0700
+Subject: snic: target cleanup in driver unload path
+Git-commit: 58fcf92050cdf7b499ba6169459ec43aa0838662
+Patch-mainline: v4.7 or v4.6-rc5 (next release)
+References: FATE#319760, bsc#964943
+
+Fix deletes the snic targets synchronously prior to deletion of host.
+
+Signed-off-by: Narsimhulu Musini <nmusini@cisco.com>
+Signed-off-by: Sesidhar Baddela <sebaddel@cisco.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Acked-by: Johannes Thumshirn <jthumshirn@suse.com>
+---
+ drivers/scsi/snic/snic_disc.c | 17 +++++++++++++++--
+ 1 file changed, 15 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/scsi/snic/snic_disc.c b/drivers/scsi/snic/snic_disc.c
+index 5f48795..b0fefd6 100644
+--- a/drivers/scsi/snic/snic_disc.c
++++ b/drivers/scsi/snic/snic_disc.c
+@@ -480,10 +480,21 @@ int
+ snic_disc_start(struct snic *snic)
+ {
+ struct snic_disc *disc = &snic->disc;
++ unsigned long flags;
+ int ret = 0;
+
+ SNIC_SCSI_DBG(snic->shost, "Discovery Start.\n");
+
++ spin_lock_irqsave(&snic->snic_lock, flags);
++ if (snic->in_remove) {
++ spin_unlock_irqrestore(&snic->snic_lock, flags);
++ SNIC_ERR("snic driver removal in progress ...\n");
++ ret = 0;
++
++ return ret;
++ }
++ spin_unlock_irqrestore(&snic->snic_lock, flags);
++
+ mutex_lock(&disc->mutex);
+ if (disc->state == SNIC_DISC_PENDING) {
+ disc->req_cnt++;
+@@ -533,6 +544,8 @@ snic_tgt_del_all(struct snic *snic)
+ struct list_head *cur, *nxt;
+ unsigned long flags;
+
++ scsi_flush_work(snic->shost);
++
+ mutex_lock(&snic->disc.mutex);
+ spin_lock_irqsave(snic->shost->host_lock, flags);
+
+@@ -545,7 +558,7 @@ snic_tgt_del_all(struct snic *snic)
+ tgt = NULL;
+ }
+ spin_unlock_irqrestore(snic->shost->host_lock, flags);
+-
+- scsi_flush_work(snic->shost);
+ mutex_unlock(&snic->disc.mutex);
++
++ flush_workqueue(snic_glob->event_q);
+ } /* end of snic_tgt_del_all */
+
diff --git a/patches.drivers/0005-hpsa-add-smr-drive-support.patch b/patches.drivers/0005-hpsa-add-smr-drive-support.patch
new file mode 100644
index 0000000000..cf1141fbe2
--- /dev/null
+++ b/patches.drivers/0005-hpsa-add-smr-drive-support.patch
@@ -0,0 +1,78 @@
+From: Don Brace <don.brace@microsemi.com>
+Date: Tue, 23 Feb 2016 15:16:15 -0600
+Subject: hpsa: add SMR drive support
+Git-commit: af15ed36453197983702eebe8cff1fc52ae5e7ce
+Patch-mainline: v4.6-rc1
+References: FATE#319992, bsc#972413
+
+Reviewed-by: Mahesh Rajashekhara <mahesh.rajashekhara@microsemi.com>
+Reviewed-by: Justin Lindley <justin.lindley@microsemi.com>
+Reviewed-by: Scott Teel <scott.teel@microsemi.com>
+Reviewed-by: Kevin Barnett <kevin.barnett@microsemi.com>
+Reviewed-by: Matthew R. Ochs <mrochs@linux.vnet.ibm.com>
+Signed-off-by: Don Brace <don.brace@microsemi.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Acked-by: Johannes Thumshirn <jthumshirn@suse.com>
+---
+ drivers/scsi/hpsa.c | 12 ++++++++++--
+ 1 file changed, 10 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/scsi/hpsa.c b/drivers/scsi/hpsa.c
+index 098e8de..671ad57 100644
+--- a/drivers/scsi/hpsa.c
++++ b/drivers/scsi/hpsa.c
+@@ -809,7 +809,8 @@ static ssize_t path_info_show(struct device *dev,
+ PAGE_SIZE - output_len,
+ "PORT: %.2s ",
+ phys_connector);
+- if (hdev->devtype == TYPE_DISK && hdev->expose_device) {
++ if ((hdev->devtype == TYPE_DISK || hdev->devtype == TYPE_ZBC) &&
++ hdev->expose_device) {
+ if (box == 0 || box == 0xFF) {
+ output_len += scnprintf(buf + output_len,
+ PAGE_SIZE - output_len,
+@@ -1166,6 +1167,7 @@ static void hpsa_show_dev_msg(const char *level, struct ctlr_info *h,
+ snprintf(label, LABEL_SIZE, "enclosure");
+ break;
+ case TYPE_DISK:
++ case TYPE_ZBC:
+ if (dev->external)
+ snprintf(label, LABEL_SIZE, "external");
+ else if (!is_logical_dev_addr_mode(dev->scsi3addr))
+@@ -1636,6 +1638,8 @@ static void hpsa_figure_phys_disk_ptrs(struct ctlr_info *h,
+ continue;
+ if (dev[j]->devtype != TYPE_DISK)
+ continue;
++ if (dev[j]->devtype != TYPE_ZBC)
++ continue;
+ if (is_logical_device(dev[j]))
+ continue;
+ if (dev[j]->ioaccel_handle != dd[i].ioaccel_handle)
+@@ -1681,6 +1685,8 @@ static void hpsa_update_log_drive_phys_drive_ptrs(struct ctlr_info *h,
+ continue;
+ if (dev[i]->devtype != TYPE_DISK)
+ continue;
++ if (dev[i]->devtype != TYPE_ZBC)
++ continue;
+ if (!is_logical_device(dev[i]))
+ continue;
+
+@@ -3715,7 +3721,8 @@ static int hpsa_update_device_info(struct ctlr_info *h,
+ hpsa_get_device_id(h, scsi3addr, this_device->device_id, 8,
+ sizeof(this_device->device_id));
+
+- if (this_device->devtype == TYPE_DISK &&
++ if ((this_device->devtype == TYPE_DISK ||
++ this_device->devtype == TYPE_ZBC) &&
+ is_logical_dev_addr_mode(scsi3addr)) {
+ int volume_offline;
+
+@@ -4183,6 +4190,7 @@ static void hpsa_update_scsi_devices(struct ctlr_info *h)
+ ncurrent++;
+ break;
+ case TYPE_DISK:
++ case TYPE_ZBC:
+ if (this_device->physical_device) {
+ /* The disk is in HBA mode. */
+ /* Never use RAID mapper in HBA mode. */
+
diff --git a/patches.drivers/0005-snic-handling-control-path-queue-issues.patch b/patches.drivers/0005-snic-handling-control-path-queue-issues.patch
new file mode 100644
index 0000000000..64905d02e1
--- /dev/null
+++ b/patches.drivers/0005-snic-handling-control-path-queue-issues.patch
@@ -0,0 +1,102 @@
+From: Narsimhulu Musini <nmusini@cisco.com>
+Date: Thu, 17 Mar 2016 00:51:12 -0700
+Subject: snic: Handling control path queue issues
+Git-commit: 6e0ae74b5ca2826fa6c86a157ed5227c766156b9
+Patch-mainline: v4.7 or v4.6-rc5 (next release)
+References: FATE#319760, bsc#964943
+
+Fix handles control path queue issues such as queue full and sudden
+removal of hardware.
+
+Signed-off-by: Narsimhulu Musini <nmusini@cisco.com>
+Signed-off-by: Sesidhar Baddela <sebaddel@cisco.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Acked-by: Johannes Thumshirn <jthumshirn@suse.com>
+---
+ drivers/scsi/snic/vnic_dev.c | 44 ++++++++++++++++++++++++++++++--------------
+ 1 file changed, 30 insertions(+), 14 deletions(-)
+
+diff --git a/drivers/scsi/snic/vnic_dev.c b/drivers/scsi/snic/vnic_dev.c
+index e0b5549..dad5fc6 100644
+--- a/drivers/scsi/snic/vnic_dev.c
++++ b/drivers/scsi/snic/vnic_dev.c
+@@ -263,12 +263,20 @@ static int _svnic_dev_cmd2(struct vnic_dev *vdev, enum vnic_devcmd_cmd cmd,
+ int wait)
+ {
+ struct devcmd2_controller *dc2c = vdev->devcmd2;
+- struct devcmd2_result *result = dc2c->result + dc2c->next_result;
++ struct devcmd2_result *result = NULL;
+ unsigned int i;
+ int delay;
+ int err;
+ u32 posted;
++ u32 fetch_idx;
+ u32 new_posted;
++ u8 color;
++
++ fetch_idx = ioread32(&dc2c->wq_ctrl->fetch_index);
++ if (fetch_idx == 0xFFFFFFFF) { /* check for hardware gone */
++ /* Hardware surprise removal: return error */
++ return -ENODEV;
++ }
+
+ posted = ioread32(&dc2c->wq_ctrl->posted_index);
+
+@@ -278,6 +286,13 @@ static int _svnic_dev_cmd2(struct vnic_dev *vdev, enum vnic_devcmd_cmd cmd,
+ }
+
+ new_posted = (posted + 1) % DEVCMD2_RING_SIZE;
++ if (new_posted == fetch_idx) {
++ pr_err("%s: wq is full while issuing devcmd2 command %d, fetch index: %u, posted index: %u\n",
++ pci_name(vdev->pdev), _CMD_N(cmd), fetch_idx, posted);
++
++ return -EBUSY;
++ }
++
+ dc2c->cmd_ring[posted].cmd = cmd;
+ dc2c->cmd_ring[posted].flags = 0;
+
+@@ -299,14 +314,22 @@ static int _svnic_dev_cmd2(struct vnic_dev *vdev, enum vnic_devcmd_cmd cmd,
+ if (dc2c->cmd_ring[posted].flags & DEVCMD2_FNORESULT)
+ return 0;
+
++ result = dc2c->result + dc2c->next_result;
++ color = dc2c->color;
++
++ /*
++ * Increment next_result, after posting the devcmd, irrespective of
++ * devcmd result, and it should be done only once.
++ */
++ dc2c->next_result++;
++ if (dc2c->next_result == dc2c->result_size) {
++ dc2c->next_result = 0;
++ dc2c->color = dc2c->color ? 0 : 1;
++ }
++
+ for (delay = 0; delay < wait; delay++) {
+ udelay(100);
+- if (result->color == dc2c->color) {
+- dc2c->next_result++;
+- if (dc2c->next_result == dc2c->result_size) {
+- dc2c->next_result = 0;
+- dc2c->color = dc2c->color ? 0 : 1;
+- }
++ if (result->color == color) {
+ if (result->error) {
+ err = (int) result->error;
+ if (err != ERR_ECMDUNKNOWN ||
+@@ -317,13 +340,6 @@ static int _svnic_dev_cmd2(struct vnic_dev *vdev, enum vnic_devcmd_cmd cmd,
+ return err;
+ }
+ if (_CMD_DIR(cmd) & _CMD_DIR_READ) {
+- /*
+- * Adding the rmb() prevents the compiler
+- * and/or CPU from reordering the reads which
+- * would potentially result in reading stale
+- * values.
+- */
+- rmb();
+ for (i = 0; i < VNIC_DEVCMD_NARGS; i++)
+ vdev->args[i] = result->results[i];
+ }
+
diff --git a/patches.drivers/0006-hpsa-correct-abort-tmf-for-hba-devices.patch b/patches.drivers/0006-hpsa-correct-abort-tmf-for-hba-devices.patch
new file mode 100644
index 0000000000..e8088a13eb
--- /dev/null
+++ b/patches.drivers/0006-hpsa-correct-abort-tmf-for-hba-devices.patch
@@ -0,0 +1,64 @@
+From: Don Brace <don.brace@microsemi.com>
+Date: Tue, 23 Feb 2016 15:16:28 -0600
+Subject: hpsa: correct abort tmf for hba devices
+Git-commit: 39f3deb2bead8a3005130f641af11a78f14cdd28
+Patch-mainline: v4.6-rc1
+References: FATE#319992, bsc#972413
+
+Aborts were not being sent down to HBA devices
+
+Reviewed-by: Mahesh Rajashekhara <mahesh.rajashekhara@microsemi.com>
+Reviewed-by: Justin Lindley <justin.lindley@microsemi.com>
+Reviewed-by: Scott Teel <scott.teel@microsemi.com>
+Reviewed-by: Kevin Barnett <kevin.barnett@microsemi.com>
+Reviewed-by: Matthew R. Ochs <mrochs@linux.vnet.ibm.com>
+Signed-off-by: Don Brace <don.brace@microsemi.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Acked-by: Johannes Thumshirn <jthumshirn@suse.com>
+---
+ drivers/scsi/hpsa.c | 12 +++++++-----
+ 1 file changed, 7 insertions(+), 5 deletions(-)
+
+diff --git a/drivers/scsi/hpsa.c b/drivers/scsi/hpsa.c
+index 671ad57..589b44e 100644
+--- a/drivers/scsi/hpsa.c
++++ b/drivers/scsi/hpsa.c
+@@ -5846,7 +5846,7 @@ static int hpsa_send_abort_ioaccel2(struct ctlr_info *h,
+ }
+
+ static int hpsa_send_abort_both_ways(struct ctlr_info *h,
+- unsigned char *scsi3addr, struct CommandList *abort, int reply_queue)
++ struct hpsa_scsi_dev_t *dev, struct CommandList *abort, int reply_queue)
+ {
+ /*
+ * ioccelerator mode 2 commands should be aborted via the
+@@ -5855,14 +5855,16 @@ static int hpsa_send_abort_both_ways(struct ctlr_info *h,
+ * Change abort to physical device reset when abort TMF is unsupported.
+ */
+ if (abort->cmd_type == CMD_IOACCEL2) {
+- if (HPSATMF_IOACCEL_ENABLED & h->TMFSupportFlags)
++ if ((HPSATMF_IOACCEL_ENABLED & h->TMFSupportFlags) ||
++ dev->physical_device)
+ return hpsa_send_abort_ioaccel2(h, abort,
+ reply_queue);
+ else
+- return hpsa_send_reset_as_abort_ioaccel2(h, scsi3addr,
++ return hpsa_send_reset_as_abort_ioaccel2(h,
++ dev->scsi3addr,
+ abort, reply_queue);
+ }
+- return hpsa_send_abort(h, scsi3addr, abort, reply_queue);
++ return hpsa_send_abort(h, dev->scsi3addr, abort, reply_queue);
+ }
+
+ /* Find out which reply queue a command was meant to return on */
+@@ -6000,7 +6002,7 @@ static int hpsa_eh_abort_handler(struct scsi_cmnd *sc)
+ cmd_free(h, abort);
+ return FAILED;
+ }
+- rc = hpsa_send_abort_both_ways(h, dev->scsi3addr, abort, reply_queue);
++ rc = hpsa_send_abort_both_ways(h, dev, abort, reply_queue);
+ atomic_inc(&h->abort_cmds_available);
+ wake_up_all(&h->abort_cmd_wait_queue);
+ if (rc != 0) {
+
diff --git a/patches.drivers/0006-snic-lun-goes-offline-due-to-scsi-cmd-timeouts.patch b/patches.drivers/0006-snic-lun-goes-offline-due-to-scsi-cmd-timeouts.patch
new file mode 100644
index 0000000000..b041c19a2d
--- /dev/null
+++ b/patches.drivers/0006-snic-lun-goes-offline-due-to-scsi-cmd-timeouts.patch
@@ -0,0 +1,67 @@
+From: Narsimhulu Musini <nmusini@cisco.com>
+Date: Thu, 17 Mar 2016 00:51:11 -0700
+Subject: snic: LUN goes offline due to scsi cmd timeouts
+Git-commit: f352a0d5bafa62d1f0b044613ea42483a529f9df
+Patch-mainline: v4.7 or v4.6-rc5 (next release)
+References: FATE#319760, bsc#964943
+
+- LUN goes offline if there are at least two scsi command timeouts
+ Completing the IO with scsi_done() fixes the issue.
+
+Signed-off-by: Narsimhulu Musini <nmusini@cisco.com>
+Signed-off-by: Sesidhar Baddela <sebaddel@cisco.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Acked-by: Johannes Thumshirn <jthumshirn@suse.com>
+---
+ drivers/scsi/snic/snic_scsi.c | 18 ++++++++++++++++++
+ 1 file changed, 18 insertions(+)
+
+diff --git a/drivers/scsi/snic/snic_scsi.c b/drivers/scsi/snic/snic_scsi.c
+index e423eaa..5a709eb 100644
+--- a/drivers/scsi/snic/snic_scsi.c
++++ b/drivers/scsi/snic/snic_scsi.c
+@@ -1465,11 +1465,19 @@ snic_abort_finish(struct snic *snic, struct scsi_cmnd *sc)
+ case SNIC_STAT_IO_SUCCESS:
+ case SNIC_STAT_IO_NOT_FOUND:
+ ret = SUCCESS;
++ /*
++ * If abort path doesn't call scsi_done(),
++ * the # IO timeouts == 2, will cause the LUN offline.
++ * Call scsi_done to complete the IO.
++ */
++ sc->result = (DID_ERROR << 16);
++ sc->scsi_done(sc);
+ break;
+
+ default:
+ /* Firmware completed abort with error */
+ ret = FAILED;
++ rqi = NULL;
+ break;
+ }
+
+@@ -1842,6 +1850,9 @@ snic_dr_clean_single_req(struct snic *snic,
+
+ snic_release_req_buf(snic, rqi, sc);
+
++ sc->result = (DID_ERROR << 16);
++ sc->scsi_done(sc);
++
+ ret = 0;
+
+ return ret;
+@@ -2396,6 +2407,13 @@ snic_cmpl_pending_tmreq(struct snic *snic, struct scsi_cmnd *sc)
+ "Completing Pending TM Req sc %p, state %s flags 0x%llx\n",
+ sc, snic_io_status_to_str(CMD_STATE(sc)), CMD_FLAGS(sc));
+
++ /*
++ * CASE : FW didn't post itmf completion due to PCIe Errors.
++ * Marking the abort status as Success to call scsi completion
++ * in snic_abort_finish()
++ */
++ CMD_ABTS_STATUS(sc) = SNIC_STAT_IO_SUCCESS;
++
+ rqi = (struct snic_req_info *) CMD_SP(sc);
+ if (!rqi)
+ return;
+
diff --git a/patches.drivers/0007-hpsa-check-for-a-null-phys_disk-pointer-in-ioaccel2-path.patch b/patches.drivers/0007-hpsa-check-for-a-null-phys_disk-pointer-in-ioaccel2-path.patch
new file mode 100644
index 0000000000..0f6523ab7f
--- /dev/null
+++ b/patches.drivers/0007-hpsa-check-for-a-null-phys_disk-pointer-in-ioaccel2-path.patch
@@ -0,0 +1,39 @@
+From: Don Brace <don.brace@microsemi.com>
+Date: Tue, 23 Feb 2016 15:16:34 -0600
+Subject: hpsa: check for a null phys_disk pointer in ioaccel2 path
+Git-commit: c3390df4751177191b1691df2eba5e71af382d0b
+Patch-mainline: v4.6-rc1
+References: FATE#319992, bsc#972413
+
+An oops can occur when submitting ioaccel2 commands when the phys_disk
+pointer is NULL in hpsa_scsi_ioaccel_raid_map. Happens when there are
+configuration changes during I/O operations.
+
+If the phys_disk pointer is NULL, send the command down the RAID path.
+
+Reviewed-by: Mahesh Rajashekhara <mahesh.rajashekhara@microsemi.com>
+Reviewed-by: Justin Lindley <justin.lindley@microsemi.com>
+Reviewed-by: Scott Teel <scott.teel@microsemi.com>
+Reviewed-by: Kevin Barnett <kevin.barnett@microsemi.com>
+Reviewed-by: Matthew R. Ochs <mrochs@linux.vnet.ibm.com>
+Signed-off-by: Don Brace <don.brace@microsemi.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Acked-by: Johannes Thumshirn <jthumshirn@suse.com>
+---
+ drivers/scsi/hpsa.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/drivers/scsi/hpsa.c b/drivers/scsi/hpsa.c
+index 589b44e..edbecf8 100644
+--- a/drivers/scsi/hpsa.c
++++ b/drivers/scsi/hpsa.c
+@@ -4981,6 +4981,8 @@ static int hpsa_scsi_ioaccel_raid_map(struct ctlr_info *h,
+ return IO_ACCEL_INELIGIBLE;
+
+ c->phys_disk = dev->phys_disk[map_index];
++ if (!c->phys_disk)
++ return IO_ACCEL_INELIGIBLE;
+
+ disk_handle = dd[map_index].ioaccel_handle;
+ disk_block = le64_to_cpu(map->disk_starting_blk) +
+
diff --git a/patches.drivers/0007-snic-added-additional-stats.patch b/patches.drivers/0007-snic-added-additional-stats.patch
new file mode 100644
index 0000000000..1ab05d4e61
--- /dev/null
+++ b/patches.drivers/0007-snic-added-additional-stats.patch
@@ -0,0 +1,299 @@
+From: Narsimhulu Musini <nmusini@cisco.com>
+Date: Thu, 17 Mar 2016 00:51:10 -0700
+Subject: snic: Added additional stats
+Git-commit: 3f5c11a463fd87b912f16976ff0ee3d6bbd1825e
+Patch-mainline: v4.7 or v4.6-rc5 (next release)
+References: FATE#319760, bsc#964943
+
+Adding additional stats, and fixed logging messages.
+- Added qdepth change stats
+- Added separate isr stats for each type of interrupt
+- Fixed race in updating active IOs
+- Suppressed Link event message for DAS backend.
+
+Signed-off-by: Narsimhulu Musini <nmusini@cisco.com>
+Signed-off-by: Sesidhar Baddela <sebaddel@cisco.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Acked-by: Johannes Thumshirn <jthumshirn@suse.com>
+---
+ drivers/scsi/snic/snic_ctl.c | 8 +++-----
+ drivers/scsi/snic/snic_debugfs.c | 20 ++++++++++++++++----
+ drivers/scsi/snic/snic_isr.c | 6 +++---
+ drivers/scsi/snic/snic_main.c | 9 ++++++++-
+ drivers/scsi/snic/snic_scsi.c | 27 ++++++++++++++++++++-------
+ drivers/scsi/snic/snic_stats.h | 12 +++++++++---
+ 6 files changed, 59 insertions(+), 23 deletions(-)
+
+diff --git a/drivers/scsi/snic/snic_ctl.c b/drivers/scsi/snic/snic_ctl.c
+index ab0e06b..449b03f 100644
+--- a/drivers/scsi/snic/snic_ctl.c
++++ b/drivers/scsi/snic/snic_ctl.c
+@@ -39,17 +39,15 @@ snic_handle_link(struct work_struct *work)
+ {
+ struct snic *snic = container_of(work, struct snic, link_work);
+
+- if (snic->config.xpt_type != SNIC_DAS) {
+- SNIC_HOST_INFO(snic->shost, "Link Event Received.\n");
+- SNIC_ASSERT_NOT_IMPL(1);
+-
++ if (snic->config.xpt_type == SNIC_DAS)
+ return;
+- }
+
+ snic->link_status = svnic_dev_link_status(snic->vdev);
+ snic->link_down_cnt = svnic_dev_link_down_cnt(snic->vdev);
+ SNIC_HOST_INFO(snic->shost, "Link Event: Link %s.\n",
+ ((snic->link_status) ? "Up" : "Down"));
++
++ SNIC_ASSERT_NOT_IMPL(1);
+ }
+
+
+diff --git a/drivers/scsi/snic/snic_debugfs.c b/drivers/scsi/snic/snic_debugfs.c
+index 1686f01..d302803 100644
+--- a/drivers/scsi/snic/snic_debugfs.c
++++ b/drivers/scsi/snic/snic_debugfs.c
+@@ -264,12 +264,14 @@ snic_stats_show(struct seq_file *sfp, void *data)
+ "Aborts Fail : %lld\n"
+ "Aborts Driver Timeout : %lld\n"
+ "Abort FW Timeout : %lld\n"
+- "Abort IO NOT Found : %lld\n",
++ "Abort IO NOT Found : %lld\n"
++ "Abort Queuing Failed : %lld\n",
+ (u64) atomic64_read(&stats->abts.num),
+ (u64) atomic64_read(&stats->abts.fail),
+ (u64) atomic64_read(&stats->abts.drv_tmo),
+ (u64) atomic64_read(&stats->abts.fw_tmo),
+- (u64) atomic64_read(&stats->abts.io_not_found));
++ (u64) atomic64_read(&stats->abts.io_not_found),
++ (u64) atomic64_read(&stats->abts.q_fail));
+
+ /* Dump Reset Stats */
+ seq_printf(sfp,
+@@ -316,7 +318,9 @@ snic_stats_show(struct seq_file *sfp, void *data)
+ seq_printf(sfp,
+ "Last ISR Time : %llu (%8lu.%8lu)\n"
+ "Last Ack Time : %llu (%8lu.%8lu)\n"
+- "ISRs : %llu\n"
++ "Ack ISRs : %llu\n"
++ "IO Cmpl ISRs : %llu\n"
++ "Err Notify ISRs : %llu\n"
+ "Max CQ Entries : %lld\n"
+ "Data Count Mismatch : %lld\n"
+ "IOs w/ Timeout Status : %lld\n"
+@@ -324,12 +328,17 @@ snic_stats_show(struct seq_file *sfp, void *data)
+ "IOs w/ SGL Invalid Stat : %lld\n"
+ "WQ Desc Alloc Fail : %lld\n"
+ "Queue Full : %lld\n"
++ "Queue Ramp Up : %lld\n"
++ "Queue Ramp Down : %lld\n"
++ "Queue Last Queue Depth : %lld\n"
+ "Target Not Ready : %lld\n",
+ (u64) stats->misc.last_isr_time,
+ last_isr_tms.tv_sec, last_isr_tms.tv_nsec,
+ (u64)stats->misc.last_ack_time,
+ last_ack_tms.tv_sec, last_ack_tms.tv_nsec,
+- (u64) atomic64_read(&stats->misc.isr_cnt),
++ (u64) atomic64_read(&stats->misc.ack_isr_cnt),
++ (u64) atomic64_read(&stats->misc.cmpl_isr_cnt),
++ (u64) atomic64_read(&stats->misc.errnotify_isr_cnt),
+ (u64) atomic64_read(&stats->misc.max_cq_ents),
+ (u64) atomic64_read(&stats->misc.data_cnt_mismat),
+ (u64) atomic64_read(&stats->misc.io_tmo),
+@@ -337,6 +346,9 @@ snic_stats_show(struct seq_file *sfp, void *data)
+ (u64) atomic64_read(&stats->misc.sgl_inval),
+ (u64) atomic64_read(&stats->misc.wq_alloc_fail),
+ (u64) atomic64_read(&stats->misc.qfull),
++ (u64) atomic64_read(&stats->misc.qsz_rampup),
++ (u64) atomic64_read(&stats->misc.qsz_rampdown),
++ (u64) atomic64_read(&stats->misc.last_qsz),
+ (u64) atomic64_read(&stats->misc.tgt_not_rdy));
+
+ return 0;
+diff --git a/drivers/scsi/snic/snic_isr.c b/drivers/scsi/snic/snic_isr.c
+index a85fae2..f552003 100644
+--- a/drivers/scsi/snic/snic_isr.c
++++ b/drivers/scsi/snic/snic_isr.c
+@@ -38,7 +38,7 @@ snic_isr_msix_wq(int irq, void *data)
+ unsigned long wq_work_done = 0;
+
+ snic->s_stats.misc.last_isr_time = jiffies;
+- atomic64_inc(&snic->s_stats.misc.isr_cnt);
++ atomic64_inc(&snic->s_stats.misc.ack_isr_cnt);
+
+ wq_work_done = snic_wq_cmpl_handler(snic, -1);
+ svnic_intr_return_credits(&snic->intr[SNIC_MSIX_WQ],
+@@ -56,7 +56,7 @@ snic_isr_msix_io_cmpl(int irq, void *data)
+ unsigned long iocmpl_work_done = 0;
+
+ snic->s_stats.misc.last_isr_time = jiffies;
+- atomic64_inc(&snic->s_stats.misc.isr_cnt);
++ atomic64_inc(&snic->s_stats.misc.cmpl_isr_cnt);
+
+ iocmpl_work_done = snic_fwcq_cmpl_handler(snic, -1);
+ svnic_intr_return_credits(&snic->intr[SNIC_MSIX_IO_CMPL],
+@@ -73,7 +73,7 @@ snic_isr_msix_err_notify(int irq, void *data)
+ struct snic *snic = data;
+
+ snic->s_stats.misc.last_isr_time = jiffies;
+- atomic64_inc(&snic->s_stats.misc.isr_cnt);
++ atomic64_inc(&snic->s_stats.misc.errnotify_isr_cnt);
+
+ svnic_intr_return_all_credits(&snic->intr[SNIC_MSIX_ERR_NOTIFY]);
+ snic_log_q_error(snic);
+diff --git a/drivers/scsi/snic/snic_main.c b/drivers/scsi/snic/snic_main.c
+index 2b3c253..37ec507 100644
+--- a/drivers/scsi/snic/snic_main.c
++++ b/drivers/scsi/snic/snic_main.c
+@@ -98,11 +98,18 @@ snic_slave_configure(struct scsi_device *sdev)
+ static int
+ snic_change_queue_depth(struct scsi_device *sdev, int qdepth)
+ {
++ struct snic *snic = shost_priv(sdev->host);
+ int qsz = 0;
+
+ qsz = min_t(u32, qdepth, SNIC_MAX_QUEUE_DEPTH);
++ if (qsz < sdev->queue_depth)
++ atomic64_inc(&snic->s_stats.misc.qsz_rampdown);
++ else if (qsz > sdev->queue_depth)
++ atomic64_inc(&snic->s_stats.misc.qsz_rampup);
++
++ atomic64_set(&snic->s_stats.misc.last_qsz, sdev->queue_depth);
++
+ scsi_change_queue_depth(sdev, qsz);
+- SNIC_INFO("QDepth Changed to %d\n", sdev->queue_depth);
+
+ return sdev->queue_depth;
+ }
+diff --git a/drivers/scsi/snic/snic_scsi.c b/drivers/scsi/snic/snic_scsi.c
+index 2c7b4c3..e423eaa 100644
+--- a/drivers/scsi/snic/snic_scsi.c
++++ b/drivers/scsi/snic/snic_scsi.c
+@@ -221,11 +221,15 @@ snic_queue_icmnd_req(struct snic *snic,
+ pa, /* sense buffer pa */
+ SCSI_SENSE_BUFFERSIZE);
+
++ atomic64_inc(&snic->s_stats.io.active);
+ ret = snic_queue_wq_desc(snic, rqi->req, rqi->req_len);
+- if (ret)
++ if (ret) {
++ atomic64_dec(&snic->s_stats.io.active);
+ SNIC_HOST_ERR(snic->shost,
+ "QIcmnd: Queuing Icmnd Failed. ret = %d\n",
+ ret);
++ } else
++ snic_stats_update_active_ios(&snic->s_stats);
+
+ return ret;
+ } /* end of snic_queue_icmnd_req */
+@@ -361,8 +365,7 @@ snic_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *sc)
+ if (ret) {
+ SNIC_HOST_ERR(shost, "Failed to Q, Scsi Req w/ err %d.\n", ret);
+ ret = SCSI_MLQUEUE_HOST_BUSY;
+- } else
+- snic_stats_update_active_ios(&snic->s_stats);
++ }
+
+ atomic_dec(&snic->ios_inflight);
+
+@@ -1001,10 +1004,11 @@ snic_hba_reset_cmpl_handler(struct snic *snic, struct snic_fw_req *fwreq)
+ unsigned long flags, gflags;
+ int ret = 0;
+
++ snic_io_hdr_dec(&fwreq->hdr, &typ, &hdr_stat, &cmnd_id, &hid, &ctx);
+ SNIC_HOST_INFO(snic->shost,
+- "reset_cmpl:HBA Reset Completion received.\n");
++ "reset_cmpl:Tag %d ctx %lx cmpl status %s HBA Reset Completion received.\n",
++ cmnd_id, ctx, snic_io_status_to_str(hdr_stat));
+
+- snic_io_hdr_dec(&fwreq->hdr, &typ, &hdr_stat, &cmnd_id, &hid, &ctx);
+ SNIC_SCSI_DBG(snic->shost,
+ "reset_cmpl: type = %x, hdr_stat = %x, cmnd_id = %x, hid = %x, ctx = %lx\n",
+ typ, hdr_stat, cmnd_id, hid, ctx);
+@@ -1012,6 +1016,9 @@ snic_hba_reset_cmpl_handler(struct snic *snic, struct snic_fw_req *fwreq)
+ /* spl case, host reset issued through ioctl */
+ if (cmnd_id == SCSI_NO_TAG) {
+ rqi = (struct snic_req_info *) ctx;
++ SNIC_HOST_INFO(snic->shost,
++ "reset_cmpl:Tag %d ctx %lx cmpl stat %s\n",
++ cmnd_id, ctx, snic_io_status_to_str(hdr_stat));
+ sc = rqi->sc;
+
+ goto ioctl_hba_rst;
+@@ -1038,6 +1045,10 @@ ioctl_hba_rst:
+ return ret;
+ }
+
++ SNIC_HOST_INFO(snic->shost,
++ "reset_cmpl: sc %p rqi %p Tag %d flags 0x%llx\n",
++ sc, rqi, cmnd_id, CMD_FLAGS(sc));
++
+ io_lock = snic_io_lock_hash(snic, sc);
+ spin_lock_irqsave(io_lock, flags);
+
+@@ -1554,6 +1565,7 @@ snic_send_abort_and_wait(struct snic *snic, struct scsi_cmnd *sc)
+ /* Now Queue the abort command to firmware */
+ ret = snic_queue_abort_req(snic, rqi, sc, tmf);
+ if (ret) {
++ atomic64_inc(&snic->s_stats.abts.q_fail);
+ SNIC_HOST_ERR(snic->shost,
+ "send_abt_cmd: IO w/ Tag 0x%x fail w/ err %d flags 0x%llx\n",
+ tag, ret, CMD_FLAGS(sc));
+@@ -2459,8 +2471,9 @@ snic_scsi_cleanup(struct snic *snic, int ex_tag)
+ cleanup:
+ sc->result = DID_TRANSPORT_DISRUPTED << 16;
+ SNIC_HOST_INFO(snic->shost,
+- "sc_clean: DID_TRANSPORT_DISRUPTED for sc %p. rqi %p duration %llu msecs\n",
+- sc, rqi, (jiffies - st_time));
++ "sc_clean: DID_TRANSPORT_DISRUPTED for sc %p, Tag %d flags 0x%llx rqi %p duration %u msecs\n",
++ sc, sc->request->tag, CMD_FLAGS(sc), rqi,
++ jiffies_to_msecs(jiffies - st_time));
+
+ /* Update IO stats */
+ snic_stats_update_io_cmpl(&snic->s_stats);
+diff --git a/drivers/scsi/snic/snic_stats.h b/drivers/scsi/snic/snic_stats.h
+index 11e6148..fd1066b 100644
+--- a/drivers/scsi/snic/snic_stats.h
++++ b/drivers/scsi/snic/snic_stats.h
+@@ -42,6 +42,7 @@ struct snic_abort_stats {
+ atomic64_t drv_tmo; /* Abort Driver Timeouts */
+ atomic64_t fw_tmo; /* Abort Firmware Timeouts */
+ atomic64_t io_not_found;/* Abort IO Not Found */
++ atomic64_t q_fail; /* Abort Queuing Failed */
+ };
+
+ struct snic_reset_stats {
+@@ -69,7 +70,9 @@ struct snic_fw_stats {
+ struct snic_misc_stats {
+ u64 last_isr_time;
+ u64 last_ack_time;
+- atomic64_t isr_cnt;
++ atomic64_t ack_isr_cnt;
++ atomic64_t cmpl_isr_cnt;
++ atomic64_t errnotify_isr_cnt;
+ atomic64_t max_cq_ents; /* Max CQ Entries */
+ atomic64_t data_cnt_mismat; /* Data Count Mismatch */
+ atomic64_t io_tmo;
+@@ -81,6 +84,9 @@ struct snic_misc_stats {
+ atomic64_t no_icmnd_itmf_cmpls;
+ atomic64_t io_under_run;
+ atomic64_t qfull;
++ atomic64_t qsz_rampup;
++ atomic64_t qsz_rampdown;
++ atomic64_t last_qsz;
+ atomic64_t tgt_not_rdy;
+ };
+
+@@ -101,9 +107,9 @@ static inline void
+ snic_stats_update_active_ios(struct snic_stats *s_stats)
+ {
+ struct snic_io_stats *io = &s_stats->io;
+- u32 nr_active_ios;
++ int nr_active_ios;
+
+- nr_active_ios = atomic64_inc_return(&io->active);
++ nr_active_ios = atomic64_read(&io->active);
+ if (atomic64_read(&io->max_active) < nr_active_ios)
+ atomic64_set(&io->max_active, nr_active_ios);
+
+
diff --git a/patches.drivers/0008-scsi-export-function-scsi_scan-c-sanitize_inquiry_string.patch b/patches.drivers/0008-scsi-export-function-scsi_scan-c-sanitize_inquiry_string.patch
new file mode 100644
index 0000000000..5066fcaa79
--- /dev/null
+++ b/patches.drivers/0008-scsi-export-function-scsi_scan-c-sanitize_inquiry_string.patch
@@ -0,0 +1,85 @@
+From: Don Brace <don.brace@pmcs.com>
+Date: Wed, 27 Jan 2016 20:16:26 -0600
+Subject: scsi: Export function scsi_scan.c:sanitize_inquiry_string
+Git-commit: 3846470a1bd4eaaf321386db96772769d630f169
+Patch-mainline: v4.6-rc1
+References: FATE#319992, bsc#972413
+
+The hpsa driver uses this function to cleanup inquiry data. Our new pqi
+driver will also use this function. This function was copied into both
+drivers.
+
+This patch exports sanitize_inquiry_string so the hpsa and the pqi
+drivers can use this function directly.
+
+Suggested-by: Hannes Reinecke <hare@suse.de>
+Suggested-by: Matthew R. Ochs mrochs@linux.vnet.ibm.com
+Reviewed-by: Kevin Barnett <kevin.barnett@pmcs.com>
+Reviewed-by: Justin Lindley <justin.lindley@pmcs.com>
+Reviewed-by: Scott Teel <scott.teel@pmcs.com>
+Reviewed-by: Hannes Reinecke <hare@suse.de>
+Signed-off-by: Don Brace <don.brace@pmcs.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Acked-by: Johannes Thumshirn <jthumshirn@suse.com>
+---
+ drivers/scsi/scsi_scan.c | 12 +++++++-----
+ include/scsi/scsi_device.h | 1 +
+ 2 files changed, 8 insertions(+), 5 deletions(-)
+
+diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c
+index 6a82066..1f02e84 100644
+--- a/drivers/scsi/scsi_scan.c
++++ b/drivers/scsi/scsi_scan.c
+@@ -518,7 +518,8 @@ void scsi_target_reap(struct scsi_target *starget)
+ }
+
+ /**
+- * sanitize_inquiry_string - remove non-graphical chars from an INQUIRY result string
++ * scsi_sanitize_inquiry_string - remove non-graphical chars from an
++ * INQUIRY result string
+ * @s: INQUIRY result string to sanitize
+ * @len: length of the string
+ *
+@@ -531,7 +532,7 @@ void scsi_target_reap(struct scsi_target *starget)
+ * string terminator, so all the following characters are set to
+ * spaces.
+ **/
+-static void sanitize_inquiry_string(unsigned char *s, int len)
++void scsi_sanitize_inquiry_string(unsigned char *s, int len)
+ {
+ int terminated = 0;
+
+@@ -542,6 +543,7 @@ static void sanitize_inquiry_string(unsigned char *s, int len)
+ *s = ' ';
+ }
+ }
++EXPORT_SYMBOL(scsi_sanitize_inquiry_string);
+
+ /**
+ * scsi_probe_lun - probe a single LUN using a SCSI INQUIRY
+@@ -627,9 +629,9 @@ static int scsi_probe_lun(struct scsi_device *sdev, unsigned char *inq_result,
+ }
+
+ if (result == 0) {
+- sanitize_inquiry_string(&inq_result[8], 8);
+- sanitize_inquiry_string(&inq_result[16], 16);
+- sanitize_inquiry_string(&inq_result[32], 4);
++ scsi_sanitize_inquiry_string(&inq_result[8], 8);
++ scsi_sanitize_inquiry_string(&inq_result[16], 16);
++ scsi_sanitize_inquiry_string(&inq_result[32], 4);
+
+ response_len = inq_result[4] + 5;
+ if (response_len > 255)
+diff --git a/include/scsi/scsi_device.h b/include/scsi/scsi_device.h
+index f63a167..9173ab5a 100644
+--- a/include/scsi/scsi_device.h
++++ b/include/scsi/scsi_device.h
+@@ -397,6 +397,7 @@ extern void scsi_remove_target(struct device *);
+ extern const char *scsi_device_state_name(enum scsi_device_state);
+ extern int scsi_is_sdev_device(const struct device *);
+ extern int scsi_is_target_device(const struct device *);
++extern void scsi_sanitize_inquiry_string(unsigned char *s, int len);
+ extern int scsi_execute(struct scsi_device *sdev, const unsigned char *cmd,
+ int data_direction, void *buffer, unsigned bufflen,
+ unsigned char *sense, int timeout, int retries,
+
diff --git a/patches.drivers/0008-snic-correctly-check-for-array-overrun-on-overly-long-version-number.patch b/patches.drivers/0008-snic-correctly-check-for-array-overrun-on-overly-long-version-number.patch
new file mode 100644
index 0000000000..3484ffda72
--- /dev/null
+++ b/patches.drivers/0008-snic-correctly-check-for-array-overrun-on-overly-long-version-number.patch
@@ -0,0 +1,37 @@
+From: Colin Ian King <colin.king@canonical.com>
+Date: Thu, 25 Feb 2016 22:58:25 +0000
+Subject: snic: correctly check for array overrun on overly long version number
+Git-commit: bbb7bace0346d43da1bd27d809928f3d07bbd1e7
+Patch-mainline: v4.6-rc1
+References: FATE#319760, bsc#964943
+
+The snic version number is expected to be 4 decimals in the form like a
+netmask string with each number stored in an element in array v.
+However, there is an off-by-one check on the number of elements in v
+allowing one to pass a 5 decimal version number causing v[4] to be
+referenced, causing a buffer overrun. Fix the off-by-one error by
+comparing to i > 3 rather than 4.
+
+Signed-off-by: Colin Ian King <colin.king@canonical.com>
+Reviewed-by: Shane Seymour <shane.seymour@hpe.com>
+Reviewed-by: Ewan Milne <emilne@redhat.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Acked-by: Johannes Thumshirn <jthumshirn@suse.com>
+---
+ drivers/scsi/snic/snic_ctl.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/scsi/snic/snic_ctl.c b/drivers/scsi/snic/snic_ctl.c
+index aebe753..ab0e06b 100644
+--- a/drivers/scsi/snic/snic_ctl.c
++++ b/drivers/scsi/snic/snic_ctl.c
+@@ -75,7 +75,7 @@ snic_ver_enc(const char *s)
+ continue;
+ }
+
+- if (i > 4 || !isdigit(c))
++ if (i > 3 || !isdigit(c))
+ goto end;
+
+ v[i] = v[i] * 10 + (c - '0');
+
diff --git a/patches.drivers/0009-hpsa-remove-function-definition-for-sanitize_inquiry_string.patch b/patches.drivers/0009-hpsa-remove-function-definition-for-sanitize_inquiry_string.patch
new file mode 100644
index 0000000000..21facc100c
--- /dev/null
+++ b/patches.drivers/0009-hpsa-remove-function-definition-for-sanitize_inquiry_string.patch
@@ -0,0 +1,60 @@
+From: Don Brace <don.brace@microsemi.com>
+Date: Tue, 23 Feb 2016 15:16:40 -0600
+Subject: hpsa: remove function definition for sanitize_inquiry_string
+Git-commit: 4af61e4f54cd8fbfc803efff053bf3d564e0b81e
+Patch-mainline: v4.6-rc1
+References: FATE#319992, bsc#972413
+
+This patch depends on patch
+ - commit ac10a3e4ed64
+ ("Export function scsi_scan.c:sanitize_inquiry_string")
+
+Suggested-by: Hannes Reinecke <hare@suse.de>
+Suggested-by: Matthew R. Ochs mrochs@linux.vnet.ibm.com
+Reviewed-by: Mahesh Rajashekhara <mahesh.rajashekhara@microsemi.com>
+Reviewed-by: Justin Lindley <justin.lindley@microsemi.com>
+Reviewed-by: Scott Teel <scott.teel@microsemi.com>
+Reviewed-by: Kevin Barnett <kevin.barnett@microsemi.com>
+Reviewed-by: Matthew R. Ochs <mrochs@linux.vnet.ibm.com>
+Signed-off-by: Don Brace <don.brace@microsemi.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Acked-by: Johannes Thumshirn <jthumshirn@suse.com>
+---
+ drivers/scsi/hpsa.c | 16 ++--------------
+ 1 file changed, 2 insertions(+), 14 deletions(-)
+
+diff --git a/drivers/scsi/hpsa.c b/drivers/scsi/hpsa.c
+index edbecf8..725eb8d 100644
+--- a/drivers/scsi/hpsa.c
++++ b/drivers/scsi/hpsa.c
+@@ -3665,18 +3665,6 @@ static int hpsa_device_supports_aborts(struct ctlr_info *h,
+ return rc;
+ }
+
+-static void sanitize_inquiry_string(unsigned char *s, int len)
+-{
+- bool terminated = false;
+-
+- for (; len > 0; (--len, ++s)) {
+- if (*s == 0)
+- terminated = true;
+- if (terminated || *s < 0x20 || *s > 0x7e)
+- *s = ' ';
+- }
+-}
+-
+ static int hpsa_update_device_info(struct ctlr_info *h,
+ unsigned char scsi3addr[], struct hpsa_scsi_dev_t *this_device,
+ unsigned char *is_OBDR_device)
+@@ -3707,8 +3695,8 @@ static int hpsa_update_device_info(struct ctlr_info *h,
+ goto bail_out;
+ }
+
+- sanitize_inquiry_string(&inq_buff[8], 8);
+- sanitize_inquiry_string(&inq_buff[16], 16);
++ scsi_sanitize_inquiry_string(&inq_buff[8], 8);
++ scsi_sanitize_inquiry_string(&inq_buff[16], 16);
+
+ this_device->devtype = (inq_buff[0] & 0x1f);
+ memcpy(this_device->scsi3addr, scsi3addr, 8);
+
diff --git a/patches.drivers/0010-hpsa-update-copyright-information.patch b/patches.drivers/0010-hpsa-update-copyright-information.patch
new file mode 100644
index 0000000000..ca86f3d9d5
--- /dev/null
+++ b/patches.drivers/0010-hpsa-update-copyright-information.patch
@@ -0,0 +1,80 @@
+From: Don Brace <don.brace@microsemi.com>
+Date: Tue, 23 Feb 2016 15:16:46 -0600
+Subject: hpsa: update copyright information
+Git-commit: 94c7bc3194cdf4f4e16d08c623f9eab278770d93
+Patch-mainline: v4.6-rc1
+References: FATE#319992, bsc#972413
+
+Reviewed-by: Justin Lindley <justin.lindley@microsemi.com>
+Reviewed-by: Kevin Barnett <kevin.barnett@microsemi.com>
+Reviewed-by: Matthew R. Ochs <mrochs@linux.vnet.ibm.com>
+Signed-off-by: Don Brace <don.brace@microsemi.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Acked-by: Johannes Thumshirn <jthumshirn@suse.com>
+---
+ drivers/scsi/hpsa.c | 3 ++-
+ drivers/scsi/hpsa.h | 3 ++-
+ drivers/scsi/hpsa_cmd.h | 3 ++-
+ 3 files changed, 6 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/scsi/hpsa.c b/drivers/scsi/hpsa.c
+index 725eb8d..5be944c 100644
+--- a/drivers/scsi/hpsa.c
++++ b/drivers/scsi/hpsa.c
+@@ -1,5 +1,6 @@
+ /*
+ * Disk Array driver for HP Smart Array SAS controllers
++ * Copyright 2016 Microsemi Corporation
+ * Copyright 2014-2015 PMC-Sierra, Inc.
+ * Copyright 2000,2009-2015 Hewlett-Packard Development Company, L.P.
+ *
+@@ -12,7 +13,7 @@
+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
+ * NON INFRINGEMENT. See the GNU General Public License for more details.
+ *
+- * Questions/Comments/Bugfixes to storagedev@pmcs.com
++ * Questions/Comments/Bugfixes to esc.storagedev@microsemi.com
+ *
+ */
+
+diff --git a/drivers/scsi/hpsa.h b/drivers/scsi/hpsa.h
+index fdd39fc..d06bb74 100644
+--- a/drivers/scsi/hpsa.h
++++ b/drivers/scsi/hpsa.h
+@@ -1,5 +1,6 @@
+ /*
+ * Disk Array driver for HP Smart Array SAS controllers
++ * Copyright 2016 Microsemi Corporation
+ * Copyright 2014-2015 PMC-Sierra, Inc.
+ * Copyright 2000,2009-2015 Hewlett-Packard Development Company, L.P.
+ *
+@@ -12,7 +13,7 @@
+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
+ * NON INFRINGEMENT. See the GNU General Public License for more details.
+ *
+- * Questions/Comments/Bugfixes to storagedev@pmcs.com
++ * Questions/Comments/Bugfixes to esc.storagedev@microsemi.com
+ *
+ */
+ #ifndef HPSA_H
+diff --git a/drivers/scsi/hpsa_cmd.h b/drivers/scsi/hpsa_cmd.h
+index dffda96..a5be153 100644
+--- a/drivers/scsi/hpsa_cmd.h
++++ b/drivers/scsi/hpsa_cmd.h
+@@ -1,5 +1,6 @@
+ /*
+ * Disk Array driver for HP Smart Array SAS controllers
++ * Copyright 2016 Microsemi Corporation
+ * Copyright 2014-2015 PMC-Sierra, Inc.
+ * Copyright 2000,2009-2015 Hewlett-Packard Development Company, L.P.
+ *
+@@ -12,7 +13,7 @@
+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
+ * NON INFRINGEMENT. See the GNU General Public License for more details.
+ *
+- * Questions/Comments/Bugfixes to storagedev@pmcs.com
++ * Questions/Comments/Bugfixes to esc.storagedev@microsemi.com
+ *
+ */
+ #ifndef HPSA_CMD_H
+
diff --git a/series.conf b/series.conf
index ac125ead51..589ce88d9c 100644
--- a/series.conf
+++ b/series.conf
@@ -1439,6 +1439,13 @@
patches.drivers/0001-hpsa-fix-path_info_show.patch
patches.drivers/0002-hpsa-change-sas-transport-devices-to-bus-0.patch
patches.drivers/0003-hpsa-add-box-and-bay-information-for-enclosure-devices.patch
+ patches.drivers/0004-hpsa-do-not-get-enclosure-info-for-external-devices.patch
+ patches.drivers/0005-hpsa-add-smr-drive-support.patch
+ patches.drivers/0006-hpsa-correct-abort-tmf-for-hba-devices.patch
+ patches.drivers/0007-hpsa-check-for-a-null-phys_disk-pointer-in-ioaccel2-path.patch
+ patches.drivers/0008-scsi-export-function-scsi_scan-c-sanitize_inquiry_string.patch
+ patches.drivers/0009-hpsa-remove-function-definition-for-sanitize_inquiry_string.patch
+ patches.drivers/0010-hpsa-update-copyright-information.patch
# qla2xxx backport (bsc#966328, FATE#320146)
patches.drivers/0001-qla2xxx-remove-unavailable-firmware-files.patch
@@ -1501,6 +1508,16 @@
patches.drivers/0002-Cleanup-the-I-O-pending-with-fw-and-has-timed-out-and-is-used-to-issue-LUN-reset.patch
patches.drivers/0003-Using-rport--dd_data-to-check-rport-online-instead-of-rport_lookup..patch
+ # snic backport (bsc#964943, FATE#319760)
+ patches.drivers/0001-snic-add-scsi-host-after-determining-max-ios.patch
+ patches.drivers/0002-snic-fixing-race-in-the-hba-reset-and-io-tm-completion.patch
+ patches.drivers/0003-snic-fix-for-missing-interrupts.patch
+ patches.drivers/0004-snic-target-cleanup-in-driver-unload-path.patch
+ patches.drivers/0005-snic-handling-control-path-queue-issues.patch
+ patches.drivers/0006-snic-lun-goes-offline-due-to-scsi-cmd-timeouts.patch
+ patches.drivers/0007-snic-added-additional-stats.patch
+ patches.drivers/0008-snic-correctly-check-for-array-overrun-on-overly-long-version-number.patch
+
# bsc#939926
patches.fixes/scsi-hosts-update-to-use-ida_simple-for-host_no-management