diff options
Diffstat (limited to 'drivers/s390/cio/chsc.c')
| -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)  	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; |