From owner-svn-src-all@FreeBSD.ORG Tue Jan 1 07:02:34 2013 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 10A6DBBD; Tue, 1 Jan 2013 07:02:34 +0000 (UTC) (envelope-from delphij@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) by mx1.freebsd.org (Postfix) with ESMTP id E705D8FC08; Tue, 1 Jan 2013 07:02:33 +0000 (UTC) Received: from svn.freebsd.org (svn.FreeBSD.org [8.8.178.70]) by svn.freebsd.org (8.14.5/8.14.5) with ESMTP id r0172XA0005793; Tue, 1 Jan 2013 07:02:33 GMT (envelope-from delphij@svn.freebsd.org) Received: (from delphij@localhost) by svn.freebsd.org (8.14.5/8.14.5/Submit) id r0172Xfd005790; Tue, 1 Jan 2013 07:02:33 GMT (envelope-from delphij@svn.freebsd.org) Message-Id: <201301010702.r0172Xfd005790@svn.freebsd.org> From: Xin LI Date: Tue, 1 Jan 2013 07:02:33 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-9@freebsd.org Subject: svn commit: r244921 - in stable/9: share/man/man4 sys/dev/arcmsr X-SVN-Group: stable-9 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 01 Jan 2013 07:02:34 -0000 Author: delphij Date: Tue Jan 1 07:02:33 2013 New Revision: 244921 URL: http://svnweb.freebsd.org/changeset/base/244921 Log: MFC r244406: 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 Modified: stable/9/share/man/man4/arcmsr.4 stable/9/sys/dev/arcmsr/arcmsr.c stable/9/sys/dev/arcmsr/arcmsr.h Directory Properties: stable/9/share/man/man4/ (props changed) stable/9/sys/ (props changed) stable/9/sys/dev/ (props changed) Modified: stable/9/share/man/man4/arcmsr.4 ============================================================================== --- stable/9/share/man/man4/arcmsr.4 Tue Jan 1 07:00:42 2013 (r244920) +++ stable/9/share/man/man4/arcmsr.4 Tue Jan 1 07:02:33 2013 (r244921) @@ -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: stable/9/sys/dev/arcmsr/arcmsr.c ============================================================================== --- stable/9/sys/dev/arcmsr/arcmsr.c Tue Jan 1 07:00:42 2013 (r244920) +++ stable/9/sys/dev/arcmsr/arcmsr.c Tue Jan 1 07:02:33 2013 (r244921) @@ -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 #include #include - #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 #include #include - #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 -#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 unknow 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; /*unknow 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;ipsrb_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;iaddress=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 ***