aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/s390
diff options
context:
space:
mode:
authorSebastian Ott <sebott@linux.vnet.ibm.com>2011-05-23 04:24:41 -0400
committerMartin Schwidefsky <schwidefsky@de.ibm.com>2011-05-23 04:24:31 -0400
commitfca894edd7566f5c548598c8fad7f329278c23b4 (patch)
tree75826c09cd13cc17c471a350b8e7baa875e4e5f5 /drivers/s390
parentb2fa47e6bf5148aa6dbf22ec79f18141b421eeba (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>
Diffstat (limited to 'drivers/s390')
-rw-r--r--drivers/s390/cio/chsc.c35
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
329static 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
329struct chp_config_data { 359struct 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;