|
@@ -195,6 +195,7 @@ static int sendcmd_withirq_core(ctlr_info_t *h, CommandList_struct *c,
|
|
|
static int process_sendcmd_error(ctlr_info_t *h, CommandList_struct *c);
|
|
|
|
|
|
static void fail_all_cmds(unsigned long ctlr);
|
|
|
+static int add_to_scan_list(struct ctlr_info *h);
|
|
|
static int scan_thread(void *data);
|
|
|
static int check_for_unit_attention(ctlr_info_t *h, CommandList_struct *c);
|
|
|
|
|
@@ -460,9 +461,19 @@ static void __devinit cciss_procinit(int i)
|
|
|
#define to_hba(n) container_of(n, struct ctlr_info, dev)
|
|
|
#define to_drv(n) container_of(n, drive_info_struct, dev)
|
|
|
|
|
|
-static struct device_type cciss_host_type = {
|
|
|
- .name = "cciss_host",
|
|
|
-};
|
|
|
+static ssize_t host_store_rescan(struct device *dev,
|
|
|
+ struct device_attribute *attr,
|
|
|
+ const char *buf, size_t count)
|
|
|
+{
|
|
|
+ struct ctlr_info *h = to_hba(dev);
|
|
|
+
|
|
|
+ add_to_scan_list(h);
|
|
|
+ wake_up_process(cciss_scan_thread);
|
|
|
+ wait_for_completion_interruptible(&h->scan_wait);
|
|
|
+
|
|
|
+ return count;
|
|
|
+}
|
|
|
+DEVICE_ATTR(rescan, S_IWUSR, NULL, host_store_rescan);
|
|
|
|
|
|
static ssize_t dev_show_unique_id(struct device *dev,
|
|
|
struct device_attribute *attr,
|
|
@@ -566,6 +577,25 @@ static ssize_t dev_show_rev(struct device *dev,
|
|
|
}
|
|
|
DEVICE_ATTR(rev, S_IRUGO, dev_show_rev, NULL);
|
|
|
|
|
|
+static struct attribute *cciss_host_attrs[] = {
|
|
|
+ &dev_attr_rescan.attr,
|
|
|
+ NULL
|
|
|
+};
|
|
|
+
|
|
|
+static struct attribute_group cciss_host_attr_group = {
|
|
|
+ .attrs = cciss_host_attrs,
|
|
|
+};
|
|
|
+
|
|
|
+static struct attribute_group *cciss_host_attr_groups[] = {
|
|
|
+ &cciss_host_attr_group,
|
|
|
+ NULL
|
|
|
+};
|
|
|
+
|
|
|
+static struct device_type cciss_host_type = {
|
|
|
+ .name = "cciss_host",
|
|
|
+ .groups = cciss_host_attr_groups,
|
|
|
+};
|
|
|
+
|
|
|
static struct attribute *cciss_dev_attrs[] = {
|
|
|
&dev_attr_unique_id.attr,
|
|
|
&dev_attr_model.attr,
|