diff options
Diffstat (limited to 'drivers/s390/block/dasd_diag.c')
-rw-r--r-- | drivers/s390/block/dasd_diag.c | 34 |
1 files changed, 8 insertions, 26 deletions
diff --git a/drivers/s390/block/dasd_diag.c b/drivers/s390/block/dasd_diag.c index 23fa0b289173..9d051e5687ea 100644 --- a/drivers/s390/block/dasd_diag.c +++ b/drivers/s390/block/dasd_diag.c | |||
@@ -63,44 +63,26 @@ static const u8 DASD_DIAG_CMS1[] = { 0xc3, 0xd4, 0xe2, 0xf1 };/* EBCDIC CMS1 */ | |||
63 | * and function code cmd. | 63 | * and function code cmd. |
64 | * In case of an exception return 3. Otherwise return result of bitwise OR of | 64 | * In case of an exception return 3. Otherwise return result of bitwise OR of |
65 | * resulting condition code and DIAG return code. */ | 65 | * resulting condition code and DIAG return code. */ |
66 | static __inline__ int | 66 | static inline int dia250(void *iob, int cmd) |
67 | dia250(void *iob, int cmd) | ||
68 | { | 67 | { |
68 | register unsigned long reg0 asm ("0") = (unsigned long) iob; | ||
69 | typedef union { | 69 | typedef union { |
70 | struct dasd_diag_init_io init_io; | 70 | struct dasd_diag_init_io init_io; |
71 | struct dasd_diag_rw_io rw_io; | 71 | struct dasd_diag_rw_io rw_io; |
72 | } addr_type; | 72 | } addr_type; |
73 | int rc; | 73 | int rc; |
74 | 74 | ||
75 | __asm__ __volatile__( | 75 | rc = 3; |
76 | #ifdef CONFIG_64BIT | 76 | asm volatile( |
77 | " lghi %0,3\n" | ||
78 | " lgr 0,%3\n" | ||
79 | " diag 0,%2,0x250\n" | ||
80 | "0: ipm %0\n" | ||
81 | " srl %0,28\n" | ||
82 | " or %0,1\n" | ||
83 | "1:\n" | ||
84 | ".section __ex_table,\"a\"\n" | ||
85 | " .align 8\n" | ||
86 | " .quad 0b,1b\n" | ||
87 | ".previous\n" | ||
88 | #else | ||
89 | " lhi %0,3\n" | ||
90 | " lr 0,%3\n" | ||
91 | " diag 0,%2,0x250\n" | 77 | " diag 0,%2,0x250\n" |
92 | "0: ipm %0\n" | 78 | "0: ipm %0\n" |
93 | " srl %0,28\n" | 79 | " srl %0,28\n" |
94 | " or %0,1\n" | 80 | " or %0,1\n" |
95 | "1:\n" | 81 | "1:\n" |
96 | ".section __ex_table,\"a\"\n" | 82 | EX_TABLE(0b,1b) |
97 | " .align 4\n" | 83 | : "+d" (rc), "=m" (*(addr_type *) iob) |
98 | " .long 0b,1b\n" | 84 | : "d" (cmd), "d" (reg0), "m" (*(addr_type *) iob) |
99 | ".previous\n" | 85 | : "1", "cc"); |
100 | #endif | ||
101 | : "=&d" (rc), "=m" (*(addr_type *) iob) | ||
102 | : "d" (cmd), "d" (iob), "m" (*(addr_type *) iob) | ||
103 | : "0", "1", "cc"); | ||
104 | return rc; | 86 | return rc; |
105 | } | 87 | } |
106 | 88 | ||