7 #include <linux/kernel.h>
8 #include <linux/slab.h>
9 #include <linux/export.h>
25 return kmem_cache_zalloc(qdio_aob_cache,
GFP_ATOMIC);
39 static inline int qebsm_possible(
void)
52 unsigned int qib_param_field_format,
53 unsigned char *qib_param_field,
54 unsigned long *input_slib_elements,
55 unsigned long *output_slib_elements)
63 irq_ptr->
qib.pfmt = qib_param_field_format;
65 memcpy(irq_ptr->
qib.parm, qib_param_field,
68 if (!input_slib_elements)
73 q->
slib->slibe[j].parms =
74 input_slib_elements[i * QDIO_MAX_BUFFERS_PER_Q + j];
77 if (!output_slib_elements)
82 q->
slib->slibe[j].parms =
83 output_slib_elements[i * QDIO_MAX_BUFFERS_PER_Q + j];
87 static int __qdio_allocate_qs(
struct qdio_q **irq_ptr_qs,
int nr_queues)
92 for (i = 0; i < nr_queues; i++) {
111 rc = __qdio_allocate_qs(irq_ptr->
input_qs, nr_input_qs);
114 rc = __qdio_allocate_qs(irq_ptr->
output_qs, nr_output_qs);
118 static void setup_queues_misc(
struct qdio_q *q,
struct qdio_irq *irq_ptr,
128 q->
mask = 1 << (31 -
i);
133 static void setup_storage_lists(
struct qdio_q *q,
struct qdio_irq *irq_ptr,
134 void **sbals_array,
int i)
139 DBF_HEX(&q,
sizeof(
void *));
144 q->sbal[
j] = *sbals_array++;
145 BUG_ON((
unsigned long)q->sbal[j] & 0xff);
152 prev->
slib->nsliba = (
unsigned long)q->
slib;
156 q->
slib->slsba = (
unsigned long)&q->
slsb.val[0];
160 q->
sl->element[j].sbal = (
unsigned long)q->sbal[
j];
163 static void setup_queues(
struct qdio_irq *irq_ptr,
181 setup_storage_lists(q, irq_ptr, input_sbal_array, i);
197 q->
u.
out.sbal_state = output_sbal_state_array;
202 setup_storage_lists(q, irq_ptr, output_sbal_array, i);
212 static void process_ac_flags(
struct qdio_irq *irq_ptr,
unsigned char qdioac)
223 irq_ptr->
siga_flag.sync_out_after_pci = 1;
226 static void check_and_setup_qebsm(
struct qdio_irq *irq_ptr,
227 unsigned char qdioac,
unsigned long token)
297 unsigned char qdioac;
305 qdioac = AC1_SIGA_INPUT_NEEDED | AC1_SIGA_OUTPUT_NEEDED |
310 check_and_setup_qebsm(irq_ptr, qdioac, irq_ptr->
ssqd_desc.sch_token);
311 process_ac_flags(irq_ptr, qdioac);
335 if (q->
u.
out.use_cq) {
357 static void __qdio_allocate_fill_qdr(
struct qdio_irq *irq_ptr,
358 struct qdio_q **irq_ptr_qs,
361 irq_ptr->
qdr->qdf0[i +
nr].sliba =
362 (
unsigned long)irq_ptr_qs[i]->slib;
364 irq_ptr->
qdr->qdf0[i +
nr].sla =
365 (
unsigned long)irq_ptr_qs[i]->
sl;
367 irq_ptr->
qdr->qdf0[i +
nr].slsba =
376 static void setup_qdr(
struct qdio_irq *irq_ptr,
387 irq_ptr->
qdr->qiba = (
unsigned long)&irq_ptr->
qib;
391 __qdio_allocate_fill_qdr(irq_ptr, irq_ptr->
input_qs, i, 0);
394 __qdio_allocate_fill_qdr(irq_ptr, irq_ptr->
output_qs, i,
398 static void setup_qib(
struct qdio_irq *irq_ptr,
401 if (qebsm_possible())
408 irq_ptr->
qib.isliba =
411 irq_ptr->
qib.osliba =
419 struct qdio_irq *irq_ptr = init_data->
cdev->private->qdio_data;
440 setup_queues(irq_ptr, init_data);
442 setup_qib(irq_ptr, init_data);
450 setup_qdr(irq_ptr, init_data);
485 snprintf(s, 80,
"qdio: %s %s on SC %x using "
486 "AI:%d QEBSM:%d PCI:%d TDD:%d SIGA:%s%s%s%s%s\n",
487 dev_name(&cdev->
dev),
490 irq_ptr->
schid.sch_no,
498 (irq_ptr->
siga_flag.sync_after_ai) ?
"A" :
" ",
499 (irq_ptr->
siga_flag.sync_out_after_pci) ?
"P" :
" ");
505 outq->
aobs = kzalloc(
sizeof(
struct qaob *) * QDIO_MAX_BUFFERS_PER_Q,
536 if (!qdio_aob_cache) {
538 goto free_qdio_q_cache;
546 DBF_EVENT(
"cssQEBSM:%1d", (qebsm_possible()) ? 1 : 0);