Author: delphij
Date: Tue Dec 18 20:47:23 2012
New Revision: 244406
URL: http://svnweb.freebsd.org/changeset/base/244406

Log:
  Update arcmsr(4) to vendor version 1.20.00.26, this adds
  support for their new RAID adapter ARC-1214.
  
  Many thanks to Areca for continuing to support FreeBSD.
  
  Submitted by: 黃清隆 Ching-Lung Huang <ching2048 areca com tw>
  MFC after:    2 weeks

Modified:
  head/share/man/man4/arcmsr.4
  head/sys/dev/arcmsr/arcmsr.c
  head/sys/dev/arcmsr/arcmsr.h

Modified: head/share/man/man4/arcmsr.4
==============================================================================
--- head/share/man/man4/arcmsr.4        Tue Dec 18 20:02:53 2012        
(r244405)
+++ head/share/man/man4/arcmsr.4        Tue Dec 18 20:47:23 2012        
(r244406)
@@ -24,7 +24,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd September 3, 2012
+.Dd December 18, 2012
 .Dt ARCMSR 4
 .Os
 .Sh NAME
@@ -100,6 +100,8 @@ ARC-1212
 .It
 ARC-1213
 .It
+ARC-1214
+.It
 ARC-1220
 .It
 ARC-1222

Modified: head/sys/dev/arcmsr/arcmsr.c
==============================================================================
--- head/sys/dev/arcmsr/arcmsr.c        Tue Dec 18 20:02:53 2012        
(r244405)
+++ head/sys/dev/arcmsr/arcmsr.c        Tue Dec 18 20:47:23 2012        
(r244406)
@@ -10,8 +10,7 @@
 
******************************************************************************************
 ************************************************************************
 **
-** Copyright (c) 2004-2010 ARECA Co. Ltd.
-**        Erich Chen, Taipei Taiwan All rights reserved.
+** Copyright (C) 2002 - 2010, Areca Technology Corporation All rights reserved.
 **
 ** Redistribution and use in source and binary forms, with or without
 ** modification, are permitted provided that the following conditions
@@ -74,6 +73,7 @@
 **     1.20.00.23   01/30/2012      Ching Huang          Fixed Request 
requeued and Retrying command
 **     1.20.00.24   06/11/2012      Ching Huang          Fixed return sense 
data condition
 **     1.20.00.25   08/17/2012      Ching Huang          Fixed hotplug device 
no function on type A adapter
+**     1.20.00.26   12/14/2012      Ching Huang          Added support ARC1214
 
******************************************************************************************
 */
 
@@ -129,24 +129,10 @@ __FBSDID("$FreeBSD$");
     #include <sys/endian.h>
     #include <dev/pci/pcivar.h>
     #include <dev/pci/pcireg.h>
-    #define ARCMSR_LOCK_INIT(l, s)     mtx_init(l, s, NULL, MTX_DEF)
-    #define ARCMSR_LOCK_DESTROY(l)     mtx_destroy(l)
-    #define ARCMSR_LOCK_ACQUIRE(l)     mtx_lock(l)
-    #define ARCMSR_LOCK_RELEASE(l)     mtx_unlock(l)
-    #define ARCMSR_LOCK_TRY(l)         mtx_trylock(l)
-    #define arcmsr_htole32(x)          htole32(x)
-    typedef struct mtx                         arcmsr_lock_t;
 #else
     #include <sys/select.h>
     #include <pci/pcivar.h>
     #include <pci/pcireg.h>
-    #define ARCMSR_LOCK_INIT(l, s)     simple_lock_init(l)
-    #define ARCMSR_LOCK_DESTROY(l)
-    #define ARCMSR_LOCK_ACQUIRE(l)     simple_lock(l)
-    #define ARCMSR_LOCK_RELEASE(l)     simple_unlock(l)
-    #define ARCMSR_LOCK_TRY(l)         simple_lock_try(l)
-    #define arcmsr_htole32(x)          (x)
-    typedef struct simplelock          arcmsr_lock_t;
 #endif
 
 #if !defined(CAM_NEW_TRAN_CODE) && __FreeBSD_version >= 700025
@@ -159,23 +145,15 @@ __FBSDID("$FreeBSD$");
 #define arcmsr_callout_init(a) callout_init(a);
 #endif
 
-#define ARCMSR_DRIVER_VERSION                  "Driver Version 1.20.00.25 
2012-08-17"
+#define ARCMSR_DRIVER_VERSION  "Driver Version 1.20.00.26 2012-12-14"
 #include <dev/arcmsr/arcmsr.h>
-#define        SRB_SIZE                                                
((sizeof(struct CommandControlBlock)+0x1f) & 0xffe0)
-#define ARCMSR_SRBS_POOL_SIZE           (SRB_SIZE * ARCMSR_MAX_FREESRB_NUM)
-/*
-**************************************************************************
-**************************************************************************
-*/
-#define CHIP_REG_READ32(s, b, r)               bus_space_read_4(acb->btag[b], 
acb->bhandle[b], offsetof(struct s, r))
-#define CHIP_REG_WRITE32(s, b, r, d)   bus_space_write_4(acb->btag[b], 
acb->bhandle[b], offsetof(struct s, r), d)
 /*
 **************************************************************************
 **************************************************************************
 */
 static void arcmsr_free_srb(struct CommandControlBlock *srb);
-static struct CommandControlBlock * arcmsr_get_freesrb(struct 
AdapterControlBlock *acb);
-static u_int8_t arcmsr_seek_cmd2abort(union ccb * abortccb);
+static struct CommandControlBlock *arcmsr_get_freesrb(struct 
AdapterControlBlock *acb);
+static u_int8_t arcmsr_seek_cmd2abort(union ccb *abortccb);
 static int arcmsr_probe(device_t dev);
 static int arcmsr_attach(device_t dev);
 static int arcmsr_detach(device_t dev);
@@ -190,18 +168,20 @@ static void arcmsr_stop_adapter_bgrb(str
 static void arcmsr_start_adapter_bgrb(struct AdapterControlBlock *acb);
 static void arcmsr_iop_init(struct AdapterControlBlock *acb);
 static void arcmsr_flush_adapter_cache(struct AdapterControlBlock *acb);
-static void arcmsr_post_ioctldata2iop(struct AdapterControlBlock *acb);
+static void    arcmsr_Read_iop_rqbuffer_data(struct AdapterControlBlock *acb, 
struct QBUFFER *prbuffer);
+static void arcmsr_Write_data_2iop_wqbuffer(struct AdapterControlBlock *acb);
 static void arcmsr_abort_allcmd(struct AdapterControlBlock *acb);
 static void arcmsr_srb_complete(struct CommandControlBlock *srb, int 
stand_flag);
 static void arcmsr_iop_reset(struct AdapterControlBlock *acb);
 static void arcmsr_report_sense_info(struct CommandControlBlock *srb);
-static void arcmsr_build_srb(struct CommandControlBlock *srb, 
bus_dma_segment_t * dm_segs, u_int32_t nseg);
-static int arcmsr_iop_message_xfer(struct AdapterControlBlock *acb, union ccb 
* pccb);
+static void arcmsr_build_srb(struct CommandControlBlock *srb, 
bus_dma_segment_t *dm_segs, u_int32_t nseg);
+static int arcmsr_iop_message_xfer(struct AdapterControlBlock *acb, union ccb 
*pccb);
 static int arcmsr_resume(device_t dev);
 static int arcmsr_suspend(device_t dev);
 static void arcmsr_rescanLun_cb(struct cam_periph *periph, union ccb *ccb);
-static void    arcmsr_polling_devmap(void* arg);
-static void    arcmsr_srb_timeout(void* arg);
+static void    arcmsr_polling_devmap(void *arg);
+static void    arcmsr_srb_timeout(void *arg);
+static void arcmsr_hbd_postqueue_isr(struct AdapterControlBlock *acb);
 #ifdef ARCMSR_DEBUG1
 static void arcmsr_dump_data(struct AdapterControlBlock *acb);
 #endif
@@ -293,12 +273,12 @@ static struct cdevsw arcmsr_cdevsw = {
 #endif
 {
        #if __FreeBSD_version < 503000
-               struct AdapterControlBlock *acb=dev->si_drv1;
+               struct AdapterControlBlock *acb = dev->si_drv1;
        #else
                int     unit = dev2unit(dev);
                struct AdapterControlBlock *acb = 
devclass_get_softc(arcmsr_devclass, unit);
        #endif
-       if(acb==NULL) {
+       if(acb == NULL) {
                return ENXIO;
        }
        return (0);
@@ -318,12 +298,12 @@ static struct cdevsw arcmsr_cdevsw = {
 #endif
 {
        #if __FreeBSD_version < 503000
-               struct AdapterControlBlock *acb=dev->si_drv1;
+               struct AdapterControlBlock *acb = dev->si_drv1;
        #else
                int     unit = dev2unit(dev);
                struct AdapterControlBlock *acb = 
devclass_get_softc(arcmsr_devclass, unit);
        #endif
-       if(acb==NULL) {
+       if(acb == NULL) {
                return ENXIO;
        }
        return 0;
@@ -343,13 +323,13 @@ static struct cdevsw arcmsr_cdevsw = {
 #endif
 {
        #if __FreeBSD_version < 503000
-               struct AdapterControlBlock *acb=dev->si_drv1;
+               struct AdapterControlBlock *acb = dev->si_drv1;
        #else
                int     unit = dev2unit(dev);
                struct AdapterControlBlock *acb = 
devclass_get_softc(arcmsr_devclass, unit);
        #endif
        
-       if(acb==NULL) {
+       if(acb == NULL) {
                return ENXIO;
        }
        return (arcmsr_iop_ioctlcmd(acb, ioctl_cmd, arg));
@@ -360,28 +340,34 @@ static struct cdevsw arcmsr_cdevsw = {
 */
 static u_int32_t arcmsr_disable_allintr( struct AdapterControlBlock *acb)
 {
-       u_int32_t intmask_org=0;
+       u_int32_t intmask_org = 0;
        
        switch (acb->adapter_type) {
        case ACB_ADAPTER_TYPE_A: {
                        /* disable all outbound interrupt */
-                       intmask_org=CHIP_REG_READ32(HBA_MessageUnit, 0, 
outbound_intmask); /* disable outbound message0 int */
+                       intmask_org = CHIP_REG_READ32(HBA_MessageUnit, 0, 
outbound_intmask); /* disable outbound message0 int */
                        CHIP_REG_WRITE32(HBA_MessageUnit, 0, outbound_intmask, 
intmask_org|ARCMSR_MU_OUTBOUND_ALL_INTMASKENABLE);
                }
                break;
        case ACB_ADAPTER_TYPE_B: {
                        /* disable all outbound interrupt */
-                       intmask_org=CHIP_REG_READ32(HBB_DOORBELL, 
+                       intmask_org = CHIP_REG_READ32(HBB_DOORBELL, 
                                                0, iop2drv_doorbell_mask) & 
(~ARCMSR_IOP2DRV_MESSAGE_CMD_DONE); /* disable outbound message0 int */
                        CHIP_REG_WRITE32(HBB_DOORBELL, 0, 
iop2drv_doorbell_mask, 0); /* disable all interrupt */
                }
                break;
        case ACB_ADAPTER_TYPE_C: {
                        /* disable all outbound interrupt */
-                       intmask_org=CHIP_REG_READ32(HBC_MessageUnit, 0, 
host_int_mask)  ; /* disable outbound message0 int */
+                       intmask_org = CHIP_REG_READ32(HBC_MessageUnit, 0, 
host_int_mask)        ; /* disable outbound message0 int */
                        CHIP_REG_WRITE32(HBC_MessageUnit, 0, host_int_mask, 
intmask_org|ARCMSR_HBCMU_ALL_INTMASKENABLE);
                }
                break;
+       case ACB_ADAPTER_TYPE_D: {
+                       /* disable all outbound interrupt */
+                       intmask_org = CHIP_REG_READ32(HBD_MessageUnit, 0, 
pcief0_int_enable)    ; /* disable outbound message0 int */
+                       CHIP_REG_WRITE32(HBD_MessageUnit, 0, pcief0_int_enable, 
ARCMSR_HBDMU_ALL_INT_DISABLE);
+               }
+               break;
        }
        return (intmask_org);
 }
@@ -396,23 +382,31 @@ static void arcmsr_enable_allintr( struc
        switch (acb->adapter_type) {
        case ACB_ADAPTER_TYPE_A: {
                        /* enable outbound Post Queue, outbound doorbell 
Interrupt */
-                       
mask=~(ARCMSR_MU_OUTBOUND_POSTQUEUE_INTMASKENABLE|ARCMSR_MU_OUTBOUND_DOORBELL_INTMASKENABLE|ARCMSR_MU_OUTBOUND_MESSAGE0_INTMASKENABLE);
+                       mask = 
~(ARCMSR_MU_OUTBOUND_POSTQUEUE_INTMASKENABLE|ARCMSR_MU_OUTBOUND_DOORBELL_INTMASKENABLE|ARCMSR_MU_OUTBOUND_MESSAGE0_INTMASKENABLE);
                        CHIP_REG_WRITE32(HBA_MessageUnit, 0, outbound_intmask, 
intmask_org & mask);
                        acb->outbound_int_enable = ~(intmask_org & mask) & 
0x000000ff;
                }
                break;
        case ACB_ADAPTER_TYPE_B: {
                        /* enable ARCMSR_IOP2DRV_MESSAGE_CMD_DONE */
-                       
mask=(ARCMSR_IOP2DRV_DATA_WRITE_OK|ARCMSR_IOP2DRV_DATA_READ_OK|ARCMSR_IOP2DRV_CDB_DONE|ARCMSR_IOP2DRV_MESSAGE_CMD_DONE);
+                       mask = 
(ARCMSR_IOP2DRV_DATA_WRITE_OK|ARCMSR_IOP2DRV_DATA_READ_OK|ARCMSR_IOP2DRV_CDB_DONE|ARCMSR_IOP2DRV_MESSAGE_CMD_DONE);
                        CHIP_REG_WRITE32(HBB_DOORBELL, 0, 
iop2drv_doorbell_mask, intmask_org | mask); /*1=interrupt enable, 0=interrupt 
disable*/
                        acb->outbound_int_enable = (intmask_org | mask) & 
0x0000000f;
                }
                break;
        case ACB_ADAPTER_TYPE_C: {
                        /* enable outbound Post Queue, outbound doorbell 
Interrupt */
-                       mask=~(ARCMSR_HBCMU_UTILITY_A_ISR_MASK | 
ARCMSR_HBCMU_OUTBOUND_DOORBELL_ISR_MASK | 
ARCMSR_HBCMU_OUTBOUND_POSTQUEUE_ISR_MASK);
+                       mask = ~(ARCMSR_HBCMU_UTILITY_A_ISR_MASK | 
ARCMSR_HBCMU_OUTBOUND_DOORBELL_ISR_MASK | 
ARCMSR_HBCMU_OUTBOUND_POSTQUEUE_ISR_MASK);
                        CHIP_REG_WRITE32(HBC_MessageUnit, 0, host_int_mask, 
intmask_org & mask);
-                       acb->outbound_int_enable= ~(intmask_org & mask) & 
0x0000000f;
+                       acb->outbound_int_enable = ~(intmask_org & mask) & 
0x0000000f;
+               }
+               break;
+       case ACB_ADAPTER_TYPE_D: {
+                       /* enable outbound Post Queue, outbound doorbell 
Interrupt */
+                       mask = ARCMSR_HBDMU_ALL_INT_ENABLE;
+                       CHIP_REG_WRITE32(HBD_MessageUnit, 0, pcief0_int_enable, 
intmask_org | mask);
+                       CHIP_REG_READ32(HBD_MessageUnit, 0, pcief0_int_enable);
+                       acb->outbound_int_enable = mask;
                }
                break;
        }
@@ -424,7 +418,7 @@ static void arcmsr_enable_allintr( struc
 static u_int8_t arcmsr_hba_wait_msgint_ready(struct AdapterControlBlock *acb)
 {
        u_int32_t Index;
-       u_int8_t Retries=0x00;
+       u_int8_t Retries = 0x00;
        
        do {
                for(Index=0; Index < 100; Index++) {
@@ -444,7 +438,7 @@ static u_int8_t arcmsr_hba_wait_msgint_r
 static u_int8_t arcmsr_hbb_wait_msgint_ready(struct AdapterControlBlock *acb)
 {
        u_int32_t Index;
-       u_int8_t Retries=0x00;
+       u_int8_t Retries = 0x00;
        
        do {
                for(Index=0; Index < 100; Index++) {
@@ -465,7 +459,7 @@ static u_int8_t arcmsr_hbb_wait_msgint_r
 static u_int8_t arcmsr_hbc_wait_msgint_ready(struct AdapterControlBlock *acb)
 {
        u_int32_t Index;
-       u_int8_t Retries=0x00;
+       u_int8_t Retries = 0x00;
        
        do {
                for(Index=0; Index < 100; Index++) {
@@ -479,12 +473,32 @@ static u_int8_t arcmsr_hbc_wait_msgint_r
        return (FALSE);
 }
 /*
+**********************************************************************
+**********************************************************************
+*/
+static u_int8_t arcmsr_hbd_wait_msgint_ready(struct AdapterControlBlock *acb)
+{
+       u_int32_t Index;
+       u_int8_t Retries = 0x00;
+       
+       do {
+               for(Index=0; Index < 100; Index++) {
+                       if(CHIP_REG_READ32(HBD_MessageUnit, 0, 
outbound_doorbell) & ARCMSR_HBDMU_IOP2DRV_MESSAGE_CMD_DONE) {
+                               CHIP_REG_WRITE32(HBD_MessageUnit, 0, 
outbound_doorbell, ARCMSR_HBDMU_IOP2DRV_MESSAGE_CMD_DONE_CLEAR);/*clear 
interrupt*/
+                               return TRUE;
+                       }
+                       UDELAY(10000);
+               }/*max 1 seconds*/
+       }while(Retries++ < 20);/*max 20 sec*/
+       return (FALSE);
+}
+/*
 ************************************************************************
 ************************************************************************
 */
 static void arcmsr_flush_hba_cache(struct AdapterControlBlock *acb)
 {
-       int retry_count=30;/* enlarge wait flush adapter cache time: 10 minute 
*/
+       int retry_count = 30;/* enlarge wait flush adapter cache time: 10 
minute */
        
        CHIP_REG_WRITE32(HBA_MessageUnit, 0, inbound_msgaddr0, 
ARCMSR_INBOUND_MESG0_FLUSH_CACHE);
        do {
@@ -493,7 +507,7 @@ static void arcmsr_flush_hba_cache(struc
                } else {
                        retry_count--;
                }
-       }while(retry_count!=0);
+       }while(retry_count != 0);
 }
 /*
 ************************************************************************
@@ -501,7 +515,7 @@ static void arcmsr_flush_hba_cache(struc
 */
 static void arcmsr_flush_hbb_cache(struct AdapterControlBlock *acb)
 {
-       int retry_count=30;/* enlarge wait flush adapter cache time: 10 minute 
*/
+       int retry_count = 30;/* enlarge wait flush adapter cache time: 10 
minute */
        
        CHIP_REG_WRITE32(HBB_DOORBELL, 
        0, drv2iop_doorbell, ARCMSR_MESSAGE_FLUSH_CACHE);
@@ -511,7 +525,7 @@ static void arcmsr_flush_hbb_cache(struc
                } else {
                        retry_count--;
                }
-       }while(retry_count!=0);
+       }while(retry_count != 0);
 }
 /*
 ************************************************************************
@@ -519,7 +533,7 @@ static void arcmsr_flush_hbb_cache(struc
 */
 static void arcmsr_flush_hbc_cache(struct AdapterControlBlock *acb)
 {
-       int retry_count=30;/* enlarge wait flush adapter cache time: 10 minute 
*/
+       int retry_count = 30;/* enlarge wait flush adapter cache time: 10 
minute */
        
        CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_msgaddr0, 
ARCMSR_INBOUND_MESG0_FLUSH_CACHE);
        CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_doorbell, 
ARCMSR_HBCMU_DRV2IOP_MESSAGE_CMD_DONE);
@@ -529,7 +543,24 @@ static void arcmsr_flush_hbc_cache(struc
                } else {
                        retry_count--;
                }
-       }while(retry_count!=0);
+       }while(retry_count != 0);
+}
+/*
+************************************************************************
+************************************************************************
+*/
+static void arcmsr_flush_hbd_cache(struct AdapterControlBlock *acb)
+{
+       int retry_count = 30; /* enlarge wait flush adapter cache time: 10 
minute */
+       
+       CHIP_REG_WRITE32(HBD_MessageUnit, 0, inbound_msgaddr0, 
ARCMSR_INBOUND_MESG0_FLUSH_CACHE);
+       do {
+               if(arcmsr_hbd_wait_msgint_ready(acb)) {
+                       break;
+               } else {
+                       retry_count--;
+               }
+       }while(retry_count != 0);
 }
 /*
 ************************************************************************
@@ -550,6 +581,10 @@ static void arcmsr_flush_adapter_cache(s
                        arcmsr_flush_hbc_cache(acb);
                }
                break;
+       case ACB_ADAPTER_TYPE_D: {
+                       arcmsr_flush_hbd_cache(acb);
+               }
+               break;
        }
 }
 /*
@@ -585,14 +620,14 @@ static void arcmsr_async(void *cb_arg, u
 {
        struct AdapterControlBlock *acb;
        u_int8_t target_id, target_lun;
-       struct cam_sim * sim;
+       struct cam_sim *sim;
        
-       sim=(struct cam_sim *) cb_arg;
+       sim = (struct cam_sim *) cb_arg;
        acb =(struct AdapterControlBlock *) cam_sim_softc(sim);
        switch (code) {
        case AC_LOST_DEVICE:
-               target_id=xpt_path_target_id(path);
-               target_lun=xpt_path_lun_id(path);
+               target_id = xpt_path_target_id(path);
+               target_lun = xpt_path_lun_id(path);
                if((target_id > ARCMSR_MAX_TARGETID) || (target_lun > 
ARCMSR_MAX_TARGETLUN)) {
                        break;
                }
@@ -608,7 +643,7 @@ static void arcmsr_async(void *cb_arg, u
 */
 static void arcmsr_report_sense_info(struct CommandControlBlock *srb)
 {
-       union ccb * pccb=srb->pccb;
+       union ccb *pccb = srb->pccb;
        
        pccb->ccb_h.status |= CAM_SCSI_STATUS_ERROR;
        pccb->csio.scsi_status = SCSI_STATUS_CHECK_COND;
@@ -658,6 +693,17 @@ static void arcmsr_abort_hbc_allcmd(stru
 *********************************************************************
 *********************************************************************
 */
+static void arcmsr_abort_hbd_allcmd(struct AdapterControlBlock *acb)
+{
+       CHIP_REG_WRITE32(HBD_MessageUnit, 0, inbound_msgaddr0, 
ARCMSR_INBOUND_MESG0_ABORT_CMD);
+       if(!arcmsr_hbd_wait_msgint_ready(acb)) {
+               printf("arcmsr%d: wait 'abort all outstanding command' timeout 
\n", acb->pci_unit);
+       }
+}
+/*
+*********************************************************************
+*********************************************************************
+*/
 static void arcmsr_abort_allcmd(struct AdapterControlBlock *acb)
 {
        switch (acb->adapter_type) {
@@ -673,6 +719,10 @@ static void arcmsr_abort_allcmd(struct A
                        arcmsr_abort_hbc_allcmd(acb);
                }
                break;
+       case ACB_ADAPTER_TYPE_D: {
+                       arcmsr_abort_hbd_allcmd(acb);
+               }
+               break;
        }
 }
 /*
@@ -681,8 +731,8 @@ static void arcmsr_abort_allcmd(struct A
 */
 static void arcmsr_srb_complete(struct CommandControlBlock *srb, int 
stand_flag)
 {
-       struct AdapterControlBlock *acb=srb->acb;
-       union ccb * pccb=srb->pccb;
+       struct AdapterControlBlock *acb = srb->acb;
+       union ccb *pccb = srb->pccb;
        
        if(srb->srb_flags & SRB_FLAG_TIMER_START)
                callout_stop(&srb->ccb_callout);
@@ -697,19 +747,17 @@ static void arcmsr_srb_complete(struct C
                bus_dmamap_sync(acb->dm_segs_dmat, srb->dm_segs_dmamap, op);
                bus_dmamap_unload(acb->dm_segs_dmat, srb->dm_segs_dmamap);
        }
-       if(stand_flag==1) {
+       if(stand_flag == 1) {
                atomic_subtract_int(&acb->srboutstandingcount, 1);
                if((acb->acb_flags & ACB_F_CAM_DEV_QFRZN) && (
-               acb->srboutstandingcount < ARCMSR_RELEASE_SIMQ_LEVEL)) {
+               acb->srboutstandingcount < (acb->firm_numbers_queue -10))) {
                        acb->acb_flags &= ~ACB_F_CAM_DEV_QFRZN;
                        pccb->ccb_h.status |= CAM_RELEASE_SIMQ;
                }
        }
        if(srb->srb_state != ARCMSR_SRB_TIMEOUT)
                arcmsr_free_srb(srb);
-#ifdef ARCMSR_DEBUG1
        acb->pktReturnCount++;
-#endif
        xpt_done(pccb);
 }
 /*
@@ -720,34 +768,34 @@ static void arcmsr_report_srb_state(stru
 {
        int target, lun;
        
-       target=srb->pccb->ccb_h.target_id;
-       lun=srb->pccb->ccb_h.target_lun;
+       target = srb->pccb->ccb_h.target_id;
+       lun = srb->pccb->ccb_h.target_lun;
        if(error == FALSE) {
-               if(acb->devstate[target][lun]==ARECA_RAID_GONE) {
-                       acb->devstate[target][lun]=ARECA_RAID_GOOD;
+               if(acb->devstate[target][lun] == ARECA_RAID_GONE) {
+                       acb->devstate[target][lun] = ARECA_RAID_GOOD;
                }
                srb->pccb->ccb_h.status |= CAM_REQ_CMP;
                arcmsr_srb_complete(srb, 1);
        } else {
                switch(srb->arcmsr_cdb.DeviceStatus) {
                case ARCMSR_DEV_SELECT_TIMEOUT: {
-                               if(acb->devstate[target][lun]==ARECA_RAID_GOOD) 
{
+                               if(acb->devstate[target][lun] == 
ARECA_RAID_GOOD) {
                                        printf( "arcmsr%d: Target=%x, Lun=%x, 
selection timeout, raid volume was lost\n", acb->pci_unit, target, lun);
                                }
-                               acb->devstate[target][lun]=ARECA_RAID_GONE;
+                               acb->devstate[target][lun] = ARECA_RAID_GONE;
                                srb->pccb->ccb_h.status |= CAM_DEV_NOT_THERE;
                                arcmsr_srb_complete(srb, 1);
                        }
                        break;
                case ARCMSR_DEV_ABORTED:
                case ARCMSR_DEV_INIT_FAIL: {
-                               acb->devstate[target][lun]=ARECA_RAID_GONE;
+                               acb->devstate[target][lun] = ARECA_RAID_GONE;
                                srb->pccb->ccb_h.status |= CAM_DEV_NOT_THERE;
                                arcmsr_srb_complete(srb, 1);
                        }
                        break;
                case SCSISTAT_CHECK_CONDITION: {
-                               acb->devstate[target][lun]=ARECA_RAID_GOOD;
+                               acb->devstate[target][lun] = ARECA_RAID_GOOD;
                                arcmsr_report_sense_info(srb);
                                arcmsr_srb_complete(srb, 1);
                        }
@@ -755,7 +803,7 @@ static void arcmsr_report_srb_state(stru
                default:
                        printf("arcmsr%d: scsi id=%d lun=%d isr got command 
error done,but got unknown DeviceStatus=0x%x \n"
                                        , acb->pci_unit, target, lun 
,srb->arcmsr_cdb.DeviceStatus);
-                       acb->devstate[target][lun]=ARECA_RAID_GONE;
+                       acb->devstate[target][lun] = ARECA_RAID_GONE;
                        srb->pccb->ccb_h.status |= CAM_UNCOR_PARITY;
                        /*unknown error or crc error just for retry*/
                        arcmsr_srb_complete(srb, 1);
@@ -774,7 +822,8 @@ static void arcmsr_drain_donequeue(struc
        /* check if command done with no error*/
        switch (acb->adapter_type) {
        case ACB_ADAPTER_TYPE_C:
-               srb = (struct CommandControlBlock 
*)(acb->vir2phy_offset+(flag_srb & 0xFFFFFFE0));/*frame must be 32 bytes 
aligned*/
+       case ACB_ADAPTER_TYPE_D:
+               srb = (struct CommandControlBlock 
*)(acb->vir2phy_offset+(flag_srb & 0xFFFFFFE0)); /*frame must be 32 bytes 
aligned*/
                break;
        case ACB_ADAPTER_TYPE_A:
        case ACB_ADAPTER_TYPE_B:
@@ -782,7 +831,7 @@ static void arcmsr_drain_donequeue(struc
                srb = (struct CommandControlBlock 
*)(acb->vir2phy_offset+(flag_srb << 5));/*frame must be 32 bytes aligned*/
                break;
        }
-       if((srb->acb!=acb) || (srb->srb_state!=ARCMSR_SRB_START)) {
+       if((srb->acb != acb) || (srb->srb_state != ARCMSR_SRB_START)) {
                if(srb->srb_state == ARCMSR_SRB_TIMEOUT) {
                        arcmsr_free_srb(srb);
                        printf("arcmsr%d: srb='%p' return srb has been 
timeouted\n", acb->pci_unit, srb);
@@ -799,17 +848,17 @@ static void arcmsr_drain_donequeue(struc
 **************************************************************************
 **************************************************************************
 */
-static void    arcmsr_srb_timeout(void* arg)
+static void    arcmsr_srb_timeout(void *arg)
 {
        struct CommandControlBlock *srb = (struct CommandControlBlock *)arg;
        struct AdapterControlBlock *acb;
        int target, lun;
        u_int8_t cmd;
        
-       target=srb->pccb->ccb_h.target_id;
-       lun=srb->pccb->ccb_h.target_lun;
+       target = srb->pccb->ccb_h.target_id;
+       lun = srb->pccb->ccb_h.target_lun;
        acb = srb->acb;
-       ARCMSR_LOCK_ACQUIRE(&acb->qbuffer_lock);
+       ARCMSR_LOCK_ACQUIRE(&acb->isr_lock);
        if(srb->srb_state == ARCMSR_SRB_START)
        {
                cmd = srb->pccb->csio.cdb_io.cdb_bytes[0];
@@ -819,7 +868,7 @@ static void arcmsr_srb_timeout(void* arg
                printf("arcmsr%d: scsi id %d lun %d cmd=0x%x srb='%p' ccb 
command time out!\n",
                                 acb->pci_unit, target, lun, cmd, srb);
        }
-       ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock);
+       ARCMSR_LOCK_RELEASE(&acb->isr_lock);
 #ifdef ARCMSR_DEBUG1
        arcmsr_dump_data(acb);
 #endif
@@ -840,10 +889,10 @@ static void arcmsr_done4abort_postqueue(
                        u_int32_t outbound_intstatus;
        
                        /*clear and abort all outbound posted Q*/
-                       outbound_intstatus=CHIP_REG_READ32(HBA_MessageUnit, 0, 
outbound_intstatus) & acb->outbound_int_enable;
+                       outbound_intstatus = CHIP_REG_READ32(HBA_MessageUnit, 
0, outbound_intstatus) & acb->outbound_int_enable;
                        CHIP_REG_WRITE32(HBA_MessageUnit, 0, 
outbound_intstatus, outbound_intstatus);/*clear interrupt*/
                        while(((flag_srb=CHIP_REG_READ32(HBA_MessageUnit, 0, 
outbound_queueport)) != 0xFFFFFFFF) && (i++ < ARCMSR_MAX_OUTSTANDING_CMD)) {
-                error=(flag_srb & ARCMSR_SRBREPLY_FLAG_ERROR_MODE0)?TRUE:FALSE;
+                error = (flag_srb & 
ARCMSR_SRBREPLY_FLAG_ERROR_MODE0)?TRUE:FALSE;
                                arcmsr_drain_donequeue(acb, flag_srb, error);
                        }
                }
@@ -854,26 +903,30 @@ static void arcmsr_done4abort_postqueue(
                        /*clear all outbound posted Q*/
                        CHIP_REG_WRITE32(HBB_DOORBELL, 0, iop2drv_doorbell, 
ARCMSR_DOORBELL_INT_CLEAR_PATTERN); /* clear doorbell interrupt */
                        for(i=0; i < ARCMSR_MAX_HBB_POSTQUEUE; i++) {
-                               if((flag_srb=phbbmu->done_qbuffer[i])!=0) {
-                                       phbbmu->done_qbuffer[i]=0;
-                       error=(flag_srb & 
ARCMSR_SRBREPLY_FLAG_ERROR_MODE0)?TRUE:FALSE;
+                               if((flag_srb = phbbmu->done_qbuffer[i]) != 0) {
+                                       phbbmu->done_qbuffer[i] = 0;
+                       error = (flag_srb & 
ARCMSR_SRBREPLY_FLAG_ERROR_MODE0)?TRUE:FALSE;
                                        arcmsr_drain_donequeue(acb, flag_srb, 
error);
                                }
-                               phbbmu->post_qbuffer[i]=0;
+                               phbbmu->post_qbuffer[i] = 0;
                        }/*drain reply FIFO*/
-                       phbbmu->doneq_index=0;
-                       phbbmu->postq_index=0;
+                       phbbmu->doneq_index = 0;
+                       phbbmu->postq_index = 0;
                }
                break;
        case ACB_ADAPTER_TYPE_C: {
        
                        while((CHIP_REG_READ32(HBC_MessageUnit, 0, 
host_int_status) & ARCMSR_HBCMU_OUTBOUND_POSTQUEUE_ISR) && (i++ < 
ARCMSR_MAX_OUTSTANDING_CMD)) {
-                               flag_srb=CHIP_REG_READ32(HBC_MessageUnit, 0, 
outbound_queueport_low);
-                error=(flag_srb & ARCMSR_SRBREPLY_FLAG_ERROR_MODE1)?TRUE:FALSE;
+                               flag_srb = CHIP_REG_READ32(HBC_MessageUnit, 0, 
outbound_queueport_low);
+                error = (flag_srb & ARCMSR_SRBREPLY_FLAG_ERROR_MODE1) ? TRUE : 
FALSE;
                                arcmsr_drain_donequeue(acb, flag_srb, error);
                        }
                }
                break;
+       case ACB_ADAPTER_TYPE_D: {
+                       arcmsr_hbd_postqueue_isr(acb);
+               }
+               break;
        }
 }
 /*
@@ -888,15 +941,15 @@ static void arcmsr_iop_reset(struct Adap
        
        if(acb->srboutstandingcount>0) {
                /* disable all outbound interrupt */
-               intmask_org=arcmsr_disable_allintr(acb);
+               intmask_org = arcmsr_disable_allintr(acb);
                /*clear and abort all outbound posted Q*/
                arcmsr_done4abort_postqueue(acb);
                /* talk to iop 331 outstanding command aborted*/
                arcmsr_abort_allcmd(acb);
-               for(i=0;i<ARCMSR_MAX_FREESRB_NUM;i++) {
-                       srb=acb->psrb_pool[i];
-                       if(srb->srb_state==ARCMSR_SRB_START) {
-                               srb->srb_state=ARCMSR_SRB_ABORTED;
+               for(i=0; i < ARCMSR_MAX_FREESRB_NUM; i++) {
+                       srb = acb->psrb_pool[i];
+                       if(srb->srb_state == ARCMSR_SRB_START) {
+                               srb->srb_state = ARCMSR_SRB_ABORTED;
                                srb->pccb->ccb_h.status |= CAM_REQ_ABORTED;
                                arcmsr_srb_complete(srb, 1);
                                printf("arcmsr%d: scsi id=%d lun=%d srb='%p' 
aborted\n"
@@ -907,13 +960,11 @@ static void arcmsr_iop_reset(struct Adap
                /* enable all outbound interrupt */
                arcmsr_enable_allintr(acb, intmask_org);
        }
-       acb->srboutstandingcount=0;
-       acb->workingsrb_doneindex=0;
-       acb->workingsrb_startindex=0;
-#ifdef ARCMSR_DEBUG1
+       acb->srboutstandingcount = 0;
+       acb->workingsrb_doneindex = 0;
+       acb->workingsrb_startindex = 0;
        acb->pktRequestCount = 0;
        acb->pktReturnCount = 0;
-#endif
 }
 /*
 **********************************************************************
@@ -922,67 +973,66 @@ static void arcmsr_iop_reset(struct Adap
 static void arcmsr_build_srb(struct CommandControlBlock *srb, 
                bus_dma_segment_t *dm_segs, u_int32_t nseg)
 {
-       struct ARCMSR_CDB * arcmsr_cdb= &srb->arcmsr_cdb;
-       u_int8_t * psge=(u_int8_t *)&arcmsr_cdb->u;
+       struct ARCMSR_CDB *arcmsr_cdb = &srb->arcmsr_cdb;
+       u_int8_t *psge = (u_int8_t *)&arcmsr_cdb->u;
        u_int32_t address_lo, address_hi;
-       union ccb * pccb=srb->pccb;
-       struct ccb_scsiio * pcsio= &pccb->csio;
-       u_int32_t arccdbsize=0x30;
+       union ccb *pccb = srb->pccb;
+       struct ccb_scsiio *pcsio = &pccb->csio;
+       u_int32_t arccdbsize = 0x30;
        
        memset(arcmsr_cdb, 0, sizeof(struct ARCMSR_CDB));
-       arcmsr_cdb->Bus=0;
-       arcmsr_cdb->TargetID=pccb->ccb_h.target_id;
-       arcmsr_cdb->LUN=pccb->ccb_h.target_lun;
-       arcmsr_cdb->Function=1;
-       arcmsr_cdb->CdbLength=(u_int8_t)pcsio->cdb_len;
-       arcmsr_cdb->Context=0;
+       arcmsr_cdb->Bus = 0;
+       arcmsr_cdb->TargetID = pccb->ccb_h.target_id;
+       arcmsr_cdb->LUN = pccb->ccb_h.target_lun;
+       arcmsr_cdb->Function = 1;
+       arcmsr_cdb->CdbLength = (u_int8_t)pcsio->cdb_len;
        bcopy(pcsio->cdb_io.cdb_bytes, arcmsr_cdb->Cdb, pcsio->cdb_len);
        if(nseg != 0) {
-               struct AdapterControlBlock *acb=srb->acb;
+               struct AdapterControlBlock *acb = srb->acb;
                bus_dmasync_op_t op;    
-               u_int32_t length, i, cdb_sgcount=0;
+               u_int32_t length, i, cdb_sgcount = 0;
        
                if((pccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN) {
-                       op=BUS_DMASYNC_PREREAD;
+                       op = BUS_DMASYNC_PREREAD;
                } else {
-                       op=BUS_DMASYNC_PREWRITE;
-                       arcmsr_cdb->Flags|=ARCMSR_CDB_FLAG_WRITE;
-                       srb->srb_flags|=SRB_FLAG_WRITE;
+                       op = BUS_DMASYNC_PREWRITE;
+                       arcmsr_cdb->Flags |= ARCMSR_CDB_FLAG_WRITE;
+                       srb->srb_flags |= SRB_FLAG_WRITE;
                }
                bus_dmamap_sync(acb->dm_segs_dmat, srb->dm_segs_dmamap, op);
-               for(i=0;i<nseg;i++) {
+               for(i=0; i < nseg; i++) {
                        /* Get the physical address of the current data pointer 
*/
-                       length=arcmsr_htole32(dm_segs[i].ds_len);
-                       
address_lo=arcmsr_htole32(dma_addr_lo32(dm_segs[i].ds_addr));
-                       
address_hi=arcmsr_htole32(dma_addr_hi32(dm_segs[i].ds_addr));
-                       if(address_hi==0) {
-                               struct SG32ENTRY * pdma_sg=(struct SG32ENTRY 
*)psge;
-                               pdma_sg->address=address_lo;
-                               pdma_sg->length=length;
+                       length = arcmsr_htole32(dm_segs[i].ds_len);
+                       address_lo = 
arcmsr_htole32(dma_addr_lo32(dm_segs[i].ds_addr));
+                       address_hi = 
arcmsr_htole32(dma_addr_hi32(dm_segs[i].ds_addr));
+                       if(address_hi == 0) {
+                               struct SG32ENTRY *pdma_sg = (struct SG32ENTRY 
*)psge;
+                               pdma_sg->address = address_lo;
+                               pdma_sg->length = length;
                                psge += sizeof(struct SG32ENTRY);
                                arccdbsize += sizeof(struct SG32ENTRY);
                        } else {
-                               u_int32_t sg64s_size=0, tmplength=length;
+                               u_int32_t sg64s_size = 0, tmplength = length;
        
                                while(1) {
                                        u_int64_t span4G, length0;
-                                       struct SG64ENTRY * pdma_sg=(struct 
SG64ENTRY *)psge;
+                                       struct SG64ENTRY *pdma_sg = (struct 
SG64ENTRY *)psge;
        
-                                       span4G=(u_int64_t)address_lo + 
tmplength;
-                                       pdma_sg->addresshigh=address_hi;
-                                       pdma_sg->address=address_lo;
+                                       span4G = (u_int64_t)address_lo + 
tmplength;
+                                       pdma_sg->addresshigh = address_hi;
+                                       pdma_sg->address = address_lo;
                                        if(span4G > 0x100000000) {
                                                /*see if cross 4G boundary*/
-                                               length0=0x100000000-address_lo;
-                                               
pdma_sg->length=(u_int32_t)length0|IS_SG64_ADDR;
-                                               address_hi=address_hi+1;
-                                               address_lo=0;
-                                               
tmplength=tmplength-(u_int32_t)length0;
+                                               length0 = 
0x100000000-address_lo;
+                                               pdma_sg->length = 
(u_int32_t)length0 | IS_SG64_ADDR;
+                                               address_hi = address_hi+1;
+                                               address_lo = 0;
+                                               tmplength = tmplength - 
(u_int32_t)length0;
                                                sg64s_size += sizeof(struct 
SG64ENTRY);
                                                psge += sizeof(struct 
SG64ENTRY);
                                                cdb_sgcount++;
                                        } else {
-                                               
pdma_sg->length=tmplength|IS_SG64_ADDR;
+                                               pdma_sg->length = tmplength | 
IS_SG64_ADDR;
                                                sg64s_size += sizeof(struct 
SG64ENTRY);
                                                psge += sizeof(struct 
SG64ENTRY);
                                                break;
@@ -992,15 +1042,16 @@ static void arcmsr_build_srb(struct Comm
                        }
                        cdb_sgcount++;
                }
-               arcmsr_cdb->sgcount=(u_int8_t)cdb_sgcount;
-               arcmsr_cdb->DataLength=pcsio->dxfer_len;
+               arcmsr_cdb->sgcount = (u_int8_t)cdb_sgcount;
+               arcmsr_cdb->DataLength = pcsio->dxfer_len;
                if( arccdbsize > 256) {
-                       arcmsr_cdb->Flags|=ARCMSR_CDB_FLAG_SGL_BSIZE;
+                       arcmsr_cdb->Flags |= ARCMSR_CDB_FLAG_SGL_BSIZE;
                }
        } else {
                arcmsr_cdb->DataLength = 0;
        }
-    srb->arc_cdb_size=arccdbsize;
+    srb->arc_cdb_size = arccdbsize;
+    arcmsr_cdb->msgPages = (arccdbsize/256) + ((arccdbsize % 256) ? 1 : 0);
 }
 /*
 **************************************************************************
@@ -1008,46 +1059,45 @@ static void arcmsr_build_srb(struct Comm
 */ 
 static void arcmsr_post_srb(struct AdapterControlBlock *acb, struct 
CommandControlBlock *srb)
 {
-       u_int32_t cdb_shifted_phyaddr=(u_int32_t) srb->cdb_shifted_phyaddr;
-       struct ARCMSR_CDB * arcmsr_cdb=(struct ARCMSR_CDB *)&srb->arcmsr_cdb;
+       u_int32_t cdb_phyaddr_low = (u_int32_t) srb->cdb_phyaddr_low;
+       struct ARCMSR_CDB *arcmsr_cdb = (struct ARCMSR_CDB *)&srb->arcmsr_cdb;
        
        bus_dmamap_sync(acb->srb_dmat, acb->srb_dmamap, (srb->srb_flags & 
SRB_FLAG_WRITE) ? BUS_DMASYNC_POSTWRITE:BUS_DMASYNC_POSTREAD);
        atomic_add_int(&acb->srboutstandingcount, 1);
-       srb->srb_state=ARCMSR_SRB_START;
+       srb->srb_state = ARCMSR_SRB_START;
 
        switch (acb->adapter_type) {
        case ACB_ADAPTER_TYPE_A: {
                        if(arcmsr_cdb->Flags & ARCMSR_CDB_FLAG_SGL_BSIZE) {
-                               CHIP_REG_WRITE32(HBA_MessageUnit, 0, 
inbound_queueport, cdb_shifted_phyaddr|ARCMSR_SRBPOST_FLAG_SGL_BSIZE);
+                               CHIP_REG_WRITE32(HBA_MessageUnit, 0, 
inbound_queueport, cdb_phyaddr_low|ARCMSR_SRBPOST_FLAG_SGL_BSIZE);
                        } else {
-                               CHIP_REG_WRITE32(HBA_MessageUnit, 0, 
inbound_queueport, cdb_shifted_phyaddr);
+                               CHIP_REG_WRITE32(HBA_MessageUnit, 0, 
inbound_queueport, cdb_phyaddr_low);
                        }
                }
                break;
        case ACB_ADAPTER_TYPE_B: {
-                       struct HBB_MessageUnit *phbbmu=(struct HBB_MessageUnit 
*)acb->pmu;
+                       struct HBB_MessageUnit *phbbmu = (struct 
HBB_MessageUnit *)acb->pmu;
                        int ending_index, index;
        
-                       index=phbbmu->postq_index;
-                       ending_index=((index+1)%ARCMSR_MAX_HBB_POSTQUEUE);
-                       phbbmu->post_qbuffer[ending_index]=0;
+                       index = phbbmu->postq_index;
+                       ending_index = ((index+1) % ARCMSR_MAX_HBB_POSTQUEUE);
+                       phbbmu->post_qbuffer[ending_index] = 0;
                        if(arcmsr_cdb->Flags & ARCMSR_CDB_FLAG_SGL_BSIZE) {
-                               phbbmu->post_qbuffer[index]= 
cdb_shifted_phyaddr|ARCMSR_SRBPOST_FLAG_SGL_BSIZE;
+                               phbbmu->post_qbuffer[index] = cdb_phyaddr_low | 
ARCMSR_SRBPOST_FLAG_SGL_BSIZE;
                        } else {
-                               phbbmu->post_qbuffer[index]= 
cdb_shifted_phyaddr;
+                               phbbmu->post_qbuffer[index] = cdb_phyaddr_low;
                        }
                        index++;
                        index %= ARCMSR_MAX_HBB_POSTQUEUE;     /*if last index 
number set it to 0 */
-                       phbbmu->postq_index=index;
+                       phbbmu->postq_index = index;
                        CHIP_REG_WRITE32(HBB_DOORBELL, 0, drv2iop_doorbell, 
ARCMSR_DRV2IOP_CDB_POSTED);
                }
                break;
-    case ACB_ADAPTER_TYPE_C:
-        {
+    case ACB_ADAPTER_TYPE_C: {
             u_int32_t ccb_post_stamp, arc_cdb_size, cdb_phyaddr_hi32;
 
-            arc_cdb_size=(srb->arc_cdb_size>0x300)?0x300:srb->arc_cdb_size;
-            ccb_post_stamp=(cdb_shifted_phyaddr | ((arc_cdb_size-1) >> 6) | 1);
+            arc_cdb_size = (srb->arc_cdb_size > 0x300) ? 0x300 : 
srb->arc_cdb_size;
+            ccb_post_stamp = (cdb_phyaddr_low | ((arc_cdb_size-1) >> 6) | 1);
                        cdb_phyaddr_hi32 = acb->srb_phyaddr.B.phyadd_high;
             if(cdb_phyaddr_hi32)
             {
@@ -1060,33 +1110,67 @@ static void arcmsr_post_srb(struct Adapt
             }
         }
         break;
+       case ACB_ADAPTER_TYPE_D: {
+                       struct HBD_MessageUnit0 *phbdmu = (struct 
HBD_MessageUnit0 *)acb->pmu;
+                       u_int16_t index_stripped;
+                       u_int16_t postq_index;
+                       struct InBound_SRB *pinbound_srb;
+
+                       ARCMSR_LOCK_ACQUIRE(&acb->postDone_lock);
+                       postq_index = phbdmu->postq_index;
+                       pinbound_srb = (struct InBound_SRB 
*)&phbdmu->post_qbuffer[postq_index & 0xFF];
+                       pinbound_srb->addressHigh = srb->cdb_phyaddr_high;
+                       pinbound_srb->addressLow = srb->cdb_phyaddr_low;
+                       pinbound_srb->length = srb->arc_cdb_size >> 2;
+                       arcmsr_cdb->Context = srb->cdb_phyaddr_low;
+                       if (postq_index & 0x4000) {
+                               index_stripped = postq_index & 0xFF;
+                               index_stripped += 1;
+                               index_stripped %= ARCMSR_MAX_HBD_POSTQUEUE;
+                               phbdmu->postq_index = index_stripped ? 
(index_stripped | 0x4000) : index_stripped;
+                       } else {
+                               index_stripped = postq_index;
+                               index_stripped += 1;
+                               index_stripped %= ARCMSR_MAX_HBD_POSTQUEUE;
+                               phbdmu->postq_index = index_stripped ? 
index_stripped : (index_stripped | 0x4000);
+                       }
+                       CHIP_REG_WRITE32(HBD_MessageUnit, 0, 
inboundlist_write_pointer, postq_index);
+                       ARCMSR_LOCK_RELEASE(&acb->postDone_lock);
+               }
+               break;
        }
 }
 /*
 ************************************************************************
 ************************************************************************
 */
-static struct QBUFFER * arcmsr_get_iop_rqbuffer( struct AdapterControlBlock 
*acb)
+static struct QBUFFER *arcmsr_get_iop_rqbuffer( struct AdapterControlBlock 
*acb)
 {
        struct QBUFFER *qbuffer=NULL;
        
        switch (acb->adapter_type) {
        case ACB_ADAPTER_TYPE_A: {
-                       struct HBA_MessageUnit *phbamu=(struct HBA_MessageUnit 
*)acb->pmu;
+                       struct HBA_MessageUnit *phbamu = (struct 
HBA_MessageUnit *)acb->pmu;
        
-                       qbuffer=(struct QBUFFER *)&phbamu->message_rbuffer;
+                       qbuffer = (struct QBUFFER *)&phbamu->message_rbuffer;
                }
                break;
        case ACB_ADAPTER_TYPE_B: {
-                       struct HBB_MessageUnit *phbbmu=(struct HBB_MessageUnit 
*)acb->pmu;
+                       struct HBB_MessageUnit *phbbmu = (struct 
HBB_MessageUnit *)acb->pmu;
        
-                       qbuffer=(struct QBUFFER 
*)&phbbmu->hbb_rwbuffer->message_rbuffer;
+                       qbuffer = (struct QBUFFER 
*)&phbbmu->hbb_rwbuffer->message_rbuffer;
                }
                break;
        case ACB_ADAPTER_TYPE_C: {
-                       struct HBC_MessageUnit *phbcmu=(struct HBC_MessageUnit 
*)acb->pmu;
+                       struct HBC_MessageUnit *phbcmu = (struct 
HBC_MessageUnit *)acb->pmu;
        
-                       qbuffer=(struct QBUFFER *)&phbcmu->message_rbuffer;
+                       qbuffer = (struct QBUFFER *)&phbcmu->message_rbuffer;
+               }
+               break;
+       case ACB_ADAPTER_TYPE_D: {
+                       struct HBD_MessageUnit0 *phbdmu = (struct 
HBD_MessageUnit0 *)acb->pmu;
+       
+                       qbuffer = (struct QBUFFER 
*)&phbdmu->phbdmu->message_rbuffer;
                }
                break;
        }
@@ -1096,27 +1180,33 @@ static struct QBUFFER * arcmsr_get_iop_r
 ************************************************************************
 ************************************************************************
 */
-static struct QBUFFER * arcmsr_get_iop_wqbuffer( struct AdapterControlBlock 
*acb)
+static struct QBUFFER *arcmsr_get_iop_wqbuffer( struct AdapterControlBlock 
*acb)
 {
-       struct QBUFFER *qbuffer=NULL;
+       struct QBUFFER *qbuffer = NULL;
        
        switch (acb->adapter_type) {
        case ACB_ADAPTER_TYPE_A: {
-                       struct HBA_MessageUnit *phbamu=(struct HBA_MessageUnit 
*)acb->pmu;
+                       struct HBA_MessageUnit *phbamu = (struct 
HBA_MessageUnit *)acb->pmu;
        
-                       qbuffer=(struct QBUFFER *)&phbamu->message_wbuffer;
+                       qbuffer = (struct QBUFFER *)&phbamu->message_wbuffer;
                }
                break;
        case ACB_ADAPTER_TYPE_B: {
-                       struct HBB_MessageUnit *phbbmu=(struct HBB_MessageUnit 
*)acb->pmu;
+                       struct HBB_MessageUnit *phbbmu = (struct 
HBB_MessageUnit *)acb->pmu;
        
-                       qbuffer=(struct QBUFFER 
*)&phbbmu->hbb_rwbuffer->message_wbuffer;
+                       qbuffer = (struct QBUFFER 
*)&phbbmu->hbb_rwbuffer->message_wbuffer;
                }
                break;
        case ACB_ADAPTER_TYPE_C: {
-                       struct HBC_MessageUnit *phbcmu=(struct HBC_MessageUnit 
*)acb->pmu;
+                       struct HBC_MessageUnit *phbcmu = (struct 
HBC_MessageUnit *)acb->pmu;
        
-                       qbuffer=(struct QBUFFER *)&phbcmu->message_wbuffer;
+                       qbuffer = (struct QBUFFER *)&phbcmu->message_wbuffer;
+               }
+               break;
+       case ACB_ADAPTER_TYPE_D: {
+                       struct HBD_MessageUnit0 *phbdmu = (struct 
HBD_MessageUnit0 *)acb->pmu;
+       
+                       qbuffer = (struct QBUFFER 
*)&phbdmu->phbdmu->message_wbuffer;
                }
                break;
        }
@@ -1143,6 +1233,12 @@ static void arcmsr_iop_message_read(stru
                        /* let IOP know data has been read */
                        CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_doorbell, 
ARCMSR_HBCMU_DRV2IOP_DATA_READ_OK);
                }
+               break;
+       case ACB_ADAPTER_TYPE_D: {
+                       /* let IOP know data has been read */
+                       CHIP_REG_WRITE32(HBD_MessageUnit, 0, inbound_doorbell, 
ARCMSR_HBDMU_DRV2IOP_DATA_OUT_READ);
+               }
+               break;
        }
 }
 /*
@@ -1176,37 +1272,14 @@ static void arcmsr_iop_message_wrote(str
                        CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_doorbell, 
ARCMSR_HBCMU_DRV2IOP_DATA_WRITE_OK);
                }
                break;
-       }
-}
-/*
-**********************************************************************
-**********************************************************************
-*/
-static void arcmsr_post_ioctldata2iop(struct AdapterControlBlock *acb)
-{
-       u_int8_t *pQbuffer;
-       struct QBUFFER *pwbuffer;
-       u_int8_t * iop_data;
-       int32_t allxfer_len=0;
-       
-       pwbuffer=arcmsr_get_iop_wqbuffer(acb);
-       iop_data=(u_int8_t *)pwbuffer->data;
-       if(acb->acb_flags & ACB_F_MESSAGE_WQBUFFER_READ) {
-               acb->acb_flags &= (~ACB_F_MESSAGE_WQBUFFER_READ);
-               while((acb->wqbuf_firstindex!=acb->wqbuf_lastindex) 
-                       && (allxfer_len<124)) {
-                       pQbuffer=&acb->wqbuffer[acb->wqbuf_firstindex];
-                       memcpy(iop_data, pQbuffer, 1);
-                       acb->wqbuf_firstindex++;
-                       acb->wqbuf_firstindex %=ARCMSR_MAX_QBUFFER; /*if last 
index number set it to 0 */
-                       iop_data++;
-                       allxfer_len++;

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to