From nobody@FreeBSD.org  Sun Jul 11 21:17:20 2010
Return-Path: <nobody@FreeBSD.org>
Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34])
	by hub.freebsd.org (Postfix) with ESMTP id 3ACCD106564A
	for <freebsd-gnats-submit@FreeBSD.org>; Sun, 11 Jul 2010 21:17:20 +0000 (UTC)
	(envelope-from nobody@FreeBSD.org)
Received: from www.freebsd.org (www.freebsd.org [IPv6:2001:4f8:fff6::21])
	by mx1.freebsd.org (Postfix) with ESMTP id 10BD68FC0A
	for <freebsd-gnats-submit@FreeBSD.org>; Sun, 11 Jul 2010 21:17:20 +0000 (UTC)
Received: from www.freebsd.org (localhost [127.0.0.1])
	by www.freebsd.org (8.14.3/8.14.3) with ESMTP id o6BLHIqZ018103
	for <freebsd-gnats-submit@FreeBSD.org>; Sun, 11 Jul 2010 21:17:18 GMT
	(envelope-from nobody@www.freebsd.org)
Received: (from nobody@localhost)
	by www.freebsd.org (8.14.3/8.14.3/Submit) id o6BLHIGR018102;
	Sun, 11 Jul 2010 21:17:18 GMT
	(envelope-from nobody)
Message-Id: <201007112117.o6BLHIGR018102@www.freebsd.org>
Date: Sun, 11 Jul 2010 21:17:18 GMT
From: Rich Ercolani <rercola@acm.jhu.edu>
To: freebsd-gnats-submit@FreeBSD.org
Subject: arcmsr driver offlines all devices on a SAS port if any device fails
X-Send-Pr-Version: www-3.1
X-GNATS-Notify:

>Number:         148502
>Category:       kern
>Synopsis:       [arcmsr] arcmsr driver offlines all devices on a SAS port if any device fails
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    delphij
>State:          closed
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Sun Jul 11 21:20:09 UTC 2010
>Closed-Date:    Wed Aug 04 01:50:47 UTC 2010
>Last-Modified:  Wed Aug 04 01:50:47 UTC 2010
>Originator:     Rich Ercolani
>Release:        8.1-RC2 r209893
>Organization:
JHU ACM
>Environment:
FreeBSD manticore.acm.jhu.edu 8.1-RC2 FreeBSD 8.1-RC2 #2 r209893: Sun Jul 11 03:26:50 EDT 2010     root@manticore.acm.jhu.edu:/usr/obj/usr/local/ncvs/src/sys/DTRACE  amd64

>Description:
Using the arcmsr driver to drive an Areca ARC-1280ML device, whenever
any of the four SATA devices plugged into a SAS port using an SFF-8087
-> 4xSATA cable fail, the other three devices on that port also are not
present in FreeBSD under /dev. 

The areca-cli utility demonstrates that this is not a problem with the
card itself - it happily will interrogate the other drives on the port,
and list the correct drive as "Failed" - but the failed device, as well
as any other devices on that SAS "port", will simply not exist in /dev.

[This behavior may also occur if a device fails on a running system,
rather than coming up with a failed device - I can't tell, the machine
seems to have eventually hung whenever a device failed, despite the
arcmsr driver reporting the error in dmesg and ZFS reporting the error
as corrected [or not, depending on which pool.]

[This could also be a problem at a different layer than arcmsr, I suppose -
something not noticing the difference between 4 drives on the lanes of the
SAS connection versus 1 drive using multiple lanes, and toggling the port...]
>How-To-Repeat:
1) Have >1 devices plugged into a single SFF-8087->4xSATA fanout cable on
an Areca ARC-1280ML.
2) Have one of the devices report sufficient SMART errors for the 1280ML
to determine the device has "failed".
3) Watch the other devices fail to show up on any boot in the future, and
possibly disappear whilst running.
>Fix:
Removing the failed device is a presumable workaround, but as this
practically limits the device to 6 drives connected if you do not wish
to sustain a critical outage from one disk failing, it's rather poor as one.

>Release-Note:
>Audit-Trail:

From: Xin LI <delphij@delphij.net>
To: bug-followup@FreeBSD.org, rercola@acm.jhu.edu
Cc: =?UTF-8?B?6buD5riF6ZqG?= <ching2048@areca.com.tw>
Subject: Re: kern/148502: [arcmsr] arcmsr driver offlines all devices on a
 SAS port if any device fails
Date: Tue, 13 Jul 2010 10:48:47 -0700

 This is a multi-part message in MIME format.
 --------------050905020905040004010604
 Content-Type: text/plain; charset=UTF-8
 Content-Transfer-Encoding: 7bit
 
 Dear submitter,
 
 I have contacted the vendor and got the following reply from them (I
 have added him in Cc and set Reply-To header so your reply will go to
 him directly).  Could you please give him some response on the questions
 and let's see what we can do next?
 
 Thanks in advance!
 
 ================
 I am Ching, take over the FreeBSD driver from now on.
 
 1. Raid system is in JBOD or RAID function? If it is in RAID function,
 what's the Raid level for
     these 4 drives?
 2. What's the firmware version number of ARC-1280ML? Do you have upgrade
 it to v1.48?
 ftp://ftp.areca.com.tw/RaidCards/BIOS_Firmware/ARC1280/148-91231/
 3. What's the version number of CLI? Do you have upgrade it to v1.83?
 ftp://ftp.areca.com.tw/RaidCards/AP_Drivers/FreeBSD/CLI/
 4. The attached new driver added support for ARC-1880 series SAS 6G raid
 adapter.
 Thanks,
 Ching 2010/07/13
 ================
 
 Cheers,
 -- 
 Xin LI <delphij@delphij.net>	http://www.delphij.net/
 FreeBSD - The Power to Serve!	       Live free or die
 
 --------------050905020905040004010604
 Content-Type: application/octet-stream;
  name="arcmsr-freebsd-1.20.00.17.zip"
 Content-Transfer-Encoding: base64
 Content-Disposition: attachment;
  filename="arcmsr-freebsd-1.20.00.17.zip"
 
 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
 S1sG7wQYO7eL9+/SLlZR5plOe8b0LQRRfmr4G4y4eoOTk4cWMwyNoolypHZ8u3o11CUcswM+
 vOdsN8Ri5k2PrxqKXdgPZhWkxZuQ0znauW5MrhG+lBkl/CPQYo8AndPO5LVgu/EqKN/OWAUZ
 POQ78TF2j3Ah/qODXYSdpJS2JdzSiGeqlM1W0M0h9pR+wvUcN7KXJtH8Fvyvl6M54foPQrsd
 EN/Q/o+rNQCtmHcppDaQ3MgU60HQKT53l4FstxbWaRP4weWEL2niJAoIK7VnmFFNX1wBtx8F
 AHGSCZwnS2v8eqJvO4ccnKoQ0H5bG72p+4DOpoP0bMr69R/X9Op3zhfjkZFnuPJEmg6bfocF
 Ca9DTmokQVZ+4lUpLe25UcrNaaV02OFeCezviXW4NzT2egf2x6fO9O2t7G9UiRQrUMJL4eo4
 Edh5CAN0afWa5/jBgjWbWLUROXG3Ra0IjPnXh7rCKB5lj6tOlqCYFjbFSunCRlOmSq4vBtOB
 5FsxnKMkH4fm3zJxtHEuP3ma05HirROj9hBOsxnMUoo5vYxb+byp7kfeIOZcZZ1W4U6+Fv5X
 sOeaCMPsqckiyD8HexY55rl36UP2rDfMazk/rp9s7j2+To6bTbCjb3Q8S3maB7epHKvnWEHq
 Viel/c7Sghw6serzIK7Gror4o/BemqonH9HgFJYcOfQ3cNAvWydAwDYbZPdwc3nCK0P7rund
 Iz+JoH4np8RFVVrYyYzWTo7SXDky1abT/Nyv+WxQXlbATzIu1YM3i7bCSaOZMJ+rYV1KeDzg
 q1n5mdtPIbi/EfKszYXFEm1rPwv+yiLtY8/GZxIaWLkql2lzpYYKG4Fr1lfbQoZ3dJvnECuq
 Sb1vldOuSO5dv2hRLl20XiznY9lUFTe/QYxcbTbKJ8MVf3NYl/t73IH2pnDuuha9Q4k88bgi
 47osms/GZXzrWhSWCsXM1E8jHdYQi5fJh2YOinNEG8F4jchXW2VvPUo2DgzCHkcUo18hVInw
 XZOEvMLU56+bChJy/R0lJ3lqZXpsVFx8nJRcLiYbylZPbQqhrr6ovMpqqC4ru0LnZmzUYqR+
 EW7joyVG6qKkYY7V+uLmpp7d+jC1sFW7T+VWbSRUr9RKu0eemrh6E7kut/+JqcHFjseSgYbn
 zbgEFt2aw5vPuP3hS8QW4j/OC6GvPSQTucPK9yo+yI3f5Fd/jQaLuZOKO0FOezu8v557G2Ww
 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
 --------------050905020905040004010604--
State-Changed-From-To: open->feedback 
State-Changed-By: delphij 
State-Changed-When: Tue Jul 13 17:51:16 UTC 2010 
State-Changed-Why:  
Note feedback requested. 


Responsible-Changed-From-To: freebsd-bugs->delphij 
Responsible-Changed-By: delphij 
Responsible-Changed-When: Tue Jul 13 17:51:16 UTC 2010 
Responsible-Changed-Why:  
Take. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=148502 

From: Rich <rercola@acm.jhu.edu>
To: =?Big5?B?tsCyTbap?= <ching2048@areca.com.tw>
Cc: bug-followup@freebsd.org
Subject: Re: kern/148502: [arcmsr] arcmsr driver offlines all devices on a SAS 
	port if any device fails
Date: Tue, 13 Jul 2010 14:24:42 -0400

 Hi Ching,
 1) The card is in JBOD mode.
 2) The firmware version on card is 1.48, as can be seen here:
 CLI> sys info
 The System Information
 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
 Main Processor     : 800MHz
 CPU ICache Size    : 32KB
 CPU DCache Size    : 32KB
 CPU SCache Size    : 512KB
 System Memory      : 1024MB/533MHz/ECC
 Firmware Version   : V1.48 2009-12-31
 BOOT ROM Version   : V1.48 2009-12-31
 Serial Number      : Y830CAAXAR800810
 Controller Name    : ARC-1280
 Current IP Address : 192.168.1.100
 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
 GuiErrMsg<0x00>: Success.
 3)
 Areca CLI, Version: 1.83, Arclib: 290, Date: Nov  2 2009( FreeBSD )
 4)
 Should I try the new driver, or does it just add support for a newer
 card, and not fix any existing bugs? (I see no changelog in the ZIP
 you've enclosed.)
 
 Thanks!
 - Rich
 

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: kern/148502: commit references a PR
Date: Wed, 21 Jul 2010 18:50:39 +0000 (UTC)

 Author: delphij
 Date: Wed Jul 21 18:50:24 2010
 New Revision: 210358
 URL: http://svn.freebsd.org/changeset/base/210358
 
 Log:
   Apply vendor version 1.20.00.17.
   
   This version adds support for ARC1880; additionally this version fixed
   an issue where all devices on a SAS port gets offlined when any device
   failed on the port [1].
   
   Many thanks to Areca for continuing to support FreeBSD.
   
   PR:		kern/148502 [1]
   Submitted by:	Ching-Lung Huang <ching2048 areca com tw>
   Obtained from:	Areca
   Tested by:	Rich Ercolani <rercola acm jhu edu> [1]
   MFC after:	2 weeks
 
 Modified:
   head/sys/dev/arcmsr/arcmsr.c
   head/sys/dev/arcmsr/arcmsr.h
 
 Modified: head/sys/dev/arcmsr/arcmsr.c
 ==============================================================================
 --- head/sys/dev/arcmsr/arcmsr.c	Wed Jul 21 18:47:52 2010	(r210357)
 +++ head/sys/dev/arcmsr/arcmsr.c	Wed Jul 21 18:50:24 2010	(r210358)
 @@ -2,15 +2,15 @@
  *****************************************************************************************
  **        O.S   : FreeBSD
  **   FILE NAME  : arcmsr.c
 -**        BY    : Erich Chen   
 +**        BY    : Erich Chen, Ching Huang
  **   Description: SCSI RAID Device Driver for 
 -**                ARECA (ARC11XX/ARC12XX/ARC13XX/ARC16XX) SATA/SAS RAID HOST Adapter
 +**                ARECA (ARC11XX/ARC12XX/ARC13XX/ARC16XX/ARC188x) SATA/SAS RAID HOST Adapter
  **                ARCMSR RAID Host adapter
  **                [RAID controller:INTEL 331(PCI-X) 341(PCI-EXPRESS) chip set]
  ******************************************************************************************
  ************************************************************************
  **
 -** Copyright (c) 2004-2006 ARECA Co. Ltd.
 +** Copyright (c) 2004-2010 ARECA Co. Ltd.
  **        Erich Chen, Taipei Taiwan All rights reserved.
  **
  ** Redistribution and use in source and binary forms, with or without
 @@ -57,6 +57,10 @@
  **     1.20.00.15   10/10/2007         Erich Chen        support new RAID adapter type ARC120x
  **     1.20.00.16   10/10/2009         Erich Chen        Bug fix for RAID adapter type ARC120x
  **                                                       bus_dmamem_alloc() with BUS_DMA_ZERO
 +**     1.20.00.17   07/15/2010         Ching Huang       Added support ARC1880
 +**							 report CAM_DEV_NOT_THERE instead of CAM_SEL_TIMEOUT when device failed,
 +**							 prevent cam_periph_error removing all LUN devices of one Target id
 +**							 for any one LUN device failed
  ******************************************************************************************
  * $FreeBSD$
  */
 @@ -90,6 +94,8 @@
  #include <cam/cam.h>
  #include <cam/cam_ccb.h>
  #include <cam/cam_sim.h>
 +#include <cam/cam_periph.h>
 +#include <cam/cam_xpt_periph.h>
  #include <cam/cam_xpt_sim.h>
  #include <cam/cam_debug.h>
  #include <cam/scsi/scsi_all.h>
 @@ -165,6 +171,8 @@ static void arcmsr_build_srb(struct Comm
  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);
  /*
  **************************************************************************
  **************************************************************************
 @@ -191,7 +199,6 @@ static device_method_t arcmsr_methods[]=
  	DEVMETHOD(device_shutdown,	arcmsr_shutdown),
  	DEVMETHOD(device_suspend,	arcmsr_suspend),
  	DEVMETHOD(device_resume,	arcmsr_resume),
 -	
  	DEVMETHOD(bus_print_child,	bus_generic_print_child),
  	DEVMETHOD(bus_driver_added, 	bus_generic_driver_added),
  	{ 0, 0 }
 @@ -215,7 +222,7 @@ MODULE_DEPEND(arcmsr, cam, 1, 1, 1);
  	#ifndef D_VERSION
  		#define D_VERSION	0x20011966
  	#endif
 -	static struct cdevsw arcmsr_cdevsw={
 +static struct cdevsw arcmsr_cdevsw={
  	#if __FreeBSD_version > 502010
  		.d_version = D_VERSION, 
  	#endif
 @@ -228,7 +235,7 @@ MODULE_DEPEND(arcmsr, cam, 1, 1, 1);
  #else
  	#define ARCMSR_CDEV_MAJOR	180
  	
 -	static struct cdevsw arcmsr_cdevsw = {
 +static struct cdevsw arcmsr_cdevsw = {
  		arcmsr_open, 		        /* open     */
  		arcmsr_close, 		        /* close    */
  		noread, 		        /* read     */
 @@ -244,7 +251,10 @@ MODULE_DEPEND(arcmsr, cam, 1, 1, 1);
  		0				/* flags    */
  	};
  #endif
 -
 +/*
 +**************************************************************************
 +**************************************************************************
 +*/
  #if __FreeBSD_version < 500005
  	static int arcmsr_open(dev_t dev, int flags, int fmt, struct proc *proc)
  #else
 @@ -328,18 +338,21 @@ static u_int32_t arcmsr_disable_allintr(
  	switch (acb->adapter_type) {
  	case ACB_ADAPTER_TYPE_A: {
  			/* disable all outbound interrupt */
 -			intmask_org=CHIP_REG_READ32(HBA_MessageUnit, 
 -			0, outbound_intmask)|ARCMSR_MU_OUTBOUND_MESSAGE0_INTMASKENABLE; /* disable outbound message0 int */
 -			CHIP_REG_WRITE32(HBA_MessageUnit, 
 -			0, outbound_intmask, intmask_org|ARCMSR_MU_OUTBOUND_ALL_INTMASKENABLE);
 +			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, 
  			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 */
 +			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 */
 +			CHIP_REG_WRITE32(HBC_MessageUnit, 0, host_int_mask, intmask_org|ARCMSR_HBCMU_ALL_INTMASKENABLE);
  		}
  		break;
  	}
 @@ -356,19 +369,25 @@ 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);
 +			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: {
 -			/* disable ARCMSR_IOP2DRV_MESSAGE_CMD_DONE */
 -			mask=(ARCMSR_IOP2DRV_DATA_WRITE_OK|ARCMSR_IOP2DRV_DATA_READ_OK|ARCMSR_IOP2DRV_CDB_DONE);
 -			CHIP_REG_WRITE32(HBB_DOORBELL, 
 -			0, iop2drv_doorbell_mask, intmask_org | mask); /*1=interrupt enable, 0=interrupt disable*/
 +			/* 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);
 +			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);
 +			CHIP_REG_WRITE32(HBC_MessageUnit, 0, host_int_mask, intmask_org & mask);
 +			acb->outbound_int_enable= ~(intmask_org & mask) & 0x0000000f;
 +		}
 +		break;
  	}
  	return;
  }
 @@ -383,10 +402,8 @@ static u_int8_t arcmsr_hba_wait_msgint_r
  	
  	do {
  		for(Index=0; Index < 100; Index++) {
 -			if(CHIP_REG_READ32(HBA_MessageUnit, 
 -				0, outbound_intstatus) & ARCMSR_MU_OUTBOUND_MESSAGE0_INT) {
 -				CHIP_REG_WRITE32(HBA_MessageUnit, 
 -				0, outbound_intstatus, ARCMSR_MU_OUTBOUND_MESSAGE0_INT);/*clear interrupt*/
 +			if(CHIP_REG_READ32(HBA_MessageUnit, 0, outbound_intstatus) & ARCMSR_MU_OUTBOUND_MESSAGE0_INT) {
 +				CHIP_REG_WRITE32(HBA_MessageUnit, 0, outbound_intstatus, ARCMSR_MU_OUTBOUND_MESSAGE0_INT);/*clear interrupt*/
  				return TRUE;
  			}
  			UDELAY(10000);
 @@ -405,12 +422,29 @@ static u_int8_t arcmsr_hbb_wait_msgint_r
  	
  	do {
  		for(Index=0; Index < 100; Index++) {
 -			if(CHIP_REG_READ32(HBB_DOORBELL, 
 -				0, iop2drv_doorbell) & ARCMSR_IOP2DRV_MESSAGE_CMD_DONE) {
 -				CHIP_REG_WRITE32(HBB_DOORBELL, 
 -				0, iop2drv_doorbell, ARCMSR_MESSAGE_INT_CLEAR_PATTERN);/*clear interrupt*/
 -				CHIP_REG_WRITE32(HBB_DOORBELL, 
 -				0, drv2iop_doorbell, ARCMSR_DRV2IOP_END_OF_INTERRUPT);
 +			if(CHIP_REG_READ32(HBB_DOORBELL, 0, iop2drv_doorbell) & ARCMSR_IOP2DRV_MESSAGE_CMD_DONE) {
 +				CHIP_REG_WRITE32(HBB_DOORBELL, 0, iop2drv_doorbell, ARCMSR_MESSAGE_INT_CLEAR_PATTERN);/*clear interrupt*/
 +				CHIP_REG_WRITE32(HBB_DOORBELL, 0, drv2iop_doorbell, ARCMSR_DRV2IOP_END_OF_INTERRUPT);
 +				return TRUE;
 +			}
 +			UDELAY(10000);
 +		}/*max 1 seconds*/
 +	}while(Retries++ < 20);/*max 20 sec*/
 +	return FALSE;
 +}
 +/*
 +**********************************************************************
 +**********************************************************************
 +*/
 +static u_int8_t arcmsr_hbc_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(HBC_MessageUnit, 0, outbound_doorbell) & ARCMSR_HBCMU_IOP2DRV_MESSAGE_CMD_DONE) {
 +				CHIP_REG_WRITE32(HBC_MessageUnit, 0, outbound_doorbell_clear, ARCMSR_HBCMU_IOP2DRV_MESSAGE_CMD_DONE_DOORBELL_CLEAR);/*clear interrupt*/
  				return TRUE;
  			}
  			UDELAY(10000);
 @@ -426,8 +460,7 @@ static void arcmsr_flush_hba_cache(struc
  {
  	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);
 +	CHIP_REG_WRITE32(HBA_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_FLUSH_CACHE);
  	do {
  		if(arcmsr_hba_wait_msgint_ready(acb)) {
  			break;
 @@ -460,6 +493,25 @@ 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 */
 +	
 +	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);
 +	do {
 +		if(arcmsr_hbc_wait_msgint_ready(acb)) {
 +			break;
 +		} else {
 +			retry_count--;
 +		}
 +	}while(retry_count!=0);
 +	return;
 +}
 +/*
 +************************************************************************
 +************************************************************************
 +*/
  static void arcmsr_flush_adapter_cache(struct AdapterControlBlock *acb)
  {
  	switch (acb->adapter_type) {
 @@ -471,6 +523,10 @@ static void arcmsr_flush_adapter_cache(s
  			arcmsr_flush_hbb_cache(acb);
  		}
  		break;
 +	case ACB_ADAPTER_TYPE_C: {
 +			arcmsr_flush_hbc_cache(acb);
 +		}
 +		break;
  	}
  	return;
  }
 @@ -482,10 +538,10 @@ static int arcmsr_suspend(device_t dev)
  {
  	struct AdapterControlBlock	*acb = device_get_softc(dev);
  	
 -	/* disable all outbound interrupt */
 -	arcmsr_disable_allintr(acb);
  	/* flush controller */
  	arcmsr_iop_parking(acb);
 +	/* disable all outbound interrupt */
 +	arcmsr_disable_allintr(acb);
  	return(0);
  }
  /*
 @@ -515,12 +571,10 @@ static void arcmsr_async(void *cb_arg, u
  	case AC_LOST_DEVICE:
  		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)) {
 +		if((target_id > ARCMSR_MAX_TARGETID) || (target_lun > ARCMSR_MAX_TARGETLUN)) {
  			break;
  		}
 -		printf("%s:scsi id%d lun%d device lost \n"
 -			, device_get_name(acb->pci_dev), target_id, target_lun);
 +		printf("%s:scsi id=%d lun=%d device lost \n", device_get_name(acb->pci_dev), target_id, target_lun);
  		break;
  	default:
  		break;
 @@ -589,8 +643,7 @@ static void arcmsr_abort_hba_allcmd(stru
  {
  	CHIP_REG_WRITE32(HBA_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_ABORT_CMD);
  	if(!arcmsr_hba_wait_msgint_ready(acb)) {
 -		printf("arcmsr%d: wait 'abort all outstanding command' timeout \n"
 -			, acb->pci_unit);
 +		printf("arcmsr%d: wait 'abort all outstanding command' timeout \n", acb->pci_unit);
  	}
  	return;
  }
 @@ -602,8 +655,20 @@ static void arcmsr_abort_hbb_allcmd(stru
  {
  	CHIP_REG_WRITE32(HBB_DOORBELL, 0, drv2iop_doorbell, ARCMSR_MESSAGE_ABORT_CMD);
  	if(!arcmsr_hbb_wait_msgint_ready(acb)) {
 -		printf("arcmsr%d: wait 'abort all outstanding command' timeout \n"
 -			, acb->pci_unit);
 +		printf("arcmsr%d: wait 'abort all outstanding command' timeout \n", acb->pci_unit);
 +	}
 +	return;
 +}
 +/*
 +*********************************************************************
 +*********************************************************************
 +*/
 +static void arcmsr_abort_hbc_allcmd(struct AdapterControlBlock *acb)
 +{
 +	CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_ABORT_CMD);
 +	CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_doorbell, ARCMSR_HBCMU_DRV2IOP_MESSAGE_CMD_DONE);
 +	if(!arcmsr_hbc_wait_msgint_ready(acb)) {
 +		printf("arcmsr%d: wait 'abort all outstanding command' timeout \n", acb->pci_unit);
  	}
  	return;
  }
 @@ -622,6 +687,10 @@ static void arcmsr_abort_allcmd(struct A
  			arcmsr_abort_hbb_allcmd(acb);
  		}
  		break;
 +	case ACB_ADAPTER_TYPE_C: {
 +			arcmsr_abort_hbc_allcmd(acb);
 +		}
 +		break;
  	}
  	return;
  }
 @@ -629,14 +698,13 @@ static void arcmsr_abort_allcmd(struct A
  **************************************************************************
  **************************************************************************
  */
 -static void arcmsr_report_srb_state(struct AdapterControlBlock *acb, 
 -	struct CommandControlBlock *srb, u_int32_t flag_srb)
 +static void arcmsr_report_srb_state(struct AdapterControlBlock *acb, struct CommandControlBlock *srb, u_int16_t error)
  {
  	int target, lun;
  	
  	target=srb->pccb->ccb_h.target_id;
  	lun=srb->pccb->ccb_h.target_lun;
 -	if((flag_srb & ARCMSR_SRBREPLY_FLAG_ERROR)==0) {
 +	if(error == FALSE) {
  		if(acb->devstate[target][lun]==ARECA_RAID_GONE) {
  			acb->devstate[target][lun]=ARECA_RAID_GOOD;
  		}
 @@ -646,12 +714,10 @@ static void arcmsr_report_srb_state(stru
  		switch(srb->arcmsr_cdb.DeviceStatus) {
  		case ARCMSR_DEV_SELECT_TIMEOUT: {
  				if(acb->devstate[target][lun]==ARECA_RAID_GOOD) {
 -					printf( "arcmsr%d: select timeout"
 -						", raid volume was kicked out \n"
 -						, acb->pci_unit);
 +					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;
 -				srb->pccb->ccb_h.status |= CAM_SEL_TIMEOUT;
 +				srb->pccb->ccb_h.status |= CAM_DEV_NOT_THERE;
  				arcmsr_srb_complete(srb, 1);
  			}
  			break;
 @@ -669,11 +735,8 @@ static void arcmsr_report_srb_state(stru
  			}
  			break;
  		default:
 -			printf("arcmsr%d: scsi id=%d lun=%d"
 -				"isr get command error done,"
 -				"but got unknow DeviceStatus=0x%x \n"
 -				, acb->pci_unit, target, lun 
 -				,srb->arcmsr_cdb.DeviceStatus);
 +			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;
  			srb->pccb->ccb_h.status |= CAM_UNCOR_PARITY;
  			/*unknow error or crc error just for retry*/
 @@ -687,29 +750,34 @@ static void arcmsr_report_srb_state(stru
  **************************************************************************
  **************************************************************************
  */
 -static void arcmsr_drain_donequeue(struct AdapterControlBlock *acb, u_int32_t flag_srb)
 +static void arcmsr_drain_donequeue(struct AdapterControlBlock *acb, u_int32_t flag_srb, u_int16_t error)
  {
  	struct CommandControlBlock *srb;
  	
  	/* check if command done with no error*/
 -	srb=(struct CommandControlBlock *)
 -		(acb->vir2phy_offset+(flag_srb << 5));/*frame must be 32 bytes aligned*/
 +	switch (acb->adapter_type) {
 +	case ACB_ADAPTER_TYPE_C:
 +		srb = (struct CommandControlBlock *)(acb->vir2phy_offset+(flag_srb & 0xFFFFFFF0));/*frame must be 32 bytes aligned*/
 +		break;
 +	case ACB_ADAPTER_TYPE_A:
 +	case ACB_ADAPTER_TYPE_B:
 +	default:
 +		srb = (struct CommandControlBlock *)(acb->vir2phy_offset+(flag_srb << 5));/*frame must be 32 bytes aligned*/
 +		break;
 +	}
  	if((srb->acb!=acb) || (srb->startdone!=ARCMSR_SRB_START)) {
  		if(srb->startdone==ARCMSR_SRB_ABORTED) {
 -			printf("arcmsr%d: srb='%p' isr got aborted command \n"
 -				, acb->pci_unit, srb);
 +			printf("arcmsr%d: srb='%p' isr got aborted command \n", acb->pci_unit, srb);
  			srb->pccb->ccb_h.status |= CAM_REQ_ABORTED;
  			arcmsr_srb_complete(srb, 1);
  			return;
  		}
  		printf("arcmsr%d: isr get an illegal srb command done"
 -			"acb='%p' srb='%p' srbacb='%p' startdone=0x%x"
 -			"srboutstandingcount=%d \n",
 -			acb->pci_unit, acb, srb, srb->acb,
 -			srb->startdone, acb->srboutstandingcount);
 +			"acb='%p' srb='%p' srbacb='%p' startdone=0x%xsrboutstandingcount=%d \n",
 +			acb->pci_unit, acb, srb, srb->acb,srb->startdone, acb->srboutstandingcount);
  		return;
  	}
 -	arcmsr_report_srb_state(acb, srb, flag_srb);
 +	arcmsr_report_srb_state(acb, srb, error);
  	return;
  }
  /*
 @@ -720,20 +788,18 @@ static void arcmsr_done4abort_postqueue(
  {
  	int i=0;
  	u_int32_t flag_srb;
 +	u_int16_t error;
  	
  	switch (acb->adapter_type) {
  	case ACB_ADAPTER_TYPE_A: {
  			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;
 -			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)) {
 -				arcmsr_drain_donequeue(acb, flag_srb);
 +			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;
 +				arcmsr_drain_donequeue(acb, flag_srb, error);
  			}
  		}
  		break;
 @@ -741,13 +807,12 @@ static void arcmsr_done4abort_postqueue(
  			struct HBB_MessageUnit *phbbmu=(struct HBB_MessageUnit *)acb->pmu;
  	
  			/*clear all outbound posted Q*/
 -			CHIP_REG_WRITE32(HBB_DOORBELL, 
 -			0, iop2drv_doorbell, 
 -			ARCMSR_DOORBELL_INT_CLEAR_PATTERN); /* clear doorbell interrupt */
 +			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;
 -					arcmsr_drain_donequeue(acb, flag_srb);
 +                	error=(flag_srb & ARCMSR_SRBREPLY_FLAG_ERROR_MODE0)?TRUE:FALSE;
 +					arcmsr_drain_donequeue(acb, flag_srb, error);
  				}
  				phbbmu->post_qbuffer[i]=0;
  			}/*drain reply FIFO*/
 @@ -755,6 +820,15 @@ static void arcmsr_done4abort_postqueue(
  			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;
 +				arcmsr_drain_donequeue(acb, flag_srb, error);
 +			}
 +		}
 +		break;
  	}
  	return;
  }
 @@ -873,7 +947,10 @@ static void arcmsr_build_srb(struct Comm
  		if( arccdbsize > 256) {
  			arcmsr_cdb->Flags|=ARCMSR_CDB_FLAG_SGL_BSIZE;
  		}
 +	} else {
 +		arcmsr_cdb->DataLength = 0;
  	}
 +    srb->arc_cdb_size=arccdbsize;
  	return;
  }
  /*
 @@ -885,19 +962,16 @@ static void arcmsr_post_srb(struct Adapt
  	u_int32_t cdb_shifted_phyaddr=(u_int32_t) srb->cdb_shifted_phyaddr;
  	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);
 +	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->startdone=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_shifted_phyaddr|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_shifted_phyaddr);
  			}
  		}
  		break;
 @@ -909,17 +983,32 @@ static void arcmsr_post_srb(struct Adapt
  			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_shifted_phyaddr|ARCMSR_SRBPOST_FLAG_SGL_BSIZE;
  			} else {
 -				phbbmu->post_qbuffer[index]=
 -					cdb_shifted_phyaddr;
 +				phbbmu->post_qbuffer[index]= cdb_shifted_phyaddr;
  			}
  			index++;
  			index %= ARCMSR_MAX_HBB_POSTQUEUE;     /*if last index number set it to 0 */
  			phbbmu->postq_index=index;
 -			CHIP_REG_WRITE32(HBB_DOORBELL, 
 -			0, drv2iop_doorbell, ARCMSR_DRV2IOP_CDB_POSTED);
 +			CHIP_REG_WRITE32(HBB_DOORBELL, 0, drv2iop_doorbell, ARCMSR_DRV2IOP_CDB_POSTED);
 +		}
 +		break;
 +    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);
 +			cdb_phyaddr_hi32 = acb->srb_phyaddr.B.phyadd_high;
 +            if(cdb_phyaddr_hi32)
 +            {
 +			    CHIP_REG_WRITE32(HBC_MessageUnit,0,inbound_queueport_high, cdb_phyaddr_hi32);
 +			    CHIP_REG_WRITE32(HBC_MessageUnit,0,inbound_queueport_low, ccb_post_stamp);
 +            }
 +            else
 +            {
 +			    CHIP_REG_WRITE32(HBC_MessageUnit,0,inbound_queueport_low, ccb_post_stamp);
 +            }
  		}
  		break;
  	}
 @@ -946,6 +1035,12 @@ static struct QBUFFER * arcmsr_get_iop_r
  			qbuffer=(struct QBUFFER *)&phbbmu->hbb_rwbuffer->message_rbuffer;
  		}
  		break;
 +	case ACB_ADAPTER_TYPE_C: {
 +			struct HBC_MessageUnit *phbcmu=(struct HBC_MessageUnit *)acb->pmu;
 +	
 +			qbuffer=(struct QBUFFER *)&phbcmu->message_rbuffer;
 +		}
 +		break;
  	}
  	return(qbuffer);
  }
 @@ -970,6 +1065,12 @@ static struct QBUFFER * arcmsr_get_iop_w
  			qbuffer=(struct QBUFFER *)&phbbmu->hbb_rwbuffer->message_wbuffer;
  		}
  		break;
 +	case ACB_ADAPTER_TYPE_C: {
 +			struct HBC_MessageUnit *phbcmu=(struct HBC_MessageUnit *)acb->pmu;
 +	
 +			qbuffer=(struct QBUFFER *)&phbcmu->message_wbuffer;
 +		}
 +		break;
  	}
  	return(qbuffer);
  }
 @@ -982,16 +1083,18 @@ static void arcmsr_iop_message_read(stru
  	switch (acb->adapter_type) {
  	case ACB_ADAPTER_TYPE_A: {
  			/* let IOP know data has been read */
 -			CHIP_REG_WRITE32(HBA_MessageUnit, 
 -			0, inbound_doorbell, ARCMSR_INBOUND_DRIVER_DATA_READ_OK);
 +			CHIP_REG_WRITE32(HBA_MessageUnit, 0, inbound_doorbell, ARCMSR_INBOUND_DRIVER_DATA_READ_OK);
  		}
  		break;
  	case ACB_ADAPTER_TYPE_B: {
  			/* let IOP know data has been read */
 -			CHIP_REG_WRITE32(HBB_DOORBELL, 
 -			0, drv2iop_doorbell, ARCMSR_DRV2IOP_DATA_READ_OK);
 +			CHIP_REG_WRITE32(HBB_DOORBELL, 0, drv2iop_doorbell, ARCMSR_DRV2IOP_DATA_READ_OK);
  		}
  		break;
 +	case ACB_ADAPTER_TYPE_C: {
 +			/* let IOP know data has been read */
 +			CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_doorbell, ARCMSR_HBCMU_DRV2IOP_DATA_READ_OK);
 +		}
  	}
  	return;
  }
 @@ -1007,8 +1110,7 @@ static void arcmsr_iop_message_wrote(str
  			** push inbound doorbell tell iop, driver data write ok 
  			** and wait reply on next hwinterrupt for next Qbuffer post
  			*/
 -			CHIP_REG_WRITE32(HBA_MessageUnit, 
 -			0, inbound_doorbell, ARCMSR_INBOUND_DRIVER_DATA_WRITE_OK);
 +			CHIP_REG_WRITE32(HBA_MessageUnit, 0, inbound_doorbell, ARCMSR_INBOUND_DRIVER_DATA_WRITE_OK);
  		}
  		break;
  	case ACB_ADAPTER_TYPE_B: {
 @@ -1016,8 +1118,15 @@ static void arcmsr_iop_message_wrote(str
  			** push inbound doorbell tell iop, driver data write ok 
  			** and wait reply on next hwinterrupt for next Qbuffer post
  			*/
 -			CHIP_REG_WRITE32(HBB_DOORBELL, 
 -			0, drv2iop_doorbell, ARCMSR_DRV2IOP_DATA_WRITE_OK);
 +			CHIP_REG_WRITE32(HBB_DOORBELL, 0, drv2iop_doorbell, ARCMSR_DRV2IOP_DATA_WRITE_OK);
 +		}
 +		break;
 +	case ACB_ADAPTER_TYPE_C: {
 +			/*
 +			** push inbound doorbell tell iop, driver data write ok 
 +			** and wait reply on next hwinterrupt for next Qbuffer post
 +			*/
 +			CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_doorbell, ARCMSR_HBCMU_DRV2IOP_DATA_WRITE_OK);
  		}
  		break;
  	}
 @@ -1064,7 +1173,7 @@ static void arcmsr_stop_hba_bgrb(struct 
  	CHIP_REG_WRITE32(HBA_MessageUnit, 
  	0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_STOP_BGRB);
  	if(!arcmsr_hba_wait_msgint_ready(acb)) {
 -		printf("arcmsr%d: wait 'stop adapter rebulid' timeout \n"
 +		printf("arcmsr%d: wait 'stop adapter background rebulid' timeout \n"
  			, acb->pci_unit);
  	}
  	return;
 @@ -1079,7 +1188,7 @@ static void arcmsr_stop_hbb_bgrb(struct 
  	CHIP_REG_WRITE32(HBB_DOORBELL, 
  	0, drv2iop_doorbell, ARCMSR_MESSAGE_STOP_BGRB);
  	if(!arcmsr_hbb_wait_msgint_ready(acb)) {
 -		printf( "arcmsr%d: wait 'stop adapter rebulid' timeout \n"
 +		printf( "arcmsr%d: wait 'stop adapter background rebulid' timeout \n"
  			, acb->pci_unit);
  	}
  	return;
 @@ -1088,6 +1197,20 @@ static void arcmsr_stop_hbb_bgrb(struct 
  ************************************************************************
  ************************************************************************
  */
 +static void arcmsr_stop_hbc_bgrb(struct AdapterControlBlock *acb)
 +{
 +	acb->acb_flags &=~ACB_F_MSG_START_BGRB;
 +	CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_STOP_BGRB);
 +	CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_doorbell,ARCMSR_HBCMU_DRV2IOP_MESSAGE_CMD_DONE);
 +	if(!arcmsr_hbc_wait_msgint_ready(acb)) {
 +		printf("arcmsr%d: wait 'stop adapter background rebulid' timeout \n", acb->pci_unit);
 +	}
 +	return;
 +}
 +/*
 +************************************************************************
 +************************************************************************
 +*/
  static void arcmsr_stop_adapter_bgrb(struct AdapterControlBlock *acb)
  {
  	switch (acb->adapter_type) {
 @@ -1099,6 +1222,10 @@ static void arcmsr_stop_adapter_bgrb(str
  			arcmsr_stop_hbb_bgrb(acb);
  		}
  		break;
 +	case ACB_ADAPTER_TYPE_C: {
 +			arcmsr_stop_hbc_bgrb(acb);
 +		}
 +		break;
  	}
  	return;
  }
 @@ -1121,18 +1248,6 @@ static void arcmsr_poll(struct cam_sim *
  	return;
  }
  /*
 -**********************************************************************
 -**********************************************************************
 -*/
 -static void arcmsr_intr_handler(void *arg)
 -{
 -	struct AdapterControlBlock *acb=(struct AdapterControlBlock *)arg;
 -	
 -	ARCMSR_LOCK_ACQUIRE(&acb->qbuffer_lock);
 -	arcmsr_interrupt(acb);
 -	ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock);
 -}
 -/*
  **************************************************************************
  **************************************************************************
  */
 @@ -1210,6 +1325,187 @@ static void arcmsr_iop2drv_data_read_han
  	}
  	return;
  }
 +
 +static void arcmsr_rescanLun_cb(struct cam_periph *periph, union ccb *ccb)
 +{
 +/*
 +	if (ccb->ccb_h.status != CAM_REQ_CMP)
 +		printf("arcmsr_rescanLun_cb: Rescan Target=%x, lun=%x, failure status=%x\n",ccb->ccb_h.target_id,ccb->ccb_h.target_lun,ccb->ccb_h.status);
 +	else
 +		printf("arcmsr_rescanLun_cb: Rescan lun successfully!\n");
 +*/
 +	xpt_free_path(ccb->ccb_h.path);
 +	xpt_free_ccb(ccb);
 +}
 +
 +static void	arcmsr_rescan_lun(struct AdapterControlBlock *acb, int target, int lun)
 +{
 +	struct cam_path     *path;
 +	union ccb           *ccb;
 +
 +	if ((ccb = (union ccb *)xpt_alloc_ccb_nowait()) == NULL)
 + 		return;
 +	if (xpt_create_path(&path, xpt_periph, cam_sim_path(acb->psim), target, lun) != CAM_REQ_CMP)
 +	{
 +		xpt_free_ccb(ccb);
 +		return;
 +	}
 +/*	printf("arcmsr_rescan_lun: Rescan Target=%x, Lun=%x\n", target, lun); */
 +	bzero(ccb, sizeof(union ccb));
 +	xpt_setup_ccb(&ccb->ccb_h, path, 5);
 +	ccb->ccb_h.func_code = XPT_SCAN_LUN;
 +	ccb->ccb_h.cbfcnp = arcmsr_rescanLun_cb;
 +	ccb->crcn.flags = CAM_FLAG_NONE;
 +	xpt_action(ccb);
 +	return;
 +}
 +
 +
 +static void arcmsr_abort_dr_ccbs(struct AdapterControlBlock *acb, int target, int lun)
 +{
 +   	struct CommandControlBlock *srb;
 +	u_int32_t intmask_org;
 +   	int i;
 +
 +	ARCMSR_LOCK_ACQUIRE(&acb->qbuffer_lock);
 +	/* disable all outbound interrupts */
 +	intmask_org = arcmsr_disable_allintr(acb);
 +	for (i = 0; i < ARCMSR_MAX_FREESRB_NUM; i++)
 +	{
 +		srb = acb->psrb_pool[i];
 +		if (srb->startdone == ARCMSR_SRB_START)
 +		{
 +           	if((target == srb->pccb->ccb_h.target_id) && (lun == srb->pccb->ccb_h.target_lun))
 +            {
 +		    	srb->startdone = ARCMSR_SRB_ABORTED;
 +				srb->pccb->ccb_h.status |= CAM_REQ_ABORTED;
 +		    	arcmsr_srb_complete(srb, 1);
 +       		}
 +		}
 +	}
 +	/* enable outbound Post Queue, outbound doorbell Interrupt */
 +	arcmsr_enable_allintr(acb, intmask_org);
 +	ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock);
 +}
 +
 +
 +/*
 +**************************************************************************
 +**************************************************************************
 +*/
 +static void arcmsr_dr_handle(struct AdapterControlBlock *acb) {
 +	u_int32_t	devicemap;
 +	u_int32_t	target, lun;
 +    u_int32_t	deviceMapCurrent[4]={0};
 +    u_int8_t	*pDevMap;
 +
 +	switch (acb->adapter_type) {
 +	case ACB_ADAPTER_TYPE_A:
 +			devicemap = offsetof(struct HBA_MessageUnit, msgcode_rwbuffer[ARCMSR_FW_DEVMAP_OFFSET]);
 +			for (target= 0; target < 4; target++) 
 +			{
 +            	deviceMapCurrent[target]=bus_space_read_4(acb->btag[0], acb->bhandle[0],  devicemap);
 +            	devicemap += 4;
 +			}
 +			break;
 +
 +	case ACB_ADAPTER_TYPE_B:
 +			devicemap = offsetof(struct HBB_RWBUFFER, msgcode_rwbuffer[ARCMSR_FW_DEVMAP_OFFSET]);
 +			for (target= 0; target < 4; target++) 
 +			{
 +            	deviceMapCurrent[target]=bus_space_read_4(acb->btag[1], acb->bhandle[1],  devicemap);
 +            	devicemap += 4;
 +			}
 +			break;
 +
 +	case ACB_ADAPTER_TYPE_C:
 +			devicemap = offsetof(struct HBC_MessageUnit, msgcode_rwbuffer[ARCMSR_FW_DEVMAP_OFFSET]);
 +			for (target= 0; target < 4; target++) 
 +			{
 +            	deviceMapCurrent[target]=bus_space_read_4(acb->btag[0], acb->bhandle[0],  devicemap);
 +            	devicemap += 4;
 +			}
 +			break;
 +	}
 +		if(acb->acb_flags & ACB_F_BUS_HANG_ON)
 +		{
 +			acb->acb_flags &= ~ACB_F_BUS_HANG_ON;
 +		}
 +		/* 
 +		** adapter posted CONFIG message 
 +		** copy the new map, note if there are differences with the current map
 +		*/
 +		pDevMap = (u_int8_t	*)&deviceMapCurrent[0];
 +		for (target= 0; target < ARCMSR_MAX_TARGETID - 1; target++) 
 +		{
 +			if (*pDevMap != acb->device_map[target])
 +			{
 +                u_int8_t difference, bit_check;
 +
 +                difference= *pDevMap ^ acb->device_map[target];
 +                for(lun=0; lun < ARCMSR_MAX_TARGETLUN; lun++)
 +                {
 +                    bit_check=(1 << lun);						/*check bit from 0....31*/
 +                    if(difference & bit_check)
 +                    {
 +                        if(acb->device_map[target] & bit_check)
 +                        {/* unit departed */
 +							printf("arcmsr_dr_handle: Target=%x, lun=%x, GONE!!!\n",target,lun);
 + 							arcmsr_abort_dr_ccbs(acb, target, lun);
 +                        	arcmsr_rescan_lun(acb, target, lun);
 +        					acb->devstate[target][lun] = ARECA_RAID_GONE;
 +                        }
 +                        else
 +                        {/* unit arrived */
 +							printf("arcmsr_dr_handle: Target=%x, lun=%x, ARRIVING!!!\n",target,lun);
 +                        	arcmsr_rescan_lun(acb, target, lun);
 +        					acb->devstate[target][lun] = ARECA_RAID_GOOD;
 +                        }
 +                    }
 +                }
 +/*				printf("arcmsr_dr_handle: acb->device_map[%x]=0x%x, deviceMapCurrent[%x]=%x\n",target,acb->device_map[target],target,*pDevMap); */
 +				acb->device_map[target]= *pDevMap;
 +			}
 +			pDevMap++;
 +		}
 +}
 +/*
 +**************************************************************************
 +**************************************************************************
 +*/
 +static void arcmsr_hba_message_isr(struct AdapterControlBlock *acb) {
 +	u_int32_t outbound_message;
 +
 +	CHIP_REG_WRITE32(HBA_MessageUnit, 0, outbound_intstatus, ARCMSR_MU_OUTBOUND_MESSAGE0_INT);
 +	outbound_message = CHIP_REG_READ32(HBA_MessageUnit, 0, msgcode_rwbuffer[0]);
 +	if (outbound_message == ARCMSR_SIGNATURE_GET_CONFIG)
 +		arcmsr_dr_handle( acb );
 +}
 +/*
 +**************************************************************************
 +**************************************************************************
 +*/
 +static void arcmsr_hbb_message_isr(struct AdapterControlBlock *acb) {
 +	u_int32_t outbound_message;
 +
 +	/* clear interrupts */
 +	CHIP_REG_WRITE32(HBB_DOORBELL, 0, iop2drv_doorbell, ARCMSR_MESSAGE_INT_CLEAR_PATTERN);
 +	outbound_message = CHIP_REG_READ32(HBB_RWBUFFER, 1, msgcode_rwbuffer[0]);
 +	if (outbound_message == ARCMSR_SIGNATURE_GET_CONFIG)
 +		arcmsr_dr_handle( acb );
 +}
 +/*
 +**************************************************************************
 +**************************************************************************
 +*/
 +static void arcmsr_hbc_message_isr(struct AdapterControlBlock *acb) {
 +	u_int32_t outbound_message;
 +
 +	CHIP_REG_WRITE32(HBC_MessageUnit, 0, outbound_doorbell_clear, ARCMSR_HBCMU_IOP2DRV_MESSAGE_CMD_DONE_DOORBELL_CLEAR);
 +	outbound_message = CHIP_REG_READ32(HBC_MessageUnit, 0, msgcode_rwbuffer[0]);
 +	if (outbound_message == ARCMSR_SIGNATURE_GET_CONFIG)
 +		arcmsr_dr_handle( acb );
 +}
  /*
  **************************************************************************
  **************************************************************************
 @@ -1241,9 +1537,38 @@ static void arcmsr_hba_doorbell_isr(stru
  **************************************************************************
  **************************************************************************
  */
 +static void arcmsr_hbc_doorbell_isr(struct AdapterControlBlock *acb)
 +{
 +	u_int32_t outbound_doorbell;
 +	
 +	/*
 +	*******************************************************************
 +	**  Maybe here we need to check wrqbuffer_lock is lock or not
 +	**  DOORBELL: din! don! 
 +	**  check if there are any mail need to pack from firmware
 +	*******************************************************************
 +	*/
 +	outbound_doorbell=CHIP_REG_READ32(HBC_MessageUnit, 0, outbound_doorbell);
 +	CHIP_REG_WRITE32(HBC_MessageUnit, 0, outbound_doorbell_clear, outbound_doorbell); /* clear doorbell interrupt */
 +	if(outbound_doorbell & ARCMSR_HBCMU_IOP2DRV_DATA_WRITE_OK) {
 +		arcmsr_iop2drv_data_wrote_handle(acb);
 +	}
 +	if(outbound_doorbell & ARCMSR_HBCMU_IOP2DRV_DATA_READ_OK) {
 +		arcmsr_iop2drv_data_read_handle(acb);
 +	}
 +	if(outbound_doorbell & ARCMSR_HBCMU_IOP2DRV_MESSAGE_CMD_DONE) {
 +		arcmsr_hbc_message_isr(acb);    /* messenger of "driver to iop commands" */
 +	}
 +	return;
 +}
 +/*
 +**************************************************************************
 +**************************************************************************
 +*/
  static void arcmsr_hba_postqueue_isr(struct AdapterControlBlock *acb)
  {
  	u_int32_t flag_srb;
 +	u_int16_t error;
  	
  	/*
  	*****************************************************************************
 @@ -1255,7 +1580,8 @@ static void arcmsr_hba_postqueue_isr(str
  	while((flag_srb=CHIP_REG_READ32(HBA_MessageUnit, 
  		0, outbound_queueport)) != 0xFFFFFFFF) {
  		/* check if command done with no error*/
 -		arcmsr_drain_donequeue(acb, flag_srb);
 +        error=(flag_srb & ARCMSR_SRBREPLY_FLAG_ERROR_MODE0)?TRUE:FALSE;
 +		arcmsr_drain_donequeue(acb, flag_srb, error);
  	}	/*drain reply FIFO*/
  	return;
  }
 @@ -1268,6 +1594,7 @@ static void arcmsr_hbb_postqueue_isr(str
  	struct HBB_MessageUnit *phbbmu=(struct HBB_MessageUnit *)acb->pmu;
  	u_int32_t flag_srb;
  	int index;
 +	u_int16_t error;
  	
  	/*
  	*****************************************************************************
 @@ -1283,7 +1610,38 @@ static void arcmsr_hbb_postqueue_isr(str
  		index %= ARCMSR_MAX_HBB_POSTQUEUE;     /*if last index number set it to 0 */
  		phbbmu->doneq_index=index;
  		/* check if command done with no error*/
 -		arcmsr_drain_donequeue(acb, flag_srb);
 +        error=(flag_srb & ARCMSR_SRBREPLY_FLAG_ERROR_MODE0)?TRUE:FALSE;
 +		arcmsr_drain_donequeue(acb, flag_srb, error);
 +	}	/*drain reply FIFO*/
 +	return;
 +}
 +/*
 +**************************************************************************
 +**************************************************************************
 +*/
 +static void arcmsr_hbc_postqueue_isr(struct AdapterControlBlock *acb)
 +{
 +	u_int32_t flag_srb,throttling=0;
 +	u_int16_t error;
 +	
 +	/*
 +	*****************************************************************************
 +	**               areca cdb command done
 +	*****************************************************************************
 +	*/
 +	bus_dmamap_sync(acb->srb_dmat, acb->srb_dmamap, BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
 +		
 +	while(CHIP_REG_READ32(HBC_MessageUnit, 0, host_int_status) & ARCMSR_HBCMU_OUTBOUND_POSTQUEUE_ISR) {
 +		
 +		flag_srb=CHIP_REG_READ32(HBC_MessageUnit, 0, outbound_queueport_low);
 +		/* check if command done with no error*/
 +        error=(flag_srb & ARCMSR_SRBREPLY_FLAG_ERROR_MODE1)?TRUE:FALSE;
 +		arcmsr_drain_donequeue(acb, flag_srb, error);
 +        if(throttling==ARCMSR_HBC_ISR_THROTTLING_LEVEL) {
 +            CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_doorbell,ARCMSR_HBCMU_DRV2IOP_POSTQUEUE_THROTTLING);
 +            break;
 +        }
 +        throttling++;
  	}	/*drain reply FIFO*/
  	return;
  }
 @@ -1299,14 +1657,12 @@ static void arcmsr_handle_hba_isr( struc
  	**   check outbound intstatus 
  	*********************************************
  	*/
 -	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;
  	if(!outbound_intstatus) {
  		/*it must be share irq*/
  		return;
  	}
 -	CHIP_REG_WRITE32(HBA_MessageUnit, 
 -	0, outbound_intstatus, outbound_intstatus);/*clear interrupt*/
 +	CHIP_REG_WRITE32(HBA_MessageUnit, 0, outbound_intstatus, outbound_intstatus);/*clear interrupt*/
  	/* MU doorbell interrupts*/
  	if(outbound_intstatus & ARCMSR_MU_OUTBOUND_DOORBELL_INT) {
  		arcmsr_hba_doorbell_isr(acb);
 @@ -1315,6 +1671,9 @@ static void arcmsr_handle_hba_isr( struc
  	if(outbound_intstatus & ARCMSR_MU_OUTBOUND_POSTQUEUE_INT) {
  		arcmsr_hba_postqueue_isr(acb);
  	}
 +	if(outbound_intstatus & ARCMSR_MU_OUTBOUND_MESSAGE0_INT) {
 +		arcmsr_hba_message_isr(acb);
 +	}
  	return;
  }
  /*
 @@ -1348,6 +1707,36 @@ static void arcmsr_handle_hbb_isr( struc
  	if(outbound_doorbell & ARCMSR_IOP2DRV_CDB_DONE) {
 
 *** 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-unsubscribe@freebsd.org"
 
State-Changed-From-To: feedback->patched 
State-Changed-By: delphij 
State-Changed-When: Wed Jul 21 20:35:59 UTC 2010 
State-Changed-Why:  
Driver update applied against -HEAD. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=148502 

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: kern/148502: commit references a PR
Date: Wed,  4 Aug 2010 01:34:49 +0000 (UTC)

 Author: delphij
 Date: Wed Aug  4 01:34:35 2010
 New Revision: 210835
 URL: http://svn.freebsd.org/changeset/base/210835
 
 Log:
   MFC r210358:
   
   Apply vendor version 1.20.00.17.
   
   This version adds support for ARC1880; additionally this version fixed
   an issue where all devices on a SAS port gets offlined when any device
   failed on the port [1].
   
   Many thanks to Areca for continuing to support FreeBSD.
   
   PR:		kern/148502 [1]
   Submitted by:	Ching-Lung Huang <ching2048 areca com tw>
   Obtained from:	Areca
   Tested by:	Rich Ercolani <rercola acm jhu edu> [1]
 
 Modified:
   stable/7/sys/dev/arcmsr/arcmsr.c
   stable/7/sys/dev/arcmsr/arcmsr.h
 Directory Properties:
   stable/7/sys/   (props changed)
   stable/7/sys/cddl/contrib/opensolaris/   (props changed)
   stable/7/sys/contrib/dev/acpica/   (props changed)
   stable/7/sys/contrib/pf/   (props changed)
 
 Modified: stable/7/sys/dev/arcmsr/arcmsr.c
 ==============================================================================
 --- stable/7/sys/dev/arcmsr/arcmsr.c	Wed Aug  4 01:19:11 2010	(r210834)
 +++ stable/7/sys/dev/arcmsr/arcmsr.c	Wed Aug  4 01:34:35 2010	(r210835)
 @@ -2,15 +2,15 @@
  *****************************************************************************************
  **        O.S   : FreeBSD
  **   FILE NAME  : arcmsr.c
 -**        BY    : Erich Chen   
 +**        BY    : Erich Chen, Ching Huang
  **   Description: SCSI RAID Device Driver for 
 -**                ARECA (ARC11XX/ARC12XX/ARC13XX/ARC16XX) SATA/SAS RAID HOST Adapter
 +**                ARECA (ARC11XX/ARC12XX/ARC13XX/ARC16XX/ARC188x) SATA/SAS RAID HOST Adapter
  **                ARCMSR RAID Host adapter
  **                [RAID controller:INTEL 331(PCI-X) 341(PCI-EXPRESS) chip set]
  ******************************************************************************************
  ************************************************************************
  **
 -** Copyright (c) 2004-2006 ARECA Co. Ltd.
 +** Copyright (c) 2004-2010 ARECA Co. Ltd.
  **        Erich Chen, Taipei Taiwan All rights reserved.
  **
  ** Redistribution and use in source and binary forms, with or without
 @@ -57,6 +57,10 @@
  **     1.20.00.15   10/10/2007         Erich Chen        support new RAID adapter type ARC120x
  **     1.20.00.16   10/10/2009         Erich Chen        Bug fix for RAID adapter type ARC120x
  **                                                       bus_dmamem_alloc() with BUS_DMA_ZERO
 +**     1.20.00.17   07/15/2010         Ching Huang       Added support ARC1880
 +**							 report CAM_DEV_NOT_THERE instead of CAM_SEL_TIMEOUT when device failed,
 +**							 prevent cam_periph_error removing all LUN devices of one Target id
 +**							 for any one LUN device failed
  ******************************************************************************************
  * $FreeBSD$
  */
 @@ -90,6 +94,8 @@
  #include <cam/cam.h>
  #include <cam/cam_ccb.h>
  #include <cam/cam_sim.h>
 +#include <cam/cam_periph.h>
 +#include <cam/cam_xpt_periph.h>
  #include <cam/cam_xpt_sim.h>
  #include <cam/cam_debug.h>
  #include <cam/scsi/scsi_all.h>
 @@ -165,6 +171,8 @@ static void arcmsr_build_srb(struct Comm
  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);
  /*
  **************************************************************************
  **************************************************************************
 @@ -191,7 +199,6 @@ static device_method_t arcmsr_methods[]=
  	DEVMETHOD(device_shutdown,	arcmsr_shutdown),
  	DEVMETHOD(device_suspend,	arcmsr_suspend),
  	DEVMETHOD(device_resume,	arcmsr_resume),
 -	
  	DEVMETHOD(bus_print_child,	bus_generic_print_child),
  	DEVMETHOD(bus_driver_added, 	bus_generic_driver_added),
  	{ 0, 0 }
 @@ -215,7 +222,7 @@ MODULE_DEPEND(arcmsr, cam, 1, 1, 1);
  	#ifndef D_VERSION
  		#define D_VERSION	0x20011966
  	#endif
 -	static struct cdevsw arcmsr_cdevsw={
 +static struct cdevsw arcmsr_cdevsw={
  	#if __FreeBSD_version > 502010
  		.d_version = D_VERSION, 
  	#endif
 @@ -228,7 +235,7 @@ MODULE_DEPEND(arcmsr, cam, 1, 1, 1);
  #else
  	#define ARCMSR_CDEV_MAJOR	180
  	
 -	static struct cdevsw arcmsr_cdevsw = {
 +static struct cdevsw arcmsr_cdevsw = {
  		arcmsr_open, 		        /* open     */
  		arcmsr_close, 		        /* close    */
  		noread, 		        /* read     */
 @@ -244,7 +251,10 @@ MODULE_DEPEND(arcmsr, cam, 1, 1, 1);
  		0				/* flags    */
  	};
  #endif
 -
 +/*
 +**************************************************************************
 +**************************************************************************
 +*/
  #if __FreeBSD_version < 500005
  	static int arcmsr_open(dev_t dev, int flags, int fmt, struct proc *proc)
  #else
 @@ -328,18 +338,21 @@ static u_int32_t arcmsr_disable_allintr(
  	switch (acb->adapter_type) {
  	case ACB_ADAPTER_TYPE_A: {
  			/* disable all outbound interrupt */
 -			intmask_org=CHIP_REG_READ32(HBA_MessageUnit, 
 -			0, outbound_intmask)|ARCMSR_MU_OUTBOUND_MESSAGE0_INTMASKENABLE; /* disable outbound message0 int */
 -			CHIP_REG_WRITE32(HBA_MessageUnit, 
 -			0, outbound_intmask, intmask_org|ARCMSR_MU_OUTBOUND_ALL_INTMASKENABLE);
 +			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, 
  			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 */
 +			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 */
 +			CHIP_REG_WRITE32(HBC_MessageUnit, 0, host_int_mask, intmask_org|ARCMSR_HBCMU_ALL_INTMASKENABLE);
  		}
  		break;
  	}
 @@ -356,19 +369,25 @@ 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);
 +			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: {
 -			/* disable ARCMSR_IOP2DRV_MESSAGE_CMD_DONE */
 -			mask=(ARCMSR_IOP2DRV_DATA_WRITE_OK|ARCMSR_IOP2DRV_DATA_READ_OK|ARCMSR_IOP2DRV_CDB_DONE);
 -			CHIP_REG_WRITE32(HBB_DOORBELL, 
 -			0, iop2drv_doorbell_mask, intmask_org | mask); /*1=interrupt enable, 0=interrupt disable*/
 +			/* 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);
 +			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);
 +			CHIP_REG_WRITE32(HBC_MessageUnit, 0, host_int_mask, intmask_org & mask);
 +			acb->outbound_int_enable= ~(intmask_org & mask) & 0x0000000f;
 +		}
 +		break;
  	}
  	return;
  }
 @@ -383,10 +402,8 @@ static u_int8_t arcmsr_hba_wait_msgint_r
  	
  	do {
  		for(Index=0; Index < 100; Index++) {
 -			if(CHIP_REG_READ32(HBA_MessageUnit, 
 -				0, outbound_intstatus) & ARCMSR_MU_OUTBOUND_MESSAGE0_INT) {
 -				CHIP_REG_WRITE32(HBA_MessageUnit, 
 -				0, outbound_intstatus, ARCMSR_MU_OUTBOUND_MESSAGE0_INT);/*clear interrupt*/
 +			if(CHIP_REG_READ32(HBA_MessageUnit, 0, outbound_intstatus) & ARCMSR_MU_OUTBOUND_MESSAGE0_INT) {
 +				CHIP_REG_WRITE32(HBA_MessageUnit, 0, outbound_intstatus, ARCMSR_MU_OUTBOUND_MESSAGE0_INT);/*clear interrupt*/
  				return TRUE;
  			}
  			UDELAY(10000);
 @@ -405,12 +422,29 @@ static u_int8_t arcmsr_hbb_wait_msgint_r
  	
  	do {
  		for(Index=0; Index < 100; Index++) {
 -			if(CHIP_REG_READ32(HBB_DOORBELL, 
 -				0, iop2drv_doorbell) & ARCMSR_IOP2DRV_MESSAGE_CMD_DONE) {
 -				CHIP_REG_WRITE32(HBB_DOORBELL, 
 -				0, iop2drv_doorbell, ARCMSR_MESSAGE_INT_CLEAR_PATTERN);/*clear interrupt*/
 -				CHIP_REG_WRITE32(HBB_DOORBELL, 
 -				0, drv2iop_doorbell, ARCMSR_DRV2IOP_END_OF_INTERRUPT);
 +			if(CHIP_REG_READ32(HBB_DOORBELL, 0, iop2drv_doorbell) & ARCMSR_IOP2DRV_MESSAGE_CMD_DONE) {
 +				CHIP_REG_WRITE32(HBB_DOORBELL, 0, iop2drv_doorbell, ARCMSR_MESSAGE_INT_CLEAR_PATTERN);/*clear interrupt*/
 +				CHIP_REG_WRITE32(HBB_DOORBELL, 0, drv2iop_doorbell, ARCMSR_DRV2IOP_END_OF_INTERRUPT);
 +				return TRUE;
 +			}
 +			UDELAY(10000);
 +		}/*max 1 seconds*/
 +	}while(Retries++ < 20);/*max 20 sec*/
 +	return FALSE;
 +}
 +/*
 +**********************************************************************
 +**********************************************************************
 +*/
 +static u_int8_t arcmsr_hbc_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(HBC_MessageUnit, 0, outbound_doorbell) & ARCMSR_HBCMU_IOP2DRV_MESSAGE_CMD_DONE) {
 +				CHIP_REG_WRITE32(HBC_MessageUnit, 0, outbound_doorbell_clear, ARCMSR_HBCMU_IOP2DRV_MESSAGE_CMD_DONE_DOORBELL_CLEAR);/*clear interrupt*/
  				return TRUE;
  			}
  			UDELAY(10000);
 @@ -426,8 +460,7 @@ static void arcmsr_flush_hba_cache(struc
  {
  	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);
 +	CHIP_REG_WRITE32(HBA_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_FLUSH_CACHE);
  	do {
  		if(arcmsr_hba_wait_msgint_ready(acb)) {
  			break;
 @@ -460,6 +493,25 @@ 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 */
 +	
 +	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);
 +	do {
 +		if(arcmsr_hbc_wait_msgint_ready(acb)) {
 +			break;
 +		} else {
 +			retry_count--;
 +		}
 +	}while(retry_count!=0);
 +	return;
 +}
 +/*
 +************************************************************************
 +************************************************************************
 +*/
  static void arcmsr_flush_adapter_cache(struct AdapterControlBlock *acb)
  {
  	switch (acb->adapter_type) {
 @@ -471,6 +523,10 @@ static void arcmsr_flush_adapter_cache(s
  			arcmsr_flush_hbb_cache(acb);
  		}
  		break;
 +	case ACB_ADAPTER_TYPE_C: {
 +			arcmsr_flush_hbc_cache(acb);
 +		}
 +		break;
  	}
  	return;
  }
 @@ -482,10 +538,10 @@ static int arcmsr_suspend(device_t dev)
  {
  	struct AdapterControlBlock	*acb = device_get_softc(dev);
  	
 -	/* disable all outbound interrupt */
 -	arcmsr_disable_allintr(acb);
  	/* flush controller */
  	arcmsr_iop_parking(acb);
 +	/* disable all outbound interrupt */
 +	arcmsr_disable_allintr(acb);
  	return(0);
  }
  /*
 @@ -515,12 +571,10 @@ static void arcmsr_async(void *cb_arg, u
  	case AC_LOST_DEVICE:
  		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)) {
 +		if((target_id > ARCMSR_MAX_TARGETID) || (target_lun > ARCMSR_MAX_TARGETLUN)) {
  			break;
  		}
 -		printf("%s:scsi id%d lun%d device lost \n"
 -			, device_get_name(acb->pci_dev), target_id, target_lun);
 +		printf("%s:scsi id=%d lun=%d device lost \n", device_get_name(acb->pci_dev), target_id, target_lun);
  		break;
  	default:
  		break;
 @@ -589,8 +643,7 @@ static void arcmsr_abort_hba_allcmd(stru
  {
  	CHIP_REG_WRITE32(HBA_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_ABORT_CMD);
  	if(!arcmsr_hba_wait_msgint_ready(acb)) {
 -		printf("arcmsr%d: wait 'abort all outstanding command' timeout \n"
 -			, acb->pci_unit);
 +		printf("arcmsr%d: wait 'abort all outstanding command' timeout \n", acb->pci_unit);
  	}
  	return;
  }
 @@ -602,8 +655,20 @@ static void arcmsr_abort_hbb_allcmd(stru
  {
  	CHIP_REG_WRITE32(HBB_DOORBELL, 0, drv2iop_doorbell, ARCMSR_MESSAGE_ABORT_CMD);
  	if(!arcmsr_hbb_wait_msgint_ready(acb)) {
 -		printf("arcmsr%d: wait 'abort all outstanding command' timeout \n"
 -			, acb->pci_unit);
 +		printf("arcmsr%d: wait 'abort all outstanding command' timeout \n", acb->pci_unit);
 +	}
 +	return;
 +}
 +/*
 +*********************************************************************
 +*********************************************************************
 +*/
 +static void arcmsr_abort_hbc_allcmd(struct AdapterControlBlock *acb)
 +{
 +	CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_ABORT_CMD);
 +	CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_doorbell, ARCMSR_HBCMU_DRV2IOP_MESSAGE_CMD_DONE);
 +	if(!arcmsr_hbc_wait_msgint_ready(acb)) {
 +		printf("arcmsr%d: wait 'abort all outstanding command' timeout \n", acb->pci_unit);
  	}
  	return;
  }
 @@ -622,6 +687,10 @@ static void arcmsr_abort_allcmd(struct A
  			arcmsr_abort_hbb_allcmd(acb);
  		}
  		break;
 +	case ACB_ADAPTER_TYPE_C: {
 +			arcmsr_abort_hbc_allcmd(acb);
 +		}
 +		break;
  	}
  	return;
  }
 @@ -629,14 +698,13 @@ static void arcmsr_abort_allcmd(struct A
  **************************************************************************
  **************************************************************************
  */
 -static void arcmsr_report_srb_state(struct AdapterControlBlock *acb, 
 -	struct CommandControlBlock *srb, u_int32_t flag_srb)
 +static void arcmsr_report_srb_state(struct AdapterControlBlock *acb, struct CommandControlBlock *srb, u_int16_t error)
  {
  	int target, lun;
  	
  	target=srb->pccb->ccb_h.target_id;
  	lun=srb->pccb->ccb_h.target_lun;
 -	if((flag_srb & ARCMSR_SRBREPLY_FLAG_ERROR)==0) {
 +	if(error == FALSE) {
  		if(acb->devstate[target][lun]==ARECA_RAID_GONE) {
  			acb->devstate[target][lun]=ARECA_RAID_GOOD;
  		}
 @@ -646,12 +714,10 @@ static void arcmsr_report_srb_state(stru
  		switch(srb->arcmsr_cdb.DeviceStatus) {
  		case ARCMSR_DEV_SELECT_TIMEOUT: {
  				if(acb->devstate[target][lun]==ARECA_RAID_GOOD) {
 -					printf( "arcmsr%d: select timeout"
 -						", raid volume was kicked out \n"
 -						, acb->pci_unit);
 +					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;
 -				srb->pccb->ccb_h.status |= CAM_SEL_TIMEOUT;
 +				srb->pccb->ccb_h.status |= CAM_DEV_NOT_THERE;
  				arcmsr_srb_complete(srb, 1);
  			}
  			break;
 @@ -669,11 +735,8 @@ static void arcmsr_report_srb_state(stru
  			}
  			break;
  		default:
 -			printf("arcmsr%d: scsi id=%d lun=%d"
 -				"isr get command error done,"
 -				"but got unknow DeviceStatus=0x%x \n"
 -				, acb->pci_unit, target, lun 
 -				,srb->arcmsr_cdb.DeviceStatus);
 +			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;
  			srb->pccb->ccb_h.status |= CAM_UNCOR_PARITY;
  			/*unknow error or crc error just for retry*/
 @@ -687,29 +750,34 @@ static void arcmsr_report_srb_state(stru
  **************************************************************************
  **************************************************************************
  */
 -static void arcmsr_drain_donequeue(struct AdapterControlBlock *acb, u_int32_t flag_srb)
 +static void arcmsr_drain_donequeue(struct AdapterControlBlock *acb, u_int32_t flag_srb, u_int16_t error)
  {
  	struct CommandControlBlock *srb;
  	
  	/* check if command done with no error*/
 -	srb=(struct CommandControlBlock *)
 -		(acb->vir2phy_offset+(flag_srb << 5));/*frame must be 32 bytes aligned*/
 +	switch (acb->adapter_type) {
 +	case ACB_ADAPTER_TYPE_C:
 +		srb = (struct CommandControlBlock *)(acb->vir2phy_offset+(flag_srb & 0xFFFFFFF0));/*frame must be 32 bytes aligned*/
 +		break;
 +	case ACB_ADAPTER_TYPE_A:
 +	case ACB_ADAPTER_TYPE_B:
 +	default:
 +		srb = (struct CommandControlBlock *)(acb->vir2phy_offset+(flag_srb << 5));/*frame must be 32 bytes aligned*/
 +		break;
 +	}
  	if((srb->acb!=acb) || (srb->startdone!=ARCMSR_SRB_START)) {
  		if(srb->startdone==ARCMSR_SRB_ABORTED) {
 -			printf("arcmsr%d: srb='%p' isr got aborted command \n"
 -				, acb->pci_unit, srb);
 +			printf("arcmsr%d: srb='%p' isr got aborted command \n", acb->pci_unit, srb);
  			srb->pccb->ccb_h.status |= CAM_REQ_ABORTED;
  			arcmsr_srb_complete(srb, 1);
  			return;
  		}
  		printf("arcmsr%d: isr get an illegal srb command done"
 -			"acb='%p' srb='%p' srbacb='%p' startdone=0x%x"
 -			"srboutstandingcount=%d \n",
 -			acb->pci_unit, acb, srb, srb->acb,
 -			srb->startdone, acb->srboutstandingcount);
 +			"acb='%p' srb='%p' srbacb='%p' startdone=0x%xsrboutstandingcount=%d \n",
 +			acb->pci_unit, acb, srb, srb->acb,srb->startdone, acb->srboutstandingcount);
  		return;
  	}
 -	arcmsr_report_srb_state(acb, srb, flag_srb);
 +	arcmsr_report_srb_state(acb, srb, error);
  	return;
  }
  /*
 @@ -720,20 +788,18 @@ static void arcmsr_done4abort_postqueue(
  {
  	int i=0;
  	u_int32_t flag_srb;
 +	u_int16_t error;
  	
  	switch (acb->adapter_type) {
  	case ACB_ADAPTER_TYPE_A: {
  			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;
 -			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)) {
 -				arcmsr_drain_donequeue(acb, flag_srb);
 +			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;
 +				arcmsr_drain_donequeue(acb, flag_srb, error);
  			}
  		}
  		break;
 @@ -741,13 +807,12 @@ static void arcmsr_done4abort_postqueue(
  			struct HBB_MessageUnit *phbbmu=(struct HBB_MessageUnit *)acb->pmu;
  	
  			/*clear all outbound posted Q*/
 -			CHIP_REG_WRITE32(HBB_DOORBELL, 
 -			0, iop2drv_doorbell, 
 -			ARCMSR_DOORBELL_INT_CLEAR_PATTERN); /* clear doorbell interrupt */
 +			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;
 -					arcmsr_drain_donequeue(acb, flag_srb);
 +                	error=(flag_srb & ARCMSR_SRBREPLY_FLAG_ERROR_MODE0)?TRUE:FALSE;
 +					arcmsr_drain_donequeue(acb, flag_srb, error);
  				}
  				phbbmu->post_qbuffer[i]=0;
  			}/*drain reply FIFO*/
 @@ -755,6 +820,15 @@ static void arcmsr_done4abort_postqueue(
  			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;
 +				arcmsr_drain_donequeue(acb, flag_srb, error);
 +			}
 +		}
 +		break;
  	}
  	return;
  }
 @@ -873,7 +947,10 @@ static void arcmsr_build_srb(struct Comm
  		if( arccdbsize > 256) {
  			arcmsr_cdb->Flags|=ARCMSR_CDB_FLAG_SGL_BSIZE;
  		}
 +	} else {
 +		arcmsr_cdb->DataLength = 0;
  	}
 +    srb->arc_cdb_size=arccdbsize;
  	return;
  }
  /*
 @@ -885,19 +962,16 @@ static void arcmsr_post_srb(struct Adapt
  	u_int32_t cdb_shifted_phyaddr=(u_int32_t) srb->cdb_shifted_phyaddr;
  	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);
 +	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->startdone=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_shifted_phyaddr|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_shifted_phyaddr);
  			}
  		}
  		break;
 @@ -909,17 +983,32 @@ static void arcmsr_post_srb(struct Adapt
  			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_shifted_phyaddr|ARCMSR_SRBPOST_FLAG_SGL_BSIZE;
  			} else {
 -				phbbmu->post_qbuffer[index]=
 -					cdb_shifted_phyaddr;
 +				phbbmu->post_qbuffer[index]= cdb_shifted_phyaddr;
  			}
  			index++;
  			index %= ARCMSR_MAX_HBB_POSTQUEUE;     /*if last index number set it to 0 */
  			phbbmu->postq_index=index;
 -			CHIP_REG_WRITE32(HBB_DOORBELL, 
 -			0, drv2iop_doorbell, ARCMSR_DRV2IOP_CDB_POSTED);
 +			CHIP_REG_WRITE32(HBB_DOORBELL, 0, drv2iop_doorbell, ARCMSR_DRV2IOP_CDB_POSTED);
 +		}
 +		break;
 +    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);
 +			cdb_phyaddr_hi32 = acb->srb_phyaddr.B.phyadd_high;
 +            if(cdb_phyaddr_hi32)
 +            {
 +			    CHIP_REG_WRITE32(HBC_MessageUnit,0,inbound_queueport_high, cdb_phyaddr_hi32);
 +			    CHIP_REG_WRITE32(HBC_MessageUnit,0,inbound_queueport_low, ccb_post_stamp);
 +            }
 +            else
 +            {
 +			    CHIP_REG_WRITE32(HBC_MessageUnit,0,inbound_queueport_low, ccb_post_stamp);
 +            }
  		}
  		break;
  	}
 @@ -946,6 +1035,12 @@ static struct QBUFFER * arcmsr_get_iop_r
  			qbuffer=(struct QBUFFER *)&phbbmu->hbb_rwbuffer->message_rbuffer;
  		}
  		break;
 +	case ACB_ADAPTER_TYPE_C: {
 +			struct HBC_MessageUnit *phbcmu=(struct HBC_MessageUnit *)acb->pmu;
 +	
 +			qbuffer=(struct QBUFFER *)&phbcmu->message_rbuffer;
 +		}
 +		break;
  	}
  	return(qbuffer);
  }
 @@ -970,6 +1065,12 @@ static struct QBUFFER * arcmsr_get_iop_w
  			qbuffer=(struct QBUFFER *)&phbbmu->hbb_rwbuffer->message_wbuffer;
  		}
  		break;
 +	case ACB_ADAPTER_TYPE_C: {
 +			struct HBC_MessageUnit *phbcmu=(struct HBC_MessageUnit *)acb->pmu;
 +	
 +			qbuffer=(struct QBUFFER *)&phbcmu->message_wbuffer;
 +		}
 +		break;
  	}
  	return(qbuffer);
  }
 @@ -982,16 +1083,18 @@ static void arcmsr_iop_message_read(stru
  	switch (acb->adapter_type) {
  	case ACB_ADAPTER_TYPE_A: {
  			/* let IOP know data has been read */
 -			CHIP_REG_WRITE32(HBA_MessageUnit, 
 -			0, inbound_doorbell, ARCMSR_INBOUND_DRIVER_DATA_READ_OK);
 +			CHIP_REG_WRITE32(HBA_MessageUnit, 0, inbound_doorbell, ARCMSR_INBOUND_DRIVER_DATA_READ_OK);
  		}
  		break;
  	case ACB_ADAPTER_TYPE_B: {
  			/* let IOP know data has been read */
 -			CHIP_REG_WRITE32(HBB_DOORBELL, 
 -			0, drv2iop_doorbell, ARCMSR_DRV2IOP_DATA_READ_OK);
 +			CHIP_REG_WRITE32(HBB_DOORBELL, 0, drv2iop_doorbell, ARCMSR_DRV2IOP_DATA_READ_OK);
  		}
  		break;
 +	case ACB_ADAPTER_TYPE_C: {
 +			/* let IOP know data has been read */
 +			CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_doorbell, ARCMSR_HBCMU_DRV2IOP_DATA_READ_OK);
 +		}
  	}
  	return;
  }
 @@ -1007,8 +1110,7 @@ static void arcmsr_iop_message_wrote(str
  			** push inbound doorbell tell iop, driver data write ok 
  			** and wait reply on next hwinterrupt for next Qbuffer post
  			*/
 -			CHIP_REG_WRITE32(HBA_MessageUnit, 
 -			0, inbound_doorbell, ARCMSR_INBOUND_DRIVER_DATA_WRITE_OK);
 +			CHIP_REG_WRITE32(HBA_MessageUnit, 0, inbound_doorbell, ARCMSR_INBOUND_DRIVER_DATA_WRITE_OK);
  		}
  		break;
  	case ACB_ADAPTER_TYPE_B: {
 @@ -1016,8 +1118,15 @@ static void arcmsr_iop_message_wrote(str
  			** push inbound doorbell tell iop, driver data write ok 
  			** and wait reply on next hwinterrupt for next Qbuffer post
  			*/
 -			CHIP_REG_WRITE32(HBB_DOORBELL, 
 -			0, drv2iop_doorbell, ARCMSR_DRV2IOP_DATA_WRITE_OK);
 +			CHIP_REG_WRITE32(HBB_DOORBELL, 0, drv2iop_doorbell, ARCMSR_DRV2IOP_DATA_WRITE_OK);
 +		}
 +		break;
 +	case ACB_ADAPTER_TYPE_C: {
 +			/*
 +			** push inbound doorbell tell iop, driver data write ok 
 +			** and wait reply on next hwinterrupt for next Qbuffer post
 +			*/
 +			CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_doorbell, ARCMSR_HBCMU_DRV2IOP_DATA_WRITE_OK);
  		}
  		break;
  	}
 @@ -1064,7 +1173,7 @@ static void arcmsr_stop_hba_bgrb(struct 
  	CHIP_REG_WRITE32(HBA_MessageUnit, 
  	0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_STOP_BGRB);
  	if(!arcmsr_hba_wait_msgint_ready(acb)) {
 -		printf("arcmsr%d: wait 'stop adapter rebulid' timeout \n"
 +		printf("arcmsr%d: wait 'stop adapter background rebulid' timeout \n"
  			, acb->pci_unit);
  	}
  	return;
 @@ -1079,7 +1188,7 @@ static void arcmsr_stop_hbb_bgrb(struct 
  	CHIP_REG_WRITE32(HBB_DOORBELL, 
  	0, drv2iop_doorbell, ARCMSR_MESSAGE_STOP_BGRB);
  	if(!arcmsr_hbb_wait_msgint_ready(acb)) {
 -		printf( "arcmsr%d: wait 'stop adapter rebulid' timeout \n"
 +		printf( "arcmsr%d: wait 'stop adapter background rebulid' timeout \n"
  			, acb->pci_unit);
  	}
  	return;
 @@ -1088,6 +1197,20 @@ static void arcmsr_stop_hbb_bgrb(struct 
  ************************************************************************
  ************************************************************************
  */
 +static void arcmsr_stop_hbc_bgrb(struct AdapterControlBlock *acb)
 +{
 +	acb->acb_flags &=~ACB_F_MSG_START_BGRB;
 +	CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_STOP_BGRB);
 +	CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_doorbell,ARCMSR_HBCMU_DRV2IOP_MESSAGE_CMD_DONE);
 +	if(!arcmsr_hbc_wait_msgint_ready(acb)) {
 +		printf("arcmsr%d: wait 'stop adapter background rebulid' timeout \n", acb->pci_unit);
 +	}
 +	return;
 +}
 +/*
 +************************************************************************
 +************************************************************************
 +*/
  static void arcmsr_stop_adapter_bgrb(struct AdapterControlBlock *acb)
  {
  	switch (acb->adapter_type) {
 @@ -1099,6 +1222,10 @@ static void arcmsr_stop_adapter_bgrb(str
  			arcmsr_stop_hbb_bgrb(acb);
  		}
  		break;
 +	case ACB_ADAPTER_TYPE_C: {
 +			arcmsr_stop_hbc_bgrb(acb);
 +		}
 +		break;
  	}
  	return;
  }
 @@ -1121,18 +1248,6 @@ static void arcmsr_poll(struct cam_sim *
  	return;
  }
  /*
 -**********************************************************************
 -**********************************************************************
 -*/
 -static void arcmsr_intr_handler(void *arg)
 -{
 -	struct AdapterControlBlock *acb=(struct AdapterControlBlock *)arg;
 -	
 -	ARCMSR_LOCK_ACQUIRE(&acb->qbuffer_lock);
 -	arcmsr_interrupt(acb);
 -	ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock);
 -}
 -/*
  **************************************************************************
  **************************************************************************
  */
 @@ -1210,6 +1325,187 @@ static void arcmsr_iop2drv_data_read_han
  	}
  	return;
  }
 +
 +static void arcmsr_rescanLun_cb(struct cam_periph *periph, union ccb *ccb)
 +{
 +/*
 +	if (ccb->ccb_h.status != CAM_REQ_CMP)
 +		printf("arcmsr_rescanLun_cb: Rescan Target=%x, lun=%x, failure status=%x\n",ccb->ccb_h.target_id,ccb->ccb_h.target_lun,ccb->ccb_h.status);
 +	else
 +		printf("arcmsr_rescanLun_cb: Rescan lun successfully!\n");
 +*/
 +	xpt_free_path(ccb->ccb_h.path);
 +	xpt_free_ccb(ccb);
 +}
 +
 +static void	arcmsr_rescan_lun(struct AdapterControlBlock *acb, int target, int lun)
 +{
 +	struct cam_path     *path;
 +	union ccb           *ccb;
 +
 +	if ((ccb = (union ccb *)xpt_alloc_ccb_nowait()) == NULL)
 + 		return;
 +	if (xpt_create_path(&path, xpt_periph, cam_sim_path(acb->psim), target, lun) != CAM_REQ_CMP)
 +	{
 +		xpt_free_ccb(ccb);
 +		return;
 +	}
 +/*	printf("arcmsr_rescan_lun: Rescan Target=%x, Lun=%x\n", target, lun); */
 +	bzero(ccb, sizeof(union ccb));
 +	xpt_setup_ccb(&ccb->ccb_h, path, 5);
 +	ccb->ccb_h.func_code = XPT_SCAN_LUN;
 +	ccb->ccb_h.cbfcnp = arcmsr_rescanLun_cb;
 +	ccb->crcn.flags = CAM_FLAG_NONE;
 +	xpt_action(ccb);
 +	return;
 +}
 +
 +
 +static void arcmsr_abort_dr_ccbs(struct AdapterControlBlock *acb, int target, int lun)
 +{
 +   	struct CommandControlBlock *srb;
 +	u_int32_t intmask_org;
 +   	int i;
 +
 +	ARCMSR_LOCK_ACQUIRE(&acb->qbuffer_lock);
 +	/* disable all outbound interrupts */
 +	intmask_org = arcmsr_disable_allintr(acb);
 +	for (i = 0; i < ARCMSR_MAX_FREESRB_NUM; i++)
 +	{
 +		srb = acb->psrb_pool[i];
 +		if (srb->startdone == ARCMSR_SRB_START)
 +		{
 +           	if((target == srb->pccb->ccb_h.target_id) && (lun == srb->pccb->ccb_h.target_lun))
 +            {
 +		    	srb->startdone = ARCMSR_SRB_ABORTED;
 +				srb->pccb->ccb_h.status |= CAM_REQ_ABORTED;
 +		    	arcmsr_srb_complete(srb, 1);
 +       		}
 +		}
 +	}
 +	/* enable outbound Post Queue, outbound doorbell Interrupt */
 +	arcmsr_enable_allintr(acb, intmask_org);
 +	ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock);
 +}
 +
 +
 +/*
 +**************************************************************************
 +**************************************************************************
 +*/
 +static void arcmsr_dr_handle(struct AdapterControlBlock *acb) {
 +	u_int32_t	devicemap;
 +	u_int32_t	target, lun;
 +    u_int32_t	deviceMapCurrent[4]={0};
 +    u_int8_t	*pDevMap;
 +
 +	switch (acb->adapter_type) {
 +	case ACB_ADAPTER_TYPE_A:
 +			devicemap = offsetof(struct HBA_MessageUnit, msgcode_rwbuffer[ARCMSR_FW_DEVMAP_OFFSET]);
 +			for (target= 0; target < 4; target++) 
 +			{
 +            	deviceMapCurrent[target]=bus_space_read_4(acb->btag[0], acb->bhandle[0],  devicemap);
 +            	devicemap += 4;
 +			}
 +			break;
 +
 +	case ACB_ADAPTER_TYPE_B:
 +			devicemap = offsetof(struct HBB_RWBUFFER, msgcode_rwbuffer[ARCMSR_FW_DEVMAP_OFFSET]);
 +			for (target= 0; target < 4; target++) 
 +			{
 +            	deviceMapCurrent[target]=bus_space_read_4(acb->btag[1], acb->bhandle[1],  devicemap);
 +            	devicemap += 4;
 +			}
 +			break;
 +
 +	case ACB_ADAPTER_TYPE_C:
 +			devicemap = offsetof(struct HBC_MessageUnit, msgcode_rwbuffer[ARCMSR_FW_DEVMAP_OFFSET]);
 +			for (target= 0; target < 4; target++) 
 +			{
 +            	deviceMapCurrent[target]=bus_space_read_4(acb->btag[0], acb->bhandle[0],  devicemap);
 +            	devicemap += 4;
 +			}
 +			break;
 +	}
 +		if(acb->acb_flags & ACB_F_BUS_HANG_ON)
 +		{
 +			acb->acb_flags &= ~ACB_F_BUS_HANG_ON;
 +		}
 +		/* 
 +		** adapter posted CONFIG message 
 +		** copy the new map, note if there are differences with the current map
 +		*/
 +		pDevMap = (u_int8_t	*)&deviceMapCurrent[0];
 +		for (target= 0; target < ARCMSR_MAX_TARGETID - 1; target++) 
 +		{
 +			if (*pDevMap != acb->device_map[target])
 +			{
 +                u_int8_t difference, bit_check;
 +
 +                difference= *pDevMap ^ acb->device_map[target];
 +                for(lun=0; lun < ARCMSR_MAX_TARGETLUN; lun++)
 +                {
 +                    bit_check=(1 << lun);						/*check bit from 0....31*/
 +                    if(difference & bit_check)
 +                    {
 +                        if(acb->device_map[target] & bit_check)
 +                        {/* unit departed */
 +							printf("arcmsr_dr_handle: Target=%x, lun=%x, GONE!!!\n",target,lun);
 + 							arcmsr_abort_dr_ccbs(acb, target, lun);
 +                        	arcmsr_rescan_lun(acb, target, lun);
 +        					acb->devstate[target][lun] = ARECA_RAID_GONE;
 +                        }
 +                        else
 +                        {/* unit arrived */
 +							printf("arcmsr_dr_handle: Target=%x, lun=%x, ARRIVING!!!\n",target,lun);
 +                        	arcmsr_rescan_lun(acb, target, lun);
 +        					acb->devstate[target][lun] = ARECA_RAID_GOOD;
 +                        }
 +                    }
 +                }
 +/*				printf("arcmsr_dr_handle: acb->device_map[%x]=0x%x, deviceMapCurrent[%x]=%x\n",target,acb->device_map[target],target,*pDevMap); */
 +				acb->device_map[target]= *pDevMap;
 +			}
 +			pDevMap++;
 +		}
 +}
 +/*
 +**************************************************************************
 +**************************************************************************
 +*/
 +static void arcmsr_hba_message_isr(struct AdapterControlBlock *acb) {
 +	u_int32_t outbound_message;
 +
 +	CHIP_REG_WRITE32(HBA_MessageUnit, 0, outbound_intstatus, ARCMSR_MU_OUTBOUND_MESSAGE0_INT);
 +	outbound_message = CHIP_REG_READ32(HBA_MessageUnit, 0, msgcode_rwbuffer[0]);
 +	if (outbound_message == ARCMSR_SIGNATURE_GET_CONFIG)
 +		arcmsr_dr_handle( acb );
 +}
 +/*
 +**************************************************************************
 +**************************************************************************
 +*/
 +static void arcmsr_hbb_message_isr(struct AdapterControlBlock *acb) {
 +	u_int32_t outbound_message;
 +
 +	/* clear interrupts */
 +	CHIP_REG_WRITE32(HBB_DOORBELL, 0, iop2drv_doorbell, ARCMSR_MESSAGE_INT_CLEAR_PATTERN);
 +	outbound_message = CHIP_REG_READ32(HBB_RWBUFFER, 1, msgcode_rwbuffer[0]);
 +	if (outbound_message == ARCMSR_SIGNATURE_GET_CONFIG)
 +		arcmsr_dr_handle( acb );
 +}
 +/*
 +**************************************************************************
 +**************************************************************************
 +*/
 +static void arcmsr_hbc_message_isr(struct AdapterControlBlock *acb) {
 +	u_int32_t outbound_message;
 +
 +	CHIP_REG_WRITE32(HBC_MessageUnit, 0, outbound_doorbell_clear, ARCMSR_HBCMU_IOP2DRV_MESSAGE_CMD_DONE_DOORBELL_CLEAR);
 +	outbound_message = CHIP_REG_READ32(HBC_MessageUnit, 0, msgcode_rwbuffer[0]);
 +	if (outbound_message == ARCMSR_SIGNATURE_GET_CONFIG)
 +		arcmsr_dr_handle( acb );
 +}
  /*
  **************************************************************************
  **************************************************************************
 @@ -1241,9 +1537,38 @@ static void arcmsr_hba_doorbell_isr(stru
  **************************************************************************
  **************************************************************************
  */
 +static void arcmsr_hbc_doorbell_isr(struct AdapterControlBlock *acb)
 +{
 +	u_int32_t outbound_doorbell;
 +	
 +	/*
 +	*******************************************************************
 +	**  Maybe here we need to check wrqbuffer_lock is lock or not
 +	**  DOORBELL: din! don! 
 +	**  check if there are any mail need to pack from firmware
 +	*******************************************************************
 +	*/
 +	outbound_doorbell=CHIP_REG_READ32(HBC_MessageUnit, 0, outbound_doorbell);
 +	CHIP_REG_WRITE32(HBC_MessageUnit, 0, outbound_doorbell_clear, outbound_doorbell); /* clear doorbell interrupt */
 +	if(outbound_doorbell & ARCMSR_HBCMU_IOP2DRV_DATA_WRITE_OK) {
 +		arcmsr_iop2drv_data_wrote_handle(acb);
 +	}
 +	if(outbound_doorbell & ARCMSR_HBCMU_IOP2DRV_DATA_READ_OK) {
 +		arcmsr_iop2drv_data_read_handle(acb);
 +	}
 +	if(outbound_doorbell & ARCMSR_HBCMU_IOP2DRV_MESSAGE_CMD_DONE) {
 +		arcmsr_hbc_message_isr(acb);    /* messenger of "driver to iop commands" */
 +	}
 +	return;
 +}
 +/*
 +**************************************************************************
 +**************************************************************************
 +*/
  static void arcmsr_hba_postqueue_isr(struct AdapterControlBlock *acb)
  {
  	u_int32_t flag_srb;
 +	u_int16_t error;
  	
  	/*
  	*****************************************************************************
 @@ -1255,7 +1580,8 @@ static void arcmsr_hba_postqueue_isr(str
  	while((flag_srb=CHIP_REG_READ32(HBA_MessageUnit, 
  		0, outbound_queueport)) != 0xFFFFFFFF) {
  		/* check if command done with no error*/
 -		arcmsr_drain_donequeue(acb, flag_srb);
 +        error=(flag_srb & ARCMSR_SRBREPLY_FLAG_ERROR_MODE0)?TRUE:FALSE;
 +		arcmsr_drain_donequeue(acb, flag_srb, error);
  	}	/*drain reply FIFO*/
  	return;
  }
 @@ -1268,6 +1594,7 @@ static void arcmsr_hbb_postqueue_isr(str
  	struct HBB_MessageUnit *phbbmu=(struct HBB_MessageUnit *)acb->pmu;
  	u_int32_t flag_srb;
  	int index;
 +	u_int16_t error;
  	
  	/*
  	*****************************************************************************
 @@ -1283,7 +1610,38 @@ static void arcmsr_hbb_postqueue_isr(str
  		index %= ARCMSR_MAX_HBB_POSTQUEUE;     /*if last index number set it to 0 */
  		phbbmu->doneq_index=index;
  		/* check if command done with no error*/
 -		arcmsr_drain_donequeue(acb, flag_srb);
 +        error=(flag_srb & ARCMSR_SRBREPLY_FLAG_ERROR_MODE0)?TRUE:FALSE;
 +		arcmsr_drain_donequeue(acb, flag_srb, error);
 +	}	/*drain reply FIFO*/
 +	return;
 +}
 +/*
 +**************************************************************************
 +**************************************************************************
 +*/
 +static void arcmsr_hbc_postqueue_isr(struct AdapterControlBlock *acb)
 +{
 +	u_int32_t flag_srb,throttling=0;
 +	u_int16_t error;
 +	
 +	/*
 +	*****************************************************************************
 +	**               areca cdb command done
 +	*****************************************************************************
 +	*/
 +	bus_dmamap_sync(acb->srb_dmat, acb->srb_dmamap, BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
 +		
 +	while(CHIP_REG_READ32(HBC_MessageUnit, 0, host_int_status) & ARCMSR_HBCMU_OUTBOUND_POSTQUEUE_ISR) {
 +		
 +		flag_srb=CHIP_REG_READ32(HBC_MessageUnit, 0, outbound_queueport_low);
 +		/* check if command done with no error*/
 +        error=(flag_srb & ARCMSR_SRBREPLY_FLAG_ERROR_MODE1)?TRUE:FALSE;
 +		arcmsr_drain_donequeue(acb, flag_srb, error);
 +        if(throttling==ARCMSR_HBC_ISR_THROTTLING_LEVEL) {
 +            CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_doorbell,ARCMSR_HBCMU_DRV2IOP_POSTQUEUE_THROTTLING);
 +            break;
 +        }
 +        throttling++;
  	}	/*drain reply FIFO*/
  	return;
  }
 @@ -1299,14 +1657,12 @@ static void arcmsr_handle_hba_isr( struc
  	**   check outbound intstatus 
  	*********************************************
  	*/
 -	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;
  	if(!outbound_intstatus) {
  		/*it must be share irq*/
  		return;
  	}
 -	CHIP_REG_WRITE32(HBA_MessageUnit, 
 -	0, outbound_intstatus, outbound_intstatus);/*clear interrupt*/
 +	CHIP_REG_WRITE32(HBA_MessageUnit, 0, outbound_intstatus, outbound_intstatus);/*clear interrupt*/
  	/* MU doorbell interrupts*/
  	if(outbound_intstatus & ARCMSR_MU_OUTBOUND_DOORBELL_INT) {
  		arcmsr_hba_doorbell_isr(acb);
 @@ -1315,6 +1671,9 @@ static void arcmsr_handle_hba_isr( struc
  	if(outbound_intstatus & ARCMSR_MU_OUTBOUND_POSTQUEUE_INT) {
  		arcmsr_hba_postqueue_isr(acb);
  	}
 +	if(outbound_intstatus & ARCMSR_MU_OUTBOUND_MESSAGE0_INT) {
 +		arcmsr_hba_message_isr(acb);
 +	}
  	return;
  }
  /*
 @@ -1348,6 +1707,36 @@ static void arcmsr_handle_hbb_isr( struc
  	if(outbound_doorbell & ARCMSR_IOP2DRV_CDB_DONE) {
 
 *** 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-unsubscribe@freebsd.org"
 

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: kern/148502: commit references a PR
Date: Wed,  4 Aug 2010 01:37:02 +0000 (UTC)

 Author: delphij
 Date: Wed Aug  4 01:36:48 2010
 New Revision: 210836
 URL: http://svn.freebsd.org/changeset/base/210836
 
 Log:
   MFC r210358:
   
   Apply vendor version 1.20.00.17.
   
   This version adds support for ARC1880; additionally this version fixed
   an issue where all devices on a SAS port gets offlined when any device
   failed on the port [1].
   
   Many thanks to Areca for continuing to support FreeBSD.
   
   PR:		kern/148502 [1]
   Submitted by:	Ching-Lung Huang <ching2048 areca com tw>
   Obtained from:	Areca
   Tested by:	Rich Ercolani <rercola acm jhu edu> [1]
 
 Modified:
   stable/8/sys/dev/arcmsr/arcmsr.c
   stable/8/sys/dev/arcmsr/arcmsr.h
 Directory Properties:
   stable/8/sys/   (props changed)
   stable/8/sys/amd64/include/xen/   (props changed)
   stable/8/sys/cddl/contrib/opensolaris/   (props changed)
   stable/8/sys/contrib/dev/acpica/   (props changed)
   stable/8/sys/contrib/pf/   (props changed)
   stable/8/sys/dev/xen/xenpci/   (props changed)
 
 Modified: stable/8/sys/dev/arcmsr/arcmsr.c
 ==============================================================================
 --- stable/8/sys/dev/arcmsr/arcmsr.c	Wed Aug  4 01:34:35 2010	(r210835)
 +++ stable/8/sys/dev/arcmsr/arcmsr.c	Wed Aug  4 01:36:48 2010	(r210836)
 @@ -2,15 +2,15 @@
  *****************************************************************************************
  **        O.S   : FreeBSD
  **   FILE NAME  : arcmsr.c
 -**        BY    : Erich Chen   
 +**        BY    : Erich Chen, Ching Huang
  **   Description: SCSI RAID Device Driver for 
 -**                ARECA (ARC11XX/ARC12XX/ARC13XX/ARC16XX) SATA/SAS RAID HOST Adapter
 +**                ARECA (ARC11XX/ARC12XX/ARC13XX/ARC16XX/ARC188x) SATA/SAS RAID HOST Adapter
  **                ARCMSR RAID Host adapter
  **                [RAID controller:INTEL 331(PCI-X) 341(PCI-EXPRESS) chip set]
  ******************************************************************************************
  ************************************************************************
  **
 -** Copyright (c) 2004-2006 ARECA Co. Ltd.
 +** Copyright (c) 2004-2010 ARECA Co. Ltd.
  **        Erich Chen, Taipei Taiwan All rights reserved.
  **
  ** Redistribution and use in source and binary forms, with or without
 @@ -57,6 +57,10 @@
  **     1.20.00.15   10/10/2007         Erich Chen        support new RAID adapter type ARC120x
  **     1.20.00.16   10/10/2009         Erich Chen        Bug fix for RAID adapter type ARC120x
  **                                                       bus_dmamem_alloc() with BUS_DMA_ZERO
 +**     1.20.00.17   07/15/2010         Ching Huang       Added support ARC1880
 +**							 report CAM_DEV_NOT_THERE instead of CAM_SEL_TIMEOUT when device failed,
 +**							 prevent cam_periph_error removing all LUN devices of one Target id
 +**							 for any one LUN device failed
  ******************************************************************************************
  * $FreeBSD$
  */
 @@ -90,6 +94,8 @@
  #include <cam/cam.h>
  #include <cam/cam_ccb.h>
  #include <cam/cam_sim.h>
 +#include <cam/cam_periph.h>
 +#include <cam/cam_xpt_periph.h>
  #include <cam/cam_xpt_sim.h>
  #include <cam/cam_debug.h>
  #include <cam/scsi/scsi_all.h>
 @@ -165,6 +171,8 @@ static void arcmsr_build_srb(struct Comm
  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);
  /*
  **************************************************************************
  **************************************************************************
 @@ -191,7 +199,6 @@ static device_method_t arcmsr_methods[]=
  	DEVMETHOD(device_shutdown,	arcmsr_shutdown),
  	DEVMETHOD(device_suspend,	arcmsr_suspend),
  	DEVMETHOD(device_resume,	arcmsr_resume),
 -	
  	DEVMETHOD(bus_print_child,	bus_generic_print_child),
  	DEVMETHOD(bus_driver_added, 	bus_generic_driver_added),
  	{ 0, 0 }
 @@ -215,7 +222,7 @@ MODULE_DEPEND(arcmsr, cam, 1, 1, 1);
  	#ifndef D_VERSION
  		#define D_VERSION	0x20011966
  	#endif
 -	static struct cdevsw arcmsr_cdevsw={
 +static struct cdevsw arcmsr_cdevsw={
  	#if __FreeBSD_version > 502010
  		.d_version = D_VERSION, 
  	#endif
 @@ -228,7 +235,7 @@ MODULE_DEPEND(arcmsr, cam, 1, 1, 1);
  #else
  	#define ARCMSR_CDEV_MAJOR	180
  	
 -	static struct cdevsw arcmsr_cdevsw = {
 +static struct cdevsw arcmsr_cdevsw = {
  		arcmsr_open, 		        /* open     */
  		arcmsr_close, 		        /* close    */
  		noread, 		        /* read     */
 @@ -244,7 +251,10 @@ MODULE_DEPEND(arcmsr, cam, 1, 1, 1);
  		0				/* flags    */
  	};
  #endif
 -
 +/*
 +**************************************************************************
 +**************************************************************************
 +*/
  #if __FreeBSD_version < 500005
  	static int arcmsr_open(dev_t dev, int flags, int fmt, struct proc *proc)
  #else
 @@ -328,18 +338,21 @@ static u_int32_t arcmsr_disable_allintr(
  	switch (acb->adapter_type) {
  	case ACB_ADAPTER_TYPE_A: {
  			/* disable all outbound interrupt */
 -			intmask_org=CHIP_REG_READ32(HBA_MessageUnit, 
 -			0, outbound_intmask)|ARCMSR_MU_OUTBOUND_MESSAGE0_INTMASKENABLE; /* disable outbound message0 int */
 -			CHIP_REG_WRITE32(HBA_MessageUnit, 
 -			0, outbound_intmask, intmask_org|ARCMSR_MU_OUTBOUND_ALL_INTMASKENABLE);
 +			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, 
  			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 */
 +			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 */
 +			CHIP_REG_WRITE32(HBC_MessageUnit, 0, host_int_mask, intmask_org|ARCMSR_HBCMU_ALL_INTMASKENABLE);
  		}
  		break;
  	}
 @@ -356,19 +369,25 @@ 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);
 +			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: {
 -			/* disable ARCMSR_IOP2DRV_MESSAGE_CMD_DONE */
 -			mask=(ARCMSR_IOP2DRV_DATA_WRITE_OK|ARCMSR_IOP2DRV_DATA_READ_OK|ARCMSR_IOP2DRV_CDB_DONE);
 -			CHIP_REG_WRITE32(HBB_DOORBELL, 
 -			0, iop2drv_doorbell_mask, intmask_org | mask); /*1=interrupt enable, 0=interrupt disable*/
 +			/* 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);
 +			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);
 +			CHIP_REG_WRITE32(HBC_MessageUnit, 0, host_int_mask, intmask_org & mask);
 +			acb->outbound_int_enable= ~(intmask_org & mask) & 0x0000000f;
 +		}
 +		break;
  	}
  	return;
  }
 @@ -383,10 +402,8 @@ static u_int8_t arcmsr_hba_wait_msgint_r
  	
  	do {
  		for(Index=0; Index < 100; Index++) {
 -			if(CHIP_REG_READ32(HBA_MessageUnit, 
 -				0, outbound_intstatus) & ARCMSR_MU_OUTBOUND_MESSAGE0_INT) {
 -				CHIP_REG_WRITE32(HBA_MessageUnit, 
 -				0, outbound_intstatus, ARCMSR_MU_OUTBOUND_MESSAGE0_INT);/*clear interrupt*/
 +			if(CHIP_REG_READ32(HBA_MessageUnit, 0, outbound_intstatus) & ARCMSR_MU_OUTBOUND_MESSAGE0_INT) {
 +				CHIP_REG_WRITE32(HBA_MessageUnit, 0, outbound_intstatus, ARCMSR_MU_OUTBOUND_MESSAGE0_INT);/*clear interrupt*/
  				return TRUE;
  			}
  			UDELAY(10000);
 @@ -405,12 +422,29 @@ static u_int8_t arcmsr_hbb_wait_msgint_r
  	
  	do {
  		for(Index=0; Index < 100; Index++) {
 -			if(CHIP_REG_READ32(HBB_DOORBELL, 
 -				0, iop2drv_doorbell) & ARCMSR_IOP2DRV_MESSAGE_CMD_DONE) {
 -				CHIP_REG_WRITE32(HBB_DOORBELL, 
 -				0, iop2drv_doorbell, ARCMSR_MESSAGE_INT_CLEAR_PATTERN);/*clear interrupt*/
 -				CHIP_REG_WRITE32(HBB_DOORBELL, 
 -				0, drv2iop_doorbell, ARCMSR_DRV2IOP_END_OF_INTERRUPT);
 +			if(CHIP_REG_READ32(HBB_DOORBELL, 0, iop2drv_doorbell) & ARCMSR_IOP2DRV_MESSAGE_CMD_DONE) {
 +				CHIP_REG_WRITE32(HBB_DOORBELL, 0, iop2drv_doorbell, ARCMSR_MESSAGE_INT_CLEAR_PATTERN);/*clear interrupt*/
 +				CHIP_REG_WRITE32(HBB_DOORBELL, 0, drv2iop_doorbell, ARCMSR_DRV2IOP_END_OF_INTERRUPT);
 +				return TRUE;
 +			}
 +			UDELAY(10000);
 +		}/*max 1 seconds*/
 +	}while(Retries++ < 20);/*max 20 sec*/
 +	return FALSE;
 +}
 +/*
 +**********************************************************************
 +**********************************************************************
 +*/
 +static u_int8_t arcmsr_hbc_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(HBC_MessageUnit, 0, outbound_doorbell) & ARCMSR_HBCMU_IOP2DRV_MESSAGE_CMD_DONE) {
 +				CHIP_REG_WRITE32(HBC_MessageUnit, 0, outbound_doorbell_clear, ARCMSR_HBCMU_IOP2DRV_MESSAGE_CMD_DONE_DOORBELL_CLEAR);/*clear interrupt*/
  				return TRUE;
  			}
  			UDELAY(10000);
 @@ -426,8 +460,7 @@ static void arcmsr_flush_hba_cache(struc
  {
  	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);
 +	CHIP_REG_WRITE32(HBA_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_FLUSH_CACHE);
  	do {
  		if(arcmsr_hba_wait_msgint_ready(acb)) {
  			break;
 @@ -460,6 +493,25 @@ 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 */
 +	
 +	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);
 +	do {
 +		if(arcmsr_hbc_wait_msgint_ready(acb)) {
 +			break;
 +		} else {
 +			retry_count--;
 +		}
 +	}while(retry_count!=0);
 +	return;
 +}
 +/*
 +************************************************************************
 +************************************************************************
 +*/
  static void arcmsr_flush_adapter_cache(struct AdapterControlBlock *acb)
  {
  	switch (acb->adapter_type) {
 @@ -471,6 +523,10 @@ static void arcmsr_flush_adapter_cache(s
  			arcmsr_flush_hbb_cache(acb);
  		}
  		break;
 +	case ACB_ADAPTER_TYPE_C: {
 +			arcmsr_flush_hbc_cache(acb);
 +		}
 +		break;
  	}
  	return;
  }
 @@ -482,10 +538,10 @@ static int arcmsr_suspend(device_t dev)
  {
  	struct AdapterControlBlock	*acb = device_get_softc(dev);
  	
 -	/* disable all outbound interrupt */
 -	arcmsr_disable_allintr(acb);
  	/* flush controller */
  	arcmsr_iop_parking(acb);
 +	/* disable all outbound interrupt */
 +	arcmsr_disable_allintr(acb);
  	return(0);
  }
  /*
 @@ -515,12 +571,10 @@ static void arcmsr_async(void *cb_arg, u
  	case AC_LOST_DEVICE:
  		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)) {
 +		if((target_id > ARCMSR_MAX_TARGETID) || (target_lun > ARCMSR_MAX_TARGETLUN)) {
  			break;
  		}
 -		printf("%s:scsi id%d lun%d device lost \n"
 -			, device_get_name(acb->pci_dev), target_id, target_lun);
 +		printf("%s:scsi id=%d lun=%d device lost \n", device_get_name(acb->pci_dev), target_id, target_lun);
  		break;
  	default:
  		break;
 @@ -589,8 +643,7 @@ static void arcmsr_abort_hba_allcmd(stru
  {
  	CHIP_REG_WRITE32(HBA_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_ABORT_CMD);
  	if(!arcmsr_hba_wait_msgint_ready(acb)) {
 -		printf("arcmsr%d: wait 'abort all outstanding command' timeout \n"
 -			, acb->pci_unit);
 +		printf("arcmsr%d: wait 'abort all outstanding command' timeout \n", acb->pci_unit);
  	}
  	return;
  }
 @@ -602,8 +655,20 @@ static void arcmsr_abort_hbb_allcmd(stru
  {
  	CHIP_REG_WRITE32(HBB_DOORBELL, 0, drv2iop_doorbell, ARCMSR_MESSAGE_ABORT_CMD);
  	if(!arcmsr_hbb_wait_msgint_ready(acb)) {
 -		printf("arcmsr%d: wait 'abort all outstanding command' timeout \n"
 -			, acb->pci_unit);
 +		printf("arcmsr%d: wait 'abort all outstanding command' timeout \n", acb->pci_unit);
 +	}
 +	return;
 +}
 +/*
 +*********************************************************************
 +*********************************************************************
 +*/
 +static void arcmsr_abort_hbc_allcmd(struct AdapterControlBlock *acb)
 +{
 +	CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_ABORT_CMD);
 +	CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_doorbell, ARCMSR_HBCMU_DRV2IOP_MESSAGE_CMD_DONE);
 +	if(!arcmsr_hbc_wait_msgint_ready(acb)) {
 +		printf("arcmsr%d: wait 'abort all outstanding command' timeout \n", acb->pci_unit);
  	}
  	return;
  }
 @@ -622,6 +687,10 @@ static void arcmsr_abort_allcmd(struct A
  			arcmsr_abort_hbb_allcmd(acb);
  		}
  		break;
 +	case ACB_ADAPTER_TYPE_C: {
 +			arcmsr_abort_hbc_allcmd(acb);
 +		}
 +		break;
  	}
  	return;
  }
 @@ -629,14 +698,13 @@ static void arcmsr_abort_allcmd(struct A
  **************************************************************************
  **************************************************************************
  */
 -static void arcmsr_report_srb_state(struct AdapterControlBlock *acb, 
 -	struct CommandControlBlock *srb, u_int32_t flag_srb)
 +static void arcmsr_report_srb_state(struct AdapterControlBlock *acb, struct CommandControlBlock *srb, u_int16_t error)
  {
  	int target, lun;
  	
  	target=srb->pccb->ccb_h.target_id;
  	lun=srb->pccb->ccb_h.target_lun;
 -	if((flag_srb & ARCMSR_SRBREPLY_FLAG_ERROR)==0) {
 +	if(error == FALSE) {
  		if(acb->devstate[target][lun]==ARECA_RAID_GONE) {
  			acb->devstate[target][lun]=ARECA_RAID_GOOD;
  		}
 @@ -646,12 +714,10 @@ static void arcmsr_report_srb_state(stru
  		switch(srb->arcmsr_cdb.DeviceStatus) {
  		case ARCMSR_DEV_SELECT_TIMEOUT: {
  				if(acb->devstate[target][lun]==ARECA_RAID_GOOD) {
 -					printf( "arcmsr%d: select timeout"
 -						", raid volume was kicked out \n"
 -						, acb->pci_unit);
 +					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;
 -				srb->pccb->ccb_h.status |= CAM_SEL_TIMEOUT;
 +				srb->pccb->ccb_h.status |= CAM_DEV_NOT_THERE;
  				arcmsr_srb_complete(srb, 1);
  			}
  			break;
 @@ -669,11 +735,8 @@ static void arcmsr_report_srb_state(stru
  			}
  			break;
  		default:
 -			printf("arcmsr%d: scsi id=%d lun=%d"
 -				"isr get command error done,"
 -				"but got unknow DeviceStatus=0x%x \n"
 -				, acb->pci_unit, target, lun 
 -				,srb->arcmsr_cdb.DeviceStatus);
 +			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;
  			srb->pccb->ccb_h.status |= CAM_UNCOR_PARITY;
  			/*unknow error or crc error just for retry*/
 @@ -687,29 +750,34 @@ static void arcmsr_report_srb_state(stru
  **************************************************************************
  **************************************************************************
  */
 -static void arcmsr_drain_donequeue(struct AdapterControlBlock *acb, u_int32_t flag_srb)
 +static void arcmsr_drain_donequeue(struct AdapterControlBlock *acb, u_int32_t flag_srb, u_int16_t error)
  {
  	struct CommandControlBlock *srb;
  	
  	/* check if command done with no error*/
 -	srb=(struct CommandControlBlock *)
 -		(acb->vir2phy_offset+(flag_srb << 5));/*frame must be 32 bytes aligned*/
 +	switch (acb->adapter_type) {
 +	case ACB_ADAPTER_TYPE_C:
 +		srb = (struct CommandControlBlock *)(acb->vir2phy_offset+(flag_srb & 0xFFFFFFF0));/*frame must be 32 bytes aligned*/
 +		break;
 +	case ACB_ADAPTER_TYPE_A:
 +	case ACB_ADAPTER_TYPE_B:
 +	default:
 +		srb = (struct CommandControlBlock *)(acb->vir2phy_offset+(flag_srb << 5));/*frame must be 32 bytes aligned*/
 +		break;
 +	}
  	if((srb->acb!=acb) || (srb->startdone!=ARCMSR_SRB_START)) {
  		if(srb->startdone==ARCMSR_SRB_ABORTED) {
 -			printf("arcmsr%d: srb='%p' isr got aborted command \n"
 -				, acb->pci_unit, srb);
 +			printf("arcmsr%d: srb='%p' isr got aborted command \n", acb->pci_unit, srb);
  			srb->pccb->ccb_h.status |= CAM_REQ_ABORTED;
  			arcmsr_srb_complete(srb, 1);
  			return;
  		}
  		printf("arcmsr%d: isr get an illegal srb command done"
 -			"acb='%p' srb='%p' srbacb='%p' startdone=0x%x"
 -			"srboutstandingcount=%d \n",
 -			acb->pci_unit, acb, srb, srb->acb,
 -			srb->startdone, acb->srboutstandingcount);
 +			"acb='%p' srb='%p' srbacb='%p' startdone=0x%xsrboutstandingcount=%d \n",
 +			acb->pci_unit, acb, srb, srb->acb,srb->startdone, acb->srboutstandingcount);
  		return;
  	}
 -	arcmsr_report_srb_state(acb, srb, flag_srb);
 +	arcmsr_report_srb_state(acb, srb, error);
  	return;
  }
  /*
 @@ -720,20 +788,18 @@ static void arcmsr_done4abort_postqueue(
  {
  	int i=0;
  	u_int32_t flag_srb;
 +	u_int16_t error;
  	
  	switch (acb->adapter_type) {
  	case ACB_ADAPTER_TYPE_A: {
  			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;
 -			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)) {
 -				arcmsr_drain_donequeue(acb, flag_srb);
 +			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;
 +				arcmsr_drain_donequeue(acb, flag_srb, error);
  			}
  		}
  		break;
 @@ -741,13 +807,12 @@ static void arcmsr_done4abort_postqueue(
  			struct HBB_MessageUnit *phbbmu=(struct HBB_MessageUnit *)acb->pmu;
  	
  			/*clear all outbound posted Q*/
 -			CHIP_REG_WRITE32(HBB_DOORBELL, 
 -			0, iop2drv_doorbell, 
 -			ARCMSR_DOORBELL_INT_CLEAR_PATTERN); /* clear doorbell interrupt */
 +			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;
 -					arcmsr_drain_donequeue(acb, flag_srb);
 +                	error=(flag_srb & ARCMSR_SRBREPLY_FLAG_ERROR_MODE0)?TRUE:FALSE;
 +					arcmsr_drain_donequeue(acb, flag_srb, error);
  				}
  				phbbmu->post_qbuffer[i]=0;
  			}/*drain reply FIFO*/
 @@ -755,6 +820,15 @@ static void arcmsr_done4abort_postqueue(
  			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;
 +				arcmsr_drain_donequeue(acb, flag_srb, error);
 +			}
 +		}
 +		break;
  	}
  	return;
  }
 @@ -873,7 +947,10 @@ static void arcmsr_build_srb(struct Comm
  		if( arccdbsize > 256) {
  			arcmsr_cdb->Flags|=ARCMSR_CDB_FLAG_SGL_BSIZE;
  		}
 +	} else {
 +		arcmsr_cdb->DataLength = 0;
  	}
 +    srb->arc_cdb_size=arccdbsize;
  	return;
  }
  /*
 @@ -885,19 +962,16 @@ static void arcmsr_post_srb(struct Adapt
  	u_int32_t cdb_shifted_phyaddr=(u_int32_t) srb->cdb_shifted_phyaddr;
  	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);
 +	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->startdone=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_shifted_phyaddr|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_shifted_phyaddr);
  			}
  		}
  		break;
 @@ -909,17 +983,32 @@ static void arcmsr_post_srb(struct Adapt
  			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_shifted_phyaddr|ARCMSR_SRBPOST_FLAG_SGL_BSIZE;
  			} else {
 -				phbbmu->post_qbuffer[index]=
 -					cdb_shifted_phyaddr;
 +				phbbmu->post_qbuffer[index]= cdb_shifted_phyaddr;
  			}
  			index++;
  			index %= ARCMSR_MAX_HBB_POSTQUEUE;     /*if last index number set it to 0 */
  			phbbmu->postq_index=index;
 -			CHIP_REG_WRITE32(HBB_DOORBELL, 
 -			0, drv2iop_doorbell, ARCMSR_DRV2IOP_CDB_POSTED);
 +			CHIP_REG_WRITE32(HBB_DOORBELL, 0, drv2iop_doorbell, ARCMSR_DRV2IOP_CDB_POSTED);
 +		}
 +		break;
 +    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);
 +			cdb_phyaddr_hi32 = acb->srb_phyaddr.B.phyadd_high;
 +            if(cdb_phyaddr_hi32)
 +            {
 +			    CHIP_REG_WRITE32(HBC_MessageUnit,0,inbound_queueport_high, cdb_phyaddr_hi32);
 +			    CHIP_REG_WRITE32(HBC_MessageUnit,0,inbound_queueport_low, ccb_post_stamp);
 +            }
 +            else
 +            {
 +			    CHIP_REG_WRITE32(HBC_MessageUnit,0,inbound_queueport_low, ccb_post_stamp);
 +            }
  		}
  		break;
  	}
 @@ -946,6 +1035,12 @@ static struct QBUFFER * arcmsr_get_iop_r
  			qbuffer=(struct QBUFFER *)&phbbmu->hbb_rwbuffer->message_rbuffer;
  		}
  		break;
 +	case ACB_ADAPTER_TYPE_C: {
 +			struct HBC_MessageUnit *phbcmu=(struct HBC_MessageUnit *)acb->pmu;
 +	
 +			qbuffer=(struct QBUFFER *)&phbcmu->message_rbuffer;
 +		}
 +		break;
  	}
  	return(qbuffer);
  }
 @@ -970,6 +1065,12 @@ static struct QBUFFER * arcmsr_get_iop_w
  			qbuffer=(struct QBUFFER *)&phbbmu->hbb_rwbuffer->message_wbuffer;
  		}
  		break;
 +	case ACB_ADAPTER_TYPE_C: {
 +			struct HBC_MessageUnit *phbcmu=(struct HBC_MessageUnit *)acb->pmu;
 +	
 +			qbuffer=(struct QBUFFER *)&phbcmu->message_wbuffer;
 +		}
 +		break;
  	}
  	return(qbuffer);
  }
 @@ -982,16 +1083,18 @@ static void arcmsr_iop_message_read(stru
  	switch (acb->adapter_type) {
  	case ACB_ADAPTER_TYPE_A: {
  			/* let IOP know data has been read */
 -			CHIP_REG_WRITE32(HBA_MessageUnit, 
 -			0, inbound_doorbell, ARCMSR_INBOUND_DRIVER_DATA_READ_OK);
 +			CHIP_REG_WRITE32(HBA_MessageUnit, 0, inbound_doorbell, ARCMSR_INBOUND_DRIVER_DATA_READ_OK);
  		}
  		break;
  	case ACB_ADAPTER_TYPE_B: {
  			/* let IOP know data has been read */
 -			CHIP_REG_WRITE32(HBB_DOORBELL, 
 -			0, drv2iop_doorbell, ARCMSR_DRV2IOP_DATA_READ_OK);
 +			CHIP_REG_WRITE32(HBB_DOORBELL, 0, drv2iop_doorbell, ARCMSR_DRV2IOP_DATA_READ_OK);
  		}
  		break;
 +	case ACB_ADAPTER_TYPE_C: {
 +			/* let IOP know data has been read */
 +			CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_doorbell, ARCMSR_HBCMU_DRV2IOP_DATA_READ_OK);
 +		}
  	}
  	return;
  }
 @@ -1007,8 +1110,7 @@ static void arcmsr_iop_message_wrote(str
  			** push inbound doorbell tell iop, driver data write ok 
  			** and wait reply on next hwinterrupt for next Qbuffer post
  			*/
 -			CHIP_REG_WRITE32(HBA_MessageUnit, 
 -			0, inbound_doorbell, ARCMSR_INBOUND_DRIVER_DATA_WRITE_OK);
 +			CHIP_REG_WRITE32(HBA_MessageUnit, 0, inbound_doorbell, ARCMSR_INBOUND_DRIVER_DATA_WRITE_OK);
  		}
  		break;
  	case ACB_ADAPTER_TYPE_B: {
 @@ -1016,8 +1118,15 @@ static void arcmsr_iop_message_wrote(str
  			** push inbound doorbell tell iop, driver data write ok 
  			** and wait reply on next hwinterrupt for next Qbuffer post
  			*/
 -			CHIP_REG_WRITE32(HBB_DOORBELL, 
 -			0, drv2iop_doorbell, ARCMSR_DRV2IOP_DATA_WRITE_OK);
 +			CHIP_REG_WRITE32(HBB_DOORBELL, 0, drv2iop_doorbell, ARCMSR_DRV2IOP_DATA_WRITE_OK);
 +		}
 +		break;
 +	case ACB_ADAPTER_TYPE_C: {
 +			/*
 +			** push inbound doorbell tell iop, driver data write ok 
 +			** and wait reply on next hwinterrupt for next Qbuffer post
 +			*/
 +			CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_doorbell, ARCMSR_HBCMU_DRV2IOP_DATA_WRITE_OK);
  		}
  		break;
  	}
 @@ -1064,7 +1173,7 @@ static void arcmsr_stop_hba_bgrb(struct 
  	CHIP_REG_WRITE32(HBA_MessageUnit, 
  	0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_STOP_BGRB);
  	if(!arcmsr_hba_wait_msgint_ready(acb)) {
 -		printf("arcmsr%d: wait 'stop adapter rebulid' timeout \n"
 +		printf("arcmsr%d: wait 'stop adapter background rebulid' timeout \n"
  			, acb->pci_unit);
  	}
  	return;
 @@ -1079,7 +1188,7 @@ static void arcmsr_stop_hbb_bgrb(struct 
  	CHIP_REG_WRITE32(HBB_DOORBELL, 
  	0, drv2iop_doorbell, ARCMSR_MESSAGE_STOP_BGRB);
  	if(!arcmsr_hbb_wait_msgint_ready(acb)) {
 -		printf( "arcmsr%d: wait 'stop adapter rebulid' timeout \n"
 +		printf( "arcmsr%d: wait 'stop adapter background rebulid' timeout \n"
  			, acb->pci_unit);
  	}
  	return;
 @@ -1088,6 +1197,20 @@ static void arcmsr_stop_hbb_bgrb(struct 
  ************************************************************************
  ************************************************************************
  */
 +static void arcmsr_stop_hbc_bgrb(struct AdapterControlBlock *acb)
 +{
 +	acb->acb_flags &=~ACB_F_MSG_START_BGRB;
 +	CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_STOP_BGRB);
 +	CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_doorbell,ARCMSR_HBCMU_DRV2IOP_MESSAGE_CMD_DONE);
 +	if(!arcmsr_hbc_wait_msgint_ready(acb)) {
 +		printf("arcmsr%d: wait 'stop adapter background rebulid' timeout \n", acb->pci_unit);
 +	}
 +	return;
 +}
 +/*
 +************************************************************************
 +************************************************************************
 +*/
  static void arcmsr_stop_adapter_bgrb(struct AdapterControlBlock *acb)
  {
  	switch (acb->adapter_type) {
 @@ -1099,6 +1222,10 @@ static void arcmsr_stop_adapter_bgrb(str
  			arcmsr_stop_hbb_bgrb(acb);
  		}
  		break;
 +	case ACB_ADAPTER_TYPE_C: {
 +			arcmsr_stop_hbc_bgrb(acb);
 +		}
 +		break;
  	}
  	return;
  }
 @@ -1121,18 +1248,6 @@ static void arcmsr_poll(struct cam_sim *
  	return;
  }
  /*
 -**********************************************************************
 -**********************************************************************
 -*/
 -static void arcmsr_intr_handler(void *arg)
 -{
 -	struct AdapterControlBlock *acb=(struct AdapterControlBlock *)arg;
 -	
 -	ARCMSR_LOCK_ACQUIRE(&acb->qbuffer_lock);
 -	arcmsr_interrupt(acb);
 -	ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock);
 -}
 -/*
  **************************************************************************
  **************************************************************************
  */
 @@ -1210,6 +1325,187 @@ static void arcmsr_iop2drv_data_read_han
  	}
  	return;
  }
 +
 +static void arcmsr_rescanLun_cb(struct cam_periph *periph, union ccb *ccb)
 +{
 +/*
 +	if (ccb->ccb_h.status != CAM_REQ_CMP)
 +		printf("arcmsr_rescanLun_cb: Rescan Target=%x, lun=%x, failure status=%x\n",ccb->ccb_h.target_id,ccb->ccb_h.target_lun,ccb->ccb_h.status);
 +	else
 +		printf("arcmsr_rescanLun_cb: Rescan lun successfully!\n");
 +*/
 +	xpt_free_path(ccb->ccb_h.path);
 +	xpt_free_ccb(ccb);
 +}
 +
 +static void	arcmsr_rescan_lun(struct AdapterControlBlock *acb, int target, int lun)
 +{
 +	struct cam_path     *path;
 +	union ccb           *ccb;
 +
 +	if ((ccb = (union ccb *)xpt_alloc_ccb_nowait()) == NULL)
 + 		return;
 +	if (xpt_create_path(&path, xpt_periph, cam_sim_path(acb->psim), target, lun) != CAM_REQ_CMP)
 +	{
 +		xpt_free_ccb(ccb);
 +		return;
 +	}
 +/*	printf("arcmsr_rescan_lun: Rescan Target=%x, Lun=%x\n", target, lun); */
 +	bzero(ccb, sizeof(union ccb));
 +	xpt_setup_ccb(&ccb->ccb_h, path, 5);
 +	ccb->ccb_h.func_code = XPT_SCAN_LUN;
 +	ccb->ccb_h.cbfcnp = arcmsr_rescanLun_cb;
 +	ccb->crcn.flags = CAM_FLAG_NONE;
 +	xpt_action(ccb);
 +	return;
 +}
 +
 +
 +static void arcmsr_abort_dr_ccbs(struct AdapterControlBlock *acb, int target, int lun)
 +{
 +   	struct CommandControlBlock *srb;
 +	u_int32_t intmask_org;
 +   	int i;
 +
 +	ARCMSR_LOCK_ACQUIRE(&acb->qbuffer_lock);
 +	/* disable all outbound interrupts */
 +	intmask_org = arcmsr_disable_allintr(acb);
 +	for (i = 0; i < ARCMSR_MAX_FREESRB_NUM; i++)
 +	{
 +		srb = acb->psrb_pool[i];
 +		if (srb->startdone == ARCMSR_SRB_START)
 +		{
 +           	if((target == srb->pccb->ccb_h.target_id) && (lun == srb->pccb->ccb_h.target_lun))
 +            {
 +		    	srb->startdone = ARCMSR_SRB_ABORTED;
 +				srb->pccb->ccb_h.status |= CAM_REQ_ABORTED;
 +		    	arcmsr_srb_complete(srb, 1);
 +       		}
 +		}
 +	}
 +	/* enable outbound Post Queue, outbound doorbell Interrupt */
 +	arcmsr_enable_allintr(acb, intmask_org);
 +	ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock);
 +}
 +
 +
 +/*
 +**************************************************************************
 +**************************************************************************
 +*/
 +static void arcmsr_dr_handle(struct AdapterControlBlock *acb) {
 +	u_int32_t	devicemap;
 +	u_int32_t	target, lun;
 +    u_int32_t	deviceMapCurrent[4]={0};
 +    u_int8_t	*pDevMap;
 +
 +	switch (acb->adapter_type) {
 +	case ACB_ADAPTER_TYPE_A:
 +			devicemap = offsetof(struct HBA_MessageUnit, msgcode_rwbuffer[ARCMSR_FW_DEVMAP_OFFSET]);
 +			for (target= 0; target < 4; target++) 
 +			{
 +            	deviceMapCurrent[target]=bus_space_read_4(acb->btag[0], acb->bhandle[0],  devicemap);
 +            	devicemap += 4;
 +			}
 +			break;
 +
 +	case ACB_ADAPTER_TYPE_B:
 +			devicemap = offsetof(struct HBB_RWBUFFER, msgcode_rwbuffer[ARCMSR_FW_DEVMAP_OFFSET]);
 +			for (target= 0; target < 4; target++) 
 +			{
 +            	deviceMapCurrent[target]=bus_space_read_4(acb->btag[1], acb->bhandle[1],  devicemap);
 +            	devicemap += 4;
 +			}
 +			break;
 +
 +	case ACB_ADAPTER_TYPE_C:
 +			devicemap = offsetof(struct HBC_MessageUnit, msgcode_rwbuffer[ARCMSR_FW_DEVMAP_OFFSET]);
 +			for (target= 0; target < 4; target++) 
 +			{
 +            	deviceMapCurrent[target]=bus_space_read_4(acb->btag[0], acb->bhandle[0],  devicemap);
 +            	devicemap += 4;
 +			}
 +			break;
 +	}
 +		if(acb->acb_flags & ACB_F_BUS_HANG_ON)
 +		{
 +			acb->acb_flags &= ~ACB_F_BUS_HANG_ON;
 +		}
 +		/* 
 +		** adapter posted CONFIG message 
 +		** copy the new map, note if there are differences with the current map
 +		*/
 +		pDevMap = (u_int8_t	*)&deviceMapCurrent[0];
 +		for (target= 0; target < ARCMSR_MAX_TARGETID - 1; target++) 
 +		{
 +			if (*pDevMap != acb->device_map[target])
 +			{
 +                u_int8_t difference, bit_check;
 +
 +                difference= *pDevMap ^ acb->device_map[target];
 +                for(lun=0; lun < ARCMSR_MAX_TARGETLUN; lun++)
 +                {
 +                    bit_check=(1 << lun);						/*check bit from 0....31*/
 +                    if(difference & bit_check)
 +                    {
 +                        if(acb->device_map[target] & bit_check)
 +                        {/* unit departed */
 +							printf("arcmsr_dr_handle: Target=%x, lun=%x, GONE!!!\n",target,lun);
 + 							arcmsr_abort_dr_ccbs(acb, target, lun);
 +                        	arcmsr_rescan_lun(acb, target, lun);
 +        					acb->devstate[target][lun] = ARECA_RAID_GONE;
 +                        }
 +                        else
 +                        {/* unit arrived */
 +							printf("arcmsr_dr_handle: Target=%x, lun=%x, ARRIVING!!!\n",target,lun);
 +                        	arcmsr_rescan_lun(acb, target, lun);
 +        					acb->devstate[target][lun] = ARECA_RAID_GOOD;
 +                        }
 +                    }
 +                }
 +/*				printf("arcmsr_dr_handle: acb->device_map[%x]=0x%x, deviceMapCurrent[%x]=%x\n",target,acb->device_map[target],target,*pDevMap); */
 +				acb->device_map[target]= *pDevMap;
 +			}
 +			pDevMap++;
 +		}
 +}
 +/*
 +**************************************************************************
 +**************************************************************************
 +*/
 +static void arcmsr_hba_message_isr(struct AdapterControlBlock *acb) {
 +	u_int32_t outbound_message;
 +
 +	CHIP_REG_WRITE32(HBA_MessageUnit, 0, outbound_intstatus, ARCMSR_MU_OUTBOUND_MESSAGE0_INT);
 +	outbound_message = CHIP_REG_READ32(HBA_MessageUnit, 0, msgcode_rwbuffer[0]);
 +	if (outbound_message == ARCMSR_SIGNATURE_GET_CONFIG)
 +		arcmsr_dr_handle( acb );
 +}
 +/*
 +**************************************************************************
 +**************************************************************************
 +*/
 +static void arcmsr_hbb_message_isr(struct AdapterControlBlock *acb) {
 +	u_int32_t outbound_message;
 +
 +	/* clear interrupts */
 +	CHIP_REG_WRITE32(HBB_DOORBELL, 0, iop2drv_doorbell, ARCMSR_MESSAGE_INT_CLEAR_PATTERN);
 +	outbound_message = CHIP_REG_READ32(HBB_RWBUFFER, 1, msgcode_rwbuffer[0]);
 +	if (outbound_message == ARCMSR_SIGNATURE_GET_CONFIG)
 +		arcmsr_dr_handle( acb );
 +}
 +/*
 +**************************************************************************
 +**************************************************************************
 +*/
 +static void arcmsr_hbc_message_isr(struct AdapterControlBlock *acb) {
 +	u_int32_t outbound_message;
 +
 +	CHIP_REG_WRITE32(HBC_MessageUnit, 0, outbound_doorbell_clear, ARCMSR_HBCMU_IOP2DRV_MESSAGE_CMD_DONE_DOORBELL_CLEAR);
 +	outbound_message = CHIP_REG_READ32(HBC_MessageUnit, 0, msgcode_rwbuffer[0]);
 +	if (outbound_message == ARCMSR_SIGNATURE_GET_CONFIG)
 +		arcmsr_dr_handle( acb );
 +}
  /*
  **************************************************************************
  **************************************************************************
 @@ -1241,9 +1537,38 @@ static void arcmsr_hba_doorbell_isr(stru
  **************************************************************************
  **************************************************************************
  */
 +static void arcmsr_hbc_doorbell_isr(struct AdapterControlBlock *acb)
 +{
 +	u_int32_t outbound_doorbell;
 +	
 +	/*
 +	*******************************************************************
 +	**  Maybe here we need to check wrqbuffer_lock is lock or not
 +	**  DOORBELL: din! don! 
 +	**  check if there are any mail need to pack from firmware
 +	*******************************************************************
 +	*/
 +	outbound_doorbell=CHIP_REG_READ32(HBC_MessageUnit, 0, outbound_doorbell);
 +	CHIP_REG_WRITE32(HBC_MessageUnit, 0, outbound_doorbell_clear, outbound_doorbell); /* clear doorbell interrupt */
 +	if(outbound_doorbell & ARCMSR_HBCMU_IOP2DRV_DATA_WRITE_OK) {
 +		arcmsr_iop2drv_data_wrote_handle(acb);
 +	}
 +	if(outbound_doorbell & ARCMSR_HBCMU_IOP2DRV_DATA_READ_OK) {
 +		arcmsr_iop2drv_data_read_handle(acb);
 +	}
 +	if(outbound_doorbell & ARCMSR_HBCMU_IOP2DRV_MESSAGE_CMD_DONE) {
 +		arcmsr_hbc_message_isr(acb);    /* messenger of "driver to iop commands" */
 +	}
 +	return;
 +}
 +/*
 +**************************************************************************
 +**************************************************************************
 +*/
  static void arcmsr_hba_postqueue_isr(struct AdapterControlBlock *acb)
  {
  	u_int32_t flag_srb;
 +	u_int16_t error;
  	
  	/*
  	*****************************************************************************
 @@ -1255,7 +1580,8 @@ static void arcmsr_hba_postqueue_isr(str
  	while((flag_srb=CHIP_REG_READ32(HBA_MessageUnit, 
  		0, outbound_queueport)) != 0xFFFFFFFF) {
  		/* check if command done with no error*/
 -		arcmsr_drain_donequeue(acb, flag_srb);
 +        error=(flag_srb & ARCMSR_SRBREPLY_FLAG_ERROR_MODE0)?TRUE:FALSE;
 +		arcmsr_drain_donequeue(acb, flag_srb, error);
  	}	/*drain reply FIFO*/
  	return;
  }
 @@ -1268,6 +1594,7 @@ static void arcmsr_hbb_postqueue_isr(str
  	struct HBB_MessageUnit *phbbmu=(struct HBB_MessageUnit *)acb->pmu;
  	u_int32_t flag_srb;
  	int index;
 +	u_int16_t error;
  	
  	/*
  	*****************************************************************************
 @@ -1283,7 +1610,38 @@ static void arcmsr_hbb_postqueue_isr(str
  		index %= ARCMSR_MAX_HBB_POSTQUEUE;     /*if last index number set it to 0 */
  		phbbmu->doneq_index=index;
  		/* check if command done with no error*/
 -		arcmsr_drain_donequeue(acb, flag_srb);
 +        error=(flag_srb & ARCMSR_SRBREPLY_FLAG_ERROR_MODE0)?TRUE:FALSE;
 +		arcmsr_drain_donequeue(acb, flag_srb, error);
 +	}	/*drain reply FIFO*/
 +	return;
 +}
 +/*
 +**************************************************************************
 +**************************************************************************
 +*/
 +static void arcmsr_hbc_postqueue_isr(struct AdapterControlBlock *acb)
 +{
 +	u_int32_t flag_srb,throttling=0;
 +	u_int16_t error;
 +	
 +	/*
 +	*****************************************************************************
 +	**               areca cdb command done
 +	*****************************************************************************
 +	*/
 +	bus_dmamap_sync(acb->srb_dmat, acb->srb_dmamap, BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
 +		
 +	while(CHIP_REG_READ32(HBC_MessageUnit, 0, host_int_status) & ARCMSR_HBCMU_OUTBOUND_POSTQUEUE_ISR) {
 +		
 +		flag_srb=CHIP_REG_READ32(HBC_MessageUnit, 0, outbound_queueport_low);
 +		/* check if command done with no error*/
 +        error=(flag_srb & ARCMSR_SRBREPLY_FLAG_ERROR_MODE1)?TRUE:FALSE;
 +		arcmsr_drain_donequeue(acb, flag_srb, error);
 +        if(throttling==ARCMSR_HBC_ISR_THROTTLING_LEVEL) {
 +            CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_doorbell,ARCMSR_HBCMU_DRV2IOP_POSTQUEUE_THROTTLING);
 +            break;
 +        }
 +        throttling++;
  	}	/*drain reply FIFO*/
  	return;
  }
 @@ -1299,14 +1657,12 @@ static void arcmsr_handle_hba_isr( struc
  	**   check outbound intstatus 
  	*********************************************
  	*/
 -	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;
  	if(!outbound_intstatus) {
  		/*it must be share irq*/
  		return;
  	}
 -	CHIP_REG_WRITE32(HBA_MessageUnit, 
 -	0, outbound_intstatus, outbound_intstatus);/*clear interrupt*/
 +	CHIP_REG_WRITE32(HBA_MessageUnit, 0, outbound_intstatus, outbound_intstatus);/*clear interrupt*/
  	/* MU doorbell interrupts*/
  	if(outbound_intstatus & ARCMSR_MU_OUTBOUND_DOORBELL_INT) {
  		arcmsr_hba_doorbell_isr(acb);
 @@ -1315,6 +1671,9 @@ static void arcmsr_handle_hba_isr( struc
  	if(outbound_intstatus & ARCMSR_MU_OUTBOUND_POSTQUEUE_INT) {
  		arcmsr_hba_postqueue_isr(acb);
  	}
 +	if(outbound_intstatus & ARCMSR_MU_OUTBOUND_MESSAGE0_INT) {
 +		arcmsr_hba_message_isr(acb);
 +	}
  	return;
  }
  /*
 @@ -1348,6 +1707,36 @@ static void arcmsr_handle_hbb_isr( struc
  	if(outbound_doorbell & ARCMSR_IOP2DRV_CDB_DONE) {
 
 *** 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-unsubscribe@freebsd.org"
 
State-Changed-From-To: patched->closed 
State-Changed-By: delphij 
State-Changed-When: Wed Aug 4 01:50:31 UTC 2010 
State-Changed-Why:  
MFCed to 7/8 stable. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=148502 
>Unformatted:
