Lines Matching refs:qdio
22 static void zfcp_qdio_handler_error(struct zfcp_qdio *qdio, char *dbftag, in zfcp_qdio_handler_error() argument
25 struct zfcp_adapter *adapter = qdio->adapter; in zfcp_qdio_handler_error()
50 static inline void zfcp_qdio_account(struct zfcp_qdio *qdio) in zfcp_qdio_account() argument
56 span = (now - qdio->req_q_time) >> 12; in zfcp_qdio_account()
57 used = QDIO_MAX_BUFFERS_PER_Q - atomic_read(&qdio->req_q_free); in zfcp_qdio_account()
58 qdio->req_q_util += used * span; in zfcp_qdio_account()
59 qdio->req_q_time = now; in zfcp_qdio_account()
66 struct zfcp_qdio *qdio = (struct zfcp_qdio *) parm; in zfcp_qdio_int_req() local
69 zfcp_qdio_handler_error(qdio, "qdireq1", qdio_err); in zfcp_qdio_int_req()
74 zfcp_qdio_zero_sbals(qdio->req_q, idx, count); in zfcp_qdio_int_req()
76 spin_lock_irq(&qdio->stat_lock); in zfcp_qdio_int_req()
77 zfcp_qdio_account(qdio); in zfcp_qdio_int_req()
78 spin_unlock_irq(&qdio->stat_lock); in zfcp_qdio_int_req()
79 atomic_add(count, &qdio->req_q_free); in zfcp_qdio_int_req()
80 wake_up(&qdio->req_q_wq); in zfcp_qdio_int_req()
87 struct zfcp_qdio *qdio = (struct zfcp_qdio *) parm; in zfcp_qdio_int_resp() local
88 struct zfcp_adapter *adapter = qdio->adapter; in zfcp_qdio_int_resp()
100 sbale = qdio->res_q[idx]->element; in zfcp_qdio_int_resp()
109 pl[sbal_no] = qdio->res_q[sbal_idx]; in zfcp_qdio_int_resp()
113 zfcp_qdio_handler_error(qdio, "qdires1", qdio_err); in zfcp_qdio_int_resp()
124 zfcp_fsf_reqid_check(qdio, sbal_idx); in zfcp_qdio_int_resp()
131 zfcp_erp_adapter_reopen(qdio->adapter, 0, "qdires2"); in zfcp_qdio_int_resp()
135 zfcp_qdio_sbal_chain(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req) in zfcp_qdio_sbal_chain() argument
140 sbale = zfcp_qdio_sbale_curr(qdio, q_req); in zfcp_qdio_sbal_chain()
148 sbale = zfcp_qdio_sbale_req(qdio, q_req); in zfcp_qdio_sbal_chain()
163 sbale = zfcp_qdio_sbale_curr(qdio, q_req); in zfcp_qdio_sbal_chain()
170 zfcp_qdio_sbale_next(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req) in zfcp_qdio_sbale_next() argument
172 if (q_req->sbale_curr == qdio->max_sbale_per_sbal - 1) in zfcp_qdio_sbale_next()
173 return zfcp_qdio_sbal_chain(qdio, q_req); in zfcp_qdio_sbale_next()
175 return zfcp_qdio_sbale_curr(qdio, q_req); in zfcp_qdio_sbale_next()
185 int zfcp_qdio_sbals_from_sg(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req, in zfcp_qdio_sbals_from_sg() argument
191 sbale = zfcp_qdio_sbale_req(qdio, q_req); in zfcp_qdio_sbals_from_sg()
195 sbale = zfcp_qdio_sbale_next(qdio, q_req); in zfcp_qdio_sbals_from_sg()
197 atomic_inc(&qdio->req_q_full); in zfcp_qdio_sbals_from_sg()
198 zfcp_qdio_zero_sbals(qdio->req_q, q_req->sbal_first, in zfcp_qdio_sbals_from_sg()
208 static int zfcp_qdio_sbal_check(struct zfcp_qdio *qdio) in zfcp_qdio_sbal_check() argument
210 if (atomic_read(&qdio->req_q_free) || in zfcp_qdio_sbal_check()
211 !(atomic_read(&qdio->adapter->status) & ZFCP_STATUS_ADAPTER_QDIOUP)) in zfcp_qdio_sbal_check()
226 int zfcp_qdio_sbal_get(struct zfcp_qdio *qdio) in zfcp_qdio_sbal_get() argument
230 ret = wait_event_interruptible_lock_irq_timeout(qdio->req_q_wq, in zfcp_qdio_sbal_get()
231 zfcp_qdio_sbal_check(qdio), qdio->req_q_lock, 5 * HZ); in zfcp_qdio_sbal_get()
233 if (!(atomic_read(&qdio->adapter->status) & ZFCP_STATUS_ADAPTER_QDIOUP)) in zfcp_qdio_sbal_get()
240 atomic_inc(&qdio->req_q_full); in zfcp_qdio_sbal_get()
242 zfcp_erp_adapter_reopen(qdio->adapter, 0, "qdsbg_1"); in zfcp_qdio_sbal_get()
254 int zfcp_qdio_send(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req) in zfcp_qdio_send() argument
259 spin_lock(&qdio->stat_lock); in zfcp_qdio_send()
260 zfcp_qdio_account(qdio); in zfcp_qdio_send()
261 spin_unlock(&qdio->stat_lock); in zfcp_qdio_send()
263 atomic_sub(sbal_number, &qdio->req_q_free); in zfcp_qdio_send()
265 retval = do_QDIO(qdio->adapter->ccw_device, QDIO_FLAG_SYNC_OUTPUT, 0, in zfcp_qdio_send()
270 atomic_add(sbal_number, &qdio->req_q_free); in zfcp_qdio_send()
271 zfcp_qdio_zero_sbals(qdio->req_q, q_req->sbal_first, in zfcp_qdio_send()
277 qdio->req_q_idx += sbal_number; in zfcp_qdio_send()
278 qdio->req_q_idx %= QDIO_MAX_BUFFERS_PER_Q; in zfcp_qdio_send()
289 static int zfcp_qdio_allocate(struct zfcp_qdio *qdio) in zfcp_qdio_allocate() argument
293 ret = qdio_alloc_buffers(qdio->req_q, QDIO_MAX_BUFFERS_PER_Q); in zfcp_qdio_allocate()
297 ret = qdio_alloc_buffers(qdio->res_q, QDIO_MAX_BUFFERS_PER_Q); in zfcp_qdio_allocate()
301 init_waitqueue_head(&qdio->req_q_wq); in zfcp_qdio_allocate()
303 ret = qdio_allocate(qdio->adapter->ccw_device, 1, 1); in zfcp_qdio_allocate()
310 qdio_free_buffers(qdio->res_q, QDIO_MAX_BUFFERS_PER_Q); in zfcp_qdio_allocate()
312 qdio_free_buffers(qdio->req_q, QDIO_MAX_BUFFERS_PER_Q); in zfcp_qdio_allocate()
320 void zfcp_qdio_close(struct zfcp_qdio *qdio) in zfcp_qdio_close() argument
322 struct zfcp_adapter *adapter = qdio->adapter; in zfcp_qdio_close()
329 spin_lock_irq(&qdio->req_q_lock); in zfcp_qdio_close()
331 spin_unlock_irq(&qdio->req_q_lock); in zfcp_qdio_close()
333 wake_up(&qdio->req_q_wq); in zfcp_qdio_close()
338 count = atomic_read(&qdio->req_q_free); in zfcp_qdio_close()
340 idx = (qdio->req_q_idx + count) % QDIO_MAX_BUFFERS_PER_Q; in zfcp_qdio_close()
342 zfcp_qdio_zero_sbals(qdio->req_q, idx, count); in zfcp_qdio_close()
344 qdio->req_q_idx = 0; in zfcp_qdio_close()
345 atomic_set(&qdio->req_q_free, 0); in zfcp_qdio_close()
349 const struct zfcp_qdio *const qdio) in zfcp_qdio_shost_update() argument
356 shost->sg_tablesize = qdio->max_sbale_per_req; in zfcp_qdio_shost_update()
357 shost->max_sectors = qdio->max_sbale_per_req * 8; in zfcp_qdio_shost_update()
365 int zfcp_qdio_open(struct zfcp_qdio *qdio) in zfcp_qdio_open() argument
367 struct qdio_buffer **input_sbals[1] = {qdio->res_q}; in zfcp_qdio_open()
368 struct qdio_buffer **output_sbals[1] = {qdio->req_q}; in zfcp_qdio_open()
371 struct zfcp_adapter *adapter = qdio->adapter; in zfcp_qdio_open()
380 &qdio->adapter->status); in zfcp_qdio_open()
390 init_data.int_parm = (unsigned long) qdio; in zfcp_qdio_open()
404 &qdio->adapter->status); in zfcp_qdio_open()
408 qdio->max_sbale_per_sbal = QDIO_MAX_ELEMENTS_PER_BUFFER; in zfcp_qdio_open()
411 qdio->max_sbale_per_sbal = QDIO_MAX_ELEMENTS_PER_BUFFER - 1; in zfcp_qdio_open()
414 qdio->max_sbale_per_req = in zfcp_qdio_open()
415 ZFCP_QDIO_MAX_SBALS_PER_REQ * qdio->max_sbale_per_sbal in zfcp_qdio_open()
421 sbale = &(qdio->res_q[cc]->element[0]); in zfcp_qdio_open()
432 qdio->req_q_idx = 0; in zfcp_qdio_open()
433 atomic_set(&qdio->req_q_free, QDIO_MAX_BUFFERS_PER_Q); in zfcp_qdio_open()
434 atomic_or(ZFCP_STATUS_ADAPTER_QDIOUP, &qdio->adapter->status); in zfcp_qdio_open()
436 zfcp_qdio_shost_update(adapter, qdio); in zfcp_qdio_open()
448 void zfcp_qdio_destroy(struct zfcp_qdio *qdio) in zfcp_qdio_destroy() argument
450 if (!qdio) in zfcp_qdio_destroy()
453 if (qdio->adapter->ccw_device) in zfcp_qdio_destroy()
454 qdio_free(qdio->adapter->ccw_device); in zfcp_qdio_destroy()
456 qdio_free_buffers(qdio->req_q, QDIO_MAX_BUFFERS_PER_Q); in zfcp_qdio_destroy()
457 qdio_free_buffers(qdio->res_q, QDIO_MAX_BUFFERS_PER_Q); in zfcp_qdio_destroy()
458 kfree(qdio); in zfcp_qdio_destroy()
463 struct zfcp_qdio *qdio; in zfcp_qdio_setup() local
465 qdio = kzalloc(sizeof(struct zfcp_qdio), GFP_KERNEL); in zfcp_qdio_setup()
466 if (!qdio) in zfcp_qdio_setup()
469 qdio->adapter = adapter; in zfcp_qdio_setup()
471 if (zfcp_qdio_allocate(qdio)) { in zfcp_qdio_setup()
472 kfree(qdio); in zfcp_qdio_setup()
476 spin_lock_init(&qdio->req_q_lock); in zfcp_qdio_setup()
477 spin_lock_init(&qdio->stat_lock); in zfcp_qdio_setup()
479 adapter->qdio = qdio; in zfcp_qdio_setup()