|
@@ -159,7 +159,7 @@ int ccw_device_clear(struct ccw_device *cdev, unsigned long intparm)
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * ccw_device_start_key() - start a s390 channel program with key
|
|
|
+ * ccw_device_start_timeout_key() - start a s390 channel program with timeout and key
|
|
|
* @cdev: target ccw device
|
|
|
* @cpa: logical start address of channel program
|
|
|
* @intparm: user specific interruption parameter; will be presented back to
|
|
@@ -170,10 +170,15 @@ int ccw_device_clear(struct ccw_device *cdev, unsigned long intparm)
|
|
|
* @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
|
|
|
*
|
|
|
* 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;
|
|
@@ -182,9 +187,9 @@ int ccw_device_clear(struct ccw_device *cdev, unsigned long intparm)
|
|
|
* Context:
|
|
|
* Interrupts disabled, ccw device lock held
|
|
|
*/
|
|
|
-int ccw_device_start_key(struct ccw_device *cdev, struct ccw1 *cpa,
|
|
|
- unsigned long intparm, __u8 lpm, __u8 key,
|
|
|
- unsigned long flags)
|
|
|
+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)
|
|
|
{
|
|
|
struct subchannel *sch;
|
|
|
int ret;
|
|
@@ -224,6 +229,8 @@ int ccw_device_start_key(struct ccw_device *cdev, struct ccw1 *cpa,
|
|
|
switch (ret) {
|
|
|
case 0:
|
|
|
cdev->private->intparm = intparm;
|
|
|
+ if (expires)
|
|
|
+ ccw_device_set_timeout(cdev, expires);
|
|
|
break;
|
|
|
case -EACCES:
|
|
|
case -ENODEV:
|
|
@@ -234,7 +241,7 @@ int ccw_device_start_key(struct ccw_device *cdev, struct ccw1 *cpa,
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * ccw_device_start_timeout_key() - start a s390 channel program with timeout and key
|
|
|
+ * ccw_device_start_key() - start a s390 channel program with key
|
|
|
* @cdev: target ccw device
|
|
|
* @cpa: logical start address of channel program
|
|
|
* @intparm: user specific interruption parameter; will be presented back to
|
|
@@ -245,15 +252,10 @@ int ccw_device_start_key(struct ccw_device *cdev, struct ccw1 *cpa,
|
|
|
* @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
|
|
|
*
|
|
|
* 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;
|
|
@@ -262,19 +264,12 @@ int ccw_device_start_key(struct ccw_device *cdev, struct ccw1 *cpa,
|
|
|
* Context:
|
|
|
* Interrupts disabled, ccw device lock held
|
|
|
*/
|
|
|
-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)
|
|
|
+int ccw_device_start_key(struct ccw_device *cdev, struct ccw1 *cpa,
|
|
|
+ unsigned long intparm, __u8 lpm, __u8 key,
|
|
|
+ unsigned long flags)
|
|
|
{
|
|
|
- int ret;
|
|
|
-
|
|
|
- if (!cdev)
|
|
|
- return -ENODEV;
|
|
|
- ccw_device_set_timeout(cdev, expires);
|
|
|
- ret = ccw_device_start_key(cdev, cpa, intparm, lpm, key, flags);
|
|
|
- if (ret != 0)
|
|
|
- ccw_device_set_timeout(cdev, 0);
|
|
|
- return ret;
|
|
|
+ return ccw_device_start_timeout_key(cdev, cpa, intparm, lpm, key,
|
|
|
+ flags, 0);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -489,18 +484,20 @@ void ccw_device_get_id(struct ccw_device *cdev, struct ccw_dev_id *dev_id)
|
|
|
EXPORT_SYMBOL(ccw_device_get_id);
|
|
|
|
|
|
/**
|
|
|
- * ccw_device_tm_start_key() - perform start function
|
|
|
+ * ccw_device_tm_start_timeout_key() - perform start function
|
|
|
* @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
|
|
|
*
|
|
|
* Start the tcw on the given ccw device. Return zero on success, non-zero
|
|
|
* otherwise.
|
|
|
*/
|
|
|
-int ccw_device_tm_start_key(struct ccw_device *cdev, struct tcw *tcw,
|
|
|
- unsigned long intparm, u8 lpm, u8 key)
|
|
|
+int ccw_device_tm_start_timeout_key(struct ccw_device *cdev, struct tcw *tcw,
|
|
|
+ unsigned long intparm, u8 lpm, u8 key,
|
|
|
+ int expires)
|
|
|
{
|
|
|
struct subchannel *sch;
|
|
|
int rc;
|
|
@@ -527,37 +524,32 @@ int ccw_device_tm_start_key(struct ccw_device *cdev, struct tcw *tcw,
|
|
|
return -EACCES;
|
|
|
}
|
|
|
rc = cio_tm_start_key(sch, tcw, lpm, key);
|
|
|
- if (rc == 0)
|
|
|
+ if (rc == 0) {
|
|
|
cdev->private->intparm = intparm;
|
|
|
+ if (expires)
|
|
|
+ ccw_device_set_timeout(cdev, expires);
|
|
|
+ }
|
|
|
return rc;
|
|
|
}
|
|
|
-EXPORT_SYMBOL(ccw_device_tm_start_key);
|
|
|
+EXPORT_SYMBOL(ccw_device_tm_start_timeout_key);
|
|
|
|
|
|
/**
|
|
|
- * ccw_device_tm_start_timeout_key() - perform start function
|
|
|
+ * ccw_device_tm_start_key() - perform start function
|
|
|
* @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
|
|
|
*
|
|
|
* Start the tcw on the given ccw device. Return zero on success, non-zero
|
|
|
* otherwise.
|
|
|
*/
|
|
|
-int ccw_device_tm_start_timeout_key(struct ccw_device *cdev, struct tcw *tcw,
|
|
|
- unsigned long intparm, u8 lpm, u8 key,
|
|
|
- int expires)
|
|
|
+int ccw_device_tm_start_key(struct ccw_device *cdev, struct tcw *tcw,
|
|
|
+ unsigned long intparm, u8 lpm, u8 key)
|
|
|
{
|
|
|
- int ret;
|
|
|
-
|
|
|
- ccw_device_set_timeout(cdev, expires);
|
|
|
- ret = ccw_device_tm_start_key(cdev, tcw, intparm, lpm, key);
|
|
|
- if (ret != 0)
|
|
|
- ccw_device_set_timeout(cdev, 0);
|
|
|
- return ret;
|
|
|
+ return ccw_device_tm_start_timeout_key(cdev, tcw, intparm, lpm, key, 0);
|
|
|
}
|
|
|
-EXPORT_SYMBOL(ccw_device_tm_start_timeout_key);
|
|
|
+EXPORT_SYMBOL(ccw_device_tm_start_key);
|
|
|
|
|
|
/**
|
|
|
* ccw_device_tm_start() - perform start function
|