diff options
| -rw-r--r-- | drivers/s390/cio/chsc.c | 29 | ||||
| -rw-r--r-- | drivers/s390/cio/css.c | 11 |
2 files changed, 17 insertions, 23 deletions
diff --git a/drivers/s390/cio/chsc.c b/drivers/s390/cio/chsc.c index 4038f5b4f144..ce7cb87479fe 100644 --- a/drivers/s390/cio/chsc.c +++ b/drivers/s390/cio/chsc.c | |||
| @@ -29,6 +29,7 @@ | |||
| 29 | #include "chsc.h" | 29 | #include "chsc.h" |
| 30 | 30 | ||
| 31 | static void *sei_page; | 31 | static void *sei_page; |
| 32 | static DEFINE_SPINLOCK(sda_lock); | ||
| 32 | 33 | ||
| 33 | /** | 34 | /** |
| 34 | * chsc_error_from_response() - convert a chsc response to an error | 35 | * chsc_error_from_response() - convert a chsc response to an error |
| @@ -832,11 +833,10 @@ void __init chsc_free_sei_area(void) | |||
| 832 | kfree(sei_page); | 833 | kfree(sei_page); |
| 833 | } | 834 | } |
| 834 | 835 | ||
| 835 | int __init | 836 | int chsc_enable_facility(int operation_code) |
| 836 | chsc_enable_facility(int operation_code) | ||
| 837 | { | 837 | { |
| 838 | int ret; | 838 | int ret; |
| 839 | struct { | 839 | static struct { |
| 840 | struct chsc_header request; | 840 | struct chsc_header request; |
| 841 | u8 reserved1:4; | 841 | u8 reserved1:4; |
| 842 | u8 format:4; | 842 | u8 format:4; |
| @@ -849,33 +849,32 @@ chsc_enable_facility(int operation_code) | |||
| 849 | u32 reserved5:4; | 849 | u32 reserved5:4; |
| 850 | u32 format2:4; | 850 | u32 format2:4; |
| 851 | u32 reserved6:24; | 851 | u32 reserved6:24; |
| 852 | } __attribute__ ((packed)) *sda_area; | 852 | } __attribute__ ((packed, aligned(4096))) sda_area; |
| 853 | 853 | ||
| 854 | sda_area = (void *)get_zeroed_page(GFP_KERNEL|GFP_DMA); | 854 | spin_lock(&sda_lock); |
| 855 | if (!sda_area) | 855 | memset(&sda_area, 0, sizeof(sda_area)); |
| 856 | return -ENOMEM; | 856 | sda_area.request.length = 0x0400; |
| 857 | sda_area->request.length = 0x0400; | 857 | sda_area.request.code = 0x0031; |
| 858 | sda_area->request.code = 0x0031; | 858 | sda_area.operation_code = operation_code; |
| 859 | sda_area->operation_code = operation_code; | ||
| 860 | 859 | ||
| 861 | ret = chsc(sda_area); | 860 | ret = chsc(&sda_area); |
| 862 | if (ret > 0) { | 861 | if (ret > 0) { |
| 863 | ret = (ret == 3) ? -ENODEV : -EBUSY; | 862 | ret = (ret == 3) ? -ENODEV : -EBUSY; |
| 864 | goto out; | 863 | goto out; |
| 865 | } | 864 | } |
| 866 | 865 | ||
| 867 | switch (sda_area->response.code) { | 866 | switch (sda_area.response.code) { |
| 868 | case 0x0101: | 867 | case 0x0101: |
| 869 | ret = -EOPNOTSUPP; | 868 | ret = -EOPNOTSUPP; |
| 870 | break; | 869 | break; |
| 871 | default: | 870 | default: |
| 872 | ret = chsc_error_from_response(sda_area->response.code); | 871 | ret = chsc_error_from_response(sda_area.response.code); |
| 873 | } | 872 | } |
| 874 | if (ret != 0) | 873 | if (ret != 0) |
| 875 | CIO_CRW_EVENT(2, "chsc: sda (oc=%x) failed (rc=%04x)\n", | 874 | CIO_CRW_EVENT(2, "chsc: sda (oc=%x) failed (rc=%04x)\n", |
| 876 | operation_code, sda_area->response.code); | 875 | operation_code, sda_area.response.code); |
| 877 | out: | 876 | out: |
| 878 | free_page((unsigned long)sda_area); | 877 | spin_unlock(&sda_lock); |
| 879 | return ret; | 878 | return ret; |
| 880 | } | 879 | } |
| 881 | 880 | ||
diff --git a/drivers/s390/cio/css.c b/drivers/s390/cio/css.c index 2769da54f2b9..19635d47dede 100644 --- a/drivers/s390/cio/css.c +++ b/drivers/s390/cio/css.c | |||
| @@ -870,15 +870,10 @@ static int __init css_bus_init(void) | |||
| 870 | 870 | ||
| 871 | /* Try to enable MSS. */ | 871 | /* Try to enable MSS. */ |
| 872 | ret = chsc_enable_facility(CHSC_SDA_OC_MSS); | 872 | ret = chsc_enable_facility(CHSC_SDA_OC_MSS); |
| 873 | switch (ret) { | 873 | if (ret) |
| 874 | case 0: /* Success. */ | ||
| 875 | max_ssid = __MAX_SSID; | ||
| 876 | break; | ||
| 877 | case -ENOMEM: | ||
| 878 | goto out; | ||
| 879 | default: | ||
| 880 | max_ssid = 0; | 874 | max_ssid = 0; |
| 881 | } | 875 | else /* Success. */ |
| 876 | max_ssid = __MAX_SSID; | ||
| 882 | 877 | ||
| 883 | ret = slow_subchannel_init(); | 878 | ret = slow_subchannel_init(); |
| 884 | if (ret) | 879 | if (ret) |
