Writing s390 channel device drivers
Cornelia
Huck
cornelia.huck@de.ibm.com
2007
IBM Corp.
This documentation is free software; you can redistribute
it and/or modify it under the terms of the GNU General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later
version.
This program is distributed in the hope that it will be
useful, but WITHOUT ANY WARRANTY; without even the implied
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public
License along with this program; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
MA 02111-1307 USA
For more details see the file COPYING in the source
distribution of Linux.
Introduction
This document describes the interfaces available for device drivers that
drive s390 based channel attached I/O devices. This includes interfaces for
interaction with the hardware and interfaces for interacting with the
common driver core. Those interfaces are provided by the s390 common I/O
layer.
The document assumes a familarity with the technical terms associated
with the s390 channel I/O architecture. For a description of this
architecture, please refer to the "z/Architecture: Principles of
Operation", IBM publication no. SA22-7832.
While most I/O devices on a s390 system are typically driven through the
channel I/O mechanism described here, there are various other methods
(like the diag interface). These are out of the scope of this document.
Some additional information can also be found in the kernel source
under Documentation/s390/driver-model.txt.
The ccw bus
The ccw bus typically contains the majority of devices available to
a s390 system. Named after the channel command word (ccw), the basic
command structure used to address its devices, the ccw bus contains
so-called channel attached devices. They are addressed via I/O
subchannels, visible on the css bus. A device driver for
channel-attached devices, however, will never interact with the
subchannel directly, but only via the I/O device on the ccw bus,
the ccw device.
I/O functions for channel-attached devices
Some hardware structures have been translated into C structures for use
by the common I/O layer and device drivers. For more information on
the hardware structures represented here, please consult the Principles
of Operation.
LINUX
Kernel Hackers Manual
July 2017
struct ccw1
9
4.1.27
struct ccw1
channel command word
Synopsis
struct ccw1 {
__u8 cmd_code;
__u8 flags;
__u16 count;
__u32 cda;
};
Members
cmd_code
command code
flags
flags, like IDA addressing, etc.
count
byte count
cda
data address
Description
The ccw is the basic structure to build channel programs that perform
operations with the device or the control unit. Only Format-1 channel
command words are supported.
LINUX
Kernel Hackers Manual
July 2017
struct erw
9
4.1.27
struct erw
extended report word
Synopsis
struct erw {
__u32 res0:3;
__u32 auth:1;
__u32 pvrf:1;
__u32 cpt:1;
__u32 fsavf:1;
__u32 cons:1;
__u32 scavf:1;
__u32 fsaf:1;
__u32 scnt:6;
__u32 res16:16;
};
Members
res0
reserved
auth
authorization check
pvrf
path-verification-required flag
cpt
channel-path timeout
fsavf
failing storage address validity flag
cons
concurrent sense
scavf
secondary ccw address validity flag
fsaf
failing storage address format
scnt
sense count, if cons == 1
res16
reserved
LINUX
Kernel Hackers Manual
July 2017
struct erw_eadm
9
4.1.27
struct erw_eadm
EADM Subchannel extended report word
Synopsis
struct erw_eadm {
__u32 b:1;
__u32 r:1;
};
Members
b
aob error
r
arsb error
LINUX
Kernel Hackers Manual
July 2017
struct sublog
9
4.1.27
struct sublog
subchannel logout area
Synopsis
struct sublog {
__u32 res0:1;
__u32 esf:7;
__u32 lpum:8;
__u32 arep:1;
__u32 fvf:5;
__u32 sacc:2;
__u32 termc:2;
__u32 devsc:1;
__u32 serr:1;
__u32 ioerr:1;
__u32 seqc:3;
};
Members
res0
reserved
esf
extended status flags
lpum
last path used mask
arep
ancillary report
fvf
field-validity flags
sacc
storage access code
termc
termination code
devsc
device-status check
serr
secondary error
ioerr
i/o-error alert
seqc
sequence code
LINUX
Kernel Hackers Manual
July 2017
struct esw0
9
4.1.27
struct esw0
Format 0 Extended Status Word (ESW)
Synopsis
struct esw0 {
struct sublog sublog;
struct erw erw;
__u32 faddr[2];
__u32 saddr;
};
Members
sublog
subchannel logout
erw
extended report word
faddr[2]
failing storage address
saddr
secondary ccw address
LINUX
Kernel Hackers Manual
July 2017
struct esw1
9
4.1.27
struct esw1
Format 1 Extended Status Word (ESW)
Synopsis
struct esw1 {
__u8 zero0;
__u8 lpum;
__u16 zero16;
struct erw erw;
__u32 zeros[3];
};
Members
zero0
reserved zeros
lpum
last path used mask
zero16
reserved zeros
erw
extended report word
zeros[3]
three fullwords of zeros
LINUX
Kernel Hackers Manual
July 2017
struct esw2
9
4.1.27
struct esw2
Format 2 Extended Status Word (ESW)
Synopsis
struct esw2 {
__u8 zero0;
__u8 lpum;
__u16 dcti;
struct erw erw;
__u32 zeros[3];
};
Members
zero0
reserved zeros
lpum
last path used mask
dcti
device-connect-time interval
erw
extended report word
zeros[3]
three fullwords of zeros
LINUX
Kernel Hackers Manual
July 2017
struct esw3
9
4.1.27
struct esw3
Format 3 Extended Status Word (ESW)
Synopsis
struct esw3 {
__u8 zero0;
__u8 lpum;
__u16 res;
struct erw erw;
__u32 zeros[3];
};
Members
zero0
reserved zeros
lpum
last path used mask
res
reserved
erw
extended report word
zeros[3]
three fullwords of zeros
LINUX
Kernel Hackers Manual
July 2017
struct esw_eadm
9
4.1.27
struct esw_eadm
EADM Subchannel Extended Status Word (ESW)
Synopsis
struct esw_eadm {
__u32 sublog;
struct erw_eadm erw;
};
Members
sublog
subchannel logout
erw
extended report word
LINUX
Kernel Hackers Manual
July 2017
struct irb
9
4.1.27
struct irb
interruption response block
Synopsis
struct irb {
union scsw scsw;
union esw;
__u8 ecw[32];
};
Members
scsw
subchannel status word
esw
extended status word
ecw[32]
extended control word
Description
The irb that is handed to the device driver when an interrupt occurs. For
solicited interrupts, the common I/O layer already performs checks whether
a field is valid; a field not being valid is always passed as 0.
If a unit check occurred, ecw may contain sense data; this is retrieved
by the common I/O layer itself if the device doesn't support concurrent
sense (so that the device driver never needs to perform basic sene itself).
For unsolicited interrupts, the irb is passed as-is (expect for sense data,
if applicable).
LINUX
Kernel Hackers Manual
July 2017
struct ciw
9
4.1.27
struct ciw
command information word (CIW) layout
Synopsis
struct ciw {
__u32 et:2;
__u32 reserved:2;
__u32 ct:4;
__u32 cmd:8;
__u32 count:16;
};
Members
et
entry type
reserved
reserved bits
ct
command type
cmd
command code
count
command count
LINUX
Kernel Hackers Manual
July 2017
struct ccw_dev_id
9
4.1.27
struct ccw_dev_id
unique identifier for ccw devices
Synopsis
struct ccw_dev_id {
u8 ssid;
u16 devno;
};
Members
ssid
subchannel set id
devno
device number
Description
This structure is not directly based on any hardware structure. The
hardware identifies a device by its device number and its subchannel,
which is in turn identified by its id. In order to get a unique identifier
for ccw devices across subchannel sets, struct ccw_dev_id has been
introduced.
LINUX
Kernel Hackers Manual
July 2017
ccw_dev_id_is_equal
9
4.1.27
ccw_dev_id_is_equal
compare two ccw_dev_ids
Synopsis
int ccw_dev_id_is_equal
struct ccw_dev_id * dev_id1
struct ccw_dev_id * dev_id2
Arguments
dev_id1
a ccw_dev_id
dev_id2
another ccw_dev_id
Returns
1 if the two structures are equal field-by-field,
0 if not.
Context
any
ccw devices
Devices that want to initiate channel I/O need to attach to the ccw bus.
Interaction with the driver core is done via the common I/O layer, which
provides the abstractions of ccw devices and ccw device drivers.
The functions that initiate or terminate channel I/O all act upon a
ccw device structure. Device drivers must not bypass those functions
or strange side effects may happen.
LINUX
Kernel Hackers Manual
July 2017
struct ccw_device
9
4.1.27
struct ccw_device
channel attached device
Synopsis
struct ccw_device {
spinlock_t * ccwlock;
struct ccw_device_id id;
struct ccw_driver * drv;
struct device dev;
int online;
void (* handler) (struct ccw_device *, unsigned long, struct irb *);
};
Members
ccwlock
pointer to device lock
id
id of this device
drv
ccw driver for this device
dev
embedded device structure
online
online status of device
handler
interrupt handler
Description
handler is a member of the device rather than the driver since a driver
can have different interrupt handlers for different ccw devices
(multi-subchannel drivers).
LINUX
Kernel Hackers Manual
July 2017
struct ccw_driver
9
4.1.27
struct ccw_driver
device driver for channel attached devices
Synopsis
struct ccw_driver {
struct ccw_device_id * ids;
int (* probe) (struct ccw_device *);
void (* remove) (struct ccw_device *);
int (* set_online) (struct ccw_device *);
int (* set_offline) (struct ccw_device *);
int (* notify) (struct ccw_device *, int);
void (* path_event) (struct ccw_device *, int *);
void (* shutdown) (struct ccw_device *);
int (* prepare) (struct ccw_device *);
void (* complete) (struct ccw_device *);
int (* freeze) (struct ccw_device *);
int (* thaw) (struct ccw_device *);
int (* restore) (struct ccw_device *);
enum uc_todo (* uc_handler) (struct ccw_device *, struct irb *);
struct device_driver driver;
enum interruption_class int_class;
};
Members
ids
ids supported by this driver
probe
function called on probe
remove
function called on remove
set_online
called when setting device online
set_offline
called when setting device offline
notify
notify driver of device state changes
path_event
notify driver of channel path events
shutdown
called at device shutdown
prepare
prepare for pm state transition
complete
undo work done in prepare
freeze
callback for freezing during hibernation snapshotting
thaw
undo work done in freeze
restore
callback for restoring after hibernation
uc_handler
callback for unit check handler
driver
embedded device driver structure
int_class
interruption class to use for accounting interrupts
LINUX
Kernel Hackers Manual
July 2017
ccw_device_set_offline
9
4.1.27
ccw_device_set_offline
disable a ccw device for I/O
Synopsis
int ccw_device_set_offline
struct ccw_device * cdev
Arguments
cdev
target ccw device
Description
This function calls the driver's set_offline function for cdev, if
given, and then disables cdev.
Returns
0 on success and a negative error value on failure.
Context
enabled, ccw device lock not held
LINUX
Kernel Hackers Manual
July 2017
ccw_device_set_online
9
4.1.27
ccw_device_set_online
enable a ccw device for I/O
Synopsis
int ccw_device_set_online
struct ccw_device * cdev
Arguments
cdev
target ccw device
Description
This function first enables cdev and then calls the driver's set_online
function for cdev, if given. If set_online returns an error, cdev is
disabled again.
Returns
0 on success and a negative error value on failure.
Context
enabled, ccw device lock not held
LINUX
Kernel Hackers Manual
July 2017
get_ccwdev_by_dev_id
9
4.1.27
get_ccwdev_by_dev_id
obtain device from a ccw device id
Synopsis
struct ccw_device * get_ccwdev_by_dev_id
struct ccw_dev_id * dev_id
Arguments
dev_id
id of the device to be searched
Description
This function searches all devices attached to the ccw bus for a device
matching dev_id.
Returns
If a device is found its reference count is increased and returned;
else NULL is returned.
LINUX
Kernel Hackers Manual
July 2017
get_ccwdev_by_busid
9
4.1.27
get_ccwdev_by_busid
obtain device from a bus id
Synopsis
struct ccw_device * get_ccwdev_by_busid
struct ccw_driver * cdrv
const char * bus_id
Arguments
cdrv
driver the device is owned by
bus_id
bus id of the device to be searched
Description
This function searches all devices owned by cdrv for a device with a bus
id matching bus_id.
Returns
If a match is found, its reference count of the found device is increased
and it is returned; else NULL is returned.
LINUX
Kernel Hackers Manual
July 2017
ccw_driver_register
9
4.1.27
ccw_driver_register
register a ccw driver
Synopsis
int ccw_driver_register
struct ccw_driver * cdriver
Arguments
cdriver
driver to be registered
Description
This function is mainly a wrapper around driver_register.
Returns
0 on success and a negative error value on failure.
LINUX
Kernel Hackers Manual
July 2017
ccw_driver_unregister
9
4.1.27
ccw_driver_unregister
deregister a ccw driver
Synopsis
void ccw_driver_unregister
struct ccw_driver * cdriver
Arguments
cdriver
driver to be deregistered
Description
This function is mainly a wrapper around driver_unregister.
LINUX
Kernel Hackers Manual
July 2017
ccw_device_siosl
9
4.1.27
ccw_device_siosl
initiate logging
Synopsis
int ccw_device_siosl
struct ccw_device * cdev
Arguments
cdev
ccw device
Description
This function is used to invoke model-dependent logging within the channel
subsystem.
LINUX
Kernel Hackers Manual
July 2017
ccw_device_set_options_mask
9
4.1.27
ccw_device_set_options_mask
set some options and unset the rest
Synopsis
int ccw_device_set_options_mask
struct ccw_device * cdev
unsigned long flags
Arguments
cdev
device for which the options are to be set
flags
options to be set
Description
All flags specified in flags are set, all flags not specified in flags
are cleared.
Returns
0 on success, -EINVAL on an invalid flag combination.
LINUX
Kernel Hackers Manual
July 2017
ccw_device_set_options
9
4.1.27
ccw_device_set_options
set some options
Synopsis
int ccw_device_set_options
struct ccw_device * cdev
unsigned long flags
Arguments
cdev
device for which the options are to be set
flags
options to be set
Description
All flags specified in flags are set, the remainder is left untouched.
Returns
0 on success, -EINVAL if an invalid flag combination would ensue.
LINUX
Kernel Hackers Manual
July 2017
ccw_device_clear_options
9
4.1.27
ccw_device_clear_options
clear some options
Synopsis
void ccw_device_clear_options
struct ccw_device * cdev
unsigned long flags
Arguments
cdev
device for which the options are to be cleared
flags
options to be cleared
Description
All flags specified in flags are cleared, the remainder is left untouched.
LINUX
Kernel Hackers Manual
July 2017
ccw_device_is_pathgroup
9
4.1.27
ccw_device_is_pathgroup
determine if paths to this device are grouped
Synopsis
int ccw_device_is_pathgroup
struct ccw_device * cdev
Arguments
cdev
ccw device
Description
Return non-zero if there is a path group, zero otherwise.
LINUX
Kernel Hackers Manual
July 2017
ccw_device_is_multipath
9
4.1.27
ccw_device_is_multipath
determine if device is operating in multipath mode
Synopsis
int ccw_device_is_multipath
struct ccw_device * cdev
Arguments
cdev
ccw device
Description
Return non-zero if device is operating in multipath mode, zero otherwise.
LINUX
Kernel Hackers Manual
July 2017
ccw_device_clear
9
4.1.27
ccw_device_clear
terminate I/O request processing
Synopsis
int ccw_device_clear
struct ccw_device * cdev
unsigned long intparm
Arguments
cdev
target ccw device
intparm
interruption parameter; value is only used if no I/O is
outstanding, otherwise the intparm associated with the I/O request
is returned
Description
ccw_device_clear calls csch on cdev's subchannel.
Returns
0 on success,
-ENODEV on device not operational,
-EINVAL on invalid device state.
Context
Interrupts disabled, ccw device lock held
LINUX
Kernel Hackers Manual
July 2017
ccw_device_start_key
9
4.1.27
ccw_device_start_key
start a s390 channel program with key
Synopsis
int ccw_device_start_key
struct ccw_device * cdev
struct ccw1 * cpa
unsigned long intparm
__u8 lpm
__u8 key
unsigned long flags
Arguments
cdev
target ccw device
cpa
logical start address of channel program
intparm
user specific interruption parameter; will be presented back to
cdev's interrupt handler. Allows a device driver to associate
the interrupt with a particular I/O request.
lpm
defines the channel path to be used for a specific I/O request. A
value of 0 will make cio use the opm.
key
storage key to be used for the I/O
flags
additional flags; defines the action to be performed for I/O
processing.
Description
Start a S/390 channel program. When the interrupt arrives, the
IRQ handler is called, either immediately, delayed (dev-end missing,
or sense required) or never (no IRQ handler registered).
Returns
0, if the operation was successful;
-EBUSY, if the device is busy, or status pending;
-EACCES, if no path specified in lpm is operational;
-ENODEV, if the device is not operational.
Context
Interrupts disabled, ccw device lock held
LINUX
Kernel Hackers Manual
July 2017
ccw_device_start_timeout_key
9
4.1.27
ccw_device_start_timeout_key
start a s390 channel program with timeout and key
Synopsis
int ccw_device_start_timeout_key
struct ccw_device * cdev
struct ccw1 * cpa
unsigned long intparm
__u8 lpm
__u8 key
unsigned long flags
int expires
Arguments
cdev
target ccw device
cpa
logical start address of channel program
intparm
user specific interruption parameter; will be presented back to
cdev's interrupt handler. Allows a device driver to associate
the interrupt with a particular I/O request.
lpm
defines the channel path to be used for a specific I/O request. A
value of 0 will make cio use the opm.
key
storage key to be used for the I/O
flags
additional flags; defines the action to be performed for I/O
processing.
expires
timeout value in jiffies
Description
Start a S/390 channel program. When the interrupt arrives, the
IRQ handler is called, either immediately, delayed (dev-end missing,
or sense required) or never (no IRQ handler registered).
This function notifies the device driver if the channel program has not
completed during the time specified by expires. If a timeout occurs, the
channel program is terminated via xsch, hsch or csch, and the device's
interrupt handler will be called with an irb containing ERR_PTR(-ETIMEDOUT).
Returns
0, if the operation was successful;
-EBUSY, if the device is busy, or status pending;
-EACCES, if no path specified in lpm is operational;
-ENODEV, if the device is not operational.
Context
Interrupts disabled, ccw device lock held
LINUX
Kernel Hackers Manual
July 2017
ccw_device_start
9
4.1.27
ccw_device_start
start a s390 channel program
Synopsis
int ccw_device_start
struct ccw_device * cdev
struct ccw1 * cpa
unsigned long intparm
__u8 lpm
unsigned long flags
Arguments
cdev
target ccw device
cpa
logical start address of channel program
intparm
user specific interruption parameter; will be presented back to
cdev's interrupt handler. Allows a device driver to associate
the interrupt with a particular I/O request.
lpm
defines the channel path to be used for a specific I/O request. A
value of 0 will make cio use the opm.
flags
additional flags; defines the action to be performed for I/O
processing.
Description
Start a S/390 channel program. When the interrupt arrives, the
IRQ handler is called, either immediately, delayed (dev-end missing,
or sense required) or never (no IRQ handler registered).
Returns
0, if the operation was successful;
-EBUSY, if the device is busy, or status pending;
-EACCES, if no path specified in lpm is operational;
-ENODEV, if the device is not operational.
Context
Interrupts disabled, ccw device lock held
LINUX
Kernel Hackers Manual
July 2017
ccw_device_start_timeout
9
4.1.27
ccw_device_start_timeout
start a s390 channel program with timeout
Synopsis
int ccw_device_start_timeout
struct ccw_device * cdev
struct ccw1 * cpa
unsigned long intparm
__u8 lpm
unsigned long flags
int expires
Arguments
cdev
target ccw device
cpa
logical start address of channel program
intparm
user specific interruption parameter; will be presented back to
cdev's interrupt handler. Allows a device driver to associate
the interrupt with a particular I/O request.
lpm
defines the channel path to be used for a specific I/O request. A
value of 0 will make cio use the opm.
flags
additional flags; defines the action to be performed for I/O
processing.
expires
timeout value in jiffies
Description
Start a S/390 channel program. When the interrupt arrives, the
IRQ handler is called, either immediately, delayed (dev-end missing,
or sense required) or never (no IRQ handler registered).
This function notifies the device driver if the channel program has not
completed during the time specified by expires. If a timeout occurs, the
channel program is terminated via xsch, hsch or csch, and the device's
interrupt handler will be called with an irb containing ERR_PTR(-ETIMEDOUT).
Returns
0, if the operation was successful;
-EBUSY, if the device is busy, or status pending;
-EACCES, if no path specified in lpm is operational;
-ENODEV, if the device is not operational.
Context
Interrupts disabled, ccw device lock held
LINUX
Kernel Hackers Manual
July 2017
ccw_device_halt
9
4.1.27
ccw_device_halt
halt I/O request processing
Synopsis
int ccw_device_halt
struct ccw_device * cdev
unsigned long intparm
Arguments
cdev
target ccw device
intparm
interruption parameter; value is only used if no I/O is
outstanding, otherwise the intparm associated with the I/O request
is returned
Description
ccw_device_halt calls hsch on cdev's subchannel.
Returns
0 on success,
-ENODEV on device not operational,
-EINVAL on invalid device state,
-EBUSY on device busy or interrupt pending.
Context
Interrupts disabled, ccw device lock held
LINUX
Kernel Hackers Manual
July 2017
ccw_device_resume
9
4.1.27
ccw_device_resume
resume channel program execution
Synopsis
int ccw_device_resume
struct ccw_device * cdev
Arguments
cdev
target ccw device
Description
ccw_device_resume calls rsch on cdev's subchannel.
Returns
0 on success,
-ENODEV on device not operational,
-EINVAL on invalid device state,
-EBUSY on device busy or interrupt pending.
Context
Interrupts disabled, ccw device lock held
LINUX
Kernel Hackers Manual
July 2017
ccw_device_get_ciw
9
4.1.27
ccw_device_get_ciw
Search for CIW command in extended sense data.
Synopsis
struct ciw * ccw_device_get_ciw
struct ccw_device * cdev
__u32 ct
Arguments
cdev
ccw device to inspect
ct
command type to look for
Description
During SenseID, command information words (CIWs) describing special
commands available to the device may have been stored in the extended
sense data. This function searches for CIWs of a specified command
type in the extended sense data.
Returns
NULL if no extended sense data has been stored or if no CIW of the
specified command type could be found,
else a pointer to the CIW of the specified command type.
LINUX
Kernel Hackers Manual
July 2017
ccw_device_get_path_mask
9
4.1.27
ccw_device_get_path_mask
get currently available paths
Synopsis
__u8 ccw_device_get_path_mask
struct ccw_device * cdev
Arguments
cdev
ccw device to be queried
Returns
0 if no subchannel for the device is available,
else the mask of currently available paths for the ccw device's subchannel.
LINUX
Kernel Hackers Manual
July 2017
ccw_device_get_chp_desc
9
4.1.27
ccw_device_get_chp_desc
return newly allocated channel-path descriptor
Synopsis
struct channel_path_desc * ccw_device_get_chp_desc
struct ccw_device * cdev
int chp_idx
Arguments
cdev
device to obtain the descriptor for
chp_idx
index of the channel path
Description
On success return a newly allocated copy of the channel-path description
data associated with the given channel path. Return NULL on error.
LINUX
Kernel Hackers Manual
July 2017
ccw_device_get_id
9
4.1.27
ccw_device_get_id
obtain a ccw device id
Synopsis
void ccw_device_get_id
struct ccw_device * cdev
struct ccw_dev_id * dev_id
Arguments
cdev
device to obtain the id for
dev_id
where to fill in the values
LINUX
Kernel Hackers Manual
July 2017
ccw_device_tm_start_key
9
4.1.27
ccw_device_tm_start_key
perform start function
Synopsis
int ccw_device_tm_start_key
struct ccw_device * cdev
struct tcw * tcw
unsigned long intparm
u8 lpm
u8 key
Arguments
cdev
ccw device on which to perform the start function
tcw
transport-command word to be started
intparm
user defined parameter to be passed to the interrupt handler
lpm
mask of paths to use
key
storage key to use for storage access
Description
Start the tcw on the given ccw device. Return zero on success, non-zero
otherwise.
LINUX
Kernel Hackers Manual
July 2017
ccw_device_tm_start_timeout_key
9
4.1.27
ccw_device_tm_start_timeout_key
perform start function
Synopsis
int ccw_device_tm_start_timeout_key
struct ccw_device * cdev
struct tcw * tcw
unsigned long intparm
u8 lpm
u8 key
int expires
Arguments
cdev
ccw device on which to perform the start function
tcw
transport-command word to be started
intparm
user defined parameter to be passed to the interrupt handler
lpm
mask of paths to use
key
storage key to use for storage access
expires
time span in jiffies after which to abort request
Description
Start the tcw on the given ccw device. Return zero on success, non-zero
otherwise.
LINUX
Kernel Hackers Manual
July 2017
ccw_device_tm_start
9
4.1.27
ccw_device_tm_start
perform start function
Synopsis
int ccw_device_tm_start
struct ccw_device * cdev
struct tcw * tcw
unsigned long intparm
u8 lpm
Arguments
cdev
ccw device on which to perform the start function
tcw
transport-command word to be started
intparm
user defined parameter to be passed to the interrupt handler
lpm
mask of paths to use
Description
Start the tcw on the given ccw device. Return zero on success, non-zero
otherwise.
LINUX
Kernel Hackers Manual
July 2017
ccw_device_tm_start_timeout
9
4.1.27
ccw_device_tm_start_timeout
perform start function
Synopsis
int ccw_device_tm_start_timeout
struct ccw_device * cdev
struct tcw * tcw
unsigned long intparm
u8 lpm
int expires
Arguments
cdev
ccw device on which to perform the start function
tcw
transport-command word to be started
intparm
user defined parameter to be passed to the interrupt handler
lpm
mask of paths to use
expires
time span in jiffies after which to abort request
Description
Start the tcw on the given ccw device. Return zero on success, non-zero
otherwise.
LINUX
Kernel Hackers Manual
July 2017
ccw_device_get_mdc
9
4.1.27
ccw_device_get_mdc
accumulate max data count
Synopsis
int ccw_device_get_mdc
struct ccw_device * cdev
u8 mask
Arguments
cdev
ccw device for which the max data count is accumulated
mask
mask of paths to use
Description
Return the number of 64K-bytes blocks all paths at least support
for a transport command. Return values <= 0 indicate failures.
LINUX
Kernel Hackers Manual
July 2017
ccw_device_tm_intrg
9
4.1.27
ccw_device_tm_intrg
perform interrogate function
Synopsis
int ccw_device_tm_intrg
struct ccw_device * cdev
Arguments
cdev
ccw device on which to perform the interrogate function
Description
Perform an interrogate function on the given ccw device. Return zero on
success, non-zero otherwise.
LINUX
Kernel Hackers Manual
July 2017
ccw_device_get_schid
9
4.1.27
ccw_device_get_schid
obtain a subchannel id
Synopsis
void ccw_device_get_schid
struct ccw_device * cdev
struct subchannel_id * schid
Arguments
cdev
device to obtain the id for
schid
where to fill in the values
The channel-measurement facility
The channel-measurement facility provides a means to collect
measurement data which is made available by the channel subsystem
for each channel attached device.
.//arch/s390/include/asm/cmb.h
Document generation inconsistency
Oops
The template for this document tried to insert
the structured comment from the file
.//arch/s390/include/asm/cmb.h at this point,
but none was found.
This dummy section is inserted to allow
generation to continue.
LINUX
Kernel Hackers Manual
July 2017
enable_cmf
9
4.1.27
enable_cmf
switch on the channel measurement for a specific device
Synopsis
int enable_cmf
struct ccw_device * cdev
Arguments
cdev
The ccw device to be enabled
Description
Returns 0 for success or a negative error value.
Context
non-atomic
LINUX
Kernel Hackers Manual
July 2017
disable_cmf
9
4.1.27
disable_cmf
switch off the channel measurement for a specific device
Synopsis
int disable_cmf
struct ccw_device * cdev
Arguments
cdev
The ccw device to be disabled
Description
Returns 0 for success or a negative error value.
Context
non-atomic
LINUX
Kernel Hackers Manual
July 2017
cmf_read
9
4.1.27
cmf_read
read one value from the current channel measurement block
Synopsis
u64 cmf_read
struct ccw_device * cdev
int index
Arguments
cdev
the channel to be read
index
the index of the value to be read
Description
Returns the value read or 0 if the value cannot be read.
Context
any
LINUX
Kernel Hackers Manual
July 2017
cmf_readall
9
4.1.27
cmf_readall
read the current channel measurement block
Synopsis
int cmf_readall
struct ccw_device * cdev
struct cmbdata * data
Arguments
cdev
the channel to be read
data
a pointer to a data block that will be filled
Description
Returns 0 on success, a negative error value otherwise.
Context
any
The ccwgroup bus
The ccwgroup bus only contains artificial devices, created by the user.
Many networking devices (e.g. qeth) are in fact composed of several
ccw devices (like read, write and data channel for qeth). The
ccwgroup bus provides a mechanism to create a meta-device which
contains those ccw devices as slave devices and can be associated
with the netdevice.
ccw group devices
LINUX
Kernel Hackers Manual
July 2017
struct ccwgroup_device
9
4.1.27
struct ccwgroup_device
ccw group device
Synopsis
struct ccwgroup_device {
enum state;
unsigned int count;
struct device dev;
struct work_struct ungroup_work;
struct ccw_device * cdev[0];
};
Members
state
online/offline state
count
number of attached slave devices
dev
embedded device structure
ungroup_work
work to be done when a ccwgroup notifier has action
type BUS_NOTIFY_UNBIND_DRIVER
cdev[0]
variable number of slave devices, allocated as needed
LINUX
Kernel Hackers Manual
July 2017
struct ccwgroup_driver
9
4.1.27
struct ccwgroup_driver
driver for ccw group devices
Synopsis
struct ccwgroup_driver {
int (* setup) (struct ccwgroup_device *);
void (* remove) (struct ccwgroup_device *);
int (* set_online) (struct ccwgroup_device *);
int (* set_offline) (struct ccwgroup_device *);
void (* shutdown) (struct ccwgroup_device *);
int (* prepare) (struct ccwgroup_device *);
void (* complete) (struct ccwgroup_device *);
int (* freeze) (struct ccwgroup_device *);
int (* thaw) (struct ccwgroup_device *);
int (* restore) (struct ccwgroup_device *);
struct device_driver driver;
};
Members
setup
function called during device creation to setup the device
remove
function called on remove
set_online
function called when device is set online
set_offline
function called when device is set offline
shutdown
function called when device is shut down
prepare
prepare for pm state transition
complete
undo work done in prepare
freeze
callback for freezing during hibernation snapshotting
thaw
undo work done in freeze
restore
callback for restoring after hibernation
driver
embedded driver structure
LINUX
Kernel Hackers Manual
July 2017
ccwgroup_set_online
9
4.1.27
ccwgroup_set_online
enable a ccwgroup device
Synopsis
int ccwgroup_set_online
struct ccwgroup_device * gdev
Arguments
gdev
target ccwgroup device
Description
This function attempts to put the ccwgroup device into the online state.
Returns
0 on success and a negative error value on failure.
LINUX
Kernel Hackers Manual
July 2017
ccwgroup_set_offline
9
4.1.27
ccwgroup_set_offline
disable a ccwgroup device
Synopsis
int ccwgroup_set_offline
struct ccwgroup_device * gdev
Arguments
gdev
target ccwgroup device
Description
This function attempts to put the ccwgroup device into the offline state.
Returns
0 on success and a negative error value on failure.
LINUX
Kernel Hackers Manual
July 2017
ccwgroup_create_dev
9
4.1.27
ccwgroup_create_dev
create and register a ccw group device
Synopsis
int ccwgroup_create_dev
struct device * parent
struct ccwgroup_driver * gdrv
int num_devices
const char * buf
Arguments
parent
parent device for the new device
gdrv
driver for the new group device
num_devices
number of slave devices
buf
buffer containing comma separated bus ids of slave devices
Description
Create and register a new ccw group device as a child of parent. Slave
devices are obtained from the list of bus ids given in buf.
Returns
0 on success and an error code on failure.
Context
non-atomic
LINUX
Kernel Hackers Manual
July 2017
ccwgroup_driver_register
9
4.1.27
ccwgroup_driver_register
register a ccw group driver
Synopsis
int ccwgroup_driver_register
struct ccwgroup_driver * cdriver
Arguments
cdriver
driver to be registered
Description
This function is mainly a wrapper around driver_register.
LINUX
Kernel Hackers Manual
July 2017
ccwgroup_driver_unregister
9
4.1.27
ccwgroup_driver_unregister
deregister a ccw group driver
Synopsis
void ccwgroup_driver_unregister
struct ccwgroup_driver * cdriver
Arguments
cdriver
driver to be deregistered
Description
This function is mainly a wrapper around driver_unregister.
LINUX
Kernel Hackers Manual
July 2017
ccwgroup_probe_ccwdev
9
4.1.27
ccwgroup_probe_ccwdev
probe function for slave devices
Synopsis
int ccwgroup_probe_ccwdev
struct ccw_device * cdev
Arguments
cdev
ccw device to be probed
Description
This is a dummy probe function for ccw devices that are slave devices in
a ccw group device.
Returns
always 0
LINUX
Kernel Hackers Manual
July 2017
ccwgroup_remove_ccwdev
9
4.1.27
ccwgroup_remove_ccwdev
remove function for slave devices
Synopsis
void ccwgroup_remove_ccwdev
struct ccw_device * cdev
Arguments
cdev
ccw device to be removed
Description
This is a remove function for ccw devices that are slave devices in a ccw
group device. It sets the ccw device offline and also deregisters the
embedding ccw group device.
Generic interfaces
Some interfaces are available to other drivers that do not necessarily
have anything to do with the busses described above, but still are
indirectly using basic infrastructure in the common I/O layer.
One example is the support for adapter interrupts.
LINUX
Kernel Hackers Manual
July 2017
register_adapter_interrupt
9
4.1.27
register_adapter_interrupt
register adapter interrupt handler
Synopsis
int register_adapter_interrupt
struct airq_struct * airq
Arguments
airq
pointer to adapter interrupt descriptor
Description
Returns 0 on success, or -EINVAL.
LINUX
Kernel Hackers Manual
July 2017
unregister_adapter_interrupt
9
4.1.27
unregister_adapter_interrupt
unregister adapter interrupt handler
Synopsis
void unregister_adapter_interrupt
struct airq_struct * airq
Arguments
airq
pointer to adapter interrupt descriptor
LINUX
Kernel Hackers Manual
July 2017
airq_iv_create
9
4.1.27
airq_iv_create
create an interrupt vector
Synopsis
struct airq_iv * airq_iv_create
unsigned long bits
unsigned long flags
Arguments
bits
number of bits in the interrupt vector
flags
allocation flags
Description
Returns a pointer to an interrupt vector structure
LINUX
Kernel Hackers Manual
July 2017
airq_iv_release
9
4.1.27
airq_iv_release
release an interrupt vector
Synopsis
void airq_iv_release
struct airq_iv * iv
Arguments
iv
pointer to interrupt vector structure
LINUX
Kernel Hackers Manual
July 2017
airq_iv_alloc
9
4.1.27
airq_iv_alloc
allocate irq bits from an interrupt vector
Synopsis
unsigned long airq_iv_alloc
struct airq_iv * iv
unsigned long num
Arguments
iv
pointer to an interrupt vector structure
num
number of consecutive irq bits to allocate
Description
Returns the bit number of the first irq in the allocated block of irqs,
or -1UL if no bit is available or the AIRQ_IV_ALLOC flag has not been
specified
LINUX
Kernel Hackers Manual
July 2017
airq_iv_free
9
4.1.27
airq_iv_free
free irq bits of an interrupt vector
Synopsis
void airq_iv_free
struct airq_iv * iv
unsigned long bit
unsigned long num
Arguments
iv
pointer to interrupt vector structure
bit
number of the first irq bit to free
num
number of consecutive irq bits to free
LINUX
Kernel Hackers Manual
July 2017
airq_iv_scan
9
4.1.27
airq_iv_scan
scan interrupt vector for non-zero bits
Synopsis
unsigned long airq_iv_scan
struct airq_iv * iv
unsigned long start
unsigned long end
Arguments
iv
pointer to interrupt vector structure
start
bit number to start the search
end
bit number to end the search
Description
Returns the bit number of the next non-zero interrupt bit, or
-1UL if the scan completed without finding any more any non-zero bits.