|
@@ -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;
|