diff options
author | Peter Oberparleiter <peter.oberparleiter@de.ibm.com> | 2005-11-07 03:59:08 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-11-07 10:53:34 -0500 |
commit | 86b368a5804d05a6508791f10ebabf7b779eb845 (patch) | |
tree | cb020d47b3f0081b9a9ec1a6ff0ddc1aa9eb55d4 | |
parent | 187dfc67b461058bbb84a923a17871ed54e10f30 (diff) |
[PATCH] s390: dasd diag inline assembly
Future versions of gcc may remove initialization code for control blocks used
by the diag250 inline assembly due to incompletely specified constraints.
This may lead to erratic behavior. Fix the diag250 inline assembly
constraints.
Signed-off-by: Peter Oberparleiter <peter.oberparleiter@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r-- | drivers/s390/block/dasd_diag.c | 16 | ||||
-rw-r--r-- | drivers/s390/block/dasd_diag.h | 10 |
2 files changed, 13 insertions, 13 deletions
diff --git a/drivers/s390/block/dasd_diag.c b/drivers/s390/block/dasd_diag.c index 7478423b53bb..9aa608f528eb 100644 --- a/drivers/s390/block/dasd_diag.c +++ b/drivers/s390/block/dasd_diag.c | |||
@@ -6,7 +6,7 @@ | |||
6 | * Bugreports.to..: <Linux390@de.ibm.com> | 6 | * Bugreports.to..: <Linux390@de.ibm.com> |
7 | * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999,2000 | 7 | * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999,2000 |
8 | * | 8 | * |
9 | * $Revision: 1.49 $ | 9 | * $Revision: 1.50 $ |
10 | */ | 10 | */ |
11 | 11 | ||
12 | #include <linux/config.h> | 12 | #include <linux/config.h> |
@@ -67,9 +67,9 @@ static const u8 DASD_DIAG_CMS1[] = { 0xc3, 0xd4, 0xe2, 0xf1 };/* EBCDIC CMS1 */ | |||
67 | static __inline__ int | 67 | static __inline__ int |
68 | dia250(void *iob, int cmd) | 68 | dia250(void *iob, int cmd) |
69 | { | 69 | { |
70 | typedef struct { | 70 | typedef union { |
71 | char _[max(sizeof (struct dasd_diag_init_io), | 71 | struct dasd_diag_init_io init_io; |
72 | sizeof (struct dasd_diag_rw_io))]; | 72 | struct dasd_diag_rw_io rw_io; |
73 | } addr_type; | 73 | } addr_type; |
74 | int rc; | 74 | int rc; |
75 | 75 | ||
@@ -190,7 +190,7 @@ dasd_start_diag(struct dasd_ccw_req * cqr) | |||
190 | private->iob.flags = DASD_DIAG_RWFLAG_ASYNC; | 190 | private->iob.flags = DASD_DIAG_RWFLAG_ASYNC; |
191 | private->iob.block_count = dreq->block_count; | 191 | private->iob.block_count = dreq->block_count; |
192 | private->iob.interrupt_params = (addr_t) cqr; | 192 | private->iob.interrupt_params = (addr_t) cqr; |
193 | private->iob.bio_list = __pa(dreq->bio); | 193 | private->iob.bio_list = dreq->bio; |
194 | private->iob.flaga = DASD_DIAG_FLAGA_DEFAULT; | 194 | private->iob.flaga = DASD_DIAG_FLAGA_DEFAULT; |
195 | 195 | ||
196 | cqr->startclk = get_clock(); | 196 | cqr->startclk = get_clock(); |
@@ -394,14 +394,14 @@ dasd_diag_check_device(struct dasd_device *device) | |||
394 | memset(&bio, 0, sizeof (struct dasd_diag_bio)); | 394 | memset(&bio, 0, sizeof (struct dasd_diag_bio)); |
395 | bio.type = MDSK_READ_REQ; | 395 | bio.type = MDSK_READ_REQ; |
396 | bio.block_number = private->pt_block + 1; | 396 | bio.block_number = private->pt_block + 1; |
397 | bio.buffer = __pa(label); | 397 | bio.buffer = label; |
398 | memset(&private->iob, 0, sizeof (struct dasd_diag_rw_io)); | 398 | memset(&private->iob, 0, sizeof (struct dasd_diag_rw_io)); |
399 | private->iob.dev_nr = rdc_data->dev_nr; | 399 | private->iob.dev_nr = rdc_data->dev_nr; |
400 | private->iob.key = 0; | 400 | private->iob.key = 0; |
401 | private->iob.flags = 0; /* do synchronous io */ | 401 | private->iob.flags = 0; /* do synchronous io */ |
402 | private->iob.block_count = 1; | 402 | private->iob.block_count = 1; |
403 | private->iob.interrupt_params = 0; | 403 | private->iob.interrupt_params = 0; |
404 | private->iob.bio_list = __pa(&bio); | 404 | private->iob.bio_list = &bio; |
405 | private->iob.flaga = DASD_DIAG_FLAGA_DEFAULT; | 405 | private->iob.flaga = DASD_DIAG_FLAGA_DEFAULT; |
406 | rc = dia250(&private->iob, RW_BIO); | 406 | rc = dia250(&private->iob, RW_BIO); |
407 | if (rc == 0 || rc == 3) | 407 | if (rc == 0 || rc == 3) |
@@ -529,7 +529,7 @@ dasd_diag_build_cp(struct dasd_device * device, struct request *req) | |||
529 | memset(dbio, 0, sizeof (struct dasd_diag_bio)); | 529 | memset(dbio, 0, sizeof (struct dasd_diag_bio)); |
530 | dbio->type = rw_cmd; | 530 | dbio->type = rw_cmd; |
531 | dbio->block_number = recid + 1; | 531 | dbio->block_number = recid + 1; |
532 | dbio->buffer = __pa(dst); | 532 | dbio->buffer = dst; |
533 | dbio++; | 533 | dbio++; |
534 | dst += blksize; | 534 | dst += blksize; |
535 | recid++; | 535 | recid++; |
diff --git a/drivers/s390/block/dasd_diag.h b/drivers/s390/block/dasd_diag.h index b26eb28df4bf..df31484d73a7 100644 --- a/drivers/s390/block/dasd_diag.h +++ b/drivers/s390/block/dasd_diag.h | |||
@@ -6,7 +6,7 @@ | |||
6 | * Bugreports.to..: <Linux390@de.ibm.com> | 6 | * Bugreports.to..: <Linux390@de.ibm.com> |
7 | * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999,2000 | 7 | * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999,2000 |
8 | * | 8 | * |
9 | * $Revision: 1.7 $ | 9 | * $Revision: 1.8 $ |
10 | */ | 10 | */ |
11 | 11 | ||
12 | #define MDSK_WRITE_REQ 0x01 | 12 | #define MDSK_WRITE_REQ 0x01 |
@@ -78,7 +78,7 @@ struct dasd_diag_bio { | |||
78 | u8 spare1[2]; | 78 | u8 spare1[2]; |
79 | u32 alet; | 79 | u32 alet; |
80 | blocknum_t block_number; | 80 | blocknum_t block_number; |
81 | u64 buffer; | 81 | void *buffer; |
82 | } __attribute__ ((packed, aligned(8))); | 82 | } __attribute__ ((packed, aligned(8))); |
83 | 83 | ||
84 | struct dasd_diag_init_io { | 84 | struct dasd_diag_init_io { |
@@ -104,7 +104,7 @@ struct dasd_diag_rw_io { | |||
104 | u32 alet; | 104 | u32 alet; |
105 | u8 spare3[4]; | 105 | u8 spare3[4]; |
106 | u64 interrupt_params; | 106 | u64 interrupt_params; |
107 | u64 bio_list; | 107 | struct dasd_diag_bio *bio_list; |
108 | u8 spare4[8]; | 108 | u8 spare4[8]; |
109 | } __attribute__ ((packed, aligned(8))); | 109 | } __attribute__ ((packed, aligned(8))); |
110 | #else /* CONFIG_ARCH_S390X */ | 110 | #else /* CONFIG_ARCH_S390X */ |
@@ -119,7 +119,7 @@ struct dasd_diag_bio { | |||
119 | u16 spare1; | 119 | u16 spare1; |
120 | blocknum_t block_number; | 120 | blocknum_t block_number; |
121 | u32 alet; | 121 | u32 alet; |
122 | u32 buffer; | 122 | void *buffer; |
123 | } __attribute__ ((packed, aligned(8))); | 123 | } __attribute__ ((packed, aligned(8))); |
124 | 124 | ||
125 | struct dasd_diag_init_io { | 125 | struct dasd_diag_init_io { |
@@ -142,7 +142,7 @@ struct dasd_diag_rw_io { | |||
142 | u8 spare2[2]; | 142 | u8 spare2[2]; |
143 | u32 block_count; | 143 | u32 block_count; |
144 | u32 alet; | 144 | u32 alet; |
145 | u32 bio_list; | 145 | struct dasd_diag_bio *bio_list; |
146 | u32 interrupt_params; | 146 | u32 interrupt_params; |
147 | u8 spare3[20]; | 147 | u8 spare3[20]; |
148 | } __attribute__ ((packed, aligned(8))); | 148 | } __attribute__ ((packed, aligned(8))); |