Author: delphij
Date: Thu Oct  3 23:52:02 2013
New Revision: 256033
URL: http://svnweb.freebsd.org/changeset/base/256033

Log:
  MFC r255718:
  
  Update arcmsr(4) driver to 1.20.00.28 which fixes mutex recursion in
  CCB abort codepath.
  
  Many thanks to Areca for continuing to support FreeBSD.
  
  Submitted by: 黃清隆 <ching2048 areca com tw>

Modified:
  stable/9/sys/dev/arcmsr/arcmsr.c
Directory Properties:
  stable/9/sys/   (props changed)
  stable/9/sys/dev/   (props changed)

Modified: stable/9/sys/dev/arcmsr/arcmsr.c
==============================================================================
--- stable/9/sys/dev/arcmsr/arcmsr.c    Thu Oct  3 22:52:03 2013        
(r256032)
+++ stable/9/sys/dev/arcmsr/arcmsr.c    Thu Oct  3 23:52:02 2013        
(r256033)
@@ -74,6 +74,7 @@
 ** 1.20.00.25   08/17/2012  Ching Huang     Fixed hotplug device no function 
on type A adapter
 ** 1.20.00.26   12/14/2012  Ching Huang     Added support 
ARC1214,1224,1264,1284
 ** 1.20.00.27   05/06/2013  Ching Huang     Fixed out standing cmd full on 
ARC-12x4
+** 1.20.00.28   09/13/2013  Ching Huang     Removed recursive mutex in 
arcmsr_abort_dr_ccbs
 
******************************************************************************************
 */
 
@@ -145,7 +146,7 @@ __FBSDID("$FreeBSD$");
 #define arcmsr_callout_init(a) callout_init(a);
 #endif
 
-#define ARCMSR_DRIVER_VERSION  "Driver Version 1.20.00.27 2013-05-06"
+#define ARCMSR_DRIVER_VERSION  "arcmsr version 1.20.00.28 2013-09-13"
 #include <dev/arcmsr/arcmsr.h>
 /*
 **************************************************************************
@@ -1622,7 +1623,6 @@ static void arcmsr_abort_dr_ccbs(struct 
        u_int32_t intmask_org;
        int i;
 
-       ARCMSR_LOCK_ACQUIRE(&acb->isr_lock);
        /* disable all outbound interrupts */
        intmask_org = arcmsr_disable_allintr(acb);
        for (i = 0; i < ARCMSR_MAX_FREESRB_NUM; i++)
@@ -1641,7 +1641,6 @@ static void arcmsr_abort_dr_ccbs(struct 
        }
        /* enable outbound Post Queue, outbound doorbell Interrupt */
        arcmsr_enable_allintr(acb, intmask_org);
-       ARCMSR_LOCK_RELEASE(&acb->isr_lock);
 }
 /*
 **************************************************************************
@@ -3425,8 +3424,7 @@ static void arcmsr_get_hba_config(struct
                acb_device_map++;
                i++;
        }
-       printf("ARECA RAID ADAPTER%d: %s \n", acb->pci_unit, 
ARCMSR_DRIVER_VERSION);
-       printf("ARECA RAID ADAPTER%d: FIRMWARE VERSION %s \n", acb->pci_unit, 
acb->firm_version);
+       printf("Areca RAID adapter%d: %s F/W version %s \n", acb->pci_unit, 
acb->firm_model, acb->firm_version);
        acb->firm_request_len = CHIP_REG_READ32(HBA_MessageUnit, 0, 
msgcode_rwbuffer[1]);   /*firm_request_len, 1, 04-07*/
        acb->firm_numbers_queue = CHIP_REG_READ32(HBA_MessageUnit, 0, 
msgcode_rwbuffer[2]); /*firm_numbers_queue, 2, 08-11*/
        acb->firm_sdram_size = CHIP_REG_READ32(HBA_MessageUnit, 0, 
msgcode_rwbuffer[3]);    /*firm_sdram_size, 3, 12-15*/
@@ -3475,8 +3473,7 @@ static void arcmsr_get_hbb_config(struct
                acb_device_map++;
                i++;
        }
-       printf("ARECA RAID ADAPTER%d: %s \n", acb->pci_unit, 
ARCMSR_DRIVER_VERSION);
-       printf("ARECA RAID ADAPTER%d: FIRMWARE VERSION %s \n", acb->pci_unit, 
acb->firm_version);
+       printf("Areca RAID adapter%d: %s F/W version %s \n", acb->pci_unit, 
acb->firm_model, acb->firm_version);
        acb->firm_request_len = CHIP_REG_READ32(HBB_RWBUFFER, 1, 
msgcode_rwbuffer[1]);   /*firm_request_len, 1, 04-07*/
        acb->firm_numbers_queue = CHIP_REG_READ32(HBB_RWBUFFER, 1, 
msgcode_rwbuffer[2]); /*firm_numbers_queue, 2, 08-11*/
        acb->firm_sdram_size = CHIP_REG_READ32(HBB_RWBUFFER, 1, 
msgcode_rwbuffer[3]);    /*firm_sdram_size, 3, 12-15*/
@@ -3526,8 +3523,7 @@ static void arcmsr_get_hbc_config(struct
                acb_device_map++;
                i++;
        }
-       printf("ARECA RAID ADAPTER%d: %s \n", acb->pci_unit, 
ARCMSR_DRIVER_VERSION);
-       printf("ARECA RAID ADAPTER%d: FIRMWARE VERSION %s \n", acb->pci_unit, 
acb->firm_version);
+       printf("Areca RAID adapter%d: %s F/W version %s \n", acb->pci_unit, 
acb->firm_model, acb->firm_version);
        acb->firm_request_len   = CHIP_REG_READ32(HBC_MessageUnit, 0, 
msgcode_rwbuffer[1]);     /*firm_request_len,   1, 04-07*/
        acb->firm_numbers_queue = CHIP_REG_READ32(HBC_MessageUnit, 0, 
msgcode_rwbuffer[2]);     /*firm_numbers_queue, 2, 08-11*/
        acb->firm_sdram_size    = CHIP_REG_READ32(HBC_MessageUnit, 0, 
msgcode_rwbuffer[3]);     /*firm_sdram_size,    3, 12-15*/
@@ -3578,8 +3574,7 @@ static void arcmsr_get_hbd_config(struct
                acb_device_map++;
                i++;
        }
-       printf("ARECA RAID ADAPTER%d: %s \n", acb->pci_unit, 
ARCMSR_DRIVER_VERSION);
-       printf("ARECA RAID ADAPTER%d: FIRMWARE VERSION %s \n", acb->pci_unit, 
acb->firm_version);
+       printf("Areca RAID adapter%d: %s F/W version %s \n", acb->pci_unit, 
acb->firm_model, acb->firm_version);
        acb->firm_request_len   = CHIP_REG_READ32(HBD_MessageUnit, 0, 
msgcode_rwbuffer[2]);     /*firm_request_len,   1, 04-07*/
        acb->firm_numbers_queue = CHIP_REG_READ32(HBD_MessageUnit, 0, 
msgcode_rwbuffer[3]);     /*firm_numbers_queue, 2, 08-11*/
        acb->firm_sdram_size    = CHIP_REG_READ32(HBD_MessageUnit, 0, 
msgcode_rwbuffer[4]);     /*firm_sdram_size,    3, 12-15*/
@@ -4264,6 +4259,8 @@ static int arcmsr_attach(device_t dev)
                return (ENOMEM);
        }
        arcmsr_mutex_init(acb);
+       acb->pci_dev = dev;
+       acb->pci_unit = unit;
        if(arcmsr_initialize(dev)) {
                printf("arcmsr%d: initialize failure!\n", unit);
                arcmsr_mutex_destroy(acb);
@@ -4284,8 +4281,6 @@ static int arcmsr_attach(device_t dev)
                return ENXIO;
        }
        acb->irqres = irqres;
-       acb->pci_dev = dev;
-       acb->pci_unit = unit;
        /*
         * Now let the CAM generic SCSI layer find the SCSI devices on
         * the bus *  start queue to reset to the idle loop. *
@@ -4367,7 +4362,7 @@ static int arcmsr_probe(device_t dev)
 {
        u_int32_t id;
        static char buf[256];
-       char x_type[]={"X-TYPE"};
+       char x_type[]={"unknown"};
        char *type;
        int raid6 = 1;
        
@@ -4413,11 +4408,13 @@ static int arcmsr_probe(device_t dev)
                break;
        default:
                type = x_type;
+               raid6 = 0;
                break;
        }
        if(type == x_type)
                return(ENXIO);
-       sprintf(buf, "Areca %s Host Adapter RAID Controller %s\n", type, raid6 
? "(RAID6 capable)" : "");
+       sprintf(buf, "Areca %s Host Adapter RAID Controller %s\n%s\n",
+               type, raid6 ? "(RAID6 capable)" : "", ARCMSR_DRIVER_VERSION);
        device_set_desc_copy(dev, buf);
        return 0;
 }
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-stable-9
To unsubscribe, send any mail to "[email protected]"

Reply via email to