diff options
Diffstat (limited to 'Documentation/s390/cds.txt')
-rw-r--r-- | Documentation/s390/cds.txt | 64 |
1 files changed, 30 insertions, 34 deletions
diff --git a/Documentation/s390/cds.txt b/Documentation/s390/cds.txt index d80e5733827d..05a2b4f7e38f 100644 --- a/Documentation/s390/cds.txt +++ b/Documentation/s390/cds.txt | |||
@@ -98,7 +98,7 @@ The following chapters describe the I/O related interface routines the | |||
98 | Linux/390 common device support (CDS) provides to allow for device specific | 98 | Linux/390 common device support (CDS) provides to allow for device specific |
99 | driver implementations on the IBM ESA/390 hardware platform. Those interfaces | 99 | driver implementations on the IBM ESA/390 hardware platform. Those interfaces |
100 | intend to provide the functionality required by every device driver | 100 | intend to provide the functionality required by every device driver |
101 | implementaion to allow to drive a specific hardware device on the ESA/390 | 101 | implementation to allow to drive a specific hardware device on the ESA/390 |
102 | platform. Some of the interface routines are specific to Linux/390 and some | 102 | platform. Some of the interface routines are specific to Linux/390 and some |
103 | of them can be found on other Linux platforms implementations too. | 103 | of them can be found on other Linux platforms implementations too. |
104 | Miscellaneous function prototypes, data declarations, and macro definitions | 104 | Miscellaneous function prototypes, data declarations, and macro definitions |
@@ -114,7 +114,7 @@ the ESA/390 architecture has implemented a so called channel subsystem, that | |||
114 | provides a unified view of the devices physically attached to the systems. | 114 | provides a unified view of the devices physically attached to the systems. |
115 | Though the ESA/390 hardware platform knows about a huge variety of different | 115 | Though the ESA/390 hardware platform knows about a huge variety of different |
116 | peripheral attachments like disk devices (aka. DASDs), tapes, communication | 116 | peripheral attachments like disk devices (aka. DASDs), tapes, communication |
117 | controllers, etc. they can all by accessed by a well defined access method and | 117 | controllers, etc. they can all be accessed by a well defined access method and |
118 | they are presenting I/O completion a unified way : I/O interruptions. Every | 118 | they are presenting I/O completion a unified way : I/O interruptions. Every |
119 | single device is uniquely identified to the system by a so called subchannel, | 119 | single device is uniquely identified to the system by a so called subchannel, |
120 | where the ESA/390 architecture allows for 64k devices be attached. | 120 | where the ESA/390 architecture allows for 64k devices be attached. |
@@ -174,14 +174,10 @@ read_dev_chars() - Read Device Characteristics | |||
174 | 174 | ||
175 | This routine returns the characteristics for the device specified. | 175 | This routine returns the characteristics for the device specified. |
176 | 176 | ||
177 | The function is meant to be called with an irq handler in place; that is, | 177 | The function is meant to be called with the device already enabled; that is, |
178 | at earliest during set_online() processing. | 178 | at earliest during set_online() processing. |
179 | 179 | ||
180 | While the request is processed synchronously, the device interrupt | 180 | The ccw_device must not be locked prior to calling read_dev_chars(). |
181 | handler is called for final ending status. In case of error situations the | ||
182 | interrupt handler may recover appropriately. The device irq handler can | ||
183 | recognize the corresponding interrupts by the interruption parameter be | ||
184 | 0x00524443. The ccw_device must not be locked prior to calling read_dev_chars(). | ||
185 | 181 | ||
186 | The function may be called enabled or disabled. | 182 | The function may be called enabled or disabled. |
187 | 183 | ||
@@ -342,7 +338,7 @@ DOIO_REPORT_ALL - report all interrupt conditions | |||
342 | The ccw_device_start() function returns : | 338 | The ccw_device_start() function returns : |
343 | 339 | ||
344 | 0 - successful completion or request successfully initiated | 340 | 0 - successful completion or request successfully initiated |
345 | -EBUSY - The device is currently processing a previous I/O request, or ther is | 341 | -EBUSY - The device is currently processing a previous I/O request, or there is |
346 | a status pending at the device. | 342 | a status pending at the device. |
347 | -ENODEV - cdev is invalid, the device is not operational or the ccw_device is | 343 | -ENODEV - cdev is invalid, the device is not operational or the ccw_device is |
348 | not online. | 344 | not online. |
@@ -365,7 +361,7 @@ first: | |||
365 | -EIO: the common I/O layer terminated the request due to an error state | 361 | -EIO: the common I/O layer terminated the request due to an error state |
366 | 362 | ||
367 | If the concurrent sense flag in the extended status word in the irb is set, the | 363 | If the concurrent sense flag in the extended status word in the irb is set, the |
368 | field irb->scsw.count describes the numer of device specific sense bytes | 364 | field irb->scsw.count describes the number of device specific sense bytes |
369 | available in the extended control word irb->scsw.ecw[0]. No device sensing by | 365 | available in the extended control word irb->scsw.ecw[0]. No device sensing by |
370 | the device driver itself is required. | 366 | the device driver itself is required. |
371 | 367 | ||
@@ -410,30 +406,11 @@ individual flag meanings. | |||
410 | 406 | ||
411 | Usage Notes : | 407 | Usage Notes : |
412 | 408 | ||
413 | Prior to call ccw_device_start() the device driver must assure disabled state, | 409 | ccw_device_start() must be called disabled and with the ccw device lock held. |
414 | i.e. the I/O mask value in the PSW must be disabled. This can be accomplished | ||
415 | by calling local_save_flags( flags). The current PSW flags are preserved and | ||
416 | can be restored by local_irq_restore( flags) at a later time. | ||
417 | |||
418 | If the device driver violates this rule while running in a uni-processor | ||
419 | environment an interrupt might be presented prior to the ccw_device_start() | ||
420 | routine returning to the device driver main path. In this case we will end in a | ||
421 | deadlock situation as the interrupt handler will try to obtain the irq | ||
422 | lock the device driver still owns (see below) ! | ||
423 | |||
424 | The driver must assure to hold the device specific lock. This can be | ||
425 | accomplished by | ||
426 | |||
427 | (i) spin_lock(get_ccwdev_lock(cdev)), or | ||
428 | (ii) spin_lock_irqsave(get_ccwdev_lock(cdev), flags) | ||
429 | |||
430 | Option (i) should be used if the calling routine is running disabled for | ||
431 | I/O interrupts (see above) already. Option (ii) obtains the device gate und | ||
432 | puts the CPU into I/O disabled state by preserving the current PSW flags. | ||
433 | 410 | ||
434 | The device driver is allowed to issue the next ccw_device_start() call from | 411 | The device driver is allowed to issue the next ccw_device_start() call from |
435 | within its interrupt handler already. It is not required to schedule a | 412 | within its interrupt handler already. It is not required to schedule a |
436 | bottom-half, unless an non deterministically long running error recovery procedure | 413 | bottom-half, unless a non deterministically long running error recovery procedure |
437 | or similar needs to be scheduled. During I/O processing the Linux/390 generic | 414 | or similar needs to be scheduled. During I/O processing the Linux/390 generic |
438 | I/O device driver support has already obtained the IRQ lock, i.e. the handler | 415 | I/O device driver support has already obtained the IRQ lock, i.e. the handler |
439 | must not try to obtain it again when calling ccw_device_start() or we end in a | 416 | must not try to obtain it again when calling ccw_device_start() or we end in a |
@@ -454,7 +431,7 @@ information prior to device-end the device driver urgently relies on. In this | |||
454 | case all I/O interruptions are presented to the device driver until final | 431 | case all I/O interruptions are presented to the device driver until final |
455 | status is recognized. | 432 | status is recognized. |
456 | 433 | ||
457 | If a device is able to recover from asynchronosly presented I/O errors, it can | 434 | If a device is able to recover from asynchronously presented I/O errors, it can |
458 | perform overlapping I/O using the DOIO_EARLY_NOTIFICATION flag. While some | 435 | perform overlapping I/O using the DOIO_EARLY_NOTIFICATION flag. While some |
459 | devices always report channel-end and device-end together, with a single | 436 | devices always report channel-end and device-end together, with a single |
460 | interrupt, others present primary status (channel-end) when the channel is | 437 | interrupt, others present primary status (channel-end) when the channel is |
@@ -488,7 +465,7 @@ int ccw_device_resume(struct ccw_device *cdev); | |||
488 | 465 | ||
489 | cdev - ccw_device the resume operation is requested for | 466 | cdev - ccw_device the resume operation is requested for |
490 | 467 | ||
491 | The resume_IO() function returns: | 468 | The ccw_device_resume() function returns: |
492 | 469 | ||
493 | 0 - suspended channel program is resumed | 470 | 0 - suspended channel program is resumed |
494 | -EBUSY - status pending | 471 | -EBUSY - status pending |
@@ -507,6 +484,8 @@ a long-running channel program or the device might require to initially issue | |||
507 | a halt subchannel (HSCH) I/O command. For those purposes the ccw_device_halt() | 484 | a halt subchannel (HSCH) I/O command. For those purposes the ccw_device_halt() |
508 | command is provided. | 485 | command is provided. |
509 | 486 | ||
487 | ccw_device_halt() must be called disabled and with the ccw device lock held. | ||
488 | |||
510 | int ccw_device_halt(struct ccw_device *cdev, | 489 | int ccw_device_halt(struct ccw_device *cdev, |
511 | unsigned long intparm); | 490 | unsigned long intparm); |
512 | 491 | ||
@@ -517,7 +496,7 @@ intparm : interruption parameter; value is only used if no I/O | |||
517 | 496 | ||
518 | The ccw_device_halt() function returns : | 497 | The ccw_device_halt() function returns : |
519 | 498 | ||
520 | 0 - successful completion or request successfully initiated | 499 | 0 - request successfully initiated |
521 | -EBUSY - the device is currently busy, or status pending. | 500 | -EBUSY - the device is currently busy, or status pending. |
522 | -ENODEV - cdev invalid. | 501 | -ENODEV - cdev invalid. |
523 | -EINVAL - The device is not operational or the ccw device is not online. | 502 | -EINVAL - The device is not operational or the ccw device is not online. |
@@ -533,6 +512,23 @@ can then perform an appropriate action. Prior to interrupt of an outstanding | |||
533 | read to a network device (with or without PCI flag) a ccw_device_halt() | 512 | read to a network device (with or without PCI flag) a ccw_device_halt() |
534 | is required to end the pending operation. | 513 | is required to end the pending operation. |
535 | 514 | ||
515 | ccw_device_clear() - Terminage I/O Request Processing | ||
516 | |||
517 | In order to terminate all I/O processing at the subchannel, the clear subchannel | ||
518 | (CSCH) command is used. It can be issued via ccw_device_clear(). | ||
519 | |||
520 | ccw_device_clear() must be called disabled and with the ccw device lock held. | ||
521 | |||
522 | int ccw_device_clear(struct ccw_device *cdev, unsigned long intparm); | ||
523 | |||
524 | cdev: ccw_device the clear operation is requested for | ||
525 | intparm: interruption parameter (see ccw_device_halt()) | ||
526 | |||
527 | The ccw_device_clear() function returns: | ||
528 | |||
529 | 0 - request successfully initiated | ||
530 | -ENODEV - cdev invalid | ||
531 | -EINVAL - The device is not operational or the ccw device is not online. | ||
536 | 532 | ||
537 | Miscellaneous Support Routines | 533 | Miscellaneous Support Routines |
538 | 534 | ||