]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
[S390] chsc: process channel-path-availability information
authorSebastian Ott <sebott@linux.vnet.ibm.com>
Mon, 23 May 2011 08:24:41 +0000 (10:24 +0200)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Mon, 23 May 2011 08:24:31 +0000 (10:24 +0200)
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>
drivers/s390/cio/chsc.c

index 0689fcf23a118b0b8917bd3a16199ce6539107a1..75c3f1f8fd434301c3ba4a07a632e0ffefa6aac3 100644 (file)
@@ -326,6 +326,36 @@ static void chsc_process_sei_res_acc(struct chsc_sei_area *sei_area)
        s390_process_res_acc(&link);
 }
 
+static void chsc_process_sei_chp_avail(struct chsc_sei_area *sei_area)
+{
+       struct channel_path *chp;
+       struct chp_id chpid;
+       u8 *data;
+       int num;
+
+       CIO_CRW_EVENT(4, "chsc: channel path availability information\n");
+       if (sei_area->rs != 0)
+               return;
+       data = sei_area->ccdf;
+       chp_id_init(&chpid);
+       for (num = 0; num <= __MAX_CHPID; num++) {
+               if (!chp_test_bit(data, num))
+                       continue;
+               chpid.id = num;
+
+               CIO_CRW_EVENT(4, "Update information for channel path "
+                             "%x.%02x\n", chpid.cssid, chpid.id);
+               chp = chpid_to_chp(chpid);
+               if (!chp) {
+                       chp_new(chpid);
+                       continue;
+               }
+               mutex_lock(&chp->lock);
+               chsc_determine_base_channel_path_desc(chpid, &chp->desc);
+               mutex_unlock(&chp->lock);
+       }
+}
+
 struct chp_config_data {
        u8 map[32];
        u8 op;
@@ -376,9 +406,12 @@ static void chsc_process_sei(struct chsc_sei_area *sei_area)
        case 1: /* link incident*/
                chsc_process_sei_link_incident(sei_area);
                break;
-       case 2: /* i/o resource accessibiliy */
+       case 2: /* i/o resource accessibility */
                chsc_process_sei_res_acc(sei_area);
                break;
+       case 7: /* channel-path-availability information */
+               chsc_process_sei_chp_avail(sei_area);
+               break;
        case 8: /* channel-path-configuration notification */
                chsc_process_sei_chp_config(sei_area);
                break;