[PATCH] scsi: qla4xxx: check for null return from iscsi_lookup_endpoint

2017-05-07 Thread Colin King
From: Colin Ian King 

iscsi_lookup_endpoint can potentially return null and in 9 out of
the 10 calls to this function a null return is checked, so I think
it is pertinent to perform a null check here too and return -EINVAL
as in the other null cases.

Detected by CoverityScan, CID#147282 ("Dereference null return value")

Signed-off-by: Colin Ian King 
---
 drivers/scsi/qla4xxx/ql4_os.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/scsi/qla4xxx/ql4_os.c b/drivers/scsi/qla4xxx/ql4_os.c
index 64c6fa563fdb..803e342e1093 100644
--- a/drivers/scsi/qla4xxx/ql4_os.c
+++ b/drivers/scsi/qla4xxx/ql4_os.c
@@ -3189,6 +3189,8 @@ static int qla4xxx_conn_bind(struct iscsi_cls_session 
*cls_session,
if (iscsi_conn_bind(cls_session, cls_conn, is_leading))
return -EINVAL;
ep = iscsi_lookup_endpoint(transport_fd);
+   if (!ep)
+   return -EINVAL;
conn = cls_conn->dd_data;
qla_conn = conn->dd_data;
qla_conn->qla_ep = ep->dd_data;
-- 
2.11.0



Re: [PATCH 25/27] block: remove the discard_zeroes_data flag

2017-05-07 Thread h...@lst.de
On Tue, May 02, 2017 at 08:33:15PM -0700, Nicholas A. Bellinger wrote:
> The larger target/iblock conversion patch looks like post v4.12 material
> at this point, so to avoid breakage wrt to existing LBPRZ behavior, I'll
> plan to push the following patch post -rc1.

I don't think this is safe.  If you want to do the aboe you also
need to ensure ->execute_unmap always zeroes the data.  For actual
files in the file backend we should be all fine, but for the block
device case [1] and iblock we'd need to use blkdev_issue_zeroout
instead of blkdev_issue_discard when unmap_zeroes_data is set.

[1] which btw already seems broken as it doesn't invalidate cached
data when issuing a discard.


[Bug 176951] boot fails unless acpi=off Acer Travelmate X-349

2017-05-07 Thread bugzilla-daemon
https://bugzilla.kernel.org/show_bug.cgi?id=176951

--- Comment #25 from Alberto Tiboni (a.tib...@gmail.com) ---
(In reply to Alberto Tiboni from comment #24)
> I can confirm issue is still here: update bios at 1.08, nothing changed!
> 
> Tried Ubuntu and Lubuntu distro, 16.04, 16.10 and 17.04, both 64 and 32bits.
> 
> The only one that booted after installation was Lubuntu 16.04 32bit in
> legacy mode, with grub without "quite splash" parameters.
> 
> but it works rarely: 9 on 10 times it produces a kernel panic on apci init.
> 
> Now I'm trying linux Mint, but i'm quite sure problem will be there too.



Hi there, found this
https://www.reddit.com/r/linuxmint/comments/5lu69k/installing_linux_mint_181_on_an_acer_swift_3/

don't know if can help, but at second install attempt the system is stable with
kernel 4.4.0-53-generic

-- 
You are receiving this mail because:
You are watching the assignee of the bug.


Re: Race to power off harming SATA SSDs

2017-05-07 Thread Pavel Machek
Hi!

> > However, *IN PRACTICE*, SATA STANDBY IMMEDIATE command completion
> > [often?] only indicates that the device is now switching to the target
> > power management state, not that it has reached the target state.  Any
> > further device status inquires would return that it is in STANDBY mode,
> > even if it is still entering that state.
> > 
> > The kernel then continues the shutdown path while the SSD is still
> > preparing itself to be powered off, and it becomes a race.  When the
> > kernel + firmware wins, platform power is cut before the SSD has
> > finished (i.e. the SSD is subject to an unclean power-off).
> 
> At that point, the device is fully flushed and in terms of data
> integrity should be fine with losing power at any point anyway.

Actually, no, that is not how it works.

"Fully flushed" is one thing, surviving power loss is
different. Explanation below.

> > NOTE: unclean SSD power-offs are dangerous and may brick the device in
> > the worst case, or otherwise harm it (reduce longevity, damage flash
> > blocks).  It is also not impossible to get data corruption.
> 
> I get that the incrementing counters might not be pretty but I'm a bit
> skeptical about this being an actual issue.  Because if that were
> true, the device would be bricking itself from any sort of power
> losses be that an actual power loss, battery rundown or hard power off
> after crash.

And that's exactly what users see. If you do enough power fails on a
SSD, you usually brick it, some die sooner than others. There was some
test results published, some are here
http://lkcl.net/reports/ssd_analysis.html, I believe I seen some
others too.

It is very hard for a NAND to work reliably in face of power
failures. In fact, not even Linux MTD + UBIFS works well in that
regards. See
http://www.linux-mtd.infradead.org/faq/ubi.html. (Unfortunately, its
down now?!). If we can't get it right, do you believe SSD manufactures
do?

[Issue is, if you powerdown during erase, you get "weakly erased"
page, which will contain expected 0xff's, but you'll get bitflips
there quickly. Similar issue exists for writes. It is solveable in
software, just hard and slow... and we don't do it.]

Pavel

-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) 
http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html


Re: [PATCH v3] ibmvscsis: Do not send aborted task response

2017-05-07 Thread Nicholas A. Bellinger
On Fri, 2017-05-05 at 14:17 -0500, Bryant G. Ly wrote:
> The driver is sending a response to the actual scsi op that was
> aborted by an abort task TM, while LIO is sending a response to
> the abort task TM.
> 
> ibmvscsis_tgt does not send the response to the client until
> release_cmd time. The reason for this was because if we did it
> at queue_status time, then the client would be free to reuse the
> tag for that command, but we're still using the tag until the
> command is released at release_cmd time, so we chose to delay
> sending the response until then. That then caused this issue, because
> release_cmd is always called, even if queue_status is not.
> 
> SCSI spec says that the initiator that sends the abort task
> TM NEVER gets a response to the aborted op and with the current
> code it will send a response. Thus this fix will remove that response
> if the CMD_T_ABORTED && !CMD_T_TAS.
> 
> Another case with a small timing window is the case where if LIO sends a
> TMR_DOES_NOT_EXIST, and the release_cmd callback is called for the TMR Abort
> cmd before the release_cmd for the (attemped) aborted cmd, then we need to
> ensure that we send the response for the (attempted) abort cmd to the client
> before we send the response for the TMR Abort cmd.
> 
> Cc:  # v4.8+
> Signed-off-by: Bryant G. Ly 
> Signed-off-by: Michael Cyr 
> ---
>  drivers/scsi/ibmvscsi_tgt/ibmvscsi_tgt.c | 114 
> ---
>  drivers/scsi/ibmvscsi_tgt/ibmvscsi_tgt.h |   2 +
>  2 files changed, 91 insertions(+), 25 deletions(-)
> 

Applied.

Thanks Bryant + Michael.



[PATCH 15/19] aacraid: Make sure ioctl returns on controller reset

2017-05-07 Thread Raghava Aditya Renukunta
Made sure that ioctl commands return in case of a controller reset.

Signed-off-by: Raghava Aditya Renukunta 
---
 drivers/scsi/aacraid/commsup.c | 20 +---
 1 file changed, 17 insertions(+), 3 deletions(-)

diff --git a/drivers/scsi/aacraid/commsup.c b/drivers/scsi/aacraid/commsup.c
index f26543a..a026790 100644
--- a/drivers/scsi/aacraid/commsup.c
+++ b/drivers/scsi/aacraid/commsup.c
@@ -804,10 +804,13 @@ int aac_hba_send(u8 command, struct fib *fibptr, 
fib_callback callback,
return -EFAULT;
 
/* Only set for first known interruptable command */
+   fibptr->flags |= FIB_CONTEXT_FLAG_WAIT;
+   fibptr->flags &= ~(FIB_CONTEXT_FLAG_WAIT);
if (down_interruptible(>event_wait)) {
fibptr->done = 2;
up(>event_wait);
}
+
spin_lock_irqsave(>event_lock, flags);
if ((fibptr->done == 0) || (fibptr->done == 2)) {
fibptr->done = 2; /* Tell interrupt we aborted */
@@ -1514,6 +1517,7 @@ static int _aac_reset_adapter(struct aac_dev *aac, int 
forced, u8 reset_type)
int jafo = 0;
int bled;
u64 dmamask;
+   int num_of_fibs = 0;
 
/*
 * Assumptions:
@@ -1547,10 +1551,20 @@ static int _aac_reset_adapter(struct aac_dev *aac, int 
forced, u8 reset_type)
/*
 *  Loop through the fibs, close the synchronous FIBS
 */
-   for (retval = 1, index = 0; index < (aac->scsi_host_ptr->can_queue + 
AAC_NUM_MGT_FIB); index++) {
+   retval = 1;
+   num_of_fibs = aac->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB;
+   for (index = 0; index <  num_of_fibs; index++) {
+
struct fib *fib = >fibs[index];
-   if (!(fib->hw_fib_va->header.XferState & 
cpu_to_le32(NoResponseExpected | Async)) &&
- (fib->hw_fib_va->header.XferState & 
cpu_to_le32(ResponseExpected))) {
+   __le32 XferState = fib->hw_fib_va->header.XferState;
+   bool is_response_expected = false;
+
+   if (!(XferState & cpu_to_le32(NoResponseExpected | Async)) &&
+  (XferState & cpu_to_le32(ResponseExpected)))
+   is_response_expected = true;
+
+   if (is_response_expected
+ || fib->flags & FIB_CONTEXT_FLAG_WAIT) {
unsigned long flagv;
spin_lock_irqsave(>event_lock, flagv);
up(>event_wait);
-- 
2.7.4



[PATCH 11/19] aacraid: Add periodic checks to see IOP reset status

2017-05-07 Thread Raghava Aditya Renukunta
Added function that waits with a timeout for the ctrl to be up and running
after triggering an IOP reset. Also removed 30 sec sleep as it is not
needed.

Signed-off-by: Raghava Aditya Renukunta 
---
 drivers/scsi/aacraid/aacraid.h |  1 +
 drivers/scsi/aacraid/src.c | 45 --
 2 files changed, 44 insertions(+), 2 deletions(-)

diff --git a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h
index 993f134..829f3d8 100644
--- a/drivers/scsi/aacraid/aacraid.h
+++ b/drivers/scsi/aacraid/aacraid.h
@@ -2519,6 +2519,7 @@ struct aac_hba_info {
 
 #defineSELF_TEST_FAILED0x0004
 #defineMONITOR_PANIC   0x0020
+#defineKERNEL_BOOTING  0x0040
 #defineKERNEL_UP_AND_RUNNING   0x0080
 #defineKERNEL_PANIC0x0100
 #defineFLASH_UPD_PENDING   0x2000
diff --git a/drivers/scsi/aacraid/src.c b/drivers/scsi/aacraid/src.c
index e8e9178..67185eb 100644
--- a/drivers/scsi/aacraid/src.c
+++ b/drivers/scsi/aacraid/src.c
@@ -694,6 +694,37 @@ static void aac_dump_fw_fib_iop_reset(struct aac_dev *dev)
0, 0, 0,  0, 0, 0, NULL, NULL, NULL, NULL, NULL);
 }
 
+static bool aac_is_ctrl_up_and_running(struct aac_dev *dev)
+{
+   bool ctrl_up = true;
+   unsigned long status, start;
+   bool is_up = false;
+
+   start = jiffies;
+   do {
+   schedule();
+   status = src_readl(dev, MUnit.OMR);
+
+   if (status == 0x)
+   status = 0;
+
+   if (status & KERNEL_BOOTING) {
+   start = jiffies;
+   continue;
+   }
+
+   if (time_after(jiffies, start+HZ*SOFT_RESET_TIME)) {
+   ctrl_up = false;
+   break;
+   }
+
+   is_up = status & KERNEL_UP_AND_RUNNING;
+
+   } while (!is_up);
+
+   return ctrl_up;
+}
+
 static void aac_notify_fw_of_iop_reset(struct aac_dev *dev)
 {
aac_adapter_sync_cmd(dev, IOP_RESET_ALWAYS, 0, 0, 0, 0, 0, 0, NULL,
@@ -709,8 +740,6 @@ static void aac_send_iop_reset(struct aac_dev *dev)
aac_set_intx_mode(dev);
 
src_writel(dev, MUnit.IDR, IOP_SRC_RESET_MASK);
-
-   msleep(3);
 }
 
 static void aac_send_hardware_soft_reset(struct aac_dev *dev)
@@ -726,6 +755,7 @@ static void aac_send_hardware_soft_reset(struct aac_dev 
*dev)
 static int aac_src_restart_adapter(struct aac_dev *dev, int bled, u8 
reset_type)
 {
unsigned long status, start;
+   bool is_ctrl_up;
 
if (bled < 0)
goto invalid_out;
@@ -745,6 +775,16 @@ static int aac_src_restart_adapter(struct aac_dev *dev, 
int bled, u8 reset_type)
switch (reset_type) {
case IOP_HWSOFT_RESET:
aac_send_iop_reset(dev);
+
+   /*
+* Creates a delay or wait till up and running comes thru
+*/
+   is_ctrl_up = aac_is_ctrl_up_and_running(dev);
+   if (!is_ctrl_up)
+   dev_err(>pdev->dev, "IOP reset failed\n");
+   else
+   goto set_startup;
+
/*
 * Check to see if KERNEL_UP_AND_RUNNING
 * Wait for the adapter to be up and running.
@@ -780,6 +820,7 @@ static int aac_src_restart_adapter(struct aac_dev *dev, int 
bled, u8 reset_type)
if (src_readl(dev, MUnit.OMR) & KERNEL_PANIC)
return -ENODEV;
 
+set_startup:
if (startup_timeout < 300)
startup_timeout = 300;
 
-- 
2.7.4



[PATCH 04/19] aacraid: Set correct Queue Depth for HBA1000 RAW disks

2017-05-07 Thread Raghava Aditya Renukunta
The default queue depth for non NATIVE RAW disks is calculated from the
number of fibs and number of disks or a max of 256. This causes poor disk
IO performance.

The fix is to set default qd based on the type of disks
(SATA -32 and SAS -64)

Signed-off-by: Raghava Aditya Renukunta 
---
 drivers/scsi/aacraid/linit.c | 28 
 1 file changed, 20 insertions(+), 8 deletions(-)

diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c
index 5e1a2d6..9ef98e4 100644
--- a/drivers/scsi/aacraid/linit.c
+++ b/drivers/scsi/aacraid/linit.c
@@ -405,17 +405,23 @@ static int aac_slave_configure(struct scsi_device *sdev)
int chn, tid;
unsigned int depth = 0;
unsigned int set_timeout = 0;
+   bool set_qd_dev_type = false;
+   u8 devtype = 0;
 
chn = aac_logical_to_phys(sdev_channel(sdev));
tid = sdev_id(sdev);
-   if (chn < AAC_MAX_BUSES && tid < AAC_MAX_TARGETS &&
-   aac->hba_map[chn][tid].devtype == AAC_DEVTYPE_NATIVE_RAW) {
-   depth = aac->hba_map[chn][tid].qd_limit;
+   if (chn < AAC_MAX_BUSES && tid < AAC_MAX_TARGETS && aac->sa_firmware) {
+   devtype = aac->hba_map[chn][tid].devtype;
+
+   if (devtype == AAC_DEVTYPE_NATIVE_RAW)
+   depth = aac->hba_map[chn][tid].qd_limit;
+   else if (devtype == AAC_DEVTYPE_ARC_RAW)
+   set_qd_dev_type = true;
+
set_timeout = 1;
goto common_config;
}
 
-
if (aac->jbod && (sdev->type == TYPE_DISK))
sdev->removable = 1;
 
@@ -470,16 +476,22 @@ static int aac_slave_configure(struct scsi_device *sdev)
if (sdev_channel(sdev) != NATIVE_CHANNEL)
goto common_config;
 
-   /*
-* Check if SATA drive
-*/
+   set_qd_dev_type = true;
+
+   }
+
+common_config:
+
+   /*
+* Check if SATA drive
+*/
+   if (set_qd_dev_type) {
if (strncmp(sdev->vendor, "ATA", 3) == 0)
depth = 32;
else
depth = 64;
}
 
-common_config:
/*
 * Firmware has an individual device recovery time typically
 * of 35 seconds, give us a margin.
-- 
2.7.4



[PATCH 16/19] aacraid: Enable ctrl reset for both hba and arc

2017-05-07 Thread Raghava Aditya Renukunta
Make sure that IOP and SOFT reset are enabled for both for both
arc and hba1000 controllers.

Signed-off-by: Raghava Aditya Renukunta 
---
 drivers/scsi/aacraid/linit.c | 77 +++-
 1 file changed, 40 insertions(+), 37 deletions(-)

diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c
index 3dea438..d933d2f 100644
--- a/drivers/scsi/aacraid/linit.c
+++ b/drivers/scsi/aacraid/linit.c
@@ -828,6 +828,11 @@ static int aac_eh_reset(struct scsi_cmnd* cmd)
u32 bus, cid;
int ret = FAILED;
int status = 0;
+   __le32 supported_options2 = 0;
+   bool is_mu_reset;
+   bool is_ignore_reset;
+   bool is_doorbell_reset;
+
 
bus = aac_logical_to_phys(scmd_channel(cmd));
cid = scmd_id(cmd);
@@ -900,9 +905,9 @@ static int aac_eh_reset(struct scsi_cmnd* cmd)
msleep(1000);
}
 
-   if (ret != SUCCESS)
-   pr_err("%s: Host adapter reset request timed out\n",
-   AAC_DRIVERNAME);
+   if (ret == SUCCESS)
+   goto out;
+
} else {
 
/* Mark the assoc. FIB to not complete, eh handler does this */
@@ -918,44 +923,42 @@ static int aac_eh_reset(struct scsi_cmnd* cmd)
cmd->SCp.phase = AAC_OWNER_ERROR_HANDLER;
}
}
+   }
 
-   pr_err("%s: Host adapter reset request. SCSI hang ?\n",
-   AAC_DRIVERNAME);
+   pr_err("%s: Host adapter reset request. SCSI hang ?\n", AAC_DRIVERNAME);
+
+   /*
+* Check the health of the controller
+*/
+   status = aac_adapter_check_health(aac);
+   if (status)
+   dev_err(>pdev->dev, "Adapter health - %d\n", status);
+
+   count = get_num_of_incomplete_fibs(aac);
+   if (count == 0)
+   return SUCCESS;
 
-   /*
-* Check the health of the controller
-*/
-   status = aac_adapter_check_health(aac);
-   if (status)
-   dev_err(>pdev->dev, "Adapter health - %d\n",
-   status);
-
-   count = get_num_of_incomplete_fibs(aac);
-   if (count == 0)
-   return SUCCESS;
-
-   /*
-* This adapter needs a blind reset, only do so for
-* Adapters that support a register, instead of a commanded,
-* reset.
-*/
-   if (((aac->supplement_adapter_info.supported_options2 &
- AAC_OPTION_MU_RESET) ||
- (aac->supplement_adapter_info.supported_options2 &
- AAC_OPTION_DOORBELL_RESET)) &&
- aac_check_reset &&
- ((aac_check_reset != 1) ||
-  !(aac->supplement_adapter_info.supported_options2 &
-   AAC_OPTION_IGNORE_RESET))) {
-   /* Bypass wait for command quiesce */
-   aac_reset_adapter(aac, 2, IOP_HWSOFT_RESET);
-   }
-   ret = SUCCESS;
-   }
/*
-* Cause an immediate retry of the command with a ten second delay
-* after successful tur
+* Check if reset is supported by the firmware
 */
+   supported_options2 = aac->supplement_adapter_info.supported_options2;
+   is_mu_reset = supported_options2 & AAC_OPTION_MU_RESET;
+   is_doorbell_reset = supported_options2 & AAC_OPTION_DOORBELL_RESET;
+   is_ignore_reset = supported_options2 & AAC_OPTION_IGNORE_RESET;
+   /*
+* This adapter needs a blind reset, only do so for
+* Adapters that support a register, instead of a commanded,
+* reset.
+*/
+   if ((is_mu_reset || is_doorbell_reset)
+&& aac_check_reset
+&& (aac_check_reset != -1 || !is_ignore_reset)) {
+   /* Bypass wait for command quiesce */
+   aac_reset_adapter(aac, 2, IOP_HWSOFT_RESET);
+   }
+   ret = SUCCESS;
+
+out:
return ret;
 }
 
-- 
2.7.4



[PATCH 18/19] aacraid: Remove reference to Series-9

2017-05-07 Thread Raghava Aditya Renukunta
Removed reference to Series-9 HBA and created arc ctrl check function.

Signed-off-by: Prasad B Munirathnam 
Signed-off-by: Raghava Aditya Renukunta 
---
 drivers/scsi/aacraid/aacraid.h  | 13 -
 drivers/scsi/aacraid/comminit.c | 18 --
 drivers/scsi/aacraid/commsup.c  |  5 +
 drivers/scsi/aacraid/linit.c|  9 ++---
 4 files changed, 19 insertions(+), 26 deletions(-)

diff --git a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h
index 829f3d8..58ccd2a 100644
--- a/drivers/scsi/aacraid/aacraid.h
+++ b/drivers/scsi/aacraid/aacraid.h
@@ -424,7 +424,6 @@ struct aac_ciss_identify_pd {
 #define PMC_DEVICE_S6  0x28b
 #define PMC_DEVICE_S7  0x28c
 #define PMC_DEVICE_S8  0x28d
-#define PMC_DEVICE_S9  0x28f
 
 #define aac_phys_to_logical(x)  ((x)+1)
 #define aac_logical_to_phys(x)  ((x)?(x)-1:0)
@@ -2684,6 +2683,18 @@ int aac_probe_container(struct aac_dev *dev, int cid);
 int _aac_rx_init(struct aac_dev *dev);
 int aac_rx_select_comm(struct aac_dev *dev, int comm);
 int aac_rx_deliver_producer(struct fib * fib);
+
+static inline int aac_is_src(struct aac_dev *dev)
+{
+   u16 device = dev->pdev->device;
+
+   if (device == PMC_DEVICE_S6 ||
+   device == PMC_DEVICE_S7 ||
+   device == PMC_DEVICE_S8)
+   return 1;
+   return 0;
+}
+
 char * get_container_type(unsigned type);
 extern int numacb;
 extern char aac_driver_version[];
diff --git a/drivers/scsi/aacraid/comminit.c b/drivers/scsi/aacraid/comminit.c
index 1151505..9ee025b 100644
--- a/drivers/scsi/aacraid/comminit.c
+++ b/drivers/scsi/aacraid/comminit.c
@@ -53,11 +53,8 @@ static inline int aac_is_msix_mode(struct aac_dev *dev)
 {
u32 status = 0;
 
-   if (dev->pdev->device == PMC_DEVICE_S6 ||
-   dev->pdev->device == PMC_DEVICE_S7 ||
-   dev->pdev->device == PMC_DEVICE_S8) {
+   if (aac_is_src(dev))
status = src_readl(dev, MUnit.OMR);
-   }
return (status & AAC_INT_MODE_MSIX);
 }
 
@@ -325,9 +322,7 @@ int aac_send_shutdown(struct aac_dev * dev)
/* FIB should be freed only after getting the response from the F/W */
if (status != -ERESTARTSYS)
aac_fib_free(fibctx);
-   if ((dev->pdev->device == PMC_DEVICE_S7 ||
-dev->pdev->device == PMC_DEVICE_S8 ||
-dev->pdev->device == PMC_DEVICE_S9) &&
+   if (aac_is_src(dev) &&
 dev->msi_enabled)
aac_set_intx_mode(dev);
return status;
@@ -583,9 +578,7 @@ struct aac_dev *aac_init_adapter(struct aac_dev *dev)
dev->max_fib_size = status[1] & 0xFFE0;
host->sg_tablesize = status[2] >> 16;
dev->sg_tablesize = status[2] & 0x;
-   if (dev->pdev->device == PMC_DEVICE_S7 ||
-   dev->pdev->device == PMC_DEVICE_S8 ||
-   dev->pdev->device == PMC_DEVICE_S9) {
+   if (aac_is_src(dev)) {
if (host->can_queue > (status[3] >> 16) -
AAC_NUM_MGT_FIB)
host->can_queue = (status[3] >> 16) -
@@ -604,10 +597,7 @@ struct aac_dev *aac_init_adapter(struct aac_dev *dev)
pr_warn("numacb=%d ignored\n", numacb);
}
 
-   if (dev->pdev->device == PMC_DEVICE_S6 ||
-   dev->pdev->device == PMC_DEVICE_S7 ||
-   dev->pdev->device == PMC_DEVICE_S8 ||
-   dev->pdev->device == PMC_DEVICE_S9)
+   if (aac_is_src(dev))
aac_define_int_mode(dev);
/*
 *  Ok now init the communication subsystem
diff --git a/drivers/scsi/aacraid/commsup.c b/drivers/scsi/aacraid/commsup.c
index a026790..184e9cf 100644
--- a/drivers/scsi/aacraid/commsup.c
+++ b/drivers/scsi/aacraid/commsup.c
@@ -2595,10 +2595,7 @@ void aac_free_irq(struct aac_dev *dev)
int cpu;
 
cpu = cpumask_first(cpu_online_mask);
-   if (dev->pdev->device == PMC_DEVICE_S6 ||
-   dev->pdev->device == PMC_DEVICE_S7 ||
-   dev->pdev->device == PMC_DEVICE_S8 ||
-   dev->pdev->device == PMC_DEVICE_S9) {
+   if (aac_is_src(dev)) {
if (dev->max_msix > 1) {
for (i = 0; i < dev->max_msix; i++)
free_irq(pci_irq_vector(dev->pdev, i),
diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c
index d933d2f..0f277df 100644
--- a/drivers/scsi/aacraid/linit.c
+++ b/drivers/scsi/aacraid/linit.c
@@ -1416,10 +1416,7 @@ static void __aac_shutdown(struct aac_dev * aac)
kthread_stop(aac->thread);
}
aac_adapter_disable_int(aac);
-   if (aac->pdev->device == PMC_DEVICE_S6 ||
-   aac->pdev->device == PMC_DEVICE_S7 ||
-   aac->pdev->device == PMC_DEVICE_S8 ||
-   aac->pdev->device == PMC_DEVICE_S9) {
+   if 

[PATCH 19/19] aacraid: Update driver version to 50834

2017-05-07 Thread Raghava Aditya Renukunta
Update the driver version to 50834

Signed-off-by: Raghava Aditya Renukunta 
---
 drivers/scsi/aacraid/aacraid.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h
index 58ccd2a..0995265 100644
--- a/drivers/scsi/aacraid/aacraid.h
+++ b/drivers/scsi/aacraid/aacraid.h
@@ -97,7 +97,7 @@ enum {
 #definePMC_GLOBAL_INT_BIT0 0x0001
 
 #ifndef AAC_DRIVER_BUILD
-# define AAC_DRIVER_BUILD 50792
+# define AAC_DRIVER_BUILD 50834
 # define AAC_DRIVER_BRANCH "-custom"
 #endif
 #define MAXIMUM_NUM_CONTAINERS 32
-- 
2.7.4



[PATCH 09/19] aacraid: Using single reset mask for IOP reset

2017-05-07 Thread Raghava Aditya Renukunta
The driver can now trigger IOP reset with a single reset mask. Removed
code that retrieves a reset_mask from the firmware.

Signed-off-by: Raghava Aditya Renukunta 
---
 drivers/scsi/aacraid/aacraid.h |  5 -
 drivers/scsi/aacraid/src.c | 16 ++--
 2 files changed, 6 insertions(+), 15 deletions(-)

diff --git a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h
index 3ede6de..993f134 100644
--- a/drivers/scsi/aacraid/aacraid.h
+++ b/drivers/scsi/aacraid/aacraid.h
@@ -2381,6 +2381,7 @@ struct revision
 #define SOFT_RESET_TIME60
 
 
+
 struct aac_common
 {
/*
@@ -2491,7 +2492,9 @@ struct aac_hba_info {
 #define IOP_RESET_FW_FIB_DUMP  0x0034
 #define IOP_RESET  0x1000
 #define IOP_RESET_ALWAYS   0x1001
-#define RE_INIT_ADAPTER0x00ee
+#define RE_INIT_ADAPTER0x00ee
+
+#define IOP_SRC_RESET_MASK 0x0100
 
 /*
  * Adapter Status Register
diff --git a/drivers/scsi/aacraid/src.c b/drivers/scsi/aacraid/src.c
index 2e5338d..c0e5242 100644
--- a/drivers/scsi/aacraid/src.c
+++ b/drivers/scsi/aacraid/src.c
@@ -704,22 +704,10 @@ static void aac_send_iop_reset(struct aac_dev *dev, int 
bled)
0, 0, 0, 0, 0, 0, ,
_mask, NULL, NULL, NULL);
 
-   if ((bled || var != 0x0001) && !dev->doorbell_mask)
-   bled = -EINVAL;
-   else if (dev->doorbell_mask) {
-   reset_mask = dev->doorbell_mask;
-   bled = 0;
-   var = 0x0001;
-   }
-
aac_set_intx_mode(dev);
 
-   if (!bled && (dev->supplement_adapter_info.supported_options2 &
-   AAC_OPTION_DOORBELL_RESET)) {
-   src_writel(dev, MUnit.IDR, reset_mask);
-   } else {
-   src_writel(dev, MUnit.IDR, 0x100);
-   }
+   src_writel(dev, MUnit.IDR, IOP_SRC_RESET_MASK);
+
msleep(3);
 }
 
-- 
2.7.4



[PATCH 05/19] aacraid: Remove reset support from check_health

2017-05-07 Thread Raghava Aditya Renukunta
Check health does not need to reset the ctrl but just return the
controller health status.

Signed-off-by: Raghava Aditya Renukunta 
---
 drivers/scsi/aacraid/commsup.c | 15 ---
 1 file changed, 15 deletions(-)

diff --git a/drivers/scsi/aacraid/commsup.c b/drivers/scsi/aacraid/commsup.c
index 47068b2..3299012 100644
--- a/drivers/scsi/aacraid/commsup.c
+++ b/drivers/scsi/aacraid/commsup.c
@@ -1775,8 +1775,6 @@ int aac_check_health(struct aac_dev * aac)
int BlinkLED;
unsigned long time_now, flagv = 0;
struct list_head * entry;
-   struct Scsi_Host * host;
-   int bled;
 
/* Extending the scope of fib_lock slightly to protect aac->in_reset */
if (spin_trylock_irqsave(>fib_lock, flagv) == 0)
@@ -1887,19 +1885,6 @@ int aac_check_health(struct aac_dev * aac)
 
printk(KERN_ERR "%s: Host adapter BLINK LED 0x%x\n", aac->name, 
BlinkLED);
 
-   if (!aac_check_reset || ((aac_check_reset == 1) &&
-   (aac->supplement_adapter_info.supported_options2 &
-   AAC_OPTION_IGNORE_RESET)))
-   goto out;
-   host = aac->scsi_host_ptr;
-   if (aac->thread->pid != current->pid)
-   spin_lock_irqsave(host->host_lock, flagv);
-   bled = aac_check_reset != 1 ? 1 : 0;
-   _aac_reset_adapter(aac, bled, IOP_HWSOFT_RESET);
-   if (aac->thread->pid != current->pid)
-   spin_unlock_irqrestore(host->host_lock, flagv);
-   return BlinkLED;
-
 out:
aac->in_reset = 0;
return BlinkLED;
-- 
2.7.4



[PATCH 10/19] aacraid: Rework IOP reset

2017-05-07 Thread Raghava Aditya Renukunta
Reworked IOP reset to remove unneeded variable and created a helper
function to notify fw of an imminent IOP reset.

Signed-off-by: Raghava Aditya Renukunta 
---
 drivers/scsi/aacraid/src.c | 16 +---
 1 file changed, 9 insertions(+), 7 deletions(-)

diff --git a/drivers/scsi/aacraid/src.c b/drivers/scsi/aacraid/src.c
index c0e5242..e8e9178 100644
--- a/drivers/scsi/aacraid/src.c
+++ b/drivers/scsi/aacraid/src.c
@@ -694,15 +694,17 @@ static void aac_dump_fw_fib_iop_reset(struct aac_dev *dev)
0, 0, 0,  0, 0, 0, NULL, NULL, NULL, NULL, NULL);
 }
 
-static void aac_send_iop_reset(struct aac_dev *dev, int bled)
+static void aac_notify_fw_of_iop_reset(struct aac_dev *dev)
 {
-   u32 var, reset_mask;
+   aac_adapter_sync_cmd(dev, IOP_RESET_ALWAYS, 0, 0, 0, 0, 0, 0, NULL,
+   NULL, NULL, NULL, NULL);
+}
 
+static void aac_send_iop_reset(struct aac_dev *dev)
+{
aac_dump_fw_fib_iop_reset(dev);
 
-   bled = aac_adapter_sync_cmd(dev, IOP_RESET_ALWAYS,
-   0, 0, 0, 0, 0, 0, ,
-   _mask, NULL, NULL, NULL);
+   aac_notify_fw_of_iop_reset(dev);
 
aac_set_intx_mode(dev);
 
@@ -742,7 +744,7 @@ static int aac_src_restart_adapter(struct aac_dev *dev, int 
bled, u8 reset_type)
 
switch (reset_type) {
case IOP_HWSOFT_RESET:
-   aac_send_iop_reset(dev, bled);
+   aac_send_iop_reset(dev);
/*
 * Check to see if KERNEL_UP_AND_RUNNING
 * Wait for the adapter to be up and running.
@@ -769,7 +771,7 @@ static int aac_src_restart_adapter(struct aac_dev *dev, int 
bled, u8 reset_type)
}
break;
default:
-   aac_send_iop_reset(dev, bled);
+   aac_send_iop_reset(dev);
break;
}
 
-- 
2.7.4



[PATCH 13/19] aacraid: Rework aac_src_restart

2017-05-07 Thread Raghava Aditya Renukunta
Removed switch case and replaced with if mask checks. Moved KERNEL_PANIC
check to when bled is less than 0.

Signed-off-by: Raghava Aditya Renukunta 
---
 drivers/scsi/aacraid/src.c | 34 --
 1 file changed, 12 insertions(+), 22 deletions(-)

diff --git a/drivers/scsi/aacraid/src.c b/drivers/scsi/aacraid/src.c
index 8ed7be0..10a589b 100644
--- a/drivers/scsi/aacraid/src.c
+++ b/drivers/scsi/aacraid/src.c
@@ -772,8 +772,7 @@ static int aac_src_restart_adapter(struct aac_dev *dev, int 
bled, u8 reset_type)
 
dev->a_ops.adapter_enable_int = aac_src_disable_interrupt;
 
-   switch (reset_type) {
-   case IOP_HWSOFT_RESET:
+   if (reset_type & HW_IOP_RESET) {
aac_send_iop_reset(dev);
 
/*
@@ -784,12 +783,14 @@ static int aac_src_restart_adapter(struct aac_dev *dev, 
int bled, u8 reset_type)
dev_err(>pdev->dev, "IOP reset failed\n");
else
goto set_startup;
+   }
 
-   if (!dev->sa_firmware) {
-   ret = -ENODEV;
-   goto out;
-   }
+   if (!dev->sa_firmware) {
+   ret = -ENODEV;
+   goto out;
+   }
 
+   if (reset_type & HW_SOFT_RESET) {
aac_send_hardware_soft_reset(dev);
dev->msi_enabled = 0;
 
@@ -799,30 +800,19 @@ static int aac_src_restart_adapter(struct aac_dev *dev, 
int bled, u8 reset_type)
ret = -ENODEV;
goto out;
}
-
-   break;
-   case HW_SOFT_RESET:
-   if (dev->sa_firmware) {
-   aac_send_hardware_soft_reset(dev);
-   aac_set_intx_mode(dev);
-   }
-   break;
-   default:
-   aac_send_iop_reset(dev);
-   break;
}
 
-invalid_out:
-
-   if (src_readl(dev, MUnit.OMR) & KERNEL_PANIC)
-   ret = -ENODEV;
-
 set_startup:
if (startup_timeout < 300)
startup_timeout = 300;
 
 out:
return ret;
+
+invalid_out:
+   if (src_readl(dev, MUnit.OMR) & KERNEL_PANIC)
+   ret = -ENODEV;
+goto out;
 }
 
 /**
-- 
2.7.4



[PATCH 14/19] aacraid: Use correct function to get ctrl health

2017-05-07 Thread Raghava Aditya Renukunta
The command thread checks the ctrl health periodically before sending
updates to the controller. The function that it uses is aac_check_health
which does more than get the health status.

Signed-off-by: Raghava Aditya Renukunta 
---
 drivers/scsi/aacraid/commsup.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/scsi/aacraid/commsup.c b/drivers/scsi/aacraid/commsup.c
index 3299012..f26543a 100644
--- a/drivers/scsi/aacraid/commsup.c
+++ b/drivers/scsi/aacraid/commsup.c
@@ -2476,7 +2476,7 @@ int aac_command_thread(void *data)
if ((time_before(next_check_jiffies,next_jiffies))
 && ((difference = next_check_jiffies - jiffies) <= 0)) {
next_check_jiffies = next_jiffies;
-   if (aac_check_health(dev) == 0) {
+   if (aac_adapter_check_health(dev) == 0) {
difference = ((long)(unsigned)check_interval)
   * HZ;
next_check_jiffies = jiffies + difference;
@@ -2489,7 +2489,7 @@ int aac_command_thread(void *data)
int ret;
 
/* Don't even try to talk to adapter if its sick */
-   ret = aac_check_health(dev);
+   ret = aac_adapter_check_health(dev);
if (ret || !dev->queues)
break;
next_check_jiffies = jiffies
-- 
2.7.4



[PATCH 01/19] aacraid: Remove GFP_DMA for raw srb memory

2017-05-07 Thread Raghava Aditya Renukunta
The raw srb commands do not requires memory that in the ZONE_DMA
memory space. For 32bit srb commands use __GFP_DMA32 to limit the memory
to 32bit memory range (4GB).

Signed-off-by: Raghava Aditya Renukunta 
---
 drivers/scsi/aacraid/commctrl.c | 13 ++---
 1 file changed, 6 insertions(+), 7 deletions(-)

diff --git a/drivers/scsi/aacraid/commctrl.c b/drivers/scsi/aacraid/commctrl.c
index d2f8d59..da01f9c 100644
--- a/drivers/scsi/aacraid/commctrl.c
+++ b/drivers/scsi/aacraid/commctrl.c
@@ -668,7 +668,7 @@ static int aac_send_raw_srb(struct aac_dev* dev, void 
__user * arg)
goto cleanup;
}
 
-   p = kmalloc(sg_count[i], GFP_KERNEL|__GFP_DMA);
+   p = kmalloc(sg_count[i], GFP_KERNEL);
if (!p) {
rcode = -ENOMEM;
goto cleanup;
@@ -733,7 +733,7 @@ static int aac_send_raw_srb(struct aac_dev* dev, void 
__user * arg)
goto cleanup;
}
/* Does this really need to be GFP_DMA? */
-   p = kmalloc(sg_count[i], GFP_KERNEL|__GFP_DMA);
+   p = kmalloc(sg_count[i], GFP_KERNEL);
if(!p) {
dprintk((KERN_DEBUG"aacraid: Could not 
allocate SG buffer - size = %d buffer number %d of %d\n",
  sg_count[i], i, upsg->count));
@@ -788,8 +788,8 @@ static int aac_send_raw_srb(struct aac_dev* dev, void 
__user * arg)
rcode = -EINVAL;
goto cleanup;
}
-   /* Does this really need to be GFP_DMA? */
-   p = kmalloc(sg_count[i], GFP_KERNEL|__GFP_DMA);
+
+   p = kmalloc(sg_count[i], GFP_KERNEL);
if(!p) {
dprintk((KERN_DEBUG "aacraid: Could not 
allocate SG buffer - size = %d buffer number %d of %d\n",
sg_count[i], i, usg->count));
@@ -845,8 +845,7 @@ static int aac_send_raw_srb(struct aac_dev* dev, void 
__user * arg)
rcode = -EINVAL;
goto cleanup;
}
-   /* Does this really need to be GFP_DMA? */
-   p = kmalloc(sg_count[i], GFP_KERNEL|__GFP_DMA);
+   p = kmalloc(sg_count[i], GFP_KERNEL|GFP_DMA32);
if (!p) {
dprintk((KERN_DEBUG"aacraid: Could not 
allocate SG buffer - size = %d buffer number %d of %d\n",
sg_count[i], i, usg->count));
@@ -887,7 +886,7 @@ static int aac_send_raw_srb(struct aac_dev* dev, void 
__user * arg)
rcode = -EINVAL;
goto cleanup;
}
-   p = kmalloc(sg_count[i], GFP_KERNEL);
+   p = kmalloc(sg_count[i], GFP_KERNEL|GFP_DMA32);
if (!p) {
dprintk((KERN_DEBUG"aacraid: Could not 
allocate SG buffer - size = %d buffer number %d of %d\n",
  sg_count[i], i, upsg->count));
-- 
2.7.4



[PATCH 16/19] aacraid: Enable ctrl reset for both hba and arc

2017-05-07 Thread Raghava Aditya Renukunta
Make sure that IOP and SOFT reset are enabled for both for both
arc and hba1000 controllers.

Signed-off-by: Raghava Aditya Renukunta 
---
 drivers/scsi/aacraid/linit.c | 77 +++-
 1 file changed, 40 insertions(+), 37 deletions(-)

diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c
index 3dea438..d933d2f 100644
--- a/drivers/scsi/aacraid/linit.c
+++ b/drivers/scsi/aacraid/linit.c
@@ -828,6 +828,11 @@ static int aac_eh_reset(struct scsi_cmnd* cmd)
u32 bus, cid;
int ret = FAILED;
int status = 0;
+   __le32 supported_options2 = 0;
+   bool is_mu_reset;
+   bool is_ignore_reset;
+   bool is_doorbell_reset;
+
 
bus = aac_logical_to_phys(scmd_channel(cmd));
cid = scmd_id(cmd);
@@ -900,9 +905,9 @@ static int aac_eh_reset(struct scsi_cmnd* cmd)
msleep(1000);
}
 
-   if (ret != SUCCESS)
-   pr_err("%s: Host adapter reset request timed out\n",
-   AAC_DRIVERNAME);
+   if (ret == SUCCESS)
+   goto out;
+
} else {
 
/* Mark the assoc. FIB to not complete, eh handler does this */
@@ -918,44 +923,42 @@ static int aac_eh_reset(struct scsi_cmnd* cmd)
cmd->SCp.phase = AAC_OWNER_ERROR_HANDLER;
}
}
+   }
 
-   pr_err("%s: Host adapter reset request. SCSI hang ?\n",
-   AAC_DRIVERNAME);
+   pr_err("%s: Host adapter reset request. SCSI hang ?\n", AAC_DRIVERNAME);
+
+   /*
+* Check the health of the controller
+*/
+   status = aac_adapter_check_health(aac);
+   if (status)
+   dev_err(>pdev->dev, "Adapter health - %d\n", status);
+
+   count = get_num_of_incomplete_fibs(aac);
+   if (count == 0)
+   return SUCCESS;
 
-   /*
-* Check the health of the controller
-*/
-   status = aac_adapter_check_health(aac);
-   if (status)
-   dev_err(>pdev->dev, "Adapter health - %d\n",
-   status);
-
-   count = get_num_of_incomplete_fibs(aac);
-   if (count == 0)
-   return SUCCESS;
-
-   /*
-* This adapter needs a blind reset, only do so for
-* Adapters that support a register, instead of a commanded,
-* reset.
-*/
-   if (((aac->supplement_adapter_info.supported_options2 &
- AAC_OPTION_MU_RESET) ||
- (aac->supplement_adapter_info.supported_options2 &
- AAC_OPTION_DOORBELL_RESET)) &&
- aac_check_reset &&
- ((aac_check_reset != 1) ||
-  !(aac->supplement_adapter_info.supported_options2 &
-   AAC_OPTION_IGNORE_RESET))) {
-   /* Bypass wait for command quiesce */
-   aac_reset_adapter(aac, 2, IOP_HWSOFT_RESET);
-   }
-   ret = SUCCESS;
-   }
/*
-* Cause an immediate retry of the command with a ten second delay
-* after successful tur
+* Check if reset is supported by the firmware
 */
+   supported_options2 = aac->supplement_adapter_info.supported_options2;
+   is_mu_reset = supported_options2 & AAC_OPTION_MU_RESET;
+   is_doorbell_reset = supported_options2 & AAC_OPTION_DOORBELL_RESET;
+   is_ignore_reset = supported_options2 & AAC_OPTION_IGNORE_RESET;
+   /*
+* This adapter needs a blind reset, only do so for
+* Adapters that support a register, instead of a commanded,
+* reset.
+*/
+   if ((is_mu_reset || is_doorbell_reset)
+&& aac_check_reset
+&& (aac_check_reset != -1 || !is_ignore_reset)) {
+   /* Bypass wait for command quiesce */
+   aac_reset_adapter(aac, 2, IOP_HWSOFT_RESET);
+   }
+   ret = SUCCESS;
+
+out:
return ret;
 }
 
-- 
2.7.4



[PATCH 13/19] aacraid: Rework aac_src_restart

2017-05-07 Thread Raghava Aditya Renukunta
Removed switch case and replaced with if mask checks. Moved KERNEL_PANIC
check to when bled is less than 0.

Signed-off-by: Raghava Aditya Renukunta 
---
 drivers/scsi/aacraid/src.c | 34 --
 1 file changed, 12 insertions(+), 22 deletions(-)

diff --git a/drivers/scsi/aacraid/src.c b/drivers/scsi/aacraid/src.c
index 8ed7be0..10a589b 100644
--- a/drivers/scsi/aacraid/src.c
+++ b/drivers/scsi/aacraid/src.c
@@ -772,8 +772,7 @@ static int aac_src_restart_adapter(struct aac_dev *dev, int 
bled, u8 reset_type)
 
dev->a_ops.adapter_enable_int = aac_src_disable_interrupt;
 
-   switch (reset_type) {
-   case IOP_HWSOFT_RESET:
+   if (reset_type & HW_IOP_RESET) {
aac_send_iop_reset(dev);
 
/*
@@ -784,12 +783,14 @@ static int aac_src_restart_adapter(struct aac_dev *dev, 
int bled, u8 reset_type)
dev_err(>pdev->dev, "IOP reset failed\n");
else
goto set_startup;
+   }
 
-   if (!dev->sa_firmware) {
-   ret = -ENODEV;
-   goto out;
-   }
+   if (!dev->sa_firmware) {
+   ret = -ENODEV;
+   goto out;
+   }
 
+   if (reset_type & HW_SOFT_RESET) {
aac_send_hardware_soft_reset(dev);
dev->msi_enabled = 0;
 
@@ -799,30 +800,19 @@ static int aac_src_restart_adapter(struct aac_dev *dev, 
int bled, u8 reset_type)
ret = -ENODEV;
goto out;
}
-
-   break;
-   case HW_SOFT_RESET:
-   if (dev->sa_firmware) {
-   aac_send_hardware_soft_reset(dev);
-   aac_set_intx_mode(dev);
-   }
-   break;
-   default:
-   aac_send_iop_reset(dev);
-   break;
}
 
-invalid_out:
-
-   if (src_readl(dev, MUnit.OMR) & KERNEL_PANIC)
-   ret = -ENODEV;
-
 set_startup:
if (startup_timeout < 300)
startup_timeout = 300;
 
 out:
return ret;
+
+invalid_out:
+   if (src_readl(dev, MUnit.OMR) & KERNEL_PANIC)
+   ret = -ENODEV;
+goto out;
 }
 
 /**
-- 
2.7.4



[PATCH 06/19] aacraid: Change wait time for fib completion

2017-05-07 Thread Raghava Aditya Renukunta
Change the completion wait time for the fibs in the reset and abort
callback from 2 minutes to 15 seconds.

2 minutes is too long for waiting for completion.

Signed-off-by: Raghava Aditya Renukunta 
---
 drivers/scsi/aacraid/linit.c | 8 
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c
index 9ef98e4..f6a11af 100644
--- a/drivers/scsi/aacraid/linit.c
+++ b/drivers/scsi/aacraid/linit.c
@@ -684,8 +684,8 @@ static int aac_eh_abort(struct scsi_cmnd* cmd)
  (fib_callback) aac_hba_callback,
  (void *) cmd);
 
-   /* Wait up to 2 minutes for completion */
-   for (count = 0; count < 120; ++count) {
+   /* Wait up to 15 secs for completion */
+   for (count = 0; count < 15; ++count) {
if (cmd->SCp.sent_command) {
ret = SUCCESS;
break;
@@ -840,8 +840,8 @@ static int aac_eh_reset(struct scsi_cmnd* cmd)
  (fib_callback) aac_hba_callback,
  (void *) cmd);
 
-   /* Wait up to 2 minutes for completion */
-   for (count = 0; count < 120; ++count) {
+   /* Wait up to 15 seconds for completion */
+   for (count = 0; count < 15; ++count) {
if (cmd->SCp.sent_command) {
ret = SUCCESS;
break;
-- 
2.7.4



[PATCH 04/19] aacraid: Set correct Queue Depth for HBA1000 RAW disks

2017-05-07 Thread Raghava Aditya Renukunta
The default queue depth for non NATIVE RAW disks is calculated from the
number of fibs and number of disks or a max of 256. This causes poor disk
IO performance.

The fix is to set default qd based on the type of disks
(SATA -32 and SAS -64)

Signed-off-by: Raghava Aditya Renukunta 
---
 drivers/scsi/aacraid/linit.c | 28 
 1 file changed, 20 insertions(+), 8 deletions(-)

diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c
index 5e1a2d6..9ef98e4 100644
--- a/drivers/scsi/aacraid/linit.c
+++ b/drivers/scsi/aacraid/linit.c
@@ -405,17 +405,23 @@ static int aac_slave_configure(struct scsi_device *sdev)
int chn, tid;
unsigned int depth = 0;
unsigned int set_timeout = 0;
+   bool set_qd_dev_type = false;
+   u8 devtype = 0;
 
chn = aac_logical_to_phys(sdev_channel(sdev));
tid = sdev_id(sdev);
-   if (chn < AAC_MAX_BUSES && tid < AAC_MAX_TARGETS &&
-   aac->hba_map[chn][tid].devtype == AAC_DEVTYPE_NATIVE_RAW) {
-   depth = aac->hba_map[chn][tid].qd_limit;
+   if (chn < AAC_MAX_BUSES && tid < AAC_MAX_TARGETS && aac->sa_firmware) {
+   devtype = aac->hba_map[chn][tid].devtype;
+
+   if (devtype == AAC_DEVTYPE_NATIVE_RAW)
+   depth = aac->hba_map[chn][tid].qd_limit;
+   else if (devtype == AAC_DEVTYPE_ARC_RAW)
+   set_qd_dev_type = true;
+
set_timeout = 1;
goto common_config;
}
 
-
if (aac->jbod && (sdev->type == TYPE_DISK))
sdev->removable = 1;
 
@@ -470,16 +476,22 @@ static int aac_slave_configure(struct scsi_device *sdev)
if (sdev_channel(sdev) != NATIVE_CHANNEL)
goto common_config;
 
-   /*
-* Check if SATA drive
-*/
+   set_qd_dev_type = true;
+
+   }
+
+common_config:
+
+   /*
+* Check if SATA drive
+*/
+   if (set_qd_dev_type) {
if (strncmp(sdev->vendor, "ATA", 3) == 0)
depth = 32;
else
depth = 64;
}
 
-common_config:
/*
 * Firmware has an individual device recovery time typically
 * of 35 seconds, give us a margin.
-- 
2.7.4



[PATCH 17/19] aacraid : Add reset debugging statements

2017-05-07 Thread Raghava Aditya Renukunta
Added info and error messages in controller reset function to log
information about the status of the IOP/SOFT reset.

Signed-off-by: Raghava Aditya Renukunta 
---
 drivers/scsi/aacraid/src.c | 15 +++
 1 file changed, 11 insertions(+), 4 deletions(-)

diff --git a/drivers/scsi/aacraid/src.c b/drivers/scsi/aacraid/src.c
index 10a589b..5367d3f 100644
--- a/drivers/scsi/aacraid/src.c
+++ b/drivers/scsi/aacraid/src.c
@@ -761,8 +761,7 @@ static int aac_src_restart_adapter(struct aac_dev *dev, int 
bled, u8 reset_type)
goto invalid_out;
 
if (bled)
-   pr_err("%s%d: adapter kernel panic'd %x.\n",
-   dev->name, dev->id, bled);
+   dev_err(>pdev->dev, "adapter kernel panic'd %x.\n", bled);
 
/*
 * When there is a BlinkLED, IOP_RESET has not effect
@@ -772,7 +771,10 @@ static int aac_src_restart_adapter(struct aac_dev *dev, 
int bled, u8 reset_type)
 
dev->a_ops.adapter_enable_int = aac_src_disable_interrupt;
 
+   dev_err(>pdev->dev, "Controller reset type is %d\n", reset_type);
+
if (reset_type & HW_IOP_RESET) {
+   dev_info(>pdev->dev, "Issuing IOP reset\n");
aac_send_iop_reset(dev);
 
/*
@@ -781,16 +783,20 @@ static int aac_src_restart_adapter(struct aac_dev *dev, 
int bled, u8 reset_type)
is_ctrl_up = aac_is_ctrl_up_and_running(dev);
if (!is_ctrl_up)
dev_err(>pdev->dev, "IOP reset failed\n");
-   else
+   else {
+   dev_info(>pdev->dev, "IOP reset succeded\n");
goto set_startup;
+   }
}
 
if (!dev->sa_firmware) {
+   dev_err(>pdev->dev, "ARC Reset attempt failed\n");
ret = -ENODEV;
goto out;
}
 
if (reset_type & HW_SOFT_RESET) {
+   dev_info(>pdev->dev, "Issuing SOFT reset\n");
aac_send_hardware_soft_reset(dev);
dev->msi_enabled = 0;
 
@@ -799,7 +805,8 @@ static int aac_src_restart_adapter(struct aac_dev *dev, int 
bled, u8 reset_type)
dev_err(>pdev->dev, "SOFT reset failed\n");
ret = -ENODEV;
goto out;
-   }
+   } else
+   dev_info(>pdev->dev, "SOFT reset succeded\n");
}
 
 set_startup:
-- 
2.7.4



[PATCH 11/19] aacraid: Add periodic checks to see IOP reset status

2017-05-07 Thread Raghava Aditya Renukunta
Added function that waits with a timeout for the ctrl to be up and running
after triggering an IOP reset. Also removed 30 sec sleep as it is not
needed.

Signed-off-by: Raghava Aditya Renukunta 
---
 drivers/scsi/aacraid/aacraid.h |  1 +
 drivers/scsi/aacraid/src.c | 45 --
 2 files changed, 44 insertions(+), 2 deletions(-)

diff --git a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h
index 993f134..829f3d8 100644
--- a/drivers/scsi/aacraid/aacraid.h
+++ b/drivers/scsi/aacraid/aacraid.h
@@ -2519,6 +2519,7 @@ struct aac_hba_info {
 
 #defineSELF_TEST_FAILED0x0004
 #defineMONITOR_PANIC   0x0020
+#defineKERNEL_BOOTING  0x0040
 #defineKERNEL_UP_AND_RUNNING   0x0080
 #defineKERNEL_PANIC0x0100
 #defineFLASH_UPD_PENDING   0x2000
diff --git a/drivers/scsi/aacraid/src.c b/drivers/scsi/aacraid/src.c
index e8e9178..67185eb 100644
--- a/drivers/scsi/aacraid/src.c
+++ b/drivers/scsi/aacraid/src.c
@@ -694,6 +694,37 @@ static void aac_dump_fw_fib_iop_reset(struct aac_dev *dev)
0, 0, 0,  0, 0, 0, NULL, NULL, NULL, NULL, NULL);
 }
 
+static bool aac_is_ctrl_up_and_running(struct aac_dev *dev)
+{
+   bool ctrl_up = true;
+   unsigned long status, start;
+   bool is_up = false;
+
+   start = jiffies;
+   do {
+   schedule();
+   status = src_readl(dev, MUnit.OMR);
+
+   if (status == 0x)
+   status = 0;
+
+   if (status & KERNEL_BOOTING) {
+   start = jiffies;
+   continue;
+   }
+
+   if (time_after(jiffies, start+HZ*SOFT_RESET_TIME)) {
+   ctrl_up = false;
+   break;
+   }
+
+   is_up = status & KERNEL_UP_AND_RUNNING;
+
+   } while (!is_up);
+
+   return ctrl_up;
+}
+
 static void aac_notify_fw_of_iop_reset(struct aac_dev *dev)
 {
aac_adapter_sync_cmd(dev, IOP_RESET_ALWAYS, 0, 0, 0, 0, 0, 0, NULL,
@@ -709,8 +740,6 @@ static void aac_send_iop_reset(struct aac_dev *dev)
aac_set_intx_mode(dev);
 
src_writel(dev, MUnit.IDR, IOP_SRC_RESET_MASK);
-
-   msleep(3);
 }
 
 static void aac_send_hardware_soft_reset(struct aac_dev *dev)
@@ -726,6 +755,7 @@ static void aac_send_hardware_soft_reset(struct aac_dev 
*dev)
 static int aac_src_restart_adapter(struct aac_dev *dev, int bled, u8 
reset_type)
 {
unsigned long status, start;
+   bool is_ctrl_up;
 
if (bled < 0)
goto invalid_out;
@@ -745,6 +775,16 @@ static int aac_src_restart_adapter(struct aac_dev *dev, 
int bled, u8 reset_type)
switch (reset_type) {
case IOP_HWSOFT_RESET:
aac_send_iop_reset(dev);
+
+   /*
+* Creates a delay or wait till up and running comes thru
+*/
+   is_ctrl_up = aac_is_ctrl_up_and_running(dev);
+   if (!is_ctrl_up)
+   dev_err(>pdev->dev, "IOP reset failed\n");
+   else
+   goto set_startup;
+
/*
 * Check to see if KERNEL_UP_AND_RUNNING
 * Wait for the adapter to be up and running.
@@ -780,6 +820,7 @@ static int aac_src_restart_adapter(struct aac_dev *dev, int 
bled, u8 reset_type)
if (src_readl(dev, MUnit.OMR) & KERNEL_PANIC)
return -ENODEV;
 
+set_startup:
if (startup_timeout < 300)
startup_timeout = 300;
 
-- 
2.7.4



[PATCH 08/19] aacraid: Print ctrl status before eh reset

2017-05-07 Thread Raghava Aditya Renukunta
Log the status of the controller before issuing a reset.

Signed-off-by: Raghava Aditya Renukunta 
---
 drivers/scsi/aacraid/linit.c | 9 +
 1 file changed, 9 insertions(+)

diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c
index 0a8d303..3dea438 100644
--- a/drivers/scsi/aacraid/linit.c
+++ b/drivers/scsi/aacraid/linit.c
@@ -827,6 +827,7 @@ static int aac_eh_reset(struct scsi_cmnd* cmd)
int count;
u32 bus, cid;
int ret = FAILED;
+   int status = 0;
 
bus = aac_logical_to_phys(scmd_channel(cmd));
cid = scmd_id(cmd);
@@ -921,6 +922,14 @@ static int aac_eh_reset(struct scsi_cmnd* cmd)
pr_err("%s: Host adapter reset request. SCSI hang ?\n",
AAC_DRIVERNAME);
 
+   /*
+* Check the health of the controller
+*/
+   status = aac_adapter_check_health(aac);
+   if (status)
+   dev_err(>pdev->dev, "Adapter health - %d\n",
+   status);
+
count = get_num_of_incomplete_fibs(aac);
if (count == 0)
return SUCCESS;
-- 
2.7.4



[PATCH 15/19] aacraid: Make sure ioctl returns on controller reset

2017-05-07 Thread Raghava Aditya Renukunta
Made sure that ioctl commands return in case of a controller reset.

Signed-off-by: Raghava Aditya Renukunta 
---
 drivers/scsi/aacraid/commsup.c | 20 +---
 1 file changed, 17 insertions(+), 3 deletions(-)

diff --git a/drivers/scsi/aacraid/commsup.c b/drivers/scsi/aacraid/commsup.c
index f26543a..a026790 100644
--- a/drivers/scsi/aacraid/commsup.c
+++ b/drivers/scsi/aacraid/commsup.c
@@ -804,10 +804,13 @@ int aac_hba_send(u8 command, struct fib *fibptr, 
fib_callback callback,
return -EFAULT;
 
/* Only set for first known interruptable command */
+   fibptr->flags |= FIB_CONTEXT_FLAG_WAIT;
+   fibptr->flags &= ~(FIB_CONTEXT_FLAG_WAIT);
if (down_interruptible(>event_wait)) {
fibptr->done = 2;
up(>event_wait);
}
+
spin_lock_irqsave(>event_lock, flags);
if ((fibptr->done == 0) || (fibptr->done == 2)) {
fibptr->done = 2; /* Tell interrupt we aborted */
@@ -1514,6 +1517,7 @@ static int _aac_reset_adapter(struct aac_dev *aac, int 
forced, u8 reset_type)
int jafo = 0;
int bled;
u64 dmamask;
+   int num_of_fibs = 0;
 
/*
 * Assumptions:
@@ -1547,10 +1551,20 @@ static int _aac_reset_adapter(struct aac_dev *aac, int 
forced, u8 reset_type)
/*
 *  Loop through the fibs, close the synchronous FIBS
 */
-   for (retval = 1, index = 0; index < (aac->scsi_host_ptr->can_queue + 
AAC_NUM_MGT_FIB); index++) {
+   retval = 1;
+   num_of_fibs = aac->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB;
+   for (index = 0; index <  num_of_fibs; index++) {
+
struct fib *fib = >fibs[index];
-   if (!(fib->hw_fib_va->header.XferState & 
cpu_to_le32(NoResponseExpected | Async)) &&
- (fib->hw_fib_va->header.XferState & 
cpu_to_le32(ResponseExpected))) {
+   __le32 XferState = fib->hw_fib_va->header.XferState;
+   bool is_response_expected = false;
+
+   if (!(XferState & cpu_to_le32(NoResponseExpected | Async)) &&
+  (XferState & cpu_to_le32(ResponseExpected)))
+   is_response_expected = true;
+
+   if (is_response_expected
+ || fib->flags & FIB_CONTEXT_FLAG_WAIT) {
unsigned long flagv;
spin_lock_irqsave(>event_lock, flagv);
up(>event_wait);
-- 
2.7.4



[PATCH 12/19] aacraid: Rework SOFT reset code

2017-05-07 Thread Raghava Aditya Renukunta
Now the driver issues a soft reset and waits for the controller to be up
and running by periodically checking on the status of the controller
health registers. Also prevents ARC adapters from issuing soft reset if
IOP resets failed.

Signed-off-by: Raghava Aditya Renukunta 
---
 drivers/scsi/aacraid/src.c | 38 ++
 1 file changed, 18 insertions(+), 20 deletions(-)

diff --git a/drivers/scsi/aacraid/src.c b/drivers/scsi/aacraid/src.c
index 67185eb..8ed7be0 100644
--- a/drivers/scsi/aacraid/src.c
+++ b/drivers/scsi/aacraid/src.c
@@ -754,8 +754,8 @@ static void aac_send_hardware_soft_reset(struct aac_dev 
*dev)
 
 static int aac_src_restart_adapter(struct aac_dev *dev, int bled, u8 
reset_type)
 {
-   unsigned long status, start;
bool is_ctrl_up;
+   int ret = 0;
 
if (bled < 0)
goto invalid_out;
@@ -785,24 +785,21 @@ static int aac_src_restart_adapter(struct aac_dev *dev, 
int bled, u8 reset_type)
else
goto set_startup;
 
-   /*
-* Check to see if KERNEL_UP_AND_RUNNING
-* Wait for the adapter to be up and running.
-* If !KERNEL_UP_AND_RUNNING issue HW Soft Reset
-*/
-   status = src_readl(dev, MUnit.OMR);
-   if (dev->sa_firmware
-&& !(status & KERNEL_UP_AND_RUNNING)) {
-   start = jiffies;
-   do {
-   status = src_readl(dev, MUnit.OMR);
-   if (time_after(jiffies,
-start+HZ*SOFT_RESET_TIME)) {
-   aac_send_hardware_soft_reset(dev);
-   start = jiffies;
-   }
-   } while (!(status & KERNEL_UP_AND_RUNNING));
+   if (!dev->sa_firmware) {
+   ret = -ENODEV;
+   goto out;
}
+
+   aac_send_hardware_soft_reset(dev);
+   dev->msi_enabled = 0;
+
+   is_ctrl_up = aac_is_ctrl_up_and_running(dev);
+   if (!is_ctrl_up) {
+   dev_err(>pdev->dev, "SOFT reset failed\n");
+   ret = -ENODEV;
+   goto out;
+   }
+
break;
case HW_SOFT_RESET:
if (dev->sa_firmware) {
@@ -818,13 +815,14 @@ static int aac_src_restart_adapter(struct aac_dev *dev, 
int bled, u8 reset_type)
 invalid_out:
 
if (src_readl(dev, MUnit.OMR) & KERNEL_PANIC)
-   return -ENODEV;
+   ret = -ENODEV;
 
 set_startup:
if (startup_timeout < 300)
startup_timeout = 300;
 
-   return 0;
+out:
+   return ret;
 }
 
 /**
-- 
2.7.4



[PATCH 02/19] aacraid: Fix DMAR issues with iommu=pt

2017-05-07 Thread Raghava Aditya Renukunta
The driver changed the DMA consistent map after consistent memory was
allocated, this invalidated the IOMMU identity mapping. The fix was to
make sure that we set the DMA consistent mask setting once depending on
the controller card.

Signed-off-by: Raghava Aditya Renukunta 
---
 drivers/scsi/aacraid/aachba.c  | 17 ++---
 drivers/scsi/aacraid/commsup.c | 29 ++---
 drivers/scsi/aacraid/linit.c   | 32 +++-
 3 files changed, 43 insertions(+), 35 deletions(-)

diff --git a/drivers/scsi/aacraid/aachba.c b/drivers/scsi/aacraid/aachba.c
index 43d8838..707ee2f 100644
--- a/drivers/scsi/aacraid/aachba.c
+++ b/drivers/scsi/aacraid/aachba.c
@@ -2071,20 +2071,15 @@ int aac_get_adapter_info(struct aac_dev* dev)
expose_physicals = 0;
}
 
-   if(dev->dac_support != 0) {
-   if (!pci_set_dma_mask(dev->pdev, DMA_BIT_MASK(64)) &&
-   !pci_set_consistent_dma_mask(dev->pdev, 
DMA_BIT_MASK(64))) {
+   if (dev->dac_support) {
+   if (!pci_set_dma_mask(dev->pdev, DMA_BIT_MASK(64))) {
if (!dev->in_reset)
-   printk(KERN_INFO"%s%d: 64 Bit DAC enabled\n",
-   dev->name, dev->id);
-   } else if (!pci_set_dma_mask(dev->pdev, DMA_BIT_MASK(32)) &&
-   !pci_set_consistent_dma_mask(dev->pdev, 
DMA_BIT_MASK(32))) {
-   printk(KERN_INFO"%s%d: DMA mask set failed, 64 Bit DAC 
disabled\n",
-   dev->name, dev->id);
+   dev_info(>pdev->dev, "64 Bit DAC 
enabled\n");
+   } else if (!pci_set_dma_mask(dev->pdev, DMA_BIT_MASK(32))) {
+   dev_info(>pdev->dev, "DMA mask set failed, 64 Bit 
DAC disabled\n");
dev->dac_support = 0;
} else {
-   printk(KERN_WARNING"%s%d: No suitable DMA available.\n",
-   dev->name, dev->id);
+   dev_info(>pdev->dev, "No suitable DMA 
available\n");
rcode = -ENOMEM;
}
}
diff --git a/drivers/scsi/aacraid/commsup.c b/drivers/scsi/aacraid/commsup.c
index d08920d..47068b2 100644
--- a/drivers/scsi/aacraid/commsup.c
+++ b/drivers/scsi/aacraid/commsup.c
@@ -1513,6 +1513,7 @@ static int _aac_reset_adapter(struct aac_dev *aac, int 
forced, u8 reset_type)
struct scsi_cmnd *command_list;
int jafo = 0;
int bled;
+   u64 dmamask;
 
/*
 * Assumptions:
@@ -1580,21 +1581,27 @@ static int _aac_reset_adapter(struct aac_dev *aac, int 
forced, u8 reset_type)
aac_free_irq(aac);
kfree(aac->fsa_dev);
aac->fsa_dev = NULL;
+
+   dmamask = DMA_BIT_MASK(32);
quirks = aac_get_driver_ident(index)->quirks;
-   if (quirks & AAC_QUIRK_31BIT) {
-   if (((retval = pci_set_dma_mask(aac->pdev, DMA_BIT_MASK(31 
||
- ((retval = pci_set_consistent_dma_mask(aac->pdev, 
DMA_BIT_MASK(31)
-   goto out;
-   } else {
-   if (((retval = pci_set_dma_mask(aac->pdev, DMA_BIT_MASK(32 
||
- ((retval = pci_set_consistent_dma_mask(aac->pdev, 
DMA_BIT_MASK(32)
-   goto out;
+   if (quirks & AAC_QUIRK_31BIT)
+   retval = pci_set_dma_mask(aac->pdev, dmamask);
+   else if (!(quirks & AAC_QUIRK_SRC))
+   retval = pci_set_dma_mask(aac->pdev, dmamask);
+   else
+   retval = pci_set_consistent_dma_mask(aac->pdev, dmamask);
+
+   if (quirks & AAC_QUIRK_31BIT && !retval) {
+   dmamask = DMA_BIT_MASK(31);
+   retval = pci_set_consistent_dma_mask(aac->pdev, dmamask);
}
+
+   if (retval)
+   goto out;
+
if ((retval = (*(aac_get_driver_ident(index)->init))(aac)))
goto out;
-   if (quirks & AAC_QUIRK_31BIT)
-   if ((retval = pci_set_dma_mask(aac->pdev, DMA_BIT_MASK(32
-   goto out;
+
if (jafo) {
aac->thread = kthread_run(aac_command_thread, aac, "%s",
  aac->name);
diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c
index 372a075..5a201da 100644
--- a/drivers/scsi/aacraid/linit.c
+++ b/drivers/scsi/aacraid/linit.c
@@ -1403,6 +1403,7 @@ static int aac_probe_one(struct pci_dev *pdev, const 
struct pci_device_id *id)
int error = -ENODEV;
int unique_id = 0;
u64 dmamask;
+   int mask_bits = 0;
extern int aac_sync_mode;
 
/*
@@ -1426,18 +1427,32 @@ static int aac_probe_one(struct pci_dev *pdev, const 
struct pci_device_id *id)
goto out;
error = -ENODEV;
 
+   if (!(aac_drivers[index].quirks & AAC_QUIRK_SRC)) {
+   

[PATCH 18/19] aacraid: Remove reference to Series-9

2017-05-07 Thread Raghava Aditya Renukunta
Removed reference to Series-9 HBA and created arc ctrl check function.

Signed-off-by: Prasad B Munirathnam 
Signed-off-by: Raghava Aditya Renukunta 
---
 drivers/scsi/aacraid/aacraid.h  | 13 -
 drivers/scsi/aacraid/comminit.c | 18 --
 drivers/scsi/aacraid/commsup.c  |  5 +
 drivers/scsi/aacraid/linit.c|  9 ++---
 4 files changed, 19 insertions(+), 26 deletions(-)

diff --git a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h
index 829f3d8..58ccd2a 100644
--- a/drivers/scsi/aacraid/aacraid.h
+++ b/drivers/scsi/aacraid/aacraid.h
@@ -424,7 +424,6 @@ struct aac_ciss_identify_pd {
 #define PMC_DEVICE_S6  0x28b
 #define PMC_DEVICE_S7  0x28c
 #define PMC_DEVICE_S8  0x28d
-#define PMC_DEVICE_S9  0x28f
 
 #define aac_phys_to_logical(x)  ((x)+1)
 #define aac_logical_to_phys(x)  ((x)?(x)-1:0)
@@ -2684,6 +2683,18 @@ int aac_probe_container(struct aac_dev *dev, int cid);
 int _aac_rx_init(struct aac_dev *dev);
 int aac_rx_select_comm(struct aac_dev *dev, int comm);
 int aac_rx_deliver_producer(struct fib * fib);
+
+static inline int aac_is_src(struct aac_dev *dev)
+{
+   u16 device = dev->pdev->device;
+
+   if (device == PMC_DEVICE_S6 ||
+   device == PMC_DEVICE_S7 ||
+   device == PMC_DEVICE_S8)
+   return 1;
+   return 0;
+}
+
 char * get_container_type(unsigned type);
 extern int numacb;
 extern char aac_driver_version[];
diff --git a/drivers/scsi/aacraid/comminit.c b/drivers/scsi/aacraid/comminit.c
index 1151505..9ee025b 100644
--- a/drivers/scsi/aacraid/comminit.c
+++ b/drivers/scsi/aacraid/comminit.c
@@ -53,11 +53,8 @@ static inline int aac_is_msix_mode(struct aac_dev *dev)
 {
u32 status = 0;
 
-   if (dev->pdev->device == PMC_DEVICE_S6 ||
-   dev->pdev->device == PMC_DEVICE_S7 ||
-   dev->pdev->device == PMC_DEVICE_S8) {
+   if (aac_is_src(dev))
status = src_readl(dev, MUnit.OMR);
-   }
return (status & AAC_INT_MODE_MSIX);
 }
 
@@ -325,9 +322,7 @@ int aac_send_shutdown(struct aac_dev * dev)
/* FIB should be freed only after getting the response from the F/W */
if (status != -ERESTARTSYS)
aac_fib_free(fibctx);
-   if ((dev->pdev->device == PMC_DEVICE_S7 ||
-dev->pdev->device == PMC_DEVICE_S8 ||
-dev->pdev->device == PMC_DEVICE_S9) &&
+   if (aac_is_src(dev) &&
 dev->msi_enabled)
aac_set_intx_mode(dev);
return status;
@@ -583,9 +578,7 @@ struct aac_dev *aac_init_adapter(struct aac_dev *dev)
dev->max_fib_size = status[1] & 0xFFE0;
host->sg_tablesize = status[2] >> 16;
dev->sg_tablesize = status[2] & 0x;
-   if (dev->pdev->device == PMC_DEVICE_S7 ||
-   dev->pdev->device == PMC_DEVICE_S8 ||
-   dev->pdev->device == PMC_DEVICE_S9) {
+   if (aac_is_src(dev)) {
if (host->can_queue > (status[3] >> 16) -
AAC_NUM_MGT_FIB)
host->can_queue = (status[3] >> 16) -
@@ -604,10 +597,7 @@ struct aac_dev *aac_init_adapter(struct aac_dev *dev)
pr_warn("numacb=%d ignored\n", numacb);
}
 
-   if (dev->pdev->device == PMC_DEVICE_S6 ||
-   dev->pdev->device == PMC_DEVICE_S7 ||
-   dev->pdev->device == PMC_DEVICE_S8 ||
-   dev->pdev->device == PMC_DEVICE_S9)
+   if (aac_is_src(dev))
aac_define_int_mode(dev);
/*
 *  Ok now init the communication subsystem
diff --git a/drivers/scsi/aacraid/commsup.c b/drivers/scsi/aacraid/commsup.c
index a026790..184e9cf 100644
--- a/drivers/scsi/aacraid/commsup.c
+++ b/drivers/scsi/aacraid/commsup.c
@@ -2595,10 +2595,7 @@ void aac_free_irq(struct aac_dev *dev)
int cpu;
 
cpu = cpumask_first(cpu_online_mask);
-   if (dev->pdev->device == PMC_DEVICE_S6 ||
-   dev->pdev->device == PMC_DEVICE_S7 ||
-   dev->pdev->device == PMC_DEVICE_S8 ||
-   dev->pdev->device == PMC_DEVICE_S9) {
+   if (aac_is_src(dev)) {
if (dev->max_msix > 1) {
for (i = 0; i < dev->max_msix; i++)
free_irq(pci_irq_vector(dev->pdev, i),
diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c
index d933d2f..0f277df 100644
--- a/drivers/scsi/aacraid/linit.c
+++ b/drivers/scsi/aacraid/linit.c
@@ -1416,10 +1416,7 @@ static void __aac_shutdown(struct aac_dev * aac)
kthread_stop(aac->thread);
}
aac_adapter_disable_int(aac);
-   if (aac->pdev->device == PMC_DEVICE_S6 ||
-   aac->pdev->device == PMC_DEVICE_S7 ||
-   aac->pdev->device == PMC_DEVICE_S8 ||
-   aac->pdev->device == PMC_DEVICE_S9) {
+   if 

[PATCH 10/19] aacraid: Rework IOP reset

2017-05-07 Thread Raghava Aditya Renukunta
Reworked IOP reset to remove unneeded variable and created a helper
function to notify fw of an imminent IOP reset.

Signed-off-by: Raghava Aditya Renukunta 
---
 drivers/scsi/aacraid/src.c | 16 +---
 1 file changed, 9 insertions(+), 7 deletions(-)

diff --git a/drivers/scsi/aacraid/src.c b/drivers/scsi/aacraid/src.c
index c0e5242..e8e9178 100644
--- a/drivers/scsi/aacraid/src.c
+++ b/drivers/scsi/aacraid/src.c
@@ -694,15 +694,17 @@ static void aac_dump_fw_fib_iop_reset(struct aac_dev *dev)
0, 0, 0,  0, 0, 0, NULL, NULL, NULL, NULL, NULL);
 }
 
-static void aac_send_iop_reset(struct aac_dev *dev, int bled)
+static void aac_notify_fw_of_iop_reset(struct aac_dev *dev)
 {
-   u32 var, reset_mask;
+   aac_adapter_sync_cmd(dev, IOP_RESET_ALWAYS, 0, 0, 0, 0, 0, 0, NULL,
+   NULL, NULL, NULL, NULL);
+}
 
+static void aac_send_iop_reset(struct aac_dev *dev)
+{
aac_dump_fw_fib_iop_reset(dev);
 
-   bled = aac_adapter_sync_cmd(dev, IOP_RESET_ALWAYS,
-   0, 0, 0, 0, 0, 0, ,
-   _mask, NULL, NULL, NULL);
+   aac_notify_fw_of_iop_reset(dev);
 
aac_set_intx_mode(dev);
 
@@ -742,7 +744,7 @@ static int aac_src_restart_adapter(struct aac_dev *dev, int 
bled, u8 reset_type)
 
switch (reset_type) {
case IOP_HWSOFT_RESET:
-   aac_send_iop_reset(dev, bled);
+   aac_send_iop_reset(dev);
/*
 * Check to see if KERNEL_UP_AND_RUNNING
 * Wait for the adapter to be up and running.
@@ -769,7 +771,7 @@ static int aac_src_restart_adapter(struct aac_dev *dev, int 
bled, u8 reset_type)
}
break;
default:
-   aac_send_iop_reset(dev, bled);
+   aac_send_iop_reset(dev);
break;
}
 
-- 
2.7.4



[PATCH 03/19] aacraid: Added 32 and 64 queue depth for arc natives

2017-05-07 Thread Raghava Aditya Renukunta
The qd for ARC Native disks is calculated by dividing the max IO 1024
by the number of disks or 256 which ever is lower. This causes poor
disk IO performance.

The fix is set the qd based on the type of disk (SAS - 64 and SATA -
32).

Signed-off-by: Raghava Aditya Renukunta 
---
 drivers/scsi/aacraid/aacraid.h |  1 +
 drivers/scsi/aacraid/linit.c   | 11 +++
 2 files changed, 12 insertions(+)

diff --git a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h
index d036a80..3ede6de 100644
--- a/drivers/scsi/aacraid/aacraid.h
+++ b/drivers/scsi/aacraid/aacraid.h
@@ -415,6 +415,7 @@ struct aac_ciss_identify_pd {
  * These macros convert from physical channels to virtual channels
  */
 #define CONTAINER_CHANNEL  (0)
+#define NATIVE_CHANNEL (1)
 #define CONTAINER_TO_CHANNEL(cont) (CONTAINER_CHANNEL)
 #define CONTAINER_TO_ID(cont)  (cont)
 #define CONTAINER_TO_LUN(cont) (0)
diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c
index 5a201da..5e1a2d6 100644
--- a/drivers/scsi/aacraid/linit.c
+++ b/drivers/scsi/aacraid/linit.c
@@ -466,6 +466,17 @@ static int aac_slave_configure(struct scsi_device *sdev)
++num_lsu;
 
depth = (host->can_queue - num_one) / num_lsu;
+
+   if (sdev_channel(sdev) != NATIVE_CHANNEL)
+   goto common_config;
+
+   /*
+* Check if SATA drive
+*/
+   if (strncmp(sdev->vendor, "ATA", 3) == 0)
+   depth = 32;
+   else
+   depth = 64;
}
 
 common_config:
-- 
2.7.4



[PATCH 17/19] aacraid : Add reset debugging statements

2017-05-07 Thread Raghava Aditya Renukunta
Added info and error messages in controller reset function to log
information about the status of the IOP/SOFT reset.

Signed-off-by: Raghava Aditya Renukunta 
---
 drivers/scsi/aacraid/src.c | 15 +++
 1 file changed, 11 insertions(+), 4 deletions(-)

diff --git a/drivers/scsi/aacraid/src.c b/drivers/scsi/aacraid/src.c
index 10a589b..5367d3f 100644
--- a/drivers/scsi/aacraid/src.c
+++ b/drivers/scsi/aacraid/src.c
@@ -761,8 +761,7 @@ static int aac_src_restart_adapter(struct aac_dev *dev, int 
bled, u8 reset_type)
goto invalid_out;
 
if (bled)
-   pr_err("%s%d: adapter kernel panic'd %x.\n",
-   dev->name, dev->id, bled);
+   dev_err(>pdev->dev, "adapter kernel panic'd %x.\n", bled);
 
/*
 * When there is a BlinkLED, IOP_RESET has not effect
@@ -772,7 +771,10 @@ static int aac_src_restart_adapter(struct aac_dev *dev, 
int bled, u8 reset_type)
 
dev->a_ops.adapter_enable_int = aac_src_disable_interrupt;
 
+   dev_err(>pdev->dev, "Controller reset type is %d\n", reset_type);
+
if (reset_type & HW_IOP_RESET) {
+   dev_info(>pdev->dev, "Issuing IOP reset\n");
aac_send_iop_reset(dev);
 
/*
@@ -781,16 +783,20 @@ static int aac_src_restart_adapter(struct aac_dev *dev, 
int bled, u8 reset_type)
is_ctrl_up = aac_is_ctrl_up_and_running(dev);
if (!is_ctrl_up)
dev_err(>pdev->dev, "IOP reset failed\n");
-   else
+   else {
+   dev_info(>pdev->dev, "IOP reset succeded\n");
goto set_startup;
+   }
}
 
if (!dev->sa_firmware) {
+   dev_err(>pdev->dev, "ARC Reset attempt failed\n");
ret = -ENODEV;
goto out;
}
 
if (reset_type & HW_SOFT_RESET) {
+   dev_info(>pdev->dev, "Issuing SOFT reset\n");
aac_send_hardware_soft_reset(dev);
dev->msi_enabled = 0;
 
@@ -799,7 +805,8 @@ static int aac_src_restart_adapter(struct aac_dev *dev, int 
bled, u8 reset_type)
dev_err(>pdev->dev, "SOFT reset failed\n");
ret = -ENODEV;
goto out;
-   }
+   } else
+   dev_info(>pdev->dev, "SOFT reset succeded\n");
}
 
 set_startup:
-- 
2.7.4



[PATCH 14/19] aacraid: Use correct function to get ctrl health

2017-05-07 Thread Raghava Aditya Renukunta
The command thread checks the ctrl health periodically before sending
updates to the controller. The function that it uses is aac_check_health
which does more than get the health status.

Signed-off-by: Raghava Aditya Renukunta 
---
 drivers/scsi/aacraid/commsup.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/scsi/aacraid/commsup.c b/drivers/scsi/aacraid/commsup.c
index 3299012..f26543a 100644
--- a/drivers/scsi/aacraid/commsup.c
+++ b/drivers/scsi/aacraid/commsup.c
@@ -2476,7 +2476,7 @@ int aac_command_thread(void *data)
if ((time_before(next_check_jiffies,next_jiffies))
 && ((difference = next_check_jiffies - jiffies) <= 0)) {
next_check_jiffies = next_jiffies;
-   if (aac_check_health(dev) == 0) {
+   if (aac_adapter_check_health(dev) == 0) {
difference = ((long)(unsigned)check_interval)
   * HZ;
next_check_jiffies = jiffies + difference;
@@ -2489,7 +2489,7 @@ int aac_command_thread(void *data)
int ret;
 
/* Don't even try to talk to adapter if its sick */
-   ret = aac_check_health(dev);
+   ret = aac_adapter_check_health(dev);
if (ret || !dev->queues)
break;
next_check_jiffies = jiffies
-- 
2.7.4



[PATCH 12/19] aacraid: Rework SOFT reset code

2017-05-07 Thread Raghava Aditya Renukunta
Now the driver issues a soft reset and waits for the controller to be up
and running by periodically checking on the status of the controller
health registers. Also prevents ARC adapters from issuing soft reset if
IOP resets failed.

Signed-off-by: Raghava Aditya Renukunta 
---
 drivers/scsi/aacraid/src.c | 38 ++
 1 file changed, 18 insertions(+), 20 deletions(-)

diff --git a/drivers/scsi/aacraid/src.c b/drivers/scsi/aacraid/src.c
index 67185eb..8ed7be0 100644
--- a/drivers/scsi/aacraid/src.c
+++ b/drivers/scsi/aacraid/src.c
@@ -754,8 +754,8 @@ static void aac_send_hardware_soft_reset(struct aac_dev 
*dev)
 
 static int aac_src_restart_adapter(struct aac_dev *dev, int bled, u8 
reset_type)
 {
-   unsigned long status, start;
bool is_ctrl_up;
+   int ret = 0;
 
if (bled < 0)
goto invalid_out;
@@ -785,24 +785,21 @@ static int aac_src_restart_adapter(struct aac_dev *dev, 
int bled, u8 reset_type)
else
goto set_startup;
 
-   /*
-* Check to see if KERNEL_UP_AND_RUNNING
-* Wait for the adapter to be up and running.
-* If !KERNEL_UP_AND_RUNNING issue HW Soft Reset
-*/
-   status = src_readl(dev, MUnit.OMR);
-   if (dev->sa_firmware
-&& !(status & KERNEL_UP_AND_RUNNING)) {
-   start = jiffies;
-   do {
-   status = src_readl(dev, MUnit.OMR);
-   if (time_after(jiffies,
-start+HZ*SOFT_RESET_TIME)) {
-   aac_send_hardware_soft_reset(dev);
-   start = jiffies;
-   }
-   } while (!(status & KERNEL_UP_AND_RUNNING));
+   if (!dev->sa_firmware) {
+   ret = -ENODEV;
+   goto out;
}
+
+   aac_send_hardware_soft_reset(dev);
+   dev->msi_enabled = 0;
+
+   is_ctrl_up = aac_is_ctrl_up_and_running(dev);
+   if (!is_ctrl_up) {
+   dev_err(>pdev->dev, "SOFT reset failed\n");
+   ret = -ENODEV;
+   goto out;
+   }
+
break;
case HW_SOFT_RESET:
if (dev->sa_firmware) {
@@ -818,13 +815,14 @@ static int aac_src_restart_adapter(struct aac_dev *dev, 
int bled, u8 reset_type)
 invalid_out:
 
if (src_readl(dev, MUnit.OMR) & KERNEL_PANIC)
-   return -ENODEV;
+   ret = -ENODEV;
 
 set_startup:
if (startup_timeout < 300)
startup_timeout = 300;
 
-   return 0;
+out:
+   return ret;
 }
 
 /**
-- 
2.7.4



[PATCH 06/19] aacraid: Change wait time for fib completion

2017-05-07 Thread Raghava Aditya Renukunta
Change the completion wait time for the fibs in the reset and abort
callback from 2 minutes to 15 seconds.

2 minutes is too long for waiting for completion.

Signed-off-by: Raghava Aditya Renukunta 
---
 drivers/scsi/aacraid/linit.c | 8 
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c
index 9ef98e4..f6a11af 100644
--- a/drivers/scsi/aacraid/linit.c
+++ b/drivers/scsi/aacraid/linit.c
@@ -684,8 +684,8 @@ static int aac_eh_abort(struct scsi_cmnd* cmd)
  (fib_callback) aac_hba_callback,
  (void *) cmd);
 
-   /* Wait up to 2 minutes for completion */
-   for (count = 0; count < 120; ++count) {
+   /* Wait up to 15 secs for completion */
+   for (count = 0; count < 15; ++count) {
if (cmd->SCp.sent_command) {
ret = SUCCESS;
break;
@@ -840,8 +840,8 @@ static int aac_eh_reset(struct scsi_cmnd* cmd)
  (fib_callback) aac_hba_callback,
  (void *) cmd);
 
-   /* Wait up to 2 minutes for completion */
-   for (count = 0; count < 120; ++count) {
+   /* Wait up to 15 seconds for completion */
+   for (count = 0; count < 15; ++count) {
if (cmd->SCp.sent_command) {
ret = SUCCESS;
break;
-- 
2.7.4



[PATCH 09/19] aacraid: Using single reset mask for IOP reset

2017-05-07 Thread Raghava Aditya Renukunta
The driver can now trigger IOP reset with a single reset mask. Removed
code that retrieves a reset_mask from the firmware.

Signed-off-by: Raghava Aditya Renukunta 
---
 drivers/scsi/aacraid/aacraid.h |  5 -
 drivers/scsi/aacraid/src.c | 16 ++--
 2 files changed, 6 insertions(+), 15 deletions(-)

diff --git a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h
index 3ede6de..993f134 100644
--- a/drivers/scsi/aacraid/aacraid.h
+++ b/drivers/scsi/aacraid/aacraid.h
@@ -2381,6 +2381,7 @@ struct revision
 #define SOFT_RESET_TIME60
 
 
+
 struct aac_common
 {
/*
@@ -2491,7 +2492,9 @@ struct aac_hba_info {
 #define IOP_RESET_FW_FIB_DUMP  0x0034
 #define IOP_RESET  0x1000
 #define IOP_RESET_ALWAYS   0x1001
-#define RE_INIT_ADAPTER0x00ee
+#define RE_INIT_ADAPTER0x00ee
+
+#define IOP_SRC_RESET_MASK 0x0100
 
 /*
  * Adapter Status Register
diff --git a/drivers/scsi/aacraid/src.c b/drivers/scsi/aacraid/src.c
index 2e5338d..c0e5242 100644
--- a/drivers/scsi/aacraid/src.c
+++ b/drivers/scsi/aacraid/src.c
@@ -704,22 +704,10 @@ static void aac_send_iop_reset(struct aac_dev *dev, int 
bled)
0, 0, 0, 0, 0, 0, ,
_mask, NULL, NULL, NULL);
 
-   if ((bled || var != 0x0001) && !dev->doorbell_mask)
-   bled = -EINVAL;
-   else if (dev->doorbell_mask) {
-   reset_mask = dev->doorbell_mask;
-   bled = 0;
-   var = 0x0001;
-   }
-
aac_set_intx_mode(dev);
 
-   if (!bled && (dev->supplement_adapter_info.supported_options2 &
-   AAC_OPTION_DOORBELL_RESET)) {
-   src_writel(dev, MUnit.IDR, reset_mask);
-   } else {
-   src_writel(dev, MUnit.IDR, 0x100);
-   }
+   src_writel(dev, MUnit.IDR, IOP_SRC_RESET_MASK);
+
msleep(3);
 }
 
-- 
2.7.4



[PATCH 00/19] aacraid: Patchset with reset rework and misc fixes

2017-05-07 Thread Raghava Aditya Renukunta
This patchset primarily focuses on tweaking and hardening the controller
reset support for both ARC and HBA1000 devices. Now the driver can only
reset the controller thru eh reset. Included a srb memory fix and pci
dma allocation fix.

Raghava Aditya Renukunta (19):
 [SCSI] aacraid: Remove GFP_DMA for raw srb memory
 [SCSI] aacraid: Fix DMAR issues with  iommu=pt
 [SCSI] aacraid: Added 32 and 64 queue depth for arc natives
 [SCSI] aacraid: Set correct Queue Depth for HBA1000 RAW disks
 [SCSI] aacraid: Remove reset support from check_health
 [SCSI] aacraid: Change wait time for fib completion
 [SCSI] aacraid: Log count info of scsi cmds before reset
 [SCSI] aacraid: Print ctrl status before eh reset
 [SCSI] aacraid: Using single reset mask for IOP reset
 [SCSI] aacraid: Rework IOP reset
 [SCSI] aacraid: Add periodic checks to see IOP reset status
 [SCSI] aacraid: Rework SOFT reset code
 [SCSI] aacraid: Rework aac_src_restart
 [SCSI] aacraid: Use correct function to get ctrl health
 [SCSI] aacraid: Make sure ioctl returns on controller reset
 [SCSI] aacraid: Enable ctrl reset for both hba and arc
 [SCSI] aacraid: Add reset debugging statements
 [SCSI] aacraid: Remove reference to Series-9
 [SCSI] aacraid: Update driver version to 50834

 drivers/scsi/aacraid/aachba.c   |  17 ++-
 drivers/scsi/aacraid/aacraid.h  |  22 +++-
 drivers/scsi/aacraid/commctrl.c |  13 ++-
 drivers/scsi/aacraid/comminit.c |  18 +---
 drivers/scsi/aacraid/commsup.c  |  73 +++--
 drivers/scsi/aacraid/linit.c| 232 
 drivers/scsi/aacraid/src.c  | 136 +--
 7 files changed, 296 insertions(+), 215 deletions(-)

-- 
2.7.4



[PATCH 07/19] aacraid: Log count info of scsi cmds before reset

2017-05-07 Thread Raghava Aditya Renukunta
Log the location of the scsi cmds before triggering a reset. This
information is useful for debugging.

Signed-off-by: Raghava Aditya Renukunta 
---
 drivers/scsi/aacraid/linit.c | 90 ++--
 1 file changed, 53 insertions(+), 37 deletions(-)

diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c
index f6a11af..0a8d303 100644
--- a/drivers/scsi/aacraid/linit.c
+++ b/drivers/scsi/aacraid/linit.c
@@ -624,6 +624,56 @@ static int aac_ioctl(struct scsi_device *sdev, int cmd, 
void __user * arg)
return aac_do_ioctl(dev, cmd, arg);
 }
 
+static int get_num_of_incomplete_fibs(struct aac_dev *aac)
+{
+
+   unsigned long flags;
+   struct scsi_device *sdev = NULL;
+   struct Scsi_Host *shost = aac->scsi_host_ptr;
+   struct scsi_cmnd *scmnd = NULL;
+   struct device *ctrl_dev;
+
+   int mlcnt  = 0;
+   int llcnt  = 0;
+   int ehcnt  = 0;
+   int fwcnt  = 0;
+   int krlcnt = 0;
+
+   __shost_for_each_device(sdev, shost) {
+   spin_lock_irqsave(>list_lock, flags);
+   list_for_each_entry(scmnd, >cmd_list, list) {
+   switch (scmnd->SCp.phase) {
+   case AAC_OWNER_FIRMWARE:
+   fwcnt++;
+   break;
+   case AAC_OWNER_ERROR_HANDLER:
+   ehcnt++;
+   break;
+   case AAC_OWNER_LOWLEVEL:
+   llcnt++;
+   break;
+   case AAC_OWNER_MIDLEVEL:
+   mlcnt++;
+   break;
+   default:
+   krlcnt++;
+   break;
+   }
+   }
+   spin_unlock_irqrestore(>list_lock, flags);
+   }
+
+   ctrl_dev = >pdev->dev;
+
+   dev_info(ctrl_dev, "outstanding cmd: midlevel-%d\n", mlcnt);
+   dev_info(ctrl_dev, "outstanding cmd: lowlevel-%d\n", llcnt);
+   dev_info(ctrl_dev, "outstanding cmd: error handler-%d\n", ehcnt);
+   dev_info(ctrl_dev, "outstanding cmd: firmware-%d\n", fwcnt);
+   dev_info(ctrl_dev, "outstanding cmd: kernel-%d\n", krlcnt);
+
+   return mlcnt + llcnt + ehcnt + fwcnt;
+}
+
 static int aac_eh_abort(struct scsi_cmnd* cmd)
 {
struct scsi_device * dev = cmd->device;
@@ -853,8 +903,6 @@ static int aac_eh_reset(struct scsi_cmnd* cmd)
pr_err("%s: Host adapter reset request timed out\n",
AAC_DRIVERNAME);
} else {
-   struct scsi_cmnd *command;
-   unsigned long flags;
 
/* Mark the assoc. FIB to not complete, eh handler does this */
for (count = 0;
@@ -873,41 +921,9 @@ static int aac_eh_reset(struct scsi_cmnd* cmd)
pr_err("%s: Host adapter reset request. SCSI hang ?\n",
AAC_DRIVERNAME);
 
-   count = aac_check_health(aac);
-   if (count)
-   return count;
-   /*
-* Wait for all commands to complete to this specific
-* target (block maximum 60 seconds).
-*/
-   for (count = 60; count; --count) {
-   int active = aac->in_reset;
-
-   if (active == 0)
-   __shost_for_each_device(dev, host) {
-   spin_lock_irqsave(>list_lock, flags);
-   list_for_each_entry(command, >cmd_list,
-   list) {
-   if ((command != cmd) &&
-   (command->SCp.phase ==
-   AAC_OWNER_FIRMWARE)) {
-   active++;
-   break;
-   }
-   }
-   spin_unlock_irqrestore(>list_lock, flags);
-   if (active)
-   break;
-
-   }
-   /*
-* We can exit If all the commands are complete
-*/
-   if (active == 0)
-   return SUCCESS;
-   ssleep(1);
-   }
-   pr_err("%s: SCSI bus appears hung\n", AAC_DRIVERNAME);
+   count = get_num_of_incomplete_fibs(aac);
+   if (count == 0)
+   return SUCCESS;
 
/*
 * This adapter needs a blind reset, only do so for
-- 
2.7.4



[PATCH 03/19] aacraid: Added 32 and 64 queue depth for arc natives

2017-05-07 Thread Raghava Aditya Renukunta
The qd for ARC Native disks is calculated by dividing the max IO 1024
by the number of disks or 256 which ever is lower. This causes poor
disk IO performance.

The fix is set the qd based on the type of disk (SAS - 64 and SATA -
32).

Signed-off-by: Raghava Aditya Renukunta 
---
 drivers/scsi/aacraid/aacraid.h |  1 +
 drivers/scsi/aacraid/linit.c   | 11 +++
 2 files changed, 12 insertions(+)

diff --git a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h
index d036a80..3ede6de 100644
--- a/drivers/scsi/aacraid/aacraid.h
+++ b/drivers/scsi/aacraid/aacraid.h
@@ -415,6 +415,7 @@ struct aac_ciss_identify_pd {
  * These macros convert from physical channels to virtual channels
  */
 #define CONTAINER_CHANNEL  (0)
+#define NATIVE_CHANNEL (1)
 #define CONTAINER_TO_CHANNEL(cont) (CONTAINER_CHANNEL)
 #define CONTAINER_TO_ID(cont)  (cont)
 #define CONTAINER_TO_LUN(cont) (0)
diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c
index 5a201da..5e1a2d6 100644
--- a/drivers/scsi/aacraid/linit.c
+++ b/drivers/scsi/aacraid/linit.c
@@ -466,6 +466,17 @@ static int aac_slave_configure(struct scsi_device *sdev)
++num_lsu;
 
depth = (host->can_queue - num_one) / num_lsu;
+
+   if (sdev_channel(sdev) != NATIVE_CHANNEL)
+   goto common_config;
+
+   /*
+* Check if SATA drive
+*/
+   if (strncmp(sdev->vendor, "ATA", 3) == 0)
+   depth = 32;
+   else
+   depth = 64;
}
 
 common_config:
-- 
2.7.4



[PATCH 02/19] aacraid: Fix DMAR issues with iommu=pt

2017-05-07 Thread Raghava Aditya Renukunta
The driver changed the DMA consistent map after consistent memory was
allocated, this invalidated the IOMMU identity mapping. The fix was to
make sure that we set the DMA consistent mask setting once depending on
the controller card.

Signed-off-by: Raghava Aditya Renukunta 
---
 drivers/scsi/aacraid/aachba.c  | 17 ++---
 drivers/scsi/aacraid/commsup.c | 29 ++---
 drivers/scsi/aacraid/linit.c   | 32 +++-
 3 files changed, 43 insertions(+), 35 deletions(-)

diff --git a/drivers/scsi/aacraid/aachba.c b/drivers/scsi/aacraid/aachba.c
index 43d8838..707ee2f 100644
--- a/drivers/scsi/aacraid/aachba.c
+++ b/drivers/scsi/aacraid/aachba.c
@@ -2071,20 +2071,15 @@ int aac_get_adapter_info(struct aac_dev* dev)
expose_physicals = 0;
}
 
-   if(dev->dac_support != 0) {
-   if (!pci_set_dma_mask(dev->pdev, DMA_BIT_MASK(64)) &&
-   !pci_set_consistent_dma_mask(dev->pdev, 
DMA_BIT_MASK(64))) {
+   if (dev->dac_support) {
+   if (!pci_set_dma_mask(dev->pdev, DMA_BIT_MASK(64))) {
if (!dev->in_reset)
-   printk(KERN_INFO"%s%d: 64 Bit DAC enabled\n",
-   dev->name, dev->id);
-   } else if (!pci_set_dma_mask(dev->pdev, DMA_BIT_MASK(32)) &&
-   !pci_set_consistent_dma_mask(dev->pdev, 
DMA_BIT_MASK(32))) {
-   printk(KERN_INFO"%s%d: DMA mask set failed, 64 Bit DAC 
disabled\n",
-   dev->name, dev->id);
+   dev_info(>pdev->dev, "64 Bit DAC 
enabled\n");
+   } else if (!pci_set_dma_mask(dev->pdev, DMA_BIT_MASK(32))) {
+   dev_info(>pdev->dev, "DMA mask set failed, 64 Bit 
DAC disabled\n");
dev->dac_support = 0;
} else {
-   printk(KERN_WARNING"%s%d: No suitable DMA available.\n",
-   dev->name, dev->id);
+   dev_info(>pdev->dev, "No suitable DMA 
available\n");
rcode = -ENOMEM;
}
}
diff --git a/drivers/scsi/aacraid/commsup.c b/drivers/scsi/aacraid/commsup.c
index d08920d..47068b2 100644
--- a/drivers/scsi/aacraid/commsup.c
+++ b/drivers/scsi/aacraid/commsup.c
@@ -1513,6 +1513,7 @@ static int _aac_reset_adapter(struct aac_dev *aac, int 
forced, u8 reset_type)
struct scsi_cmnd *command_list;
int jafo = 0;
int bled;
+   u64 dmamask;
 
/*
 * Assumptions:
@@ -1580,21 +1581,27 @@ static int _aac_reset_adapter(struct aac_dev *aac, int 
forced, u8 reset_type)
aac_free_irq(aac);
kfree(aac->fsa_dev);
aac->fsa_dev = NULL;
+
+   dmamask = DMA_BIT_MASK(32);
quirks = aac_get_driver_ident(index)->quirks;
-   if (quirks & AAC_QUIRK_31BIT) {
-   if (((retval = pci_set_dma_mask(aac->pdev, DMA_BIT_MASK(31 
||
- ((retval = pci_set_consistent_dma_mask(aac->pdev, 
DMA_BIT_MASK(31)
-   goto out;
-   } else {
-   if (((retval = pci_set_dma_mask(aac->pdev, DMA_BIT_MASK(32 
||
- ((retval = pci_set_consistent_dma_mask(aac->pdev, 
DMA_BIT_MASK(32)
-   goto out;
+   if (quirks & AAC_QUIRK_31BIT)
+   retval = pci_set_dma_mask(aac->pdev, dmamask);
+   else if (!(quirks & AAC_QUIRK_SRC))
+   retval = pci_set_dma_mask(aac->pdev, dmamask);
+   else
+   retval = pci_set_consistent_dma_mask(aac->pdev, dmamask);
+
+   if (quirks & AAC_QUIRK_31BIT && !retval) {
+   dmamask = DMA_BIT_MASK(31);
+   retval = pci_set_consistent_dma_mask(aac->pdev, dmamask);
}
+
+   if (retval)
+   goto out;
+
if ((retval = (*(aac_get_driver_ident(index)->init))(aac)))
goto out;
-   if (quirks & AAC_QUIRK_31BIT)
-   if ((retval = pci_set_dma_mask(aac->pdev, DMA_BIT_MASK(32
-   goto out;
+
if (jafo) {
aac->thread = kthread_run(aac_command_thread, aac, "%s",
  aac->name);
diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c
index 372a075..5a201da 100644
--- a/drivers/scsi/aacraid/linit.c
+++ b/drivers/scsi/aacraid/linit.c
@@ -1403,6 +1403,7 @@ static int aac_probe_one(struct pci_dev *pdev, const 
struct pci_device_id *id)
int error = -ENODEV;
int unique_id = 0;
u64 dmamask;
+   int mask_bits = 0;
extern int aac_sync_mode;
 
/*
@@ -1426,18 +1427,32 @@ static int aac_probe_one(struct pci_dev *pdev, const 
struct pci_device_id *id)
goto out;
error = -ENODEV;
 
+   if (!(aac_drivers[index].quirks & AAC_QUIRK_SRC)) {
+   

[PATCH 01/19] aacraid: Remove GFP_DMA for raw srb memory

2017-05-07 Thread Raghava Aditya Renukunta
The raw srb commands do not requires memory that in the ZONE_DMA
memory space. For 32bit srb commands use __GFP_DMA32 to limit the memory
to 32bit memory range (4GB).

Signed-off-by: Raghava Aditya Renukunta 
---
 drivers/scsi/aacraid/commctrl.c | 13 ++---
 1 file changed, 6 insertions(+), 7 deletions(-)

diff --git a/drivers/scsi/aacraid/commctrl.c b/drivers/scsi/aacraid/commctrl.c
index d2f8d59..da01f9c 100644
--- a/drivers/scsi/aacraid/commctrl.c
+++ b/drivers/scsi/aacraid/commctrl.c
@@ -668,7 +668,7 @@ static int aac_send_raw_srb(struct aac_dev* dev, void 
__user * arg)
goto cleanup;
}
 
-   p = kmalloc(sg_count[i], GFP_KERNEL|__GFP_DMA);
+   p = kmalloc(sg_count[i], GFP_KERNEL);
if (!p) {
rcode = -ENOMEM;
goto cleanup;
@@ -733,7 +733,7 @@ static int aac_send_raw_srb(struct aac_dev* dev, void 
__user * arg)
goto cleanup;
}
/* Does this really need to be GFP_DMA? */
-   p = kmalloc(sg_count[i], GFP_KERNEL|__GFP_DMA);
+   p = kmalloc(sg_count[i], GFP_KERNEL);
if(!p) {
dprintk((KERN_DEBUG"aacraid: Could not 
allocate SG buffer - size = %d buffer number %d of %d\n",
  sg_count[i], i, upsg->count));
@@ -788,8 +788,8 @@ static int aac_send_raw_srb(struct aac_dev* dev, void 
__user * arg)
rcode = -EINVAL;
goto cleanup;
}
-   /* Does this really need to be GFP_DMA? */
-   p = kmalloc(sg_count[i], GFP_KERNEL|__GFP_DMA);
+
+   p = kmalloc(sg_count[i], GFP_KERNEL);
if(!p) {
dprintk((KERN_DEBUG "aacraid: Could not 
allocate SG buffer - size = %d buffer number %d of %d\n",
sg_count[i], i, usg->count));
@@ -845,8 +845,7 @@ static int aac_send_raw_srb(struct aac_dev* dev, void 
__user * arg)
rcode = -EINVAL;
goto cleanup;
}
-   /* Does this really need to be GFP_DMA? */
-   p = kmalloc(sg_count[i], GFP_KERNEL|__GFP_DMA);
+   p = kmalloc(sg_count[i], GFP_KERNEL|GFP_DMA32);
if (!p) {
dprintk((KERN_DEBUG"aacraid: Could not 
allocate SG buffer - size = %d buffer number %d of %d\n",
sg_count[i], i, usg->count));
@@ -887,7 +886,7 @@ static int aac_send_raw_srb(struct aac_dev* dev, void 
__user * arg)
rcode = -EINVAL;
goto cleanup;
}
-   p = kmalloc(sg_count[i], GFP_KERNEL);
+   p = kmalloc(sg_count[i], GFP_KERNEL|GFP_DMA32);
if (!p) {
dprintk((KERN_DEBUG"aacraid: Could not 
allocate SG buffer - size = %d buffer number %d of %d\n",
  sg_count[i], i, upsg->count));
-- 
2.7.4



[PATCH 08/19] aacraid: Print ctrl status before eh reset

2017-05-07 Thread Raghava Aditya Renukunta
Log the status of the controller before issuing a reset.

Signed-off-by: Raghava Aditya Renukunta 
---
 drivers/scsi/aacraid/linit.c | 9 +
 1 file changed, 9 insertions(+)

diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c
index 0a8d303..3dea438 100644
--- a/drivers/scsi/aacraid/linit.c
+++ b/drivers/scsi/aacraid/linit.c
@@ -827,6 +827,7 @@ static int aac_eh_reset(struct scsi_cmnd* cmd)
int count;
u32 bus, cid;
int ret = FAILED;
+   int status = 0;
 
bus = aac_logical_to_phys(scmd_channel(cmd));
cid = scmd_id(cmd);
@@ -921,6 +922,14 @@ static int aac_eh_reset(struct scsi_cmnd* cmd)
pr_err("%s: Host adapter reset request. SCSI hang ?\n",
AAC_DRIVERNAME);
 
+   /*
+* Check the health of the controller
+*/
+   status = aac_adapter_check_health(aac);
+   if (status)
+   dev_err(>pdev->dev, "Adapter health - %d\n",
+   status);
+
count = get_num_of_incomplete_fibs(aac);
if (count == 0)
return SUCCESS;
-- 
2.7.4



[PATCH 05/19] aacraid: Remove reset support from check_health

2017-05-07 Thread Raghava Aditya Renukunta
Check health does not need to reset the ctrl but just return the
controller health status.

Signed-off-by: Raghava Aditya Renukunta 
---
 drivers/scsi/aacraid/commsup.c | 15 ---
 1 file changed, 15 deletions(-)

diff --git a/drivers/scsi/aacraid/commsup.c b/drivers/scsi/aacraid/commsup.c
index 47068b2..3299012 100644
--- a/drivers/scsi/aacraid/commsup.c
+++ b/drivers/scsi/aacraid/commsup.c
@@ -1775,8 +1775,6 @@ int aac_check_health(struct aac_dev * aac)
int BlinkLED;
unsigned long time_now, flagv = 0;
struct list_head * entry;
-   struct Scsi_Host * host;
-   int bled;
 
/* Extending the scope of fib_lock slightly to protect aac->in_reset */
if (spin_trylock_irqsave(>fib_lock, flagv) == 0)
@@ -1887,19 +1885,6 @@ int aac_check_health(struct aac_dev * aac)
 
printk(KERN_ERR "%s: Host adapter BLINK LED 0x%x\n", aac->name, 
BlinkLED);
 
-   if (!aac_check_reset || ((aac_check_reset == 1) &&
-   (aac->supplement_adapter_info.supported_options2 &
-   AAC_OPTION_IGNORE_RESET)))
-   goto out;
-   host = aac->scsi_host_ptr;
-   if (aac->thread->pid != current->pid)
-   spin_lock_irqsave(host->host_lock, flagv);
-   bled = aac_check_reset != 1 ? 1 : 0;
-   _aac_reset_adapter(aac, bled, IOP_HWSOFT_RESET);
-   if (aac->thread->pid != current->pid)
-   spin_unlock_irqrestore(host->host_lock, flagv);
-   return BlinkLED;
-
 out:
aac->in_reset = 0;
return BlinkLED;
-- 
2.7.4