|
@@ -2533,6 +2533,7 @@ static struct dasd_ccw_req *dasd_generic_build_rdc(struct dasd_device *device,
|
|
|
{
|
|
|
struct dasd_ccw_req *cqr;
|
|
|
struct ccw1 *ccw;
|
|
|
+ unsigned long *idaw;
|
|
|
|
|
|
cqr = dasd_smalloc_request(magic, 1 /* RDC */, rdc_buffer_size, device);
|
|
|
|
|
@@ -2546,9 +2547,17 @@ static struct dasd_ccw_req *dasd_generic_build_rdc(struct dasd_device *device,
|
|
|
|
|
|
ccw = cqr->cpaddr;
|
|
|
ccw->cmd_code = CCW_CMD_RDC;
|
|
|
- ccw->cda = (__u32)(addr_t)rdc_buffer;
|
|
|
- ccw->count = rdc_buffer_size;
|
|
|
+ if (idal_is_needed(rdc_buffer, rdc_buffer_size)) {
|
|
|
+ idaw = (unsigned long *) (cqr->data);
|
|
|
+ ccw->cda = (__u32)(addr_t) idaw;
|
|
|
+ ccw->flags = CCW_FLAG_IDA;
|
|
|
+ idaw = idal_create_words(idaw, rdc_buffer, rdc_buffer_size);
|
|
|
+ } else {
|
|
|
+ ccw->cda = (__u32)(addr_t) rdc_buffer;
|
|
|
+ ccw->flags = 0;
|
|
|
+ }
|
|
|
|
|
|
+ ccw->count = rdc_buffer_size;
|
|
|
cqr->startdev = device;
|
|
|
cqr->memdev = device;
|
|
|
cqr->expires = 10*HZ;
|