Lines Matching defs:qdio
26 static void zfcp_qdio_handler_error(struct zfcp_qdio *qdio, char *dbftag,
29 struct zfcp_adapter *adapter = qdio->adapter;
54 static inline void zfcp_qdio_account(struct zfcp_qdio *qdio)
60 span = (now - qdio->req_q_time) >> 12;
61 used = QDIO_MAX_BUFFERS_PER_Q - atomic_read(&qdio->req_q_free);
62 qdio->req_q_util += used * span;
63 qdio->req_q_time = now;
70 struct zfcp_qdio *qdio = (struct zfcp_qdio *) parm;
72 zfcp_qdio_handler_error(qdio, "qdireq1", qdio_err);
77 struct zfcp_qdio *qdio = from_tasklet(qdio, tasklet, request_tasklet);
78 struct ccw_device *cdev = qdio->adapter->ccw_device;
85 zfcp_qdio_handler_error(qdio, "qdreqt1", error);
88 zfcp_qdio_zero_sbals(qdio->req_q, start, completed);
90 spin_lock_irq(&qdio->stat_lock);
91 zfcp_qdio_account(qdio);
92 spin_unlock_irq(&qdio->stat_lock);
93 atomic_add(completed, &qdio->req_q_free);
94 wake_up(&qdio->req_q_wq);
98 if (atomic_read(&qdio->req_q_free) < QDIO_MAX_BUFFERS_PER_Q)
99 timer_reduce(&qdio->request_timer,
105 struct zfcp_qdio *qdio = from_timer(qdio, timer, request_timer);
107 tasklet_schedule(&qdio->request_tasklet);
114 struct zfcp_qdio *qdio = (struct zfcp_qdio *) parm;
115 struct zfcp_adapter *adapter = qdio->adapter;
127 sbale = qdio->res_q[idx]->element;
136 pl[sbal_no] = qdio->res_q[sbal_idx];
140 zfcp_qdio_handler_error(qdio, "qdires1", qdio_err);
151 zfcp_fsf_reqid_check(qdio, sbal_idx);
158 zfcp_erp_adapter_reopen(qdio->adapter, 0, "qdires2");
163 struct zfcp_qdio *qdio = from_tasklet(qdio, tasklet, irq_tasklet);
164 struct ccw_device *cdev = qdio->adapter->ccw_device;
168 if (atomic_read(&qdio->req_q_free) < QDIO_MAX_BUFFERS_PER_Q)
169 tasklet_schedule(&qdio->request_tasklet);
177 (unsigned long) qdio);
181 tasklet_schedule(&qdio->irq_tasklet);
186 struct zfcp_qdio *qdio = (struct zfcp_qdio *) data;
188 tasklet_schedule(&qdio->irq_tasklet);
192 zfcp_qdio_sbal_chain(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req)
197 sbale = zfcp_qdio_sbale_curr(qdio, q_req);
205 sbale = zfcp_qdio_sbale_req(qdio, q_req);
220 sbale = zfcp_qdio_sbale_curr(qdio, q_req);
227 zfcp_qdio_sbale_next(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req)
229 if (q_req->sbale_curr == qdio->max_sbale_per_sbal - 1)
230 return zfcp_qdio_sbal_chain(qdio, q_req);
232 return zfcp_qdio_sbale_curr(qdio, q_req);
237 * @qdio: pointer to struct zfcp_qdio
242 int zfcp_qdio_sbals_from_sg(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req,
248 sbale = zfcp_qdio_sbale_req(qdio, q_req);
252 sbale = zfcp_qdio_sbale_next(qdio, q_req);
254 atomic_inc(&qdio->req_q_full);
255 zfcp_qdio_zero_sbals(qdio->req_q, q_req->sbal_first,
265 static int zfcp_qdio_sbal_check(struct zfcp_qdio *qdio)
267 if (atomic_read(&qdio->req_q_free) ||
268 !(atomic_read(&qdio->adapter->status) & ZFCP_STATUS_ADAPTER_QDIOUP))
275 * @qdio: pointer to struct zfcp_qdio
283 int zfcp_qdio_sbal_get(struct zfcp_qdio *qdio)
287 ret = wait_event_interruptible_lock_irq_timeout(qdio->req_q_wq,
288 zfcp_qdio_sbal_check(qdio), qdio->req_q_lock, 5 * HZ);
290 if (!(atomic_read(&qdio->adapter->status) & ZFCP_STATUS_ADAPTER_QDIOUP))
297 atomic_inc(&qdio->req_q_full);
299 zfcp_erp_adapter_reopen(qdio->adapter, 0, "qdsbg_1");
307 * @qdio: pointer to struct zfcp_qdio
311 int zfcp_qdio_send(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req)
323 spin_lock(&qdio->stat_lock);
324 zfcp_qdio_account(qdio);
325 spin_unlock(&qdio->stat_lock);
327 atomic_sub(sbal_number, &qdio->req_q_free);
329 retval = qdio_add_bufs_to_output_queue(qdio->adapter->ccw_device, 0,
335 atomic_add(sbal_number, &qdio->req_q_free);
336 zfcp_qdio_zero_sbals(qdio->req_q, q_req->sbal_first,
341 if (atomic_read(&qdio->req_q_free) <= 2 * ZFCP_QDIO_MAX_SBALS_PER_REQ)
342 tasklet_schedule(&qdio->request_tasklet);
344 timer_reduce(&qdio->request_timer,
348 qdio->req_q_idx += sbal_number;
349 qdio->req_q_idx %= QDIO_MAX_BUFFERS_PER_Q;
356 * @qdio: pointer to struct zfcp_qdio
360 static int zfcp_qdio_allocate(struct zfcp_qdio *qdio)
364 ret = qdio_alloc_buffers(qdio->req_q, QDIO_MAX_BUFFERS_PER_Q);
368 ret = qdio_alloc_buffers(qdio->res_q, QDIO_MAX_BUFFERS_PER_Q);
372 init_waitqueue_head(&qdio->req_q_wq);
374 ret = qdio_allocate(qdio->adapter->ccw_device, 1, 1);
381 qdio_free_buffers(qdio->res_q, QDIO_MAX_BUFFERS_PER_Q);
383 qdio_free_buffers(qdio->req_q, QDIO_MAX_BUFFERS_PER_Q);
388 * zfcp_qdio_close - close qdio queues for an adapter
389 * @qdio: pointer to structure zfcp_qdio
391 void zfcp_qdio_close(struct zfcp_qdio *qdio)
393 struct zfcp_adapter *adapter = qdio->adapter;
403 spin_lock_irq(&qdio->req_q_lock);
405 spin_unlock_irq(&qdio->req_q_lock);
407 wake_up(&qdio->req_q_wq);
409 tasklet_disable(&qdio->irq_tasklet);
410 tasklet_disable(&qdio->request_tasklet);
411 del_timer_sync(&qdio->request_timer);
416 count = atomic_read(&qdio->req_q_free);
418 idx = (qdio->req_q_idx + count) % QDIO_MAX_BUFFERS_PER_Q;
420 zfcp_qdio_zero_sbals(qdio->req_q, idx, count);
422 qdio->req_q_idx = 0;
423 atomic_set(&qdio->req_q_free, 0);
427 const struct zfcp_qdio *const qdio)
434 shost->sg_tablesize = qdio->max_sbale_per_req;
435 shost->max_sectors = qdio->max_sbale_per_req * 8;
440 * @qdio: pointer to struct zfcp_qdio
443 int zfcp_qdio_open(struct zfcp_qdio *qdio)
445 struct qdio_buffer **input_sbals[1] = {qdio->res_q};
446 struct qdio_buffer **output_sbals[1] = {qdio->req_q};
449 struct zfcp_adapter *adapter = qdio->adapter;
458 &qdio->adapter->status);
469 init_data.int_parm = (unsigned long) qdio;
481 &qdio->adapter->status);
485 qdio->max_sbale_per_sbal = QDIO_MAX_ELEMENTS_PER_BUFFER;
488 qdio->max_sbale_per_sbal = QDIO_MAX_ELEMENTS_PER_BUFFER - 1;
491 qdio->max_sbale_per_req =
492 ZFCP_QDIO_MAX_SBALS_PER_REQ * qdio->max_sbale_per_sbal
498 sbale = &(qdio->res_q[cc]->element[0]);
509 qdio->req_q_idx = 0;
510 atomic_set(&qdio->req_q_free, QDIO_MAX_BUFFERS_PER_Q);
511 atomic_or(ZFCP_STATUS_ADAPTER_QDIOUP, &qdio->adapter->status);
514 tasklet_enable(&qdio->request_tasklet);
516 tasklet_enable(&qdio->irq_tasklet);
518 tasklet_schedule(&qdio->irq_tasklet);
520 zfcp_qdio_shost_update(adapter, qdio);
532 void zfcp_qdio_destroy(struct zfcp_qdio *qdio)
534 if (!qdio)
537 tasklet_kill(&qdio->irq_tasklet);
538 tasklet_kill(&qdio->request_tasklet);
540 if (qdio->adapter->ccw_device)
541 qdio_free(qdio->adapter->ccw_device);
543 qdio_free_buffers(qdio->req_q, QDIO_MAX_BUFFERS_PER_Q);
544 qdio_free_buffers(qdio->res_q, QDIO_MAX_BUFFERS_PER_Q);
545 kfree(qdio);
550 struct zfcp_qdio *qdio;
552 qdio = kzalloc(sizeof(struct zfcp_qdio), GFP_KERNEL);
553 if (!qdio)
556 qdio->adapter = adapter;
558 if (zfcp_qdio_allocate(qdio)) {
559 kfree(qdio);
563 spin_lock_init(&qdio->req_q_lock);
564 spin_lock_init(&qdio->stat_lock);
565 timer_setup(&qdio->request_timer, zfcp_qdio_request_timer, 0);
566 tasklet_setup(&qdio->irq_tasklet, zfcp_qdio_irq_tasklet);
567 tasklet_setup(&qdio->request_tasklet, zfcp_qdio_request_tasklet);
568 tasklet_disable(&qdio->irq_tasklet);
569 tasklet_disable(&qdio->request_tasklet);
571 adapter->qdio = qdio;
581 * triggered once before going through qdio shutdown.
583 * The triggers are always run from qdio tasklet context, so no