Re: [PATCH 0/3] scsi: arcmsr: Add driver parameter cmd_timeout for scsi command timeout setting
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
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
>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
>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
>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
>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
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
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.
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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.
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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.
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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