€•µŒsphinx.addnodes”Œdocument”“”)�”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)�”}”(hhh]”(hŒ pending_xref”“”)�”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒChinese (Simplified)”…”�”}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ*/translations/zh_CN/arch/s390/driver-model”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)�”}”(hhh]”hŒChinese (Traditional)”…”�”}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ*/translations/zh_TW/arch/s390/driver-model”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒItalian”…”�”}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ*/translations/it_IT/arch/s390/driver-model”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒJapanese”…”�”}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ*/translations/ja_JP/arch/s390/driver-model”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒKorean”…”�”}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ*/translations/ko_KR/arch/s390/driver-model”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒPortuguese (Brazilian)”…”�”}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ*/translations/pt_BR/arch/s390/driver-model”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒSpanish”…”�”}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ*/translations/sp_SP/arch/s390/driver-model”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒsection”“”)�”}”(hhh]”(hŒtitle”“”)�”}”(hŒS/390 driver model interfaces”h]”hŒS/390 driver model interfaces”…”�”}”(hh¼h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhh·h²hh³ŒD/var/lib/git/docbuild/linux/Documentation/arch/s390/driver-model.rst”h´Kubh¶)�”}”(hhh]”(h»)�”}”(hŒ1. CCW devices”h]”hŒ1. CCW devices”…”�”}”(hhÎh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhhËh²hh³hÊh´KubhŒ paragraph”“”)�”}”(hŒ{All devices which can be addressed by means of ccws are called 'CCW devices' - even if they aren't actually driven by ccws.”h]”hŒ�All devices which can be addressed by means of ccws are called ‘CCW devices’ - even if they aren’t actually driven by ccws.”…”�”}”(hhÞh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KhhËh²hubhÝ)�”}”(hŒcAll ccw devices are accessed via a subchannel, this is reflected in the structures under devices/::”h]”hŒbAll ccw devices are accessed via a subchannel, this is reflected in the structures under devices/:”…”�”}”(hhìh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K hhËh²hubhŒ literal_block”“”)�”}”(hŒ°devices/ - system/ - css0/ - 0.0.0000/0.0.0815/ - 0.0.0001/0.0.4711/ - 0.0.0002/ - 0.1.0000/0.1.1234/ ... - defunct/”h]”hŒ°devices/ - system/ - css0/ - 0.0.0000/0.0.0815/ - 0.0.0001/0.0.4711/ - 0.0.0002/ - 0.1.0000/0.1.1234/ ... - defunct/”…”�”}”hhüsbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1húh³hÊh´KhhËh²hubhÝ)�”}”(hŒèIn this example, device 0815 is accessed via subchannel 0 in subchannel set 0, device 4711 via subchannel 1 in subchannel set 0, and subchannel 2 is a non-I/O subchannel. Device 1234 is accessed via subchannel 0 in subchannel set 1.”h]”hŒèIn this example, device 0815 is accessed via subchannel 0 in subchannel set 0, device 4711 via subchannel 1 in subchannel set 0, and subchannel 2 is a non-I/O subchannel. Device 1234 is accessed via subchannel 0 in subchannel set 1.”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KhhËh²hubhÝ)�”}”(hXgThe subchannel named 'defunct' does not represent any real subchannel on the system; it is a pseudo subchannel where disconnected ccw devices are moved to if they are displaced by another ccw device becoming operational on their former subchannel. The ccw devices will be moved again to a proper subchannel if they become operational again on that subchannel.”h]”hXkThe subchannel named ‘defunct’ does not represent any real subchannel on the system; it is a pseudo subchannel where disconnected ccw devices are moved to if they are displaced by another ccw device becoming operational on their former subchannel. The ccw devices will be moved again to a proper subchannel if they become operational again on that subchannel.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KhhËh²hubhÝ)�”}”(hŒoYou should address a ccw device via its bus id (e.g. 0.0.4711); the device can be found under bus/ccw/devices/.”h]”hŒoYou should address a ccw device via its bus id (e.g. 0.0.4711); the device can be found under bus/ccw/devices/.”…”�”}”(hj(h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K"hhËh²hubhÝ)�”}”(hŒ+All ccw devices export some data via sysfs.”h]”hŒ+All ccw devices export some data via sysfs.”…”�”}”(hj6h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K%hhËh²hubhŒdefinition_list”“”)�”}”(hhh]”(hŒdefinition_list_item”“”)�”}”(hŒ'cutype: The control unit type / model. ”h]”(hŒterm”“”)�”}”(hŒcutype:”h]”hŒcutype:”…”�”}”(hjQh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jOh³hÊh´K(hjKubhŒ definition”“”)�”}”(hhh]”hÝ)�”}”(hŒThe control unit type / model.”h]”hŒThe control unit type / model.”…”�”}”(hjdh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K(hjaubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hjKubeh}”(h]”h ]”h"]”h$]”h&]”uh1jIh³hÊh´K(hjFubjJ)�”}”(hŒ1devtype: The device type / model, if applicable. ”h]”(jP)�”}”(hŒdevtype:”h]”hŒdevtype:”…”�”}”(hj‚h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jOh³hÊh´K+hj~ubj`)�”}”(hhh]”hÝ)�”}”(hŒ'The device type / model, if applicable.”h]”hŒ'The device type / model, if applicable.”…”�”}”(hj“h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K+hj�ubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hj~ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jIh³hÊh´K+hjFh²hubjJ)�”}”(hŒ[availability: Can be 'good' or 'boxed'; 'no path' or 'no device' for disconnected devices. ”h]”(jP)�”}”(hŒ availability:”h]”hŒ availability:”…”�”}”(hj±h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jOh³hÊh´K/hj­ubj`)�”}”(hhh]”hÝ)�”}”(hŒLCan be 'good' or 'boxed'; 'no path' or 'no device' for disconnected devices.”h]”hŒ\Can be ‘good’ or ‘boxed’; ‘no path’ or ‘no device’ for disconnected devices.”…”�”}”(hjÂh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K.hj¿ubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hj­ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jIh³hÊh´K/hjFh²hubjJ)�”}”(hŒÉonline: An interface to set the device online and offline. In the special case of the device being disconnected (see the notify function under 1.2), piping 0 to online will forcibly delete the device. ”h]”(jP)�”}”(hŒonline:”h]”hŒonline:”…”�”}”(hjàh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jOh³hÊh´K5hjÜubj`)�”}”(hhh]”hÝ)�”}”(hŒÀAn interface to set the device online and offline. In the special case of the device being disconnected (see the notify function under 1.2), piping 0 to online will forcibly delete the device.”h]”hŒÀAn interface to set the device online and offline. In the special case of the device being disconnected (see the notify function under 1.2), piping 0 to online will forcibly delete the device.”…”�”}”(hjñh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K2hjîubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hjÜubeh}”(h]”h ]”h"]”h$]”h&]”uh1jIh³hÊh´K5hjFh²hubeh}”(h]”h ]”h"]”h$]”h&]”uh1jDhhËh²hh³hÊh´NubhÝ)�”}”(hŒLThe device drivers can add entries to export per-device data and interfaces.”h]”hŒLThe device drivers can add entries to export per-device data and interfaces.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K7hhËh²hubhÝ)�”}”(hŒXThere is also some data exported on a per-subchannel basis (see under bus/css/devices/):”h]”hŒXThere is also some data exported on a per-subchannel basis (see under bus/css/devices/):”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K9hhËh²hubjE)�”}”(hhh]”(jJ)�”}”(hŒ2chpids: Via which chpids the device is connected. ”h]”(jP)�”}”(hŒchpids:”h]”hŒchpids:”…”�”}”(hj4h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jOh³hÊh´K=hj0ubj`)�”}”(hhh]”hÝ)�”}”(hŒ)Via which chpids the device is connected.”h]”hŒ)Via which chpids the device is connected.”…”�”}”(hjEh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K=hjBubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hj0ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jIh³hÊh´K=hj-ubjJ)�”}”(hŒJpimpampom: The path installed, path available and path operational masks. ”h]”(jP)�”}”(hŒ pimpampom:”h]”hŒ pimpampom:”…”�”}”(hjch²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jOh³hÊh´K@hj_ubj`)�”}”(hhh]”hÝ)�”}”(hŒ>The path installed, path available and path operational masks.”h]”hŒ>The path installed, path available and path operational masks.”…”�”}”(hjth²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K@hjqubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hj_ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jIh³hÊh´K@hj-h²hubeh}”(h]”h ]”h"]”h$]”h&]”uh1jDhhËh²hh³hÊh´NubhÝ)�”}”(hŒCThere also might be additional data, for example for block devices.”h]”hŒCThere also might be additional data, for example for block devices.”…”�”}”(hj”h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KBhhËh²hubeh}”(h]”Œ ccw-devices”ah ]”h"]”Œ1. ccw devices”ah$]”h&]”uh1hµhh·h²hh³hÊh´Kubh¶)�”}”(hhh]”(h»)�”}”(hŒ1.1 Bringing up a ccw device”h]”hŒ1.1 Bringing up a ccw device”…”�”}”(hj­h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjªh²hh³hÊh´KFubhÝ)�”}”(hŒThis is done in several steps.”h]”hŒThis is done in several steps.”…”�”}”(hj»h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KHhjªh²hubhŒenumerated_list”“”)�”}”(hhh]”(hŒ list_item”“”)�”}”(hŒ•Each driver can provide one or more parameter interfaces where parameters can be specified. These interfaces are also in the driver's responsibility.”h]”hÝ)�”}”(hŒ•Each driver can provide one or more parameter interfaces where parameters can be specified. These interfaces are also in the driver's responsibility.”h]”hŒ—Each driver can provide one or more parameter interfaces where parameters can be specified. These interfaces are also in the driver’s responsibility.”…”�”}”(hjÔh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KJhjÐubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjËh²hh³hÊh´NubjÏ)�”}”(hŒiAfter a. has been performed, if necessary, the device is finally brought up via the 'online' interface. ”h]”hÝ)�”}”(hŒgAfter a. has been performed, if necessary, the device is finally brought up via the 'online' interface.”h]”hŒkAfter a. has been performed, if necessary, the device is finally brought up via the ‘online’ interface.”…”�”}”(hjìh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KLhjèubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjËh²hh³hÊh´Nubeh}”(h]”h ]”h"]”h$]”h&]”Œenumtype”Œ loweralpha”Œprefix”hŒsuffix”Œ.”uh1jÉhjªh²hh³hÊh´KJubeh}”(h]”Œbringing-up-a-ccw-device”ah ]”h"]”Œ1.1 bringing up a ccw device”ah$]”h&]”uh1hµhh·h²hh³hÊh´KFubh¶)�”}”(hhh]”(h»)�”}”(hŒ$1.2 Writing a driver for ccw devices”h]”hŒ$1.2 Writing a driver for ccw devices”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjh²hh³hÊh´KQubhÝ)�”}”(hŒkThe basic struct ccw_device and struct ccw_driver data structures can be found under include/asm/ccwdev.h::”h]”hŒjThe basic struct ccw_device and struct ccw_driver data structures can be found under include/asm/ccwdev.h:”…”�”}”(hj$h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KShjh²hubhû)�”}”(hX¢struct ccw_device { spinlock_t *ccwlock; struct ccw_device_private *private; struct ccw_device_id id; struct ccw_driver *drv; struct device dev; int online; void (*handler) (struct ccw_device *dev, unsigned long intparm, struct irb *irb); }; struct ccw_driver { struct module *owner; struct ccw_device_id *ids; int (*probe) (struct ccw_device *); int (*remove) (struct ccw_device *); int (*set_online) (struct ccw_device *); int (*set_offline) (struct ccw_device *); int (*notify) (struct ccw_device *, int); struct device_driver driver; char *name; };”h]”hX¢struct ccw_device { spinlock_t *ccwlock; struct ccw_device_private *private; struct ccw_device_id id; struct ccw_driver *drv; struct device dev; int online; void (*handler) (struct ccw_device *dev, unsigned long intparm, struct irb *irb); }; struct ccw_driver { struct module *owner; struct ccw_device_id *ids; int (*probe) (struct ccw_device *); int (*remove) (struct ccw_device *); int (*set_online) (struct ccw_device *); int (*set_offline) (struct ccw_device *); int (*notify) (struct ccw_device *, int); struct device_driver driver; char *name; };”…”�”}”hj2sbah}”(h]”h ]”h"]”h$]”h&]”j j uh1húh³hÊh´KVhjh²hubhÝ)�”}”(hŒtThe 'private' field contains data needed for internal i/o operation only, and is not available to the device driver.”h]”hŒxThe ‘private’ field contains data needed for internal i/o operation only, and is not available to the device driver.”…”�”}”(hj@h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Kohjh²hubhÝ)�”}”(hŒÄEach driver should declare in a MODULE_DEVICE_TABLE into which CU types/models and/or device types/models it is interested. This information can later be found in the struct ccw_device_id fields::”h]”hŒÃEach driver should declare in a MODULE_DEVICE_TABLE into which CU types/models and/or device types/models it is interested. This information can later be found in the struct ccw_device_id fields:”…”�”}”(hjNh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Krhjh²hubhû)�”}”(hŒ·struct ccw_device_id { __u16 match_flags; __u16 cu_type; __u16 dev_type; __u8 cu_model; __u8 dev_model; unsigned long driver_info; };”h]”hŒ·struct ccw_device_id { __u16 match_flags; __u16 cu_type; __u16 dev_type; __u8 cu_model; __u8 dev_model; unsigned long driver_info; };”…”�”}”hj\sbah}”(h]”h ]”h"]”h$]”h&]”j j uh1húh³hÊh´Kvhjh²hubhÝ)�”}”(hŒ@The functions in ccw_driver should be used in the following way:”h]”hŒ@The functions in ccw_driver should be used in the following way:”…”�”}”(hjjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K�hjh²hubjE)�”}”(hhh]”jJ)�”}”(hX probe: This function is called by the device layer for each device the driver is interested in. The driver should only allocate private structures to put in dev->driver_data and create attributes (if needed). Also, the interrupt handler (see below) should be set here. ”h]”(jP)�”}”(hŒprobe:”h]”hŒprobe:”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jOh³hÊh´K‡hj{ubj`)�”}”(hhh]”hÝ)�”}”(hXThis function is called by the device layer for each device the driver is interested in. The driver should only allocate private structures to put in dev->driver_data and create attributes (if needed). Also, the interrupt handler (see below) should be set here.”h]”hXThis function is called by the device layer for each device the driver is interested in. The driver should only allocate private structures to put in dev->driver_data and create attributes (if needed). Also, the interrupt handler (see below) should be set here.”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K„hj�ubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hj{ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jIh³hÊh´K‡hjxubah}”(h]”h ]”h"]”h$]”h&]”uh1jDhjh²hh³hÊh´Nubhû)�”}”(hŒ'int (*probe) (struct ccw_device *cdev);”h]”hŒ'int (*probe) (struct ccw_device *cdev);”…”�”}”hj°sbah}”(h]”h ]”h"]”h$]”h&]”j j uh1húh³hÊh´K‹hjh²hubjE)�”}”(hhh]”(jJ)�”}”(hŒ5Parameters: cdev - the device to be probed. ”h]”(jP)�”}”(hŒ Parameters:”h]”hŒ Parameters:”…”�”}”(hjÅh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jOh³hÊh´K�hjÁubj`)�”}”(hhh]”jE)�”}”(hhh]”jJ)�”}”(hŒ!cdev - the device to be probed. ”h]”(jP)�”}”(hŒcdev”h]”hŒcdev”…”�”}”(hjÝh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jOh³hÊh´K�hjÙubj`)�”}”(hhh]”hŒ bullet_list”“”)�”}”(hhh]”jÏ)�”}”(hŒthe device to be probed. ”h]”hÝ)�”}”(hŒthe device to be probed.”h]”hŒthe device to be probed.”…”�”}”(hj÷h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K�hjóubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjðubah}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ-”uh1jîh³hÊh´K�hjëubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hjÙubeh}”(h]”h ]”h"]”h$]”h&]”uh1jIh³hÊh´K�hjÖubah}”(h]”h ]”h"]”h$]”h&]”uh1jDhjÓubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hjÁubeh}”(h]”h ]”h"]”h$]”h&]”uh1jIh³hÊh´K�hj¾ubjJ)�”}”(hŒ“remove: This function is called by the device layer upon removal of the driver, the device or the module. The driver should perform cleanups here. ”h]”(jP)�”}”(hŒremove:”h]”hŒremove:”…”�”}”(hj5h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jOh³hÊh´K”hj1ubj`)�”}”(hhh]”hÝ)�”}”(hŒŠThis function is called by the device layer upon removal of the driver, the device or the module. The driver should perform cleanups here.”h]”hŒŠThis function is called by the device layer upon removal of the driver, the device or the module. The driver should perform cleanups here.”…”�”}”(hjFh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K“hjCubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hj1ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jIh³hÊh´K”hj¾h²hubeh}”(h]”h ]”h"]”h$]”h&]”uh1jDhjh²hh³Nh´Nubhû)�”}”(hŒ(int (*remove) (struct ccw_device *cdev);”h]”hŒ(int (*remove) (struct ccw_device *cdev);”…”�”}”hjfsbah}”(h]”h ]”h"]”h$]”h&]”j j uh1húh³hÊh´K˜hjh²hubjE)�”}”(hhh]”(jJ)�”}”(hŒ6Parameters: cdev - the device to be removed. ”h]”(jP)�”}”(hŒ Parameters:”h]”hŒ Parameters:”…”�”}”(hj{h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jOh³hÊh´K�hjwubj`)�”}”(hhh]”jE)�”}”(hhh]”jJ)�”}”(hŒ"cdev - the device to be removed. ”h]”(jP)�”}”(hŒcdev”h]”hŒcdev”…”�”}”(hj“h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jOh³hÊh´K�hj�ubj`)�”}”(hhh]”jï)�”}”(hhh]”jÏ)�”}”(hŒthe device to be removed. ”h]”hÝ)�”}”(hŒthe device to be removed.”h]”hŒthe device to be removed.”…”�”}”(hj«h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Kœhj§ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhj¤ubah}”(h]”h ]”h"]”h$]”h&]”jjuh1jîh³hÊh´Kœhj¡ubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hj�ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jIh³hÊh´K�hjŒubah}”(h]”h ]”h"]”h$]”h&]”uh1jDhj‰ubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hjwubeh}”(h]”h ]”h"]”h$]”h&]”uh1jIh³hÊh´K�hjtubjJ)�”}”(hŒ³set_online: This function is called by the common I/O layer when the device is activated via the 'online' attribute. The driver should finally setup and activate the device here. ”h]”(jP)�”}”(hŒ set_online:”h]”hŒ set_online:”…”�”}”(hjçh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jOh³hÊh´K¢hjãubj`)�”}”(hhh]”hÝ)�”}”(hŒ¦This function is called by the common I/O layer when the device is activated via the 'online' attribute. The driver should finally setup and activate the device here.”h]”hŒªThis function is called by the common I/O layer when the device is activated via the ‘online’ attribute. The driver should finally setup and activate the device here.”…”�”}”(hjøh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K hjõubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hjãubeh}”(h]”h ]”h"]”h$]”h&]”uh1jIh³hÊh´K¢hjth²hubeh}”(h]”h ]”h"]”h$]”h&]”uh1jDhjh²hh³Nh´Nubhû)�”}”(hŒ(int (*set_online) (struct ccw_device *);”h]”hŒ(int (*set_online) (struct ccw_device *);”…”�”}”hjsbah}”(h]”h ]”h"]”h$]”h&]”j j uh1húh³hÊh´K¦hjh²hubjE)�”}”(hhh]”(jJ)�”}”(hŒ‡Parameters: cdev - the device to be activated. The common layer has verified that the device is not already online. ”h]”(jP)�”}”(hŒ Parameters:”h]”hŒ Parameters:”…”�”}”(hj-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jOh³hÊh´K¬hj)ubj`)�”}”(hhh]”jE)�”}”(hhh]”jJ)�”}”(hŒkcdev - the device to be activated. The common layer has verified that the device is not already online. ”h]”(jP)�”}”(hŒcdev”h]”hŒcdev”…”�”}”(hjEh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jOh³hÊh´K¬hjAubj`)�”}”(hhh]”jï)�”}”(hhh]”jÏ)�”}”(hŒbthe device to be activated. The common layer has verified that the device is not already online. ”h]”hÝ)�”}”(hŒ`the device to be activated. The common layer has verified that the device is not already online.”h]”hŒ`the device to be activated. The common layer has verified that the device is not already online.”…”�”}”(hj]h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KªhjYubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjVubah}”(h]”h ]”h"]”h$]”h&]”jjuh1jîh³hÊh´KªhjSubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hjAubeh}”(h]”h ]”h"]”h$]”h&]”uh1jIh³hÊh´K¬hj>ubah}”(h]”h ]”h"]”h$]”h&]”uh1jDhj;ubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hj)ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jIh³hÊh´K¬hj&ubjJ)�”}”(hŒÇset_offline: This function is called by the common I/O layer when the device is de-activated via the 'online' attribute. The driver should shut down the device, but not de-allocate its private data. ”h]”(jP)�”}”(hŒOset_offline: This function is called by the common I/O layer when the device is”h]”hŒOset_offline: This function is called by the common I/O layer when the device is”…”�”}”(hj™h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jOh³hÊh´K°hj•ubj`)�”}”(hhh]”hÝ)�”}”(hŒvde-activated via the 'online' attribute. The driver should shut down the device, but not de-allocate its private data.”h]”hŒzde-activated via the ‘online’ attribute. The driver should shut down the device, but not de-allocate its private data.”…”�”}”(hjªh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K¯hj§ubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hj•ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jIh³hÊh´K°hj&h²hubeh}”(h]”h ]”h"]”h$]”h&]”uh1jDhjh²hh³Nh´Nubhû)�”}”(hŒ)int (*set_offline) (struct ccw_device *);”h]”hŒ)int (*set_offline) (struct ccw_device *);”…”�”}”hjÊsbah}”(h]”h ]”h"]”h$]”h&]”j j uh1húh³hÊh´K´hjh²hubjE)�”}”(hhh]”(jJ)�”}”(hŒ~Parameters: cdev - the device to be deactivated. The common layer has verified that the device is online. ”h]”(jP)�”}”(hŒ Parameters:”h]”hŒ Parameters:”…”�”}”(hjßh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jOh³hÊh´KºhjÛubj`)�”}”(hhh]”jE)�”}”(hhh]”jJ)�”}”(hŒbcdev - the device to be deactivated. The common layer has verified that the device is online. ”h]”(jP)�”}”(hŒcdev”h]”hŒcdev”…”�”}”(hj÷h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jOh³hÊh´Kºhjóubj`)�”}”(hhh]”jï)�”}”(hhh]”jÏ)�”}”(hŒYthe device to be deactivated. The common layer has verified that the device is online. ”h]”jE)�”}”(hhh]”jJ)�”}”(hŒXthe device to be deactivated. The common layer has verified that the device is online. ”h]”(jP)�”}”(hŒ2the device to be deactivated. The common layer has”h]”hŒ2the device to be deactivated. The common layer has”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jOh³hÊh´Kºhjubj`)�”}”(hhh]”hÝ)�”}”(hŒ#verified that the device is online.”h]”hŒ#verified that the device is online.”…”�”}”(hj'h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K¹hj$ubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jIh³hÊh´Kºhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jDhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjubah}”(h]”h ]”h"]”h$]”h&]”jjuh1jîh³hÊh´K¸hjubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hjóubeh}”(h]”h ]”h"]”h$]”h&]”uh1jIh³hÊh´Kºhjðubah}”(h]”h ]”h"]”h$]”h&]”uh1jDhjíubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hjÛubeh}”(h]”h ]”h"]”h$]”h&]”uh1jIh³hÊh´KºhjØubjJ)�”}”(hXinotify: This function is called by the common I/O layer for some state changes of the device. Signalled to the driver are: * In online state, device detached (CIO_GONE) or last path gone (CIO_NO_PATH). The driver must return !0 to keep the device; for return code 0, the device will be deleted as usual (also when no notify function is registered). If the driver wants to keep the device, it is moved into disconnected state. * In disconnected state, device operational again (CIO_OPER). The common I/O layer performs some sanity checks on device number and Device / CU to be reasonably sure if it is still the same device. If not, the old device is removed and a new one registered. By the return code of the notify function the device driver signals if it wants the device back: !0 for keeping, 0 to make the device being removed and re-registered. ”h]”(jP)�”}”(hŒnotify:”h]”hŒnotify:”…”�”}”(hjuh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jOh³hÊh´KÍhjqubj`)�”}”(hhh]”(hÝ)�”}”(hŒUThis function is called by the common I/O layer for some state changes of the device.”h]”hŒUThis function is called by the common I/O layer for some state changes of the device.”…”�”}”(hj†h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K½hjƒubhÝ)�”}”(hŒSignalled to the driver are:”h]”hŒSignalled to the driver are:”…”�”}”(hj”h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KÀhjƒubjï)�”}”(hhh]”(jÏ)�”}”(hX,In online state, device detached (CIO_GONE) or last path gone (CIO_NO_PATH). The driver must return !0 to keep the device; for return code 0, the device will be deleted as usual (also when no notify function is registered). If the driver wants to keep the device, it is moved into disconnected state.”h]”hÝ)�”}”(hX,In online state, device detached (CIO_GONE) or last path gone (CIO_NO_PATH). The driver must return !0 to keep the device; for return code 0, the device will be deleted as usual (also when no notify function is registered). If the driver wants to keep the device, it is moved into disconnected state.”h]”hX,In online state, device detached (CIO_GONE) or last path gone (CIO_NO_PATH). The driver must return !0 to keep the device; for return code 0, the device will be deleted as usual (also when no notify function is registered). If the driver wants to keep the device, it is moved into disconnected state.”…”�”}”(hj©h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KÂhj¥ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhj¢ubjÏ)�”}”(hX§In disconnected state, device operational again (CIO_OPER). The common I/O layer performs some sanity checks on device number and Device / CU to be reasonably sure if it is still the same device. If not, the old device is removed and a new one registered. By the return code of the notify function the device driver signals if it wants the device back: !0 for keeping, 0 to make the device being removed and re-registered. ”h]”hÝ)�”}”(hX¦In disconnected state, device operational again (CIO_OPER). The common I/O layer performs some sanity checks on device number and Device / CU to be reasonably sure if it is still the same device. If not, the old device is removed and a new one registered. By the return code of the notify function the device driver signals if it wants the device back: !0 for keeping, 0 to make the device being removed and re-registered.”h]”hX¦In disconnected state, device operational again (CIO_OPER). The common I/O layer performs some sanity checks on device number and Device / CU to be reasonably sure if it is still the same device. If not, the old device is removed and a new one registered. By the return code of the notify function the device driver signals if it wants the device back: !0 for keeping, 0 to make the device being removed and re-registered.”…”�”}”(hjÁh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KÇhj½ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhj¢ubeh}”(h]”h ]”h"]”h$]”h&]”jŒ*”uh1jîh³hÊh´KÂhjƒubeh}”(h]”h ]”h"]”h$]”h&]”uh1j_hjqubeh}”(h]”h ]”h"]”h$]”h&]”uh1jIh³hÊh´KÍhjØh²hubeh}”(h]”h ]”h"]”h$]”h&]”uh1jDhjh²hh³Nh´Nubhû)�”}”(hŒ)int (*notify) (struct ccw_device *, int);”h]”hŒ)int (*notify) (struct ccw_device *, int);”…”�”}”hjîsbah}”(h]”h ]”h"]”h$]”h&]”j j uh1húh³hÊh´KÑhjh²hubjE)�”}”(hhh]”jJ)�”}”(hŒ¥Parameters: cdev - the device whose state changed. event - the event that happened. This can be one of CIO_GONE, CIO_NO_PATH or CIO_OPER. ”h]”(jP)�”}”(hŒ Parameters:”h]”hŒ Parameters:”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jOh³hÊh´KÙhjÿubj`)�”}”(hhh]”jE)�”}”(hhh]”(jJ)�”}”(hŒ'cdev - the device whose state changed. ”h]”(jP)�”}”(hŒcdev”h]”hŒcdev”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jOh³hÊh´KÕhjubj`)�”}”(hhh]”jï)�”}”(hhh]”jÏ)�”}”(hŒ the device whose state changed. ”h]”hÝ)�”}”(hŒthe device whose state changed.”h]”hŒthe device whose state changed.”…”�”}”(hj3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KÕhj/ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhj,ubah}”(h]”h ]”h"]”h$]”h&]”jjuh1jîh³hÊh´KÕhj)ubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jIh³hÊh´KÕhjubjJ)�”}”(hŒYevent - the event that happened. This can be one of CIO_GONE, CIO_NO_PATH or CIO_OPER. ”h]”(jP)�”}”(hŒevent”h]”hŒevent”…”�”}”(hj]h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jOh³hÊh´KÙhjYubj`)�”}”(hhh]”jï)�”}”(hhh]”jÏ)�”}”(hŒOthe event that happened. This can be one of CIO_GONE, CIO_NO_PATH or CIO_OPER. ”h]”hÝ)�”}”(hŒNthe event that happened. This can be one of CIO_GONE, CIO_NO_PATH or CIO_OPER.”h]”hŒNthe event that happened. This can be one of CIO_GONE, CIO_NO_PATH or CIO_OPER.”…”�”}”(hjuh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KØhjqubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjnubah}”(h]”h ]”h"]”h$]”h&]”jjuh1jîh³hÊh´KØhjkubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hjYubeh}”(h]”h ]”h"]”h$]”h&]”uh1jIh³hÊh´KÙhjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jDhjubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hjÿubeh}”(h]”h ]”h"]”h$]”h&]”uh1jIh³hÊh´KÙhjüubah}”(h]”h ]”h"]”h$]”h&]”uh1jDhjh²hh³Nh´NubhÝ)�”}”(hX8The handler field of the struct ccw_device is meant to be set to the interrupt handler for the device. In order to accommodate drivers which use several distinct handlers (e.g. multi subchannel devices), this is a member of ccw_device instead of ccw_driver. The handler is registered with the common layer during set_online() processing before the driver is called, and is deregistered during set_offline() after the driver has been called. Also, after registering / before deregistering, path grouping resp. disbanding of the path group (if applicable) are performed.”h]”hX8The handler field of the struct ccw_device is meant to be set to the interrupt handler for the device. In order to accommodate drivers which use several distinct handlers (e.g. multi subchannel devices), this is a member of ccw_device instead of ccw_driver. The handler is registered with the common layer during set_online() processing before the driver is called, and is deregistered during set_offline() after the driver has been called. Also, after registering / before deregistering, path grouping resp. disbanding of the path group (if applicable) are performed.”…”�”}”(hj³h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KÛhjh²hubhû)�”}”(hŒQvoid (*handler) (struct ccw_device *dev, unsigned long intparm, struct irb *irb);”h]”hŒQvoid (*handler) (struct ccw_device *dev, unsigned long intparm, struct irb *irb);”…”�”}”hjÁsbah}”(h]”h ]”h"]”h$]”h&]”j j uh1húh³hÊh´Kæhjh²hubjE)�”}”(hhh]”jJ)�”}”(hXCParameters: dev - the device the handler is called for intparm - the intparm which allows the device driver to identify the i/o the interrupt is associated with, or to recognize the interrupt as unsolicited. irb - interruption response block which contains the accumulated status. ”h]”(jP)�”}”(hŒ>Parameters: dev - the device the handler is called for”h]”hŒ>Parameters: dev - the device the handler is called for”…”�”}”(hjÖh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jOh³hÊh´KíhjÒubj`)�”}”(hhh]”jE)�”}”(hhh]”(jJ)�”}”(hŒ˜intparm - the intparm which allows the device driver to identify the i/o the interrupt is associated with, or to recognize the interrupt as unsolicited.”h]”(jP)�”}”(hŒ@intparm - the intparm which allows the device driver to identify”h]”hŒ@intparm - the intparm which allows the device driver to identify”…”�”}”(hjîh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jOh³hÊh´Kêhjêubj`)�”}”(hhh]”hÝ)�”}”(hŒWthe i/o the interrupt is associated with, or to recognize the interrupt as unsolicited.”h]”hŒWthe i/o the interrupt is associated with, or to recognize the interrupt as unsolicited.”…”�”}”(hjÿh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Kêhjüubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hjêubeh}”(h]”h ]”h"]”h$]”h&]”uh1jIh³hÊh´KêhjçubjJ)�”}”(hŒMirb - interruption response block which contains the accumulated status. ”h]”(jP)�”}”(hŒDirb - interruption response block which contains the accumulated”h]”hŒDirb - interruption response block which contains the accumulated”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jOh³hÊh´Kíhjubj`)�”}”(hhh]”hÝ)�”}”(hŒstatus.”h]”hŒstatus.”…”�”}”(hj.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Kíhj+ubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jIh³hÊh´Kíhjçubeh}”(h]”h ]”h"]”h$]”h&]”uh1jDhjäubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hjÒubeh}”(h]”h ]”h"]”h$]”h&]”uh1jIh³hÊh´KíhjÏubah}”(h]”h ]”h"]”h$]”h&]”uh1jDhjh²hh³Nh´NubhÝ)�”}”(hŒ…The device driver is called from the common ccw_device layer and can retrieve information about the interrupt from the irb parameter.”h]”hŒ…The device driver is called from the common ccw_device layer and can retrieve information about the interrupt from the irb parameter.”…”�”}”(hj`h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Kïhjh²hubeh}”(h]”Œ writing-a-driver-for-ccw-devices”ah ]”h"]”Œ$1.2 writing a driver for ccw devices”ah$]”h&]”uh1hµhh·h²hh³hÊh´KQubh¶)�”}”(hhh]”(h»)�”}”(hŒ1.3 ccwgroup devices”h]”hŒ1.3 ccwgroup devices”…”�”}”(hjyh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjvh²hh³hÊh´KôubhÝ)�”}”(hŒjThe ccwgroup mechanism is designed to handle devices consisting of multiple ccw devices, like qeth or ctc.”h]”hŒjThe ccwgroup mechanism is designed to handle devices consisting of multiple ccw devices, like qeth or ctc.”…”�”}”(hj‡h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Köhjvh²hubhÝ)�”}”(hŒ÷The ccw driver provides a 'group' attribute. Piping bus ids of ccw devices to this attributes creates a ccwgroup device consisting of these ccw devices (if possible). This ccwgroup device can be set online or offline just like a normal ccw device.”h]”hŒûThe ccw driver provides a ‘group’ attribute. Piping bus ids of ccw devices to this attributes creates a ccwgroup device consisting of these ccw devices (if possible). This ccwgroup device can be set online or offline just like a normal ccw device.”…”�”}”(hj•h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Kùhjvh²hubhÝ)�”}”(hŒàEach ccwgroup device also provides an 'ungroup' attribute to destroy the device again (only when offline). This is a generic ccwgroup mechanism (the driver does not need to implement anything beyond normal removal routines).”h]”hŒäEach ccwgroup device also provides an ‘ungroup’ attribute to destroy the device again (only when offline). This is a generic ccwgroup mechanism (the driver does not need to implement anything beyond normal removal routines).”…”�”}”(hj£h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Kþhjvh²hubhÝ)�”}”(hŒúA ccw device which is a member of a ccwgroup device carries a pointer to the ccwgroup device in the driver_data of its device struct. This field must not be touched by the driver - it should use the ccwgroup device's driver_data for its private data.”h]”hŒüA ccw device which is a member of a ccwgroup device carries a pointer to the ccwgroup device in the driver_data of its device struct. This field must not be touched by the driver - it should use the ccwgroup device’s driver_data for its private data.”…”�”}”(hj±h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mhjvh²hubhÝ)�”}”(hŒŸTo implement a ccwgroup driver, please refer to include/asm/ccwgroup.h. Keep in mind that most drivers will need to implement both a ccwgroup and a ccw driver.”h]”hŒŸTo implement a ccwgroup driver, please refer to include/asm/ccwgroup.h. Keep in mind that most drivers will need to implement both a ccwgroup and a ccw driver.”…”�”}”(hj¿h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mhjvh²hubeh}”(h]”Œccwgroup-devices”ah ]”h"]”Œ1.3 ccwgroup devices”ah$]”h&]”uh1hµhh·h²hh³hÊh´Kôubh¶)�”}”(hhh]”(h»)�”}”(hŒ2. Channel paths”h]”hŒ2. Channel paths”…”�”}”(hjØh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjÕh²hh³hÊh´M ubhÝ)�”}”(hXšChannel paths show up, like subchannels, under the channel subsystem root (css0) and are called 'chp0.'. They have no driver and do not belong to any bus. Please note, that unlike /proc/chpids in 2.4, the channel path objects reflect only the logical state and not the physical state, since we cannot track the latter consistently due to lacking machine support (we don't need to be aware of it anyway).”h]”hX Channel paths show up, like subchannels, under the channel subsystem root (css0) and are called ‘chp0.’. They have no driver and do not belong to any bus. Please note, that unlike /proc/chpids in 2.4, the channel path objects reflect only the logical state and not the physical state, since we cannot track the latter consistently due to lacking machine support (we don’t need to be aware of it anyway).”…”�”}”(hjæh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MhjÕh²hubjE)�”}”(hhh]”(jJ)�”}”(hX[status - Can be 'online' or 'offline'. Piping 'on' or 'off' sets the chpid logically online/offline. Piping 'on' to an online chpid triggers path reprobing for all devices the chpid connects to. This can be used to force the kernel to reuse a channel path the user knows to be online, but the machine hasn't created a machine check for. ”h]”(jP)�”}”(hŒstatus”h]”hŒstatus”…”�”}”(hjûh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jOh³hÊh´Mhj÷ubj`)�”}”(hhh]”jï)�”}”(hhh]”jÏ)�”}”(hXHCan be 'online' or 'offline'. Piping 'on' or 'off' sets the chpid logically online/offline. Piping 'on' to an online chpid triggers path reprobing for all devices the chpid connects to. This can be used to force the kernel to reuse a channel path the user knows to be online, but the machine hasn't created a machine check for. ”h]”hÝ)�”}”(hXGCan be 'online' or 'offline'. Piping 'on' or 'off' sets the chpid logically online/offline. Piping 'on' to an online chpid triggers path reprobing for all devices the chpid connects to. This can be used to force the kernel to reuse a channel path the user knows to be online, but the machine hasn't created a machine check for.”h]”hX]Can be ‘online’ or ‘offline’. Piping ‘on’ or ‘off’ sets the chpid logically online/offline. Piping ‘on’ to an online chpid triggers path reprobing for all devices the chpid connects to. This can be used to force the kernel to reuse a channel path the user knows to be online, but the machine hasn’t created a machine check for.”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhj ubah}”(h]”h ]”h"]”h$]”h&]”jjuh1jîh³hÊh´Mhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hj÷ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jIh³hÊh´MhjôubjJ)�”}”(hŒ.type - The physical type of the channel path. ”h]”(jP)�”}”(hŒtype”h]”hŒtype”…”�”}”(hj= h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jOh³hÊh´Mhj9 ubj`)�”}”(hhh]”jï)�”}”(hhh]”jÏ)�”}”(hŒ'The physical type of the channel path. ”h]”hÝ)�”}”(hŒ&The physical type of the channel path.”h]”hŒ&The physical type of the channel path.”…”�”}”(hjU h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MhjQ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjN ubah}”(h]”h ]”h"]”h$]”h&]”jjuh1jîh³hÊh´MhjK ubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hj9 ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jIh³hÊh´Mhjôh²hubjJ)�”}”(hŒ-shared - Whether the channel path is shared. ”h]”(jP)�”}”(hŒshared”h]”hŒshared”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jOh³hÊh´M"hj{ ubj`)�”}”(hhh]”jï)�”}”(hhh]”jÏ)�”}”(hŒ$Whether the channel path is shared. ”h]”hÝ)�”}”(hŒ#Whether the channel path is shared.”h]”hŒ#Whether the channel path is shared.”…”�”}”(hj— h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M"hj“ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhj� ubah}”(h]”h ]”h"]”h$]”h&]”jjuh1jîh³hÊh´M"hj� ubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hj{ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jIh³hÊh´M"hjôh²hubjJ)�”}”(hŒ%cmg - The channel measurement group. ”h]”(jP)�”}”(hŒcmg”h]”hŒcmg”…”�”}”(hjÁ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jOh³hÊh´M%hj½ ubj`)�”}”(hhh]”jï)�”}”(hhh]”jÏ)�”}”(hŒThe channel measurement group. ”h]”hÝ)�”}”(hŒThe channel measurement group.”h]”hŒThe channel measurement group.”…”�”}”(hjÙ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M%hjÕ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjÒ ubah}”(h]”h ]”h"]”h$]”h&]”jjuh1jîh³hÊh´M%hjÏ ubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hj½ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jIh³hÊh´M%hjôh²hubeh}”(h]”h ]”h"]”h$]”h&]”uh1jDhjÕh²hh³Nh´Nubeh}”(h]”Œ channel-paths”ah ]”h"]”Œ2. channel paths”ah$]”h&]”uh1hµhh·h²hh³hÊh´M ubh¶)�”}”(hhh]”h»)�”}”(hŒ3. System devices”h]”hŒ3. System devices”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj h²hh³hÊh´M(ubah}”(h]”Œsystem-devices”ah ]”h"]”Œ3. system devices”ah$]”h&]”uh1hµhh·h²hh³hÊh´M(ubh¶)�”}”(hhh]”(h»)�”}”(hŒ 3.1 xpram”h]”hŒ 3.1 xpram”…”�”}”(hj) h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj& h²hh³hÊh´M+ubhÝ)�”}”(hŒ0xpram shows up under devices/system/ as 'xpram'.”h]”hŒ4xpram shows up under devices/system/ as ‘xpram’.”…”�”}”(hj7 h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M-hj& h²hubeh}”(h]”Œxpram”ah ]”h"]”Œ 3.1 xpram”ah$]”h&]”uh1hµhh·h²hh³hÊh´M+ubh¶)�”}”(hhh]”(h»)�”}”(hŒ3.2 cpus”h]”hŒ3.2 cpus”…”�”}”(hjP h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjM h²hh³hÊh´M0ubhÝ)�”}”(hŒwFor each cpu, a directory is created under devices/system/cpu/. Each cpu has an attribute 'online' which can be 0 or 1.”h]”hŒ{For each cpu, a directory is created under devices/system/cpu/. Each cpu has an attribute ‘online’ which can be 0 or 1.”…”�”}”(hj^ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M2hjM h²hubeh}”(h]”Œcpus”ah ]”h"]”Œ3.2 cpus”ah$]”h&]”uh1hµhh·h²hh³hÊh´M0ubeh}”(h]”Œs-390-driver-model-interfaces”ah ]”h"]”Œs/390 driver model interfaces”ah$]”h&]”uh1hµhhh²hh³hÊh´Kubeh}”(h]”h ]”h"]”h$]”h&]”Œsource”hÊuh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)�”}”(hºNŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”Œentry”Œfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”jŸ Œerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”hÊŒ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”Œrefids”}”Œnameids”}”(jy jv j§j¤jj jsjpjÒjÏj j j# j jJ jG jq jn uŒ nametypes”}”(jy ‰j§‰j‰js‰jÒ‰j ‰j# ‰jJ ‰jq ‰uh}”(jv h·j¤hËj jªjpjjÏjvj jÕj j jG j& jn jM uŒ footnote_refs”}”Œ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”Œ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”…”R”Œparse_messages”]”Œtransform_messages”]”Œ transformer”NŒ include_log”]”Œ decoration”Nh²hub.