[PATCH 1/4] megaraid_sas: Fix calculation of target ID

2019-06-28 Thread Shivasharan S
In megasas_get_target_prop(), driver is incorrectly calculating the
target ID for devices with channel 1 and 3.
Due to this, firmware will either fail the command (if there is no
device with the target id sent from driver) or could return the
properties for a target which was not intended.
Devices could end up with the wrong queue depth due to this.

Fix target id calculation for channel 1 and 3.

Fixes: 96188a89cc6d ("scsi: megaraid_sas: NVME interface target prop added")
Cc: sta...@vger.kernel.org
Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas_base.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index b4c0bbc..9321878 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -6558,7 +6558,8 @@ megasas_get_target_prop(struct megasas_instance *instance,
int ret;
struct megasas_cmd *cmd;
struct megasas_dcmd_frame *dcmd;
-   u16 targetId = (sdev->channel % 2) + sdev->id;
+   u16 targetId = ((sdev->channel % 2) * MEGASAS_MAX_DEV_PER_CHANNEL) +
+   sdev->id;
 
cmd = megasas_get_cmd(instance);
 
-- 
2.9.5



[PATCH 2/4] megaraid_sas: Enable msix_load_balance for Invader and later controllers

2019-06-28 Thread Shivasharan S
Load balancing IO completions across all available MSI-X vectors should be
enabled for Invader and later generation controllers only.
This needs to be disabled for older controllers.
Add an adapter type check before setting msix_load_balance flag.

Fixes: 1d15d9098ad1 ("scsi: megaraid_sas: Load balance completions across all 
MSI-X")
Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas_base.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index 9321878..96b6510 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -5945,7 +5945,8 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
instance->is_rdpq = (scratch_pad_1 & 
MR_RDPQ_MODE_OFFSET) ?
1 : 0;
 
-   if (!instance->msix_combined) {
+   if (instance->adapter_type >= INVADER_SERIES &&
+   !instance->msix_combined) {
instance->msix_load_balance = true;
instance->smp_affinity_enable = false;
}
-- 
2.9.5



[PATCH 0/4] megaraid_sas: driver updates

2019-06-28 Thread Shivasharan S
Hi Martin,
This series contains four driver update patches.
The first patch contains a fix for calculating the target ID
sent to firmware. This patch was sent earlier as well[1], but
got lost in the v2 series due to a mail client issue.
Second patch enables newly added "msix_load_balance" flag
only for Invader and later generation controllers.
Third patch adds a module parameter which controls logging
of async event notifications from firmware.
Fourth patch updates the driver version.
Please consider these patches for 5.3/scsi-queue.

[1]: https://www.spinics.net/lists/stable/msg299673.html

Thanks,
Shivasharan
 
Shivasharan S (4):
  megaraid_sas: Fix calculation of target ID
  megaraid_sas: Enable msix_load_balance for Invader and later
controllers
  megaraid_sas: Add module parameter for FW Async event logging
  megaraid_sas: Update driver version to 07.710.50.00

 drivers/scsi/megaraid/megaraid_sas.h  |  4 ++--
 drivers/scsi/megaraid/megaraid_sas_base.c | 24 +---
 2 files changed, 23 insertions(+), 5 deletions(-)

-- 
2.9.5



[PATCH 4/4] megaraid_sas: Update driver version to 07.710.50.00

2019-06-28 Thread Shivasharan S
Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas.h | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas.h 
b/drivers/scsi/megaraid/megaraid_sas.h
index dc0f71f..a6037db 100644
--- a/drivers/scsi/megaraid/megaraid_sas.h
+++ b/drivers/scsi/megaraid/megaraid_sas.h
@@ -33,8 +33,8 @@
 /*
  * MegaRAID SAS Driver meta data
  */
-#define MEGASAS_VERSION"07.710.06.00-rc1"
-#define MEGASAS_RELDATE"June 18, 2019"
+#define MEGASAS_VERSION"07.710.50.00-rc1"
+#define MEGASAS_RELDATE"June 28, 2019"
 
 /*
  * Device IDs
-- 
2.9.5



[PATCH 3/4] megaraid_sas: Add module parameter for FW Async event logging

2019-06-28 Thread Shivasharan S
Add module parameter to control logging levels of async event notifications
from firmware that get logged to system log.
Also, allow changing the value from sysfs after driver load.

Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas_base.c | 18 +-
 1 file changed, 17 insertions(+), 1 deletion(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index 96b6510..4b3f2f80 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -117,6 +117,10 @@ MODULE_PARM_DESC(perf_mode, "Performance mode (only for 
Aero adapters), options:
"default mode is 'balanced'"
);
 
+int event_log_level = MFI_EVT_CLASS_CRITICAL;
+module_param(event_log_level, int, 0644);
+MODULE_PARM_DESC(event_log_level, "Asynchronous event logging level- range is: 
-2(CLASS_DEBUG) to 4(CLASS_DEAD), Default: 2(CLASS_CRITICAL)");
+
 MODULE_LICENSE("GPL");
 MODULE_VERSION(MEGASAS_VERSION);
 MODULE_AUTHOR("megaraidlinux@broadcom.com");
@@ -416,7 +420,13 @@ megasas_decode_evt(struct megasas_instance *instance)
union megasas_evt_class_locale class_locale;
class_locale.word = le32_to_cpu(evt_detail->cl.word);
 
-   if (class_locale.members.class >= MFI_EVT_CLASS_CRITICAL)
+   if ((event_log_level < MFI_EVT_CLASS_DEBUG) ||
+   (event_log_level > MFI_EVT_CLASS_DEAD)) {
+   printk(KERN_WARNING "megaraid_sas: provided event log level is 
out of range, setting it to default 2(CLASS_CRITICAL), permissible range is: -2 
to 4\n");
+   event_log_level = MFI_EVT_CLASS_CRITICAL;
+   }
+
+   if (class_locale.members.class >= event_log_level)
dev_info(&instance->pdev->dev, "%d (%s/0x%04x/%s) - %s\n",
le32_to_cpu(evt_detail->seq_num),
format_timestamp(le32_to_cpu(evt_detail->time_stamp)),
@@ -8762,6 +8772,12 @@ static int __init megasas_init(void)
goto err_pcidrv;
}
 
+   if ((event_log_level < MFI_EVT_CLASS_DEBUG) ||
+   (event_log_level > MFI_EVT_CLASS_DEAD)) {
+   printk(KERN_WARNING "megarid_sas: provided event log level is 
out of range, setting it to default 2(CLASS_CRITICAL), permissible range is: -2 
to 4\n");
+   event_log_level = MFI_EVT_CLASS_CRITICAL;
+   }
+
rval = driver_create_file(&megasas_pci_driver.driver,
  &driver_attr_version);
if (rval)
-- 
2.9.5



[PATCH v2 00/21] megaraid_sas: Driver updates

2019-05-07 Thread Shivasharan S
Update megaraid_sas to version 07.708.03.00.

The initial patch contains a cleanup of unused variable.
Next four patches contain driver fixes and enhancements.
Patch 6 introduces IRQ polling in megaraid_sas driver to fix
CPU hard/soft lockups that we have seen in the field.
Patch 7 adds load balancing of IO completions across the available
reply queues when combined MSIx mode is disabled in firmware.
Patch 8 onwards adds few enhancements to improve debuggability
of the driver by printing additional information and provding
a debugfs interface to help debug field issues better.

Changes in v2:
- Patch 2: updated applicable kernel versions in stable tag
- Patch 6: Fixed kbuild test robot reported sparse warning
- Patch 11: Fixed kbuild test robot reported sparse warning
- Patch 12: Fixed a sparse warning

Shivasharan S (21):
  megaraid_sas: remove unused variable target_index
  megaraid_sas: Fix calculation of target ID
  megaraid_sas: fw_reset_no_pci_access required for MFI adapters only
  megaraid_sas: rework code around controller reset
  megaraid_sas: Block PCI config space access from userspace during OCR
  megaraid_sas: IRQ poll to avoid CPU hard lockups
  megaraid_sas: Load balance completions across all MSIx
  megaraid_sas: Enhance prints in OCR and TM path
  megaraid_sas: Enhance internal DCMD timeout prints
  megaraid_sas: Add formatting option for megasas_dump
  megaraid_sas: Dump system interface regs from sysfs
  megaraid_sas: Dump system registers for debugging
  megaraid_sas: Print BAR information from driver
  megaraid_sas: Export RAID map id through sysfs
  megaraid_sas: Print FW fault information
  megaraid_sas: Print firmware interrupt status
  megaraid_sas: Add prints in suspend and resume path
  megaraid_sas: Add debug prints for device list
  megaraid_sas: Fix MSI-x vector print
  megaraid_sas: Export RAID map through debugfs
  megaraid_sas: Update driver version to 07.708.03.00

 drivers/scsi/megaraid/Kconfig.megaraid   |   1 +
 drivers/scsi/megaraid/Makefile   |   2 +-
 drivers/scsi/megaraid/megaraid_sas.h |  27 ++-
 drivers/scsi/megaraid/megaraid_sas_base.c| 338 +++
 drivers/scsi/megaraid/megaraid_sas_debugfs.c | 180 ++
 drivers/scsi/megaraid/megaraid_sas_fp.c  |   1 +
 drivers/scsi/megaraid/megaraid_sas_fusion.c  | 303 +---
 drivers/scsi/megaraid/megaraid_sas_fusion.h  |   6 +-
 8 files changed, 720 insertions(+), 138 deletions(-)
 create mode 100644 drivers/scsi/megaraid/megaraid_sas_debugfs.c

-- 
2.16.1



[PATCH v2 15/21] megaraid_sas: Print FW fault information

2019-05-07 Thread Shivasharan S
When driver detects a firmware fault during load, dump additional
information on fault code and subcode that will help in debugging.

Signed-off-by: Sumit Saxena 
Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas.h|  2 ++
 drivers/scsi/megaraid/megaraid_sas_base.c   |  5 -
 drivers/scsi/megaraid/megaraid_sas_fusion.c | 25 ++---
 3 files changed, 20 insertions(+), 12 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas.h 
b/drivers/scsi/megaraid/megaraid_sas.h
index 27980d68cf1b..8df6ef01785e 100644
--- a/drivers/scsi/megaraid/megaraid_sas.h
+++ b/drivers/scsi/megaraid/megaraid_sas.h
@@ -135,6 +135,8 @@
 #define MFI_RESET_ADAPTER  0x0002
 #define MEGAMFI_FRAME_SIZE 64
 
+#define MFI_STATE_FAULT_CODE   0x0FFF
+#define MFI_STATE_FAULT_SUBCODE0xFF00
 /*
  * During FW init, clear pending cmds & reset state using inbound_msg_0
  *
diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index c560d1e748f4..4689909fa66b 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -3919,7 +3919,10 @@ megasas_transition_to_ready(struct megasas_instance 
*instance, int ocr)
switch (fw_state) {
 
case MFI_STATE_FAULT:
-   dev_printk(KERN_DEBUG, &instance->pdev->dev, "FW in 
FAULT state!!\n");
+   dev_printk(KERN_ERR, &instance->pdev->dev,
+  "FW in FAULT state, Fault code:0x%x 
subcode:0x%x func:%s\n",
+  abs_state & MFI_STATE_FAULT_CODE,
+  abs_state & MFI_STATE_FAULT_SUBCODE, 
__func__);
if (ocr) {
max_wait = MEGASAS_RESET_WAIT_TIME;
cur_state = MFI_STATE_FAULT;
diff --git a/drivers/scsi/megaraid/megaraid_sas_fusion.c 
b/drivers/scsi/megaraid/megaraid_sas_fusion.c
index b4f798b458f0..4c78e4caf910 100644
--- a/drivers/scsi/megaraid/megaraid_sas_fusion.c
+++ b/drivers/scsi/megaraid/megaraid_sas_fusion.c
@@ -3984,7 +3984,7 @@ megasas_check_reset_fusion(struct megasas_instance 
*instance,
 static inline void megasas_trigger_snap_dump(struct megasas_instance *instance)
 {
int j;
-   u32 fw_state;
+   u32 fw_state, abs_state;
 
if (!instance->disableOnlineCtrlReset) {
dev_info(&instance->pdev->dev, "Trigger snap dump\n");
@@ -3994,11 +3994,13 @@ static inline void megasas_trigger_snap_dump(struct 
megasas_instance *instance)
}
 
for (j = 0; j < instance->snapdump_wait_time; j++) {
-   fw_state = instance->instancet->read_fw_status_reg(instance) &
-   MFI_STATE_MASK;
+   abs_state = instance->instancet->read_fw_status_reg(instance);
+   fw_state = abs_state & MFI_STATE_MASK;
if (fw_state == MFI_STATE_FAULT) {
-   dev_err(&instance->pdev->dev,
-   "Found FW in FAULT state, after snap dump 
trigger\n");
+   dev_printk(KERN_ERR, &instance->pdev->dev,
+  "FW in FAULT state Fault code:0x%x 
subcode:0x%x func:%s\n",
+  abs_state & MFI_STATE_FAULT_CODE,
+  abs_state & MFI_STATE_FAULT_SUBCODE, 
__func__);
return;
}
msleep(1000);
@@ -4010,7 +4012,7 @@ int megasas_wait_for_outstanding_fusion(struct 
megasas_instance *instance,
int reason, int *convert)
 {
int i, outstanding, retval = 0, hb_seconds_missed = 0;
-   u32 fw_state;
+   u32 fw_state, abs_state;
u32 waittime_for_io_completion;
 
waittime_for_io_completion =
@@ -4029,12 +4031,13 @@ int megasas_wait_for_outstanding_fusion(struct 
megasas_instance *instance,
 
for (i = 0; i < waittime_for_io_completion; i++) {
/* Check if firmware is in fault state */
-   fw_state = instance->instancet->read_fw_status_reg(instance) &
-   MFI_STATE_MASK;
+   abs_state = instance->instancet->read_fw_status_reg(instance);
+   fw_state = abs_state & MFI_STATE_MASK;
if (fw_state == MFI_STATE_FAULT) {
-   dev_warn(&instance->pdev->dev, "Found FW in FAULT 
state,"
-  " will reset adapter scsi%d.\n",
-   instance->host->host_no);
+   dev_printk(KERN_ERR, &instance->pdev-

[PATCH v2 06/21] megaraid_sas: IRQ poll to avoid CPU hard lockups

2019-05-07 Thread Shivasharan S
CPU hard lockups due to
voluntary exit from the reply queue processing based on budget.
Note - Only one MSI-x vector is busy doing processing.

Select CONFIG_IRQ_POLL from driver Kconfig for driver compilation.

Signed-off-by: Kashyap Desai 
Signed-off-by: Shivasharan S 
---
Changes in v2:
Make megasas_enable_irq_poll static as reported by kbuild test robot

 drivers/scsi/megaraid/Kconfig.megaraid  |   1 +
 drivers/scsi/megaraid/megaraid_sas.h|   5 ++
 drivers/scsi/megaraid/megaraid_sas_base.c   |  36 
 drivers/scsi/megaraid/megaraid_sas_fp.c |   1 +
 drivers/scsi/megaraid/megaraid_sas_fusion.c | 122 +---
 drivers/scsi/megaraid/megaraid_sas_fusion.h |   1 -
 6 files changed, 136 insertions(+), 30 deletions(-)

diff --git a/drivers/scsi/megaraid/Kconfig.megaraid 
b/drivers/scsi/megaraid/Kconfig.megaraid
index 17419e30ffc8..1fa9d095ae36 100644
--- a/drivers/scsi/megaraid/Kconfig.megaraid
+++ b/drivers/scsi/megaraid/Kconfig.megaraid
@@ -78,6 +78,7 @@ config MEGARAID_LEGACY
 config MEGARAID_SAS
tristate "LSI Logic MegaRAID SAS RAID Module"
depends on PCI && SCSI
+   select IRQ_POLL
help
Module for LSI Logic's SAS based RAID controllers.
To compile this driver as a module, choose 'm' here.
diff --git a/drivers/scsi/megaraid/megaraid_sas.h 
b/drivers/scsi/megaraid/megaraid_sas.h
index 990ee23d7bc2..8d6a9c511455 100644
--- a/drivers/scsi/megaraid/megaraid_sas.h
+++ b/drivers/scsi/megaraid/megaraid_sas.h
@@ -2173,6 +2173,9 @@ struct megasas_aen_event {
 struct megasas_irq_context {
struct megasas_instance *instance;
u32 MSIxIndex;
+   u32 os_irq;
+   struct irq_poll irqpoll;
+   bool irq_poll_scheduled;
 };
 
 struct MR_DRV_SYSTEM_INFO {
@@ -2303,6 +2306,7 @@ struct megasas_instance {
struct pci_dev *pdev;
u32 unique_id;
u32 fw_support_ieee;
+   u32 threshold_reply_count;
 
atomic_t fw_outstanding;
atomic_t ldio_outstanding;
@@ -2639,4 +2643,5 @@ void megasas_set_dma_settings(struct megasas_instance 
*instance,
 int megasas_adp_reset_wait_for_ready(struct megasas_instance *instance,
 bool do_adp_reset,
 int ocr_context);
+int megasas_irqpoll(struct irq_poll *irqpoll, int budget);
 #endif /*LSI_MEGARAID_SAS_H */
diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index 5e5170b40f6f..f7ffa72e9572 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -48,6 +48,7 @@
 #include 
 #include 
 #include 
+#include 
 
 #include 
 #include 
@@ -5272,6 +5273,25 @@ megasas_init_adapter_mfi(struct megasas_instance 
*instance)
return 1;
 }
 
+static
+void megasas_setup_irq_poll(struct megasas_instance *instance)
+{
+   struct megasas_irq_context *irq_ctx;
+   u32 count, i;
+
+   count = instance->msix_vectors > 0 ? instance->msix_vectors : 1;
+
+   /* Initialize IRQ poll */
+   for (i = 0; i < count; i++) {
+   irq_ctx = &instance->irq_context[i];
+   irq_ctx->os_irq = pci_irq_vector(instance->pdev, i);
+   irq_ctx->irq_poll_scheduled = false;
+   irq_poll_init(&irq_ctx->irqpoll,
+ instance->threshold_reply_count,
+ megasas_irqpoll);
+   }
+}
+
 /*
  * megasas_setup_irqs_ioapic - register legacy interrupts.
  * @instance:  Adapter soft state
@@ -5350,6 +5370,16 @@ static void
 megasas_destroy_irqs(struct megasas_instance *instance) {
 
int i;
+   int count;
+   struct megasas_irq_context *irq_ctx;
+
+   count = instance->msix_vectors > 0 ? instance->msix_vectors : 1;
+   if (instance->adapter_type != MFI_SERIES) {
+   for (i = 0; i < count; i++) {
+   irq_ctx = &instance->irq_context[i];
+   irq_poll_disable(&irq_ctx->irqpoll);
+   }
+   }
 
if (instance->msix_vectors)
for (i = 0; i < instance->msix_vectors; i++) {
@@ -5722,6 +5752,9 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
megasas_setup_irqs_ioapic(instance))
goto fail_init_adapter;
 
+   if (instance->adapter_type != MFI_SERIES)
+   megasas_setup_irq_poll(instance);
+
instance->instancet->enable_intr(instance);
 
dev_info(&instance->pdev->dev, "INIT adapter done\n");
@@ -7187,6 +7220,9 @@ megasas_resume(struct pci_dev *pdev)
megasas_setup_irqs_ioapic(instance))
goto fail_init_mfi;
 
+   if (instance->adapter_type != MFI_SERIES)
+   megasas_setup_irq_poll(instance);
+

[PATCH v2 18/21] megaraid_sas: Add debug prints for device list

2019-05-07 Thread Shivasharan S
Add debug prints related to device list being returned by firmware.
The a debug flag to activate these prints.

Signed-off-by: Sumit Saxena 
Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas.h  |  1 +
 drivers/scsi/megaraid/megaraid_sas_base.c | 35 +++
 2 files changed, 36 insertions(+)

diff --git a/drivers/scsi/megaraid/megaraid_sas.h 
b/drivers/scsi/megaraid/megaraid_sas.h
index 8df6ef01785e..840506f2f33c 100644
--- a/drivers/scsi/megaraid/megaraid_sas.h
+++ b/drivers/scsi/megaraid/megaraid_sas.h
@@ -1499,6 +1499,7 @@ struct megasas_ctrl_info {
 /* Driver's internal Logging levels*/
 #define OCR_DEBUG(1 << 0)
 #define TM_DEBUG (1 << 1)
+#define LD_PD_DEBUG(1 << 2)
 
 #define SCAN_PD_CHANNEL0x1
 #define SCAN_VD_CHANNEL0x2
diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index b40702e30e49..b9893f8ccf4d 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -4512,6 +4512,9 @@ megasas_get_pd_list(struct megasas_instance *instance)
 
case DCMD_SUCCESS:
pd_addr = ci->addr;
+   if (megasas_dbg_lvl & LD_PD_DEBUG)
+   dev_info(&instance->pdev->dev, "%s, sysPD count: 
0x%x\n",
+__func__, le32_to_cpu(ci->count));
 
if ((le32_to_cpu(ci->count) >
(MEGASAS_MAX_PD_CHANNELS * 
MEGASAS_MAX_DEV_PER_CHANNEL)))
@@ -4527,6 +4530,11 @@ megasas_get_pd_list(struct megasas_instance *instance)
pd_addr->scsiDevType;

instance->local_pd_list[le16_to_cpu(pd_addr->deviceId)].driveState  =
MR_PD_STATE_SYSTEM;
+   if (megasas_dbg_lvl & LD_PD_DEBUG)
+   dev_info(&instance->pdev->dev,
+"PD%d: targetID: 0x%03x 
deviceType:0x%x\n",
+pd_index, 
le16_to_cpu(pd_addr->deviceId),
+pd_addr->scsiDevType);
pd_addr++;
}
 
@@ -4630,6 +4638,10 @@ megasas_get_ld_list(struct megasas_instance *instance)
break;
 
case DCMD_SUCCESS:
+   if (megasas_dbg_lvl & LD_PD_DEBUG)
+   dev_info(&instance->pdev->dev, "%s, LD count: 0x%x\n",
+__func__, ld_count);
+
if (ld_count > instance->fw_supported_vd_count)
break;
 
@@ -4639,6 +4651,10 @@ megasas_get_ld_list(struct megasas_instance *instance)
if (ci->ldList[ld_index].state != 0) {
ids = ci->ldList[ld_index].ref.targetId;
instance->ld_ids[ids] = 
ci->ldList[ld_index].ref.targetId;
+   if (megasas_dbg_lvl & LD_PD_DEBUG)
+   dev_info(&instance->pdev->dev,
+"LD%d: targetID: 0x%03x\n",
+ld_index, ids);
}
}
 
@@ -4742,6 +4758,10 @@ megasas_ld_list_query(struct megasas_instance *instance, 
u8 query_type)
case DCMD_SUCCESS:
tgtid_count = le32_to_cpu(ci->count);
 
+   if (megasas_dbg_lvl & LD_PD_DEBUG)
+   dev_info(&instance->pdev->dev, "%s, LD count: 0x%x\n",
+__func__, tgtid_count);
+
if ((tgtid_count > (instance->fw_supported_vd_count)))
break;
 
@@ -4749,6 +4769,9 @@ megasas_ld_list_query(struct megasas_instance *instance, 
u8 query_type)
for (ld_index = 0; ld_index < tgtid_count; ld_index++) {
ids = ci->targetId[ld_index];
instance->ld_ids[ids] = ci->targetId[ld_index];
+   if (megasas_dbg_lvl & LD_PD_DEBUG)
+   dev_info(&instance->pdev->dev, "LD%d: targetID: 
0x%03x\n",
+ld_index, ci->targetId[ld_index]);
}
 
break;
@@ -4828,6 +4851,10 @@ megasas_host_device_list_query(struct megasas_instance 
*instance,
 */
count = le32_to_cpu(ci->count);
 
+   if (megasas_dbg_lvl & LD_PD_DEBUG)
+   dev_info(&instance->pdev->dev, "%s, Device count: 
0x%x\n",
+__func__, count);
+
memse

[PATCH v2 16/21] megaraid_sas: Print firmware interrupt status

2019-05-07 Thread Shivasharan S
Add a print to dump the interrupt status in system log
for debugging.

Signed-off-by: Sumit Saxena 
Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas_fusion.c | 13 +++--
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas_fusion.c 
b/drivers/scsi/megaraid/megaraid_sas_fusion.c
index 4c78e4caf910..ca489fed51a1 100644
--- a/drivers/scsi/megaraid/megaraid_sas_fusion.c
+++ b/drivers/scsi/megaraid/megaraid_sas_fusion.c
@@ -202,7 +202,8 @@ megasas_enable_intr_fusion(struct megasas_instance 
*instance)
writel(~MFI_FUSION_ENABLE_INTERRUPT_MASK, &(regs)->outbound_intr_mask);
 
/* Dummy readl to force pci flush */
-   readl(®s->outbound_intr_mask);
+   dev_info(&instance->pdev->dev, "%s is called 
outbound_intr_mask:0x%08x\n",
+__func__, readl(®s->outbound_intr_mask));
 }
 
 /**
@@ -213,14 +214,14 @@ void
 megasas_disable_intr_fusion(struct megasas_instance *instance)
 {
u32 mask = 0x;
-   u32 status;
struct megasas_register_set __iomem *regs;
regs = instance->reg_set;
instance->mask_interrupts = 1;
 
writel(mask, ®s->outbound_intr_mask);
/* Dummy readl to force pci flush */
-   status = readl(®s->outbound_intr_mask);
+   dev_info(&instance->pdev->dev, "%s is called 
outbound_intr_mask:0x%08x\n",
+__func__, readl(®s->outbound_intr_mask));
 }
 
 int
@@ -4895,9 +4896,9 @@ int megasas_reset_fusion(struct Scsi_Host *shost, int 
reason)
 
atomic_set(&instance->adprecovery, 
MEGASAS_HBA_OPERATIONAL);
 
-   dev_info(&instance->pdev->dev, "Interrupts are enabled 
and"
-   " controller is OPERATIONAL for scsi:%d\n",
-   instance->host->host_no);
+   dev_info(&instance->pdev->dev,
+"Adapter is OPERATIONAL for scsi:%d\n",
+instance->host->host_no);
 
/* Restart SR-IOV heartbeat */
if (instance->requestorId) {
-- 
2.16.1



[PATCH v2 04/21] megaraid_sas: rework code around controller reset

2019-05-07 Thread Shivasharan S
No functional change.
This patch reworks code around controller reset path which gets rid
of a couple of goto labels.
This is in preparation for the next patch which adds PCI config
space access locking while controller reset is in progress.

Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas.h|  1 +
 drivers/scsi/megaraid/megaraid_sas_fusion.c | 23 ++-
 2 files changed, 11 insertions(+), 13 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas.h 
b/drivers/scsi/megaraid/megaraid_sas.h
index 6fd57f7f0b1e..902b11b97999 100644
--- a/drivers/scsi/megaraid/megaraid_sas.h
+++ b/drivers/scsi/megaraid/megaraid_sas.h
@@ -1571,6 +1571,7 @@ enum FW_BOOT_CONTEXT {
 #define MFI_IO_TIMEOUT_SECS180
 #define MEGASAS_SRIOV_HEARTBEAT_INTERVAL_VF(5 * HZ)
 #define MEGASAS_OCR_SETTLE_TIME_VF (1000 * 30)
+#define MEGASAS_SRIOV_MAX_RESET_TRIES_VF   1
 #define MEGASAS_ROUTINE_WAIT_TIME_VF   300
 #define MFI_REPLY_1078_MESSAGE_INTERRUPT   0x8000
 #define MFI_REPLY_GEN2_MESSAGE_INTERRUPT   0x0001
diff --git a/drivers/scsi/megaraid/megaraid_sas_fusion.c 
b/drivers/scsi/megaraid/megaraid_sas_fusion.c
index bf1fa963af0b..76bd29c92752 100644
--- a/drivers/scsi/megaraid/megaraid_sas_fusion.c
+++ b/drivers/scsi/megaraid/megaraid_sas_fusion.c
@@ -4568,6 +4568,8 @@ int megasas_reset_fusion(struct Scsi_Host *shost, int 
reason)
struct scsi_device *sdev;
int ret_target_prop = DCMD_FAILED;
bool is_target_prop = false;
+   bool do_adp_reset = true;
+   int max_reset_tries = MEGASAS_FUSION_MAX_RESET_TRIES;
 
instance = (struct megasas_instance *)shost->hostdata;
fusion = instance->ctrl_context;
@@ -4686,34 +4688,30 @@ int megasas_reset_fusion(struct Scsi_Host *shost, int 
reason)
/* Let SR-IOV VF & PF sync up if there was a HB failure */
if (instance->requestorId && !reason) {
msleep(MEGASAS_OCR_SETTLE_TIME_VF);
-   goto transition_to_ready;
+   do_adp_reset = false;
+   max_reset_tries = MEGASAS_SRIOV_MAX_RESET_TRIES_VF;
}
 
/* Now try to reset the chip */
-   for (i = 0; i < MEGASAS_FUSION_MAX_RESET_TRIES; i++) {
+   for (i = 0; i < max_reset_tries; i++) {
 
-   if (instance->instancet->adp_reset
+   if (do_adp_reset &&
+   instance->instancet->adp_reset
(instance, instance->reg_set))
continue;
-transition_to_ready:
+
/* Wait for FW to become ready */
if (megasas_transition_to_ready(instance, 1)) {
dev_warn(&instance->pdev->dev,
"Failed to transition controller to 
ready for "
"scsi%d.\n", instance->host->host_no);
-   if (instance->requestorId && !reason)
-   goto fail_kill_adapter;
-   else
-   continue;
+   continue;
}
megasas_reset_reply_desc(instance);
megasas_fusion_update_can_queue(instance, OCR_CONTEXT);
 
if (megasas_ioc_init_fusion(instance)) {
-   if (instance->requestorId && !reason)
-   goto fail_kill_adapter;
-   else
-   continue;
+   continue;
}
 
if (megasas_get_ctrl_info(instance)) {
@@ -4799,7 +4797,6 @@ int megasas_reset_fusion(struct Scsi_Host *shost, int 
reason)
 
goto out;
}
-fail_kill_adapter:
/* Reset failed, kill the adapter */
dev_warn(&instance->pdev->dev, "Reset failed, killing "
   "adapter scsi%d.\n", instance->host->host_no);
-- 
2.16.1



[PATCH v2 12/21] megaraid_sas: Dump system registers for debugging

2019-05-07 Thread Shivasharan S
When controller fails to transition to READY state during driver probe,
dump the system interface register set.
This will give snapshot of the firmware status for debugging
driver load issues.

Signed-off-by: Sumit Saxena 
Signed-off-by: Shivasharan S 
---
Changes in v2:
Fixed the sparse warning and removed the endianness conversion after
readl.

 drivers/scsi/megaraid/megaraid_sas_base.c | 27 ++-
 1 file changed, 26 insertions(+), 1 deletion(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index e2a89821bdd2..905b45590c7e 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -2862,6 +2862,24 @@ megasas_dump(void *buf, int sz, int format)
printk(KERN_CONT "\n");
 }
 
+/**
+ * megasas_dump_reg_set -  This function will print hexdump of register set
+ * @buf:   Buffer to be dumped
+ * @sz:Size in bytes
+ * @format:Different formats of dumping e.g. format=n will
+ * cause only 'n' 32 bit words to be dumped in a
+ * single line.
+ */
+inline void
+megasas_dump_reg_set(void __iomem *reg_set)
+{
+   unsigned int i, sz = 256;
+   u32 __iomem *reg = (u32 __iomem *)reg_set;
+
+   for (i = 0; i < (sz / sizeof(u32)); i++)
+   printk("%08x: %08x\n", (i * 4), readl(®[i]));
+}
+
 /**
  * megasas_dump_fusion_io -This function will print key details
  * of SCSI IO
@@ -3891,8 +3909,11 @@ megasas_transition_to_ready(struct megasas_instance 
*instance, int ocr)
max_wait = MEGASAS_RESET_WAIT_TIME;
cur_state = MFI_STATE_FAULT;
break;
-   } else
+   } else {
+   dev_printk(KERN_DEBUG, &instance->pdev->dev, 
"System Register set:\n");
+   megasas_dump_reg_set(instance->reg_set);
return -ENODEV;
+   }
 
case MFI_STATE_WAIT_HANDSHAKE:
/*
@@ -4000,6 +4021,8 @@ megasas_transition_to_ready(struct megasas_instance 
*instance, int ocr)
default:
dev_printk(KERN_DEBUG, &instance->pdev->dev, "Unknown 
state 0x%x\n",
   fw_state);
+   dev_printk(KERN_DEBUG, &instance->pdev->dev, "System 
Register set:\n");
+   megasas_dump_reg_set(instance->reg_set);
return -ENODEV;
}
 
@@ -4022,6 +4045,8 @@ megasas_transition_to_ready(struct megasas_instance 
*instance, int ocr)
if (curr_abs_state == abs_state) {
dev_printk(KERN_DEBUG, &instance->pdev->dev, "FW state 
[%d] hasn't changed "
   "in %d secs\n", fw_state, max_wait);
+   dev_printk(KERN_DEBUG, &instance->pdev->dev, "System 
Register set:\n");
+   megasas_dump_reg_set(instance->reg_set);
return -ENODEV;
}
 
-- 
2.16.1



[PATCH v2 17/21] megaraid_sas: Add prints in suspend and resume path

2019-05-07 Thread Shivasharan S
Add prints in resume/suspend path to help in debugging
hibernation issues. The print gives an indication when the driver
entry points are called.

Signed-off-by: Sumit Saxena 
Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas_base.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index 4689909fa66b..b40702e30e49 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -7244,6 +7244,8 @@ megasas_suspend(struct pci_dev *pdev, pm_message_t state)
host = instance->host;
instance->unload = 1;
 
+   dev_info(&pdev->dev, "%s is called\n", __func__);
+
/* Shutdown SR-IOV heartbeat timer */
if (instance->requestorId && !instance->skip_heartbeat_timer_del)
del_timer_sync(&instance->sriov_heartbeat_timer);
@@ -7298,6 +7300,7 @@ megasas_resume(struct pci_dev *pdev)
pci_enable_wake(pdev, PCI_D0, 0);
pci_restore_state(pdev);
 
+   dev_info(&pdev->dev, "%s is called\n", __func__);
/*
 * PCI prepping: enable device set bus mastering and dma mask
 */
-- 
2.16.1



[PATCH v2 14/21] megaraid_sas: Export RAID map id through sysfs

2019-05-07 Thread Shivasharan S
Add a sysfs interface to get the raid map index that is being used by
driver.

Signed-off-by: Sumit Saxena 
Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas_base.c | 15 +++
 1 file changed, 15 insertions(+)

diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index 18d142f2a2a2..c560d1e748f4 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -3275,6 +3275,18 @@ megasas_dump_system_regs_show(struct device *cdev,
return megasas_dump_sys_regs(instance->reg_set, buf);
 }
 
+static ssize_t
+megasas_raid_map_id_show(struct device *cdev, struct device_attribute *attr,
+ char *buf)
+{
+   struct Scsi_Host *shost = class_to_shost(cdev);
+   struct megasas_instance *instance =
+   (struct megasas_instance *)shost->hostdata;
+
+   return snprintf(buf, PAGE_SIZE, "%ld\n",
+   (unsigned long)instance->map_id);
+}
+
 static DEVICE_ATTR(fw_crash_buffer, S_IRUGO | S_IWUSR,
megasas_fw_crash_buffer_show, megasas_fw_crash_buffer_store);
 static DEVICE_ATTR(fw_crash_buffer_size, S_IRUGO,
@@ -3289,6 +3301,8 @@ static DEVICE_ATTR(fw_cmds_outstanding, S_IRUGO,
megasas_fw_cmds_outstanding_show, NULL);
 static DEVICE_ATTR(dump_system_regs, S_IRUGO,
megasas_dump_system_regs_show, NULL);
+static DEVICE_ATTR(raid_map_id, S_IRUGO,
+   megasas_raid_map_id_show, NULL);
 
 struct device_attribute *megaraid_host_attrs[] = {
&dev_attr_fw_crash_buffer_size,
@@ -3298,6 +3312,7 @@ struct device_attribute *megaraid_host_attrs[] = {
&dev_attr_ldio_outstanding,
&dev_attr_fw_cmds_outstanding,
&dev_attr_dump_system_regs,
+   &dev_attr_raid_map_id,
NULL,
 };
 
-- 
2.16.1



[PATCH v2 21/21] megaraid_sas: Update driver version to 07.708.03.00

2019-05-07 Thread Shivasharan S
Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas.h | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas.h 
b/drivers/scsi/megaraid/megaraid_sas.h
index 56b3204d3fc6..e138d1447e43 100644
--- a/drivers/scsi/megaraid/megaraid_sas.h
+++ b/drivers/scsi/megaraid/megaraid_sas.h
@@ -33,8 +33,8 @@
 /*
  * MegaRAID SAS Driver meta data
  */
-#define MEGASAS_VERSION"07.707.51.00-rc1"
-#define MEGASAS_RELDATE"February 7, 2019"
+#define MEGASAS_VERSION"07.708.03.00-rc1"
+#define MEGASAS_RELDATE"March 14, 2019"
 
 /*
  * Device IDs
-- 
2.16.1



[PATCH v2 08/21] megaraid_sas: Enhance prints in OCR and TM path

2019-05-07 Thread Shivasharan S
This patch enhances the existing debug prints in reset and
task management path.
These debug prints in adapter reset path helps with debugging issues
related to IO timeouts that are seen frequently in the field.
Add additional debug prints to dump the pending command frames before
initiating a adapter reset.
Also, print FastPath IOs that are outstanding.

Signed-off-by: Sumit Saxena 
Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas.h|  4 +-
 drivers/scsi/megaraid/megaraid_sas_base.c   | 69 ++---
 drivers/scsi/megaraid/megaraid_sas_fusion.c | 44 +-
 3 files changed, 80 insertions(+), 37 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas.h 
b/drivers/scsi/megaraid/megaraid_sas.h
index 6be748f302cf..27980d68cf1b 100644
--- a/drivers/scsi/megaraid/megaraid_sas.h
+++ b/drivers/scsi/megaraid/megaraid_sas.h
@@ -1495,7 +1495,8 @@ struct megasas_ctrl_info {
 #define MEGASAS_FW_BUSY1
 
 /* Driver's internal Logging levels*/
-#define OCR_LOGS(1 << 0)
+#define OCR_DEBUG(1 << 0)
+#define TM_DEBUG (1 << 1)
 
 #define SCAN_PD_CHANNEL0x1
 #define SCAN_VD_CHANNEL0x2
@@ -2647,4 +2648,5 @@ int megasas_adp_reset_wait_for_ready(struct 
megasas_instance *instance,
 bool do_adp_reset,
 int ocr_context);
 int megasas_irqpoll(struct irq_poll *irqpoll, int budget);
+void megasas_dump_fusion_io(struct scsi_cmnd *scmd);
 #endif /*LSI_MEGARAID_SAS_H */
diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index 102a7e40996e..032d91b1f3ba 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -55,6 +55,7 @@
 #include 
 #include 
 #include 
+#include 
 #include "megaraid_sas_fusion.h"
 #include "megaraid_sas.h"
 
@@ -2833,23 +2834,63 @@ blk_eh_timer_return megasas_reset_timer(struct 
scsi_cmnd *scmd)
 }
 
 /**
- * megasas_dump_frame -This function will dump MPT/MFI frame
+ * megasas_dump -  This function will provide hexdump
+ * @ptr:   Pointer starting which memory should be dumped
+ * @size:  Size of memory to be dumped
  */
-static inline void
-megasas_dump_frame(void *mpi_request, int sz)
+inline void
+megasas_dump(void *ptr, int sz)
 {
int i;
-   __le32 *mfp = (__le32 *)mpi_request;
+   __le32 *loc = (__le32 *)ptr;
 
-   printk(KERN_INFO "IO request frame:\n\t");
for (i = 0; i < sz / sizeof(__le32); i++) {
if (i && ((i % 8) == 0))
printk("\n\t");
-   printk("%08x ", le32_to_cpu(mfp[i]));
+   printk("%08x ", le32_to_cpu(loc[i]));
}
printk("\n");
 }
 
+/**
+ * megasas_dump_fusion_io -This function will print key details
+ * of SCSI IO
+ * @scmd:  SCSI command pointer of SCSI IO
+ */
+void
+megasas_dump_fusion_io(struct scsi_cmnd *scmd)
+{
+   struct megasas_cmd_fusion *cmd;
+   union MEGASAS_REQUEST_DESCRIPTOR_UNION *req_desc;
+   struct megasas_instance *instance;
+
+   cmd = (struct megasas_cmd_fusion *)scmd->SCp.ptr;
+   instance = (struct megasas_instance *)scmd->device->host->hostdata;
+
+   scmd_printk(KERN_INFO, scmd,
+   "scmd: (0x%p)  retries: 0x%x  allowed: 0x%x\n",
+   scmd, scmd->retries, scmd->allowed);
+   scsi_print_command(scmd);
+
+   if (cmd) {
+   req_desc = (union MEGASAS_REQUEST_DESCRIPTOR_UNION 
*)cmd->request_desc;
+   scmd_printk(KERN_INFO, scmd, "Request descriptor details:\n");
+   scmd_printk(KERN_INFO, scmd,
+   "RequestFlags:0x%x  MSIxIndex:0x%x  SMID:0x%x  
LMID:0x%x  DevHandle:0x%x\n",
+   req_desc->SCSIIO.RequestFlags,
+   req_desc->SCSIIO.MSIxIndex, req_desc->SCSIIO.SMID,
+   req_desc->SCSIIO.LMID, req_desc->SCSIIO.DevHandle);
+
+   printk(KERN_INFO "IO request frame:\n");
+   megasas_dump(cmd->io_request,
+MEGA_MPI2_RAID_DEFAULT_IO_FRAME_SIZE);
+   printk(KERN_INFO "Chain frame:\n");
+   megasas_dump(cmd->sg_frame,
+instance->max_chain_frame_sz);
+   }
+
+}
+
 /**
  * megasas_reset_bus_host -Bus & host reset handler entry point
  */
@@ -2861,24 +2902,20 @@ static int megasas_reset_bus_host(struct scsi_cmnd 
*scmd)
instance = (struct megasas_instance *)scmd->device->host->hostdata;
 
scmd_printk(KERN_INFO, scmd,
-   "Controller reset i

[PATCH v2 11/21] megaraid_sas: Dump system interface regs from sysfs

2019-05-07 Thread Shivasharan S
Add a sysfs interface to dump the controller's system interface registers.

Signed-off-by: Sumit Saxena 
Signed-off-by: Shivasharan S 
---
Changes in v2:
Fixed the sparse warnings reported by kbuild_test_robot and removed the
endianness conversion after readl.

 drivers/scsi/megaraid/megaraid_sas_base.c | 37 +++
 1 file changed, 37 insertions(+)

diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index d0fd307e30af..e2a89821bdd2 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -2901,6 +2901,29 @@ megasas_dump_fusion_io(struct scsi_cmnd *scmd)
 
 }
 
+/*
+ * megasas_dump_sys_regs - This function will dump system registers through
+ * sysfs.
+ * @reg_set:   Pointer to System register set.
+ * @buf:   Buffer to which output is to be written.
+ * @return:Number of bytes written to buffer.
+ */
+static inline ssize_t
+megasas_dump_sys_regs(void __iomem *reg_set, char *buf)
+{
+   unsigned int i, sz = 256;
+   int bytes_wrote = 0;
+   char *loc = (char *)buf;
+   u32 __iomem *reg = (u32 __iomem *)reg_set;
+
+   for (i = 0; i < sz / sizeof(u32); i++) {
+   bytes_wrote += snprintf(loc + bytes_wrote, PAGE_SIZE,
+   "%08x: %08x\n", (i * 4),
+   readl(®[i]));
+   }
+   return bytes_wrote;
+}
+
 /**
  * megasas_reset_bus_host -Bus & host reset handler entry point
  */
@@ -3223,6 +3246,17 @@ megasas_fw_cmds_outstanding_show(struct device *cdev,
return snprintf(buf, PAGE_SIZE, "%d\n", 
atomic_read(&instance->fw_outstanding));
 }
 
+static ssize_t
+megasas_dump_system_regs_show(struct device *cdev,
+  struct device_attribute *attr, char *buf)
+{
+   struct Scsi_Host *shost = class_to_shost(cdev);
+   struct megasas_instance *instance =
+   (struct megasas_instance *)shost->hostdata;
+
+   return megasas_dump_sys_regs(instance->reg_set, buf);
+}
+
 static DEVICE_ATTR(fw_crash_buffer, S_IRUGO | S_IWUSR,
megasas_fw_crash_buffer_show, megasas_fw_crash_buffer_store);
 static DEVICE_ATTR(fw_crash_buffer_size, S_IRUGO,
@@ -3235,6 +3269,8 @@ static DEVICE_ATTR(ldio_outstanding, S_IRUGO,
megasas_ldio_outstanding_show, NULL);
 static DEVICE_ATTR(fw_cmds_outstanding, S_IRUGO,
megasas_fw_cmds_outstanding_show, NULL);
+static DEVICE_ATTR(dump_system_regs, S_IRUGO,
+   megasas_dump_system_regs_show, NULL);
 
 struct device_attribute *megaraid_host_attrs[] = {
&dev_attr_fw_crash_buffer_size,
@@ -3243,6 +3279,7 @@ struct device_attribute *megaraid_host_attrs[] = {
&dev_attr_page_size,
&dev_attr_ldio_outstanding,
&dev_attr_fw_cmds_outstanding,
+   &dev_attr_dump_system_regs,
NULL,
 };
 
-- 
2.16.1



[PATCH v2 03/21] megaraid_sas: fw_reset_no_pci_access required for MFI adapters only

2019-05-07 Thread Shivasharan S
fw_reset_no_pci_access is only applicable for MFI controllers and is not
used for Fusion controllers.

For all Fusion controllers, driver can check reset adapter bit in
status register before performing a chip reset, without
setting "fw_reset_no_pci_access".

Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas_base.c | 18 ++
 1 file changed, 10 insertions(+), 8 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index d2714fc833ae..77db6e773a01 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -5489,7 +5489,6 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
int i, j, loop, fw_msix_count = 0;
struct IOV_111 *iovPtr;
struct fusion_context *fusion;
-   bool do_adp_reset = true;
 
fusion = instance->ctrl_context;
 
@@ -5536,13 +5535,18 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
}
 
if (megasas_transition_to_ready(instance, 0)) {
-   if (instance->adapter_type >= INVADER_SERIES) {
+   if (instance->adapter_type != MFI_SERIES) {
status_reg = instance->instancet->read_fw_status_reg(
instance);
-   do_adp_reset = status_reg & MFI_RESET_ADAPTER;
-   }
-
-   if (do_adp_reset) {
+   if (status_reg & MFI_RESET_ADAPTER) {
+   instance->instancet->adp_reset
+   (instance, instance->reg_set);
+   if (megasas_transition_to_ready(instance, 0))
+   goto fail_ready_state;
+   } else {
+   goto fail_ready_state;
+   }
+   } else {
atomic_set(&instance->fw_reset_no_pci_access, 1);
instance->instancet->adp_reset
(instance, instance->reg_set);
@@ -5556,8 +5560,6 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
 
if (megasas_transition_to_ready(instance, 0))
goto fail_ready_state;
-   } else {
-   goto fail_ready_state;
}
}
 
-- 
2.16.1



[PATCH v2 20/21] megaraid_sas: Export RAID map through debugfs

2019-05-07 Thread Shivasharan S
Create a debugfs interface for megaraid_sas driver.
Provide interface to dump driver RAID map in debugfs.

Signed-off-by: Sumit Saxena 
Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/Makefile   |   2 +-
 drivers/scsi/megaraid/megaraid_sas.h |   4 +
 drivers/scsi/megaraid/megaraid_sas_base.c|  14 +++
 drivers/scsi/megaraid/megaraid_sas_debugfs.c | 180 +++
 drivers/scsi/megaraid/megaraid_sas_fusion.h  |   5 +
 5 files changed, 204 insertions(+), 1 deletion(-)
 create mode 100644 drivers/scsi/megaraid/megaraid_sas_debugfs.c

diff --git a/drivers/scsi/megaraid/Makefile b/drivers/scsi/megaraid/Makefile
index 6e74d21227a5..12177e4cae65 100644
--- a/drivers/scsi/megaraid/Makefile
+++ b/drivers/scsi/megaraid/Makefile
@@ -3,4 +3,4 @@ obj-$(CONFIG_MEGARAID_MM)   += megaraid_mm.o
 obj-$(CONFIG_MEGARAID_MAILBOX) += megaraid_mbox.o
 obj-$(CONFIG_MEGARAID_SAS) += megaraid_sas.o
 megaraid_sas-objs := megaraid_sas_base.o megaraid_sas_fusion.o \
-   megaraid_sas_fp.o
+   megaraid_sas_fp.o megaraid_sas_debugfs.o
diff --git a/drivers/scsi/megaraid/megaraid_sas.h 
b/drivers/scsi/megaraid/megaraid_sas.h
index 840506f2f33c..56b3204d3fc6 100644
--- a/drivers/scsi/megaraid/megaraid_sas.h
+++ b/drivers/scsi/megaraid/megaraid_sas.h
@@ -2390,6 +2390,10 @@ struct megasas_instance {
u8 task_abort_tmo;
u8 max_reset_tmo;
u8 snapdump_wait_time;
+#ifdef CONFIG_DEBUG_FS
+   struct dentry *debugfs_root;
+   struct dentry *raidmap_dump;
+#endif
u8 enable_fw_dev_list;
 };
 struct MR_LD_VF_MAP {
diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index 5f7842982d57..1006364ce0d0 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -188,6 +188,12 @@ static bool support_nvme_encapsulation;
 /* define lock for aen poll */
 spinlock_t poll_aen_lock;
 
+extern struct dentry *megasas_debugfs_root;
+extern void megasas_init_debugfs(void);
+extern void megasas_exit_debugfs(void);
+extern void megasas_setup_debugfs(struct megasas_instance *instance);
+extern void megasas_destroy_debugfs(struct megasas_instance *instance);
+
 void
 megasas_complete_cmd(struct megasas_instance *instance, struct megasas_cmd 
*cmd,
 u8 alt_status);
@@ -7141,6 +7147,8 @@ static int megasas_probe_one(struct pci_dev *pdev,
goto fail_start_aen;
}
 
+   megasas_setup_debugfs(instance);
+
/* Get current SR-IOV LD/VF affiliation */
if (instance->requestorId)
megasas_get_ld_vf_affiliation(instance, 1);
@@ -7611,6 +7619,8 @@ static void megasas_detach_one(struct pci_dev *pdev)
 
megasas_free_ctrl_mem(instance);
 
+   megasas_destroy_debugfs(instance);
+
scsi_host_put(host);
 
pci_disable_device(pdev);
@@ -8538,6 +8548,8 @@ static int __init megasas_init(void)
 
megasas_mgmt_majorno = rval;
 
+   megasas_init_debugfs();
+
/*
 * Register ourselves as PCI hotplug module
 */
@@ -8597,6 +8609,7 @@ static int __init megasas_init(void)
 err_dcf_attr_ver:
pci_unregister_driver(&megasas_pci_driver);
 err_pcidrv:
+   megasas_exit_debugfs();
unregister_chrdev(megasas_mgmt_majorno, "megaraid_sas_ioctl");
return rval;
 }
@@ -8619,6 +8632,7 @@ static void __exit megasas_exit(void)
   &driver_attr_support_nvme_encapsulation);
 
pci_unregister_driver(&megasas_pci_driver);
+   megasas_exit_debugfs();
unregister_chrdev(megasas_mgmt_majorno, "megaraid_sas_ioctl");
 }
 
diff --git a/drivers/scsi/megaraid/megaraid_sas_debugfs.c 
b/drivers/scsi/megaraid/megaraid_sas_debugfs.c
new file mode 100644
index ..e52837bb6807
--- /dev/null
+++ b/drivers/scsi/megaraid/megaraid_sas_debugfs.c
@@ -0,0 +1,180 @@
+/*
+ *  Linux MegaRAID driver for SAS based RAID controllers
+ *
+ *  Copyright (c) 2003-2018  LSI Corporation.
+ *  Copyright (c) 2003-2018  Avago Technologies.
+ *  Copyright (c) 2003-2018  Broadcom Inc.
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ *  Authors: Broadcom Inc.
+ *   Kashyap Desai 
+ *   Sumit Saxena 
+ *   Shivasharan S 
+ *
+ *  Send feedback to: megaraidlinux..

[PATCH v2 13/21] megaraid_sas: Print BAR information from driver

2019-05-07 Thread Shivasharan S
Add prints for BAR address information during driver load.
This helps in debugging issues with BAR address changing during
OS boot.

Signed-off-by: Sumit Saxena 
Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas_base.c | 6 ++
 1 file changed, 6 insertions(+)

diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index 905b45590c7e..18d142f2a2a2 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -5625,6 +5625,7 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
u32 max_sectors_2, tmp_sectors, msix_enable;
u32 scratch_pad_1, scratch_pad_2, scratch_pad_3, status_reg;
resource_size_t base_addr;
+   void *base_addr_phys;
struct megasas_ctrl_info *ctrl_info = NULL;
unsigned long bar_list;
int i, j, loop, fw_msix_count = 0;
@@ -5650,6 +5651,11 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
goto fail_ioremap;
}
 
+   base_addr_phys = &base_addr;
+   dev_printk(KERN_DEBUG, &instance->pdev->dev,
+  "BAR:0x%lx  BAR's base_addr(phys):%pa  mapped 
virt_addr:0x%p\n",
+  instance->bar, base_addr_phys, instance->reg_set);
+
if (instance->adapter_type != MFI_SERIES)
instance->instancet = &megasas_instance_template_fusion;
else {
-- 
2.16.1



[PATCH v2 09/21] megaraid_sas: Enhance internal DCMD timeout prints

2019-05-07 Thread Shivasharan S
Add prints to identify the internal DCMD opcode that has timed out,
for debugging.

Signed-off-by: Sumit Saxena 
Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas_base.c | 12 
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index 032d91b1f3ba..7449df36a092 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -1113,8 +1113,9 @@ megasas_issue_blocked_cmd(struct megasas_instance 
*instance,
ret = wait_event_timeout(instance->int_cmd_wait_q,
cmd->cmd_status_drv != MFI_STAT_INVALID_STATUS, 
timeout * HZ);
if (!ret) {
-   dev_err(&instance->pdev->dev, "Failed from %s %d DCMD 
Timed out\n",
-   __func__, __LINE__);
+   dev_err(&instance->pdev->dev,
+   "DCMD(opcode: 0x%x) is timed out, func:%s\n",
+   cmd->frame->dcmd.opcode, __func__);
return DCMD_TIMEOUT;
}
} else
@@ -1143,6 +1144,7 @@ megasas_issue_blocked_abort_cmd(struct megasas_instance 
*instance,
struct megasas_cmd *cmd;
struct megasas_abort_frame *abort_fr;
int ret = 0;
+   u32 opcode;
 
cmd = megasas_get_cmd(instance);
 
@@ -1178,8 +1180,10 @@ megasas_issue_blocked_abort_cmd(struct megasas_instance 
*instance,
ret = wait_event_timeout(instance->abort_cmd_wait_q,
cmd->cmd_status_drv != MFI_STAT_INVALID_STATUS, 
timeout * HZ);
if (!ret) {
-   dev_err(&instance->pdev->dev, "Failed from %s %d Abort 
Timed out\n",
-   __func__, __LINE__);
+   opcode = cmd_to_abort->frame->dcmd.opcode;
+   dev_err(&instance->pdev->dev,
+   "Abort(to be aborted DCMD opcode: 0x%x) is 
timed out func:%s\n",
+   opcode,  __func__);
return DCMD_TIMEOUT;
}
} else
-- 
2.16.1



[PATCH v2 07/21] megaraid_sas: Load balance completions across all MSIx

2019-05-07 Thread Shivasharan S
Driver will use "reply descriptor post queues" in round robin fashion
when the combined MSI-x mode is not enabled. With this IO completions
are distributed and loadbalanced across all the available reply
descriptor post queues equally.

This is enabled only if combined MSI-x mode is not enabled in firmware.
This improves performance and also fixes soft lockups.

When load balancing is enabled, IRQ affinity from driver needs to be
disabled.

Signed-off-by: Kashyap Desai 
Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas.h|  3 +++
 drivers/scsi/megaraid/megaraid_sas_base.c   | 22 ++
 drivers/scsi/megaraid/megaraid_sas_fusion.c | 18 ++
 3 files changed, 35 insertions(+), 8 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas.h 
b/drivers/scsi/megaraid/megaraid_sas.h
index 8d6a9c511455..6be748f302cf 100644
--- a/drivers/scsi/megaraid/megaraid_sas.h
+++ b/drivers/scsi/megaraid/megaraid_sas.h
@@ -2262,6 +2262,7 @@ struct megasas_instance {
u32 secure_jbod_support;
u32 support_morethan256jbod; /* FW support for more than 256 PD/JBOD */
bool use_seqnum_jbod_fp;   /* Added for PD sequence */
+   bool smp_affinity_enable;
spinlock_t crashdump_lock;
 
struct megasas_register_set __iomem *reg_set;
@@ -2279,6 +2280,7 @@ struct megasas_instance {
u16 ldio_threshold;
u16 cur_can_queue;
u32 max_sectors_per_req;
+   bool msix_load_balance;
struct megasas_aen_event *ev;
 
struct megasas_cmd **cmd_list;
@@ -2316,6 +2318,7 @@ struct megasas_instance {
atomic_t sge_holes_type1;
atomic_t sge_holes_type2;
atomic_t sge_holes_type3;
+   atomic64_t total_io_count;
 
struct megasas_instance_template *instancet;
struct tasklet_struct isr_tasklet;
diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index f7ffa72e9572..102a7e40996e 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -5350,6 +5350,7 @@ megasas_setup_irqs_msix(struct megasas_instance 
*instance, u8 is_probe)
 &instance->irq_context[j]);
/* Retry irq register for IO_APIC*/
instance->msix_vectors = 0;
+   instance->msix_load_balance = false;
if (is_probe) {
pci_free_irq_vectors(instance->pdev);
return megasas_setup_irqs_ioapic(instance);
@@ -5358,6 +5359,7 @@ megasas_setup_irqs_msix(struct megasas_instance 
*instance, u8 is_probe)
}
}
}
+
return 0;
 }
 
@@ -5661,6 +5663,12 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
if (rdpq_enable)
instance->is_rdpq = (scratch_pad_1 & 
MR_RDPQ_MODE_OFFSET) ?
1 : 0;
+
+   if (!instance->msix_combined) {
+   instance->msix_load_balance = true;
+   instance->smp_affinity_enable = false;
+   }
+
fw_msix_count = instance->msix_vectors;
/* Save 1-15 reply post index address to local 
memory
 * Index 0 is already saved from reg offset
@@ -5679,17 +5687,20 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
instance->msix_vectors);
} else /* MFI adapters */
instance->msix_vectors = 1;
+
/* Don't bother allocating more MSI-X vectors than cpus */
instance->msix_vectors = min(instance->msix_vectors,
 (unsigned int)num_online_cpus());
-   if (smp_affinity_enable)
+   if (instance->smp_affinity_enable)
irq_flags |= PCI_IRQ_AFFINITY;
i = pci_alloc_irq_vectors(instance->pdev, 1,
  instance->msix_vectors, irq_flags);
-   if (i > 0)
+   if (i > 0) {
instance->msix_vectors = i;
-   else
+   } else {
instance->msix_vectors = 0;
+   instance->msix_load_balance = false;
+   }
}
/*
 * MSI-X host index 0 is common for all adapter.
@@ -6797,6 +6808,7 @@ static inline void megasas_init_ctrl_params(struct 
megasas_instance *instance)
INIT_LIST_HEAD(&instance->internal_reset_pending_q);
 
  

[PATCH v2 05/21] megaraid_sas: Block PCI config space access from userspace during OCR

2019-05-07 Thread Shivasharan S
While an online controller reset(OCR) is in progress, there is short
duration where all access to controller's PCI config space from
the host needs to be blocked.
This is due to a hardware limitation of MegaRAID controllers.

With this patch, driver will block all access to controller's config
space from userland applications by calling pci_cfg_access_lock()
while OCR is in progress and unlocking after controller comes back to
ready state.

Added helper function which locks the config space before initiating OCR
and wait for controller to become READY.

Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas.h|  3 ++
 drivers/scsi/megaraid/megaraid_sas_base.c   | 15 ---
 drivers/scsi/megaraid/megaraid_sas_fusion.c | 66 +++--
 3 files changed, 74 insertions(+), 10 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas.h 
b/drivers/scsi/megaraid/megaraid_sas.h
index 902b11b97999..990ee23d7bc2 100644
--- a/drivers/scsi/megaraid/megaraid_sas.h
+++ b/drivers/scsi/megaraid/megaraid_sas.h
@@ -2636,4 +2636,7 @@ void megasas_fusion_stop_watchdog(struct megasas_instance 
*instance);
 void megasas_set_dma_settings(struct megasas_instance *instance,
  struct megasas_dcmd_frame *dcmd,
  dma_addr_t dma_addr, u32 dma_len);
+int megasas_adp_reset_wait_for_ready(struct megasas_instance *instance,
+bool do_adp_reset,
+int ocr_context);
 #endif /*LSI_MEGARAID_SAS_H */
diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index 77db6e773a01..5e5170b40f6f 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -5535,13 +5535,15 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
}
 
if (megasas_transition_to_ready(instance, 0)) {
+   dev_info(&instance->pdev->dev,
+"Failed to transition controller to ready from %s!\n",
+__func__);
if (instance->adapter_type != MFI_SERIES) {
status_reg = instance->instancet->read_fw_status_reg(
instance);
if (status_reg & MFI_RESET_ADAPTER) {
-   instance->instancet->adp_reset
-   (instance, instance->reg_set);
-   if (megasas_transition_to_ready(instance, 0))
+   if (megasas_adp_reset_wait_for_ready
+   (instance, true, 0) == FAILED)
goto fail_ready_state;
} else {
goto fail_ready_state;
@@ -5551,9 +5553,6 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
instance->instancet->adp_reset
(instance, instance->reg_set);
atomic_set(&instance->fw_reset_no_pci_access, 0);
-   dev_info(&instance->pdev->dev,
-"FW restarted successfully from %s!\n",
-__func__);
 
/*waiting for about 30 second before retry*/
ssleep(30);
@@ -5561,6 +5560,10 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
if (megasas_transition_to_ready(instance, 0))
goto fail_ready_state;
}
+
+   dev_info(&instance->pdev->dev,
+"FW restarted successfully from %s!\n",
+__func__);
}
 
megasas_init_ctrl_params(instance);
diff --git a/drivers/scsi/megaraid/megaraid_sas_fusion.c 
b/drivers/scsi/megaraid/megaraid_sas_fusion.c
index 76bd29c92752..59bab98274f6 100644
--- a/drivers/scsi/megaraid/megaraid_sas_fusion.c
+++ b/drivers/scsi/megaraid/megaraid_sas_fusion.c
@@ -98,6 +98,62 @@ static void megasas_fusion_crash_dump(struct 
megasas_instance *instance);
 extern u32 megasas_readl(struct megasas_instance *instance,
 const volatile void __iomem *addr);
 
+/**
+ * megasas_adp_reset_wait_for_ready -  initiate chip reset and wait for
+ * controller to come to ready state
+ * @instance - adapter's soft state
+ * @do_adp_reset - If true, do a chip reset
+ * @ocr_context -  If called from OCR context this will
+ * be set to 1, else 0
+ *
+ * This functon initates a chip reset followed by a wait for controller to
+ * transition to ready state.
+ * During 

[PATCH v2 19/21] megaraid_sas: Fix MSI-x vector print

2019-05-07 Thread Shivasharan S
Print FW supported MSI-x vector count only if FW supports
MSI-x.

Signed-off-by: Sumit Saxena 
Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas_base.c | 10 +-
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index b9893f8ccf4d..5f7842982d57 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -5681,7 +5681,7 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
void *base_addr_phys;
struct megasas_ctrl_info *ctrl_info = NULL;
unsigned long bar_list;
-   int i, j, loop, fw_msix_count = 0;
+   int i, j, loop;
struct IOV_111 *iovPtr;
struct fusion_context *fusion;
 
@@ -5802,7 +5802,6 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
/* Thunderbolt Series*/
instance->msix_vectors = (scratch_pad_1
& MR_MAX_REPLY_QUEUES_OFFSET) + 1;
-   fw_msix_count = instance->msix_vectors;
} else {
instance->msix_vectors = ((scratch_pad_1
& MR_MAX_REPLY_QUEUES_EXT_OFFSET)
@@ -5837,7 +5836,6 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
instance->smp_affinity_enable = false;
}
 
-   fw_msix_count = instance->msix_vectors;
/* Save 1-15 reply post index address to local 
memory
 * Index 0 is already saved from reg offset
 * MPI2_REPLY_POST_HOST_INDEX_OFFSET
@@ -5850,6 +5848,10 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
+ (loop * 0x10));
}
}
+
+   dev_info(&instance->pdev->dev,
+"firmware supports msix\t: (%d)",
+instance->msix_vectors);
if (msix_vectors)
instance->msix_vectors = min(msix_vectors,
instance->msix_vectors);
@@ -5892,8 +5894,6 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
 
megasas_setup_reply_map(instance);
 
-   dev_info(&instance->pdev->dev,
-   "firmware supports msix\t: (%d)", fw_msix_count);
dev_info(&instance->pdev->dev,
"current msix/online cpus\t: (%d/%d)\n",
instance->msix_vectors, (unsigned int)num_online_cpus());
-- 
2.16.1



[PATCH v2 10/21] megaraid_sas: Add formatting option for megasas_dump

2019-05-07 Thread Shivasharan S
Add option to format the buffer that is being dumped.
Currently, the IO frame and chain frame dumped in the syslog is
getting split across multiple lines based on the formatting.
Fix this by using KERN_CONT in printk.

Signed-off-by: Sumit Saxena 
Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas_base.c | 30 ++
 1 file changed, 18 insertions(+), 12 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index 7449df36a092..d0fd307e30af 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -2838,22 +2838,28 @@ blk_eh_timer_return megasas_reset_timer(struct 
scsi_cmnd *scmd)
 }
 
 /**
- * megasas_dump -  This function will provide hexdump
- * @ptr:   Pointer starting which memory should be dumped
- * @size:  Size of memory to be dumped
+ * megasas_dump -  This function will print hexdump of provided buffer.
+ * @buf:   Buffer to be dumped
+ * @sz:Size in bytes
+ * @format:Different formats of dumping e.g. format=n will
+ * cause only 'n' 32 bit words to be dumped in a single
+ * line.
  */
 inline void
-megasas_dump(void *ptr, int sz)
+megasas_dump(void *buf, int sz, int format)
 {
int i;
-   __le32 *loc = (__le32 *)ptr;
+   __le32 *buf_loc = (__le32 *)buf;
 
-   for (i = 0; i < sz / sizeof(__le32); i++) {
-   if (i && ((i % 8) == 0))
-   printk("\n\t");
-   printk("%08x ", le32_to_cpu(loc[i]));
+   for (i = 0; i < (sz / sizeof(__le32)); i++) {
+   if ((i % format) == 0) {
+   if (i != 0)
+   printk(KERN_CONT "\n");
+   printk(KERN_CONT "%08x: ", (i * 4));
+   }
+   printk(KERN_CONT "%08x ", le32_to_cpu(buf_loc[i]));
}
-   printk("\n");
+   printk(KERN_CONT "\n");
 }
 
 /**
@@ -2887,10 +2893,10 @@ megasas_dump_fusion_io(struct scsi_cmnd *scmd)
 
printk(KERN_INFO "IO request frame:\n");
megasas_dump(cmd->io_request,
-MEGA_MPI2_RAID_DEFAULT_IO_FRAME_SIZE);
+MEGA_MPI2_RAID_DEFAULT_IO_FRAME_SIZE, 8);
printk(KERN_INFO "Chain frame:\n");
megasas_dump(cmd->sg_frame,
-instance->max_chain_frame_sz);
+instance->max_chain_frame_sz, 8);
}
 
 }
-- 
2.16.1



[PATCH v2 01/21] megaraid_sas: remove unused variable target_index

2019-05-07 Thread Shivasharan S
No functional change.
Remove set but unused variable in megasas_set_static_target_properties.

Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas_base.c | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index bbe6972f3477..f677a84f6bc8 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -1931,7 +1931,6 @@ megasas_set_nvme_device_properties(struct scsi_device 
*sdev, u32 max_io_size)
 static void megasas_set_static_target_properties(struct scsi_device *sdev,
 bool is_target_prop)
 {
-   u16 target_index = 0;
u8 interface_type;
u32 device_qd = MEGASAS_DEFAULT_CMD_PER_LUN;
u32 max_io_size_kb = MR_DEFAULT_NVME_MDTS_KB;
@@ -1948,8 +1947,6 @@ static void megasas_set_static_target_properties(struct 
scsi_device *sdev,
 */
blk_queue_rq_timeout(sdev->request_queue, scmd_timeout * HZ);
 
-   target_index = (sdev->channel * MEGASAS_MAX_DEV_PER_CHANNEL) + sdev->id;
-
switch (interface_type) {
case SAS_PD:
device_qd = MEGASAS_SAS_QD;
-- 
2.16.1



[PATCH 12/21] megaraid_sas: Dump system registers for debugging

2019-04-26 Thread Shivasharan S
When controller fails to transition to READY state during driver probe,
dump the system interface register set.
This will give snapshot of the firmware status for debugging
driver load issues.

Signed-off-by: Sumit Saxena 
Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas_base.c | 27 ++-
 1 file changed, 26 insertions(+), 1 deletion(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index 5d2f346f3f49..5725d4cfbd14 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -2862,6 +2862,24 @@ megasas_dump(void *buf, int sz, int format)
printk(KERN_CONT "\n");
 }
 
+/**
+ * megasas_dump_reg_set -  This function will print hexdump of register set
+ * @buf:   Buffer to be dumped
+ * @sz:Size in bytes
+ * @format:Different formats of dumping e.g. format=n will
+ * cause only 'n' 32 bit words to be dumped in a
+ * single line.
+ */
+inline void
+megasas_dump_reg_set(void __iomem *reg_set)
+{
+   unsigned int i, sz = 256;
+   __le32 *reg = (__le32 *)reg_set;
+
+   for (i = 0; i < (sz / sizeof(__le32)); i++)
+   printk("%08x: %08x\n", (i * 4), le32_to_cpu(readl(®[i])));
+}
+
 /**
  * megasas_dump_fusion_io -This function will print key details
  * of SCSI IO
@@ -3891,8 +3909,11 @@ megasas_transition_to_ready(struct megasas_instance 
*instance, int ocr)
max_wait = MEGASAS_RESET_WAIT_TIME;
cur_state = MFI_STATE_FAULT;
break;
-   } else
+   } else {
+   dev_printk(KERN_DEBUG, &instance->pdev->dev, 
"System Register set:\n");
+   megasas_dump_reg_set(instance->reg_set);
return -ENODEV;
+   }
 
case MFI_STATE_WAIT_HANDSHAKE:
/*
@@ -4000,6 +4021,8 @@ megasas_transition_to_ready(struct megasas_instance 
*instance, int ocr)
default:
dev_printk(KERN_DEBUG, &instance->pdev->dev, "Unknown 
state 0x%x\n",
   fw_state);
+   dev_printk(KERN_DEBUG, &instance->pdev->dev, "System 
Register set:\n");
+   megasas_dump_reg_set(instance->reg_set);
return -ENODEV;
}
 
@@ -4022,6 +4045,8 @@ megasas_transition_to_ready(struct megasas_instance 
*instance, int ocr)
if (curr_abs_state == abs_state) {
dev_printk(KERN_DEBUG, &instance->pdev->dev, "FW state 
[%d] hasn't changed "
   "in %d secs\n", fw_state, max_wait);
+   dev_printk(KERN_DEBUG, &instance->pdev->dev, "System 
Register set:\n");
+   megasas_dump_reg_set(instance->reg_set);
return -ENODEV;
}
 
-- 
2.16.1



[PATCH 10/21] megaraid_sas: Add formatting option for megasas_dump

2019-04-26 Thread Shivasharan S
Add option to format the buffer that is being dumped.
Currently, the IO frame and chain frame dumped in the syslog is
getting split across multiple lines based on the formatting.
Fix this by using KERN_CONT in printk.

Signed-off-by: Sumit Saxena 
Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas_base.c | 30 ++
 1 file changed, 18 insertions(+), 12 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index 7449df36a092..d0fd307e30af 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -2838,22 +2838,28 @@ blk_eh_timer_return megasas_reset_timer(struct 
scsi_cmnd *scmd)
 }
 
 /**
- * megasas_dump -  This function will provide hexdump
- * @ptr:   Pointer starting which memory should be dumped
- * @size:  Size of memory to be dumped
+ * megasas_dump -  This function will print hexdump of provided buffer.
+ * @buf:   Buffer to be dumped
+ * @sz:Size in bytes
+ * @format:Different formats of dumping e.g. format=n will
+ * cause only 'n' 32 bit words to be dumped in a single
+ * line.
  */
 inline void
-megasas_dump(void *ptr, int sz)
+megasas_dump(void *buf, int sz, int format)
 {
int i;
-   __le32 *loc = (__le32 *)ptr;
+   __le32 *buf_loc = (__le32 *)buf;
 
-   for (i = 0; i < sz / sizeof(__le32); i++) {
-   if (i && ((i % 8) == 0))
-   printk("\n\t");
-   printk("%08x ", le32_to_cpu(loc[i]));
+   for (i = 0; i < (sz / sizeof(__le32)); i++) {
+   if ((i % format) == 0) {
+   if (i != 0)
+   printk(KERN_CONT "\n");
+   printk(KERN_CONT "%08x: ", (i * 4));
+   }
+   printk(KERN_CONT "%08x ", le32_to_cpu(buf_loc[i]));
}
-   printk("\n");
+   printk(KERN_CONT "\n");
 }
 
 /**
@@ -2887,10 +2893,10 @@ megasas_dump_fusion_io(struct scsi_cmnd *scmd)
 
printk(KERN_INFO "IO request frame:\n");
megasas_dump(cmd->io_request,
-MEGA_MPI2_RAID_DEFAULT_IO_FRAME_SIZE);
+MEGA_MPI2_RAID_DEFAULT_IO_FRAME_SIZE, 8);
printk(KERN_INFO "Chain frame:\n");
megasas_dump(cmd->sg_frame,
-instance->max_chain_frame_sz);
+instance->max_chain_frame_sz, 8);
}
 
 }
-- 
2.16.1



[PATCH 15/21] megaraid_sas: Print FW fault information

2019-04-26 Thread Shivasharan S
When driver detects a firmware fault during load, dump additional
information on fault code and subcode that will help in debugging.

Signed-off-by: Sumit Saxena 
Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas.h|  2 ++
 drivers/scsi/megaraid/megaraid_sas_base.c   |  5 -
 drivers/scsi/megaraid/megaraid_sas_fusion.c | 25 ++---
 3 files changed, 20 insertions(+), 12 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas.h 
b/drivers/scsi/megaraid/megaraid_sas.h
index 27980d68cf1b..8df6ef01785e 100644
--- a/drivers/scsi/megaraid/megaraid_sas.h
+++ b/drivers/scsi/megaraid/megaraid_sas.h
@@ -135,6 +135,8 @@
 #define MFI_RESET_ADAPTER  0x0002
 #define MEGAMFI_FRAME_SIZE 64
 
+#define MFI_STATE_FAULT_CODE   0x0FFF
+#define MFI_STATE_FAULT_SUBCODE0xFF00
 /*
  * During FW init, clear pending cmds & reset state using inbound_msg_0
  *
diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index 7a903bde2f48..a7ae10aa2e3f 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -3919,7 +3919,10 @@ megasas_transition_to_ready(struct megasas_instance 
*instance, int ocr)
switch (fw_state) {
 
case MFI_STATE_FAULT:
-   dev_printk(KERN_DEBUG, &instance->pdev->dev, "FW in 
FAULT state!!\n");
+   dev_printk(KERN_ERR, &instance->pdev->dev,
+  "FW in FAULT state, Fault code:0x%x 
subcode:0x%x func:%s\n",
+  abs_state & MFI_STATE_FAULT_CODE,
+  abs_state & MFI_STATE_FAULT_SUBCODE, 
__func__);
if (ocr) {
max_wait = MEGASAS_RESET_WAIT_TIME;
cur_state = MFI_STATE_FAULT;
diff --git a/drivers/scsi/megaraid/megaraid_sas_fusion.c 
b/drivers/scsi/megaraid/megaraid_sas_fusion.c
index 030c04435cd5..5a82e5ea420b 100644
--- a/drivers/scsi/megaraid/megaraid_sas_fusion.c
+++ b/drivers/scsi/megaraid/megaraid_sas_fusion.c
@@ -3984,7 +3984,7 @@ megasas_check_reset_fusion(struct megasas_instance 
*instance,
 static inline void megasas_trigger_snap_dump(struct megasas_instance *instance)
 {
int j;
-   u32 fw_state;
+   u32 fw_state, abs_state;
 
if (!instance->disableOnlineCtrlReset) {
dev_info(&instance->pdev->dev, "Trigger snap dump\n");
@@ -3994,11 +3994,13 @@ static inline void megasas_trigger_snap_dump(struct 
megasas_instance *instance)
}
 
for (j = 0; j < instance->snapdump_wait_time; j++) {
-   fw_state = instance->instancet->read_fw_status_reg(instance) &
-   MFI_STATE_MASK;
+   abs_state = instance->instancet->read_fw_status_reg(instance);
+   fw_state = abs_state & MFI_STATE_MASK;
if (fw_state == MFI_STATE_FAULT) {
-   dev_err(&instance->pdev->dev,
-   "Found FW in FAULT state, after snap dump 
trigger\n");
+   dev_printk(KERN_ERR, &instance->pdev->dev,
+  "FW in FAULT state Fault code:0x%x 
subcode:0x%x func:%s\n",
+  abs_state & MFI_STATE_FAULT_CODE,
+  abs_state & MFI_STATE_FAULT_SUBCODE, 
__func__);
return;
}
msleep(1000);
@@ -4010,7 +4012,7 @@ int megasas_wait_for_outstanding_fusion(struct 
megasas_instance *instance,
int reason, int *convert)
 {
int i, outstanding, retval = 0, hb_seconds_missed = 0;
-   u32 fw_state;
+   u32 fw_state, abs_state;
u32 waittime_for_io_completion;
 
waittime_for_io_completion =
@@ -4029,12 +4031,13 @@ int megasas_wait_for_outstanding_fusion(struct 
megasas_instance *instance,
 
for (i = 0; i < waittime_for_io_completion; i++) {
/* Check if firmware is in fault state */
-   fw_state = instance->instancet->read_fw_status_reg(instance) &
-   MFI_STATE_MASK;
+   abs_state = instance->instancet->read_fw_status_reg(instance);
+   fw_state = abs_state & MFI_STATE_MASK;
if (fw_state == MFI_STATE_FAULT) {
-   dev_warn(&instance->pdev->dev, "Found FW in FAULT 
state,"
-  " will reset adapter scsi%d.\n",
-   instance->host->host_no);
+   dev_printk(KERN_ERR, &instance->pdev-

[PATCH 19/21] megaraid_sas: Fix MSI-x vector print

2019-04-26 Thread Shivasharan S
Print FW supported MSI-x vector count only if FW supports
MSI-x.

Signed-off-by: Sumit Saxena 
Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas_base.c | 10 +-
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index 29fe77a8d2a6..18e157e3a99f 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -5681,7 +5681,7 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
void *base_addr_phys;
struct megasas_ctrl_info *ctrl_info = NULL;
unsigned long bar_list;
-   int i, j, loop, fw_msix_count = 0;
+   int i, j, loop;
struct IOV_111 *iovPtr;
struct fusion_context *fusion;
 
@@ -5802,7 +5802,6 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
/* Thunderbolt Series*/
instance->msix_vectors = (scratch_pad_1
& MR_MAX_REPLY_QUEUES_OFFSET) + 1;
-   fw_msix_count = instance->msix_vectors;
} else {
instance->msix_vectors = ((scratch_pad_1
& MR_MAX_REPLY_QUEUES_EXT_OFFSET)
@@ -5837,7 +5836,6 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
instance->smp_affinity_enable = false;
}
 
-   fw_msix_count = instance->msix_vectors;
/* Save 1-15 reply post index address to local 
memory
 * Index 0 is already saved from reg offset
 * MPI2_REPLY_POST_HOST_INDEX_OFFSET
@@ -5850,6 +5848,10 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
+ (loop * 0x10));
}
}
+
+   dev_info(&instance->pdev->dev,
+"firmware supports msix\t: (%d)",
+instance->msix_vectors);
if (msix_vectors)
instance->msix_vectors = min(msix_vectors,
instance->msix_vectors);
@@ -5892,8 +5894,6 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
 
megasas_setup_reply_map(instance);
 
-   dev_info(&instance->pdev->dev,
-   "firmware supports msix\t: (%d)", fw_msix_count);
dev_info(&instance->pdev->dev,
"current msix/online cpus\t: (%d/%d)\n",
instance->msix_vectors, (unsigned int)num_online_cpus());
-- 
2.16.1



[PATCH 21/21] megaraid_sas: Update driver version to 07.708.03.00

2019-04-26 Thread Shivasharan S
Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas.h | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas.h 
b/drivers/scsi/megaraid/megaraid_sas.h
index 56b3204d3fc6..e138d1447e43 100644
--- a/drivers/scsi/megaraid/megaraid_sas.h
+++ b/drivers/scsi/megaraid/megaraid_sas.h
@@ -33,8 +33,8 @@
 /*
  * MegaRAID SAS Driver meta data
  */
-#define MEGASAS_VERSION"07.707.51.00-rc1"
-#define MEGASAS_RELDATE"February 7, 2019"
+#define MEGASAS_VERSION"07.708.03.00-rc1"
+#define MEGASAS_RELDATE"March 14, 2019"
 
 /*
  * Device IDs
-- 
2.16.1



[PATCH 17/21] megaraid_sas: Add prints in suspend and resume path

2019-04-26 Thread Shivasharan S
Add prints in resume/suspend path to help in debugging
hibernation issues. The print gives an indication when the driver
entry points are called.

Signed-off-by: Sumit Saxena 
Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas_base.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index a7ae10aa2e3f..b1aedfb0963e 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -7244,6 +7244,8 @@ megasas_suspend(struct pci_dev *pdev, pm_message_t state)
host = instance->host;
instance->unload = 1;
 
+   dev_info(&pdev->dev, "%s is called\n", __func__);
+
/* Shutdown SR-IOV heartbeat timer */
if (instance->requestorId && !instance->skip_heartbeat_timer_del)
del_timer_sync(&instance->sriov_heartbeat_timer);
@@ -7298,6 +7300,7 @@ megasas_resume(struct pci_dev *pdev)
pci_enable_wake(pdev, PCI_D0, 0);
pci_restore_state(pdev);
 
+   dev_info(&pdev->dev, "%s is called\n", __func__);
/*
 * PCI prepping: enable device set bus mastering and dma mask
 */
-- 
2.16.1



[PATCH 11/21] megaraid_sas: Dump system interface regs from sysfs

2019-04-26 Thread Shivasharan S
Add a sysfs interface to dump the controller's system interface registers.

Signed-off-by: Sumit Saxena 
Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas_base.c | 37 +++
 1 file changed, 37 insertions(+)

diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index d0fd307e30af..5d2f346f3f49 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -2901,6 +2901,29 @@ megasas_dump_fusion_io(struct scsi_cmnd *scmd)
 
 }
 
+/*
+ * megasas_dump_sys_regs - This function will dump system registers through
+ * sysfs.
+ * @reg_set:   Pointer to System register set.
+ * @buf:   Buffer to which output is to be written.
+ * @return:Number of bytes written to buffer.
+ */
+static inline ssize_t
+megasas_dump_sys_regs(void __iomem *reg_set, char *buf)
+{
+   unsigned int i, sz = 256;
+   int bytes_wrote = 0;
+   char *loc = (char *)buf;
+
+   __le32 *reg = (__le32 *)reg_set;
+
+   for (i = 0; i < sz / sizeof(__le32); i++) {
+   bytes_wrote += snprintf(loc + bytes_wrote, PAGE_SIZE,
+   "%08x: %08x\n", (i * 4),
+   le32_to_cpu(readl(®[i])));
+   }
+   return bytes_wrote;
+}
 /**
  * megasas_reset_bus_host -Bus & host reset handler entry point
  */
@@ -3223,6 +3246,17 @@ megasas_fw_cmds_outstanding_show(struct device *cdev,
return snprintf(buf, PAGE_SIZE, "%d\n", 
atomic_read(&instance->fw_outstanding));
 }
 
+static ssize_t
+megasas_dump_system_regs_show(struct device *cdev,
+  struct device_attribute *attr, char *buf)
+{
+   struct Scsi_Host *shost = class_to_shost(cdev);
+   struct megasas_instance *instance =
+   (struct megasas_instance *)shost->hostdata;
+
+   return megasas_dump_sys_regs(instance->reg_set, buf);
+}
+
 static DEVICE_ATTR(fw_crash_buffer, S_IRUGO | S_IWUSR,
megasas_fw_crash_buffer_show, megasas_fw_crash_buffer_store);
 static DEVICE_ATTR(fw_crash_buffer_size, S_IRUGO,
@@ -3235,6 +3269,8 @@ static DEVICE_ATTR(ldio_outstanding, S_IRUGO,
megasas_ldio_outstanding_show, NULL);
 static DEVICE_ATTR(fw_cmds_outstanding, S_IRUGO,
megasas_fw_cmds_outstanding_show, NULL);
+static DEVICE_ATTR(dump_system_regs, S_IRUGO,
+   megasas_dump_system_regs_show, NULL);
 
 struct device_attribute *megaraid_host_attrs[] = {
&dev_attr_fw_crash_buffer_size,
@@ -3243,6 +3279,7 @@ struct device_attribute *megaraid_host_attrs[] = {
&dev_attr_page_size,
&dev_attr_ldio_outstanding,
&dev_attr_fw_cmds_outstanding,
+   &dev_attr_dump_system_regs,
NULL,
 };
 
-- 
2.16.1



[PATCH 20/21] megaraid_sas: Export RAID map through debugfs

2019-04-26 Thread Shivasharan S
Create a debugfs interface for megaraid_sas driver.
Provide interface to dump driver RAID map in debugfs.

Signed-off-by: Sumit Saxena 
Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/Makefile   |   2 +-
 drivers/scsi/megaraid/megaraid_sas.h |   4 +
 drivers/scsi/megaraid/megaraid_sas_base.c|  14 +++
 drivers/scsi/megaraid/megaraid_sas_debugfs.c | 180 +++
 drivers/scsi/megaraid/megaraid_sas_fusion.h  |   5 +
 5 files changed, 204 insertions(+), 1 deletion(-)
 create mode 100644 drivers/scsi/megaraid/megaraid_sas_debugfs.c

diff --git a/drivers/scsi/megaraid/Makefile b/drivers/scsi/megaraid/Makefile
index 6e74d21227a5..12177e4cae65 100644
--- a/drivers/scsi/megaraid/Makefile
+++ b/drivers/scsi/megaraid/Makefile
@@ -3,4 +3,4 @@ obj-$(CONFIG_MEGARAID_MM)   += megaraid_mm.o
 obj-$(CONFIG_MEGARAID_MAILBOX) += megaraid_mbox.o
 obj-$(CONFIG_MEGARAID_SAS) += megaraid_sas.o
 megaraid_sas-objs := megaraid_sas_base.o megaraid_sas_fusion.o \
-   megaraid_sas_fp.o
+   megaraid_sas_fp.o megaraid_sas_debugfs.o
diff --git a/drivers/scsi/megaraid/megaraid_sas.h 
b/drivers/scsi/megaraid/megaraid_sas.h
index 840506f2f33c..56b3204d3fc6 100644
--- a/drivers/scsi/megaraid/megaraid_sas.h
+++ b/drivers/scsi/megaraid/megaraid_sas.h
@@ -2390,6 +2390,10 @@ struct megasas_instance {
u8 task_abort_tmo;
u8 max_reset_tmo;
u8 snapdump_wait_time;
+#ifdef CONFIG_DEBUG_FS
+   struct dentry *debugfs_root;
+   struct dentry *raidmap_dump;
+#endif
u8 enable_fw_dev_list;
 };
 struct MR_LD_VF_MAP {
diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index 18e157e3a99f..e8fdf90e3a40 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -188,6 +188,12 @@ static bool support_nvme_encapsulation;
 /* define lock for aen poll */
 spinlock_t poll_aen_lock;
 
+extern struct dentry *megasas_debugfs_root;
+extern void megasas_init_debugfs(void);
+extern void megasas_exit_debugfs(void);
+extern void megasas_setup_debugfs(struct megasas_instance *instance);
+extern void megasas_destroy_debugfs(struct megasas_instance *instance);
+
 void
 megasas_complete_cmd(struct megasas_instance *instance, struct megasas_cmd 
*cmd,
 u8 alt_status);
@@ -7141,6 +7147,8 @@ static int megasas_probe_one(struct pci_dev *pdev,
goto fail_start_aen;
}
 
+   megasas_setup_debugfs(instance);
+
/* Get current SR-IOV LD/VF affiliation */
if (instance->requestorId)
megasas_get_ld_vf_affiliation(instance, 1);
@@ -7611,6 +7619,8 @@ static void megasas_detach_one(struct pci_dev *pdev)
 
megasas_free_ctrl_mem(instance);
 
+   megasas_destroy_debugfs(instance);
+
scsi_host_put(host);
 
pci_disable_device(pdev);
@@ -8538,6 +8548,8 @@ static int __init megasas_init(void)
 
megasas_mgmt_majorno = rval;
 
+   megasas_init_debugfs();
+
/*
 * Register ourselves as PCI hotplug module
 */
@@ -8597,6 +8609,7 @@ static int __init megasas_init(void)
 err_dcf_attr_ver:
pci_unregister_driver(&megasas_pci_driver);
 err_pcidrv:
+   megasas_exit_debugfs();
unregister_chrdev(megasas_mgmt_majorno, "megaraid_sas_ioctl");
return rval;
 }
@@ -8619,6 +8632,7 @@ static void __exit megasas_exit(void)
   &driver_attr_support_nvme_encapsulation);
 
pci_unregister_driver(&megasas_pci_driver);
+   megasas_exit_debugfs();
unregister_chrdev(megasas_mgmt_majorno, "megaraid_sas_ioctl");
 }
 
diff --git a/drivers/scsi/megaraid/megaraid_sas_debugfs.c 
b/drivers/scsi/megaraid/megaraid_sas_debugfs.c
new file mode 100644
index ..e52837bb6807
--- /dev/null
+++ b/drivers/scsi/megaraid/megaraid_sas_debugfs.c
@@ -0,0 +1,180 @@
+/*
+ *  Linux MegaRAID driver for SAS based RAID controllers
+ *
+ *  Copyright (c) 2003-2018  LSI Corporation.
+ *  Copyright (c) 2003-2018  Avago Technologies.
+ *  Copyright (c) 2003-2018  Broadcom Inc.
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ *  Authors: Broadcom Inc.
+ *   Kashyap Desai 
+ *   Sumit Saxena 
+ *   Shivasharan S 
+ *
+ *  Send feedback to: megaraidlinux..

[PATCH 13/21] megaraid_sas: Print BAR information from driver

2019-04-26 Thread Shivasharan S
Add prints for BAR address information during driver load.
This helps in debugging issues with BAR address changing during
OS boot.

Signed-off-by: Sumit Saxena 
Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas_base.c | 6 ++
 1 file changed, 6 insertions(+)

diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index 5725d4cfbd14..84ec4ab03364 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -5625,6 +5625,7 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
u32 max_sectors_2, tmp_sectors, msix_enable;
u32 scratch_pad_1, scratch_pad_2, scratch_pad_3, status_reg;
resource_size_t base_addr;
+   void *base_addr_phys;
struct megasas_ctrl_info *ctrl_info = NULL;
unsigned long bar_list;
int i, j, loop, fw_msix_count = 0;
@@ -5650,6 +5651,11 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
goto fail_ioremap;
}
 
+   base_addr_phys = &base_addr;
+   dev_printk(KERN_DEBUG, &instance->pdev->dev,
+  "BAR:0x%lx  BAR's base_addr(phys):%pa  mapped 
virt_addr:0x%p\n",
+  instance->bar, base_addr_phys, instance->reg_set);
+
if (instance->adapter_type != MFI_SERIES)
instance->instancet = &megasas_instance_template_fusion;
else {
-- 
2.16.1



[PATCH 14/21] megaraid_sas: Export RAID map id through sysfs

2019-04-26 Thread Shivasharan S
Add a sysfs interface to get the raid map index that is being used by
driver.

Signed-off-by: Sumit Saxena 
Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas_base.c | 15 +++
 1 file changed, 15 insertions(+)

diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index 84ec4ab03364..7a903bde2f48 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -3275,6 +3275,18 @@ megasas_dump_system_regs_show(struct device *cdev,
return megasas_dump_sys_regs(instance->reg_set, buf);
 }
 
+static ssize_t
+megasas_raid_map_id_show(struct device *cdev, struct device_attribute *attr,
+ char *buf)
+{
+   struct Scsi_Host *shost = class_to_shost(cdev);
+   struct megasas_instance *instance =
+   (struct megasas_instance *)shost->hostdata;
+
+   return snprintf(buf, PAGE_SIZE, "%ld\n",
+   (unsigned long)instance->map_id);
+}
+
 static DEVICE_ATTR(fw_crash_buffer, S_IRUGO | S_IWUSR,
megasas_fw_crash_buffer_show, megasas_fw_crash_buffer_store);
 static DEVICE_ATTR(fw_crash_buffer_size, S_IRUGO,
@@ -3289,6 +3301,8 @@ static DEVICE_ATTR(fw_cmds_outstanding, S_IRUGO,
megasas_fw_cmds_outstanding_show, NULL);
 static DEVICE_ATTR(dump_system_regs, S_IRUGO,
megasas_dump_system_regs_show, NULL);
+static DEVICE_ATTR(raid_map_id, S_IRUGO,
+   megasas_raid_map_id_show, NULL);
 
 struct device_attribute *megaraid_host_attrs[] = {
&dev_attr_fw_crash_buffer_size,
@@ -3298,6 +3312,7 @@ struct device_attribute *megaraid_host_attrs[] = {
&dev_attr_ldio_outstanding,
&dev_attr_fw_cmds_outstanding,
&dev_attr_dump_system_regs,
+   &dev_attr_raid_map_id,
NULL,
 };
 
-- 
2.16.1



[PATCH 18/21] megaraid_sas: Add debug prints for device list

2019-04-26 Thread Shivasharan S
Add debug prints related to device list being returned by firmware.
The a debug flag to activate these prints.

Signed-off-by: Sumit Saxena 
Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas.h  |  1 +
 drivers/scsi/megaraid/megaraid_sas_base.c | 35 +++
 2 files changed, 36 insertions(+)

diff --git a/drivers/scsi/megaraid/megaraid_sas.h 
b/drivers/scsi/megaraid/megaraid_sas.h
index 8df6ef01785e..840506f2f33c 100644
--- a/drivers/scsi/megaraid/megaraid_sas.h
+++ b/drivers/scsi/megaraid/megaraid_sas.h
@@ -1499,6 +1499,7 @@ struct megasas_ctrl_info {
 /* Driver's internal Logging levels*/
 #define OCR_DEBUG(1 << 0)
 #define TM_DEBUG (1 << 1)
+#define LD_PD_DEBUG(1 << 2)
 
 #define SCAN_PD_CHANNEL0x1
 #define SCAN_VD_CHANNEL0x2
diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index b1aedfb0963e..29fe77a8d2a6 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -4512,6 +4512,9 @@ megasas_get_pd_list(struct megasas_instance *instance)
 
case DCMD_SUCCESS:
pd_addr = ci->addr;
+   if (megasas_dbg_lvl & LD_PD_DEBUG)
+   dev_info(&instance->pdev->dev, "%s, sysPD count: 
0x%x\n",
+__func__, le32_to_cpu(ci->count));
 
if ((le32_to_cpu(ci->count) >
(MEGASAS_MAX_PD_CHANNELS * 
MEGASAS_MAX_DEV_PER_CHANNEL)))
@@ -4527,6 +4530,11 @@ megasas_get_pd_list(struct megasas_instance *instance)
pd_addr->scsiDevType;

instance->local_pd_list[le16_to_cpu(pd_addr->deviceId)].driveState  =
MR_PD_STATE_SYSTEM;
+   if (megasas_dbg_lvl & LD_PD_DEBUG)
+   dev_info(&instance->pdev->dev,
+"PD%d: targetID: 0x%03x 
deviceType:0x%x\n",
+pd_index, 
le16_to_cpu(pd_addr->deviceId),
+pd_addr->scsiDevType);
pd_addr++;
}
 
@@ -4630,6 +4638,10 @@ megasas_get_ld_list(struct megasas_instance *instance)
break;
 
case DCMD_SUCCESS:
+   if (megasas_dbg_lvl & LD_PD_DEBUG)
+   dev_info(&instance->pdev->dev, "%s, LD count: 0x%x\n",
+__func__, ld_count);
+
if (ld_count > instance->fw_supported_vd_count)
break;
 
@@ -4639,6 +4651,10 @@ megasas_get_ld_list(struct megasas_instance *instance)
if (ci->ldList[ld_index].state != 0) {
ids = ci->ldList[ld_index].ref.targetId;
instance->ld_ids[ids] = 
ci->ldList[ld_index].ref.targetId;
+   if (megasas_dbg_lvl & LD_PD_DEBUG)
+   dev_info(&instance->pdev->dev,
+"LD%d: targetID: 0x%03x\n",
+ld_index, ids);
}
}
 
@@ -4742,6 +4758,10 @@ megasas_ld_list_query(struct megasas_instance *instance, 
u8 query_type)
case DCMD_SUCCESS:
tgtid_count = le32_to_cpu(ci->count);
 
+   if (megasas_dbg_lvl & LD_PD_DEBUG)
+   dev_info(&instance->pdev->dev, "%s, LD count: 0x%x\n",
+__func__, tgtid_count);
+
if ((tgtid_count > (instance->fw_supported_vd_count)))
break;
 
@@ -4749,6 +4769,9 @@ megasas_ld_list_query(struct megasas_instance *instance, 
u8 query_type)
for (ld_index = 0; ld_index < tgtid_count; ld_index++) {
ids = ci->targetId[ld_index];
instance->ld_ids[ids] = ci->targetId[ld_index];
+   if (megasas_dbg_lvl & LD_PD_DEBUG)
+   dev_info(&instance->pdev->dev, "LD%d: targetID: 
0x%03x\n",
+ld_index, ci->targetId[ld_index]);
}
 
break;
@@ -4828,6 +4851,10 @@ megasas_host_device_list_query(struct megasas_instance 
*instance,
 */
count = le32_to_cpu(ci->count);
 
+   if (megasas_dbg_lvl & LD_PD_DEBUG)
+   dev_info(&instance->pdev->dev, "%s, Device count: 
0x%x\n",
+__func__, count);
+
memse

[PATCH 16/21] megaraid_sas: Print firmware interrupt status

2019-04-26 Thread Shivasharan S
Add a print to dump the interrupt status in system log
for debugging.

Signed-off-by: Sumit Saxena 
Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas_fusion.c | 13 +++--
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas_fusion.c 
b/drivers/scsi/megaraid/megaraid_sas_fusion.c
index 5a82e5ea420b..2fa9941514d9 100644
--- a/drivers/scsi/megaraid/megaraid_sas_fusion.c
+++ b/drivers/scsi/megaraid/megaraid_sas_fusion.c
@@ -202,7 +202,8 @@ megasas_enable_intr_fusion(struct megasas_instance 
*instance)
writel(~MFI_FUSION_ENABLE_INTERRUPT_MASK, &(regs)->outbound_intr_mask);
 
/* Dummy readl to force pci flush */
-   readl(®s->outbound_intr_mask);
+   dev_info(&instance->pdev->dev, "%s is called 
outbound_intr_mask:0x%08x\n",
+__func__, readl(®s->outbound_intr_mask));
 }
 
 /**
@@ -213,14 +214,14 @@ void
 megasas_disable_intr_fusion(struct megasas_instance *instance)
 {
u32 mask = 0x;
-   u32 status;
struct megasas_register_set __iomem *regs;
regs = instance->reg_set;
instance->mask_interrupts = 1;
 
writel(mask, ®s->outbound_intr_mask);
/* Dummy readl to force pci flush */
-   status = readl(®s->outbound_intr_mask);
+   dev_info(&instance->pdev->dev, "%s is called 
outbound_intr_mask:0x%08x\n",
+__func__, readl(®s->outbound_intr_mask));
 }
 
 int
@@ -4895,9 +4896,9 @@ int megasas_reset_fusion(struct Scsi_Host *shost, int 
reason)
 
atomic_set(&instance->adprecovery, 
MEGASAS_HBA_OPERATIONAL);
 
-   dev_info(&instance->pdev->dev, "Interrupts are enabled 
and"
-   " controller is OPERATIONAL for scsi:%d\n",
-   instance->host->host_no);
+   dev_info(&instance->pdev->dev,
+"Adapter is OPERATIONAL for scsi:%d\n",
+instance->host->host_no);
 
/* Restart SR-IOV heartbeat */
if (instance->requestorId) {
-- 
2.16.1



[PATCH 07/21] megaraid_sas: Load balance completions across all MSIx

2019-04-26 Thread Shivasharan S
Driver will use "reply descriptor post queues" in round robin fashion
when the combined MSI-x mode is not enabled. With this IO completions
are distributed and loadbalanced across all the available reply
descriptor post queues equally.

This is enabled only if combined MSI-x mode is not enabled in firmware.
This improves performance and also fixes soft lockups.

When load balancing is enabled, IRQ affinity from driver needs to be
disabled.

Signed-off-by: Kashyap Desai 
Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas.h|  3 +++
 drivers/scsi/megaraid/megaraid_sas_base.c   | 22 ++
 drivers/scsi/megaraid/megaraid_sas_fusion.c | 18 ++
 3 files changed, 35 insertions(+), 8 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas.h 
b/drivers/scsi/megaraid/megaraid_sas.h
index 8d6a9c511455..6be748f302cf 100644
--- a/drivers/scsi/megaraid/megaraid_sas.h
+++ b/drivers/scsi/megaraid/megaraid_sas.h
@@ -2262,6 +2262,7 @@ struct megasas_instance {
u32 secure_jbod_support;
u32 support_morethan256jbod; /* FW support for more than 256 PD/JBOD */
bool use_seqnum_jbod_fp;   /* Added for PD sequence */
+   bool smp_affinity_enable;
spinlock_t crashdump_lock;
 
struct megasas_register_set __iomem *reg_set;
@@ -2279,6 +2280,7 @@ struct megasas_instance {
u16 ldio_threshold;
u16 cur_can_queue;
u32 max_sectors_per_req;
+   bool msix_load_balance;
struct megasas_aen_event *ev;
 
struct megasas_cmd **cmd_list;
@@ -2316,6 +2318,7 @@ struct megasas_instance {
atomic_t sge_holes_type1;
atomic_t sge_holes_type2;
atomic_t sge_holes_type3;
+   atomic64_t total_io_count;
 
struct megasas_instance_template *instancet;
struct tasklet_struct isr_tasklet;
diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index f7ffa72e9572..102a7e40996e 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -5350,6 +5350,7 @@ megasas_setup_irqs_msix(struct megasas_instance 
*instance, u8 is_probe)
 &instance->irq_context[j]);
/* Retry irq register for IO_APIC*/
instance->msix_vectors = 0;
+   instance->msix_load_balance = false;
if (is_probe) {
pci_free_irq_vectors(instance->pdev);
return megasas_setup_irqs_ioapic(instance);
@@ -5358,6 +5359,7 @@ megasas_setup_irqs_msix(struct megasas_instance 
*instance, u8 is_probe)
}
}
}
+
return 0;
 }
 
@@ -5661,6 +5663,12 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
if (rdpq_enable)
instance->is_rdpq = (scratch_pad_1 & 
MR_RDPQ_MODE_OFFSET) ?
1 : 0;
+
+   if (!instance->msix_combined) {
+   instance->msix_load_balance = true;
+   instance->smp_affinity_enable = false;
+   }
+
fw_msix_count = instance->msix_vectors;
/* Save 1-15 reply post index address to local 
memory
 * Index 0 is already saved from reg offset
@@ -5679,17 +5687,20 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
instance->msix_vectors);
} else /* MFI adapters */
instance->msix_vectors = 1;
+
/* Don't bother allocating more MSI-X vectors than cpus */
instance->msix_vectors = min(instance->msix_vectors,
 (unsigned int)num_online_cpus());
-   if (smp_affinity_enable)
+   if (instance->smp_affinity_enable)
irq_flags |= PCI_IRQ_AFFINITY;
i = pci_alloc_irq_vectors(instance->pdev, 1,
  instance->msix_vectors, irq_flags);
-   if (i > 0)
+   if (i > 0) {
instance->msix_vectors = i;
-   else
+   } else {
instance->msix_vectors = 0;
+   instance->msix_load_balance = false;
+   }
}
/*
 * MSI-X host index 0 is common for all adapter.
@@ -6797,6 +6808,7 @@ static inline void megasas_init_ctrl_params(struct 
megasas_instance *instance)
INIT_LIST_HEAD(&instance->internal_reset_pending_q);
 
  

[PATCH 08/21] megaraid_sas: Enhance prints in OCR and TM path

2019-04-26 Thread Shivasharan S
This patch enhances the existing debug prints in reset and
task management path.
These debug prints in adapter reset path helps with debugging issues
related to IO timeouts that are seen frequently in the field.
Add additional debug prints to dump the pending command frames before
initiating a adapter reset.
Also, print FastPath IOs that are outstanding.

Signed-off-by: Sumit Saxena 
Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas.h|  4 +-
 drivers/scsi/megaraid/megaraid_sas_base.c   | 69 ++---
 drivers/scsi/megaraid/megaraid_sas_fusion.c | 44 +-
 3 files changed, 80 insertions(+), 37 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas.h 
b/drivers/scsi/megaraid/megaraid_sas.h
index 6be748f302cf..27980d68cf1b 100644
--- a/drivers/scsi/megaraid/megaraid_sas.h
+++ b/drivers/scsi/megaraid/megaraid_sas.h
@@ -1495,7 +1495,8 @@ struct megasas_ctrl_info {
 #define MEGASAS_FW_BUSY1
 
 /* Driver's internal Logging levels*/
-#define OCR_LOGS(1 << 0)
+#define OCR_DEBUG(1 << 0)
+#define TM_DEBUG (1 << 1)
 
 #define SCAN_PD_CHANNEL0x1
 #define SCAN_VD_CHANNEL0x2
@@ -2647,4 +2648,5 @@ int megasas_adp_reset_wait_for_ready(struct 
megasas_instance *instance,
 bool do_adp_reset,
 int ocr_context);
 int megasas_irqpoll(struct irq_poll *irqpoll, int budget);
+void megasas_dump_fusion_io(struct scsi_cmnd *scmd);
 #endif /*LSI_MEGARAID_SAS_H */
diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index 102a7e40996e..032d91b1f3ba 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -55,6 +55,7 @@
 #include 
 #include 
 #include 
+#include 
 #include "megaraid_sas_fusion.h"
 #include "megaraid_sas.h"
 
@@ -2833,23 +2834,63 @@ blk_eh_timer_return megasas_reset_timer(struct 
scsi_cmnd *scmd)
 }
 
 /**
- * megasas_dump_frame -This function will dump MPT/MFI frame
+ * megasas_dump -  This function will provide hexdump
+ * @ptr:   Pointer starting which memory should be dumped
+ * @size:  Size of memory to be dumped
  */
-static inline void
-megasas_dump_frame(void *mpi_request, int sz)
+inline void
+megasas_dump(void *ptr, int sz)
 {
int i;
-   __le32 *mfp = (__le32 *)mpi_request;
+   __le32 *loc = (__le32 *)ptr;
 
-   printk(KERN_INFO "IO request frame:\n\t");
for (i = 0; i < sz / sizeof(__le32); i++) {
if (i && ((i % 8) == 0))
printk("\n\t");
-   printk("%08x ", le32_to_cpu(mfp[i]));
+   printk("%08x ", le32_to_cpu(loc[i]));
}
printk("\n");
 }
 
+/**
+ * megasas_dump_fusion_io -This function will print key details
+ * of SCSI IO
+ * @scmd:  SCSI command pointer of SCSI IO
+ */
+void
+megasas_dump_fusion_io(struct scsi_cmnd *scmd)
+{
+   struct megasas_cmd_fusion *cmd;
+   union MEGASAS_REQUEST_DESCRIPTOR_UNION *req_desc;
+   struct megasas_instance *instance;
+
+   cmd = (struct megasas_cmd_fusion *)scmd->SCp.ptr;
+   instance = (struct megasas_instance *)scmd->device->host->hostdata;
+
+   scmd_printk(KERN_INFO, scmd,
+   "scmd: (0x%p)  retries: 0x%x  allowed: 0x%x\n",
+   scmd, scmd->retries, scmd->allowed);
+   scsi_print_command(scmd);
+
+   if (cmd) {
+   req_desc = (union MEGASAS_REQUEST_DESCRIPTOR_UNION 
*)cmd->request_desc;
+   scmd_printk(KERN_INFO, scmd, "Request descriptor details:\n");
+   scmd_printk(KERN_INFO, scmd,
+   "RequestFlags:0x%x  MSIxIndex:0x%x  SMID:0x%x  
LMID:0x%x  DevHandle:0x%x\n",
+   req_desc->SCSIIO.RequestFlags,
+   req_desc->SCSIIO.MSIxIndex, req_desc->SCSIIO.SMID,
+   req_desc->SCSIIO.LMID, req_desc->SCSIIO.DevHandle);
+
+   printk(KERN_INFO "IO request frame:\n");
+   megasas_dump(cmd->io_request,
+MEGA_MPI2_RAID_DEFAULT_IO_FRAME_SIZE);
+   printk(KERN_INFO "Chain frame:\n");
+   megasas_dump(cmd->sg_frame,
+instance->max_chain_frame_sz);
+   }
+
+}
+
 /**
  * megasas_reset_bus_host -Bus & host reset handler entry point
  */
@@ -2861,24 +2902,20 @@ static int megasas_reset_bus_host(struct scsi_cmnd 
*scmd)
instance = (struct megasas_instance *)scmd->device->host->hostdata;
 
scmd_printk(KERN_INFO, scmd,
-   "Controller reset i

[PATCH 05/21] megaraid_sas: Block PCI config space access from userspace during OCR

2019-04-26 Thread Shivasharan S
While an online controller reset(OCR) is in progress, there is short
duration where all access to controller's PCI config space from
the host needs to be blocked.
This is due to a hardware limitation of MegaRAID controllers.

With this patch, driver will block all access to controller's config
space from userland applications by calling pci_cfg_access_lock()
while OCR is in progress and unlocking after controller comes back to
ready state.

Added helper function which locks the config space before initiating OCR
and wait for controller to become READY.

Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas.h|  3 ++
 drivers/scsi/megaraid/megaraid_sas_base.c   | 15 ---
 drivers/scsi/megaraid/megaraid_sas_fusion.c | 66 +++--
 3 files changed, 74 insertions(+), 10 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas.h 
b/drivers/scsi/megaraid/megaraid_sas.h
index 902b11b97999..990ee23d7bc2 100644
--- a/drivers/scsi/megaraid/megaraid_sas.h
+++ b/drivers/scsi/megaraid/megaraid_sas.h
@@ -2636,4 +2636,7 @@ void megasas_fusion_stop_watchdog(struct megasas_instance 
*instance);
 void megasas_set_dma_settings(struct megasas_instance *instance,
  struct megasas_dcmd_frame *dcmd,
  dma_addr_t dma_addr, u32 dma_len);
+int megasas_adp_reset_wait_for_ready(struct megasas_instance *instance,
+bool do_adp_reset,
+int ocr_context);
 #endif /*LSI_MEGARAID_SAS_H */
diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index 77db6e773a01..5e5170b40f6f 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -5535,13 +5535,15 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
}
 
if (megasas_transition_to_ready(instance, 0)) {
+   dev_info(&instance->pdev->dev,
+"Failed to transition controller to ready from %s!\n",
+__func__);
if (instance->adapter_type != MFI_SERIES) {
status_reg = instance->instancet->read_fw_status_reg(
instance);
if (status_reg & MFI_RESET_ADAPTER) {
-   instance->instancet->adp_reset
-   (instance, instance->reg_set);
-   if (megasas_transition_to_ready(instance, 0))
+   if (megasas_adp_reset_wait_for_ready
+   (instance, true, 0) == FAILED)
goto fail_ready_state;
} else {
goto fail_ready_state;
@@ -5551,9 +5553,6 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
instance->instancet->adp_reset
(instance, instance->reg_set);
atomic_set(&instance->fw_reset_no_pci_access, 0);
-   dev_info(&instance->pdev->dev,
-"FW restarted successfully from %s!\n",
-__func__);
 
/*waiting for about 30 second before retry*/
ssleep(30);
@@ -5561,6 +5560,10 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
if (megasas_transition_to_ready(instance, 0))
goto fail_ready_state;
}
+
+   dev_info(&instance->pdev->dev,
+"FW restarted successfully from %s!\n",
+__func__);
}
 
megasas_init_ctrl_params(instance);
diff --git a/drivers/scsi/megaraid/megaraid_sas_fusion.c 
b/drivers/scsi/megaraid/megaraid_sas_fusion.c
index 76bd29c92752..59bab98274f6 100644
--- a/drivers/scsi/megaraid/megaraid_sas_fusion.c
+++ b/drivers/scsi/megaraid/megaraid_sas_fusion.c
@@ -98,6 +98,62 @@ static void megasas_fusion_crash_dump(struct 
megasas_instance *instance);
 extern u32 megasas_readl(struct megasas_instance *instance,
 const volatile void __iomem *addr);
 
+/**
+ * megasas_adp_reset_wait_for_ready -  initiate chip reset and wait for
+ * controller to come to ready state
+ * @instance - adapter's soft state
+ * @do_adp_reset - If true, do a chip reset
+ * @ocr_context -  If called from OCR context this will
+ * be set to 1, else 0
+ *
+ * This functon initates a chip reset followed by a wait for controller to
+ * transition to ready state.
+ * During 

[PATCH 03/21] megaraid_sas: fw_reset_no_pci_access required for MFI adapters only

2019-04-26 Thread Shivasharan S
fw_reset_no_pci_access is only applicable for MFI controllers and is not
used for Fusion controllers.

For all Fusion controllers, driver can check reset adapter bit in
status register before performing a chip reset, without
setting "fw_reset_no_pci_access".

Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas_base.c | 18 ++
 1 file changed, 10 insertions(+), 8 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index d2714fc833ae..77db6e773a01 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -5489,7 +5489,6 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
int i, j, loop, fw_msix_count = 0;
struct IOV_111 *iovPtr;
struct fusion_context *fusion;
-   bool do_adp_reset = true;
 
fusion = instance->ctrl_context;
 
@@ -5536,13 +5535,18 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
}
 
if (megasas_transition_to_ready(instance, 0)) {
-   if (instance->adapter_type >= INVADER_SERIES) {
+   if (instance->adapter_type != MFI_SERIES) {
status_reg = instance->instancet->read_fw_status_reg(
instance);
-   do_adp_reset = status_reg & MFI_RESET_ADAPTER;
-   }
-
-   if (do_adp_reset) {
+   if (status_reg & MFI_RESET_ADAPTER) {
+   instance->instancet->adp_reset
+   (instance, instance->reg_set);
+   if (megasas_transition_to_ready(instance, 0))
+   goto fail_ready_state;
+   } else {
+   goto fail_ready_state;
+   }
+   } else {
atomic_set(&instance->fw_reset_no_pci_access, 1);
instance->instancet->adp_reset
(instance, instance->reg_set);
@@ -5556,8 +5560,6 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
 
if (megasas_transition_to_ready(instance, 0))
goto fail_ready_state;
-   } else {
-   goto fail_ready_state;
}
}
 
-- 
2.16.1



[PATCH 06/21] megaraid_sas: IRQ poll to avoid CPU hard lockups

2019-04-26 Thread Shivasharan S
CPU hard lockups due to
voluntary exit from the reply queue processing based on budget.
Note - Only one MSI-x vector is busy doing processing.

Select CONFIG_IRQ_POLL from driver Kconfig for driver compilation.

Signed-off-by: Kashyap Desai 
Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/Kconfig.megaraid  |   1 +
 drivers/scsi/megaraid/megaraid_sas.h|   5 ++
 drivers/scsi/megaraid/megaraid_sas_base.c   |  36 
 drivers/scsi/megaraid/megaraid_sas_fp.c |   1 +
 drivers/scsi/megaraid/megaraid_sas_fusion.c | 122 +---
 drivers/scsi/megaraid/megaraid_sas_fusion.h |   1 -
 6 files changed, 136 insertions(+), 30 deletions(-)

diff --git a/drivers/scsi/megaraid/Kconfig.megaraid 
b/drivers/scsi/megaraid/Kconfig.megaraid
index 17419e30ffc8..1fa9d095ae36 100644
--- a/drivers/scsi/megaraid/Kconfig.megaraid
+++ b/drivers/scsi/megaraid/Kconfig.megaraid
@@ -78,6 +78,7 @@ config MEGARAID_LEGACY
 config MEGARAID_SAS
tristate "LSI Logic MegaRAID SAS RAID Module"
depends on PCI && SCSI
+   select IRQ_POLL
help
Module for LSI Logic's SAS based RAID controllers.
To compile this driver as a module, choose 'm' here.
diff --git a/drivers/scsi/megaraid/megaraid_sas.h 
b/drivers/scsi/megaraid/megaraid_sas.h
index 990ee23d7bc2..8d6a9c511455 100644
--- a/drivers/scsi/megaraid/megaraid_sas.h
+++ b/drivers/scsi/megaraid/megaraid_sas.h
@@ -2173,6 +2173,9 @@ struct megasas_aen_event {
 struct megasas_irq_context {
struct megasas_instance *instance;
u32 MSIxIndex;
+   u32 os_irq;
+   struct irq_poll irqpoll;
+   bool irq_poll_scheduled;
 };
 
 struct MR_DRV_SYSTEM_INFO {
@@ -2303,6 +2306,7 @@ struct megasas_instance {
struct pci_dev *pdev;
u32 unique_id;
u32 fw_support_ieee;
+   u32 threshold_reply_count;
 
atomic_t fw_outstanding;
atomic_t ldio_outstanding;
@@ -2639,4 +2643,5 @@ void megasas_set_dma_settings(struct megasas_instance 
*instance,
 int megasas_adp_reset_wait_for_ready(struct megasas_instance *instance,
 bool do_adp_reset,
 int ocr_context);
+int megasas_irqpoll(struct irq_poll *irqpoll, int budget);
 #endif /*LSI_MEGARAID_SAS_H */
diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index 5e5170b40f6f..f7ffa72e9572 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -48,6 +48,7 @@
 #include 
 #include 
 #include 
+#include 
 
 #include 
 #include 
@@ -5272,6 +5273,25 @@ megasas_init_adapter_mfi(struct megasas_instance 
*instance)
return 1;
 }
 
+static
+void megasas_setup_irq_poll(struct megasas_instance *instance)
+{
+   struct megasas_irq_context *irq_ctx;
+   u32 count, i;
+
+   count = instance->msix_vectors > 0 ? instance->msix_vectors : 1;
+
+   /* Initialize IRQ poll */
+   for (i = 0; i < count; i++) {
+   irq_ctx = &instance->irq_context[i];
+   irq_ctx->os_irq = pci_irq_vector(instance->pdev, i);
+   irq_ctx->irq_poll_scheduled = false;
+   irq_poll_init(&irq_ctx->irqpoll,
+ instance->threshold_reply_count,
+ megasas_irqpoll);
+   }
+}
+
 /*
  * megasas_setup_irqs_ioapic - register legacy interrupts.
  * @instance:  Adapter soft state
@@ -5350,6 +5370,16 @@ static void
 megasas_destroy_irqs(struct megasas_instance *instance) {
 
int i;
+   int count;
+   struct megasas_irq_context *irq_ctx;
+
+   count = instance->msix_vectors > 0 ? instance->msix_vectors : 1;
+   if (instance->adapter_type != MFI_SERIES) {
+   for (i = 0; i < count; i++) {
+   irq_ctx = &instance->irq_context[i];
+   irq_poll_disable(&irq_ctx->irqpoll);
+   }
+   }
 
if (instance->msix_vectors)
for (i = 0; i < instance->msix_vectors; i++) {
@@ -5722,6 +5752,9 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
megasas_setup_irqs_ioapic(instance))
goto fail_init_adapter;
 
+   if (instance->adapter_type != MFI_SERIES)
+   megasas_setup_irq_poll(instance);
+
instance->instancet->enable_intr(instance);
 
dev_info(&instance->pdev->dev, "INIT adapter done\n");
@@ -7187,6 +7220,9 @@ megasas_resume(struct pci_dev *pdev)
megasas_setup_irqs_ioapic(instance))
goto fail_init_mfi;
 
+   if (instance->adapter_type != MFI_SERIES)
+   megasas_setup_irq_poll(instance);
+
/* Re-launch SR-IOV heartbeat timer */
if (instance->requestorId) {

[PATCH 02/21] megaraid_sas: Fix calculation of target ID

2019-04-26 Thread Shivasharan S
In megasas_get_target_prop(), driver is incorrectly calculating the
target ID for devices with channel 1 and 3.
Due to this, firmware will either fail the command (if there is no
device with the target id sent from driver) or could return the
properties for a target which was not intended.
Devices could end up with the wrong queue depth due to this.

Fix target id calculation for channel 1 and 3.

Cc: sta...@vger.kernel.org
Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas_base.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index f677a84f6bc8..d2714fc833ae 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -6165,7 +6165,8 @@ megasas_get_target_prop(struct megasas_instance *instance,
int ret;
struct megasas_cmd *cmd;
struct megasas_dcmd_frame *dcmd;
-   u16 targetId = (sdev->channel % 2) + sdev->id;
+   u16 targetId = ((sdev->channel % 2) * MEGASAS_MAX_DEV_PER_CHANNEL) +
+   sdev->id;
 
cmd = megasas_get_cmd(instance);
 
-- 
2.16.1



[PATCH 09/21] megaraid_sas: Enhance internal DCMD timeout prints

2019-04-26 Thread Shivasharan S
Add prints to identify the internal DCMD opcode that has timed out,
for debugging.

Signed-off-by: Sumit Saxena 
Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas_base.c | 12 
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index 032d91b1f3ba..7449df36a092 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -1113,8 +1113,9 @@ megasas_issue_blocked_cmd(struct megasas_instance 
*instance,
ret = wait_event_timeout(instance->int_cmd_wait_q,
cmd->cmd_status_drv != MFI_STAT_INVALID_STATUS, 
timeout * HZ);
if (!ret) {
-   dev_err(&instance->pdev->dev, "Failed from %s %d DCMD 
Timed out\n",
-   __func__, __LINE__);
+   dev_err(&instance->pdev->dev,
+   "DCMD(opcode: 0x%x) is timed out, func:%s\n",
+   cmd->frame->dcmd.opcode, __func__);
return DCMD_TIMEOUT;
}
} else
@@ -1143,6 +1144,7 @@ megasas_issue_blocked_abort_cmd(struct megasas_instance 
*instance,
struct megasas_cmd *cmd;
struct megasas_abort_frame *abort_fr;
int ret = 0;
+   u32 opcode;
 
cmd = megasas_get_cmd(instance);
 
@@ -1178,8 +1180,10 @@ megasas_issue_blocked_abort_cmd(struct megasas_instance 
*instance,
ret = wait_event_timeout(instance->abort_cmd_wait_q,
cmd->cmd_status_drv != MFI_STAT_INVALID_STATUS, 
timeout * HZ);
if (!ret) {
-   dev_err(&instance->pdev->dev, "Failed from %s %d Abort 
Timed out\n",
-   __func__, __LINE__);
+   opcode = cmd_to_abort->frame->dcmd.opcode;
+   dev_err(&instance->pdev->dev,
+   "Abort(to be aborted DCMD opcode: 0x%x) is 
timed out func:%s\n",
+   opcode,  __func__);
return DCMD_TIMEOUT;
}
} else
-- 
2.16.1



[PATCH 01/21] megaraid_sas: remove unused variable target_index

2019-04-26 Thread Shivasharan S
No functional change.
Remove set but unused variable in megasas_set_static_target_properties.

Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas_base.c | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index bbe6972f3477..f677a84f6bc8 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -1931,7 +1931,6 @@ megasas_set_nvme_device_properties(struct scsi_device 
*sdev, u32 max_io_size)
 static void megasas_set_static_target_properties(struct scsi_device *sdev,
 bool is_target_prop)
 {
-   u16 target_index = 0;
u8 interface_type;
u32 device_qd = MEGASAS_DEFAULT_CMD_PER_LUN;
u32 max_io_size_kb = MR_DEFAULT_NVME_MDTS_KB;
@@ -1948,8 +1947,6 @@ static void megasas_set_static_target_properties(struct 
scsi_device *sdev,
 */
blk_queue_rq_timeout(sdev->request_queue, scmd_timeout * HZ);
 
-   target_index = (sdev->channel * MEGASAS_MAX_DEV_PER_CHANNEL) + sdev->id;
-
switch (interface_type) {
case SAS_PD:
device_qd = MEGASAS_SAS_QD;
-- 
2.16.1



[PATCH 00/21] megaraid_sas: Driver updates

2019-04-26 Thread Shivasharan S
Update megaraid_sas to version 07.708.03.00.

The initial patch contains a cleanup of unused variable.
Next four patches contain driver fixes and enhancements.
Patch 6 introduces IRQ polling in megaraid_sas driver to fix
CPU hard/soft lockups that we have seen in the field.
Patch 7 adds load balancing of IO completions across the available
reply queues when combined MSIx mode is disabled in firmware.
Patch 8 onwards adds few enhancements to improve debuggability
of the driver by printing additional information and provding
a debugfs interface to help debug field issues better.

Shivasharan S (21):
  megaraid_sas: remove unused variable target_index
  megaraid_sas: Fix calculation of target ID
  megaraid_sas: fw_reset_no_pci_access required for MFI adapters only
  megaraid_sas: rework code around controller reset
  megaraid_sas: Block PCI config space access from userspace during OCR
  megaraid_sas: IRQ poll to avoid CPU hard lockups
  megaraid_sas: Load balance completions across all MSIx
  megaraid_sas: Enhance prints in OCR and TM path
  megaraid_sas: Enhance internal DCMD timeout prints
  megaraid_sas: Add formatting option for megasas_dump
  megaraid_sas: Dump system interface regs from sysfs
  megaraid_sas: Dump system registers for debugging
  megaraid_sas: Print BAR information from driver
  megaraid_sas: Export RAID map id through sysfs
  megaraid_sas: Print FW fault information
  megaraid_sas: Print firmware interrupt status
  megaraid_sas: Add prints in suspend and resume path
  megaraid_sas: Add debug prints for device list
  megaraid_sas: Fix MSI-x vector print
  megaraid_sas: Export RAID map through debugfs
  megaraid_sas: Update driver version to 07.708.03.00

 drivers/scsi/megaraid/Kconfig.megaraid   |   1 +
 drivers/scsi/megaraid/Makefile   |   2 +-
 drivers/scsi/megaraid/megaraid_sas.h |  27 ++-
 drivers/scsi/megaraid/megaraid_sas_base.c| 338 +++
 drivers/scsi/megaraid/megaraid_sas_debugfs.c | 180 ++
 drivers/scsi/megaraid/megaraid_sas_fp.c  |   1 +
 drivers/scsi/megaraid/megaraid_sas_fusion.c  | 303 +---
 drivers/scsi/megaraid/megaraid_sas_fusion.h  |   6 +-
 8 files changed, 720 insertions(+), 138 deletions(-)
 create mode 100644 drivers/scsi/megaraid/megaraid_sas_debugfs.c

-- 
2.16.1



[PATCH 04/21] megaraid_sas: rework code around controller reset

2019-04-26 Thread Shivasharan S
No functional change.
This patch reworks code around controller reset path which gets rid
of a couple of goto labels.
This is in preparation for the next patch which adds PCI config
space access locking while controller reset is in progress.

Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas.h|  1 +
 drivers/scsi/megaraid/megaraid_sas_fusion.c | 23 ++-
 2 files changed, 11 insertions(+), 13 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas.h 
b/drivers/scsi/megaraid/megaraid_sas.h
index 6fd57f7f0b1e..902b11b97999 100644
--- a/drivers/scsi/megaraid/megaraid_sas.h
+++ b/drivers/scsi/megaraid/megaraid_sas.h
@@ -1571,6 +1571,7 @@ enum FW_BOOT_CONTEXT {
 #define MFI_IO_TIMEOUT_SECS180
 #define MEGASAS_SRIOV_HEARTBEAT_INTERVAL_VF(5 * HZ)
 #define MEGASAS_OCR_SETTLE_TIME_VF (1000 * 30)
+#define MEGASAS_SRIOV_MAX_RESET_TRIES_VF   1
 #define MEGASAS_ROUTINE_WAIT_TIME_VF   300
 #define MFI_REPLY_1078_MESSAGE_INTERRUPT   0x8000
 #define MFI_REPLY_GEN2_MESSAGE_INTERRUPT   0x0001
diff --git a/drivers/scsi/megaraid/megaraid_sas_fusion.c 
b/drivers/scsi/megaraid/megaraid_sas_fusion.c
index bf1fa963af0b..76bd29c92752 100644
--- a/drivers/scsi/megaraid/megaraid_sas_fusion.c
+++ b/drivers/scsi/megaraid/megaraid_sas_fusion.c
@@ -4568,6 +4568,8 @@ int megasas_reset_fusion(struct Scsi_Host *shost, int 
reason)
struct scsi_device *sdev;
int ret_target_prop = DCMD_FAILED;
bool is_target_prop = false;
+   bool do_adp_reset = true;
+   int max_reset_tries = MEGASAS_FUSION_MAX_RESET_TRIES;
 
instance = (struct megasas_instance *)shost->hostdata;
fusion = instance->ctrl_context;
@@ -4686,34 +4688,30 @@ int megasas_reset_fusion(struct Scsi_Host *shost, int 
reason)
/* Let SR-IOV VF & PF sync up if there was a HB failure */
if (instance->requestorId && !reason) {
msleep(MEGASAS_OCR_SETTLE_TIME_VF);
-   goto transition_to_ready;
+   do_adp_reset = false;
+   max_reset_tries = MEGASAS_SRIOV_MAX_RESET_TRIES_VF;
}
 
/* Now try to reset the chip */
-   for (i = 0; i < MEGASAS_FUSION_MAX_RESET_TRIES; i++) {
+   for (i = 0; i < max_reset_tries; i++) {
 
-   if (instance->instancet->adp_reset
+   if (do_adp_reset &&
+   instance->instancet->adp_reset
(instance, instance->reg_set))
continue;
-transition_to_ready:
+
/* Wait for FW to become ready */
if (megasas_transition_to_ready(instance, 1)) {
dev_warn(&instance->pdev->dev,
"Failed to transition controller to 
ready for "
"scsi%d.\n", instance->host->host_no);
-   if (instance->requestorId && !reason)
-   goto fail_kill_adapter;
-   else
-   continue;
+   continue;
}
megasas_reset_reply_desc(instance);
megasas_fusion_update_can_queue(instance, OCR_CONTEXT);
 
if (megasas_ioc_init_fusion(instance)) {
-   if (instance->requestorId && !reason)
-   goto fail_kill_adapter;
-   else
-   continue;
+   continue;
}
 
if (megasas_get_ctrl_info(instance)) {
@@ -4799,7 +4797,6 @@ int megasas_reset_fusion(struct Scsi_Host *shost, int 
reason)
 
goto out;
}
-fail_kill_adapter:
/* Reset failed, kill the adapter */
dev_warn(&instance->pdev->dev, "Reset failed, killing "
   "adapter scsi%d.\n", instance->host->host_no);
-- 
2.16.1



[PATCH 0/2] megaraid_sas: Update structures for HOST_DEVICE_LIST DCMD

2019-02-08 Thread Shivasharan S
This patchset updates the structures required for HOST_DEVICE_LIST DCMD
feature.
The second patch updates the driver version for tracking purpose.

Patches are based off latest 5.1/scsi-queue.

Shivasharan S (2):
  megaraid_sas: Update structures for HOST_DEVICE_LIST DCMD
  megaraid_sas: driver version update

 drivers/scsi/megaraid/megaraid_sas.h | 7 ---
 1 file changed, 4 insertions(+), 3 deletions(-)

-- 
2.16.1



[PATCH 2/2] megaraid_sas: driver version update

2019-02-08 Thread Shivasharan S
Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas.h | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas.h 
b/drivers/scsi/megaraid/megaraid_sas.h
index eb48ca17dca0..6fd57f7f0b1e 100644
--- a/drivers/scsi/megaraid/megaraid_sas.h
+++ b/drivers/scsi/megaraid/megaraid_sas.h
@@ -33,8 +33,8 @@
 /*
  * MegaRAID SAS Driver meta data
  */
-#define MEGASAS_VERSION"07.707.50.00-rc1"
-#define MEGASAS_RELDATE"December 18, 2018"
+#define MEGASAS_VERSION"07.707.51.00-rc1"
+#define MEGASAS_RELDATE"February 7, 2019"
 
 /*
  * Device IDs
-- 
2.16.1



[PATCH 1/2] megaraid_sas: Update structures for HOST_DEVICE_LIST DCMD

2019-02-08 Thread Shivasharan S
Add padding to make the structure variables in MR_HOST_DEVICE_LIST_ENTRY
64-bit aligned.
Also, add reserved fields to MR_HOST_DEVICE_LIST for future firmware usage.

Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas.h | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas.h 
b/drivers/scsi/megaraid/megaraid_sas.h
index fe1173f02c54..eb48ca17dca0 100644
--- a/drivers/scsi/megaraid/megaraid_sas.h
+++ b/drivers/scsi/megaraid/megaraid_sas.h
@@ -807,13 +807,14 @@ struct MR_HOST_DEVICE_LIST_ENTRY {
} flags;
u8 scsi_type;
__le16 target_id;
-   u8 reserved[2];
+   u8 reserved[4];
__le64 sas_addr[2];
 } __packed;
 
 struct MR_HOST_DEVICE_LIST {
__le32  size;
__le32  count;
+   __le32  reserved[2];
struct MR_HOST_DEVICE_LIST_ENTRYhost_device_list[1];
 } __packed;
 
-- 
2.16.1



[PATCH V3 3/3] megaraid_sas: Add support for DEVICE_LIST DCMD in driver

2019-01-29 Thread Shivasharan S
This patch adds support for the new DEVICE_LIST DCMD.
Driver currently sends two separate DCMDs for getting the list of
PDs and LDs that are exposed to host.
The new DCMD provides a single interface to get a list of both PDs and
LDs that are exposed to the host.
Based on the list of target IDs that are returned by this DCMD, driver
will add the devices (PD/LD) to SML.
Driver will check for FW support for this new DCMD and based on the
support will either send the new DCMD or will fall back to the earlier
method of sending two separate DCMDs for PD and LD list.

Signed-off-by: Kashyap Desai 
Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas.h|  49 +-
 drivers/scsi/megaraid/megaraid_sas_base.c   | 222 +---
 drivers/scsi/megaraid/megaraid_sas_fusion.c |   1 +
 drivers/scsi/megaraid/megaraid_sas_fusion.h |   1 +
 4 files changed, 250 insertions(+), 23 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas.h 
b/drivers/scsi/megaraid/megaraid_sas.h
index 16536c41f0c5..fe1173f02c54 100644
--- a/drivers/scsi/megaraid/megaraid_sas.h
+++ b/drivers/scsi/megaraid/megaraid_sas.h
@@ -790,6 +790,37 @@ struct MR_LD_TARGETID_LIST {
u8  targetId[MAX_LOGICAL_DRIVES_EXT];
 };
 
+struct MR_HOST_DEVICE_LIST_ENTRY {
+   struct {
+   union {
+   struct {
+#if defined(__BIG_ENDIAN_BITFIELD)
+   u8 reserved:7;
+   u8 is_sys_pd:1;
+#else
+   u8 is_sys_pd:1;
+   u8 reserved:7;
+#endif
+   } bits;
+   u8 byte;
+   } u;
+   } flags;
+   u8 scsi_type;
+   __le16 target_id;
+   u8 reserved[2];
+   __le64 sas_addr[2];
+} __packed;
+
+struct MR_HOST_DEVICE_LIST {
+   __le32  size;
+   __le32  count;
+   struct MR_HOST_DEVICE_LIST_ENTRYhost_device_list[1];
+} __packed;
+
+#define HOST_DEVICE_LIST_SZ (sizeof(struct MR_HOST_DEVICE_LIST) + \
+ (sizeof(struct MR_HOST_DEVICE_LIST_ENTRY) *  \
+ (MEGASAS_MAX_PD + MAX_LOGICAL_DRIVES_EXT - 1)))
+
 
 /*
  * SAS controller properties
@@ -870,13 +901,17 @@ struct megasas_ctrl_prop {
u8 viewSpace;
struct {
 #if   defined(__BIG_ENDIAN_BITFIELD)
-   u16 reserved2:11;
+   u16 reserved3:9;
+   u16 enable_fw_dev_list:1;
+   u16 reserved2:1;
u16 enable_snap_dump:1;
u16 reserved1:4;
 #else
u16 reserved1:4;
u16 enable_snap_dump:1;
-   u16 reserved2:11;
+   u16 reserved2:1;
+   u16 enable_fw_dev_list:1;
+   u16 reserved3:9;
 #endif
} on_off_properties2;
};
@@ -1685,7 +1720,8 @@ union megasas_sgl_frame {
 typedef union _MFI_CAPABILITIES {
struct {
 #if   defined(__BIG_ENDIAN_BITFIELD)
-   u32 reserved:17;
+   u32 reserved:16;
+   u32 support_fw_exposed_dev_list:1;
u32 support_nvme_passthru:1;
u32 support_64bit_mode:1;
u32 support_pd_map_target_id:1;
@@ -1717,7 +1753,8 @@ typedef union _MFI_CAPABILITIES {
u32 support_pd_map_target_id:1;
u32 support_64bit_mode:1;
u32 support_nvme_passthru:1;
-   u32 reserved:17;
+   u32 support_fw_exposed_dev_list:1;
+   u32 reserved:16;
 #endif
} mfi_capabilities;
__le32  reg;
@@ -2202,6 +2239,9 @@ struct megasas_instance {
struct MR_LD_TARGETID_LIST *ld_targetid_list_buf;
dma_addr_t ld_targetid_list_buf_h;
 
+   struct MR_HOST_DEVICE_LIST *host_device_list_buf;
+   dma_addr_t host_device_list_buf_h;
+
struct MR_SNAPDUMP_PROPERTIES *snapdump_prop;
dma_addr_t snapdump_prop_h;
 
@@ -2337,6 +2377,7 @@ struct megasas_instance {
u8 task_abort_tmo;
u8 max_reset_tmo;
u8 snapdump_wait_time;
+   u8 enable_fw_dev_list;
 };
 struct MR_LD_VF_MAP {
u32 size;
diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index e590d3a902cc..ed730d054052 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -4634,6 +4634,123 @@ megasas_ld_list_query(struct megasas_instance 
*instance, u8 query_type)
return ret;
 }
 
+/**
+ * dcmd.opcode- MR_DCMD_CTRL_DEVICE_LIST_GET
+ * dcmd.mbox  - reserved
+ * dcmd.sge IN- ptr to return MR_HOST_DEVICE_LIST structure
+ * Desc:This DCMD will return the combined device list
+ * Status:  MFI_STAT_OK - List returned successfully
+ *  MFI_STAT_INVALID_CMD - Firmware support for the

[PATCH V3 2/3] megaraid_sas: Rework device add code in AEN path

2019-01-29 Thread Shivasharan S
In preparation of adding support for the DEVICE_LIST DCMD,
this patch refactors the code in the AEN event handling
path.
Add new function to update the PD and LD list in driver.
Move the code to scan PD and VD channels into separate
function.

Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas_base.c | 173 ++
 1 file changed, 107 insertions(+), 66 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index 8cd84abcce2b..e590d3a902cc 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -7884,6 +7884,103 @@ static inline void megasas_remove_scsi_device(struct 
scsi_device *sdev)
scsi_device_put(sdev);
 }
 
+/**
+ * megasas_update_device_list -Update the PD and LD device list from FW
+ * after an AEN event notification
+ * @instance:  Adapter soft state
+ * @event_type:Indicates type of event (PD or LD event)
+ *
+ * @return:Success or failure
+ *
+ * Issue DCMDs to Firmware to update the internal device list in driver.
+ */
+static
+int megasas_update_device_list(struct megasas_instance *instance,
+  int event_type)
+{
+   int dcmd_ret = DCMD_SUCCESS;
+
+   if (event_type & SCAN_PD_CHANNEL) {
+   dcmd_ret = megasas_get_pd_list(instance);
+
+   if (dcmd_ret != DCMD_SUCCESS)
+   goto out;
+   }
+
+   if (event_type & SCAN_VD_CHANNEL) {
+   if (!instance->requestorId ||
+   (instance->requestorId &&
+megasas_get_ld_vf_affiliation(instance, 0))) {
+   dcmd_ret = megasas_ld_list_query(instance,
+   MR_LD_QUERY_TYPE_EXPOSED_TO_HOST);
+   if (dcmd_ret != DCMD_SUCCESS)
+   goto out;
+   }
+   }
+
+out:
+   return dcmd_ret;
+}
+
+/**
+ * megasas_add_remove_devices -Add/remove devices to SCSI mid-layer
+ * after an AEN event notification
+ * @instance:  Adapter soft state
+ * @scan_type: Indicates type of devices (PD/LD) to add
+ * @return void
+ */
+static
+void megasas_add_remove_devices(struct megasas_instance *instance,
+   int scan_type)
+{
+   int i, j;
+   u16 pd_index = 0;
+   u16 ld_index = 0;
+   struct Scsi_Host *host;
+   struct scsi_device *sdev1;
+
+   host = instance->host;
+
+   if (scan_type & SCAN_PD_CHANNEL) {
+   for (i = 0; i < MEGASAS_MAX_PD_CHANNELS; i++) {
+   for (j = 0; j < MEGASAS_MAX_DEV_PER_CHANNEL; j++) {
+   pd_index = i * MEGASAS_MAX_DEV_PER_CHANNEL + j;
+   sdev1 = scsi_device_lookup(host, i, j, 0);
+   if (instance->pd_list[pd_index].driveState ==
+   MR_PD_STATE_SYSTEM) {
+   if (!sdev1)
+   scsi_add_device(host, i, j, 0);
+   else
+   scsi_device_put(sdev1);
+   } else {
+   if (sdev1)
+   
megasas_remove_scsi_device(sdev1);
+   }
+   }
+   }
+   }
+
+   if (scan_type & SCAN_VD_CHANNEL) {
+   for (i = 0; i < MEGASAS_MAX_LD_CHANNELS; i++) {
+   for (j = 0; j < MEGASAS_MAX_DEV_PER_CHANNEL; j++) {
+   ld_index = (i * MEGASAS_MAX_DEV_PER_CHANNEL) + 
j;
+   sdev1 = scsi_device_lookup(host,
+   MEGASAS_MAX_PD_CHANNELS + i, j, 
0);
+   if (instance->ld_ids[ld_index] != 0xff) {
+   if (!sdev1)
+   scsi_add_device(host, 
MEGASAS_MAX_PD_CHANNELS + i, j, 0);
+   else
+   scsi_device_put(sdev1);
+   } else {
+   if (sdev1)
+   
megasas_remove_scsi_device(sdev1);
+   }
+   }
+   }
+   }
+
+}
+
 static void
 megasas_aen_polling(struct work_struct *work)
 {
@@ -7891,11 +7988,7 @@ megasas_aen_polling(struct work_struct *work)
container_of(work, struct megasas_aen_event, hotplug_work.work);
 

[PATCH V3 1/3] megaraid_sas: Rework code to get PD and LD list

2019-01-29 Thread Shivasharan S
During FW init, combine the code to get the PD and LD list
from FW into a single function.
This patch is in preparation for adding support for
HOST_DEVICE_LIST DCMD.

Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas_base.c | 44 ++-
 1 file changed, 31 insertions(+), 13 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index f7bdd783360a..8cd84abcce2b 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -5319,6 +5319,33 @@ static void megasas_setup_reply_map(struct 
megasas_instance *instance)
instance->reply_map[cpu] = cpu % instance->msix_vectors;
 }
 
+/**
+ * megasas_get_device_list -   Get the PD and LD device list from FW.
+ * @instance:  Adapter soft state
+ * @return:Success or failure
+ *
+ * Issue DCMDs to Firmware to get the PD and LD list.
+ */
+static
+int megasas_get_device_list(struct megasas_instance *instance)
+{
+   memset(instance->pd_list, 0,
+  (MEGASAS_MAX_PD * sizeof(struct megasas_pd_list)));
+   memset(instance->ld_ids, 0xff, MEGASAS_MAX_LD_IDS);
+
+   if (megasas_get_pd_list(instance) < 0) {
+   dev_err(&instance->pdev->dev, "failed to get PD list\n");
+   return FAILED;
+   }
+
+   if (megasas_ld_list_query(instance,
+ MR_LD_QUERY_TYPE_EXPOSED_TO_HOST)) {
+   dev_err(&instance->pdev->dev, "failed to get LD list\n");
+   return FAILED;
+   }
+
+   return SUCCESS;
+}
 /**
  * megasas_init_fw -   Initializes the FW
  * @instance:  Adapter soft state
@@ -5571,18 +5598,13 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
 
megasas_setup_jbod_map(instance);
 
-   /** for passthrough
-* the following function will get the PD LIST.
-*/
-   memset(instance->pd_list, 0,
-   (MEGASAS_MAX_PD * sizeof(struct megasas_pd_list)));
-   if (megasas_get_pd_list(instance) < 0) {
-   dev_err(&instance->pdev->dev, "failed to get PD list\n");
+   if (megasas_get_device_list(instance) != SUCCESS) {
+   dev_err(&instance->pdev->dev,
+   "%s: megasas_get_device_list failed\n",
+   __func__);
goto fail_get_ld_pd_list;
}
 
-   memset(instance->ld_ids, 0xff, MEGASAS_MAX_LD_IDS);
-
/* stream detection initialization */
if (instance->adapter_type >= VENTURA_SERIES) {
fusion->stream_detect_by_ld =
@@ -5612,10 +5634,6 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
}
}
 
-   if (megasas_ld_list_query(instance,
- MR_LD_QUERY_TYPE_EXPOSED_TO_HOST))
-   goto fail_get_ld_pd_list;
-
/*
 * Compute the max allowed sectors per IO: The controller info has two
 * limits on max sectors. Driver should use the minimum of these two.
-- 
2.16.1



[PATCH V3 0/3] megaraid_sas: Add support for FW device list DCMD

2019-01-29 Thread Shivasharan S
This patchset adds support for new HOST_DEVICE_LIST DCMD
in driver. This DCMD provides a combined list of target IDs
of devices which are exposed to host.
Driver will check for FW support for this new DCMD and based
on the support will either send the new DCMD or will fall back
to earlier GET_PD_LIST/GET_LD_LIST_QUERY DCMDs.

Changes in V2:
- Fixed smatch warnings in Patch 2 as reported by Dan Carpenter
- Fixed few checkpatch warnings about unaligned paranthesis in Patches 1 and 3.
- Removed one left over debug print in Patch 3

Changes in V3:
- Fixed kerneldoc formatting for the new functions added.

Shivasharan S (3):
  megaraid_sas: Rework code to get PD and LD list
  megaraid_sas: Rework device add code in AEN path
  megaraid_sas: Add support for DEVICE_LIST DCMD in driver

 drivers/scsi/megaraid/megaraid_sas.h|  49 +++-
 drivers/scsi/megaraid/megaraid_sas_base.c   | 403 ++--
 drivers/scsi/megaraid/megaraid_sas_fusion.c |   1 +
 drivers/scsi/megaraid/megaraid_sas_fusion.h |   1 +
 4 files changed, 370 insertions(+), 84 deletions(-)

-- 
2.16.1



[PATCH V2 3/3] megaraid_sas: Add support for DEVICE_LIST DCMD in driver

2019-01-24 Thread Shivasharan S
This patch adds support for the new DEVICE_LIST DCMD.
Driver currently sends two separate DCMDs for getting the list of
PDs and LDs that are exposed to host.
The new DCMD provides a single interface to get a list of both PDs and
LDs that are exposed to the host.
Based on the list of target IDs that are returned by this DCMD, driver
will add the devices (PD/LD) to SML.
Driver will check for FW support for this new DCMD and based on the
support will either send the new DCMD or will fall back to the earlier
method of sending two separate DCMDs for PD and LD list.

Signed-off-by: Kashyap Desai 
Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas.h|  49 ++-
 drivers/scsi/megaraid/megaraid_sas_base.c   | 220 +---
 drivers/scsi/megaraid/megaraid_sas_fusion.c |   1 +
 drivers/scsi/megaraid/megaraid_sas_fusion.h |   1 +
 4 files changed, 248 insertions(+), 23 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas.h 
b/drivers/scsi/megaraid/megaraid_sas.h
index 16536c41f0c5..fe1173f02c54 100644
--- a/drivers/scsi/megaraid/megaraid_sas.h
+++ b/drivers/scsi/megaraid/megaraid_sas.h
@@ -790,6 +790,37 @@ struct MR_LD_TARGETID_LIST {
u8  targetId[MAX_LOGICAL_DRIVES_EXT];
 };
 
+struct MR_HOST_DEVICE_LIST_ENTRY {
+   struct {
+   union {
+   struct {
+#if defined(__BIG_ENDIAN_BITFIELD)
+   u8 reserved:7;
+   u8 is_sys_pd:1;
+#else
+   u8 is_sys_pd:1;
+   u8 reserved:7;
+#endif
+   } bits;
+   u8 byte;
+   } u;
+   } flags;
+   u8 scsi_type;
+   __le16 target_id;
+   u8 reserved[2];
+   __le64 sas_addr[2];
+} __packed;
+
+struct MR_HOST_DEVICE_LIST {
+   __le32  size;
+   __le32  count;
+   struct MR_HOST_DEVICE_LIST_ENTRYhost_device_list[1];
+} __packed;
+
+#define HOST_DEVICE_LIST_SZ (sizeof(struct MR_HOST_DEVICE_LIST) + \
+ (sizeof(struct MR_HOST_DEVICE_LIST_ENTRY) *  \
+ (MEGASAS_MAX_PD + MAX_LOGICAL_DRIVES_EXT - 1)))
+
 
 /*
  * SAS controller properties
@@ -870,13 +901,17 @@ struct megasas_ctrl_prop {
u8 viewSpace;
struct {
 #if   defined(__BIG_ENDIAN_BITFIELD)
-   u16 reserved2:11;
+   u16 reserved3:9;
+   u16 enable_fw_dev_list:1;
+   u16 reserved2:1;
u16 enable_snap_dump:1;
u16 reserved1:4;
 #else
u16 reserved1:4;
u16 enable_snap_dump:1;
-   u16 reserved2:11;
+   u16 reserved2:1;
+   u16 enable_fw_dev_list:1;
+   u16 reserved3:9;
 #endif
} on_off_properties2;
};
@@ -1685,7 +1720,8 @@ union megasas_sgl_frame {
 typedef union _MFI_CAPABILITIES {
struct {
 #if   defined(__BIG_ENDIAN_BITFIELD)
-   u32 reserved:17;
+   u32 reserved:16;
+   u32 support_fw_exposed_dev_list:1;
u32 support_nvme_passthru:1;
u32 support_64bit_mode:1;
u32 support_pd_map_target_id:1;
@@ -1717,7 +1753,8 @@ typedef union _MFI_CAPABILITIES {
u32 support_pd_map_target_id:1;
u32 support_64bit_mode:1;
u32 support_nvme_passthru:1;
-   u32 reserved:17;
+   u32 support_fw_exposed_dev_list:1;
+   u32 reserved:16;
 #endif
} mfi_capabilities;
__le32  reg;
@@ -2202,6 +2239,9 @@ struct megasas_instance {
struct MR_LD_TARGETID_LIST *ld_targetid_list_buf;
dma_addr_t ld_targetid_list_buf_h;
 
+   struct MR_HOST_DEVICE_LIST *host_device_list_buf;
+   dma_addr_t host_device_list_buf_h;
+
struct MR_SNAPDUMP_PROPERTIES *snapdump_prop;
dma_addr_t snapdump_prop_h;
 
@@ -2337,6 +2377,7 @@ struct megasas_instance {
u8 task_abort_tmo;
u8 max_reset_tmo;
u8 snapdump_wait_time;
+   u8 enable_fw_dev_list;
 };
 struct MR_LD_VF_MAP {
u32 size;
diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index c0ddbb01aa7e..376c017008bd 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -4634,6 +4634,123 @@ megasas_ld_list_query(struct megasas_instance 
*instance, u8 query_type)
return ret;
 }
 
+/*
+ * dcmd.opcode- MR_DCMD_CTRL_DEVICE_LIST_GET
+ * dcmd.mbox  - reserved
+ * dcmd.sge IN- ptr to return MR_HOST_DEVICE_LIST structure
+ * Desc:This DCMD will return the combined device list
+ * Status:  MFI_STAT_OK - List returned successfully
+ *  MFI_STAT_INVALID_CMD - Firmware support for the

[PATCH V2 1/3] megaraid_sas: Rework code to get PD and LD list

2019-01-24 Thread Shivasharan S
During FW init, combine the code to get the PD and LD list
from FW into a single function.
This patch is in preparation for adding support for
HOST_DEVICE_LIST DCMD.

Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas_base.c | 47 ++-
 1 file changed, 34 insertions(+), 13 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index f7bdd783360a..cf065f0b84fa 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -5319,6 +5319,36 @@ static void megasas_setup_reply_map(struct 
megasas_instance *instance)
instance->reply_map[cpu] = cpu % instance->msix_vectors;
 }
 
+/*
+ * megasas_get_device_list -   Get the PD and LD device list from FW.
+ * @instance:  Adapter soft state
+ *
+ * @return:Success or failure
+ *
+ * Issue DCMDs to Firmware to update the internal device list in driver.
+ * Based on the FW support, driver sends the HOST_DEVICE_LIST or combination
+ * of PD_LIST/LD_LIST_QUERY DCMDs to get the device list.
+ */
+static
+int megasas_get_device_list(struct megasas_instance *instance)
+{
+   memset(instance->pd_list, 0,
+  (MEGASAS_MAX_PD * sizeof(struct megasas_pd_list)));
+   memset(instance->ld_ids, 0xff, MEGASAS_MAX_LD_IDS);
+
+   if (megasas_get_pd_list(instance) < 0) {
+   dev_err(&instance->pdev->dev, "failed to get PD list\n");
+   return FAILED;
+   }
+
+   if (megasas_ld_list_query(instance,
+ MR_LD_QUERY_TYPE_EXPOSED_TO_HOST)) {
+   dev_err(&instance->pdev->dev, "failed to get LD list\n");
+   return FAILED;
+   }
+
+   return SUCCESS;
+}
 /**
  * megasas_init_fw -   Initializes the FW
  * @instance:  Adapter soft state
@@ -5571,18 +5601,13 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
 
megasas_setup_jbod_map(instance);
 
-   /** for passthrough
-* the following function will get the PD LIST.
-*/
-   memset(instance->pd_list, 0,
-   (MEGASAS_MAX_PD * sizeof(struct megasas_pd_list)));
-   if (megasas_get_pd_list(instance) < 0) {
-   dev_err(&instance->pdev->dev, "failed to get PD list\n");
+   if (megasas_get_device_list(instance) != SUCCESS) {
+   dev_err(&instance->pdev->dev,
+   "%s: megasas_get_device_list failed\n",
+   __func__);
goto fail_get_ld_pd_list;
}
 
-   memset(instance->ld_ids, 0xff, MEGASAS_MAX_LD_IDS);
-
/* stream detection initialization */
if (instance->adapter_type >= VENTURA_SERIES) {
fusion->stream_detect_by_ld =
@@ -5612,10 +5637,6 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
}
}
 
-   if (megasas_ld_list_query(instance,
- MR_LD_QUERY_TYPE_EXPOSED_TO_HOST))
-   goto fail_get_ld_pd_list;
-
/*
 * Compute the max allowed sectors per IO: The controller info has two
 * limits on max sectors. Driver should use the minimum of these two.
-- 
2.16.1



[PATCH V2 0/3] megaraid_sas: Add support for FW device list DCMD

2019-01-24 Thread Shivasharan S
This patchset adds support for new HOST_DEVICE_LIST DCMD
in driver. This DCMD provides a combined list of target IDs
of devices which are exposed to host.
Driver will check for FW support for this new DCMD and based
on the support will either send the new DCMD or will fall back
to earlier GET_PD_LIST/GET_LD_LIST_QUERY DCMDs.

Changes in V2:
- Fixed smatch warnings in Patch 2 as reported by Dan Carpenter
- Fixed few checkpatch warnings about unaligned paranthesis in Patches 1 and 3.
- Removed one left over debug print in Patch 3

Shivasharan S (3):
  megaraid_sas: Rework code to get PD and LD list
  megaraid_sas: Rework device add code in AEN path
  megaraid_sas: Add support for DEVICE_LIST DCMD in driver

 drivers/scsi/megaraid/megaraid_sas.h|  49 +++-
 drivers/scsi/megaraid/megaraid_sas_base.c   | 404 ++--
 drivers/scsi/megaraid/megaraid_sas_fusion.c |   1 +
 drivers/scsi/megaraid/megaraid_sas_fusion.h |   1 +
 4 files changed, 371 insertions(+), 84 deletions(-)

-- 
2.16.1



[PATCH V2 2/3] megaraid_sas: Rework device add code in AEN path

2019-01-24 Thread Shivasharan S
In preparation of adding support for the DEVICE_LIST DCMD,
this patch refactors the code in the AEN event handling
path.
Add new function to update the PD and LD list in driver.
Move the code to scan PD and VD channels into separate
function.

Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas_base.c | 173 ++
 1 file changed, 107 insertions(+), 66 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index cf065f0b84fa..c0ddbb01aa7e 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -7887,6 +7887,103 @@ static inline void megasas_remove_scsi_device(struct 
scsi_device *sdev)
scsi_device_put(sdev);
 }
 
+/*
+ * megasas_update_device_list -Update the PD and LD device list from FW
+ * after an AEN event notification
+ * @instance:  Adapter soft state
+ * @event_type:Indicates type of event (PD or LD event)
+ *
+ * @return:Success or failure
+ *
+ * Issue DCMDs to Firmware to update the internal device list in driver.
+ */
+static
+int megasas_update_device_list(struct megasas_instance *instance,
+  int event_type)
+{
+   int dcmd_ret = DCMD_SUCCESS;
+
+   if (event_type & SCAN_PD_CHANNEL) {
+   dcmd_ret = megasas_get_pd_list(instance);
+
+   if (dcmd_ret != DCMD_SUCCESS)
+   goto out;
+   }
+
+   if (event_type & SCAN_VD_CHANNEL) {
+   if (!instance->requestorId ||
+   (instance->requestorId &&
+megasas_get_ld_vf_affiliation(instance, 0))) {
+   dcmd_ret = megasas_ld_list_query(instance,
+   MR_LD_QUERY_TYPE_EXPOSED_TO_HOST);
+   if (dcmd_ret != DCMD_SUCCESS)
+   goto out;
+   }
+   }
+
+out:
+   return dcmd_ret;
+}
+
+/*
+ * megasas_add_remove_devices -Add/remove devices to SCSI mid-layer
+ * after an AEN event notification
+ * @instance:  Adapter soft state
+ * @scan_type: Indicates type of devices (PD/LD) to add
+ * @return void
+ */
+static
+void megasas_add_remove_devices(struct megasas_instance *instance,
+   int scan_type)
+{
+   int i, j;
+   u16 pd_index = 0;
+   u16 ld_index = 0;
+   struct Scsi_Host *host;
+   struct scsi_device *sdev1;
+
+   host = instance->host;
+
+   if (scan_type & SCAN_PD_CHANNEL) {
+   for (i = 0; i < MEGASAS_MAX_PD_CHANNELS; i++) {
+   for (j = 0; j < MEGASAS_MAX_DEV_PER_CHANNEL; j++) {
+   pd_index = i * MEGASAS_MAX_DEV_PER_CHANNEL + j;
+   sdev1 = scsi_device_lookup(host, i, j, 0);
+   if (instance->pd_list[pd_index].driveState ==
+   MR_PD_STATE_SYSTEM) {
+   if (!sdev1)
+   scsi_add_device(host, i, j, 0);
+   else
+   scsi_device_put(sdev1);
+   } else {
+   if (sdev1)
+   
megasas_remove_scsi_device(sdev1);
+   }
+   }
+   }
+   }
+
+   if (scan_type & SCAN_VD_CHANNEL) {
+   for (i = 0; i < MEGASAS_MAX_LD_CHANNELS; i++) {
+   for (j = 0; j < MEGASAS_MAX_DEV_PER_CHANNEL; j++) {
+   ld_index = (i * MEGASAS_MAX_DEV_PER_CHANNEL) + 
j;
+   sdev1 = scsi_device_lookup(host,
+   MEGASAS_MAX_PD_CHANNELS + i, j, 
0);
+   if (instance->ld_ids[ld_index] != 0xff) {
+   if (!sdev1)
+   scsi_add_device(host, 
MEGASAS_MAX_PD_CHANNELS + i, j, 0);
+   else
+   scsi_device_put(sdev1);
+   } else {
+   if (sdev1)
+   
megasas_remove_scsi_device(sdev1);
+   }
+   }
+   }
+   }
+
+}
+
 static void
 megasas_aen_polling(struct work_struct *work)
 {
@@ -7894,11 +7991,7 @@ megasas_aen_polling(struct work_struct *work)
container_of(work, struct megasas_aen_event, hotplug_work.work);
 

[PATCH 0/3] megaraid_sas: Add support for FW device list DCMD

2019-01-18 Thread Shivasharan S
This patchset adds support for new HOST_DEVICE_LIST DCMD
in driver. This DCMD provides a combined list of target IDs
of devices which are exposed to host.
Driver will check for FW support for this new DCMD and based
on the support will either send the new DCMD or will fall back
to earlier GET_PD_LIST/GET_LD_LIST_QUERY DCMDs.

Shivasharan S (3):
  megaraid_sas: Rework code to get PD and LD list
  megaraid_sas: Rework device add code in AEN path
  megaraid_sas: Add support for DEVICE_LIST DCMD in driver

 drivers/scsi/megaraid/megaraid_sas.h|  49 +++-
 drivers/scsi/megaraid/megaraid_sas_base.c   | 406 ++--
 drivers/scsi/megaraid/megaraid_sas_fusion.c |   1 +
 drivers/scsi/megaraid/megaraid_sas_fusion.h |   1 +
 4 files changed, 373 insertions(+), 84 deletions(-)

-- 
2.16.1



[PATCH 3/3] megaraid_sas: Add support for DEVICE_LIST DCMD in driver

2019-01-18 Thread Shivasharan S
This patch adds support for the new DEVICE_LIST DCMD.
Driver currently sends two separate DCMDs for getting the list of
PDs and LDs that are exposed to host.
The new DCMD provides a single interface to get a list of both PDs and
LDs that are exposed to the host.
Based on the list of target IDs that are returned by this DCMD, driver
will add the devices (PD/LD) to SML.
Driver will check for FW support for this new DCMD and based on the
support will either send the new DCMD or will fall back to the earlier
method of sending two separate DCMDs for PD and LD list.

Signed-off-by: Kashyap Desai 
Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas.h|  49 +-
 drivers/scsi/megaraid/megaraid_sas_base.c   | 227 +---
 drivers/scsi/megaraid/megaraid_sas_fusion.c |   1 +
 drivers/scsi/megaraid/megaraid_sas_fusion.h |   1 +
 4 files changed, 253 insertions(+), 25 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas.h 
b/drivers/scsi/megaraid/megaraid_sas.h
index 16536c41f0c5..fe1173f02c54 100644
--- a/drivers/scsi/megaraid/megaraid_sas.h
+++ b/drivers/scsi/megaraid/megaraid_sas.h
@@ -790,6 +790,37 @@ struct MR_LD_TARGETID_LIST {
u8  targetId[MAX_LOGICAL_DRIVES_EXT];
 };
 
+struct MR_HOST_DEVICE_LIST_ENTRY {
+   struct {
+   union {
+   struct {
+#if defined(__BIG_ENDIAN_BITFIELD)
+   u8 reserved:7;
+   u8 is_sys_pd:1;
+#else
+   u8 is_sys_pd:1;
+   u8 reserved:7;
+#endif
+   } bits;
+   u8 byte;
+   } u;
+   } flags;
+   u8 scsi_type;
+   __le16 target_id;
+   u8 reserved[2];
+   __le64 sas_addr[2];
+} __packed;
+
+struct MR_HOST_DEVICE_LIST {
+   __le32  size;
+   __le32  count;
+   struct MR_HOST_DEVICE_LIST_ENTRYhost_device_list[1];
+} __packed;
+
+#define HOST_DEVICE_LIST_SZ (sizeof(struct MR_HOST_DEVICE_LIST) + \
+ (sizeof(struct MR_HOST_DEVICE_LIST_ENTRY) *  \
+ (MEGASAS_MAX_PD + MAX_LOGICAL_DRIVES_EXT - 1)))
+
 
 /*
  * SAS controller properties
@@ -870,13 +901,17 @@ struct megasas_ctrl_prop {
u8 viewSpace;
struct {
 #if   defined(__BIG_ENDIAN_BITFIELD)
-   u16 reserved2:11;
+   u16 reserved3:9;
+   u16 enable_fw_dev_list:1;
+   u16 reserved2:1;
u16 enable_snap_dump:1;
u16 reserved1:4;
 #else
u16 reserved1:4;
u16 enable_snap_dump:1;
-   u16 reserved2:11;
+   u16 reserved2:1;
+   u16 enable_fw_dev_list:1;
+   u16 reserved3:9;
 #endif
} on_off_properties2;
};
@@ -1685,7 +1720,8 @@ union megasas_sgl_frame {
 typedef union _MFI_CAPABILITIES {
struct {
 #if   defined(__BIG_ENDIAN_BITFIELD)
-   u32 reserved:17;
+   u32 reserved:16;
+   u32 support_fw_exposed_dev_list:1;
u32 support_nvme_passthru:1;
u32 support_64bit_mode:1;
u32 support_pd_map_target_id:1;
@@ -1717,7 +1753,8 @@ typedef union _MFI_CAPABILITIES {
u32 support_pd_map_target_id:1;
u32 support_64bit_mode:1;
u32 support_nvme_passthru:1;
-   u32 reserved:17;
+   u32 support_fw_exposed_dev_list:1;
+   u32 reserved:16;
 #endif
} mfi_capabilities;
__le32  reg;
@@ -2202,6 +2239,9 @@ struct megasas_instance {
struct MR_LD_TARGETID_LIST *ld_targetid_list_buf;
dma_addr_t ld_targetid_list_buf_h;
 
+   struct MR_HOST_DEVICE_LIST *host_device_list_buf;
+   dma_addr_t host_device_list_buf_h;
+
struct MR_SNAPDUMP_PROPERTIES *snapdump_prop;
dma_addr_t snapdump_prop_h;
 
@@ -2337,6 +2377,7 @@ struct megasas_instance {
u8 task_abort_tmo;
u8 max_reset_tmo;
u8 snapdump_wait_time;
+   u8 enable_fw_dev_list;
 };
 struct MR_LD_VF_MAP {
u32 size;
diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index 115f4826832c..e86860df4b4b 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -4634,6 +4634,123 @@ megasas_ld_list_query(struct megasas_instance 
*instance, u8 query_type)
return ret;
 }
 
+/*
+ * dcmd.opcode- MR_DCMD_CTRL_DEVICE_LIST_GET
+ * dcmd.mbox  - reserved
+ * dcmd.sge IN- ptr to return MR_HOST_DEVICE_LIST structure
+ * Desc:This DCMD will return the combined device list
+ * Status:  MFI_STAT_OK - List returned successfully
+ *  MFI_STAT_INVALID_CMD - Firmware support for the

[PATCH 2/3] megaraid_sas: Rework device add code in AEN path

2019-01-18 Thread Shivasharan S
In preparation of adding support for the DEVICE_LIST DCMD,
this patch refactors the code in the AEN event handling
path.
Add new function to update the PD and LD list in driver.
Move the code to scan PD and VD channels into separate
function.

Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas_base.c | 172 ++
 1 file changed, 106 insertions(+), 66 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index c16f8533c8a8..115f4826832c 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -7887,6 +7887,102 @@ static inline void megasas_remove_scsi_device(struct 
scsi_device *sdev)
scsi_device_put(sdev);
 }
 
+/*
+ * megasas_update_device_list -Update the PD and LD device list from FW
+ * after an AEN event notification
+ * @instance:  Adapter soft state
+ * @event_type:Indicates type of event (PD or LD event)
+ *
+ * @return:Success or failure
+ *
+ * Issue DCMDs to Firmware to update the internal device list in driver.
+ */
+static
+int megasas_update_device_list(struct megasas_instance *instance,
+  int event_type)
+{
+   int dcmd_ret;
+
+   if (event_type & SCAN_PD_CHANNEL) {
+   dcmd_ret = megasas_get_pd_list(instance);
+
+   if (dcmd_ret != DCMD_SUCCESS)
+   goto out;
+   }
+
+   if (event_type & SCAN_VD_CHANNEL) {
+   if (!instance->requestorId ||
+   (instance->requestorId &&
+megasas_get_ld_vf_affiliation(instance, 0)))
+   dcmd_ret = megasas_ld_list_query(instance,
+   MR_LD_QUERY_TYPE_EXPOSED_TO_HOST);
+   if (dcmd_ret != DCMD_SUCCESS)
+   goto out;
+   }
+
+out:
+   return dcmd_ret;
+}
+
+/*
+ * megasas_add_remove_devices -Add/remove devices to SCSI mid-layer
+ * after an AEN event notification
+ * @instance:  Adapter soft state
+ * @scan_type: Indicates type of devices (PD/LD) to add
+ * @return void
+ */
+static
+void megasas_add_remove_devices(struct megasas_instance *instance,
+   int scan_type)
+{
+   int i, j;
+   u16 pd_index = 0;
+   u16 ld_index = 0;
+   struct Scsi_Host *host;
+   struct scsi_device *sdev1;
+
+   host = instance->host;
+
+   if (scan_type & SCAN_PD_CHANNEL) {
+   for (i = 0; i < MEGASAS_MAX_PD_CHANNELS; i++) {
+   for (j = 0; j < MEGASAS_MAX_DEV_PER_CHANNEL; j++) {
+   pd_index = i * MEGASAS_MAX_DEV_PER_CHANNEL + j;
+   sdev1 = scsi_device_lookup(host, i, j, 0);
+   if (instance->pd_list[pd_index].driveState ==
+   MR_PD_STATE_SYSTEM) {
+   if (!sdev1)
+   scsi_add_device(host, i, j, 0);
+   else
+   scsi_device_put(sdev1);
+   } else {
+   if (sdev1)
+   
megasas_remove_scsi_device(sdev1);
+   }
+   }
+   }
+   }
+
+   if (scan_type & SCAN_VD_CHANNEL) {
+   for (i = 0; i < MEGASAS_MAX_LD_CHANNELS; i++) {
+   for (j = 0; j < MEGASAS_MAX_DEV_PER_CHANNEL; j++) {
+   ld_index = (i * MEGASAS_MAX_DEV_PER_CHANNEL) + 
j;
+   sdev1 = scsi_device_lookup(host,
+   MEGASAS_MAX_PD_CHANNELS + i, j, 
0);
+   if (instance->ld_ids[ld_index] != 0xff) {
+   if (!sdev1)
+   scsi_add_device(host, 
MEGASAS_MAX_PD_CHANNELS + i, j, 0);
+   else
+   scsi_device_put(sdev1);
+   } else {
+   if (sdev1)
+   
megasas_remove_scsi_device(sdev1);
+   }
+   }
+   }
+   }
+
+}
+
 static void
 megasas_aen_polling(struct work_struct *work)
 {
@@ -7894,11 +7990,7 @@ megasas_aen_polling(struct work_struct *work)
container_of(work, struct megasas_aen_event, hotplug_work.work);
struct megasas_instance *instance = ev->instanc

[PATCH 1/3] megaraid_sas: Rework code to get PD and LD list

2019-01-18 Thread Shivasharan S
During FW init, combine the code to get the PD and LD list
from FW into a single function.
This patch is in preparation for adding support for
HOST_DEVICE_LIST DCMD.

Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas_base.c | 47 ++-
 1 file changed, 34 insertions(+), 13 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index f7bdd783360a..c16f8533c8a8 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -5319,6 +5319,36 @@ static void megasas_setup_reply_map(struct 
megasas_instance *instance)
instance->reply_map[cpu] = cpu % instance->msix_vectors;
 }
 
+/*
+ * megasas_get_device_list -   Get the PD and LD device list from FW.
+ * @instance:  Adapter soft state
+ *
+ * @return:Success or failure
+ *
+ * Issue DCMDs to Firmware to update the internal device list in driver.
+ * Based on the FW support, driver sends the HOST_DEVICE_LIST or combination
+ * of PD_LIST/LD_LIST_QUERY DCMDs to get the device list.
+ */
+static
+int megasas_get_device_list(struct megasas_instance *instance)
+{
+   memset(instance->pd_list, 0,
+   (MEGASAS_MAX_PD * sizeof(struct megasas_pd_list)));
+   memset(instance->ld_ids, 0xff, MEGASAS_MAX_LD_IDS);
+
+   if (megasas_get_pd_list(instance) < 0) {
+   dev_err(&instance->pdev->dev, "failed to get PD list\n");
+   return FAILED;
+   }
+
+   if (megasas_ld_list_query(instance,
+   MR_LD_QUERY_TYPE_EXPOSED_TO_HOST)) {
+   dev_err(&instance->pdev->dev, "failed to get LD list\n");
+   return FAILED;
+   }
+
+   return SUCCESS;
+}
 /**
  * megasas_init_fw -   Initializes the FW
  * @instance:  Adapter soft state
@@ -5571,18 +5601,13 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
 
megasas_setup_jbod_map(instance);
 
-   /** for passthrough
-* the following function will get the PD LIST.
-*/
-   memset(instance->pd_list, 0,
-   (MEGASAS_MAX_PD * sizeof(struct megasas_pd_list)));
-   if (megasas_get_pd_list(instance) < 0) {
-   dev_err(&instance->pdev->dev, "failed to get PD list\n");
+   if (megasas_get_device_list(instance) != SUCCESS) {
+   dev_err(&instance->pdev->dev,
+   "%s: megasas_get_device_list failed\n",
+   __func__);
goto fail_get_ld_pd_list;
}
 
-   memset(instance->ld_ids, 0xff, MEGASAS_MAX_LD_IDS);
-
/* stream detection initialization */
if (instance->adapter_type >= VENTURA_SERIES) {
fusion->stream_detect_by_ld =
@@ -5612,10 +5637,6 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
}
}
 
-   if (megasas_ld_list_query(instance,
- MR_LD_QUERY_TYPE_EXPOSED_TO_HOST))
-   goto fail_get_ld_pd_list;
-
/*
 * Compute the max allowed sectors per IO: The controller info has two
 * limits on max sectors. Driver should use the minimum of these two.
-- 
2.16.1



[PATCH] megaraid_sas: Retry reads of outbound_intr_status reg

2019-01-09 Thread Shivasharan S
commit 272652fcbf1a ("scsi: megaraid_sas: add retry logic in megasas_readl")
missed changing readl to megasas_readl in megasas_clear_intr_fusion().
For Aero controllers, reads of outbound_intr_status register needs to
be retried.

Reported-by: Tomas Henzl 
Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas_fusion.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas_fusion.c 
b/drivers/scsi/megaraid/megaraid_sas_fusion.c
index 211c17c33aa0..2665dbdcf2f8 100644
--- a/drivers/scsi/megaraid/megaraid_sas_fusion.c
+++ b/drivers/scsi/megaraid/megaraid_sas_fusion.c
@@ -175,7 +175,8 @@ megasas_clear_intr_fusion(struct megasas_instance *instance)
/*
 * Check if it is our interrupt
 */
-   status = readl(®s->outbound_intr_status);
+   status = megasas_readl(instance,
+  ®s->outbound_intr_status);
 
if (status & 1) {
writel(status, ®s->outbound_intr_status);
-- 
2.16.1



[PATCH 0/2] megaraid_sas: Fix 64-bit DMA addressing

2018-12-18 Thread Shivasharan S
This patchset fixes an issue with enabling 64-bit DMA for
megaraid controllers.
The second patch updates the driver version for tracking.

Shivasharan S (2):
  megaraid_sas: Use 63-bit DMA addressing
  megaraid_sas: driver version update

 drivers/scsi/megaraid/megaraid_sas.h  |  4 ++--
 drivers/scsi/megaraid/megaraid_sas_base.c | 18 +-
 2 files changed, 11 insertions(+), 11 deletions(-)

-- 
2.16.1



[PATCH 1/2] megaraid_sas: Use 63-bit DMA addressing

2018-12-18 Thread Shivasharan S
Although MegaRAID controllers support 64-bit DMA addressing,
as per hardware design, DMA address with all 64-bits set
(0x-) results in a firmware fault.

Fix -
Driver will set 63-bit DMA mask to ensure the above address
will not be used.

Cc: sta...@vger.kernel.org
Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas_base.c | 18 +-
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index b2d11e8f56b5..634cc8aed1c7 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -6185,13 +6185,13 @@ static int megasas_io_attach(struct megasas_instance 
*instance)
  * @instance:  Adapter soft state
  * Description:
  *
- * For Ventura, driver/FW will operate in 64bit DMA addresses.
+ * For Ventura, driver/FW will operate in 63bit DMA addresses.
  *
  * For invader-
  * By default, driver/FW will operate in 32bit DMA addresses
  * for consistent DMA mapping but if 32 bit consistent
- * DMA mask fails, driver will try with 64 bit consistent
- * mask provided FW is true 64bit DMA capable
+ * DMA mask fails, driver will try with 63 bit consistent
+ * mask provided FW is true 63bit DMA capable
  *
  * For older controllers(Thunderbolt and MFI based adapters)-
  * driver/FW will operate in 32 bit consistent DMA addresses.
@@ -6205,14 +6205,14 @@ megasas_set_dma_mask(struct megasas_instance *instance)
 
pdev = instance->pdev;
consistent_mask = (instance->adapter_type >= VENTURA_SERIES) ?
-   DMA_BIT_MASK(64) : DMA_BIT_MASK(32);
+   DMA_BIT_MASK(63) : DMA_BIT_MASK(32);
 
if (IS_DMA64) {
-   if (dma_set_mask(&pdev->dev, DMA_BIT_MASK(64)) &&
+   if (dma_set_mask(&pdev->dev, DMA_BIT_MASK(63)) &&
dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32)))
goto fail_set_dma_mask;
 
-   if ((*pdev->dev.dma_mask == DMA_BIT_MASK(64)) &&
+   if ((*pdev->dev.dma_mask == DMA_BIT_MASK(63)) &&
(dma_set_coherent_mask(&pdev->dev, consistent_mask) &&
 dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32 {
/*
@@ -6225,7 +6225,7 @@ megasas_set_dma_mask(struct megasas_instance *instance)
if (!(scratch_pad_1 & MR_CAN_HANDLE_64_BIT_DMA_OFFSET))
goto fail_set_dma_mask;
else if (dma_set_mask_and_coherent(&pdev->dev,
-  DMA_BIT_MASK(64)))
+  DMA_BIT_MASK(63)))
goto fail_set_dma_mask;
}
} else if (dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32)))
@@ -6237,8 +6237,8 @@ megasas_set_dma_mask(struct megasas_instance *instance)
instance->consistent_mask_64bit = true;
 
dev_info(&pdev->dev, "%s bit DMA mask and %s bit consistent mask\n",
-((*pdev->dev.dma_mask == DMA_BIT_MASK(64)) ? "64" : "32"),
-(instance->consistent_mask_64bit ? "64" : "32"));
+((*pdev->dev.dma_mask == DMA_BIT_MASK(64)) ? "63" : "32"),
+(instance->consistent_mask_64bit ? "63" : "32"));
 
return 0;
 
-- 
2.16.1



[PATCH 2/2] megaraid_sas: driver version update

2018-12-18 Thread Shivasharan S
Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas.h | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas.h 
b/drivers/scsi/megaraid/megaraid_sas.h
index 8bfe4c54e4ae..2099c8e9d629 100644
--- a/drivers/scsi/megaraid/megaraid_sas.h
+++ b/drivers/scsi/megaraid/megaraid_sas.h
@@ -33,8 +33,8 @@
 /*
  * MegaRAID SAS Driver meta data
  */
-#define MEGASAS_VERSION"07.707.03.00-rc1"
-#define MEGASAS_RELDATE"August 30, 2018"
+#define MEGASAS_VERSION"07.707.50.00-rc1"
+#define MEGASAS_RELDATE"December 18, 2018"
 
 /*
  * Device IDs
-- 
2.16.1



[PATCH 4/4] megaraid_sas: add retry logic in megasas_readl

2018-12-17 Thread Shivasharan S
Problem statement:
Due to hardware errata in Aero controllers, reads to certain
fusion registers could intermittently return zero.
This behavior is transient in nature and subsequent reads will return
valid value.

Fix:
For Aero controllers, any calls to readl to read from certain registers,
will be retried for maximum three times, if read returns zero.

Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas_base.c   | 39 +++--
 drivers/scsi/megaraid/megaraid_sas_fusion.c | 28 +
 2 files changed, 49 insertions(+), 18 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index 1d2272fddc5f..d4e3df320a0c 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -220,6 +220,28 @@ megasas_free_ctrl_dma_buffers(struct megasas_instance 
*instance);
 static inline void
 megasas_init_ctrl_params(struct megasas_instance *instance);
 
+u32 megasas_readl(struct megasas_instance *instance,
+ const volatile void __iomem *addr)
+{
+   u32 i = 0, ret_val;
+   /*
+* Due to a HW errata in Aero controllers, reads to certain
+* Fusion registers could intermittently return all zeroes.
+* This behavior is transient in nature and subsequent reads will
+* return valid value. As a workaround in driver, retry readl for
+* upto three times until a non-zero value is read.
+*/
+   if (instance->adapter_type == AERO_SERIES) {
+   do {
+   ret_val = readl(addr);
+   i++;
+   } while (ret_val == 0 && i < 3);
+   return ret_val;
+   } else {
+   return readl(addr);
+   }
+}
+
 /**
  * megasas_set_dma_settings -  Populate DMA address, length and flags for DCMDs
  * @instance:  Adapter soft state
@@ -3842,7 +3864,8 @@ megasas_transition_to_ready(struct megasas_instance 
*instance, int ocr)
 
if (instance->adapter_type != MFI_SERIES) {
for (i = 0; i < (10 * 1000); i += 20) {
-   if (readl(
+   if (megasas_readl(
+   instance,
&instance->
reg_set->
doorbell) & 1)
@@ -5401,7 +5424,8 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
 
if (instance->adapter_type >= VENTURA_SERIES) {
scratch_pad_2 =
-   readl(&instance->reg_set->outbound_scratch_pad_2);
+   megasas_readl(instance,
+ 
&instance->reg_set->outbound_scratch_pad_2);
instance->max_raid_mapsize = ((scratch_pad_2 >>
MR_MAX_RAID_MAP_SIZE_OFFSET_SHIFT) &
MR_MAX_RAID_MAP_SIZE_MASK);
@@ -5413,8 +5437,8 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
if (msix_enable && !msix_disable) {
int irq_flags = PCI_IRQ_MSIX;
 
-   scratch_pad_1 = readl
-   (&instance->reg_set->outbound_scratch_pad_1);
+   scratch_pad_1 = megasas_readl
+   (instance, &instance->reg_set->outbound_scratch_pad_1);
/* Check max MSI-X vectors */
if (fusion) {
if (instance->adapter_type == THUNDERBOLT_SERIES) {
@@ -5525,7 +5549,8 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
 
if (instance->adapter_type >= VENTURA_SERIES) {
scratch_pad_3 =
-   readl(&instance->reg_set->outbound_scratch_pad_3);
+   megasas_readl(instance,
+ 
&instance->reg_set->outbound_scratch_pad_3);
if ((scratch_pad_3 & MR_NVME_PAGE_SIZE_MASK) >=
MR_DEFAULT_NVME_PAGE_SHIFT)
instance->nvme_page_size =
@@ -6193,8 +6218,8 @@ megasas_set_dma_mask(struct megasas_instance *instance)
 * If 32 bit DMA mask fails, then try for 64 bit mask
 * for FW capable of handling 64 bit DMA.
 */
-   scratch_pad_1 = readl
-   (&instance->reg_set->outbound_scratch_pad_1);
+   scratch_pad_1 = megasas_readl
+   (instance, 
&instance->reg_set->outbound_scratch_pad_1);
 
if (!(scrat

[PATCH 1/4] megaraid_sas: Fix Ventura series based checks

2018-12-17 Thread Shivasharan S
In preparation for the new Aero series adapter type, all the places
where we check adapter type for Ventura series needs to include
any later adapter types.

Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas_base.c   | 10 +-
 drivers/scsi/megaraid/megaraid_sas_fp.c |  8 
 drivers/scsi/megaraid/megaraid_sas_fusion.c | 22 +++---
 3 files changed, 20 insertions(+), 20 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index 9db7aebc3564..48c7b633ed49 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -5399,7 +5399,7 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
 
fusion = instance->ctrl_context;
 
-   if (instance->adapter_type == VENTURA_SERIES) {
+   if (instance->adapter_type >= VENTURA_SERIES) {
scratch_pad_2 =
readl(&instance->reg_set->outbound_scratch_pad_2);
instance->max_raid_mapsize = ((scratch_pad_2 >>
@@ -5522,7 +5522,7 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
if (instance->instancet->init_adapter(instance))
goto fail_init_adapter;
 
-   if (instance->adapter_type == VENTURA_SERIES) {
+   if (instance->adapter_type >= VENTURA_SERIES) {
scratch_pad_3 =
readl(&instance->reg_set->outbound_scratch_pad_3);
if ((scratch_pad_3 & MR_NVME_PAGE_SIZE_MASK) >=
@@ -5558,7 +5558,7 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
memset(instance->ld_ids, 0xff, MEGASAS_MAX_LD_IDS);
 
/* stream detection initialization */
-   if (instance->adapter_type == VENTURA_SERIES) {
+   if (instance->adapter_type >= VENTURA_SERIES) {
fusion->stream_detect_by_ld =
kcalloc(MAX_LOGICAL_DRIVES_EXT,
sizeof(struct LD_STREAM_DETECT *),
@@ -6177,7 +6177,7 @@ megasas_set_dma_mask(struct megasas_instance *instance)
u32 scratch_pad_1;
 
pdev = instance->pdev;
-   consistent_mask = (instance->adapter_type == VENTURA_SERIES) ?
+   consistent_mask = (instance->adapter_type >= VENTURA_SERIES) ?
DMA_BIT_MASK(64) : DMA_BIT_MASK(32);
 
if (IS_DMA64) {
@@ -7131,7 +7131,7 @@ static void megasas_detach_one(struct pci_dev *pdev)
if (instance->msix_vectors)
pci_free_irq_vectors(instance->pdev);
 
-   if (instance->adapter_type == VENTURA_SERIES) {
+   if (instance->adapter_type >= VENTURA_SERIES) {
for (i = 0; i < MAX_LOGICAL_DRIVES_EXT; ++i)
kfree(fusion->stream_detect_by_ld[i]);
kfree(fusion->stream_detect_by_ld);
diff --git a/drivers/scsi/megaraid/megaraid_sas_fp.c 
b/drivers/scsi/megaraid/megaraid_sas_fp.c
index 25fa999e0280..a5ff075d2df1 100644
--- a/drivers/scsi/megaraid/megaraid_sas_fp.c
+++ b/drivers/scsi/megaraid/megaraid_sas_fp.c
@@ -743,7 +743,7 @@ static u8 mr_spanset_get_phy_params(struct megasas_instance 
*instance, u32 ld,
*pDevHandle = MR_PdDevHandleGet(pd, map);
*pPdInterface = MR_PdInterfaceTypeGet(pd, map);
/* get second pd also for raid 1/10 fast path writes*/
-   if ((instance->adapter_type == VENTURA_SERIES) &&
+   if ((instance->adapter_type >= VENTURA_SERIES) &&
(raid->level == 1) &&
!io_info->isRead) {
r1_alt_pd = MR_ArPdGet(arRef, physArm + 1, map);
@@ -768,7 +768,7 @@ static u8 mr_spanset_get_phy_params(struct megasas_instance 
*instance, u32 ld,
}
 
*pdBlock += stripRef + le64_to_cpu(MR_LdSpanPtrGet(ld, span, 
map)->startBlk);
-   if (instance->adapter_type == VENTURA_SERIES) {
+   if (instance->adapter_type >= VENTURA_SERIES) {
((struct RAID_CONTEXT_G35 *)pRAID_Context)->span_arm =
(span << RAID_CTX_SPANARM_SPAN_SHIFT) | physArm;
io_info->span_arm =
@@ -859,7 +859,7 @@ u8 MR_GetPhyParams(struct megasas_instance *instance, u32 
ld, u64 stripRow,
*pDevHandle = MR_PdDevHandleGet(pd, map);
*pPdInterface = MR_PdInterfaceTypeGet(pd, map);
/* get second pd also for raid 1/10 fast path writes*/
-   if ((instance->adapter_type == VENTURA_SERIES) &&
+   if ((instance->adapter_type >= VENTURA_SERIES) &&
(raid->level == 1) &&
!io_info->isRead) {
r1_alt_pd = MR_ArPdGet(arRef, physArm + 1, map);
@@ -886,7 +886,7 @@ u8 MR_GetPhyParams(struct 

[PATCH 3/4] megaraid_sas: changes to function prototypes

2018-12-17 Thread Shivasharan S
Instead of the register address, pass the instance pointer to
clear_intr and read_fw_status_reg functions.
This is done in preparation for adding adapter type based checks
in these functions in later patches of this series.

Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas.h|  4 +-
 drivers/scsi/megaraid/megaraid_sas_base.c   | 66 ++---
 drivers/scsi/megaraid/megaraid_sas_fusion.c | 48 ++---
 3 files changed, 59 insertions(+), 59 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas.h 
b/drivers/scsi/megaraid/megaraid_sas.h
index 4064fae7e7ba..8bfe4c54e4ae 100644
--- a/drivers/scsi/megaraid/megaraid_sas.h
+++ b/drivers/scsi/megaraid/megaraid_sas.h
@@ -2413,9 +2413,9 @@ struct megasas_instance_template {
void (*enable_intr)(struct megasas_instance *);
void (*disable_intr)(struct megasas_instance *);
 
-   int (*clear_intr)(struct megasas_register_set __iomem *);
+   int (*clear_intr)(struct megasas_instance *);
 
-   u32 (*read_fw_status_reg)(struct megasas_register_set __iomem *);
+   u32 (*read_fw_status_reg)(struct megasas_instance *);
int (*adp_reset)(struct megasas_instance *, \
struct megasas_register_set __iomem *);
int (*check_reset)(struct megasas_instance *, \
diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index 9002d64e5239..1d2272fddc5f 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -190,7 +190,7 @@ void
 megasas_complete_cmd(struct megasas_instance *instance, struct megasas_cmd 
*cmd,
 u8 alt_status);
 static u32
-megasas_read_fw_status_reg_gen2(struct megasas_register_set __iomem *regs);
+megasas_read_fw_status_reg_gen2(struct megasas_instance *instance);
 static int
 megasas_adp_reset_gen2(struct megasas_instance *instance,
   struct megasas_register_set __iomem *reg_set);
@@ -420,19 +420,21 @@ megasas_disable_intr_xscale(struct megasas_instance 
*instance)
  * @regs:  MFI register set
  */
 static u32
-megasas_read_fw_status_reg_xscale(struct megasas_register_set __iomem * regs)
+megasas_read_fw_status_reg_xscale(struct megasas_instance *instance)
 {
-   return readl(&(regs)->outbound_msg_0);
+   return readl(&instance->reg_set->outbound_msg_0);
 }
 /**
  * megasas_clear_interrupt_xscale -Check & clear interrupt
  * @regs:  MFI register set
  */
 static int
-megasas_clear_intr_xscale(struct megasas_register_set __iomem * regs)
+megasas_clear_intr_xscale(struct megasas_instance *instance)
 {
u32 status;
u32 mfiStatus = 0;
+   struct megasas_register_set __iomem *regs;
+   regs = instance->reg_set;
 
/*
 * Check if it is our interrupt
@@ -597,9 +599,9 @@ megasas_disable_intr_ppc(struct megasas_instance *instance)
  * @regs:  MFI register set
  */
 static u32
-megasas_read_fw_status_reg_ppc(struct megasas_register_set __iomem * regs)
+megasas_read_fw_status_reg_ppc(struct megasas_instance *instance)
 {
-   return readl(&(regs)->outbound_scratch_pad_0);
+   return readl(&instance->reg_set->outbound_scratch_pad_0);
 }
 
 /**
@@ -607,9 +609,11 @@ megasas_read_fw_status_reg_ppc(struct megasas_register_set 
__iomem * regs)
  * @regs:  MFI register set
  */
 static int
-megasas_clear_intr_ppc(struct megasas_register_set __iomem * regs)
+megasas_clear_intr_ppc(struct megasas_instance *instance)
 {
u32 status, mfiStatus = 0;
+   struct megasas_register_set __iomem *regs;
+   regs = instance->reg_set;
 
/*
 * Check if it is our interrupt
@@ -722,9 +726,9 @@ megasas_disable_intr_skinny(struct megasas_instance 
*instance)
  * @regs:  MFI register set
  */
 static u32
-megasas_read_fw_status_reg_skinny(struct megasas_register_set __iomem *regs)
+megasas_read_fw_status_reg_skinny(struct megasas_instance *instance)
 {
-   return readl(&(regs)->outbound_scratch_pad_0);
+   return readl(&instance->reg_set->outbound_scratch_pad_0);
 }
 
 /**
@@ -732,10 +736,12 @@ megasas_read_fw_status_reg_skinny(struct 
megasas_register_set __iomem *regs)
  * @regs:  MFI register set
  */
 static int
-megasas_clear_intr_skinny(struct megasas_register_set __iomem *regs)
+megasas_clear_intr_skinny(struct megasas_instance *instance)
 {
u32 status;
u32 mfiStatus = 0;
+   struct megasas_register_set __iomem *regs;
+   regs = instance->reg_set;
 
/*
 * Check if it is our interrupt
@@ -749,7 +755,7 @@ megasas_clear_intr_skinny(struct megasas_register_set 
__iomem *regs)
/*
 * Check if it is our interrupt
 */
-   if ((megasas_read_fw_status_reg_skinny(regs) & MFI_ST

[PATCH 0/4] megaraid_sas: Fix HW errata in Aero controllers

2018-12-17 Thread Shivasharan S
Below patch series adds workaround for Aero controllers due to a HW
errata that returns zero intermittently for read operations.

Shivasharan S (4):
  megaraid_sas: Fix Ventura series based checks
  megaraid_sas: Introduce new Aero adapter type
  megaraid_sas: change function prototypes in megasas_template
  megaraid_sas: add retry logic in megasas_readl

 drivers/scsi/megaraid/megaraid_sas.h|   5 +-
 drivers/scsi/megaraid/megaraid_sas_base.c   | 133 +---
 drivers/scsi/megaraid/megaraid_sas_fp.c |   8 +-
 drivers/scsi/megaraid/megaraid_sas_fusion.c |  96 ++--
 4 files changed, 140 insertions(+), 102 deletions(-)

-- 
2.16.1



[PATCH 2/4] megaraid_sas: Introduce new Aero adapter type

2018-12-17 Thread Shivasharan S
Identify all Aero controller PCI IDs with new adapter type.

Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas.h  |  1 +
 drivers/scsi/megaraid/megaraid_sas_base.c | 18 --
 2 files changed, 13 insertions(+), 6 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas.h 
b/drivers/scsi/megaraid/megaraid_sas.h
index 55f6662ceb55..4064fae7e7ba 100644
--- a/drivers/scsi/megaraid/megaraid_sas.h
+++ b/drivers/scsi/megaraid/megaraid_sas.h
@@ -1570,6 +1570,7 @@ enum MR_ADAPTER_TYPE {
THUNDERBOLT_SERIES = 2,
INVADER_SERIES = 3,
VENTURA_SERIES = 4,
+   AERO_SERIES = 5,
 };
 
 /*
diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index 48c7b633ed49..9002d64e5239 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -5440,6 +5440,7 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
if (instance->msix_vectors > 8)
instance->msix_combined = true;
break;
+   case AERO_SERIES:
case VENTURA_SERIES:
if (instance->msix_vectors > 16)
instance->msix_combined = true;
@@ -6224,12 +6225,14 @@ megasas_set_dma_mask(struct megasas_instance *instance)
 /*
  * megasas_set_adapter_type -  Set adapter type.
  * Supported controllers can be divided in
- * 4 categories-  enum MR_ADAPTER_TYPE {
- * MFI_SERIES = 1,
- * THUNDERBOLT_SERIES = 2,
- * INVADER_SERIES = 3,
- * VENTURA_SERIES = 4,
- * };
+ * different categories-
+ * enum MR_ADAPTER_TYPE {
+ * MFI_SERIES = 1,
+ * THUNDERBOLT_SERIES = 2,
+ * INVADER_SERIES = 3,
+ * VENTURA_SERIES = 4,
+ * AERO_SERIES = 5,
+ * };
  * @instance:  Adapter soft state
  * return: void
  */
@@ -6244,6 +6247,8 @@ static inline void megasas_set_adapter_type(struct 
megasas_instance *instance)
case PCI_DEVICE_ID_LSI_AERO_10E2:
case PCI_DEVICE_ID_LSI_AERO_10E5:
case PCI_DEVICE_ID_LSI_AERO_10E6:
+   instance->adapter_type = AERO_SERIES;
+   break;
case PCI_DEVICE_ID_LSI_VENTURA:
case PCI_DEVICE_ID_LSI_CRUSADER:
case PCI_DEVICE_ID_LSI_HARPOON:
@@ -6311,6 +6316,7 @@ static int megasas_alloc_ctrl_mem(struct megasas_instance 
*instance)
if (megasas_alloc_mfi_ctrl_mem(instance))
goto fail;
break;
+   case AERO_SERIES:
case VENTURA_SERIES:
case THUNDERBOLT_SERIES:
case INVADER_SERIES:
-- 
2.16.1



[PATCH v2] megaraid_sas: Add support for MegaRAID Aero controllers

2018-11-09 Thread Shivasharan S
This patch adds support for MegaRAID Aero controller PCI IDs.
Throw a message when a Configurable secure type controller is
encountered.

Signed-off-by: Shivasharan S 
---
Changes in v2:
Change dev_warn to dev_info.

 drivers/scsi/megaraid/megaraid_sas.h  |  4 
 drivers/scsi/megaraid/megaraid_sas_base.c | 15 +++
 2 files changed, 19 insertions(+)

diff --git a/drivers/scsi/megaraid/megaraid_sas.h 
b/drivers/scsi/megaraid/megaraid_sas.h
index 8edba2227cd3..55f6662ceb55 100644
--- a/drivers/scsi/megaraid/megaraid_sas.h
+++ b/drivers/scsi/megaraid/megaraid_sas.h
@@ -60,6 +60,10 @@
 #define PCI_DEVICE_ID_LSI_TOMCAT   0x0017
 #define PCI_DEVICE_ID_LSI_VENTURA_4PORT0x001B
 #define PCI_DEVICE_ID_LSI_CRUSADER_4PORT   0x001C
+#define PCI_DEVICE_ID_LSI_AERO_10E10x10e1
+#define PCI_DEVICE_ID_LSI_AERO_10E20x10e2
+#define PCI_DEVICE_ID_LSI_AERO_10E50x10e5
+#define PCI_DEVICE_ID_LSI_AERO_10E60x10e6
 
 /*
  * Intel HBA SSDIDs
diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index 27fab13c55ea..bc8e4d91d34b 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -162,6 +162,10 @@ static struct pci_device_id megasas_pci_table[] = {
{PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_TOMCAT)},
{PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_VENTURA_4PORT)},
{PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_CRUSADER_4PORT)},
+   {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_AERO_10E1)},
+   {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_AERO_10E2)},
+   {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_AERO_10E5)},
+   {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_AERO_10E6)},
{}
 };
 
@@ -6235,6 +6239,10 @@ static inline void megasas_set_adapter_type(struct 
megasas_instance *instance)
instance->adapter_type = MFI_SERIES;
} else {
switch (instance->pdev->device) {
+   case PCI_DEVICE_ID_LSI_AERO_10E1:
+   case PCI_DEVICE_ID_LSI_AERO_10E2:
+   case PCI_DEVICE_ID_LSI_AERO_10E5:
+   case PCI_DEVICE_ID_LSI_AERO_10E6:
case PCI_DEVICE_ID_LSI_VENTURA:
case PCI_DEVICE_ID_LSI_CRUSADER:
case PCI_DEVICE_ID_LSI_HARPOON:
@@ -6598,6 +6606,13 @@ static int megasas_probe_one(struct pci_dev *pdev,
struct megasas_instance *instance;
u16 control = 0;
 
+   switch (pdev->device) {
+   case PCI_DEVICE_ID_LSI_AERO_10E1:
+   case PCI_DEVICE_ID_LSI_AERO_10E5:
+   dev_info(&pdev->dev, "Adapter is in configurable secure 
mode\n");
+   break;
+   }
+
/* Reset MSI-X in the kdump kernel */
if (reset_devices) {
pos = pci_find_capability(pdev, PCI_CAP_ID_MSIX);
-- 
2.16.1



[PATCH] megaraid_sas: Add support for MegaRAID Aero controllers

2018-11-07 Thread Shivasharan S
This patch adds support for MegaRAID Aero controller PCI IDs.
Throw a warning message when a Configurable secure type controller is
encountered.

Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas.h  |  4 
 drivers/scsi/megaraid/megaraid_sas_base.c | 15 +++
 2 files changed, 19 insertions(+)

diff --git a/drivers/scsi/megaraid/megaraid_sas.h 
b/drivers/scsi/megaraid/megaraid_sas.h
index 8edba2227cd3..55f6662ceb55 100644
--- a/drivers/scsi/megaraid/megaraid_sas.h
+++ b/drivers/scsi/megaraid/megaraid_sas.h
@@ -60,6 +60,10 @@
 #define PCI_DEVICE_ID_LSI_TOMCAT   0x0017
 #define PCI_DEVICE_ID_LSI_VENTURA_4PORT0x001B
 #define PCI_DEVICE_ID_LSI_CRUSADER_4PORT   0x001C
+#define PCI_DEVICE_ID_LSI_AERO_10E10x10e1
+#define PCI_DEVICE_ID_LSI_AERO_10E20x10e2
+#define PCI_DEVICE_ID_LSI_AERO_10E50x10e5
+#define PCI_DEVICE_ID_LSI_AERO_10E60x10e6
 
 /*
  * Intel HBA SSDIDs
diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index 27fab13c55ea..bc8e4d91d34b 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -162,6 +162,10 @@ static struct pci_device_id megasas_pci_table[] = {
{PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_TOMCAT)},
{PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_VENTURA_4PORT)},
{PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_CRUSADER_4PORT)},
+   {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_AERO_10E1)},
+   {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_AERO_10E2)},
+   {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_AERO_10E5)},
+   {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_AERO_10E6)},
{}
 };
 
@@ -6235,6 +6239,10 @@ static inline void megasas_set_adapter_type(struct 
megasas_instance *instance)
instance->adapter_type = MFI_SERIES;
} else {
switch (instance->pdev->device) {
+   case PCI_DEVICE_ID_LSI_AERO_10E1:
+   case PCI_DEVICE_ID_LSI_AERO_10E2:
+   case PCI_DEVICE_ID_LSI_AERO_10E5:
+   case PCI_DEVICE_ID_LSI_AERO_10E6:
case PCI_DEVICE_ID_LSI_VENTURA:
case PCI_DEVICE_ID_LSI_CRUSADER:
case PCI_DEVICE_ID_LSI_HARPOON:
@@ -6598,6 +6606,13 @@ static int megasas_probe_one(struct pci_dev *pdev,
struct megasas_instance *instance;
u16 control = 0;
 
+   switch (pdev->device) {
+   case PCI_DEVICE_ID_LSI_AERO_10E1:
+   case PCI_DEVICE_ID_LSI_AERO_10E5:
+   dev_warn(&pdev->dev, "Adapter is in configurable secure 
mode\n");
+   break;
+   }
+
/* Reset MSI-X in the kdump kernel */
if (reset_devices) {
pos = pci_find_capability(pdev, PCI_CAP_ID_MSIX);
-- 
2.16.1



[PATCH V2 19/19] megaraid_sas: Update driver version

2018-10-16 Thread Shivasharan S
Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas.h | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas.h 
b/drivers/scsi/megaraid/megaraid_sas.h
index 994c6ac6f920..8edba2227cd3 100644
--- a/drivers/scsi/megaraid/megaraid_sas.h
+++ b/drivers/scsi/megaraid/megaraid_sas.h
@@ -33,8 +33,8 @@
 /*
  * MegaRAID SAS Driver meta data
  */
-#define MEGASAS_VERSION"07.706.03.00-rc1"
-#define MEGASAS_RELDATE"May 21, 2018"
+#define MEGASAS_VERSION"07.707.03.00-rc1"
+#define MEGASAS_RELDATE"August 30, 2018"
 
 /*
  * Device IDs
-- 
2.16.1



[PATCH V2 18/19] megaraid_sas: modify max supported lds related print

2018-10-16 Thread Shivasharan S
The print related to number of VDs that a particular firmware supports is
misleading in some cases.
Even though supportMaxExtLDs is set, certain firmware profiles only
supports upto 64VDs.

Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas_base.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index 9a6c2597055f..2993a9766b0f 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -4633,9 +4633,9 @@ static void megasas_update_ext_vd_details(struct 
megasas_instance *instance)
}
 
dev_info(&instance->pdev->dev,
-   "firmware type\t: %s\n",
-   instance->supportmax256vd ? "Extended VD(240 VD)firmware" :
-   "Legacy(64 VD) firmware");
+   "FW provided supportMaxExtLDs: %d\tmax_lds: %d\n",
+   instance->ctrl_info_buf->adapterOperations3.supportMaxExtLDs ? 
1 : 0,
+   instance->ctrl_info_buf->max_lds);
 
if (instance->max_raid_mapsize) {
ventura_map_sz = instance->max_raid_mapsize *
-- 
2.16.1



[PATCH V2 16/19] megaraid_sas: increase timeout for IOC INIT to 180seconds

2018-10-16 Thread Shivasharan S
IOC INIT frame needs to be fired with a timeout of 180seconds.

Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas_fusion.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas_fusion.c 
b/drivers/scsi/megaraid/megaraid_sas_fusion.c
index a26abc041435..c5e6bccb0895 100644
--- a/drivers/scsi/megaraid/megaraid_sas_fusion.c
+++ b/drivers/scsi/megaraid/megaraid_sas_fusion.c
@@ -1113,7 +1113,7 @@ megasas_ioc_init_fusion(struct megasas_instance *instance)
 
megasas_fire_cmd_fusion(instance, &req_desc);
 
-   wait_and_poll(instance, cmd, MFI_POLL_TIMEOUT_SECS);
+   wait_and_poll(instance, cmd, MFI_IO_TIMEOUT_SECS);
 
frame_hdr = &cmd->frame->hdr;
if (frame_hdr->cmd_status != 0) {
-- 
2.16.1



[PATCH V2 15/19] megaraid_sas: Remove double endian conversion

2018-10-16 Thread Shivasharan S
Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas_fusion.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas_fusion.c 
b/drivers/scsi/megaraid/megaraid_sas_fusion.c
index b13fd1c601d7..a26abc041435 100644
--- a/drivers/scsi/megaraid/megaraid_sas_fusion.c
+++ b/drivers/scsi/megaraid/megaraid_sas_fusion.c
@@ -1043,9 +1043,7 @@ megasas_ioc_init_fusion(struct megasas_instance *instance)
 
frame_hdr = &cmd->frame->hdr;
frame_hdr->cmd_status = 0xFF;
-   frame_hdr->flags = cpu_to_le16(
-   le16_to_cpu(frame_hdr->flags) |
-   MFI_FRAME_DONT_POST_IN_REPLY_QUEUE);
+   frame_hdr->flags |= cpu_to_le16(MFI_FRAME_DONT_POST_IN_REPLY_QUEUE);
 
init_frame->cmd = MFI_CMD_INIT;
init_frame->cmd_status = 0xFF;
-- 
2.16.1



[PATCH V2 14/19] megaraid_sas: Re-use max_mfi_cmds to calculate queue sizes

2018-10-16 Thread Shivasharan S
In megasas_init_adapter_fusion(), max_mfi_cmds is being calcuated as
(MEGASAS_FUSION_INTERNAL_CMDS + MEGASAS_FUSION_IOCTL_CMDS).
max_mfi_cmds can be used in megasas_configure_queue_sizes.

Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas_fusion.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas_fusion.c 
b/drivers/scsi/megaraid/megaraid_sas_fusion.c
index b44a5fef5d9b..b13fd1c601d7 100644
--- a/drivers/scsi/megaraid/megaraid_sas_fusion.c
+++ b/drivers/scsi/megaraid/megaraid_sas_fusion.c
@@ -1564,9 +1564,7 @@ void megasas_configure_queue_sizes(struct 
megasas_instance *instance)
else
instance->max_mpt_cmds = instance->max_fw_cmds;
 
-   instance->max_scsi_cmds = instance->max_fw_cmds -
-   (MEGASAS_FUSION_INTERNAL_CMDS +
-   MEGASAS_FUSION_IOCTL_CMDS);
+   instance->max_scsi_cmds = instance->max_fw_cmds - 
instance->max_mfi_cmds;
instance->cur_can_queue = instance->max_scsi_cmds;
instance->host->can_queue = instance->cur_can_queue;
 
-- 
2.16.1



[PATCH V2 17/19] megaraid_sas: remove unused macro

2018-10-16 Thread Shivasharan S
Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas.h | 1 -
 1 file changed, 1 deletion(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas.h 
b/drivers/scsi/megaraid/megaraid_sas.h
index 2c044106c35f..994c6ac6f920 100644
--- a/drivers/scsi/megaraid/megaraid_sas.h
+++ b/drivers/scsi/megaraid/megaraid_sas.h
@@ -1499,7 +1499,6 @@ enum FW_BOOT_CONTEXT {
 #define MEGASAS_IOCTL_CMD  0
 #define MEGASAS_DEFAULT_CMD_TIMEOUT90
 #define MEGASAS_THROTTLE_QUEUE_DEPTH   16
-#define MEGASAS_BLOCKED_CMD_TIMEOUT60
 #define MEGASAS_DEFAULT_TM_TIMEOUT 50
 /*
  * FW reports the maximum of number of commands that it can accept (maximum
-- 
2.16.1



[PATCH V2 11/19] megaraid_sas: optimize raid context access in IO path

2018-10-16 Thread Shivasharan S
No functional change.
Use local variables when accessing raid context in IO path.
Improves code readability.

Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas_fusion.c | 74 -
 1 file changed, 31 insertions(+), 43 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas_fusion.c 
b/drivers/scsi/megaraid/megaraid_sas_fusion.c
index 11cb3faa6779..7df7e2c8d4b3 100644
--- a/drivers/scsi/megaraid/megaraid_sas_fusion.c
+++ b/drivers/scsi/megaraid/megaraid_sas_fusion.c
@@ -2627,19 +2627,22 @@ megasas_build_ldio_fusion(struct megasas_instance 
*instance,
struct MR_DRV_RAID_MAP_ALL *local_map_ptr;
u8 *raidLUN;
unsigned long spinlock_flags;
-   union RAID_CONTEXT_UNION *praid_context;
struct MR_LD_RAID *raid = NULL;
struct MR_PRIV_DEVICE *mrdev_priv;
+   struct RAID_CONTEXT *rctx;
+   struct RAID_CONTEXT_G35 *rctx_g35;
 
device_id = MEGASAS_DEV_INDEX(scp);
 
fusion = instance->ctrl_context;
 
io_request = cmd->io_request;
-   io_request->RaidContext.raid_context.virtual_disk_tgt_id =
-   cpu_to_le16(device_id);
-   io_request->RaidContext.raid_context.status = 0;
-   io_request->RaidContext.raid_context.ex_status = 0;
+   rctx = &io_request->RaidContext.raid_context;
+   rctx_g35 = &io_request->RaidContext.raid_context_g35;
+
+   rctx->virtual_disk_tgt_id = cpu_to_le16(device_id);
+   rctx->status = 0;
+   rctx->ex_status = 0;
 
req_desc = (union MEGASAS_REQUEST_DESCRIPTOR_UNION *)cmd->request_desc;
 
@@ -2715,11 +2718,10 @@ megasas_build_ldio_fusion(struct megasas_instance 
*instance,
raid = MR_LdRaidGet(ld, local_map_ptr);
 
if (!raid || (!fusion->fast_path_io)) {
-   io_request->RaidContext.raid_context.reg_lock_flags  = 0;
+   rctx->reg_lock_flags  = 0;
fp_possible = false;
} else {
-   if (MR_BuildRaidContext(instance, &io_info,
-   &io_request->RaidContext.raid_context,
+   if (MR_BuildRaidContext(instance, &io_info, rctx,
local_map_ptr, &raidLUN))
fp_possible = (io_info.fpOkForIo > 0) ? true : false;
}
@@ -2727,8 +2729,6 @@ megasas_build_ldio_fusion(struct megasas_instance 
*instance,
cmd->request_desc->SCSIIO.MSIxIndex =
instance->reply_map[raw_smp_processor_id()];
 
-   praid_context = &io_request->RaidContext;
-
if (instance->adapter_type == VENTURA_SERIES) {
/* FP for Optimal raid level 1.
 * All large RAID-1 writes (> 32 KiB, both WT and WB modes)
@@ -2765,17 +2765,17 @@ megasas_build_ldio_fusion(struct megasas_instance 
*instance,
/* In ventura if stream detected for a read and it is
 * read ahead capable make this IO as LDIO
 */
-   if 
(is_stream_detected(&io_request->RaidContext.raid_context_g35))
+   if (is_stream_detected(rctx_g35))
fp_possible = false;
}
 
/* If raid is NULL, set CPU affinity to default CPU0 */
if (raid)
-   megasas_set_raidflag_cpu_affinity(praid_context,
+   
megasas_set_raidflag_cpu_affinity(&io_request->RaidContext,
raid, fp_possible, io_info.isRead,
scsi_buff_len);
else
-   praid_context->raid_context_g35.routing_flags |=
+   rctx_g35->routing_flags |=
(MR_RAID_CTX_CPUSEL_0 << 
MR_RAID_CTX_ROUTINGFLAGS_CPUSEL_SHIFT);
}
 
@@ -2787,25 +2787,20 @@ megasas_build_ldio_fusion(struct megasas_instance 
*instance,
(MPI2_REQ_DESCRIPT_FLAGS_FP_IO
 << MEGASAS_REQ_DESCRIPT_FLAGS_TYPE_SHIFT);
if (instance->adapter_type == INVADER_SERIES) {
-   if (io_request->RaidContext.raid_context.reg_lock_flags 
==
-   REGION_TYPE_UNUSED)
+   if (rctx->reg_lock_flags == REGION_TYPE_UNUSED)
cmd->request_desc->SCSIIO.RequestFlags =
(MEGASAS_REQ_DESCRIPT_FLAGS_NO_LOCK <<
MEGASAS_REQ_DESCRIPT_FLAGS_TYPE_SHIFT);
-   io_request->RaidContext.raid_context.type
-   = MPI2_TYPE_CUDA;
-   io_request->RaidContext.raid_context.nseg = 0x1;
+   rctx->type = MPI2_TYPE_CUDA;
+   

[PATCH V2 12/19] megaraid_sas: Remove spin lock for dpc operation

2018-10-16 Thread Shivasharan S
Optimization -
No need to hold hba_lock in dpc context for reading atomic variable.

Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas_fusion.c | 7 +--
 1 file changed, 1 insertion(+), 6 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas_fusion.c 
b/drivers/scsi/megaraid/megaraid_sas_fusion.c
index 7df7e2c8d4b3..259fc892703e 100644
--- a/drivers/scsi/megaraid/megaraid_sas_fusion.c
+++ b/drivers/scsi/megaraid/megaraid_sas_fusion.c
@@ -3573,18 +3573,13 @@ megasas_complete_cmd_dpc_fusion(unsigned long 
instance_addr)
 {
struct megasas_instance *instance =
(struct megasas_instance *)instance_addr;
-   unsigned long flags;
u32 count, MSIxIndex;
 
count = instance->msix_vectors > 0 ? instance->msix_vectors : 1;
 
/* If we have already declared adapter dead, donot complete cmds */
-   spin_lock_irqsave(&instance->hba_lock, flags);
-   if (atomic_read(&instance->adprecovery) == MEGASAS_HW_CRITICAL_ERROR) {
-   spin_unlock_irqrestore(&instance->hba_lock, flags);
+   if (atomic_read(&instance->adprecovery) == MEGASAS_HW_CRITICAL_ERROR)
return;
-   }
-   spin_unlock_irqrestore(&instance->hba_lock, flags);
 
for (MSIxIndex = 0 ; MSIxIndex < count; MSIxIndex++)
complete_cmd_fusion(instance, MSIxIndex);
-- 
2.16.1



[PATCH V2 10/19] megaraid_sas: Fail init if heartbeat timer fails

2018-10-16 Thread Shivasharan S
When driver fails to start the heartbeat timer, exit from FW init.

Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas_base.c | 6 --
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index 8a251d03be34..27dbccbbfd8d 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -5694,10 +5694,12 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
 
/* Launch SR-IOV heartbeat timer */
if (instance->requestorId) {
-   if (!megasas_sriov_start_heartbeat(instance, 1))
+   if (!megasas_sriov_start_heartbeat(instance, 1)) {
megasas_start_timer(instance);
-   else
+   } else {
instance->skip_heartbeat_timer_del = 1;
+   goto fail_get_ld_pd_list;
+   }
}
 
/*
-- 
2.16.1



[PATCH V2 13/19] megaraid_sas: Rename scratch_pad registers

2018-10-16 Thread Shivasharan S
No functional change.
Rename the scratch pad registers to match firmware headers.

Signed-off-by: Sumit Saxena 
Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas.h|  9 +++
 drivers/scsi/megaraid/megaraid_sas_base.c   | 40 +--
 drivers/scsi/megaraid/megaraid_sas_fusion.c | 42 ++---
 3 files changed, 45 insertions(+), 46 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas.h 
b/drivers/scsi/megaraid/megaraid_sas.h
index ccf1aa629f69..2c044106c35f 100644
--- a/drivers/scsi/megaraid/megaraid_sas.h
+++ b/drivers/scsi/megaraid/megaraid_sas.h
@@ -1606,11 +1606,10 @@ struct megasas_register_set {
 
u32 reserved_3[3];  /*00A4h*/
 
-   u32 outbound_scratch_pad ;  /*00B0h*/
-   u32 outbound_scratch_pad_2; /*00B4h*/
-   u32 outbound_scratch_pad_3; /*00B8h*/
-   u32 outbound_scratch_pad_4; /*00BCh*/
-
+   u32 outbound_scratch_pad_0; /*00B0h*/
+   u32 outbound_scratch_pad_1; /*00B4h*/
+   u32 outbound_scratch_pad_2; /*00B8h*/
+   u32 outbound_scratch_pad_3; /*00BCh*/
 
u32 inbound_low_queue_port ;/*00C0h*/
 
diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index 27dbccbbfd8d..9a6c2597055f 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -595,7 +595,7 @@ megasas_disable_intr_ppc(struct megasas_instance *instance)
 static u32
 megasas_read_fw_status_reg_ppc(struct megasas_register_set __iomem * regs)
 {
-   return readl(&(regs)->outbound_scratch_pad);
+   return readl(&(regs)->outbound_scratch_pad_0);
 }
 
 /**
@@ -720,7 +720,7 @@ megasas_disable_intr_skinny(struct megasas_instance 
*instance)
 static u32
 megasas_read_fw_status_reg_skinny(struct megasas_register_set __iomem *regs)
 {
-   return readl(&(regs)->outbound_scratch_pad);
+   return readl(&(regs)->outbound_scratch_pad_0);
 }
 
 /**
@@ -865,7 +865,7 @@ megasas_disable_intr_gen2(struct megasas_instance *instance)
 static u32
 megasas_read_fw_status_reg_gen2(struct megasas_register_set __iomem *regs)
 {
-   return readl(&(regs)->outbound_scratch_pad);
+   return readl(&(regs)->outbound_scratch_pad_0);
 }
 
 /**
@@ -5299,7 +5299,7 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
 {
u32 max_sectors_1;
u32 max_sectors_2, tmp_sectors, msix_enable;
-   u32 scratch_pad_2, scratch_pad_3, scratch_pad_4, status_reg;
+   u32 scratch_pad_1, scratch_pad_2, scratch_pad_3, status_reg;
resource_size_t base_addr;
struct megasas_register_set __iomem *reg_set;
struct megasas_ctrl_info *ctrl_info = NULL;
@@ -5395,9 +5395,9 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
fusion = instance->ctrl_context;
 
if (instance->adapter_type == VENTURA_SERIES) {
-   scratch_pad_3 =
-   readl(&instance->reg_set->outbound_scratch_pad_3);
-   instance->max_raid_mapsize = ((scratch_pad_3 >>
+   scratch_pad_2 =
+   readl(&instance->reg_set->outbound_scratch_pad_2);
+   instance->max_raid_mapsize = ((scratch_pad_2 >>
MR_MAX_RAID_MAP_SIZE_OFFSET_SHIFT) &
MR_MAX_RAID_MAP_SIZE_MASK);
}
@@ -5408,17 +5408,17 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
if (msix_enable && !msix_disable) {
int irq_flags = PCI_IRQ_MSIX;
 
-   scratch_pad_2 = readl
-   (&instance->reg_set->outbound_scratch_pad_2);
+   scratch_pad_1 = readl
+   (&instance->reg_set->outbound_scratch_pad_1);
/* Check max MSI-X vectors */
if (fusion) {
if (instance->adapter_type == THUNDERBOLT_SERIES) {
/* Thunderbolt Series*/
-   instance->msix_vectors = (scratch_pad_2
+   instance->msix_vectors = (scratch_pad_1
& MR_MAX_REPLY_QUEUES_OFFSET) + 1;
fw_msix_count = instance->msix_vectors;
} else {
-   instance->msix_vectors = ((scratch_pad_2
+   instance->msix_vectors = ((scratch_pad_1
& MR_MAX_REPLY_QUEUES_EXT_OFFSET)
>> 
MR_MAX_REPLY_QUEUES_EXT_OFFSET_SHIFT) + 1;
 
@@ -5442,7 +5442,7 @@ static int megasas_init_fw(struct megasas_instance 
*instance)

[PATCH V2 09/19] megaraid_sas: For SRIOV, do not set STOP_ADP bit

2018-10-16 Thread Shivasharan S
Fix -
For SRIOV based adapters, driver should not set the STOP_ADP bit as part
of kill adapter.

Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas_base.c | 8 +---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index 57899ff7ca0b..8a251d03be34 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -2076,9 +2076,11 @@ void megaraid_sas_kill_hba(struct megasas_instance 
*instance)
if ((instance->pdev->device == PCI_DEVICE_ID_LSI_SAS0073SKINNY) ||
(instance->pdev->device == PCI_DEVICE_ID_LSI_SAS0071SKINNY) ||
(instance->adapter_type != MFI_SERIES)) {
-   writel(MFI_STOP_ADP, &instance->reg_set->doorbell);
-   /* Flush */
-   readl(&instance->reg_set->doorbell);
+   if (!instance->requestorId) {
+   writel(MFI_STOP_ADP, &instance->reg_set->doorbell);
+   /* Flush */
+   readl(&instance->reg_set->doorbell);
+   }
if (instance->requestorId && instance->peerIsPresent)
memset(instance->ld_ids, 0xff, MEGASAS_MAX_LD_IDS);
} else {
-- 
2.16.1



[PATCH V2 08/19] megaraid_sas: Fix combined reply queue mode detection

2018-10-16 Thread Shivasharan S
Fix -
For Invader series, if FW supports more than 8 MSI-x vectors, driver needs
to enable combined reply queue mode. For Ventura series, driver enables
combined reply queue mode in case of more than 16 MSI-x vectors.

Signed-off-by: Sumit Saxena 
Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas_base.c | 23 ---
 1 file changed, 20 insertions(+), 3 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index ab72acae08e5..57899ff7ca0b 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -5415,12 +5415,29 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
instance->msix_vectors = (scratch_pad_2
& MR_MAX_REPLY_QUEUES_OFFSET) + 1;
fw_msix_count = instance->msix_vectors;
-   } else { /* Invader series supports more than 8 MSI-x 
vectors*/
+   } else {
instance->msix_vectors = ((scratch_pad_2
& MR_MAX_REPLY_QUEUES_EXT_OFFSET)
>> 
MR_MAX_REPLY_QUEUES_EXT_OFFSET_SHIFT) + 1;
-   if (instance->msix_vectors > 16)
-   instance->msix_combined = true;
+
+   /*
+* For Invader series, > 8 MSI-x vectors
+* supported by FW/HW implies combined
+* reply queue mode is enabled.
+* For Ventura series, > 16 MSI-x vectors
+* supported by FW/HW implies combined
+* reply queue mode is enabled.
+*/
+   switch (instance->adapter_type) {
+   case INVADER_SERIES:
+   if (instance->msix_vectors > 8)
+   instance->msix_combined = true;
+   break;
+   case VENTURA_SERIES:
+   if (instance->msix_vectors > 16)
+   instance->msix_combined = true;
+   break;
+   }
 
if (rdpq_enable)
instance->is_rdpq = (scratch_pad_2 & 
MR_RDPQ_MODE_OFFSET) ?
-- 
2.16.1



[PATCH V2 07/19] megaraid_sas: Fix module parameter description

2018-10-16 Thread Shivasharan S
Module parameter description for rdpq_enable incorrectly lists the default
as enabled.
Also, provide range of valid values for resetwaittime in the description.

Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas_base.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index 63ea601e5638..ab72acae08e5 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -85,8 +85,7 @@ MODULE_PARM_DESC(throttlequeuedepth,
 
 unsigned int resetwaittime = MEGASAS_RESET_WAIT_TIME;
 module_param(resetwaittime, int, S_IRUGO);
-MODULE_PARM_DESC(resetwaittime, "Wait time in seconds after I/O timeout "
-"before resetting adapter. Default: 180");
+MODULE_PARM_DESC(resetwaittime, "Wait time in (1-180s) after I/O timeout 
before resetting adapter. Default: 180s");
 
 int smp_affinity_enable = 1;
 module_param(smp_affinity_enable, int, S_IRUGO);
@@ -94,7 +93,7 @@ MODULE_PARM_DESC(smp_affinity_enable, "SMP affinity feature 
enable/disable Defau
 
 int rdpq_enable = 1;
 module_param(rdpq_enable, int, S_IRUGO);
-MODULE_PARM_DESC(rdpq_enable, " Allocate reply queue in chunks for large queue 
depth enable/disable Default: disable(0)");
+MODULE_PARM_DESC(rdpq_enable, "Allocate reply queue in chunks for large queue 
depth enable/disable Default: enable(1)");
 
 unsigned int dual_qdepth_disable;
 module_param(dual_qdepth_disable, int, S_IRUGO);
-- 
2.16.1



[PATCH V2 03/19] megaraid_sas: Fix msleep granularity

2018-10-16 Thread Shivasharan S
Issue -
In megasas_transition_to_ready() driver waits 180seconds for controller
to change FW state. Here we are calling msleep(1) in a loop for this.
As explained in timers-howto.txt, msleep(1) will actually sleep longer
than 1ms. If a faulty controller is connected, we will end up waiting for
much more than 180 seconds causing unnecessary delays during load.

Fix -
Change the granularity of msleep() call from 1ms to 1000ms.

Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas_base.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index 3ddf71b8c38d..23cdeca26c53 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -3891,12 +3891,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 * 1000); i++) {
+   for (i = 0; i < max_wait; i++) {
curr_abs_state = instance->instancet->
read_fw_status_reg(instance->reg_set);
 
if (abs_state == curr_abs_state) {
-   msleep(1);
+   msleep(1000);
} else
break;
}
-- 
2.16.1



[PATCH V2 01/19] megaraid_sas: Add watchdog thread to detect Firmware fault

2018-10-16 Thread Shivasharan S
Issue -
Currently driver checks for Firmware state change from ISR context, and
only when there are interrupts tied with no I/O completions.
We have seen multiple cases where doorbell interrupts sent by firmware,
to indicate FW state change are not processed by driver and it takes long
time for driver to trigger OCR. And if there are no IOs running, since
we only check the FW state as part of ISR code, fault goes undetected by
driver and OCR will not be triggered.

Fix -
This patch introduces a separate workqueue that runs every one second
to detect Firmware FAULT state and trigger reset immediately.
As an additional gain, removing PCI reads from ISR to check FW state
results in improved performance as well.

Signed-off-by: Sumit Saxena 
Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas.h|  12 +-
 drivers/scsi/megaraid/megaraid_sas_base.c   |  34 +-
 drivers/scsi/megaraid/megaraid_sas_fusion.c | 175 
 3 files changed, 167 insertions(+), 54 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas.h 
b/drivers/scsi/megaraid/megaraid_sas.h
index 67d356d84717..8c0f74a2740a 100644
--- a/drivers/scsi/megaraid/megaraid_sas.h
+++ b/drivers/scsi/megaraid/megaraid_sas.h
@@ -1544,6 +1544,10 @@ enum FW_BOOT_CONTEXT {
 
 #define MR_CAN_HANDLE_64_BIT_DMA_OFFSET(1 << 25)
 
+#define MEGASAS_WATCHDOG_THREAD_INTERVAL   1000
+#define MEGASAS_WAIT_FOR_NEXT_DMA_MSECS20
+#define MEGASAS_WATCHDOG_WAIT_COUNT50
+
 enum MR_ADAPTER_TYPE {
MFI_SERIES = 1,
THUNDERBOLT_SERIES = 2,
@@ -2250,7 +2254,9 @@ struct megasas_instance {
struct megasas_instance_template *instancet;
struct tasklet_struct isr_tasklet;
struct work_struct work_init;
-   struct work_struct crash_init;
+   struct delayed_work fw_fault_work;
+   struct workqueue_struct *fw_fault_work_q;
+   char fault_handler_work_q_name[48];
 
u8 flag;
u8 unload;
@@ -2539,7 +2545,6 @@ int megasas_get_target_prop(struct megasas_instance 
*instance,
 int megasas_set_crash_dump_params(struct megasas_instance *instance,
u8 crash_buf_state);
 void megasas_free_host_crash_buffer(struct megasas_instance *instance);
-void megasas_fusion_crash_dump_wq(struct work_struct *work);
 
 void megasas_return_cmd_fusion(struct megasas_instance *instance,
struct megasas_cmd_fusion *cmd);
@@ -2560,6 +2565,9 @@ int megasas_reset_target_fusion(struct scsi_cmnd *scmd);
 u32 mega_mod64(u64 dividend, u32 divisor);
 int megasas_alloc_fusion_context(struct megasas_instance *instance);
 void megasas_free_fusion_context(struct megasas_instance *instance);
+int megasas_fusion_start_watchdog(struct megasas_instance *instance);
+void megasas_fusion_stop_watchdog(struct megasas_instance *instance);
+
 void megasas_set_dma_settings(struct megasas_instance *instance,
  struct megasas_dcmd_frame *dcmd,
  dma_addr_t dma_addr, u32 dma_len);
diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index 9b90c716f06d..4dc29e055461 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -5582,8 +5582,20 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
instance->skip_heartbeat_timer_del = 1;
}
 
+   /*
+* Create and start watchdog thread which will monitor
+* controller state every 1 sec and trigger OCR when
+* it enters fault state
+*/
+   if (instance->adapter_type != MFI_SERIES)
+   if (megasas_fusion_start_watchdog(instance) != SUCCESS)
+   goto fail_start_watchdog;
+
return 0;
 
+fail_start_watchdog:
+   if (instance->requestorId && !instance->skip_heartbeat_timer_del)
+   del_timer_sync(&instance->sriov_heartbeat_timer);
 fail_get_ld_pd_list:
instance->instancet->disable_intr(instance);
 fail_init_adapter:
@@ -6434,12 +6446,10 @@ static inline void megasas_init_ctrl_params(struct 
megasas_instance *instance)
instance->disableOnlineCtrlReset = 1;
instance->UnevenSpanSupport = 0;
 
-   if (instance->adapter_type != MFI_SERIES) {
+   if (instance->adapter_type != MFI_SERIES)
INIT_WORK(&instance->work_init, megasas_fusion_ocr_wq);
-   INIT_WORK(&instance->crash_init, megasas_fusion_crash_dump_wq);
-   } else {
+   else
INIT_WORK(&instance->work_init, process_fw_state_change_wq);
-   }
 }
 
 /**
@@ -6708,6 +6718,10 @@ megasas_suspend(struct pci_dev *pdev, pm_message_t state)
if (instance->requestorId && !instance->skip_heartbeat_timer_del)
del_timer_sync(&instance->sriov_heartbeat_timer);
 
+ 

[PATCH V2 06/19] megaraid_sas: Fix goto labels in error handling

2018-10-16 Thread Shivasharan S
Fix -
During init, if pci_alloc_irq_vectors() fails, the driver has not yet
setup the IRQs. Fix the goto labels and error handling for this case.

Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas_base.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index 4f4e59db8c56..63ea601e5638 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -5473,7 +5473,7 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
if (!instance->msix_vectors) {
i = pci_alloc_irq_vectors(instance->pdev, 1, 1, PCI_IRQ_LEGACY);
if (i < 0)
-   goto fail_setup_irqs;
+   goto fail_init_adapter;
}
 
megasas_setup_reply_map(instance);
@@ -5698,9 +5698,8 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
del_timer_sync(&instance->sriov_heartbeat_timer);
 fail_get_ld_pd_list:
instance->instancet->disable_intr(instance);
-fail_init_adapter:
megasas_destroy_irqs(instance);
-fail_setup_irqs:
+fail_init_adapter:
if (instance->msix_vectors)
pci_free_irq_vectors(instance->pdev);
instance->msix_vectors = 0;
-- 
2.16.1



[PATCH V2 05/19] megaraid_sas: Update copyright information

2018-10-16 Thread Shivasharan S
Change copyright to Broadcom Inc. Also update any references to Avago with
Broadcom. Update copyright duration wherever required.

Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas.h| 14 ++
 drivers/scsi/megaraid/megaraid_sas_base.c   | 18 --
 drivers/scsi/megaraid/megaraid_sas_fp.c | 14 ++
 drivers/scsi/megaraid/megaraid_sas_fusion.c | 14 ++
 drivers/scsi/megaraid/megaraid_sas_fusion.h | 14 ++
 5 files changed, 32 insertions(+), 42 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas.h 
b/drivers/scsi/megaraid/megaraid_sas.h
index a2df9827e932..ccf1aa629f69 100644
--- a/drivers/scsi/megaraid/megaraid_sas.h
+++ b/drivers/scsi/megaraid/megaraid_sas.h
@@ -2,7 +2,8 @@
  *  Linux MegaRAID driver for SAS based RAID controllers
  *
  *  Copyright (c) 2003-2013  LSI Corporation
- *  Copyright (c) 2013-2014  Avago Technologies
+ *  Copyright (c) 2013-2016  Avago Technologies
+ *  Copyright (c) 2016-2018  Broadcom Inc.
  *
  *  This program is free software; you can redistribute it and/or
  *  modify it under the terms of the GNU General Public License
@@ -19,14 +20,11 @@
  *
  *  FILE: megaraid_sas.h
  *
- *  Authors: Avago Technologies
- *   Kashyap Desai 
- *   Sumit Saxena 
+ *  Authors: Broadcom Inc.
+ *   Kashyap Desai 
+ *   Sumit Saxena 
  *
- *  Send feedback to: megaraidlinux@avagotech.com
- *
- *  Mail to: Avago Technologies, 350 West Trimble Road, Building 90,
- *  San Jose, California 95131
+ *  Send feedback to: megaraidlinux@broadcom.com
  */
 
 #ifndef LSI_MEGARAID_SAS_H
diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index 3b9850f550ea..4f4e59db8c56 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -2,7 +2,8 @@
  *  Linux MegaRAID driver for SAS based RAID controllers
  *
  *  Copyright (c) 2003-2013  LSI Corporation
- *  Copyright (c) 2013-2014  Avago Technologies
+ *  Copyright (c) 2013-2016  Avago Technologies
+ *  Copyright (c) 2016-2018  Broadcom Inc.
  *
  *  This program is free software; you can redistribute it and/or
  *  modify it under the terms of the GNU General Public License
@@ -17,18 +18,15 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
  *
- *  Authors: Avago Technologies
+ *  Authors: Broadcom Inc.
  *   Sreenivas Bagalkote
  *   Sumant Patro
  *   Bo Yang
  *   Adam Radford
- *   Kashyap Desai 
- *   Sumit Saxena 
+ *   Kashyap Desai 
+ *   Sumit Saxena 
  *
- *  Send feedback to: megaraidlinux@avagotech.com
- *
- *  Mail to: Avago Technologies, 350 West Trimble Road, Building 90,
- *  San Jose, California 95131
+ *  Send feedback to: megaraidlinux@broadcom.com
  */
 
 #include 
@@ -108,8 +106,8 @@ MODULE_PARM_DESC(scmd_timeout, "scsi command timeout 
(10-90s), default 90s. See
 
 MODULE_LICENSE("GPL");
 MODULE_VERSION(MEGASAS_VERSION);
-MODULE_AUTHOR("megaraidlinux@avagotech.com");
-MODULE_DESCRIPTION("Avago MegaRAID SAS Driver");
+MODULE_AUTHOR("megaraidlinux@broadcom.com");
+MODULE_DESCRIPTION("Broadcom MegaRAID SAS Driver");
 
 int megasas_transition_to_ready(struct megasas_instance *instance, int ocr);
 static int megasas_get_pd_list(struct megasas_instance *instance);
diff --git a/drivers/scsi/megaraid/megaraid_sas_fp.c 
b/drivers/scsi/megaraid/megaraid_sas_fp.c
index 59ecbb3b53b5..25fa999e0280 100644
--- a/drivers/scsi/megaraid/megaraid_sas_fp.c
+++ b/drivers/scsi/megaraid/megaraid_sas_fp.c
@@ -2,7 +2,8 @@
  *  Linux MegaRAID driver for SAS based RAID controllers
  *
  *  Copyright (c) 2009-2013  LSI Corporation
- *  Copyright (c) 2013-2014  Avago Technologies
+ *  Copyright (c) 2013-2016  Avago Technologies
+ *  Copyright (c) 2016-2018  Broadcom Inc.
  *
  *  This program is free software; you can redistribute it and/or
  *  modify it under the terms of the GNU General Public License
@@ -19,17 +20,14 @@
  *
  *  FILE: megaraid_sas_fp.c
  *
- *  Authors: Avago Technologies
+ *  Authors: Broadcom Inc.
  *   Sumant Patro
  *   Varad Talamacki
  *   Manoj Jose
- *   Kashyap Desai 
- *   Sumit Saxena 
+ *   Kashyap Desai 
+ *   Sumit Saxena 
  *
- *  Send feedback to: megaraidlinux@avagotech.com
- *
- *  Mail to: Avago Technologies, 350 West Trimble Road, Building 90,
- *  San Jose, California 95131
+ *  Send feedback to: megaraidlinux@broadcom.com
  */
 
 #include 
diff --git a/drivers/scsi/megaraid/megaraid_sas_fusion.c 
b/drivers/scsi/megaraid/megaraid_sas_fusion.c
index 2868b71add2d..11cb3faa6779 100644
--- a/drivers/scsi/megaraid/megaraid_sas_fusion.c
+++ b/drivers/scsi/megaraid/megaraid_sas_fusion.c
@@ -2,7 +2,8

[PATCH V2 02/19] megaraid_sas: Add support for FW snap dump

2018-10-16 Thread Shivasharan S
Latest firmware adds a mechanism to save firmware logs just before
controller reset on pre-allocated internal controller DRAM. This feature
is called snapdump which will help debugging firmware issues.
This feature requires extra time and firmware reports these values through
new driver interface. Before initiating an OCR, driver needs to inform FW
to save a snapdump and then wait for a specified time for the snapdump
to complete.

Signed-off-by: Sumit Saxena 
Signed-off-by: Shivasharan S 
---
Changes in V2:
Replace PCI DMA APIs with generic DMA APIs

 drivers/scsi/megaraid/megaraid_sas.h|  25 +-
 drivers/scsi/megaraid/megaraid_sas_base.c   | 118 +++-
 drivers/scsi/megaraid/megaraid_sas_fusion.c |  66 ++--
 drivers/scsi/megaraid/megaraid_sas_fusion.h |  12 +++
 4 files changed, 208 insertions(+), 13 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas.h 
b/drivers/scsi/megaraid/megaraid_sas.h
index 8c0f74a2740a..a2df9827e932 100644
--- a/drivers/scsi/megaraid/megaraid_sas.h
+++ b/drivers/scsi/megaraid/megaraid_sas.h
@@ -142,6 +142,7 @@
  * CLR_HANDSHAKE: FW is waiting for HANDSHAKE from BIOS or Driver
  * HOTPLUG : Resume from Hotplug
  * MFI_STOP_ADP: Send signal to FW to stop processing
+ * MFI_ADP_TRIGGER_SNAP_DUMP: Inform firmware to initiate snap dump
  */
 #define WRITE_SEQUENCE_OFFSET  (0x000FC) /* I20 */
 #define HOST_DIAGNOSTIC_OFFSET (0x00F8)  /* I20 */
@@ -158,6 +159,7 @@
 #define MFI_RESET_FLAGSMFI_INIT_READY| \
MFI_INIT_MFIMODE| \
MFI_INIT_ABORT
+#define MFI_ADP_TRIGGER_SNAP_DUMP  0x0100
 #define MPI2_IOCINIT_MSGFLAG_RDPQ_ARRAY_MODE(0x01)
 
 /*
@@ -860,8 +862,22 @@ struct megasas_ctrl_prop {
u32 reserved:18;
 #endif
} OnOffProperties;
-   u8 autoSnapVDSpace;
-   u8 viewSpace;
+
+   union {
+   u8 autoSnapVDSpace;
+   u8 viewSpace;
+   struct {
+#if   defined(__BIG_ENDIAN_BITFIELD)
+   u16 reserved2:11;
+   u16 enable_snap_dump:1;
+   u16 reserved1:4;
+#else
+   u16 reserved1:4;
+   u16 enable_snap_dump:1;
+   u16 reserved2:11;
+#endif
+   } on_off_properties2;
+   };
__le16 spinDownTime;
u8  reserved[24];
 } __packed;
@@ -2185,6 +2201,9 @@ struct megasas_instance {
struct MR_LD_TARGETID_LIST *ld_targetid_list_buf;
dma_addr_t ld_targetid_list_buf_h;
 
+   struct MR_SNAPDUMP_PROPERTIES *snapdump_prop;
+   dma_addr_t snapdump_prop_h;
+
void *crash_buf[MAX_CRASH_DUMP_SIZE];
unsigned intfw_crash_buffer_size;
unsigned intfw_crash_state;
@@ -2316,6 +2335,7 @@ struct megasas_instance {
bool support_nvme_passthru;
u8 task_abort_tmo;
u8 max_reset_tmo;
+   u8 snapdump_wait_time;
 };
 struct MR_LD_VF_MAP {
u32 size;
@@ -2541,6 +2561,7 @@ void megasas_set_dynamic_target_properties(struct 
scsi_device *sdev,
   bool is_target_prop);
 int megasas_get_target_prop(struct megasas_instance *instance,
struct scsi_device *sdev);
+void megasas_get_snapdump_properties(struct megasas_instance *instance);
 
 int megasas_set_crash_dump_params(struct megasas_instance *instance,
u8 crash_buf_state);
diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index 4dc29e055461..3ddf71b8c38d 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -4661,6 +4661,87 @@ static void megasas_update_ext_vd_details(struct 
megasas_instance *instance)
fusion->drv_map_sz = sizeof(struct MR_DRV_RAID_MAP_ALL);
 }
 
+/*
+ * dcmd.opcode- MR_DCMD_CTRL_SNAPDUMP_GET_PROPERTIES
+ * dcmd.hdr.length- number of bytes to read
+ * dcmd.sge   - Ptr to MR_SNAPDUMP_PROPERTIES
+ * Desc:Fill in snapdump properties
+ * Status:  MFI_STAT_OK- Command successful
+ */
+void megasas_get_snapdump_properties(struct megasas_instance *instance)
+{
+   int ret = 0;
+   struct megasas_cmd *cmd;
+   struct megasas_dcmd_frame *dcmd;
+   struct MR_SNAPDUMP_PROPERTIES *ci;
+   dma_addr_t ci_h = 0;
+
+   ci = instance->snapdump_prop;
+   ci_h = instance->snapdump_prop_h;
+
+   if (!ci)
+   return;
+
+   cmd = megasas_get_cmd(instance);
+
+   if (!cmd) {
+   dev_dbg(&instance->pdev->dev, "Failed to get a free cmd\n");
+   return;
+   }
+
+   dcmd = &cmd->frame->dcmd;
+
+   memset(ci, 0, sizeof(*ci));
+   memset(dcmd->mbox

[PATCH V2 04/19] megaraid_sas: Add check for reset adapter bit

2018-10-16 Thread Shivasharan S
For SAS3 and later controllers, FW sets the reset adapter bit indicating
the driver to perform a controller reset.
Driver needs to check if this bit is set before doing a reset.
This reduces the driver probe failure time to 180seconds in case there
is a faulty controller connected.

Signed-off-by: Sumit Saxena 
Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas_base.c | 33 ---
 1 file changed, 22 insertions(+), 11 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index 23cdeca26c53..3b9850f550ea 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -5300,7 +5300,7 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
 {
u32 max_sectors_1;
u32 max_sectors_2, tmp_sectors, msix_enable;
-   u32 scratch_pad_2, scratch_pad_3, scratch_pad_4;
+   u32 scratch_pad_2, scratch_pad_3, scratch_pad_4, status_reg;
resource_size_t base_addr;
struct megasas_register_set __iomem *reg_set;
struct megasas_ctrl_info *ctrl_info = NULL;
@@ -5308,6 +5308,7 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
int i, j, loop, fw_msix_count = 0;
struct IOV_111 *iovPtr;
struct fusion_context *fusion;
+   bool do_adp_reset = true;
 
fusion = instance->ctrl_context;
 
@@ -5356,19 +5357,29 @@ static int megasas_init_fw(struct megasas_instance 
*instance)
}
 
if (megasas_transition_to_ready(instance, 0)) {
-   atomic_set(&instance->fw_reset_no_pci_access, 1);
-   instance->instancet->adp_reset
-   (instance, instance->reg_set);
-   atomic_set(&instance->fw_reset_no_pci_access, 0);
-   dev_info(&instance->pdev->dev,
-   "FW restarted successfully from %s!\n",
-   __func__);
+   if (instance->adapter_type >= INVADER_SERIES) {
+   status_reg = instance->instancet->read_fw_status_reg(
+   instance->reg_set);
+   do_adp_reset = status_reg & MFI_RESET_ADAPTER;
+   }
 
-   /*waitting for about 30 second before retry*/
-   ssleep(30);
+   if (do_adp_reset) {
+   atomic_set(&instance->fw_reset_no_pci_access, 1);
+   instance->instancet->adp_reset
+   (instance, instance->reg_set);
+   atomic_set(&instance->fw_reset_no_pci_access, 0);
+   dev_info(&instance->pdev->dev,
+"FW restarted successfully from %s!\n",
+__func__);
+
+   /*waitting for about 30 second before retry*/
+   ssleep(30);
 
-   if (megasas_transition_to_ready(instance, 0))
+   if (megasas_transition_to_ready(instance, 0))
+   goto fail_ready_state;
+   } else {
goto fail_ready_state;
+   }
}
 
megasas_init_ctrl_params(instance);
-- 
2.16.1



[PATCH V2 00/19] megaraid_sas: Driver updates

2018-10-16 Thread Shivasharan S
Changes in V2:
- Rebased the entire series on top of below patches -
  "scsi: megaraid_sas: fix a missing-check bug"
  "megaraid_sas: switch to generic DMA API"
- Patch 2/19: Replace PCI DMA APIs with generic DMA APIs.

Shivasharan S (19):
  megaraid_sas: Add watchdog thread to detect Firmware fault
  megaraid_sas: Add support for FW snap dump
  megaraid_sas: Fix msleep granularity
  megaraid_sas: Add check for reset adapter bit
  megaraid_sas: Update copyright information
  megaraid_sas: Fix goto labels in error handling
  megaraid_sas: Fix module parameter description
  megaraid_sas: Fix combined reply queue mode detection
  megaraid_sas: For SRIOV, do not set STOP_ADP bit
  megaraid_sas: Fail init if heartbeat timer fails
  megaraid_sas: optimize raid context access in IO path
  megaraid_sas: Remove spin lock for dpc operation
  megaraid_sas: Rename scratch_pad registers
  megaraid_sas: Re-use max_mfi_cmds to calculate queue sizes
  megaraid_sas: Remove double endian conversion
  megaraid_sas: increase timeout for IOC INIT to 180seconds
  megaraid_sas: remove unused macro
  megaraid_sas: modify max supported lds related print
  megaraid_sas: Update driver version

 drivers/scsi/megaraid/megaraid_sas.h|  65 +++--
 drivers/scsi/megaraid/megaraid_sas_base.c   | 298 -
 drivers/scsi/megaraid/megaraid_sas_fp.c |  14 +-
 drivers/scsi/megaraid/megaraid_sas_fusion.c | 384 ++--
 drivers/scsi/megaraid/megaraid_sas_fusion.h |  26 +-
 5 files changed, 546 insertions(+), 241 deletions(-)

-- 
2.16.1



[PATCH 19/19] megaraid_sas: Update driver version

2018-10-12 Thread Shivasharan S
Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas.h | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas.h 
b/drivers/scsi/megaraid/megaraid_sas.h
index 994c6ac6f920..8edba2227cd3 100644
--- a/drivers/scsi/megaraid/megaraid_sas.h
+++ b/drivers/scsi/megaraid/megaraid_sas.h
@@ -33,8 +33,8 @@
 /*
  * MegaRAID SAS Driver meta data
  */
-#define MEGASAS_VERSION"07.706.03.00-rc1"
-#define MEGASAS_RELDATE"May 21, 2018"
+#define MEGASAS_VERSION"07.707.03.00-rc1"
+#define MEGASAS_RELDATE"August 30, 2018"
 
 /*
  * Device IDs
-- 
2.16.1



[PATCH 17/19] megaraid_sas: remove unused macro

2018-10-12 Thread Shivasharan S
Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas.h | 1 -
 1 file changed, 1 deletion(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas.h 
b/drivers/scsi/megaraid/megaraid_sas.h
index 2c044106c35f..994c6ac6f920 100644
--- a/drivers/scsi/megaraid/megaraid_sas.h
+++ b/drivers/scsi/megaraid/megaraid_sas.h
@@ -1499,7 +1499,6 @@ enum FW_BOOT_CONTEXT {
 #define MEGASAS_IOCTL_CMD  0
 #define MEGASAS_DEFAULT_CMD_TIMEOUT90
 #define MEGASAS_THROTTLE_QUEUE_DEPTH   16
-#define MEGASAS_BLOCKED_CMD_TIMEOUT60
 #define MEGASAS_DEFAULT_TM_TIMEOUT 50
 /*
  * FW reports the maximum of number of commands that it can accept (maximum
-- 
2.16.1



[PATCH 18/19] megaraid_sas: modify max supported lds related print

2018-10-12 Thread Shivasharan S
The print related to number of VDs that a particular firmware supports is
misleading in some cases.
Even though supportMaxExtLDs is set, certain firmware profiles only
supports upto 64VDs.

Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas_base.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index 847f501ae4e3..544edfa2b50c 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -4633,9 +4633,9 @@ static void megasas_update_ext_vd_details(struct 
megasas_instance *instance)
}
 
dev_info(&instance->pdev->dev,
-   "firmware type\t: %s\n",
-   instance->supportmax256vd ? "Extended VD(240 VD)firmware" :
-   "Legacy(64 VD) firmware");
+   "FW provided supportMaxExtLDs: %d\tmax_lds: %d\n",
+   instance->ctrl_info_buf->adapterOperations3.supportMaxExtLDs ? 
1 : 0,
+   instance->ctrl_info_buf->max_lds);
 
if (instance->max_raid_mapsize) {
ventura_map_sz = instance->max_raid_mapsize *
-- 
2.16.1



[PATCH 15/19] megaraid_sas: Remove double endian conversion

2018-10-12 Thread Shivasharan S
Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas_fusion.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas_fusion.c 
b/drivers/scsi/megaraid/megaraid_sas_fusion.c
index 0a8b7167d05d..76ea5dc656b1 100644
--- a/drivers/scsi/megaraid/megaraid_sas_fusion.c
+++ b/drivers/scsi/megaraid/megaraid_sas_fusion.c
@@ -1043,9 +1043,7 @@ megasas_ioc_init_fusion(struct megasas_instance *instance)
 
frame_hdr = &cmd->frame->hdr;
frame_hdr->cmd_status = 0xFF;
-   frame_hdr->flags = cpu_to_le16(
-   le16_to_cpu(frame_hdr->flags) |
-   MFI_FRAME_DONT_POST_IN_REPLY_QUEUE);
+   frame_hdr->flags |= cpu_to_le16(MFI_FRAME_DONT_POST_IN_REPLY_QUEUE);
 
init_frame->cmd = MFI_CMD_INIT;
init_frame->cmd_status = 0xFF;
-- 
2.16.1



[PATCH 16/19] megaraid_sas: increase timeout for IOC INIT to 180seconds

2018-10-12 Thread Shivasharan S
IOC INIT frame needs to be fired with a timeout of 180seconds.

Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas_fusion.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas_fusion.c 
b/drivers/scsi/megaraid/megaraid_sas_fusion.c
index 76ea5dc656b1..36fcfa5bc13d 100644
--- a/drivers/scsi/megaraid/megaraid_sas_fusion.c
+++ b/drivers/scsi/megaraid/megaraid_sas_fusion.c
@@ -1113,7 +1113,7 @@ megasas_ioc_init_fusion(struct megasas_instance *instance)
 
megasas_fire_cmd_fusion(instance, &req_desc);
 
-   wait_and_poll(instance, cmd, MFI_POLL_TIMEOUT_SECS);
+   wait_and_poll(instance, cmd, MFI_IO_TIMEOUT_SECS);
 
frame_hdr = &cmd->frame->hdr;
if (frame_hdr->cmd_status != 0) {
-- 
2.16.1



[PATCH 14/19] megaraid_sas: Re-use max_mfi_cmds to calculate queue sizes

2018-10-12 Thread Shivasharan S
In megasas_init_adapter_fusion(), max_mfi_cmds is being calcuated as
(MEGASAS_FUSION_INTERNAL_CMDS + MEGASAS_FUSION_IOCTL_CMDS).
max_mfi_cmds can be used in megasas_configure_queue_sizes.

Signed-off-by: Shivasharan S 
---
 drivers/scsi/megaraid/megaraid_sas_fusion.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas_fusion.c 
b/drivers/scsi/megaraid/megaraid_sas_fusion.c
index 881bcfdcfa80..0a8b7167d05d 100644
--- a/drivers/scsi/megaraid/megaraid_sas_fusion.c
+++ b/drivers/scsi/megaraid/megaraid_sas_fusion.c
@@ -1564,9 +1564,7 @@ void megasas_configure_queue_sizes(struct 
megasas_instance *instance)
else
instance->max_mpt_cmds = instance->max_fw_cmds;
 
-   instance->max_scsi_cmds = instance->max_fw_cmds -
-   (MEGASAS_FUSION_INTERNAL_CMDS +
-   MEGASAS_FUSION_IOCTL_CMDS);
+   instance->max_scsi_cmds = instance->max_fw_cmds - 
instance->max_mfi_cmds;
instance->cur_can_queue = instance->max_scsi_cmds;
instance->host->can_queue = instance->cur_can_queue;
 
-- 
2.16.1



  1   2   3   4   >