Loading...
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * Author(s)......: Holger Smolinski <Holger.Smolinski@de.ibm.com>
4 * Horst Hummel <Horst.Hummel@de.ibm.com>
5 * Carsten Otte <Cotte@de.ibm.com>
6 * Martin Schwidefsky <schwidefsky@de.ibm.com>
7 * Bugreports.to..: <Linux390@de.ibm.com>
8 * Copyright IBM Corp. 1999,2001
9 *
10 * Device mapping and dasd= parameter parsing functions. All devmap
11 * functions may not be called from interrupt context. In particular
12 * dasd_get_device is a no-no from interrupt context.
13 *
14 */
15
16#define KMSG_COMPONENT "dasd"
17
18#include <linux/ctype.h>
19#include <linux/init.h>
20#include <linux/module.h>
21#include <linux/slab.h>
22
23#include <asm/debug.h>
24#include <linux/uaccess.h>
25#include <asm/ipl.h>
26
27/* This is ugly... */
28#define PRINTK_HEADER "dasd_devmap:"
29#define DASD_MAX_PARAMS 256
30
31#include "dasd_int.h"
32
33struct kmem_cache *dasd_page_cache;
34EXPORT_SYMBOL_GPL(dasd_page_cache);
35
36/*
37 * dasd_devmap_t is used to store the features and the relation
38 * between device number and device index. To find a dasd_devmap_t
39 * that corresponds to a device number of a device index each
40 * dasd_devmap_t is added to two linked lists, one to search by
41 * the device number and one to search by the device index. As
42 * soon as big minor numbers are available the device index list
43 * can be removed since the device number will then be identical
44 * to the device index.
45 */
46struct dasd_devmap {
47 struct list_head list;
48 char bus_id[DASD_BUS_ID_SIZE];
49 unsigned int devindex;
50 unsigned short features;
51 struct dasd_device *device;
52 struct dasd_copy_relation *copy;
53 unsigned int aq_mask;
54};
55
56/*
57 * Parameter parsing functions for dasd= parameter. The syntax is:
58 * <devno> : (0x)?[0-9a-fA-F]+
59 * <busid> : [0-0a-f]\.[0-9a-f]\.(0x)?[0-9a-fA-F]+
60 * <feature> : ro
61 * <feature_list> : \(<feature>(:<feature>)*\)
62 * <devno-range> : <devno>(-<devno>)?<feature_list>?
63 * <busid-range> : <busid>(-<busid>)?<feature_list>?
64 * <devices> : <devno-range>|<busid-range>
65 * <dasd_module> : dasd_diag_mod|dasd_eckd_mod|dasd_fba_mod
66 *
67 * <dasd> : autodetect|probeonly|<devices>(,<devices>)*
68 */
69
70int dasd_probeonly = 0; /* is true, when probeonly mode is active */
71int dasd_autodetect = 0; /* is true, when autodetection is active */
72int dasd_nopav = 0; /* is true, when PAV is disabled */
73EXPORT_SYMBOL_GPL(dasd_nopav);
74int dasd_nofcx; /* disable High Performance Ficon */
75EXPORT_SYMBOL_GPL(dasd_nofcx);
76
77/*
78 * char *dasd[] is intended to hold the ranges supplied by the dasd= statement
79 * it is named 'dasd' to directly be filled by insmod with the comma separated
80 * strings when running as a module.
81 */
82static char *dasd[DASD_MAX_PARAMS];
83module_param_array(dasd, charp, NULL, S_IRUGO);
84
85/*
86 * Single spinlock to protect devmap and servermap structures and lists.
87 */
88static DEFINE_SPINLOCK(dasd_devmap_lock);
89
90/*
91 * Hash lists for devmap structures.
92 */
93static struct list_head dasd_hashlists[256];
94int dasd_max_devindex;
95
96static struct dasd_devmap *dasd_add_busid(const char *, int);
97
98static inline int
99dasd_hash_busid(const char *bus_id)
100{
101 int hash, i;
102
103 hash = 0;
104 for (i = 0; (i < DASD_BUS_ID_SIZE) && *bus_id; i++, bus_id++)
105 hash += *bus_id;
106 return hash & 0xff;
107}
108
109#ifndef MODULE
110static int __init dasd_call_setup(char *opt)
111{
112 static int i __initdata;
113 char *tmp;
114
115 while (i < DASD_MAX_PARAMS) {
116 tmp = strsep(&opt, ",");
117 if (!tmp)
118 break;
119
120 dasd[i++] = tmp;
121 }
122
123 return 1;
124}
125
126__setup ("dasd=", dasd_call_setup);
127#endif /* #ifndef MODULE */
128
129#define DASD_IPLDEV "ipldev"
130
131/*
132 * Read a device busid/devno from a string.
133 */
134static int dasd_busid(char *str, int *id0, int *id1, int *devno)
135{
136 unsigned int val;
137 char *tok;
138
139 /* Interpret ipldev busid */
140 if (strncmp(DASD_IPLDEV, str, strlen(DASD_IPLDEV)) == 0) {
141 if (ipl_info.type != IPL_TYPE_CCW) {
142 pr_err("The IPL device is not a CCW device\n");
143 return -EINVAL;
144 }
145 *id0 = 0;
146 *id1 = ipl_info.data.ccw.dev_id.ssid;
147 *devno = ipl_info.data.ccw.dev_id.devno;
148
149 return 0;
150 }
151
152 /* Old style 0xXXXX or XXXX */
153 if (!kstrtouint(str, 16, &val)) {
154 *id0 = *id1 = 0;
155 if (val > 0xffff)
156 return -EINVAL;
157 *devno = val;
158 return 0;
159 }
160
161 /* New style x.y.z busid */
162 tok = strsep(&str, ".");
163 if (kstrtouint(tok, 16, &val) || val > 0xff)
164 return -EINVAL;
165 *id0 = val;
166
167 tok = strsep(&str, ".");
168 if (kstrtouint(tok, 16, &val) || val > 0xff)
169 return -EINVAL;
170 *id1 = val;
171
172 tok = strsep(&str, ".");
173 if (kstrtouint(tok, 16, &val) || val > 0xffff)
174 return -EINVAL;
175 *devno = val;
176
177 return 0;
178}
179
180/*
181 * Read colon separated list of dasd features.
182 */
183static int __init dasd_feature_list(char *str)
184{
185 int features, len, rc;
186
187 features = 0;
188 rc = 0;
189
190 if (!str)
191 return DASD_FEATURE_DEFAULT;
192
193 while (1) {
194 for (len = 0;
195 str[len] && str[len] != ':' && str[len] != ')'; len++);
196 if (len == 2 && !strncmp(str, "ro", 2))
197 features |= DASD_FEATURE_READONLY;
198 else if (len == 4 && !strncmp(str, "diag", 4))
199 features |= DASD_FEATURE_USEDIAG;
200 else if (len == 3 && !strncmp(str, "raw", 3))
201 features |= DASD_FEATURE_USERAW;
202 else if (len == 6 && !strncmp(str, "erplog", 6))
203 features |= DASD_FEATURE_ERPLOG;
204 else if (len == 8 && !strncmp(str, "failfast", 8))
205 features |= DASD_FEATURE_FAILFAST;
206 else {
207 pr_warn("%.*s is not a supported device option\n",
208 len, str);
209 rc = -EINVAL;
210 }
211 str += len;
212 if (*str != ':')
213 break;
214 str++;
215 }
216
217 return rc ? : features;
218}
219
220/*
221 * Try to match the first element on the comma separated parse string
222 * with one of the known keywords. If a keyword is found, take the approprate
223 * action and return a pointer to the residual string. If the first element
224 * could not be matched to any keyword then return an error code.
225 */
226static int __init dasd_parse_keyword(char *keyword)
227{
228 int length = strlen(keyword);
229
230 if (strncmp("autodetect", keyword, length) == 0) {
231 dasd_autodetect = 1;
232 pr_info("The autodetection mode has been activated\n");
233 return 0;
234 }
235 if (strncmp("probeonly", keyword, length) == 0) {
236 dasd_probeonly = 1;
237 pr_info("The probeonly mode has been activated\n");
238 return 0;
239 }
240 if (strncmp("nopav", keyword, length) == 0) {
241 if (MACHINE_IS_VM)
242 pr_info("'nopav' is not supported on z/VM\n");
243 else {
244 dasd_nopav = 1;
245 pr_info("PAV support has be deactivated\n");
246 }
247 return 0;
248 }
249 if (strncmp("nofcx", keyword, length) == 0) {
250 dasd_nofcx = 1;
251 pr_info("High Performance FICON support has been "
252 "deactivated\n");
253 return 0;
254 }
255 if (strncmp("fixedbuffers", keyword, length) == 0) {
256 if (dasd_page_cache)
257 return 0;
258 dasd_page_cache =
259 kmem_cache_create("dasd_page_cache", PAGE_SIZE,
260 PAGE_SIZE, SLAB_CACHE_DMA,
261 NULL);
262 if (!dasd_page_cache)
263 DBF_EVENT(DBF_WARNING, "%s", "Failed to create slab, "
264 "fixed buffer mode disabled.");
265 else
266 DBF_EVENT(DBF_INFO, "%s",
267 "turning on fixed buffer mode");
268 return 0;
269 }
270
271 return -EINVAL;
272}
273
274/*
275 * Split a string of a device range into its pieces and return the from, to, and
276 * feature parts separately.
277 * e.g.:
278 * 0.0.1234-0.0.5678(ro:erplog) -> from: 0.0.1234 to: 0.0.5678 features: ro:erplog
279 * 0.0.8765(raw) -> from: 0.0.8765 to: null features: raw
280 * 0x4321 -> from: 0x4321 to: null features: null
281 */
282static int __init dasd_evaluate_range_param(char *range, char **from_str,
283 char **to_str, char **features_str)
284{
285 int rc = 0;
286
287 /* Do we have a range or a single device? */
288 if (strchr(range, '-')) {
289 *from_str = strsep(&range, "-");
290 *to_str = strsep(&range, "(");
291 *features_str = strsep(&range, ")");
292 } else {
293 *from_str = strsep(&range, "(");
294 *features_str = strsep(&range, ")");
295 }
296
297 if (*features_str && !range) {
298 pr_warn("A closing parenthesis ')' is missing in the dasd= parameter\n");
299 rc = -EINVAL;
300 }
301
302 return rc;
303}
304
305/*
306 * Try to interprete the range string as a device number or a range of devices.
307 * If the interpretation is successful, create the matching dasd_devmap entries.
308 * If interpretation fails or in case of an error, return an error code.
309 */
310static int __init dasd_parse_range(const char *range)
311{
312 struct dasd_devmap *devmap;
313 int from, from_id0, from_id1;
314 int to, to_id0, to_id1;
315 int features;
316 char bus_id[DASD_BUS_ID_SIZE + 1];
317 char *features_str = NULL;
318 char *from_str = NULL;
319 char *to_str = NULL;
320 int rc = 0;
321 char *tmp;
322
323 tmp = kstrdup(range, GFP_KERNEL);
324 if (!tmp)
325 return -ENOMEM;
326
327 if (dasd_evaluate_range_param(tmp, &from_str, &to_str, &features_str)) {
328 rc = -EINVAL;
329 goto out;
330 }
331
332 if (dasd_busid(from_str, &from_id0, &from_id1, &from)) {
333 rc = -EINVAL;
334 goto out;
335 }
336
337 to = from;
338 to_id0 = from_id0;
339 to_id1 = from_id1;
340 if (to_str) {
341 if (dasd_busid(to_str, &to_id0, &to_id1, &to)) {
342 rc = -EINVAL;
343 goto out;
344 }
345 if (from_id0 != to_id0 || from_id1 != to_id1 || from > to) {
346 pr_err("%s is not a valid device range\n", range);
347 rc = -EINVAL;
348 goto out;
349 }
350 }
351
352 features = dasd_feature_list(features_str);
353 if (features < 0) {
354 rc = -EINVAL;
355 goto out;
356 }
357 /* each device in dasd= parameter should be set initially online */
358 features |= DASD_FEATURE_INITIAL_ONLINE;
359 while (from <= to) {
360 sprintf(bus_id, "%01x.%01x.%04x", from_id0, from_id1, from++);
361 devmap = dasd_add_busid(bus_id, features);
362 if (IS_ERR(devmap)) {
363 rc = PTR_ERR(devmap);
364 goto out;
365 }
366 }
367
368out:
369 kfree(tmp);
370
371 return rc;
372}
373
374/*
375 * Parse parameters stored in dasd[]
376 * The 'dasd=...' parameter allows to specify a comma separated list of
377 * keywords and device ranges. The parameters in that list will be stored as
378 * separate elementes in dasd[].
379 */
380int __init dasd_parse(void)
381{
382 int rc, i;
383 char *cur;
384
385 rc = 0;
386 for (i = 0; i < DASD_MAX_PARAMS; i++) {
387 cur = dasd[i];
388 if (!cur)
389 break;
390 if (*cur == '\0')
391 continue;
392
393 rc = dasd_parse_keyword(cur);
394 if (rc)
395 rc = dasd_parse_range(cur);
396
397 if (rc)
398 break;
399 }
400
401 return rc;
402}
403
404/*
405 * Add a devmap for the device specified by busid. It is possible that
406 * the devmap already exists (dasd= parameter). The order of the devices
407 * added through this function will define the kdevs for the individual
408 * devices.
409 */
410static struct dasd_devmap *
411dasd_add_busid(const char *bus_id, int features)
412{
413 struct dasd_devmap *devmap, *new, *tmp;
414 int hash;
415
416 new = kzalloc(sizeof(struct dasd_devmap), GFP_KERNEL);
417 if (!new)
418 return ERR_PTR(-ENOMEM);
419 spin_lock(&dasd_devmap_lock);
420 devmap = NULL;
421 hash = dasd_hash_busid(bus_id);
422 list_for_each_entry(tmp, &dasd_hashlists[hash], list)
423 if (strncmp(tmp->bus_id, bus_id, DASD_BUS_ID_SIZE) == 0) {
424 devmap = tmp;
425 break;
426 }
427 if (!devmap) {
428 /* This bus_id is new. */
429 new->devindex = dasd_max_devindex++;
430 strscpy(new->bus_id, bus_id, DASD_BUS_ID_SIZE);
431 new->features = features;
432 new->device = NULL;
433 list_add(&new->list, &dasd_hashlists[hash]);
434 devmap = new;
435 new = NULL;
436 }
437 spin_unlock(&dasd_devmap_lock);
438 kfree(new);
439 return devmap;
440}
441
442static struct dasd_devmap *
443dasd_find_busid_locked(const char *bus_id)
444{
445 struct dasd_devmap *devmap, *tmp;
446 int hash;
447
448 devmap = ERR_PTR(-ENODEV);
449 hash = dasd_hash_busid(bus_id);
450 list_for_each_entry(tmp, &dasd_hashlists[hash], list) {
451 if (strncmp(tmp->bus_id, bus_id, DASD_BUS_ID_SIZE) == 0) {
452 devmap = tmp;
453 break;
454 }
455 }
456 return devmap;
457}
458
459/*
460 * Find devmap for device with given bus_id.
461 */
462static struct dasd_devmap *
463dasd_find_busid(const char *bus_id)
464{
465 struct dasd_devmap *devmap;
466
467 spin_lock(&dasd_devmap_lock);
468 devmap = dasd_find_busid_locked(bus_id);
469 spin_unlock(&dasd_devmap_lock);
470 return devmap;
471}
472
473/*
474 * Check if busid has been added to the list of dasd ranges.
475 */
476int
477dasd_busid_known(const char *bus_id)
478{
479 return IS_ERR(dasd_find_busid(bus_id)) ? -ENOENT : 0;
480}
481
482/*
483 * Forget all about the device numbers added so far.
484 * This may only be called at module unload or system shutdown.
485 */
486static void
487dasd_forget_ranges(void)
488{
489 struct dasd_devmap *devmap, *n;
490 int i;
491
492 spin_lock(&dasd_devmap_lock);
493 for (i = 0; i < 256; i++) {
494 list_for_each_entry_safe(devmap, n, &dasd_hashlists[i], list) {
495 BUG_ON(devmap->device != NULL);
496 list_del(&devmap->list);
497 kfree(devmap);
498 }
499 }
500 spin_unlock(&dasd_devmap_lock);
501}
502
503/*
504 * Find the device struct by its device index.
505 */
506struct dasd_device *
507dasd_device_from_devindex(int devindex)
508{
509 struct dasd_devmap *devmap, *tmp;
510 struct dasd_device *device;
511 int i;
512
513 spin_lock(&dasd_devmap_lock);
514 devmap = NULL;
515 for (i = 0; (i < 256) && !devmap; i++)
516 list_for_each_entry(tmp, &dasd_hashlists[i], list)
517 if (tmp->devindex == devindex) {
518 /* Found the devmap for the device. */
519 devmap = tmp;
520 break;
521 }
522 if (devmap && devmap->device) {
523 device = devmap->device;
524 dasd_get_device(device);
525 } else
526 device = ERR_PTR(-ENODEV);
527 spin_unlock(&dasd_devmap_lock);
528 return device;
529}
530
531/*
532 * Return devmap for cdev. If no devmap exists yet, create one and
533 * connect it to the cdev.
534 */
535static struct dasd_devmap *
536dasd_devmap_from_cdev(struct ccw_device *cdev)
537{
538 struct dasd_devmap *devmap;
539
540 devmap = dasd_find_busid(dev_name(&cdev->dev));
541 if (IS_ERR(devmap))
542 devmap = dasd_add_busid(dev_name(&cdev->dev),
543 DASD_FEATURE_DEFAULT);
544 return devmap;
545}
546
547/*
548 * Create a dasd device structure for cdev.
549 */
550struct dasd_device *
551dasd_create_device(struct ccw_device *cdev)
552{
553 struct dasd_devmap *devmap;
554 struct dasd_device *device;
555 unsigned long flags;
556 int rc;
557
558 devmap = dasd_devmap_from_cdev(cdev);
559 if (IS_ERR(devmap))
560 return (void *) devmap;
561
562 device = dasd_alloc_device();
563 if (IS_ERR(device))
564 return device;
565 atomic_set(&device->ref_count, 3);
566
567 spin_lock(&dasd_devmap_lock);
568 if (!devmap->device) {
569 devmap->device = device;
570 device->devindex = devmap->devindex;
571 device->features = devmap->features;
572 get_device(&cdev->dev);
573 device->cdev = cdev;
574 rc = 0;
575 } else
576 /* Someone else was faster. */
577 rc = -EBUSY;
578 spin_unlock(&dasd_devmap_lock);
579
580 if (rc) {
581 dasd_free_device(device);
582 return ERR_PTR(rc);
583 }
584
585 spin_lock_irqsave(get_ccwdev_lock(cdev), flags);
586 dev_set_drvdata(&cdev->dev, device);
587 spin_unlock_irqrestore(get_ccwdev_lock(cdev), flags);
588
589 device->paths_info = kset_create_and_add("paths_info", NULL,
590 &device->cdev->dev.kobj);
591 if (!device->paths_info)
592 dev_warn(&cdev->dev, "Could not create paths_info kset\n");
593
594 return device;
595}
596
597/*
598 * allocate a PPRC data structure and call the discipline function to fill
599 */
600static int dasd_devmap_get_pprc_status(struct dasd_device *device,
601 struct dasd_pprc_data_sc4 **data)
602{
603 struct dasd_pprc_data_sc4 *temp;
604
605 if (!device->discipline || !device->discipline->pprc_status) {
606 dev_warn(&device->cdev->dev, "Unable to query copy relation status\n");
607 return -EOPNOTSUPP;
608 }
609 temp = kzalloc(sizeof(*temp), GFP_KERNEL);
610 if (!temp)
611 return -ENOMEM;
612
613 /* get PPRC information from storage */
614 if (device->discipline->pprc_status(device, temp)) {
615 dev_warn(&device->cdev->dev, "Error during copy relation status query\n");
616 kfree(temp);
617 return -EINVAL;
618 }
619 *data = temp;
620
621 return 0;
622}
623
624/*
625 * find an entry in a PPRC device_info array by a given UID
626 * depending on the primary/secondary state of the device it has to be
627 * matched with the respective fields
628 */
629static int dasd_devmap_entry_from_pprc_data(struct dasd_pprc_data_sc4 *data,
630 struct dasd_uid uid,
631 bool primary)
632{
633 int i;
634
635 for (i = 0; i < DASD_CP_ENTRIES; i++) {
636 if (primary) {
637 if (data->dev_info[i].prim_cu_ssid == uid.ssid &&
638 data->dev_info[i].primary == uid.real_unit_addr)
639 return i;
640 } else {
641 if (data->dev_info[i].sec_cu_ssid == uid.ssid &&
642 data->dev_info[i].secondary == uid.real_unit_addr)
643 return i;
644 }
645 }
646 return -1;
647}
648
649/*
650 * check the consistency of a specified copy relation by checking
651 * the following things:
652 *
653 * - is the given device part of a copy pair setup
654 * - does the state of the device match the state in the PPRC status data
655 * - does the device UID match with the UID in the PPRC status data
656 * - to prevent misrouted IO check if the given device is present in all
657 * related PPRC status data
658 */
659static int dasd_devmap_check_copy_relation(struct dasd_device *device,
660 struct dasd_copy_entry *entry,
661 struct dasd_pprc_data_sc4 *data,
662 struct dasd_copy_relation *copy)
663{
664 struct dasd_pprc_data_sc4 *tmp_dat;
665 struct dasd_device *tmp_dev;
666 struct dasd_uid uid;
667 int i, j;
668
669 if (!device->discipline || !device->discipline->get_uid ||
670 device->discipline->get_uid(device, &uid))
671 return 1;
672
673 i = dasd_devmap_entry_from_pprc_data(data, uid, entry->primary);
674 if (i < 0) {
675 dev_warn(&device->cdev->dev, "Device not part of a copy relation\n");
676 return 1;
677 }
678
679 /* double check which role the current device has */
680 if (entry->primary) {
681 if (data->dev_info[i].flags & 0x80) {
682 dev_warn(&device->cdev->dev, "Copy pair secondary is setup as primary\n");
683 return 1;
684 }
685 if (data->dev_info[i].prim_cu_ssid != uid.ssid ||
686 data->dev_info[i].primary != uid.real_unit_addr) {
687 dev_warn(&device->cdev->dev,
688 "Primary device %s does not match copy pair status primary device %04x\n",
689 dev_name(&device->cdev->dev),
690 data->dev_info[i].prim_cu_ssid |
691 data->dev_info[i].primary);
692 return 1;
693 }
694 } else {
695 if (!(data->dev_info[i].flags & 0x80)) {
696 dev_warn(&device->cdev->dev, "Copy pair primary is setup as secondary\n");
697 return 1;
698 }
699 if (data->dev_info[i].sec_cu_ssid != uid.ssid ||
700 data->dev_info[i].secondary != uid.real_unit_addr) {
701 dev_warn(&device->cdev->dev,
702 "Secondary device %s does not match copy pair status secondary device %04x\n",
703 dev_name(&device->cdev->dev),
704 data->dev_info[i].sec_cu_ssid |
705 data->dev_info[i].secondary);
706 return 1;
707 }
708 }
709
710 /*
711 * the current device has to be part of the copy relation of all
712 * entries to prevent misrouted IO to another copy pair
713 */
714 for (j = 0; j < DASD_CP_ENTRIES; j++) {
715 if (entry == ©->entry[j])
716 tmp_dev = device;
717 else
718 tmp_dev = copy->entry[j].device;
719
720 if (!tmp_dev)
721 continue;
722
723 if (dasd_devmap_get_pprc_status(tmp_dev, &tmp_dat))
724 return 1;
725
726 if (dasd_devmap_entry_from_pprc_data(tmp_dat, uid, entry->primary) < 0) {
727 dev_warn(&tmp_dev->cdev->dev,
728 "Copy pair relation does not contain device: %s\n",
729 dev_name(&device->cdev->dev));
730 kfree(tmp_dat);
731 return 1;
732 }
733 kfree(tmp_dat);
734 }
735 return 0;
736}
737
738/* delete device from copy relation entry */
739static void dasd_devmap_delete_copy_relation_device(struct dasd_device *device)
740{
741 struct dasd_copy_relation *copy;
742 int i;
743
744 if (!device->copy)
745 return;
746
747 copy = device->copy;
748 for (i = 0; i < DASD_CP_ENTRIES; i++) {
749 if (copy->entry[i].device == device)
750 copy->entry[i].device = NULL;
751 }
752 dasd_put_device(device);
753 device->copy = NULL;
754}
755
756/*
757 * read all required information for a copy relation setup and setup the device
758 * accordingly
759 */
760int dasd_devmap_set_device_copy_relation(struct ccw_device *cdev,
761 bool pprc_enabled)
762{
763 struct dasd_pprc_data_sc4 *data = NULL;
764 struct dasd_copy_entry *entry = NULL;
765 struct dasd_copy_relation *copy;
766 struct dasd_devmap *devmap;
767 struct dasd_device *device;
768 int i, rc = 0;
769
770 devmap = dasd_devmap_from_cdev(cdev);
771 if (IS_ERR(devmap))
772 return PTR_ERR(devmap);
773
774 device = devmap->device;
775 if (!device)
776 return -ENODEV;
777
778 copy = devmap->copy;
779 /* no copy pair setup for this device */
780 if (!copy)
781 goto out;
782
783 rc = dasd_devmap_get_pprc_status(device, &data);
784 if (rc)
785 return rc;
786
787 /* print error if PPRC is requested but not enabled on storage server */
788 if (!pprc_enabled) {
789 dev_err(&cdev->dev, "Copy relation not enabled on storage server\n");
790 rc = -EINVAL;
791 goto out;
792 }
793
794 if (!data->dev_info[0].state) {
795 dev_warn(&device->cdev->dev, "Copy pair setup requested for device not in copy relation\n");
796 rc = -EINVAL;
797 goto out;
798 }
799 /* find entry */
800 for (i = 0; i < DASD_CP_ENTRIES; i++) {
801 if (copy->entry[i].configured &&
802 strncmp(dev_name(&cdev->dev),
803 copy->entry[i].busid, DASD_BUS_ID_SIZE) == 0) {
804 entry = ©->entry[i];
805 break;
806 }
807 }
808 if (!entry) {
809 dev_warn(&device->cdev->dev, "Copy relation entry not found\n");
810 rc = -EINVAL;
811 goto out;
812 }
813 /* check if the copy relation is valid */
814 if (dasd_devmap_check_copy_relation(device, entry, data, copy)) {
815 dev_warn(&device->cdev->dev, "Copy relation faulty\n");
816 rc = -EINVAL;
817 goto out;
818 }
819
820 dasd_get_device(device);
821 copy->entry[i].device = device;
822 device->copy = copy;
823out:
824 kfree(data);
825 return rc;
826}
827EXPORT_SYMBOL_GPL(dasd_devmap_set_device_copy_relation);
828
829/*
830 * Wait queue for dasd_delete_device waits.
831 */
832static DECLARE_WAIT_QUEUE_HEAD(dasd_delete_wq);
833
834/*
835 * Remove a dasd device structure. The passed referenced
836 * is destroyed.
837 */
838void
839dasd_delete_device(struct dasd_device *device)
840{
841 struct ccw_device *cdev;
842 struct dasd_devmap *devmap;
843 unsigned long flags;
844
845 /* First remove device pointer from devmap. */
846 devmap = dasd_find_busid(dev_name(&device->cdev->dev));
847 BUG_ON(IS_ERR(devmap));
848 spin_lock(&dasd_devmap_lock);
849 if (devmap->device != device) {
850 spin_unlock(&dasd_devmap_lock);
851 dasd_put_device(device);
852 return;
853 }
854 devmap->device = NULL;
855 spin_unlock(&dasd_devmap_lock);
856
857 /* Disconnect dasd_device structure from ccw_device structure. */
858 spin_lock_irqsave(get_ccwdev_lock(device->cdev), flags);
859 dev_set_drvdata(&device->cdev->dev, NULL);
860 spin_unlock_irqrestore(get_ccwdev_lock(device->cdev), flags);
861
862 /* Removve copy relation */
863 dasd_devmap_delete_copy_relation_device(device);
864 /*
865 * Drop ref_count by 3, one for the devmap reference, one for
866 * the cdev reference and one for the passed reference.
867 */
868 atomic_sub(3, &device->ref_count);
869
870 /* Wait for reference counter to drop to zero. */
871 wait_event(dasd_delete_wq, atomic_read(&device->ref_count) == 0);
872
873 dasd_generic_free_discipline(device);
874
875 kset_unregister(device->paths_info);
876
877 /* Disconnect dasd_device structure from ccw_device structure. */
878 cdev = device->cdev;
879 device->cdev = NULL;
880
881 /* Put ccw_device structure. */
882 put_device(&cdev->dev);
883
884 /* Now the device structure can be freed. */
885 dasd_free_device(device);
886}
887
888/*
889 * Reference counter dropped to zero. Wake up waiter
890 * in dasd_delete_device.
891 */
892void
893dasd_put_device_wake(struct dasd_device *device)
894{
895 wake_up(&dasd_delete_wq);
896}
897EXPORT_SYMBOL_GPL(dasd_put_device_wake);
898
899/*
900 * Return dasd_device structure associated with cdev.
901 * This function needs to be called with the ccw device
902 * lock held. It can be used from interrupt context.
903 */
904struct dasd_device *
905dasd_device_from_cdev_locked(struct ccw_device *cdev)
906{
907 struct dasd_device *device = dev_get_drvdata(&cdev->dev);
908
909 if (!device)
910 return ERR_PTR(-ENODEV);
911 dasd_get_device(device);
912 return device;
913}
914
915/*
916 * Return dasd_device structure associated with cdev.
917 */
918struct dasd_device *
919dasd_device_from_cdev(struct ccw_device *cdev)
920{
921 struct dasd_device *device;
922 unsigned long flags;
923
924 spin_lock_irqsave(get_ccwdev_lock(cdev), flags);
925 device = dasd_device_from_cdev_locked(cdev);
926 spin_unlock_irqrestore(get_ccwdev_lock(cdev), flags);
927 return device;
928}
929
930void dasd_add_link_to_gendisk(struct gendisk *gdp, struct dasd_device *device)
931{
932 struct dasd_devmap *devmap;
933
934 devmap = dasd_find_busid(dev_name(&device->cdev->dev));
935 if (IS_ERR(devmap))
936 return;
937 spin_lock(&dasd_devmap_lock);
938 gdp->private_data = devmap;
939 spin_unlock(&dasd_devmap_lock);
940}
941EXPORT_SYMBOL(dasd_add_link_to_gendisk);
942
943struct dasd_device *dasd_device_from_gendisk(struct gendisk *gdp)
944{
945 struct dasd_device *device;
946 struct dasd_devmap *devmap;
947
948 if (!gdp->private_data)
949 return NULL;
950 device = NULL;
951 spin_lock(&dasd_devmap_lock);
952 devmap = gdp->private_data;
953 if (devmap && devmap->device) {
954 device = devmap->device;
955 dasd_get_device(device);
956 }
957 spin_unlock(&dasd_devmap_lock);
958 return device;
959}
960
961/*
962 * SECTION: files in sysfs
963 */
964
965/*
966 * failfast controls the behaviour, if no path is available
967 */
968static ssize_t dasd_ff_show(struct device *dev, struct device_attribute *attr,
969 char *buf)
970{
971 struct dasd_devmap *devmap;
972 int ff_flag;
973
974 devmap = dasd_find_busid(dev_name(dev));
975 if (!IS_ERR(devmap))
976 ff_flag = (devmap->features & DASD_FEATURE_FAILFAST) != 0;
977 else
978 ff_flag = (DASD_FEATURE_DEFAULT & DASD_FEATURE_FAILFAST) != 0;
979 return sysfs_emit(buf, ff_flag ? "1\n" : "0\n");
980}
981
982static ssize_t dasd_ff_store(struct device *dev, struct device_attribute *attr,
983 const char *buf, size_t count)
984{
985 unsigned int val;
986 int rc;
987
988 if (kstrtouint(buf, 0, &val) || val > 1)
989 return -EINVAL;
990
991 rc = dasd_set_feature(to_ccwdev(dev), DASD_FEATURE_FAILFAST, val);
992
993 return rc ? : count;
994}
995
996static DEVICE_ATTR(failfast, 0644, dasd_ff_show, dasd_ff_store);
997
998/*
999 * readonly controls the readonly status of a dasd
1000 */
1001static ssize_t
1002dasd_ro_show(struct device *dev, struct device_attribute *attr, char *buf)
1003{
1004 struct dasd_devmap *devmap;
1005 struct dasd_device *device;
1006 int ro_flag = 0;
1007
1008 devmap = dasd_find_busid(dev_name(dev));
1009 if (IS_ERR(devmap))
1010 goto out;
1011
1012 ro_flag = !!(devmap->features & DASD_FEATURE_READONLY);
1013
1014 spin_lock(&dasd_devmap_lock);
1015 device = devmap->device;
1016 if (device)
1017 ro_flag |= test_bit(DASD_FLAG_DEVICE_RO, &device->flags);
1018 spin_unlock(&dasd_devmap_lock);
1019
1020out:
1021 return sysfs_emit(buf, ro_flag ? "1\n" : "0\n");
1022}
1023
1024static ssize_t
1025dasd_ro_store(struct device *dev, struct device_attribute *attr,
1026 const char *buf, size_t count)
1027{
1028 struct ccw_device *cdev = to_ccwdev(dev);
1029 struct dasd_device *device;
1030 unsigned long flags;
1031 unsigned int val;
1032 int rc;
1033
1034 if (kstrtouint(buf, 0, &val) || val > 1)
1035 return -EINVAL;
1036
1037 rc = dasd_set_feature(cdev, DASD_FEATURE_READONLY, val);
1038 if (rc)
1039 return rc;
1040
1041 device = dasd_device_from_cdev(cdev);
1042 if (IS_ERR(device))
1043 return count;
1044
1045 spin_lock_irqsave(get_ccwdev_lock(cdev), flags);
1046 val = val || test_bit(DASD_FLAG_DEVICE_RO, &device->flags);
1047
1048 if (!device->block || !device->block->gdp ||
1049 test_bit(DASD_FLAG_OFFLINE, &device->flags)) {
1050 spin_unlock_irqrestore(get_ccwdev_lock(cdev), flags);
1051 goto out;
1052 }
1053 /* Increase open_count to avoid losing the block device */
1054 atomic_inc(&device->block->open_count);
1055 spin_unlock_irqrestore(get_ccwdev_lock(cdev), flags);
1056
1057 set_disk_ro(device->block->gdp, val);
1058 atomic_dec(&device->block->open_count);
1059
1060out:
1061 dasd_put_device(device);
1062
1063 return count;
1064}
1065
1066static DEVICE_ATTR(readonly, 0644, dasd_ro_show, dasd_ro_store);
1067/*
1068 * erplog controls the logging of ERP related data
1069 * (e.g. failing channel programs).
1070 */
1071static ssize_t
1072dasd_erplog_show(struct device *dev, struct device_attribute *attr, char *buf)
1073{
1074 struct dasd_devmap *devmap;
1075 int erplog;
1076
1077 devmap = dasd_find_busid(dev_name(dev));
1078 if (!IS_ERR(devmap))
1079 erplog = (devmap->features & DASD_FEATURE_ERPLOG) != 0;
1080 else
1081 erplog = (DASD_FEATURE_DEFAULT & DASD_FEATURE_ERPLOG) != 0;
1082 return sysfs_emit(buf, erplog ? "1\n" : "0\n");
1083}
1084
1085static ssize_t
1086dasd_erplog_store(struct device *dev, struct device_attribute *attr,
1087 const char *buf, size_t count)
1088{
1089 unsigned int val;
1090 int rc;
1091
1092 if (kstrtouint(buf, 0, &val) || val > 1)
1093 return -EINVAL;
1094
1095 rc = dasd_set_feature(to_ccwdev(dev), DASD_FEATURE_ERPLOG, val);
1096
1097 return rc ? : count;
1098}
1099
1100static DEVICE_ATTR(erplog, 0644, dasd_erplog_show, dasd_erplog_store);
1101
1102/*
1103 * use_diag controls whether the driver should use diag rather than ssch
1104 * to talk to the device
1105 */
1106static ssize_t
1107dasd_use_diag_show(struct device *dev, struct device_attribute *attr, char *buf)
1108{
1109 struct dasd_devmap *devmap;
1110 int use_diag;
1111
1112 devmap = dasd_find_busid(dev_name(dev));
1113 if (!IS_ERR(devmap))
1114 use_diag = (devmap->features & DASD_FEATURE_USEDIAG) != 0;
1115 else
1116 use_diag = (DASD_FEATURE_DEFAULT & DASD_FEATURE_USEDIAG) != 0;
1117 return sprintf(buf, use_diag ? "1\n" : "0\n");
1118}
1119
1120static ssize_t
1121dasd_use_diag_store(struct device *dev, struct device_attribute *attr,
1122 const char *buf, size_t count)
1123{
1124 struct dasd_devmap *devmap;
1125 unsigned int val;
1126 ssize_t rc;
1127
1128 devmap = dasd_devmap_from_cdev(to_ccwdev(dev));
1129 if (IS_ERR(devmap))
1130 return PTR_ERR(devmap);
1131
1132 if (kstrtouint(buf, 0, &val) || val > 1)
1133 return -EINVAL;
1134
1135 spin_lock(&dasd_devmap_lock);
1136 /* Changing diag discipline flag is only allowed in offline state. */
1137 rc = count;
1138 if (!devmap->device && !(devmap->features & DASD_FEATURE_USERAW)) {
1139 if (val)
1140 devmap->features |= DASD_FEATURE_USEDIAG;
1141 else
1142 devmap->features &= ~DASD_FEATURE_USEDIAG;
1143 } else
1144 rc = -EPERM;
1145 spin_unlock(&dasd_devmap_lock);
1146 return rc;
1147}
1148
1149static DEVICE_ATTR(use_diag, 0644, dasd_use_diag_show, dasd_use_diag_store);
1150
1151/*
1152 * use_raw controls whether the driver should give access to raw eckd data or
1153 * operate in standard mode
1154 */
1155static ssize_t
1156dasd_use_raw_show(struct device *dev, struct device_attribute *attr, char *buf)
1157{
1158 struct dasd_devmap *devmap;
1159 int use_raw;
1160
1161 devmap = dasd_find_busid(dev_name(dev));
1162 if (!IS_ERR(devmap))
1163 use_raw = (devmap->features & DASD_FEATURE_USERAW) != 0;
1164 else
1165 use_raw = (DASD_FEATURE_DEFAULT & DASD_FEATURE_USERAW) != 0;
1166 return sprintf(buf, use_raw ? "1\n" : "0\n");
1167}
1168
1169static ssize_t
1170dasd_use_raw_store(struct device *dev, struct device_attribute *attr,
1171 const char *buf, size_t count)
1172{
1173 struct dasd_devmap *devmap;
1174 ssize_t rc;
1175 unsigned long val;
1176
1177 devmap = dasd_devmap_from_cdev(to_ccwdev(dev));
1178 if (IS_ERR(devmap))
1179 return PTR_ERR(devmap);
1180
1181 if ((kstrtoul(buf, 10, &val) != 0) || val > 1)
1182 return -EINVAL;
1183
1184 spin_lock(&dasd_devmap_lock);
1185 /* Changing diag discipline flag is only allowed in offline state. */
1186 rc = count;
1187 if (!devmap->device && !(devmap->features & DASD_FEATURE_USEDIAG)) {
1188 if (val)
1189 devmap->features |= DASD_FEATURE_USERAW;
1190 else
1191 devmap->features &= ~DASD_FEATURE_USERAW;
1192 } else
1193 rc = -EPERM;
1194 spin_unlock(&dasd_devmap_lock);
1195 return rc;
1196}
1197
1198static DEVICE_ATTR(raw_track_access, 0644, dasd_use_raw_show,
1199 dasd_use_raw_store);
1200
1201static ssize_t
1202dasd_safe_offline_store(struct device *dev, struct device_attribute *attr,
1203 const char *buf, size_t count)
1204{
1205 struct ccw_device *cdev = to_ccwdev(dev);
1206 struct dasd_device *device;
1207 unsigned long flags;
1208 int rc;
1209
1210 spin_lock_irqsave(get_ccwdev_lock(cdev), flags);
1211 device = dasd_device_from_cdev_locked(cdev);
1212 if (IS_ERR(device)) {
1213 rc = PTR_ERR(device);
1214 spin_unlock_irqrestore(get_ccwdev_lock(cdev), flags);
1215 goto out;
1216 }
1217
1218 if (test_bit(DASD_FLAG_OFFLINE, &device->flags) ||
1219 test_bit(DASD_FLAG_SAFE_OFFLINE_RUNNING, &device->flags)) {
1220 /* Already doing offline processing */
1221 dasd_put_device(device);
1222 spin_unlock_irqrestore(get_ccwdev_lock(cdev), flags);
1223 rc = -EBUSY;
1224 goto out;
1225 }
1226
1227 set_bit(DASD_FLAG_SAFE_OFFLINE, &device->flags);
1228 dasd_put_device(device);
1229 spin_unlock_irqrestore(get_ccwdev_lock(cdev), flags);
1230
1231 rc = ccw_device_set_offline(cdev);
1232
1233out:
1234 return rc ? rc : count;
1235}
1236
1237static DEVICE_ATTR(safe_offline, 0200, NULL, dasd_safe_offline_store);
1238
1239static ssize_t
1240dasd_access_show(struct device *dev, struct device_attribute *attr,
1241 char *buf)
1242{
1243 struct ccw_device *cdev = to_ccwdev(dev);
1244 struct dasd_device *device;
1245 int count;
1246
1247 device = dasd_device_from_cdev(cdev);
1248 if (IS_ERR(device))
1249 return PTR_ERR(device);
1250
1251 if (!device->discipline)
1252 count = -ENODEV;
1253 else if (!device->discipline->host_access_count)
1254 count = -EOPNOTSUPP;
1255 else
1256 count = device->discipline->host_access_count(device);
1257
1258 dasd_put_device(device);
1259 if (count < 0)
1260 return count;
1261
1262 return sprintf(buf, "%d\n", count);
1263}
1264
1265static DEVICE_ATTR(host_access_count, 0444, dasd_access_show, NULL);
1266
1267static ssize_t
1268dasd_discipline_show(struct device *dev, struct device_attribute *attr,
1269 char *buf)
1270{
1271 struct dasd_device *device;
1272 ssize_t len;
1273
1274 device = dasd_device_from_cdev(to_ccwdev(dev));
1275 if (IS_ERR(device))
1276 goto out;
1277 else if (!device->discipline) {
1278 dasd_put_device(device);
1279 goto out;
1280 } else {
1281 len = sysfs_emit(buf, "%s\n",
1282 device->discipline->name);
1283 dasd_put_device(device);
1284 return len;
1285 }
1286out:
1287 len = sysfs_emit(buf, "none\n");
1288 return len;
1289}
1290
1291static DEVICE_ATTR(discipline, 0444, dasd_discipline_show, NULL);
1292
1293static ssize_t
1294dasd_device_status_show(struct device *dev, struct device_attribute *attr,
1295 char *buf)
1296{
1297 struct dasd_device *device;
1298 ssize_t len;
1299
1300 device = dasd_device_from_cdev(to_ccwdev(dev));
1301 if (!IS_ERR(device)) {
1302 switch (device->state) {
1303 case DASD_STATE_NEW:
1304 len = sysfs_emit(buf, "new\n");
1305 break;
1306 case DASD_STATE_KNOWN:
1307 len = sysfs_emit(buf, "detected\n");
1308 break;
1309 case DASD_STATE_BASIC:
1310 len = sysfs_emit(buf, "basic\n");
1311 break;
1312 case DASD_STATE_UNFMT:
1313 len = sysfs_emit(buf, "unformatted\n");
1314 break;
1315 case DASD_STATE_READY:
1316 len = sysfs_emit(buf, "ready\n");
1317 break;
1318 case DASD_STATE_ONLINE:
1319 len = sysfs_emit(buf, "online\n");
1320 break;
1321 default:
1322 len = sysfs_emit(buf, "no stat\n");
1323 break;
1324 }
1325 dasd_put_device(device);
1326 } else
1327 len = sysfs_emit(buf, "unknown\n");
1328 return len;
1329}
1330
1331static DEVICE_ATTR(status, 0444, dasd_device_status_show, NULL);
1332
1333static ssize_t dasd_alias_show(struct device *dev,
1334 struct device_attribute *attr, char *buf)
1335{
1336 struct dasd_device *device;
1337 struct dasd_uid uid;
1338
1339 device = dasd_device_from_cdev(to_ccwdev(dev));
1340 if (IS_ERR(device))
1341 return sprintf(buf, "0\n");
1342
1343 if (device->discipline && device->discipline->get_uid &&
1344 !device->discipline->get_uid(device, &uid)) {
1345 if (uid.type == UA_BASE_PAV_ALIAS ||
1346 uid.type == UA_HYPER_PAV_ALIAS) {
1347 dasd_put_device(device);
1348 return sprintf(buf, "1\n");
1349 }
1350 }
1351 dasd_put_device(device);
1352
1353 return sprintf(buf, "0\n");
1354}
1355
1356static DEVICE_ATTR(alias, 0444, dasd_alias_show, NULL);
1357
1358static ssize_t dasd_vendor_show(struct device *dev,
1359 struct device_attribute *attr, char *buf)
1360{
1361 struct dasd_device *device;
1362 struct dasd_uid uid;
1363 char *vendor;
1364
1365 device = dasd_device_from_cdev(to_ccwdev(dev));
1366 vendor = "";
1367 if (IS_ERR(device))
1368 return sysfs_emit(buf, "%s\n", vendor);
1369
1370 if (device->discipline && device->discipline->get_uid &&
1371 !device->discipline->get_uid(device, &uid))
1372 vendor = uid.vendor;
1373
1374 dasd_put_device(device);
1375
1376 return sysfs_emit(buf, "%s\n", vendor);
1377}
1378
1379static DEVICE_ATTR(vendor, 0444, dasd_vendor_show, NULL);
1380
1381static ssize_t
1382dasd_uid_show(struct device *dev, struct device_attribute *attr, char *buf)
1383{
1384 char uid_string[DASD_UID_STRLEN];
1385 struct dasd_device *device;
1386 struct dasd_uid uid;
1387 char ua_string[3];
1388
1389 device = dasd_device_from_cdev(to_ccwdev(dev));
1390 uid_string[0] = 0;
1391 if (IS_ERR(device))
1392 return sysfs_emit(buf, "%s\n", uid_string);
1393
1394 if (device->discipline && device->discipline->get_uid &&
1395 !device->discipline->get_uid(device, &uid)) {
1396 switch (uid.type) {
1397 case UA_BASE_DEVICE:
1398 snprintf(ua_string, sizeof(ua_string), "%02x",
1399 uid.real_unit_addr);
1400 break;
1401 case UA_BASE_PAV_ALIAS:
1402 snprintf(ua_string, sizeof(ua_string), "%02x",
1403 uid.base_unit_addr);
1404 break;
1405 case UA_HYPER_PAV_ALIAS:
1406 snprintf(ua_string, sizeof(ua_string), "xx");
1407 break;
1408 default:
1409 /* should not happen, treat like base device */
1410 snprintf(ua_string, sizeof(ua_string), "%02x",
1411 uid.real_unit_addr);
1412 break;
1413 }
1414
1415 if (strlen(uid.vduit) > 0)
1416 snprintf(uid_string, sizeof(uid_string),
1417 "%s.%s.%04x.%s.%s",
1418 uid.vendor, uid.serial, uid.ssid, ua_string,
1419 uid.vduit);
1420 else
1421 snprintf(uid_string, sizeof(uid_string),
1422 "%s.%s.%04x.%s",
1423 uid.vendor, uid.serial, uid.ssid, ua_string);
1424 }
1425 dasd_put_device(device);
1426
1427 return sysfs_emit(buf, "%s\n", uid_string);
1428}
1429static DEVICE_ATTR(uid, 0444, dasd_uid_show, NULL);
1430
1431/*
1432 * extended error-reporting
1433 */
1434static ssize_t
1435dasd_eer_show(struct device *dev, struct device_attribute *attr, char *buf)
1436{
1437 struct dasd_devmap *devmap;
1438 int eer_flag;
1439
1440 devmap = dasd_find_busid(dev_name(dev));
1441 if (!IS_ERR(devmap) && devmap->device)
1442 eer_flag = dasd_eer_enabled(devmap->device);
1443 else
1444 eer_flag = 0;
1445 return sysfs_emit(buf, eer_flag ? "1\n" : "0\n");
1446}
1447
1448static ssize_t
1449dasd_eer_store(struct device *dev, struct device_attribute *attr,
1450 const char *buf, size_t count)
1451{
1452 struct dasd_device *device;
1453 unsigned int val;
1454 int rc = 0;
1455
1456 device = dasd_device_from_cdev(to_ccwdev(dev));
1457 if (IS_ERR(device))
1458 return PTR_ERR(device);
1459
1460 if (kstrtouint(buf, 0, &val) || val > 1)
1461 return -EINVAL;
1462
1463 if (val)
1464 rc = dasd_eer_enable(device);
1465 else
1466 dasd_eer_disable(device);
1467
1468 dasd_put_device(device);
1469
1470 return rc ? : count;
1471}
1472
1473static DEVICE_ATTR(eer_enabled, 0644, dasd_eer_show, dasd_eer_store);
1474
1475/*
1476 * aq_mask controls if the DASD should be quiesced on certain triggers
1477 * The aq_mask attribute is interpreted as bitmap of the DASD_EER_* triggers.
1478 */
1479static ssize_t dasd_aq_mask_show(struct device *dev, struct device_attribute *attr,
1480 char *buf)
1481{
1482 struct dasd_devmap *devmap;
1483 unsigned int aq_mask = 0;
1484
1485 devmap = dasd_find_busid(dev_name(dev));
1486 if (!IS_ERR(devmap))
1487 aq_mask = devmap->aq_mask;
1488
1489 return sysfs_emit(buf, "%d\n", aq_mask);
1490}
1491
1492static ssize_t dasd_aq_mask_store(struct device *dev, struct device_attribute *attr,
1493 const char *buf, size_t count)
1494{
1495 struct dasd_devmap *devmap;
1496 unsigned int val;
1497
1498 if (kstrtouint(buf, 0, &val) || val > DASD_EER_VALID)
1499 return -EINVAL;
1500
1501 devmap = dasd_devmap_from_cdev(to_ccwdev(dev));
1502 if (IS_ERR(devmap))
1503 return PTR_ERR(devmap);
1504
1505 spin_lock(&dasd_devmap_lock);
1506 devmap->aq_mask = val;
1507 if (devmap->device)
1508 devmap->device->aq_mask = devmap->aq_mask;
1509 spin_unlock(&dasd_devmap_lock);
1510
1511 return count;
1512}
1513
1514static DEVICE_ATTR(aq_mask, 0644, dasd_aq_mask_show, dasd_aq_mask_store);
1515
1516/*
1517 * aq_requeue controls if requests are returned to the blocklayer on quiesce
1518 * or if requests are only not started
1519 */
1520static ssize_t dasd_aqr_show(struct device *dev, struct device_attribute *attr,
1521 char *buf)
1522{
1523 struct dasd_devmap *devmap;
1524 int flag;
1525
1526 devmap = dasd_find_busid(dev_name(dev));
1527 if (!IS_ERR(devmap))
1528 flag = (devmap->features & DASD_FEATURE_REQUEUEQUIESCE) != 0;
1529 else
1530 flag = (DASD_FEATURE_DEFAULT &
1531 DASD_FEATURE_REQUEUEQUIESCE) != 0;
1532 return sysfs_emit(buf, "%d\n", flag);
1533}
1534
1535static ssize_t dasd_aqr_store(struct device *dev, struct device_attribute *attr,
1536 const char *buf, size_t count)
1537{
1538 bool val;
1539 int rc;
1540
1541 if (kstrtobool(buf, &val))
1542 return -EINVAL;
1543
1544 rc = dasd_set_feature(to_ccwdev(dev), DASD_FEATURE_REQUEUEQUIESCE, val);
1545
1546 return rc ? : count;
1547}
1548
1549static DEVICE_ATTR(aq_requeue, 0644, dasd_aqr_show, dasd_aqr_store);
1550
1551/*
1552 * aq_timeouts controls how much retries have to time out until
1553 * a device gets autoquiesced
1554 */
1555static ssize_t
1556dasd_aq_timeouts_show(struct device *dev, struct device_attribute *attr,
1557 char *buf)
1558{
1559 struct dasd_device *device;
1560 int len;
1561
1562 device = dasd_device_from_cdev(to_ccwdev(dev));
1563 if (IS_ERR(device))
1564 return -ENODEV;
1565 len = sysfs_emit(buf, "%u\n", device->aq_timeouts);
1566 dasd_put_device(device);
1567 return len;
1568}
1569
1570static ssize_t
1571dasd_aq_timeouts_store(struct device *dev, struct device_attribute *attr,
1572 const char *buf, size_t count)
1573{
1574 struct dasd_device *device;
1575 unsigned int val;
1576
1577 device = dasd_device_from_cdev(to_ccwdev(dev));
1578 if (IS_ERR(device))
1579 return -ENODEV;
1580
1581 if ((kstrtouint(buf, 10, &val) != 0) ||
1582 val > DASD_RETRIES_MAX || val == 0) {
1583 dasd_put_device(device);
1584 return -EINVAL;
1585 }
1586
1587 if (val)
1588 device->aq_timeouts = val;
1589
1590 dasd_put_device(device);
1591 return count;
1592}
1593
1594static DEVICE_ATTR(aq_timeouts, 0644, dasd_aq_timeouts_show,
1595 dasd_aq_timeouts_store);
1596
1597/*
1598 * expiration time for default requests
1599 */
1600static ssize_t
1601dasd_expires_show(struct device *dev, struct device_attribute *attr, char *buf)
1602{
1603 struct dasd_device *device;
1604 int len;
1605
1606 device = dasd_device_from_cdev(to_ccwdev(dev));
1607 if (IS_ERR(device))
1608 return -ENODEV;
1609 len = sysfs_emit(buf, "%lu\n", device->default_expires);
1610 dasd_put_device(device);
1611 return len;
1612}
1613
1614static ssize_t
1615dasd_expires_store(struct device *dev, struct device_attribute *attr,
1616 const char *buf, size_t count)
1617{
1618 struct dasd_device *device;
1619 unsigned long val;
1620
1621 device = dasd_device_from_cdev(to_ccwdev(dev));
1622 if (IS_ERR(device))
1623 return -ENODEV;
1624
1625 if ((kstrtoul(buf, 10, &val) != 0) ||
1626 (val > DASD_EXPIRES_MAX) || val == 0) {
1627 dasd_put_device(device);
1628 return -EINVAL;
1629 }
1630
1631 if (val)
1632 device->default_expires = val;
1633
1634 dasd_put_device(device);
1635 return count;
1636}
1637
1638static DEVICE_ATTR(expires, 0644, dasd_expires_show, dasd_expires_store);
1639
1640static ssize_t
1641dasd_retries_show(struct device *dev, struct device_attribute *attr, char *buf)
1642{
1643 struct dasd_device *device;
1644 int len;
1645
1646 device = dasd_device_from_cdev(to_ccwdev(dev));
1647 if (IS_ERR(device))
1648 return -ENODEV;
1649 len = sysfs_emit(buf, "%lu\n", device->default_retries);
1650 dasd_put_device(device);
1651 return len;
1652}
1653
1654static ssize_t
1655dasd_retries_store(struct device *dev, struct device_attribute *attr,
1656 const char *buf, size_t count)
1657{
1658 struct dasd_device *device;
1659 unsigned long val;
1660
1661 device = dasd_device_from_cdev(to_ccwdev(dev));
1662 if (IS_ERR(device))
1663 return -ENODEV;
1664
1665 if ((kstrtoul(buf, 10, &val) != 0) ||
1666 (val > DASD_RETRIES_MAX)) {
1667 dasd_put_device(device);
1668 return -EINVAL;
1669 }
1670
1671 if (val)
1672 device->default_retries = val;
1673
1674 dasd_put_device(device);
1675 return count;
1676}
1677
1678static DEVICE_ATTR(retries, 0644, dasd_retries_show, dasd_retries_store);
1679
1680static ssize_t
1681dasd_timeout_show(struct device *dev, struct device_attribute *attr,
1682 char *buf)
1683{
1684 struct dasd_device *device;
1685 int len;
1686
1687 device = dasd_device_from_cdev(to_ccwdev(dev));
1688 if (IS_ERR(device))
1689 return -ENODEV;
1690 len = sysfs_emit(buf, "%lu\n", device->blk_timeout);
1691 dasd_put_device(device);
1692 return len;
1693}
1694
1695static ssize_t
1696dasd_timeout_store(struct device *dev, struct device_attribute *attr,
1697 const char *buf, size_t count)
1698{
1699 struct dasd_device *device;
1700 unsigned long val;
1701
1702 device = dasd_device_from_cdev(to_ccwdev(dev));
1703 if (IS_ERR(device) || !device->block)
1704 return -ENODEV;
1705
1706 if ((kstrtoul(buf, 10, &val) != 0) ||
1707 val > UINT_MAX / HZ) {
1708 dasd_put_device(device);
1709 return -EINVAL;
1710 }
1711 if (!device->block->gdp) {
1712 dasd_put_device(device);
1713 return -ENODEV;
1714 }
1715
1716 device->blk_timeout = val;
1717 blk_queue_rq_timeout(device->block->gdp->queue, val * HZ);
1718
1719 dasd_put_device(device);
1720 return count;
1721}
1722
1723static DEVICE_ATTR(timeout, 0644,
1724 dasd_timeout_show, dasd_timeout_store);
1725
1726
1727static ssize_t
1728dasd_path_reset_store(struct device *dev, struct device_attribute *attr,
1729 const char *buf, size_t count)
1730{
1731 struct dasd_device *device;
1732 unsigned int val;
1733
1734 device = dasd_device_from_cdev(to_ccwdev(dev));
1735 if (IS_ERR(device))
1736 return -ENODEV;
1737
1738 if ((kstrtouint(buf, 16, &val) != 0) || val > 0xff)
1739 val = 0;
1740
1741 if (device->discipline && device->discipline->reset_path)
1742 device->discipline->reset_path(device, (__u8) val);
1743
1744 dasd_put_device(device);
1745 return count;
1746}
1747
1748static DEVICE_ATTR(path_reset, 0200, NULL, dasd_path_reset_store);
1749
1750static ssize_t dasd_hpf_show(struct device *dev, struct device_attribute *attr,
1751 char *buf)
1752{
1753 struct dasd_device *device;
1754 int hpf;
1755
1756 device = dasd_device_from_cdev(to_ccwdev(dev));
1757 if (IS_ERR(device))
1758 return -ENODEV;
1759 if (!device->discipline || !device->discipline->hpf_enabled) {
1760 dasd_put_device(device);
1761 return sysfs_emit(buf, "%d\n", dasd_nofcx);
1762 }
1763 hpf = device->discipline->hpf_enabled(device);
1764 dasd_put_device(device);
1765 return sysfs_emit(buf, "%d\n", hpf);
1766}
1767
1768static DEVICE_ATTR(hpf, 0444, dasd_hpf_show, NULL);
1769
1770static ssize_t dasd_reservation_policy_show(struct device *dev,
1771 struct device_attribute *attr,
1772 char *buf)
1773{
1774 struct dasd_devmap *devmap;
1775 int rc = 0;
1776
1777 devmap = dasd_find_busid(dev_name(dev));
1778 if (IS_ERR(devmap)) {
1779 rc = sysfs_emit(buf, "ignore\n");
1780 } else {
1781 spin_lock(&dasd_devmap_lock);
1782 if (devmap->features & DASD_FEATURE_FAILONSLCK)
1783 rc = sysfs_emit(buf, "fail\n");
1784 else
1785 rc = sysfs_emit(buf, "ignore\n");
1786 spin_unlock(&dasd_devmap_lock);
1787 }
1788 return rc;
1789}
1790
1791static ssize_t dasd_reservation_policy_store(struct device *dev,
1792 struct device_attribute *attr,
1793 const char *buf, size_t count)
1794{
1795 struct ccw_device *cdev = to_ccwdev(dev);
1796 int rc;
1797
1798 if (sysfs_streq("ignore", buf))
1799 rc = dasd_set_feature(cdev, DASD_FEATURE_FAILONSLCK, 0);
1800 else if (sysfs_streq("fail", buf))
1801 rc = dasd_set_feature(cdev, DASD_FEATURE_FAILONSLCK, 1);
1802 else
1803 rc = -EINVAL;
1804
1805 return rc ? : count;
1806}
1807
1808static DEVICE_ATTR(reservation_policy, 0644,
1809 dasd_reservation_policy_show, dasd_reservation_policy_store);
1810
1811static ssize_t dasd_reservation_state_show(struct device *dev,
1812 struct device_attribute *attr,
1813 char *buf)
1814{
1815 struct dasd_device *device;
1816 int rc = 0;
1817
1818 device = dasd_device_from_cdev(to_ccwdev(dev));
1819 if (IS_ERR(device))
1820 return sysfs_emit(buf, "none\n");
1821
1822 if (test_bit(DASD_FLAG_IS_RESERVED, &device->flags))
1823 rc = sysfs_emit(buf, "reserved\n");
1824 else if (test_bit(DASD_FLAG_LOCK_STOLEN, &device->flags))
1825 rc = sysfs_emit(buf, "lost\n");
1826 else
1827 rc = sysfs_emit(buf, "none\n");
1828 dasd_put_device(device);
1829 return rc;
1830}
1831
1832static ssize_t dasd_reservation_state_store(struct device *dev,
1833 struct device_attribute *attr,
1834 const char *buf, size_t count)
1835{
1836 struct dasd_device *device;
1837 int rc = 0;
1838
1839 device = dasd_device_from_cdev(to_ccwdev(dev));
1840 if (IS_ERR(device))
1841 return -ENODEV;
1842 if (sysfs_streq("reset", buf))
1843 clear_bit(DASD_FLAG_LOCK_STOLEN, &device->flags);
1844 else
1845 rc = -EINVAL;
1846 dasd_put_device(device);
1847
1848 if (rc)
1849 return rc;
1850 else
1851 return count;
1852}
1853
1854static DEVICE_ATTR(last_known_reservation_state, 0644,
1855 dasd_reservation_state_show, dasd_reservation_state_store);
1856
1857static ssize_t dasd_pm_show(struct device *dev,
1858 struct device_attribute *attr, char *buf)
1859{
1860 struct dasd_device *device;
1861 u8 opm, nppm, cablepm, cuirpm, hpfpm, ifccpm;
1862
1863 device = dasd_device_from_cdev(to_ccwdev(dev));
1864 if (IS_ERR(device))
1865 return sprintf(buf, "0\n");
1866
1867 opm = dasd_path_get_opm(device);
1868 nppm = dasd_path_get_nppm(device);
1869 cablepm = dasd_path_get_cablepm(device);
1870 cuirpm = dasd_path_get_cuirpm(device);
1871 hpfpm = dasd_path_get_hpfpm(device);
1872 ifccpm = dasd_path_get_ifccpm(device);
1873 dasd_put_device(device);
1874
1875 return sprintf(buf, "%02x %02x %02x %02x %02x %02x\n", opm, nppm,
1876 cablepm, cuirpm, hpfpm, ifccpm);
1877}
1878
1879static DEVICE_ATTR(path_masks, 0444, dasd_pm_show, NULL);
1880
1881/*
1882 * threshold value for IFCC/CCC errors
1883 */
1884static ssize_t
1885dasd_path_threshold_show(struct device *dev,
1886 struct device_attribute *attr, char *buf)
1887{
1888 struct dasd_device *device;
1889 int len;
1890
1891 device = dasd_device_from_cdev(to_ccwdev(dev));
1892 if (IS_ERR(device))
1893 return -ENODEV;
1894 len = sysfs_emit(buf, "%lu\n", device->path_thrhld);
1895 dasd_put_device(device);
1896 return len;
1897}
1898
1899static ssize_t
1900dasd_path_threshold_store(struct device *dev, struct device_attribute *attr,
1901 const char *buf, size_t count)
1902{
1903 struct dasd_device *device;
1904 unsigned long flags;
1905 unsigned long val;
1906
1907 device = dasd_device_from_cdev(to_ccwdev(dev));
1908 if (IS_ERR(device))
1909 return -ENODEV;
1910
1911 if (kstrtoul(buf, 10, &val) != 0 || val > DASD_THRHLD_MAX) {
1912 dasd_put_device(device);
1913 return -EINVAL;
1914 }
1915 spin_lock_irqsave(get_ccwdev_lock(to_ccwdev(dev)), flags);
1916 device->path_thrhld = val;
1917 spin_unlock_irqrestore(get_ccwdev_lock(to_ccwdev(dev)), flags);
1918 dasd_put_device(device);
1919 return count;
1920}
1921static DEVICE_ATTR(path_threshold, 0644, dasd_path_threshold_show,
1922 dasd_path_threshold_store);
1923
1924/*
1925 * configure if path is disabled after IFCC/CCC error threshold is
1926 * exceeded
1927 */
1928static ssize_t
1929dasd_path_autodisable_show(struct device *dev,
1930 struct device_attribute *attr, char *buf)
1931{
1932 struct dasd_devmap *devmap;
1933 int flag;
1934
1935 devmap = dasd_find_busid(dev_name(dev));
1936 if (!IS_ERR(devmap))
1937 flag = (devmap->features & DASD_FEATURE_PATH_AUTODISABLE) != 0;
1938 else
1939 flag = (DASD_FEATURE_DEFAULT &
1940 DASD_FEATURE_PATH_AUTODISABLE) != 0;
1941 return sysfs_emit(buf, flag ? "1\n" : "0\n");
1942}
1943
1944static ssize_t
1945dasd_path_autodisable_store(struct device *dev,
1946 struct device_attribute *attr,
1947 const char *buf, size_t count)
1948{
1949 unsigned int val;
1950 int rc;
1951
1952 if (kstrtouint(buf, 0, &val) || val > 1)
1953 return -EINVAL;
1954
1955 rc = dasd_set_feature(to_ccwdev(dev),
1956 DASD_FEATURE_PATH_AUTODISABLE, val);
1957
1958 return rc ? : count;
1959}
1960
1961static DEVICE_ATTR(path_autodisable, 0644,
1962 dasd_path_autodisable_show,
1963 dasd_path_autodisable_store);
1964/*
1965 * interval for IFCC/CCC checks
1966 * meaning time with no IFCC/CCC error before the error counter
1967 * gets reset
1968 */
1969static ssize_t
1970dasd_path_interval_show(struct device *dev,
1971 struct device_attribute *attr, char *buf)
1972{
1973 struct dasd_device *device;
1974 int len;
1975
1976 device = dasd_device_from_cdev(to_ccwdev(dev));
1977 if (IS_ERR(device))
1978 return -ENODEV;
1979 len = sysfs_emit(buf, "%lu\n", device->path_interval);
1980 dasd_put_device(device);
1981 return len;
1982}
1983
1984static ssize_t
1985dasd_path_interval_store(struct device *dev, struct device_attribute *attr,
1986 const char *buf, size_t count)
1987{
1988 struct dasd_device *device;
1989 unsigned long flags;
1990 unsigned long val;
1991
1992 device = dasd_device_from_cdev(to_ccwdev(dev));
1993 if (IS_ERR(device))
1994 return -ENODEV;
1995
1996 if ((kstrtoul(buf, 10, &val) != 0) ||
1997 (val > DASD_INTERVAL_MAX) || val == 0) {
1998 dasd_put_device(device);
1999 return -EINVAL;
2000 }
2001 spin_lock_irqsave(get_ccwdev_lock(to_ccwdev(dev)), flags);
2002 if (val)
2003 device->path_interval = val;
2004 spin_unlock_irqrestore(get_ccwdev_lock(to_ccwdev(dev)), flags);
2005 dasd_put_device(device);
2006 return count;
2007}
2008
2009static DEVICE_ATTR(path_interval, 0644, dasd_path_interval_show,
2010 dasd_path_interval_store);
2011
2012static ssize_t
2013dasd_device_fcs_show(struct device *dev, struct device_attribute *attr,
2014 char *buf)
2015{
2016 struct dasd_device *device;
2017 int fc_sec;
2018 int rc;
2019
2020 device = dasd_device_from_cdev(to_ccwdev(dev));
2021 if (IS_ERR(device))
2022 return -ENODEV;
2023 fc_sec = dasd_path_get_fcs_device(device);
2024 if (fc_sec == -EINVAL)
2025 rc = sysfs_emit(buf, "Inconsistent\n");
2026 else
2027 rc = sysfs_emit(buf, "%s\n", dasd_path_get_fcs_str(fc_sec));
2028 dasd_put_device(device);
2029
2030 return rc;
2031}
2032static DEVICE_ATTR(fc_security, 0444, dasd_device_fcs_show, NULL);
2033
2034static ssize_t
2035dasd_path_fcs_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf)
2036{
2037 struct dasd_path *path = to_dasd_path(kobj);
2038 unsigned int fc_sec = path->fc_security;
2039
2040 return sysfs_emit(buf, "%s\n", dasd_path_get_fcs_str(fc_sec));
2041}
2042
2043static struct kobj_attribute path_fcs_attribute =
2044 __ATTR(fc_security, 0444, dasd_path_fcs_show, NULL);
2045
2046/*
2047 * print copy relation in the form
2048 * primary,secondary[1] primary,secondary[2], ...
2049 */
2050static ssize_t
2051dasd_copy_pair_show(struct device *dev,
2052 struct device_attribute *attr, char *buf)
2053{
2054 char prim_busid[DASD_BUS_ID_SIZE];
2055 struct dasd_copy_relation *copy;
2056 struct dasd_devmap *devmap;
2057 int len = 0;
2058 int i;
2059
2060 devmap = dasd_find_busid(dev_name(dev));
2061 if (IS_ERR(devmap))
2062 return -ENODEV;
2063
2064 if (!devmap->copy)
2065 return -ENODEV;
2066
2067 copy = devmap->copy;
2068 /* find primary */
2069 for (i = 0; i < DASD_CP_ENTRIES; i++) {
2070 if (copy->entry[i].configured && copy->entry[i].primary) {
2071 strscpy(prim_busid, copy->entry[i].busid,
2072 DASD_BUS_ID_SIZE);
2073 break;
2074 }
2075 }
2076 if (i == DASD_CP_ENTRIES)
2077 goto out;
2078
2079 /* print all secondary */
2080 for (i = 0; i < DASD_CP_ENTRIES; i++) {
2081 if (copy->entry[i].configured && !copy->entry[i].primary)
2082 len += sysfs_emit_at(buf, len, "%s,%s ", prim_busid,
2083 copy->entry[i].busid);
2084 }
2085
2086 len += sysfs_emit_at(buf, len, "\n");
2087out:
2088 return len;
2089}
2090
2091static int dasd_devmap_set_copy_relation(struct dasd_devmap *devmap,
2092 struct dasd_copy_relation *copy,
2093 char *busid, bool primary)
2094{
2095 int i;
2096
2097 /* find free entry */
2098 for (i = 0; i < DASD_CP_ENTRIES; i++) {
2099 /* current bus_id already included, nothing to do */
2100 if (copy->entry[i].configured &&
2101 strncmp(copy->entry[i].busid, busid, DASD_BUS_ID_SIZE) == 0)
2102 return 0;
2103
2104 if (!copy->entry[i].configured)
2105 break;
2106 }
2107 if (i == DASD_CP_ENTRIES)
2108 return -EINVAL;
2109
2110 copy->entry[i].configured = true;
2111 strscpy(copy->entry[i].busid, busid, DASD_BUS_ID_SIZE);
2112 if (primary) {
2113 copy->active = ©->entry[i];
2114 copy->entry[i].primary = true;
2115 }
2116 if (!devmap->copy)
2117 devmap->copy = copy;
2118
2119 return 0;
2120}
2121
2122static void dasd_devmap_del_copy_relation(struct dasd_copy_relation *copy,
2123 char *busid)
2124{
2125 int i;
2126
2127 spin_lock(&dasd_devmap_lock);
2128 /* find entry */
2129 for (i = 0; i < DASD_CP_ENTRIES; i++) {
2130 if (copy->entry[i].configured &&
2131 strncmp(copy->entry[i].busid, busid, DASD_BUS_ID_SIZE) == 0)
2132 break;
2133 }
2134 if (i == DASD_CP_ENTRIES || !copy->entry[i].configured) {
2135 spin_unlock(&dasd_devmap_lock);
2136 return;
2137 }
2138
2139 copy->entry[i].configured = false;
2140 memset(copy->entry[i].busid, 0, DASD_BUS_ID_SIZE);
2141 if (copy->active == ©->entry[i]) {
2142 copy->active = NULL;
2143 copy->entry[i].primary = false;
2144 }
2145 spin_unlock(&dasd_devmap_lock);
2146}
2147
2148static int dasd_devmap_clear_copy_relation(struct device *dev)
2149{
2150 struct dasd_copy_relation *copy;
2151 struct dasd_devmap *devmap;
2152 int i, rc = 1;
2153
2154 devmap = dasd_devmap_from_cdev(to_ccwdev(dev));
2155 if (IS_ERR(devmap))
2156 return 1;
2157
2158 spin_lock(&dasd_devmap_lock);
2159 if (!devmap->copy)
2160 goto out;
2161
2162 copy = devmap->copy;
2163 /* first check if all secondary devices are offline*/
2164 for (i = 0; i < DASD_CP_ENTRIES; i++) {
2165 if (!copy->entry[i].configured)
2166 continue;
2167
2168 if (copy->entry[i].device == copy->active->device)
2169 continue;
2170
2171 if (copy->entry[i].device)
2172 goto out;
2173 }
2174 /* clear all devmap entries */
2175 for (i = 0; i < DASD_CP_ENTRIES; i++) {
2176 if (strlen(copy->entry[i].busid) == 0)
2177 continue;
2178 if (copy->entry[i].device) {
2179 dasd_put_device(copy->entry[i].device);
2180 copy->entry[i].device->copy = NULL;
2181 copy->entry[i].device = NULL;
2182 }
2183 devmap = dasd_find_busid_locked(copy->entry[i].busid);
2184 devmap->copy = NULL;
2185 memset(copy->entry[i].busid, 0, DASD_BUS_ID_SIZE);
2186 }
2187 kfree(copy);
2188 rc = 0;
2189out:
2190 spin_unlock(&dasd_devmap_lock);
2191 return rc;
2192}
2193
2194/*
2195 * parse BUSIDs from a copy pair
2196 */
2197static int dasd_devmap_parse_busid(const char *buf, char *prim_busid,
2198 char *sec_busid)
2199{
2200 char *primary, *secondary, *tmp, *pt;
2201 int id0, id1, id2;
2202
2203 pt = kstrdup(buf, GFP_KERNEL);
2204 tmp = pt;
2205 if (!tmp)
2206 return -ENOMEM;
2207
2208 primary = strsep(&tmp, ",");
2209 if (!primary) {
2210 kfree(pt);
2211 return -EINVAL;
2212 }
2213 secondary = strsep(&tmp, ",");
2214 if (!secondary) {
2215 kfree(pt);
2216 return -EINVAL;
2217 }
2218 if (dasd_busid(primary, &id0, &id1, &id2)) {
2219 kfree(pt);
2220 return -EINVAL;
2221 }
2222 sprintf(prim_busid, "%01x.%01x.%04x", id0, id1, id2);
2223 if (dasd_busid(secondary, &id0, &id1, &id2)) {
2224 kfree(pt);
2225 return -EINVAL;
2226 }
2227 sprintf(sec_busid, "%01x.%01x.%04x", id0, id1, id2);
2228 kfree(pt);
2229
2230 return 0;
2231}
2232
2233static ssize_t dasd_copy_pair_store(struct device *dev,
2234 struct device_attribute *attr,
2235 const char *buf, size_t count)
2236{
2237 struct dasd_devmap *prim_devmap, *sec_devmap;
2238 char prim_busid[DASD_BUS_ID_SIZE];
2239 char sec_busid[DASD_BUS_ID_SIZE];
2240 struct dasd_copy_relation *copy;
2241 struct dasd_device *device;
2242 bool pprc_enabled;
2243 int rc;
2244
2245 if (strncmp(buf, "clear", strlen("clear")) == 0) {
2246 if (dasd_devmap_clear_copy_relation(dev))
2247 return -EINVAL;
2248 return count;
2249 }
2250
2251 rc = dasd_devmap_parse_busid(buf, prim_busid, sec_busid);
2252 if (rc)
2253 return rc;
2254
2255 if (strncmp(dev_name(dev), prim_busid, DASD_BUS_ID_SIZE) != 0 &&
2256 strncmp(dev_name(dev), sec_busid, DASD_BUS_ID_SIZE) != 0)
2257 return -EINVAL;
2258
2259 /* allocate primary devmap if needed */
2260 prim_devmap = dasd_find_busid(prim_busid);
2261 if (IS_ERR(prim_devmap))
2262 prim_devmap = dasd_add_busid(prim_busid, DASD_FEATURE_DEFAULT);
2263
2264 /* allocate secondary devmap if needed */
2265 sec_devmap = dasd_find_busid(sec_busid);
2266 if (IS_ERR(sec_devmap))
2267 sec_devmap = dasd_add_busid(sec_busid, DASD_FEATURE_DEFAULT);
2268
2269 /* setting copy relation is only allowed for offline secondary */
2270 if (sec_devmap->device)
2271 return -EINVAL;
2272
2273 if (prim_devmap->copy) {
2274 copy = prim_devmap->copy;
2275 } else if (sec_devmap->copy) {
2276 copy = sec_devmap->copy;
2277 } else {
2278 copy = kzalloc(sizeof(*copy), GFP_KERNEL);
2279 if (!copy)
2280 return -ENOMEM;
2281 }
2282 spin_lock(&dasd_devmap_lock);
2283 rc = dasd_devmap_set_copy_relation(prim_devmap, copy, prim_busid, true);
2284 if (rc) {
2285 spin_unlock(&dasd_devmap_lock);
2286 return rc;
2287 }
2288 rc = dasd_devmap_set_copy_relation(sec_devmap, copy, sec_busid, false);
2289 if (rc) {
2290 spin_unlock(&dasd_devmap_lock);
2291 return rc;
2292 }
2293 spin_unlock(&dasd_devmap_lock);
2294
2295 /* if primary device is already online call device setup directly */
2296 if (prim_devmap->device && !prim_devmap->device->copy) {
2297 device = prim_devmap->device;
2298 if (device->discipline->pprc_enabled) {
2299 pprc_enabled = device->discipline->pprc_enabled(device);
2300 rc = dasd_devmap_set_device_copy_relation(device->cdev,
2301 pprc_enabled);
2302 } else {
2303 rc = -EOPNOTSUPP;
2304 }
2305 }
2306 if (rc) {
2307 dasd_devmap_del_copy_relation(copy, prim_busid);
2308 dasd_devmap_del_copy_relation(copy, sec_busid);
2309 count = rc;
2310 }
2311
2312 return count;
2313}
2314static DEVICE_ATTR(copy_pair, 0644, dasd_copy_pair_show,
2315 dasd_copy_pair_store);
2316
2317static ssize_t
2318dasd_copy_role_show(struct device *dev,
2319 struct device_attribute *attr, char *buf)
2320{
2321 struct dasd_copy_relation *copy;
2322 struct dasd_device *device;
2323 int len, i;
2324
2325 device = dasd_device_from_cdev(to_ccwdev(dev));
2326 if (IS_ERR(device))
2327 return -ENODEV;
2328
2329 if (!device->copy) {
2330 len = sysfs_emit(buf, "none\n");
2331 goto out;
2332 }
2333 copy = device->copy;
2334 /* only the active device is primary */
2335 if (copy->active->device == device) {
2336 len = sysfs_emit(buf, "primary\n");
2337 goto out;
2338 }
2339 for (i = 0; i < DASD_CP_ENTRIES; i++) {
2340 if (copy->entry[i].device == device) {
2341 len = sysfs_emit(buf, "secondary\n");
2342 goto out;
2343 }
2344 }
2345 /* not in the list, no COPY role */
2346 len = sysfs_emit(buf, "none\n");
2347out:
2348 dasd_put_device(device);
2349 return len;
2350}
2351static DEVICE_ATTR(copy_role, 0444, dasd_copy_role_show, NULL);
2352
2353static ssize_t dasd_device_ping(struct device *dev,
2354 struct device_attribute *attr,
2355 const char *buf, size_t count)
2356{
2357 struct dasd_device *device;
2358 size_t rc;
2359
2360 device = dasd_device_from_cdev(to_ccwdev(dev));
2361 if (IS_ERR(device))
2362 return -ENODEV;
2363
2364 /*
2365 * do not try during offline processing
2366 * early check only
2367 * the sleep_on function itself checks for offline
2368 * processing again
2369 */
2370 if (test_bit(DASD_FLAG_OFFLINE, &device->flags)) {
2371 rc = -EBUSY;
2372 goto out;
2373 }
2374 if (!device->discipline || !device->discipline->device_ping) {
2375 rc = -EOPNOTSUPP;
2376 goto out;
2377 }
2378 rc = device->discipline->device_ping(device);
2379 if (!rc)
2380 rc = count;
2381out:
2382 dasd_put_device(device);
2383 return rc;
2384}
2385static DEVICE_ATTR(ping, 0200, NULL, dasd_device_ping);
2386
2387#define DASD_DEFINE_ATTR(_name, _func) \
2388static ssize_t dasd_##_name##_show(struct device *dev, \
2389 struct device_attribute *attr, \
2390 char *buf) \
2391{ \
2392 struct ccw_device *cdev = to_ccwdev(dev); \
2393 struct dasd_device *device = dasd_device_from_cdev(cdev); \
2394 int val = 0; \
2395 \
2396 if (IS_ERR(device)) \
2397 return -ENODEV; \
2398 if (device->discipline && _func) \
2399 val = _func(device); \
2400 dasd_put_device(device); \
2401 \
2402 return sysfs_emit(buf, "%d\n", val); \
2403} \
2404static DEVICE_ATTR(_name, 0444, dasd_##_name##_show, NULL); \
2405
2406DASD_DEFINE_ATTR(ese, device->discipline->is_ese);
2407DASD_DEFINE_ATTR(extent_size, device->discipline->ext_size);
2408DASD_DEFINE_ATTR(pool_id, device->discipline->ext_pool_id);
2409DASD_DEFINE_ATTR(space_configured, device->discipline->space_configured);
2410DASD_DEFINE_ATTR(space_allocated, device->discipline->space_allocated);
2411DASD_DEFINE_ATTR(logical_capacity, device->discipline->logical_capacity);
2412DASD_DEFINE_ATTR(warn_threshold, device->discipline->ext_pool_warn_thrshld);
2413DASD_DEFINE_ATTR(cap_at_warnlevel, device->discipline->ext_pool_cap_at_warnlevel);
2414DASD_DEFINE_ATTR(pool_oos, device->discipline->ext_pool_oos);
2415
2416static struct attribute * dasd_attrs[] = {
2417 &dev_attr_readonly.attr,
2418 &dev_attr_discipline.attr,
2419 &dev_attr_status.attr,
2420 &dev_attr_alias.attr,
2421 &dev_attr_vendor.attr,
2422 &dev_attr_uid.attr,
2423 &dev_attr_use_diag.attr,
2424 &dev_attr_raw_track_access.attr,
2425 &dev_attr_eer_enabled.attr,
2426 &dev_attr_erplog.attr,
2427 &dev_attr_failfast.attr,
2428 &dev_attr_expires.attr,
2429 &dev_attr_retries.attr,
2430 &dev_attr_timeout.attr,
2431 &dev_attr_reservation_policy.attr,
2432 &dev_attr_last_known_reservation_state.attr,
2433 &dev_attr_safe_offline.attr,
2434 &dev_attr_host_access_count.attr,
2435 &dev_attr_path_masks.attr,
2436 &dev_attr_path_threshold.attr,
2437 &dev_attr_path_autodisable.attr,
2438 &dev_attr_path_interval.attr,
2439 &dev_attr_path_reset.attr,
2440 &dev_attr_hpf.attr,
2441 &dev_attr_ese.attr,
2442 &dev_attr_fc_security.attr,
2443 &dev_attr_copy_pair.attr,
2444 &dev_attr_copy_role.attr,
2445 &dev_attr_ping.attr,
2446 &dev_attr_aq_mask.attr,
2447 &dev_attr_aq_requeue.attr,
2448 &dev_attr_aq_timeouts.attr,
2449 NULL,
2450};
2451
2452static const struct attribute_group dasd_attr_group = {
2453 .attrs = dasd_attrs,
2454};
2455
2456static struct attribute *capacity_attrs[] = {
2457 &dev_attr_space_configured.attr,
2458 &dev_attr_space_allocated.attr,
2459 &dev_attr_logical_capacity.attr,
2460 NULL,
2461};
2462
2463static const struct attribute_group capacity_attr_group = {
2464 .name = "capacity",
2465 .attrs = capacity_attrs,
2466};
2467
2468static struct attribute *ext_pool_attrs[] = {
2469 &dev_attr_pool_id.attr,
2470 &dev_attr_extent_size.attr,
2471 &dev_attr_warn_threshold.attr,
2472 &dev_attr_cap_at_warnlevel.attr,
2473 &dev_attr_pool_oos.attr,
2474 NULL,
2475};
2476
2477static const struct attribute_group ext_pool_attr_group = {
2478 .name = "extent_pool",
2479 .attrs = ext_pool_attrs,
2480};
2481
2482const struct attribute_group *dasd_dev_groups[] = {
2483 &dasd_attr_group,
2484 &capacity_attr_group,
2485 &ext_pool_attr_group,
2486 NULL,
2487};
2488EXPORT_SYMBOL_GPL(dasd_dev_groups);
2489
2490/*
2491 * Return value of the specified feature.
2492 */
2493int
2494dasd_get_feature(struct ccw_device *cdev, int feature)
2495{
2496 struct dasd_devmap *devmap;
2497
2498 devmap = dasd_find_busid(dev_name(&cdev->dev));
2499 if (IS_ERR(devmap))
2500 return PTR_ERR(devmap);
2501
2502 return ((devmap->features & feature) != 0);
2503}
2504
2505/*
2506 * Set / reset given feature.
2507 * Flag indicates whether to set (!=0) or the reset (=0) the feature.
2508 */
2509int
2510dasd_set_feature(struct ccw_device *cdev, int feature, int flag)
2511{
2512 struct dasd_devmap *devmap;
2513
2514 devmap = dasd_devmap_from_cdev(cdev);
2515 if (IS_ERR(devmap))
2516 return PTR_ERR(devmap);
2517
2518 spin_lock(&dasd_devmap_lock);
2519 if (flag)
2520 devmap->features |= feature;
2521 else
2522 devmap->features &= ~feature;
2523 if (devmap->device)
2524 devmap->device->features = devmap->features;
2525 spin_unlock(&dasd_devmap_lock);
2526 return 0;
2527}
2528EXPORT_SYMBOL(dasd_set_feature);
2529
2530static struct attribute *paths_info_attrs[] = {
2531 &path_fcs_attribute.attr,
2532 NULL,
2533};
2534ATTRIBUTE_GROUPS(paths_info);
2535
2536static struct kobj_type path_attr_type = {
2537 .release = dasd_path_release,
2538 .default_groups = paths_info_groups,
2539 .sysfs_ops = &kobj_sysfs_ops,
2540};
2541
2542static void dasd_path_init_kobj(struct dasd_device *device, int chp)
2543{
2544 device->path[chp].kobj.kset = device->paths_info;
2545 kobject_init(&device->path[chp].kobj, &path_attr_type);
2546}
2547
2548void dasd_path_create_kobj(struct dasd_device *device, int chp)
2549{
2550 int rc;
2551
2552 if (test_bit(DASD_FLAG_OFFLINE, &device->flags))
2553 return;
2554 if (!device->paths_info) {
2555 dev_warn(&device->cdev->dev, "Unable to create paths objects\n");
2556 return;
2557 }
2558 if (device->path[chp].in_sysfs)
2559 return;
2560 if (!device->path[chp].conf_data)
2561 return;
2562
2563 dasd_path_init_kobj(device, chp);
2564
2565 rc = kobject_add(&device->path[chp].kobj, NULL, "%x.%02x",
2566 device->path[chp].cssid, device->path[chp].chpid);
2567 if (rc)
2568 kobject_put(&device->path[chp].kobj);
2569 device->path[chp].in_sysfs = true;
2570}
2571EXPORT_SYMBOL(dasd_path_create_kobj);
2572
2573void dasd_path_create_kobjects(struct dasd_device *device)
2574{
2575 u8 lpm, opm;
2576
2577 opm = dasd_path_get_opm(device);
2578 for (lpm = 0x80; lpm; lpm >>= 1) {
2579 if (!(lpm & opm))
2580 continue;
2581 dasd_path_create_kobj(device, pathmask_to_pos(lpm));
2582 }
2583}
2584EXPORT_SYMBOL(dasd_path_create_kobjects);
2585
2586static void dasd_path_remove_kobj(struct dasd_device *device, int chp)
2587{
2588 if (device->path[chp].in_sysfs) {
2589 kobject_put(&device->path[chp].kobj);
2590 device->path[chp].in_sysfs = false;
2591 }
2592}
2593
2594/*
2595 * As we keep kobjects for the lifetime of a device, this function must not be
2596 * called anywhere but in the context of offlining a device.
2597 */
2598void dasd_path_remove_kobjects(struct dasd_device *device)
2599{
2600 int i;
2601
2602 for (i = 0; i < 8; i++)
2603 dasd_path_remove_kobj(device, i);
2604}
2605EXPORT_SYMBOL(dasd_path_remove_kobjects);
2606
2607int
2608dasd_devmap_init(void)
2609{
2610 int i;
2611
2612 /* Initialize devmap structures. */
2613 dasd_max_devindex = 0;
2614 for (i = 0; i < 256; i++)
2615 INIT_LIST_HEAD(&dasd_hashlists[i]);
2616 return 0;
2617}
2618
2619void
2620dasd_devmap_exit(void)
2621{
2622 dasd_forget_ranges();
2623}
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * Author(s)......: Holger Smolinski <Holger.Smolinski@de.ibm.com>
4 * Horst Hummel <Horst.Hummel@de.ibm.com>
5 * Carsten Otte <Cotte@de.ibm.com>
6 * Martin Schwidefsky <schwidefsky@de.ibm.com>
7 * Bugreports.to..: <Linux390@de.ibm.com>
8 * Copyright IBM Corp. 1999,2001
9 *
10 * Device mapping and dasd= parameter parsing functions. All devmap
11 * functions may not be called from interrupt context. In particular
12 * dasd_get_device is a no-no from interrupt context.
13 *
14 */
15
16#define KMSG_COMPONENT "dasd"
17
18#include <linux/ctype.h>
19#include <linux/init.h>
20#include <linux/module.h>
21#include <linux/slab.h>
22
23#include <asm/debug.h>
24#include <linux/uaccess.h>
25#include <asm/ipl.h>
26
27/* This is ugly... */
28#define PRINTK_HEADER "dasd_devmap:"
29#define DASD_BUS_ID_SIZE 20
30#define DASD_MAX_PARAMS 256
31
32#include "dasd_int.h"
33
34struct kmem_cache *dasd_page_cache;
35EXPORT_SYMBOL_GPL(dasd_page_cache);
36
37/*
38 * dasd_devmap_t is used to store the features and the relation
39 * between device number and device index. To find a dasd_devmap_t
40 * that corresponds to a device number of a device index each
41 * dasd_devmap_t is added to two linked lists, one to search by
42 * the device number and one to search by the device index. As
43 * soon as big minor numbers are available the device index list
44 * can be removed since the device number will then be identical
45 * to the device index.
46 */
47struct dasd_devmap {
48 struct list_head list;
49 char bus_id[DASD_BUS_ID_SIZE];
50 unsigned int devindex;
51 unsigned short features;
52 struct dasd_device *device;
53};
54
55/*
56 * Parameter parsing functions for dasd= parameter. The syntax is:
57 * <devno> : (0x)?[0-9a-fA-F]+
58 * <busid> : [0-0a-f]\.[0-9a-f]\.(0x)?[0-9a-fA-F]+
59 * <feature> : ro
60 * <feature_list> : \(<feature>(:<feature>)*\)
61 * <devno-range> : <devno>(-<devno>)?<feature_list>?
62 * <busid-range> : <busid>(-<busid>)?<feature_list>?
63 * <devices> : <devno-range>|<busid-range>
64 * <dasd_module> : dasd_diag_mod|dasd_eckd_mod|dasd_fba_mod
65 *
66 * <dasd> : autodetect|probeonly|<devices>(,<devices>)*
67 */
68
69int dasd_probeonly = 0; /* is true, when probeonly mode is active */
70int dasd_autodetect = 0; /* is true, when autodetection is active */
71int dasd_nopav = 0; /* is true, when PAV is disabled */
72EXPORT_SYMBOL_GPL(dasd_nopav);
73int dasd_nofcx; /* disable High Performance Ficon */
74EXPORT_SYMBOL_GPL(dasd_nofcx);
75
76/*
77 * char *dasd[] is intended to hold the ranges supplied by the dasd= statement
78 * it is named 'dasd' to directly be filled by insmod with the comma separated
79 * strings when running as a module.
80 */
81static char *dasd[DASD_MAX_PARAMS];
82module_param_array(dasd, charp, NULL, S_IRUGO);
83
84/*
85 * Single spinlock to protect devmap and servermap structures and lists.
86 */
87static DEFINE_SPINLOCK(dasd_devmap_lock);
88
89/*
90 * Hash lists for devmap structures.
91 */
92static struct list_head dasd_hashlists[256];
93int dasd_max_devindex;
94
95static struct dasd_devmap *dasd_add_busid(const char *, int);
96
97static inline int
98dasd_hash_busid(const char *bus_id)
99{
100 int hash, i;
101
102 hash = 0;
103 for (i = 0; (i < DASD_BUS_ID_SIZE) && *bus_id; i++, bus_id++)
104 hash += *bus_id;
105 return hash & 0xff;
106}
107
108#ifndef MODULE
109static int __init dasd_call_setup(char *opt)
110{
111 static int i __initdata;
112 char *tmp;
113
114 while (i < DASD_MAX_PARAMS) {
115 tmp = strsep(&opt, ",");
116 if (!tmp)
117 break;
118
119 dasd[i++] = tmp;
120 }
121
122 return 1;
123}
124
125__setup ("dasd=", dasd_call_setup);
126#endif /* #ifndef MODULE */
127
128#define DASD_IPLDEV "ipldev"
129
130/*
131 * Read a device busid/devno from a string.
132 */
133static int __init dasd_busid(char *str, int *id0, int *id1, int *devno)
134{
135 unsigned int val;
136 char *tok;
137
138 /* Interpret ipldev busid */
139 if (strncmp(DASD_IPLDEV, str, strlen(DASD_IPLDEV)) == 0) {
140 if (ipl_info.type != IPL_TYPE_CCW) {
141 pr_err("The IPL device is not a CCW device\n");
142 return -EINVAL;
143 }
144 *id0 = 0;
145 *id1 = ipl_info.data.ccw.dev_id.ssid;
146 *devno = ipl_info.data.ccw.dev_id.devno;
147
148 return 0;
149 }
150
151 /* Old style 0xXXXX or XXXX */
152 if (!kstrtouint(str, 16, &val)) {
153 *id0 = *id1 = 0;
154 if (val > 0xffff)
155 return -EINVAL;
156 *devno = val;
157 return 0;
158 }
159
160 /* New style x.y.z busid */
161 tok = strsep(&str, ".");
162 if (kstrtouint(tok, 16, &val) || val > 0xff)
163 return -EINVAL;
164 *id0 = val;
165
166 tok = strsep(&str, ".");
167 if (kstrtouint(tok, 16, &val) || val > 0xff)
168 return -EINVAL;
169 *id1 = val;
170
171 tok = strsep(&str, ".");
172 if (kstrtouint(tok, 16, &val) || val > 0xffff)
173 return -EINVAL;
174 *devno = val;
175
176 return 0;
177}
178
179/*
180 * Read colon separated list of dasd features.
181 */
182static int __init dasd_feature_list(char *str)
183{
184 int features, len, rc;
185
186 features = 0;
187 rc = 0;
188
189 if (!str)
190 return DASD_FEATURE_DEFAULT;
191
192 while (1) {
193 for (len = 0;
194 str[len] && str[len] != ':' && str[len] != ')'; len++);
195 if (len == 2 && !strncmp(str, "ro", 2))
196 features |= DASD_FEATURE_READONLY;
197 else if (len == 4 && !strncmp(str, "diag", 4))
198 features |= DASD_FEATURE_USEDIAG;
199 else if (len == 3 && !strncmp(str, "raw", 3))
200 features |= DASD_FEATURE_USERAW;
201 else if (len == 6 && !strncmp(str, "erplog", 6))
202 features |= DASD_FEATURE_ERPLOG;
203 else if (len == 8 && !strncmp(str, "failfast", 8))
204 features |= DASD_FEATURE_FAILFAST;
205 else {
206 pr_warn("%.*s is not a supported device option\n",
207 len, str);
208 rc = -EINVAL;
209 }
210 str += len;
211 if (*str != ':')
212 break;
213 str++;
214 }
215
216 return rc ? : features;
217}
218
219/*
220 * Try to match the first element on the comma separated parse string
221 * with one of the known keywords. If a keyword is found, take the approprate
222 * action and return a pointer to the residual string. If the first element
223 * could not be matched to any keyword then return an error code.
224 */
225static int __init dasd_parse_keyword(char *keyword)
226{
227 int length = strlen(keyword);
228
229 if (strncmp("autodetect", keyword, length) == 0) {
230 dasd_autodetect = 1;
231 pr_info("The autodetection mode has been activated\n");
232 return 0;
233 }
234 if (strncmp("probeonly", keyword, length) == 0) {
235 dasd_probeonly = 1;
236 pr_info("The probeonly mode has been activated\n");
237 return 0;
238 }
239 if (strncmp("nopav", keyword, length) == 0) {
240 if (MACHINE_IS_VM)
241 pr_info("'nopav' is not supported on z/VM\n");
242 else {
243 dasd_nopav = 1;
244 pr_info("PAV support has be deactivated\n");
245 }
246 return 0;
247 }
248 if (strncmp("nofcx", keyword, length) == 0) {
249 dasd_nofcx = 1;
250 pr_info("High Performance FICON support has been "
251 "deactivated\n");
252 return 0;
253 }
254 if (strncmp("fixedbuffers", keyword, length) == 0) {
255 if (dasd_page_cache)
256 return 0;
257 dasd_page_cache =
258 kmem_cache_create("dasd_page_cache", PAGE_SIZE,
259 PAGE_SIZE, SLAB_CACHE_DMA,
260 NULL);
261 if (!dasd_page_cache)
262 DBF_EVENT(DBF_WARNING, "%s", "Failed to create slab, "
263 "fixed buffer mode disabled.");
264 else
265 DBF_EVENT(DBF_INFO, "%s",
266 "turning on fixed buffer mode");
267 return 0;
268 }
269
270 return -EINVAL;
271}
272
273/*
274 * Split a string of a device range into its pieces and return the from, to, and
275 * feature parts separately.
276 * e.g.:
277 * 0.0.1234-0.0.5678(ro:erplog) -> from: 0.0.1234 to: 0.0.5678 features: ro:erplog
278 * 0.0.8765(raw) -> from: 0.0.8765 to: null features: raw
279 * 0x4321 -> from: 0x4321 to: null features: null
280 */
281static int __init dasd_evaluate_range_param(char *range, char **from_str,
282 char **to_str, char **features_str)
283{
284 int rc = 0;
285
286 /* Do we have a range or a single device? */
287 if (strchr(range, '-')) {
288 *from_str = strsep(&range, "-");
289 *to_str = strsep(&range, "(");
290 *features_str = strsep(&range, ")");
291 } else {
292 *from_str = strsep(&range, "(");
293 *features_str = strsep(&range, ")");
294 }
295
296 if (*features_str && !range) {
297 pr_warn("A closing parenthesis ')' is missing in the dasd= parameter\n");
298 rc = -EINVAL;
299 }
300
301 return rc;
302}
303
304/*
305 * Try to interprete the range string as a device number or a range of devices.
306 * If the interpretation is successful, create the matching dasd_devmap entries.
307 * If interpretation fails or in case of an error, return an error code.
308 */
309static int __init dasd_parse_range(const char *range)
310{
311 struct dasd_devmap *devmap;
312 int from, from_id0, from_id1;
313 int to, to_id0, to_id1;
314 int features;
315 char bus_id[DASD_BUS_ID_SIZE + 1];
316 char *features_str = NULL;
317 char *from_str = NULL;
318 char *to_str = NULL;
319 int rc = 0;
320 char *tmp;
321
322 tmp = kstrdup(range, GFP_KERNEL);
323 if (!tmp)
324 return -ENOMEM;
325
326 if (dasd_evaluate_range_param(tmp, &from_str, &to_str, &features_str)) {
327 rc = -EINVAL;
328 goto out;
329 }
330
331 if (dasd_busid(from_str, &from_id0, &from_id1, &from)) {
332 rc = -EINVAL;
333 goto out;
334 }
335
336 to = from;
337 to_id0 = from_id0;
338 to_id1 = from_id1;
339 if (to_str) {
340 if (dasd_busid(to_str, &to_id0, &to_id1, &to)) {
341 rc = -EINVAL;
342 goto out;
343 }
344 if (from_id0 != to_id0 || from_id1 != to_id1 || from > to) {
345 pr_err("%s is not a valid device range\n", range);
346 rc = -EINVAL;
347 goto out;
348 }
349 }
350
351 features = dasd_feature_list(features_str);
352 if (features < 0) {
353 rc = -EINVAL;
354 goto out;
355 }
356 /* each device in dasd= parameter should be set initially online */
357 features |= DASD_FEATURE_INITIAL_ONLINE;
358 while (from <= to) {
359 sprintf(bus_id, "%01x.%01x.%04x", from_id0, from_id1, from++);
360 devmap = dasd_add_busid(bus_id, features);
361 if (IS_ERR(devmap)) {
362 rc = PTR_ERR(devmap);
363 goto out;
364 }
365 }
366
367out:
368 kfree(tmp);
369
370 return rc;
371}
372
373/*
374 * Parse parameters stored in dasd[]
375 * The 'dasd=...' parameter allows to specify a comma separated list of
376 * keywords and device ranges. The parameters in that list will be stored as
377 * separate elementes in dasd[].
378 */
379int __init dasd_parse(void)
380{
381 int rc, i;
382 char *cur;
383
384 rc = 0;
385 for (i = 0; i < DASD_MAX_PARAMS; i++) {
386 cur = dasd[i];
387 if (!cur)
388 break;
389 if (*cur == '\0')
390 continue;
391
392 rc = dasd_parse_keyword(cur);
393 if (rc)
394 rc = dasd_parse_range(cur);
395
396 if (rc)
397 break;
398 }
399
400 return rc;
401}
402
403/*
404 * Add a devmap for the device specified by busid. It is possible that
405 * the devmap already exists (dasd= parameter). The order of the devices
406 * added through this function will define the kdevs for the individual
407 * devices.
408 */
409static struct dasd_devmap *
410dasd_add_busid(const char *bus_id, int features)
411{
412 struct dasd_devmap *devmap, *new, *tmp;
413 int hash;
414
415 new = kzalloc(sizeof(struct dasd_devmap), GFP_KERNEL);
416 if (!new)
417 return ERR_PTR(-ENOMEM);
418 spin_lock(&dasd_devmap_lock);
419 devmap = NULL;
420 hash = dasd_hash_busid(bus_id);
421 list_for_each_entry(tmp, &dasd_hashlists[hash], list)
422 if (strncmp(tmp->bus_id, bus_id, DASD_BUS_ID_SIZE) == 0) {
423 devmap = tmp;
424 break;
425 }
426 if (!devmap) {
427 /* This bus_id is new. */
428 new->devindex = dasd_max_devindex++;
429 strlcpy(new->bus_id, bus_id, DASD_BUS_ID_SIZE);
430 new->features = features;
431 new->device = NULL;
432 list_add(&new->list, &dasd_hashlists[hash]);
433 devmap = new;
434 new = NULL;
435 }
436 spin_unlock(&dasd_devmap_lock);
437 kfree(new);
438 return devmap;
439}
440
441/*
442 * Find devmap for device with given bus_id.
443 */
444static struct dasd_devmap *
445dasd_find_busid(const char *bus_id)
446{
447 struct dasd_devmap *devmap, *tmp;
448 int hash;
449
450 spin_lock(&dasd_devmap_lock);
451 devmap = ERR_PTR(-ENODEV);
452 hash = dasd_hash_busid(bus_id);
453 list_for_each_entry(tmp, &dasd_hashlists[hash], list) {
454 if (strncmp(tmp->bus_id, bus_id, DASD_BUS_ID_SIZE) == 0) {
455 devmap = tmp;
456 break;
457 }
458 }
459 spin_unlock(&dasd_devmap_lock);
460 return devmap;
461}
462
463/*
464 * Check if busid has been added to the list of dasd ranges.
465 */
466int
467dasd_busid_known(const char *bus_id)
468{
469 return IS_ERR(dasd_find_busid(bus_id)) ? -ENOENT : 0;
470}
471
472/*
473 * Forget all about the device numbers added so far.
474 * This may only be called at module unload or system shutdown.
475 */
476static void
477dasd_forget_ranges(void)
478{
479 struct dasd_devmap *devmap, *n;
480 int i;
481
482 spin_lock(&dasd_devmap_lock);
483 for (i = 0; i < 256; i++) {
484 list_for_each_entry_safe(devmap, n, &dasd_hashlists[i], list) {
485 BUG_ON(devmap->device != NULL);
486 list_del(&devmap->list);
487 kfree(devmap);
488 }
489 }
490 spin_unlock(&dasd_devmap_lock);
491}
492
493/*
494 * Find the device struct by its device index.
495 */
496struct dasd_device *
497dasd_device_from_devindex(int devindex)
498{
499 struct dasd_devmap *devmap, *tmp;
500 struct dasd_device *device;
501 int i;
502
503 spin_lock(&dasd_devmap_lock);
504 devmap = NULL;
505 for (i = 0; (i < 256) && !devmap; i++)
506 list_for_each_entry(tmp, &dasd_hashlists[i], list)
507 if (tmp->devindex == devindex) {
508 /* Found the devmap for the device. */
509 devmap = tmp;
510 break;
511 }
512 if (devmap && devmap->device) {
513 device = devmap->device;
514 dasd_get_device(device);
515 } else
516 device = ERR_PTR(-ENODEV);
517 spin_unlock(&dasd_devmap_lock);
518 return device;
519}
520
521/*
522 * Return devmap for cdev. If no devmap exists yet, create one and
523 * connect it to the cdev.
524 */
525static struct dasd_devmap *
526dasd_devmap_from_cdev(struct ccw_device *cdev)
527{
528 struct dasd_devmap *devmap;
529
530 devmap = dasd_find_busid(dev_name(&cdev->dev));
531 if (IS_ERR(devmap))
532 devmap = dasd_add_busid(dev_name(&cdev->dev),
533 DASD_FEATURE_DEFAULT);
534 return devmap;
535}
536
537/*
538 * Create a dasd device structure for cdev.
539 */
540struct dasd_device *
541dasd_create_device(struct ccw_device *cdev)
542{
543 struct dasd_devmap *devmap;
544 struct dasd_device *device;
545 unsigned long flags;
546 int rc;
547
548 devmap = dasd_devmap_from_cdev(cdev);
549 if (IS_ERR(devmap))
550 return (void *) devmap;
551
552 device = dasd_alloc_device();
553 if (IS_ERR(device))
554 return device;
555 atomic_set(&device->ref_count, 3);
556
557 spin_lock(&dasd_devmap_lock);
558 if (!devmap->device) {
559 devmap->device = device;
560 device->devindex = devmap->devindex;
561 device->features = devmap->features;
562 get_device(&cdev->dev);
563 device->cdev = cdev;
564 rc = 0;
565 } else
566 /* Someone else was faster. */
567 rc = -EBUSY;
568 spin_unlock(&dasd_devmap_lock);
569
570 if (rc) {
571 dasd_free_device(device);
572 return ERR_PTR(rc);
573 }
574
575 spin_lock_irqsave(get_ccwdev_lock(cdev), flags);
576 dev_set_drvdata(&cdev->dev, device);
577 spin_unlock_irqrestore(get_ccwdev_lock(cdev), flags);
578
579 return device;
580}
581
582/*
583 * Wait queue for dasd_delete_device waits.
584 */
585static DECLARE_WAIT_QUEUE_HEAD(dasd_delete_wq);
586
587/*
588 * Remove a dasd device structure. The passed referenced
589 * is destroyed.
590 */
591void
592dasd_delete_device(struct dasd_device *device)
593{
594 struct ccw_device *cdev;
595 struct dasd_devmap *devmap;
596 unsigned long flags;
597
598 /* First remove device pointer from devmap. */
599 devmap = dasd_find_busid(dev_name(&device->cdev->dev));
600 BUG_ON(IS_ERR(devmap));
601 spin_lock(&dasd_devmap_lock);
602 if (devmap->device != device) {
603 spin_unlock(&dasd_devmap_lock);
604 dasd_put_device(device);
605 return;
606 }
607 devmap->device = NULL;
608 spin_unlock(&dasd_devmap_lock);
609
610 /* Disconnect dasd_device structure from ccw_device structure. */
611 spin_lock_irqsave(get_ccwdev_lock(device->cdev), flags);
612 dev_set_drvdata(&device->cdev->dev, NULL);
613 spin_unlock_irqrestore(get_ccwdev_lock(device->cdev), flags);
614
615 /*
616 * Drop ref_count by 3, one for the devmap reference, one for
617 * the cdev reference and one for the passed reference.
618 */
619 atomic_sub(3, &device->ref_count);
620
621 /* Wait for reference counter to drop to zero. */
622 wait_event(dasd_delete_wq, atomic_read(&device->ref_count) == 0);
623
624 dasd_generic_free_discipline(device);
625 /* Disconnect dasd_device structure from ccw_device structure. */
626 cdev = device->cdev;
627 device->cdev = NULL;
628
629 /* Put ccw_device structure. */
630 put_device(&cdev->dev);
631
632 /* Now the device structure can be freed. */
633 dasd_free_device(device);
634}
635
636/*
637 * Reference counter dropped to zero. Wake up waiter
638 * in dasd_delete_device.
639 */
640void
641dasd_put_device_wake(struct dasd_device *device)
642{
643 wake_up(&dasd_delete_wq);
644}
645EXPORT_SYMBOL_GPL(dasd_put_device_wake);
646
647/*
648 * Return dasd_device structure associated with cdev.
649 * This function needs to be called with the ccw device
650 * lock held. It can be used from interrupt context.
651 */
652struct dasd_device *
653dasd_device_from_cdev_locked(struct ccw_device *cdev)
654{
655 struct dasd_device *device = dev_get_drvdata(&cdev->dev);
656
657 if (!device)
658 return ERR_PTR(-ENODEV);
659 dasd_get_device(device);
660 return device;
661}
662
663/*
664 * Return dasd_device structure associated with cdev.
665 */
666struct dasd_device *
667dasd_device_from_cdev(struct ccw_device *cdev)
668{
669 struct dasd_device *device;
670 unsigned long flags;
671
672 spin_lock_irqsave(get_ccwdev_lock(cdev), flags);
673 device = dasd_device_from_cdev_locked(cdev);
674 spin_unlock_irqrestore(get_ccwdev_lock(cdev), flags);
675 return device;
676}
677
678void dasd_add_link_to_gendisk(struct gendisk *gdp, struct dasd_device *device)
679{
680 struct dasd_devmap *devmap;
681
682 devmap = dasd_find_busid(dev_name(&device->cdev->dev));
683 if (IS_ERR(devmap))
684 return;
685 spin_lock(&dasd_devmap_lock);
686 gdp->private_data = devmap;
687 spin_unlock(&dasd_devmap_lock);
688}
689
690struct dasd_device *dasd_device_from_gendisk(struct gendisk *gdp)
691{
692 struct dasd_device *device;
693 struct dasd_devmap *devmap;
694
695 if (!gdp->private_data)
696 return NULL;
697 device = NULL;
698 spin_lock(&dasd_devmap_lock);
699 devmap = gdp->private_data;
700 if (devmap && devmap->device) {
701 device = devmap->device;
702 dasd_get_device(device);
703 }
704 spin_unlock(&dasd_devmap_lock);
705 return device;
706}
707
708/*
709 * SECTION: files in sysfs
710 */
711
712/*
713 * failfast controls the behaviour, if no path is available
714 */
715static ssize_t dasd_ff_show(struct device *dev, struct device_attribute *attr,
716 char *buf)
717{
718 struct dasd_devmap *devmap;
719 int ff_flag;
720
721 devmap = dasd_find_busid(dev_name(dev));
722 if (!IS_ERR(devmap))
723 ff_flag = (devmap->features & DASD_FEATURE_FAILFAST) != 0;
724 else
725 ff_flag = (DASD_FEATURE_DEFAULT & DASD_FEATURE_FAILFAST) != 0;
726 return snprintf(buf, PAGE_SIZE, ff_flag ? "1\n" : "0\n");
727}
728
729static ssize_t dasd_ff_store(struct device *dev, struct device_attribute *attr,
730 const char *buf, size_t count)
731{
732 unsigned int val;
733 int rc;
734
735 if (kstrtouint(buf, 0, &val) || val > 1)
736 return -EINVAL;
737
738 rc = dasd_set_feature(to_ccwdev(dev), DASD_FEATURE_FAILFAST, val);
739
740 return rc ? : count;
741}
742
743static DEVICE_ATTR(failfast, 0644, dasd_ff_show, dasd_ff_store);
744
745/*
746 * readonly controls the readonly status of a dasd
747 */
748static ssize_t
749dasd_ro_show(struct device *dev, struct device_attribute *attr, char *buf)
750{
751 struct dasd_devmap *devmap;
752 struct dasd_device *device;
753 int ro_flag = 0;
754
755 devmap = dasd_find_busid(dev_name(dev));
756 if (IS_ERR(devmap))
757 goto out;
758
759 ro_flag = !!(devmap->features & DASD_FEATURE_READONLY);
760
761 spin_lock(&dasd_devmap_lock);
762 device = devmap->device;
763 if (device)
764 ro_flag |= test_bit(DASD_FLAG_DEVICE_RO, &device->flags);
765 spin_unlock(&dasd_devmap_lock);
766
767out:
768 return snprintf(buf, PAGE_SIZE, ro_flag ? "1\n" : "0\n");
769}
770
771static ssize_t
772dasd_ro_store(struct device *dev, struct device_attribute *attr,
773 const char *buf, size_t count)
774{
775 struct ccw_device *cdev = to_ccwdev(dev);
776 struct dasd_device *device;
777 unsigned long flags;
778 unsigned int val;
779 int rc;
780
781 if (kstrtouint(buf, 0, &val) || val > 1)
782 return -EINVAL;
783
784 rc = dasd_set_feature(cdev, DASD_FEATURE_READONLY, val);
785 if (rc)
786 return rc;
787
788 device = dasd_device_from_cdev(cdev);
789 if (IS_ERR(device))
790 return count;
791
792 spin_lock_irqsave(get_ccwdev_lock(cdev), flags);
793 val = val || test_bit(DASD_FLAG_DEVICE_RO, &device->flags);
794
795 if (!device->block || !device->block->gdp ||
796 test_bit(DASD_FLAG_OFFLINE, &device->flags)) {
797 spin_unlock_irqrestore(get_ccwdev_lock(cdev), flags);
798 goto out;
799 }
800 /* Increase open_count to avoid losing the block device */
801 atomic_inc(&device->block->open_count);
802 spin_unlock_irqrestore(get_ccwdev_lock(cdev), flags);
803
804 set_disk_ro(device->block->gdp, val);
805 atomic_dec(&device->block->open_count);
806
807out:
808 dasd_put_device(device);
809
810 return count;
811}
812
813static DEVICE_ATTR(readonly, 0644, dasd_ro_show, dasd_ro_store);
814/*
815 * erplog controls the logging of ERP related data
816 * (e.g. failing channel programs).
817 */
818static ssize_t
819dasd_erplog_show(struct device *dev, struct device_attribute *attr, char *buf)
820{
821 struct dasd_devmap *devmap;
822 int erplog;
823
824 devmap = dasd_find_busid(dev_name(dev));
825 if (!IS_ERR(devmap))
826 erplog = (devmap->features & DASD_FEATURE_ERPLOG) != 0;
827 else
828 erplog = (DASD_FEATURE_DEFAULT & DASD_FEATURE_ERPLOG) != 0;
829 return snprintf(buf, PAGE_SIZE, erplog ? "1\n" : "0\n");
830}
831
832static ssize_t
833dasd_erplog_store(struct device *dev, struct device_attribute *attr,
834 const char *buf, size_t count)
835{
836 unsigned int val;
837 int rc;
838
839 if (kstrtouint(buf, 0, &val) || val > 1)
840 return -EINVAL;
841
842 rc = dasd_set_feature(to_ccwdev(dev), DASD_FEATURE_ERPLOG, val);
843
844 return rc ? : count;
845}
846
847static DEVICE_ATTR(erplog, 0644, dasd_erplog_show, dasd_erplog_store);
848
849/*
850 * use_diag controls whether the driver should use diag rather than ssch
851 * to talk to the device
852 */
853static ssize_t
854dasd_use_diag_show(struct device *dev, struct device_attribute *attr, char *buf)
855{
856 struct dasd_devmap *devmap;
857 int use_diag;
858
859 devmap = dasd_find_busid(dev_name(dev));
860 if (!IS_ERR(devmap))
861 use_diag = (devmap->features & DASD_FEATURE_USEDIAG) != 0;
862 else
863 use_diag = (DASD_FEATURE_DEFAULT & DASD_FEATURE_USEDIAG) != 0;
864 return sprintf(buf, use_diag ? "1\n" : "0\n");
865}
866
867static ssize_t
868dasd_use_diag_store(struct device *dev, struct device_attribute *attr,
869 const char *buf, size_t count)
870{
871 struct dasd_devmap *devmap;
872 unsigned int val;
873 ssize_t rc;
874
875 devmap = dasd_devmap_from_cdev(to_ccwdev(dev));
876 if (IS_ERR(devmap))
877 return PTR_ERR(devmap);
878
879 if (kstrtouint(buf, 0, &val) || val > 1)
880 return -EINVAL;
881
882 spin_lock(&dasd_devmap_lock);
883 /* Changing diag discipline flag is only allowed in offline state. */
884 rc = count;
885 if (!devmap->device && !(devmap->features & DASD_FEATURE_USERAW)) {
886 if (val)
887 devmap->features |= DASD_FEATURE_USEDIAG;
888 else
889 devmap->features &= ~DASD_FEATURE_USEDIAG;
890 } else
891 rc = -EPERM;
892 spin_unlock(&dasd_devmap_lock);
893 return rc;
894}
895
896static DEVICE_ATTR(use_diag, 0644, dasd_use_diag_show, dasd_use_diag_store);
897
898/*
899 * use_raw controls whether the driver should give access to raw eckd data or
900 * operate in standard mode
901 */
902static ssize_t
903dasd_use_raw_show(struct device *dev, struct device_attribute *attr, char *buf)
904{
905 struct dasd_devmap *devmap;
906 int use_raw;
907
908 devmap = dasd_find_busid(dev_name(dev));
909 if (!IS_ERR(devmap))
910 use_raw = (devmap->features & DASD_FEATURE_USERAW) != 0;
911 else
912 use_raw = (DASD_FEATURE_DEFAULT & DASD_FEATURE_USERAW) != 0;
913 return sprintf(buf, use_raw ? "1\n" : "0\n");
914}
915
916static ssize_t
917dasd_use_raw_store(struct device *dev, struct device_attribute *attr,
918 const char *buf, size_t count)
919{
920 struct dasd_devmap *devmap;
921 ssize_t rc;
922 unsigned long val;
923
924 devmap = dasd_devmap_from_cdev(to_ccwdev(dev));
925 if (IS_ERR(devmap))
926 return PTR_ERR(devmap);
927
928 if ((kstrtoul(buf, 10, &val) != 0) || val > 1)
929 return -EINVAL;
930
931 spin_lock(&dasd_devmap_lock);
932 /* Changing diag discipline flag is only allowed in offline state. */
933 rc = count;
934 if (!devmap->device && !(devmap->features & DASD_FEATURE_USEDIAG)) {
935 if (val)
936 devmap->features |= DASD_FEATURE_USERAW;
937 else
938 devmap->features &= ~DASD_FEATURE_USERAW;
939 } else
940 rc = -EPERM;
941 spin_unlock(&dasd_devmap_lock);
942 return rc;
943}
944
945static DEVICE_ATTR(raw_track_access, 0644, dasd_use_raw_show,
946 dasd_use_raw_store);
947
948static ssize_t
949dasd_safe_offline_store(struct device *dev, struct device_attribute *attr,
950 const char *buf, size_t count)
951{
952 struct ccw_device *cdev = to_ccwdev(dev);
953 struct dasd_device *device;
954 unsigned long flags;
955 int rc;
956
957 spin_lock_irqsave(get_ccwdev_lock(cdev), flags);
958 device = dasd_device_from_cdev_locked(cdev);
959 if (IS_ERR(device)) {
960 rc = PTR_ERR(device);
961 spin_unlock_irqrestore(get_ccwdev_lock(cdev), flags);
962 goto out;
963 }
964
965 if (test_bit(DASD_FLAG_OFFLINE, &device->flags) ||
966 test_bit(DASD_FLAG_SAFE_OFFLINE_RUNNING, &device->flags)) {
967 /* Already doing offline processing */
968 dasd_put_device(device);
969 spin_unlock_irqrestore(get_ccwdev_lock(cdev), flags);
970 rc = -EBUSY;
971 goto out;
972 }
973
974 set_bit(DASD_FLAG_SAFE_OFFLINE, &device->flags);
975 dasd_put_device(device);
976 spin_unlock_irqrestore(get_ccwdev_lock(cdev), flags);
977
978 rc = ccw_device_set_offline(cdev);
979
980out:
981 return rc ? rc : count;
982}
983
984static DEVICE_ATTR(safe_offline, 0200, NULL, dasd_safe_offline_store);
985
986static ssize_t
987dasd_access_show(struct device *dev, struct device_attribute *attr,
988 char *buf)
989{
990 struct ccw_device *cdev = to_ccwdev(dev);
991 struct dasd_device *device;
992 int count;
993
994 device = dasd_device_from_cdev(cdev);
995 if (IS_ERR(device))
996 return PTR_ERR(device);
997
998 if (!device->discipline)
999 count = -ENODEV;
1000 else if (!device->discipline->host_access_count)
1001 count = -EOPNOTSUPP;
1002 else
1003 count = device->discipline->host_access_count(device);
1004
1005 dasd_put_device(device);
1006 if (count < 0)
1007 return count;
1008
1009 return sprintf(buf, "%d\n", count);
1010}
1011
1012static DEVICE_ATTR(host_access_count, 0444, dasd_access_show, NULL);
1013
1014static ssize_t
1015dasd_discipline_show(struct device *dev, struct device_attribute *attr,
1016 char *buf)
1017{
1018 struct dasd_device *device;
1019 ssize_t len;
1020
1021 device = dasd_device_from_cdev(to_ccwdev(dev));
1022 if (IS_ERR(device))
1023 goto out;
1024 else if (!device->discipline) {
1025 dasd_put_device(device);
1026 goto out;
1027 } else {
1028 len = snprintf(buf, PAGE_SIZE, "%s\n",
1029 device->discipline->name);
1030 dasd_put_device(device);
1031 return len;
1032 }
1033out:
1034 len = snprintf(buf, PAGE_SIZE, "none\n");
1035 return len;
1036}
1037
1038static DEVICE_ATTR(discipline, 0444, dasd_discipline_show, NULL);
1039
1040static ssize_t
1041dasd_device_status_show(struct device *dev, struct device_attribute *attr,
1042 char *buf)
1043{
1044 struct dasd_device *device;
1045 ssize_t len;
1046
1047 device = dasd_device_from_cdev(to_ccwdev(dev));
1048 if (!IS_ERR(device)) {
1049 switch (device->state) {
1050 case DASD_STATE_NEW:
1051 len = snprintf(buf, PAGE_SIZE, "new\n");
1052 break;
1053 case DASD_STATE_KNOWN:
1054 len = snprintf(buf, PAGE_SIZE, "detected\n");
1055 break;
1056 case DASD_STATE_BASIC:
1057 len = snprintf(buf, PAGE_SIZE, "basic\n");
1058 break;
1059 case DASD_STATE_UNFMT:
1060 len = snprintf(buf, PAGE_SIZE, "unformatted\n");
1061 break;
1062 case DASD_STATE_READY:
1063 len = snprintf(buf, PAGE_SIZE, "ready\n");
1064 break;
1065 case DASD_STATE_ONLINE:
1066 len = snprintf(buf, PAGE_SIZE, "online\n");
1067 break;
1068 default:
1069 len = snprintf(buf, PAGE_SIZE, "no stat\n");
1070 break;
1071 }
1072 dasd_put_device(device);
1073 } else
1074 len = snprintf(buf, PAGE_SIZE, "unknown\n");
1075 return len;
1076}
1077
1078static DEVICE_ATTR(status, 0444, dasd_device_status_show, NULL);
1079
1080static ssize_t dasd_alias_show(struct device *dev,
1081 struct device_attribute *attr, char *buf)
1082{
1083 struct dasd_device *device;
1084 struct dasd_uid uid;
1085
1086 device = dasd_device_from_cdev(to_ccwdev(dev));
1087 if (IS_ERR(device))
1088 return sprintf(buf, "0\n");
1089
1090 if (device->discipline && device->discipline->get_uid &&
1091 !device->discipline->get_uid(device, &uid)) {
1092 if (uid.type == UA_BASE_PAV_ALIAS ||
1093 uid.type == UA_HYPER_PAV_ALIAS) {
1094 dasd_put_device(device);
1095 return sprintf(buf, "1\n");
1096 }
1097 }
1098 dasd_put_device(device);
1099
1100 return sprintf(buf, "0\n");
1101}
1102
1103static DEVICE_ATTR(alias, 0444, dasd_alias_show, NULL);
1104
1105static ssize_t dasd_vendor_show(struct device *dev,
1106 struct device_attribute *attr, char *buf)
1107{
1108 struct dasd_device *device;
1109 struct dasd_uid uid;
1110 char *vendor;
1111
1112 device = dasd_device_from_cdev(to_ccwdev(dev));
1113 vendor = "";
1114 if (IS_ERR(device))
1115 return snprintf(buf, PAGE_SIZE, "%s\n", vendor);
1116
1117 if (device->discipline && device->discipline->get_uid &&
1118 !device->discipline->get_uid(device, &uid))
1119 vendor = uid.vendor;
1120
1121 dasd_put_device(device);
1122
1123 return snprintf(buf, PAGE_SIZE, "%s\n", vendor);
1124}
1125
1126static DEVICE_ATTR(vendor, 0444, dasd_vendor_show, NULL);
1127
1128#define UID_STRLEN ( /* vendor */ 3 + 1 + /* serial */ 14 + 1 +\
1129 /* SSID */ 4 + 1 + /* unit addr */ 2 + 1 +\
1130 /* vduit */ 32 + 1)
1131
1132static ssize_t
1133dasd_uid_show(struct device *dev, struct device_attribute *attr, char *buf)
1134{
1135 struct dasd_device *device;
1136 struct dasd_uid uid;
1137 char uid_string[UID_STRLEN];
1138 char ua_string[3];
1139
1140 device = dasd_device_from_cdev(to_ccwdev(dev));
1141 uid_string[0] = 0;
1142 if (IS_ERR(device))
1143 return snprintf(buf, PAGE_SIZE, "%s\n", uid_string);
1144
1145 if (device->discipline && device->discipline->get_uid &&
1146 !device->discipline->get_uid(device, &uid)) {
1147 switch (uid.type) {
1148 case UA_BASE_DEVICE:
1149 snprintf(ua_string, sizeof(ua_string), "%02x",
1150 uid.real_unit_addr);
1151 break;
1152 case UA_BASE_PAV_ALIAS:
1153 snprintf(ua_string, sizeof(ua_string), "%02x",
1154 uid.base_unit_addr);
1155 break;
1156 case UA_HYPER_PAV_ALIAS:
1157 snprintf(ua_string, sizeof(ua_string), "xx");
1158 break;
1159 default:
1160 /* should not happen, treat like base device */
1161 snprintf(ua_string, sizeof(ua_string), "%02x",
1162 uid.real_unit_addr);
1163 break;
1164 }
1165
1166 if (strlen(uid.vduit) > 0)
1167 snprintf(uid_string, sizeof(uid_string),
1168 "%s.%s.%04x.%s.%s",
1169 uid.vendor, uid.serial, uid.ssid, ua_string,
1170 uid.vduit);
1171 else
1172 snprintf(uid_string, sizeof(uid_string),
1173 "%s.%s.%04x.%s",
1174 uid.vendor, uid.serial, uid.ssid, ua_string);
1175 }
1176 dasd_put_device(device);
1177
1178 return snprintf(buf, PAGE_SIZE, "%s\n", uid_string);
1179}
1180static DEVICE_ATTR(uid, 0444, dasd_uid_show, NULL);
1181
1182/*
1183 * extended error-reporting
1184 */
1185static ssize_t
1186dasd_eer_show(struct device *dev, struct device_attribute *attr, char *buf)
1187{
1188 struct dasd_devmap *devmap;
1189 int eer_flag;
1190
1191 devmap = dasd_find_busid(dev_name(dev));
1192 if (!IS_ERR(devmap) && devmap->device)
1193 eer_flag = dasd_eer_enabled(devmap->device);
1194 else
1195 eer_flag = 0;
1196 return snprintf(buf, PAGE_SIZE, eer_flag ? "1\n" : "0\n");
1197}
1198
1199static ssize_t
1200dasd_eer_store(struct device *dev, struct device_attribute *attr,
1201 const char *buf, size_t count)
1202{
1203 struct dasd_device *device;
1204 unsigned int val;
1205 int rc = 0;
1206
1207 device = dasd_device_from_cdev(to_ccwdev(dev));
1208 if (IS_ERR(device))
1209 return PTR_ERR(device);
1210
1211 if (kstrtouint(buf, 0, &val) || val > 1)
1212 return -EINVAL;
1213
1214 if (val)
1215 rc = dasd_eer_enable(device);
1216 else
1217 dasd_eer_disable(device);
1218
1219 dasd_put_device(device);
1220
1221 return rc ? : count;
1222}
1223
1224static DEVICE_ATTR(eer_enabled, 0644, dasd_eer_show, dasd_eer_store);
1225
1226/*
1227 * expiration time for default requests
1228 */
1229static ssize_t
1230dasd_expires_show(struct device *dev, struct device_attribute *attr, char *buf)
1231{
1232 struct dasd_device *device;
1233 int len;
1234
1235 device = dasd_device_from_cdev(to_ccwdev(dev));
1236 if (IS_ERR(device))
1237 return -ENODEV;
1238 len = snprintf(buf, PAGE_SIZE, "%lu\n", device->default_expires);
1239 dasd_put_device(device);
1240 return len;
1241}
1242
1243static ssize_t
1244dasd_expires_store(struct device *dev, struct device_attribute *attr,
1245 const char *buf, size_t count)
1246{
1247 struct dasd_device *device;
1248 unsigned long val;
1249
1250 device = dasd_device_from_cdev(to_ccwdev(dev));
1251 if (IS_ERR(device))
1252 return -ENODEV;
1253
1254 if ((kstrtoul(buf, 10, &val) != 0) ||
1255 (val > DASD_EXPIRES_MAX) || val == 0) {
1256 dasd_put_device(device);
1257 return -EINVAL;
1258 }
1259
1260 if (val)
1261 device->default_expires = val;
1262
1263 dasd_put_device(device);
1264 return count;
1265}
1266
1267static DEVICE_ATTR(expires, 0644, dasd_expires_show, dasd_expires_store);
1268
1269static ssize_t
1270dasd_retries_show(struct device *dev, struct device_attribute *attr, char *buf)
1271{
1272 struct dasd_device *device;
1273 int len;
1274
1275 device = dasd_device_from_cdev(to_ccwdev(dev));
1276 if (IS_ERR(device))
1277 return -ENODEV;
1278 len = snprintf(buf, PAGE_SIZE, "%lu\n", device->default_retries);
1279 dasd_put_device(device);
1280 return len;
1281}
1282
1283static ssize_t
1284dasd_retries_store(struct device *dev, struct device_attribute *attr,
1285 const char *buf, size_t count)
1286{
1287 struct dasd_device *device;
1288 unsigned long val;
1289
1290 device = dasd_device_from_cdev(to_ccwdev(dev));
1291 if (IS_ERR(device))
1292 return -ENODEV;
1293
1294 if ((kstrtoul(buf, 10, &val) != 0) ||
1295 (val > DASD_RETRIES_MAX)) {
1296 dasd_put_device(device);
1297 return -EINVAL;
1298 }
1299
1300 if (val)
1301 device->default_retries = val;
1302
1303 dasd_put_device(device);
1304 return count;
1305}
1306
1307static DEVICE_ATTR(retries, 0644, dasd_retries_show, dasd_retries_store);
1308
1309static ssize_t
1310dasd_timeout_show(struct device *dev, struct device_attribute *attr,
1311 char *buf)
1312{
1313 struct dasd_device *device;
1314 int len;
1315
1316 device = dasd_device_from_cdev(to_ccwdev(dev));
1317 if (IS_ERR(device))
1318 return -ENODEV;
1319 len = snprintf(buf, PAGE_SIZE, "%lu\n", device->blk_timeout);
1320 dasd_put_device(device);
1321 return len;
1322}
1323
1324static ssize_t
1325dasd_timeout_store(struct device *dev, struct device_attribute *attr,
1326 const char *buf, size_t count)
1327{
1328 struct dasd_device *device;
1329 struct request_queue *q;
1330 unsigned long val;
1331
1332 device = dasd_device_from_cdev(to_ccwdev(dev));
1333 if (IS_ERR(device) || !device->block)
1334 return -ENODEV;
1335
1336 if ((kstrtoul(buf, 10, &val) != 0) ||
1337 val > UINT_MAX / HZ) {
1338 dasd_put_device(device);
1339 return -EINVAL;
1340 }
1341 q = device->block->request_queue;
1342 if (!q) {
1343 dasd_put_device(device);
1344 return -ENODEV;
1345 }
1346
1347 device->blk_timeout = val;
1348
1349 blk_queue_rq_timeout(q, device->blk_timeout * HZ);
1350
1351 dasd_put_device(device);
1352 return count;
1353}
1354
1355static DEVICE_ATTR(timeout, 0644,
1356 dasd_timeout_show, dasd_timeout_store);
1357
1358
1359static ssize_t
1360dasd_path_reset_store(struct device *dev, struct device_attribute *attr,
1361 const char *buf, size_t count)
1362{
1363 struct dasd_device *device;
1364 unsigned int val;
1365
1366 device = dasd_device_from_cdev(to_ccwdev(dev));
1367 if (IS_ERR(device))
1368 return -ENODEV;
1369
1370 if ((kstrtouint(buf, 16, &val) != 0) || val > 0xff)
1371 val = 0;
1372
1373 if (device->discipline && device->discipline->reset_path)
1374 device->discipline->reset_path(device, (__u8) val);
1375
1376 dasd_put_device(device);
1377 return count;
1378}
1379
1380static DEVICE_ATTR(path_reset, 0200, NULL, dasd_path_reset_store);
1381
1382static ssize_t dasd_hpf_show(struct device *dev, struct device_attribute *attr,
1383 char *buf)
1384{
1385 struct dasd_device *device;
1386 int hpf;
1387
1388 device = dasd_device_from_cdev(to_ccwdev(dev));
1389 if (IS_ERR(device))
1390 return -ENODEV;
1391 if (!device->discipline || !device->discipline->hpf_enabled) {
1392 dasd_put_device(device);
1393 return snprintf(buf, PAGE_SIZE, "%d\n", dasd_nofcx);
1394 }
1395 hpf = device->discipline->hpf_enabled(device);
1396 dasd_put_device(device);
1397 return snprintf(buf, PAGE_SIZE, "%d\n", hpf);
1398}
1399
1400static DEVICE_ATTR(hpf, 0444, dasd_hpf_show, NULL);
1401
1402static ssize_t dasd_reservation_policy_show(struct device *dev,
1403 struct device_attribute *attr,
1404 char *buf)
1405{
1406 struct dasd_devmap *devmap;
1407 int rc = 0;
1408
1409 devmap = dasd_find_busid(dev_name(dev));
1410 if (IS_ERR(devmap)) {
1411 rc = snprintf(buf, PAGE_SIZE, "ignore\n");
1412 } else {
1413 spin_lock(&dasd_devmap_lock);
1414 if (devmap->features & DASD_FEATURE_FAILONSLCK)
1415 rc = snprintf(buf, PAGE_SIZE, "fail\n");
1416 else
1417 rc = snprintf(buf, PAGE_SIZE, "ignore\n");
1418 spin_unlock(&dasd_devmap_lock);
1419 }
1420 return rc;
1421}
1422
1423static ssize_t dasd_reservation_policy_store(struct device *dev,
1424 struct device_attribute *attr,
1425 const char *buf, size_t count)
1426{
1427 struct ccw_device *cdev = to_ccwdev(dev);
1428 int rc;
1429
1430 if (sysfs_streq("ignore", buf))
1431 rc = dasd_set_feature(cdev, DASD_FEATURE_FAILONSLCK, 0);
1432 else if (sysfs_streq("fail", buf))
1433 rc = dasd_set_feature(cdev, DASD_FEATURE_FAILONSLCK, 1);
1434 else
1435 rc = -EINVAL;
1436
1437 return rc ? : count;
1438}
1439
1440static DEVICE_ATTR(reservation_policy, 0644,
1441 dasd_reservation_policy_show, dasd_reservation_policy_store);
1442
1443static ssize_t dasd_reservation_state_show(struct device *dev,
1444 struct device_attribute *attr,
1445 char *buf)
1446{
1447 struct dasd_device *device;
1448 int rc = 0;
1449
1450 device = dasd_device_from_cdev(to_ccwdev(dev));
1451 if (IS_ERR(device))
1452 return snprintf(buf, PAGE_SIZE, "none\n");
1453
1454 if (test_bit(DASD_FLAG_IS_RESERVED, &device->flags))
1455 rc = snprintf(buf, PAGE_SIZE, "reserved\n");
1456 else if (test_bit(DASD_FLAG_LOCK_STOLEN, &device->flags))
1457 rc = snprintf(buf, PAGE_SIZE, "lost\n");
1458 else
1459 rc = snprintf(buf, PAGE_SIZE, "none\n");
1460 dasd_put_device(device);
1461 return rc;
1462}
1463
1464static ssize_t dasd_reservation_state_store(struct device *dev,
1465 struct device_attribute *attr,
1466 const char *buf, size_t count)
1467{
1468 struct dasd_device *device;
1469 int rc = 0;
1470
1471 device = dasd_device_from_cdev(to_ccwdev(dev));
1472 if (IS_ERR(device))
1473 return -ENODEV;
1474 if (sysfs_streq("reset", buf))
1475 clear_bit(DASD_FLAG_LOCK_STOLEN, &device->flags);
1476 else
1477 rc = -EINVAL;
1478 dasd_put_device(device);
1479
1480 if (rc)
1481 return rc;
1482 else
1483 return count;
1484}
1485
1486static DEVICE_ATTR(last_known_reservation_state, 0644,
1487 dasd_reservation_state_show, dasd_reservation_state_store);
1488
1489static ssize_t dasd_pm_show(struct device *dev,
1490 struct device_attribute *attr, char *buf)
1491{
1492 struct dasd_device *device;
1493 u8 opm, nppm, cablepm, cuirpm, hpfpm, ifccpm;
1494
1495 device = dasd_device_from_cdev(to_ccwdev(dev));
1496 if (IS_ERR(device))
1497 return sprintf(buf, "0\n");
1498
1499 opm = dasd_path_get_opm(device);
1500 nppm = dasd_path_get_nppm(device);
1501 cablepm = dasd_path_get_cablepm(device);
1502 cuirpm = dasd_path_get_cuirpm(device);
1503 hpfpm = dasd_path_get_hpfpm(device);
1504 ifccpm = dasd_path_get_ifccpm(device);
1505 dasd_put_device(device);
1506
1507 return sprintf(buf, "%02x %02x %02x %02x %02x %02x\n", opm, nppm,
1508 cablepm, cuirpm, hpfpm, ifccpm);
1509}
1510
1511static DEVICE_ATTR(path_masks, 0444, dasd_pm_show, NULL);
1512
1513/*
1514 * threshold value for IFCC/CCC errors
1515 */
1516static ssize_t
1517dasd_path_threshold_show(struct device *dev,
1518 struct device_attribute *attr, char *buf)
1519{
1520 struct dasd_device *device;
1521 int len;
1522
1523 device = dasd_device_from_cdev(to_ccwdev(dev));
1524 if (IS_ERR(device))
1525 return -ENODEV;
1526 len = snprintf(buf, PAGE_SIZE, "%lu\n", device->path_thrhld);
1527 dasd_put_device(device);
1528 return len;
1529}
1530
1531static ssize_t
1532dasd_path_threshold_store(struct device *dev, struct device_attribute *attr,
1533 const char *buf, size_t count)
1534{
1535 struct dasd_device *device;
1536 unsigned long flags;
1537 unsigned long val;
1538
1539 device = dasd_device_from_cdev(to_ccwdev(dev));
1540 if (IS_ERR(device))
1541 return -ENODEV;
1542
1543 if (kstrtoul(buf, 10, &val) != 0 || val > DASD_THRHLD_MAX) {
1544 dasd_put_device(device);
1545 return -EINVAL;
1546 }
1547 spin_lock_irqsave(get_ccwdev_lock(to_ccwdev(dev)), flags);
1548 device->path_thrhld = val;
1549 spin_unlock_irqrestore(get_ccwdev_lock(to_ccwdev(dev)), flags);
1550 dasd_put_device(device);
1551 return count;
1552}
1553static DEVICE_ATTR(path_threshold, 0644, dasd_path_threshold_show,
1554 dasd_path_threshold_store);
1555
1556/*
1557 * configure if path is disabled after IFCC/CCC error threshold is
1558 * exceeded
1559 */
1560static ssize_t
1561dasd_path_autodisable_show(struct device *dev,
1562 struct device_attribute *attr, char *buf)
1563{
1564 struct dasd_devmap *devmap;
1565 int flag;
1566
1567 devmap = dasd_find_busid(dev_name(dev));
1568 if (!IS_ERR(devmap))
1569 flag = (devmap->features & DASD_FEATURE_PATH_AUTODISABLE) != 0;
1570 else
1571 flag = (DASD_FEATURE_DEFAULT &
1572 DASD_FEATURE_PATH_AUTODISABLE) != 0;
1573 return snprintf(buf, PAGE_SIZE, flag ? "1\n" : "0\n");
1574}
1575
1576static ssize_t
1577dasd_path_autodisable_store(struct device *dev,
1578 struct device_attribute *attr,
1579 const char *buf, size_t count)
1580{
1581 unsigned int val;
1582 int rc;
1583
1584 if (kstrtouint(buf, 0, &val) || val > 1)
1585 return -EINVAL;
1586
1587 rc = dasd_set_feature(to_ccwdev(dev),
1588 DASD_FEATURE_PATH_AUTODISABLE, val);
1589
1590 return rc ? : count;
1591}
1592
1593static DEVICE_ATTR(path_autodisable, 0644,
1594 dasd_path_autodisable_show,
1595 dasd_path_autodisable_store);
1596/*
1597 * interval for IFCC/CCC checks
1598 * meaning time with no IFCC/CCC error before the error counter
1599 * gets reset
1600 */
1601static ssize_t
1602dasd_path_interval_show(struct device *dev,
1603 struct device_attribute *attr, char *buf)
1604{
1605 struct dasd_device *device;
1606 int len;
1607
1608 device = dasd_device_from_cdev(to_ccwdev(dev));
1609 if (IS_ERR(device))
1610 return -ENODEV;
1611 len = snprintf(buf, PAGE_SIZE, "%lu\n", device->path_interval);
1612 dasd_put_device(device);
1613 return len;
1614}
1615
1616static ssize_t
1617dasd_path_interval_store(struct device *dev, struct device_attribute *attr,
1618 const char *buf, size_t count)
1619{
1620 struct dasd_device *device;
1621 unsigned long flags;
1622 unsigned long val;
1623
1624 device = dasd_device_from_cdev(to_ccwdev(dev));
1625 if (IS_ERR(device))
1626 return -ENODEV;
1627
1628 if ((kstrtoul(buf, 10, &val) != 0) ||
1629 (val > DASD_INTERVAL_MAX) || val == 0) {
1630 dasd_put_device(device);
1631 return -EINVAL;
1632 }
1633 spin_lock_irqsave(get_ccwdev_lock(to_ccwdev(dev)), flags);
1634 if (val)
1635 device->path_interval = val;
1636 spin_unlock_irqrestore(get_ccwdev_lock(to_ccwdev(dev)), flags);
1637 dasd_put_device(device);
1638 return count;
1639}
1640
1641static DEVICE_ATTR(path_interval, 0644, dasd_path_interval_show,
1642 dasd_path_interval_store);
1643
1644
1645#define DASD_DEFINE_ATTR(_name, _func) \
1646static ssize_t dasd_##_name##_show(struct device *dev, \
1647 struct device_attribute *attr, \
1648 char *buf) \
1649{ \
1650 struct ccw_device *cdev = to_ccwdev(dev); \
1651 struct dasd_device *device = dasd_device_from_cdev(cdev); \
1652 int val = 0; \
1653 \
1654 if (IS_ERR(device)) \
1655 return -ENODEV; \
1656 if (device->discipline && _func) \
1657 val = _func(device); \
1658 dasd_put_device(device); \
1659 \
1660 return snprintf(buf, PAGE_SIZE, "%d\n", val); \
1661} \
1662static DEVICE_ATTR(_name, 0444, dasd_##_name##_show, NULL); \
1663
1664DASD_DEFINE_ATTR(ese, device->discipline->is_ese);
1665DASD_DEFINE_ATTR(extent_size, device->discipline->ext_size);
1666DASD_DEFINE_ATTR(pool_id, device->discipline->ext_pool_id);
1667DASD_DEFINE_ATTR(space_configured, device->discipline->space_configured);
1668DASD_DEFINE_ATTR(space_allocated, device->discipline->space_allocated);
1669DASD_DEFINE_ATTR(logical_capacity, device->discipline->logical_capacity);
1670DASD_DEFINE_ATTR(warn_threshold, device->discipline->ext_pool_warn_thrshld);
1671DASD_DEFINE_ATTR(cap_at_warnlevel, device->discipline->ext_pool_cap_at_warnlevel);
1672DASD_DEFINE_ATTR(pool_oos, device->discipline->ext_pool_oos);
1673
1674static struct attribute * dasd_attrs[] = {
1675 &dev_attr_readonly.attr,
1676 &dev_attr_discipline.attr,
1677 &dev_attr_status.attr,
1678 &dev_attr_alias.attr,
1679 &dev_attr_vendor.attr,
1680 &dev_attr_uid.attr,
1681 &dev_attr_use_diag.attr,
1682 &dev_attr_raw_track_access.attr,
1683 &dev_attr_eer_enabled.attr,
1684 &dev_attr_erplog.attr,
1685 &dev_attr_failfast.attr,
1686 &dev_attr_expires.attr,
1687 &dev_attr_retries.attr,
1688 &dev_attr_timeout.attr,
1689 &dev_attr_reservation_policy.attr,
1690 &dev_attr_last_known_reservation_state.attr,
1691 &dev_attr_safe_offline.attr,
1692 &dev_attr_host_access_count.attr,
1693 &dev_attr_path_masks.attr,
1694 &dev_attr_path_threshold.attr,
1695 &dev_attr_path_autodisable.attr,
1696 &dev_attr_path_interval.attr,
1697 &dev_attr_path_reset.attr,
1698 &dev_attr_hpf.attr,
1699 &dev_attr_ese.attr,
1700 NULL,
1701};
1702
1703static const struct attribute_group dasd_attr_group = {
1704 .attrs = dasd_attrs,
1705};
1706
1707static struct attribute *capacity_attrs[] = {
1708 &dev_attr_space_configured.attr,
1709 &dev_attr_space_allocated.attr,
1710 &dev_attr_logical_capacity.attr,
1711 NULL,
1712};
1713
1714static const struct attribute_group capacity_attr_group = {
1715 .name = "capacity",
1716 .attrs = capacity_attrs,
1717};
1718
1719static struct attribute *ext_pool_attrs[] = {
1720 &dev_attr_pool_id.attr,
1721 &dev_attr_extent_size.attr,
1722 &dev_attr_warn_threshold.attr,
1723 &dev_attr_cap_at_warnlevel.attr,
1724 &dev_attr_pool_oos.attr,
1725 NULL,
1726};
1727
1728static const struct attribute_group ext_pool_attr_group = {
1729 .name = "extent_pool",
1730 .attrs = ext_pool_attrs,
1731};
1732
1733static const struct attribute_group *dasd_attr_groups[] = {
1734 &dasd_attr_group,
1735 &capacity_attr_group,
1736 &ext_pool_attr_group,
1737 NULL,
1738};
1739
1740/*
1741 * Return value of the specified feature.
1742 */
1743int
1744dasd_get_feature(struct ccw_device *cdev, int feature)
1745{
1746 struct dasd_devmap *devmap;
1747
1748 devmap = dasd_find_busid(dev_name(&cdev->dev));
1749 if (IS_ERR(devmap))
1750 return PTR_ERR(devmap);
1751
1752 return ((devmap->features & feature) != 0);
1753}
1754
1755/*
1756 * Set / reset given feature.
1757 * Flag indicates whether to set (!=0) or the reset (=0) the feature.
1758 */
1759int
1760dasd_set_feature(struct ccw_device *cdev, int feature, int flag)
1761{
1762 struct dasd_devmap *devmap;
1763
1764 devmap = dasd_devmap_from_cdev(cdev);
1765 if (IS_ERR(devmap))
1766 return PTR_ERR(devmap);
1767
1768 spin_lock(&dasd_devmap_lock);
1769 if (flag)
1770 devmap->features |= feature;
1771 else
1772 devmap->features &= ~feature;
1773 if (devmap->device)
1774 devmap->device->features = devmap->features;
1775 spin_unlock(&dasd_devmap_lock);
1776 return 0;
1777}
1778EXPORT_SYMBOL(dasd_set_feature);
1779
1780
1781int dasd_add_sysfs_files(struct ccw_device *cdev)
1782{
1783 return sysfs_create_groups(&cdev->dev.kobj, dasd_attr_groups);
1784}
1785
1786void
1787dasd_remove_sysfs_files(struct ccw_device *cdev)
1788{
1789 sysfs_remove_groups(&cdev->dev.kobj, dasd_attr_groups);
1790}
1791
1792
1793int
1794dasd_devmap_init(void)
1795{
1796 int i;
1797
1798 /* Initialize devmap structures. */
1799 dasd_max_devindex = 0;
1800 for (i = 0; i < 256; i++)
1801 INIT_LIST_HEAD(&dasd_hashlists[i]);
1802 return 0;
1803}
1804
1805void
1806dasd_devmap_exit(void)
1807{
1808 dasd_forget_ranges();
1809}