diff options
| author | Sebastian Ott <sebott@linux.vnet.ibm.com> | 2011-05-23 04:24:41 -0400 |
|---|---|---|
| committer | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2011-05-23 04:24:31 -0400 |
| commit | fca894edd7566f5c548598c8fad7f329278c23b4 (patch) | |
| tree | 75826c09cd13cc17c471a350b8e7baa875e4e5f5 | |
| parent | b2fa47e6bf5148aa6dbf22ec79f18141b421eeba (diff) | |
[S390] chsc: process channel-path-availability information
Update affected channel path descriptors when receiving channel path
availability information.
Signed-off-by: Sebastian Ott <sebott@linux.vnet.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
| -rw-r--r-- | drivers/s390/cio/chsc.c | 35 |
1 files changed, 34 insertions, 1 deletions
diff --git a/drivers/s390/cio/chsc.c b/drivers/s390/cio/chsc.c index 0689fcf23a11..75c3f1f8fd43 100644 --- a/drivers/s390/cio/chsc.c +++ b/drivers/s390/cio/chsc.c | |||
| @@ -326,6 +326,36 @@ static void chsc_process_sei_res_acc(struct chsc_sei_area *sei_area) | |||
| 326 | s390_process_res_acc(&link); | 326 | s390_process_res_acc(&link); |
| 327 | } | 327 | } |
| 328 | 328 | ||
| 329 | static void chsc_process_sei_chp_avail(struct chsc_sei_area *sei_area) | ||
| 330 | { | ||
| 331 | struct channel_path *chp; | ||
| 332 | struct chp_id chpid; | ||
| 333 | u8 *data; | ||
| 334 | int num; | ||
| 335 | |||
| 336 | CIO_CRW_EVENT(4, "chsc: channel path availability information\n"); | ||
| 337 | if (sei_area->rs != 0) | ||
| 338 | return; | ||
| 339 | data = sei_area->ccdf; | ||
| 340 | chp_id_init(&chpid); | ||
| 341 | for (num = 0; num <= __MAX_CHPID; num++) { | ||
| 342 | if (!chp_test_bit(data, num)) | ||
| 343 | continue; | ||
| 344 | chpid.id = num; | ||
| 345 | |||
| 346 | CIO_CRW_EVENT(4, "Update information for channel path " | ||
| 347 | "%x.%02x\n", chpid.cssid, chpid.id); | ||
| 348 | chp = chpid_to_chp(chpid); | ||
| 349 | if (!chp) { | ||
| 350 | chp_new(chpid); | ||
| 351 | continue; | ||
| 352 | } | ||
| 353 | mutex_lock(&chp->lock); | ||
| 354 | chsc_determine_base_channel_path_desc(chpid, &chp->desc); | ||
| 355 | mutex_unlock(&chp->lock); | ||
| 356 | } | ||
| 357 | } | ||
| 358 | |||
| 329 | struct chp_config_data { | 359 | struct chp_config_data { |
| 330 | u8 map[32]; | 360 | u8 map[32]; |
| 331 | u8 op; | 361 | u8 op; |
| @@ -376,9 +406,12 @@ static void chsc_process_sei(struct chsc_sei_area *sei_area) | |||
| 376 | case 1: /* link incident*/ | 406 | case 1: /* link incident*/ |
| 377 | chsc_process_sei_link_incident(sei_area); | 407 | chsc_process_sei_link_incident(sei_area); |
| 378 | break; | 408 | break; |
| 379 | case 2: /* i/o resource accessibiliy */ | 409 | case 2: /* i/o resource accessibility */ |
| 380 | chsc_process_sei_res_acc(sei_area); | 410 | chsc_process_sei_res_acc(sei_area); |
| 381 | break; | 411 | break; |
| 412 | case 7: /* channel-path-availability information */ | ||
| 413 | chsc_process_sei_chp_avail(sei_area); | ||
| 414 | break; | ||
| 382 | case 8: /* channel-path-configuration notification */ | 415 | case 8: /* channel-path-configuration notification */ |
| 383 | chsc_process_sei_chp_config(sei_area); | 416 | chsc_process_sei_chp_config(sei_area); |
| 384 | break; | 417 | break; |
