diff --git a/smartmontools/os_freebsd.cpp b/smartmontools/os_freebsd.cpp index b62abb3a98030237ab9d01a25dbe6c62eea59edf..eb2a9aa8ad4ecd95d278d8981f6661a2637d6990 100644 --- a/smartmontools/os_freebsd.cpp +++ b/smartmontools/os_freebsd.cpp @@ -64,9 +64,8 @@ #include <dev/usb/usbhid.h> #endif -#define CONTROLLER_3WARE_678K 0x01 -#define CONTROLLER_3WARE_9000_CHAR 0x02 -#define CONTROLLER_3WARE_678K_CHAR 0x03 +#define CONTROLLER_3WARE_9000_CHAR 0x01 +#define CONTROLLER_3WARE_678K_CHAR 0x02 #ifndef PATHINQ_SETTINGS_SIZE #define PATHINQ_SETTINGS_SIZE 128 @@ -1840,7 +1839,10 @@ smart_device * freebsd_smart_interface::autodetect_smart_device(const char * nam smart_device * freebsd_smart_interface::get_custom_smart_device(const char * name, const char * type) { // 3Ware ? - int disknum = -1, n1 = -1, n2 = -1; + static const char * fbsd_dev_twe_ctrl = "/dev/twe"; + static const char * fbsd_dev_twa_ctrl = "/dev/twa"; + int disknum = -1, n1 = -1, n2 = -1, contr = -1; + if (sscanf(type, "3ware,%n%d%n", &n1, &disknum, &n2) == 1 || n1 == 6) { if (n2 != (int)strlen(type)) { set_err(EINVAL, "Option -d 3ware,N requires N to be a non-negative integer"); @@ -1850,11 +1852,20 @@ smart_device * freebsd_smart_interface::get_custom_smart_device(const char * nam set_err(EINVAL, "Option -d 3ware,N (N=%d) must have 0 <= N <= 127", disknum); return 0; } - // XXXX - printf("3ware detection non implemented, todo\n"); - int contr = 0; - if (contr != CONTROLLER_3WARE_9000_CHAR && contr != CONTROLLER_3WARE_678K_CHAR) - contr = CONTROLLER_3WARE_678K; + + // guess 3ware device type based on device name + if (!strncmp(fbsd_dev_twa_ctrl, name, strlen(fbsd_dev_twa_ctrl))){ + contr=CONTROLLER_3WARE_9000_CHAR; + } + if (!strncmp(fbsd_dev_twe_ctrl, name, strlen(fbsd_dev_twe_ctrl))){ + contr=CONTROLLER_3WARE_678K_CHAR; + } + + if(contr == -1){ + set_err(EINVAL, "3ware controller type unknown, use %sX or %sX devices", + fbsd_dev_twe_ctrl, fbsd_dev_twa_ctrl); + return 0; + } return new freebsd_escalade_device(this, name, contr, disknum); }