mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-11 21:16:44 +07:00
s390/chsc: improve channel path descriptor determination
When we fetch channel path descriptors via chsc we use a suboptimal struct chsc_scpd and adjust that by casting the response to a generic chsc_response_struct. Simplify the code by improving struct chsc_scpd. Signed-off-by: Sebastian Ott <sebott@linux.vnet.ibm.com> Reviewed-by: Cornelia Huck <cornelia.huck@de.ibm.com> Reviewed-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
parent
f9773768f1
commit
687cb7f216
@ -940,7 +940,6 @@ EXPORT_SYMBOL_GPL(chsc_determine_channel_path_desc);
|
|||||||
int chsc_determine_base_channel_path_desc(struct chp_id chpid,
|
int chsc_determine_base_channel_path_desc(struct chp_id chpid,
|
||||||
struct channel_path_desc *desc)
|
struct channel_path_desc *desc)
|
||||||
{
|
{
|
||||||
struct chsc_response_struct *chsc_resp;
|
|
||||||
struct chsc_scpd *scpd_area;
|
struct chsc_scpd *scpd_area;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
int ret;
|
int ret;
|
||||||
@ -950,8 +949,8 @@ int chsc_determine_base_channel_path_desc(struct chp_id chpid,
|
|||||||
ret = chsc_determine_channel_path_desc(chpid, 0, 0, 0, 0, scpd_area);
|
ret = chsc_determine_channel_path_desc(chpid, 0, 0, 0, 0, scpd_area);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto out;
|
goto out;
|
||||||
chsc_resp = (void *)&scpd_area->response;
|
|
||||||
memcpy(desc, &chsc_resp->data, sizeof(*desc));
|
memcpy(desc, scpd_area->data, sizeof(*desc));
|
||||||
out:
|
out:
|
||||||
spin_unlock_irqrestore(&chsc_page_lock, flags);
|
spin_unlock_irqrestore(&chsc_page_lock, flags);
|
||||||
return ret;
|
return ret;
|
||||||
@ -960,7 +959,6 @@ int chsc_determine_base_channel_path_desc(struct chp_id chpid,
|
|||||||
int chsc_determine_fmt1_channel_path_desc(struct chp_id chpid,
|
int chsc_determine_fmt1_channel_path_desc(struct chp_id chpid,
|
||||||
struct channel_path_desc_fmt1 *desc)
|
struct channel_path_desc_fmt1 *desc)
|
||||||
{
|
{
|
||||||
struct chsc_response_struct *chsc_resp;
|
|
||||||
struct chsc_scpd *scpd_area;
|
struct chsc_scpd *scpd_area;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
int ret;
|
int ret;
|
||||||
@ -970,8 +968,8 @@ int chsc_determine_fmt1_channel_path_desc(struct chp_id chpid,
|
|||||||
ret = chsc_determine_channel_path_desc(chpid, 0, 1, 1, 0, scpd_area);
|
ret = chsc_determine_channel_path_desc(chpid, 0, 1, 1, 0, scpd_area);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto out;
|
goto out;
|
||||||
chsc_resp = (void *)&scpd_area->response;
|
|
||||||
memcpy(desc, &chsc_resp->data, sizeof(*desc));
|
memcpy(desc, scpd_area->data, sizeof(*desc));
|
||||||
out:
|
out:
|
||||||
spin_unlock_irqrestore(&chsc_page_lock, flags);
|
spin_unlock_irqrestore(&chsc_page_lock, flags);
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -112,8 +112,9 @@ struct chsc_scpd {
|
|||||||
u32 last_chpid:8;
|
u32 last_chpid:8;
|
||||||
u32 zeroes1;
|
u32 zeroes1;
|
||||||
struct chsc_header response;
|
struct chsc_header response;
|
||||||
u8 data[PAGE_SIZE - 20];
|
u32:32;
|
||||||
} __attribute__ ((packed));
|
u8 data[0];
|
||||||
|
} __packed;
|
||||||
|
|
||||||
struct chsc_sda_area {
|
struct chsc_sda_area {
|
||||||
struct chsc_header request;
|
struct chsc_header request;
|
||||||
|
Loading…
Reference in New Issue
Block a user