Re: [PATCH 0/3] scsi: arcmsr: Add driver parameter cmd_timeout for scsi command timeout setting

2018-05-08 Thread Ching Huang
On Tue, 2018-05-08 at 14:32 +0800, Ching Huang wrote:
> On Tue, 2018-05-08 at 01:41 -0400, Martin K. Petersen wrote:
> > Hello Ching,
> > 
> > > 1. Add driver parameter cmd_timeout, default value is 
> > > ARCMSR_DEFAULT_TIMEOUT.
> > > 2. Add slave_configure callback function to set device command timeout 
> > > value.
> > > 3. Update driver version to v1.40.00.06-20180504.
> > 
> > I am not so keen on arcmsr overriding the timeout set by the admin or
> > application.
> > 
> > Also, instead of introducing this module parameter, why not simply ask
> > the user to change rq_timeout?
> > 
> This timeout setting only after device has been inquiry successfully.
> Of course, user can set timeout value to /sys/block/sdX/device/timeout.
> But user does not like to set this value once command timeout occurred.
> They rather like timeout never happen.
> 
This timeout setting apply to all devices, its better than user has to
set one bye one for each device.




Re: [PATCH 0/3] scsi: arcmsr: Add driver parameter cmd_timeout for scsi command timeout setting

2018-05-08 Thread Ching Huang
On Tue, 2018-05-08 at 01:41 -0400, Martin K. Petersen wrote:
> Hello Ching,
> 
> > 1. Add driver parameter cmd_timeout, default value is 
> > ARCMSR_DEFAULT_TIMEOUT.
> > 2. Add slave_configure callback function to set device command timeout 
> > value.
> > 3. Update driver version to v1.40.00.06-20180504.
> 
> I am not so keen on arcmsr overriding the timeout set by the admin or
> application.
> 
> Also, instead of introducing this module parameter, why not simply ask
> the user to change rq_timeout?
> 
This timeout setting only after device has been inquiry successfully.
Of course, user can set timeout value to /sys/block/sdX/device/timeout.
But user does not like to set this value once command timeout occurred.
They rather like timeout never happen.




[PATCH 3/3] scsi: arcmsr: Update driver version to v1.40.00.06-20180504

2018-05-07 Thread Ching Huang
>From Ching Huang <ching2...@areca.com.tw>

Update driver version to v1.40.00.06-20180504

Signed-off-by: Ching Huang <ching2...@areca.com.tw>
---

diff --git a/drivers/scsi/arcmsr/arcmsr.h b/drivers/scsi/arcmsr/arcmsr.h
index 62eeef5..eb39623 100755
--- a/drivers/scsi/arcmsr/arcmsr.h
+++ b/drivers/scsi/arcmsr/arcmsr.h
@@ -49,7 +49,7 @@ struct device_attribute;
 #define ARCMSR_MAX_OUTSTANDING_CMD 1024
 #define ARCMSR_DEFAULT_OUTSTANDING_CMD 128
 #define ARCMSR_MIN_OUTSTANDING_CMD 32
-#define ARCMSR_DRIVER_VERSION  "v1.40.00.05-20180309"
+#define ARCMSR_DRIVER_VERSION  "v1.40.00.06-20180504"
 #define ARCMSR_SCSI_INITIATOR_ID   255
 #define ARCMSR_MAX_XFER_SECTORS512
 #define ARCMSR_MAX_XFER_SECTORS_B  4096




[PATCH 2/3] scsi: arcmsr: Add slave_configure callback function to set device command timeout value

2018-05-07 Thread Ching Huang
>From Ching Huang <ching2...@areca.com.tw>

Add slave_configure callback function to set device command timeout value

Signed-off-by: Ching Huang <ching2...@areca.com.tw>
---

diff --git a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c
index f6ddaec..79a4487 100755
--- a/drivers/scsi/arcmsr/arcmsr_hba.c
+++ b/drivers/scsi/arcmsr/arcmsr_hba.c
@@ -139,6 +139,7 @@ static irqreturn_t arcmsr_interrupt(struct 
AdapterControlBlock *acb);
 static void arcmsr_free_irq(struct pci_dev *, struct AdapterControlBlock *);
 static void arcmsr_wait_firmware_ready(struct AdapterControlBlock *acb);
 static void arcmsr_set_iop_datetime(struct timer_list *);
+static int arcmsr_slave_config(struct scsi_device *sdev);
 static int arcmsr_adjust_disk_queue_depth(struct scsi_device *sdev, int 
queue_depth)
 {
if (queue_depth > ARCMSR_MAX_CMD_PERLUN)
@@ -154,6 +155,7 @@ static struct scsi_host_template arcmsr_scsi_host_template 
= {
.eh_abort_handler   = arcmsr_abort,
.eh_bus_reset_handler   = arcmsr_bus_reset,
.bios_param = arcmsr_bios_param,
+   .slave_configure= arcmsr_slave_config,
.change_queue_depth = arcmsr_adjust_disk_queue_depth,
.can_queue  = ARCMSR_DEFAULT_OUTSTANDING_CMD,
.this_id= ARCMSR_SCSI_INITIATOR_ID,
@@ -3033,6 +3035,17 @@ static int arcmsr_queue_command_lck(struct scsi_cmnd 
*cmd,
 
 static DEF_SCSI_QCMD(arcmsr_queue_command)
 
+static int arcmsr_slave_config(struct scsi_device *sdev)
+{
+   unsigned intdev_timeout;
+
+   dev_timeout = sdev->request_queue->rq_timeout;
+   if ((cmd_timeout > 0) && ((cmd_timeout * HZ) > dev_timeout))
+   blk_queue_rq_timeout(sdev->request_queue, cmd_timeout * HZ);
+   arcmsr_adjust_disk_queue_depth(sdev, cmd_per_lun);
+   return 0;
+}
+
 static void arcmsr_get_adapter_config(struct AdapterControlBlock *pACB, 
uint32_t *rwbuffer)
 {
int count;







[PATCH 1/3] scsi: arcmsr: Add driver parameter cmd_timeout, default value is ARCMSR_DEFAULT_TIMEOUT

2018-05-07 Thread Ching Huang
>From Ching Huang <ching2...@areca.com.tw>

Add driver parameter cmd_timeout, default value is ARCMSR_DEFAULT_TIMEOUT

Signed-off-by: Ching Huang <ching2...@areca.com.tw>
---

diff --git a/drivers/scsi/arcmsr/arcmsr.h b/drivers/scsi/arcmsr/arcmsr.h
index 2e51ccc..62eeef5 100755
--- a/drivers/scsi/arcmsr/arcmsr.h
+++ b/drivers/scsi/arcmsr/arcmsr.h
@@ -82,6 +82,7 @@ struct device_attribute;
 #endif
 #defineARCMSR_HOURS(1000 * 60 * 60 * 4)
 #defineARCMSR_MINUTES  (1000 * 60 * 60)
+#define ARCMSR_DEFAULT_TIMEOUT 90
 /*
 
**
 **
diff --git a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c
index 732b5d9..f6ddaec 100755
--- a/drivers/scsi/arcmsr/arcmsr_hba.c
+++ b/drivers/scsi/arcmsr/arcmsr_hba.c
@@ -95,6 +95,10 @@ static int set_date_time = 0;
 module_param(set_date_time, int, S_IRUGO);
 MODULE_PARM_DESC(set_date_time, " send date, time to iop(0 ~ 1), 
set_date_time=1(enable), default(=0) is disable");
 
+static int cmd_timeout = ARCMSR_DEFAULT_TIMEOUT;
+module_param(cmd_timeout, int, S_IRUGO);
+MODULE_PARM_DESC(cmd_timeout, " scsi cmd timeout(0 ~ 120 sec.), default is 
90");
+
 #defineARCMSR_SLEEPTIME10
 #defineARCMSR_RETRYCOUNT   12
 




[PATCH 0/3] scsi: arcmsr: Add driver parameter cmd_timeout for scsi command timeout setting

2018-05-07 Thread Ching Huang
>From Ching Huang <ching2...@areca.com.tw>

This patch series are against to mkp's 4.18/scsi-queue.

1. Add driver parameter cmd_timeout, default value is ARCMSR_DEFAULT_TIMEOUT.
2. Add slave_configure callback function to set device command timeout value.
3. Update driver version to v1.40.00.06-20180504.

--




[PATCH 4/4] scsi: arcmsr: Change driver version to v1.40.00.05-20180309

2018-03-15 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

Change driver version to v1.40.00.05-20180309

Signed-off-by: Ching Huang <ching2...@areca.com.tw>
---

diff --git a/drivers/scsi/arcmsr/arcmsr.h b/drivers/scsi/arcmsr/arcmsr.h
index 842b77a..2e51ccc 100755
--- a/drivers/scsi/arcmsr/arcmsr.h
+++ b/drivers/scsi/arcmsr/arcmsr.h
@@ -49,7 +49,7 @@ struct device_attribute;
 #define ARCMSR_MAX_OUTSTANDING_CMD 1024
 #define ARCMSR_DEFAULT_OUTSTANDING_CMD 128
 #define ARCMSR_MIN_OUTSTANDING_CMD 32
-#define ARCMSR_DRIVER_VERSION  "v1.40.00.04-20171130"
+#define ARCMSR_DRIVER_VERSION  "v1.40.00.05-20180309"
 #define ARCMSR_SCSI_INITIATOR_ID   255
 #define ARCMSR_MAX_XFER_SECTORS512
 #define ARCMSR_MAX_XFER_SECTORS_B  4096




[PATCH 3/4] scsi: arcmsr: Sleep to avoid CPU stuck too long for waiting adapter ready

2018-03-15 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

Sleep to avoid CPU stuck too long for waiting adapter ready.

Signed-off-by: Ching Huang <ching2...@areca.com.tw>
---

diff --git a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c
index 2f52c53..732b5d9 100755
--- a/drivers/scsi/arcmsr/arcmsr_hba.c
+++ b/drivers/scsi/arcmsr/arcmsr_hba.c
@@ -3807,6 +3807,8 @@ static void arcmsr_wait_firmware_ready(struct 
AdapterControlBlock *acb)
case ACB_ADAPTER_TYPE_A: {
struct MessageUnit_A __iomem *reg = acb->pmuA;
do {
+   if (!(acb->acb_flags & ACB_F_IOP_INITED))
+   msleep(20);
firmware_state = readl(>outbound_msgaddr1);
} while ((firmware_state & ARCMSR_OUTBOUND_MESG1_FIRMWARE_OK) 
== 0);
}
@@ -3815,6 +3817,8 @@ static void arcmsr_wait_firmware_ready(struct 
AdapterControlBlock *acb)
case ACB_ADAPTER_TYPE_B: {
struct MessageUnit_B *reg = acb->pmuB;
do {
+   if (!(acb->acb_flags & ACB_F_IOP_INITED))
+   msleep(20);
firmware_state = readl(reg->iop2drv_doorbell);
} while ((firmware_state & ARCMSR_MESSAGE_FIRMWARE_OK) == 0);
writel(ARCMSR_DRV2IOP_END_OF_INTERRUPT, reg->drv2iop_doorbell);
@@ -3823,6 +3827,8 @@ static void arcmsr_wait_firmware_ready(struct 
AdapterControlBlock *acb)
case ACB_ADAPTER_TYPE_C: {
struct MessageUnit_C __iomem *reg = acb->pmuC;
do {
+   if (!(acb->acb_flags & ACB_F_IOP_INITED))
+   msleep(20);
firmware_state = readl(>outbound_msgaddr1);
} while ((firmware_state & ARCMSR_HBCMU_MESSAGE_FIRMWARE_OK) == 
0);
}
@@ -3830,6 +3836,8 @@ static void arcmsr_wait_firmware_ready(struct 
AdapterControlBlock *acb)
case ACB_ADAPTER_TYPE_D: {
struct MessageUnit_D *reg = acb->pmuD;
do {
+   if (!(acb->acb_flags & ACB_F_IOP_INITED))
+   msleep(20);
firmware_state = readl(reg->outbound_msgaddr1);
} while ((firmware_state &
ARCMSR_ARC1214_MESSAGE_FIRMWARE_OK) == 0);
@@ -3838,6 +3846,8 @@ static void arcmsr_wait_firmware_ready(struct 
AdapterControlBlock *acb)
case ACB_ADAPTER_TYPE_E: {
struct MessageUnit_E __iomem *reg = acb->pmuE;
do {
+   if (!(acb->acb_flags & ACB_F_IOP_INITED))
+   msleep(20);
firmware_state = readl(>outbound_msgaddr1);
} while ((firmware_state & ARCMSR_HBEMU_MESSAGE_FIRMWARE_OK) == 
0);
}




[PATCH 2/4] scsi: arcmsr: Handle adapter removed due to thunderbolt cable disconnection.

2018-03-15 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

Handle adapter removed due to thunderbolt cable disconnection.

Signed-off-by: Ching Huang <ching2...@areca.com.tw>
---

diff --git a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c
index 75e828b..2f52c53 100755
--- a/drivers/scsi/arcmsr/arcmsr_hba.c
+++ b/drivers/scsi/arcmsr/arcmsr_hba.c
@@ -1446,12 +1446,80 @@ static void arcmsr_done4abort_postqueue(struct 
AdapterControlBlock *acb)
}
 }
 
+static void arcmsr_remove_scsi_devices(struct AdapterControlBlock *acb)
+{
+   char *acb_dev_map = (char *)acb->device_map;
+   int target, lun, i;
+   struct scsi_device *psdev;
+   struct CommandControlBlock *ccb;
+   char temp;
+
+   for (i = 0; i < acb->maxFreeCCB; i++) {
+   ccb = acb->pccb_pool[i];
+   if (ccb->startdone == ARCMSR_CCB_START) {
+   ccb->pcmd->result = DID_NO_CONNECT << 16;
+   arcmsr_pci_unmap_dma(ccb);
+   ccb->pcmd->scsi_done(ccb->pcmd);
+   }
+   }
+   for (target = 0; target < ARCMSR_MAX_TARGETID; target++) {
+   temp = *acb_dev_map;
+   if (temp) {
+   for (lun = 0; lun < ARCMSR_MAX_TARGETLUN; lun++) {
+   if (temp & 1) {
+   psdev = scsi_device_lookup(acb->host,
+   0, target, lun);
+   if (psdev != NULL) {
+   scsi_remove_device(psdev);
+   scsi_device_put(psdev);
+   }
+   }
+   temp >>= 1;
+   }
+   *acb_dev_map = 0;
+   }
+   acb_dev_map++;
+   }
+}
+
+static void arcmsr_free_pcidev(struct AdapterControlBlock *acb)
+{
+   struct pci_dev *pdev;
+   struct Scsi_Host *host;
+
+   host = acb->host;
+   arcmsr_free_sysfs_attr(acb);
+   scsi_remove_host(host);
+   flush_work(>arcmsr_do_message_isr_bh);
+   del_timer_sync(>eternal_timer);
+   if (set_date_time)
+   del_timer_sync(>refresh_timer);
+   pdev = acb->pdev;
+   arcmsr_free_irq(pdev, acb);
+   arcmsr_free_ccb_pool(acb);
+   arcmsr_free_mu(acb);
+   arcmsr_unmap_pciregion(acb);
+   pci_release_regions(pdev);
+   scsi_host_put(host);
+   pci_disable_device(pdev);
+}
+
 static void arcmsr_remove(struct pci_dev *pdev)
 {
struct Scsi_Host *host = pci_get_drvdata(pdev);
struct AdapterControlBlock *acb =
(struct AdapterControlBlock *) host->hostdata;
int poll_count = 0;
+   uint16_t dev_id;
+
+   pci_read_config_word(pdev, PCI_DEVICE_ID, _id);
+   if (dev_id == 0x) {
+   acb->acb_flags &= ~ACB_F_IOP_INITED;
+   acb->acb_flags |= ACB_F_ADAPTER_REMOVED;
+   arcmsr_remove_scsi_devices(acb);
+   arcmsr_free_pcidev(acb);
+   return;
+   }
arcmsr_free_sysfs_attr(acb);
scsi_remove_host(host);
flush_work(>arcmsr_do_message_isr_bh);
@@ -1499,6 +1567,8 @@ static void arcmsr_shutdown(struct pci_dev *pdev)
struct Scsi_Host *host = pci_get_drvdata(pdev);
struct AdapterControlBlock *acb =
(struct AdapterControlBlock *)host->hostdata;
+   if (acb->acb_flags & ACB_F_ADAPTER_REMOVED)
+   return;
del_timer_sync(>eternal_timer);
if (set_date_time)
del_timer_sync(>refresh_timer);
@@ -2931,6 +3001,12 @@ static int arcmsr_queue_command_lck(struct scsi_cmnd 
*cmd,
struct AdapterControlBlock *acb = (struct AdapterControlBlock *) 
host->hostdata;
struct CommandControlBlock *ccb;
int target = cmd->device->id;
+
+   if (acb->acb_flags & ACB_F_ADAPTER_REMOVED) {
+   cmd->result = (DID_NO_CONNECT << 16);
+   cmd->scsi_done(cmd);
+   return 0;
+   }
cmd->scsi_done = done;
cmd->host_scribble = NULL;
cmd->result = 0;
@@ -4177,6 +4253,8 @@ static int arcmsr_bus_reset(struct scsi_cmnd *cmd)
int retry_count = 0;
int rtn = FAILED;
acb = (struct AdapterControlBlock *) cmd->device->host->hostdata;
+   if (acb->acb_flags & ACB_F_ADAPTER_REMOVED)
+   return SUCCESS;
pr_notice("arcmsr: executing bus reset eh.num_resets = %d,"
" num_aborts = %d \n", acb->num_resets, acb->num_aborts);
acb->num_resets++;
@@ -4243,6 +4321,8 @@ static int arcmsr_abort(struct scsi_cmnd *cmd)
int rtn = FAILED;
ui

[PATCH 1/4] scsi: arcmsr: Rename ACB_F_BUS_HANG_ON to ACB_F_ADAPTER_REMOVED for adapter hot-plug

2018-03-15 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

Rename ACB_F_BUS_HANG_ON to ACB_F_ADAPTER_REMOVED for adapter hot-plug.

Signed-off-by: Ching Huang <ching2...@areca.com.tw>
---

diff --git a/drivers/scsi/arcmsr/arcmsr.h b/drivers/scsi/arcmsr/arcmsr.h
index f375f35..842b77a 100755
--- a/drivers/scsi/arcmsr/arcmsr.h
+++ b/drivers/scsi/arcmsr/arcmsr.h
@@ -779,12 +779,12 @@ struct AdapterControlBlock
 /* message clear rqbuffer */
 #define ACB_F_MESSAGE_WQBUFFER_READED   0x0040
 #define ACB_F_BUS_RESET0x0080
-#define ACB_F_BUS_HANG_ON  0x0800/* need hardware reset bus */
 
 #define ACB_F_IOP_INITED   0x0100
 /* iop init */
 #define ACB_F_ABORT0x0200
 #define ACB_F_FIRMWARE_TRAP0x0400
+#define ACB_F_ADAPTER_REMOVED  0x0800
 #define ACB_F_MSG_GET_CONFIG   0x1000
struct CommandControlBlock *pccb_pool[ARCMSR_MAX_FREECCB_NUM];
/* used for memory free */




[PATCH 0/4] scsi: arcmsr: Support Areca thunderbolt devices hot-plug

2018-03-15 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

This patch series are against to mkp's 4.17/scsi-queue.

1. Rename ACB_F_BUS_HANG_ON to ACB_F_ADAPTER_REMOVED for adapter hot-plug
2. Handle adapter removed due to thunderbolt cable disconnection.
3. Sleep to avoid CPU stuck too long for waiting adapter ready
4. Change driver version to v1.40.00.05-20180309

---



Re: [PATCH] scsi: arcmsr: avoid do_gettimeofday

2018-01-22 Thread Ching Huang
On Mon, 2018-01-22 at 00:12 +0100, Arnd Bergmann wrote:
> The arcmsr uses its own implementation of time_to_tm(), along with 
> do_gettimeofday()
> to read the current time. While the algoritm used here is fine in principle, 
> it
> suffers from two problems:
> 
> - it assigns the seconds portion of the timeval to a 32-bit unsigned integer 
> that
>   overflows in 2106 even on 64-bit architectures.
> - do_gettimeofday() returns a time_t that overflows in 2038 on all 32-bit 
> systems.
> 
> This changes the time retrieval function to ktime_get_real_seconds(), which 
> returns
> a proper 64-bit value, and replaces the open-coded time_to_tm() algorithm with
> a call to the safe time64_to_tm().
> 
> I checked way all numbers are indexed and found that months are given in range
> 0..11 while the days are in range 1..31, same as 'struct tm', but the year 
> value
> that the firmware expects starts in 2000 while 'struct tm' is based on year 
> 1900,
> so it needs a small adjustment.
> 
> Fixes: b416c099472a ("scsi: arcmsr: Add a function to set date and time to 
> firmware")
> Signed-off-by: Arnd Bergmann 
> ---
>  drivers/scsi/arcmsr/arcmsr_hba.c | 37 ++---
>  1 file changed, 10 insertions(+), 27 deletions(-)
> 
> diff --git a/drivers/scsi/arcmsr/arcmsr_hba.c 
> b/drivers/scsi/arcmsr/arcmsr_hba.c
> index 47745592cff4..75e828bd30e3 100644
> --- a/drivers/scsi/arcmsr/arcmsr_hba.c
> +++ b/drivers/scsi/arcmsr/arcmsr_hba.c
> @@ -3489,8 +3489,9 @@ static int arcmsr_polling_ccbdone(struct 
> AdapterControlBlock *acb,
>  static void arcmsr_set_iop_datetime(struct timer_list *t)
>  {
>   struct AdapterControlBlock *pacb = from_timer(pacb, t, refresh_timer);
> - unsigned int days, j, i, a, b, c, d, e, m, year, mon, day, hour, min, 
> sec, secs, next_time;
> - struct timeval tv;
> + unsigned int next_time;
> + struct tm tm;
> +
>   union {
>   struct  {
>   uint16_tsignature;
> @@ -3506,33 +3507,15 @@ static void arcmsr_set_iop_datetime(struct timer_list 
> *t)
>   } b;
>   } datetime;
>  
> - do_gettimeofday();
> - secs = (u32)(tv.tv_sec - (sys_tz.tz_minuteswest * 60));
> - days = secs / 86400;
> - secs = secs - 86400 * days;
> - j = days / 146097;
> - i = days - 146097 * j;
> - a = i + 719468;
> - b = ( 4 * a + 3 ) / 146097;
> - c = a - ( 146097 * b ) / 4;
> - d = ( 4 * c + 3 ) / 1461 ;
> - e = c - ( 1461 * d ) / 4 ;
> - m = ( 5 * e + 2 ) / 153 ;
> - year = 400 * j + 100 * b + d + m / 10 - 2000;
> - mon = m + 3 - 12 * ( m /10 );
> - day = e - ( 153 * m + 2 ) / 5 + 1;
> - hour = secs / 3600;
> - secs = secs - 3600 * hour;
> - min = secs / 60;
> - sec = secs - 60 * min;
> + time64_to_tm(ktime_get_real_seconds(), -sys_tz.tz_minuteswest * 60, 
> );
>  
>   datetime.a.signature = 0x55AA;
> - datetime.a.year = year;
> - datetime.a.month = mon;
> - datetime.a.date = day;
> - datetime.a.hour = hour;
> - datetime.a.minute = min;
> - datetime.a.second = sec;
> + datetime.a.year = tm.tm_year - 100; /* base 2000 instead of 1900 */
> + datetime.a.month = tm.tm_mon;
> + datetime.a.date = tm.tm_mday;
> + datetime.a.hour = tm.tm_hour;
> + datetime.a.minute = tm.tm_min;
> + datetime.a.second = tm.tm_sec;
>  
>   switch (pacb->adapter_type) {
>   case ACB_ADAPTER_TYPE_A: {

This patch works on kernel 4.14.0, thanks Arnd.



Re: [PATCH 4/4] scsi: arcmsr: simplify all arcmsr_hbaX_get_config routine by call a new get_adapter_config function

2017-12-13 Thread Ching Huang
On Thu, 2017-12-14 at 13:13 +0800, kbuild test robot wrote:
> Hi Ching,
> 
> Thank you for the patch! Perhaps something to improve:
> 
> [auto build test WARNING on scsi/for-next]
> [also build test WARNING on next-20171213]
> [cannot apply to v4.15-rc3]
> [if your patch is applied to the wrong git tree, please drop us a note to 
> help improve the system]
As what I have said in [PATCH 0/4], this serial patches are apply to
Martin's 4.16/scsi-queue only. Now scsi/for-next and next-20171213 are
synchronized to Martin's 4.16/scsi-queue, so these patches can apply to
them. But v4.15-rc3 has to do some patches like 4.16/scsi-queue done
before, or this patch can not apply.
> 
> url:
> https://github.com/0day-ci/linux/commits/Ching-Huang/scsi-arcmsr-simplify-hba_get_config-routine/20171213-224803
> base:   https://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi.git for-next
> reproduce:
> # apt-get install sparse
> make ARCH=x86_64 allmodconfig
> make C=1 CF=-D__CHECK_ENDIAN__
> 
> 
> sparse warnings: (new ones prefixed by >>)
> 
> 
> vim +2971 drivers/scsi/arcmsr/arcmsr_hba.c
> 
>   2958
>   2959static void arcmsr_get_adapter_config(struct 
> AdapterControlBlock *pACB, uint32_t *rwbuffer)
>   2960{
>   2961int count;
>   2962uint32_t *acb_firm_model = (uint32_t *)pACB->firm_model;
>   2963uint32_t *acb_firm_version = (uint32_t 
> *)pACB->firm_version;
>   2964uint32_t *acb_device_map = (uint32_t *)pACB->device_map;
>   2965uint32_t *firm_model = [15];
>   2966uint32_t *firm_version = [17];
>   2967uint32_t *device_map = [21];
>   2968
>   2969count = 2;
>   2970while (count) {
> > 2971*acb_firm_model = readl(firm_model);
>   2972acb_firm_model++;
>   2973firm_model++;
>   2974count--;
>   2975}
>   2976count = 4;
>   2977while (count) {
>   2978*acb_firm_version = readl(firm_version);
>   2979acb_firm_version++;
>   2980firm_version++;
>   2981count--;
>   2982}
>   2983count = 4;
>   2984while (count) {
>   2985*acb_device_map = readl(device_map);
>   2986acb_device_map++;
>   2987device_map++;
>   2988count--;
>   2989}
>   2990pACB->signature = readl([0]);
>   2991pACB->firm_request_len = readl([1]);
>   2992pACB->firm_numbers_queue = readl([2]);
> > 2993pACB->firm_sdram_size = readl([3]);
> > 2994pACB->firm_hd_channels = readl([4]);
>   2995pACB->firm_cfg_version = readl([25]);
>   2996pr_notice("Areca RAID Controller%d: Model %s, F/W %s\n",
>   2997pACB->host->host_no,
>   2998pACB->firm_model,
>   2999pACB->firm_version);
>   3000}
>   3001
>   3002static bool arcmsr_hbaA_get_config(struct AdapterControlBlock 
> *acb)
>   3003{
>   3004struct MessageUnit_A __iomem *reg = acb->pmuA;
>   3005
>   3006arcmsr_wait_firmware_ready(acb);
>   3007writel(ARCMSR_INBOUND_MESG0_GET_CONFIG, 
> >inbound_msgaddr0);
>   3008if (!arcmsr_hbaA_wait_msgint_ready(acb)) {
>   3009printk(KERN_NOTICE "arcmsr%d: wait 'get adapter 
> firmware \
>   3010miscellaneous data' timeout \n", 
> acb->host->host_no);
>   3011return false;
>   3012}
> > 3013arcmsr_get_adapter_config(acb, reg->message_rwbuffer);
>   3014return true;
>   3015}
>   3016static bool arcmsr_hbaB_get_config(struct AdapterControlBlock 
> *acb)
>   3017{
>   3018struct MessageUnit_B *reg = acb->pmuB;
>   3019
>   3020arcmsr_wait_firmware_ready(acb);
>   3021writel(ARCMSR_MESSAGE_START_DRIVER_MODE, 
> reg->drv2iop_doorbell);
>   3022if (!arcmsr_hbaB_wait_msgint_ready(acb)) {
>   3023printk(KERN_ERR "arcmsr%d: can't set driver 
> mode.\n", acb-

[PATCH 5/4] scsi: arcmsr: simplify arcmsr_request_device_map routine

2017-12-13 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

simplify arcmsr_request_device_map routine

Signed-off-by: Ching Huang <ching2...@areca.com.tw>
---

diff --git a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c
index 95c9f08..4774559 100755
--- a/drivers/scsi/arcmsr/arcmsr_hba.c
+++ b/drivers/scsi/arcmsr/arcmsr_hba.c
@@ -122,9 +122,6 @@ static void arcmsr_stop_adapter_bgrb(struct 
AdapterControlBlock *acb);
 static void arcmsr_hbaA_flush_cache(struct AdapterControlBlock *acb);
 static void arcmsr_hbaB_flush_cache(struct AdapterControlBlock *acb);
 static void arcmsr_request_device_map(struct timer_list *t);
-static void arcmsr_hbaA_request_device_map(struct AdapterControlBlock *acb);
-static void arcmsr_hbaB_request_device_map(struct AdapterControlBlock *acb);
-static void arcmsr_hbaC_request_device_map(struct AdapterControlBlock *acb);
 static void arcmsr_message_isr_bh_fn(struct work_struct *work);
 static bool arcmsr_get_firmware_spec(struct AdapterControlBlock *acb);
 static void arcmsr_start_adapter_bgrb(struct AdapterControlBlock *acb);
@@ -3789,113 +3786,12 @@ static void arcmsr_wait_firmware_ready(struct 
AdapterControlBlock *acb)
}
 }
 
-static void arcmsr_hbaA_request_device_map(struct AdapterControlBlock *acb)
-{
-   struct MessageUnit_A __iomem *reg = acb->pmuA;
-   if (unlikely(atomic_read(>rq_map_token) == 0) || ((acb->acb_flags 
& ACB_F_BUS_RESET) != 0 ) || ((acb->acb_flags & ACB_F_ABORT) != 0 )){
-   mod_timer(>eternal_timer, jiffies + msecs_to_jiffies(6 * 
HZ));
-   return;
-   } else {
-   acb->fw_flag = FW_NORMAL;
-   if (atomic_read(>ante_token_value) == 
atomic_read(>rq_map_token)){
-   atomic_set(>rq_map_token, 16);
-   }
-   atomic_set(>ante_token_value, 
atomic_read(>rq_map_token));
-   if (atomic_dec_and_test(>rq_map_token)) {
-   mod_timer(>eternal_timer, jiffies + 
msecs_to_jiffies(6 * HZ));
-   return;
-   }
-   writel(ARCMSR_INBOUND_MESG0_GET_CONFIG, >inbound_msgaddr0);
-   acb->acb_flags |= ACB_F_MSG_GET_CONFIG;
-   mod_timer(>eternal_timer, jiffies + msecs_to_jiffies(6 * 
HZ));
-   }
-   return;
-}
-
-static void arcmsr_hbaB_request_device_map(struct AdapterControlBlock *acb)
-{
-   struct MessageUnit_B *reg = acb->pmuB;
-   if (unlikely(atomic_read(>rq_map_token) == 0) || ((acb->acb_flags 
& ACB_F_BUS_RESET) != 0 ) || ((acb->acb_flags & ACB_F_ABORT) != 0 )){
-   mod_timer(>eternal_timer, jiffies + msecs_to_jiffies(6 * 
HZ));
-   return;
-   } else {
-   acb->fw_flag = FW_NORMAL;
-   if (atomic_read(>ante_token_value) == 
atomic_read(>rq_map_token)) {
-   atomic_set(>rq_map_token, 16);
-   }
-   atomic_set(>ante_token_value, 
atomic_read(>rq_map_token));
-   if (atomic_dec_and_test(>rq_map_token)) {
-   mod_timer(>eternal_timer, jiffies + 
msecs_to_jiffies(6 * HZ));
-   return;
-   }
-   writel(ARCMSR_MESSAGE_GET_CONFIG, reg->drv2iop_doorbell);
-   acb->acb_flags |= ACB_F_MSG_GET_CONFIG;
-   mod_timer(>eternal_timer, jiffies + msecs_to_jiffies(6 * 
HZ));
-   }
-   return;
-}
-
-static void arcmsr_hbaC_request_device_map(struct AdapterControlBlock *acb)
-{
-   struct MessageUnit_C __iomem *reg = acb->pmuC;
-   if (unlikely(atomic_read(>rq_map_token) == 0) || ((acb->acb_flags 
& ACB_F_BUS_RESET) != 0) || ((acb->acb_flags & ACB_F_ABORT) != 0)) {
-   mod_timer(>eternal_timer, jiffies + msecs_to_jiffies(6 * 
HZ));
-   return;
-   } else {
-   acb->fw_flag = FW_NORMAL;
-   if (atomic_read(>ante_token_value) == 
atomic_read(>rq_map_token)) {
-   atomic_set(>rq_map_token, 16);
-   }
-   atomic_set(>ante_token_value, 
atomic_read(>rq_map_token));
-   if (atomic_dec_and_test(>rq_map_token)) {
-   mod_timer(>eternal_timer, jiffies + 
msecs_to_jiffies(6 * HZ));
-   return;
-   }
-   writel(ARCMSR_INBOUND_MESG0_GET_CONFIG, >inbound_msgaddr0);
-   writel(ARCMSR_HBCMU_DRV2IOP_MESSAGE_CMD_DONE, 
>inbound_doorbell);
-   acb->acb_flags |= ACB_F_MSG_GET_CONFIG;
-   mod_timer(>eternal_timer, jiffies + msecs_to_jiffies(6 * 
HZ));
-   }
-   return;
-}
-
-static void arcmsr_hbaD_request_device_map(struct AdapterControlBlock *acb)
-{
-   struct MessageUnit_D *reg = acb->pmuD;
-
-   if (unlikely(atomic_read(>rq_map_token) == 0) ||
- 

[PATCH 4/4] scsi: arcmsr: simplify all arcmsr_hbaX_get_config routine by call a new get_adapter_config function

2017-12-12 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

simplify all arcmsr_hbaX_get_config routine by call a new get_adapter_config 
function

Signed-off-by: Ching Huang <ching2...@areca.com.tw>
---

diff --git a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c
index b7a56e8..95c9f08 100755
--- a/drivers/scsi/arcmsr/arcmsr_hba.c
+++ b/drivers/scsi/arcmsr/arcmsr_hba.c
@@ -2956,75 +2956,66 @@ static int arcmsr_queue_command_lck(struct scsi_cmnd 
*cmd,
 
 static DEF_SCSI_QCMD(arcmsr_queue_command)
 
-static bool arcmsr_hbaA_get_config(struct AdapterControlBlock *acb)
+static void arcmsr_get_adapter_config(struct AdapterControlBlock *pACB, 
uint32_t *rwbuffer)
 {
-   struct MessageUnit_A __iomem *reg = acb->pmuA;
-   char *acb_firm_model = acb->firm_model;
-   char *acb_firm_version = acb->firm_version;
-   char *acb_device_map = acb->device_map;
-   char __iomem *iop_firm_model = (char __iomem 
*)(>message_rwbuffer[15]);
-   char __iomem *iop_firm_version = (char __iomem 
*)(>message_rwbuffer[17]);
-   char __iomem *iop_device_map = (char __iomem 
*)(>message_rwbuffer[21]);
int count;
-   arcmsr_wait_firmware_ready(acb);
-   writel(ARCMSR_INBOUND_MESG0_GET_CONFIG, >inbound_msgaddr0);
-   if (!arcmsr_hbaA_wait_msgint_ready(acb)) {
-   printk(KERN_NOTICE "arcmsr%d: wait 'get adapter firmware \
-   miscellaneous data' timeout \n", acb->host->host_no);
-   return false;
-   }
-   count = 8;
-   while (count){
-   *acb_firm_model = readb(iop_firm_model);
+   uint32_t *acb_firm_model = (uint32_t *)pACB->firm_model;
+   uint32_t *acb_firm_version = (uint32_t *)pACB->firm_version;
+   uint32_t *acb_device_map = (uint32_t *)pACB->device_map;
+   uint32_t *firm_model = [15];
+   uint32_t *firm_version = [17];
+   uint32_t *device_map = [21];
+
+   count = 2;
+   while (count) {
+   *acb_firm_model = readl(firm_model);
acb_firm_model++;
-   iop_firm_model++;
+   firm_model++;
count--;
}
-
-   count = 16;
-   while (count){
-   *acb_firm_version = readb(iop_firm_version);
+   count = 4;
+   while (count) {
+   *acb_firm_version = readl(firm_version);
acb_firm_version++;
-   iop_firm_version++;
+   firm_version++;
count--;
}
-
-   count=16;
-   while(count){
-   *acb_device_map = readb(iop_device_map);
+   count = 4;
+   while (count) {
+   *acb_device_map = readl(device_map);
acb_device_map++;
-   iop_device_map++;
+   device_map++;
count--;
}
+   pACB->signature = readl([0]);
+   pACB->firm_request_len = readl([1]);
+   pACB->firm_numbers_queue = readl([2]);
+   pACB->firm_sdram_size = readl([3]);
+   pACB->firm_hd_channels = readl([4]);
+   pACB->firm_cfg_version = readl([25]);
pr_notice("Areca RAID Controller%d: Model %s, F/W %s\n",
-   acb->host->host_no,
-   acb->firm_model,
-   acb->firm_version);
-   acb->signature = readl(>message_rwbuffer[0]);
-   acb->firm_request_len = readl(>message_rwbuffer[1]);
-   acb->firm_numbers_queue = readl(>message_rwbuffer[2]);
-   acb->firm_sdram_size = readl(>message_rwbuffer[3]);
-   acb->firm_hd_channels = readl(>message_rwbuffer[4]);
-   acb->firm_cfg_version = readl(>message_rwbuffer[25]);  
/*firm_cfg_version,25,100-103*/
+   pACB->host->host_no,
+   pACB->firm_model,
+   pACB->firm_version);
+}
+
+static bool arcmsr_hbaA_get_config(struct AdapterControlBlock *acb)
+{
+   struct MessageUnit_A __iomem *reg = acb->pmuA;
+
+   arcmsr_wait_firmware_ready(acb);
+   writel(ARCMSR_INBOUND_MESG0_GET_CONFIG, >inbound_msgaddr0);
+   if (!arcmsr_hbaA_wait_msgint_ready(acb)) {
+   printk(KERN_NOTICE "arcmsr%d: wait 'get adapter firmware \
+   miscellaneous data' timeout \n", acb->host->host_no);
+   return false;
+   }
+   arcmsr_get_adapter_config(acb, reg->message_rwbuffer);
return true;
 }
 static bool arcmsr_hbaB_get_config(struct AdapterControlBlock *acb)
 {
struct MessageUnit_B *reg = acb->pmuB;
-   char *acb_firm_model = acb->firm_model;
-   char *acb_firm_version = acb->firm_version;
-   char *acb_device_map = acb->device_map;
-   char __iomem *iop_firm_model;
-   /*firm_model,15,60-67*/
-   char __iomem *iop_firm_version;
-   /*firm_version,17,68-83*/
-   char __iomem *iop_device_map;
-   /*firm_version,21

[PATCH 3/4] scsi: arcmsr: simplify arcmsr_hbaE_get_config function

2017-12-12 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

simplify arcmsr_hbaE_get_config function

Signed-off-by: Ching Huang <ching2...@areca.com.tw>
---

diff --git a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c
index dfaea8f..b7a56e8 100755
--- a/drivers/scsi/arcmsr/arcmsr_hba.c
+++ b/drivers/scsi/arcmsr/arcmsr_hba.c
@@ -3205,16 +3205,14 @@ static bool arcmsr_hbaE_get_config(struct 
AdapterControlBlock *pACB)
struct MessageUnit_E __iomem *reg = pACB->pmuE;
char __iomem *iop_firm_model = (char __iomem 
*)(>msgcode_rwbuffer[15]);
char __iomem *iop_firm_version = (char __iomem 
*)(>msgcode_rwbuffer[17]);
-   uint32_t intmask_org, Index, firmware_state = 0, read_doorbell;
+   uint32_t intmask_org;
int count;
 
/* disable all outbound interrupt */
intmask_org = readl(>host_int_mask); /* disable outbound message0 
int */
writel(intmask_org | ARCMSR_HBEMU_ALL_INTMASKENABLE, 
>host_int_mask);
/* wait firmware ready */
-   do {
-   firmware_state = readl(>outbound_msgaddr1);
-   } while ((firmware_state & ARCMSR_HBEMU_MESSAGE_FIRMWARE_OK) == 0);
+   arcmsr_wait_firmware_ready(pACB);
mdelay(20);
/* post "get config" instruction */
writel(ARCMSR_INBOUND_MESG0_GET_CONFIG, >inbound_msgaddr0);
@@ -3222,17 +3220,7 @@ static bool arcmsr_hbaE_get_config(struct 
AdapterControlBlock *pACB)
pACB->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_MESSAGE_CMD_DONE;
writel(pACB->out_doorbell, >iobound_doorbell);
/* wait message ready */
-   for (Index = 0; Index < 2000; Index++) {
-   read_doorbell = readl(>iobound_doorbell);
-   if ((read_doorbell ^ pACB->in_doorbell) & 
ARCMSR_HBEMU_IOP2DRV_MESSAGE_CMD_DONE) {
-   writel(0, >host_int_status);
-   pACB->in_doorbell = read_doorbell;
-   break;
-   }
-   mdelay(1);
-   } /*max 1 seconds*/
-
-   if (Index >= 2000) {
+   if (!arcmsr_hbaE_wait_msgint_ready(pACB)) {
pr_notice("arcmsr%d: wait get adapter firmware "
"miscellaneous data timeout\n", pACB->host->host_no);
return false;




[PATCH 2/4] scsi: arcmsr: waiting for iop firmware ready before issue get_config command to iop

2017-12-12 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

waiting for iop firmware ready before issue get_config command to iop for 
adapter type A and D

Signed-off-by: Ching Huang <ching2...@areca.com.tw>
---

diff --git a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c
index 9b587ca..dfaea8f 100755
--- a/drivers/scsi/arcmsr/arcmsr_hba.c
+++ b/drivers/scsi/arcmsr/arcmsr_hba.c
@@ -2966,6 +2966,7 @@ static bool arcmsr_hbaA_get_config(struct 
AdapterControlBlock *acb)
char __iomem *iop_firm_version = (char __iomem 
*)(>message_rwbuffer[17]);
char __iomem *iop_device_map = (char __iomem 
*)(>message_rwbuffer[21]);
int count;
+   arcmsr_wait_firmware_ready(acb);
writel(ARCMSR_INBOUND_MESG0_GET_CONFIG, >inbound_msgaddr0);
if (!arcmsr_hbaA_wait_msgint_ready(acb)) {
printk(KERN_NOTICE "arcmsr%d: wait 'get adapter firmware \
@@ -3149,6 +3150,7 @@ static bool arcmsr_hbaD_get_config(struct 
AdapterControlBlock *acb)
writel(ARCMSR_ARC1214_IOP2DRV_MESSAGE_CMD_DONE,
acb->pmuD->outbound_doorbell);/*clear interrupt*/
}
+   arcmsr_wait_firmware_ready(acb);
/* post "get config" instruction */
writel(ARCMSR_INBOUND_MESG0_GET_CONFIG, reg->inbound_msgaddr0);
/* wait message ready */




[PATCH 1/4] scsi: arcmsr: simplify arcmsr_hbaC_get_config function

2017-12-12 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

simplify arcmsr_hbaC_get_config function

Signed-off-by: Ching Huang <ching2...@areca.com.tw>
---

diff --git a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c
index e4258b6..9b587ca 100755
--- a/drivers/scsi/arcmsr/arcmsr_hba.c
+++ b/drivers/scsi/arcmsr/arcmsr_hba.c
@@ -3082,7 +3082,7 @@ static bool arcmsr_hbaB_get_config(struct 
AdapterControlBlock *acb)
 
 static bool arcmsr_hbaC_get_config(struct AdapterControlBlock *pACB)
 {
-   uint32_t intmask_org, Index, firmware_state = 0;
+   uint32_t intmask_org;
struct MessageUnit_C __iomem *reg = pACB->pmuC;
char *acb_firm_model = pACB->firm_model;
char *acb_firm_version = pACB->firm_version;
@@ -3093,21 +3093,12 @@ static bool arcmsr_hbaC_get_config(struct 
AdapterControlBlock *pACB)
intmask_org = readl(>host_int_mask); /* disable outbound message0 
int */
writel(intmask_org|ARCMSR_HBCMU_ALL_INTMASKENABLE, >host_int_mask);
/* wait firmware ready */
-   do {
-   firmware_state = readl(>outbound_msgaddr1);
-   } while ((firmware_state & ARCMSR_HBCMU_MESSAGE_FIRMWARE_OK) == 0);
+   arcmsr_wait_firmware_ready(pACB);
/* post "get config" instruction */
writel(ARCMSR_INBOUND_MESG0_GET_CONFIG, >inbound_msgaddr0);
writel(ARCMSR_HBCMU_DRV2IOP_MESSAGE_CMD_DONE, >inbound_doorbell);
/* wait message ready */
-   for (Index = 0; Index < 2000; Index++) {
-   if (readl(>outbound_doorbell) & 
ARCMSR_HBCMU_IOP2DRV_MESSAGE_CMD_DONE) {
-   
writel(ARCMSR_HBCMU_IOP2DRV_MESSAGE_CMD_DONE_DOORBELL_CLEAR, 
>outbound_doorbell_clear);/*clear interrupt*/
-   break;
-   }
-   udelay(10);
-   } /*max 1 seconds*/
-   if (Index >= 2000) {
+   if (!arcmsr_hbaC_wait_msgint_ready(pACB)) {
printk(KERN_NOTICE "arcmsr%d: wait 'get adapter firmware \
miscellaneous data' timeout \n", pACB->host->host_no);
return false;




[PATCH 0/4] scsi: arcmsr: simplify hba_get_config routine

2017-12-12 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

These patches are apply to Martin's 4.16/scsi-queue.

patch 1: simplify arcmsr_hbaC_get_config function.

patch 2: wait iop firmware ready before issue get_config command to iop.

patch 3: simplify arcmsr_hbaE_get_config function.

patch 4: simplify all arcmsr_hbaX_get_config routine by call a new 
get_adapter_config function
---



[PATCH 18/17] scsi: arcmsr: Fix report command result error when CHECK_CONDITION

2017-12-05 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

Fix report command result error when CHECK_CONDITION.

Signed-off-by: Ching Huang <ching2...@areca.com.tw>
---

diff -uprN a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c
--- a/drivers/scsi/arcmsr/arcmsr_hba.c  2017-12-05 17:04:52.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr_hba.c  2017-12-05 19:17:28.0 +0800
@@ -1205,7 +1205,7 @@ static void arcmsr_report_sense_info(str
 
struct scsi_cmnd *pcmd = ccb->pcmd;
struct SENSE_DATA *sensebuffer = (struct SENSE_DATA 
*)pcmd->sense_buffer;
-   pcmd->result = DID_OK << 16;
+   pcmd->result = (DID_OK << 16) | (CHECK_CONDITION << 1);
if (sensebuffer) {
int sense_data_length =
sizeof(struct SENSE_DATA) < SCSI_SENSE_BUFFERSIZE
@@ -1214,6 +1214,7 @@ static void arcmsr_report_sense_info(str
memcpy(sensebuffer, ccb->arcmsr_cdb.SenseData, 
sense_data_length);
sensebuffer->ErrorCode = SCSI_SENSE_CURRENT_ERRORS;
sensebuffer->Valid = 1;
+   pcmd->result |= (DRIVER_SENSE << 24);
}
 }
 




[PATCH 17/17] scsi: arcmsr: Update driver version to v1.40.00.04-20171130

2017-12-05 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

Update driver version to v1.40.00.04-20171130

Signed-off-by: Ching Huang <ching2...@areca.com.tw>
---

diff -uprN a/drivers/scsi/arcmsr/arcmsr.h b/drivers/scsi/arcmsr/arcmsr.h
--- a/drivers/scsi/arcmsr/arcmsr.h  2017-12-05 15:30:30.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr.h  2017-12-05 09:18:58.0 +0800
@@ -49,7 +49,7 @@ struct device_attribute;
 #define ARCMSR_MAX_OUTSTANDING_CMD 1024
 #define ARCMSR_DEFAULT_OUTSTANDING_CMD 128
 #define ARCMSR_MIN_OUTSTANDING_CMD 32
-#define ARCMSR_DRIVER_VERSION  "v1.30.00.22-20151126"
+#define ARCMSR_DRIVER_VERSION  "v1.40.00.04-20171130"
 #define ARCMSR_SCSI_INITIATOR_ID   255
 #define ARCMSR_MAX_XFER_SECTORS512
 #define ARCMSR_MAX_XFER_SECTORS_B  4096




[PATCH 16/17] scsi: arcmsr: Add driver module parameter msix_enable

2017-12-05 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

Add module parameter msix_enable to has a chance to disable msix interrupt if 
between controller and system has
msix INT compatible issue.

Signed-off-by: Ching Huang <ching2...@areca.com.tw>
---

diff -uprN a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c
--- a/drivers/scsi/arcmsr/arcmsr_hba.c  2017-12-05 16:59:58.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr_hba.c  2017-12-05 17:04:52.0 +0800
@@ -75,6 +75,10 @@ MODULE_DESCRIPTION("Areca ARC11xx/12xx/1
 MODULE_LICENSE("Dual BSD/GPL");
 MODULE_VERSION(ARCMSR_DRIVER_VERSION);
 
+static int msix_enable = 1;
+module_param(msix_enable, int, S_IRUGO);
+MODULE_PARM_DESC(msix_enable, "Enable MSI-X interrupt(0 ~ 1), 
msix_enable=1(enable), =0(disable)");
+
 static int msi_enable = 1;
 module_param(msi_enable, int, S_IRUGO);
 MODULE_PARM_DESC(msi_enable, "Enable MSI interrupt(0 ~ 1), 
msi_enable=1(enable), =0(disable)");
@@ -829,12 +833,15 @@ arcmsr_request_irq(struct pci_dev *pdev,
unsigned long flags;
int nvec, i;
 
+   if (msix_enable == 0)
+   goto msi_int0;
nvec = pci_alloc_irq_vectors(pdev, 1, ARCMST_NUM_MSIX_VECTORS,
PCI_IRQ_MSIX);
if (nvec > 0) {
pr_info("arcmsr%d: msi-x enabled\n", acb->host->host_no);
flags = 0;
} else {
+msi_int0:
if (msi_enable == 1) {
nvec = pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_MSI);
if (nvec == 1) {





[PATCH 15/17] scsi: arcmsr: Add driver module parameter msi_enable

2017-12-05 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

Add module parameter msi_enable to has a chance to disable msi interrupt if 
between controller and system has
msi INT compatible issue.

Signed-off-by: Ching Huang <ching2...@areca.com.tw>
---

diff -uprN a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c
--- a/drivers/scsi/arcmsr/arcmsr_hba.c  2017-12-05 11:44:36.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr_hba.c  2017-12-05 16:59:58.0 +0800
@@ -75,6 +75,10 @@ MODULE_DESCRIPTION("Areca ARC11xx/12xx/1
 MODULE_LICENSE("Dual BSD/GPL");
 MODULE_VERSION(ARCMSR_DRIVER_VERSION);
 
+static int msi_enable = 1;
+module_param(msi_enable, int, S_IRUGO);
+MODULE_PARM_DESC(msi_enable, "Enable MSI interrupt(0 ~ 1), 
msi_enable=1(enable), =0(disable)");
+
 static int host_can_queue = ARCMSR_DEFAULT_OUTSTANDING_CMD;
 module_param(host_can_queue, int, S_IRUGO);
 MODULE_PARM_DESC(host_can_queue, " adapter queue depth(32 ~ 1024), default is 
128");
@@ -831,11 +835,17 @@ arcmsr_request_irq(struct pci_dev *pdev,
pr_info("arcmsr%d: msi-x enabled\n", acb->host->host_no);
flags = 0;
} else {
-   nvec = pci_alloc_irq_vectors(pdev, 1, 1,
-   PCI_IRQ_MSI | PCI_IRQ_LEGACY);
+   if (msi_enable == 1) {
+   nvec = pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_MSI);
+   if (nvec == 1) {
+   dev_info(>dev, "msi enabled\n");
+   goto msi_int1;
+   }
+   }
+   nvec = pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_LEGACY);
if (nvec < 1)
return FAILED;
-
+msi_int1:
flags = IRQF_SHARED;
}
 




[PATCH 14/17] scsi: arcmsr: fix grammar error

2017-12-05 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

fix grammar error.

Signed-off-by: Ching Huang <ching2...@areca.com.tw>
---

diff -uprN a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c
--- a/drivers/scsi/arcmsr/arcmsr_hba.c  2017-12-05 11:44:52.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr_hba.c  2017-12-05 11:44:36.0 +0800
@@ -4453,7 +4453,7 @@ static int arcmsr_bus_reset(struct scsi_
 
if (acb->acb_flags & ACB_F_BUS_RESET) {
long timeout;
-   pr_notice("arcmsr: there is an bus reset eh proceeding...\n");
+   pr_notice("arcmsr: there is a bus reset eh proceeding...\n");
timeout = wait_event_timeout(wait_q, (acb->acb_flags
& ACB_F_BUS_RESET) == 0, 220 * HZ);
if (timeout)




[PATCH 13/17] scsi: arcmsr: adjust some tab or white-space to make text alignment

2017-12-05 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

adjust some tab or white-space to make text alignment

Signed-off-by: Ching Huang <ching2...@areca.com.tw>
---

diff -uprN a/drivers/scsi/arcmsr/arcmsr.h b/drivers/scsi/arcmsr/arcmsr.h
--- a/drivers/scsi/arcmsr/arcmsr.h  2017-12-05 15:28:50.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr.h  2017-12-05 15:29:38.0 +0800
@@ -50,35 +50,35 @@ struct device_attribute;
 #define ARCMSR_DEFAULT_OUTSTANDING_CMD 128
 #define ARCMSR_MIN_OUTSTANDING_CMD 32
 #define ARCMSR_DRIVER_VERSION  "v1.30.00.22-20151126"
-#define ARCMSR_SCSI_INITIATOR_ID   
255
-#define ARCMSR_MAX_XFER_SECTORS
512
-#define ARCMSR_MAX_XFER_SECTORS_B  
4096
-#define ARCMSR_MAX_XFER_SECTORS_C  
304
-#define ARCMSR_MAX_TARGETID
17
-#define ARCMSR_MAX_TARGETLUN   
8
+#define ARCMSR_SCSI_INITIATOR_ID   255
+#define ARCMSR_MAX_XFER_SECTORS512
+#define ARCMSR_MAX_XFER_SECTORS_B  4096
+#define ARCMSR_MAX_XFER_SECTORS_C  304
+#define ARCMSR_MAX_TARGETID17
+#define ARCMSR_MAX_TARGETLUN   8
 #define ARCMSR_MAX_CMD_PERLUN  128
 #define ARCMSR_DEFAULT_CMD_PERLUN  32
 #define ARCMSR_MIN_CMD_PERLUN  1
-#define ARCMSR_MAX_QBUFFER 
4096
-#define ARCMSR_DEFAULT_SG_ENTRIES  
38
-#define ARCMSR_MAX_HBB_POSTQUEUE   
264
+#define ARCMSR_MAX_QBUFFER 4096
+#define ARCMSR_DEFAULT_SG_ENTRIES  38
+#define ARCMSR_MAX_HBB_POSTQUEUE   264
 #define ARCMSR_MAX_ARC1214_POSTQUEUE   256
 #define ARCMSR_MAX_ARC1214_DONEQUEUE   257
 #define ARCMSR_MAX_HBE_DONEQUEUE   512
-#define ARCMSR_MAX_XFER_LEN
0x26000 /* 152K */
-#define ARCMSR_CDB_SG_PAGE_LENGTH  
256 
+#define ARCMSR_MAX_XFER_LEN0x26000 /* 152K */
+#define ARCMSR_CDB_SG_PAGE_LENGTH  256 
 #define ARCMST_NUM_MSIX_VECTORS4
 #ifndef PCI_DEVICE_ID_ARECA_1880
-#define PCI_DEVICE_ID_ARECA_1880 0x1880
- #endif
+#define PCI_DEVICE_ID_ARECA_1880   0x1880
+#endif
 #ifndef PCI_DEVICE_ID_ARECA_1214
-   #define PCI_DEVICE_ID_ARECA_12140x1214
+#define PCI_DEVICE_ID_ARECA_1214   0x1214
 #endif
 #ifndef PCI_DEVICE_ID_ARECA_1203
-   #define PCI_DEVICE_ID_ARECA_12030x1203
+#define PCI_DEVICE_ID_ARECA_1203   0x1203
 #endif
 #ifndef PCI_DEVICE_ID_ARECA_1884
-   #define PCI_DEVICE_ID_ARECA_18840x1884
+#define PCI_DEVICE_ID_ARECA_1884   0x1884
 #endif
 #defineARCMSR_HOURS(1000 * 60 * 60 * 4)
 #defineARCMSR_MINUTES  (1000 * 60 * 60)
@@ -87,15 +87,15 @@ struct device_attribute;
 **
 
**
 */
-#define ARC_SUCCESS   0
-#define ARC_FAILURE   1
+#define ARC_SUCCESS0
+#define ARC_FAILURE1
 /*
 ***
 **split 64bits dma addressing
 ***
 */
-#define dma_addr_hi32(addr)   (uint32_t) ((addr>>16)>>16)
-#define dma_addr_lo32(addr)   (uint32_t) (addr & 0x)
+#define dma_addr_hi32(addr)(uint32_t) ((addr>>16)>>16)
+#define dma_addr_lo32(addr)(uint32_t) (addr & 0x)
 /*
 ***
 **MESSAGE CONTROL CODE
@@ -135,7 +135,7 @@ struct CMD_MESSAGE_FIELD
 #define FUNCTION_SAY_HELLO 0x0807
 #define FUNCTION_SAY_GOODBYE   0x0808
 #define FUNCTION_FLUSH_ADAPTER_CACHE   0x0809
-#define FUNCTION_GET_FIRMWARE_STATUS   0x080A
+#define FUNCTION_GET_FIRMWARE_STATUS   0x080A
 #define FUNCTION_HARDWARE_RESET0x080B
 /* ARECA IO CONTROL CODE*/
 #define ARCMSR_MESSAGE_READ_RQBUFFER   \
@@ -166,18 +166,18 @@ struct CMD_MESSAGE_FIELD
 **   structure for holding DMA address data
 *
 */
-#define IS_DMA64   (sizeof(dma_addr_t) == 8)
-#define IS_SG64_ADDR0x0100 /* bit24 */
+#define IS_DMA64   (sizeof(dma_addr_t) == 8)
+#define IS_SG64_ADDR   0x0100 /* bit24 */
 struct  SG32ENTRY
 {
-   __le32  length;
-   __le32   

[PATCH 12/17] scsi: arcmsr: spin off duplicate code of timer init for message isr BH in arcmsr_probe and arcmsr_resume as a function

2017-12-05 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

spin off duplicate code of timer init for message isr BH in arcmsr_probe and 
arcmsr_resume as a function arcmsr_init_get_devmap_timer

Signed-off-by: Ching Huang <ching2...@areca.com.tw>
---

diff -uprN a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c
--- a/drivers/scsi/arcmsr/arcmsr_hba.c  2017-12-05 11:45:34.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr_hba.c  2017-12-05 11:45:06.0 +0800
@@ -857,6 +857,17 @@ out_free_irq:
return FAILED;
 }
 
+static void arcmsr_init_get_devmap_timer(struct AdapterControlBlock *pacb)
+{
+   INIT_WORK(>arcmsr_do_message_isr_bh, arcmsr_message_isr_bh_fn);
+   atomic_set(>rq_map_token, 16);
+   atomic_set(>ante_token_value, 16);
+   pacb->fw_flag = FW_NORMAL;
+   timer_setup(>eternal_timer, arcmsr_request_device_map, 0);
+   pacb->eternal_timer.expires = jiffies + msecs_to_jiffies(6 * HZ);
+   add_timer(>eternal_timer);
+}
+
 static void arcmsr_init_set_datetime_timer(struct AdapterControlBlock *pacb)
 {
timer_setup(>refresh_timer, arcmsr_set_iop_datetime, 0);
@@ -946,13 +957,7 @@ static int arcmsr_probe(struct pci_dev *
if (arcmsr_request_irq(pdev, acb) == FAILED)
goto scsi_host_remove;
arcmsr_iop_init(acb);
-   INIT_WORK(>arcmsr_do_message_isr_bh, arcmsr_message_isr_bh_fn);
-   atomic_set(>rq_map_token, 16);
-   atomic_set(>ante_token_value, 16);
-   acb->fw_flag = FW_NORMAL;
-   timer_setup(>eternal_timer, arcmsr_request_device_map, 0);
-   acb->eternal_timer.expires = jiffies + msecs_to_jiffies(6 * HZ);
-   add_timer(>eternal_timer);
+   arcmsr_init_get_devmap_timer(acb);
if (set_date_time)
arcmsr_init_set_datetime_timer(acb);
if(arcmsr_alloc_sysfs_attr(acb))
@@ -1043,13 +1048,7 @@ static int arcmsr_resume(struct pci_dev 
if (arcmsr_request_irq(pdev, acb) == FAILED)
goto controller_stop;
arcmsr_iop_init(acb);
-   INIT_WORK(>arcmsr_do_message_isr_bh, arcmsr_message_isr_bh_fn);
-   atomic_set(>rq_map_token, 16);
-   atomic_set(>ante_token_value, 16);
-   acb->fw_flag = FW_NORMAL;
-   timer_setup(>eternal_timer, arcmsr_request_device_map, 0);
-   acb->eternal_timer.expires = jiffies + msecs_to_jiffies(6 * HZ);
-   add_timer(>eternal_timer);
+   arcmsr_init_get_devmap_timer(acb);
if (set_date_time)
arcmsr_init_set_datetime_timer(acb);
return 0;




[PATCH 11/17] scsi: arcmsr: fix clear doorbell queue on ACB_ADAPTER_TYPE_B controller

2017-12-05 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

fix clear doorbell queue on ACB_ADAPTER_TYPE_B controller

Signed-off-by: Ching Huang <ching2...@areca.com.tw>
---

diff -uprN a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c
--- a/drivers/scsi/arcmsr/arcmsr_hba.c  2017-12-05 11:45:52.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr_hba.c  2017-12-05 11:45:34.0 +0800
@@ -4196,10 +4196,19 @@ static void arcmsr_clear_doorbell_queue_
 
case ACB_ADAPTER_TYPE_B: {
struct MessageUnit_B *reg = acb->pmuB;
-   /*clear interrupt and message state*/
-   writel(ARCMSR_MESSAGE_INT_CLEAR_PATTERN, reg->iop2drv_doorbell);
+   uint32_t outbound_doorbell, i;
+   writel(ARCMSR_DOORBELL_INT_CLEAR_PATTERN, 
reg->iop2drv_doorbell);
writel(ARCMSR_DRV2IOP_DATA_READ_OK, reg->drv2iop_doorbell);
/* let IOP know data has been read */
+   for(i=0; i < 200; i++) {
+   msleep(20);
+   outbound_doorbell = readl(reg->iop2drv_doorbell);
+   if( outbound_doorbell & ARCMSR_IOP2DRV_DATA_WRITE_OK) {
+   writel(ARCMSR_DOORBELL_INT_CLEAR_PATTERN, 
reg->iop2drv_doorbell);
+   writel(ARCMSR_DRV2IOP_DATA_READ_OK, 
reg->drv2iop_doorbell);
+   } else
+   break;
+   }
}
break;
case ACB_ADAPTER_TYPE_C: {




[PATCH 10/17] scsi: arcmsr: add a function arcmsr_set_iop_datetime and driver option set_date_time to set date and time to firmware

2017-12-05 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

add a function arcmsr_set_iop_datetime and driver option set_date_time to set 
date and time to firmware

Signed-off-by: Ching Huang <ching2...@areca.com.tw>
---

diff -uprN a/drivers/scsi/arcmsr/arcmsr.h b/drivers/scsi/arcmsr/arcmsr.h
--- a/drivers/scsi/arcmsr/arcmsr.h  2017-12-05 15:27:04.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr.h  2017-12-05 15:27:32.0 +0800
@@ -80,6 +80,8 @@ struct device_attribute;
 #ifndef PCI_DEVICE_ID_ARECA_1884
#define PCI_DEVICE_ID_ARECA_18840x1884
 #endif
+#defineARCMSR_HOURS(1000 * 60 * 60 * 4)
+#defineARCMSR_MINUTES  (1000 * 60 * 60)
 /*
 
**
 **
@@ -280,6 +282,7 @@ struct FIRMWARE_INFO
 #define ARCMSR_MESSAGE_FLUSH_CACHE0x00050008
 /* (ARCMSR_INBOUND_MESG0_START_BGRB<<16)|ARCMSR_DRV2IOP_MESSAGE_CMD_POSTED) */
 #define ARCMSR_MESSAGE_START_BGRB0x00060008
+#define ARCMSR_MESSAGE_SYNC_TIMER  0x00080008
 #define ARCMSR_MESSAGE_START_DRIVER_MODE 0x000E0008
 #define ARCMSR_MESSAGE_SET_POST_WINDOW   0x000F0008
 #define ARCMSR_MESSAGE_ACTIVE_EOI_MODE 0x0018
@@ -837,6 +840,7 @@ struct AdapterControlBlock
uint32_tmaxOutstanding;
int vector_count;
uint32_tmaxFreeCCB;
+   struct timer_list   refresh_timer;
uint32_tdoneq_index;
uint32_tccbsize;
uint32_tin_doorbell;
diff -uprN a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c
--- a/drivers/scsi/arcmsr/arcmsr_hba.c  2017-12-05 11:46:06.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr_hba.c  2017-12-05 11:45:52.0 +0800
@@ -83,6 +83,10 @@ static int cmd_per_lun = ARCMSR_DEFAULT_
 module_param(cmd_per_lun, int, S_IRUGO);
 MODULE_PARM_DESC(cmd_per_lun, " device queue depth(1 ~ 128), default is 32");
 
+static int set_date_time = 0;
+module_param(set_date_time, int, S_IRUGO);
+MODULE_PARM_DESC(set_date_time, " send date, time to iop(0 ~ 1), 
set_date_time=1(enable), default(=0) is disable");
+
 #defineARCMSR_SLEEPTIME10
 #defineARCMSR_RETRYCOUNT   12
 
@@ -125,6 +129,7 @@ static const char *arcmsr_info(struct Sc
 static irqreturn_t arcmsr_interrupt(struct AdapterControlBlock *acb);
 static void arcmsr_free_irq(struct pci_dev *, struct AdapterControlBlock *);
 static void arcmsr_wait_firmware_ready(struct AdapterControlBlock *acb);
+static void arcmsr_set_iop_datetime(struct timer_list *);
 static int arcmsr_adjust_disk_queue_depth(struct scsi_device *sdev, int 
queue_depth)
 {
if (queue_depth > ARCMSR_MAX_CMD_PERLUN)
@@ -852,6 +857,13 @@ out_free_irq:
return FAILED;
 }
 
+static void arcmsr_init_set_datetime_timer(struct AdapterControlBlock *pacb)
+{
+   timer_setup(>refresh_timer, arcmsr_set_iop_datetime, 0);
+   pacb->refresh_timer.expires = jiffies + msecs_to_jiffies(60 * 1000);
+   add_timer(>refresh_timer);
+}
+
 static int arcmsr_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 {
struct Scsi_Host *host;
@@ -941,11 +953,15 @@ static int arcmsr_probe(struct pci_dev *
timer_setup(>eternal_timer, arcmsr_request_device_map, 0);
acb->eternal_timer.expires = jiffies + msecs_to_jiffies(6 * HZ);
add_timer(>eternal_timer);
+   if (set_date_time)
+   arcmsr_init_set_datetime_timer(acb);
if(arcmsr_alloc_sysfs_attr(acb))
goto out_free_sysfs;
scsi_scan_host(host);
return 0;
 out_free_sysfs:
+   if (set_date_time)
+   del_timer_sync(>refresh_timer);
del_timer_sync(>eternal_timer);
flush_work(>arcmsr_do_message_isr_bh);
arcmsr_stop_adapter_bgrb(acb);
@@ -988,6 +1004,8 @@ static int arcmsr_suspend(struct pci_dev
intmask_org = arcmsr_disable_outbound_ints(acb);
arcmsr_free_irq(pdev, acb);
del_timer_sync(>eternal_timer);
+   if (set_date_time)
+   del_timer_sync(>refresh_timer);
flush_work(>arcmsr_do_message_isr_bh);
arcmsr_stop_adapter_bgrb(acb);
arcmsr_flush_adapter_cache(acb);
@@ -1032,6 +1050,8 @@ static int arcmsr_resume(struct pci_dev 
timer_setup(>eternal_timer, arcmsr_request_device_map, 0);
acb->eternal_timer.expires = jiffies + msecs_to_jiffies(6 * HZ);
add_timer(>eternal_timer);
+   if (set_date_time)
+   arcmsr_init_set_datetime_timer(acb);
return 0;
 controller_stop:
arcmsr_stop_adapter_bgrb(acb);
@@ -1422,6 +1442,8 @@ static void arcmsr_remove(struct pci_dev
scsi_remove_host(host);
flush_work(>arcmsr_do_message_isr_bh);
del_timer_sync(

[PATCH 9/17] scsi: arcmsr: add ACB_F_MSG_GET_CONFIG to acb->acb_flags for for message interrupt checking before schedule work for get device map

2017-12-05 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

add ACB_F_MSG_GET_CONFIG to acb->acb_flags for for message interrupt checking 
before schedule work for get device map

Signed-off-by: Ching Huang <ching2...@areca.com.tw>
---

diff -uprN a/drivers/scsi/arcmsr/arcmsr.h b/drivers/scsi/arcmsr/arcmsr.h
--- a/drivers/scsi/arcmsr/arcmsr.h  2017-12-05 15:26:32.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr.h  2017-12-05 15:27:04.0 +0800
@@ -782,6 +782,7 @@ struct AdapterControlBlock
/* iop init */
#define ACB_F_ABORT 0x0200
#define ACB_F_FIRMWARE_TRAP 0x0400
+   #define ACB_F_MSG_GET_CONFIG0x1000
struct CommandControlBlock *
pccb_pool[ARCMSR_MAX_FREECCB_NUM];
/* used for memory free */
struct list_headccb_free_list;
diff -uprN a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c
--- a/drivers/scsi/arcmsr/arcmsr_hba.c  2017-12-05 11:46:18.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr_hba.c  2017-12-05 11:46:06.0 +0800
@@ -743,6 +743,7 @@ static void arcmsr_message_isr_bh_fn(str
struct scsi_device *psdev;
char diff, temp;
 
+   acb->acb_flags &= ~ACB_F_MSG_GET_CONFIG;
switch (acb->adapter_type) {
case ACB_ADAPTER_TYPE_A: {
struct MessageUnit_A __iomem *reg  = acb->pmuA;
@@ -2328,7 +2329,8 @@ static void arcmsr_hbaA_message_isr(stru
struct MessageUnit_A __iomem *reg  = acb->pmuA;
/*clear interrupt and message state*/
writel(ARCMSR_MU_OUTBOUND_MESSAGE0_INT, >outbound_intstatus);
-   schedule_work(>arcmsr_do_message_isr_bh);
+   if (acb->acb_flags & ACB_F_MSG_GET_CONFIG)
+   schedule_work(>arcmsr_do_message_isr_bh);
 }
 static void arcmsr_hbaB_message_isr(struct AdapterControlBlock *acb)
 {
@@ -2336,7 +2338,8 @@ static void arcmsr_hbaB_message_isr(stru
 
/*clear interrupt and message state*/
writel(ARCMSR_MESSAGE_INT_CLEAR_PATTERN, reg->iop2drv_doorbell);
-   schedule_work(>arcmsr_do_message_isr_bh);
+   if (acb->acb_flags & ACB_F_MSG_GET_CONFIG)
+   schedule_work(>arcmsr_do_message_isr_bh);
 }
 /*
 
**
@@ -2352,7 +2355,8 @@ static void arcmsr_hbaC_message_isr(stru
struct MessageUnit_C __iomem *reg  = acb->pmuC;
/*clear interrupt and message state*/
writel(ARCMSR_HBCMU_IOP2DRV_MESSAGE_CMD_DONE_DOORBELL_CLEAR, 
>outbound_doorbell_clear);
-   schedule_work(>arcmsr_do_message_isr_bh);
+   if (acb->acb_flags & ACB_F_MSG_GET_CONFIG)
+   schedule_work(>arcmsr_do_message_isr_bh);
 }
 
 static void arcmsr_hbaD_message_isr(struct AdapterControlBlock *acb)
@@ -2361,7 +2365,8 @@ static void arcmsr_hbaD_message_isr(stru
 
writel(ARCMSR_ARC1214_IOP2DRV_MESSAGE_CMD_DONE, reg->outbound_doorbell);
readl(reg->outbound_doorbell);
-   schedule_work(>arcmsr_do_message_isr_bh);
+   if (acb->acb_flags & ACB_F_MSG_GET_CONFIG)
+   schedule_work(>arcmsr_do_message_isr_bh);
 }
 
 static void arcmsr_hbaE_message_isr(struct AdapterControlBlock *acb)
@@ -2369,7 +2374,8 @@ static void arcmsr_hbaE_message_isr(stru
struct MessageUnit_E __iomem *reg  = acb->pmuE;
 
writel(0, >host_int_status);
-   schedule_work(>arcmsr_do_message_isr_bh);
+   if (acb->acb_flags & ACB_F_MSG_GET_CONFIG)
+   schedule_work(>arcmsr_do_message_isr_bh);
 }
 
 static int arcmsr_hbaA_handle_isr(struct AdapterControlBlock *acb)
@@ -3826,6 +3832,7 @@ static void arcmsr_hbaA_request_device_m
return;
}
writel(ARCMSR_INBOUND_MESG0_GET_CONFIG, >inbound_msgaddr0);
+   acb->acb_flags |= ACB_F_MSG_GET_CONFIG;
mod_timer(>eternal_timer, jiffies + msecs_to_jiffies(6 * 
HZ));
}
return;
@@ -3848,6 +3855,7 @@ static void arcmsr_hbaB_request_device_m
return;
}
writel(ARCMSR_MESSAGE_GET_CONFIG, reg->drv2iop_doorbell);
+   acb->acb_flags |= ACB_F_MSG_GET_CONFIG;
mod_timer(>eternal_timer, jiffies + msecs_to_jiffies(6 * 
HZ));
}
return;
@@ -3871,6 +3879,7 @@ static void arcmsr_hbaC_request_device_m
}
writel(ARCMSR_INBOUND_MESG0_GET_CONFIG, >inbound_msgaddr0);
writel(ARCMSR_HBCMU_DRV2IOP_MESSAGE_CMD_DONE, 
>inbound_doorbell);
+   acb->acb_flags |= ACB_F_MSG_GET_CONFIG;
mod_timer(>eternal_timer, jiffies + msecs_to_jiffies(6 * 
HZ));
}
return;
@@ -3900,6 +3909,7 @@ static void arcmsr_hbaD_request_device_m
}
writel(ARCMSR_INBOU

[PATCH 8/17] scsi: arcmsr: add driver option cmd_per_lun to set host->cmd_per_lun value by user

2017-12-05 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

add driver option cmd_per_lun to set host->cmd_per_lun value by user

Signed-off-by: Ching Huang <ching2...@areca.com.tw>
---

diff -uprN a/drivers/scsi/arcmsr/arcmsr.h b/drivers/scsi/arcmsr/arcmsr.h
--- a/drivers/scsi/arcmsr/arcmsr.h  2017-12-05 15:26:06.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr.h  2017-12-05 15:26:32.0 +0800
@@ -56,7 +56,9 @@ struct device_attribute;
 #define ARCMSR_MAX_XFER_SECTORS_C  
304
 #define ARCMSR_MAX_TARGETID
17
 #define ARCMSR_MAX_TARGETLUN   
8
-#define ARCMSR_MAX_CMD_PERLUN   
ARCMSR_MAX_OUTSTANDING_CMD
+#define ARCMSR_MAX_CMD_PERLUN  128
+#define ARCMSR_DEFAULT_CMD_PERLUN  32
+#define ARCMSR_MIN_CMD_PERLUN  1
 #define ARCMSR_MAX_QBUFFER 
4096
 #define ARCMSR_DEFAULT_SG_ENTRIES  
38
 #define ARCMSR_MAX_HBB_POSTQUEUE   
264
diff -uprN a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c
--- a/drivers/scsi/arcmsr/arcmsr_hba.c  2017-12-05 11:46:30.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr_hba.c  2017-12-05 11:46:18.0 +0800
@@ -79,6 +79,10 @@ static int host_can_queue = ARCMSR_DEFAU
 module_param(host_can_queue, int, S_IRUGO);
 MODULE_PARM_DESC(host_can_queue, " adapter queue depth(32 ~ 1024), default is 
128");
 
+static int cmd_per_lun = ARCMSR_DEFAULT_CMD_PERLUN;
+module_param(cmd_per_lun, int, S_IRUGO);
+MODULE_PARM_DESC(cmd_per_lun, " device queue depth(1 ~ 128), default is 32");
+
 #defineARCMSR_SLEEPTIME10
 #defineARCMSR_RETRYCOUNT   12
 
@@ -141,7 +145,7 @@ static struct scsi_host_template arcmsr_
.this_id= ARCMSR_SCSI_INITIATOR_ID,
.sg_tablesize   = ARCMSR_DEFAULT_SG_ENTRIES, 
.max_sectors= ARCMSR_MAX_XFER_SECTORS_C, 
-   .cmd_per_lun= ARCMSR_MAX_CMD_PERLUN,
+   .cmd_per_lun= ARCMSR_DEFAULT_CMD_PERLUN,
.use_clustering = ENABLE_CLUSTERING,
.shost_attrs= arcmsr_host_attrs,
.no_write_same  = 1,
@@ -884,7 +888,9 @@ static int arcmsr_probe(struct pci_dev *
if ((host_can_queue < ARCMSR_MIN_OUTSTANDING_CMD) || (host_can_queue > 
ARCMSR_MAX_OUTSTANDING_CMD))
host_can_queue = ARCMSR_DEFAULT_OUTSTANDING_CMD;
host->can_queue = host_can_queue;   /* max simultaneous cmds */ 

-   host->cmd_per_lun = ARCMSR_MAX_CMD_PERLUN;  
+   if ((cmd_per_lun < ARCMSR_MIN_CMD_PERLUN) || (cmd_per_lun > 
ARCMSR_MAX_CMD_PERLUN))
+   cmd_per_lun = ARCMSR_DEFAULT_CMD_PERLUN;
+   host->cmd_per_lun = cmd_per_lun;
host->this_id = ARCMSR_SCSI_INITIATOR_ID;
host->unique_id = (bus << 8) | dev_fun;
pci_set_drvdata(pdev, host);




[PATCH 7/17] scsi: arcmsr: replace constant ARCMSR_MAX_OUTSTANDING_CMD by variable acb->maxOutstanding that was determined by user

2017-12-05 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

replace constant ARCMSR_MAX_OUTSTANDING_CMD by variable acb->maxOutstanding 
that was determined by user

Signed-off-by: Ching Huang <ching2...@areca.com.tw>
---

diff -uprN a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c
--- a/drivers/scsi/arcmsr/arcmsr_hba.c  2017-12-05 11:46:50.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr_hba.c  2017-12-05 11:46:30.0 +0800
@@ -1315,7 +1315,7 @@ static void arcmsr_done4abort_postqueue(
/*clear and abort all outbound posted Q*/
writel(outbound_intstatus, >outbound_intstatus);/*clear 
interrupt*/
while(((flag_ccb = readl(>outbound_queueport)) != 
0x)
-   && (i++ < ARCMSR_MAX_OUTSTANDING_CMD)) {
+   && (i++ < acb->maxOutstanding)) {
pARCMSR_CDB = (struct ARCMSR_CDB *)(acb->vir2phy_offset 
+ (flag_ccb << 5));/*frame must be 32 bytes aligned*/
pCCB = container_of(pARCMSR_CDB, struct 
CommandControlBlock, arcmsr_cdb);
error = (flag_ccb & ARCMSR_CCBREPLY_FLAG_ERROR_MODE0) ? 
true : false;
@@ -1345,7 +1345,7 @@ static void arcmsr_done4abort_postqueue(
break;
case ACB_ADAPTER_TYPE_C: {
struct MessageUnit_C __iomem *reg = acb->pmuC;
-   while ((readl(>host_int_status) & 
ARCMSR_HBCMU_OUTBOUND_POSTQUEUE_ISR) && (i++ < ARCMSR_MAX_OUTSTANDING_CMD)) {
+   while ((readl(>host_int_status) & 
ARCMSR_HBCMU_OUTBOUND_POSTQUEUE_ISR) && (i++ < acb->maxOutstanding)) {
/*need to do*/
flag_ccb = readl(>outbound_queueport_low);
ccb_cdb_phy = (flag_ccb & 0xFFF0);
@@ -1421,7 +1421,7 @@ static void arcmsr_remove(struct pci_dev
acb->acb_flags |= ACB_F_SCSISTOPADAPTER;
acb->acb_flags &= ~ACB_F_IOP_INITED;
 
-   for (poll_count = 0; poll_count < ARCMSR_MAX_OUTSTANDING_CMD; 
poll_count++){
+   for (poll_count = 0; poll_count < acb->maxOutstanding; poll_count++){
if (!atomic_read(>ccboutstandingcount))
break;
arcmsr_interrupt(acb);/* FIXME: need spinlock */




[PATCH 6/17] scsi: arcmsr: add driver option host_can_queue to set host->can_queue value by user

2017-12-05 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

add driver option host_can_queue to set host->can_queue value by user. It's 
value expands up to 1024

Signed-off-by: Ching Huang <ching2...@areca.com.tw>
---

diff -uprN a/drivers/scsi/arcmsr/arcmsr.h b/drivers/scsi/arcmsr/arcmsr.h
--- a/drivers/scsi/arcmsr/arcmsr.h  2017-12-05 15:25:06.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr.h  2017-12-05 15:25:36.0 +0800
@@ -47,6 +47,8 @@ struct device_attribute;
 /*The limit of outstanding scsi command that firmware can handle*/
 #define ARCMSR_MAX_FREECCB_NUM 1024
 #define ARCMSR_MAX_OUTSTANDING_CMD 1024
+#define ARCMSR_DEFAULT_OUTSTANDING_CMD 128
+#define ARCMSR_MIN_OUTSTANDING_CMD 32
 #define ARCMSR_DRIVER_VERSION  "v1.30.00.22-20151126"
 #define ARCMSR_SCSI_INITIATOR_ID   
255
 #define ARCMSR_MAX_XFER_SECTORS
512
diff -uprN a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c
--- a/drivers/scsi/arcmsr/arcmsr_hba.c  2017-12-05 11:47:04.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr_hba.c  2017-12-05 11:46:50.0 +0800
@@ -75,6 +75,10 @@ MODULE_DESCRIPTION("Areca ARC11xx/12xx/1
 MODULE_LICENSE("Dual BSD/GPL");
 MODULE_VERSION(ARCMSR_DRIVER_VERSION);
 
+static int host_can_queue = ARCMSR_DEFAULT_OUTSTANDING_CMD;
+module_param(host_can_queue, int, S_IRUGO);
+MODULE_PARM_DESC(host_can_queue, " adapter queue depth(32 ~ 1024), default is 
128");
+
 #defineARCMSR_SLEEPTIME10
 #defineARCMSR_RETRYCOUNT   12
 
@@ -133,7 +137,7 @@ static struct scsi_host_template arcmsr_
.eh_bus_reset_handler   = arcmsr_bus_reset,
.bios_param = arcmsr_bios_param,
.change_queue_depth = arcmsr_adjust_disk_queue_depth,
-   .can_queue  = ARCMSR_MAX_OUTSTANDING_CMD,
+   .can_queue  = ARCMSR_DEFAULT_OUTSTANDING_CMD,
.this_id= ARCMSR_SCSI_INITIATOR_ID,
.sg_tablesize   = ARCMSR_DEFAULT_SG_ENTRIES, 
.max_sectors= ARCMSR_MAX_XFER_SECTORS_C, 
@@ -877,7 +881,9 @@ static int arcmsr_probe(struct pci_dev *
host->max_lun = ARCMSR_MAX_TARGETLUN;
host->max_id = ARCMSR_MAX_TARGETID; /*16:8*/
host->max_cmd_len = 16; /*this is issue of 
64bit LBA ,over 2T byte*/
-   host->can_queue = ARCMSR_MAX_OUTSTANDING_CMD;
+   if ((host_can_queue < ARCMSR_MIN_OUTSTANDING_CMD) || (host_can_queue > 
ARCMSR_MAX_OUTSTANDING_CMD))
+   host_can_queue = ARCMSR_DEFAULT_OUTSTANDING_CMD;
+   host->can_queue = host_can_queue;   /* max simultaneous cmds */ 

host->cmd_per_lun = ARCMSR_MAX_CMD_PERLUN;  
host->this_id = ARCMSR_SCSI_INITIATOR_ID;
host->unique_id = (bus << 8) | dev_fun;
@@ -3234,11 +3240,11 @@ static bool arcmsr_get_firmware_spec(str
default:
break;
}
-   if (acb->firm_numbers_queue > ARCMSR_MAX_OUTSTANDING_CMD)
-   acb->maxOutstanding = ARCMSR_MAX_OUTSTANDING_CMD;
+   acb->maxOutstanding = acb->firm_numbers_queue - 1;
+   if (acb->host->can_queue >= acb->firm_numbers_queue)
+   acb->host->can_queue = acb->maxOutstanding;
else
-   acb->maxOutstanding = acb->firm_numbers_queue - 1;
-   acb->host->can_queue = acb->maxOutstanding;
+   acb->maxOutstanding = acb->host->can_queue;
acb->maxFreeCCB = acb->host->can_queue;
if (acb->maxFreeCCB < ARCMSR_MAX_FREECCB_NUM)
acb->maxFreeCCB += 64;




[PATCH 5/17] scsi: arcmsr: replace constant ARCMSR_MAX_FREECCB_NUM by variable

2017-12-05 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

replace constant ARCMSR_MAX_FREECCB_NUM by variable acb->maxFreeCCB that was 
got from firmware

Signed-off-by: Ching Huang <ching2...@areca.com.tw>
---

diff -uprN a/drivers/scsi/arcmsr/arcmsr.h b/drivers/scsi/arcmsr/arcmsr.h
--- a/drivers/scsi/arcmsr/arcmsr.h  2017-12-05 15:24:16.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr.h  2017-12-05 15:25:06.0 +0800
@@ -831,6 +831,7 @@ struct AdapterControlBlock
atomic_tante_token_value;
uint32_tmaxOutstanding;
int vector_count;
+   uint32_tmaxFreeCCB;
uint32_tdoneq_index;
uint32_tccbsize;
uint32_tin_doorbell;
diff -uprN a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c
--- a/drivers/scsi/arcmsr/arcmsr_hba.c  2017-12-05 11:47:16.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr_hba.c  2017-12-05 11:47:04.0 +0800
@@ -688,7 +688,7 @@ static int arcmsr_alloc_ccb_pool(struct 
acb->host->max_sectors = max_xfer_len/512;
acb->host->sg_tablesize = max_sg_entrys;
roundup_ccbsize = roundup(sizeof(struct CommandControlBlock) + 
(max_sg_entrys - 1) * sizeof(struct SG64ENTRY), 32);
-   acb->uncache_size = roundup_ccbsize * ARCMSR_MAX_FREECCB_NUM;
+   acb->uncache_size = roundup_ccbsize * acb->maxFreeCCB;
dma_coherent = dma_alloc_coherent(>dev, acb->uncache_size, 
_coherent_handle, GFP_KERNEL);
if(!dma_coherent){
printk(KERN_NOTICE "arcmsr%d: dma_alloc_coherent got error\n", 
acb->host->host_no);
@@ -700,7 +700,7 @@ static int arcmsr_alloc_ccb_pool(struct 
acb->ccbsize = roundup_ccbsize;
ccb_tmp = dma_coherent;
acb->vir2phy_offset = (unsigned long)dma_coherent - (unsigned 
long)dma_coherent_handle;
-   for(i = 0; i < ARCMSR_MAX_FREECCB_NUM; i++){
+   for(i = 0; i < acb->maxFreeCCB; i++){
cdb_phyaddr = dma_coherent_handle + offsetof(struct 
CommandControlBlock, arcmsr_cdb);
switch (acb->adapter_type) {
case ACB_ADAPTER_TYPE_A:
@@ -1427,7 +1427,7 @@ static void arcmsr_remove(struct pci_dev
 
arcmsr_abort_allcmd(acb);
arcmsr_done4abort_postqueue(acb);
-   for (i = 0; i < ARCMSR_MAX_FREECCB_NUM; i++) {
+   for (i = 0; i < acb->maxFreeCCB; i++) {
struct CommandControlBlock *ccb = acb->pccb_pool[i];
if (ccb->startdone == ARCMSR_CCB_START) {
ccb->startdone = ARCMSR_CCB_ABORTED;
@@ -3239,6 +3239,9 @@ static bool arcmsr_get_firmware_spec(str
else
acb->maxOutstanding = acb->firm_numbers_queue - 1;
acb->host->can_queue = acb->maxOutstanding;
+   acb->maxFreeCCB = acb->host->can_queue;
+   if (acb->maxFreeCCB < ARCMSR_MAX_FREECCB_NUM)
+   acb->maxFreeCCB += 64;
return rtn;
 }
 
@@ -4261,7 +4264,7 @@ static uint8_t arcmsr_iop_reset(struct A
rtnval = arcmsr_abort_allcmd(acb);
/* clear all outbound posted Q */
arcmsr_done4abort_postqueue(acb);
-   for (i = 0; i < ARCMSR_MAX_FREECCB_NUM; i++) {
+   for (i = 0; i < acb->maxFreeCCB; i++) {
ccb = acb->pccb_pool[i];
if (ccb->startdone == ARCMSR_CCB_START) {
scsi_dma_unmap(ccb->pcmd);
@@ -4369,7 +4372,7 @@ static int arcmsr_abort(struct scsi_cmnd
}
 
intmask_org = arcmsr_disable_outbound_ints(acb);
-   for (i = 0; i < ARCMSR_MAX_FREECCB_NUM; i++) {
+   for (i = 0; i < acb->maxFreeCCB; i++) {
struct CommandControlBlock *ccb = acb->pccb_pool[i];
if (ccb->startdone == ARCMSR_CCB_START && ccb->pcmd == cmd) {
ccb->startdone = ARCMSR_CCB_ABORTED;




[PATCH 4/17] scsi: arcmsr: enable host controller command queueu up to 1024

2017-12-05 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

update ARCMSR_MAX_OUTSTANDING_CMD and ARCMSR_MAX_FREECCB_NUM to 1024

Signed-off-by: Ching Huang <ching2...@areca.com.tw>
---

diff -uprN a/drivers/scsi/arcmsr/arcmsr.h b/drivers/scsi/arcmsr/arcmsr.h
--- a/drivers/scsi/arcmsr/arcmsr.h  2017-08-04 11:19:22.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr.h  2017-12-05 15:24:16.0 +0800
@@ -45,13 +45,8 @@
 #include 
 struct device_attribute;
 /*The limit of outstanding scsi command that firmware can handle*/
-#ifdef CONFIG_XEN
-   #define ARCMSR_MAX_FREECCB_NUM  160
-#define ARCMSR_MAX_OUTSTANDING_CMD 155
-#else
-   #define ARCMSR_MAX_FREECCB_NUM  320
-#define ARCMSR_MAX_OUTSTANDING_CMD 255
-#endif
+#define ARCMSR_MAX_FREECCB_NUM 1024
+#define ARCMSR_MAX_OUTSTANDING_CMD 1024
 #define ARCMSR_DRIVER_VERSION  "v1.30.00.22-20151126"
 #define ARCMSR_SCSI_INITIATOR_ID   
255
 #define ARCMSR_MAX_XFER_SECTORS
512




[PATCH 3/17] scsi: arcmsr: add codes for ACB_ADAPTER_TYPE_E to support new adapter ARC-1884

2017-12-05 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

add codes for ACB_ADAPTER_TYPE_E to support new adapter ARC-1884

Signed-off-by: Ching Huang <ching2...@areca.com.tw>
---

diff -uprN a/drivers/scsi/arcmsr/arcmsr.h b/drivers/scsi/arcmsr/arcmsr.h
--- a/drivers/scsi/arcmsr/arcmsr.h  2017-08-03 18:54:46.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr.h  2017-08-04 11:19:22.0 +0800
@@ -65,6 +65,7 @@ struct device_attribute;
 #define ARCMSR_MAX_HBB_POSTQUEUE   
264
 #define ARCMSR_MAX_ARC1214_POSTQUEUE   256
 #define ARCMSR_MAX_ARC1214_DONEQUEUE   257
+#define ARCMSR_MAX_HBE_DONEQUEUE   512
 #define ARCMSR_MAX_XFER_LEN
0x26000 /* 152K */
 #define ARCMSR_CDB_SG_PAGE_LENGTH  
256 
 #define ARCMST_NUM_MSIX_VECTORS4
@@ -77,6 +78,9 @@ struct device_attribute;
 #ifndef PCI_DEVICE_ID_ARECA_1203
#define PCI_DEVICE_ID_ARECA_12030x1203
 #endif
+#ifndef PCI_DEVICE_ID_ARECA_1884
+   #define PCI_DEVICE_ID_ARECA_18840x1884
+#endif
 /*
 
**
 **
@@ -405,6 +409,31 @@ struct FIRMWARE_INFO
 /*ARCMSR_HBAMU_MESSAGE_FIRMWARE_OK*/
 #define ARCMSR_ARC1214_MESSAGE_FIRMWARE_OK 0x8000
 #define ARCMSR_ARC1214_OUTBOUND_LIST_INTERRUPT_CLEAR   0x0001
+/* 
+***
+**SPEC. for Areca Type E adapter
+***
+*/
+#define ARCMSR_SIGNATURE_1884  0x188417D3
+
+#define ARCMSR_HBEMU_DRV2IOP_DATA_WRITE_OK 0x0002
+#define ARCMSR_HBEMU_DRV2IOP_DATA_READ_OK  0x0004
+#define ARCMSR_HBEMU_DRV2IOP_MESSAGE_CMD_DONE  0x0008
+
+#define ARCMSR_HBEMU_IOP2DRV_DATA_WRITE_OK 0x0002
+#define ARCMSR_HBEMU_IOP2DRV_DATA_READ_OK  0x0004
+#define ARCMSR_HBEMU_IOP2DRV_MESSAGE_CMD_DONE  0x0008
+
+#define ARCMSR_HBEMU_MESSAGE_FIRMWARE_OK   0x8000
+
+#define ARCMSR_HBEMU_OUTBOUND_DOORBELL_ISR 0x0001
+#define ARCMSR_HBEMU_OUTBOUND_POSTQUEUE_ISR0x0008
+#define ARCMSR_HBEMU_ALL_INTMASKENABLE 0x0009
+
+/* ARC-1884 doorbell sync */
+#define ARCMSR_HBEMU_DOORBELL_SYNC 0x100
+#define ARCMSR_ARC188X_RESET_ADAPTER   0x0004
+#define ARCMSR_ARC1884_DiagWrite_ENABLE0x0080
 /*
 ***
 **ARECA SCSI COMMAND DESCRIPTOR BLOCK size 0x1F8 (504)
@@ -614,6 +643,88 @@ struct MessageUnit_D {
u32 __iomem *msgcode_rwbuffer;  /* 0x2200 */
 };
 /*
+*
+** Messaging Unit (MU) of Type E processor(LSI)
+*
+*/
+struct MessageUnit_E{
+   uint32_tiobound_doorbell;   /* 0003*/
+   uint32_twrite_sequence_3xxx;/*0004 0007*/
+   uint32_thost_diagnostic_3xxx;   /*0008 000B*/
+   uint32_tposted_outbound_doorbell;   /*000C 000F*/
+   uint32_tmaster_error_attribute; /*0010 0013*/
+   uint32_tmaster_error_address_low;   /*0014 0017*/
+   uint32_tmaster_error_address_high;  /*0018 001B*/
+   uint32_thcb_size;   /*001C 001F*/
+   uint32_tinbound_doorbell;   /*0020 0023*/
+   uint32_tdiagnostic_rw_data; /*0024 0027*/
+   uint32_tdiagnostic_rw_address_low;  /*0028 002B*/
+   uint32_tdiagnostic_rw_address_high; /*002C 002F*/
+   uint32_thost_int_status;/*0030 0033*/
+   uint32_thost_int_mask;  /*0034 0037*/
+   uint32_tdcr_data;   /*0038 003B*/
+   uint32_tdcr_address;/*003C 003F*/
+   uint32_tinbound_queueport;  /*0040 0043*/
+   uint32_toutbound_queueport; /*0044 0047*/
+   uint32_thcb_pci_address_low;/*0048 004B*/
+   uint32_thcb_pci_address_high;   /*004C 004F*/
+   uint32_tiop_int_status; /*0050 0053*/
+   uint32_tiop_int_mask;   /*0054 0057*/
+   uint32_tiop_inbound_queue_port; /*0058 005B*/
+   uint32_tiop_outbound_queue_port;/*005C 005F*/
+   uint32_tinbound_free_list_index;/*0060 0063*/
+   

[PATCH 2/17] scsi: arcmsr: simplify arcmsr_iop_init function

2017-12-05 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

simplify arcmsr_iop_init function

Signed-off-by: Ching Huang <ching2...@areca.com.tw>
---

diff -uprN a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c
--- a/drivers/scsi/arcmsr/arcmsr_hba.c  2017-12-05 11:47:40.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr_hba.c  2017-12-05 11:47:28.0 +0800
@@ -3671,6 +3671,39 @@ static void arcmsr_hardware_reset(struct
msleep(1000);
return;
 }
+
+static bool arcmsr_reset_in_progress(struct AdapterControlBlock *acb)
+{
+   bool rtn = true;
+
+   switch(acb->adapter_type) {
+   case ACB_ADAPTER_TYPE_A:{
+   struct MessageUnit_A __iomem *reg = acb->pmuA;
+   rtn = ((readl(>outbound_msgaddr1) &
+   ARCMSR_OUTBOUND_MESG1_FIRMWARE_OK) == 0) ? true : false;
+   }
+   break;
+   case ACB_ADAPTER_TYPE_B:{
+   struct MessageUnit_B *reg = acb->pmuB;
+   rtn = ((readl(reg->iop2drv_doorbell) &
+   ARCMSR_MESSAGE_FIRMWARE_OK) == 0) ? true : false;
+   }
+   break;
+   case ACB_ADAPTER_TYPE_C:{
+   struct MessageUnit_C __iomem *reg = acb->pmuC;
+   rtn = (readl(>host_diagnostic) & 0x04) ? true : false;
+   }
+   break;
+   case ACB_ADAPTER_TYPE_D:{
+   struct MessageUnit_D *reg = acb->pmuD;
+   rtn = ((readl(reg->sample_at_reset) & 0x80) == 0) ?
+   true : false;
+   }
+   break;
+   }
+   return rtn;
+}
+
 static void arcmsr_iop_init(struct AdapterControlBlock *acb)
 {
uint32_t intmask_org;
@@ -3725,197 +3758,55 @@ static uint8_t arcmsr_iop_reset(struct A
 static int arcmsr_bus_reset(struct scsi_cmnd *cmd)
 {
struct AdapterControlBlock *acb;
-   uint32_t intmask_org, outbound_doorbell;
int retry_count = 0;
int rtn = FAILED;
acb = (struct AdapterControlBlock *) cmd->device->host->hostdata;
-   printk(KERN_ERR "arcmsr: executing bus reset eh.num_resets = %d, 
num_aborts = %d \n", acb->num_resets, acb->num_aborts);
+   pr_notice("arcmsr: executing bus reset eh.num_resets = %d,"
+   " num_aborts = %d \n", acb->num_resets, acb->num_aborts);
acb->num_resets++;
 
-   switch(acb->adapter_type){
-   case ACB_ADAPTER_TYPE_A:{
-   if (acb->acb_flags & ACB_F_BUS_RESET){
-   long timeout;
-   printk(KERN_ERR "arcmsr: there is an  bus reset 
eh proceeding...\n");
-   timeout = wait_event_timeout(wait_q, 
(acb->acb_flags & ACB_F_BUS_RESET) == 0, 220*HZ);
-   if (timeout) {
-   return SUCCESS;
-   }
-   }
-   acb->acb_flags |= ACB_F_BUS_RESET;
-   if (!arcmsr_iop_reset(acb)) {
-   struct MessageUnit_A __iomem *reg;
-   reg = acb->pmuA;
-   arcmsr_hardware_reset(acb);
-   acb->acb_flags &= ~ACB_F_IOP_INITED;
-sleep_again:
-   ssleep(ARCMSR_SLEEPTIME);
-   if ((readl(>outbound_msgaddr1) & 
ARCMSR_OUTBOUND_MESG1_FIRMWARE_OK) == 0) {
-   printk(KERN_ERR "arcmsr%d: waiting for 
hw bus reset return, retry=%d\n", acb->host->host_no, retry_count);
-   if (retry_count > ARCMSR_RETRYCOUNT) {
-   acb->fw_flag = FW_DEADLOCK;
-   printk(KERN_ERR "arcmsr%d: 
waiting for hw bus reset return, RETRY TERMINATED!!\n", acb->host->host_no);
-   return FAILED;
-   }
-   retry_count++;
-   goto sleep_again;
-   }
-   acb->acb_flags |= ACB_F_IOP_INITED;
-   /* disable all outbound interrupt */
-   intmask_org = arcmsr_disable_outbound_ints(acb);
-   arcmsr_get_firmware_spec(acb);
-   arcmsr_start_adapter_bgrb(acb);
-   /* clear Qbuffer if door bell ringed */
-   outbound_doorbell = 
readl(>outbound_doorbell);
-   writel(outbound_doorbell, 
>outbound_doorbell); /*cl

[PATCH 1/17] scsi: arcmsr: redefine ACB_ADAPTER_TYPE_A, _B, _C, _D and subsequent changes.

2017-12-05 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

redefine ACB_ADAPTER_TYPE_A, _B, _C, _D and subsequent changes.

Signed-off-by: Ching Huang <ching2...@areca.com.tw>
---

diff -uprN a/drivers/scsi/arcmsr/arcmsr.h b/drivers/scsi/arcmsr/arcmsr.h
--- a/drivers/scsi/arcmsr/arcmsr.h  2017-12-05 10:45:50.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr.h  2017-08-03 18:54:46.0 +0800
@@ -621,10 +621,10 @@ struct MessageUnit_D {
 struct AdapterControlBlock
 {
uint32_t  adapter_type;/* adapter A,B. */
-   #define ACB_ADAPTER_TYPE_A0x0001/* hba I IOP */
-   #define ACB_ADAPTER_TYPE_B0x0002/* hbb M IOP */
-   #define ACB_ADAPTER_TYPE_C0x0004/* hbc P IOP */
-   #define ACB_ADAPTER_TYPE_D0x0008/* hbd A IOP */
+   #define ACB_ADAPTER_TYPE_A  0x  /* hba I IOP */
+   #define ACB_ADAPTER_TYPE_B  0x0001  /* hbb M IOP */
+   #define ACB_ADAPTER_TYPE_C  0x0002  /* hbc L IOP */
+   #define ACB_ADAPTER_TYPE_D  0x0003  /* hbd M IOP */
u32 roundup_ccbsize;
struct pci_dev *pdev;
struct Scsi_Host *  host;
diff -uprN a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c
--- a/drivers/scsi/arcmsr/arcmsr_hba.c  2017-12-05 10:45:30.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr_hba.c  2017-12-05 11:47:40.0 +0800
@@ -1785,7 +1785,7 @@ arcmsr_Read_iop_rqbuffer_data(struct Ada
uint8_t __iomem *iop_data;
uint32_t iop_len;
 
-   if (acb->adapter_type & (ACB_ADAPTER_TYPE_C | ACB_ADAPTER_TYPE_D))
+   if (acb->adapter_type > ACB_ADAPTER_TYPE_B)
return arcmsr_Read_iop_rqbuffer_in_DWORD(acb, prbuffer);
iop_data = (uint8_t __iomem *)prbuffer->data;
iop_len = readl(>data_len);
@@ -1871,7 +1871,7 @@ arcmsr_write_ioctldata2iop(struct Adapte
uint8_t __iomem *iop_data;
int32_t allxfer_len = 0;
 
-   if (acb->adapter_type & (ACB_ADAPTER_TYPE_C | ACB_ADAPTER_TYPE_D)) {
+   if (acb->adapter_type > ACB_ADAPTER_TYPE_B) {
arcmsr_write_ioctldata2iop_in_DWORD(acb);
return;
}




[PATCH 0/17] scsi: arcmsr: add some driver options and support new adapter ARC-1884

2017-12-05 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

Hi Martin,

Due to 4.16/scsi-queue conflict with 4.15-rc1, so I resubmit these patches 
again.
The following patches apply to Linus' 4.15-rc1 tree.

Patch 1: redefine ACB_ADAPTER_TYPE_A, _B, _C, _D and subsequent changes.

Patch 2: simplify arcmsr_iop_init function.

Patch 3: add codes for ACB_ADAPTER_TYPE_E to support new adapter ARC-1884

Patch 4. update ARCMSR_MAX_OUTSTANDING_CMD and ARCMSR_MAX_FREECCB_NUM to 1024

Patch 5: replace constant ARCMSR_MAX_FREECCB_NUM by variable acb->maxFreeCCB 
that was got from firmware.

Patch 6: add driver option host_can_queue to set host->can_queue value by user. 
It's value expands
 up to 1024.

Patch 7: replace constant ARCMSR_MAX_OUTSTANDING_CMD by variable 
acb->maxOutstanding that was determined by user.

Patch 8: add driver option cmd_per_lun to set host->cmd_per_lun value by user.

Patch 9: add ACB_F_MSG_GET_CONFIG to acb->acb_flags for for message interrupt 
checking before schedule work for
 get device map.

Patch 10: add a function arcmsr_set_iop_datetime and driver option 
set_date_time to set date and time to firmware.

Patch 11: fix clear doorbell queue on ACB_ADAPTER_TYPE_B controller.

Patch 12: spin off duplicate code of timer init for message isr BH in 
arcmsr_probe and arcmsr_resume as a function
  arcmsr_init_get_devmap_timer

Patch 13: adjust some tab or white-space to make text alignment.

Patch 14: fix grammar error.

Patch 15: Add module parameter msi_enable to has a chance to disable msi 
interrupt if it does not work properly.

Patch 16: Add module parameter msix_enable to has a chance to disable msix 
interrupt if it does not work properly.

Patch 17: update driver version to v1.40.00.04-20171130
---



Re: [PATCH v2 1/3] scsi: arcmsr: Add driver module parameter msi_enable

2017-11-29 Thread Ching Huang
On Tue, 2017-11-28 at 05:58 -0800, Christoph Hellwig wrote:
> On Tue, Nov 28, 2017 at 09:28:44AM +0800, Ching Huang wrote:
> > From: Ching Huang <ching2...@areca.com.tw>
> > 
> > Add module parameter msi_enable to has a chance to disable msi interrupt if 
> > between controller and system has
> > msi INT compatible issue.
> 
> If there is a system issue the system will need a quirk, and not every
> driver.
Yeah, but hardware compatibility is hard to clarify. This solution can make 
both happy.



[PATCH v2 3/3] scsi: arcmsr: Update driver version to v1.40.00.03-20171124

2017-11-28 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

Update driver version to v1.40.00.03-20171124

Signed-off-by: Ching Huang <ching2...@areca.com.tw>
---
diff -uprN a/drivers/scsi/arcmsr/arcmsr.h b/drivers/scsi/arcmsr/arcmsr.h
--- a/drivers/scsi/arcmsr/arcmsr.h  2017-11-23 14:29:46.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr.h  2017-11-24 12:07:00.0 +0800
@@ -54,7 +54,7 @@ struct device_attribute;
 #endif
 #define ARCMSR_DEFAULT_OUTSTANDING_CMD 128
 #define ARCMSR_MIN_OUTSTANDING_CMD 32
-#define ARCMSR_DRIVER_VERSION  "v1.40.00.02-20171011"
+#define ARCMSR_DRIVER_VERSION  "v1.40.00.03-20171124"
 #define ARCMSR_SCSI_INITIATOR_ID   255
 #define ARCMSR_MAX_XFER_SECTORS512
 #define ARCMSR_MAX_XFER_SECTORS_B  4096




[PATCH v2 2/3] scsi: arcmsr: Add driver module parameter msix_enable

2017-11-28 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

Add module parameter msix_enable to has a chance to disable msix interrupt if 
between controller and system has
msix INT compatible issue.

Signed-off-by: Ching Huang <ching2...@areca.com.tw>
---
diff -uprN a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c
--- a/drivers/scsi/arcmsr/arcmsr_hba.c  2017-11-24 15:16:20.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr_hba.c  2017-11-24 15:17:46.0 +0800
@@ -75,6 +75,10 @@ MODULE_DESCRIPTION("Areca ARC11xx/12xx/1
 MODULE_LICENSE("Dual BSD/GPL");
 MODULE_VERSION(ARCMSR_DRIVER_VERSION);
 
+static int msix_enable = 1;
+module_param(msix_enable, int, S_IRUGO);
+MODULE_PARM_DESC(msix_enable, "Enable MSI-X interrupt(0 ~ 1), 
msix_enable=1(enable), =0(disable)");
+
 static int msi_enable = 1;
 module_param(msi_enable, int, S_IRUGO);
 MODULE_PARM_DESC(msi_enable, "Enable MSI interrupt(0 ~ 1), 
msi_enable=1(enable), =0(disable)");
@@ -829,12 +833,15 @@ arcmsr_request_irq(struct pci_dev *pdev,
unsigned long flags;
int nvec, i;
 
+   if (msix_enable == 0)
+   goto msi_int0;
nvec = pci_alloc_irq_vectors(pdev, 1, ARCMST_NUM_MSIX_VECTORS,
PCI_IRQ_MSIX);
if (nvec > 0) {
pr_info("arcmsr%d: msi-x enabled\n", acb->host->host_no);
flags = 0;
} else {
+msi_int0:
if (msi_enable == 1) {
nvec = pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_MSI);
if (nvec == 1) {




[PATCH v2 1/3] scsi: arcmsr: Add driver module parameter msi_enable

2017-11-28 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

Add module parameter msi_enable to has a chance to disable msi interrupt if 
between controller and system has
msi INT compatible issue.

Signed-off-by: Ching Huang <ching2...@areca.com.tw>
---
diff -uprN a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c
--- a/drivers/scsi/arcmsr/arcmsr_hba.c  2017-11-23 14:29:26.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr_hba.c  2017-11-24 15:16:20.0 +0800
@@ -75,6 +75,10 @@ MODULE_DESCRIPTION("Areca ARC11xx/12xx/1
 MODULE_LICENSE("Dual BSD/GPL");
 MODULE_VERSION(ARCMSR_DRIVER_VERSION);
 
+static int msi_enable = 1;
+module_param(msi_enable, int, S_IRUGO);
+MODULE_PARM_DESC(msi_enable, "Enable MSI interrupt(0 ~ 1), 
msi_enable=1(enable), =0(disable)");
+
 static int host_can_queue = ARCMSR_DEFAULT_OUTSTANDING_CMD;
 module_param(host_can_queue, int, S_IRUGO);
 MODULE_PARM_DESC(host_can_queue, " adapter queue depth(32 ~ 1024), default is 
128");
@@ -831,11 +835,17 @@ arcmsr_request_irq(struct pci_dev *pdev,
pr_info("arcmsr%d: msi-x enabled\n", acb->host->host_no);
flags = 0;
} else {
-   nvec = pci_alloc_irq_vectors(pdev, 1, 1,
-   PCI_IRQ_MSI | PCI_IRQ_LEGACY);
+   if (msi_enable == 1) {
+   nvec = pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_MSI);
+   if (nvec == 1) {
+   dev_info(>dev, "msi enabled\n");
+   goto msi_int1;
+   }
+   }
+   nvec = pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_LEGACY);
if (nvec < 1)
return FAILED;
-
+msi_int1:
flags = IRQF_SHARED;
}
 




[PATCH v2 0/3] scsi: arcmsr: add driver module parameter - msi_enable, msix_enable

2017-11-28 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

The following patches apply to james' kernel/git/jejb/scsi.git/tree/?h=misc and
 martin's 
kernel/git/mkp/scsi.git/tree/?h=4.16/scsi-queue

Patch 1: Add module parameter msi_enable to has a chance to disable msi 
interrupt if controller has msi INT compatible issue.

Patch 2: Add module parameter msix_enable to has a chance to disable msix 
interrupt if controller has msix INT compatible issue.

Patch 3: Update driver version to v1.40.00.03-20171124
---



Re: [PATCH 1/3] scsi: arcmsr: Add driver module parameter msi_enable

2017-11-24 Thread Ching Huang
On Fri, 2017-11-24 at 04:45 +0800, Ching Huang wrote:
> Hello Dan,
> 
> On Thu, 2017-11-23 at 13:44 +0300, Dan Carpenter wrote:
> > On Thu, Nov 23, 2017 at 09:27:19AM +0800, Ching Huang wrote:
> > > From: Ching Huang <ching2...@areca.com.tw>
> > > 
> > > Add module parameter msi_enable to has a chance to disable msi interrupt 
> > > if it does not work properly.
> > > 
> > > Signed-off-by: Ching Huang <ching2...@areca.com.tw>
> > > ---
> > > 
> > > diff -uprN a/drivers/scsi/arcmsr/arcmsr_hba.c 
> > > b/drivers/scsi/arcmsr/arcmsr_hba.c
> > > --- a/drivers/scsi/arcmsr/arcmsr_hba.c2017-11-23 14:29:26.0 
> > > +0800
> > > +++ b/drivers/scsi/arcmsr/arcmsr_hba.c2017-11-23 16:02:28.0 
> > > +0800
> > > @@ -75,6 +75,10 @@ MODULE_DESCRIPTION("Areca ARC11xx/12xx/1
> > >  MODULE_LICENSE("Dual BSD/GPL");
> > >  MODULE_VERSION(ARCMSR_DRIVER_VERSION);
> > >  
> > > +static int msi_enable = 1;
> > > +module_param(msi_enable, int, S_IRUGO);
> >  ^^^
> > checkpatch.pl will complain that this should be 0444
> S_IRUGO value is 00444, defined in  -> .
>  A. It will be not a issue.
> > 
> > > +MODULE_PARM_DESC(msi_enable, " Enable MSI interrupt(0 ~ 1), 
> > > msi_enable=1(enable), =0(disable)");
> >  ^
> > Remove the extra space
> OK
> > 
> > > +
> > >  static int host_can_queue = ARCMSR_DEFAULT_OUTSTANDING_CMD;
> > >  module_param(host_can_queue, int, S_IRUGO);
> > >  MODULE_PARM_DESC(host_can_queue, " adapter queue depth(32 ~ 1024), 
> > > default is 128");
> > > @@ -831,11 +835,15 @@ arcmsr_request_irq(struct pci_dev *pdev,
> > >   pr_info("arcmsr%d: msi-x enabled\n", acb->host->host_no);
> > >   flags = 0;
> > >   } else {
> > > - nvec = pci_alloc_irq_vectors(pdev, 1, 1,
> > > - PCI_IRQ_MSI | PCI_IRQ_LEGACY);
> > > + if (msi_enable == 1)
> > > + nvec = pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_MSI);
> > > + else
> > > + nvec = pci_alloc_irq_vectors(pdev, 1, 1, 
> > > PCI_IRQ_LEGACY);
> > >   if (nvec < 1)
> > >   return FAILED;
> > 
> > I feel like we should try PCI_IRQ_MSI then if it fails we could fall
> > back to PCI_IRQ_LEGACY.  Originally, it worked like this and now it just
> > fails unless you toggle the module param.  It's a regression.
> update as below
> ---
>   unsigned int irq_flag;
>   irq_flag = PCI_IRQ_LEGACY;
>   if (msi_enable == 1)
>   irq_flag |= PCI_IRQ_MSI;
>   nvec = pci_alloc_irq_vectors(pdev, 1, 1, irq_flag);
> > >  
> > > + if (msi_enable == 1)
> > > + pr_info("arcmsr%d: msi enabled\n", acb->host->host_no);
> > 
> > This printk could be improved.  Use dev_info(>dev, for a start.
> > I know that the other prints don't use this, but we could use it one
> > time then slowly add more users until more are using dev_info() than
> > pr_info() and then someone will decide to clean up the old users.
> update as below
> ---
>   if (msi_enable == 1)
>   dev_info(>dev, "msi enabled\n");
> 
> > 
> > regards,
> > dan carpenter
> > 
> 
Dan,.

This new patch apply to mkp/scsi.git 4.16/scsi-queue
---

diff -uprN a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c
--- a/drivers/scsi/arcmsr/arcmsr_hba.c  2017-11-23 14:29:26.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr_hba.c  2017-11-24 15:16:20.0 +0800
@@ -75,6 +75,10 @@ MODULE_DESCRIPTION("Areca ARC11xx/12xx/1
 MODULE_LICENSE("Dual BSD/GPL");
 MODULE_VERSION(ARCMSR_DRIVER_VERSION);
 
+static int msi_enable = 1;
+module_param(msi_enable, int, S_IRUGO);
+MODULE_PARM_DESC(msi_enable, "Enable MSI interrupt(0 ~ 1), 
msi_enable=1(enable), =0(disable)");
+
 static int host_can_queue = ARCMSR_DEFAULT_OUTSTANDING_CMD;
 module_param(host_can_queue, int, S_IRUGO);
 MODULE_PARM_DESC(host_can_queue, " adapter queue depth(32 ~ 1024), default is 
128");
@@ -831,11 +835,17 @@ arcmsr_request_irq(struct pci_dev *pdev,
pr_info("arcmsr%d: msi-x enabled\n", acb->host->host_no);
flags = 0;
} else {
-   nvec = pci_alloc_irq_vectors(pdev, 1, 1,
-   PCI_IRQ_MSI | PCI_IRQ_LEGACY);
+   if (msi_enable == 1) {
+   nvec = pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_MSI);
+   if (nvec == 1) {
+   dev_info(>dev, "msi enabled\n");
+   goto msi_int1;
+   }
+   }
+   nvec = pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_LEGACY);
if (nvec < 1)
return FAILED;
-
+msi_int1:
flags = IRQF_SHARED;
}
 




Re: [PATCH 1/3] scsi: arcmsr: Add driver module parameter msi_enable

2017-11-23 Thread Ching Huang
Hello Dan,

On Thu, 2017-11-23 at 13:44 +0300, Dan Carpenter wrote:
> On Thu, Nov 23, 2017 at 09:27:19AM +0800, Ching Huang wrote:
> > From: Ching Huang <ching2...@areca.com.tw>
> > 
> > Add module parameter msi_enable to has a chance to disable msi interrupt if 
> > it does not work properly.
> > 
> > Signed-off-by: Ching Huang <ching2...@areca.com.tw>
> > ---
> > 
> > diff -uprN a/drivers/scsi/arcmsr/arcmsr_hba.c 
> > b/drivers/scsi/arcmsr/arcmsr_hba.c
> > --- a/drivers/scsi/arcmsr/arcmsr_hba.c  2017-11-23 14:29:26.0 
> > +0800
> > +++ b/drivers/scsi/arcmsr/arcmsr_hba.c  2017-11-23 16:02:28.0 
> > +0800
> > @@ -75,6 +75,10 @@ MODULE_DESCRIPTION("Areca ARC11xx/12xx/1
> >  MODULE_LICENSE("Dual BSD/GPL");
> >  MODULE_VERSION(ARCMSR_DRIVER_VERSION);
> >  
> > +static int msi_enable = 1;
> > +module_param(msi_enable, int, S_IRUGO);
>  ^^^
> checkpatch.pl will complain that this should be 0444
S_IRUGO value is 00444, defined in  -> .
 A. It will be not a issue.
> 
> > +MODULE_PARM_DESC(msi_enable, " Enable MSI interrupt(0 ~ 1), 
> > msi_enable=1(enable), =0(disable)");
>  ^
> Remove the extra space
OK
> 
> > +
> >  static int host_can_queue = ARCMSR_DEFAULT_OUTSTANDING_CMD;
> >  module_param(host_can_queue, int, S_IRUGO);
> >  MODULE_PARM_DESC(host_can_queue, " adapter queue depth(32 ~ 1024), default 
> > is 128");
> > @@ -831,11 +835,15 @@ arcmsr_request_irq(struct pci_dev *pdev,
> > pr_info("arcmsr%d: msi-x enabled\n", acb->host->host_no);
> > flags = 0;
> > } else {
> > -   nvec = pci_alloc_irq_vectors(pdev, 1, 1,
> > -   PCI_IRQ_MSI | PCI_IRQ_LEGACY);
> > +   if (msi_enable == 1)
> > +   nvec = pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_MSI);
> > +   else
> > +   nvec = pci_alloc_irq_vectors(pdev, 1, 1, 
> > PCI_IRQ_LEGACY);
> > if (nvec < 1)
> > return FAILED;
> 
> I feel like we should try PCI_IRQ_MSI then if it fails we could fall
> back to PCI_IRQ_LEGACY.  Originally, it worked like this and now it just
> fails unless you toggle the module param.  It's a regression.
update as below
---
unsigned int irq_flag;
irq_flag = PCI_IRQ_LEGACY;
if (msi_enable == 1)
irq_flag |= PCI_IRQ_MSI;
nvec = pci_alloc_irq_vectors(pdev, 1, 1, irq_flag);
> >  
> > +   if (msi_enable == 1)
> > +   pr_info("arcmsr%d: msi enabled\n", acb->host->host_no);
> 
> This printk could be improved.  Use dev_info(>dev, for a start.
> I know that the other prints don't use this, but we could use it one
> time then slowly add more users until more are using dev_info() than
> pr_info() and then someone will decide to clean up the old users.
update as below
---
if (msi_enable == 1)
dev_info(>dev, "msi enabled\n");

> 
> regards,
> dan carpenter
> 




Re: [PATCH 0/3] scsi: arcmsr: add driver module parameter - msi_enable, msix_enable

2017-11-23 Thread Ching Huang
On Thu, 2017-11-23 at 04:57 -0800, Christoph Hellwig wrote:
> On Thu, Nov 23, 2017 at 09:22:03AM +0800, Ching Huang wrote:
> > From: Ching Huang <ching2...@areca.com.tw>
> > 
> > Hi all,
> > 
> > The following patches apply to Martin's 4.16/scsi-queue.
> > 
> > Patch 1: Add module parameter msi_enable to has a chance to disable msi 
> > interrupt if it does not work properly.
> > 
> > Patch 2: Add module parameter msix_enable to has a chance to disable msix 
> > interrupt if it does not work properly.
> 
> Why would it not work properly?
This patch is apply to
https://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git/tree/?h=4.16/scsi-queue




Re: [PATCH 2/3] scsi: arcmsr: Add driver module parameter msix_enable

2017-11-23 Thread Ching Huang
On Thu, 2017-11-23 at 14:43 +0300, Dan Carpenter wrote:
> On Thu, Nov 23, 2017 at 09:31:14AM +0800, Ching Huang wrote:
> > @@ -829,12 +833,15 @@ arcmsr_request_irq(struct pci_dev *pdev,
> > unsigned long flags;
> > int nvec, i;
> >  
> > +   if (msix_enable == 0)
> > +   goto msi_int0;
> 
> I feel like this goto is not very beautiful, but I can't actually apply
> this patch?  Which tree is this written against?  I'm using linux-next.
> 
This patch is apply to 
https://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git/tree/?h=4.16/scsi-queue

> regards,
> dan carpenter
> 
> 




[PATCH 3/3] scsi: arcmsr: Update driver version to v1.40.00.03-20171121

2017-11-23 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

Update driver version to v1.40.00.03-20171121

Signed-off-by: Ching Huang <ching2...@areca.com.tw>
---

diff -uprN a/drivers/scsi/arcmsr/arcmsr.h b/drivers/scsi/arcmsr/arcmsr.h
--- a/drivers/scsi/arcmsr/arcmsr.h  2017-11-23 14:29:46.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr.h  2017-11-23 16:12:54.0 +0800
@@ -54,7 +54,7 @@ struct device_attribute;
 #endif
 #define ARCMSR_DEFAULT_OUTSTANDING_CMD 128
 #define ARCMSR_MIN_OUTSTANDING_CMD 32
-#define ARCMSR_DRIVER_VERSION  "v1.40.00.02-20171011"
+#define ARCMSR_DRIVER_VERSION  "v1.40.00.03-20171121"
 #define ARCMSR_SCSI_INITIATOR_ID   255
 #define ARCMSR_MAX_XFER_SECTORS512
 #define ARCMSR_MAX_XFER_SECTORS_B  4096




[PATCH 2/3] scsi: arcmsr: Add driver module parameter msix_enable

2017-11-23 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

Add module parameter msix_enable to has a chance to disable msix interrupt if 
it does not work properly.

Signed-off-by: Ching Huang <ching2...@areca.com.tw>
---

diff -uprN a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c
--- a/drivers/scsi/arcmsr/arcmsr_hba.c  2017-11-23 16:02:28.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr_hba.c  2017-11-23 16:09:24.0 +0800
@@ -75,6 +75,10 @@ MODULE_DESCRIPTION("Areca ARC11xx/12xx/1
 MODULE_LICENSE("Dual BSD/GPL");
 MODULE_VERSION(ARCMSR_DRIVER_VERSION);
 
+static int msix_enable = 1;
+module_param(msix_enable, int, S_IRUGO);
+MODULE_PARM_DESC(msix_enable, " Enable MSI-X interrupt(0 ~ 1), 
msix_enable=1(enable), =0(disable)");
+
 static int msi_enable = 1;
 module_param(msi_enable, int, S_IRUGO);
 MODULE_PARM_DESC(msi_enable, " Enable MSI interrupt(0 ~ 1), 
msi_enable=1(enable), =0(disable)");
@@ -829,12 +833,15 @@ arcmsr_request_irq(struct pci_dev *pdev,
unsigned long flags;
int nvec, i;
 
+   if (msix_enable == 0)
+   goto msi_int0;
nvec = pci_alloc_irq_vectors(pdev, 1, ARCMST_NUM_MSIX_VECTORS,
PCI_IRQ_MSIX);
if (nvec > 0) {
pr_info("arcmsr%d: msi-x enabled\n", acb->host->host_no);
flags = 0;
} else {
+msi_int0:
if (msi_enable == 1)
nvec = pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_MSI);
else




[PATCH 1/3] scsi: arcmsr: Add driver module parameter msi_enable

2017-11-23 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

Add module parameter msi_enable to has a chance to disable msi interrupt if it 
does not work properly.

Signed-off-by: Ching Huang <ching2...@areca.com.tw>
---

diff -uprN a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c
--- a/drivers/scsi/arcmsr/arcmsr_hba.c  2017-11-23 14:29:26.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr_hba.c  2017-11-23 16:02:28.0 +0800
@@ -75,6 +75,10 @@ MODULE_DESCRIPTION("Areca ARC11xx/12xx/1
 MODULE_LICENSE("Dual BSD/GPL");
 MODULE_VERSION(ARCMSR_DRIVER_VERSION);
 
+static int msi_enable = 1;
+module_param(msi_enable, int, S_IRUGO);
+MODULE_PARM_DESC(msi_enable, " Enable MSI interrupt(0 ~ 1), 
msi_enable=1(enable), =0(disable)");
+
 static int host_can_queue = ARCMSR_DEFAULT_OUTSTANDING_CMD;
 module_param(host_can_queue, int, S_IRUGO);
 MODULE_PARM_DESC(host_can_queue, " adapter queue depth(32 ~ 1024), default is 
128");
@@ -831,11 +835,15 @@ arcmsr_request_irq(struct pci_dev *pdev,
pr_info("arcmsr%d: msi-x enabled\n", acb->host->host_no);
flags = 0;
} else {
-   nvec = pci_alloc_irq_vectors(pdev, 1, 1,
-   PCI_IRQ_MSI | PCI_IRQ_LEGACY);
+   if (msi_enable == 1)
+   nvec = pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_MSI);
+   else
+   nvec = pci_alloc_irq_vectors(pdev, 1, 1, 
PCI_IRQ_LEGACY);
if (nvec < 1)
return FAILED;
 
+   if (msi_enable == 1)
+   pr_info("arcmsr%d: msi enabled\n", acb->host->host_no);
flags = IRQF_SHARED;
}
 




[PATCH 0/3] scsi: arcmsr: add driver module parameter - msi_enable, msix_enable

2017-11-23 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

Hi all,

The following patches apply to Martin's 4.16/scsi-queue.

Patch 1: Add module parameter msi_enable to has a chance to disable msi 
interrupt if it does not work properly.

Patch 2: Add module parameter msix_enable to has a chance to disable msix 
interrupt if it does not work properly.

Patch 3: Update driver version to v1.40.00.03-20171121

Please review. Thanks.
---



Re: [PATCH 0/13] scsi: arcmsr: add some driver options and support new adapter ARC-1884

2017-11-20 Thread Ching Huang
On Mon, 2017-11-20 at 22:03 -0500, Martin K. Petersen wrote:
> Ching,
> 
> > The following patches apply to Martin's 4.15/scsi-queue.
> 
> Applied to 4.16/scsi-queue. Thank you!
> 
Hi Martin,

Thank you for response.
These patches can apply to 4.16/scsi-queue is very good.

It will be very appreciation if you can spend a little time to review our 
driver's patch. Providing a better software driver is you and our common 
target. We will keep going.

Thanks,
Ching



[PATCH 13/13] scsi: arcmsr: update driver version to v1.40.00.02-20171011

2017-11-09 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

update driver version to v1.40.00.02-20171011

Signed-off-by: Ching Huang <ching2...@areca.com.tw>
---

diff -uprN a/drivers/scsi/arcmsr/arcmsr.h b/drivers/scsi/arcmsr/arcmsr.h
--- a/drivers/scsi/arcmsr/arcmsr.h  2017-11-07 17:29:10.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr.h  2017-11-07 17:50:06.0 +0800
@@ -54,7 +54,7 @@ struct device_attribute;
 #endif
 #define ARCMSR_DEFAULT_OUTSTANDING_CMD 128
 #define ARCMSR_MIN_OUTSTANDING_CMD 32
-#define ARCMSR_DRIVER_VERSION  "v1.30.00.22-20151126"
+#define ARCMSR_DRIVER_VERSION  "v1.40.00.02-20171011"
 #define ARCMSR_SCSI_INITIATOR_ID   255
 #define ARCMSR_MAX_XFER_SECTORS512
 #define ARCMSR_MAX_XFER_SECTORS_B  4096




[PATCH 12/13] scsi: arcmsr: adjust some tab or white-space to make text alignment

2017-11-09 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

adjust some tab or white-space to make text alignment

Signed-off-by: Ching Huang <ching2...@areca.com.tw>
---

diff -uprN a/drivers/scsi/arcmsr/arcmsr.h b/drivers/scsi/arcmsr/arcmsr.h
--- a/drivers/scsi/arcmsr/arcmsr.h  2017-11-07 16:18:22.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr.h  2017-11-07 17:29:10.0 +0800
@@ -55,35 +55,35 @@ struct device_attribute;
 #define ARCMSR_DEFAULT_OUTSTANDING_CMD 128
 #define ARCMSR_MIN_OUTSTANDING_CMD 32
 #define ARCMSR_DRIVER_VERSION  "v1.30.00.22-20151126"
-#define ARCMSR_SCSI_INITIATOR_ID   
255
-#define ARCMSR_MAX_XFER_SECTORS
512
-#define ARCMSR_MAX_XFER_SECTORS_B  
4096
-#define ARCMSR_MAX_XFER_SECTORS_C  
304
-#define ARCMSR_MAX_TARGETID
17
-#define ARCMSR_MAX_TARGETLUN   
8
+#define ARCMSR_SCSI_INITIATOR_ID   255
+#define ARCMSR_MAX_XFER_SECTORS512
+#define ARCMSR_MAX_XFER_SECTORS_B  4096
+#define ARCMSR_MAX_XFER_SECTORS_C  304
+#define ARCMSR_MAX_TARGETID17
+#define ARCMSR_MAX_TARGETLUN   8
 #define ARCMSR_MAX_CMD_PERLUN  128
 #define ARCMSR_DEFAULT_CMD_PERLUN  32
 #define ARCMSR_MIN_CMD_PERLUN  1
-#define ARCMSR_MAX_QBUFFER 
4096
-#define ARCMSR_DEFAULT_SG_ENTRIES  
38
-#define ARCMSR_MAX_HBB_POSTQUEUE   
264
+#define ARCMSR_MAX_QBUFFER 4096
+#define ARCMSR_DEFAULT_SG_ENTRIES  38
+#define ARCMSR_MAX_HBB_POSTQUEUE   264
 #define ARCMSR_MAX_ARC1214_POSTQUEUE   256
 #define ARCMSR_MAX_ARC1214_DONEQUEUE   257
 #define ARCMSR_MAX_HBE_DONEQUEUE   512
-#define ARCMSR_MAX_XFER_LEN
0x26000 /* 152K */
-#define ARCMSR_CDB_SG_PAGE_LENGTH  
256 
+#define ARCMSR_MAX_XFER_LEN0x26000 /* 152K */
+#define ARCMSR_CDB_SG_PAGE_LENGTH  256 
 #define ARCMST_NUM_MSIX_VECTORS4
 #ifndef PCI_DEVICE_ID_ARECA_1880
-#define PCI_DEVICE_ID_ARECA_1880 0x1880
- #endif
+#define PCI_DEVICE_ID_ARECA_1880   0x1880
+#endif
 #ifndef PCI_DEVICE_ID_ARECA_1214
-   #define PCI_DEVICE_ID_ARECA_12140x1214
+#define PCI_DEVICE_ID_ARECA_1214   0x1214
 #endif
 #ifndef PCI_DEVICE_ID_ARECA_1203
-   #define PCI_DEVICE_ID_ARECA_12030x1203
+#define PCI_DEVICE_ID_ARECA_1203   0x1203
 #endif
 #ifndef PCI_DEVICE_ID_ARECA_1884
-   #define PCI_DEVICE_ID_ARECA_18840x1884
+#define PCI_DEVICE_ID_ARECA_1884   0x1884
 #endif
 #defineARCMSR_HOURS(1000 * 60 * 60 * 4)
 #defineARCMSR_MINUTES  (1000 * 60 * 60)
@@ -92,15 +92,15 @@ struct device_attribute;
 **
 
**
 */
-#define ARC_SUCCESS   0
-#define ARC_FAILURE   1
+#define ARC_SUCCESS0
+#define ARC_FAILURE1
 /*
 ***
 **split 64bits dma addressing
 ***
 */
-#define dma_addr_hi32(addr)   (uint32_t) ((addr>>16)>>16)
-#define dma_addr_lo32(addr)   (uint32_t) (addr & 0x)
+#define dma_addr_hi32(addr)(uint32_t) ((addr>>16)>>16)
+#define dma_addr_lo32(addr)(uint32_t) (addr & 0x)
 /*
 ***
 **MESSAGE CONTROL CODE
@@ -140,7 +140,7 @@ struct CMD_MESSAGE_FIELD
 #define FUNCTION_SAY_HELLO 0x0807
 #define FUNCTION_SAY_GOODBYE   0x0808
 #define FUNCTION_FLUSH_ADAPTER_CACHE   0x0809
-#define FUNCTION_GET_FIRMWARE_STATUS   0x080A
+#define FUNCTION_GET_FIRMWARE_STATUS   0x080A
 #define FUNCTION_HARDWARE_RESET0x080B
 /* ARECA IO CONTROL CODE*/
 #define ARCMSR_MESSAGE_READ_RQBUFFER   \
@@ -171,18 +171,18 @@ struct CMD_MESSAGE_FIELD
 **   structure for holding DMA address data
 *
 */
-#define IS_DMA64   (sizeof(dma_addr_t) == 8)
-#define IS_SG64_ADDR0x0100 /* bit24 */
+#define IS_DMA64   (sizeof(dma_addr_t) == 8)
+#define IS_SG64_ADDR   0x0100 /* bit24 */
 struct  SG32ENTRY
 {
-   __le32  length;
-   __le32   

[PATCH 11/13] scsi: arcmsr: spin off duplicate code of timer init for message isr BH in arcmsr_probe and arcmsr_resume as a function

2017-11-09 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

spin off duplicate code of timer init for message isr BH in arcmsr_probe and 
arcmsr_resume as a function arcmsr_init_get_devmap_timer

Signed-off-by: Ching Huang <ching2...@areca.com.tw>
---

diff -uprN a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c
--- a/drivers/scsi/arcmsr/arcmsr_hba.c  2017-11-08 18:54:58.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr_hba.c  2017-11-08 18:55:50.0 +0800
@@ -857,6 +857,19 @@ out_free_irq:
return FAILED;
 }
 
+static void arcmsr_init_get_devmap_timer(struct AdapterControlBlock *pacb)
+{
+   INIT_WORK(>arcmsr_do_message_isr_bh, arcmsr_message_isr_bh_fn);
+   atomic_set(>rq_map_token, 16);
+   atomic_set(>ante_token_value, 16);
+   pacb->fw_flag = FW_NORMAL;
+   init_timer(>eternal_timer);
+   pacb->eternal_timer.expires = jiffies + msecs_to_jiffies(6 * HZ);
+   pacb->eternal_timer.data = (unsigned long)pacb;
+   pacb->eternal_timer.function = _request_device_map;
+   add_timer(>eternal_timer);
+}
+
 static void arcmsr_init_set_datetime_timer(struct AdapterControlBlock *pacb)
 {
init_timer(>refresh_timer);
@@ -948,15 +961,7 @@ static int arcmsr_probe(struct pci_dev *
if (arcmsr_request_irq(pdev, acb) == FAILED)
goto scsi_host_remove;
arcmsr_iop_init(acb);
-   INIT_WORK(>arcmsr_do_message_isr_bh, arcmsr_message_isr_bh_fn);
-   atomic_set(>rq_map_token, 16);
-   atomic_set(>ante_token_value, 16);
-   acb->fw_flag = FW_NORMAL;
-   init_timer(>eternal_timer);
-   acb->eternal_timer.expires = jiffies + msecs_to_jiffies(6 * HZ);
-   acb->eternal_timer.data = (unsigned long) acb;
-   acb->eternal_timer.function = _request_device_map;
-   add_timer(>eternal_timer);
+   arcmsr_init_get_devmap_timer(acb);
if (set_date_time)
arcmsr_init_set_datetime_timer(acb);
if(arcmsr_alloc_sysfs_attr(acb))
@@ -1047,15 +1052,7 @@ static int arcmsr_resume(struct pci_dev 
if (arcmsr_request_irq(pdev, acb) == FAILED)
goto controller_stop;
arcmsr_iop_init(acb);
-   INIT_WORK(>arcmsr_do_message_isr_bh, arcmsr_message_isr_bh_fn);
-   atomic_set(>rq_map_token, 16);
-   atomic_set(>ante_token_value, 16);
-   acb->fw_flag = FW_NORMAL;
-   init_timer(>eternal_timer);
-   acb->eternal_timer.expires = jiffies + msecs_to_jiffies(6 * HZ);
-   acb->eternal_timer.data = (unsigned long) acb;
-   acb->eternal_timer.function = _request_device_map;
-   add_timer(>eternal_timer);
+   arcmsr_init_get_devmap_timer(acb);
if (set_date_time)
arcmsr_init_set_datetime_timer(acb);
return 0;




[PATCH 10/13] scsi: arcmsr: fix clear doorbell queue on ACB_ADAPTER_TYPE_B controller

2017-11-09 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

fix clear doorbell queue on ACB_ADAPTER_TYPE_B controller

Signed-off-by: Ching Huang <ching2...@areca.com.tw>
---

diff -uprN a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c
--- a/drivers/scsi/arcmsr/arcmsr_hba.c  2017-11-08 18:54:18.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr_hba.c  2017-11-08 18:54:58.0 +0800
@@ -4202,10 +4202,19 @@ static void arcmsr_clear_doorbell_queue_
 
case ACB_ADAPTER_TYPE_B: {
struct MessageUnit_B *reg = acb->pmuB;
-   /*clear interrupt and message state*/
-   writel(ARCMSR_MESSAGE_INT_CLEAR_PATTERN, reg->iop2drv_doorbell);
+   uint32_t outbound_doorbell, i;
+   writel(ARCMSR_DOORBELL_INT_CLEAR_PATTERN, 
reg->iop2drv_doorbell);
writel(ARCMSR_DRV2IOP_DATA_READ_OK, reg->drv2iop_doorbell);
/* let IOP know data has been read */
+   for(i=0; i < 200; i++) {
+   msleep(20);
+   outbound_doorbell = readl(reg->iop2drv_doorbell);
+   if( outbound_doorbell & ARCMSR_IOP2DRV_DATA_WRITE_OK) {
+   writel(ARCMSR_DOORBELL_INT_CLEAR_PATTERN, 
reg->iop2drv_doorbell);
+   writel(ARCMSR_DRV2IOP_DATA_READ_OK, 
reg->drv2iop_doorbell);
+   } else
+   break;
+   }
}
break;
case ACB_ADAPTER_TYPE_C: {




[PATCH 9/13] scsi: arcmsr: add a function arcmsr_set_iop_datetime and driver option set_date_time to set date and time to firmware

2017-11-09 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

add a function arcmsr_set_iop_datetime and driver option set_date_time to set 
date and time to firmware

Signed-off-by: Ching Huang <ching2...@areca.com.tw>
---

diff -uprN a/drivers/scsi/arcmsr/arcmsr.h b/drivers/scsi/arcmsr/arcmsr.h
--- a/drivers/scsi/arcmsr/arcmsr.h  2017-08-04 18:39:18.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr.h  2017-11-07 16:18:22.0 +0800
@@ -85,6 +85,8 @@ struct device_attribute;
 #ifndef PCI_DEVICE_ID_ARECA_1884
#define PCI_DEVICE_ID_ARECA_18840x1884
 #endif
+#defineARCMSR_HOURS(1000 * 60 * 60 * 4)
+#defineARCMSR_MINUTES  (1000 * 60 * 60)
 /*
 
**
 **
@@ -285,6 +287,7 @@ struct FIRMWARE_INFO
 #define ARCMSR_MESSAGE_FLUSH_CACHE0x00050008
 /* (ARCMSR_INBOUND_MESG0_START_BGRB<<16)|ARCMSR_DRV2IOP_MESSAGE_CMD_POSTED) */
 #define ARCMSR_MESSAGE_START_BGRB0x00060008
+#define ARCMSR_MESSAGE_SYNC_TIMER  0x00080008
 #define ARCMSR_MESSAGE_START_DRIVER_MODE 0x000E0008
 #define ARCMSR_MESSAGE_SET_POST_WINDOW   0x000F0008
 #define ARCMSR_MESSAGE_ACTIVE_EOI_MODE 0x0018
@@ -842,6 +845,7 @@ struct AdapterControlBlock
uint32_tmaxOutstanding;
int vector_count;
uint32_tmaxFreeCCB;
+   struct timer_list   refresh_timer;
uint32_tdoneq_index;
uint32_tccbsize;
uint32_tin_doorbell;
diff -uprN a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c
--- a/drivers/scsi/arcmsr/arcmsr_hba.c  2017-11-08 18:53:30.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr_hba.c  2017-11-08 18:54:18.0 +0800
@@ -83,6 +83,10 @@ static int cmd_per_lun = ARCMSR_DEFAULT_
 module_param(cmd_per_lun, int, S_IRUGO);
 MODULE_PARM_DESC(cmd_per_lun, " device queue depth(1 ~ 128), default is 32");
 
+static int set_date_time = 0;
+module_param(set_date_time, int, S_IRUGO);
+MODULE_PARM_DESC(set_date_time, " send date, time to iop(0 ~ 1), 
set_date_time=1(enable), default(=0) is disable");
+
 #defineARCMSR_SLEEPTIME10
 #defineARCMSR_RETRYCOUNT   12
 
@@ -125,6 +129,7 @@ static const char *arcmsr_info(struct Sc
 static irqreturn_t arcmsr_interrupt(struct AdapterControlBlock *acb);
 static void arcmsr_free_irq(struct pci_dev *, struct AdapterControlBlock *);
 static void arcmsr_wait_firmware_ready(struct AdapterControlBlock *acb);
+static void arcmsr_set_iop_datetime(unsigned long acb);
 static int arcmsr_adjust_disk_queue_depth(struct scsi_device *sdev, int 
queue_depth)
 {
if (queue_depth > ARCMSR_MAX_CMD_PERLUN)
@@ -852,6 +857,15 @@ out_free_irq:
return FAILED;
 }
 
+static void arcmsr_init_set_datetime_timer(struct AdapterControlBlock *pacb)
+{
+   init_timer(>refresh_timer);
+   pacb->refresh_timer.expires = jiffies + msecs_to_jiffies(60 * 1000);
+   pacb->refresh_timer.data = (unsigned long)pacb;
+   pacb->refresh_timer.function = _set_iop_datetime;
+   add_timer(>refresh_timer);
+}
+
 static int arcmsr_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 {
struct Scsi_Host *host;
@@ -943,11 +957,15 @@ static int arcmsr_probe(struct pci_dev *
acb->eternal_timer.data = (unsigned long) acb;
acb->eternal_timer.function = _request_device_map;
add_timer(>eternal_timer);
+   if (set_date_time)
+   arcmsr_init_set_datetime_timer(acb);
if(arcmsr_alloc_sysfs_attr(acb))
goto out_free_sysfs;
scsi_scan_host(host);
return 0;
 out_free_sysfs:
+   if (set_date_time)
+   del_timer_sync(>refresh_timer);
del_timer_sync(>eternal_timer);
flush_work(>arcmsr_do_message_isr_bh);
arcmsr_stop_adapter_bgrb(acb);
@@ -990,6 +1008,8 @@ static int arcmsr_suspend(struct pci_dev
intmask_org = arcmsr_disable_outbound_ints(acb);
arcmsr_free_irq(pdev, acb);
del_timer_sync(>eternal_timer);
+   if (set_date_time)
+   del_timer_sync(>refresh_timer);
flush_work(>arcmsr_do_message_isr_bh);
arcmsr_stop_adapter_bgrb(acb);
arcmsr_flush_adapter_cache(acb);
@@ -1036,6 +1056,8 @@ static int arcmsr_resume(struct pci_dev 
acb->eternal_timer.data = (unsigned long) acb;
acb->eternal_timer.function = _request_device_map;
add_timer(>eternal_timer);
+   if (set_date_time)
+   arcmsr_init_set_datetime_timer(acb);
return 0;
 controller_stop:
arcmsr_stop_adapter_bgrb(acb);
@@ -1426,6 +1448,8 @@ static void arcmsr_remove(struct pci_dev
scsi_remove_host(host);
flush_work(&

[PATCH 8/13] scsi: arcmsr: add ACB_F_MSG_GET_CONFIG to acb->acb_flags for for message interrupt checking before schedule work for get device map

2017-11-09 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

add ACB_F_MSG_GET_CONFIG to acb->acb_flags for for message interrupt checking 
before schedule work for get device map

Signed-off-by: Ching Huang <ching2...@areca.com.tw>
---

diff -uprN a/drivers/scsi/arcmsr/arcmsr.h b/drivers/scsi/arcmsr/arcmsr.h
--- a/drivers/scsi/arcmsr/arcmsr.h  2017-08-04 18:12:54.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr.h  2017-08-04 18:39:18.0 +0800
@@ -787,6 +787,7 @@ struct AdapterControlBlock
/* iop init */
#define ACB_F_ABORT 0x0200
#define ACB_F_FIRMWARE_TRAP 0x0400
+   #define ACB_F_MSG_GET_CONFIG0x1000
struct CommandControlBlock *
pccb_pool[ARCMSR_MAX_FREECCB_NUM];
/* used for memory free */
struct list_headccb_free_list;
diff -uprN a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c
--- a/drivers/scsi/arcmsr/arcmsr_hba.c  2017-11-08 18:52:48.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr_hba.c  2017-11-08 18:53:30.0 +0800
@@ -743,6 +743,7 @@ static void arcmsr_message_isr_bh_fn(str
struct scsi_device *psdev;
char diff, temp;
 
+   acb->acb_flags &= ~ACB_F_MSG_GET_CONFIG;
switch (acb->adapter_type) {
case ACB_ADAPTER_TYPE_A: {
struct MessageUnit_A __iomem *reg  = acb->pmuA;
@@ -2332,7 +2333,8 @@ static void arcmsr_hbaA_message_isr(stru
struct MessageUnit_A __iomem *reg  = acb->pmuA;
/*clear interrupt and message state*/
writel(ARCMSR_MU_OUTBOUND_MESSAGE0_INT, >outbound_intstatus);
-   schedule_work(>arcmsr_do_message_isr_bh);
+   if (acb->acb_flags & ACB_F_MSG_GET_CONFIG)
+   schedule_work(>arcmsr_do_message_isr_bh);
 }
 static void arcmsr_hbaB_message_isr(struct AdapterControlBlock *acb)
 {
@@ -2340,7 +2342,8 @@ static void arcmsr_hbaB_message_isr(stru
 
/*clear interrupt and message state*/
writel(ARCMSR_MESSAGE_INT_CLEAR_PATTERN, reg->iop2drv_doorbell);
-   schedule_work(>arcmsr_do_message_isr_bh);
+   if (acb->acb_flags & ACB_F_MSG_GET_CONFIG)
+   schedule_work(>arcmsr_do_message_isr_bh);
 }
 /*
 
**
@@ -2356,7 +2359,8 @@ static void arcmsr_hbaC_message_isr(stru
struct MessageUnit_C __iomem *reg  = acb->pmuC;
/*clear interrupt and message state*/
writel(ARCMSR_HBCMU_IOP2DRV_MESSAGE_CMD_DONE_DOORBELL_CLEAR, 
>outbound_doorbell_clear);
-   schedule_work(>arcmsr_do_message_isr_bh);
+   if (acb->acb_flags & ACB_F_MSG_GET_CONFIG)
+   schedule_work(>arcmsr_do_message_isr_bh);
 }
 
 static void arcmsr_hbaD_message_isr(struct AdapterControlBlock *acb)
@@ -2365,7 +2369,8 @@ static void arcmsr_hbaD_message_isr(stru
 
writel(ARCMSR_ARC1214_IOP2DRV_MESSAGE_CMD_DONE, reg->outbound_doorbell);
readl(reg->outbound_doorbell);
-   schedule_work(>arcmsr_do_message_isr_bh);
+   if (acb->acb_flags & ACB_F_MSG_GET_CONFIG)
+   schedule_work(>arcmsr_do_message_isr_bh);
 }
 
 static void arcmsr_hbaE_message_isr(struct AdapterControlBlock *acb)
@@ -2373,7 +2378,8 @@ static void arcmsr_hbaE_message_isr(stru
struct MessageUnit_E __iomem *reg  = acb->pmuE;
 
writel(0, >host_int_status);
-   schedule_work(>arcmsr_do_message_isr_bh);
+   if (acb->acb_flags & ACB_F_MSG_GET_CONFIG)
+   schedule_work(>arcmsr_do_message_isr_bh);
 }
 
 static int arcmsr_hbaA_handle_isr(struct AdapterControlBlock *acb)
@@ -3830,6 +3836,7 @@ static void arcmsr_hbaA_request_device_m
return;
}
writel(ARCMSR_INBOUND_MESG0_GET_CONFIG, >inbound_msgaddr0);
+   acb->acb_flags |= ACB_F_MSG_GET_CONFIG;
mod_timer(>eternal_timer, jiffies + msecs_to_jiffies(6 * 
HZ));
}
return;
@@ -3852,6 +3859,7 @@ static void arcmsr_hbaB_request_device_m
return;
}
writel(ARCMSR_MESSAGE_GET_CONFIG, reg->drv2iop_doorbell);
+   acb->acb_flags |= ACB_F_MSG_GET_CONFIG;
mod_timer(>eternal_timer, jiffies + msecs_to_jiffies(6 * 
HZ));
}
return;
@@ -3875,6 +3883,7 @@ static void arcmsr_hbaC_request_device_m
}
writel(ARCMSR_INBOUND_MESG0_GET_CONFIG, >inbound_msgaddr0);
writel(ARCMSR_HBCMU_DRV2IOP_MESSAGE_CMD_DONE, 
>inbound_doorbell);
+   acb->acb_flags |= ACB_F_MSG_GET_CONFIG;
mod_timer(>eternal_timer, jiffies + msecs_to_jiffies(6 * 
HZ));
}
return;
@@ -3904,6 +3913,7 @@ static void arcmsr_hbaD_request_device_m
}
writel(ARCMSR_INBOU

[PATCH 7/13] scsi: arcmsr: add driver option cmd_per_lun to set host->cmd_per_lun value by user

2017-11-09 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

add driver option cmd_per_lun to set host->cmd_per_lun value by user

Signed-off-by: Ching Huang <ching2...@areca.com.tw>
---

diff -uprN a/drivers/scsi/arcmsr/arcmsr.h b/drivers/scsi/arcmsr/arcmsr.h
--- a/drivers/scsi/arcmsr/arcmsr.h  2017-08-04 17:40:54.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr.h  2017-08-04 18:12:54.0 +0800
@@ -61,7 +61,9 @@ struct device_attribute;
 #define ARCMSR_MAX_XFER_SECTORS_C  
304
 #define ARCMSR_MAX_TARGETID
17
 #define ARCMSR_MAX_TARGETLUN   
8
-#define ARCMSR_MAX_CMD_PERLUN   
ARCMSR_MAX_OUTSTANDING_CMD
+#define ARCMSR_MAX_CMD_PERLUN  128
+#define ARCMSR_DEFAULT_CMD_PERLUN  32
+#define ARCMSR_MIN_CMD_PERLUN  1
 #define ARCMSR_MAX_QBUFFER 
4096
 #define ARCMSR_DEFAULT_SG_ENTRIES  
38
 #define ARCMSR_MAX_HBB_POSTQUEUE   
264
diff -uprN a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c
--- a/drivers/scsi/arcmsr/arcmsr_hba.c  2017-11-08 18:52:04.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr_hba.c  2017-11-08 18:52:48.0 +0800
@@ -79,6 +79,10 @@ static int host_can_queue = ARCMSR_DEFAU
 module_param(host_can_queue, int, S_IRUGO);
 MODULE_PARM_DESC(host_can_queue, " adapter queue depth(32 ~ 1024), default is 
128");
 
+static int cmd_per_lun = ARCMSR_DEFAULT_CMD_PERLUN;
+module_param(cmd_per_lun, int, S_IRUGO);
+MODULE_PARM_DESC(cmd_per_lun, " device queue depth(1 ~ 128), default is 32");
+
 #defineARCMSR_SLEEPTIME10
 #defineARCMSR_RETRYCOUNT   12
 
@@ -141,7 +145,7 @@ static struct scsi_host_template arcmsr_
.this_id= ARCMSR_SCSI_INITIATOR_ID,
.sg_tablesize   = ARCMSR_DEFAULT_SG_ENTRIES, 
.max_sectors= ARCMSR_MAX_XFER_SECTORS_C, 
-   .cmd_per_lun= ARCMSR_MAX_CMD_PERLUN,
+   .cmd_per_lun= ARCMSR_DEFAULT_CMD_PERLUN,
.use_clustering = ENABLE_CLUSTERING,
.shost_attrs= arcmsr_host_attrs,
.no_write_same  = 1,
@@ -884,7 +888,9 @@ static int arcmsr_probe(struct pci_dev *
if ((host_can_queue < ARCMSR_MIN_OUTSTANDING_CMD) || (host_can_queue > 
ARCMSR_MAX_OUTSTANDING_CMD))
host_can_queue = ARCMSR_DEFAULT_OUTSTANDING_CMD;
host->can_queue = host_can_queue;   /* max simultaneous cmds */ 

-   host->cmd_per_lun = ARCMSR_MAX_CMD_PERLUN;  
+   if ((cmd_per_lun < ARCMSR_MIN_CMD_PERLUN) || (cmd_per_lun > 
ARCMSR_MAX_CMD_PERLUN))
+   cmd_per_lun = ARCMSR_DEFAULT_CMD_PERLUN;
+   host->cmd_per_lun = cmd_per_lun;
host->this_id = ARCMSR_SCSI_INITIATOR_ID;
host->unique_id = (bus << 8) | dev_fun;
pci_set_drvdata(pdev, host);




[PATCH 6/13] scsi: arcmsr: replace constant ARCMSR_MAX_OUTSTANDING_CMD by variable acb->maxOutstanding that was determined by user

2017-11-09 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

replace constant ARCMSR_MAX_OUTSTANDING_CMD by variable acb->maxOutstanding 
that was determined by user

Signed-off-by: Ching Huang <ching2...@areca.com.tw>
---

diff -uprN a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c
--- a/drivers/scsi/arcmsr/arcmsr_hba.c  2017-11-08 18:51:20.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr_hba.c  2017-11-08 18:52:04.0 +0800
@@ -1319,7 +1319,7 @@ static void arcmsr_done4abort_postqueue(
/*clear and abort all outbound posted Q*/
writel(outbound_intstatus, >outbound_intstatus);/*clear 
interrupt*/
while(((flag_ccb = readl(>outbound_queueport)) != 
0x)
-   && (i++ < ARCMSR_MAX_OUTSTANDING_CMD)) {
+   && (i++ < acb->maxOutstanding)) {
pARCMSR_CDB = (struct ARCMSR_CDB *)(acb->vir2phy_offset 
+ (flag_ccb << 5));/*frame must be 32 bytes aligned*/
pCCB = container_of(pARCMSR_CDB, struct 
CommandControlBlock, arcmsr_cdb);
error = (flag_ccb & ARCMSR_CCBREPLY_FLAG_ERROR_MODE0) ? 
true : false;
@@ -1349,7 +1349,7 @@ static void arcmsr_done4abort_postqueue(
break;
case ACB_ADAPTER_TYPE_C: {
struct MessageUnit_C __iomem *reg = acb->pmuC;
-   while ((readl(>host_int_status) & 
ARCMSR_HBCMU_OUTBOUND_POSTQUEUE_ISR) && (i++ < ARCMSR_MAX_OUTSTANDING_CMD)) {
+   while ((readl(>host_int_status) & 
ARCMSR_HBCMU_OUTBOUND_POSTQUEUE_ISR) && (i++ < acb->maxOutstanding)) {
/*need to do*/
flag_ccb = readl(>outbound_queueport_low);
ccb_cdb_phy = (flag_ccb & 0xFFF0);
@@ -1425,7 +1425,7 @@ static void arcmsr_remove(struct pci_dev
acb->acb_flags |= ACB_F_SCSISTOPADAPTER;
acb->acb_flags &= ~ACB_F_IOP_INITED;
 
-   for (poll_count = 0; poll_count < ARCMSR_MAX_OUTSTANDING_CMD; 
poll_count++){
+   for (poll_count = 0; poll_count < acb->maxOutstanding; poll_count++){
if (!atomic_read(>ccboutstandingcount))
break;
arcmsr_interrupt(acb);/* FIXME: need spinlock */




[PATCH 5/13] scsi: arcmsr: add driver option host_can_queue to set host->can_queue value by user. It's value expands up to 1024

2017-11-09 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

add driver option host_can_queue to set host->can_queue value by user. It's 
value expands up to 1024

Signed-off-by: Ching Huang <ching2...@areca.com.tw>
---

diff -uprN a/drivers/scsi/arcmsr/arcmsr.h b/drivers/scsi/arcmsr/arcmsr.h
--- a/drivers/scsi/arcmsr/arcmsr.h  2017-08-04 17:07:52.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr.h  2017-08-04 17:40:54.0 +0800
@@ -49,9 +49,11 @@ struct device_attribute;
#define ARCMSR_MAX_FREECCB_NUM  160
 #define ARCMSR_MAX_OUTSTANDING_CMD 155
 #else
-   #define ARCMSR_MAX_FREECCB_NUM  320
-#define ARCMSR_MAX_OUTSTANDING_CMD 255
+   #define ARCMSR_MAX_FREECCB_NUM  1024
+#define ARCMSR_MAX_OUTSTANDING_CMD 1024
 #endif
+#define ARCMSR_DEFAULT_OUTSTANDING_CMD 128
+#define ARCMSR_MIN_OUTSTANDING_CMD 32
 #define ARCMSR_DRIVER_VERSION  "v1.30.00.22-20151126"
 #define ARCMSR_SCSI_INITIATOR_ID   
255
 #define ARCMSR_MAX_XFER_SECTORS
512
diff -uprN a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c
--- a/drivers/scsi/arcmsr/arcmsr_hba.c  2017-11-08 18:50:28.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr_hba.c  2017-11-08 18:51:20.0 +0800
@@ -75,6 +75,10 @@ MODULE_DESCRIPTION("Areca ARC11xx/12xx/1
 MODULE_LICENSE("Dual BSD/GPL");
 MODULE_VERSION(ARCMSR_DRIVER_VERSION);
 
+static int host_can_queue = ARCMSR_DEFAULT_OUTSTANDING_CMD;
+module_param(host_can_queue, int, S_IRUGO);
+MODULE_PARM_DESC(host_can_queue, " adapter queue depth(32 ~ 1024), default is 
128");
+
 #defineARCMSR_SLEEPTIME10
 #defineARCMSR_RETRYCOUNT   12
 
@@ -133,7 +137,7 @@ static struct scsi_host_template arcmsr_
.eh_bus_reset_handler   = arcmsr_bus_reset,
.bios_param = arcmsr_bios_param,
.change_queue_depth = arcmsr_adjust_disk_queue_depth,
-   .can_queue  = ARCMSR_MAX_OUTSTANDING_CMD,
+   .can_queue  = ARCMSR_DEFAULT_OUTSTANDING_CMD,
.this_id= ARCMSR_SCSI_INITIATOR_ID,
.sg_tablesize   = ARCMSR_DEFAULT_SG_ENTRIES, 
.max_sectors= ARCMSR_MAX_XFER_SECTORS_C, 
@@ -877,7 +881,9 @@ static int arcmsr_probe(struct pci_dev *
host->max_lun = ARCMSR_MAX_TARGETLUN;
host->max_id = ARCMSR_MAX_TARGETID; /*16:8*/
host->max_cmd_len = 16; /*this is issue of 
64bit LBA ,over 2T byte*/
-   host->can_queue = ARCMSR_MAX_OUTSTANDING_CMD;
+   if ((host_can_queue < ARCMSR_MIN_OUTSTANDING_CMD) || (host_can_queue > 
ARCMSR_MAX_OUTSTANDING_CMD))
+   host_can_queue = ARCMSR_DEFAULT_OUTSTANDING_CMD;
+   host->can_queue = host_can_queue;   /* max simultaneous cmds */ 

host->cmd_per_lun = ARCMSR_MAX_CMD_PERLUN;  
host->this_id = ARCMSR_SCSI_INITIATOR_ID;
host->unique_id = (bus << 8) | dev_fun;
@@ -3238,11 +3244,11 @@ static bool arcmsr_get_firmware_spec(str
default:
break;
}
-   if (acb->firm_numbers_queue > ARCMSR_MAX_OUTSTANDING_CMD)
-   acb->maxOutstanding = ARCMSR_MAX_OUTSTANDING_CMD;
+   acb->maxOutstanding = acb->firm_numbers_queue - 1;
+   if (acb->host->can_queue >= acb->firm_numbers_queue)
+   acb->host->can_queue = acb->maxOutstanding;
else
-   acb->maxOutstanding = acb->firm_numbers_queue - 1;
-   acb->host->can_queue = acb->maxOutstanding;
+   acb->maxOutstanding = acb->host->can_queue;
acb->maxFreeCCB = acb->host->can_queue;
if (acb->maxFreeCCB < ARCMSR_MAX_FREECCB_NUM)
acb->maxFreeCCB += 64;




[PATCH 4/13] scsi: arcmsr: replace constant ARCMSR_MAX_FREECCB_NUM by variable acb->maxFreeCCB that was got from firmware

2017-11-08 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

replace constant ARCMSR_MAX_FREECCB_NUM by variable acb->maxFreeCCB that was 
got from firmware

Signed-off-by: Ching Huang <ching2...@areca.com.tw>
---

diff -uprN a/drivers/scsi/arcmsr/arcmsr.h b/drivers/scsi/arcmsr/arcmsr.h
--- a/drivers/scsi/arcmsr/arcmsr.h  2017-08-04 11:19:22.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr.h  2017-08-04 17:07:52.0 +0800
@@ -836,6 +836,7 @@ struct AdapterControlBlock
atomic_tante_token_value;
uint32_tmaxOutstanding;
int vector_count;
+   uint32_tmaxFreeCCB;
uint32_tdoneq_index;
uint32_tccbsize;
uint32_tin_doorbell;
diff -uprN a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c
--- a/drivers/scsi/arcmsr/arcmsr_hba.c  2017-11-08 18:48:46.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr_hba.c  2017-11-08 18:50:28.0 +0800
@@ -688,7 +688,7 @@ static int arcmsr_alloc_ccb_pool(struct 
acb->host->max_sectors = max_xfer_len/512;
acb->host->sg_tablesize = max_sg_entrys;
roundup_ccbsize = roundup(sizeof(struct CommandControlBlock) + 
(max_sg_entrys - 1) * sizeof(struct SG64ENTRY), 32);
-   acb->uncache_size = roundup_ccbsize * ARCMSR_MAX_FREECCB_NUM;
+   acb->uncache_size = roundup_ccbsize * acb->maxFreeCCB;
dma_coherent = dma_alloc_coherent(>dev, acb->uncache_size, 
_coherent_handle, GFP_KERNEL);
if(!dma_coherent){
printk(KERN_NOTICE "arcmsr%d: dma_alloc_coherent got error\n", 
acb->host->host_no);
@@ -700,7 +700,7 @@ static int arcmsr_alloc_ccb_pool(struct 
acb->ccbsize = roundup_ccbsize;
ccb_tmp = dma_coherent;
acb->vir2phy_offset = (unsigned long)dma_coherent - (unsigned 
long)dma_coherent_handle;
-   for(i = 0; i < ARCMSR_MAX_FREECCB_NUM; i++){
+   for(i = 0; i < acb->maxFreeCCB; i++){
cdb_phyaddr = dma_coherent_handle + offsetof(struct 
CommandControlBlock, arcmsr_cdb);
switch (acb->adapter_type) {
case ACB_ADAPTER_TYPE_A:
@@ -1431,7 +1431,7 @@ static void arcmsr_remove(struct pci_dev
 
arcmsr_abort_allcmd(acb);
arcmsr_done4abort_postqueue(acb);
-   for (i = 0; i < ARCMSR_MAX_FREECCB_NUM; i++) {
+   for (i = 0; i < acb->maxFreeCCB; i++) {
struct CommandControlBlock *ccb = acb->pccb_pool[i];
if (ccb->startdone == ARCMSR_CCB_START) {
ccb->startdone = ARCMSR_CCB_ABORTED;
@@ -3243,6 +3243,9 @@ static bool arcmsr_get_firmware_spec(str
else
acb->maxOutstanding = acb->firm_numbers_queue - 1;
acb->host->can_queue = acb->maxOutstanding;
+   acb->maxFreeCCB = acb->host->can_queue;
+   if (acb->maxFreeCCB < ARCMSR_MAX_FREECCB_NUM)
+   acb->maxFreeCCB += 64;
return rtn;
 }
 
@@ -4265,7 +4268,7 @@ static uint8_t arcmsr_iop_reset(struct A
rtnval = arcmsr_abort_allcmd(acb);
/* clear all outbound posted Q */
arcmsr_done4abort_postqueue(acb);
-   for (i = 0; i < ARCMSR_MAX_FREECCB_NUM; i++) {
+   for (i = 0; i < acb->maxFreeCCB; i++) {
ccb = acb->pccb_pool[i];
if (ccb->startdone == ARCMSR_CCB_START) {
scsi_dma_unmap(ccb->pcmd);
@@ -4373,7 +4376,7 @@ static int arcmsr_abort(struct scsi_cmnd
}
 
intmask_org = arcmsr_disable_outbound_ints(acb);
-   for (i = 0; i < ARCMSR_MAX_FREECCB_NUM; i++) {
+   for (i = 0; i < acb->maxFreeCCB; i++) {
struct CommandControlBlock *ccb = acb->pccb_pool[i];
if (ccb->startdone == ARCMSR_CCB_START && ccb->pcmd == cmd) {
ccb->startdone = ARCMSR_CCB_ABORTED;




[PATCH 3/13] scsi: arcmsr: add codes for ACB_ADAPTER_TYPE_E to support new adapter ARC-1884

2017-11-08 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

add codes for ACB_ADAPTER_TYPE_E to support new adapter ARC-1884

Signed-off-by: Ching Huang <ching2...@areca.com.tw>
---

diff -uprN a/drivers/scsi/arcmsr/arcmsr.h b/drivers/scsi/arcmsr/arcmsr.h
--- a/drivers/scsi/arcmsr/arcmsr.h  2017-08-03 18:54:46.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr.h  2017-08-04 11:19:22.0 +0800
@@ -65,6 +65,7 @@ struct device_attribute;
 #define ARCMSR_MAX_HBB_POSTQUEUE   
264
 #define ARCMSR_MAX_ARC1214_POSTQUEUE   256
 #define ARCMSR_MAX_ARC1214_DONEQUEUE   257
+#define ARCMSR_MAX_HBE_DONEQUEUE   512
 #define ARCMSR_MAX_XFER_LEN
0x26000 /* 152K */
 #define ARCMSR_CDB_SG_PAGE_LENGTH  
256 
 #define ARCMST_NUM_MSIX_VECTORS4
@@ -77,6 +78,9 @@ struct device_attribute;
 #ifndef PCI_DEVICE_ID_ARECA_1203
#define PCI_DEVICE_ID_ARECA_12030x1203
 #endif
+#ifndef PCI_DEVICE_ID_ARECA_1884
+   #define PCI_DEVICE_ID_ARECA_18840x1884
+#endif
 /*
 
**
 **
@@ -405,6 +409,31 @@ struct FIRMWARE_INFO
 /*ARCMSR_HBAMU_MESSAGE_FIRMWARE_OK*/
 #define ARCMSR_ARC1214_MESSAGE_FIRMWARE_OK 0x8000
 #define ARCMSR_ARC1214_OUTBOUND_LIST_INTERRUPT_CLEAR   0x0001
+/* 
+***
+**SPEC. for Areca Type E adapter
+***
+*/
+#define ARCMSR_SIGNATURE_1884  0x188417D3
+
+#define ARCMSR_HBEMU_DRV2IOP_DATA_WRITE_OK 0x0002
+#define ARCMSR_HBEMU_DRV2IOP_DATA_READ_OK  0x0004
+#define ARCMSR_HBEMU_DRV2IOP_MESSAGE_CMD_DONE  0x0008
+
+#define ARCMSR_HBEMU_IOP2DRV_DATA_WRITE_OK 0x0002
+#define ARCMSR_HBEMU_IOP2DRV_DATA_READ_OK  0x0004
+#define ARCMSR_HBEMU_IOP2DRV_MESSAGE_CMD_DONE  0x0008
+
+#define ARCMSR_HBEMU_MESSAGE_FIRMWARE_OK   0x8000
+
+#define ARCMSR_HBEMU_OUTBOUND_DOORBELL_ISR 0x0001
+#define ARCMSR_HBEMU_OUTBOUND_POSTQUEUE_ISR0x0008
+#define ARCMSR_HBEMU_ALL_INTMASKENABLE 0x0009
+
+/* ARC-1884 doorbell sync */
+#define ARCMSR_HBEMU_DOORBELL_SYNC 0x100
+#define ARCMSR_ARC188X_RESET_ADAPTER   0x0004
+#define ARCMSR_ARC1884_DiagWrite_ENABLE0x0080
 /*
 ***
 **ARECA SCSI COMMAND DESCRIPTOR BLOCK size 0x1F8 (504)
@@ -614,6 +643,88 @@ struct MessageUnit_D {
u32 __iomem *msgcode_rwbuffer;  /* 0x2200 */
 };
 /*
+*
+** Messaging Unit (MU) of Type E processor(LSI)
+*
+*/
+struct MessageUnit_E{
+   uint32_tiobound_doorbell;   /* 0003*/
+   uint32_twrite_sequence_3xxx;/*0004 0007*/
+   uint32_thost_diagnostic_3xxx;   /*0008 000B*/
+   uint32_tposted_outbound_doorbell;   /*000C 000F*/
+   uint32_tmaster_error_attribute; /*0010 0013*/
+   uint32_tmaster_error_address_low;   /*0014 0017*/
+   uint32_tmaster_error_address_high;  /*0018 001B*/
+   uint32_thcb_size;   /*001C 001F*/
+   uint32_tinbound_doorbell;   /*0020 0023*/
+   uint32_tdiagnostic_rw_data; /*0024 0027*/
+   uint32_tdiagnostic_rw_address_low;  /*0028 002B*/
+   uint32_tdiagnostic_rw_address_high; /*002C 002F*/
+   uint32_thost_int_status;/*0030 0033*/
+   uint32_thost_int_mask;  /*0034 0037*/
+   uint32_tdcr_data;   /*0038 003B*/
+   uint32_tdcr_address;/*003C 003F*/
+   uint32_tinbound_queueport;  /*0040 0043*/
+   uint32_toutbound_queueport; /*0044 0047*/
+   uint32_thcb_pci_address_low;/*0048 004B*/
+   uint32_thcb_pci_address_high;   /*004C 004F*/
+   uint32_tiop_int_status; /*0050 0053*/
+   uint32_tiop_int_mask;   /*0054 0057*/
+   uint32_tiop_inbound_queue_port; /*0058 005B*/
+   uint32_tiop_outbound_queue_port;/*005C 005F*/
+   uint32_tinbound_free_list_index;/*0060 0063*/
+   

[PATCH 2/13] scsi: arcmsr: simplify arcmsr_iop_init function

2017-11-08 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

simplify arcmsr_iop_init function

Signed-off-by: Ching Huang <ching2...@areca.com.tw>
---

diff -uprN a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c
--- a/drivers/scsi/arcmsr/arcmsr_hba.c  2017-11-08 18:46:42.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr_hba.c  2017-11-08 18:46:40.0 +0800
@@ -3675,6 +3675,39 @@ static void arcmsr_hardware_reset(struct
msleep(1000);
return;
 }
+
+static bool arcmsr_reset_in_progress(struct AdapterControlBlock *acb)
+{
+   bool rtn = true;
+
+   switch(acb->adapter_type) {
+   case ACB_ADAPTER_TYPE_A:{
+   struct MessageUnit_A __iomem *reg = acb->pmuA;
+   rtn = ((readl(>outbound_msgaddr1) &
+   ARCMSR_OUTBOUND_MESG1_FIRMWARE_OK) == 0) ? true : false;
+   }
+   break;
+   case ACB_ADAPTER_TYPE_B:{
+   struct MessageUnit_B *reg = acb->pmuB;
+   rtn = ((readl(reg->iop2drv_doorbell) &
+   ARCMSR_MESSAGE_FIRMWARE_OK) == 0) ? true : false;
+   }
+   break;
+   case ACB_ADAPTER_TYPE_C:{
+   struct MessageUnit_C __iomem *reg = acb->pmuC;
+   rtn = (readl(>host_diagnostic) & 0x04) ? true : false;
+   }
+   break;
+   case ACB_ADAPTER_TYPE_D:{
+   struct MessageUnit_D *reg = acb->pmuD;
+   rtn = ((readl(reg->sample_at_reset) & 0x80) == 0) ?
+   true : false;
+   }
+   break;
+   }
+   return rtn;
+}
+
 static void arcmsr_iop_init(struct AdapterControlBlock *acb)
 {
uint32_t intmask_org;
@@ -3729,197 +3762,55 @@ static uint8_t arcmsr_iop_reset(struct A
 static int arcmsr_bus_reset(struct scsi_cmnd *cmd)
 {
struct AdapterControlBlock *acb;
-   uint32_t intmask_org, outbound_doorbell;
int retry_count = 0;
int rtn = FAILED;
acb = (struct AdapterControlBlock *) cmd->device->host->hostdata;
-   printk(KERN_ERR "arcmsr: executing bus reset eh.num_resets = %d, 
num_aborts = %d \n", acb->num_resets, acb->num_aborts);
+   pr_notice("arcmsr: executing bus reset eh.num_resets = %d,"
+   " num_aborts = %d \n", acb->num_resets, acb->num_aborts);
acb->num_resets++;
 
-   switch(acb->adapter_type){
-   case ACB_ADAPTER_TYPE_A:{
-   if (acb->acb_flags & ACB_F_BUS_RESET){
-   long timeout;
-   printk(KERN_ERR "arcmsr: there is an  bus reset 
eh proceeding...\n");
-   timeout = wait_event_timeout(wait_q, 
(acb->acb_flags & ACB_F_BUS_RESET) == 0, 220*HZ);
-   if (timeout) {
-   return SUCCESS;
-   }
-   }
-   acb->acb_flags |= ACB_F_BUS_RESET;
-   if (!arcmsr_iop_reset(acb)) {
-   struct MessageUnit_A __iomem *reg;
-   reg = acb->pmuA;
-   arcmsr_hardware_reset(acb);
-   acb->acb_flags &= ~ACB_F_IOP_INITED;
-sleep_again:
-   ssleep(ARCMSR_SLEEPTIME);
-   if ((readl(>outbound_msgaddr1) & 
ARCMSR_OUTBOUND_MESG1_FIRMWARE_OK) == 0) {
-   printk(KERN_ERR "arcmsr%d: waiting for 
hw bus reset return, retry=%d\n", acb->host->host_no, retry_count);
-   if (retry_count > ARCMSR_RETRYCOUNT) {
-   acb->fw_flag = FW_DEADLOCK;
-   printk(KERN_ERR "arcmsr%d: 
waiting for hw bus reset return, RETRY TERMINATED!!\n", acb->host->host_no);
-   return FAILED;
-   }
-   retry_count++;
-   goto sleep_again;
-   }
-   acb->acb_flags |= ACB_F_IOP_INITED;
-   /* disable all outbound interrupt */
-   intmask_org = arcmsr_disable_outbound_ints(acb);
-   arcmsr_get_firmware_spec(acb);
-   arcmsr_start_adapter_bgrb(acb);
-   /* clear Qbuffer if door bell ringed */
-   outbound_doorbell = 
readl(>outbound_doorbell);
-   writel(outbound_doorbell, 
>outbound_doorbell); /*cl

[PATCH 0/13] scsi: arcmsr: add some driver options and support new adapter ARC-1884

2017-11-08 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

Hi all,

The following patches apply to Martin's 4.15/scsi-queue.

Patch 1: redefine ACB_ADAPTER_TYPE_A, _B, _C, _D and subsequent changes.

Patch 2: simplify arcmsr_iop_init function.

Patch 3: add codes for ACB_ADAPTER_TYPE_E to support new adapter ARC-1884

Patch 4: replace constant ARCMSR_MAX_FREECCB_NUM by variable acb->maxFreeCCB 
that was got from firmware.

Patch 5: add driver option host_can_queue to set host->can_queue value by user. 
It's value expands
 up to 1024.

Patch 6: replace constant ARCMSR_MAX_OUTSTANDING_CMD by variable 
acb->maxOutstanding that was determined by user.

Patch 7: add driver option cmd_per_lun to set host->cmd_per_lun value by user.

Patch 8: add ACB_F_MSG_GET_CONFIG to acb->acb_flags for for message interrupt 
checking before schedule work for
 get device map.

Patch 9: add a function arcmsr_set_iop_datetime and driver option set_date_time 
to set date and time to firmware.

Patch 10: fix clear doorbell queue on ACB_ADAPTER_TYPE_B controller.

Patch 11: spin off duplicate code of timer init for message isr BH in 
arcmsr_probe and arcmsr_resume as a function
  arcmsr_init_get_devmap_timer

Patch 12: adjust some tab or white-space to make text alignment.

Patch 13: update driver version to v1.40.00.02-20171011

Please review. Thanks.

---




[PATCH 1/13] scsi: arcmsr: redefine ACB_ADAPTER_TYPE_A, _B, _C, _D and subsequent changes.

2017-11-08 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

redefine ACB_ADAPTER_TYPE_A, _B, _C, _D and subsequent changes.

Signed-off-by: Ching Huang <ching2...@areca.com.tw>
---

diff -uprN a/drivers/scsi/arcmsr/arcmsr.h b/drivers/scsi/arcmsr/arcmsr.h
--- a/drivers/scsi/arcmsr/arcmsr.h  2017-07-31 11:50:44.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr.h  2017-08-03 18:54:46.0 +0800
@@ -621,10 +621,10 @@ struct MessageUnit_D {
 struct AdapterControlBlock
 {
uint32_t  adapter_type;/* adapter A,B. */
-   #define ACB_ADAPTER_TYPE_A0x0001/* hba I IOP */
-   #define ACB_ADAPTER_TYPE_B0x0002/* hbb M IOP */
-   #define ACB_ADAPTER_TYPE_C0x0004/* hbc P IOP */
-   #define ACB_ADAPTER_TYPE_D0x0008/* hbd A IOP */
+   #define ACB_ADAPTER_TYPE_A  0x  /* hba I IOP */
+   #define ACB_ADAPTER_TYPE_B  0x0001  /* hbb M IOP */
+   #define ACB_ADAPTER_TYPE_C  0x0002  /* hbc L IOP */
+   #define ACB_ADAPTER_TYPE_D  0x0003  /* hbd M IOP */
u32 roundup_ccbsize;
struct pci_dev *pdev;
struct Scsi_Host *  host;
diff -uprN a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c
--- a/drivers/scsi/arcmsr/arcmsr_hba.c  2017-07-31 11:50:16.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr_hba.c  2017-11-08 18:46:42.0 +0800
@@ -1789,7 +1789,7 @@ arcmsr_Read_iop_rqbuffer_data(struct Ada
uint8_t __iomem *iop_data;
uint32_t iop_len;
 
-   if (acb->adapter_type & (ACB_ADAPTER_TYPE_C | ACB_ADAPTER_TYPE_D))
+   if (acb->adapter_type > ACB_ADAPTER_TYPE_B)
return arcmsr_Read_iop_rqbuffer_in_DWORD(acb, prbuffer);
iop_data = (uint8_t __iomem *)prbuffer->data;
iop_len = readl(>data_len);
@@ -1875,7 +1875,7 @@ arcmsr_write_ioctldata2iop(struct Adapte
uint8_t __iomem *iop_data;
int32_t allxfer_len = 0;
 
-   if (acb->adapter_type & (ACB_ADAPTER_TYPE_C | ACB_ADAPTER_TYPE_D)) {
+   if (acb->adapter_type > ACB_ADAPTER_TYPE_B) {
arcmsr_write_ioctldata2iop_in_DWORD(acb);
return;
}




[PATCH 0/13] scsi: arcmsr: add some driver options and support new adapter ARC-1884

2017-11-08 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

Hi all,

The following patches apply to Martin's 4.15/scsi-queue.

Patch 1: redefine ACB_ADAPTER_TYPE_A, _B, _C, _D and subsequent changes.

Patch 2: simplify arcmsr_iop_init function.

Patch 3: add codes for ACB_ADAPTER_TYPE_E to support new adapter ARC-1884

Patch 4: replace constant ARCMSR_MAX_FREECCB_NUM by variable acb->maxFreeCCB 
that was got from firmware.

Patch 5: add driver option host_can_queue to set host->can_queue value by user. 
It's value expands
 up to 1024.

Patch 6: replace constant ARCMSR_MAX_OUTSTANDING_CMD by variable 
acb->maxOutstanding that was determined by user.

Patch 7: add driver option cmd_per_lun to set host->cmd_per_lun value by user.

Patch 8: add ACB_F_MSG_GET_CONFIG to acb->acb_flags for for message interrupt 
checking before schedule work for
 get device map.

Patch 9: add a function arcmsr_set_iop_datetime and driver option set_date_time 
to set date and time to firmware.

Patch 10: fix clear doorbell queue on ACB_ADAPTER_TYPE_B controller.

Patch 11: spin off duplicate code of timer init for message isr BH in 
arcmsr_probe and arcmsr_resume as a function
  arcmsr_init_get_devmap_timer

Patch 12: adjust some tab or white-space to make text alignment.

Patch 13: update driver version to v1.40.00.02-20171011

Please review. Thanks.

---




Re: [PATCH 4/7] megaraid_sas: Send SYNCHRONIZE_CACHE command to firmware

2016-10-19 Thread Ching Huang
Hi Tomas,

SCSI command checking in queuecommand function of arcmsr can be removed safely. 
Now driver can pass all scsi command to controller firmware.

diff -uprN a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c
--- a/drivers/scsi/arcmsr/arcmsr_hba.c  2016-10-19 16:18:45.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr_hba.c  2016-10-19 16:31:59.665524699 +0800
@@ -2623,13 +2623,6 @@ static int arcmsr_queue_command_lck(stru
cmd->scsi_done = done;
cmd->host_scribble = NULL;
cmd->result = 0;
-   if ((scsicmd == SYNCHRONIZE_CACHE) ||(scsicmd == SEND_DIAGNOSTIC)){
-   if(acb->devstate[target][lun] == ARECA_RAID_GONE) {
-   cmd->result = (DID_NO_CONNECT << 16);
-   }
-   cmd->scsi_done(cmd);
-   return 0;
-   }
if (target == 16) {
/* virtual device for iop message transfer */
arcmsr_handle_virtual_command(acb, cmd);

Thanks
Ching
On Tue, 2016-10-18 at 15:56 +0200, Tomas Henzl wrote:
> Hi,
> 
> similar suspicious code path can be found in the queuecommand functions in 
> other drivers too
> these are -
> pmcraid.c
> arcmsr_hba.c
> cc-ing maintainers - 
> (but both drivers seem to be unmaintained for a while -
> I've added Ching for arcmsr and Raghava for pmcraid)
> 
> please read this thread and verify that your driver and firmware is safe.
> 
> It is expected that a raid card controls the disk write cache (switches it 
> off)
> but this might not be true for all modes of operation a raid adapter handles
> - pass through/non-RAID etc. In such case when disk write cache is enabled
> and your driver skips the SYNCHRONIZE_CACHE command a FS corruption
> is very much possible during unexpected power loss or even a clean shutdown.
> 
> tomash
> 
> On 17.10.2016 19:51, James Bottomley wrote:
> > On Mon, 2016-10-17 at 23:06 +0530, Kashyap Desai wrote:
> >>> -Original Message-
> >>> From: James Bottomley [mailto:j...@linux.vnet.ibm.com]
> >>> Sent: Monday, October 17, 2016 10:50 PM
> >>> To: Ric Wheeler; Hannes Reinecke; Sumit Saxena; 
> >>> linux-scsi@vger.kernel.org
> >>> Cc: martin.peter...@oracle.com; the...@redhat.com;
> >>> kashyap.de...@broadcom.com; Christoph Hellwig; Martin K. Petersen;
> >>> Jeff
> >>> Moyer; Gris Ge; Ewan Milne; Jens Axboe
> >>> Subject: Re: [PATCH 4/7] megaraid_sas: Send SYNCHRONIZE_CACHE
> >>> command
> >>> to firmware
> >>>
> >>> On Mon, 2016-10-17 at 12:27 -0400, Ric Wheeler wrote:
>  On 10/17/2016 12:20 PM, James Bottomley wrote:
> > On Mon, 2016-10-17 at 09:01 -0400, Ric Wheeler wrote:
> >> On 10/17/2016 07:34 AM, Hannes Reinecke wrote:
> >>> On 10/17/2016 12:24 PM, Sumit Saxena wrote:
>  megaraid_sas driver returns SYNCHRONIZE_CACHE command
>  back to
>  SCSI layer without sending it to firmware as firmware
>  takes
>  care of flushing cache.  This patch will change the
>  driver
>  behavior wrt SYNCHRONIZE_CACHE handling. If underlying
>  firmware has support to handle the SYNCHORNIZE_CACHE,
>  driver
>  will send it for firmware otherwise complete it back to
>  SCSI
>  layer with SUCCESS immediately.  If  Firmware  handle
>  SYNCHORNIZE_CACHE for both VD and JBOD
>  "canHandleSyncCache"
>  bit in scratch pad register(offset
>  0x00B4) will be set.
> 
>  This behavior can be controlled via module parameter and
>  user
>  can fallback to old behavior of returning
>  SYNCHRONIZE_CACHE by
>  driver only without sending it to firmware.
> 
>  Signed-off-by: Sumit Saxena 
>  Signed-off-by: Kashyap Desai 
>  ---
> drivers/scsi/megaraid/megaraid_sas.h|  3 +++
> drivers/scsi/megaraid/megaraid_sas_base.c   | 14
>  ++---
>  -
> drivers/scsi/megaraid/megaraid_sas_fusion.c |  3 +++
> drivers/scsi/megaraid/megaraid_sas_fusion.h |  2 ++
> 4 files changed, 14 insertions(+), 8 deletions(-)
> 
>  diff --git a/drivers/scsi/megaraid/megaraid_sas.h
>  b/drivers/scsi/megaraid/megaraid_sas.h
>  index ca86c88..43fd14f 100644
>  --- a/drivers/scsi/megaraid/megaraid_sas.h
>  +++ b/drivers/scsi/megaraid/megaraid_sas.h
>  @@ -1429,6 +1429,8 @@ enum FW_BOOT_CONTEXT {
> #define MR_MAX_REPLY_QUEUES_EXT_OFFSET_SHIFT14
> #define MR_MAX_MSIX_REG_ARRAY   16
> #define MR_RDPQ_MODE_OFFSET   0X0
>  0800
>  000
>  +#define MR_CAN_HANDLE_SYNC_CACHE_OFFSET 0
>  X010
>  
>  0
>  +
> /*
> * register set for both 1068 and 1078 controllers
> * structure 

Re: [PATCH v3 1/5] arcmsr: fixed getting wrong configuration data

2015-11-30 Thread Ching Huang
On Mon, 2015-11-30 at 19:17 -0500, Martin K. Petersen wrote:
> >>>>> "Ching" == Ching Huang <ching2...@areca.com.tw> writes:
> 
> Hello Ching,
> 
> I applied both your series to 4.5/scsi-queue.
> 
> In the future please run checkpatch before submitting. Warnings are OK
> but in this case there were several things flagged as errors that I had
> to fix up by hand.
> 
> Also make sure you tag with "Signed-off-by:". Your signoff was mistyped
> in all the patches.
> 
> Thank you!
> Martin
> 
Thanks Martin's effort and advice.
I will pay attention on future submitting.

Best Regards,
Ching

--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 2/3] arcmsr: Split dma resource allocation to a new function

2015-11-26 Thread Ching Huang
On Thu, 2015-11-26 at 11:46 -0800, Joe Perches wrote:
> On Thu, 2015-11-26 at 19:41 +0800, Ching Huang wrote:
> > split dma resource allocation and io register assignment from get_config to 
> > a new function arcmsr_alloc_io_queue.
> 
> trivia:
> 
> > diff -uprN a/drivers/scsi/arcmsr/arcmsr_hba.c 
> > b/drivers/scsi/arcmsr/arcmsr_hba.c
> []
> > +static bool arcmsr_alloc_io_queue(struct AdapterControlBlock *acb)
> > +{
> []
> > +   dma_coherent = dma_alloc_coherent(>dev, 
> > acb->roundup_ccbsize,
> > +   _coherent_handle, GFP_KERNEL);
> > +   if (!dma_coherent){
> > +   pr_notice("arcmsr%d: DMA allocation failed.\n", 
> > acb->host->host_no);
> > +   return false;
> > +   }
> > +   memset(dma_coherent, 0, acb->roundup_ccbsize);
> > 
> 
> There is a dma_zalloc_coherent
> 
> (and even more trivially)
> 
> Most all of your error messages don't use periods.
Thanks Joe.
Revised as below.

Signed-of-by: Ching Huang <ching2...@areca.com.tw>

---

diff -uprN a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c
--- a/drivers/scsi/arcmsr/arcmsr_hba.c  2015-11-26 15:52:54.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr_hba.c  2015-11-27 10:30:09.299131000 +0800
@@ -498,6 +498,90 @@ static void arcmsr_flush_adapter_cache(s
}
 }
 
+static bool arcmsr_alloc_io_queue(struct AdapterControlBlock *acb)
+{
+   bool rtn = true;
+   void *dma_coherent;
+   dma_addr_t dma_coherent_handle;
+   struct pci_dev *pdev = acb->pdev;
+
+   switch (acb->adapter_type) {
+   case ACB_ADAPTER_TYPE_B: {
+   struct MessageUnit_B *reg;
+   acb->roundup_ccbsize = roundup(sizeof(struct MessageUnit_B), 
32);
+   dma_coherent = dma_zalloc_coherent(>dev, 
acb->roundup_ccbsize,
+   _coherent_handle, GFP_KERNEL);
+   if (!dma_coherent){
+   pr_notice("arcmsr%d: DMA allocation failed\n", 
acb->host->host_no);
+   return false;
+   }
+   acb->dma_coherent_handle2 = dma_coherent_handle;
+   acb->dma_coherent2 = dma_coherent;
+   reg = (struct MessageUnit_B *)dma_coherent;
+   acb->pmuB = reg;
+   if (acb->pdev->device == PCI_DEVICE_ID_ARECA_1203) {
+   reg->drv2iop_doorbell = 
MEM_BASE0(ARCMSR_DRV2IOP_DOORBELL_1203);
+   reg->drv2iop_doorbell_mask = 
MEM_BASE0(ARCMSR_DRV2IOP_DOORBELL_MASK_1203);
+   reg->iop2drv_doorbell = 
MEM_BASE0(ARCMSR_IOP2DRV_DOORBELL_1203);
+   reg->iop2drv_doorbell_mask = 
MEM_BASE0(ARCMSR_IOP2DRV_DOORBELL_MASK_1203);
+   } else {
+   reg->drv2iop_doorbell= 
MEM_BASE0(ARCMSR_DRV2IOP_DOORBELL);
+   reg->drv2iop_doorbell_mask = 
MEM_BASE0(ARCMSR_DRV2IOP_DOORBELL_MASK);
+   reg->iop2drv_doorbell = 
MEM_BASE0(ARCMSR_IOP2DRV_DOORBELL);
+   reg->iop2drv_doorbell_mask = 
MEM_BASE0(ARCMSR_IOP2DRV_DOORBELL_MASK);
+   }
+   reg->message_wbuffer = MEM_BASE1(ARCMSR_MESSAGE_WBUFFER);
+   reg->message_rbuffer =  MEM_BASE1(ARCMSR_MESSAGE_RBUFFER);
+   reg->message_rwbuffer = MEM_BASE1(ARCMSR_MESSAGE_RWBUFFER);
+   }
+   break;
+   case ACB_ADAPTER_TYPE_D: {
+   struct MessageUnit_D *reg;
+   acb->roundup_ccbsize = roundup(sizeof(struct MessageUnit_D), 
32);
+   dma_coherent = dma_zalloc_coherent(>dev, 
acb->roundup_ccbsize,
+   _coherent_handle, GFP_KERNEL);
+   if (!dma_coherent) {
+   pr_notice("arcmsr%d: DMA allocation failed\n", 
acb->host->host_no);
+   return false;
+   }
+   acb->dma_coherent_handle2 = dma_coherent_handle;
+   acb->dma_coherent2 = dma_coherent;
+   reg = (struct MessageUnit_D *)dma_coherent;
+   acb->pmuD = reg;
+   reg->chip_id = MEM_BASE0(ARCMSR_ARC1214_CHIP_ID);
+   reg->cpu_mem_config = 
MEM_BASE0(ARCMSR_ARC1214_CPU_MEMORY_CONFIGURATION);
+   reg->i2o_host_interrupt_mask = 
MEM_BASE0(ARCMSR_ARC1214_I2_HOST_INTERRUPT_MASK);
+   reg->sample_at_reset = MEM_BASE0(ARCMSR_ARC1214_SAMPLE_RESET);
+   reg->reset_request = MEM_BASE0(ARCMSR_ARC1214_RESET_REQUEST);
+   reg->host_int_status = 
MEM_BASE0(ARCMSR_ARC1214_MAIN_INTERRUPT_STATUS);
+   reg->pcief0_int_enable = 
MEM_BASE0(ARCMSR_ARC1214_PCIE_F0_INTERRUPT_ENABLE);
+  

[PATCH 0/3] arcmsr: fix bug of reallocate dma resource

2015-11-26 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

This patch is relative to previous version v1.30.00.21-20151016.
This patch series are to fix reallocate dma resource if get_firmware_spec was 
called again when eh_bus_reset_handler occurred.

Patch 1 modifies codes for more readable.

Patch 2 split allocate dma resource and io register assignment from get_config 
to new function arcmsr_alloc_io_queue.

Patch 3 change driver version to v1.30.00.22-20151126.

--


--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 1/3] arcmsr: modify codes for more readable

2015-11-26 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

modify codes for more readable

Signed-of-by: Ching Huang <ching2...@areca.com.tw>

---

diff -uprN a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c
--- a/drivers/scsi/arcmsr/arcmsr_hba.c  2015-11-25 18:08:52.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr_hba.c  2015-11-26 15:52:54.0 +0800
@@ -2814,53 +2814,32 @@ static bool arcmsr_hbaD_get_config(struc
acb->dma_coherent2 = dma_coherent2;
reg = (struct MessageUnit_D *)dma_coherent2;
acb->pmuD = reg;
-   reg->chip_id = acb->mem_base0 + ARCMSR_ARC1214_CHIP_ID;
-   reg->cpu_mem_config = acb->mem_base0 +
-   ARCMSR_ARC1214_CPU_MEMORY_CONFIGURATION;
-   reg->i2o_host_interrupt_mask = acb->mem_base0 +
-   ARCMSR_ARC1214_I2_HOST_INTERRUPT_MASK;
-   reg->sample_at_reset = acb->mem_base0 + ARCMSR_ARC1214_SAMPLE_RESET;
-   reg->reset_request = acb->mem_base0 + ARCMSR_ARC1214_RESET_REQUEST;
-   reg->host_int_status = acb->mem_base0 +
-   ARCMSR_ARC1214_MAIN_INTERRUPT_STATUS;
-   reg->pcief0_int_enable = acb->mem_base0 +
-   ARCMSR_ARC1214_PCIE_F0_INTERRUPT_ENABLE;
-   reg->inbound_msgaddr0 = acb->mem_base0 +
-   ARCMSR_ARC1214_INBOUND_MESSAGE0;
-   reg->inbound_msgaddr1 = acb->mem_base0 +
-   ARCMSR_ARC1214_INBOUND_MESSAGE1;
-   reg->outbound_msgaddr0 = acb->mem_base0 +
-   ARCMSR_ARC1214_OUTBOUND_MESSAGE0;
-   reg->outbound_msgaddr1 = acb->mem_base0 +
-   ARCMSR_ARC1214_OUTBOUND_MESSAGE1;
-   reg->inbound_doorbell = acb->mem_base0 +
-   ARCMSR_ARC1214_INBOUND_DOORBELL;
-   reg->outbound_doorbell = acb->mem_base0 +
-   ARCMSR_ARC1214_OUTBOUND_DOORBELL;
-   reg->outbound_doorbell_enable = acb->mem_base0 +
-   ARCMSR_ARC1214_OUTBOUND_DOORBELL_ENABLE;
-   reg->inboundlist_base_low = acb->mem_base0 +
-   ARCMSR_ARC1214_INBOUND_LIST_BASE_LOW;
-   reg->inboundlist_base_high = acb->mem_base0 +
-   ARCMSR_ARC1214_INBOUND_LIST_BASE_HIGH;
-   reg->inboundlist_write_pointer = acb->mem_base0 +
-   ARCMSR_ARC1214_INBOUND_LIST_WRITE_POINTER;
-   reg->outboundlist_base_low = acb->mem_base0 +
-   ARCMSR_ARC1214_OUTBOUND_LIST_BASE_LOW;
-   reg->outboundlist_base_high = acb->mem_base0 +
-   ARCMSR_ARC1214_OUTBOUND_LIST_BASE_HIGH;
-   reg->outboundlist_copy_pointer = acb->mem_base0 +
-   ARCMSR_ARC1214_OUTBOUND_LIST_COPY_POINTER;
-   reg->outboundlist_read_pointer = acb->mem_base0 +
-   ARCMSR_ARC1214_OUTBOUND_LIST_READ_POINTER;
-   reg->outboundlist_interrupt_cause = acb->mem_base0 +
-   ARCMSR_ARC1214_OUTBOUND_INTERRUPT_CAUSE;
-   reg->outboundlist_interrupt_enable = acb->mem_base0 +
-   ARCMSR_ARC1214_OUTBOUND_INTERRUPT_ENABLE;
-   reg->message_wbuffer = acb->mem_base0 + ARCMSR_ARC1214_MESSAGE_WBUFFER;
-   reg->message_rbuffer = acb->mem_base0 + ARCMSR_ARC1214_MESSAGE_RBUFFER;
-   reg->msgcode_rwbuffer = acb->mem_base0 +
-   ARCMSR_ARC1214_MESSAGE_RWBUFFER;
+   reg->chip_id = MEM_BASE0(ARCMSR_ARC1214_CHIP_ID);
+   reg->cpu_mem_config = 
MEM_BASE0(ARCMSR_ARC1214_CPU_MEMORY_CONFIGURATION);
+   reg->i2o_host_interrupt_mask = 
MEM_BASE0(ARCMSR_ARC1214_I2_HOST_INTERRUPT_MASK);
+   reg->sample_at_reset = MEM_BASE0(ARCMSR_ARC1214_SAMPLE_RESET);
+   reg->reset_request = MEM_BASE0(ARCMSR_ARC1214_RESET_REQUEST);
+   reg->host_int_status = MEM_BASE0(ARCMSR_ARC1214_MAIN_INTERRUPT_STATUS);
+   reg->pcief0_int_enable = 
MEM_BASE0(ARCMSR_ARC1214_PCIE_F0_INTERRUPT_ENABLE);
+   reg->inbound_msgaddr0 = MEM_BASE0(ARCMSR_ARC1214_INBOUND_MESSAGE0);
+   reg->inbound_msgaddr1 = MEM_BASE0(ARCMSR_ARC1214_INBOUND_MESSAGE1);
+   reg->outbound_msgaddr0 = MEM_BASE0(ARCMSR_ARC1214_OUTBOUND_MESSAGE0);
+   reg->outbound_msgaddr1 = MEM_BASE0(ARCMSR_ARC1214_OUTBOUND_MESSAGE1);
+   reg->inbound_doorbell = MEM_BASE0(ARCMSR_ARC1214_INBOUND_DOORBELL);
+   reg->outbound_doorbell = MEM_BASE0(ARCMSR_ARC1214_OUTBOUND_DOORBELL);
+   reg->outbound_doorbell_enable = 
MEM_BASE0(ARCMSR_ARC1214_OUTBOUND_DOORBELL_ENABLE);
+   reg->inboundlist_base_low = 
MEM_BASE0(ARCMSR_ARC1214_INBOUND_LIST_BASE_LOW);
+   reg->inboundlist_base_high = 
MEM_BASE0(ARCMSR_ARC1214_INBOUND_LIST_BASE_HIGH);
+   reg->inboundlist_write_pointer = 
MEM_BASE0(ARCMSR_ARC1214_INBOUND_LIST_WRITE_POINTER);
+   reg->outboundlist_base_low = 
MEM_BASE0(ARCMSR_ARC1214_OUTBOUND_LIST_BASE_LOW);
+   reg->outboundlist_base_high = 
MEM_BASE0(ARCMSR_ARC1214_OUTBOUND_LIST_BASE_HIGH);
+   reg->

[PATCH 2/3] arcmsr: Split dma resource allocation to a new function

2015-11-26 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

split dma resource allocation and io register assignment from get_config to a 
new function arcmsr_alloc_io_queue.

Signed-of-by: Ching Huang <ching2...@areca.com.tw>

---

diff -uprN a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c
--- a/drivers/scsi/arcmsr/arcmsr_hba.c  2015-11-26 15:52:54.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr_hba.c  2015-11-26 18:08:58.0 +0800
@@ -498,6 +498,92 @@ static void arcmsr_flush_adapter_cache(s
}
 }
 
+static bool arcmsr_alloc_io_queue(struct AdapterControlBlock *acb)
+{
+   bool rtn = true;
+   void *dma_coherent;
+   dma_addr_t dma_coherent_handle;
+   struct pci_dev *pdev = acb->pdev;
+
+   switch (acb->adapter_type) {
+   case ACB_ADAPTER_TYPE_B: {
+   struct MessageUnit_B *reg;
+   acb->roundup_ccbsize = roundup(sizeof(struct MessageUnit_B), 
32);
+   dma_coherent = dma_alloc_coherent(>dev, 
acb->roundup_ccbsize,
+   _coherent_handle, GFP_KERNEL);
+   if (!dma_coherent){
+   pr_notice("arcmsr%d: DMA allocation failed.\n", 
acb->host->host_no);
+   return false;
+   }
+   memset(dma_coherent, 0, acb->roundup_ccbsize);
+   acb->dma_coherent_handle2 = dma_coherent_handle;
+   acb->dma_coherent2 = dma_coherent;
+   reg = (struct MessageUnit_B *)dma_coherent;
+   acb->pmuB = reg;
+   if (acb->pdev->device == PCI_DEVICE_ID_ARECA_1203) {
+   reg->drv2iop_doorbell = 
MEM_BASE0(ARCMSR_DRV2IOP_DOORBELL_1203);
+   reg->drv2iop_doorbell_mask = 
MEM_BASE0(ARCMSR_DRV2IOP_DOORBELL_MASK_1203);
+   reg->iop2drv_doorbell = 
MEM_BASE0(ARCMSR_IOP2DRV_DOORBELL_1203);
+   reg->iop2drv_doorbell_mask = 
MEM_BASE0(ARCMSR_IOP2DRV_DOORBELL_MASK_1203);
+   } else {
+   reg->drv2iop_doorbell= 
MEM_BASE0(ARCMSR_DRV2IOP_DOORBELL);
+   reg->drv2iop_doorbell_mask = 
MEM_BASE0(ARCMSR_DRV2IOP_DOORBELL_MASK);
+   reg->iop2drv_doorbell = 
MEM_BASE0(ARCMSR_IOP2DRV_DOORBELL);
+   reg->iop2drv_doorbell_mask = 
MEM_BASE0(ARCMSR_IOP2DRV_DOORBELL_MASK);
+   }
+   reg->message_wbuffer = MEM_BASE1(ARCMSR_MESSAGE_WBUFFER);
+   reg->message_rbuffer =  MEM_BASE1(ARCMSR_MESSAGE_RBUFFER);
+   reg->message_rwbuffer = MEM_BASE1(ARCMSR_MESSAGE_RWBUFFER);
+   }
+   break;
+   case ACB_ADAPTER_TYPE_D: {
+   struct MessageUnit_D *reg;
+   acb->roundup_ccbsize = roundup(sizeof(struct MessageUnit_D), 
32);
+   dma_coherent = dma_alloc_coherent(>dev, 
acb->roundup_ccbsize,
+   _coherent_handle, GFP_KERNEL);
+   if (!dma_coherent) {
+   pr_notice("arcmsr%d: DMA allocation failed.\n", 
acb->host->host_no);
+   return false;
+   }
+   memset(dma_coherent, 0, acb->roundup_ccbsize);
+   acb->dma_coherent_handle2 = dma_coherent_handle;
+   acb->dma_coherent2 = dma_coherent;
+   reg = (struct MessageUnit_D *)dma_coherent;
+   acb->pmuD = reg;
+   reg->chip_id = MEM_BASE0(ARCMSR_ARC1214_CHIP_ID);
+   reg->cpu_mem_config = 
MEM_BASE0(ARCMSR_ARC1214_CPU_MEMORY_CONFIGURATION);
+   reg->i2o_host_interrupt_mask = 
MEM_BASE0(ARCMSR_ARC1214_I2_HOST_INTERRUPT_MASK);
+   reg->sample_at_reset = MEM_BASE0(ARCMSR_ARC1214_SAMPLE_RESET);
+   reg->reset_request = MEM_BASE0(ARCMSR_ARC1214_RESET_REQUEST);
+   reg->host_int_status = 
MEM_BASE0(ARCMSR_ARC1214_MAIN_INTERRUPT_STATUS);
+   reg->pcief0_int_enable = 
MEM_BASE0(ARCMSR_ARC1214_PCIE_F0_INTERRUPT_ENABLE);
+   reg->inbound_msgaddr0 = 
MEM_BASE0(ARCMSR_ARC1214_INBOUND_MESSAGE0);
+   reg->inbound_msgaddr1 = 
MEM_BASE0(ARCMSR_ARC1214_INBOUND_MESSAGE1);
+   reg->outbound_msgaddr0 = 
MEM_BASE0(ARCMSR_ARC1214_OUTBOUND_MESSAGE0);
+   reg->outbound_msgaddr1 = 
MEM_BASE0(ARCMSR_ARC1214_OUTBOUND_MESSAGE1);
+   reg->inbound_doorbell = 
MEM_BASE0(ARCMSR_ARC1214_INBOUND_DOORBELL);
+   reg->outbound_doorbell = 
MEM_BASE0(ARCMSR_ARC1214_OUTBOUND_DOORBELL);
+   reg->outbound_doorbell_enable = 
MEM_BASE0(ARCMSR_ARC1214_OUTBOUND_DOORBELL_ENABLE);
+   reg->inboundlist_base_low = 
MEM_BASE0(ARCMSR_ARC1214_INBOUND_LIST_BASE_LOW);
+   reg->inboundlist_base_high = 
MEM_BASE0(ARCMSR_ARC1214_INBOUND_LIST_BASE_HIGH);
+   re

[PATCH 3/3] arcmsr: change driver version to v1.30.00.22-20151126

2015-11-26 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

change driver version to v1.30.00.22-20151126

Signed-of-by: Ching Huang <ching2...@areca.com.tw>

---

diff -uprN a/drivers/scsi/arcmsr/arcmsr.h b/drivers/scsi/arcmsr/arcmsr.h
--- a/drivers/scsi/arcmsr/arcmsr.h  2015-11-25 18:04:26.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr.h  2015-11-26 17:11:56.0 +0800
@@ -52,7 +52,7 @@ struct device_attribute;
#define ARCMSR_MAX_FREECCB_NUM  320
 #define ARCMSR_MAX_OUTSTANDING_CMD 255
 #endif
-#define ARCMSR_DRIVER_VERSION  "v1.30.00.21-20151019"
+#define ARCMSR_DRIVER_VERSION  "v1.30.00.22-20151126"
 #define ARCMSR_SCSI_INITIATOR_ID   
255
 #define ARCMSR_MAX_XFER_SECTORS
512
 #define ARCMSR_MAX_XFER_SECTORS_B  
4096


--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v3 2/5] arcmsr: fixes not release allocated resource

2015-11-25 Thread Ching Huang
On Wed, 2015-11-25 at 14:55 +0100, Tomas Henzl wrote:
> On 25.11.2015 12:41, Ching Huang wrote:
> > From: Ching Huang <ching2...@areca.com.tw>
> >
> > Releasing allocated resource if get configuration data failed.
> >
> > Signed-of-by: Ching Huang <ching2...@areca.com.tw>
> >
> > ---
> >
> > diff -uprN a/drivers/scsi/arcmsr/arcmsr_hba.c 
> > b/drivers/scsi/arcmsr/arcmsr_hba.c
> > --- a/drivers/scsi/arcmsr/arcmsr_hba.c  2015-11-24 11:35:26.0 
> > +0800
> > +++ b/drivers/scsi/arcmsr/arcmsr_hba.c  2015-11-25 19:04:44.59097 
> > +0800
> > @@ -2664,7 +2664,7 @@ static bool arcmsr_hbaB_get_config(struc
> > if (!arcmsr_hbaB_wait_msgint_ready(acb)) {
> > printk(KERN_NOTICE "arcmsr%d: wait 'get adapter firmware \
> > miscellaneous data' timeout \n", acb->host->host_no);
> > -   return false;
> > +   goto err_free_dma;
> > }
> > count = 8;
> > while (count){
> > @@ -2707,6 +2707,10 @@ static bool arcmsr_hbaB_get_config(struc
> > acb->firm_cfg_version = readl(>message_rwbuffer[25]);  
> > /*firm_cfg_version,25,100-103*/
> > /*firm_ide_channels,4,16-19*/
> > return true;
> > +err_free_dma:
> > +   dma_free_coherent(>pdev->dev, acb->roundup_ccbsize,
> > +   acb->dma_coherent2, acb->dma_coherent_handle2);
> > +   return false;
> >  }
> >  
> 
> The resource should be released here, that is okay. 
> 
> How works the resource management when the eh_bus_reset_handler
> is called ? It looks to me that you allocate a new 
> acb->dma_coherent2 without releasing it before.
> Btw. is it needed in that handler to re-read the firmware-spec?
> 
> Tomas
> 
You are right. In eh_bus_reset_handler, there may re-allocate a new dma 
resource if call get_config again.
I will initiate a new patches for this bug after current 5 patches.
Thanks Tomas.
> >  static bool arcmsr_hbaC_get_config(struct AdapterControlBlock *pACB)
> >
> >
> > --
> > To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
> > the body of a message to majord...@vger.kernel.org
> > More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 


--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v2 2/3] arcmsr: adds code for support areca new adapter ARC1203

2015-11-25 Thread Ching Huang
On Wed, 2015-11-25 at 09:43 +0100, Johannes Thumshirn wrote:
> On Wed, 2015-11-25 at 11:25 +0800, Ching Huang wrote:
> > From: Ching Huang <ching2...@areca.com.tw>
> > 
> > Support areca new PCIe to SATA RAID adapter ARC1203
> > 
> > Signed-of-by: Ching Huang<ching2...@areca.com.tw>
> > 
> > ---
> > 
> > diff -uprN a/drivers/scsi/arcmsr/arcmsr.h b/drivers/scsi/arcmsr/arcmsr.h
> > --- a/drivers/scsi/arcmsr/arcmsr.h  2015-11-25 10:52:16.28647 +0800
> > +++ b/drivers/scsi/arcmsr/arcmsr.h  2015-11-25 10:52:13.33447 +0800
> > @@ -74,6 +74,9 @@ struct device_attribute;
> >  #ifndef PCI_DEVICE_ID_ARECA_1214
> > #define PCI_DEVICE_ID_ARECA_12140x1214
> >  #endif
> > +#ifndef PCI_DEVICE_ID_ARECA_1203
> > +   #define PCI_DEVICE_ID_ARECA_12030x1203
> > +#endif
> >  /*
> >  
> > 
> > **
> >  **
> > @@ -245,6 +248,12 @@ struct FIRMWARE_INFO
> >  /* window of "instruction flags" from iop to driver */
> >  #define ARCMSR_IOP2DRV_DOORBELL   0x00020408
> >  #define ARCMSR_IOP2DRV_DOORBELL_MASK  0x0002040C
> > +/* window of "instruction flags" from iop to driver */
> > +#define ARCMSR_IOP2DRV_DOORBELL_1203  0x00021870
> > +#define ARCMSR_IOP2DRV_DOORBELL_MASK_1203 0x00021874
> > +/* window of "instruction flags" from driver to iop */
> > +#define ARCMSR_DRV2IOP_DOORBELL_1203  0x00021878
> > +#define ARCMSR_DRV2IOP_DOORBELL_MASK_1203 0x0002187C
> >  /* ARECA FLAG LANGUAGE */
> >  /* ioctl transfer */
> >  #define ARCMSR_IOP2DRV_DATA_WRITE_OK  0x0001
> > diff -uprN a/drivers/scsi/arcmsr/arcmsr_hba.c
> > b/drivers/scsi/arcmsr/arcmsr_hba.c
> > --- a/drivers/scsi/arcmsr/arcmsr_hba.c  2015-11-24 11:35:26.0
> > +0800
> > +++ b/drivers/scsi/arcmsr/arcmsr_hba.c  2015-11-24 18:58:40.640226000
> > +0800
> > @@ -114,6 +114,7 @@ static void arcmsr_hardware_reset(struct
> >  static const char *arcmsr_info(struct Scsi_Host *);
> >  static irqreturn_t arcmsr_interrupt(struct AdapterControlBlock *acb);
> >  static void arcmsr_free_irq(struct pci_dev *, struct AdapterControlBlock 
> > *);
> > +static void arcmsr_wait_firmware_ready(struct AdapterControlBlock *acb);
> >  static int arcmsr_adjust_disk_queue_depth(struct scsi_device *sdev, int
> > queue_depth)
> >  {
> > if (queue_depth > ARCMSR_MAX_CMD_PERLUN)
> > @@ -157,6 +158,8 @@ static struct pci_device_id arcmsr_devic
> > .driver_data = ACB_ADAPTER_TYPE_B},
> > {PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1202),
> > .driver_data = ACB_ADAPTER_TYPE_B},
> > +   {PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1203),
> > +   .driver_data = ACB_ADAPTER_TYPE_B},
> > {PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1210),
> > .driver_data = ACB_ADAPTER_TYPE_A},
> > {PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1214),
> > @@ -2621,7 +2624,7 @@ static bool arcmsr_hbaA_get_config(struc
> >  }
> >  static bool arcmsr_hbaB_get_config(struct AdapterControlBlock *acb)
> >  {
> > -   struct MessageUnit_B *reg = acb->pmuB;
> > +   struct MessageUnit_B *reg;
> > struct pci_dev *pdev = acb->pdev;
> > void *dma_coherent;
> > dma_addr_t dma_coherent_handle;
> > @@ -2649,10 +2652,17 @@ static bool arcmsr_hbaB_get_config(struc
> > acb->dma_coherent2 = dma_coherent;
> > reg = (struct MessageUnit_B *)dma_coherent;
> > acb->pmuB = reg;
> > -   reg->drv2iop_doorbell= (uint32_t __iomem *)((unsigned long)acb-
> > >mem_base0 + ARCMSR_DRV2IOP_DOORBELL);
> > -   reg->drv2iop_doorbell_mask = (uint32_t __iomem *)((unsigned
> > long)acb->mem_base0 + ARCMSR_DRV2IOP_DOORBELL_MASK);
> > -   reg->iop2drv_doorbell = (uint32_t __iomem *)((unsigned long)acb-
> > >mem_base0 + ARCMSR_IOP2DRV_DOORBELL);
> > -   reg->iop2drv_doorbell_mask = (uint32_t __iomem *)((unsigned
> > long)acb->mem_base0 + ARCMSR_IOP2DRV_DOORBELL_MASK);
> > +   if (acb->pdev->device == PCI_DEVICE_ID_ARECA_1203) {
> > +   reg->drv2iop_doorbell = (uint32_t __iomem *)((unsigned
> > long)acb->mem_base0 + ARCMSR_DRV2IOP_DOORBELL_1203);
> > +   reg->drv2iop_doorbell_mask = (uint32_t __iomem *)((unsigned
> > long)acb->mem_base0 + ARCMSR_DRV2IOP_DOORBELL_MASK_1203);
> > +   reg->iop2

Re: [PATCH v2 2/3] arcmsr: adds code for support areca new adapter ARC1203

2015-11-25 Thread Ching Huang
On Wed, 2015-11-25 at 08:18 +0100, Hannes Reinecke wrote:
> On 11/25/2015 04:25 AM, Ching Huang wrote:
> > From: Ching Huang <ching2...@areca.com.tw>
> > 
> > Support areca new PCIe to SATA RAID adapter ARC1203
> > 
> > Signed-of-by: Ching Huang<ching2...@areca.com.tw>
> > 
> > ---
> > 
> > diff -uprN a/drivers/scsi/arcmsr/arcmsr.h b/drivers/scsi/arcmsr/arcmsr.h
> > --- a/drivers/scsi/arcmsr/arcmsr.h  2015-11-25 10:52:16.28647 +0800
> > +++ b/drivers/scsi/arcmsr/arcmsr.h  2015-11-25 10:52:13.33447 +0800
> > @@ -74,6 +74,9 @@ struct device_attribute;
> >  #ifndef PCI_DEVICE_ID_ARECA_1214
> > #define PCI_DEVICE_ID_ARECA_12140x1214
> >  #endif
> > +#ifndef PCI_DEVICE_ID_ARECA_1203
> > +   #define PCI_DEVICE_ID_ARECA_12030x1203
> > +#endif
> >  /*
> >  
> > **
> >  **
> > @@ -245,6 +248,12 @@ struct FIRMWARE_INFO
> >  /* window of "instruction flags" from iop to driver */
> >  #define ARCMSR_IOP2DRV_DOORBELL   0x00020408
> >  #define ARCMSR_IOP2DRV_DOORBELL_MASK  0x0002040C
> > +/* window of "instruction flags" from iop to driver */
> > +#define ARCMSR_IOP2DRV_DOORBELL_1203  0x00021870
> > +#define ARCMSR_IOP2DRV_DOORBELL_MASK_1203 0x00021874
> > +/* window of "instruction flags" from driver to iop */
> > +#define ARCMSR_DRV2IOP_DOORBELL_1203  0x00021878
> > +#define ARCMSR_DRV2IOP_DOORBELL_MASK_1203 0x0002187C
> >  /* ARECA FLAG LANGUAGE */
> >  /* ioctl transfer */
> >  #define ARCMSR_IOP2DRV_DATA_WRITE_OK  0x0001
> > diff -uprN a/drivers/scsi/arcmsr/arcmsr_hba.c 
> > b/drivers/scsi/arcmsr/arcmsr_hba.c
> > --- a/drivers/scsi/arcmsr/arcmsr_hba.c  2015-11-24 11:35:26.0 
> > +0800
> > +++ b/drivers/scsi/arcmsr/arcmsr_hba.c  2015-11-24 18:58:40.640226000 
> > +0800
> > @@ -114,6 +114,7 @@ static void arcmsr_hardware_reset(struct
> >  static const char *arcmsr_info(struct Scsi_Host *);
> >  static irqreturn_t arcmsr_interrupt(struct AdapterControlBlock *acb);
> >  static void arcmsr_free_irq(struct pci_dev *, struct AdapterControlBlock 
> > *);
> > +static void arcmsr_wait_firmware_ready(struct AdapterControlBlock *acb);
> >  static int arcmsr_adjust_disk_queue_depth(struct scsi_device *sdev, int 
> > queue_depth)
> >  {
> > if (queue_depth > ARCMSR_MAX_CMD_PERLUN)
> > @@ -157,6 +158,8 @@ static struct pci_device_id arcmsr_devic
> > .driver_data = ACB_ADAPTER_TYPE_B},
> > {PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1202),
> > .driver_data = ACB_ADAPTER_TYPE_B},
> > +   {PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1203),
> > +   .driver_data = ACB_ADAPTER_TYPE_B},
> > {PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1210),
> > .driver_data = ACB_ADAPTER_TYPE_A},
> > {PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1214),
> > @@ -2621,7 +2624,7 @@ static bool arcmsr_hbaA_get_config(struc
> >  }
> >  static bool arcmsr_hbaB_get_config(struct AdapterControlBlock *acb)
> >  {
> > -   struct MessageUnit_B *reg = acb->pmuB;
> > +   struct MessageUnit_B *reg;
> > struct pci_dev *pdev = acb->pdev;
> > void *dma_coherent;
> > dma_addr_t dma_coherent_handle;
> > @@ -2649,10 +2652,17 @@ static bool arcmsr_hbaB_get_config(struc
> > acb->dma_coherent2 = dma_coherent;
> > reg = (struct MessageUnit_B *)dma_coherent;
> > acb->pmuB = reg;
> > -   reg->drv2iop_doorbell= (uint32_t __iomem *)((unsigned 
> > long)acb->mem_base0 + ARCMSR_DRV2IOP_DOORBELL);
> > -   reg->drv2iop_doorbell_mask = (uint32_t __iomem *)((unsigned 
> > long)acb->mem_base0 + ARCMSR_DRV2IOP_DOORBELL_MASK);
> > -   reg->iop2drv_doorbell = (uint32_t __iomem *)((unsigned 
> > long)acb->mem_base0 + ARCMSR_IOP2DRV_DOORBELL);
> > -   reg->iop2drv_doorbell_mask = (uint32_t __iomem *)((unsigned 
> > long)acb->mem_base0 + ARCMSR_IOP2DRV_DOORBELL_MASK);
> > +   if (acb->pdev->device == PCI_DEVICE_ID_ARECA_1203) {
> > +   reg->drv2iop_doorbell = (uint32_t __iomem *)((unsigned 
> > long)acb->mem_base0 + ARCMSR_DRV2IOP_DOORBELL_1203);
> > +   reg->drv2iop_doorbell_mask = (uint32_t __iomem *)((unsigned 
> > long)acb->mem_base0 + ARCMSR_DRV2IOP_DOORBELL_MASK_1203);
> > +   reg->iop2drv_doorbel

[PATCH v3 3/5] arcmsr: modifies codes for more readable

2015-11-25 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

Modifies codes for more readable

Signed-of-by: Ching Huang <ching2...@areca.com.tw>

---

diff -uprN a/drivers/scsi/arcmsr/arcmsr.h b/drivers/scsi/arcmsr/arcmsr.h
--- a/drivers/scsi/arcmsr/arcmsr.h  2015-11-25 10:52:16.28647 +0800
+++ b/drivers/scsi/arcmsr/arcmsr.h  2015-11-25 19:10:21.30996 +0800
@@ -288,6 +288,9 @@ struct FIRMWARE_INFO
 #define ARCMSR_MESSAGE_RBUFFER   0xff00
 /* iop message_rwbuffer for message command */
 #define ARCMSR_MESSAGE_RWBUFFER  0xfa00
+
+#define MEM_BASE0(x)   (u32 __iomem *)((unsigned long)acb->mem_base0 + x)
+#define MEM_BASE1(x)   (u32 __iomem *)((unsigned long)acb->mem_base1 + x)
 /* 
 
 **SPEC. for Areca HBC adapter
diff -uprN a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c
--- a/drivers/scsi/arcmsr/arcmsr_hba.c  2015-11-25 19:04:44.59097 +0800
+++ b/drivers/scsi/arcmsr/arcmsr_hba.c  2015-11-25 19:11:27.679958000 +0800
@@ -2649,13 +2649,13 @@ static bool arcmsr_hbaB_get_config(struc
acb->dma_coherent2 = dma_coherent;
reg = (struct MessageUnit_B *)dma_coherent;
acb->pmuB = reg;
-   reg->drv2iop_doorbell= (uint32_t __iomem *)((unsigned 
long)acb->mem_base0 + ARCMSR_DRV2IOP_DOORBELL);
-   reg->drv2iop_doorbell_mask = (uint32_t __iomem *)((unsigned 
long)acb->mem_base0 + ARCMSR_DRV2IOP_DOORBELL_MASK);
-   reg->iop2drv_doorbell = (uint32_t __iomem *)((unsigned 
long)acb->mem_base0 + ARCMSR_IOP2DRV_DOORBELL);
-   reg->iop2drv_doorbell_mask = (uint32_t __iomem *)((unsigned 
long)acb->mem_base0 + ARCMSR_IOP2DRV_DOORBELL_MASK);
-   reg->message_wbuffer = (uint32_t __iomem *)((unsigned 
long)acb->mem_base1 + ARCMSR_MESSAGE_WBUFFER);
-   reg->message_rbuffer =  (uint32_t __iomem *)((unsigned 
long)acb->mem_base1 + ARCMSR_MESSAGE_RBUFFER);
-   reg->message_rwbuffer = (uint32_t __iomem *)((unsigned 
long)acb->mem_base1 + ARCMSR_MESSAGE_RWBUFFER);
+   reg->drv2iop_doorbell= MEM_BASE0(ARCMSR_DRV2IOP_DOORBELL);
+   reg->drv2iop_doorbell_mask = MEM_BASE0(ARCMSR_DRV2IOP_DOORBELL_MASK);
+   reg->iop2drv_doorbell = MEM_BASE0(ARCMSR_IOP2DRV_DOORBELL);
+   reg->iop2drv_doorbell_mask = MEM_BASE0(ARCMSR_IOP2DRV_DOORBELL_MASK);
+   reg->message_wbuffer = MEM_BASE1(ARCMSR_MESSAGE_WBUFFER);
+   reg->message_rbuffer =  MEM_BASE1(ARCMSR_MESSAGE_RBUFFER);
+   reg->message_rwbuffer = MEM_BASE1(ARCMSR_MESSAGE_RWBUFFER);
iop_firm_model = (char __iomem *)(>message_rwbuffer[15]);  
/*firm_model,15,60-67*/
iop_firm_version = (char __iomem *)(>message_rwbuffer[17]);
/*firm_version,17,68-83*/
iop_device_map = (char __iomem *)(>message_rwbuffer[21]);  
/*firm_version,21,84-99*/


--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v3 0/5] arcmsr: support areca new adapter ARC1203

2015-11-25 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

Patch 1 fixes getting wrong configuration data.

Patch 2 fixes not release allocated resource if get configuration data
failed.

Patch 3 modifies codes for more readable.

Pacth 4 adds codes to support new adapter ARC1203.

Patch 5 changes driver version number.

--

--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v3 1/5] arcmsr: fixed getting wrong configuration data

2015-11-25 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

Fixed getting wrong configuration data of adapter type B and type D.

Signed-of-by: Ching Huang <ching2...@areca.com.tw>

---

diff -uprN a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c
--- a/drivers/scsi/arcmsr/arcmsr_hba.c  2015-11-23 16:25:22.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr_hba.c  2015-11-24 11:35:26.0 +0800
@@ -2694,15 +2694,15 @@ static bool arcmsr_hbaB_get_config(struc
acb->firm_model,
acb->firm_version);
 
-   acb->signature = readl(>message_rwbuffer[1]);
+   acb->signature = readl(>message_rwbuffer[0]);
/*firm_signature,1,00-03*/
-   acb->firm_request_len = readl(>message_rwbuffer[2]);
+   acb->firm_request_len = readl(>message_rwbuffer[1]);
/*firm_request_len,1,04-07*/
-   acb->firm_numbers_queue = readl(>message_rwbuffer[3]);
+   acb->firm_numbers_queue = readl(>message_rwbuffer[2]);
/*firm_numbers_queue,2,08-11*/
-   acb->firm_sdram_size = readl(>message_rwbuffer[4]);
+   acb->firm_sdram_size = readl(>message_rwbuffer[3]);
/*firm_sdram_size,3,12-15*/
-   acb->firm_hd_channels = readl(>message_rwbuffer[5]);
+   acb->firm_hd_channels = readl(>message_rwbuffer[4]);
/*firm_ide_channels,4,16-19*/
acb->firm_cfg_version = readl(>message_rwbuffer[25]);  
/*firm_cfg_version,25,100-103*/
/*firm_ide_channels,4,16-19*/
@@ -2880,15 +2880,15 @@ static bool arcmsr_hbaD_get_config(struc
iop_device_map++;
count--;
}
-   acb->signature = readl(>msgcode_rwbuffer[1]);
+   acb->signature = readl(>msgcode_rwbuffer[0]);
/*firm_signature,1,00-03*/
-   acb->firm_request_len = readl(>msgcode_rwbuffer[2]);
+   acb->firm_request_len = readl(>msgcode_rwbuffer[1]);
/*firm_request_len,1,04-07*/
-   acb->firm_numbers_queue = readl(>msgcode_rwbuffer[3]);
+   acb->firm_numbers_queue = readl(>msgcode_rwbuffer[2]);
/*firm_numbers_queue,2,08-11*/
-   acb->firm_sdram_size = readl(>msgcode_rwbuffer[4]);
+   acb->firm_sdram_size = readl(>msgcode_rwbuffer[3]);
/*firm_sdram_size,3,12-15*/
-   acb->firm_hd_channels = readl(>msgcode_rwbuffer[5]);
+   acb->firm_hd_channels = readl(>msgcode_rwbuffer[4]);
/*firm_hd_channels,4,16-19*/
acb->firm_cfg_version = readl(>msgcode_rwbuffer[25]);
pr_notice("Areca RAID Controller%d: Model %s, F/W %s\n",


--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v3 2/5] arcmsr: fixes not release allocated resource

2015-11-25 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

Releasing allocated resource if get configuration data failed.

Signed-of-by: Ching Huang <ching2...@areca.com.tw>

---

diff -uprN a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c
--- a/drivers/scsi/arcmsr/arcmsr_hba.c  2015-11-24 11:35:26.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr_hba.c  2015-11-25 19:04:44.59097 +0800
@@ -2664,7 +2664,7 @@ static bool arcmsr_hbaB_get_config(struc
if (!arcmsr_hbaB_wait_msgint_ready(acb)) {
printk(KERN_NOTICE "arcmsr%d: wait 'get adapter firmware \
miscellaneous data' timeout \n", acb->host->host_no);
-   return false;
+   goto err_free_dma;
}
count = 8;
while (count){
@@ -2707,6 +2707,10 @@ static bool arcmsr_hbaB_get_config(struc
acb->firm_cfg_version = readl(>message_rwbuffer[25]);  
/*firm_cfg_version,25,100-103*/
/*firm_ide_channels,4,16-19*/
return true;
+err_free_dma:
+   dma_free_coherent(>pdev->dev, acb->roundup_ccbsize,
+   acb->dma_coherent2, acb->dma_coherent_handle2);
+   return false;
 }
 
 static bool arcmsr_hbaC_get_config(struct AdapterControlBlock *pACB)


--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v3 4/5] arcmsr: adds code for support areca new adapter ARC1203

2015-11-25 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

Support areca new PCIe to SATA RAID adapter ARC1203

Signed-of-by: Ching Huang <ching2...@areca.com.tw>

---

diff -uprN a/drivers/scsi/arcmsr/arcmsr.h b/drivers/scsi/arcmsr/arcmsr.h
--- a/drivers/scsi/arcmsr/arcmsr.h  2015-11-25 19:10:21.30996 +0800
+++ b/drivers/scsi/arcmsr/arcmsr.h  2015-11-25 18:25:42.926038000 +0800
@@ -74,6 +74,9 @@ struct device_attribute;
 #ifndef PCI_DEVICE_ID_ARECA_1214
#define PCI_DEVICE_ID_ARECA_12140x1214
 #endif
+#ifndef PCI_DEVICE_ID_ARECA_1203
+   #define PCI_DEVICE_ID_ARECA_12030x1203
+#endif
 /*
 
**
 **
@@ -245,6 +248,12 @@ struct FIRMWARE_INFO
 /* window of "instruction flags" from iop to driver */
 #define ARCMSR_IOP2DRV_DOORBELL   0x00020408
 #define ARCMSR_IOP2DRV_DOORBELL_MASK  0x0002040C
+/* window of "instruction flags" from iop to driver */
+#define ARCMSR_IOP2DRV_DOORBELL_1203  0x00021870
+#define ARCMSR_IOP2DRV_DOORBELL_MASK_1203 0x00021874
+/* window of "instruction flags" from driver to iop */
+#define ARCMSR_DRV2IOP_DOORBELL_1203  0x00021878
+#define ARCMSR_DRV2IOP_DOORBELL_MASK_1203 0x0002187C
 /* ARECA FLAG LANGUAGE */
 /* ioctl transfer */
 #define ARCMSR_IOP2DRV_DATA_WRITE_OK  0x0001
diff -uprN a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c
--- a/drivers/scsi/arcmsr/arcmsr_hba.c  2015-11-25 19:11:27.679958000 +0800
+++ b/drivers/scsi/arcmsr/arcmsr_hba.c  2015-11-25 18:30:52.239029000 +0800
@@ -114,6 +114,7 @@ static void arcmsr_hardware_reset(struct
 static const char *arcmsr_info(struct Scsi_Host *);
 static irqreturn_t arcmsr_interrupt(struct AdapterControlBlock *acb);
 static void arcmsr_free_irq(struct pci_dev *, struct AdapterControlBlock *);
+static void arcmsr_wait_firmware_ready(struct AdapterControlBlock *acb);
 static int arcmsr_adjust_disk_queue_depth(struct scsi_device *sdev, int 
queue_depth)
 {
if (queue_depth > ARCMSR_MAX_CMD_PERLUN)
@@ -157,6 +158,8 @@ static struct pci_device_id arcmsr_devic
.driver_data = ACB_ADAPTER_TYPE_B},
{PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1202),
.driver_data = ACB_ADAPTER_TYPE_B},
+   {PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1203),
+   .driver_data = ACB_ADAPTER_TYPE_B},
{PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1210),
.driver_data = ACB_ADAPTER_TYPE_A},
{PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1214),
@@ -2621,7 +2624,7 @@ static bool arcmsr_hbaA_get_config(struc
 }
 static bool arcmsr_hbaB_get_config(struct AdapterControlBlock *acb)
 {
-   struct MessageUnit_B *reg = acb->pmuB;
+   struct MessageUnit_B *reg;
struct pci_dev *pdev = acb->pdev;
void *dma_coherent;
dma_addr_t dma_coherent_handle;
@@ -2649,10 +2652,17 @@ static bool arcmsr_hbaB_get_config(struc
acb->dma_coherent2 = dma_coherent;
reg = (struct MessageUnit_B *)dma_coherent;
acb->pmuB = reg;
-   reg->drv2iop_doorbell= MEM_BASE0(ARCMSR_DRV2IOP_DOORBELL);
-   reg->drv2iop_doorbell_mask = MEM_BASE0(ARCMSR_DRV2IOP_DOORBELL_MASK);
-   reg->iop2drv_doorbell = MEM_BASE0(ARCMSR_IOP2DRV_DOORBELL);
-   reg->iop2drv_doorbell_mask = MEM_BASE0(ARCMSR_IOP2DRV_DOORBELL_MASK);
+   if (acb->pdev->device == PCI_DEVICE_ID_ARECA_1203) {
+   reg->drv2iop_doorbell = MEM_BASE0(ARCMSR_DRV2IOP_DOORBELL_1203);
+   reg->drv2iop_doorbell_mask = 
MEM_BASE0(ARCMSR_DRV2IOP_DOORBELL_MASK_1203);
+   reg->iop2drv_doorbell = MEM_BASE0(ARCMSR_IOP2DRV_DOORBELL_1203);
+   reg->iop2drv_doorbell_mask = 
MEM_BASE0(ARCMSR_IOP2DRV_DOORBELL_MASK_1203);
+   } else {
+   reg->drv2iop_doorbell= MEM_BASE0(ARCMSR_DRV2IOP_DOORBELL);
+   reg->drv2iop_doorbell_mask = 
MEM_BASE0(ARCMSR_DRV2IOP_DOORBELL_MASK);
+   reg->iop2drv_doorbell = MEM_BASE0(ARCMSR_IOP2DRV_DOORBELL);
+   reg->iop2drv_doorbell_mask = 
MEM_BASE0(ARCMSR_IOP2DRV_DOORBELL_MASK);
+   }
reg->message_wbuffer = MEM_BASE1(ARCMSR_MESSAGE_WBUFFER);
reg->message_rbuffer =  MEM_BASE1(ARCMSR_MESSAGE_RBUFFER);
reg->message_rwbuffer = MEM_BASE1(ARCMSR_MESSAGE_RWBUFFER);
@@ -2660,6 +2670,12 @@ static bool arcmsr_hbaB_get_config(struc
iop_firm_version = (char __iomem *)(>message_rwbuffer[17]);
/*firm_version,17,68-83*/
iop_device_map = (char __iomem *)(>message_rwbuffer[21]);  
/*firm_version,21,84-99*/
 
+   arcmsr_wait_firmware_ready(acb);
+   writel(ARCMSR_MESSAGE_START_DRIVER_MODE, reg->drv2iop_doorbell);
+   if (!arcmsr_hbaB_wait_msgint_ready(acb)) {
+   

[PATCH v3 5/5] arcmsr: changes driver version number

2015-11-25 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

Changes driver version number.

Signed-of-by: Ching Huang <ching2...@areca.com.tw>

---

diff -uprN a/drivers/scsi/arcmsr/arcmsr.h b/drivers/scsi/arcmsr/arcmsr.h
--- a/drivers/scsi/arcmsr/arcmsr.h  2015-11-25 18:25:42.926038000 +0800
+++ b/drivers/scsi/arcmsr/arcmsr.h  2015-11-25 18:04:27.400075000 +0800
@@ -52,7 +52,7 @@ struct device_attribute;
#define ARCMSR_MAX_FREECCB_NUM  320
 #define ARCMSR_MAX_OUTSTANDING_CMD 255
 #endif
-#define ARCMSR_DRIVER_VERSION  "v1.30.00.04-20140919"
+#define ARCMSR_DRIVER_VERSION  "v1.30.00.21-20151019"
 #define ARCMSR_SCSI_INITIATOR_ID   
255
 #define ARCMSR_MAX_XFER_SECTORS
512
 #define ARCMSR_MAX_XFER_SECTORS_B  
4096


--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 0/2] arcmsr: support areca new adapter ARC1203

2015-11-24 Thread Ching Huang
On Tue, 2015-11-24 at 16:07 +0100, Hannes Reinecke wrote:
> On 11/24/2015 09:00 AM, Ching Huang wrote:
> > From: Ching Huang <ching2...@areca.com.tw>
> > 
> > Patch 1 fixes getting wrong configuration data.
> > 
> > Pacth 2 adds codes to support new adapter ARC1203.
> > 
Patch 3 changes driver version number.
> Please split off the driver version update into a separate patch and
> add it as the last patch in the series.
> Otherwise it'll be hard to keep track of which patch belongs to
> which version.
> Thanks.
> 
> Cheers,
> 
> Hannes
> 
OK. So I have patch 3 as above.
I will resend v2 all 3 patches later. 

Thanks, 
Ching
> 

--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v2 0/3] arcmsr: support areca new adapter ARC1203

2015-11-24 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

Patch 1 fixes getting wrong configuration data.

Pacth 2 adds codes to support new adapter ARC1203.

Patch 3 changes driver version number.

--


--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v2 1/3] arcmsr: fixed getting wrong configuration data

2015-11-24 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

Fixed getting wrong configuration data of adapter type B and type D.

Signed-of-by: Ching Huang <ching2...@areca.com.tw>

---

diff -uprN a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c
--- a/drivers/scsi/arcmsr/arcmsr_hba.c  2015-11-23 16:25:22.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr_hba.c  2015-11-24 11:35:26.0 +0800
@@ -2694,15 +2694,15 @@ static bool arcmsr_hbaB_get_config(struc
acb->firm_model,
acb->firm_version);
 
-   acb->signature = readl(>message_rwbuffer[1]);
+   acb->signature = readl(>message_rwbuffer[0]);
/*firm_signature,1,00-03*/
-   acb->firm_request_len = readl(>message_rwbuffer[2]);
+   acb->firm_request_len = readl(>message_rwbuffer[1]);
/*firm_request_len,1,04-07*/
-   acb->firm_numbers_queue = readl(>message_rwbuffer[3]);
+   acb->firm_numbers_queue = readl(>message_rwbuffer[2]);
/*firm_numbers_queue,2,08-11*/
-   acb->firm_sdram_size = readl(>message_rwbuffer[4]);
+   acb->firm_sdram_size = readl(>message_rwbuffer[3]);
/*firm_sdram_size,3,12-15*/
-   acb->firm_hd_channels = readl(>message_rwbuffer[5]);
+   acb->firm_hd_channels = readl(>message_rwbuffer[4]);
/*firm_ide_channels,4,16-19*/
acb->firm_cfg_version = readl(>message_rwbuffer[25]);  
/*firm_cfg_version,25,100-103*/
/*firm_ide_channels,4,16-19*/
@@ -2880,15 +2880,15 @@ static bool arcmsr_hbaD_get_config(struc
iop_device_map++;
count--;
}
-   acb->signature = readl(>msgcode_rwbuffer[1]);
+   acb->signature = readl(>msgcode_rwbuffer[0]);
/*firm_signature,1,00-03*/
-   acb->firm_request_len = readl(>msgcode_rwbuffer[2]);
+   acb->firm_request_len = readl(>msgcode_rwbuffer[1]);
/*firm_request_len,1,04-07*/
-   acb->firm_numbers_queue = readl(>msgcode_rwbuffer[3]);
+   acb->firm_numbers_queue = readl(>msgcode_rwbuffer[2]);
/*firm_numbers_queue,2,08-11*/
-   acb->firm_sdram_size = readl(>msgcode_rwbuffer[4]);
+   acb->firm_sdram_size = readl(>msgcode_rwbuffer[3]);
/*firm_sdram_size,3,12-15*/
-   acb->firm_hd_channels = readl(>msgcode_rwbuffer[5]);
+   acb->firm_hd_channels = readl(>msgcode_rwbuffer[4]);
/*firm_hd_channels,4,16-19*/
acb->firm_cfg_version = readl(>msgcode_rwbuffer[25]);
pr_notice("Areca RAID Controller%d: Model %s, F/W %s\n",


--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v2 2/3] arcmsr: adds code for support areca new adapter ARC1203

2015-11-24 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

Support areca new PCIe to SATA RAID adapter ARC1203

Signed-of-by: Ching Huang<ching2...@areca.com.tw>

---

diff -uprN a/drivers/scsi/arcmsr/arcmsr.h b/drivers/scsi/arcmsr/arcmsr.h
--- a/drivers/scsi/arcmsr/arcmsr.h  2015-11-25 10:52:16.28647 +0800
+++ b/drivers/scsi/arcmsr/arcmsr.h  2015-11-25 10:52:13.33447 +0800
@@ -74,6 +74,9 @@ struct device_attribute;
 #ifndef PCI_DEVICE_ID_ARECA_1214
#define PCI_DEVICE_ID_ARECA_12140x1214
 #endif
+#ifndef PCI_DEVICE_ID_ARECA_1203
+   #define PCI_DEVICE_ID_ARECA_12030x1203
+#endif
 /*
 
**
 **
@@ -245,6 +248,12 @@ struct FIRMWARE_INFO
 /* window of "instruction flags" from iop to driver */
 #define ARCMSR_IOP2DRV_DOORBELL   0x00020408
 #define ARCMSR_IOP2DRV_DOORBELL_MASK  0x0002040C
+/* window of "instruction flags" from iop to driver */
+#define ARCMSR_IOP2DRV_DOORBELL_1203  0x00021870
+#define ARCMSR_IOP2DRV_DOORBELL_MASK_1203 0x00021874
+/* window of "instruction flags" from driver to iop */
+#define ARCMSR_DRV2IOP_DOORBELL_1203  0x00021878
+#define ARCMSR_DRV2IOP_DOORBELL_MASK_1203 0x0002187C
 /* ARECA FLAG LANGUAGE */
 /* ioctl transfer */
 #define ARCMSR_IOP2DRV_DATA_WRITE_OK  0x0001
diff -uprN a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c
--- a/drivers/scsi/arcmsr/arcmsr_hba.c  2015-11-24 11:35:26.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr_hba.c  2015-11-24 18:58:40.640226000 +0800
@@ -114,6 +114,7 @@ static void arcmsr_hardware_reset(struct
 static const char *arcmsr_info(struct Scsi_Host *);
 static irqreturn_t arcmsr_interrupt(struct AdapterControlBlock *acb);
 static void arcmsr_free_irq(struct pci_dev *, struct AdapterControlBlock *);
+static void arcmsr_wait_firmware_ready(struct AdapterControlBlock *acb);
 static int arcmsr_adjust_disk_queue_depth(struct scsi_device *sdev, int 
queue_depth)
 {
if (queue_depth > ARCMSR_MAX_CMD_PERLUN)
@@ -157,6 +158,8 @@ static struct pci_device_id arcmsr_devic
.driver_data = ACB_ADAPTER_TYPE_B},
{PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1202),
.driver_data = ACB_ADAPTER_TYPE_B},
+   {PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1203),
+   .driver_data = ACB_ADAPTER_TYPE_B},
{PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1210),
.driver_data = ACB_ADAPTER_TYPE_A},
{PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1214),
@@ -2621,7 +2624,7 @@ static bool arcmsr_hbaA_get_config(struc
 }
 static bool arcmsr_hbaB_get_config(struct AdapterControlBlock *acb)
 {
-   struct MessageUnit_B *reg = acb->pmuB;
+   struct MessageUnit_B *reg;
struct pci_dev *pdev = acb->pdev;
void *dma_coherent;
dma_addr_t dma_coherent_handle;
@@ -2649,10 +2652,17 @@ static bool arcmsr_hbaB_get_config(struc
acb->dma_coherent2 = dma_coherent;
reg = (struct MessageUnit_B *)dma_coherent;
acb->pmuB = reg;
-   reg->drv2iop_doorbell= (uint32_t __iomem *)((unsigned 
long)acb->mem_base0 + ARCMSR_DRV2IOP_DOORBELL);
-   reg->drv2iop_doorbell_mask = (uint32_t __iomem *)((unsigned 
long)acb->mem_base0 + ARCMSR_DRV2IOP_DOORBELL_MASK);
-   reg->iop2drv_doorbell = (uint32_t __iomem *)((unsigned 
long)acb->mem_base0 + ARCMSR_IOP2DRV_DOORBELL);
-   reg->iop2drv_doorbell_mask = (uint32_t __iomem *)((unsigned 
long)acb->mem_base0 + ARCMSR_IOP2DRV_DOORBELL_MASK);
+   if (acb->pdev->device == PCI_DEVICE_ID_ARECA_1203) {
+   reg->drv2iop_doorbell = (uint32_t __iomem *)((unsigned 
long)acb->mem_base0 + ARCMSR_DRV2IOP_DOORBELL_1203);
+   reg->drv2iop_doorbell_mask = (uint32_t __iomem *)((unsigned 
long)acb->mem_base0 + ARCMSR_DRV2IOP_DOORBELL_MASK_1203);
+   reg->iop2drv_doorbell = (uint32_t __iomem *)((unsigned 
long)acb->mem_base0 + ARCMSR_IOP2DRV_DOORBELL_1203);
+   reg->iop2drv_doorbell_mask = (uint32_t __iomem *)((unsigned 
long)acb->mem_base0 + ARCMSR_IOP2DRV_DOORBELL_MASK_1203);
+   } else {
+   reg->drv2iop_doorbell= (uint32_t __iomem *)((unsigned 
long)acb->mem_base0 + ARCMSR_DRV2IOP_DOORBELL);
+   reg->drv2iop_doorbell_mask = (uint32_t __iomem *)((unsigned 
long)acb->mem_base0 + ARCMSR_DRV2IOP_DOORBELL_MASK);
+   reg->iop2drv_doorbell = (uint32_t __iomem *)((unsigned 
long)acb->mem_base0 + ARCMSR_IOP2DRV_DOORBELL);
+   reg->iop2drv_doorbell_mask = (uint32_t __iomem *)((unsigned 
long)acb->mem_base0 + ARCMSR_IOP2DRV_DOORBELL_MASK);
+   }
reg->message_wbuffer = (uint32_t __iomem *)((unsigned 
long)acb->mem_

[PATCH v2 3/3] arcmsr: changes driver version number

2015-11-24 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

Changes driver version number.

Signed-of-by: Ching Huang <ching2...@areca.com.tw>

---

diff -uprN a/drivers/scsi/arcmsr/arcmsr.h b/drivers/scsi/arcmsr/arcmsr.h
--- a/drivers/scsi/arcmsr/arcmsr.h  2015-11-25 10:52:13.33447 +0800
+++ b/drivers/scsi/arcmsr/arcmsr.h  2015-10-19 15:57:08.0 +0800
@@ -52,7 +52,7 @@ struct device_attribute;
#define ARCMSR_MAX_FREECCB_NUM  320
 #define ARCMSR_MAX_OUTSTANDING_CMD 255
 #endif
-#define ARCMSR_DRIVER_VERSION  "v1.30.00.04-20140919"
+#define ARCMSR_DRIVER_VERSION  "v1.30.00.21-20151019"
 #define ARCMSR_SCSI_INITIATOR_ID   
255
 #define ARCMSR_MAX_XFER_SECTORS
512
 #define ARCMSR_MAX_XFER_SECTORS_B  
4096


--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 0/2] arcmsr: support areca new adapter ARC1203

2015-11-24 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

Patch 1 fixes getting wrong configuration data.

Pacth 2 adds codes to support new adapter ARC1203.

--


--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 1/2] arcmsr: fixed getting wrong configuration data

2015-11-24 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

Fixed getting wrong configuration data of adapter type B and type D.

Signed-of-by: Ching Huang <ching2...@areca.com.tw>

---

diff -uprN a/drivers/scsi/arcmsr/arcmsr.h b/drivers/scsi/arcmsr/arcmsr.h
--- a/drivers/scsi/arcmsr/arcmsr.h  2015-11-23 16:25:48.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr.h  2015-11-24 11:36:20.0 +0800
@@ -52,7 +52,7 @@ struct device_attribute;
#define ARCMSR_MAX_FREECCB_NUM  320
 #define ARCMSR_MAX_OUTSTANDING_CMD 255
 #endif
-#define ARCMSR_DRIVER_VERSION  "v1.30.00.04-20140919"
+#define ARCMSR_DRIVER_VERSION  "v1.30.00.21-20151019"
 #define ARCMSR_SCSI_INITIATOR_ID   
255
 #define ARCMSR_MAX_XFER_SECTORS
512
 #define ARCMSR_MAX_XFER_SECTORS_B  
4096
diff -uprN a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c
--- a/drivers/scsi/arcmsr/arcmsr_hba.c  2015-11-23 16:25:22.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr_hba.c  2015-11-24 11:35:26.0 +0800
@@ -2694,15 +2694,15 @@ static bool arcmsr_hbaB_get_config(struc
acb->firm_model,
acb->firm_version);
 
-   acb->signature = readl(>message_rwbuffer[1]);
+   acb->signature = readl(>message_rwbuffer[0]);
/*firm_signature,1,00-03*/
-   acb->firm_request_len = readl(>message_rwbuffer[2]);
+   acb->firm_request_len = readl(>message_rwbuffer[1]);
/*firm_request_len,1,04-07*/
-   acb->firm_numbers_queue = readl(>message_rwbuffer[3]);
+   acb->firm_numbers_queue = readl(>message_rwbuffer[2]);
/*firm_numbers_queue,2,08-11*/
-   acb->firm_sdram_size = readl(>message_rwbuffer[4]);
+   acb->firm_sdram_size = readl(>message_rwbuffer[3]);
/*firm_sdram_size,3,12-15*/
-   acb->firm_hd_channels = readl(>message_rwbuffer[5]);
+   acb->firm_hd_channels = readl(>message_rwbuffer[4]);
/*firm_ide_channels,4,16-19*/
acb->firm_cfg_version = readl(>message_rwbuffer[25]);  
/*firm_cfg_version,25,100-103*/
/*firm_ide_channels,4,16-19*/
@@ -2880,15 +2880,15 @@ static bool arcmsr_hbaD_get_config(struc
iop_device_map++;
count--;
}
-   acb->signature = readl(>msgcode_rwbuffer[1]);
+   acb->signature = readl(>msgcode_rwbuffer[0]);
/*firm_signature,1,00-03*/
-   acb->firm_request_len = readl(>msgcode_rwbuffer[2]);
+   acb->firm_request_len = readl(>msgcode_rwbuffer[1]);
/*firm_request_len,1,04-07*/
-   acb->firm_numbers_queue = readl(>msgcode_rwbuffer[3]);
+   acb->firm_numbers_queue = readl(>msgcode_rwbuffer[2]);
/*firm_numbers_queue,2,08-11*/
-   acb->firm_sdram_size = readl(>msgcode_rwbuffer[4]);
+   acb->firm_sdram_size = readl(>msgcode_rwbuffer[3]);
/*firm_sdram_size,3,12-15*/
-   acb->firm_hd_channels = readl(>msgcode_rwbuffer[5]);
+   acb->firm_hd_channels = readl(>msgcode_rwbuffer[4]);
/*firm_hd_channels,4,16-19*/
acb->firm_cfg_version = readl(>msgcode_rwbuffer[25]);
pr_notice("Areca RAID Controller%d: Model %s, F/W %s\n",


--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 2/2] arcmsr: adds code for support areca new adapter ARC1203

2015-11-24 Thread Ching Huang
From: Ching Huang <ching2...@areca.com.tw>

Support areca new PCIe to SATA RAID adapter ARC1203

Signed-of-by: Ching Huang<ching2...@areca.com.tw>

---

diff -uprN a/drivers/scsi/arcmsr/arcmsr.h b/drivers/scsi/arcmsr/arcmsr.h
--- a/drivers/scsi/arcmsr/arcmsr.h  2015-11-24 11:36:20.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr.h  2015-10-19 15:57:08.0 +0800
@@ -74,6 +74,9 @@ struct device_attribute;
 #ifndef PCI_DEVICE_ID_ARECA_1214
#define PCI_DEVICE_ID_ARECA_12140x1214
 #endif
+#ifndef PCI_DEVICE_ID_ARECA_1203
+   #define PCI_DEVICE_ID_ARECA_12030x1203
+#endif
 /*
 
**
 **
@@ -245,6 +248,12 @@ struct FIRMWARE_INFO
 /* window of "instruction flags" from iop to driver */
 #define ARCMSR_IOP2DRV_DOORBELL   0x00020408
 #define ARCMSR_IOP2DRV_DOORBELL_MASK  0x0002040C
+/* window of "instruction flags" from iop to driver */
+#define ARCMSR_IOP2DRV_DOORBELL_1203  0x00021870
+#define ARCMSR_IOP2DRV_DOORBELL_MASK_1203 0x00021874
+/* window of "instruction flags" from driver to iop */
+#define ARCMSR_DRV2IOP_DOORBELL_1203  0x00021878
+#define ARCMSR_DRV2IOP_DOORBELL_MASK_1203 0x0002187C
 /* ARECA FLAG LANGUAGE */
 /* ioctl transfer */
 #define ARCMSR_IOP2DRV_DATA_WRITE_OK  0x0001
diff -uprN a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c
--- a/drivers/scsi/arcmsr/arcmsr_hba.c  2015-11-24 11:35:26.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr_hba.c  2015-11-23 18:03:30.0 +0800
@@ -114,6 +114,7 @@ static void arcmsr_hardware_reset(struct
 static const char *arcmsr_info(struct Scsi_Host *);
 static irqreturn_t arcmsr_interrupt(struct AdapterControlBlock *acb);
 static void arcmsr_free_irq(struct pci_dev *, struct AdapterControlBlock *);
+static void arcmsr_wait_firmware_ready(struct AdapterControlBlock *acb);
 static int arcmsr_adjust_disk_queue_depth(struct scsi_device *sdev, int 
queue_depth)
 {
if (queue_depth > ARCMSR_MAX_CMD_PERLUN)
@@ -157,6 +158,8 @@ static struct pci_device_id arcmsr_devic
.driver_data = ACB_ADAPTER_TYPE_B},
{PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1202),
.driver_data = ACB_ADAPTER_TYPE_B},
+   {PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1203),
+   .driver_data = ACB_ADAPTER_TYPE_B},
{PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1210),
.driver_data = ACB_ADAPTER_TYPE_A},
{PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1214),
@@ -2621,7 +2624,7 @@ static bool arcmsr_hbaA_get_config(struc
 }
 static bool arcmsr_hbaB_get_config(struct AdapterControlBlock *acb)
 {
-   struct MessageUnit_B *reg = acb->pmuB;
+   struct MessageUnit_B *reg;
struct pci_dev *pdev = acb->pdev;
void *dma_coherent;
dma_addr_t dma_coherent_handle;
@@ -2649,10 +2652,17 @@ static bool arcmsr_hbaB_get_config(struc
acb->dma_coherent2 = dma_coherent;
reg = (struct MessageUnit_B *)dma_coherent;
acb->pmuB = reg;
-   reg->drv2iop_doorbell= (uint32_t __iomem *)((unsigned 
long)acb->mem_base0 + ARCMSR_DRV2IOP_DOORBELL);
-   reg->drv2iop_doorbell_mask = (uint32_t __iomem *)((unsigned 
long)acb->mem_base0 + ARCMSR_DRV2IOP_DOORBELL_MASK);
-   reg->iop2drv_doorbell = (uint32_t __iomem *)((unsigned 
long)acb->mem_base0 + ARCMSR_IOP2DRV_DOORBELL);
-   reg->iop2drv_doorbell_mask = (uint32_t __iomem *)((unsigned 
long)acb->mem_base0 + ARCMSR_IOP2DRV_DOORBELL_MASK);
+   if (acb->pdev->device == PCI_DEVICE_ID_ARECA_1203) {
+   reg->drv2iop_doorbell = (uint32_t __iomem *)((unsigned 
long)acb->mem_base0 + ARCMSR_DRV2IOP_DOORBELL_1203);
+   reg->drv2iop_doorbell_mask = (uint32_t __iomem *)((unsigned 
long)acb->mem_base0 + ARCMSR_DRV2IOP_DOORBELL_MASK_1203);
+   reg->iop2drv_doorbell = (uint32_t __iomem *)((unsigned 
long)acb->mem_base0 + ARCMSR_IOP2DRV_DOORBELL_1203);
+   reg->iop2drv_doorbell_mask = (uint32_t __iomem *)((unsigned 
long)acb->mem_base0 + ARCMSR_IOP2DRV_DOORBELL_MASK_1203);
+   } else {
+   reg->drv2iop_doorbell= (uint32_t __iomem *)((unsigned 
long)acb->mem_base0 + ARCMSR_DRV2IOP_DOORBELL);
+   reg->drv2iop_doorbell_mask = (uint32_t __iomem *)((unsigned 
long)acb->mem_base0 + ARCMSR_DRV2IOP_DOORBELL_MASK);
+   reg->iop2drv_doorbell = (uint32_t __iomem *)((unsigned 
long)acb->mem_base0 + ARCMSR_IOP2DRV_DOORBELL);
+   reg->iop2drv_doorbell_mask = (uint32_t __iomem *)((unsigned 
long)acb->mem_base0 + ARCMSR_IOP2DRV_DOORBELL_MASK);
+   }
reg->message_wbuffer = (uint32_t __iomem *)((unsigned 
long)acb->mem_

Re: [PATCH 2/2] arcmsr: adds code for support areca new adapter ARC1203

2015-11-24 Thread Ching Huang
On Tue, 2015-11-24 at 01:33 -0800, Joe Perches wrote:
> On Tue, 2015-11-24 at 16:17 +0800, Ching Huang wrote:
> > From: Ching Huang <ching2...@areca.com.tw>
> > 
> > Support areca new PCIe to SATA RAID adapter ARC1203
> 
> Why add the dma_free_coherent to an old data path?
> Is that a general bug fix that should be backported?

That's right. It's need to release the allocated resource for failed condition.
> 
> btw: the printk above the dma_free_coherent use
>  shouldn't use a \ line continuation.
>  it adds undesired whitespace to the format.
> 
> > diff -uprN a/drivers/scsi/arcmsr/arcmsr_hba.c 
> > b/drivers/scsi/arcmsr/arcmsr_hba.c
> []
> > @@ -2660,10 +2670,19 @@ static bool arcmsr_hbaB_get_config(struc
> > iop_firm_version = (char __iomem *)(®->message_rwbuffer[17]);>  > 
> > /*firm_version,17,68-83*/
> > iop_device_map = (char __iomem *)(®->message_rwbuffer[21]);>> 
> > /*firm_version,21,84-99*/
> >  
> > +   arcmsr_wait_firmware_ready(acb);
> > +   writel(ARCMSR_MESSAGE_START_DRIVER_MODE, reg->drv2iop_doorbell);
> > +   if (!arcmsr_hbaB_wait_msgint_ready(acb)) {
> > +   printk(KERN_ERR "arcmsr%d: can't set driver mode.\n", 
> > acb->host->host_no);
> > +   goto gcfg1;
> > +   }
> > writel(ARCMSR_MESSAGE_GET_CONFIG, reg->drv2iop_doorbell);
> > if (!arcmsr_hbaB_wait_msgint_ready(acb)) {
> > printk(KERN_NOTICE "arcmsr%d: wait 'get adapter firmware \
> > miscellaneous data' timeout \n", acb->host->host_no);
> > +gcfg1:
> > +   dma_free_coherent(>pdev->dev, acb->roundup_ccbsize,
> > +   acb->dma_coherent2, acb->dma_coherent_handle2);
> > return false;
> > }
> > count = 8;
> 


--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 2/2] arcmsr: adds code for support areca new adapter ARC1203

2015-11-24 Thread Ching Huang
On Tue, 2015-11-24 at 02:24 -0800, Joe Perches wrote:
> On Tue, 2015-11-24 at 17:53 +0800, Ching Huang wrote:
> > On Tue, 2015-11-24 at 01:33 -0800, Joe Perches wrote:
> > > On Tue, 2015-11-24 at 16:17 +0800, Ching Huang wrote:
> > > > From: Ching Huang <ching2...@areca.com.tw>
> > > > 
> > > > Support areca new PCIe to SATA RAID adapter ARC1203
> > > 
> > > Why add the dma_free_coherent to an old data path?
> > > Is that a general bug fix that should be backported?
> > 
> > That's right. It's need to release the allocated resource for failed
> > condition.
> 
> Then the dma_free_coherent addition should be a separate patch.
> 
> Style trivia:
> 
> The goto to another error path like that is odd and
> the label is unintelligible.
> 
> Ideally error condition handling would use a goto and
> a separate and obviously named label.  Use multiple
> labels for cases with more complicated unwinding.
> 
> Dan Carpenter has written about this several times.
> 
> For this use, something like:
> 
>   writel(ARCMSR_MESSAGE_START_DRIVER_MODE, reg->drv2iop_doorbell);
>   if (!arcmsr_hbaB_wait_msgint_ready(acb)) {
>   logging_message(...);
>   goto
> err_free_resource;
>   }
>   writel(ARCMSR_MESSAGE_GET_CONFIG, reg->drv2iop_doorbell);
>   if (!arcmsr_hbaB_wait_msgint_ready(acb)) {
>   logging_message(...);
>   goto err_free_resource;
>   }
> 
>   [success path...]
> 
>   return true;
> 
> err_free_resource:
>   dma_free_coherent(...);
> 
>   return false;
> }
> 
Thanks for Joe's advice.
Revised as below.

Signed-of-by: Ching Huang <ching2...@arcea.com.tw>

---
diff -uprN a/drivers/scsi/arcmsr/arcmsr.h b/drivers/scsi/arcmsr/arcmsr.h
--- a/drivers/scsi/arcmsr/arcmsr.h  2015-11-24 11:36:20.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr.h  2015-10-19 15:57:08.0 +0800
@@ -74,6 +74,9 @@ struct device_attribute;
 #ifndef PCI_DEVICE_ID_ARECA_1214
#define PCI_DEVICE_ID_ARECA_12140x1214
 #endif
+#ifndef PCI_DEVICE_ID_ARECA_1203
+   #define PCI_DEVICE_ID_ARECA_12030x1203
+#endif
 /*

**
 **
@@ -245,6 +248,12 @@ struct FIRMWARE_INFO
 /* window of "instruction flags" from iop to driver */
 #define ARCMSR_IOP2DRV_DOORBELL   0x00020408
 #define ARCMSR_IOP2DRV_DOORBELL_MASK  0x0002040C
+/* window of "instruction flags" from iop to driver */
+#define ARCMSR_IOP2DRV_DOORBELL_1203  0x00021870
+#define ARCMSR_IOP2DRV_DOORBELL_MASK_1203 0x00021874
+/* window of "instruction flags" from driver to iop */
+#define ARCMSR_DRV2IOP_DOORBELL_1203  0x00021878
+#define ARCMSR_DRV2IOP_DOORBELL_MASK_1203 0x0002187C
 /* ARECA FLAG LANGUAGE */
 /* ioctl transfer */
 #define ARCMSR_IOP2DRV_DATA_WRITE_OK  0x0001
diff -uprN a/drivers/scsi/arcmsr/arcmsr_hba.c
b/drivers/scsi/arcmsr/arcmsr_hba.c
--- a/drivers/scsi/arcmsr/arcmsr_hba.c  2015-11-24 11:35:26.0
+0800
+++ b/drivers/scsi/arcmsr/arcmsr_hba.c  2015-11-24 18:58:40.640226000
+0800
@@ -114,6 +114,7 @@ static void arcmsr_hardware_reset(struct
 static const char *arcmsr_info(struct Scsi_Host *);
 static irqreturn_t arcmsr_interrupt(struct AdapterControlBlock *acb);
 static void arcmsr_free_irq(struct pci_dev *, struct
AdapterControlBlock *);
+static void arcmsr_wait_firmware_ready(struct AdapterControlBlock
*acb);
 static int arcmsr_adjust_disk_queue_depth(struct scsi_device *sdev, int
queue_depth)
 {
if (queue_depth > ARCMSR_MAX_CMD_PERLUN)
@@ -157,6 +158,8 @@ static struct pci_device_id arcmsr_devic
.driver_data = ACB_ADAPTER_TYPE_B},
{PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1202),
.driver_data = ACB_ADAPTER_TYPE_B},
+   {PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1203),
+   .driver_data = ACB_ADAPTER_TYPE_B},
{PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1210),
.driver_data = ACB_ADAPTER_TYPE_A},
{PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1214),
@@ -2621,7 +2624,7 @@ static bool arcmsr_hbaA_get_config(struc
 }
 static bool arcmsr_hbaB_get_config(struct AdapterControlBlock *acb)
 {
-   struct MessageUnit_B *reg = acb->pmuB;
+   struct MessageUnit_B *reg;
struct pci_dev *pdev = acb->pdev;
void *dma_coherent;
dma_addr_t dma_coherent_handle;
@@ -2649,10 +2652,17 @@ static bool arcmsr_hbaB_get_config(struc
acb->dma_coherent2 = dma_coherent;
reg = (struct MessageUnit_B *)dma_coherent;
acb->pmuB = reg;
-   reg->drv2io

Re: [PATCH 1/1] arcmsr: Notify has sense data report

2014-11-28 Thread Ching Huang
Thanks to Dan's advice and Hannes' suggestion.
I will revise and resubmit it later.

On Fri, 2014-11-28 at 12:17 +0300, Dan Carpenter wrote:
 On Fri, Nov 28, 2014 at 12:20:44PM +0800, Ching Huang wrote:
  This patch is relative to 
  http://git.infradead.org/users/hch/scsi-queue.git/tree/refs/heads/drivers-for-3.18:/drivers/scsi/arcmsr
  
 
 Put this information after the --- cut off line so that it is not
 saved in the permanent git log.
 
  Setting command status with 'DRIVER_SENSE' except 'CHECK_CONDITION' if we 
  have sense data.
  
  Signed-off-by: Ching Huang ching2...@areca.com.tw
  ---
 
 --- Here.  Put it here.
 
  
  diff -uprN a/drivers/scsi/arcmsr/arcmsr.h b/drivers/scsi/arcmsr/arcmsr.h
  --- a/drivers/scsi/arcmsr/arcmsr.h  2014-09-19 11:04:41.84510 +0800
  +++ b/drivers/scsi/arcmsr/arcmsr.h  2014-11-28 10:54:30.0 +0800
  @@ -52,7 +52,7 @@ struct device_attribute;
  #define ARCMSR_MAX_FREECCB_NUM  320
   #define ARCMSR_MAX_OUTSTANDING_CMD 255
 
 regards,
 dan carpenter
 


--
To unsubscribe from this list: send the line unsubscribe linux-scsi in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 1.1 1/1] arcmsr: Notify has sense data report

2014-11-28 Thread Ching Huang
From: Ching Huang ching2...@areca.com.tw

Setting command status with 'DRIVER_SENSE' except 'CHECK_CONDITION' if we have 
sense data.

Signed-off-by: Ching Huang ching2...@areca.com.tw
---

This patch is relative to 
http://git.infradead.org/users/hch/scsi-queue.git/tree/refs/heads/drivers-for-3.18:/drivers/scsi/arcmsr


diff -uprN a/drivers/scsi/arcmsr/arcmsr.h b/drivers/scsi/arcmsr/arcmsr.h
--- a/drivers/scsi/arcmsr/arcmsr.h  2014-09-19 11:04:41.84510 +0800
+++ b/drivers/scsi/arcmsr/arcmsr.h  2014-11-28 10:54:30.0 +0800
@@ -52,7 +52,7 @@ struct device_attribute;
#define ARCMSR_MAX_FREECCB_NUM  320
 #define ARCMSR_MAX_OUTSTANDING_CMD 255
 #endif
-#define ARCMSR_DRIVER_VERSION  v1.30.00.04-20140919
+#define ARCMSR_DRIVER_VERSION  v1.30.00.05-20141128
 #define ARCMSR_SCSI_INITIATOR_ID   
255
 #define ARCMSR_MAX_XFER_SECTORS
512
 #define ARCMSR_MAX_XFER_SECTORS_B  
4096
diff -uprN a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c
--- a/drivers/scsi/arcmsr/arcmsr_hba.c  2014-09-19 11:01:26.99009 +0800
+++ b/drivers/scsi/arcmsr/arcmsr_hba.c  2014-11-28 17:51:04.0 +0800
@@ -989,16 +989,15 @@ static void arcmsr_report_sense_info(str
 
struct scsi_cmnd *pcmd = ccb-pcmd;
struct SENSE_DATA *sensebuffer = (struct SENSE_DATA 
*)pcmd-sense_buffer;
-   pcmd-result = DID_OK  16;
-   if (sensebuffer) {
-   int sense_data_length =
+
+   pcmd-result = (DRIVER_SENSE  24) | (DID_OK  16) | (CHECK_CONDITION 
 1);
+   int sense_data_length =
sizeof(struct SENSE_DATA)  SCSI_SENSE_BUFFERSIZE
? sizeof(struct SENSE_DATA) : SCSI_SENSE_BUFFERSIZE;
-   memset(sensebuffer, 0, SCSI_SENSE_BUFFERSIZE);
-   memcpy(sensebuffer, ccb-arcmsr_cdb.SenseData, 
sense_data_length);
-   sensebuffer-ErrorCode = SCSI_SENSE_CURRENT_ERRORS;
-   sensebuffer-Valid = 1;
-   }
+   memset(sensebuffer, 0, SCSI_SENSE_BUFFERSIZE);
+   memcpy(sensebuffer, ccb-arcmsr_cdb.SenseData, sense_data_length);
+   sensebuffer-ErrorCode = SCSI_SENSE_CURRENT_ERRORS;
+   sensebuffer-Valid = 1;
 }
 
 static u32 arcmsr_disable_outbound_ints(struct AdapterControlBlock *acb)


--
To unsubscribe from this list: send the line unsubscribe linux-scsi in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 1/1] arcmsr: Notify has sense data report

2014-11-27 Thread Ching Huang
From: Ching Huang ching2...@areca.com.tw

This patch is relative to 
http://git.infradead.org/users/hch/scsi-queue.git/tree/refs/heads/drivers-for-3.18:/drivers/scsi/arcmsr

Setting command status with 'DRIVER_SENSE' except 'CHECK_CONDITION' if we have 
sense data.

Signed-off-by: Ching Huang ching2...@areca.com.tw
---

diff -uprN a/drivers/scsi/arcmsr/arcmsr.h b/drivers/scsi/arcmsr/arcmsr.h
--- a/drivers/scsi/arcmsr/arcmsr.h  2014-09-19 11:04:41.84510 +0800
+++ b/drivers/scsi/arcmsr/arcmsr.h  2014-11-28 10:54:30.0 +0800
@@ -52,7 +52,7 @@ struct device_attribute;
#define ARCMSR_MAX_FREECCB_NUM  320
 #define ARCMSR_MAX_OUTSTANDING_CMD 255
 #endif
-#define ARCMSR_DRIVER_VERSION  v1.30.00.04-20140919
+#define ARCMSR_DRIVER_VERSION  v1.30.00.05-20141128
 #define ARCMSR_SCSI_INITIATOR_ID   
255
 #define ARCMSR_MAX_XFER_SECTORS
512
 #define ARCMSR_MAX_XFER_SECTORS_B  
4096
diff -uprN a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c
--- a/drivers/scsi/arcmsr/arcmsr_hba.c  2014-09-19 11:01:26.99009 +0800
+++ b/drivers/scsi/arcmsr/arcmsr_hba.c  2014-11-28 10:55:54.0 +0800
@@ -989,7 +989,8 @@ static void arcmsr_report_sense_info(str
 
struct scsi_cmnd *pcmd = ccb-pcmd;
struct SENSE_DATA *sensebuffer = (struct SENSE_DATA 
*)pcmd-sense_buffer;
-   pcmd-result = DID_OK  16;
+
+   pcmd-result = (DID_OK  16) | (CHECK_CONDITION  1);
if (sensebuffer) {
int sense_data_length =
sizeof(struct SENSE_DATA)  SCSI_SENSE_BUFFERSIZE
@@ -998,6 +999,7 @@ static void arcmsr_report_sense_info(str
memcpy(sensebuffer, ccb-arcmsr_cdb.SenseData, 
sense_data_length);
sensebuffer-ErrorCode = SCSI_SENSE_CURRENT_ERRORS;
sensebuffer-Valid = 1;
+   pcmd-result |= (DRIVER_SENSE  24);
}
 }
 


--
To unsubscribe from this list: send the line unsubscribe linux-scsi in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v5 1/2] arcmsr: simplify ioctl data read/write

2014-09-25 Thread Ching Huang
On Wed, 2014-09-24 at 17:48 +0200, Tomas Henzl wrote:
 On 09/24/2014 11:33 AM, Ching Huang wrote:
  From: Ching Huang ching2...@areca.com.tw
 
  This patch is relative to:
  http://git.infradead.org/users/hch/scsi-queue.git/tree/drivers-for-3.18:/drivers/scsi/arcmsr
 
  change in v5:
  1. rename firstindex to getIndex, lastindex to putIndex for readability
  2. define ARCMSR_API_DATA_BUFLEN as 1032
  3. simplify ioctl data read by marcro CIRC_CNT_TO_END and CIRC_CNT
 
  Signed-off-by: Ching Huang ching 2...@areca.com.tw
  ---
 
 ...
  +   pQbuffer = acb-wqbuffer[acb-wqbuf_putIndex];
  +   cnt2end = ARCMSR_MAX_QBUFFER - acb-wqbuf_putIndex;
  +   if (user_len  cnt2end) {
  +   memcpy(pQbuffer, ptmpuserbuffer, cnt2end);
  +   ptmpuserbuffer += cnt2end;
  +   user_len -= cnt2end;
  +   acb-wqbuf_putIndex = 0;
  +   pQbuffer = acb-wqbuffer;
  }
  +   memcpy(pQbuffer, ptmpuserbuffer, user_len);
  +   acb-wqbuf_putIndex += user_len;
  +   acb-wqbuf_putIndex %= ARCMSR_MAX_QBUFFER;
  +   if (acb-acb_flags  ACB_F_MESSAGE_WQBUFFER_CLEARED) {
 This test^ is most likely useless, it looks like you set the
 ACB_F_MESSAGE_WQBUFFER_CLEARED every time you have added some data to the 
 buffer
 and clear it when the buffer gets empty. I think you could get rid of
 the ACB_F_MESSAGE_WQBUFFER_CLEARED completely. Also the 
 ACB_F_MESSAGE_RQBUFFER_CLEARED doesn't
 seems to be ever evaluated.
 I'm not sure with the ACB_F_MESSAGE_WQBUFFER_READED, but that one probably is 
 also
 a candidate for removal.
You are right. ACB_F_MESSAGE_WQBUFFER_CLEARED, ACB_F_MESSAGE_RQBUFFER_CLEARED, 
ACB_F_MESSAGE_WQBUFFER_READED
are seem useless.
 ...
  @@ -678,15 +679,15 @@ struct AdapterControlBlock
  unsigned intuncache_size;
  uint8_t rqbuffer[ARCMSR_MAX_QBUFFER];
  /* data collection buffer for read from 80331 */
  -   int32_t rqbuf_firstindex;
  +   int32_t rqbuf_getIndex;
 What is the reason for using an exact size int32 (instead of a plain int) 
 here?
There is not special reason have to int32, int is OK.
  /* first of read buffer  */
  -   int32_t rqbuf_lastindex;
  +   int32_t rqbuf_putIndex;
  /* last of read buffer   */
  uint8_t wqbuffer[ARCMSR_MAX_QBUFFER];
  /* data collection buffer for write to 80331  */
  -   int32_t wqbuf_firstindex;
  +   int32_t wqbuf_getIndex;
  /* first of write buffer */
  -   int32_t wqbuf_lastindex;
  +   int32_t wqbuf_putIndex;
  /* last of write buffer  */
  uint8_t 
  devstate[ARCMSR_MAX_TARGETID][ARCMSR_MAX_TARGETLUN];
  /* id0 . id15, lun0...lun7 */
 
 The comments I've added are not directly related to this patch,
 but you may still address them in a new patch
 so -
 Reviewed-by: Tomas Henzl the...@redhat.com
 
 
 


--
To unsubscribe from this list: send the line unsubscribe linux-scsi in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v5 1/2] arcmsr: simplify ioctl data read/write

2014-09-25 Thread Ching Huang
On Thu, 2014-09-25 at 19:01 +0200, Christoph Hellwig wrote:
 Thanks, applied to drivers-for-3.18.
Thanks for all of your review, especially Tomas.

--
To unsubscribe from this list: send the line unsubscribe linux-scsi in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v5 1/2] arcmsr: simplify ioctl data read/write

2014-09-24 Thread Ching Huang
From: Ching Huang ching2...@areca.com.tw

This patch is relative to:
http://git.infradead.org/users/hch/scsi-queue.git/tree/drivers-for-3.18:/drivers/scsi/arcmsr

change in v5:
1. rename firstindex to getIndex, lastindex to putIndex for readability
2. define ARCMSR_API_DATA_BUFLEN as 1032
3. simplify ioctl data read by marcro CIRC_CNT_TO_END and CIRC_CNT

Signed-off-by: Ching Huang ching 2...@areca.com.tw
---

diff -uprN a/drivers/scsi/arcmsr/arcmsr_attr.c 
b/drivers/scsi/arcmsr/arcmsr_attr.c
--- a/drivers/scsi/arcmsr/arcmsr_attr.c 2014-09-17 10:39:01.0 +0800
+++ b/drivers/scsi/arcmsr/arcmsr_attr.c 2014-09-19 11:04:10.109098000 +0800
@@ -50,6 +50,7 @@
 #include linux/errno.h
 #include linux/delay.h
 #include linux/pci.h
+#include linux/circ_buf.h
 
 #include scsi/scsi_cmnd.h
 #include scsi/scsi_device.h
@@ -68,7 +69,7 @@ static ssize_t arcmsr_sysfs_iop_message_
struct device *dev = container_of(kobj,struct device,kobj);
struct Scsi_Host *host = class_to_shost(dev);
struct AdapterControlBlock *acb = (struct AdapterControlBlock *) 
host-hostdata;
-   uint8_t *pQbuffer,*ptmpQbuffer;
+   uint8_t *ptmpQbuffer;
int32_t allxfer_len = 0;
unsigned long flags;
 
@@ -78,57 +79,22 @@ static ssize_t arcmsr_sysfs_iop_message_
/* do message unit read. */
ptmpQbuffer = (uint8_t *)buf;
spin_lock_irqsave(acb-rqbuffer_lock, flags);
-   if (acb-rqbuf_firstindex != acb-rqbuf_lastindex) {
-   pQbuffer = acb-rqbuffer[acb-rqbuf_firstindex];
-   if (acb-rqbuf_firstindex  acb-rqbuf_lastindex) {
-   if ((ARCMSR_MAX_QBUFFER - acb-rqbuf_firstindex) = 
1032) {
-   memcpy(ptmpQbuffer, pQbuffer, 1032);
-   acb-rqbuf_firstindex += 1032;
-   acb-rqbuf_firstindex %= ARCMSR_MAX_QBUFFER;
-   allxfer_len = 1032;
-   } else {
-   if (((ARCMSR_MAX_QBUFFER - 
acb-rqbuf_firstindex)
-   + acb-rqbuf_lastindex)  1032) {
-   memcpy(ptmpQbuffer, pQbuffer,
-   ARCMSR_MAX_QBUFFER
-   - acb-rqbuf_firstindex);
-   ptmpQbuffer += ARCMSR_MAX_QBUFFER
-   - acb-rqbuf_firstindex;
-   memcpy(ptmpQbuffer, acb-rqbuffer, 1032
-   - (ARCMSR_MAX_QBUFFER -
-   acb-rqbuf_firstindex));
-   acb-rqbuf_firstindex = 1032 -
-   (ARCMSR_MAX_QBUFFER -
-   acb-rqbuf_firstindex);
-   allxfer_len = 1032;
-   } else {
-   memcpy(ptmpQbuffer, pQbuffer,
-   ARCMSR_MAX_QBUFFER -
-   acb-rqbuf_firstindex);
-   ptmpQbuffer += ARCMSR_MAX_QBUFFER -
-   acb-rqbuf_firstindex;
-   memcpy(ptmpQbuffer, acb-rqbuffer,
-   acb-rqbuf_lastindex);
-   allxfer_len = ARCMSR_MAX_QBUFFER -
-   acb-rqbuf_firstindex +
-   acb-rqbuf_lastindex;
-   acb-rqbuf_firstindex =
-   acb-rqbuf_lastindex;
-   }
-   }
-   } else {
-   if ((acb-rqbuf_lastindex - acb-rqbuf_firstindex)  
1032) {
-   memcpy(ptmpQbuffer, pQbuffer, 1032);
-   acb-rqbuf_firstindex += 1032;
-   allxfer_len = 1032;
-   } else {
-   memcpy(ptmpQbuffer, pQbuffer, 
acb-rqbuf_lastindex
-   - acb-rqbuf_firstindex);
-   allxfer_len = acb-rqbuf_lastindex -
-   acb-rqbuf_firstindex;
-   acb-rqbuf_firstindex = acb-rqbuf_lastindex;
-   }
+   if (acb-rqbuf_getIndex != acb-rqbuf_putIndex) {
+   unsigned int tail = acb-rqbuf_getIndex;
+   unsigned int head = acb-rqbuf_putIndex;
+   unsigned int cnt_to_end = CIRC_CNT_TO_END(head, tail, 
ARCMSR_MAX_QBUFFER);
+
+   allxfer_len = CIRC_CNT(head, tail, ARCMSR_MAX_QBUFFER);
+   if (allxfer_len

Re: [PATCH v4 1/2] arcmsr: simplify ioctl data read/write

2014-09-15 Thread Ching Huang
On Mon, 2014-09-15 at 12:25 +0200, Tomas Henzl wrote:
 On 09/15/2014 04:56 AM, Ching Huang wrote:
  On Fri, 2014-09-12 at 15:34 +0200, Tomas Henzl wrote:
  On 09/12/2014 09:29 AM, Ching Huang wrote:
  From: Ching Huang ching2...@areca.com.tw
 
  This patch is to modify previous patch 13/17 and it is relative to
  http://git.infradead.org/users/hch/scsi-queue.git/tree/arcmsr-for-3.18:/drivers/scsi/arcmsr
 
  change in v4:
  1. for readability, rename firstindex to getIndex, rename lastindex to 
  putIndex
  For some reason, the names head+tail areusual for a circular buffer.
  But let us ignore the names, I don't care.
  2. define ARCMSR_API_DATA_BUFLEN as 1032
  3. simplify ioctl data read by macro CIRC_CNT_TO_END and CIRC_CNT
  It's definitely better when you post renames and other non-functional 
  changes in separate
  patches, it's easier for the reviewer. 
  Signed-off-by: Ching Huang ching2...@areca.com.tw
  ---
 
  diff -uprN a/drivers/scsi/arcmsr/arcmsr_attr.c 
  b/drivers/scsi/arcmsr/arcmsr_attr.c
  --- a/drivers/scsi/arcmsr/arcmsr_attr.c   2014-08-21 12:14:27.0 
  +0800
  +++ b/drivers/scsi/arcmsr/arcmsr_attr.c   2014-09-12 15:18:46.659125000 
  +0800
  @@ -50,6 +50,7 @@
   #include linux/errno.h
   #include linux/delay.h
   #include linux/pci.h
  +#include linux/circ_buf.h
   
   #include scsi/scsi_cmnd.h
   #include scsi/scsi_device.h
  @@ -68,7 +69,7 @@ static ssize_t arcmsr_sysfs_iop_message_
struct device *dev = container_of(kobj,struct device,kobj);
struct Scsi_Host *host = class_to_shost(dev);
struct AdapterControlBlock *acb = (struct AdapterControlBlock *) 
  host-hostdata;
  - uint8_t *pQbuffer,*ptmpQbuffer;
  + uint8_t *ptmpQbuffer;
int32_t allxfer_len = 0;
unsigned long flags;
   
  @@ -78,57 +79,22 @@ static ssize_t arcmsr_sysfs_iop_message_
/* do message unit read. */
ptmpQbuffer = (uint8_t *)buf;
spin_lock_irqsave(acb-rqbuffer_lock, flags);
  - if (acb-rqbuf_firstindex != acb-rqbuf_lastindex) {
  - pQbuffer = acb-rqbuffer[acb-rqbuf_firstindex];
  - if (acb-rqbuf_firstindex  acb-rqbuf_lastindex) {
  - if ((ARCMSR_MAX_QBUFFER - acb-rqbuf_firstindex) = 
  1032) {
  - memcpy(ptmpQbuffer, pQbuffer, 1032);
  - acb-rqbuf_firstindex += 1032;
  - acb-rqbuf_firstindex %= ARCMSR_MAX_QBUFFER;
  - allxfer_len = 1032;
  - } else {
  - if (((ARCMSR_MAX_QBUFFER - 
  acb-rqbuf_firstindex)
  - + acb-rqbuf_lastindex)  1032) {
  - memcpy(ptmpQbuffer, pQbuffer,
  - ARCMSR_MAX_QBUFFER
  - - acb-rqbuf_firstindex);
  - ptmpQbuffer += ARCMSR_MAX_QBUFFER
  - - acb-rqbuf_firstindex;
  - memcpy(ptmpQbuffer, acb-rqbuffer, 1032
  - - (ARCMSR_MAX_QBUFFER -
  - acb-rqbuf_firstindex));
  - acb-rqbuf_firstindex = 1032 -
  - (ARCMSR_MAX_QBUFFER -
  - acb-rqbuf_firstindex);
  - allxfer_len = 1032;
  - } else {
  - memcpy(ptmpQbuffer, pQbuffer,
  - ARCMSR_MAX_QBUFFER -
  - acb-rqbuf_firstindex);
  - ptmpQbuffer += ARCMSR_MAX_QBUFFER -
  - acb-rqbuf_firstindex;
  - memcpy(ptmpQbuffer, acb-rqbuffer,
  - acb-rqbuf_lastindex);
  - allxfer_len = ARCMSR_MAX_QBUFFER -
  - acb-rqbuf_firstindex +
  - acb-rqbuf_lastindex;
  - acb-rqbuf_firstindex =
  - acb-rqbuf_lastindex;
  - }
  - }
  - } else {
  - if ((acb-rqbuf_lastindex - acb-rqbuf_firstindex)  
  1032) {
  - memcpy(ptmpQbuffer, pQbuffer, 1032);
  - acb-rqbuf_firstindex += 1032;
  - allxfer_len = 1032;
  - } else {
  - memcpy(ptmpQbuffer, pQbuffer, 
  acb-rqbuf_lastindex
  - - acb-rqbuf_firstindex);
  - allxfer_len = acb-rqbuf_lastindex -
  - acb-rqbuf_firstindex;
  - acb-rqbuf_firstindex = acb-rqbuf_lastindex;
  - }
  + if (acb-rqbuf_getIndex != acb

  1   2   >