Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
zfcp_qdio.c
Go to the documentation of this file.
1 /*
2  * zfcp device driver
3  *
4  * Setup and helper functions to access QDIO.
5  *
6  * Copyright IBM Corp. 2002, 2010
7  */
8 
9 #define KMSG_COMPONENT "zfcp"
10 #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
11 
12 #include <linux/slab.h>
13 #include <linux/module.h>
14 #include "zfcp_ext.h"
15 #include "zfcp_qdio.h"
16 
17 #define QBUFF_PER_PAGE (PAGE_SIZE / sizeof(struct qdio_buffer))
18 
19 static bool enable_multibuffer;
20 module_param_named(datarouter, enable_multibuffer, bool, 0400);
21 MODULE_PARM_DESC(datarouter, "Enable hardware data router support");
22 
23 static int zfcp_qdio_buffers_enqueue(struct qdio_buffer **sbal)
24 {
25  int pos;
26 
27  for (pos = 0; pos < QDIO_MAX_BUFFERS_PER_Q; pos += QBUFF_PER_PAGE) {
28  sbal[pos] = (struct qdio_buffer *) get_zeroed_page(GFP_KERNEL);
29  if (!sbal[pos])
30  return -ENOMEM;
31  }
32  for (pos = 0; pos < QDIO_MAX_BUFFERS_PER_Q; pos++)
33  if (pos % QBUFF_PER_PAGE)
34  sbal[pos] = sbal[pos - 1] + 1;
35  return 0;
36 }
37 
38 static void zfcp_qdio_handler_error(struct zfcp_qdio *qdio, char *id,
39  unsigned int qdio_err)
40 {
41  struct zfcp_adapter *adapter = qdio->adapter;
42 
43  dev_warn(&adapter->ccw_device->dev, "A QDIO problem occurred\n");
44 
45  if (qdio_err & QDIO_ERROR_SLSB_STATE) {
46  zfcp_qdio_siosl(adapter);
47  zfcp_erp_adapter_shutdown(adapter, 0, id);
48  return;
49  }
53 }
54 
55 static void zfcp_qdio_zero_sbals(struct qdio_buffer *sbal[], int first, int cnt)
56 {
57  int i, sbal_idx;
58 
59  for (i = first; i < first + cnt; i++) {
60  sbal_idx = i % QDIO_MAX_BUFFERS_PER_Q;
61  memset(sbal[sbal_idx], 0, sizeof(struct qdio_buffer));
62  }
63 }
64 
65 /* this needs to be called prior to updating the queue fill level */
66 static inline void zfcp_qdio_account(struct zfcp_qdio *qdio)
67 {
68  unsigned long long now, span;
69  int used;
70 
71  now = get_clock_monotonic();
72  span = (now - qdio->req_q_time) >> 12;
73  used = QDIO_MAX_BUFFERS_PER_Q - atomic_read(&qdio->req_q_free);
74  qdio->req_q_util += used * span;
75  qdio->req_q_time = now;
76 }
77 
78 static void zfcp_qdio_int_req(struct ccw_device *cdev, unsigned int qdio_err,
79  int queue_no, int idx, int count,
80  unsigned long parm)
81 {
82  struct zfcp_qdio *qdio = (struct zfcp_qdio *) parm;
83 
84  if (unlikely(qdio_err)) {
85  zfcp_qdio_handler_error(qdio, "qdireq1", qdio_err);
86  return;
87  }
88 
89  /* cleanup all SBALs being program-owned now */
90  zfcp_qdio_zero_sbals(qdio->req_q, idx, count);
91 
92  spin_lock_irq(&qdio->stat_lock);
93  zfcp_qdio_account(qdio);
94  spin_unlock_irq(&qdio->stat_lock);
95  atomic_add(count, &qdio->req_q_free);
96  wake_up(&qdio->req_q_wq);
97 }
98 
99 static void zfcp_qdio_int_resp(struct ccw_device *cdev, unsigned int qdio_err,
100  int queue_no, int idx, int count,
101  unsigned long parm)
102 {
103  struct zfcp_qdio *qdio = (struct zfcp_qdio *) parm;
104  struct zfcp_adapter *adapter = qdio->adapter;
105  int sbal_no, sbal_idx;
106 
107  if (unlikely(qdio_err)) {
108  if (zfcp_adapter_multi_buffer_active(adapter)) {
109  void *pl[ZFCP_QDIO_MAX_SBALS_PER_REQ + 1];
110  struct qdio_buffer_element *sbale;
111  u64 req_id;
112  u8 scount;
113 
114  memset(pl, 0,
115  ZFCP_QDIO_MAX_SBALS_PER_REQ * sizeof(void *));
116  sbale = qdio->res_q[idx]->element;
117  req_id = (u64) sbale->addr;
118  scount = min(sbale->scount + 1,
120  /* incl. signaling SBAL */
121 
122  for (sbal_no = 0; sbal_no < scount; sbal_no++) {
123  sbal_idx = (idx + sbal_no) %
124  QDIO_MAX_BUFFERS_PER_Q;
125  pl[sbal_no] = qdio->res_q[sbal_idx];
126  }
127  zfcp_dbf_hba_def_err(adapter, req_id, scount, pl);
128  }
129  zfcp_qdio_handler_error(qdio, "qdires1", qdio_err);
130  return;
131  }
132 
133  /*
134  * go through all SBALs from input queue currently
135  * returned by QDIO layer
136  */
137  for (sbal_no = 0; sbal_no < count; sbal_no++) {
138  sbal_idx = (idx + sbal_no) % QDIO_MAX_BUFFERS_PER_Q;
139  /* go through all SBALEs of SBAL */
140  zfcp_fsf_reqid_check(qdio, sbal_idx);
141  }
142 
143  /*
144  * put SBALs back to response queue
145  */
146  if (do_QDIO(cdev, QDIO_FLAG_SYNC_INPUT, 0, idx, count))
147  zfcp_erp_adapter_reopen(qdio->adapter, 0, "qdires2");
148 }
149 
150 static struct qdio_buffer_element *
151 zfcp_qdio_sbal_chain(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req)
152 {
153  struct qdio_buffer_element *sbale;
154 
155  /* set last entry flag in current SBALE of current SBAL */
156  sbale = zfcp_qdio_sbale_curr(qdio, q_req);
157  sbale->eflags |= SBAL_EFLAGS_LAST_ENTRY;
158 
159  /* don't exceed last allowed SBAL */
160  if (q_req->sbal_last == q_req->sbal_limit)
161  return NULL;
162 
163  /* set chaining flag in first SBALE of current SBAL */
164  sbale = zfcp_qdio_sbale_req(qdio, q_req);
166 
167  /* calculate index of next SBAL */
168  q_req->sbal_last++;
170 
171  /* keep this requests number of SBALs up-to-date */
172  q_req->sbal_number++;
174 
175  /* start at first SBALE of new SBAL */
176  q_req->sbale_curr = 0;
177 
178  /* set storage-block type for new SBAL */
179  sbale = zfcp_qdio_sbale_curr(qdio, q_req);
180  sbale->sflags |= q_req->sbtype;
181 
182  return sbale;
183 }
184 
185 static struct qdio_buffer_element *
186 zfcp_qdio_sbale_next(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req)
187 {
188  if (q_req->sbale_curr == qdio->max_sbale_per_sbal - 1)
189  return zfcp_qdio_sbal_chain(qdio, q_req);
190  q_req->sbale_curr++;
191  return zfcp_qdio_sbale_curr(qdio, q_req);
192 }
193 
202 int zfcp_qdio_sbals_from_sg(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req,
203  struct scatterlist *sg)
204 {
205  struct qdio_buffer_element *sbale;
206 
207  /* set storage-block type for this request */
208  sbale = zfcp_qdio_sbale_req(qdio, q_req);
209  sbale->sflags |= q_req->sbtype;
210 
211  for (; sg; sg = sg_next(sg)) {
212  sbale = zfcp_qdio_sbale_next(qdio, q_req);
213  if (!sbale) {
214  atomic_inc(&qdio->req_q_full);
215  zfcp_qdio_zero_sbals(qdio->req_q, q_req->sbal_first,
216  q_req->sbal_number);
217  return -EINVAL;
218  }
219  sbale->addr = sg_virt(sg);
220  sbale->length = sg->length;
221  }
222  return 0;
223 }
224 
225 static int zfcp_qdio_sbal_check(struct zfcp_qdio *qdio)
226 {
227  spin_lock_irq(&qdio->req_q_lock);
228  if (atomic_read(&qdio->req_q_free) ||
229  !(atomic_read(&qdio->adapter->status) & ZFCP_STATUS_ADAPTER_QDIOUP))
230  return 1;
231  spin_unlock_irq(&qdio->req_q_lock);
232  return 0;
233 }
234 
245 int zfcp_qdio_sbal_get(struct zfcp_qdio *qdio)
246 {
247  long ret;
248 
249  spin_unlock_irq(&qdio->req_q_lock);
251  zfcp_qdio_sbal_check(qdio), 5 * HZ);
252 
253  if (!(atomic_read(&qdio->adapter->status) & ZFCP_STATUS_ADAPTER_QDIOUP))
254  return -EIO;
255 
256  if (ret > 0)
257  return 0;
258 
259  if (!ret) {
260  atomic_inc(&qdio->req_q_full);
261  /* assume hanging outbound queue, try queue recovery */
262  zfcp_erp_adapter_reopen(qdio->adapter, 0, "qdsbg_1");
263  }
264 
265  spin_lock_irq(&qdio->req_q_lock);
266  return -EIO;
267 }
268 
275 int zfcp_qdio_send(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req)
276 {
277  int retval;
278  u8 sbal_number = q_req->sbal_number;
279 
280  spin_lock(&qdio->stat_lock);
281  zfcp_qdio_account(qdio);
282  spin_unlock(&qdio->stat_lock);
283 
284  retval = do_QDIO(qdio->adapter->ccw_device, QDIO_FLAG_SYNC_OUTPUT, 0,
285  q_req->sbal_first, sbal_number);
286 
287  if (unlikely(retval)) {
288  zfcp_qdio_zero_sbals(qdio->req_q, q_req->sbal_first,
289  sbal_number);
290  return retval;
291  }
292 
293  /* account for transferred buffers */
294  atomic_sub(sbal_number, &qdio->req_q_free);
295  qdio->req_q_idx += sbal_number;
297 
298  return 0;
299 }
300 
301 
302 static void zfcp_qdio_setup_init_data(struct qdio_initialize *id,
303  struct zfcp_qdio *qdio)
304 {
305  memset(id, 0, sizeof(*id));
306  id->cdev = qdio->adapter->ccw_device;
307  id->q_format = QDIO_ZFCP_QFMT;
308  memcpy(id->adapter_name, dev_name(&id->cdev->dev), 8);
309  ASCEBC(id->adapter_name, 8);
310  id->qib_rflags = QIB_RFLAGS_ENABLE_DATA_DIV;
311  if (enable_multibuffer)
312  id->qdr_ac |= QDR_AC_MULTI_BUFFER_ENABLE;
313  id->no_input_qs = 1;
314  id->no_output_qs = 1;
315  id->input_handler = zfcp_qdio_int_resp;
316  id->output_handler = zfcp_qdio_int_req;
317  id->int_parm = (unsigned long) qdio;
318  id->input_sbal_addr_array = (void **) (qdio->res_q);
319  id->output_sbal_addr_array = (void **) (qdio->req_q);
320  id->scan_threshold =
321  QDIO_MAX_BUFFERS_PER_Q - ZFCP_QDIO_MAX_SBALS_PER_REQ * 2;
322 }
323 
330 static int zfcp_qdio_allocate(struct zfcp_qdio *qdio)
331 {
332  struct qdio_initialize init_data;
333 
334  if (zfcp_qdio_buffers_enqueue(qdio->req_q) ||
335  zfcp_qdio_buffers_enqueue(qdio->res_q))
336  return -ENOMEM;
337 
338  zfcp_qdio_setup_init_data(&init_data, qdio);
340 
341  return qdio_allocate(&init_data);
342 }
343 
348 void zfcp_qdio_close(struct zfcp_qdio *qdio)
349 {
350  struct zfcp_adapter *adapter = qdio->adapter;
351  int idx, count;
352 
353  if (!(atomic_read(&adapter->status) & ZFCP_STATUS_ADAPTER_QDIOUP))
354  return;
355 
356  /* clear QDIOUP flag, thus do_QDIO is not called during qdio_shutdown */
357  spin_lock_irq(&qdio->req_q_lock);
359  spin_unlock_irq(&qdio->req_q_lock);
360 
361  wake_up(&qdio->req_q_wq);
362 
364 
365  /* cleanup used outbound sbals */
366  count = atomic_read(&qdio->req_q_free);
367  if (count < QDIO_MAX_BUFFERS_PER_Q) {
368  idx = (qdio->req_q_idx + count) % QDIO_MAX_BUFFERS_PER_Q;
369  count = QDIO_MAX_BUFFERS_PER_Q - count;
370  zfcp_qdio_zero_sbals(qdio->req_q, idx, count);
371  }
372  qdio->req_q_idx = 0;
373  atomic_set(&qdio->req_q_free, 0);
374 }
375 
381 int zfcp_qdio_open(struct zfcp_qdio *qdio)
382 {
383  struct qdio_buffer_element *sbale;
384  struct qdio_initialize init_data;
385  struct zfcp_adapter *adapter = qdio->adapter;
386  struct ccw_device *cdev = adapter->ccw_device;
387  struct qdio_ssqd_desc ssqd;
388  int cc;
389 
391  return -EIO;
392 
394  &qdio->adapter->status);
395 
396  zfcp_qdio_setup_init_data(&init_data, qdio);
397 
398  if (qdio_establish(&init_data))
399  goto failed_establish;
400 
401  if (qdio_get_ssqd_desc(init_data.cdev, &ssqd))
402  goto failed_qdio;
403 
406  &qdio->adapter->status);
407 
411  } else {
414  }
415 
416  qdio->max_sbale_per_req =
418  - 2;
419  if (qdio_activate(cdev))
420  goto failed_qdio;
421 
422  for (cc = 0; cc < QDIO_MAX_BUFFERS_PER_Q; cc++) {
423  sbale = &(qdio->res_q[cc]->element[0]);
424  sbale->length = 0;
426  sbale->sflags = 0;
427  sbale->addr = NULL;
428  }
429 
430  if (do_QDIO(cdev, QDIO_FLAG_SYNC_INPUT, 0, 0, QDIO_MAX_BUFFERS_PER_Q))
431  goto failed_qdio;
432 
433  /* set index of first available SBALS / number of available SBALS */
434  qdio->req_q_idx = 0;
435  atomic_set(&qdio->req_q_free, QDIO_MAX_BUFFERS_PER_Q);
437 
438  if (adapter->scsi_host) {
439  adapter->scsi_host->sg_tablesize = qdio->max_sbale_per_req;
440  adapter->scsi_host->max_sectors = qdio->max_sbale_per_req * 8;
441  }
442 
443  return 0;
444 
445 failed_qdio:
447 failed_establish:
448  dev_err(&cdev->dev,
449  "Setting up the QDIO connection to the FCP adapter failed\n");
450  return -EIO;
451 }
452 
453 void zfcp_qdio_destroy(struct zfcp_qdio *qdio)
454 {
455  int p;
456 
457  if (!qdio)
458  return;
459 
460  if (qdio->adapter->ccw_device)
461  qdio_free(qdio->adapter->ccw_device);
462 
463  for (p = 0; p < QDIO_MAX_BUFFERS_PER_Q; p += QBUFF_PER_PAGE) {
464  free_page((unsigned long) qdio->req_q[p]);
465  free_page((unsigned long) qdio->res_q[p]);
466  }
467 
468  kfree(qdio);
469 }
470 
471 int zfcp_qdio_setup(struct zfcp_adapter *adapter)
472 {
473  struct zfcp_qdio *qdio;
474 
475  qdio = kzalloc(sizeof(struct zfcp_qdio), GFP_KERNEL);
476  if (!qdio)
477  return -ENOMEM;
478 
479  qdio->adapter = adapter;
480 
481  if (zfcp_qdio_allocate(qdio)) {
482  zfcp_qdio_destroy(qdio);
483  return -ENOMEM;
484  }
485 
486  spin_lock_init(&qdio->req_q_lock);
487  spin_lock_init(&qdio->stat_lock);
488 
489  adapter->qdio = qdio;
490  return 0;
491 }
492 
504 void zfcp_qdio_siosl(struct zfcp_adapter *adapter)
505 {
506  int rc;
507 
509  return;
510 
511  rc = ccw_device_siosl(adapter->ccw_device);
512  if (!rc)
514  &adapter->status);
515 }