diff options
Diffstat (limited to 'drivers/s390/cio/chsc.c')
-rw-r--r-- | drivers/s390/cio/chsc.c | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/drivers/s390/cio/chsc.c b/drivers/s390/cio/chsc.c index 8ea7d9b2c671..13299f902676 100644 --- a/drivers/s390/cio/chsc.c +++ b/drivers/s390/cio/chsc.c | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <asm/chpid.h> | 20 | #include <asm/chpid.h> |
21 | #include <asm/chsc.h> | 21 | #include <asm/chsc.h> |
22 | #include <asm/crw.h> | 22 | #include <asm/crw.h> |
23 | #include <asm/isc.h> | ||
23 | 24 | ||
24 | #include "css.h" | 25 | #include "css.h" |
25 | #include "cio.h" | 26 | #include "cio.h" |
@@ -144,6 +145,65 @@ out: | |||
144 | return ret; | 145 | return ret; |
145 | } | 146 | } |
146 | 147 | ||
148 | /** | ||
149 | * chsc_ssqd() - store subchannel QDIO data (SSQD) | ||
150 | * @schid: id of the subchannel on which SSQD is performed | ||
151 | * @ssqd: request and response block for SSQD | ||
152 | * | ||
153 | * Returns 0 on success. | ||
154 | */ | ||
155 | int chsc_ssqd(struct subchannel_id schid, struct chsc_ssqd_area *ssqd) | ||
156 | { | ||
157 | memset(ssqd, 0, sizeof(*ssqd)); | ||
158 | ssqd->request.length = 0x0010; | ||
159 | ssqd->request.code = 0x0024; | ||
160 | ssqd->first_sch = schid.sch_no; | ||
161 | ssqd->last_sch = schid.sch_no; | ||
162 | ssqd->ssid = schid.ssid; | ||
163 | |||
164 | if (chsc(ssqd)) | ||
165 | return -EIO; | ||
166 | |||
167 | return chsc_error_from_response(ssqd->response.code); | ||
168 | } | ||
169 | EXPORT_SYMBOL_GPL(chsc_ssqd); | ||
170 | |||
171 | /** | ||
172 | * chsc_sadc() - set adapter device controls (SADC) | ||
173 | * @schid: id of the subchannel on which SADC is performed | ||
174 | * @scssc: request and response block for SADC | ||
175 | * @summary_indicator_addr: summary indicator address | ||
176 | * @subchannel_indicator_addr: subchannel indicator address | ||
177 | * | ||
178 | * Returns 0 on success. | ||
179 | */ | ||
180 | int chsc_sadc(struct subchannel_id schid, struct chsc_scssc_area *scssc, | ||
181 | u64 summary_indicator_addr, u64 subchannel_indicator_addr) | ||
182 | { | ||
183 | memset(scssc, 0, sizeof(*scssc)); | ||
184 | scssc->request.length = 0x0fe0; | ||
185 | scssc->request.code = 0x0021; | ||
186 | scssc->operation_code = 0; | ||
187 | |||
188 | scssc->summary_indicator_addr = summary_indicator_addr; | ||
189 | scssc->subchannel_indicator_addr = subchannel_indicator_addr; | ||
190 | |||
191 | scssc->ks = PAGE_DEFAULT_KEY >> 4; | ||
192 | scssc->kc = PAGE_DEFAULT_KEY >> 4; | ||
193 | scssc->isc = QDIO_AIRQ_ISC; | ||
194 | scssc->schid = schid; | ||
195 | |||
196 | /* enable the time delay disablement facility */ | ||
197 | if (css_general_characteristics.aif_tdd) | ||
198 | scssc->word_with_d_bit = 0x10000000; | ||
199 | |||
200 | if (chsc(scssc)) | ||
201 | return -EIO; | ||
202 | |||
203 | return chsc_error_from_response(scssc->response.code); | ||
204 | } | ||
205 | EXPORT_SYMBOL_GPL(chsc_sadc); | ||
206 | |||
147 | static int s390_subchannel_remove_chpid(struct subchannel *sch, void *data) | 207 | static int s390_subchannel_remove_chpid(struct subchannel *sch, void *data) |
148 | { | 208 | { |
149 | spin_lock_irq(sch->lock); | 209 | spin_lock_irq(sch->lock); |