| .. | .. |
|---|
| 45 | 45 | /* Data for read and and init requests. */ |
|---|
| 46 | 46 | static struct sclp_req sclp_read_req; |
|---|
| 47 | 47 | static struct sclp_req sclp_init_req; |
|---|
| 48 | | -static char sclp_read_sccb[PAGE_SIZE] __attribute__((__aligned__(PAGE_SIZE))); |
|---|
| 49 | | -static char sclp_init_sccb[PAGE_SIZE] __attribute__((__aligned__(PAGE_SIZE))); |
|---|
| 48 | +static void *sclp_read_sccb; |
|---|
| 49 | +static struct init_sccb *sclp_init_sccb; |
|---|
| 50 | 50 | |
|---|
| 51 | 51 | /* Suspend request */ |
|---|
| 52 | 52 | static DECLARE_COMPLETION(sclp_request_queue_flushed); |
|---|
| .. | .. |
|---|
| 753 | 753 | static inline void |
|---|
| 754 | 754 | __sclp_make_init_req(sccb_mask_t receive_mask, sccb_mask_t send_mask) |
|---|
| 755 | 755 | { |
|---|
| 756 | | - struct init_sccb *sccb; |
|---|
| 756 | + struct init_sccb *sccb = sclp_init_sccb; |
|---|
| 757 | 757 | |
|---|
| 758 | | - sccb = (struct init_sccb *) sclp_init_sccb; |
|---|
| 759 | 758 | clear_page(sccb); |
|---|
| 760 | 759 | memset(&sclp_init_req, 0, sizeof(struct sclp_req)); |
|---|
| 761 | 760 | sclp_init_req.command = SCLP_CMDW_WRITE_EVENT_MASK; |
|---|
| .. | .. |
|---|
| 782 | 781 | sclp_init_mask(int calculate) |
|---|
| 783 | 782 | { |
|---|
| 784 | 783 | unsigned long flags; |
|---|
| 785 | | - struct init_sccb *sccb = (struct init_sccb *) sclp_init_sccb; |
|---|
| 784 | + struct init_sccb *sccb = sclp_init_sccb; |
|---|
| 786 | 785 | sccb_mask_t receive_mask; |
|---|
| 787 | 786 | sccb_mask_t send_mask; |
|---|
| 788 | 787 | int retry; |
|---|
| .. | .. |
|---|
| 1175 | 1174 | if (sclp_init_state != sclp_init_state_uninitialized) |
|---|
| 1176 | 1175 | goto fail_unlock; |
|---|
| 1177 | 1176 | sclp_init_state = sclp_init_state_initializing; |
|---|
| 1177 | + sclp_read_sccb = (void *) __get_free_page(GFP_ATOMIC | GFP_DMA); |
|---|
| 1178 | + sclp_init_sccb = (void *) __get_free_page(GFP_ATOMIC | GFP_DMA); |
|---|
| 1179 | + BUG_ON(!sclp_read_sccb || !sclp_init_sccb); |
|---|
| 1178 | 1180 | /* Set up variables */ |
|---|
| 1179 | 1181 | INIT_LIST_HEAD(&sclp_req_queue); |
|---|
| 1180 | 1182 | INIT_LIST_HEAD(&sclp_reg_list); |
|---|
| .. | .. |
|---|
| 1207 | 1209 | unregister_reboot_notifier(&sclp_reboot_notifier); |
|---|
| 1208 | 1210 | fail_init_state_uninitialized: |
|---|
| 1209 | 1211 | sclp_init_state = sclp_init_state_uninitialized; |
|---|
| 1212 | + free_page((unsigned long) sclp_read_sccb); |
|---|
| 1213 | + free_page((unsigned long) sclp_init_sccb); |
|---|
| 1210 | 1214 | fail_unlock: |
|---|
| 1211 | 1215 | spin_unlock_irqrestore(&sclp_lock, flags); |
|---|
| 1212 | 1216 | return rc; |
|---|