Lines Matching refs:qdio

21 static void zfcp_qdio_handler_error(struct zfcp_qdio *qdio, char *id,  in zfcp_qdio_handler_error()  argument
24 struct zfcp_adapter *adapter = qdio->adapter; in zfcp_qdio_handler_error()
49 static inline void zfcp_qdio_account(struct zfcp_qdio *qdio) in zfcp_qdio_account() argument
55 span = (now - qdio->req_q_time) >> 12; in zfcp_qdio_account()
56 used = QDIO_MAX_BUFFERS_PER_Q - atomic_read(&qdio->req_q_free); in zfcp_qdio_account()
57 qdio->req_q_util += used * span; in zfcp_qdio_account()
58 qdio->req_q_time = now; in zfcp_qdio_account()
65 struct zfcp_qdio *qdio = (struct zfcp_qdio *) parm; in zfcp_qdio_int_req() local
68 zfcp_qdio_handler_error(qdio, "qdireq1", qdio_err); in zfcp_qdio_int_req()
73 zfcp_qdio_zero_sbals(qdio->req_q, idx, count); in zfcp_qdio_int_req()
75 spin_lock_irq(&qdio->stat_lock); in zfcp_qdio_int_req()
76 zfcp_qdio_account(qdio); in zfcp_qdio_int_req()
77 spin_unlock_irq(&qdio->stat_lock); in zfcp_qdio_int_req()
78 atomic_add(count, &qdio->req_q_free); in zfcp_qdio_int_req()
79 wake_up(&qdio->req_q_wq); in zfcp_qdio_int_req()
86 struct zfcp_qdio *qdio = (struct zfcp_qdio *) parm; in zfcp_qdio_int_resp() local
87 struct zfcp_adapter *adapter = qdio->adapter; in zfcp_qdio_int_resp()
99 sbale = qdio->res_q[idx]->element; in zfcp_qdio_int_resp()
108 pl[sbal_no] = qdio->res_q[sbal_idx]; in zfcp_qdio_int_resp()
112 zfcp_qdio_handler_error(qdio, "qdires1", qdio_err); in zfcp_qdio_int_resp()
123 zfcp_fsf_reqid_check(qdio, sbal_idx); in zfcp_qdio_int_resp()
130 zfcp_erp_adapter_reopen(qdio->adapter, 0, "qdires2"); in zfcp_qdio_int_resp()
134 zfcp_qdio_sbal_chain(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req) in zfcp_qdio_sbal_chain() argument
139 sbale = zfcp_qdio_sbale_curr(qdio, q_req); in zfcp_qdio_sbal_chain()
147 sbale = zfcp_qdio_sbale_req(qdio, q_req); in zfcp_qdio_sbal_chain()
162 sbale = zfcp_qdio_sbale_curr(qdio, q_req); in zfcp_qdio_sbal_chain()
169 zfcp_qdio_sbale_next(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req) in zfcp_qdio_sbale_next() argument
171 if (q_req->sbale_curr == qdio->max_sbale_per_sbal - 1) in zfcp_qdio_sbale_next()
172 return zfcp_qdio_sbal_chain(qdio, q_req); in zfcp_qdio_sbale_next()
174 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 retval = do_QDIO(qdio->adapter->ccw_device, QDIO_FLAG_SYNC_OUTPUT, 0, in zfcp_qdio_send()
267 zfcp_qdio_zero_sbals(qdio->req_q, q_req->sbal_first, in zfcp_qdio_send()
273 atomic_sub(sbal_number, &qdio->req_q_free); in zfcp_qdio_send()
274 qdio->req_q_idx += sbal_number; in zfcp_qdio_send()
275 qdio->req_q_idx %= QDIO_MAX_BUFFERS_PER_Q; in zfcp_qdio_send()
282 struct zfcp_qdio *qdio) in zfcp_qdio_setup_init_data() argument
285 id->cdev = qdio->adapter->ccw_device; in zfcp_qdio_setup_init_data()
296 id->int_parm = (unsigned long) qdio; in zfcp_qdio_setup_init_data()
297 id->input_sbal_addr_array = (void **) (qdio->res_q); in zfcp_qdio_setup_init_data()
298 id->output_sbal_addr_array = (void **) (qdio->req_q); in zfcp_qdio_setup_init_data()
309 static int zfcp_qdio_allocate(struct zfcp_qdio *qdio) in zfcp_qdio_allocate() argument
314 ret = qdio_alloc_buffers(qdio->req_q, QDIO_MAX_BUFFERS_PER_Q); in zfcp_qdio_allocate()
318 ret = qdio_alloc_buffers(qdio->res_q, QDIO_MAX_BUFFERS_PER_Q); in zfcp_qdio_allocate()
322 zfcp_qdio_setup_init_data(&init_data, qdio); in zfcp_qdio_allocate()
323 init_waitqueue_head(&qdio->req_q_wq); in zfcp_qdio_allocate()
332 qdio_free_buffers(qdio->res_q, QDIO_MAX_BUFFERS_PER_Q); in zfcp_qdio_allocate()
334 qdio_free_buffers(qdio->req_q, QDIO_MAX_BUFFERS_PER_Q); in zfcp_qdio_allocate()
342 void zfcp_qdio_close(struct zfcp_qdio *qdio) in zfcp_qdio_close() argument
344 struct zfcp_adapter *adapter = qdio->adapter; in zfcp_qdio_close()
351 spin_lock_irq(&qdio->req_q_lock); in zfcp_qdio_close()
353 spin_unlock_irq(&qdio->req_q_lock); in zfcp_qdio_close()
355 wake_up(&qdio->req_q_wq); in zfcp_qdio_close()
360 count = atomic_read(&qdio->req_q_free); in zfcp_qdio_close()
362 idx = (qdio->req_q_idx + count) % QDIO_MAX_BUFFERS_PER_Q; in zfcp_qdio_close()
364 zfcp_qdio_zero_sbals(qdio->req_q, idx, count); in zfcp_qdio_close()
366 qdio->req_q_idx = 0; in zfcp_qdio_close()
367 atomic_set(&qdio->req_q_free, 0); in zfcp_qdio_close()
375 int zfcp_qdio_open(struct zfcp_qdio *qdio) in zfcp_qdio_open() argument
379 struct zfcp_adapter *adapter = qdio->adapter; in zfcp_qdio_open()
388 &qdio->adapter->status); in zfcp_qdio_open()
390 zfcp_qdio_setup_init_data(&init_data, qdio); in zfcp_qdio_open()
400 &qdio->adapter->status); in zfcp_qdio_open()
404 qdio->max_sbale_per_sbal = QDIO_MAX_ELEMENTS_PER_BUFFER; in zfcp_qdio_open()
407 qdio->max_sbale_per_sbal = QDIO_MAX_ELEMENTS_PER_BUFFER - 1; in zfcp_qdio_open()
410 qdio->max_sbale_per_req = in zfcp_qdio_open()
411 ZFCP_QDIO_MAX_SBALS_PER_REQ * qdio->max_sbale_per_sbal in zfcp_qdio_open()
417 sbale = &(qdio->res_q[cc]->element[0]); in zfcp_qdio_open()
428 qdio->req_q_idx = 0; in zfcp_qdio_open()
429 atomic_set(&qdio->req_q_free, QDIO_MAX_BUFFERS_PER_Q); in zfcp_qdio_open()
430 atomic_set_mask(ZFCP_STATUS_ADAPTER_QDIOUP, &qdio->adapter->status); in zfcp_qdio_open()
433 adapter->scsi_host->sg_tablesize = qdio->max_sbale_per_req; in zfcp_qdio_open()
434 adapter->scsi_host->max_sectors = qdio->max_sbale_per_req * 8; in zfcp_qdio_open()
447 void zfcp_qdio_destroy(struct zfcp_qdio *qdio) in zfcp_qdio_destroy() argument
449 if (!qdio) in zfcp_qdio_destroy()
452 if (qdio->adapter->ccw_device) in zfcp_qdio_destroy()
453 qdio_free(qdio->adapter->ccw_device); in zfcp_qdio_destroy()
455 qdio_free_buffers(qdio->req_q, QDIO_MAX_BUFFERS_PER_Q); in zfcp_qdio_destroy()
456 qdio_free_buffers(qdio->res_q, QDIO_MAX_BUFFERS_PER_Q); in zfcp_qdio_destroy()
457 kfree(qdio); in zfcp_qdio_destroy()
462 struct zfcp_qdio *qdio; in zfcp_qdio_setup() local
464 qdio = kzalloc(sizeof(struct zfcp_qdio), GFP_KERNEL); in zfcp_qdio_setup()
465 if (!qdio) in zfcp_qdio_setup()
468 qdio->adapter = adapter; in zfcp_qdio_setup()
470 if (zfcp_qdio_allocate(qdio)) { in zfcp_qdio_setup()
471 kfree(qdio); in zfcp_qdio_setup()
475 spin_lock_init(&qdio->req_q_lock); in zfcp_qdio_setup()
476 spin_lock_init(&qdio->stat_lock); in zfcp_qdio_setup()
478 adapter->qdio = qdio; in zfcp_qdio_setup()