Jsphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextChinese (Simplified)}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget!/translations/zh_CN/arch/s390/cdsmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget!/translations/zh_TW/arch/s390/cdsmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget!/translations/it_IT/arch/s390/cdsmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget!/translations/ja_JP/arch/s390/cdsmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget!/translations/ko_KR/arch/s390/cdsmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget!/translations/sp_SP/arch/s390/cdsmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageEnglishuh1h hh _documenthsourceNlineNubhsection)}(hhh](htitle)}(hLinux for S/390 and zSeriesh]hLinux for S/390 and zSeries}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhh;/var/lib/git/docbuild/linux/Documentation/arch/s390/cds.rsthKubh paragraph)}(h>Common Device Support (CDS) Device Driver I/O Support Routinesh]h>Common Device Support (CDS) Device Driver I/O Support Routines}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubhdefinition_list)}(hhh]hdefinition_list_item)}(h'Authors: - Ingo Adlung - Cornelia Huck h](hterm)}(hAuthors:h]hAuthors:}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hhubh definition)}(hhh]h bullet_list)}(hhh](h list_item)}(h Ingo Adlungh]h)}(hhh]h Ingo Adlung}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hhubah}(h]h ]h"]h$]h&]uh1hhhubh)}(hCornelia Huck h]h)}(h Cornelia Huckh]h Cornelia Huck}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hjubah}(h]h ]h"]h$]h&]uh1hhhubeh}(h]h ]h"]h$]h&]bullet-uh1hhhhK hhubah}(h]h ]h"]h$]h&]uh1hhhubeh}(h]h ]h"]h$]h&]uh1hhhhK hhubah}(h]h ]h"]h$]h&]uh1hhhhhhNhNubh)}(hCopyright, IBM Corp. 1999-2002h]hCopyright, IBM Corp. 1999-2002}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hhhhubh)}(hhh](h)}(h Introductionh]h Introduction}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjEhhhhhKubh)}(hXThis document describes the common device support routines for Linux/390. Different than other hardware architectures, ESA/390 has defined a unified I/O access method. This gives relief to the device drivers as they don't have to deal with different bus types, polling versus interrupt processing, shared versus non-shared interrupt processing, DMA versus port I/O (PIO), and other hardware features more. However, this implies that either every single device driver needs to implement the hardware I/O attachment functionality itself, or the operating system provides for a unified method to access the hardware, providing all the functionality that every single device driver would have to provide itself.h]hXThis document describes the common device support routines for Linux/390. Different than other hardware architectures, ESA/390 has defined a unified I/O access method. This gives relief to the device drivers as they don’t have to deal with different bus types, polling versus interrupt processing, shared versus non-shared interrupt processing, DMA versus port I/O (PIO), and other hardware features more. However, this implies that either every single device driver needs to implement the hardware I/O attachment functionality itself, or the operating system provides for a unified method to access the hardware, providing all the functionality that every single device driver would have to provide itself.}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjEhhubh)}(hThe document does not intend to explain the ESA/390 hardware architecture in every detail.This information can be obtained from the ESA/390 Principles of Operation manual (IBM Form. No. SA22-7201).h]hThe document does not intend to explain the ESA/390 hardware architecture in every detail.This information can be obtained from the ESA/390 Principles of Operation manual (IBM Form. No. SA22-7201).}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjEhhubh)}(hIn order to build common device support for ESA/390 I/O interfaces, a functional layer was introduced that provides generic I/O access methods to the hardware.h]hIn order to build common device support for ESA/390 I/O interfaces, a functional layer was introduced that provides generic I/O access methods to the hardware.}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hjEhhubh)}(hThe common device support layer comprises the I/O support routines defined below. Some of them implement common Linux device driver interfaces, while some of them are ESA/390 platform specific.h]hThe common device support layer comprises the I/O support routines defined below. Some of them implement common Linux device driver interfaces, while some of them are ESA/390 platform specific.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK$hjEhhubh)}(hhh]h)}(hNote: In order to write a driver for S/390, you also need to look into the interface described in Documentation/arch/s390/driver-model.rst. h](h)}(hNote:h]hNote:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK*hjubh)}(hhh]h)}(hIn order to write a driver for S/390, you also need to look into the interface described in Documentation/arch/s390/driver-model.rst.h]hIn order to write a driver for S/390, you also need to look into the interface described in Documentation/arch/s390/driver-model.rst.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK)hjubah}(h]h ]h"]h$]h&]uh1hhjubeh}(h]h ]h"]h$]h&]uh1hhhhK*hjubah}(h]h ]h"]h$]h&]uh1hhjEhhhhhNubh)}(h"Note for porting drivers from 2.4:h]h"Note for porting drivers from 2.4:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK,hjEhhubh)}(hThe major changes are:h]hThe major changes are:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK.hjEhhubh)}(hhh](h)}(h>The functions use a ccw_device instead of an irq (subchannel).h]h)}(hjh]h>The functions use a ccw_device instead of an irq (subchannel).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK0hjubah}(h]h ]h"]h$]h&]uh1hhjhhhhhNubh)}(hYAll drivers must define a ccw_driver (see driver-model.txt) and the associated functions.h]h)}(hYAll drivers must define a ccw_driver (see driver-model.txt) and the associated functions.h]hYAll drivers must define a ccw_driver (see driver-model.txt) and the associated functions.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK1hjubah}(h]h ]h"]h$]h&]uh1hhjhhhhhNubh)}(h>request_irq() and free_irq() are no longer done by the driver.h]h)}(hjh]h>request_irq() and free_irq() are no longer done by the driver.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK3hjubah}(h]h ]h"]h$]h&]uh1hhjhhhhhNubh)}(hbThe oper_handler is (kindof) replaced by the probe() and set_online() functions of the ccw_driver.h]h)}(hbThe oper_handler is (kindof) replaced by the probe() and set_online() functions of the ccw_driver.h]hbThe oper_handler is (kindof) replaced by the probe() and set_online() functions of the ccw_driver.}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK4hj+ubah}(h]h ]h"]h$]h&]uh1hhjhhhhhNubh)}(hhThe not_oper_handler is (kindof) replaced by the remove() and set_offline() functions of the ccw_driver.h]h)}(hhThe not_oper_handler is (kindof) replaced by the remove() and set_offline() functions of the ccw_driver.h]hhThe not_oper_handler is (kindof) replaced by the remove() and set_offline() functions of the ccw_driver.}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK6hjCubah}(h]h ]h"]h$]h&]uh1hhjhhhhhNubh)}(h!The channel device layer is gone.h]h)}(hj]h]h!The channel device layer is gone.}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK8hj[ubah}(h]h ]h"]h$]h&]uh1hhjhhhhhNubh)}(hzThe interrupt handlers must be adapted to use a ccw_device as argument. Moreover, they don't return a devstat, but an irb.h]h)}(hzThe interrupt handlers must be adapted to use a ccw_device as argument. Moreover, they don't return a devstat, but an irb.h]h|The interrupt handlers must be adapted to use a ccw_device as argument. Moreover, they don’t return a devstat, but an irb.}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK9hjrubah}(h]h ]h"]h$]h&]uh1hhjhhhhhNubh)}(hNBefore initiating an io, the options must be set via ccw_device_set_options().h]h)}(hjh]hNBefore initiating an io, the options must be set via ccw_device_set_options().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK;hjubah}(h]h ]h"]h$]h&]uh1hhjhhhhhNubh)}(h~Instead of calling read_dev_chars()/read_conf_data(), the driver issues the channel program and handles the interrupt itself. h]h)}(h}Instead of calling read_dev_chars()/read_conf_data(), the driver issues the channel program and handles the interrupt itself.h]h}Instead of calling read_dev_chars()/read_conf_data(), the driver issues the channel program and handles the interrupt itself.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKscsw.ecw[]. No device sensing by the device driver itself is required.h]hXIf the concurrent sense flag in the extended status word (esw) in the irb is set, the field erw.scnt in the esw describes the number of device specific sense bytes available in the extended control word irb->scsw.ecw[]. No device sensing by the device driver itself is required.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM>hj:hhubh)}(hThe device interrupt handler can use the following definitions to investigate the primary unit check source coded in sense byte 0 :h]hThe device interrupt handler can use the following definitions to investigate the primary unit check source coded in sense byte 0 :}(hj! hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMChj:hhubj)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jhj2 ubj)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jhj2 ubj)}(hhh](j)}(hhh](j)}(hhh]h)}(hSNS0_CMD_REJECTh]hSNS0_CMD_REJECT}(hjR hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMGhjO ubah}(h]h ]h"]h$]h&]uh1jhjL ubj)}(hhh]h)}(h0x80h]h0x80}(hji hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMGhjf ubah}(h]h ]h"]h$]h&]uh1jhjL ubeh}(h]h ]h"]h$]h&]uh1jhjI ubj)}(hhh](j)}(hhh]h)}(hSNS0_INTERVENTION_REQh]hSNS0_INTERVENTION_REQ}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMHhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(h0x40h]h0x40}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMHhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhjI ubj)}(hhh](j)}(hhh]h)}(hSNS0_BUS_OUT_CHECKh]hSNS0_BUS_OUT_CHECK}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMIhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(h0x20h]h0x20}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMIhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhjI ubj)}(hhh](j)}(hhh]h)}(hSNS0_EQUIPMENT_CHECKh]hSNS0_EQUIPMENT_CHECK}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMJhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(h0x10h]h0x10}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMJhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhjI ubj)}(hhh](j)}(hhh]h)}(hSNS0_DATA_CHECKh]hSNS0_DATA_CHECK}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMKhj+ubah}(h]h ]h"]h$]h&]uh1jhj(ubj)}(hhh]h)}(h0x08h]h0x08}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMKhjBubah}(h]h ]h"]h$]h&]uh1jhj(ubeh}(h]h ]h"]h$]h&]uh1jhjI ubj)}(hhh](j)}(hhh]h)}(h SNS0_OVERRUNh]h SNS0_OVERRUN}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMLhjbubah}(h]h ]h"]h$]h&]uh1jhj_ubj)}(hhh]h)}(h0x04h]h0x04}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMLhjyubah}(h]h ]h"]h$]h&]uh1jhj_ubeh}(h]h ]h"]h$]h&]uh1jhjI ubj)}(hhh](j)}(hhh]h)}(hSNS0_INCOMPL_DOMAINh]hSNS0_INCOMPL_DOMAIN}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h0x01h]h0x01}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjI ubeh}(h]h ]h"]h$]h&]uh1jhj2 ubeh}(h]h ]h"]h$]h&]colsKuh1jhj/ ubah}(h]h ]h"]h$]h&]uh1jhj:hhhhhNubh)}(hDepending on the device status, multiple of those values may be set together. Please refer to the device specific documentation for details.h]hDepending on the device status, multiple of those values may be set together. Please refer to the device specific documentation for details.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMPhj:hhubh)}(hHThe irb->scsw.cstat field provides the (accumulated) subchannel status :h]hHThe irb->scsw.cstat field provides the (accumulated) subchannel status :}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMShj:hhubj)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jhjubj)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jhjubj)}(hhh](j)}(hhh](j)}(hhh]h)}(h SCHN_STAT_PCIh]h SCHN_STAT_PCI}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMVhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hprogram controlled interrupth]hprogram controlled interrupt}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMVhj3ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(hSCHN_STAT_INCORR_LENh]hSCHN_STAT_INCORR_LEN}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMWhjSubah}(h]h ]h"]h$]h&]uh1jhjPubj)}(hhh]h)}(hincorrect lengthh]hincorrect length}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMWhjjubah}(h]h ]h"]h$]h&]uh1jhjPubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(hSCHN_STAT_PROG_CHECKh]hSCHN_STAT_PROG_CHECK}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMXhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h program checkh]h program check}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMXhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(hSCHN_STAT_PROT_CHECKh]hSCHN_STAT_PROT_CHECK}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMYhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hprotection checkh]hprotection check}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMYhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(hSCHN_STAT_CHN_DATA_CHKh]hSCHN_STAT_CHN_DATA_CHK}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMZhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hchannel data checkh]hchannel data check}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMZhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(hSCHN_STAT_CHN_CTRL_CHKh]hSCHN_STAT_CHN_CTRL_CHK}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM[hj/ubah}(h]h ]h"]h$]h&]uh1jhj,ubj)}(hhh]h)}(hchannel control checkh]hchannel control check}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM[hjFubah}(h]h ]h"]h$]h&]uh1jhj,ubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(hSCHN_STAT_INTF_CTRL_CHKh]hSCHN_STAT_INTF_CTRL_CHK}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM\hjfubah}(h]h ]h"]h$]h&]uh1jhjcubj)}(hhh]h)}(hinterface control checkh]hinterface control check}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM\hj}ubah}(h]h ]h"]h$]h&]uh1jhjcubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(hSCHN_STAT_CHAIN_CHECKh]hSCHN_STAT_CHAIN_CHECK}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM]hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hchaining checkh]hchaining check}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM]hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]colsKuh1jhjubah}(h]h ]h"]h$]h&]uh1jhj:hhhhhNubh)}(hDThe irb->scsw.dstat field provides the (accumulated) device status :h]hDThe irb->scsw.dstat field provides the (accumulated) device status :}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM`hj:hhubj)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jhjubj)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jhjubj)}(hhh](j)}(hhh](j)}(hhh]h)}(hDEV_STAT_ATTENTIONh]hDEV_STAT_ATTENTION}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMchjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h attentionh]h attention}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMchj)ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh](j)}(hhh]h)}(hDEV_STAT_STAT_MODh]hDEV_STAT_STAT_MOD}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMdhjIubah}(h]h ]h"]h$]h&]uh1jhjFubj)}(hhh]h)}(hstatus modifierh]hstatus modifier}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMdhj`ubah}(h]h ]h"]h$]h&]uh1jhjFubeh}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh](j)}(hhh]h)}(hDEV_STAT_CU_ENDh]hDEV_STAT_CU_END}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMehjubah}(h]h ]h"]h$]h&]uh1jhj}ubj)}(hhh]h)}(hcontrol unit endh]hcontrol unit end}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMehjubah}(h]h ]h"]h$]h&]uh1jhj}ubeh}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh](j)}(hhh]h)}(h DEV_STAT_BUSYh]h DEV_STAT_BUSY}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMfhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hbusyh]hbusy}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMfhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh](j)}(hhh]h)}(hDEV_STAT_CHN_ENDh]hDEV_STAT_CHN_END}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMghjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h channel endh]h channel end}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMghjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh](j)}(hhh]h)}(hDEV_STAT_DEV_ENDh]hDEV_STAT_DEV_END}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhhj%ubah}(h]h ]h"]h$]h&]uh1jhj"ubj)}(hhh]h)}(h device endh]h device end}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhhj<ubah}(h]h ]h"]h$]h&]uh1jhj"ubeh}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh](j)}(hhh]h)}(hDEV_STAT_UNIT_CHECKh]hDEV_STAT_UNIT_CHECK}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMihj\ubah}(h]h ]h"]h$]h&]uh1jhjYubj)}(hhh]h)}(h unit checkh]h unit check}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMihjsubah}(h]h ]h"]h$]h&]uh1jhjYubeh}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh](j)}(hhh]h)}(hDEV_STAT_UNIT_EXCEPh]hDEV_STAT_UNIT_EXCEP}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMjhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hunit exceptionh]hunit exception}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMjhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]colsKuh1jhjubah}(h]h ]h"]h$]h&]uh1jhj:hhhhhNubh)}(hbPlease see the ESA/390 Principles of Operation manual for details on the individual flag meanings.h]hbPlease see the ESA/390 Principles of Operation manual for details on the individual flag meanings.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMmhj:hhubh)}(h Usage Notes:h]h Usage Notes:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMphj:hhubh)}(hMccw_device_start() must be called disabled and with the ccw device lock held.h]hMccw_device_start() must be called disabled and with the ccw device lock held.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMrhj:hhubh)}(hXThe device driver is allowed to issue the next ccw_device_start() call from within its interrupt handler already. It is not required to schedule a bottom-half, unless a non deterministically long running error recovery procedure or similar needs to be scheduled. During I/O processing the Linux/390 generic I/O device driver support has already obtained the IRQ lock, i.e. the handler must not try to obtain it again when calling ccw_device_start() or we end in a deadlock situation!dh]hXThe device driver is allowed to issue the next ccw_device_start() call from within its interrupt handler already. It is not required to schedule a bottom-half, unless a non deterministically long running error recovery procedure or similar needs to be scheduled. During I/O processing the Linux/390 generic I/O device driver support has already obtained the IRQ lock, i.e. the handler must not try to obtain it again when calling ccw_device_start() or we end in a deadlock situation!}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMthj:hhubh)}(hXNIf a device driver relies on an I/O request to be completed prior to start the next it can reduce I/O processing overhead by chaining a NoOp I/O command CCW_CMD_NOOP to the end of the submitted CCW chain. This will force Channel-End and Device-End status to be presented together, with a single interrupt. However, this should be used with care as it implies the channel will remain busy, not being able to process I/O requests for other devices on the same channel. Therefore e.g. read commands should never use this technique, as the result will be presented by a single interrupt anyway.h]hXNIf a device driver relies on an I/O request to be completed prior to start the next it can reduce I/O processing overhead by chaining a NoOp I/O command CCW_CMD_NOOP to the end of the submitted CCW chain. This will force Channel-End and Device-End status to be presented together, with a single interrupt. However, this should be used with care as it implies the channel will remain busy, not being able to process I/O requests for other devices on the same channel. Therefore e.g. read commands should never use this technique, as the result will be presented by a single interrupt anyway.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM|hj:hhubh)}(hX5In order to minimize I/O overhead, a device driver should use the DOIO_REPORT_ALL only if the device can report intermediate interrupt information prior to device-end the device driver urgently relies on. In this case all I/O interruptions are presented to the device driver until final status is recognized.h]hX5In order to minimize I/O overhead, a device driver should use the DOIO_REPORT_ALL only if the device can report intermediate interrupt information prior to device-end the device driver urgently relies on. In this case all I/O interruptions are presented to the device driver until final status is recognized.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj:hhubh)}(hXIf a device is able to recover from asynchronously presented I/O errors, it can perform overlapping I/O using the DOIO_EARLY_NOTIFICATION flag. While some devices always report channel-end and device-end together, with a single interrupt, others present primary status (channel-end) when the channel is ready for the next I/O request and secondary status (device-end) when the data transmission has been completed at the device.h]hXIf a device is able to recover from asynchronously presented I/O errors, it can perform overlapping I/O using the DOIO_EARLY_NOTIFICATION flag. While some devices always report channel-end and device-end together, with a single interrupt, others present primary status (channel-end) when the channel is ready for the next I/O request and secondary status (device-end) when the data transmission has been completed at the device.}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj:hhubh)}(hAbove flag allows to exploit this feature, e.g. for communication devices that can handle lost data on the network to allow for enhanced I/O processing.h]hAbove flag allows to exploit this feature, e.g. for communication devices that can handle lost data on the network to allow for enhanced I/O processing.}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj:hhubh)}(hXUnless the channel subsystem at any time presents a secondary status interrupt, exploiting this feature will cause only primary status interrupts to be presented to the device driver while overlapping I/O is performed. When a secondary status without error (alert status) is presented, this indicates successful completion for all overlapping ccw_device_start() requests that have been issued since the last secondary (final) status.h]hXUnless the channel subsystem at any time presents a secondary status interrupt, exploiting this feature will cause only primary status interrupts to be presented to the device driver while overlapping I/O is performed. When a secondary status without error (alert status) is presented, this indicates successful completion for all overlapping ccw_device_start() requests that have been issued since the last secondary (final) status.}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj:hhubh)}(hXEChannel programs that intend to set the suspend flag on a channel command word (CCW) must start the I/O operation with the DOIO_ALLOW_SUSPEND option or the suspend flag will cause a channel program check. At the time the channel program becomes suspended an intermediate interrupt will be generated by the channel subsystem.h]hXEChannel programs that intend to set the suspend flag on a channel command word (CCW) must start the I/O operation with the DOIO_ALLOW_SUSPEND option or the suspend flag will cause a channel program check. At the time the channel program becomes suspended an intermediate interrupt will be generated by the channel subsystem.}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj:hhubh)}(h6ccw_device_resume() - Resume Channel Program Executionh]h6ccw_device_resume() - Resume Channel Program Execution}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj:hhubh)}(hXIf a device driver chooses to suspend the current channel program execution by setting the CCW suspend flag on a particular CCW, the channel program execution is suspended. In order to resume channel program execution the CIO layer provides the ccw_device_resume() routine.h]hXIf a device driver chooses to suspend the current channel program execution by setting the CCW suspend flag on a particular CCW, the channel program execution is suspended. In order to resume channel program execution the CIO layer provides the ccw_device_resume() routine.}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj:hhubj)}(h/int ccw_device_resume(struct ccw_device *cdev);h]h/int ccw_device_resume(struct ccw_device *cdev);}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhMhj:hhubj)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jhjubj)}(hhh]h}(h]h ]h"]h$]h&]colwidthK0uh1jhjubj)}(hhh]j)}(hhh](j)}(hhh]h)}(hcdevh]hcdev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h0ccw_device the resume operation is requested forh]h0ccw_device the resume operation is requested for}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]colsKuh1jhjubah}(h]h ]h"]h$]h&]uh1jhj:hhhhhNubh)}(h)The ccw_device_resume() function returns:h]h)The ccw_device_resume() function returns:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj:hhubj)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]colwidthK uh1jhjubj)}(hhh]h}(h]h ]h"]h$]h&]colwidthK.uh1jhjubj)}(hhh](j)}(hhh](j)}(hhh]h)}(hj h]h0}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj%ubah}(h]h ]h"]h$]h&]uh1jhj"ubj)}(hhh]h)}(h$suspended channel program is resumedh]h$suspended channel program is resumed}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj;ubah}(h]h ]h"]h$]h&]uh1jhj"ubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h-EBUSYh]h-EBUSY}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj[ubah}(h]h ]h"]h$]h&]uh1jhjXubj)}(hhh]h)}(hstatus pendingh]hstatus pending}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjrubah}(h]h ]h"]h$]h&]uh1jhjXubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h-ENODEVh]h-ENODEV}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h*cdev invalid or not-operational subchannelh]h*cdev invalid or not-operational subchannel}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h-EINVALh]h-EINVAL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hresume function not applicableh]hresume function not applicable}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h -ENOTCONNh]h -ENOTCONN}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h.there is no I/O request pending for completionh]h.there is no I/O request pending for completion}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]colsKuh1jhjubah}(h]h ]h"]h$]h&]uh1jhj:hhhhhNubh)}(h Usage Notes:h]h Usage Notes:}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj:hhubh)}(hhPlease have a look at the ccw_device_start() usage notes for more details on suspended channel programs.h]hhPlease have a look at the ccw_device_start() usage notes for more details on suspended channel programs.}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj:hhubh)}(h/ccw_device_halt() - Halt I/O Request Processingh]h/ccw_device_halt() - Halt I/O Request Processing}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj:hhubh)}(hSometimes a device driver might need a possibility to stop the processing of a long-running channel program or the device might require to initially issue a halt subchannel (HSCH) I/O command. For those purposes the ccw_device_halt() command is provided.h]hSometimes a device driver might need a possibility to stop the processing of a long-running channel program or the device might require to initially issue a halt subchannel (HSCH) I/O command. For those purposes the ccw_device_halt() command is provided.}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj:hhubh)}(hLccw_device_halt() must be called disabled and with the ccw device lock held.h]hLccw_device_halt() must be called disabled and with the ccw device lock held.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj:hhubj)}(hXint ccw_device_halt(struct ccw_device *cdev, unsigned long intparm);h]hXint ccw_device_halt(struct ccw_device *cdev, unsigned long intparm);}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhMhj:hhubj)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jhjubj)}(hhh]h}(h]h ]h"]h$]h&]colwidthK5uh1jhjubj)}(hhh](j)}(hhh](j)}(hhh]h)}(hcdevh]hcdev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h.ccw_device the halt operation is requested forh]h.ccw_device the halt operation is requested for}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(hintparmh]hintparm}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hinterruption parameter; value is only used if no I/O is outstanding, otherwise the intparm associated with the I/O request is returnedh]hinterruption parameter; value is only used if no I/O is outstanding, otherwise the intparm associated with the I/O request is returned}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]colsKuh1jhjubah}(h]h ]h"]h$]h&]uh1jhj:hhhhhNubh)}(h'The ccw_device_halt() function returns:h]h'The ccw_device_halt() function returns:}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj:hhubj)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jhjJubj)}(hhh]h}(h]h ]h"]h$]h&]colwidthK>uh1jhjJubj)}(hhh](j)}(hhh](j)}(hhh]h)}(hj h]h0}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjgubah}(h]h ]h"]h$]h&]uh1jhjdubj)}(hhh]h)}(hrequest successfully initiatedh]hrequest successfully initiated}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj}ubah}(h]h ]h"]h$]h&]uh1jhjdubeh}(h]h ]h"]h$]h&]uh1jhjaubj)}(hhh](j)}(hhh]h)}(h-EBUSYh]h-EBUSY}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h0the device is currently busy, or status pending.h]h0the device is currently busy, or status pending.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjaubj)}(hhh](j)}(hhh]h)}(h-ENODEVh]h-ENODEV}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h cdev invalid.h]h cdev invalid.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjaubj)}(hhh](j)}(hhh]h)}(h-EINVALh]h-EINVAL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj ubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h>The device is not operational or the ccw device is not online.h]h>The device is not operational or the ccw device is not online.}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj"ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjaubeh}(h]h ]h"]h$]h&]uh1jhjJubeh}(h]h ]h"]h$]h&]colsKuh1jhjGubah}(h]h ]h"]h$]h&]uh1jhj:hhhhhNubh)}(h Usage Notes:h]h Usage Notes:}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj:hhubh)}(hX@A device driver may write a never-ending channel program by writing a channel program that at its end loops back to its beginning by means of a transfer in channel (TIC) command (CCW_CMD_TIC). Usually this is performed by network device drivers by setting the PCI CCW flag (CCW_FLAG_PCI). Once this CCW is executed a program controlled interrupt (PCI) is generated. The device driver can then perform an appropriate action. Prior to interrupt of an outstanding read to a network device (with or without PCI flag) a ccw_device_halt() is required to end the pending operation.h]hX@A device driver may write a never-ending channel program by writing a channel program that at its end loops back to its beginning by means of a transfer in channel (TIC) command (CCW_CMD_TIC). Usually this is performed by network device drivers by setting the PCI CCW flag (CCW_FLAG_PCI). Once this CCW is executed a program controlled interrupt (PCI) is generated. The device driver can then perform an appropriate action. Prior to interrupt of an outstanding read to a network device (with or without PCI flag) a ccw_device_halt() is required to end the pending operation.}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj:hhubj)}(h5ccw_device_clear() - Terminage I/O Request Processingh]h5ccw_device_clear() - Terminage I/O Request Processing}hjnsbah}(h]h ]h"]h$]h&]jjuh1jhhhMhj:hhubh)}(hIn order to terminate all I/O processing at the subchannel, the clear subchannel (CSCH) command is used. It can be issued via ccw_device_clear().h]hIn order to terminate all I/O processing at the subchannel, the clear subchannel (CSCH) command is used. It can be issued via ccw_device_clear().}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj:hhubh)}(hMccw_device_clear() must be called disabled and with the ccw device lock held.h]hMccw_device_clear() must be called disabled and with the ccw device lock held.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj:hhubj)}(hEint ccw_device_clear(struct ccw_device *cdev, unsigned long intparm);h]hEint ccw_device_clear(struct ccw_device *cdev, unsigned long intparm);}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhMhj:hhubj)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jhjubj)}(hhh]h}(h]h ]h"]h$]h&]colwidthK/uh1jhjubj)}(hhh](j)}(hhh](j)}(hhh]h)}(hcdevh]hcdev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h/ccw_device the clear operation is requested forh]h/ccw_device the clear operation is requested for}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(hintparmh]hintparm}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h.interruption parameter (see ccw_device_halt())h]h.interruption parameter (see ccw_device_halt())}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]colsKuh1jhjubah}(h]h ]h"]h$]h&]uh1jhj:hhhhhNubh)}(h(The ccw_device_clear() function returns:h]h(The ccw_device_clear() function returns:}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj:hhubj)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jhjUubj)}(hhh]h}(h]h ]h"]h$]h&]colwidthK>uh1jhjUubj)}(hhh](j)}(hhh](j)}(hhh]h)}(hj h]h0}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjrubah}(h]h ]h"]h$]h&]uh1jhjoubj)}(hhh]h)}(hrequest successfully initiatedh]hrequest successfully initiated}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjoubeh}(h]h ]h"]h$]h&]uh1jhjlubj)}(hhh](j)}(hhh]h)}(h-ENODEVh]h-ENODEV}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h cdev invalidh]h cdev invalid}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjlubj)}(hhh](j)}(hhh]h)}(h-EINVALh]h-EINVAL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h>The device is not operational or the ccw device is not online.h]h>The device is not operational or the ccw device is not online.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjlubeh}(h]h ]h"]h$]h&]uh1jhjUubeh}(h]h ]h"]h$]h&]colsKuh1jhjRubah}(h]h ]h"]h$]h&]uh1jhj:hhhhhNubeh}(h]"overview-of-cds-interface-conceptsah ]h"]"overview of cds interface conceptsah$]h&]uh1hhjhhhhhKnubh)}(hhh](h)}(hMiscellaneous Support Routinesh]hMiscellaneous Support Routines}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj.hhhhhMubh)}(hhThis chapter describes various routines to be used in a Linux/390 device driver programming environment.h]hhThis chapter describes various routines to be used in a Linux/390 device driver programming environment.}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj.hhubh)}(hget_ccwdev_lock()h]hget_ccwdev_lock()}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM hj.hhubh)}(hdGet the address of the device specific lock. This is then used in spin_lock() / spin_unlock() calls.h]hdGet the address of the device specific lock. This is then used in spin_lock() / spin_unlock() calls.}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM hj.hhubj)}(h7__u8 ccw_device_get_path_mask(struct ccw_device *cdev);h]h7__u8 ccw_device_get_path_mask(struct ccw_device *cdev);}hjisbah}(h]h ]h"]h$]h&]jjuh1jhhhMhj.hhubh)}(h6Get the mask of the path currently available for cdev.h]h6Get the mask of the path currently available for cdev.}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj.hhubeh}(h]miscellaneous-support-routinesah ]h"]miscellaneous support routinesah$]h&]uh1hhjhhhhhMubeh}(h]6common-device-support-cds-for-linux-390-device-driversah ]h"]8common device support (cds) for linux/390 device driversah$]h&]uh1hhhhhhhhK]ubeh}(h]linux-for-s-390-and-zseriesah ]h"]linux for s/390 and zseriesah$]h&]uh1hhhhhhhhKubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(hN generatorN datestampN source_linkN source_urlN toc_backlinksjfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerjerror_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourceh _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}refids}nameids}(jjjjjjj7j4j+j(jju nametypes}(jjjj7j+juh}(jhjjEjjj4jj(j:jj.u footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}Rparse_messages]transform_messages] transformerN include_log] decorationNhhub.