aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/s390
diff options
context:
space:
mode:
authorEinar Lueck <elelueck@de.ibm.com>2011-08-07 21:33:58 -0400
committerDavid S. Miller <davem@davemloft.net>2011-08-13 04:10:16 -0400
commit0da9581ddb0ffbec8129504d661b563749160e70 (patch)
tree9638d1ffcb05b0c51ab450967126c346e3db9982 /drivers/s390
parentaae7ea8d54f4fa6f016fffa2dbe170d0e7851dd0 (diff)
qeth: exploit asynchronous delivery of storage blocks
This patch exploits the QDIO support for asynchronous delivery of storage blocks for Hipersockets. The exploitation is not configured per default and may be enabled via the function qeth_configure_cq. Signed-off-by: Einar Lueck <elelueck@de.ibm.com> Signed-off-by: Frank Blaschka <frank.blaschka@de.ibm.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/s390')
-rw-r--r--drivers/s390/net/qeth_core.h28
-rw-r--r--drivers/s390/net/qeth_core_main.c495
2 files changed, 480 insertions, 43 deletions
diff --git a/drivers/s390/net/qeth_core.h b/drivers/s390/net/qeth_core.h
index 8a58820b4c0f..2c25ed0a49ca 100644
--- a/drivers/s390/net/qeth_core.h
+++ b/drivers/s390/net/qeth_core.h
@@ -110,6 +110,10 @@ struct qeth_perf_stats {
110 110
111 unsigned int sc_dp_p; 111 unsigned int sc_dp_p;
112 unsigned int sc_p_dp; 112 unsigned int sc_p_dp;
113 /* qdio_cq_handler: number of times called, time spent in */
114 __u64 cq_start_time;
115 unsigned int cq_cnt;
116 unsigned int cq_time;
113 /* qdio_input_handler: number of times called, time spent in */ 117 /* qdio_input_handler: number of times called, time spent in */
114 __u64 inbound_start_time; 118 __u64 inbound_start_time;
115 unsigned int inbound_cnt; 119 unsigned int inbound_cnt;
@@ -376,6 +380,11 @@ enum qeth_qdio_buffer_states {
376 * outbound: filled by driver; owned by hardware in order to be sent 380 * outbound: filled by driver; owned by hardware in order to be sent
377 */ 381 */
378 QETH_QDIO_BUF_PRIMED, 382 QETH_QDIO_BUF_PRIMED,
383 /*
384 * inbound: not applicable
385 * outbound: handled via transfer pending / completion queue
386 */
387 QETH_QDIO_BUF_HANDLED_DELAYED,
379}; 388};
380 389
381enum qeth_qdio_info_states { 390enum qeth_qdio_info_states {
@@ -413,8 +422,11 @@ struct qeth_qdio_out_buffer {
413 atomic_t state; 422 atomic_t state;
414 int next_element_to_fill; 423 int next_element_to_fill;
415 struct sk_buff_head skb_list; 424 struct sk_buff_head skb_list;
416 struct list_head ctx_list;
417 int is_header[16]; 425 int is_header[16];
426
427 struct qaob *aob;
428 struct qeth_qdio_out_q *q;
429 struct qeth_qdio_out_buffer *next_pending;
418}; 430};
419 431
420struct qeth_card; 432struct qeth_card;
@@ -427,7 +439,8 @@ enum qeth_out_q_states {
427 439
428struct qeth_qdio_out_q { 440struct qeth_qdio_out_q {
429 struct qdio_buffer qdio_bufs[QDIO_MAX_BUFFERS_PER_Q]; 441 struct qdio_buffer qdio_bufs[QDIO_MAX_BUFFERS_PER_Q];
430 struct qeth_qdio_out_buffer bufs[QDIO_MAX_BUFFERS_PER_Q]; 442 struct qeth_qdio_out_buffer *bufs[QDIO_MAX_BUFFERS_PER_Q];
443 struct qdio_outbuf_state *bufstates; /* convenience pointer */
431 int queue_no; 444 int queue_no;
432 struct qeth_card *card; 445 struct qeth_card *card;
433 atomic_t state; 446 atomic_t state;
@@ -448,7 +461,9 @@ struct qeth_qdio_out_q {
448struct qeth_qdio_info { 461struct qeth_qdio_info {
449 atomic_t state; 462 atomic_t state;
450 /* input */ 463 /* input */
464 int no_in_queues;
451 struct qeth_qdio_q *in_q; 465 struct qeth_qdio_q *in_q;
466 struct qeth_qdio_q *c_q;
452 struct qeth_qdio_buffer_pool in_buf_pool; 467 struct qeth_qdio_buffer_pool in_buf_pool;
453 struct qeth_qdio_buffer_pool init_pool; 468 struct qeth_qdio_buffer_pool init_pool;
454 int in_buf_size; 469 int in_buf_size;
@@ -456,6 +471,7 @@ struct qeth_qdio_info {
456 /* output */ 471 /* output */
457 int no_out_queues; 472 int no_out_queues;
458 struct qeth_qdio_out_q **out_qs; 473 struct qeth_qdio_out_q **out_qs;
474 struct qdio_outbuf_state *out_bufstates;
459 475
460 /* priority queueing */ 476 /* priority queueing */
461 int do_prio_queueing; 477 int do_prio_queueing;
@@ -527,6 +543,12 @@ enum qeth_cmd_buffer_state {
527 BUF_STATE_PROCESSED, 543 BUF_STATE_PROCESSED,
528}; 544};
529 545
546enum qeth_cq {
547 QETH_CQ_DISABLED = 0,
548 QETH_CQ_ENABLED = 1,
549 QETH_CQ_NOTAVAILABLE = 2,
550};
551
530struct qeth_ipato { 552struct qeth_ipato {
531 int enabled; 553 int enabled;
532 int invert4; 554 int invert4;
@@ -651,6 +673,7 @@ struct qeth_card_options {
651 int rx_sg_cb; 673 int rx_sg_cb;
652 enum qeth_ipa_isolation_modes isolation; 674 enum qeth_ipa_isolation_modes isolation;
653 int sniffer; 675 int sniffer;
676 enum qeth_cq cq;
654}; 677};
655 678
656/* 679/*
@@ -888,6 +911,7 @@ void qeth_dbf_longtext(debug_info_t *id, int level, char *text, ...);
888int qeth_core_ethtool_get_settings(struct net_device *, struct ethtool_cmd *); 911int qeth_core_ethtool_get_settings(struct net_device *, struct ethtool_cmd *);
889int qeth_set_access_ctrl_online(struct qeth_card *card); 912int qeth_set_access_ctrl_online(struct qeth_card *card);
890int qeth_hdr_chk_and_bounce(struct sk_buff *, int); 913int qeth_hdr_chk_and_bounce(struct sk_buff *, int);
914int qeth_configure_cq(struct qeth_card *, enum qeth_cq);
891int qeth_hw_trap(struct qeth_card *, enum qeth_diags_trap_action); 915int qeth_hw_trap(struct qeth_card *, enum qeth_diags_trap_action);
892int qeth_query_ipassists(struct qeth_card *, enum qeth_prot_versions prot); 916int qeth_query_ipassists(struct qeth_card *, enum qeth_prot_versions prot);
893 917
diff --git a/drivers/s390/net/qeth_core_main.c b/drivers/s390/net/qeth_core_main.c
index 8d804be9f043..68a92b06526b 100644
--- a/drivers/s390/net/qeth_core_main.c
+++ b/drivers/s390/net/qeth_core_main.c
@@ -44,6 +44,7 @@ struct qeth_card_list_struct qeth_core_card_list;
44EXPORT_SYMBOL_GPL(qeth_core_card_list); 44EXPORT_SYMBOL_GPL(qeth_core_card_list);
45struct kmem_cache *qeth_core_header_cache; 45struct kmem_cache *qeth_core_header_cache;
46EXPORT_SYMBOL_GPL(qeth_core_header_cache); 46EXPORT_SYMBOL_GPL(qeth_core_header_cache);
47static struct kmem_cache *qeth_qdio_outbuf_cache;
47 48
48static struct device *qeth_core_root_dev; 49static struct device *qeth_core_root_dev;
49static unsigned int known_devices[][6] = QETH_MODELLIST_ARRAY; 50static unsigned int known_devices[][6] = QETH_MODELLIST_ARRAY;
@@ -56,6 +57,10 @@ static struct qeth_cmd_buffer *qeth_get_buffer(struct qeth_channel *);
56static void qeth_setup_ccw(struct qeth_channel *, unsigned char *, __u32); 57static void qeth_setup_ccw(struct qeth_channel *, unsigned char *, __u32);
57static void qeth_free_buffer_pool(struct qeth_card *); 58static void qeth_free_buffer_pool(struct qeth_card *);
58static int qeth_qdio_establish(struct qeth_card *); 59static int qeth_qdio_establish(struct qeth_card *);
60static void qeth_free_qdio_buffers(struct qeth_card *);
61static void qeth_clear_output_buffer(struct qeth_qdio_out_q *queue,
62 struct qeth_qdio_out_buffer *buf,
63 enum qeth_qdio_buffer_states newbufstate);
59 64
60 65
61static inline const char *qeth_get_cardname(struct qeth_card *card) 66static inline const char *qeth_get_cardname(struct qeth_card *card)
@@ -239,6 +244,150 @@ int qeth_realloc_buffer_pool(struct qeth_card *card, int bufcnt)
239} 244}
240EXPORT_SYMBOL_GPL(qeth_realloc_buffer_pool); 245EXPORT_SYMBOL_GPL(qeth_realloc_buffer_pool);
241 246
247static inline int qeth_cq_init(struct qeth_card *card)
248{
249 int rc;
250
251 if (card->options.cq == QETH_CQ_ENABLED) {
252 QETH_DBF_TEXT(SETUP, 2, "cqinit");
253 memset(card->qdio.c_q->qdio_bufs, 0,
254 QDIO_MAX_BUFFERS_PER_Q * sizeof(struct qdio_buffer));
255 card->qdio.c_q->next_buf_to_init = 127;
256 rc = do_QDIO(CARD_DDEV(card), QDIO_FLAG_SYNC_INPUT,
257 card->qdio.no_in_queues - 1, 0,
258 127);
259 if (rc) {
260 QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc);
261 goto out;
262 }
263 }
264 rc = 0;
265out:
266 return rc;
267}
268
269static inline int qeth_alloc_cq(struct qeth_card *card)
270{
271 int rc;
272
273 if (card->options.cq == QETH_CQ_ENABLED) {
274 int i;
275 struct qdio_outbuf_state *outbuf_states;
276
277 QETH_DBF_TEXT(SETUP, 2, "cqon");
278 card->qdio.c_q = kzalloc(sizeof(struct qeth_qdio_q),
279 GFP_KERNEL);
280 if (!card->qdio.c_q) {
281 rc = -1;
282 goto kmsg_out;
283 }
284 QETH_DBF_HEX(SETUP, 2, &card->qdio.c_q, sizeof(void *));
285
286 for (i = 0; i < QDIO_MAX_BUFFERS_PER_Q; ++i) {
287 card->qdio.c_q->bufs[i].buffer =
288 &card->qdio.c_q->qdio_bufs[i];
289 }
290
291 card->qdio.no_in_queues = 2;
292
293 card->qdio.out_bufstates = (struct qdio_outbuf_state *)
294 kzalloc(card->qdio.no_out_queues *
295 QDIO_MAX_BUFFERS_PER_Q *
296 sizeof(struct qdio_outbuf_state), GFP_KERNEL);
297 outbuf_states = card->qdio.out_bufstates;
298 if (outbuf_states == NULL) {
299 rc = -1;
300 goto free_cq_out;
301 }
302 for (i = 0; i < card->qdio.no_out_queues; ++i) {
303 card->qdio.out_qs[i]->bufstates = outbuf_states;
304 outbuf_states += QDIO_MAX_BUFFERS_PER_Q;
305 }
306 } else {
307 QETH_DBF_TEXT(SETUP, 2, "nocq");
308 card->qdio.c_q = NULL;
309 card->qdio.no_in_queues = 1;
310 }
311 QETH_DBF_TEXT_(SETUP, 2, "iqc%d", card->qdio.no_in_queues);
312 rc = 0;
313out:
314 return rc;
315free_cq_out:
316 kfree(card->qdio.c_q);
317 card->qdio.c_q = NULL;
318kmsg_out:
319 dev_err(&card->gdev->dev, "Failed to create completion queue\n");
320 goto out;
321}
322
323static inline void qeth_free_cq(struct qeth_card *card)
324{
325 if (card->qdio.c_q) {
326 --card->qdio.no_in_queues;
327 kfree(card->qdio.c_q);
328 card->qdio.c_q = NULL;
329 }
330 kfree(card->qdio.out_bufstates);
331 card->qdio.out_bufstates = NULL;
332}
333
334static inline void qeth_cleanup_handled_pending(struct qeth_qdio_out_q *q,
335 int bidx, int forced_cleanup)
336{
337 if (q->bufs[bidx]->next_pending != NULL) {
338 struct qeth_qdio_out_buffer *head = q->bufs[bidx];
339 struct qeth_qdio_out_buffer *c = q->bufs[bidx]->next_pending;
340
341 while (c) {
342 if (forced_cleanup ||
343 atomic_read(&c->state) ==
344 QETH_QDIO_BUF_HANDLED_DELAYED) {
345 struct qeth_qdio_out_buffer *f = c;
346 QETH_CARD_TEXT(f->q->card, 5, "fp");
347 QETH_CARD_TEXT_(f->q->card, 5, "%lx", (long) f);
348 c = f->next_pending;
349 BUG_ON(head->next_pending != f);
350 head->next_pending = c;
351 kmem_cache_free(qeth_qdio_outbuf_cache, f);
352 } else {
353 head = c;
354 c = c->next_pending;
355 }
356
357 }
358 }
359}
360
361
362static inline void qeth_qdio_handle_aob(struct qeth_card *card,
363 unsigned long phys_aob_addr) {
364 struct qaob *aob;
365 struct qeth_qdio_out_buffer *buffer;
366
367 aob = (struct qaob *) phys_to_virt(phys_aob_addr);
368 QETH_CARD_TEXT(card, 5, "haob");
369 QETH_CARD_TEXT_(card, 5, "%lx", phys_aob_addr);
370 buffer = (struct qeth_qdio_out_buffer *) aob->user1;
371 QETH_CARD_TEXT_(card, 5, "%lx", aob->user1);
372
373 BUG_ON(buffer == NULL);
374
375 buffer->aob = NULL;
376 qeth_clear_output_buffer(buffer->q, buffer,
377 QETH_QDIO_BUF_HANDLED_DELAYED);
378 /* from here on: do not touch buffer anymore */
379 qdio_release_aob(aob);
380}
381
382static inline int qeth_is_cq(struct qeth_card *card, unsigned int queue)
383{
384 return card->options.cq == QETH_CQ_ENABLED &&
385 card->qdio.c_q != NULL &&
386 queue != 0 &&
387 queue == card->qdio.no_in_queues - 1;
388}
389
390
242static int qeth_issue_next_read(struct qeth_card *card) 391static int qeth_issue_next_read(struct qeth_card *card)
243{ 392{
244 int rc; 393 int rc;
@@ -681,6 +830,7 @@ EXPORT_SYMBOL_GPL(qeth_do_run_thread);
681void qeth_schedule_recovery(struct qeth_card *card) 830void qeth_schedule_recovery(struct qeth_card *card)
682{ 831{
683 QETH_CARD_TEXT(card, 2, "startrec"); 832 QETH_CARD_TEXT(card, 2, "startrec");
833 WARN_ON(1);
684 if (qeth_set_thread_start_bit(card, QETH_RECOVER_THREAD) == 0) 834 if (qeth_set_thread_start_bit(card, QETH_RECOVER_THREAD) == 0)
685 schedule_work(&card->kernel_thread_starter); 835 schedule_work(&card->kernel_thread_starter);
686} 836}
@@ -884,7 +1034,8 @@ out:
884} 1034}
885 1035
886static void qeth_clear_output_buffer(struct qeth_qdio_out_q *queue, 1036static void qeth_clear_output_buffer(struct qeth_qdio_out_q *queue,
887 struct qeth_qdio_out_buffer *buf) 1037 struct qeth_qdio_out_buffer *buf,
1038 enum qeth_qdio_buffer_states newbufstate)
888{ 1039{
889 int i; 1040 int i;
890 struct sk_buff *skb; 1041 struct sk_buff *skb;
@@ -912,21 +1063,36 @@ static void qeth_clear_output_buffer(struct qeth_qdio_out_q *queue,
912 buf->buffer->element[15].eflags = 0; 1063 buf->buffer->element[15].eflags = 0;
913 buf->buffer->element[15].sflags = 0; 1064 buf->buffer->element[15].sflags = 0;
914 buf->next_element_to_fill = 0; 1065 buf->next_element_to_fill = 0;
915 atomic_set(&buf->state, QETH_QDIO_BUF_EMPTY); 1066 atomic_set(&buf->state, newbufstate);
1067}
1068
1069static void qeth_clear_outq_buffers(struct qeth_qdio_out_q *q, int free)
1070{
1071 int j;
1072
1073 for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; ++j) {
1074 if (!q->bufs[j])
1075 continue;
1076 qeth_cleanup_handled_pending(q, j, free);
1077 qeth_clear_output_buffer(q, q->bufs[j], QETH_QDIO_BUF_EMPTY);
1078 if (free) {
1079 kmem_cache_free(qeth_qdio_outbuf_cache, q->bufs[j]);
1080 q->bufs[j] = NULL;
1081 }
1082 }
916} 1083}
917 1084
918void qeth_clear_qdio_buffers(struct qeth_card *card) 1085void qeth_clear_qdio_buffers(struct qeth_card *card)
919{ 1086{
920 int i, j; 1087 int i;
921 1088
922 QETH_CARD_TEXT(card, 2, "clearqdbf"); 1089 QETH_CARD_TEXT(card, 2, "clearqdbf");
923 /* clear outbound buffers to free skbs */ 1090 /* clear outbound buffers to free skbs */
924 for (i = 0; i < card->qdio.no_out_queues; ++i) 1091 for (i = 0; i < card->qdio.no_out_queues; ++i) {
925 if (card->qdio.out_qs[i]) { 1092 if (card->qdio.out_qs[i]) {
926 for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; ++j) 1093 qeth_clear_outq_buffers(card->qdio.out_qs[i], 0);
927 qeth_clear_output_buffer(card->qdio.out_qs[i],
928 &card->qdio.out_qs[i]->bufs[j]);
929 } 1094 }
1095 }
930} 1096}
931EXPORT_SYMBOL_GPL(qeth_clear_qdio_buffers); 1097EXPORT_SYMBOL_GPL(qeth_clear_qdio_buffers);
932 1098
@@ -945,11 +1111,14 @@ static void qeth_free_buffer_pool(struct qeth_card *card)
945 1111
946static void qeth_free_qdio_buffers(struct qeth_card *card) 1112static void qeth_free_qdio_buffers(struct qeth_card *card)
947{ 1113{
948 int i, j; 1114 int i;
949 1115
950 if (atomic_xchg(&card->qdio.state, QETH_QDIO_UNINITIALIZED) == 1116 if (atomic_xchg(&card->qdio.state, QETH_QDIO_UNINITIALIZED) ==
951 QETH_QDIO_UNINITIALIZED) 1117 QETH_QDIO_UNINITIALIZED)
952 return; 1118 return;
1119
1120 qeth_free_cq(card);
1121
953 kfree(card->qdio.in_q); 1122 kfree(card->qdio.in_q);
954 card->qdio.in_q = NULL; 1123 card->qdio.in_q = NULL;
955 /* inbound buffer pool */ 1124 /* inbound buffer pool */
@@ -957,9 +1126,7 @@ static void qeth_free_qdio_buffers(struct qeth_card *card)
957 /* free outbound qdio_qs */ 1126 /* free outbound qdio_qs */
958 if (card->qdio.out_qs) { 1127 if (card->qdio.out_qs) {
959 for (i = 0; i < card->qdio.no_out_queues; ++i) { 1128 for (i = 0; i < card->qdio.no_out_queues; ++i) {
960 for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; ++j) 1129 qeth_clear_outq_buffers(card->qdio.out_qs[i], 1);
961 qeth_clear_output_buffer(card->qdio.out_qs[i],
962 &card->qdio.out_qs[i]->bufs[j]);
963 kfree(card->qdio.out_qs[i]); 1130 kfree(card->qdio.out_qs[i]);
964 } 1131 }
965 kfree(card->qdio.out_qs); 1132 kfree(card->qdio.out_qs);
@@ -1053,6 +1220,7 @@ static void qeth_set_intial_options(struct qeth_card *card)
1053 card->options.performance_stats = 0; 1220 card->options.performance_stats = 0;
1054 card->options.rx_sg_cb = QETH_RX_SG_CB; 1221 card->options.rx_sg_cb = QETH_RX_SG_CB;
1055 card->options.isolation = ISOLATION_MODE_NONE; 1222 card->options.isolation = ISOLATION_MODE_NONE;
1223 card->options.cq = QETH_CQ_DISABLED;
1056} 1224}
1057 1225
1058static int qeth_do_start_thread(struct qeth_card *card, unsigned long thread) 1226static int qeth_do_start_thread(struct qeth_card *card, unsigned long thread)
@@ -1182,6 +1350,7 @@ static int qeth_determine_card_type(struct qeth_card *card)
1182 card->info.type = known_devices[i][QETH_DEV_MODEL_IND]; 1350 card->info.type = known_devices[i][QETH_DEV_MODEL_IND];
1183 card->qdio.no_out_queues = 1351 card->qdio.no_out_queues =
1184 known_devices[i][QETH_QUEUE_NO_IND]; 1352 known_devices[i][QETH_QUEUE_NO_IND];
1353 card->qdio.no_in_queues = 1;
1185 card->info.is_multicast_different = 1354 card->info.is_multicast_different =
1186 known_devices[i][QETH_MULTICAST_IND]; 1355 known_devices[i][QETH_MULTICAST_IND];
1187 qeth_get_channel_path_desc(card); 1356 qeth_get_channel_path_desc(card);
@@ -2029,6 +2198,37 @@ static int qeth_ulp_setup(struct qeth_card *card)
2029 return rc; 2198 return rc;
2030} 2199}
2031 2200
2201static int qeth_init_qdio_out_buf(struct qeth_qdio_out_q *q, int bidx)
2202{
2203 int rc;
2204 struct qeth_qdio_out_buffer *newbuf;
2205
2206 rc = 0;
2207 newbuf = kmem_cache_zalloc(qeth_qdio_outbuf_cache, GFP_ATOMIC);
2208 if (!newbuf) {
2209 rc = -ENOMEM;
2210 goto out;
2211 }
2212 newbuf->buffer = &q->qdio_bufs[bidx];
2213 skb_queue_head_init(&newbuf->skb_list);
2214 lockdep_set_class(&newbuf->skb_list.lock, &qdio_out_skb_queue_key);
2215 newbuf->q = q;
2216 newbuf->aob = NULL;
2217 newbuf->next_pending = q->bufs[bidx];
2218 atomic_set(&newbuf->state, QETH_QDIO_BUF_EMPTY);
2219 q->bufs[bidx] = newbuf;
2220 if (q->bufstates) {
2221 q->bufstates[bidx].user = newbuf;
2222 QETH_CARD_TEXT_(q->card, 2, "nbs%d", bidx);
2223 QETH_CARD_TEXT_(q->card, 2, "%lx", (long) newbuf);
2224 QETH_CARD_TEXT_(q->card, 2, "%lx",
2225 (long) newbuf->next_pending);
2226 }
2227out:
2228 return rc;
2229}
2230
2231
2032static int qeth_alloc_qdio_buffers(struct qeth_card *card) 2232static int qeth_alloc_qdio_buffers(struct qeth_card *card)
2033{ 2233{
2034 int i, j; 2234 int i, j;
@@ -2040,7 +2240,7 @@ static int qeth_alloc_qdio_buffers(struct qeth_card *card)
2040 return 0; 2240 return 0;
2041 2241
2042 card->qdio.in_q = kmalloc(sizeof(struct qeth_qdio_q), 2242 card->qdio.in_q = kmalloc(sizeof(struct qeth_qdio_q),
2043 GFP_KERNEL); 2243 GFP_KERNEL);
2044 if (!card->qdio.in_q) 2244 if (!card->qdio.in_q)
2045 goto out_nomem; 2245 goto out_nomem;
2046 QETH_DBF_TEXT(SETUP, 2, "inq"); 2246 QETH_DBF_TEXT(SETUP, 2, "inq");
@@ -2053,6 +2253,7 @@ static int qeth_alloc_qdio_buffers(struct qeth_card *card)
2053 /* inbound buffer pool */ 2253 /* inbound buffer pool */
2054 if (qeth_alloc_buffer_pool(card)) 2254 if (qeth_alloc_buffer_pool(card))
2055 goto out_freeinq; 2255 goto out_freeinq;
2256
2056 /* outbound */ 2257 /* outbound */
2057 card->qdio.out_qs = 2258 card->qdio.out_qs =
2058 kmalloc(card->qdio.no_out_queues * 2259 kmalloc(card->qdio.no_out_queues *
@@ -2070,21 +2271,30 @@ static int qeth_alloc_qdio_buffers(struct qeth_card *card)
2070 card->qdio.out_qs[i]->queue_no = i; 2271 card->qdio.out_qs[i]->queue_no = i;
2071 /* give outbound qeth_qdio_buffers their qdio_buffers */ 2272 /* give outbound qeth_qdio_buffers their qdio_buffers */
2072 for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; ++j) { 2273 for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; ++j) {
2073 card->qdio.out_qs[i]->bufs[j].buffer = 2274 BUG_ON(card->qdio.out_qs[i]->bufs[j] != NULL);
2074 &card->qdio.out_qs[i]->qdio_bufs[j]; 2275 if (qeth_init_qdio_out_buf(card->qdio.out_qs[i], j))
2075 skb_queue_head_init(&card->qdio.out_qs[i]->bufs[j]. 2276 goto out_freeoutqbufs;
2076 skb_list);
2077 lockdep_set_class(
2078 &card->qdio.out_qs[i]->bufs[j].skb_list.lock,
2079 &qdio_out_skb_queue_key);
2080 INIT_LIST_HEAD(&card->qdio.out_qs[i]->bufs[j].ctx_list);
2081 } 2277 }
2082 } 2278 }
2279
2280 /* completion */
2281 if (qeth_alloc_cq(card))
2282 goto out_freeoutq;
2283
2083 return 0; 2284 return 0;
2084 2285
2286out_freeoutqbufs:
2287 while (j > 0) {
2288 --j;
2289 kmem_cache_free(qeth_qdio_outbuf_cache,
2290 card->qdio.out_qs[i]->bufs[j]);
2291 card->qdio.out_qs[i]->bufs[j] = NULL;
2292 }
2085out_freeoutq: 2293out_freeoutq:
2086 while (i > 0) 2294 while (i > 0) {
2087 kfree(card->qdio.out_qs[--i]); 2295 kfree(card->qdio.out_qs[--i]);
2296 qeth_clear_outq_buffers(card->qdio.out_qs[i], 1);
2297 }
2088 kfree(card->qdio.out_qs); 2298 kfree(card->qdio.out_qs);
2089 card->qdio.out_qs = NULL; 2299 card->qdio.out_qs = NULL;
2090out_freepool: 2300out_freepool:
@@ -2401,13 +2611,21 @@ int qeth_init_qdio_queues(struct qeth_card *card)
2401 QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc); 2611 QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc);
2402 return rc; 2612 return rc;
2403 } 2613 }
2614
2615 /* completion */
2616 rc = qeth_cq_init(card);
2617 if (rc) {
2618 return rc;
2619 }
2620
2404 /* outbound queue */ 2621 /* outbound queue */
2405 for (i = 0; i < card->qdio.no_out_queues; ++i) { 2622 for (i = 0; i < card->qdio.no_out_queues; ++i) {
2406 memset(card->qdio.out_qs[i]->qdio_bufs, 0, 2623 memset(card->qdio.out_qs[i]->qdio_bufs, 0,
2407 QDIO_MAX_BUFFERS_PER_Q * sizeof(struct qdio_buffer)); 2624 QDIO_MAX_BUFFERS_PER_Q * sizeof(struct qdio_buffer));
2408 for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; ++j) { 2625 for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; ++j) {
2409 qeth_clear_output_buffer(card->qdio.out_qs[i], 2626 qeth_clear_output_buffer(card->qdio.out_qs[i],
2410 &card->qdio.out_qs[i]->bufs[j]); 2627 card->qdio.out_qs[i]->bufs[j],
2628 QETH_QDIO_BUF_EMPTY);
2411 } 2629 }
2412 card->qdio.out_qs[i]->card = card; 2630 card->qdio.out_qs[i]->card = card;
2413 card->qdio.out_qs[i]->next_buf_to_fill = 0; 2631 card->qdio.out_qs[i]->next_buf_to_fill = 0;
@@ -2789,8 +3007,6 @@ void qeth_queue_input_buffer(struct qeth_card *card, int index)
2789 qeth_get_micros() - 3007 qeth_get_micros() -
2790 card->perf_stats.inbound_do_qdio_start_time; 3008 card->perf_stats.inbound_do_qdio_start_time;
2791 if (rc) { 3009 if (rc) {
2792 dev_warn(&card->gdev->dev,
2793 "QDIO reported an error, rc=%i\n", rc);
2794 QETH_CARD_TEXT(card, 2, "qinberr"); 3010 QETH_CARD_TEXT(card, 2, "qinberr");
2795 } 3011 }
2796 queue->next_buf_to_init = (queue->next_buf_to_init + count) % 3012 queue->next_buf_to_init = (queue->next_buf_to_init + count) %
@@ -2864,12 +3080,12 @@ static int qeth_switch_to_nonpacking_if_needed(struct qeth_qdio_out_q *queue)
2864 queue->card->perf_stats.sc_p_dp++; 3080 queue->card->perf_stats.sc_p_dp++;
2865 queue->do_pack = 0; 3081 queue->do_pack = 0;
2866 /* flush packing buffers */ 3082 /* flush packing buffers */
2867 buffer = &queue->bufs[queue->next_buf_to_fill]; 3083 buffer = queue->bufs[queue->next_buf_to_fill];
2868 if ((atomic_read(&buffer->state) == 3084 if ((atomic_read(&buffer->state) ==
2869 QETH_QDIO_BUF_EMPTY) && 3085 QETH_QDIO_BUF_EMPTY) &&
2870 (buffer->next_element_to_fill > 0)) { 3086 (buffer->next_element_to_fill > 0)) {
2871 atomic_set(&buffer->state, 3087 atomic_set(&buffer->state,
2872 QETH_QDIO_BUF_PRIMED); 3088 QETH_QDIO_BUF_PRIMED);
2873 flush_count++; 3089 flush_count++;
2874 queue->next_buf_to_fill = 3090 queue->next_buf_to_fill =
2875 (queue->next_buf_to_fill + 1) % 3091 (queue->next_buf_to_fill + 1) %
@@ -2880,6 +3096,7 @@ static int qeth_switch_to_nonpacking_if_needed(struct qeth_qdio_out_q *queue)
2880 return flush_count; 3096 return flush_count;
2881} 3097}
2882 3098
3099
2883/* 3100/*
2884 * Called to flush a packing buffer if no more pci flags are on the queue. 3101 * Called to flush a packing buffer if no more pci flags are on the queue.
2885 * Checks if there is a packing buffer and prepares it to be flushed. 3102 * Checks if there is a packing buffer and prepares it to be flushed.
@@ -2889,7 +3106,7 @@ static int qeth_flush_buffers_on_no_pci(struct qeth_qdio_out_q *queue)
2889{ 3106{
2890 struct qeth_qdio_out_buffer *buffer; 3107 struct qeth_qdio_out_buffer *buffer;
2891 3108
2892 buffer = &queue->bufs[queue->next_buf_to_fill]; 3109 buffer = queue->bufs[queue->next_buf_to_fill];
2893 if ((atomic_read(&buffer->state) == QETH_QDIO_BUF_EMPTY) && 3110 if ((atomic_read(&buffer->state) == QETH_QDIO_BUF_EMPTY) &&
2894 (buffer->next_element_to_fill > 0)) { 3111 (buffer->next_element_to_fill > 0)) {
2895 /* it's a packing buffer */ 3112 /* it's a packing buffer */
@@ -2910,10 +3127,14 @@ static void qeth_flush_buffers(struct qeth_qdio_out_q *queue, int index,
2910 unsigned int qdio_flags; 3127 unsigned int qdio_flags;
2911 3128
2912 for (i = index; i < index + count; ++i) { 3129 for (i = index; i < index + count; ++i) {
2913 buf = &queue->bufs[i % QDIO_MAX_BUFFERS_PER_Q]; 3130 int bidx = i % QDIO_MAX_BUFFERS_PER_Q;
3131 buf = queue->bufs[bidx];
2914 buf->buffer->element[buf->next_element_to_fill - 1].eflags |= 3132 buf->buffer->element[buf->next_element_to_fill - 1].eflags |=
2915 SBAL_EFLAGS_LAST_ENTRY; 3133 SBAL_EFLAGS_LAST_ENTRY;
2916 3134
3135 if (queue->bufstates)
3136 queue->bufstates[bidx].user = buf;
3137
2917 if (queue->card->info.type == QETH_CARD_TYPE_IQD) 3138 if (queue->card->info.type == QETH_CARD_TYPE_IQD)
2918 continue; 3139 continue;
2919 3140
@@ -2965,6 +3186,9 @@ static void qeth_flush_buffers(struct qeth_qdio_out_q *queue, int index,
2965 if (rc == QDIO_ERROR_SIGA_TARGET) 3186 if (rc == QDIO_ERROR_SIGA_TARGET)
2966 return; 3187 return;
2967 QETH_CARD_TEXT(queue->card, 2, "flushbuf"); 3188 QETH_CARD_TEXT(queue->card, 2, "flushbuf");
3189 QETH_CARD_TEXT_(queue->card, 2, " q%d", queue->queue_no);
3190 QETH_CARD_TEXT_(queue->card, 2, " idx%d", index);
3191 QETH_CARD_TEXT_(queue->card, 2, " c%d", count);
2968 QETH_CARD_TEXT_(queue->card, 2, " err%d", rc); 3192 QETH_CARD_TEXT_(queue->card, 2, " err%d", rc);
2969 3193
2970 /* this must not happen under normal circumstances. if it 3194 /* this must not happen under normal circumstances. if it
@@ -3026,14 +3250,120 @@ void qeth_qdio_start_poll(struct ccw_device *ccwdev, int queue,
3026} 3250}
3027EXPORT_SYMBOL_GPL(qeth_qdio_start_poll); 3251EXPORT_SYMBOL_GPL(qeth_qdio_start_poll);
3028 3252
3253int qeth_configure_cq(struct qeth_card *card, enum qeth_cq cq)
3254{
3255 int rc;
3256
3257 if (card->options.cq == QETH_CQ_NOTAVAILABLE) {
3258 rc = -1;
3259 goto out;
3260 } else {
3261 if (card->options.cq == cq) {
3262 rc = 0;
3263 goto out;
3264 }
3265
3266 if (card->state != CARD_STATE_DOWN &&
3267 card->state != CARD_STATE_RECOVER) {
3268 rc = -1;
3269 goto out;
3270 }
3271
3272 qeth_free_qdio_buffers(card);
3273 card->options.cq = cq;
3274 rc = 0;
3275 }
3276out:
3277 return rc;
3278
3279}
3280EXPORT_SYMBOL_GPL(qeth_configure_cq);
3281
3282
3283static void qeth_qdio_cq_handler(struct qeth_card *card,
3284 unsigned int qdio_err,
3285 unsigned int queue, int first_element, int count) {
3286 struct qeth_qdio_q *cq = card->qdio.c_q;
3287 int i;
3288 int rc;
3289
3290 if (!qeth_is_cq(card, queue))
3291 goto out;
3292
3293 QETH_CARD_TEXT_(card, 5, "qcqhe%d", first_element);
3294 QETH_CARD_TEXT_(card, 5, "qcqhc%d", count);
3295 QETH_CARD_TEXT_(card, 5, "qcqherr%d", qdio_err);
3296
3297 if (qdio_err) {
3298 netif_stop_queue(card->dev);
3299 qeth_schedule_recovery(card);
3300 goto out;
3301 }
3302
3303 if (card->options.performance_stats) {
3304 card->perf_stats.cq_cnt++;
3305 card->perf_stats.cq_start_time = qeth_get_micros();
3306 }
3307
3308 for (i = first_element; i < first_element + count; ++i) {
3309 int bidx = i % QDIO_MAX_BUFFERS_PER_Q;
3310 struct qdio_buffer *buffer = &cq->qdio_bufs[bidx];
3311 int e;
3312
3313 e = 0;
3314 while (buffer->element[e].addr) {
3315 unsigned long phys_aob_addr;
3316
3317 phys_aob_addr = (unsigned long) buffer->element[e].addr;
3318 qeth_qdio_handle_aob(card, phys_aob_addr);
3319 buffer->element[e].addr = NULL;
3320 buffer->element[e].eflags = 0;
3321 buffer->element[e].sflags = 0;
3322 buffer->element[e].length = 0;
3323
3324 ++e;
3325 }
3326
3327 buffer->element[15].eflags = 0;
3328 buffer->element[15].sflags = 0;
3329 }
3330 rc = do_QDIO(CARD_DDEV(card), QDIO_FLAG_SYNC_INPUT, queue,
3331 card->qdio.c_q->next_buf_to_init,
3332 count);
3333 if (rc) {
3334 dev_warn(&card->gdev->dev,
3335 "QDIO reported an error, rc=%i\n", rc);
3336 QETH_CARD_TEXT(card, 2, "qcqherr");
3337 }
3338 card->qdio.c_q->next_buf_to_init = (card->qdio.c_q->next_buf_to_init
3339 + count) % QDIO_MAX_BUFFERS_PER_Q;
3340
3341 netif_wake_queue(card->dev);
3342
3343 if (card->options.performance_stats) {
3344 int delta_t = qeth_get_micros();
3345 delta_t -= card->perf_stats.cq_start_time;
3346 card->perf_stats.cq_time += delta_t;
3347 }
3348out:
3349 return;
3350}
3351
3029void qeth_qdio_input_handler(struct ccw_device *ccwdev, unsigned int qdio_err, 3352void qeth_qdio_input_handler(struct ccw_device *ccwdev, unsigned int qdio_err,
3030 unsigned int queue, int first_element, int count, 3353 unsigned int queue, int first_elem, int count,
3031 unsigned long card_ptr) 3354 unsigned long card_ptr)
3032{ 3355{
3033 struct qeth_card *card = (struct qeth_card *)card_ptr; 3356 struct qeth_card *card = (struct qeth_card *)card_ptr;
3034 3357
3035 if (qdio_err) 3358 QETH_CARD_TEXT_(card, 2, "qihq%d", queue);
3359 QETH_CARD_TEXT_(card, 2, "qiec%d", qdio_err);
3360
3361 if (qeth_is_cq(card, queue))
3362 qeth_qdio_cq_handler(card, qdio_err, queue, first_elem, count);
3363 else if (qdio_err)
3036 qeth_schedule_recovery(card); 3364 qeth_schedule_recovery(card);
3365
3366
3037} 3367}
3038EXPORT_SYMBOL_GPL(qeth_qdio_input_handler); 3368EXPORT_SYMBOL_GPL(qeth_qdio_input_handler);
3039 3369
@@ -3059,9 +3389,26 @@ void qeth_qdio_output_handler(struct ccw_device *ccwdev,
3059 qeth_get_micros(); 3389 qeth_get_micros();
3060 } 3390 }
3061 for (i = first_element; i < (first_element + count); ++i) { 3391 for (i = first_element; i < (first_element + count); ++i) {
3062 buffer = &queue->bufs[i % QDIO_MAX_BUFFERS_PER_Q]; 3392 int bidx = i % QDIO_MAX_BUFFERS_PER_Q;
3393 buffer = queue->bufs[bidx];
3063 qeth_handle_send_error(card, buffer, qdio_error); 3394 qeth_handle_send_error(card, buffer, qdio_error);
3064 qeth_clear_output_buffer(queue, buffer); 3395
3396 if (queue->bufstates &&
3397 (queue->bufstates[bidx].flags &
3398 QDIO_OUTBUF_STATE_FLAG_PENDING) != 0) {
3399 buffer->aob = queue->bufstates[bidx].aob;
3400 QETH_CARD_TEXT_(queue->card, 5, "pel%d", bidx);
3401 QETH_CARD_TEXT_(queue->card, 5, "aob");
3402 QETH_CARD_TEXT_(queue->card, 5, "%lx",
3403 virt_to_phys(buffer->aob));
3404 BUG_ON(bidx < 0 || bidx >= QDIO_MAX_BUFFERS_PER_Q);
3405 if (qeth_init_qdio_out_buf(queue, bidx))
3406 qeth_schedule_recovery(card);
3407 } else {
3408 qeth_clear_output_buffer(queue, buffer,
3409 QETH_QDIO_BUF_EMPTY);
3410 }
3411 qeth_cleanup_handled_pending(queue, bidx, 0);
3065 } 3412 }
3066 atomic_sub(count, &queue->used_buffers); 3413 atomic_sub(count, &queue->used_buffers);
3067 /* check if we need to do something on this outbound queue */ 3414 /* check if we need to do something on this outbound queue */
@@ -3293,7 +3640,7 @@ int qeth_do_send_packet_fast(struct qeth_card *card,
3293 QETH_OUT_Q_LOCKED) != QETH_OUT_Q_UNLOCKED); 3640 QETH_OUT_Q_LOCKED) != QETH_OUT_Q_UNLOCKED);
3294 /* ... now we've got the queue */ 3641 /* ... now we've got the queue */
3295 index = queue->next_buf_to_fill; 3642 index = queue->next_buf_to_fill;
3296 buffer = &queue->bufs[queue->next_buf_to_fill]; 3643 buffer = queue->bufs[queue->next_buf_to_fill];
3297 /* 3644 /*
3298 * check if buffer is empty to make sure that we do not 'overtake' 3645 * check if buffer is empty to make sure that we do not 'overtake'
3299 * ourselves and try to fill a buffer that is already primed 3646 * ourselves and try to fill a buffer that is already primed
@@ -3327,7 +3674,7 @@ int qeth_do_send_packet(struct qeth_card *card, struct qeth_qdio_out_q *queue,
3327 while (atomic_cmpxchg(&queue->state, QETH_OUT_Q_UNLOCKED, 3674 while (atomic_cmpxchg(&queue->state, QETH_OUT_Q_UNLOCKED,
3328 QETH_OUT_Q_LOCKED) != QETH_OUT_Q_UNLOCKED); 3675 QETH_OUT_Q_LOCKED) != QETH_OUT_Q_UNLOCKED);
3329 start_index = queue->next_buf_to_fill; 3676 start_index = queue->next_buf_to_fill;
3330 buffer = &queue->bufs[queue->next_buf_to_fill]; 3677 buffer = queue->bufs[queue->next_buf_to_fill];
3331 /* 3678 /*
3332 * check if buffer is empty to make sure that we do not 'overtake' 3679 * check if buffer is empty to make sure that we do not 'overtake'
3333 * ourselves and try to fill a buffer that is already primed 3680 * ourselves and try to fill a buffer that is already primed
@@ -3349,7 +3696,7 @@ int qeth_do_send_packet(struct qeth_card *card, struct qeth_qdio_out_q *queue,
3349 queue->next_buf_to_fill = 3696 queue->next_buf_to_fill =
3350 (queue->next_buf_to_fill + 1) % 3697 (queue->next_buf_to_fill + 1) %
3351 QDIO_MAX_BUFFERS_PER_Q; 3698 QDIO_MAX_BUFFERS_PER_Q;
3352 buffer = &queue->bufs[queue->next_buf_to_fill]; 3699 buffer = queue->bufs[queue->next_buf_to_fill];
3353 /* we did a step forward, so check buffer state 3700 /* we did a step forward, so check buffer state
3354 * again */ 3701 * again */
3355 if (atomic_read(&buffer->state) != 3702 if (atomic_read(&buffer->state) !=
@@ -3927,6 +4274,20 @@ static void qeth_determine_capabilities(struct qeth_card *card)
3927 if (rc) 4274 if (rc)
3928 QETH_DBF_TEXT_(SETUP, 2, "6err%d", rc); 4275 QETH_DBF_TEXT_(SETUP, 2, "6err%d", rc);
3929 4276
4277 QETH_DBF_TEXT_(SETUP, 2, "qfmt%d", card->ssqd.qfmt);
4278 QETH_DBF_TEXT_(SETUP, 2, "%d", card->ssqd.qdioac1);
4279 QETH_DBF_TEXT_(SETUP, 2, "%d", card->ssqd.qdioac3);
4280 QETH_DBF_TEXT_(SETUP, 2, "icnt%d", card->ssqd.icnt);
4281 if (!((card->ssqd.qfmt != QDIO_IQDIO_QFMT) ||
4282 ((card->ssqd.qdioac1 & CHSC_AC1_INITIATE_INPUTQ) == 0) ||
4283 ((card->ssqd.qdioac3 & CHSC_AC3_FORMAT2_CQ_AVAILABLE) == 0))) {
4284 dev_info(&card->gdev->dev,
4285 "Completion Queueing supported\n");
4286 } else {
4287 card->options.cq = QETH_CQ_NOTAVAILABLE;
4288 }
4289
4290
3930out_offline: 4291out_offline:
3931 if (ddev_offline == 1) 4292 if (ddev_offline == 1)
3932 ccw_device_set_offline(ddev); 4293 ccw_device_set_offline(ddev);
@@ -3934,6 +4295,24 @@ out:
3934 return; 4295 return;
3935} 4296}
3936 4297
4298static inline void qeth_qdio_establish_cq(struct qeth_card *card,
4299 struct qdio_buffer **in_sbal_ptrs,
4300 void (**queue_start_poll) (struct ccw_device *, int, unsigned long)) {
4301 int i;
4302
4303 if (card->options.cq == QETH_CQ_ENABLED) {
4304 int offset = QDIO_MAX_BUFFERS_PER_Q *
4305 (card->qdio.no_in_queues - 1);
4306 i = QDIO_MAX_BUFFERS_PER_Q * (card->qdio.no_in_queues - 1);
4307 for (i = 0; i < QDIO_MAX_BUFFERS_PER_Q; ++i) {
4308 in_sbal_ptrs[offset + i] = (struct qdio_buffer *)
4309 virt_to_phys(card->qdio.c_q->bufs[i].buffer);
4310 }
4311
4312 queue_start_poll[card->qdio.no_in_queues - 1] = NULL;
4313 }
4314}
4315
3937static int qeth_qdio_establish(struct qeth_card *card) 4316static int qeth_qdio_establish(struct qeth_card *card)
3938{ 4317{
3939 struct qdio_initialize init_data; 4318 struct qdio_initialize init_data;
@@ -3956,22 +4335,28 @@ static int qeth_qdio_establish(struct qeth_card *card)
3956 qeth_create_qib_param_field(card, qib_param_field); 4335 qeth_create_qib_param_field(card, qib_param_field);
3957 qeth_create_qib_param_field_blkt(card, qib_param_field); 4336 qeth_create_qib_param_field_blkt(card, qib_param_field);
3958 4337
3959 in_sbal_ptrs = kmalloc(QDIO_MAX_BUFFERS_PER_Q * sizeof(void *), 4338 in_sbal_ptrs = kmalloc(card->qdio.no_in_queues *
4339 QDIO_MAX_BUFFERS_PER_Q * sizeof(void *),
3960 GFP_KERNEL); 4340 GFP_KERNEL);
3961 if (!in_sbal_ptrs) { 4341 if (!in_sbal_ptrs) {
3962 rc = -ENOMEM; 4342 rc = -ENOMEM;
3963 goto out_free_qib_param; 4343 goto out_free_qib_param;
3964 } 4344 }
3965 for (i = 0; i < QDIO_MAX_BUFFERS_PER_Q; ++i) 4345 for (i = 0; i < QDIO_MAX_BUFFERS_PER_Q; ++i) {
3966 in_sbal_ptrs[i] = (struct qdio_buffer *) 4346 in_sbal_ptrs[i] = (struct qdio_buffer *)
3967 virt_to_phys(card->qdio.in_q->bufs[i].buffer); 4347 virt_to_phys(card->qdio.in_q->bufs[i].buffer);
4348 }
3968 4349
3969 queue_start_poll = kmalloc(sizeof(void *) * 1, GFP_KERNEL); 4350 queue_start_poll = kzalloc(sizeof(void *) * card->qdio.no_in_queues,
4351 GFP_KERNEL);
3970 if (!queue_start_poll) { 4352 if (!queue_start_poll) {
3971 rc = -ENOMEM; 4353 rc = -ENOMEM;
3972 goto out_free_in_sbals; 4354 goto out_free_in_sbals;
3973 } 4355 }
3974 queue_start_poll[0] = card->discipline.start_poll; 4356 for (i = 0; i < card->qdio.no_in_queues; ++i)
4357 queue_start_poll[i] = card->discipline.start_poll;
4358
4359 qeth_qdio_establish_cq(card, in_sbal_ptrs, queue_start_poll);
3975 4360
3976 out_sbal_ptrs = 4361 out_sbal_ptrs =
3977 kmalloc(card->qdio.no_out_queues * QDIO_MAX_BUFFERS_PER_Q * 4362 kmalloc(card->qdio.no_out_queues * QDIO_MAX_BUFFERS_PER_Q *
@@ -3983,7 +4368,7 @@ static int qeth_qdio_establish(struct qeth_card *card)
3983 for (i = 0, k = 0; i < card->qdio.no_out_queues; ++i) 4368 for (i = 0, k = 0; i < card->qdio.no_out_queues; ++i)
3984 for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; ++j, ++k) { 4369 for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; ++j, ++k) {
3985 out_sbal_ptrs[k] = (struct qdio_buffer *)virt_to_phys( 4370 out_sbal_ptrs[k] = (struct qdio_buffer *)virt_to_phys(
3986 card->qdio.out_qs[i]->bufs[j].buffer); 4371 card->qdio.out_qs[i]->bufs[j]->buffer);
3987 } 4372 }
3988 4373
3989 memset(&init_data, 0, sizeof(struct qdio_initialize)); 4374 memset(&init_data, 0, sizeof(struct qdio_initialize));
@@ -3991,7 +4376,7 @@ static int qeth_qdio_establish(struct qeth_card *card)
3991 init_data.q_format = qeth_get_qdio_q_format(card); 4376 init_data.q_format = qeth_get_qdio_q_format(card);
3992 init_data.qib_param_field_format = 0; 4377 init_data.qib_param_field_format = 0;
3993 init_data.qib_param_field = qib_param_field; 4378 init_data.qib_param_field = qib_param_field;
3994 init_data.no_input_qs = 1; 4379 init_data.no_input_qs = card->qdio.no_in_queues;
3995 init_data.no_output_qs = card->qdio.no_out_queues; 4380 init_data.no_output_qs = card->qdio.no_out_queues;
3996 init_data.input_handler = card->discipline.input_handler; 4381 init_data.input_handler = card->discipline.input_handler;
3997 init_data.output_handler = card->discipline.output_handler; 4382 init_data.output_handler = card->discipline.output_handler;
@@ -3999,6 +4384,7 @@ static int qeth_qdio_establish(struct qeth_card *card)
3999 init_data.int_parm = (unsigned long) card; 4384 init_data.int_parm = (unsigned long) card;
4000 init_data.input_sbal_addr_array = (void **) in_sbal_ptrs; 4385 init_data.input_sbal_addr_array = (void **) in_sbal_ptrs;
4001 init_data.output_sbal_addr_array = (void **) out_sbal_ptrs; 4386 init_data.output_sbal_addr_array = (void **) out_sbal_ptrs;
4387 init_data.output_sbal_state_array = card->qdio.out_bufstates;
4002 init_data.scan_threshold = 4388 init_data.scan_threshold =
4003 (card->info.type == QETH_CARD_TYPE_IQD) ? 8 : 32; 4389 (card->info.type == QETH_CARD_TYPE_IQD) ? 8 : 32;
4004 4390
@@ -4015,6 +4401,17 @@ static int qeth_qdio_establish(struct qeth_card *card)
4015 qdio_free(CARD_DDEV(card)); 4401 qdio_free(CARD_DDEV(card));
4016 } 4402 }
4017 } 4403 }
4404
4405 switch (card->options.cq) {
4406 case QETH_CQ_ENABLED:
4407 dev_info(&card->gdev->dev, "Completion Queue support enabled");
4408 break;
4409 case QETH_CQ_DISABLED:
4410 dev_info(&card->gdev->dev, "Completion Queue support disabled");
4411 break;
4412 default:
4413 break;
4414 }
4018out: 4415out:
4019 kfree(out_sbal_ptrs); 4416 kfree(out_sbal_ptrs);
4020out_free_queue_start_poll: 4417out_free_queue_start_poll:
@@ -4193,6 +4590,8 @@ static inline int qeth_create_skb_frag(struct qdio_buffer_element *element,
4193 (*pskb)->truesize += data_len; 4590 (*pskb)->truesize += data_len;
4194 (*pfrag)++; 4591 (*pfrag)++;
4195 } 4592 }
4593
4594
4196 return 0; 4595 return 0;
4197} 4596}
4198 4597
@@ -4666,6 +5065,8 @@ static struct {
4666 {"tx do_QDIO count"}, 5065 {"tx do_QDIO count"},
4667 {"tx csum"}, 5066 {"tx csum"},
4668 {"tx lin"}, 5067 {"tx lin"},
5068 {"cq handler count"},
5069 {"cq handler time"}
4669}; 5070};
4670 5071
4671int qeth_core_get_sset_count(struct net_device *dev, int stringset) 5072int qeth_core_get_sset_count(struct net_device *dev, int stringset)
@@ -4724,6 +5125,8 @@ void qeth_core_get_ethtool_stats(struct net_device *dev,
4724 data[32] = card->perf_stats.outbound_do_qdio_cnt; 5125 data[32] = card->perf_stats.outbound_do_qdio_cnt;
4725 data[33] = card->perf_stats.tx_csum; 5126 data[33] = card->perf_stats.tx_csum;
4726 data[34] = card->perf_stats.tx_lin; 5127 data[34] = card->perf_stats.tx_lin;
5128 data[35] = card->perf_stats.cq_cnt;
5129 data[36] = card->perf_stats.cq_time;
4727} 5130}
4728EXPORT_SYMBOL_GPL(qeth_core_get_ethtool_stats); 5131EXPORT_SYMBOL_GPL(qeth_core_get_ethtool_stats);
4729 5132
@@ -4882,7 +5285,16 @@ static int __init qeth_core_init(void)
4882 goto slab_err; 5285 goto slab_err;
4883 } 5286 }
4884 5287
5288 qeth_qdio_outbuf_cache = kmem_cache_create("qeth_buf",
5289 sizeof(struct qeth_qdio_out_buffer), 0, 0, NULL);
5290 if (!qeth_qdio_outbuf_cache) {
5291 rc = -ENOMEM;
5292 goto cqslab_err;
5293 }
5294
4885 return 0; 5295 return 0;
5296cqslab_err:
5297 kmem_cache_destroy(qeth_core_header_cache);
4886slab_err: 5298slab_err:
4887 root_device_unregister(qeth_core_root_dev); 5299 root_device_unregister(qeth_core_root_dev);
4888register_err: 5300register_err:
@@ -4907,6 +5319,7 @@ static void __exit qeth_core_exit(void)
4907 &driver_attr_group); 5319 &driver_attr_group);
4908 ccwgroup_driver_unregister(&qeth_core_ccwgroup_driver); 5320 ccwgroup_driver_unregister(&qeth_core_ccwgroup_driver);
4909 ccw_driver_unregister(&qeth_ccw_driver); 5321 ccw_driver_unregister(&qeth_ccw_driver);
5322 kmem_cache_destroy(qeth_qdio_outbuf_cache);
4910 kmem_cache_destroy(qeth_core_header_cache); 5323 kmem_cache_destroy(qeth_core_header_cache);
4911 qeth_unregister_dbf_views(); 5324 qeth_unregister_dbf_views();
4912 pr_info("core functions removed\n"); 5325 pr_info("core functions removed\n");