summaryrefslogtreecommitdiffstats
path: root/sys/dev/hpt27xx
diff options
context:
space:
mode:
authordelphij <delphij@FreeBSD.org>2013-07-05 23:13:54 +0000
committerdelphij <delphij@FreeBSD.org>2013-07-05 23:13:54 +0000
commita9fa8698ffd1caaec1b00c94dbabca108bcf2239 (patch)
treeb0aee2f2ca7c02b9ffa17eff5621565a053c0dfa /sys/dev/hpt27xx
parent277958ee924098df32131b01a440a61e5aa9e995 (diff)
downloadFreeBSD-src-a9fa8698ffd1caaec1b00c94dbabca108bcf2239.zip
FreeBSD-src-a9fa8698ffd1caaec1b00c94dbabca108bcf2239.tar.gz
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
Diffstat (limited to 'sys/dev/hpt27xx')
-rw-r--r--sys/dev/hpt27xx/hpt27xx_config.c2
-rw-r--r--sys/dev/hpt27xx/osm_bsd.c45
2 files changed, 14 insertions, 33 deletions
diff --git a/sys/dev/hpt27xx/hpt27xx_config.c b/sys/dev/hpt27xx/hpt27xx_config.c
index 5203f4a..c37862b 100644
--- a/sys/dev/hpt27xx/hpt27xx_config.c
+++ b/sys/dev/hpt27xx/hpt27xx_config.c
@@ -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;
diff --git a/sys/dev/hpt27xx/osm_bsd.c b/sys/dev/hpt27xx/osm_bsd.c
index 59707ca..636906d 100644
--- a/sys/dev/hpt27xx/osm_bsd.c
+++ b/sys/dev/hpt27xx/osm_bsd.c
@@ -944,7 +944,6 @@ static void hpt_stop_tasks(PVBUS_EXT vbus_ext)
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;
-}
OpenPOWER on IntegriCloud