Author: delphij
Date: Fri Jul  5 23:13:54 2013
New Revision: 252852
URL: http://svnweb.freebsd.org/changeset/base/252852

Log:
  Update hpt27xx(4) driver to address a problem reported by FreeNAS
  user, where when more than one hpt27xx adapters are being used,
  the "unit number" stays at 0.
  
  Many thanks to HighPoint for providing this driver update.
  
  MFC after:    1 day

Modified:
  head/sys/dev/hpt27xx/hpt27xx_config.c
  head/sys/dev/hpt27xx/osm_bsd.c

Modified: head/sys/dev/hpt27xx/hpt27xx_config.c
==============================================================================
--- head/sys/dev/hpt27xx/hpt27xx_config.c       Fri Jul  5 23:10:02 2013        
(r252851)
+++ head/sys/dev/hpt27xx/hpt27xx_config.c       Fri Jul  5 23:13:54 2013        
(r252852)
@@ -60,7 +60,7 @@ int init_config(void)
 
 const char driver_name[] = "hpt27xx";
 const char driver_name_long[] = "RocketRAID 27xx controller driver";
-const char driver_ver[] = "v1.0";
+const char driver_ver[] = "v1.1";
 int  osm_max_targets = 0xff;
 
 

Modified: head/sys/dev/hpt27xx/osm_bsd.c
==============================================================================
--- head/sys/dev/hpt27xx/osm_bsd.c      Fri Jul  5 23:10:02 2013        
(r252851)
+++ head/sys/dev/hpt27xx/osm_bsd.c      Fri Jul  5 23:13:54 2013        
(r252852)
@@ -944,7 +944,6 @@ static void hpt_stop_tasks(PVBUS_EXT vbu
 static d_open_t        hpt_open;
 static d_close_t       hpt_close;
 static d_ioctl_t       hpt_ioctl;
-static void            hpt_bus_scan_cb(struct cam_periph *periph, union ccb 
*ccb);
 static  int            hpt_rescan_bus(void);
 
 static struct cdevsw hpt_cdevsw = {
@@ -974,7 +973,7 @@ static struct intr_config_hook hpt_ich;
  */
 static void hpt_final_init(void *dummy)
 {
-       int       i;
+       int       i,unit_number=0;
        PVBUS_EXT vbus_ext;
        PVBUS vbus;
        PHBA hba;
@@ -1058,12 +1057,12 @@ static void hpt_final_init(void *dummy)
 
 #if __FreeBSD_version > 700025
                vbus_ext->sim = cam_sim_alloc(hpt_action, hpt_poll, driver_name,
-                               vbus_ext, 0, &Giant, os_max_queue_comm, 
/*tagged*/8,  devq);
+                               vbus_ext, unit_number, &Giant, 
os_max_queue_comm, /*tagged*/8,  devq);
 #else 
                vbus_ext->sim = cam_sim_alloc(hpt_action, hpt_poll, driver_name,
-                               vbus_ext, 0, os_max_queue_comm, /*tagged*/8,  
devq);
+                               vbus_ext, unit_number, os_max_queue_comm, 
/*tagged*/8,  devq);
 #endif
-                               
+               unit_number++;
                if (!vbus_ext->sim) {
                        os_printk("cam_sim_alloc failed");
                        cam_simq_free(devq);
@@ -1337,44 +1336,26 @@ invalid:
 
 static int     hpt_rescan_bus(void)
 {
-       struct cam_path         *path;
        union ccb                       *ccb;
        PVBUS                           vbus;
        PVBUS_EXT                       vbus_ext;       
                
-#if (__FreeBSD_version >= 500000)
        mtx_lock(&Giant);
-#endif
 
        ldm_for_each_vbus(vbus, vbus_ext) {
-               if (xpt_create_path(&path, NULL, cam_sim_path(vbus_ext->sim),
+               if ((ccb = xpt_alloc_ccb()) == NULL)
+               {
+                       return(ENOMEM);
+               }
+               if (xpt_create_path(&ccb->ccb_h.path, NULL, 
cam_sim_path(vbus_ext->sim),
                        CAM_TARGET_WILDCARD, CAM_LUN_WILDCARD) != CAM_REQ_CMP)  
+               {
+                       xpt_free_ccb(ccb);
                        return(EIO);
-               if ((ccb = malloc(sizeof(union ccb), M_TEMP, M_WAITOK)) == NULL)
-                       return(ENOMEM);
-               bzero(ccb, sizeof(union ccb));
-               xpt_setup_ccb(&ccb->ccb_h, path, 5);
-               ccb->ccb_h.func_code = XPT_SCAN_BUS;
-               ccb->ccb_h.cbfcnp = hpt_bus_scan_cb;
-               ccb->crcn.flags = CAM_FLAG_NONE;
-               xpt_action(ccb);
+               }
+               xpt_rescan(ccb);
        }
-       
-#if (__FreeBSD_version >= 500000)
        mtx_unlock(&Giant);
-#endif
-
        return(0);      
 }
 
-static void    hpt_bus_scan_cb(struct cam_periph *periph, union ccb *ccb)
-{
-       if (ccb->ccb_h.status != CAM_REQ_CMP)
-               KdPrint(("cam_scan_callback: failure status = 
%x",ccb->ccb_h.status));
-       else
-               KdPrint(("Scan bus successfully!"));
-
-       xpt_free_path(ccb->ccb_h.path);
-       free(ccb, M_TEMP);
-       return;
-}
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to