diff options
| -rw-r--r-- | arch/s390/kernel/ipl.c | 57 |
1 files changed, 11 insertions, 46 deletions
diff --git a/arch/s390/kernel/ipl.c b/arch/s390/kernel/ipl.c index 75dd08547c31..4296d7e61fb6 100644 --- a/arch/s390/kernel/ipl.c +++ b/arch/s390/kernel/ipl.c | |||
| @@ -117,27 +117,12 @@ static char *dump_type_str(enum dump_type type) | |||
| 117 | } | 117 | } |
| 118 | } | 118 | } |
| 119 | 119 | ||
| 120 | enum ipl_method { | ||
| 121 | REIPL_METHOD_CCW_DIAG, | ||
| 122 | REIPL_METHOD_FCP_DIAG, | ||
| 123 | REIPL_METHOD_FCP_DUMP, | ||
| 124 | REIPL_METHOD_NSS_DIAG, | ||
| 125 | REIPL_METHOD_DEFAULT, | ||
| 126 | }; | ||
| 127 | |||
| 128 | enum dump_method { | ||
| 129 | DUMP_METHOD_NONE, | ||
| 130 | DUMP_METHOD_CCW_DIAG, | ||
| 131 | DUMP_METHOD_FCP_DIAG, | ||
| 132 | }; | ||
| 133 | |||
| 134 | static int ipl_block_valid; | 120 | static int ipl_block_valid; |
| 135 | static struct ipl_parameter_block ipl_block; | 121 | static struct ipl_parameter_block ipl_block; |
| 136 | 122 | ||
| 137 | static int reipl_capabilities = IPL_TYPE_UNKNOWN; | 123 | static int reipl_capabilities = IPL_TYPE_UNKNOWN; |
| 138 | 124 | ||
| 139 | static enum ipl_type reipl_type = IPL_TYPE_UNKNOWN; | 125 | static enum ipl_type reipl_type = IPL_TYPE_UNKNOWN; |
| 140 | static enum ipl_method reipl_method = REIPL_METHOD_DEFAULT; | ||
| 141 | static struct ipl_parameter_block *reipl_block_fcp; | 126 | static struct ipl_parameter_block *reipl_block_fcp; |
| 142 | static struct ipl_parameter_block *reipl_block_ccw; | 127 | static struct ipl_parameter_block *reipl_block_ccw; |
| 143 | static struct ipl_parameter_block *reipl_block_nss; | 128 | static struct ipl_parameter_block *reipl_block_nss; |
| @@ -145,7 +130,6 @@ static struct ipl_parameter_block *reipl_block_actual; | |||
| 145 | 130 | ||
| 146 | static int dump_capabilities = DUMP_TYPE_NONE; | 131 | static int dump_capabilities = DUMP_TYPE_NONE; |
| 147 | static enum dump_type dump_type = DUMP_TYPE_NONE; | 132 | static enum dump_type dump_type = DUMP_TYPE_NONE; |
| 148 | static enum dump_method dump_method = DUMP_METHOD_NONE; | ||
| 149 | static struct ipl_parameter_block *dump_block_fcp; | 133 | static struct ipl_parameter_block *dump_block_fcp; |
| 150 | static struct ipl_parameter_block *dump_block_ccw; | 134 | static struct ipl_parameter_block *dump_block_ccw; |
| 151 | 135 | ||
| @@ -928,25 +912,16 @@ static int reipl_set_type(enum ipl_type type) | |||
| 928 | 912 | ||
| 929 | switch(type) { | 913 | switch(type) { |
| 930 | case IPL_TYPE_CCW: | 914 | case IPL_TYPE_CCW: |
| 931 | reipl_method = REIPL_METHOD_CCW_DIAG; | ||
| 932 | reipl_block_actual = reipl_block_ccw; | 915 | reipl_block_actual = reipl_block_ccw; |
| 933 | break; | 916 | break; |
| 934 | case IPL_TYPE_FCP: | 917 | case IPL_TYPE_FCP: |
| 935 | reipl_method = REIPL_METHOD_FCP_DIAG; | ||
| 936 | reipl_block_actual = reipl_block_fcp; | 918 | reipl_block_actual = reipl_block_fcp; |
| 937 | break; | 919 | break; |
| 938 | case IPL_TYPE_FCP_DUMP: | ||
| 939 | reipl_method = REIPL_METHOD_FCP_DUMP; | ||
| 940 | break; | ||
| 941 | case IPL_TYPE_NSS: | 920 | case IPL_TYPE_NSS: |
| 942 | reipl_method = REIPL_METHOD_NSS_DIAG; | ||
| 943 | reipl_block_actual = reipl_block_nss; | 921 | reipl_block_actual = reipl_block_nss; |
| 944 | break; | 922 | break; |
| 945 | case IPL_TYPE_UNKNOWN: | ||
| 946 | reipl_method = REIPL_METHOD_DEFAULT; | ||
| 947 | break; | ||
| 948 | default: | 923 | default: |
| 949 | BUG(); | 924 | break; |
| 950 | } | 925 | } |
| 951 | reipl_type = type; | 926 | reipl_type = type; |
| 952 | return 0; | 927 | return 0; |
| @@ -981,23 +956,23 @@ static struct kset *reipl_fcp_kset; | |||
| 981 | 956 | ||
| 982 | static void __reipl_run(void *unused) | 957 | static void __reipl_run(void *unused) |
| 983 | { | 958 | { |
| 984 | switch (reipl_method) { | 959 | switch (reipl_type) { |
| 985 | case REIPL_METHOD_CCW_DIAG: | 960 | case IPL_TYPE_CCW: |
| 986 | diag308(DIAG308_SET, reipl_block_ccw); | 961 | diag308(DIAG308_SET, reipl_block_ccw); |
| 987 | diag308(DIAG308_LOAD_CLEAR, NULL); | 962 | diag308(DIAG308_LOAD_CLEAR, NULL); |
| 988 | break; | 963 | break; |
| 989 | case REIPL_METHOD_FCP_DIAG: | 964 | case IPL_TYPE_FCP: |
| 990 | diag308(DIAG308_SET, reipl_block_fcp); | 965 | diag308(DIAG308_SET, reipl_block_fcp); |
| 991 | diag308(DIAG308_LOAD_CLEAR, NULL); | 966 | diag308(DIAG308_LOAD_CLEAR, NULL); |
| 992 | break; | 967 | break; |
| 993 | case REIPL_METHOD_NSS_DIAG: | 968 | case IPL_TYPE_NSS: |
| 994 | diag308(DIAG308_SET, reipl_block_nss); | 969 | diag308(DIAG308_SET, reipl_block_nss); |
| 995 | diag308(DIAG308_LOAD_CLEAR, NULL); | 970 | diag308(DIAG308_LOAD_CLEAR, NULL); |
| 996 | break; | 971 | break; |
| 997 | case REIPL_METHOD_DEFAULT: | 972 | case IPL_TYPE_UNKNOWN: |
| 998 | diag308(DIAG308_LOAD_CLEAR, NULL); | 973 | diag308(DIAG308_LOAD_CLEAR, NULL); |
| 999 | break; | 974 | break; |
| 1000 | case REIPL_METHOD_FCP_DUMP: | 975 | case IPL_TYPE_FCP_DUMP: |
| 1001 | break; | 976 | break; |
| 1002 | } | 977 | } |
| 1003 | disabled_wait((unsigned long) __builtin_return_address(0)); | 978 | disabled_wait((unsigned long) __builtin_return_address(0)); |
| @@ -1230,16 +1205,6 @@ static int dump_set_type(enum dump_type type) | |||
| 1230 | { | 1205 | { |
| 1231 | if (!(dump_capabilities & type)) | 1206 | if (!(dump_capabilities & type)) |
| 1232 | return -EINVAL; | 1207 | return -EINVAL; |
| 1233 | switch (type) { | ||
| 1234 | case DUMP_TYPE_CCW: | ||
| 1235 | dump_method = DUMP_METHOD_CCW_DIAG; | ||
| 1236 | break; | ||
| 1237 | case DUMP_TYPE_FCP: | ||
| 1238 | dump_method = DUMP_METHOD_FCP_DIAG; | ||
| 1239 | break; | ||
| 1240 | default: | ||
| 1241 | dump_method = DUMP_METHOD_NONE; | ||
| 1242 | } | ||
| 1243 | dump_type = type; | 1208 | dump_type = type; |
| 1244 | return 0; | 1209 | return 0; |
| 1245 | } | 1210 | } |
| @@ -1282,11 +1247,11 @@ static void diag308_dump(void *dump_block) | |||
| 1282 | 1247 | ||
| 1283 | static void __dump_run(void *unused) | 1248 | static void __dump_run(void *unused) |
| 1284 | { | 1249 | { |
| 1285 | switch (dump_method) { | 1250 | switch (dump_type) { |
| 1286 | case DUMP_METHOD_CCW_DIAG: | 1251 | case DUMP_TYPE_CCW: |
| 1287 | diag308_dump(dump_block_ccw); | 1252 | diag308_dump(dump_block_ccw); |
| 1288 | break; | 1253 | break; |
| 1289 | case DUMP_METHOD_FCP_DIAG: | 1254 | case DUMP_TYPE_FCP: |
| 1290 | diag308_dump(dump_block_fcp); | 1255 | diag308_dump(dump_block_fcp); |
| 1291 | break; | 1256 | break; |
| 1292 | default: | 1257 | default: |
| @@ -1296,7 +1261,7 @@ static void __dump_run(void *unused) | |||
| 1296 | 1261 | ||
| 1297 | static void dump_run(struct shutdown_trigger *trigger) | 1262 | static void dump_run(struct shutdown_trigger *trigger) |
| 1298 | { | 1263 | { |
| 1299 | if (dump_method == DUMP_METHOD_NONE) | 1264 | if (dump_type == DUMP_TYPE_NONE) |
| 1300 | return; | 1265 | return; |
| 1301 | smp_send_stop(); | 1266 | smp_send_stop(); |
| 1302 | smp_call_ipl_cpu(__dump_run, NULL); | 1267 | smp_call_ipl_cpu(__dump_run, NULL); |
