]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/s390/crypto/ap_card.c
Merge tag 'platform-drivers-x86-v4.12-2' of git://git.infradead.org/linux-platform...
[karo-tx-linux.git] / drivers / s390 / crypto / ap_card.c
index 0110d44172a3a5bd3b9c5ffa82464efeba34f461..836efac968137aaa297b82476a96a7ee306c1f6a 100644 (file)
@@ -58,9 +58,9 @@ static ssize_t ap_functions_show(struct device *dev,
 
 static DEVICE_ATTR(ap_functions, 0444, ap_functions_show, NULL);
 
-static ssize_t ap_request_count_show(struct device *dev,
-                                    struct device_attribute *attr,
-                                    char *buf)
+static ssize_t ap_req_count_show(struct device *dev,
+                                struct device_attribute *attr,
+                                char *buf)
 {
        struct ap_card *ac = to_ap_card(dev);
        unsigned int req_cnt;
@@ -72,7 +72,23 @@ static ssize_t ap_request_count_show(struct device *dev,
        return snprintf(buf, PAGE_SIZE, "%d\n", req_cnt);
 }
 
-static DEVICE_ATTR(request_count, 0444, ap_request_count_show, NULL);
+static ssize_t ap_req_count_store(struct device *dev,
+                                 struct device_attribute *attr,
+                                 const char *buf, size_t count)
+{
+       struct ap_card *ac = to_ap_card(dev);
+       struct ap_queue *aq;
+
+       spin_lock_bh(&ap_list_lock);
+       for_each_ap_queue(aq, ac)
+               aq->total_request_count = 0;
+       spin_unlock_bh(&ap_list_lock);
+       atomic_set(&ac->total_request_count, 0);
+
+       return count;
+}
+
+static DEVICE_ATTR(request_count, 0644, ap_req_count_show, ap_req_count_store);
 
 static ssize_t ap_requestq_count_show(struct device *dev,
                                      struct device_attribute *attr, char *buf)
@@ -137,14 +153,21 @@ static const struct attribute_group *ap_card_dev_attr_groups[] = {
        NULL
 };
 
-struct device_type ap_card_type = {
+static struct device_type ap_card_type = {
        .name = "ap_card",
        .groups = ap_card_dev_attr_groups,
 };
 
 static void ap_card_device_release(struct device *dev)
 {
-       kfree(to_ap_card(dev));
+       struct ap_card *ac = to_ap_card(dev);
+
+       if (!list_empty(&ac->list)) {
+               spin_lock_bh(&ap_list_lock);
+               list_del_init(&ac->list);
+               spin_unlock_bh(&ap_list_lock);
+       }
+       kfree(ac);
 }
 
 struct ap_card *ap_card_create(int id, int queue_depth, int device_type,