Skip to content

Commit

Permalink
s390/cio: collect format 1 channel-path description data
Browse files Browse the repository at this point in the history
Collect format 1 channel-path description data for each CHPID
and update the information in one place.

Reviewed-by: Sebastian Ott <sebott@linux.vnet.ibm.com>
Signed-off-by: Peter Oberparleiter <peter.oberparleiter@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
  • Loading branch information
Peter Oberparleiter authored and Martin Schwidefsky committed Apr 17, 2013
1 parent a75a282 commit cce0eac
Show file tree
Hide file tree
Showing 4 changed files with 31 additions and 9 deletions.
22 changes: 21 additions & 1 deletion drivers/s390/cio/chp.c
Original file line number Diff line number Diff line change
Expand Up @@ -376,6 +376,26 @@ static void chp_release(struct device *dev)
kfree(cp);
}

/**
* chp_update_desc - update channel-path description
* @chp - channel-path
*
* Update the channel-path description of the specified channel-path.
* Return zero on success, non-zero otherwise.
*/
int chp_update_desc(struct channel_path *chp)
{
int rc;

rc = chsc_determine_base_channel_path_desc(chp->chpid, &chp->desc);
if (rc)
return rc;

rc = chsc_determine_fmt1_channel_path_desc(chp->chpid, &chp->desc_fmt1);

return rc;
}

/**
* chp_new - register a new channel-path
* @chpid - channel-path ID
Expand Down Expand Up @@ -403,7 +423,7 @@ int chp_new(struct chp_id chpid)
mutex_init(&chp->lock);

/* Obtain channel path description and fill it in. */
ret = chsc_determine_base_channel_path_desc(chpid, &chp->desc);
ret = chp_update_desc(chp);
if (ret)
goto out_free;
if ((chp->desc.flags & 0x80) == 0) {
Expand Down
2 changes: 2 additions & 0 deletions drivers/s390/cio/chp.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ struct channel_path {
struct mutex lock; /* Serialize access to below members. */
int state;
struct channel_path_desc desc;
struct channel_path_desc_fmt1 desc_fmt1;
/* Channel-measurement related stuff: */
int cmg;
int shared;
Expand All @@ -62,6 +63,7 @@ int chp_is_registered(struct chp_id chpid);
void *chp_get_chp_desc(struct chp_id chpid);
void chp_remove_cmg_attr(struct channel_path *chp);
int chp_add_cmg_attr(struct channel_path *chp);
int chp_update_desc(struct channel_path *chp);
int chp_new(struct chp_id chpid);
void chp_cfg_schedule(struct chp_id chpid, int configure);
void chp_cfg_cancel_deconfigure(struct chp_id chpid);
Expand Down
11 changes: 6 additions & 5 deletions drivers/s390/cio/chsc.c
Original file line number Diff line number Diff line change
Expand Up @@ -376,7 +376,7 @@ static void chsc_process_sei_chp_avail(struct chsc_sei_nt0_area *sei_area)
continue;
}
mutex_lock(&chp->lock);
chsc_determine_base_channel_path_desc(chpid, &chp->desc);
chp_update_desc(chp);
mutex_unlock(&chp->lock);
}
}
Expand Down Expand Up @@ -631,8 +631,8 @@ int chsc_chp_vary(struct chp_id chpid, int on)
* Redo PathVerification on the devices the chpid connects to
*/
if (on) {
/* Try to update the channel path descritor. */
chsc_determine_base_channel_path_desc(chpid, &chp->desc);
/* Try to update the channel path description. */
chp_update_desc(chp);
for_each_subchannel_staged(s390_subchannel_vary_chpid_on,
__s390_vary_chpid_on, &chpid);
} else
Expand Down Expand Up @@ -825,17 +825,18 @@ int chsc_determine_fmt1_channel_path_desc(struct chp_id chpid,
{
struct chsc_response_struct *chsc_resp;
struct chsc_scpd *scpd_area;
unsigned long flags;
int ret;

spin_lock_irq(&chsc_page_lock);
spin_lock_irqsave(&chsc_page_lock, flags);
scpd_area = chsc_page;
ret = chsc_determine_channel_path_desc(chpid, 0, 0, 1, 0, scpd_area);
if (ret)
goto out;
chsc_resp = (void *)&scpd_area->response;
memcpy(desc, &chsc_resp->data, sizeof(*desc));
out:
spin_unlock_irq(&chsc_page_lock);
spin_unlock_irqrestore(&chsc_page_lock, flags);
return ret;
}

Expand Down
5 changes: 2 additions & 3 deletions drivers/s390/cio/css.c
Original file line number Diff line number Diff line change
Expand Up @@ -1065,9 +1065,8 @@ void channel_subsystem_reinit(void)
chsc_enable_facility(CHSC_SDA_OC_MSS);
chp_id_for_each(&chpid) {
chp = chpid_to_chp(chpid);
if (!chp)
continue;
chsc_determine_base_channel_path_desc(chpid, &chp->desc);
if (chp)
chp_update_desc(chp);
}
}

Expand Down

0 comments on commit cce0eac

Please sign in to comment.