Linux Audio

Check our new training course

Loading...
v6.8
   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 == &copy->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 = &copy->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 = &copy->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 == &copy->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}
v5.4
   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}