c97cddf31a7079f08cd57681ff42dc4b265dfe9b
[platform/kernel/linux-rpi.git] / drivers / s390 / net / qeth_core_main.c
1 /*
2  *    Copyright IBM Corp. 2007, 2009
3  *    Author(s): Utz Bacher <utz.bacher@de.ibm.com>,
4  *               Frank Pavlic <fpavlic@de.ibm.com>,
5  *               Thomas Spatzier <tspat@de.ibm.com>,
6  *               Frank Blaschka <frank.blaschka@de.ibm.com>
7  */
8
9 #define KMSG_COMPONENT "qeth"
10 #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
11
12 #include <linux/module.h>
13 #include <linux/moduleparam.h>
14 #include <linux/string.h>
15 #include <linux/errno.h>
16 #include <linux/kernel.h>
17 #include <linux/ip.h>
18 #include <linux/tcp.h>
19 #include <linux/mii.h>
20 #include <linux/kthread.h>
21 #include <linux/slab.h>
22 #include <linux/if_vlan.h>
23 #include <linux/netdevice.h>
24 #include <linux/netdev_features.h>
25 #include <linux/skbuff.h>
26
27 #include <net/iucv/af_iucv.h>
28 #include <net/dsfield.h>
29
30 #include <asm/ebcdic.h>
31 #include <asm/chpid.h>
32 #include <asm/io.h>
33 #include <asm/sysinfo.h>
34 #include <asm/compat.h>
35 #include <asm/diag.h>
36 #include <asm/cio.h>
37 #include <asm/ccwdev.h>
38
39 #include "qeth_core.h"
40
41 struct qeth_dbf_info qeth_dbf[QETH_DBF_INFOS] = {
42         /* define dbf - Name, Pages, Areas, Maxlen, Level, View, Handle */
43         /*                   N  P  A    M  L  V                      H  */
44         [QETH_DBF_SETUP] = {"qeth_setup",
45                                 8, 1,   8, 5, &debug_hex_ascii_view, NULL},
46         [QETH_DBF_MSG]   = {"qeth_msg", 8, 1, 11 * sizeof(long), 3,
47                             &debug_sprintf_view, NULL},
48         [QETH_DBF_CTRL]  = {"qeth_control",
49                 8, 1, QETH_DBF_CTRL_LEN, 5, &debug_hex_ascii_view, NULL},
50 };
51 EXPORT_SYMBOL_GPL(qeth_dbf);
52
53 struct qeth_card_list_struct qeth_core_card_list;
54 EXPORT_SYMBOL_GPL(qeth_core_card_list);
55 struct kmem_cache *qeth_core_header_cache;
56 EXPORT_SYMBOL_GPL(qeth_core_header_cache);
57 static struct kmem_cache *qeth_qdio_outbuf_cache;
58
59 static struct device *qeth_core_root_dev;
60 static unsigned int known_devices[][6] = QETH_MODELLIST_ARRAY;
61 static struct lock_class_key qdio_out_skb_queue_key;
62 static struct mutex qeth_mod_mutex;
63
64 static void qeth_send_control_data_cb(struct qeth_channel *,
65                         struct qeth_cmd_buffer *);
66 static struct qeth_cmd_buffer *qeth_get_buffer(struct qeth_channel *);
67 static void qeth_setup_ccw(struct qeth_channel *, unsigned char *, __u32);
68 static void qeth_free_buffer_pool(struct qeth_card *);
69 static int qeth_qdio_establish(struct qeth_card *);
70 static void qeth_free_qdio_buffers(struct qeth_card *);
71 static void qeth_notify_skbs(struct qeth_qdio_out_q *queue,
72                 struct qeth_qdio_out_buffer *buf,
73                 enum iucv_tx_notify notification);
74 static void qeth_release_skbs(struct qeth_qdio_out_buffer *buf);
75 static void qeth_clear_output_buffer(struct qeth_qdio_out_q *queue,
76                 struct qeth_qdio_out_buffer *buf,
77                 enum qeth_qdio_buffer_states newbufstate);
78 static int qeth_init_qdio_out_buf(struct qeth_qdio_out_q *, int);
79
80 struct workqueue_struct *qeth_wq;
81 EXPORT_SYMBOL_GPL(qeth_wq);
82
83 int qeth_card_hw_is_reachable(struct qeth_card *card)
84 {
85         return (card->state == CARD_STATE_SOFTSETUP) ||
86                 (card->state == CARD_STATE_UP);
87 }
88 EXPORT_SYMBOL_GPL(qeth_card_hw_is_reachable);
89
90 static void qeth_close_dev_handler(struct work_struct *work)
91 {
92         struct qeth_card *card;
93
94         card = container_of(work, struct qeth_card, close_dev_work);
95         QETH_CARD_TEXT(card, 2, "cldevhdl");
96         rtnl_lock();
97         dev_close(card->dev);
98         rtnl_unlock();
99         ccwgroup_set_offline(card->gdev);
100 }
101
102 void qeth_close_dev(struct qeth_card *card)
103 {
104         QETH_CARD_TEXT(card, 2, "cldevsubm");
105         queue_work(qeth_wq, &card->close_dev_work);
106 }
107 EXPORT_SYMBOL_GPL(qeth_close_dev);
108
109 static const char *qeth_get_cardname(struct qeth_card *card)
110 {
111         if (card->info.guestlan) {
112                 switch (card->info.type) {
113                 case QETH_CARD_TYPE_OSD:
114                         return " Virtual NIC QDIO";
115                 case QETH_CARD_TYPE_IQD:
116                         return " Virtual NIC Hiper";
117                 case QETH_CARD_TYPE_OSM:
118                         return " Virtual NIC QDIO - OSM";
119                 case QETH_CARD_TYPE_OSX:
120                         return " Virtual NIC QDIO - OSX";
121                 default:
122                         return " unknown";
123                 }
124         } else {
125                 switch (card->info.type) {
126                 case QETH_CARD_TYPE_OSD:
127                         return " OSD Express";
128                 case QETH_CARD_TYPE_IQD:
129                         return " HiperSockets";
130                 case QETH_CARD_TYPE_OSN:
131                         return " OSN QDIO";
132                 case QETH_CARD_TYPE_OSM:
133                         return " OSM QDIO";
134                 case QETH_CARD_TYPE_OSX:
135                         return " OSX QDIO";
136                 default:
137                         return " unknown";
138                 }
139         }
140         return " n/a";
141 }
142
143 /* max length to be returned: 14 */
144 const char *qeth_get_cardname_short(struct qeth_card *card)
145 {
146         if (card->info.guestlan) {
147                 switch (card->info.type) {
148                 case QETH_CARD_TYPE_OSD:
149                         return "Virt.NIC QDIO";
150                 case QETH_CARD_TYPE_IQD:
151                         return "Virt.NIC Hiper";
152                 case QETH_CARD_TYPE_OSM:
153                         return "Virt.NIC OSM";
154                 case QETH_CARD_TYPE_OSX:
155                         return "Virt.NIC OSX";
156                 default:
157                         return "unknown";
158                 }
159         } else {
160                 switch (card->info.type) {
161                 case QETH_CARD_TYPE_OSD:
162                         switch (card->info.link_type) {
163                         case QETH_LINK_TYPE_FAST_ETH:
164                                 return "OSD_100";
165                         case QETH_LINK_TYPE_HSTR:
166                                 return "HSTR";
167                         case QETH_LINK_TYPE_GBIT_ETH:
168                                 return "OSD_1000";
169                         case QETH_LINK_TYPE_10GBIT_ETH:
170                                 return "OSD_10GIG";
171                         case QETH_LINK_TYPE_LANE_ETH100:
172                                 return "OSD_FE_LANE";
173                         case QETH_LINK_TYPE_LANE_TR:
174                                 return "OSD_TR_LANE";
175                         case QETH_LINK_TYPE_LANE_ETH1000:
176                                 return "OSD_GbE_LANE";
177                         case QETH_LINK_TYPE_LANE:
178                                 return "OSD_ATM_LANE";
179                         default:
180                                 return "OSD_Express";
181                         }
182                 case QETH_CARD_TYPE_IQD:
183                         return "HiperSockets";
184                 case QETH_CARD_TYPE_OSN:
185                         return "OSN";
186                 case QETH_CARD_TYPE_OSM:
187                         return "OSM_1000";
188                 case QETH_CARD_TYPE_OSX:
189                         return "OSX_10GIG";
190                 default:
191                         return "unknown";
192                 }
193         }
194         return "n/a";
195 }
196
197 void qeth_set_recovery_task(struct qeth_card *card)
198 {
199         card->recovery_task = current;
200 }
201 EXPORT_SYMBOL_GPL(qeth_set_recovery_task);
202
203 void qeth_clear_recovery_task(struct qeth_card *card)
204 {
205         card->recovery_task = NULL;
206 }
207 EXPORT_SYMBOL_GPL(qeth_clear_recovery_task);
208
209 static bool qeth_is_recovery_task(const struct qeth_card *card)
210 {
211         return card->recovery_task == current;
212 }
213
214 void qeth_set_allowed_threads(struct qeth_card *card, unsigned long threads,
215                          int clear_start_mask)
216 {
217         unsigned long flags;
218
219         spin_lock_irqsave(&card->thread_mask_lock, flags);
220         card->thread_allowed_mask = threads;
221         if (clear_start_mask)
222                 card->thread_start_mask &= threads;
223         spin_unlock_irqrestore(&card->thread_mask_lock, flags);
224         wake_up(&card->wait_q);
225 }
226 EXPORT_SYMBOL_GPL(qeth_set_allowed_threads);
227
228 int qeth_threads_running(struct qeth_card *card, unsigned long threads)
229 {
230         unsigned long flags;
231         int rc = 0;
232
233         spin_lock_irqsave(&card->thread_mask_lock, flags);
234         rc = (card->thread_running_mask & threads);
235         spin_unlock_irqrestore(&card->thread_mask_lock, flags);
236         return rc;
237 }
238 EXPORT_SYMBOL_GPL(qeth_threads_running);
239
240 int qeth_wait_for_threads(struct qeth_card *card, unsigned long threads)
241 {
242         if (qeth_is_recovery_task(card))
243                 return 0;
244         return wait_event_interruptible(card->wait_q,
245                         qeth_threads_running(card, threads) == 0);
246 }
247 EXPORT_SYMBOL_GPL(qeth_wait_for_threads);
248
249 void qeth_clear_working_pool_list(struct qeth_card *card)
250 {
251         struct qeth_buffer_pool_entry *pool_entry, *tmp;
252
253         QETH_CARD_TEXT(card, 5, "clwrklst");
254         list_for_each_entry_safe(pool_entry, tmp,
255                             &card->qdio.in_buf_pool.entry_list, list){
256                         list_del(&pool_entry->list);
257         }
258 }
259 EXPORT_SYMBOL_GPL(qeth_clear_working_pool_list);
260
261 static int qeth_alloc_buffer_pool(struct qeth_card *card)
262 {
263         struct qeth_buffer_pool_entry *pool_entry;
264         void *ptr;
265         int i, j;
266
267         QETH_CARD_TEXT(card, 5, "alocpool");
268         for (i = 0; i < card->qdio.init_pool.buf_count; ++i) {
269                 pool_entry = kzalloc(sizeof(*pool_entry), GFP_KERNEL);
270                 if (!pool_entry) {
271                         qeth_free_buffer_pool(card);
272                         return -ENOMEM;
273                 }
274                 for (j = 0; j < QETH_MAX_BUFFER_ELEMENTS(card); ++j) {
275                         ptr = (void *) __get_free_page(GFP_KERNEL);
276                         if (!ptr) {
277                                 while (j > 0)
278                                         free_page((unsigned long)
279                                                   pool_entry->elements[--j]);
280                                 kfree(pool_entry);
281                                 qeth_free_buffer_pool(card);
282                                 return -ENOMEM;
283                         }
284                         pool_entry->elements[j] = ptr;
285                 }
286                 list_add(&pool_entry->init_list,
287                          &card->qdio.init_pool.entry_list);
288         }
289         return 0;
290 }
291
292 int qeth_realloc_buffer_pool(struct qeth_card *card, int bufcnt)
293 {
294         QETH_CARD_TEXT(card, 2, "realcbp");
295
296         if ((card->state != CARD_STATE_DOWN) &&
297             (card->state != CARD_STATE_RECOVER))
298                 return -EPERM;
299
300         /* TODO: steel/add buffers from/to a running card's buffer pool (?) */
301         qeth_clear_working_pool_list(card);
302         qeth_free_buffer_pool(card);
303         card->qdio.in_buf_pool.buf_count = bufcnt;
304         card->qdio.init_pool.buf_count = bufcnt;
305         return qeth_alloc_buffer_pool(card);
306 }
307 EXPORT_SYMBOL_GPL(qeth_realloc_buffer_pool);
308
309 static void qeth_free_qdio_queue(struct qeth_qdio_q *q)
310 {
311         if (!q)
312                 return;
313
314         qdio_free_buffers(q->qdio_bufs, QDIO_MAX_BUFFERS_PER_Q);
315         kfree(q);
316 }
317
318 static struct qeth_qdio_q *qeth_alloc_qdio_queue(void)
319 {
320         struct qeth_qdio_q *q = kzalloc(sizeof(*q), GFP_KERNEL);
321         int i;
322
323         if (!q)
324                 return NULL;
325
326         if (qdio_alloc_buffers(q->qdio_bufs, QDIO_MAX_BUFFERS_PER_Q)) {
327                 kfree(q);
328                 return NULL;
329         }
330
331         for (i = 0; i < QDIO_MAX_BUFFERS_PER_Q; ++i)
332                 q->bufs[i].buffer = q->qdio_bufs[i];
333
334         QETH_DBF_HEX(SETUP, 2, &q, sizeof(void *));
335         return q;
336 }
337
338 static int qeth_cq_init(struct qeth_card *card)
339 {
340         int rc;
341
342         if (card->options.cq == QETH_CQ_ENABLED) {
343                 QETH_DBF_TEXT(SETUP, 2, "cqinit");
344                 qdio_reset_buffers(card->qdio.c_q->qdio_bufs,
345                                    QDIO_MAX_BUFFERS_PER_Q);
346                 card->qdio.c_q->next_buf_to_init = 127;
347                 rc = do_QDIO(CARD_DDEV(card), QDIO_FLAG_SYNC_INPUT,
348                              card->qdio.no_in_queues - 1, 0,
349                              127);
350                 if (rc) {
351                         QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc);
352                         goto out;
353                 }
354         }
355         rc = 0;
356 out:
357         return rc;
358 }
359
360 static int qeth_alloc_cq(struct qeth_card *card)
361 {
362         int rc;
363
364         if (card->options.cq == QETH_CQ_ENABLED) {
365                 int i;
366                 struct qdio_outbuf_state *outbuf_states;
367
368                 QETH_DBF_TEXT(SETUP, 2, "cqon");
369                 card->qdio.c_q = qeth_alloc_qdio_queue();
370                 if (!card->qdio.c_q) {
371                         rc = -1;
372                         goto kmsg_out;
373                 }
374                 card->qdio.no_in_queues = 2;
375                 card->qdio.out_bufstates =
376                         kzalloc(card->qdio.no_out_queues *
377                                 QDIO_MAX_BUFFERS_PER_Q *
378                                 sizeof(struct qdio_outbuf_state), GFP_KERNEL);
379                 outbuf_states = card->qdio.out_bufstates;
380                 if (outbuf_states == NULL) {
381                         rc = -1;
382                         goto free_cq_out;
383                 }
384                 for (i = 0; i < card->qdio.no_out_queues; ++i) {
385                         card->qdio.out_qs[i]->bufstates = outbuf_states;
386                         outbuf_states += QDIO_MAX_BUFFERS_PER_Q;
387                 }
388         } else {
389                 QETH_DBF_TEXT(SETUP, 2, "nocq");
390                 card->qdio.c_q = NULL;
391                 card->qdio.no_in_queues = 1;
392         }
393         QETH_DBF_TEXT_(SETUP, 2, "iqc%d", card->qdio.no_in_queues);
394         rc = 0;
395 out:
396         return rc;
397 free_cq_out:
398         qeth_free_qdio_queue(card->qdio.c_q);
399         card->qdio.c_q = NULL;
400 kmsg_out:
401         dev_err(&card->gdev->dev, "Failed to create completion queue\n");
402         goto out;
403 }
404
405 static void qeth_free_cq(struct qeth_card *card)
406 {
407         if (card->qdio.c_q) {
408                 --card->qdio.no_in_queues;
409                 qeth_free_qdio_queue(card->qdio.c_q);
410                 card->qdio.c_q = NULL;
411         }
412         kfree(card->qdio.out_bufstates);
413         card->qdio.out_bufstates = NULL;
414 }
415
416 static enum iucv_tx_notify qeth_compute_cq_notification(int sbalf15,
417                                                         int delayed)
418 {
419         enum iucv_tx_notify n;
420
421         switch (sbalf15) {
422         case 0:
423                 n = delayed ? TX_NOTIFY_DELAYED_OK : TX_NOTIFY_OK;
424                 break;
425         case 4:
426         case 16:
427         case 17:
428         case 18:
429                 n = delayed ? TX_NOTIFY_DELAYED_UNREACHABLE :
430                         TX_NOTIFY_UNREACHABLE;
431                 break;
432         default:
433                 n = delayed ? TX_NOTIFY_DELAYED_GENERALERROR :
434                         TX_NOTIFY_GENERALERROR;
435                 break;
436         }
437
438         return n;
439 }
440
441 static void qeth_cleanup_handled_pending(struct qeth_qdio_out_q *q, int bidx,
442                                          int forced_cleanup)
443 {
444         if (q->card->options.cq != QETH_CQ_ENABLED)
445                 return;
446
447         if (q->bufs[bidx]->next_pending != NULL) {
448                 struct qeth_qdio_out_buffer *head = q->bufs[bidx];
449                 struct qeth_qdio_out_buffer *c = q->bufs[bidx]->next_pending;
450
451                 while (c) {
452                         if (forced_cleanup ||
453                             atomic_read(&c->state) ==
454                               QETH_QDIO_BUF_HANDLED_DELAYED) {
455                                 struct qeth_qdio_out_buffer *f = c;
456                                 QETH_CARD_TEXT(f->q->card, 5, "fp");
457                                 QETH_CARD_TEXT_(f->q->card, 5, "%lx", (long) f);
458                                 /* release here to avoid interleaving between
459                                    outbound tasklet and inbound tasklet
460                                    regarding notifications and lifecycle */
461                                 qeth_release_skbs(c);
462
463                                 c = f->next_pending;
464                                 WARN_ON_ONCE(head->next_pending != f);
465                                 head->next_pending = c;
466                                 kmem_cache_free(qeth_qdio_outbuf_cache, f);
467                         } else {
468                                 head = c;
469                                 c = c->next_pending;
470                         }
471
472                 }
473         }
474         if (forced_cleanup && (atomic_read(&(q->bufs[bidx]->state)) ==
475                                         QETH_QDIO_BUF_HANDLED_DELAYED)) {
476                 /* for recovery situations */
477                 q->bufs[bidx]->aob = q->bufstates[bidx].aob;
478                 qeth_init_qdio_out_buf(q, bidx);
479                 QETH_CARD_TEXT(q->card, 2, "clprecov");
480         }
481 }
482
483
484 static void qeth_qdio_handle_aob(struct qeth_card *card,
485                                  unsigned long phys_aob_addr)
486 {
487         struct qaob *aob;
488         struct qeth_qdio_out_buffer *buffer;
489         enum iucv_tx_notify notification;
490
491         aob = (struct qaob *) phys_to_virt(phys_aob_addr);
492         QETH_CARD_TEXT(card, 5, "haob");
493         QETH_CARD_TEXT_(card, 5, "%lx", phys_aob_addr);
494         buffer = (struct qeth_qdio_out_buffer *) aob->user1;
495         QETH_CARD_TEXT_(card, 5, "%lx", aob->user1);
496
497         if (atomic_cmpxchg(&buffer->state, QETH_QDIO_BUF_PRIMED,
498                            QETH_QDIO_BUF_IN_CQ) == QETH_QDIO_BUF_PRIMED) {
499                 notification = TX_NOTIFY_OK;
500         } else {
501                 WARN_ON_ONCE(atomic_read(&buffer->state) !=
502                                                         QETH_QDIO_BUF_PENDING);
503                 atomic_set(&buffer->state, QETH_QDIO_BUF_IN_CQ);
504                 notification = TX_NOTIFY_DELAYED_OK;
505         }
506
507         if (aob->aorc != 0)  {
508                 QETH_CARD_TEXT_(card, 2, "aorc%02X", aob->aorc);
509                 notification = qeth_compute_cq_notification(aob->aorc, 1);
510         }
511         qeth_notify_skbs(buffer->q, buffer, notification);
512
513         buffer->aob = NULL;
514         qeth_clear_output_buffer(buffer->q, buffer,
515                                  QETH_QDIO_BUF_HANDLED_DELAYED);
516
517         /* from here on: do not touch buffer anymore */
518         qdio_release_aob(aob);
519 }
520
521 static inline int qeth_is_cq(struct qeth_card *card, unsigned int queue)
522 {
523         return card->options.cq == QETH_CQ_ENABLED &&
524             card->qdio.c_q != NULL &&
525             queue != 0 &&
526             queue == card->qdio.no_in_queues - 1;
527 }
528
529
530 static int qeth_issue_next_read(struct qeth_card *card)
531 {
532         int rc;
533         struct qeth_cmd_buffer *iob;
534
535         QETH_CARD_TEXT(card, 5, "issnxrd");
536         if (card->read.state != CH_STATE_UP)
537                 return -EIO;
538         iob = qeth_get_buffer(&card->read);
539         if (!iob) {
540                 dev_warn(&card->gdev->dev, "The qeth device driver "
541                         "failed to recover an error on the device\n");
542                 QETH_DBF_MESSAGE(2, "%s issue_next_read failed: no iob "
543                         "available\n", dev_name(&card->gdev->dev));
544                 return -ENOMEM;
545         }
546         qeth_setup_ccw(&card->read, iob->data, QETH_BUFSIZE);
547         QETH_CARD_TEXT(card, 6, "noirqpnd");
548         rc = ccw_device_start(card->read.ccwdev, &card->read.ccw,
549                               (addr_t) iob, 0, 0);
550         if (rc) {
551                 QETH_DBF_MESSAGE(2, "%s error in starting next read ccw! "
552                         "rc=%i\n", dev_name(&card->gdev->dev), rc);
553                 atomic_set(&card->read.irq_pending, 0);
554                 card->read_or_write_problem = 1;
555                 qeth_schedule_recovery(card);
556                 wake_up(&card->wait_q);
557         }
558         return rc;
559 }
560
561 static struct qeth_reply *qeth_alloc_reply(struct qeth_card *card)
562 {
563         struct qeth_reply *reply;
564
565         reply = kzalloc(sizeof(struct qeth_reply), GFP_ATOMIC);
566         if (reply) {
567                 atomic_set(&reply->refcnt, 1);
568                 atomic_set(&reply->received, 0);
569                 reply->card = card;
570         }
571         return reply;
572 }
573
574 static void qeth_get_reply(struct qeth_reply *reply)
575 {
576         WARN_ON(atomic_read(&reply->refcnt) <= 0);
577         atomic_inc(&reply->refcnt);
578 }
579
580 static void qeth_put_reply(struct qeth_reply *reply)
581 {
582         WARN_ON(atomic_read(&reply->refcnt) <= 0);
583         if (atomic_dec_and_test(&reply->refcnt))
584                 kfree(reply);
585 }
586
587 static void qeth_issue_ipa_msg(struct qeth_ipa_cmd *cmd, int rc,
588                 struct qeth_card *card)
589 {
590         char *ipa_name;
591         int com = cmd->hdr.command;
592         ipa_name = qeth_get_ipa_cmd_name(com);
593         if (rc)
594                 QETH_DBF_MESSAGE(2, "IPA: %s(x%X) for %s/%s returned "
595                                 "x%X \"%s\"\n",
596                                 ipa_name, com, dev_name(&card->gdev->dev),
597                                 QETH_CARD_IFNAME(card), rc,
598                                 qeth_get_ipa_msg(rc));
599         else
600                 QETH_DBF_MESSAGE(5, "IPA: %s(x%X) for %s/%s succeeded\n",
601                                 ipa_name, com, dev_name(&card->gdev->dev),
602                                 QETH_CARD_IFNAME(card));
603 }
604
605 static struct qeth_ipa_cmd *qeth_check_ipa_data(struct qeth_card *card,
606                 struct qeth_cmd_buffer *iob)
607 {
608         struct qeth_ipa_cmd *cmd = NULL;
609
610         QETH_CARD_TEXT(card, 5, "chkipad");
611         if (IS_IPA(iob->data)) {
612                 cmd = (struct qeth_ipa_cmd *) PDU_ENCAPSULATION(iob->data);
613                 if (IS_IPA_REPLY(cmd)) {
614                         if (cmd->hdr.command != IPA_CMD_SETCCID &&
615                             cmd->hdr.command != IPA_CMD_DELCCID &&
616                             cmd->hdr.command != IPA_CMD_MODCCID &&
617                             cmd->hdr.command != IPA_CMD_SET_DIAG_ASS)
618                                 qeth_issue_ipa_msg(cmd,
619                                                 cmd->hdr.return_code, card);
620                         return cmd;
621                 } else {
622                         switch (cmd->hdr.command) {
623                         case IPA_CMD_STOPLAN:
624                                 if (cmd->hdr.return_code ==
625                                                 IPA_RC_VEPA_TO_VEB_TRANSITION) {
626                                         dev_err(&card->gdev->dev,
627                                            "Interface %s is down because the "
628                                            "adjacent port is no longer in "
629                                            "reflective relay mode\n",
630                                            QETH_CARD_IFNAME(card));
631                                         qeth_close_dev(card);
632                                 } else {
633                                         dev_warn(&card->gdev->dev,
634                                            "The link for interface %s on CHPID"
635                                            " 0x%X failed\n",
636                                            QETH_CARD_IFNAME(card),
637                                            card->info.chpid);
638                                         qeth_issue_ipa_msg(cmd,
639                                                 cmd->hdr.return_code, card);
640                                 }
641                                 card->lan_online = 0;
642                                 if (card->dev && netif_carrier_ok(card->dev))
643                                         netif_carrier_off(card->dev);
644                                 return NULL;
645                         case IPA_CMD_STARTLAN:
646                                 dev_info(&card->gdev->dev,
647                                            "The link for %s on CHPID 0x%X has"
648                                            " been restored\n",
649                                            QETH_CARD_IFNAME(card),
650                                            card->info.chpid);
651                                 netif_carrier_on(card->dev);
652                                 card->lan_online = 1;
653                                 if (card->info.hwtrap)
654                                         card->info.hwtrap = 2;
655                                 qeth_schedule_recovery(card);
656                                 return NULL;
657                         case IPA_CMD_SETBRIDGEPORT_IQD:
658                         case IPA_CMD_SETBRIDGEPORT_OSA:
659                         case IPA_CMD_ADDRESS_CHANGE_NOTIF:
660                                 if (card->discipline->control_event_handler
661                                                                 (card, cmd))
662                                         return cmd;
663                                 else
664                                         return NULL;
665                         case IPA_CMD_MODCCID:
666                                 return cmd;
667                         case IPA_CMD_REGISTER_LOCAL_ADDR:
668                                 QETH_CARD_TEXT(card, 3, "irla");
669                                 break;
670                         case IPA_CMD_UNREGISTER_LOCAL_ADDR:
671                                 QETH_CARD_TEXT(card, 3, "urla");
672                                 break;
673                         default:
674                                 QETH_DBF_MESSAGE(2, "Received data is IPA "
675                                            "but not a reply!\n");
676                                 break;
677                         }
678                 }
679         }
680         return cmd;
681 }
682
683 void qeth_clear_ipacmd_list(struct qeth_card *card)
684 {
685         struct qeth_reply *reply, *r;
686         unsigned long flags;
687
688         QETH_CARD_TEXT(card, 4, "clipalst");
689
690         spin_lock_irqsave(&card->lock, flags);
691         list_for_each_entry_safe(reply, r, &card->cmd_waiter_list, list) {
692                 qeth_get_reply(reply);
693                 reply->rc = -EIO;
694                 atomic_inc(&reply->received);
695                 list_del_init(&reply->list);
696                 wake_up(&reply->wait_q);
697                 qeth_put_reply(reply);
698         }
699         spin_unlock_irqrestore(&card->lock, flags);
700         atomic_set(&card->write.irq_pending, 0);
701 }
702 EXPORT_SYMBOL_GPL(qeth_clear_ipacmd_list);
703
704 static int qeth_check_idx_response(struct qeth_card *card,
705         unsigned char *buffer)
706 {
707         if (!buffer)
708                 return 0;
709
710         QETH_DBF_HEX(CTRL, 2, buffer, QETH_DBF_CTRL_LEN);
711         if ((buffer[2] & 0xc0) == 0xc0) {
712                 QETH_DBF_MESSAGE(2, "received an IDX TERMINATE "
713                            "with cause code 0x%02x%s\n",
714                            buffer[4],
715                            ((buffer[4] == 0x22) ?
716                             " -- try another portname" : ""));
717                 QETH_CARD_TEXT(card, 2, "ckidxres");
718                 QETH_CARD_TEXT(card, 2, " idxterm");
719                 QETH_CARD_TEXT_(card, 2, "  rc%d", -EIO);
720                 if (buffer[4] == 0xf6) {
721                         dev_err(&card->gdev->dev,
722                         "The qeth device is not configured "
723                         "for the OSI layer required by z/VM\n");
724                         return -EPERM;
725                 }
726                 return -EIO;
727         }
728         return 0;
729 }
730
731 static struct qeth_card *CARD_FROM_CDEV(struct ccw_device *cdev)
732 {
733         struct qeth_card *card = dev_get_drvdata(&((struct ccwgroup_device *)
734                 dev_get_drvdata(&cdev->dev))->dev);
735         return card;
736 }
737
738 static void qeth_setup_ccw(struct qeth_channel *channel, unsigned char *iob,
739                 __u32 len)
740 {
741         struct qeth_card *card;
742
743         card = CARD_FROM_CDEV(channel->ccwdev);
744         QETH_CARD_TEXT(card, 4, "setupccw");
745         if (channel == &card->read)
746                 memcpy(&channel->ccw, READ_CCW, sizeof(struct ccw1));
747         else
748                 memcpy(&channel->ccw, WRITE_CCW, sizeof(struct ccw1));
749         channel->ccw.count = len;
750         channel->ccw.cda = (__u32) __pa(iob);
751 }
752
753 static struct qeth_cmd_buffer *__qeth_get_buffer(struct qeth_channel *channel)
754 {
755         __u8 index;
756
757         QETH_CARD_TEXT(CARD_FROM_CDEV(channel->ccwdev), 6, "getbuff");
758         index = channel->io_buf_no;
759         do {
760                 if (channel->iob[index].state == BUF_STATE_FREE) {
761                         channel->iob[index].state = BUF_STATE_LOCKED;
762                         channel->io_buf_no = (channel->io_buf_no + 1) %
763                                 QETH_CMD_BUFFER_NO;
764                         memset(channel->iob[index].data, 0, QETH_BUFSIZE);
765                         return channel->iob + index;
766                 }
767                 index = (index + 1) % QETH_CMD_BUFFER_NO;
768         } while (index != channel->io_buf_no);
769
770         return NULL;
771 }
772
773 void qeth_release_buffer(struct qeth_channel *channel,
774                 struct qeth_cmd_buffer *iob)
775 {
776         unsigned long flags;
777
778         QETH_CARD_TEXT(CARD_FROM_CDEV(channel->ccwdev), 6, "relbuff");
779         spin_lock_irqsave(&channel->iob_lock, flags);
780         memset(iob->data, 0, QETH_BUFSIZE);
781         iob->state = BUF_STATE_FREE;
782         iob->callback = qeth_send_control_data_cb;
783         iob->rc = 0;
784         spin_unlock_irqrestore(&channel->iob_lock, flags);
785         wake_up(&channel->wait_q);
786 }
787 EXPORT_SYMBOL_GPL(qeth_release_buffer);
788
789 static struct qeth_cmd_buffer *qeth_get_buffer(struct qeth_channel *channel)
790 {
791         struct qeth_cmd_buffer *buffer = NULL;
792         unsigned long flags;
793
794         spin_lock_irqsave(&channel->iob_lock, flags);
795         buffer = __qeth_get_buffer(channel);
796         spin_unlock_irqrestore(&channel->iob_lock, flags);
797         return buffer;
798 }
799
800 struct qeth_cmd_buffer *qeth_wait_for_buffer(struct qeth_channel *channel)
801 {
802         struct qeth_cmd_buffer *buffer;
803         wait_event(channel->wait_q,
804                    ((buffer = qeth_get_buffer(channel)) != NULL));
805         return buffer;
806 }
807 EXPORT_SYMBOL_GPL(qeth_wait_for_buffer);
808
809 void qeth_clear_cmd_buffers(struct qeth_channel *channel)
810 {
811         int cnt;
812
813         for (cnt = 0; cnt < QETH_CMD_BUFFER_NO; cnt++)
814                 qeth_release_buffer(channel, &channel->iob[cnt]);
815         channel->buf_no = 0;
816         channel->io_buf_no = 0;
817 }
818 EXPORT_SYMBOL_GPL(qeth_clear_cmd_buffers);
819
820 static void qeth_send_control_data_cb(struct qeth_channel *channel,
821                   struct qeth_cmd_buffer *iob)
822 {
823         struct qeth_card *card;
824         struct qeth_reply *reply, *r;
825         struct qeth_ipa_cmd *cmd;
826         unsigned long flags;
827         int keep_reply;
828         int rc = 0;
829
830         card = CARD_FROM_CDEV(channel->ccwdev);
831         QETH_CARD_TEXT(card, 4, "sndctlcb");
832         rc = qeth_check_idx_response(card, iob->data);
833         switch (rc) {
834         case 0:
835                 break;
836         case -EIO:
837                 qeth_clear_ipacmd_list(card);
838                 qeth_schedule_recovery(card);
839                 /* fall through */
840         default:
841                 goto out;
842         }
843
844         cmd = qeth_check_ipa_data(card, iob);
845         if ((cmd == NULL) && (card->state != CARD_STATE_DOWN))
846                 goto out;
847         /*in case of OSN : check if cmd is set */
848         if (card->info.type == QETH_CARD_TYPE_OSN &&
849             cmd &&
850             cmd->hdr.command != IPA_CMD_STARTLAN &&
851             card->osn_info.assist_cb != NULL) {
852                 card->osn_info.assist_cb(card->dev, cmd);
853                 goto out;
854         }
855
856         spin_lock_irqsave(&card->lock, flags);
857         list_for_each_entry_safe(reply, r, &card->cmd_waiter_list, list) {
858                 if ((reply->seqno == QETH_IDX_COMMAND_SEQNO) ||
859                     ((cmd) && (reply->seqno == cmd->hdr.seqno))) {
860                         qeth_get_reply(reply);
861                         list_del_init(&reply->list);
862                         spin_unlock_irqrestore(&card->lock, flags);
863                         keep_reply = 0;
864                         if (reply->callback != NULL) {
865                                 if (cmd) {
866                                         reply->offset = (__u16)((char *)cmd -
867                                                         (char *)iob->data);
868                                         keep_reply = reply->callback(card,
869                                                         reply,
870                                                         (unsigned long)cmd);
871                                 } else
872                                         keep_reply = reply->callback(card,
873                                                         reply,
874                                                         (unsigned long)iob);
875                         }
876                         if (cmd)
877                                 reply->rc = (u16) cmd->hdr.return_code;
878                         else if (iob->rc)
879                                 reply->rc = iob->rc;
880                         if (keep_reply) {
881                                 spin_lock_irqsave(&card->lock, flags);
882                                 list_add_tail(&reply->list,
883                                               &card->cmd_waiter_list);
884                                 spin_unlock_irqrestore(&card->lock, flags);
885                         } else {
886                                 atomic_inc(&reply->received);
887                                 wake_up(&reply->wait_q);
888                         }
889                         qeth_put_reply(reply);
890                         goto out;
891                 }
892         }
893         spin_unlock_irqrestore(&card->lock, flags);
894 out:
895         memcpy(&card->seqno.pdu_hdr_ack,
896                 QETH_PDU_HEADER_SEQ_NO(iob->data),
897                 QETH_SEQ_NO_LENGTH);
898         qeth_release_buffer(channel, iob);
899 }
900
901 static int qeth_setup_channel(struct qeth_channel *channel)
902 {
903         int cnt;
904
905         QETH_DBF_TEXT(SETUP, 2, "setupch");
906         for (cnt = 0; cnt < QETH_CMD_BUFFER_NO; cnt++) {
907                 channel->iob[cnt].data =
908                         kzalloc(QETH_BUFSIZE, GFP_DMA|GFP_KERNEL);
909                 if (channel->iob[cnt].data == NULL)
910                         break;
911                 channel->iob[cnt].state = BUF_STATE_FREE;
912                 channel->iob[cnt].channel = channel;
913                 channel->iob[cnt].callback = qeth_send_control_data_cb;
914                 channel->iob[cnt].rc = 0;
915         }
916         if (cnt < QETH_CMD_BUFFER_NO) {
917                 while (cnt-- > 0)
918                         kfree(channel->iob[cnt].data);
919                 return -ENOMEM;
920         }
921         channel->buf_no = 0;
922         channel->io_buf_no = 0;
923         atomic_set(&channel->irq_pending, 0);
924         spin_lock_init(&channel->iob_lock);
925
926         init_waitqueue_head(&channel->wait_q);
927         return 0;
928 }
929
930 static int qeth_set_thread_start_bit(struct qeth_card *card,
931                 unsigned long thread)
932 {
933         unsigned long flags;
934
935         spin_lock_irqsave(&card->thread_mask_lock, flags);
936         if (!(card->thread_allowed_mask & thread) ||
937               (card->thread_start_mask & thread)) {
938                 spin_unlock_irqrestore(&card->thread_mask_lock, flags);
939                 return -EPERM;
940         }
941         card->thread_start_mask |= thread;
942         spin_unlock_irqrestore(&card->thread_mask_lock, flags);
943         return 0;
944 }
945
946 void qeth_clear_thread_start_bit(struct qeth_card *card, unsigned long thread)
947 {
948         unsigned long flags;
949
950         spin_lock_irqsave(&card->thread_mask_lock, flags);
951         card->thread_start_mask &= ~thread;
952         spin_unlock_irqrestore(&card->thread_mask_lock, flags);
953         wake_up(&card->wait_q);
954 }
955 EXPORT_SYMBOL_GPL(qeth_clear_thread_start_bit);
956
957 void qeth_clear_thread_running_bit(struct qeth_card *card, unsigned long thread)
958 {
959         unsigned long flags;
960
961         spin_lock_irqsave(&card->thread_mask_lock, flags);
962         card->thread_running_mask &= ~thread;
963         spin_unlock_irqrestore(&card->thread_mask_lock, flags);
964         wake_up(&card->wait_q);
965 }
966 EXPORT_SYMBOL_GPL(qeth_clear_thread_running_bit);
967
968 static int __qeth_do_run_thread(struct qeth_card *card, unsigned long thread)
969 {
970         unsigned long flags;
971         int rc = 0;
972
973         spin_lock_irqsave(&card->thread_mask_lock, flags);
974         if (card->thread_start_mask & thread) {
975                 if ((card->thread_allowed_mask & thread) &&
976                     !(card->thread_running_mask & thread)) {
977                         rc = 1;
978                         card->thread_start_mask &= ~thread;
979                         card->thread_running_mask |= thread;
980                 } else
981                         rc = -EPERM;
982         }
983         spin_unlock_irqrestore(&card->thread_mask_lock, flags);
984         return rc;
985 }
986
987 int qeth_do_run_thread(struct qeth_card *card, unsigned long thread)
988 {
989         int rc = 0;
990
991         wait_event(card->wait_q,
992                    (rc = __qeth_do_run_thread(card, thread)) >= 0);
993         return rc;
994 }
995 EXPORT_SYMBOL_GPL(qeth_do_run_thread);
996
997 void qeth_schedule_recovery(struct qeth_card *card)
998 {
999         QETH_CARD_TEXT(card, 2, "startrec");
1000         if (qeth_set_thread_start_bit(card, QETH_RECOVER_THREAD) == 0)
1001                 schedule_work(&card->kernel_thread_starter);
1002 }
1003 EXPORT_SYMBOL_GPL(qeth_schedule_recovery);
1004
1005 static int qeth_get_problem(struct ccw_device *cdev, struct irb *irb)
1006 {
1007         int dstat, cstat;
1008         char *sense;
1009         struct qeth_card *card;
1010
1011         sense = (char *) irb->ecw;
1012         cstat = irb->scsw.cmd.cstat;
1013         dstat = irb->scsw.cmd.dstat;
1014         card = CARD_FROM_CDEV(cdev);
1015
1016         if (cstat & (SCHN_STAT_CHN_CTRL_CHK | SCHN_STAT_INTF_CTRL_CHK |
1017                      SCHN_STAT_CHN_DATA_CHK | SCHN_STAT_CHAIN_CHECK |
1018                      SCHN_STAT_PROT_CHECK | SCHN_STAT_PROG_CHECK)) {
1019                 QETH_CARD_TEXT(card, 2, "CGENCHK");
1020                 dev_warn(&cdev->dev, "The qeth device driver "
1021                         "failed to recover an error on the device\n");
1022                 QETH_DBF_MESSAGE(2, "%s check on device dstat=x%x, cstat=x%x\n",
1023                         dev_name(&cdev->dev), dstat, cstat);
1024                 print_hex_dump(KERN_WARNING, "qeth: irb ", DUMP_PREFIX_OFFSET,
1025                                 16, 1, irb, 64, 1);
1026                 return 1;
1027         }
1028
1029         if (dstat & DEV_STAT_UNIT_CHECK) {
1030                 if (sense[SENSE_RESETTING_EVENT_BYTE] &
1031                     SENSE_RESETTING_EVENT_FLAG) {
1032                         QETH_CARD_TEXT(card, 2, "REVIND");
1033                         return 1;
1034                 }
1035                 if (sense[SENSE_COMMAND_REJECT_BYTE] &
1036                     SENSE_COMMAND_REJECT_FLAG) {
1037                         QETH_CARD_TEXT(card, 2, "CMDREJi");
1038                         return 1;
1039                 }
1040                 if ((sense[2] == 0xaf) && (sense[3] == 0xfe)) {
1041                         QETH_CARD_TEXT(card, 2, "AFFE");
1042                         return 1;
1043                 }
1044                 if ((!sense[0]) && (!sense[1]) && (!sense[2]) && (!sense[3])) {
1045                         QETH_CARD_TEXT(card, 2, "ZEROSEN");
1046                         return 0;
1047                 }
1048                 QETH_CARD_TEXT(card, 2, "DGENCHK");
1049                         return 1;
1050         }
1051         return 0;
1052 }
1053
1054 static long __qeth_check_irb_error(struct ccw_device *cdev,
1055                 unsigned long intparm, struct irb *irb)
1056 {
1057         struct qeth_card *card;
1058
1059         card = CARD_FROM_CDEV(cdev);
1060
1061         if (!card || !IS_ERR(irb))
1062                 return 0;
1063
1064         switch (PTR_ERR(irb)) {
1065         case -EIO:
1066                 QETH_DBF_MESSAGE(2, "%s i/o-error on device\n",
1067                         dev_name(&cdev->dev));
1068                 QETH_CARD_TEXT(card, 2, "ckirberr");
1069                 QETH_CARD_TEXT_(card, 2, "  rc%d", -EIO);
1070                 break;
1071         case -ETIMEDOUT:
1072                 dev_warn(&cdev->dev, "A hardware operation timed out"
1073                         " on the device\n");
1074                 QETH_CARD_TEXT(card, 2, "ckirberr");
1075                 QETH_CARD_TEXT_(card, 2, "  rc%d", -ETIMEDOUT);
1076                 if (intparm == QETH_RCD_PARM) {
1077                         if (card->data.ccwdev == cdev) {
1078                                 card->data.state = CH_STATE_DOWN;
1079                                 wake_up(&card->wait_q);
1080                         }
1081                 }
1082                 break;
1083         default:
1084                 QETH_DBF_MESSAGE(2, "%s unknown error %ld on device\n",
1085                         dev_name(&cdev->dev), PTR_ERR(irb));
1086                 QETH_CARD_TEXT(card, 2, "ckirberr");
1087                 QETH_CARD_TEXT(card, 2, "  rc???");
1088         }
1089         return PTR_ERR(irb);
1090 }
1091
1092 static void qeth_irq(struct ccw_device *cdev, unsigned long intparm,
1093                 struct irb *irb)
1094 {
1095         int rc;
1096         int cstat, dstat;
1097         struct qeth_cmd_buffer *buffer;
1098         struct qeth_channel *channel;
1099         struct qeth_card *card;
1100         struct qeth_cmd_buffer *iob;
1101         __u8 index;
1102
1103         if (__qeth_check_irb_error(cdev, intparm, irb))
1104                 return;
1105         cstat = irb->scsw.cmd.cstat;
1106         dstat = irb->scsw.cmd.dstat;
1107
1108         card = CARD_FROM_CDEV(cdev);
1109         if (!card)
1110                 return;
1111
1112         QETH_CARD_TEXT(card, 5, "irq");
1113
1114         if (card->read.ccwdev == cdev) {
1115                 channel = &card->read;
1116                 QETH_CARD_TEXT(card, 5, "read");
1117         } else if (card->write.ccwdev == cdev) {
1118                 channel = &card->write;
1119                 QETH_CARD_TEXT(card, 5, "write");
1120         } else {
1121                 channel = &card->data;
1122                 QETH_CARD_TEXT(card, 5, "data");
1123         }
1124         atomic_set(&channel->irq_pending, 0);
1125
1126         if (irb->scsw.cmd.fctl & (SCSW_FCTL_CLEAR_FUNC))
1127                 channel->state = CH_STATE_STOPPED;
1128
1129         if (irb->scsw.cmd.fctl & (SCSW_FCTL_HALT_FUNC))
1130                 channel->state = CH_STATE_HALTED;
1131
1132         /*let's wake up immediately on data channel*/
1133         if ((channel == &card->data) && (intparm != 0) &&
1134             (intparm != QETH_RCD_PARM))
1135                 goto out;
1136
1137         if (intparm == QETH_CLEAR_CHANNEL_PARM) {
1138                 QETH_CARD_TEXT(card, 6, "clrchpar");
1139                 /* we don't have to handle this further */
1140                 intparm = 0;
1141         }
1142         if (intparm == QETH_HALT_CHANNEL_PARM) {
1143                 QETH_CARD_TEXT(card, 6, "hltchpar");
1144                 /* we don't have to handle this further */
1145                 intparm = 0;
1146         }
1147         if ((dstat & DEV_STAT_UNIT_EXCEP) ||
1148             (dstat & DEV_STAT_UNIT_CHECK) ||
1149             (cstat)) {
1150                 if (irb->esw.esw0.erw.cons) {
1151                         dev_warn(&channel->ccwdev->dev,
1152                                 "The qeth device driver failed to recover "
1153                                 "an error on the device\n");
1154                         QETH_DBF_MESSAGE(2, "%s sense data available. cstat "
1155                                 "0x%X dstat 0x%X\n",
1156                                 dev_name(&channel->ccwdev->dev), cstat, dstat);
1157                         print_hex_dump(KERN_WARNING, "qeth: irb ",
1158                                 DUMP_PREFIX_OFFSET, 16, 1, irb, 32, 1);
1159                         print_hex_dump(KERN_WARNING, "qeth: sense data ",
1160                                 DUMP_PREFIX_OFFSET, 16, 1, irb->ecw, 32, 1);
1161                 }
1162                 if (intparm == QETH_RCD_PARM) {
1163                         channel->state = CH_STATE_DOWN;
1164                         goto out;
1165                 }
1166                 rc = qeth_get_problem(cdev, irb);
1167                 if (rc) {
1168                         qeth_clear_ipacmd_list(card);
1169                         qeth_schedule_recovery(card);
1170                         goto out;
1171                 }
1172         }
1173
1174         if (intparm == QETH_RCD_PARM) {
1175                 channel->state = CH_STATE_RCD_DONE;
1176                 goto out;
1177         }
1178         if (intparm) {
1179                 buffer = (struct qeth_cmd_buffer *) __va((addr_t)intparm);
1180                 buffer->state = BUF_STATE_PROCESSED;
1181         }
1182         if (channel == &card->data)
1183                 return;
1184         if (channel == &card->read &&
1185             channel->state == CH_STATE_UP)
1186                 qeth_issue_next_read(card);
1187
1188         iob = channel->iob;
1189         index = channel->buf_no;
1190         while (iob[index].state == BUF_STATE_PROCESSED) {
1191                 if (iob[index].callback != NULL)
1192                         iob[index].callback(channel, iob + index);
1193
1194                 index = (index + 1) % QETH_CMD_BUFFER_NO;
1195         }
1196         channel->buf_no = index;
1197 out:
1198         wake_up(&card->wait_q);
1199         return;
1200 }
1201
1202 static void qeth_notify_skbs(struct qeth_qdio_out_q *q,
1203                 struct qeth_qdio_out_buffer *buf,
1204                 enum iucv_tx_notify notification)
1205 {
1206         struct sk_buff *skb;
1207
1208         if (skb_queue_empty(&buf->skb_list))
1209                 goto out;
1210         skb = skb_peek(&buf->skb_list);
1211         while (skb) {
1212                 QETH_CARD_TEXT_(q->card, 5, "skbn%d", notification);
1213                 QETH_CARD_TEXT_(q->card, 5, "%lx", (long) skb);
1214                 if (be16_to_cpu(skb->protocol) == ETH_P_AF_IUCV) {
1215                         if (skb->sk) {
1216                                 struct iucv_sock *iucv = iucv_sk(skb->sk);
1217                                 iucv->sk_txnotify(skb, notification);
1218                         }
1219                 }
1220                 if (skb_queue_is_last(&buf->skb_list, skb))
1221                         skb = NULL;
1222                 else
1223                         skb = skb_queue_next(&buf->skb_list, skb);
1224         }
1225 out:
1226         return;
1227 }
1228
1229 static void qeth_release_skbs(struct qeth_qdio_out_buffer *buf)
1230 {
1231         struct sk_buff *skb;
1232         struct iucv_sock *iucv;
1233         int notify_general_error = 0;
1234
1235         if (atomic_read(&buf->state) == QETH_QDIO_BUF_PENDING)
1236                 notify_general_error = 1;
1237
1238         /* release may never happen from within CQ tasklet scope */
1239         WARN_ON_ONCE(atomic_read(&buf->state) == QETH_QDIO_BUF_IN_CQ);
1240
1241         skb = skb_dequeue(&buf->skb_list);
1242         while (skb) {
1243                 QETH_CARD_TEXT(buf->q->card, 5, "skbr");
1244                 QETH_CARD_TEXT_(buf->q->card, 5, "%lx", (long) skb);
1245                 if (notify_general_error &&
1246                     be16_to_cpu(skb->protocol) == ETH_P_AF_IUCV) {
1247                         if (skb->sk) {
1248                                 iucv = iucv_sk(skb->sk);
1249                                 iucv->sk_txnotify(skb, TX_NOTIFY_GENERALERROR);
1250                         }
1251                 }
1252                 refcount_dec(&skb->users);
1253                 dev_kfree_skb_any(skb);
1254                 skb = skb_dequeue(&buf->skb_list);
1255         }
1256 }
1257
1258 static void qeth_clear_output_buffer(struct qeth_qdio_out_q *queue,
1259                 struct qeth_qdio_out_buffer *buf,
1260                 enum qeth_qdio_buffer_states newbufstate)
1261 {
1262         int i;
1263
1264         /* is PCI flag set on buffer? */
1265         if (buf->buffer->element[0].sflags & SBAL_SFLAGS0_PCI_REQ)
1266                 atomic_dec(&queue->set_pci_flags_count);
1267
1268         if (newbufstate == QETH_QDIO_BUF_EMPTY) {
1269                 qeth_release_skbs(buf);
1270         }
1271         for (i = 0; i < QETH_MAX_BUFFER_ELEMENTS(queue->card); ++i) {
1272                 if (buf->buffer->element[i].addr && buf->is_header[i])
1273                         kmem_cache_free(qeth_core_header_cache,
1274                                 buf->buffer->element[i].addr);
1275                 buf->is_header[i] = 0;
1276                 buf->buffer->element[i].length = 0;
1277                 buf->buffer->element[i].addr = NULL;
1278                 buf->buffer->element[i].eflags = 0;
1279                 buf->buffer->element[i].sflags = 0;
1280         }
1281         buf->buffer->element[15].eflags = 0;
1282         buf->buffer->element[15].sflags = 0;
1283         buf->next_element_to_fill = 0;
1284         atomic_set(&buf->state, newbufstate);
1285 }
1286
1287 static void qeth_clear_outq_buffers(struct qeth_qdio_out_q *q, int free)
1288 {
1289         int j;
1290
1291         for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; ++j) {
1292                 if (!q->bufs[j])
1293                         continue;
1294                 qeth_cleanup_handled_pending(q, j, 1);
1295                 qeth_clear_output_buffer(q, q->bufs[j], QETH_QDIO_BUF_EMPTY);
1296                 if (free) {
1297                         kmem_cache_free(qeth_qdio_outbuf_cache, q->bufs[j]);
1298                         q->bufs[j] = NULL;
1299                 }
1300         }
1301 }
1302
1303 void qeth_clear_qdio_buffers(struct qeth_card *card)
1304 {
1305         int i;
1306
1307         QETH_CARD_TEXT(card, 2, "clearqdbf");
1308         /* clear outbound buffers to free skbs */
1309         for (i = 0; i < card->qdio.no_out_queues; ++i) {
1310                 if (card->qdio.out_qs[i]) {
1311                         qeth_clear_outq_buffers(card->qdio.out_qs[i], 0);
1312                 }
1313         }
1314 }
1315 EXPORT_SYMBOL_GPL(qeth_clear_qdio_buffers);
1316
1317 static void qeth_free_buffer_pool(struct qeth_card *card)
1318 {
1319         struct qeth_buffer_pool_entry *pool_entry, *tmp;
1320         int i = 0;
1321         list_for_each_entry_safe(pool_entry, tmp,
1322                                  &card->qdio.init_pool.entry_list, init_list){
1323                 for (i = 0; i < QETH_MAX_BUFFER_ELEMENTS(card); ++i)
1324                         free_page((unsigned long)pool_entry->elements[i]);
1325                 list_del(&pool_entry->init_list);
1326                 kfree(pool_entry);
1327         }
1328 }
1329
1330 static void qeth_clean_channel(struct qeth_channel *channel)
1331 {
1332         int cnt;
1333
1334         QETH_DBF_TEXT(SETUP, 2, "freech");
1335         for (cnt = 0; cnt < QETH_CMD_BUFFER_NO; cnt++)
1336                 kfree(channel->iob[cnt].data);
1337 }
1338
1339 static void qeth_set_single_write_queues(struct qeth_card *card)
1340 {
1341         if ((atomic_read(&card->qdio.state) != QETH_QDIO_UNINITIALIZED) &&
1342             (card->qdio.no_out_queues == 4))
1343                 qeth_free_qdio_buffers(card);
1344
1345         card->qdio.no_out_queues = 1;
1346         if (card->qdio.default_out_queue != 0)
1347                 dev_info(&card->gdev->dev, "Priority Queueing not supported\n");
1348
1349         card->qdio.default_out_queue = 0;
1350 }
1351
1352 static void qeth_set_multiple_write_queues(struct qeth_card *card)
1353 {
1354         if ((atomic_read(&card->qdio.state) != QETH_QDIO_UNINITIALIZED) &&
1355             (card->qdio.no_out_queues == 1)) {
1356                 qeth_free_qdio_buffers(card);
1357                 card->qdio.default_out_queue = 2;
1358         }
1359         card->qdio.no_out_queues = 4;
1360 }
1361
1362 static void qeth_update_from_chp_desc(struct qeth_card *card)
1363 {
1364         struct ccw_device *ccwdev;
1365         struct channel_path_desc *chp_dsc;
1366
1367         QETH_DBF_TEXT(SETUP, 2, "chp_desc");
1368
1369         ccwdev = card->data.ccwdev;
1370         chp_dsc = ccw_device_get_chp_desc(ccwdev, 0);
1371         if (!chp_dsc)
1372                 goto out;
1373
1374         card->info.func_level = 0x4100 + chp_dsc->desc;
1375         if (card->info.type == QETH_CARD_TYPE_IQD)
1376                 goto out;
1377
1378         /* CHPP field bit 6 == 1 -> single queue */
1379         if ((chp_dsc->chpp & 0x02) == 0x02)
1380                 qeth_set_single_write_queues(card);
1381         else
1382                 qeth_set_multiple_write_queues(card);
1383 out:
1384         kfree(chp_dsc);
1385         QETH_DBF_TEXT_(SETUP, 2, "nr:%x", card->qdio.no_out_queues);
1386         QETH_DBF_TEXT_(SETUP, 2, "lvl:%02x", card->info.func_level);
1387 }
1388
1389 static void qeth_init_qdio_info(struct qeth_card *card)
1390 {
1391         QETH_DBF_TEXT(SETUP, 4, "intqdinf");
1392         atomic_set(&card->qdio.state, QETH_QDIO_UNINITIALIZED);
1393         /* inbound */
1394         card->qdio.in_buf_size = QETH_IN_BUF_SIZE_DEFAULT;
1395         if (card->info.type == QETH_CARD_TYPE_IQD)
1396                 card->qdio.init_pool.buf_count = QETH_IN_BUF_COUNT_HSDEFAULT;
1397         else
1398                 card->qdio.init_pool.buf_count = QETH_IN_BUF_COUNT_DEFAULT;
1399         card->qdio.in_buf_pool.buf_count = card->qdio.init_pool.buf_count;
1400         INIT_LIST_HEAD(&card->qdio.in_buf_pool.entry_list);
1401         INIT_LIST_HEAD(&card->qdio.init_pool.entry_list);
1402 }
1403
1404 static void qeth_set_intial_options(struct qeth_card *card)
1405 {
1406         card->options.route4.type = NO_ROUTER;
1407         card->options.route6.type = NO_ROUTER;
1408         card->options.fake_broadcast = 0;
1409         card->options.performance_stats = 0;
1410         card->options.rx_sg_cb = QETH_RX_SG_CB;
1411         card->options.isolation = ISOLATION_MODE_NONE;
1412         card->options.cq = QETH_CQ_DISABLED;
1413 }
1414
1415 static int qeth_do_start_thread(struct qeth_card *card, unsigned long thread)
1416 {
1417         unsigned long flags;
1418         int rc = 0;
1419
1420         spin_lock_irqsave(&card->thread_mask_lock, flags);
1421         QETH_CARD_TEXT_(card, 4, "  %02x%02x%02x",
1422                         (u8) card->thread_start_mask,
1423                         (u8) card->thread_allowed_mask,
1424                         (u8) card->thread_running_mask);
1425         rc = (card->thread_start_mask & thread);
1426         spin_unlock_irqrestore(&card->thread_mask_lock, flags);
1427         return rc;
1428 }
1429
1430 static void qeth_start_kernel_thread(struct work_struct *work)
1431 {
1432         struct task_struct *ts;
1433         struct qeth_card *card = container_of(work, struct qeth_card,
1434                                         kernel_thread_starter);
1435         QETH_CARD_TEXT(card , 2, "strthrd");
1436
1437         if (card->read.state != CH_STATE_UP &&
1438             card->write.state != CH_STATE_UP)
1439                 return;
1440         if (qeth_do_start_thread(card, QETH_RECOVER_THREAD)) {
1441                 ts = kthread_run(card->discipline->recover, (void *)card,
1442                                 "qeth_recover");
1443                 if (IS_ERR(ts)) {
1444                         qeth_clear_thread_start_bit(card, QETH_RECOVER_THREAD);
1445                         qeth_clear_thread_running_bit(card,
1446                                 QETH_RECOVER_THREAD);
1447                 }
1448         }
1449 }
1450
1451 static void qeth_buffer_reclaim_work(struct work_struct *);
1452 static int qeth_setup_card(struct qeth_card *card)
1453 {
1454
1455         QETH_DBF_TEXT(SETUP, 2, "setupcrd");
1456         QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *));
1457
1458         card->read.state  = CH_STATE_DOWN;
1459         card->write.state = CH_STATE_DOWN;
1460         card->data.state  = CH_STATE_DOWN;
1461         card->state = CARD_STATE_DOWN;
1462         card->lan_online = 0;
1463         card->read_or_write_problem = 0;
1464         card->dev = NULL;
1465         spin_lock_init(&card->vlanlock);
1466         spin_lock_init(&card->mclock);
1467         spin_lock_init(&card->lock);
1468         spin_lock_init(&card->ip_lock);
1469         spin_lock_init(&card->thread_mask_lock);
1470         mutex_init(&card->conf_mutex);
1471         mutex_init(&card->discipline_mutex);
1472         card->thread_start_mask = 0;
1473         card->thread_allowed_mask = 0;
1474         card->thread_running_mask = 0;
1475         INIT_WORK(&card->kernel_thread_starter, qeth_start_kernel_thread);
1476         INIT_LIST_HEAD(&card->cmd_waiter_list);
1477         init_waitqueue_head(&card->wait_q);
1478         /* initial options */
1479         qeth_set_intial_options(card);
1480         /* IP address takeover */
1481         INIT_LIST_HEAD(&card->ipato.entries);
1482         card->ipato.enabled = false;
1483         card->ipato.invert4 = false;
1484         card->ipato.invert6 = false;
1485         /* init QDIO stuff */
1486         qeth_init_qdio_info(card);
1487         INIT_DELAYED_WORK(&card->buffer_reclaim_work, qeth_buffer_reclaim_work);
1488         INIT_WORK(&card->close_dev_work, qeth_close_dev_handler);
1489         return 0;
1490 }
1491
1492 static void qeth_core_sl_print(struct seq_file *m, struct service_level *slr)
1493 {
1494         struct qeth_card *card = container_of(slr, struct qeth_card,
1495                                         qeth_service_level);
1496         if (card->info.mcl_level[0])
1497                 seq_printf(m, "qeth: %s firmware level %s\n",
1498                         CARD_BUS_ID(card), card->info.mcl_level);
1499 }
1500
1501 static struct qeth_card *qeth_alloc_card(void)
1502 {
1503         struct qeth_card *card;
1504
1505         QETH_DBF_TEXT(SETUP, 2, "alloccrd");
1506         card = kzalloc(sizeof(struct qeth_card), GFP_DMA|GFP_KERNEL);
1507         if (!card)
1508                 goto out;
1509         QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *));
1510         if (qeth_setup_channel(&card->read))
1511                 goto out_ip;
1512         if (qeth_setup_channel(&card->write))
1513                 goto out_channel;
1514         card->options.layer2 = -1;
1515         card->qeth_service_level.seq_print = qeth_core_sl_print;
1516         register_service_level(&card->qeth_service_level);
1517         return card;
1518
1519 out_channel:
1520         qeth_clean_channel(&card->read);
1521 out_ip:
1522         kfree(card);
1523 out:
1524         return NULL;
1525 }
1526
1527 static int qeth_determine_card_type(struct qeth_card *card)
1528 {
1529         int i = 0;
1530
1531         QETH_DBF_TEXT(SETUP, 2, "detcdtyp");
1532
1533         card->qdio.do_prio_queueing = QETH_PRIOQ_DEFAULT;
1534         card->qdio.default_out_queue = QETH_DEFAULT_QUEUE;
1535         while (known_devices[i][QETH_DEV_MODEL_IND]) {
1536                 if ((CARD_RDEV(card)->id.dev_type ==
1537                                 known_devices[i][QETH_DEV_TYPE_IND]) &&
1538                     (CARD_RDEV(card)->id.dev_model ==
1539                                 known_devices[i][QETH_DEV_MODEL_IND])) {
1540                         card->info.type = known_devices[i][QETH_DEV_MODEL_IND];
1541                         card->qdio.no_out_queues =
1542                                 known_devices[i][QETH_QUEUE_NO_IND];
1543                         card->qdio.no_in_queues = 1;
1544                         card->info.is_multicast_different =
1545                                 known_devices[i][QETH_MULTICAST_IND];
1546                         qeth_update_from_chp_desc(card);
1547                         return 0;
1548                 }
1549                 i++;
1550         }
1551         card->info.type = QETH_CARD_TYPE_UNKNOWN;
1552         dev_err(&card->gdev->dev, "The adapter hardware is of an "
1553                 "unknown type\n");
1554         return -ENOENT;
1555 }
1556
1557 static int qeth_clear_channel(struct qeth_channel *channel)
1558 {
1559         unsigned long flags;
1560         struct qeth_card *card;
1561         int rc;
1562
1563         card = CARD_FROM_CDEV(channel->ccwdev);
1564         QETH_CARD_TEXT(card, 3, "clearch");
1565         spin_lock_irqsave(get_ccwdev_lock(channel->ccwdev), flags);
1566         rc = ccw_device_clear(channel->ccwdev, QETH_CLEAR_CHANNEL_PARM);
1567         spin_unlock_irqrestore(get_ccwdev_lock(channel->ccwdev), flags);
1568
1569         if (rc)
1570                 return rc;
1571         rc = wait_event_interruptible_timeout(card->wait_q,
1572                         channel->state == CH_STATE_STOPPED, QETH_TIMEOUT);
1573         if (rc == -ERESTARTSYS)
1574                 return rc;
1575         if (channel->state != CH_STATE_STOPPED)
1576                 return -ETIME;
1577         channel->state = CH_STATE_DOWN;
1578         return 0;
1579 }
1580
1581 static int qeth_halt_channel(struct qeth_channel *channel)
1582 {
1583         unsigned long flags;
1584         struct qeth_card *card;
1585         int rc;
1586
1587         card = CARD_FROM_CDEV(channel->ccwdev);
1588         QETH_CARD_TEXT(card, 3, "haltch");
1589         spin_lock_irqsave(get_ccwdev_lock(channel->ccwdev), flags);
1590         rc = ccw_device_halt(channel->ccwdev, QETH_HALT_CHANNEL_PARM);
1591         spin_unlock_irqrestore(get_ccwdev_lock(channel->ccwdev), flags);
1592
1593         if (rc)
1594                 return rc;
1595         rc = wait_event_interruptible_timeout(card->wait_q,
1596                         channel->state == CH_STATE_HALTED, QETH_TIMEOUT);
1597         if (rc == -ERESTARTSYS)
1598                 return rc;
1599         if (channel->state != CH_STATE_HALTED)
1600                 return -ETIME;
1601         return 0;
1602 }
1603
1604 static int qeth_halt_channels(struct qeth_card *card)
1605 {
1606         int rc1 = 0, rc2 = 0, rc3 = 0;
1607
1608         QETH_CARD_TEXT(card, 3, "haltchs");
1609         rc1 = qeth_halt_channel(&card->read);
1610         rc2 = qeth_halt_channel(&card->write);
1611         rc3 = qeth_halt_channel(&card->data);
1612         if (rc1)
1613                 return rc1;
1614         if (rc2)
1615                 return rc2;
1616         return rc3;
1617 }
1618
1619 static int qeth_clear_channels(struct qeth_card *card)
1620 {
1621         int rc1 = 0, rc2 = 0, rc3 = 0;
1622
1623         QETH_CARD_TEXT(card, 3, "clearchs");
1624         rc1 = qeth_clear_channel(&card->read);
1625         rc2 = qeth_clear_channel(&card->write);
1626         rc3 = qeth_clear_channel(&card->data);
1627         if (rc1)
1628                 return rc1;
1629         if (rc2)
1630                 return rc2;
1631         return rc3;
1632 }
1633
1634 static int qeth_clear_halt_card(struct qeth_card *card, int halt)
1635 {
1636         int rc = 0;
1637
1638         QETH_CARD_TEXT(card, 3, "clhacrd");
1639
1640         if (halt)
1641                 rc = qeth_halt_channels(card);
1642         if (rc)
1643                 return rc;
1644         return qeth_clear_channels(card);
1645 }
1646
1647 int qeth_qdio_clear_card(struct qeth_card *card, int use_halt)
1648 {
1649         int rc = 0;
1650
1651         QETH_CARD_TEXT(card, 3, "qdioclr");
1652         switch (atomic_cmpxchg(&card->qdio.state, QETH_QDIO_ESTABLISHED,
1653                 QETH_QDIO_CLEANING)) {
1654         case QETH_QDIO_ESTABLISHED:
1655                 if (card->info.type == QETH_CARD_TYPE_IQD)
1656                         rc = qdio_shutdown(CARD_DDEV(card),
1657                                 QDIO_FLAG_CLEANUP_USING_HALT);
1658                 else
1659                         rc = qdio_shutdown(CARD_DDEV(card),
1660                                 QDIO_FLAG_CLEANUP_USING_CLEAR);
1661                 if (rc)
1662                         QETH_CARD_TEXT_(card, 3, "1err%d", rc);
1663                 atomic_set(&card->qdio.state, QETH_QDIO_ALLOCATED);
1664                 break;
1665         case QETH_QDIO_CLEANING:
1666                 return rc;
1667         default:
1668                 break;
1669         }
1670         rc = qeth_clear_halt_card(card, use_halt);
1671         if (rc)
1672                 QETH_CARD_TEXT_(card, 3, "2err%d", rc);
1673         card->state = CARD_STATE_DOWN;
1674         return rc;
1675 }
1676 EXPORT_SYMBOL_GPL(qeth_qdio_clear_card);
1677
1678 static int qeth_read_conf_data(struct qeth_card *card, void **buffer,
1679                                int *length)
1680 {
1681         struct ciw *ciw;
1682         char *rcd_buf;
1683         int ret;
1684         struct qeth_channel *channel = &card->data;
1685         unsigned long flags;
1686
1687         /*
1688          * scan for RCD command in extended SenseID data
1689          */
1690         ciw = ccw_device_get_ciw(channel->ccwdev, CIW_TYPE_RCD);
1691         if (!ciw || ciw->cmd == 0)
1692                 return -EOPNOTSUPP;
1693         rcd_buf = kzalloc(ciw->count, GFP_KERNEL | GFP_DMA);
1694         if (!rcd_buf)
1695                 return -ENOMEM;
1696
1697         channel->ccw.cmd_code = ciw->cmd;
1698         channel->ccw.cda = (__u32) __pa(rcd_buf);
1699         channel->ccw.count = ciw->count;
1700         channel->ccw.flags = CCW_FLAG_SLI;
1701         channel->state = CH_STATE_RCD;
1702         spin_lock_irqsave(get_ccwdev_lock(channel->ccwdev), flags);
1703         ret = ccw_device_start_timeout(channel->ccwdev, &channel->ccw,
1704                                        QETH_RCD_PARM, LPM_ANYPATH, 0,
1705                                        QETH_RCD_TIMEOUT);
1706         spin_unlock_irqrestore(get_ccwdev_lock(channel->ccwdev), flags);
1707         if (!ret)
1708                 wait_event(card->wait_q,
1709                            (channel->state == CH_STATE_RCD_DONE ||
1710                             channel->state == CH_STATE_DOWN));
1711         if (channel->state == CH_STATE_DOWN)
1712                 ret = -EIO;
1713         else
1714                 channel->state = CH_STATE_DOWN;
1715         if (ret) {
1716                 kfree(rcd_buf);
1717                 *buffer = NULL;
1718                 *length = 0;
1719         } else {
1720                 *length = ciw->count;
1721                 *buffer = rcd_buf;
1722         }
1723         return ret;
1724 }
1725
1726 static void qeth_configure_unitaddr(struct qeth_card *card, char *prcd)
1727 {
1728         QETH_DBF_TEXT(SETUP, 2, "cfgunit");
1729         card->info.chpid = prcd[30];
1730         card->info.unit_addr2 = prcd[31];
1731         card->info.cula = prcd[63];
1732         card->info.guestlan = ((prcd[0x10] == _ascebc['V']) &&
1733                                (prcd[0x11] == _ascebc['M']));
1734 }
1735
1736 /* Determine whether the device requires a specific layer discipline */
1737 static enum qeth_discipline_id qeth_enforce_discipline(struct qeth_card *card)
1738 {
1739         if (card->info.type == QETH_CARD_TYPE_OSM ||
1740             card->info.type == QETH_CARD_TYPE_OSN) {
1741                 QETH_DBF_TEXT(SETUP, 3, "force l2");
1742                 return QETH_DISCIPLINE_LAYER2;
1743         }
1744
1745         /* virtual HiperSocket is L3 only: */
1746         if (card->info.guestlan && card->info.type == QETH_CARD_TYPE_IQD) {
1747                 QETH_DBF_TEXT(SETUP, 3, "force l3");
1748                 return QETH_DISCIPLINE_LAYER3;
1749         }
1750
1751         QETH_DBF_TEXT(SETUP, 3, "force no");
1752         return QETH_DISCIPLINE_UNDETERMINED;
1753 }
1754
1755 static void qeth_configure_blkt_default(struct qeth_card *card, char *prcd)
1756 {
1757         QETH_DBF_TEXT(SETUP, 2, "cfgblkt");
1758
1759         if (prcd[74] == 0xF0 && prcd[75] == 0xF0 &&
1760             prcd[76] >= 0xF1 && prcd[76] <= 0xF4) {
1761                 card->info.blkt.time_total = 0;
1762                 card->info.blkt.inter_packet = 0;
1763                 card->info.blkt.inter_packet_jumbo = 0;
1764         } else {
1765                 card->info.blkt.time_total = 250;
1766                 card->info.blkt.inter_packet = 5;
1767                 card->info.blkt.inter_packet_jumbo = 15;
1768         }
1769 }
1770
1771 static void qeth_init_tokens(struct qeth_card *card)
1772 {
1773         card->token.issuer_rm_w = 0x00010103UL;
1774         card->token.cm_filter_w = 0x00010108UL;
1775         card->token.cm_connection_w = 0x0001010aUL;
1776         card->token.ulp_filter_w = 0x0001010bUL;
1777         card->token.ulp_connection_w = 0x0001010dUL;
1778 }
1779
1780 static void qeth_init_func_level(struct qeth_card *card)
1781 {
1782         switch (card->info.type) {
1783         case QETH_CARD_TYPE_IQD:
1784                 card->info.func_level = QETH_IDX_FUNC_LEVEL_IQD;
1785                 break;
1786         case QETH_CARD_TYPE_OSD:
1787         case QETH_CARD_TYPE_OSN:
1788                 card->info.func_level = QETH_IDX_FUNC_LEVEL_OSD;
1789                 break;
1790         default:
1791                 break;
1792         }
1793 }
1794
1795 static int qeth_idx_activate_get_answer(struct qeth_channel *channel,
1796                 void (*idx_reply_cb)(struct qeth_channel *,
1797                         struct qeth_cmd_buffer *))
1798 {
1799         struct qeth_cmd_buffer *iob;
1800         unsigned long flags;
1801         int rc;
1802         struct qeth_card *card;
1803
1804         QETH_DBF_TEXT(SETUP, 2, "idxanswr");
1805         card = CARD_FROM_CDEV(channel->ccwdev);
1806         iob = qeth_get_buffer(channel);
1807         if (!iob)
1808                 return -ENOMEM;
1809         iob->callback = idx_reply_cb;
1810         memcpy(&channel->ccw, READ_CCW, sizeof(struct ccw1));
1811         channel->ccw.count = QETH_BUFSIZE;
1812         channel->ccw.cda = (__u32) __pa(iob->data);
1813
1814         wait_event(card->wait_q,
1815                    atomic_cmpxchg(&channel->irq_pending, 0, 1) == 0);
1816         QETH_DBF_TEXT(SETUP, 6, "noirqpnd");
1817         spin_lock_irqsave(get_ccwdev_lock(channel->ccwdev), flags);
1818         rc = ccw_device_start(channel->ccwdev,
1819                               &channel->ccw, (addr_t) iob, 0, 0);
1820         spin_unlock_irqrestore(get_ccwdev_lock(channel->ccwdev), flags);
1821
1822         if (rc) {
1823                 QETH_DBF_MESSAGE(2, "Error2 in activating channel rc=%d\n", rc);
1824                 QETH_DBF_TEXT_(SETUP, 2, "2err%d", rc);
1825                 atomic_set(&channel->irq_pending, 0);
1826                 wake_up(&card->wait_q);
1827                 return rc;
1828         }
1829         rc = wait_event_interruptible_timeout(card->wait_q,
1830                          channel->state == CH_STATE_UP, QETH_TIMEOUT);
1831         if (rc == -ERESTARTSYS)
1832                 return rc;
1833         if (channel->state != CH_STATE_UP) {
1834                 rc = -ETIME;
1835                 QETH_DBF_TEXT_(SETUP, 2, "3err%d", rc);
1836                 qeth_clear_cmd_buffers(channel);
1837         } else
1838                 rc = 0;
1839         return rc;
1840 }
1841
1842 static int qeth_idx_activate_channel(struct qeth_channel *channel,
1843                 void (*idx_reply_cb)(struct qeth_channel *,
1844                         struct qeth_cmd_buffer *))
1845 {
1846         struct qeth_card *card;
1847         struct qeth_cmd_buffer *iob;
1848         unsigned long flags;
1849         __u16 temp;
1850         __u8 tmp;
1851         int rc;
1852         struct ccw_dev_id temp_devid;
1853
1854         card = CARD_FROM_CDEV(channel->ccwdev);
1855
1856         QETH_DBF_TEXT(SETUP, 2, "idxactch");
1857
1858         iob = qeth_get_buffer(channel);
1859         if (!iob)
1860                 return -ENOMEM;
1861         iob->callback = idx_reply_cb;
1862         memcpy(&channel->ccw, WRITE_CCW, sizeof(struct ccw1));
1863         channel->ccw.count = IDX_ACTIVATE_SIZE;
1864         channel->ccw.cda = (__u32) __pa(iob->data);
1865         if (channel == &card->write) {
1866                 memcpy(iob->data, IDX_ACTIVATE_WRITE, IDX_ACTIVATE_SIZE);
1867                 memcpy(QETH_TRANSPORT_HEADER_SEQ_NO(iob->data),
1868                        &card->seqno.trans_hdr, QETH_SEQ_NO_LENGTH);
1869                 card->seqno.trans_hdr++;
1870         } else {
1871                 memcpy(iob->data, IDX_ACTIVATE_READ, IDX_ACTIVATE_SIZE);
1872                 memcpy(QETH_TRANSPORT_HEADER_SEQ_NO(iob->data),
1873                        &card->seqno.trans_hdr, QETH_SEQ_NO_LENGTH);
1874         }
1875         tmp = ((__u8)card->info.portno) | 0x80;
1876         memcpy(QETH_IDX_ACT_PNO(iob->data), &tmp, 1);
1877         memcpy(QETH_IDX_ACT_ISSUER_RM_TOKEN(iob->data),
1878                &card->token.issuer_rm_w, QETH_MPC_TOKEN_LENGTH);
1879         memcpy(QETH_IDX_ACT_FUNC_LEVEL(iob->data),
1880                &card->info.func_level, sizeof(__u16));
1881         ccw_device_get_id(CARD_DDEV(card), &temp_devid);
1882         memcpy(QETH_IDX_ACT_QDIO_DEV_CUA(iob->data), &temp_devid.devno, 2);
1883         temp = (card->info.cula << 8) + card->info.unit_addr2;
1884         memcpy(QETH_IDX_ACT_QDIO_DEV_REALADDR(iob->data), &temp, 2);
1885
1886         wait_event(card->wait_q,
1887                    atomic_cmpxchg(&channel->irq_pending, 0, 1) == 0);
1888         QETH_DBF_TEXT(SETUP, 6, "noirqpnd");
1889         spin_lock_irqsave(get_ccwdev_lock(channel->ccwdev), flags);
1890         rc = ccw_device_start(channel->ccwdev,
1891                               &channel->ccw, (addr_t) iob, 0, 0);
1892         spin_unlock_irqrestore(get_ccwdev_lock(channel->ccwdev), flags);
1893
1894         if (rc) {
1895                 QETH_DBF_MESSAGE(2, "Error1 in activating channel. rc=%d\n",
1896                         rc);
1897                 QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc);
1898                 atomic_set(&channel->irq_pending, 0);
1899                 wake_up(&card->wait_q);
1900                 return rc;
1901         }
1902         rc = wait_event_interruptible_timeout(card->wait_q,
1903                         channel->state == CH_STATE_ACTIVATING, QETH_TIMEOUT);
1904         if (rc == -ERESTARTSYS)
1905                 return rc;
1906         if (channel->state != CH_STATE_ACTIVATING) {
1907                 dev_warn(&channel->ccwdev->dev, "The qeth device driver"
1908                         " failed to recover an error on the device\n");
1909                 QETH_DBF_MESSAGE(2, "%s IDX activate timed out\n",
1910                         dev_name(&channel->ccwdev->dev));
1911                 QETH_DBF_TEXT_(SETUP, 2, "2err%d", -ETIME);
1912                 qeth_clear_cmd_buffers(channel);
1913                 return -ETIME;
1914         }
1915         return qeth_idx_activate_get_answer(channel, idx_reply_cb);
1916 }
1917
1918 static int qeth_peer_func_level(int level)
1919 {
1920         if ((level & 0xff) == 8)
1921                 return (level & 0xff) + 0x400;
1922         if (((level >> 8) & 3) == 1)
1923                 return (level & 0xff) + 0x200;
1924         return level;
1925 }
1926
1927 static void qeth_idx_write_cb(struct qeth_channel *channel,
1928                 struct qeth_cmd_buffer *iob)
1929 {
1930         struct qeth_card *card;
1931         __u16 temp;
1932
1933         QETH_DBF_TEXT(SETUP , 2, "idxwrcb");
1934
1935         if (channel->state == CH_STATE_DOWN) {
1936                 channel->state = CH_STATE_ACTIVATING;
1937                 goto out;
1938         }
1939         card = CARD_FROM_CDEV(channel->ccwdev);
1940
1941         if (!(QETH_IS_IDX_ACT_POS_REPLY(iob->data))) {
1942                 if (QETH_IDX_ACT_CAUSE_CODE(iob->data) == QETH_IDX_ACT_ERR_EXCL)
1943                         dev_err(&card->write.ccwdev->dev,
1944                                 "The adapter is used exclusively by another "
1945                                 "host\n");
1946                 else
1947                         QETH_DBF_MESSAGE(2, "%s IDX_ACTIVATE on write channel:"
1948                                 " negative reply\n",
1949                                 dev_name(&card->write.ccwdev->dev));
1950                 goto out;
1951         }
1952         memcpy(&temp, QETH_IDX_ACT_FUNC_LEVEL(iob->data), 2);
1953         if ((temp & ~0x0100) != qeth_peer_func_level(card->info.func_level)) {
1954                 QETH_DBF_MESSAGE(2, "%s IDX_ACTIVATE on write channel: "
1955                         "function level mismatch (sent: 0x%x, received: "
1956                         "0x%x)\n", dev_name(&card->write.ccwdev->dev),
1957                         card->info.func_level, temp);
1958                 goto out;
1959         }
1960         channel->state = CH_STATE_UP;
1961 out:
1962         qeth_release_buffer(channel, iob);
1963 }
1964
1965 static void qeth_idx_read_cb(struct qeth_channel *channel,
1966                 struct qeth_cmd_buffer *iob)
1967 {
1968         struct qeth_card *card;
1969         __u16 temp;
1970
1971         QETH_DBF_TEXT(SETUP , 2, "idxrdcb");
1972         if (channel->state == CH_STATE_DOWN) {
1973                 channel->state = CH_STATE_ACTIVATING;
1974                 goto out;
1975         }
1976
1977         card = CARD_FROM_CDEV(channel->ccwdev);
1978         if (qeth_check_idx_response(card, iob->data))
1979                         goto out;
1980
1981         if (!(QETH_IS_IDX_ACT_POS_REPLY(iob->data))) {
1982                 switch (QETH_IDX_ACT_CAUSE_CODE(iob->data)) {
1983                 case QETH_IDX_ACT_ERR_EXCL:
1984                         dev_err(&card->write.ccwdev->dev,
1985                                 "The adapter is used exclusively by another "
1986                                 "host\n");
1987                         break;
1988                 case QETH_IDX_ACT_ERR_AUTH:
1989                 case QETH_IDX_ACT_ERR_AUTH_USER:
1990                         dev_err(&card->read.ccwdev->dev,
1991                                 "Setting the device online failed because of "
1992                                 "insufficient authorization\n");
1993                         break;
1994                 default:
1995                         QETH_DBF_MESSAGE(2, "%s IDX_ACTIVATE on read channel:"
1996                                 " negative reply\n",
1997                                 dev_name(&card->read.ccwdev->dev));
1998                 }
1999                 QETH_CARD_TEXT_(card, 2, "idxread%c",
2000                         QETH_IDX_ACT_CAUSE_CODE(iob->data));
2001                 goto out;
2002         }
2003
2004         memcpy(&temp, QETH_IDX_ACT_FUNC_LEVEL(iob->data), 2);
2005         if (temp != qeth_peer_func_level(card->info.func_level)) {
2006                 QETH_DBF_MESSAGE(2, "%s IDX_ACTIVATE on read channel: function "
2007                         "level mismatch (sent: 0x%x, received: 0x%x)\n",
2008                         dev_name(&card->read.ccwdev->dev),
2009                         card->info.func_level, temp);
2010                 goto out;
2011         }
2012         memcpy(&card->token.issuer_rm_r,
2013                QETH_IDX_ACT_ISSUER_RM_TOKEN(iob->data),
2014                QETH_MPC_TOKEN_LENGTH);
2015         memcpy(&card->info.mcl_level[0],
2016                QETH_IDX_REPLY_LEVEL(iob->data), QETH_MCL_LENGTH);
2017         channel->state = CH_STATE_UP;
2018 out:
2019         qeth_release_buffer(channel, iob);
2020 }
2021
2022 void qeth_prepare_control_data(struct qeth_card *card, int len,
2023                 struct qeth_cmd_buffer *iob)
2024 {
2025         qeth_setup_ccw(&card->write, iob->data, len);
2026         iob->callback = qeth_release_buffer;
2027
2028         memcpy(QETH_TRANSPORT_HEADER_SEQ_NO(iob->data),
2029                &card->seqno.trans_hdr, QETH_SEQ_NO_LENGTH);
2030         card->seqno.trans_hdr++;
2031         memcpy(QETH_PDU_HEADER_SEQ_NO(iob->data),
2032                &card->seqno.pdu_hdr, QETH_SEQ_NO_LENGTH);
2033         card->seqno.pdu_hdr++;
2034         memcpy(QETH_PDU_HEADER_ACK_SEQ_NO(iob->data),
2035                &card->seqno.pdu_hdr_ack, QETH_SEQ_NO_LENGTH);
2036         QETH_DBF_HEX(CTRL, 2, iob->data, QETH_DBF_CTRL_LEN);
2037 }
2038 EXPORT_SYMBOL_GPL(qeth_prepare_control_data);
2039
2040 /**
2041  * qeth_send_control_data() -   send control command to the card
2042  * @card:                       qeth_card structure pointer
2043  * @len:                        size of the command buffer
2044  * @iob:                        qeth_cmd_buffer pointer
2045  * @reply_cb:                   callback function pointer
2046  * @cb_card:                    pointer to the qeth_card structure
2047  * @cb_reply:                   pointer to the qeth_reply structure
2048  * @cb_cmd:                     pointer to the original iob for non-IPA
2049  *                              commands, or to the qeth_ipa_cmd structure
2050  *                              for the IPA commands.
2051  * @reply_param:                private pointer passed to the callback
2052  *
2053  * Returns the value of the `return_code' field of the response
2054  * block returned from the hardware, or other error indication.
2055  * Value of zero indicates successful execution of the command.
2056  *
2057  * Callback function gets called one or more times, with cb_cmd
2058  * pointing to the response returned by the hardware. Callback
2059  * function must return non-zero if more reply blocks are expected,
2060  * and zero if the last or only reply block is received. Callback
2061  * function can get the value of the reply_param pointer from the
2062  * field 'param' of the structure qeth_reply.
2063  */
2064
2065 int qeth_send_control_data(struct qeth_card *card, int len,
2066                 struct qeth_cmd_buffer *iob,
2067                 int (*reply_cb)(struct qeth_card *cb_card,
2068                                 struct qeth_reply *cb_reply,
2069                                 unsigned long cb_cmd),
2070                 void *reply_param)
2071 {
2072         int rc;
2073         unsigned long flags;
2074         struct qeth_reply *reply = NULL;
2075         unsigned long timeout, event_timeout;
2076         struct qeth_ipa_cmd *cmd = NULL;
2077
2078         QETH_CARD_TEXT(card, 2, "sendctl");
2079
2080         if (card->read_or_write_problem) {
2081                 qeth_release_buffer(iob->channel, iob);
2082                 return -EIO;
2083         }
2084         reply = qeth_alloc_reply(card);
2085         if (!reply) {
2086                 return -ENOMEM;
2087         }
2088         reply->callback = reply_cb;
2089         reply->param = reply_param;
2090
2091         init_waitqueue_head(&reply->wait_q);
2092         QETH_DBF_HEX(CTRL, 2, iob->data, QETH_DBF_CTRL_LEN);
2093
2094         while (atomic_cmpxchg(&card->write.irq_pending, 0, 1)) ;
2095
2096         if (IS_IPA(iob->data)) {
2097                 cmd = __ipa_cmd(iob);
2098                 cmd->hdr.seqno = card->seqno.ipa++;
2099                 reply->seqno = cmd->hdr.seqno;
2100                 event_timeout = QETH_IPA_TIMEOUT;
2101         } else {
2102                 reply->seqno = QETH_IDX_COMMAND_SEQNO;
2103                 event_timeout = QETH_TIMEOUT;
2104         }
2105         qeth_prepare_control_data(card, len, iob);
2106
2107         spin_lock_irqsave(&card->lock, flags);
2108         list_add_tail(&reply->list, &card->cmd_waiter_list);
2109         spin_unlock_irqrestore(&card->lock, flags);
2110
2111         timeout = jiffies + event_timeout;
2112
2113         QETH_CARD_TEXT(card, 6, "noirqpnd");
2114         spin_lock_irqsave(get_ccwdev_lock(card->write.ccwdev), flags);
2115         rc = ccw_device_start(card->write.ccwdev, &card->write.ccw,
2116                               (addr_t) iob, 0, 0);
2117         spin_unlock_irqrestore(get_ccwdev_lock(card->write.ccwdev), flags);
2118         if (rc) {
2119                 QETH_DBF_MESSAGE(2, "%s qeth_send_control_data: "
2120                         "ccw_device_start rc = %i\n",
2121                         dev_name(&card->write.ccwdev->dev), rc);
2122                 QETH_CARD_TEXT_(card, 2, " err%d", rc);
2123                 spin_lock_irqsave(&card->lock, flags);
2124                 list_del_init(&reply->list);
2125                 qeth_put_reply(reply);
2126                 spin_unlock_irqrestore(&card->lock, flags);
2127                 qeth_release_buffer(iob->channel, iob);
2128                 atomic_set(&card->write.irq_pending, 0);
2129                 wake_up(&card->wait_q);
2130                 return rc;
2131         }
2132
2133         /* we have only one long running ipassist, since we can ensure
2134            process context of this command we can sleep */
2135         if (cmd && cmd->hdr.command == IPA_CMD_SETIP &&
2136             cmd->hdr.prot_version == QETH_PROT_IPV4) {
2137                 if (!wait_event_timeout(reply->wait_q,
2138                     atomic_read(&reply->received), event_timeout))
2139                         goto time_err;
2140         } else {
2141                 while (!atomic_read(&reply->received)) {
2142                         if (time_after(jiffies, timeout))
2143                                 goto time_err;
2144                         cpu_relax();
2145                 }
2146         }
2147
2148         if (reply->rc == -EIO)
2149                 goto error;
2150         rc = reply->rc;
2151         qeth_put_reply(reply);
2152         return rc;
2153
2154 time_err:
2155         reply->rc = -ETIME;
2156         spin_lock_irqsave(&reply->card->lock, flags);
2157         list_del_init(&reply->list);
2158         spin_unlock_irqrestore(&reply->card->lock, flags);
2159         atomic_inc(&reply->received);
2160 error:
2161         atomic_set(&card->write.irq_pending, 0);
2162         qeth_release_buffer(iob->channel, iob);
2163         card->write.buf_no = (card->write.buf_no + 1) % QETH_CMD_BUFFER_NO;
2164         rc = reply->rc;
2165         qeth_put_reply(reply);
2166         return rc;
2167 }
2168 EXPORT_SYMBOL_GPL(qeth_send_control_data);
2169
2170 static int qeth_cm_enable_cb(struct qeth_card *card, struct qeth_reply *reply,
2171                 unsigned long data)
2172 {
2173         struct qeth_cmd_buffer *iob;
2174
2175         QETH_DBF_TEXT(SETUP, 2, "cmenblcb");
2176
2177         iob = (struct qeth_cmd_buffer *) data;
2178         memcpy(&card->token.cm_filter_r,
2179                QETH_CM_ENABLE_RESP_FILTER_TOKEN(iob->data),
2180                QETH_MPC_TOKEN_LENGTH);
2181         QETH_DBF_TEXT_(SETUP, 2, "  rc%d", iob->rc);
2182         return 0;
2183 }
2184
2185 static int qeth_cm_enable(struct qeth_card *card)
2186 {
2187         int rc;
2188         struct qeth_cmd_buffer *iob;
2189
2190         QETH_DBF_TEXT(SETUP, 2, "cmenable");
2191
2192         iob = qeth_wait_for_buffer(&card->write);
2193         memcpy(iob->data, CM_ENABLE, CM_ENABLE_SIZE);
2194         memcpy(QETH_CM_ENABLE_ISSUER_RM_TOKEN(iob->data),
2195                &card->token.issuer_rm_r, QETH_MPC_TOKEN_LENGTH);
2196         memcpy(QETH_CM_ENABLE_FILTER_TOKEN(iob->data),
2197                &card->token.cm_filter_w, QETH_MPC_TOKEN_LENGTH);
2198
2199         rc = qeth_send_control_data(card, CM_ENABLE_SIZE, iob,
2200                                     qeth_cm_enable_cb, NULL);
2201         return rc;
2202 }
2203
2204 static int qeth_cm_setup_cb(struct qeth_card *card, struct qeth_reply *reply,
2205                 unsigned long data)
2206 {
2207
2208         struct qeth_cmd_buffer *iob;
2209
2210         QETH_DBF_TEXT(SETUP, 2, "cmsetpcb");
2211
2212         iob = (struct qeth_cmd_buffer *) data;
2213         memcpy(&card->token.cm_connection_r,
2214                QETH_CM_SETUP_RESP_DEST_ADDR(iob->data),
2215                QETH_MPC_TOKEN_LENGTH);
2216         QETH_DBF_TEXT_(SETUP, 2, "  rc%d", iob->rc);
2217         return 0;
2218 }
2219
2220 static int qeth_cm_setup(struct qeth_card *card)
2221 {
2222         int rc;
2223         struct qeth_cmd_buffer *iob;
2224
2225         QETH_DBF_TEXT(SETUP, 2, "cmsetup");
2226
2227         iob = qeth_wait_for_buffer(&card->write);
2228         memcpy(iob->data, CM_SETUP, CM_SETUP_SIZE);
2229         memcpy(QETH_CM_SETUP_DEST_ADDR(iob->data),
2230                &card->token.issuer_rm_r, QETH_MPC_TOKEN_LENGTH);
2231         memcpy(QETH_CM_SETUP_CONNECTION_TOKEN(iob->data),
2232                &card->token.cm_connection_w, QETH_MPC_TOKEN_LENGTH);
2233         memcpy(QETH_CM_SETUP_FILTER_TOKEN(iob->data),
2234                &card->token.cm_filter_r, QETH_MPC_TOKEN_LENGTH);
2235         rc = qeth_send_control_data(card, CM_SETUP_SIZE, iob,
2236                                     qeth_cm_setup_cb, NULL);
2237         return rc;
2238
2239 }
2240
2241 static int qeth_get_initial_mtu_for_card(struct qeth_card *card)
2242 {
2243         switch (card->info.type) {
2244         case QETH_CARD_TYPE_UNKNOWN:
2245                 return 1500;
2246         case QETH_CARD_TYPE_IQD:
2247                 return card->info.max_mtu;
2248         case QETH_CARD_TYPE_OSD:
2249                 switch (card->info.link_type) {
2250                 case QETH_LINK_TYPE_HSTR:
2251                 case QETH_LINK_TYPE_LANE_TR:
2252                         return 2000;
2253                 default:
2254                         return card->options.layer2 ? 1500 : 1492;
2255                 }
2256         case QETH_CARD_TYPE_OSM:
2257         case QETH_CARD_TYPE_OSX:
2258                 return card->options.layer2 ? 1500 : 1492;
2259         default:
2260                 return 1500;
2261         }
2262 }
2263
2264 static int qeth_get_mtu_outof_framesize(int framesize)
2265 {
2266         switch (framesize) {
2267         case 0x4000:
2268                 return 8192;
2269         case 0x6000:
2270                 return 16384;
2271         case 0xa000:
2272                 return 32768;
2273         case 0xffff:
2274                 return 57344;
2275         default:
2276                 return 0;
2277         }
2278 }
2279
2280 static int qeth_mtu_is_valid(struct qeth_card *card, int mtu)
2281 {
2282         switch (card->info.type) {
2283         case QETH_CARD_TYPE_OSD:
2284         case QETH_CARD_TYPE_OSM:
2285         case QETH_CARD_TYPE_OSX:
2286         case QETH_CARD_TYPE_IQD:
2287                 return ((mtu >= 576) &&
2288                         (mtu <= card->info.max_mtu));
2289         case QETH_CARD_TYPE_OSN:
2290         case QETH_CARD_TYPE_UNKNOWN:
2291         default:
2292                 return 1;
2293         }
2294 }
2295
2296 static int qeth_ulp_enable_cb(struct qeth_card *card, struct qeth_reply *reply,
2297                 unsigned long data)
2298 {
2299
2300         __u16 mtu, framesize;
2301         __u16 len;
2302         __u8 link_type;
2303         struct qeth_cmd_buffer *iob;
2304
2305         QETH_DBF_TEXT(SETUP, 2, "ulpenacb");
2306
2307         iob = (struct qeth_cmd_buffer *) data;
2308         memcpy(&card->token.ulp_filter_r,
2309                QETH_ULP_ENABLE_RESP_FILTER_TOKEN(iob->data),
2310                QETH_MPC_TOKEN_LENGTH);
2311         if (card->info.type == QETH_CARD_TYPE_IQD) {
2312                 memcpy(&framesize, QETH_ULP_ENABLE_RESP_MAX_MTU(iob->data), 2);
2313                 mtu = qeth_get_mtu_outof_framesize(framesize);
2314                 if (!mtu) {
2315                         iob->rc = -EINVAL;
2316                         QETH_DBF_TEXT_(SETUP, 2, "  rc%d", iob->rc);
2317                         return 0;
2318                 }
2319                 if (card->info.initial_mtu && (card->info.initial_mtu != mtu)) {
2320                         /* frame size has changed */
2321                         if (card->dev &&
2322                             ((card->dev->mtu == card->info.initial_mtu) ||
2323                              (card->dev->mtu > mtu)))
2324                                 card->dev->mtu = mtu;
2325                         qeth_free_qdio_buffers(card);
2326                 }
2327                 card->info.initial_mtu = mtu;
2328                 card->info.max_mtu = mtu;
2329                 card->qdio.in_buf_size = mtu + 2 * PAGE_SIZE;
2330         } else {
2331                 card->info.max_mtu = *(__u16 *)QETH_ULP_ENABLE_RESP_MAX_MTU(
2332                         iob->data);
2333                 card->info.initial_mtu = min(card->info.max_mtu,
2334                                         qeth_get_initial_mtu_for_card(card));
2335                 card->qdio.in_buf_size = QETH_IN_BUF_SIZE_DEFAULT;
2336         }
2337
2338         memcpy(&len, QETH_ULP_ENABLE_RESP_DIFINFO_LEN(iob->data), 2);
2339         if (len >= QETH_MPC_DIFINFO_LEN_INDICATES_LINK_TYPE) {
2340                 memcpy(&link_type,
2341                        QETH_ULP_ENABLE_RESP_LINK_TYPE(iob->data), 1);
2342                 card->info.link_type = link_type;
2343         } else
2344                 card->info.link_type = 0;
2345         QETH_DBF_TEXT_(SETUP, 2, "link%d", card->info.link_type);
2346         QETH_DBF_TEXT_(SETUP, 2, "  rc%d", iob->rc);
2347         return 0;
2348 }
2349
2350 static int qeth_ulp_enable(struct qeth_card *card)
2351 {
2352         int rc;
2353         char prot_type;
2354         struct qeth_cmd_buffer *iob;
2355
2356         /*FIXME: trace view callbacks*/
2357         QETH_DBF_TEXT(SETUP, 2, "ulpenabl");
2358
2359         iob = qeth_wait_for_buffer(&card->write);
2360         memcpy(iob->data, ULP_ENABLE, ULP_ENABLE_SIZE);
2361
2362         *(QETH_ULP_ENABLE_LINKNUM(iob->data)) =
2363                 (__u8) card->info.portno;
2364         if (card->options.layer2)
2365                 if (card->info.type == QETH_CARD_TYPE_OSN)
2366                         prot_type = QETH_PROT_OSN2;
2367                 else
2368                         prot_type = QETH_PROT_LAYER2;
2369         else
2370                 prot_type = QETH_PROT_TCPIP;
2371
2372         memcpy(QETH_ULP_ENABLE_PROT_TYPE(iob->data), &prot_type, 1);
2373         memcpy(QETH_ULP_ENABLE_DEST_ADDR(iob->data),
2374                &card->token.cm_connection_r, QETH_MPC_TOKEN_LENGTH);
2375         memcpy(QETH_ULP_ENABLE_FILTER_TOKEN(iob->data),
2376                &card->token.ulp_filter_w, QETH_MPC_TOKEN_LENGTH);
2377         rc = qeth_send_control_data(card, ULP_ENABLE_SIZE, iob,
2378                                     qeth_ulp_enable_cb, NULL);
2379         return rc;
2380
2381 }
2382
2383 static int qeth_ulp_setup_cb(struct qeth_card *card, struct qeth_reply *reply,
2384                 unsigned long data)
2385 {
2386         struct qeth_cmd_buffer *iob;
2387
2388         QETH_DBF_TEXT(SETUP, 2, "ulpstpcb");
2389
2390         iob = (struct qeth_cmd_buffer *) data;
2391         memcpy(&card->token.ulp_connection_r,
2392                QETH_ULP_SETUP_RESP_CONNECTION_TOKEN(iob->data),
2393                QETH_MPC_TOKEN_LENGTH);
2394         if (!strncmp("00S", QETH_ULP_SETUP_RESP_CONNECTION_TOKEN(iob->data),
2395                      3)) {
2396                 QETH_DBF_TEXT(SETUP, 2, "olmlimit");
2397                 dev_err(&card->gdev->dev, "A connection could not be "
2398                         "established because of an OLM limit\n");
2399                 iob->rc = -EMLINK;
2400         }
2401         QETH_DBF_TEXT_(SETUP, 2, "  rc%d", iob->rc);
2402         return 0;
2403 }
2404
2405 static int qeth_ulp_setup(struct qeth_card *card)
2406 {
2407         int rc;
2408         __u16 temp;
2409         struct qeth_cmd_buffer *iob;
2410         struct ccw_dev_id dev_id;
2411
2412         QETH_DBF_TEXT(SETUP, 2, "ulpsetup");
2413
2414         iob = qeth_wait_for_buffer(&card->write);
2415         memcpy(iob->data, ULP_SETUP, ULP_SETUP_SIZE);
2416
2417         memcpy(QETH_ULP_SETUP_DEST_ADDR(iob->data),
2418                &card->token.cm_connection_r, QETH_MPC_TOKEN_LENGTH);
2419         memcpy(QETH_ULP_SETUP_CONNECTION_TOKEN(iob->data),
2420                &card->token.ulp_connection_w, QETH_MPC_TOKEN_LENGTH);
2421         memcpy(QETH_ULP_SETUP_FILTER_TOKEN(iob->data),
2422                &card->token.ulp_filter_r, QETH_MPC_TOKEN_LENGTH);
2423
2424         ccw_device_get_id(CARD_DDEV(card), &dev_id);
2425         memcpy(QETH_ULP_SETUP_CUA(iob->data), &dev_id.devno, 2);
2426         temp = (card->info.cula << 8) + card->info.unit_addr2;
2427         memcpy(QETH_ULP_SETUP_REAL_DEVADDR(iob->data), &temp, 2);
2428         rc = qeth_send_control_data(card, ULP_SETUP_SIZE, iob,
2429                                     qeth_ulp_setup_cb, NULL);
2430         return rc;
2431 }
2432
2433 static int qeth_init_qdio_out_buf(struct qeth_qdio_out_q *q, int bidx)
2434 {
2435         int rc;
2436         struct qeth_qdio_out_buffer *newbuf;
2437
2438         rc = 0;
2439         newbuf = kmem_cache_zalloc(qeth_qdio_outbuf_cache, GFP_ATOMIC);
2440         if (!newbuf) {
2441                 rc = -ENOMEM;
2442                 goto out;
2443         }
2444         newbuf->buffer = q->qdio_bufs[bidx];
2445         skb_queue_head_init(&newbuf->skb_list);
2446         lockdep_set_class(&newbuf->skb_list.lock, &qdio_out_skb_queue_key);
2447         newbuf->q = q;
2448         newbuf->aob = NULL;
2449         newbuf->next_pending = q->bufs[bidx];
2450         atomic_set(&newbuf->state, QETH_QDIO_BUF_EMPTY);
2451         q->bufs[bidx] = newbuf;
2452         if (q->bufstates) {
2453                 q->bufstates[bidx].user = newbuf;
2454                 QETH_CARD_TEXT_(q->card, 2, "nbs%d", bidx);
2455                 QETH_CARD_TEXT_(q->card, 2, "%lx", (long) newbuf);
2456                 QETH_CARD_TEXT_(q->card, 2, "%lx",
2457                                 (long) newbuf->next_pending);
2458         }
2459 out:
2460         return rc;
2461 }
2462
2463 static void qeth_free_qdio_out_buf(struct qeth_qdio_out_q *q)
2464 {
2465         if (!q)
2466                 return;
2467
2468         qdio_free_buffers(q->qdio_bufs, QDIO_MAX_BUFFERS_PER_Q);
2469         kfree(q);
2470 }
2471
2472 static struct qeth_qdio_out_q *qeth_alloc_qdio_out_buf(void)
2473 {
2474         struct qeth_qdio_out_q *q = kzalloc(sizeof(*q), GFP_KERNEL);
2475
2476         if (!q)
2477                 return NULL;
2478
2479         if (qdio_alloc_buffers(q->qdio_bufs, QDIO_MAX_BUFFERS_PER_Q)) {
2480                 kfree(q);
2481                 return NULL;
2482         }
2483         return q;
2484 }
2485
2486 static int qeth_alloc_qdio_buffers(struct qeth_card *card)
2487 {
2488         int i, j;
2489
2490         QETH_DBF_TEXT(SETUP, 2, "allcqdbf");
2491
2492         if (atomic_cmpxchg(&card->qdio.state, QETH_QDIO_UNINITIALIZED,
2493                 QETH_QDIO_ALLOCATED) != QETH_QDIO_UNINITIALIZED)
2494                 return 0;
2495
2496         QETH_DBF_TEXT(SETUP, 2, "inq");
2497         card->qdio.in_q = qeth_alloc_qdio_queue();
2498         if (!card->qdio.in_q)
2499                 goto out_nomem;
2500
2501         /* inbound buffer pool */
2502         if (qeth_alloc_buffer_pool(card))
2503                 goto out_freeinq;
2504
2505         /* outbound */
2506         card->qdio.out_qs =
2507                 kzalloc(card->qdio.no_out_queues *
2508                         sizeof(struct qeth_qdio_out_q *), GFP_KERNEL);
2509         if (!card->qdio.out_qs)
2510                 goto out_freepool;
2511         for (i = 0; i < card->qdio.no_out_queues; ++i) {
2512                 card->qdio.out_qs[i] = qeth_alloc_qdio_out_buf();
2513                 if (!card->qdio.out_qs[i])
2514                         goto out_freeoutq;
2515                 QETH_DBF_TEXT_(SETUP, 2, "outq %i", i);
2516                 QETH_DBF_HEX(SETUP, 2, &card->qdio.out_qs[i], sizeof(void *));
2517                 card->qdio.out_qs[i]->queue_no = i;
2518                 /* give outbound qeth_qdio_buffers their qdio_buffers */
2519                 for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; ++j) {
2520                         WARN_ON(card->qdio.out_qs[i]->bufs[j] != NULL);
2521                         if (qeth_init_qdio_out_buf(card->qdio.out_qs[i], j))
2522                                 goto out_freeoutqbufs;
2523                 }
2524         }
2525
2526         /* completion */
2527         if (qeth_alloc_cq(card))
2528                 goto out_freeoutq;
2529
2530         return 0;
2531
2532 out_freeoutqbufs:
2533         while (j > 0) {
2534                 --j;
2535                 kmem_cache_free(qeth_qdio_outbuf_cache,
2536                                 card->qdio.out_qs[i]->bufs[j]);
2537                 card->qdio.out_qs[i]->bufs[j] = NULL;
2538         }
2539 out_freeoutq:
2540         while (i > 0) {
2541                 qeth_free_qdio_out_buf(card->qdio.out_qs[--i]);
2542                 qeth_clear_outq_buffers(card->qdio.out_qs[i], 1);
2543         }
2544         kfree(card->qdio.out_qs);
2545         card->qdio.out_qs = NULL;
2546 out_freepool:
2547         qeth_free_buffer_pool(card);
2548 out_freeinq:
2549         qeth_free_qdio_queue(card->qdio.in_q);
2550         card->qdio.in_q = NULL;
2551 out_nomem:
2552         atomic_set(&card->qdio.state, QETH_QDIO_UNINITIALIZED);
2553         return -ENOMEM;
2554 }
2555
2556 static void qeth_free_qdio_buffers(struct qeth_card *card)
2557 {
2558         int i, j;
2559
2560         if (atomic_xchg(&card->qdio.state, QETH_QDIO_UNINITIALIZED) ==
2561                 QETH_QDIO_UNINITIALIZED)
2562                 return;
2563
2564         qeth_free_cq(card);
2565         cancel_delayed_work_sync(&card->buffer_reclaim_work);
2566         for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; ++j) {
2567                 if (card->qdio.in_q->bufs[j].rx_skb)
2568                         dev_kfree_skb_any(card->qdio.in_q->bufs[j].rx_skb);
2569         }
2570         qeth_free_qdio_queue(card->qdio.in_q);
2571         card->qdio.in_q = NULL;
2572         /* inbound buffer pool */
2573         qeth_free_buffer_pool(card);
2574         /* free outbound qdio_qs */
2575         if (card->qdio.out_qs) {
2576                 for (i = 0; i < card->qdio.no_out_queues; ++i) {
2577                         qeth_clear_outq_buffers(card->qdio.out_qs[i], 1);
2578                         qeth_free_qdio_out_buf(card->qdio.out_qs[i]);
2579                 }
2580                 kfree(card->qdio.out_qs);
2581                 card->qdio.out_qs = NULL;
2582         }
2583 }
2584
2585 static void qeth_create_qib_param_field(struct qeth_card *card,
2586                 char *param_field)
2587 {
2588
2589         param_field[0] = _ascebc['P'];
2590         param_field[1] = _ascebc['C'];
2591         param_field[2] = _ascebc['I'];
2592         param_field[3] = _ascebc['T'];
2593         *((unsigned int *) (&param_field[4])) = QETH_PCI_THRESHOLD_A(card);
2594         *((unsigned int *) (&param_field[8])) = QETH_PCI_THRESHOLD_B(card);
2595         *((unsigned int *) (&param_field[12])) = QETH_PCI_TIMER_VALUE(card);
2596 }
2597
2598 static void qeth_create_qib_param_field_blkt(struct qeth_card *card,
2599                 char *param_field)
2600 {
2601         param_field[16] = _ascebc['B'];
2602         param_field[17] = _ascebc['L'];
2603         param_field[18] = _ascebc['K'];
2604         param_field[19] = _ascebc['T'];
2605         *((unsigned int *) (&param_field[20])) = card->info.blkt.time_total;
2606         *((unsigned int *) (&param_field[24])) = card->info.blkt.inter_packet;
2607         *((unsigned int *) (&param_field[28])) =
2608                 card->info.blkt.inter_packet_jumbo;
2609 }
2610
2611 static int qeth_qdio_activate(struct qeth_card *card)
2612 {
2613         QETH_DBF_TEXT(SETUP, 3, "qdioact");
2614         return qdio_activate(CARD_DDEV(card));
2615 }
2616
2617 static int qeth_dm_act(struct qeth_card *card)
2618 {
2619         int rc;
2620         struct qeth_cmd_buffer *iob;
2621
2622         QETH_DBF_TEXT(SETUP, 2, "dmact");
2623
2624         iob = qeth_wait_for_buffer(&card->write);
2625         memcpy(iob->data, DM_ACT, DM_ACT_SIZE);
2626
2627         memcpy(QETH_DM_ACT_DEST_ADDR(iob->data),
2628                &card->token.cm_connection_r, QETH_MPC_TOKEN_LENGTH);
2629         memcpy(QETH_DM_ACT_CONNECTION_TOKEN(iob->data),
2630                &card->token.ulp_connection_r, QETH_MPC_TOKEN_LENGTH);
2631         rc = qeth_send_control_data(card, DM_ACT_SIZE, iob, NULL, NULL);
2632         return rc;
2633 }
2634
2635 static int qeth_mpc_initialize(struct qeth_card *card)
2636 {
2637         int rc;
2638
2639         QETH_DBF_TEXT(SETUP, 2, "mpcinit");
2640
2641         rc = qeth_issue_next_read(card);
2642         if (rc) {
2643                 QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc);
2644                 return rc;
2645         }
2646         rc = qeth_cm_enable(card);
2647         if (rc) {
2648                 QETH_DBF_TEXT_(SETUP, 2, "2err%d", rc);
2649                 goto out_qdio;
2650         }
2651         rc = qeth_cm_setup(card);
2652         if (rc) {
2653                 QETH_DBF_TEXT_(SETUP, 2, "3err%d", rc);
2654                 goto out_qdio;
2655         }
2656         rc = qeth_ulp_enable(card);
2657         if (rc) {
2658                 QETH_DBF_TEXT_(SETUP, 2, "4err%d", rc);
2659                 goto out_qdio;
2660         }
2661         rc = qeth_ulp_setup(card);
2662         if (rc) {
2663                 QETH_DBF_TEXT_(SETUP, 2, "5err%d", rc);
2664                 goto out_qdio;
2665         }
2666         rc = qeth_alloc_qdio_buffers(card);
2667         if (rc) {
2668                 QETH_DBF_TEXT_(SETUP, 2, "5err%d", rc);
2669                 goto out_qdio;
2670         }
2671         rc = qeth_qdio_establish(card);
2672         if (rc) {
2673                 QETH_DBF_TEXT_(SETUP, 2, "6err%d", rc);
2674                 qeth_free_qdio_buffers(card);
2675                 goto out_qdio;
2676         }
2677         rc = qeth_qdio_activate(card);
2678         if (rc) {
2679                 QETH_DBF_TEXT_(SETUP, 2, "7err%d", rc);
2680                 goto out_qdio;
2681         }
2682         rc = qeth_dm_act(card);
2683         if (rc) {
2684                 QETH_DBF_TEXT_(SETUP, 2, "8err%d", rc);
2685                 goto out_qdio;
2686         }
2687
2688         return 0;
2689 out_qdio:
2690         qeth_qdio_clear_card(card, card->info.type != QETH_CARD_TYPE_IQD);
2691         qdio_free(CARD_DDEV(card));
2692         return rc;
2693 }
2694
2695 void qeth_print_status_message(struct qeth_card *card)
2696 {
2697         switch (card->info.type) {
2698         case QETH_CARD_TYPE_OSD:
2699         case QETH_CARD_TYPE_OSM:
2700         case QETH_CARD_TYPE_OSX:
2701                 /* VM will use a non-zero first character
2702                  * to indicate a HiperSockets like reporting
2703                  * of the level OSA sets the first character to zero
2704                  * */
2705                 if (!card->info.mcl_level[0]) {
2706                         sprintf(card->info.mcl_level, "%02x%02x",
2707                                 card->info.mcl_level[2],
2708                                 card->info.mcl_level[3]);
2709                         break;
2710                 }
2711                 /* fallthrough */
2712         case QETH_CARD_TYPE_IQD:
2713                 if ((card->info.guestlan) ||
2714                     (card->info.mcl_level[0] & 0x80)) {
2715                         card->info.mcl_level[0] = (char) _ebcasc[(__u8)
2716                                 card->info.mcl_level[0]];
2717                         card->info.mcl_level[1] = (char) _ebcasc[(__u8)
2718                                 card->info.mcl_level[1]];
2719                         card->info.mcl_level[2] = (char) _ebcasc[(__u8)
2720                                 card->info.mcl_level[2]];
2721                         card->info.mcl_level[3] = (char) _ebcasc[(__u8)
2722                                 card->info.mcl_level[3]];
2723                         card->info.mcl_level[QETH_MCL_LENGTH] = 0;
2724                 }
2725                 break;
2726         default:
2727                 memset(&card->info.mcl_level[0], 0, QETH_MCL_LENGTH + 1);
2728         }
2729         dev_info(&card->gdev->dev,
2730                  "Device is a%s card%s%s%s\nwith link type %s.\n",
2731                  qeth_get_cardname(card),
2732                  (card->info.mcl_level[0]) ? " (level: " : "",
2733                  (card->info.mcl_level[0]) ? card->info.mcl_level : "",
2734                  (card->info.mcl_level[0]) ? ")" : "",
2735                  qeth_get_cardname_short(card));
2736 }
2737 EXPORT_SYMBOL_GPL(qeth_print_status_message);
2738
2739 static void qeth_initialize_working_pool_list(struct qeth_card *card)
2740 {
2741         struct qeth_buffer_pool_entry *entry;
2742
2743         QETH_CARD_TEXT(card, 5, "inwrklst");
2744
2745         list_for_each_entry(entry,
2746                             &card->qdio.init_pool.entry_list, init_list) {
2747                 qeth_put_buffer_pool_entry(card, entry);
2748         }
2749 }
2750
2751 static struct qeth_buffer_pool_entry *qeth_find_free_buffer_pool_entry(
2752                                         struct qeth_card *card)
2753 {
2754         struct list_head *plh;
2755         struct qeth_buffer_pool_entry *entry;
2756         int i, free;
2757         struct page *page;
2758
2759         if (list_empty(&card->qdio.in_buf_pool.entry_list))
2760                 return NULL;
2761
2762         list_for_each(plh, &card->qdio.in_buf_pool.entry_list) {
2763                 entry = list_entry(plh, struct qeth_buffer_pool_entry, list);
2764                 free = 1;
2765                 for (i = 0; i < QETH_MAX_BUFFER_ELEMENTS(card); ++i) {
2766                         if (page_count(virt_to_page(entry->elements[i])) > 1) {
2767                                 free = 0;
2768                                 break;
2769                         }
2770                 }
2771                 if (free) {
2772                         list_del_init(&entry->list);
2773                         return entry;
2774                 }
2775         }
2776
2777         /* no free buffer in pool so take first one and swap pages */
2778         entry = list_entry(card->qdio.in_buf_pool.entry_list.next,
2779                         struct qeth_buffer_pool_entry, list);
2780         for (i = 0; i < QETH_MAX_BUFFER_ELEMENTS(card); ++i) {
2781                 if (page_count(virt_to_page(entry->elements[i])) > 1) {
2782                         page = alloc_page(GFP_ATOMIC);
2783                         if (!page) {
2784                                 return NULL;
2785                         } else {
2786                                 free_page((unsigned long)entry->elements[i]);
2787                                 entry->elements[i] = page_address(page);
2788                                 if (card->options.performance_stats)
2789                                         card->perf_stats.sg_alloc_page_rx++;
2790                         }
2791                 }
2792         }
2793         list_del_init(&entry->list);
2794         return entry;
2795 }
2796
2797 static int qeth_init_input_buffer(struct qeth_card *card,
2798                 struct qeth_qdio_buffer *buf)
2799 {
2800         struct qeth_buffer_pool_entry *pool_entry;
2801         int i;
2802
2803         if ((card->options.cq == QETH_CQ_ENABLED) && (!buf->rx_skb)) {
2804                 buf->rx_skb = dev_alloc_skb(QETH_RX_PULL_LEN + ETH_HLEN);
2805                 if (!buf->rx_skb)
2806                         return 1;
2807         }
2808
2809         pool_entry = qeth_find_free_buffer_pool_entry(card);
2810         if (!pool_entry)
2811                 return 1;
2812
2813         /*
2814          * since the buffer is accessed only from the input_tasklet
2815          * there shouldn't be a need to synchronize; also, since we use
2816          * the QETH_IN_BUF_REQUEUE_THRESHOLD we should never run  out off
2817          * buffers
2818          */
2819
2820         buf->pool_entry = pool_entry;
2821         for (i = 0; i < QETH_MAX_BUFFER_ELEMENTS(card); ++i) {
2822                 buf->buffer->element[i].length = PAGE_SIZE;
2823                 buf->buffer->element[i].addr =  pool_entry->elements[i];
2824                 if (i == QETH_MAX_BUFFER_ELEMENTS(card) - 1)
2825                         buf->buffer->element[i].eflags = SBAL_EFLAGS_LAST_ENTRY;
2826                 else
2827                         buf->buffer->element[i].eflags = 0;
2828                 buf->buffer->element[i].sflags = 0;
2829         }
2830         return 0;
2831 }
2832
2833 int qeth_init_qdio_queues(struct qeth_card *card)
2834 {
2835         int i, j;
2836         int rc;
2837
2838         QETH_DBF_TEXT(SETUP, 2, "initqdqs");
2839
2840         /* inbound queue */
2841         qdio_reset_buffers(card->qdio.in_q->qdio_bufs,
2842                            QDIO_MAX_BUFFERS_PER_Q);
2843         qeth_initialize_working_pool_list(card);
2844         /*give only as many buffers to hardware as we have buffer pool entries*/
2845         for (i = 0; i < card->qdio.in_buf_pool.buf_count - 1; ++i)
2846                 qeth_init_input_buffer(card, &card->qdio.in_q->bufs[i]);
2847         card->qdio.in_q->next_buf_to_init =
2848                 card->qdio.in_buf_pool.buf_count - 1;
2849         rc = do_QDIO(CARD_DDEV(card), QDIO_FLAG_SYNC_INPUT, 0, 0,
2850                      card->qdio.in_buf_pool.buf_count - 1);
2851         if (rc) {
2852                 QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc);
2853                 return rc;
2854         }
2855
2856         /* completion */
2857         rc = qeth_cq_init(card);
2858         if (rc) {
2859                 return rc;
2860         }
2861
2862         /* outbound queue */
2863         for (i = 0; i < card->qdio.no_out_queues; ++i) {
2864                 qdio_reset_buffers(card->qdio.out_qs[i]->qdio_bufs,
2865                                    QDIO_MAX_BUFFERS_PER_Q);
2866                 for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; ++j) {
2867                         qeth_clear_output_buffer(card->qdio.out_qs[i],
2868                                         card->qdio.out_qs[i]->bufs[j],
2869                                         QETH_QDIO_BUF_EMPTY);
2870                 }
2871                 card->qdio.out_qs[i]->card = card;
2872                 card->qdio.out_qs[i]->next_buf_to_fill = 0;
2873                 card->qdio.out_qs[i]->do_pack = 0;
2874                 atomic_set(&card->qdio.out_qs[i]->used_buffers, 0);
2875                 atomic_set(&card->qdio.out_qs[i]->set_pci_flags_count, 0);
2876                 atomic_set(&card->qdio.out_qs[i]->state,
2877                            QETH_OUT_Q_UNLOCKED);
2878         }
2879         return 0;
2880 }
2881 EXPORT_SYMBOL_GPL(qeth_init_qdio_queues);
2882
2883 static __u8 qeth_get_ipa_adp_type(enum qeth_link_types link_type)
2884 {
2885         switch (link_type) {
2886         case QETH_LINK_TYPE_HSTR:
2887                 return 2;
2888         default:
2889                 return 1;
2890         }
2891 }
2892
2893 static void qeth_fill_ipacmd_header(struct qeth_card *card,
2894                 struct qeth_ipa_cmd *cmd, __u8 command,
2895                 enum qeth_prot_versions prot)
2896 {
2897         memset(cmd, 0, sizeof(struct qeth_ipa_cmd));
2898         cmd->hdr.command = command;
2899         cmd->hdr.initiator = IPA_CMD_INITIATOR_HOST;
2900         /* cmd->hdr.seqno is set by qeth_send_control_data() */
2901         cmd->hdr.adapter_type = qeth_get_ipa_adp_type(card->info.link_type);
2902         cmd->hdr.rel_adapter_no = (__u8) card->info.portno;
2903         if (card->options.layer2)
2904                 cmd->hdr.prim_version_no = 2;
2905         else
2906                 cmd->hdr.prim_version_no = 1;
2907         cmd->hdr.param_count = 1;
2908         cmd->hdr.prot_version = prot;
2909         cmd->hdr.ipa_supported = 0;
2910         cmd->hdr.ipa_enabled = 0;
2911 }
2912
2913 struct qeth_cmd_buffer *qeth_get_ipacmd_buffer(struct qeth_card *card,
2914                 enum qeth_ipa_cmds ipacmd, enum qeth_prot_versions prot)
2915 {
2916         struct qeth_cmd_buffer *iob;
2917         struct qeth_ipa_cmd *cmd;
2918
2919         iob = qeth_get_buffer(&card->write);
2920         if (iob) {
2921                 cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
2922                 qeth_fill_ipacmd_header(card, cmd, ipacmd, prot);
2923         } else {
2924                 dev_warn(&card->gdev->dev,
2925                          "The qeth driver ran out of channel command buffers\n");
2926                 QETH_DBF_MESSAGE(1, "%s The qeth driver ran out of channel command buffers",
2927                                  dev_name(&card->gdev->dev));
2928         }
2929
2930         return iob;
2931 }
2932 EXPORT_SYMBOL_GPL(qeth_get_ipacmd_buffer);
2933
2934 void qeth_prepare_ipa_cmd(struct qeth_card *card, struct qeth_cmd_buffer *iob,
2935                 char prot_type)
2936 {
2937         memcpy(iob->data, IPA_PDU_HEADER, IPA_PDU_HEADER_SIZE);
2938         memcpy(QETH_IPA_CMD_PROT_TYPE(iob->data), &prot_type, 1);
2939         memcpy(QETH_IPA_CMD_DEST_ADDR(iob->data),
2940                &card->token.ulp_connection_r, QETH_MPC_TOKEN_LENGTH);
2941 }
2942 EXPORT_SYMBOL_GPL(qeth_prepare_ipa_cmd);
2943
2944 /**
2945  * qeth_send_ipa_cmd() - send an IPA command
2946  *
2947  * See qeth_send_control_data() for explanation of the arguments.
2948  */
2949
2950 int qeth_send_ipa_cmd(struct qeth_card *card, struct qeth_cmd_buffer *iob,
2951                 int (*reply_cb)(struct qeth_card *, struct qeth_reply*,
2952                         unsigned long),
2953                 void *reply_param)
2954 {
2955         int rc;
2956         char prot_type;
2957
2958         QETH_CARD_TEXT(card, 4, "sendipa");
2959
2960         if (card->options.layer2)
2961                 if (card->info.type == QETH_CARD_TYPE_OSN)
2962                         prot_type = QETH_PROT_OSN2;
2963                 else
2964                         prot_type = QETH_PROT_LAYER2;
2965         else
2966                 prot_type = QETH_PROT_TCPIP;
2967         qeth_prepare_ipa_cmd(card, iob, prot_type);
2968         rc = qeth_send_control_data(card, IPA_CMD_LENGTH,
2969                                                 iob, reply_cb, reply_param);
2970         if (rc == -ETIME) {
2971                 qeth_clear_ipacmd_list(card);
2972                 qeth_schedule_recovery(card);
2973         }
2974         return rc;
2975 }
2976 EXPORT_SYMBOL_GPL(qeth_send_ipa_cmd);
2977
2978 static int qeth_send_startlan(struct qeth_card *card)
2979 {
2980         int rc;
2981         struct qeth_cmd_buffer *iob;
2982
2983         QETH_DBF_TEXT(SETUP, 2, "strtlan");
2984
2985         iob = qeth_get_ipacmd_buffer(card, IPA_CMD_STARTLAN, 0);
2986         if (!iob)
2987                 return -ENOMEM;
2988         rc = qeth_send_ipa_cmd(card, iob, NULL, NULL);
2989         return rc;
2990 }
2991
2992 static int qeth_default_setadapterparms_cb(struct qeth_card *card,
2993                 struct qeth_reply *reply, unsigned long data)
2994 {
2995         struct qeth_ipa_cmd *cmd;
2996
2997         QETH_CARD_TEXT(card, 4, "defadpcb");
2998
2999         cmd = (struct qeth_ipa_cmd *) data;
3000         if (cmd->hdr.return_code == 0)
3001                 cmd->hdr.return_code =
3002                         cmd->data.setadapterparms.hdr.return_code;
3003         return 0;
3004 }
3005
3006 static int qeth_query_setadapterparms_cb(struct qeth_card *card,
3007                 struct qeth_reply *reply, unsigned long data)
3008 {
3009         struct qeth_ipa_cmd *cmd;
3010
3011         QETH_CARD_TEXT(card, 3, "quyadpcb");
3012
3013         cmd = (struct qeth_ipa_cmd *) data;
3014         if (cmd->data.setadapterparms.data.query_cmds_supp.lan_type & 0x7f) {
3015                 card->info.link_type =
3016                       cmd->data.setadapterparms.data.query_cmds_supp.lan_type;
3017                 QETH_DBF_TEXT_(SETUP, 2, "lnk %d", card->info.link_type);
3018         }
3019         card->options.adp.supported_funcs =
3020                 cmd->data.setadapterparms.data.query_cmds_supp.supported_cmds;
3021         return qeth_default_setadapterparms_cb(card, reply, (unsigned long)cmd);
3022 }
3023
3024 static struct qeth_cmd_buffer *qeth_get_adapter_cmd(struct qeth_card *card,
3025                 __u32 command, __u32 cmdlen)
3026 {
3027         struct qeth_cmd_buffer *iob;
3028         struct qeth_ipa_cmd *cmd;
3029
3030         iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SETADAPTERPARMS,
3031                                      QETH_PROT_IPV4);
3032         if (iob) {
3033                 cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
3034                 cmd->data.setadapterparms.hdr.cmdlength = cmdlen;
3035                 cmd->data.setadapterparms.hdr.command_code = command;
3036                 cmd->data.setadapterparms.hdr.used_total = 1;
3037                 cmd->data.setadapterparms.hdr.seq_no = 1;
3038         }
3039
3040         return iob;
3041 }
3042
3043 int qeth_query_setadapterparms(struct qeth_card *card)
3044 {
3045         int rc;
3046         struct qeth_cmd_buffer *iob;
3047
3048         QETH_CARD_TEXT(card, 3, "queryadp");
3049         iob = qeth_get_adapter_cmd(card, IPA_SETADP_QUERY_COMMANDS_SUPPORTED,
3050                                    sizeof(struct qeth_ipacmd_setadpparms));
3051         if (!iob)
3052                 return -ENOMEM;
3053         rc = qeth_send_ipa_cmd(card, iob, qeth_query_setadapterparms_cb, NULL);
3054         return rc;
3055 }
3056 EXPORT_SYMBOL_GPL(qeth_query_setadapterparms);
3057
3058 static int qeth_query_ipassists_cb(struct qeth_card *card,
3059                 struct qeth_reply *reply, unsigned long data)
3060 {
3061         struct qeth_ipa_cmd *cmd;
3062
3063         QETH_DBF_TEXT(SETUP, 2, "qipasscb");
3064
3065         cmd = (struct qeth_ipa_cmd *) data;
3066
3067         switch (cmd->hdr.return_code) {
3068         case IPA_RC_NOTSUPP:
3069         case IPA_RC_L2_UNSUPPORTED_CMD:
3070                 QETH_DBF_TEXT(SETUP, 2, "ipaunsup");
3071                 card->options.ipa4.supported_funcs |= IPA_SETADAPTERPARMS;
3072                 card->options.ipa6.supported_funcs |= IPA_SETADAPTERPARMS;
3073                 return -0;
3074         default:
3075                 if (cmd->hdr.return_code) {
3076                         QETH_DBF_MESSAGE(1, "%s IPA_CMD_QIPASSIST: Unhandled "
3077                                                 "rc=%d\n",
3078                                                 dev_name(&card->gdev->dev),
3079                                                 cmd->hdr.return_code);
3080                         return 0;
3081                 }
3082         }
3083
3084         if (cmd->hdr.prot_version == QETH_PROT_IPV4) {
3085                 card->options.ipa4.supported_funcs = cmd->hdr.ipa_supported;
3086                 card->options.ipa4.enabled_funcs = cmd->hdr.ipa_enabled;
3087         } else if (cmd->hdr.prot_version == QETH_PROT_IPV6) {
3088                 card->options.ipa6.supported_funcs = cmd->hdr.ipa_supported;
3089                 card->options.ipa6.enabled_funcs = cmd->hdr.ipa_enabled;
3090         } else
3091                 QETH_DBF_MESSAGE(1, "%s IPA_CMD_QIPASSIST: Flawed LIC detected"
3092                                         "\n", dev_name(&card->gdev->dev));
3093         return 0;
3094 }
3095
3096 int qeth_query_ipassists(struct qeth_card *card, enum qeth_prot_versions prot)
3097 {
3098         int rc;
3099         struct qeth_cmd_buffer *iob;
3100
3101         QETH_DBF_TEXT_(SETUP, 2, "qipassi%i", prot);
3102         iob = qeth_get_ipacmd_buffer(card, IPA_CMD_QIPASSIST, prot);
3103         if (!iob)
3104                 return -ENOMEM;
3105         rc = qeth_send_ipa_cmd(card, iob, qeth_query_ipassists_cb, NULL);
3106         return rc;
3107 }
3108 EXPORT_SYMBOL_GPL(qeth_query_ipassists);
3109
3110 static int qeth_query_switch_attributes_cb(struct qeth_card *card,
3111                                 struct qeth_reply *reply, unsigned long data)
3112 {
3113         struct qeth_ipa_cmd *cmd;
3114         struct qeth_switch_info *sw_info;
3115         struct qeth_query_switch_attributes *attrs;
3116
3117         QETH_CARD_TEXT(card, 2, "qswiatcb");
3118         cmd = (struct qeth_ipa_cmd *) data;
3119         sw_info = (struct qeth_switch_info *)reply->param;
3120         if (cmd->data.setadapterparms.hdr.return_code == 0) {
3121                 attrs = &cmd->data.setadapterparms.data.query_switch_attributes;
3122                 sw_info->capabilities = attrs->capabilities;
3123                 sw_info->settings = attrs->settings;
3124                 QETH_CARD_TEXT_(card, 2, "%04x%04x", sw_info->capabilities,
3125                                                         sw_info->settings);
3126         }
3127         qeth_default_setadapterparms_cb(card, reply, (unsigned long) cmd);
3128
3129         return 0;
3130 }
3131
3132 int qeth_query_switch_attributes(struct qeth_card *card,
3133                                  struct qeth_switch_info *sw_info)
3134 {
3135         struct qeth_cmd_buffer *iob;
3136
3137         QETH_CARD_TEXT(card, 2, "qswiattr");
3138         if (!qeth_adp_supported(card, IPA_SETADP_QUERY_SWITCH_ATTRIBUTES))
3139                 return -EOPNOTSUPP;
3140         if (!netif_carrier_ok(card->dev))
3141                 return -ENOMEDIUM;
3142         iob = qeth_get_adapter_cmd(card, IPA_SETADP_QUERY_SWITCH_ATTRIBUTES,
3143                                 sizeof(struct qeth_ipacmd_setadpparms_hdr));
3144         if (!iob)
3145                 return -ENOMEM;
3146         return qeth_send_ipa_cmd(card, iob,
3147                                 qeth_query_switch_attributes_cb, sw_info);
3148 }
3149 EXPORT_SYMBOL_GPL(qeth_query_switch_attributes);
3150
3151 static int qeth_query_setdiagass_cb(struct qeth_card *card,
3152                 struct qeth_reply *reply, unsigned long data)
3153 {
3154         struct qeth_ipa_cmd *cmd;
3155         __u16 rc;
3156
3157         cmd = (struct qeth_ipa_cmd *)data;
3158         rc = cmd->hdr.return_code;
3159         if (rc)
3160                 QETH_CARD_TEXT_(card, 2, "diagq:%x", rc);
3161         else
3162                 card->info.diagass_support = cmd->data.diagass.ext;
3163         return 0;
3164 }
3165
3166 static int qeth_query_setdiagass(struct qeth_card *card)
3167 {
3168         struct qeth_cmd_buffer *iob;
3169         struct qeth_ipa_cmd    *cmd;
3170
3171         QETH_DBF_TEXT(SETUP, 2, "qdiagass");
3172         iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SET_DIAG_ASS, 0);
3173         if (!iob)
3174                 return -ENOMEM;
3175         cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
3176         cmd->data.diagass.subcmd_len = 16;
3177         cmd->data.diagass.subcmd = QETH_DIAGS_CMD_QUERY;
3178         return qeth_send_ipa_cmd(card, iob, qeth_query_setdiagass_cb, NULL);
3179 }
3180
3181 static void qeth_get_trap_id(struct qeth_card *card, struct qeth_trap_id *tid)
3182 {
3183         unsigned long info = get_zeroed_page(GFP_KERNEL);
3184         struct sysinfo_2_2_2 *info222 = (struct sysinfo_2_2_2 *)info;
3185         struct sysinfo_3_2_2 *info322 = (struct sysinfo_3_2_2 *)info;
3186         struct ccw_dev_id ccwid;
3187         int level;
3188
3189         tid->chpid = card->info.chpid;
3190         ccw_device_get_id(CARD_RDEV(card), &ccwid);
3191         tid->ssid = ccwid.ssid;
3192         tid->devno = ccwid.devno;
3193         if (!info)
3194                 return;
3195         level = stsi(NULL, 0, 0, 0);
3196         if ((level >= 2) && (stsi(info222, 2, 2, 2) == 0))
3197                 tid->lparnr = info222->lpar_number;
3198         if ((level >= 3) && (stsi(info322, 3, 2, 2) == 0)) {
3199                 EBCASC(info322->vm[0].name, sizeof(info322->vm[0].name));
3200                 memcpy(tid->vmname, info322->vm[0].name, sizeof(tid->vmname));
3201         }
3202         free_page(info);
3203         return;
3204 }
3205
3206 static int qeth_hw_trap_cb(struct qeth_card *card,
3207                 struct qeth_reply *reply, unsigned long data)
3208 {
3209         struct qeth_ipa_cmd *cmd;
3210         __u16 rc;
3211
3212         cmd = (struct qeth_ipa_cmd *)data;
3213         rc = cmd->hdr.return_code;
3214         if (rc)
3215                 QETH_CARD_TEXT_(card, 2, "trapc:%x", rc);
3216         return 0;
3217 }
3218
3219 int qeth_hw_trap(struct qeth_card *card, enum qeth_diags_trap_action action)
3220 {
3221         struct qeth_cmd_buffer *iob;
3222         struct qeth_ipa_cmd *cmd;
3223
3224         QETH_DBF_TEXT(SETUP, 2, "diagtrap");
3225         iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SET_DIAG_ASS, 0);
3226         if (!iob)
3227                 return -ENOMEM;
3228         cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
3229         cmd->data.diagass.subcmd_len = 80;
3230         cmd->data.diagass.subcmd = QETH_DIAGS_CMD_TRAP;
3231         cmd->data.diagass.type = 1;
3232         cmd->data.diagass.action = action;
3233         switch (action) {
3234         case QETH_DIAGS_TRAP_ARM:
3235                 cmd->data.diagass.options = 0x0003;
3236                 cmd->data.diagass.ext = 0x00010000 +
3237                         sizeof(struct qeth_trap_id);
3238                 qeth_get_trap_id(card,
3239                         (struct qeth_trap_id *)cmd->data.diagass.cdata);
3240                 break;
3241         case QETH_DIAGS_TRAP_DISARM:
3242                 cmd->data.diagass.options = 0x0001;
3243                 break;
3244         case QETH_DIAGS_TRAP_CAPTURE:
3245                 break;
3246         }
3247         return qeth_send_ipa_cmd(card, iob, qeth_hw_trap_cb, NULL);
3248 }
3249 EXPORT_SYMBOL_GPL(qeth_hw_trap);
3250
3251 static int qeth_check_qdio_errors(struct qeth_card *card,
3252                                   struct qdio_buffer *buf,
3253                                   unsigned int qdio_error,
3254                                   const char *dbftext)
3255 {
3256         if (qdio_error) {
3257                 QETH_CARD_TEXT(card, 2, dbftext);
3258                 QETH_CARD_TEXT_(card, 2, " F15=%02X",
3259                                buf->element[15].sflags);
3260                 QETH_CARD_TEXT_(card, 2, " F14=%02X",
3261                                buf->element[14].sflags);
3262                 QETH_CARD_TEXT_(card, 2, " qerr=%X", qdio_error);
3263                 if ((buf->element[15].sflags) == 0x12) {
3264                         card->stats.rx_dropped++;
3265                         return 0;
3266                 } else
3267                         return 1;
3268         }
3269         return 0;
3270 }
3271
3272 static void qeth_queue_input_buffer(struct qeth_card *card, int index)
3273 {
3274         struct qeth_qdio_q *queue = card->qdio.in_q;
3275         struct list_head *lh;
3276         int count;
3277         int i;
3278         int rc;
3279         int newcount = 0;
3280
3281         count = (index < queue->next_buf_to_init)?
3282                 card->qdio.in_buf_pool.buf_count -
3283                 (queue->next_buf_to_init - index) :
3284                 card->qdio.in_buf_pool.buf_count -
3285                 (queue->next_buf_to_init + QDIO_MAX_BUFFERS_PER_Q - index);
3286         /* only requeue at a certain threshold to avoid SIGAs */
3287         if (count >= QETH_IN_BUF_REQUEUE_THRESHOLD(card)) {
3288                 for (i = queue->next_buf_to_init;
3289                      i < queue->next_buf_to_init + count; ++i) {
3290                         if (qeth_init_input_buffer(card,
3291                                 &queue->bufs[i % QDIO_MAX_BUFFERS_PER_Q])) {
3292                                 break;
3293                         } else {
3294                                 newcount++;
3295                         }
3296                 }
3297
3298                 if (newcount < count) {
3299                         /* we are in memory shortage so we switch back to
3300                            traditional skb allocation and drop packages */
3301                         atomic_set(&card->force_alloc_skb, 3);
3302                         count = newcount;
3303                 } else {
3304                         atomic_add_unless(&card->force_alloc_skb, -1, 0);
3305                 }
3306
3307                 if (!count) {
3308                         i = 0;
3309                         list_for_each(lh, &card->qdio.in_buf_pool.entry_list)
3310                                 i++;
3311                         if (i == card->qdio.in_buf_pool.buf_count) {
3312                                 QETH_CARD_TEXT(card, 2, "qsarbw");
3313                                 card->reclaim_index = index;
3314                                 schedule_delayed_work(
3315                                         &card->buffer_reclaim_work,
3316                                         QETH_RECLAIM_WORK_TIME);
3317                         }
3318                         return;
3319                 }
3320
3321                 /*
3322                  * according to old code it should be avoided to requeue all
3323                  * 128 buffers in order to benefit from PCI avoidance.
3324                  * this function keeps at least one buffer (the buffer at
3325                  * 'index') un-requeued -> this buffer is the first buffer that
3326                  * will be requeued the next time
3327                  */
3328                 if (card->options.performance_stats) {
3329                         card->perf_stats.inbound_do_qdio_cnt++;
3330                         card->perf_stats.inbound_do_qdio_start_time =
3331                                 qeth_get_micros();
3332                 }
3333                 rc = do_QDIO(CARD_DDEV(card), QDIO_FLAG_SYNC_INPUT, 0,
3334                              queue->next_buf_to_init, count);
3335                 if (card->options.performance_stats)
3336                         card->perf_stats.inbound_do_qdio_time +=
3337                                 qeth_get_micros() -
3338                                 card->perf_stats.inbound_do_qdio_start_time;
3339                 if (rc) {
3340                         QETH_CARD_TEXT(card, 2, "qinberr");
3341                 }
3342                 queue->next_buf_to_init = (queue->next_buf_to_init + count) %
3343                                           QDIO_MAX_BUFFERS_PER_Q;
3344         }
3345 }
3346
3347 static void qeth_buffer_reclaim_work(struct work_struct *work)
3348 {
3349         struct qeth_card *card = container_of(work, struct qeth_card,
3350                 buffer_reclaim_work.work);
3351
3352         QETH_CARD_TEXT_(card, 2, "brw:%x", card->reclaim_index);
3353         qeth_queue_input_buffer(card, card->reclaim_index);
3354 }
3355
3356 static void qeth_handle_send_error(struct qeth_card *card,
3357                 struct qeth_qdio_out_buffer *buffer, unsigned int qdio_err)
3358 {
3359         int sbalf15 = buffer->buffer->element[15].sflags;
3360
3361         QETH_CARD_TEXT(card, 6, "hdsnderr");
3362         if (card->info.type == QETH_CARD_TYPE_IQD) {
3363                 if (sbalf15 == 0) {
3364                         qdio_err = 0;
3365                 } else {
3366                         qdio_err = 1;
3367                 }
3368         }
3369         qeth_check_qdio_errors(card, buffer->buffer, qdio_err, "qouterr");
3370
3371         if (!qdio_err)
3372                 return;
3373
3374         if ((sbalf15 >= 15) && (sbalf15 <= 31))
3375                 return;
3376
3377         QETH_CARD_TEXT(card, 1, "lnkfail");
3378         QETH_CARD_TEXT_(card, 1, "%04x %02x",
3379                        (u16)qdio_err, (u8)sbalf15);
3380 }
3381
3382 /**
3383  * qeth_prep_flush_pack_buffer - Prepares flushing of a packing buffer.
3384  * @queue: queue to check for packing buffer
3385  *
3386  * Returns number of buffers that were prepared for flush.
3387  */
3388 static int qeth_prep_flush_pack_buffer(struct qeth_qdio_out_q *queue)
3389 {
3390         struct qeth_qdio_out_buffer *buffer;
3391
3392         buffer = queue->bufs[queue->next_buf_to_fill];
3393         if ((atomic_read(&buffer->state) == QETH_QDIO_BUF_EMPTY) &&
3394             (buffer->next_element_to_fill > 0)) {
3395                 /* it's a packing buffer */
3396                 atomic_set(&buffer->state, QETH_QDIO_BUF_PRIMED);
3397                 queue->next_buf_to_fill =
3398                         (queue->next_buf_to_fill + 1) % QDIO_MAX_BUFFERS_PER_Q;
3399                 return 1;
3400         }
3401         return 0;
3402 }
3403
3404 /*
3405  * Switched to packing state if the number of used buffers on a queue
3406  * reaches a certain limit.
3407  */
3408 static void qeth_switch_to_packing_if_needed(struct qeth_qdio_out_q *queue)
3409 {
3410         if (!queue->do_pack) {
3411                 if (atomic_read(&queue->used_buffers)
3412                     >= QETH_HIGH_WATERMARK_PACK){
3413                         /* switch non-PACKING -> PACKING */
3414                         QETH_CARD_TEXT(queue->card, 6, "np->pack");
3415                         if (queue->card->options.performance_stats)
3416                                 queue->card->perf_stats.sc_dp_p++;
3417                         queue->do_pack = 1;
3418                 }
3419         }
3420 }
3421
3422 /*
3423  * Switches from packing to non-packing mode. If there is a packing
3424  * buffer on the queue this buffer will be prepared to be flushed.
3425  * In that case 1 is returned to inform the caller. If no buffer
3426  * has to be flushed, zero is returned.
3427  */
3428 static int qeth_switch_to_nonpacking_if_needed(struct qeth_qdio_out_q *queue)
3429 {
3430         if (queue->do_pack) {
3431                 if (atomic_read(&queue->used_buffers)
3432                     <= QETH_LOW_WATERMARK_PACK) {
3433                         /* switch PACKING -> non-PACKING */
3434                         QETH_CARD_TEXT(queue->card, 6, "pack->np");
3435                         if (queue->card->options.performance_stats)
3436                                 queue->card->perf_stats.sc_p_dp++;
3437                         queue->do_pack = 0;
3438                         return qeth_prep_flush_pack_buffer(queue);
3439                 }
3440         }
3441         return 0;
3442 }
3443
3444 static void qeth_flush_buffers(struct qeth_qdio_out_q *queue, int index,
3445                                int count)
3446 {
3447         struct qeth_qdio_out_buffer *buf;
3448         int rc;
3449         int i;
3450         unsigned int qdio_flags;
3451
3452         for (i = index; i < index + count; ++i) {
3453                 int bidx = i % QDIO_MAX_BUFFERS_PER_Q;
3454                 buf = queue->bufs[bidx];
3455                 buf->buffer->element[buf->next_element_to_fill - 1].eflags |=
3456                                 SBAL_EFLAGS_LAST_ENTRY;
3457
3458                 if (queue->bufstates)
3459                         queue->bufstates[bidx].user = buf;
3460
3461                 if (queue->card->info.type == QETH_CARD_TYPE_IQD)
3462                         continue;
3463
3464                 if (!queue->do_pack) {
3465                         if ((atomic_read(&queue->used_buffers) >=
3466                                 (QETH_HIGH_WATERMARK_PACK -
3467                                  QETH_WATERMARK_PACK_FUZZ)) &&
3468                             !atomic_read(&queue->set_pci_flags_count)) {
3469                                 /* it's likely that we'll go to packing
3470                                  * mode soon */
3471                                 atomic_inc(&queue->set_pci_flags_count);
3472                                 buf->buffer->element[0].sflags |= SBAL_SFLAGS0_PCI_REQ;
3473                         }
3474                 } else {
3475                         if (!atomic_read(&queue->set_pci_flags_count)) {
3476                                 /*
3477                                  * there's no outstanding PCI any more, so we
3478                                  * have to request a PCI to be sure the the PCI
3479                                  * will wake at some time in the future then we
3480                                  * can flush packed buffers that might still be
3481                                  * hanging around, which can happen if no
3482                                  * further send was requested by the stack
3483                                  */
3484                                 atomic_inc(&queue->set_pci_flags_count);
3485                                 buf->buffer->element[0].sflags |= SBAL_SFLAGS0_PCI_REQ;
3486                         }
3487                 }
3488         }
3489
3490         netif_trans_update(queue->card->dev);
3491         if (queue->card->options.performance_stats) {
3492                 queue->card->perf_stats.outbound_do_qdio_cnt++;
3493                 queue->card->perf_stats.outbound_do_qdio_start_time =
3494                         qeth_get_micros();
3495         }
3496         qdio_flags = QDIO_FLAG_SYNC_OUTPUT;
3497         if (atomic_read(&queue->set_pci_flags_count))
3498                 qdio_flags |= QDIO_FLAG_PCI_OUT;
3499         rc = do_QDIO(CARD_DDEV(queue->card), qdio_flags,
3500                      queue->queue_no, index, count);
3501         if (queue->card->options.performance_stats)
3502                 queue->card->perf_stats.outbound_do_qdio_time +=
3503                         qeth_get_micros() -
3504                         queue->card->perf_stats.outbound_do_qdio_start_time;
3505         atomic_add(count, &queue->used_buffers);
3506         if (rc) {
3507                 queue->card->stats.tx_errors += count;
3508                 /* ignore temporary SIGA errors without busy condition */
3509                 if (rc == -ENOBUFS)
3510                         return;
3511                 QETH_CARD_TEXT(queue->card, 2, "flushbuf");
3512                 QETH_CARD_TEXT_(queue->card, 2, " q%d", queue->queue_no);
3513                 QETH_CARD_TEXT_(queue->card, 2, " idx%d", index);
3514                 QETH_CARD_TEXT_(queue->card, 2, " c%d", count);
3515                 QETH_CARD_TEXT_(queue->card, 2, " err%d", rc);
3516
3517                 /* this must not happen under normal circumstances. if it
3518                  * happens something is really wrong -> recover */
3519                 qeth_schedule_recovery(queue->card);
3520                 return;
3521         }
3522         if (queue->card->options.performance_stats)
3523                 queue->card->perf_stats.bufs_sent += count;
3524 }
3525
3526 static void qeth_check_outbound_queue(struct qeth_qdio_out_q *queue)
3527 {
3528         int index;
3529         int flush_cnt = 0;
3530         int q_was_packing = 0;
3531
3532         /*
3533          * check if weed have to switch to non-packing mode or if
3534          * we have to get a pci flag out on the queue
3535          */
3536         if ((atomic_read(&queue->used_buffers) <= QETH_LOW_WATERMARK_PACK) ||
3537             !atomic_read(&queue->set_pci_flags_count)) {
3538                 if (atomic_xchg(&queue->state, QETH_OUT_Q_LOCKED_FLUSH) ==
3539                                 QETH_OUT_Q_UNLOCKED) {
3540                         /*
3541                          * If we get in here, there was no action in
3542                          * do_send_packet. So, we check if there is a
3543                          * packing buffer to be flushed here.
3544                          */
3545                         netif_stop_queue(queue->card->dev);
3546                         index = queue->next_buf_to_fill;
3547                         q_was_packing = queue->do_pack;
3548                         /* queue->do_pack may change */
3549                         barrier();
3550                         flush_cnt += qeth_switch_to_nonpacking_if_needed(queue);
3551                         if (!flush_cnt &&
3552                             !atomic_read(&queue->set_pci_flags_count))
3553                                 flush_cnt += qeth_prep_flush_pack_buffer(queue);
3554                         if (queue->card->options.performance_stats &&
3555                             q_was_packing)
3556                                 queue->card->perf_stats.bufs_sent_pack +=
3557                                         flush_cnt;
3558                         if (flush_cnt)
3559                                 qeth_flush_buffers(queue, index, flush_cnt);
3560                         atomic_set(&queue->state, QETH_OUT_Q_UNLOCKED);
3561                 }
3562         }
3563 }
3564
3565 void qeth_qdio_start_poll(struct ccw_device *ccwdev, int queue,
3566                 unsigned long card_ptr)
3567 {
3568         struct qeth_card *card = (struct qeth_card *)card_ptr;
3569
3570         if (card->dev && (card->dev->flags & IFF_UP))
3571                 napi_schedule(&card->napi);
3572 }
3573 EXPORT_SYMBOL_GPL(qeth_qdio_start_poll);
3574
3575 int qeth_configure_cq(struct qeth_card *card, enum qeth_cq cq)
3576 {
3577         int rc;
3578
3579         if (card->options.cq ==  QETH_CQ_NOTAVAILABLE) {
3580                 rc = -1;
3581                 goto out;
3582         } else {
3583                 if (card->options.cq == cq) {
3584                         rc = 0;
3585                         goto out;
3586                 }
3587
3588                 if (card->state != CARD_STATE_DOWN &&
3589                     card->state != CARD_STATE_RECOVER) {
3590                         rc = -1;
3591                         goto out;
3592                 }
3593
3594                 qeth_free_qdio_buffers(card);
3595                 card->options.cq = cq;
3596                 rc = 0;
3597         }
3598 out:
3599         return rc;
3600
3601 }
3602 EXPORT_SYMBOL_GPL(qeth_configure_cq);
3603
3604
3605 static void qeth_qdio_cq_handler(struct qeth_card *card,
3606                 unsigned int qdio_err,
3607                 unsigned int queue, int first_element, int count) {
3608         struct qeth_qdio_q *cq = card->qdio.c_q;
3609         int i;
3610         int rc;
3611
3612         if (!qeth_is_cq(card, queue))
3613                 goto out;
3614
3615         QETH_CARD_TEXT_(card, 5, "qcqhe%d", first_element);
3616         QETH_CARD_TEXT_(card, 5, "qcqhc%d", count);
3617         QETH_CARD_TEXT_(card, 5, "qcqherr%d", qdio_err);
3618
3619         if (qdio_err) {
3620                 netif_stop_queue(card->dev);
3621                 qeth_schedule_recovery(card);
3622                 goto out;
3623         }
3624
3625         if (card->options.performance_stats) {
3626                 card->perf_stats.cq_cnt++;
3627                 card->perf_stats.cq_start_time = qeth_get_micros();
3628         }
3629
3630         for (i = first_element; i < first_element + count; ++i) {
3631                 int bidx = i % QDIO_MAX_BUFFERS_PER_Q;
3632                 struct qdio_buffer *buffer = cq->qdio_bufs[bidx];
3633                 int e;
3634
3635                 e = 0;
3636                 while ((e < QDIO_MAX_ELEMENTS_PER_BUFFER) &&
3637                        buffer->element[e].addr) {
3638                         unsigned long phys_aob_addr;
3639
3640                         phys_aob_addr = (unsigned long) buffer->element[e].addr;
3641                         qeth_qdio_handle_aob(card, phys_aob_addr);
3642                         buffer->element[e].addr = NULL;
3643                         buffer->element[e].eflags = 0;
3644                         buffer->element[e].sflags = 0;
3645                         buffer->element[e].length = 0;
3646
3647                         ++e;
3648                 }
3649
3650                 buffer->element[15].eflags = 0;
3651                 buffer->element[15].sflags = 0;
3652         }
3653         rc = do_QDIO(CARD_DDEV(card), QDIO_FLAG_SYNC_INPUT, queue,
3654                     card->qdio.c_q->next_buf_to_init,
3655                     count);
3656         if (rc) {
3657                 dev_warn(&card->gdev->dev,
3658                         "QDIO reported an error, rc=%i\n", rc);
3659                 QETH_CARD_TEXT(card, 2, "qcqherr");
3660         }
3661         card->qdio.c_q->next_buf_to_init = (card->qdio.c_q->next_buf_to_init
3662                                    + count) % QDIO_MAX_BUFFERS_PER_Q;
3663
3664         netif_wake_queue(card->dev);
3665
3666         if (card->options.performance_stats) {
3667                 int delta_t = qeth_get_micros();
3668                 delta_t -= card->perf_stats.cq_start_time;
3669                 card->perf_stats.cq_time += delta_t;
3670         }
3671 out:
3672         return;
3673 }
3674
3675 void qeth_qdio_input_handler(struct ccw_device *ccwdev, unsigned int qdio_err,
3676                 unsigned int queue, int first_elem, int count,
3677                 unsigned long card_ptr)
3678 {
3679         struct qeth_card *card = (struct qeth_card *)card_ptr;
3680
3681         QETH_CARD_TEXT_(card, 2, "qihq%d", queue);
3682         QETH_CARD_TEXT_(card, 2, "qiec%d", qdio_err);
3683
3684         if (qeth_is_cq(card, queue))
3685                 qeth_qdio_cq_handler(card, qdio_err, queue, first_elem, count);
3686         else if (qdio_err)
3687                 qeth_schedule_recovery(card);
3688
3689
3690 }
3691 EXPORT_SYMBOL_GPL(qeth_qdio_input_handler);
3692
3693 void qeth_qdio_output_handler(struct ccw_device *ccwdev,
3694                 unsigned int qdio_error, int __queue, int first_element,
3695                 int count, unsigned long card_ptr)
3696 {
3697         struct qeth_card *card        = (struct qeth_card *) card_ptr;
3698         struct qeth_qdio_out_q *queue = card->qdio.out_qs[__queue];
3699         struct qeth_qdio_out_buffer *buffer;
3700         int i;
3701
3702         QETH_CARD_TEXT(card, 6, "qdouhdl");
3703         if (qdio_error & QDIO_ERROR_FATAL) {
3704                 QETH_CARD_TEXT(card, 2, "achkcond");
3705                 netif_stop_queue(card->dev);
3706                 qeth_schedule_recovery(card);
3707                 return;
3708         }
3709         if (card->options.performance_stats) {
3710                 card->perf_stats.outbound_handler_cnt++;
3711                 card->perf_stats.outbound_handler_start_time =
3712                         qeth_get_micros();
3713         }
3714         for (i = first_element; i < (first_element + count); ++i) {
3715                 int bidx = i % QDIO_MAX_BUFFERS_PER_Q;
3716                 buffer = queue->bufs[bidx];
3717                 qeth_handle_send_error(card, buffer, qdio_error);
3718
3719                 if (queue->bufstates &&
3720                     (queue->bufstates[bidx].flags &
3721                      QDIO_OUTBUF_STATE_FLAG_PENDING) != 0) {
3722                         WARN_ON_ONCE(card->options.cq != QETH_CQ_ENABLED);
3723
3724                         if (atomic_cmpxchg(&buffer->state,
3725                                            QETH_QDIO_BUF_PRIMED,
3726                                            QETH_QDIO_BUF_PENDING) ==
3727                                 QETH_QDIO_BUF_PRIMED) {
3728                                 qeth_notify_skbs(queue, buffer,
3729                                                  TX_NOTIFY_PENDING);
3730                         }
3731                         buffer->aob = queue->bufstates[bidx].aob;
3732                         QETH_CARD_TEXT_(queue->card, 5, "pel%d", bidx);
3733                         QETH_CARD_TEXT(queue->card, 5, "aob");
3734                         QETH_CARD_TEXT_(queue->card, 5, "%lx",
3735                                         virt_to_phys(buffer->aob));
3736                         if (qeth_init_qdio_out_buf(queue, bidx)) {
3737                                 QETH_CARD_TEXT(card, 2, "outofbuf");
3738                                 qeth_schedule_recovery(card);
3739                         }
3740                 } else {
3741                         if (card->options.cq == QETH_CQ_ENABLED) {
3742                                 enum iucv_tx_notify n;
3743
3744                                 n = qeth_compute_cq_notification(
3745                                         buffer->buffer->element[15].sflags, 0);
3746                                 qeth_notify_skbs(queue, buffer, n);
3747                         }
3748
3749                         qeth_clear_output_buffer(queue, buffer,
3750                                                 QETH_QDIO_BUF_EMPTY);
3751                 }
3752                 qeth_cleanup_handled_pending(queue, bidx, 0);
3753         }
3754         atomic_sub(count, &queue->used_buffers);
3755         /* check if we need to do something on this outbound queue */
3756         if (card->info.type != QETH_CARD_TYPE_IQD)
3757                 qeth_check_outbound_queue(queue);
3758
3759         netif_wake_queue(queue->card->dev);
3760         if (card->options.performance_stats)
3761                 card->perf_stats.outbound_handler_time += qeth_get_micros() -
3762                         card->perf_stats.outbound_handler_start_time;
3763 }
3764 EXPORT_SYMBOL_GPL(qeth_qdio_output_handler);
3765
3766 /* We cannot use outbound queue 3 for unicast packets on HiperSockets */
3767 static inline int qeth_cut_iqd_prio(struct qeth_card *card, int queue_num)
3768 {
3769         if ((card->info.type == QETH_CARD_TYPE_IQD) && (queue_num == 3))
3770                 return 2;
3771         return queue_num;
3772 }
3773
3774 /**
3775  * Note: Function assumes that we have 4 outbound queues.
3776  */
3777 int qeth_get_priority_queue(struct qeth_card *card, struct sk_buff *skb,
3778                         int ipv, int cast_type)
3779 {
3780         __be16 *tci;
3781         u8 tos;
3782
3783         if (cast_type && card->info.is_multicast_different)
3784                 return card->info.is_multicast_different &
3785                         (card->qdio.no_out_queues - 1);
3786
3787         switch (card->qdio.do_prio_queueing) {
3788         case QETH_PRIO_Q_ING_TOS:
3789         case QETH_PRIO_Q_ING_PREC:
3790                 switch (ipv) {
3791                 case 4:
3792                         tos = ipv4_get_dsfield(ip_hdr(skb));
3793                         break;
3794                 case 6:
3795                         tos = ipv6_get_dsfield(ipv6_hdr(skb));
3796                         break;
3797                 default:
3798                         return card->qdio.default_out_queue;
3799                 }
3800                 if (card->qdio.do_prio_queueing == QETH_PRIO_Q_ING_PREC)
3801                         return qeth_cut_iqd_prio(card, ~tos >> 6 & 3);
3802                 if (tos & IPTOS_MINCOST)
3803                         return qeth_cut_iqd_prio(card, 3);
3804                 if (tos & IPTOS_RELIABILITY)
3805                         return 2;
3806                 if (tos & IPTOS_THROUGHPUT)
3807                         return 1;
3808                 if (tos & IPTOS_LOWDELAY)
3809                         return 0;
3810                 break;
3811         case QETH_PRIO_Q_ING_SKB:
3812                 if (skb->priority > 5)
3813                         return 0;
3814                 return qeth_cut_iqd_prio(card, ~skb->priority >> 1 & 3);
3815         case QETH_PRIO_Q_ING_VLAN:
3816                 tci = &((struct ethhdr *)skb->data)->h_proto;
3817                 if (be16_to_cpu(*tci) == ETH_P_8021Q)
3818                         return qeth_cut_iqd_prio(card,
3819                         ~be16_to_cpu(*(tci + 1)) >> (VLAN_PRIO_SHIFT + 1) & 3);
3820                 break;
3821         default:
3822                 break;
3823         }
3824         return card->qdio.default_out_queue;
3825 }
3826 EXPORT_SYMBOL_GPL(qeth_get_priority_queue);
3827
3828 /**
3829  * qeth_get_elements_for_frags() -      find number of SBALEs for skb frags.
3830  * @skb:                                SKB address
3831  *
3832  * Returns the number of pages, and thus QDIO buffer elements, needed to cover
3833  * fragmented part of the SKB. Returns zero for linear SKB.
3834  */
3835 int qeth_get_elements_for_frags(struct sk_buff *skb)
3836 {
3837         int cnt, elements = 0;
3838
3839         for (cnt = 0; cnt < skb_shinfo(skb)->nr_frags; cnt++) {
3840                 struct skb_frag_struct *frag = &skb_shinfo(skb)->frags[cnt];
3841
3842                 elements += qeth_get_elements_for_range(
3843                         (addr_t)skb_frag_address(frag),
3844                         (addr_t)skb_frag_address(frag) + skb_frag_size(frag));
3845         }
3846         return elements;
3847 }
3848 EXPORT_SYMBOL_GPL(qeth_get_elements_for_frags);
3849
3850 /**
3851  * qeth_get_elements_no() -     find number of SBALEs for skb data, inc. frags.
3852  * @card:                       qeth card structure, to check max. elems.
3853  * @skb:                        SKB address
3854  * @extra_elems:                extra elems needed, to check against max.
3855  * @data_offset:                range starts at skb->data + data_offset
3856  *
3857  * Returns the number of pages, and thus QDIO buffer elements, needed to cover
3858  * skb data, including linear part and fragments. Checks if the result plus
3859  * extra_elems fits under the limit for the card. Returns 0 if it does not.
3860  * Note: extra_elems is not included in the returned result.
3861  */
3862 int qeth_get_elements_no(struct qeth_card *card,
3863                      struct sk_buff *skb, int extra_elems, int data_offset)
3864 {
3865         addr_t end = (addr_t)skb->data + skb_headlen(skb);
3866         int elements = qeth_get_elements_for_frags(skb);
3867         addr_t start = (addr_t)skb->data + data_offset;
3868
3869         if (start != end)
3870                 elements += qeth_get_elements_for_range(start, end);
3871
3872         if ((elements + extra_elems) > QETH_MAX_BUFFER_ELEMENTS(card)) {
3873                 QETH_DBF_MESSAGE(2, "Invalid size of IP packet "
3874                         "(Number=%d / Length=%d). Discarded.\n",
3875                         elements + extra_elems, skb->len);
3876                 return 0;
3877         }
3878         return elements;
3879 }
3880 EXPORT_SYMBOL_GPL(qeth_get_elements_no);
3881
3882 int qeth_hdr_chk_and_bounce(struct sk_buff *skb, struct qeth_hdr **hdr, int len)
3883 {
3884         int hroom, inpage, rest;
3885
3886         if (((unsigned long)skb->data & PAGE_MASK) !=
3887             (((unsigned long)skb->data + len - 1) & PAGE_MASK)) {
3888                 hroom = skb_headroom(skb);
3889                 inpage = PAGE_SIZE - ((unsigned long) skb->data % PAGE_SIZE);
3890                 rest = len - inpage;
3891                 if (rest > hroom)
3892                         return 1;
3893                 memmove(skb->data - rest, skb->data, skb_headlen(skb));
3894                 skb->data -= rest;
3895                 skb->tail -= rest;
3896                 *hdr = (struct qeth_hdr *)skb->data;
3897                 QETH_DBF_MESSAGE(2, "skb bounce len: %d rest: %d\n", len, rest);
3898         }
3899         return 0;
3900 }
3901 EXPORT_SYMBOL_GPL(qeth_hdr_chk_and_bounce);
3902
3903 /**
3904  * qeth_push_hdr() - push a qeth_hdr onto an skb.
3905  * @skb: skb that the qeth_hdr should be pushed onto.
3906  * @hdr: double pointer to a qeth_hdr. When returning with >= 0,
3907  *       it contains a valid pointer to a qeth_hdr.
3908  * @len: length of the hdr that needs to be pushed on.
3909  *
3910  * Returns the pushed length. If the header can't be pushed on
3911  * (eg. because it would cross a page boundary), it is allocated from
3912  * the cache instead and 0 is returned.
3913  * Error to create the hdr is indicated by returning with < 0.
3914  */
3915 int qeth_push_hdr(struct sk_buff *skb, struct qeth_hdr **hdr, unsigned int len)
3916 {
3917         if (skb_headroom(skb) >= len &&
3918             qeth_get_elements_for_range((addr_t)skb->data - len,
3919                                         (addr_t)skb->data) == 1) {
3920                 *hdr = skb_push(skb, len);
3921                 return len;
3922         }
3923         /* fall back */
3924         *hdr = kmem_cache_alloc(qeth_core_header_cache, GFP_ATOMIC);
3925         if (!*hdr)
3926                 return -ENOMEM;
3927         return 0;
3928 }
3929 EXPORT_SYMBOL_GPL(qeth_push_hdr);
3930
3931 static void __qeth_fill_buffer(struct sk_buff *skb,
3932                                struct qeth_qdio_out_buffer *buf,
3933                                bool is_first_elem, unsigned int offset)
3934 {
3935         struct qdio_buffer *buffer = buf->buffer;
3936         int element = buf->next_element_to_fill;
3937         int length = skb_headlen(skb) - offset;
3938         char *data = skb->data + offset;
3939         int length_here, cnt;
3940
3941         /* map linear part into buffer element(s) */
3942         while (length > 0) {
3943                 /* length_here is the remaining amount of data in this page */
3944                 length_here = PAGE_SIZE - ((unsigned long) data % PAGE_SIZE);
3945                 if (length < length_here)
3946                         length_here = length;
3947
3948                 buffer->element[element].addr = data;
3949                 buffer->element[element].length = length_here;
3950                 length -= length_here;
3951                 if (is_first_elem) {
3952                         is_first_elem = false;
3953                         if (length || skb_is_nonlinear(skb))
3954                                 /* skb needs additional elements */
3955                                 buffer->element[element].eflags =
3956                                         SBAL_EFLAGS_FIRST_FRAG;
3957                         else
3958                                 buffer->element[element].eflags = 0;
3959                 } else {
3960                         buffer->element[element].eflags =
3961                                 SBAL_EFLAGS_MIDDLE_FRAG;
3962                 }
3963                 data += length_here;
3964                 element++;
3965         }
3966
3967         /* map page frags into buffer element(s) */
3968         for (cnt = 0; cnt < skb_shinfo(skb)->nr_frags; cnt++) {
3969                 skb_frag_t *frag = &skb_shinfo(skb)->frags[cnt];
3970
3971                 data = skb_frag_address(frag);
3972                 length = skb_frag_size(frag);
3973                 while (length > 0) {
3974                         length_here = PAGE_SIZE -
3975                                 ((unsigned long) data % PAGE_SIZE);
3976                         if (length < length_here)
3977                                 length_here = length;
3978
3979                         buffer->element[element].addr = data;
3980                         buffer->element[element].length = length_here;
3981                         buffer->element[element].eflags =
3982                                 SBAL_EFLAGS_MIDDLE_FRAG;
3983                         length -= length_here;
3984                         data += length_here;
3985                         element++;
3986                 }
3987         }
3988
3989         if (buffer->element[element - 1].eflags)
3990                 buffer->element[element - 1].eflags = SBAL_EFLAGS_LAST_FRAG;
3991         buf->next_element_to_fill = element;
3992 }
3993
3994 /**
3995  * qeth_fill_buffer() - map skb into an output buffer
3996  * @queue:      QDIO queue to submit the buffer on
3997  * @buf:        buffer to transport the skb
3998  * @skb:        skb to map into the buffer
3999  * @hdr:        qeth_hdr for this skb. Either at skb->data, or allocated
4000  *              from qeth_core_header_cache.
4001  * @offset:     when mapping the skb, start at skb->data + offset
4002  * @hd_len:     if > 0, build a dedicated header element of this size
4003  */
4004 static int qeth_fill_buffer(struct qeth_qdio_out_q *queue,
4005                             struct qeth_qdio_out_buffer *buf,
4006                             struct sk_buff *skb, struct qeth_hdr *hdr,
4007                             unsigned int offset, unsigned int hd_len)
4008 {
4009         struct qdio_buffer *buffer = buf->buffer;
4010         bool is_first_elem = true;
4011         int flush_cnt = 0;
4012
4013         refcount_inc(&skb->users);
4014         skb_queue_tail(&buf->skb_list, skb);
4015
4016         /* build dedicated header element */
4017         if (hd_len) {
4018                 int element = buf->next_element_to_fill;
4019                 is_first_elem = false;
4020
4021                 buffer->element[element].addr = hdr;
4022                 buffer->element[element].length = hd_len;
4023                 buffer->element[element].eflags = SBAL_EFLAGS_FIRST_FRAG;
4024                 /* remember to free cache-allocated qeth_hdr: */
4025                 buf->is_header[element] = ((void *)hdr != skb->data);
4026                 buf->next_element_to_fill++;
4027         }
4028
4029         __qeth_fill_buffer(skb, buf, is_first_elem, offset);
4030
4031         if (!queue->do_pack) {
4032                 QETH_CARD_TEXT(queue->card, 6, "fillbfnp");
4033                 /* set state to PRIMED -> will be flushed */
4034                 atomic_set(&buf->state, QETH_QDIO_BUF_PRIMED);
4035                 flush_cnt = 1;
4036         } else {
4037                 QETH_CARD_TEXT(queue->card, 6, "fillbfpa");
4038                 if (queue->card->options.performance_stats)
4039                         queue->card->perf_stats.skbs_sent_pack++;
4040                 if (buf->next_element_to_fill >=
4041                                 QETH_MAX_BUFFER_ELEMENTS(queue->card)) {
4042                         /*
4043                          * packed buffer if full -> set state PRIMED
4044                          * -> will be flushed
4045                          */
4046                         atomic_set(&buf->state, QETH_QDIO_BUF_PRIMED);
4047                         flush_cnt = 1;
4048                 }
4049         }
4050         return flush_cnt;
4051 }
4052
4053 int qeth_do_send_packet_fast(struct qeth_card *card,
4054                              struct qeth_qdio_out_q *queue, struct sk_buff *skb,
4055                              struct qeth_hdr *hdr, unsigned int offset,
4056                              unsigned int hd_len)
4057 {
4058         struct qeth_qdio_out_buffer *buffer;
4059         int index;
4060
4061         /* spin until we get the queue ... */
4062         while (atomic_cmpxchg(&queue->state, QETH_OUT_Q_UNLOCKED,
4063                               QETH_OUT_Q_LOCKED) != QETH_OUT_Q_UNLOCKED);
4064         /* ... now we've got the queue */
4065         index = queue->next_buf_to_fill;
4066         buffer = queue->bufs[queue->next_buf_to_fill];
4067         /*
4068          * check if buffer is empty to make sure that we do not 'overtake'
4069          * ourselves and try to fill a buffer that is already primed
4070          */
4071         if (atomic_read(&buffer->state) != QETH_QDIO_BUF_EMPTY)
4072                 goto out;
4073         queue->next_buf_to_fill = (queue->next_buf_to_fill + 1) %
4074                                           QDIO_MAX_BUFFERS_PER_Q;
4075         atomic_set(&queue->state, QETH_OUT_Q_UNLOCKED);
4076         qeth_fill_buffer(queue, buffer, skb, hdr, offset, hd_len);
4077         qeth_flush_buffers(queue, index, 1);
4078         return 0;
4079 out:
4080         atomic_set(&queue->state, QETH_OUT_Q_UNLOCKED);
4081         return -EBUSY;
4082 }
4083 EXPORT_SYMBOL_GPL(qeth_do_send_packet_fast);
4084
4085 int qeth_do_send_packet(struct qeth_card *card, struct qeth_qdio_out_q *queue,
4086                         struct sk_buff *skb, struct qeth_hdr *hdr,
4087                         unsigned int offset, unsigned int hd_len,
4088                         int elements_needed)
4089 {
4090         struct qeth_qdio_out_buffer *buffer;
4091         int start_index;
4092         int flush_count = 0;
4093         int do_pack = 0;
4094         int tmp;
4095         int rc = 0;
4096
4097         /* spin until we get the queue ... */
4098         while (atomic_cmpxchg(&queue->state, QETH_OUT_Q_UNLOCKED,
4099                               QETH_OUT_Q_LOCKED) != QETH_OUT_Q_UNLOCKED);
4100         start_index = queue->next_buf_to_fill;
4101         buffer = queue->bufs[queue->next_buf_to_fill];
4102         /*
4103          * check if buffer is empty to make sure that we do not 'overtake'
4104          * ourselves and try to fill a buffer that is already primed
4105          */
4106         if (atomic_read(&buffer->state) != QETH_QDIO_BUF_EMPTY) {
4107                 atomic_set(&queue->state, QETH_OUT_Q_UNLOCKED);
4108                 return -EBUSY;
4109         }
4110         /* check if we need to switch packing state of this queue */
4111         qeth_switch_to_packing_if_needed(queue);
4112         if (queue->do_pack) {
4113                 do_pack = 1;
4114                 /* does packet fit in current buffer? */
4115                 if ((QETH_MAX_BUFFER_ELEMENTS(card) -
4116                     buffer->next_element_to_fill) < elements_needed) {
4117                         /* ... no -> set state PRIMED */
4118                         atomic_set(&buffer->state, QETH_QDIO_BUF_PRIMED);
4119                         flush_count++;
4120                         queue->next_buf_to_fill =
4121                                 (queue->next_buf_to_fill + 1) %
4122                                 QDIO_MAX_BUFFERS_PER_Q;
4123                         buffer = queue->bufs[queue->next_buf_to_fill];
4124                         /* we did a step forward, so check buffer state
4125                          * again */
4126                         if (atomic_read(&buffer->state) !=
4127                             QETH_QDIO_BUF_EMPTY) {
4128                                 qeth_flush_buffers(queue, start_index,
4129                                                            flush_count);
4130                                 atomic_set(&queue->state,
4131                                                 QETH_OUT_Q_UNLOCKED);
4132                                 rc = -EBUSY;
4133                                 goto out;
4134                         }
4135                 }
4136         }
4137         tmp = qeth_fill_buffer(queue, buffer, skb, hdr, offset, hd_len);
4138         queue->next_buf_to_fill = (queue->next_buf_to_fill + tmp) %
4139                                   QDIO_MAX_BUFFERS_PER_Q;
4140         flush_count += tmp;
4141         if (flush_count)
4142                 qeth_flush_buffers(queue, start_index, flush_count);
4143         else if (!atomic_read(&queue->set_pci_flags_count))
4144                 atomic_xchg(&queue->state, QETH_OUT_Q_LOCKED_FLUSH);
4145         /*
4146          * queue->state will go from LOCKED -> UNLOCKED or from
4147          * LOCKED_FLUSH -> LOCKED if output_handler wanted to 'notify' us
4148          * (switch packing state or flush buffer to get another pci flag out).
4149          * In that case we will enter this loop
4150          */
4151         while (atomic_dec_return(&queue->state)) {
4152                 start_index = queue->next_buf_to_fill;
4153                 /* check if we can go back to non-packing state */
4154                 tmp = qeth_switch_to_nonpacking_if_needed(queue);
4155                 /*
4156                  * check if we need to flush a packing buffer to get a pci
4157                  * flag out on the queue
4158                  */
4159                 if (!tmp && !atomic_read(&queue->set_pci_flags_count))
4160                         tmp = qeth_prep_flush_pack_buffer(queue);
4161                 if (tmp) {
4162                         qeth_flush_buffers(queue, start_index, tmp);
4163                         flush_count += tmp;
4164                 }
4165         }
4166 out:
4167         /* at this point the queue is UNLOCKED again */
4168         if (queue->card->options.performance_stats && do_pack)
4169                 queue->card->perf_stats.bufs_sent_pack += flush_count;
4170
4171         return rc;
4172 }
4173 EXPORT_SYMBOL_GPL(qeth_do_send_packet);
4174
4175 static int qeth_setadp_promisc_mode_cb(struct qeth_card *card,
4176                 struct qeth_reply *reply, unsigned long data)
4177 {
4178         struct qeth_ipa_cmd *cmd;
4179         struct qeth_ipacmd_setadpparms *setparms;
4180
4181         QETH_CARD_TEXT(card, 4, "prmadpcb");
4182
4183         cmd = (struct qeth_ipa_cmd *) data;
4184         setparms = &(cmd->data.setadapterparms);
4185
4186         qeth_default_setadapterparms_cb(card, reply, (unsigned long)cmd);
4187         if (cmd->hdr.return_code) {
4188                 QETH_CARD_TEXT_(card, 4, "prmrc%x", cmd->hdr.return_code);
4189                 setparms->data.mode = SET_PROMISC_MODE_OFF;
4190         }
4191         card->info.promisc_mode = setparms->data.mode;
4192         return 0;
4193 }
4194
4195 void qeth_setadp_promisc_mode(struct qeth_card *card)
4196 {
4197         enum qeth_ipa_promisc_modes mode;
4198         struct net_device *dev = card->dev;
4199         struct qeth_cmd_buffer *iob;
4200         struct qeth_ipa_cmd *cmd;
4201
4202         QETH_CARD_TEXT(card, 4, "setprom");
4203
4204         if (((dev->flags & IFF_PROMISC) &&
4205              (card->info.promisc_mode == SET_PROMISC_MODE_ON)) ||
4206             (!(dev->flags & IFF_PROMISC) &&
4207              (card->info.promisc_mode == SET_PROMISC_MODE_OFF)))
4208                 return;
4209         mode = SET_PROMISC_MODE_OFF;
4210         if (dev->flags & IFF_PROMISC)
4211                 mode = SET_PROMISC_MODE_ON;
4212         QETH_CARD_TEXT_(card, 4, "mode:%x", mode);
4213
4214         iob = qeth_get_adapter_cmd(card, IPA_SETADP_SET_PROMISC_MODE,
4215                         sizeof(struct qeth_ipacmd_setadpparms_hdr) + 8);
4216         if (!iob)
4217                 return;
4218         cmd = (struct qeth_ipa_cmd *)(iob->data + IPA_PDU_HEADER_SIZE);
4219         cmd->data.setadapterparms.data.mode = mode;
4220         qeth_send_ipa_cmd(card, iob, qeth_setadp_promisc_mode_cb, NULL);
4221 }
4222 EXPORT_SYMBOL_GPL(qeth_setadp_promisc_mode);
4223
4224 int qeth_change_mtu(struct net_device *dev, int new_mtu)
4225 {
4226         struct qeth_card *card;
4227         char dbf_text[15];
4228
4229         card = dev->ml_priv;
4230
4231         QETH_CARD_TEXT(card, 4, "chgmtu");
4232         sprintf(dbf_text, "%8x", new_mtu);
4233         QETH_CARD_TEXT(card, 4, dbf_text);
4234
4235         if (!qeth_mtu_is_valid(card, new_mtu))
4236                 return -EINVAL;
4237         dev->mtu = new_mtu;
4238         return 0;
4239 }
4240 EXPORT_SYMBOL_GPL(qeth_change_mtu);
4241
4242 struct net_device_stats *qeth_get_stats(struct net_device *dev)
4243 {
4244         struct qeth_card *card;
4245
4246         card = dev->ml_priv;
4247
4248         QETH_CARD_TEXT(card, 5, "getstat");
4249
4250         return &card->stats;
4251 }
4252 EXPORT_SYMBOL_GPL(qeth_get_stats);
4253
4254 static int qeth_setadpparms_change_macaddr_cb(struct qeth_card *card,
4255                 struct qeth_reply *reply, unsigned long data)
4256 {
4257         struct qeth_ipa_cmd *cmd;
4258
4259         QETH_CARD_TEXT(card, 4, "chgmaccb");
4260
4261         cmd = (struct qeth_ipa_cmd *) data;
4262         if (!card->options.layer2 ||
4263             !(card->info.mac_bits & QETH_LAYER2_MAC_READ)) {
4264                 memcpy(card->dev->dev_addr,
4265                        &cmd->data.setadapterparms.data.change_addr.addr,
4266                        OSA_ADDR_LEN);
4267                 card->info.mac_bits |= QETH_LAYER2_MAC_READ;
4268         }
4269         qeth_default_setadapterparms_cb(card, reply, (unsigned long) cmd);
4270         return 0;
4271 }
4272
4273 int qeth_setadpparms_change_macaddr(struct qeth_card *card)
4274 {
4275         int rc;
4276         struct qeth_cmd_buffer *iob;
4277         struct qeth_ipa_cmd *cmd;
4278
4279         QETH_CARD_TEXT(card, 4, "chgmac");
4280
4281         iob = qeth_get_adapter_cmd(card, IPA_SETADP_ALTER_MAC_ADDRESS,
4282                                    sizeof(struct qeth_ipacmd_setadpparms_hdr) +
4283                                    sizeof(struct qeth_change_addr));
4284         if (!iob)
4285                 return -ENOMEM;
4286         cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
4287         cmd->data.setadapterparms.data.change_addr.cmd = CHANGE_ADDR_READ_MAC;
4288         cmd->data.setadapterparms.data.change_addr.addr_size = OSA_ADDR_LEN;
4289         memcpy(&cmd->data.setadapterparms.data.change_addr.addr,
4290                card->dev->dev_addr, OSA_ADDR_LEN);
4291         rc = qeth_send_ipa_cmd(card, iob, qeth_setadpparms_change_macaddr_cb,
4292                                NULL);
4293         return rc;
4294 }
4295 EXPORT_SYMBOL_GPL(qeth_setadpparms_change_macaddr);
4296
4297 static int qeth_setadpparms_set_access_ctrl_cb(struct qeth_card *card,
4298                 struct qeth_reply *reply, unsigned long data)
4299 {
4300         struct qeth_ipa_cmd *cmd;
4301         struct qeth_set_access_ctrl *access_ctrl_req;
4302         int fallback = *(int *)reply->param;
4303
4304         QETH_CARD_TEXT(card, 4, "setaccb");
4305
4306         cmd = (struct qeth_ipa_cmd *) data;
4307         access_ctrl_req = &cmd->data.setadapterparms.data.set_access_ctrl;
4308         QETH_DBF_TEXT_(SETUP, 2, "setaccb");
4309         QETH_DBF_TEXT_(SETUP, 2, "%s", card->gdev->dev.kobj.name);
4310         QETH_DBF_TEXT_(SETUP, 2, "rc=%d",
4311                 cmd->data.setadapterparms.hdr.return_code);
4312         if (cmd->data.setadapterparms.hdr.return_code !=
4313                                                 SET_ACCESS_CTRL_RC_SUCCESS)
4314                 QETH_DBF_MESSAGE(3, "ERR:SET_ACCESS_CTRL(%s,%d)==%d\n",
4315                                 card->gdev->dev.kobj.name,
4316                                 access_ctrl_req->subcmd_code,
4317                                 cmd->data.setadapterparms.hdr.return_code);
4318         switch (cmd->data.setadapterparms.hdr.return_code) {
4319         case SET_ACCESS_CTRL_RC_SUCCESS:
4320                 if (card->options.isolation == ISOLATION_MODE_NONE) {
4321                         dev_info(&card->gdev->dev,
4322                             "QDIO data connection isolation is deactivated\n");
4323                 } else {
4324                         dev_info(&card->gdev->dev,
4325                             "QDIO data connection isolation is activated\n");
4326                 }
4327                 break;
4328         case SET_ACCESS_CTRL_RC_ALREADY_NOT_ISOLATED:
4329                 QETH_DBF_MESSAGE(2, "%s QDIO data connection isolation already "
4330                                 "deactivated\n", dev_name(&card->gdev->dev));
4331                 if (fallback)
4332                         card->options.isolation = card->options.prev_isolation;
4333                 break;
4334         case SET_ACCESS_CTRL_RC_ALREADY_ISOLATED:
4335                 QETH_DBF_MESSAGE(2, "%s QDIO data connection isolation already"
4336                                 " activated\n", dev_name(&card->gdev->dev));
4337                 if (fallback)
4338                         card->options.isolation = card->options.prev_isolation;
4339                 break;
4340         case SET_ACCESS_CTRL_RC_NOT_SUPPORTED:
4341                 dev_err(&card->gdev->dev, "Adapter does not "
4342                         "support QDIO data connection isolation\n");
4343                 break;
4344         case SET_ACCESS_CTRL_RC_NONE_SHARED_ADAPTER:
4345                 dev_err(&card->gdev->dev,
4346                         "Adapter is dedicated. "
4347                         "QDIO data connection isolation not supported\n");
4348                 if (fallback)
4349                         card->options.isolation = card->options.prev_isolation;
4350                 break;
4351         case SET_ACCESS_CTRL_RC_ACTIVE_CHECKSUM_OFF:
4352                 dev_err(&card->gdev->dev,
4353                         "TSO does not permit QDIO data connection isolation\n");
4354                 if (fallback)
4355                         card->options.isolation = card->options.prev_isolation;
4356                 break;
4357         case SET_ACCESS_CTRL_RC_REFLREL_UNSUPPORTED:
4358                 dev_err(&card->gdev->dev, "The adjacent switch port does not "
4359                         "support reflective relay mode\n");
4360                 if (fallback)
4361                         card->options.isolation = card->options.prev_isolation;
4362                 break;
4363         case SET_ACCESS_CTRL_RC_REFLREL_FAILED:
4364                 dev_err(&card->gdev->dev, "The reflective relay mode cannot be "
4365                                         "enabled at the adjacent switch port");
4366                 if (fallback)
4367                         card->options.isolation = card->options.prev_isolation;
4368                 break;
4369         case SET_ACCESS_CTRL_RC_REFLREL_DEACT_FAILED:
4370                 dev_warn(&card->gdev->dev, "Turning off reflective relay mode "
4371                                         "at the adjacent switch failed\n");
4372                 break;
4373         default:
4374                 /* this should never happen */
4375                 if (fallback)
4376                         card->options.isolation = card->options.prev_isolation;
4377                 break;
4378         }
4379         qeth_default_setadapterparms_cb(card, reply, (unsigned long) cmd);
4380         return 0;
4381 }
4382
4383 static int qeth_setadpparms_set_access_ctrl(struct qeth_card *card,
4384                 enum qeth_ipa_isolation_modes isolation, int fallback)
4385 {
4386         int rc;
4387         struct qeth_cmd_buffer *iob;
4388         struct qeth_ipa_cmd *cmd;
4389         struct qeth_set_access_ctrl *access_ctrl_req;
4390
4391         QETH_CARD_TEXT(card, 4, "setacctl");
4392
4393         QETH_DBF_TEXT_(SETUP, 2, "setacctl");
4394         QETH_DBF_TEXT_(SETUP, 2, "%s", card->gdev->dev.kobj.name);
4395
4396         iob = qeth_get_adapter_cmd(card, IPA_SETADP_SET_ACCESS_CONTROL,
4397                                    sizeof(struct qeth_ipacmd_setadpparms_hdr) +
4398                                    sizeof(struct qeth_set_access_ctrl));
4399         if (!iob)
4400                 return -ENOMEM;
4401         cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
4402         access_ctrl_req = &cmd->data.setadapterparms.data.set_access_ctrl;
4403         access_ctrl_req->subcmd_code = isolation;
4404
4405         rc = qeth_send_ipa_cmd(card, iob, qeth_setadpparms_set_access_ctrl_cb,
4406                                &fallback);
4407         QETH_DBF_TEXT_(SETUP, 2, "rc=%d", rc);
4408         return rc;
4409 }
4410
4411 int qeth_set_access_ctrl_online(struct qeth_card *card, int fallback)
4412 {
4413         int rc = 0;
4414
4415         QETH_CARD_TEXT(card, 4, "setactlo");
4416
4417         if ((card->info.type == QETH_CARD_TYPE_OSD ||
4418              card->info.type == QETH_CARD_TYPE_OSX) &&
4419              qeth_adp_supported(card, IPA_SETADP_SET_ACCESS_CONTROL)) {
4420                 rc = qeth_setadpparms_set_access_ctrl(card,
4421                         card->options.isolation, fallback);
4422                 if (rc) {
4423                         QETH_DBF_MESSAGE(3,
4424                                 "IPA(SET_ACCESS_CTRL,%s,%d) sent failed\n",
4425                                 card->gdev->dev.kobj.name,
4426                                 rc);
4427                         rc = -EOPNOTSUPP;
4428                 }
4429         } else if (card->options.isolation != ISOLATION_MODE_NONE) {
4430                 card->options.isolation = ISOLATION_MODE_NONE;
4431
4432                 dev_err(&card->gdev->dev, "Adapter does not "
4433                         "support QDIO data connection isolation\n");
4434                 rc = -EOPNOTSUPP;
4435         }
4436         return rc;
4437 }
4438 EXPORT_SYMBOL_GPL(qeth_set_access_ctrl_online);
4439
4440 void qeth_tx_timeout(struct net_device *dev)
4441 {
4442         struct qeth_card *card;
4443
4444         card = dev->ml_priv;
4445         QETH_CARD_TEXT(card, 4, "txtimeo");
4446         card->stats.tx_errors++;
4447         qeth_schedule_recovery(card);
4448 }
4449 EXPORT_SYMBOL_GPL(qeth_tx_timeout);
4450
4451 static int qeth_mdio_read(struct net_device *dev, int phy_id, int regnum)
4452 {
4453         struct qeth_card *card = dev->ml_priv;
4454         int rc = 0;
4455
4456         switch (regnum) {
4457         case MII_BMCR: /* Basic mode control register */
4458                 rc = BMCR_FULLDPLX;
4459                 if ((card->info.link_type != QETH_LINK_TYPE_GBIT_ETH) &&
4460                     (card->info.link_type != QETH_LINK_TYPE_OSN) &&
4461                     (card->info.link_type != QETH_LINK_TYPE_10GBIT_ETH))
4462                         rc |= BMCR_SPEED100;
4463                 break;
4464         case MII_BMSR: /* Basic mode status register */
4465                 rc = BMSR_ERCAP | BMSR_ANEGCOMPLETE | BMSR_LSTATUS |
4466                      BMSR_10HALF | BMSR_10FULL | BMSR_100HALF | BMSR_100FULL |
4467                      BMSR_100BASE4;
4468                 break;
4469         case MII_PHYSID1: /* PHYS ID 1 */
4470                 rc = (dev->dev_addr[0] << 16) | (dev->dev_addr[1] << 8) |
4471                      dev->dev_addr[2];
4472                 rc = (rc >> 5) & 0xFFFF;
4473                 break;
4474         case MII_PHYSID2: /* PHYS ID 2 */
4475                 rc = (dev->dev_addr[2] << 10) & 0xFFFF;
4476                 break;
4477         case MII_ADVERTISE: /* Advertisement control reg */
4478                 rc = ADVERTISE_ALL;
4479                 break;
4480         case MII_LPA: /* Link partner ability reg */
4481                 rc = LPA_10HALF | LPA_10FULL | LPA_100HALF | LPA_100FULL |
4482                      LPA_100BASE4 | LPA_LPACK;
4483                 break;
4484         case MII_EXPANSION: /* Expansion register */
4485                 break;
4486         case MII_DCOUNTER: /* disconnect counter */
4487                 break;
4488         case MII_FCSCOUNTER: /* false carrier counter */
4489                 break;
4490         case MII_NWAYTEST: /* N-way auto-neg test register */
4491                 break;
4492         case MII_RERRCOUNTER: /* rx error counter */
4493                 rc = card->stats.rx_errors;
4494                 break;
4495         case MII_SREVISION: /* silicon revision */
4496                 break;
4497         case MII_RESV1: /* reserved 1 */
4498                 break;
4499         case MII_LBRERROR: /* loopback, rx, bypass error */
4500                 break;
4501         case MII_PHYADDR: /* physical address */
4502                 break;
4503         case MII_RESV2: /* reserved 2 */
4504                 break;
4505         case MII_TPISTATUS: /* TPI status for 10mbps */
4506                 break;
4507         case MII_NCONFIG: /* network interface config */
4508                 break;
4509         default:
4510                 break;
4511         }
4512         return rc;
4513 }
4514
4515 static int qeth_send_ipa_snmp_cmd(struct qeth_card *card,
4516                 struct qeth_cmd_buffer *iob, int len,
4517                 int (*reply_cb)(struct qeth_card *, struct qeth_reply *,
4518                         unsigned long),
4519                 void *reply_param)
4520 {
4521         u16 s1, s2;
4522
4523         QETH_CARD_TEXT(card, 4, "sendsnmp");
4524
4525         memcpy(iob->data, IPA_PDU_HEADER, IPA_PDU_HEADER_SIZE);
4526         memcpy(QETH_IPA_CMD_DEST_ADDR(iob->data),
4527                &card->token.ulp_connection_r, QETH_MPC_TOKEN_LENGTH);
4528         /* adjust PDU length fields in IPA_PDU_HEADER */
4529         s1 = (u32) IPA_PDU_HEADER_SIZE + len;
4530         s2 = (u32) len;
4531         memcpy(QETH_IPA_PDU_LEN_TOTAL(iob->data), &s1, 2);
4532         memcpy(QETH_IPA_PDU_LEN_PDU1(iob->data), &s2, 2);
4533         memcpy(QETH_IPA_PDU_LEN_PDU2(iob->data), &s2, 2);
4534         memcpy(QETH_IPA_PDU_LEN_PDU3(iob->data), &s2, 2);
4535         return qeth_send_control_data(card, IPA_PDU_HEADER_SIZE + len, iob,
4536                                       reply_cb, reply_param);
4537 }
4538
4539 static int qeth_snmp_command_cb(struct qeth_card *card,
4540                 struct qeth_reply *reply, unsigned long sdata)
4541 {
4542         struct qeth_ipa_cmd *cmd;
4543         struct qeth_arp_query_info *qinfo;
4544         struct qeth_snmp_cmd *snmp;
4545         unsigned char *data;
4546         __u16 data_len;
4547
4548         QETH_CARD_TEXT(card, 3, "snpcmdcb");
4549
4550         cmd = (struct qeth_ipa_cmd *) sdata;
4551         data = (unsigned char *)((char *)cmd - reply->offset);
4552         qinfo = (struct qeth_arp_query_info *) reply->param;
4553         snmp = &cmd->data.setadapterparms.data.snmp;
4554
4555         if (cmd->hdr.return_code) {
4556                 QETH_CARD_TEXT_(card, 4, "scer1%x", cmd->hdr.return_code);
4557                 return 0;
4558         }
4559         if (cmd->data.setadapterparms.hdr.return_code) {
4560                 cmd->hdr.return_code =
4561                         cmd->data.setadapterparms.hdr.return_code;
4562                 QETH_CARD_TEXT_(card, 4, "scer2%x", cmd->hdr.return_code);
4563                 return 0;
4564         }
4565         data_len = *((__u16 *)QETH_IPA_PDU_LEN_PDU1(data));
4566         if (cmd->data.setadapterparms.hdr.seq_no == 1)
4567                 data_len -= (__u16)((char *)&snmp->data - (char *)cmd);
4568         else
4569                 data_len -= (__u16)((char *)&snmp->request - (char *)cmd);
4570
4571         /* check if there is enough room in userspace */
4572         if ((qinfo->udata_len - qinfo->udata_offset) < data_len) {
4573                 QETH_CARD_TEXT_(card, 4, "scer3%i", -ENOMEM);
4574                 cmd->hdr.return_code = IPA_RC_ENOMEM;
4575                 return 0;
4576         }
4577         QETH_CARD_TEXT_(card, 4, "snore%i",
4578                        cmd->data.setadapterparms.hdr.used_total);
4579         QETH_CARD_TEXT_(card, 4, "sseqn%i",
4580                 cmd->data.setadapterparms.hdr.seq_no);
4581         /*copy entries to user buffer*/
4582         if (cmd->data.setadapterparms.hdr.seq_no == 1) {
4583                 memcpy(qinfo->udata + qinfo->udata_offset,
4584                        (char *)snmp,
4585                        data_len + offsetof(struct qeth_snmp_cmd, data));
4586                 qinfo->udata_offset += offsetof(struct qeth_snmp_cmd, data);
4587         } else {
4588                 memcpy(qinfo->udata + qinfo->udata_offset,
4589                        (char *)&snmp->request, data_len);
4590         }
4591         qinfo->udata_offset += data_len;
4592         /* check if all replies received ... */
4593                 QETH_CARD_TEXT_(card, 4, "srtot%i",
4594                                cmd->data.setadapterparms.hdr.used_total);
4595                 QETH_CARD_TEXT_(card, 4, "srseq%i",
4596                                cmd->data.setadapterparms.hdr.seq_no);
4597         if (cmd->data.setadapterparms.hdr.seq_no <
4598             cmd->data.setadapterparms.hdr.used_total)
4599                 return 1;
4600         return 0;
4601 }
4602
4603 static int qeth_snmp_command(struct qeth_card *card, char __user *udata)
4604 {
4605         struct qeth_cmd_buffer *iob;
4606         struct qeth_ipa_cmd *cmd;
4607         struct qeth_snmp_ureq *ureq;
4608         unsigned int req_len;
4609         struct qeth_arp_query_info qinfo = {0, };
4610         int rc = 0;
4611
4612         QETH_CARD_TEXT(card, 3, "snmpcmd");
4613
4614         if (card->info.guestlan)
4615                 return -EOPNOTSUPP;
4616
4617         if ((!qeth_adp_supported(card, IPA_SETADP_SET_SNMP_CONTROL)) &&
4618             (!card->options.layer2)) {
4619                 return -EOPNOTSUPP;
4620         }
4621         /* skip 4 bytes (data_len struct member) to get req_len */
4622         if (copy_from_user(&req_len, udata + sizeof(int), sizeof(int)))
4623                 return -EFAULT;
4624         if (req_len > (QETH_BUFSIZE - IPA_PDU_HEADER_SIZE -
4625                        sizeof(struct qeth_ipacmd_hdr) -
4626                        sizeof(struct qeth_ipacmd_setadpparms_hdr)))
4627                 return -EINVAL;
4628         ureq = memdup_user(udata, req_len + sizeof(struct qeth_snmp_ureq_hdr));
4629         if (IS_ERR(ureq)) {
4630                 QETH_CARD_TEXT(card, 2, "snmpnome");
4631                 return PTR_ERR(ureq);
4632         }
4633         qinfo.udata_len = ureq->hdr.data_len;
4634         qinfo.udata = kzalloc(qinfo.udata_len, GFP_KERNEL);
4635         if (!qinfo.udata) {
4636                 kfree(ureq);
4637                 return -ENOMEM;
4638         }
4639         qinfo.udata_offset = sizeof(struct qeth_snmp_ureq_hdr);
4640
4641         iob = qeth_get_adapter_cmd(card, IPA_SETADP_SET_SNMP_CONTROL,
4642                                    QETH_SNMP_SETADP_CMDLENGTH + req_len);
4643         if (!iob) {
4644                 rc = -ENOMEM;
4645                 goto out;
4646         }
4647         cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
4648         memcpy(&cmd->data.setadapterparms.data.snmp, &ureq->cmd, req_len);
4649         rc = qeth_send_ipa_snmp_cmd(card, iob, QETH_SETADP_BASE_LEN + req_len,
4650                                     qeth_snmp_command_cb, (void *)&qinfo);
4651         if (rc)
4652                 QETH_DBF_MESSAGE(2, "SNMP command failed on %s: (0x%x)\n",
4653                            QETH_CARD_IFNAME(card), rc);
4654         else {
4655                 if (copy_to_user(udata, qinfo.udata, qinfo.udata_len))
4656                         rc = -EFAULT;
4657         }
4658 out:
4659         kfree(ureq);
4660         kfree(qinfo.udata);
4661         return rc;
4662 }
4663
4664 static int qeth_setadpparms_query_oat_cb(struct qeth_card *card,
4665                 struct qeth_reply *reply, unsigned long data)
4666 {
4667         struct qeth_ipa_cmd *cmd;
4668         struct qeth_qoat_priv *priv;
4669         char *resdata;
4670         int resdatalen;
4671
4672         QETH_CARD_TEXT(card, 3, "qoatcb");
4673
4674         cmd = (struct qeth_ipa_cmd *)data;
4675         priv = (struct qeth_qoat_priv *)reply->param;
4676         resdatalen = cmd->data.setadapterparms.hdr.cmdlength;
4677         resdata = (char *)data + 28;
4678
4679         if (resdatalen > (priv->buffer_len - priv->response_len)) {
4680                 cmd->hdr.return_code = IPA_RC_FFFF;
4681                 return 0;
4682         }
4683
4684         memcpy((priv->buffer + priv->response_len), resdata,
4685                 resdatalen);
4686         priv->response_len += resdatalen;
4687
4688         if (cmd->data.setadapterparms.hdr.seq_no <
4689             cmd->data.setadapterparms.hdr.used_total)
4690                 return 1;
4691         return 0;
4692 }
4693
4694 static int qeth_query_oat_command(struct qeth_card *card, char __user *udata)
4695 {
4696         int rc = 0;
4697         struct qeth_cmd_buffer *iob;
4698         struct qeth_ipa_cmd *cmd;
4699         struct qeth_query_oat *oat_req;
4700         struct qeth_query_oat_data oat_data;
4701         struct qeth_qoat_priv priv;
4702         void __user *tmp;
4703
4704         QETH_CARD_TEXT(card, 3, "qoatcmd");
4705
4706         if (!qeth_adp_supported(card, IPA_SETADP_QUERY_OAT)) {
4707                 rc = -EOPNOTSUPP;
4708                 goto out;
4709         }
4710
4711         if (copy_from_user(&oat_data, udata,
4712             sizeof(struct qeth_query_oat_data))) {
4713                         rc = -EFAULT;
4714                         goto out;
4715         }
4716
4717         priv.buffer_len = oat_data.buffer_len;
4718         priv.response_len = 0;
4719         priv.buffer =  kzalloc(oat_data.buffer_len, GFP_KERNEL);
4720         if (!priv.buffer) {
4721                 rc = -ENOMEM;
4722                 goto out;
4723         }
4724
4725         iob = qeth_get_adapter_cmd(card, IPA_SETADP_QUERY_OAT,
4726                                    sizeof(struct qeth_ipacmd_setadpparms_hdr) +
4727                                    sizeof(struct qeth_query_oat));
4728         if (!iob) {
4729                 rc = -ENOMEM;
4730                 goto out_free;
4731         }
4732         cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
4733         oat_req = &cmd->data.setadapterparms.data.query_oat;
4734         oat_req->subcmd_code = oat_data.command;
4735
4736         rc = qeth_send_ipa_cmd(card, iob, qeth_setadpparms_query_oat_cb,
4737                                &priv);
4738         if (!rc) {
4739                 if (is_compat_task())
4740                         tmp = compat_ptr(oat_data.ptr);
4741                 else
4742                         tmp = (void __user *)(unsigned long)oat_data.ptr;
4743
4744                 if (copy_to_user(tmp, priv.buffer,
4745                     priv.response_len)) {
4746                         rc = -EFAULT;
4747                         goto out_free;
4748                 }
4749
4750                 oat_data.response_len = priv.response_len;
4751
4752                 if (copy_to_user(udata, &oat_data,
4753                     sizeof(struct qeth_query_oat_data)))
4754                         rc = -EFAULT;
4755         } else
4756                 if (rc == IPA_RC_FFFF)
4757                         rc = -EFAULT;
4758
4759 out_free:
4760         kfree(priv.buffer);
4761 out:
4762         return rc;
4763 }
4764
4765 static int qeth_query_card_info_cb(struct qeth_card *card,
4766                                    struct qeth_reply *reply, unsigned long data)
4767 {
4768         struct qeth_ipa_cmd *cmd;
4769         struct qeth_query_card_info *card_info;
4770         struct carrier_info *carrier_info;
4771
4772         QETH_CARD_TEXT(card, 2, "qcrdincb");
4773         carrier_info = (struct carrier_info *)reply->param;
4774         cmd = (struct qeth_ipa_cmd *)data;
4775         card_info = &cmd->data.setadapterparms.data.card_info;
4776         if (cmd->data.setadapterparms.hdr.return_code == 0) {
4777                 carrier_info->card_type = card_info->card_type;
4778                 carrier_info->port_mode = card_info->port_mode;
4779                 carrier_info->port_speed = card_info->port_speed;
4780         }
4781
4782         qeth_default_setadapterparms_cb(card, reply, (unsigned long) cmd);
4783         return 0;
4784 }
4785
4786 static int qeth_query_card_info(struct qeth_card *card,
4787                                 struct carrier_info *carrier_info)
4788 {
4789         struct qeth_cmd_buffer *iob;
4790
4791         QETH_CARD_TEXT(card, 2, "qcrdinfo");
4792         if (!qeth_adp_supported(card, IPA_SETADP_QUERY_CARD_INFO))
4793                 return -EOPNOTSUPP;
4794         iob = qeth_get_adapter_cmd(card, IPA_SETADP_QUERY_CARD_INFO,
4795                 sizeof(struct qeth_ipacmd_setadpparms_hdr));
4796         if (!iob)
4797                 return -ENOMEM;
4798         return qeth_send_ipa_cmd(card, iob, qeth_query_card_info_cb,
4799                                         (void *)carrier_info);
4800 }
4801
4802 /**
4803  * qeth_vm_request_mac() - Request a hypervisor-managed MAC address
4804  * @card: pointer to a qeth_card
4805  *
4806  * Returns
4807  *      0, if a MAC address has been set for the card's netdevice
4808  *      a return code, for various error conditions
4809  */
4810 int qeth_vm_request_mac(struct qeth_card *card)
4811 {
4812         struct diag26c_mac_resp *response;
4813         struct diag26c_mac_req *request;
4814         struct ccw_dev_id id;
4815         int rc;
4816
4817         QETH_DBF_TEXT(SETUP, 2, "vmreqmac");
4818
4819         if (!card->dev)
4820                 return -ENODEV;
4821
4822         request = kzalloc(sizeof(*request), GFP_KERNEL | GFP_DMA);
4823         response = kzalloc(sizeof(*response), GFP_KERNEL | GFP_DMA);
4824         if (!request || !response) {
4825                 rc = -ENOMEM;
4826                 goto out;
4827         }
4828
4829         ccw_device_get_id(CARD_DDEV(card), &id);
4830         request->resp_buf_len = sizeof(*response);
4831         request->resp_version = DIAG26C_VERSION2;
4832         request->op_code = DIAG26C_GET_MAC;
4833         request->devno = id.devno;
4834
4835         rc = diag26c(request, response, DIAG26C_MAC_SERVICES);
4836         if (rc)
4837                 goto out;
4838
4839         if (request->resp_buf_len < sizeof(*response) ||
4840             response->version != request->resp_version) {
4841                 rc = -EIO;
4842                 QETH_DBF_TEXT(SETUP, 2, "badresp");
4843                 QETH_DBF_HEX(SETUP, 2, &request->resp_buf_len,
4844                              sizeof(request->resp_buf_len));
4845         } else if (!is_valid_ether_addr(response->mac)) {
4846                 rc = -EINVAL;
4847                 QETH_DBF_TEXT(SETUP, 2, "badmac");
4848                 QETH_DBF_HEX(SETUP, 2, response->mac, ETH_ALEN);
4849         } else {
4850                 ether_addr_copy(card->dev->dev_addr, response->mac);
4851         }
4852
4853 out:
4854         kfree(response);
4855         kfree(request);
4856         return rc;
4857 }
4858 EXPORT_SYMBOL_GPL(qeth_vm_request_mac);
4859
4860 static int qeth_get_qdio_q_format(struct qeth_card *card)
4861 {
4862         if (card->info.type == QETH_CARD_TYPE_IQD)
4863                 return QDIO_IQDIO_QFMT;
4864         else
4865                 return QDIO_QETH_QFMT;
4866 }
4867
4868 static void qeth_determine_capabilities(struct qeth_card *card)
4869 {
4870         int rc;
4871         int length;
4872         char *prcd;
4873         struct ccw_device *ddev;
4874         int ddev_offline = 0;
4875
4876         QETH_DBF_TEXT(SETUP, 2, "detcapab");
4877         ddev = CARD_DDEV(card);
4878         if (!ddev->online) {
4879                 ddev_offline = 1;
4880                 rc = ccw_device_set_online(ddev);
4881                 if (rc) {
4882                         QETH_DBF_TEXT_(SETUP, 2, "3err%d", rc);
4883                         goto out;
4884                 }
4885         }
4886
4887         rc = qeth_read_conf_data(card, (void **) &prcd, &length);
4888         if (rc) {
4889                 QETH_DBF_MESSAGE(2, "%s qeth_read_conf_data returned %i\n",
4890                         dev_name(&card->gdev->dev), rc);
4891                 QETH_DBF_TEXT_(SETUP, 2, "5err%d", rc);
4892                 goto out_offline;
4893         }
4894         qeth_configure_unitaddr(card, prcd);
4895         if (ddev_offline)
4896                 qeth_configure_blkt_default(card, prcd);
4897         kfree(prcd);
4898
4899         rc = qdio_get_ssqd_desc(ddev, &card->ssqd);
4900         if (rc)
4901                 QETH_DBF_TEXT_(SETUP, 2, "6err%d", rc);
4902
4903         QETH_DBF_TEXT_(SETUP, 2, "qfmt%d", card->ssqd.qfmt);
4904         QETH_DBF_TEXT_(SETUP, 2, "ac1:%02x", card->ssqd.qdioac1);
4905         QETH_DBF_TEXT_(SETUP, 2, "ac2:%04x", card->ssqd.qdioac2);
4906         QETH_DBF_TEXT_(SETUP, 2, "ac3:%04x", card->ssqd.qdioac3);
4907         QETH_DBF_TEXT_(SETUP, 2, "icnt%d", card->ssqd.icnt);
4908         if (!((card->ssqd.qfmt != QDIO_IQDIO_QFMT) ||
4909             ((card->ssqd.qdioac1 & CHSC_AC1_INITIATE_INPUTQ) == 0) ||
4910             ((card->ssqd.qdioac3 & CHSC_AC3_FORMAT2_CQ_AVAILABLE) == 0))) {
4911                 dev_info(&card->gdev->dev,
4912                         "Completion Queueing supported\n");
4913         } else {
4914                 card->options.cq = QETH_CQ_NOTAVAILABLE;
4915         }
4916
4917
4918 out_offline:
4919         if (ddev_offline == 1)
4920                 ccw_device_set_offline(ddev);
4921 out:
4922         return;
4923 }
4924
4925 static void qeth_qdio_establish_cq(struct qeth_card *card,
4926                                    struct qdio_buffer **in_sbal_ptrs,
4927                                    void (**queue_start_poll)
4928                                         (struct ccw_device *, int,
4929                                          unsigned long))
4930 {
4931         int i;
4932
4933         if (card->options.cq == QETH_CQ_ENABLED) {
4934                 int offset = QDIO_MAX_BUFFERS_PER_Q *
4935                              (card->qdio.no_in_queues - 1);
4936                 i = QDIO_MAX_BUFFERS_PER_Q * (card->qdio.no_in_queues - 1);
4937                 for (i = 0; i < QDIO_MAX_BUFFERS_PER_Q; ++i) {
4938                         in_sbal_ptrs[offset + i] = (struct qdio_buffer *)
4939                                 virt_to_phys(card->qdio.c_q->bufs[i].buffer);
4940                 }
4941
4942                 queue_start_poll[card->qdio.no_in_queues - 1] = NULL;
4943         }
4944 }
4945
4946 static int qeth_qdio_establish(struct qeth_card *card)
4947 {
4948         struct qdio_initialize init_data;
4949         char *qib_param_field;
4950         struct qdio_buffer **in_sbal_ptrs;
4951         void (**queue_start_poll) (struct ccw_device *, int, unsigned long);
4952         struct qdio_buffer **out_sbal_ptrs;
4953         int i, j, k;
4954         int rc = 0;
4955
4956         QETH_DBF_TEXT(SETUP, 2, "qdioest");
4957
4958         qib_param_field = kzalloc(QDIO_MAX_BUFFERS_PER_Q * sizeof(char),
4959                               GFP_KERNEL);
4960         if (!qib_param_field) {
4961                 rc =  -ENOMEM;
4962                 goto out_free_nothing;
4963         }
4964
4965         qeth_create_qib_param_field(card, qib_param_field);
4966         qeth_create_qib_param_field_blkt(card, qib_param_field);
4967
4968         in_sbal_ptrs = kzalloc(card->qdio.no_in_queues *
4969                                QDIO_MAX_BUFFERS_PER_Q * sizeof(void *),
4970                                GFP_KERNEL);
4971         if (!in_sbal_ptrs) {
4972                 rc = -ENOMEM;
4973                 goto out_free_qib_param;
4974         }
4975         for (i = 0; i < QDIO_MAX_BUFFERS_PER_Q; ++i) {
4976                 in_sbal_ptrs[i] = (struct qdio_buffer *)
4977                         virt_to_phys(card->qdio.in_q->bufs[i].buffer);
4978         }
4979
4980         queue_start_poll = kzalloc(sizeof(void *) * card->qdio.no_in_queues,
4981                                    GFP_KERNEL);
4982         if (!queue_start_poll) {
4983                 rc = -ENOMEM;
4984                 goto out_free_in_sbals;
4985         }
4986         for (i = 0; i < card->qdio.no_in_queues; ++i)
4987                 queue_start_poll[i] = card->discipline->start_poll;
4988
4989         qeth_qdio_establish_cq(card, in_sbal_ptrs, queue_start_poll);
4990
4991         out_sbal_ptrs =
4992                 kzalloc(card->qdio.no_out_queues * QDIO_MAX_BUFFERS_PER_Q *
4993                         sizeof(void *), GFP_KERNEL);
4994         if (!out_sbal_ptrs) {
4995                 rc = -ENOMEM;
4996                 goto out_free_queue_start_poll;
4997         }
4998         for (i = 0, k = 0; i < card->qdio.no_out_queues; ++i)
4999                 for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; ++j, ++k) {
5000                         out_sbal_ptrs[k] = (struct qdio_buffer *)virt_to_phys(
5001                                 card->qdio.out_qs[i]->bufs[j]->buffer);
5002                 }
5003
5004         memset(&init_data, 0, sizeof(struct qdio_initialize));
5005         init_data.cdev                   = CARD_DDEV(card);
5006         init_data.q_format               = qeth_get_qdio_q_format(card);
5007         init_data.qib_param_field_format = 0;
5008         init_data.qib_param_field        = qib_param_field;
5009         init_data.no_input_qs            = card->qdio.no_in_queues;
5010         init_data.no_output_qs           = card->qdio.no_out_queues;
5011         init_data.input_handler          = card->discipline->input_handler;
5012         init_data.output_handler         = card->discipline->output_handler;
5013         init_data.queue_start_poll_array = queue_start_poll;
5014         init_data.int_parm               = (unsigned long) card;
5015         init_data.input_sbal_addr_array  = (void **) in_sbal_ptrs;
5016         init_data.output_sbal_addr_array = (void **) out_sbal_ptrs;
5017         init_data.output_sbal_state_array = card->qdio.out_bufstates;
5018         init_data.scan_threshold =
5019                 (card->info.type == QETH_CARD_TYPE_IQD) ? 1 : 32;
5020
5021         if (atomic_cmpxchg(&card->qdio.state, QETH_QDIO_ALLOCATED,
5022                 QETH_QDIO_ESTABLISHED) == QETH_QDIO_ALLOCATED) {
5023                 rc = qdio_allocate(&init_data);
5024                 if (rc) {
5025                         atomic_set(&card->qdio.state, QETH_QDIO_ALLOCATED);
5026                         goto out;
5027                 }
5028                 rc = qdio_establish(&init_data);
5029                 if (rc) {
5030                         atomic_set(&card->qdio.state, QETH_QDIO_ALLOCATED);
5031                         qdio_free(CARD_DDEV(card));
5032                 }
5033         }
5034
5035         switch (card->options.cq) {
5036         case QETH_CQ_ENABLED:
5037                 dev_info(&card->gdev->dev, "Completion Queue support enabled");
5038                 break;
5039         case QETH_CQ_DISABLED:
5040                 dev_info(&card->gdev->dev, "Completion Queue support disabled");
5041                 break;
5042         default:
5043                 break;
5044         }
5045 out:
5046         kfree(out_sbal_ptrs);
5047 out_free_queue_start_poll:
5048         kfree(queue_start_poll);
5049 out_free_in_sbals:
5050         kfree(in_sbal_ptrs);
5051 out_free_qib_param:
5052         kfree(qib_param_field);
5053 out_free_nothing:
5054         return rc;
5055 }
5056
5057 static void qeth_core_free_card(struct qeth_card *card)
5058 {
5059
5060         QETH_DBF_TEXT(SETUP, 2, "freecrd");
5061         QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *));
5062         qeth_clean_channel(&card->read);
5063         qeth_clean_channel(&card->write);
5064         qeth_free_qdio_buffers(card);
5065         unregister_service_level(&card->qeth_service_level);
5066         kfree(card);
5067 }
5068
5069 void qeth_trace_features(struct qeth_card *card)
5070 {
5071         QETH_CARD_TEXT(card, 2, "features");
5072         QETH_CARD_HEX(card, 2, &card->options.ipa4, sizeof(card->options.ipa4));
5073         QETH_CARD_HEX(card, 2, &card->options.ipa6, sizeof(card->options.ipa6));
5074         QETH_CARD_HEX(card, 2, &card->options.adp, sizeof(card->options.adp));
5075         QETH_CARD_HEX(card, 2, &card->info.diagass_support,
5076                       sizeof(card->info.diagass_support));
5077 }
5078 EXPORT_SYMBOL_GPL(qeth_trace_features);
5079
5080 static struct ccw_device_id qeth_ids[] = {
5081         {CCW_DEVICE_DEVTYPE(0x1731, 0x01, 0x1732, 0x01),
5082                                         .driver_info = QETH_CARD_TYPE_OSD},
5083         {CCW_DEVICE_DEVTYPE(0x1731, 0x05, 0x1732, 0x05),
5084                                         .driver_info = QETH_CARD_TYPE_IQD},
5085         {CCW_DEVICE_DEVTYPE(0x1731, 0x06, 0x1732, 0x06),
5086                                         .driver_info = QETH_CARD_TYPE_OSN},
5087         {CCW_DEVICE_DEVTYPE(0x1731, 0x02, 0x1732, 0x03),
5088                                         .driver_info = QETH_CARD_TYPE_OSM},
5089         {CCW_DEVICE_DEVTYPE(0x1731, 0x02, 0x1732, 0x02),
5090                                         .driver_info = QETH_CARD_TYPE_OSX},
5091         {},
5092 };
5093 MODULE_DEVICE_TABLE(ccw, qeth_ids);
5094
5095 static struct ccw_driver qeth_ccw_driver = {
5096         .driver = {
5097                 .owner = THIS_MODULE,
5098                 .name = "qeth",
5099         },
5100         .ids = qeth_ids,
5101         .probe = ccwgroup_probe_ccwdev,
5102         .remove = ccwgroup_remove_ccwdev,
5103 };
5104
5105 int qeth_core_hardsetup_card(struct qeth_card *card)
5106 {
5107         int retries = 3;
5108         int rc;
5109
5110         QETH_DBF_TEXT(SETUP, 2, "hrdsetup");
5111         atomic_set(&card->force_alloc_skb, 0);
5112         qeth_update_from_chp_desc(card);
5113 retry:
5114         if (retries < 3)
5115                 QETH_DBF_MESSAGE(2, "%s Retrying to do IDX activates.\n",
5116                         dev_name(&card->gdev->dev));
5117         rc = qeth_qdio_clear_card(card, card->info.type != QETH_CARD_TYPE_IQD);
5118         ccw_device_set_offline(CARD_DDEV(card));
5119         ccw_device_set_offline(CARD_WDEV(card));
5120         ccw_device_set_offline(CARD_RDEV(card));
5121         qdio_free(CARD_DDEV(card));
5122         rc = ccw_device_set_online(CARD_RDEV(card));
5123         if (rc)
5124                 goto retriable;
5125         rc = ccw_device_set_online(CARD_WDEV(card));
5126         if (rc)
5127                 goto retriable;
5128         rc = ccw_device_set_online(CARD_DDEV(card));
5129         if (rc)
5130                 goto retriable;
5131 retriable:
5132         if (rc == -ERESTARTSYS) {
5133                 QETH_DBF_TEXT(SETUP, 2, "break1");
5134                 return rc;
5135         } else if (rc) {
5136                 QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc);
5137                 if (--retries < 0)
5138                         goto out;
5139                 else
5140                         goto retry;
5141         }
5142         qeth_determine_capabilities(card);
5143         qeth_init_tokens(card);
5144         qeth_init_func_level(card);
5145         rc = qeth_idx_activate_channel(&card->read, qeth_idx_read_cb);
5146         if (rc == -ERESTARTSYS) {
5147                 QETH_DBF_TEXT(SETUP, 2, "break2");
5148                 return rc;
5149         } else if (rc) {
5150                 QETH_DBF_TEXT_(SETUP, 2, "3err%d", rc);
5151                 if (--retries < 0)
5152                         goto out;
5153                 else
5154                         goto retry;
5155         }
5156         rc = qeth_idx_activate_channel(&card->write, qeth_idx_write_cb);
5157         if (rc == -ERESTARTSYS) {
5158                 QETH_DBF_TEXT(SETUP, 2, "break3");
5159                 return rc;
5160         } else if (rc) {
5161                 QETH_DBF_TEXT_(SETUP, 2, "4err%d", rc);
5162                 if (--retries < 0)
5163                         goto out;
5164                 else
5165                         goto retry;
5166         }
5167         card->read_or_write_problem = 0;
5168         rc = qeth_mpc_initialize(card);
5169         if (rc) {
5170                 QETH_DBF_TEXT_(SETUP, 2, "5err%d", rc);
5171                 goto out;
5172         }
5173
5174         rc = qeth_send_startlan(card);
5175         if (rc) {
5176                 QETH_DBF_TEXT_(SETUP, 2, "6err%d", rc);
5177                 if (rc == IPA_RC_LAN_OFFLINE) {
5178                         dev_warn(&card->gdev->dev,
5179                                 "The LAN is offline\n");
5180                         card->lan_online = 0;
5181                 } else {
5182                         rc = -ENODEV;
5183                         goto out;
5184                 }
5185         } else
5186                 card->lan_online = 1;
5187
5188         card->options.ipa4.supported_funcs = 0;
5189         card->options.ipa6.supported_funcs = 0;
5190         card->options.adp.supported_funcs = 0;
5191         card->options.sbp.supported_funcs = 0;
5192         card->info.diagass_support = 0;
5193         rc = qeth_query_ipassists(card, QETH_PROT_IPV4);
5194         if (rc == -ENOMEM)
5195                 goto out;
5196         if (qeth_is_supported(card, IPA_SETADAPTERPARMS)) {
5197                 rc = qeth_query_setadapterparms(card);
5198                 if (rc < 0) {
5199                         QETH_DBF_TEXT_(SETUP, 2, "7err%d", rc);
5200                         goto out;
5201                 }
5202         }
5203         if (qeth_adp_supported(card, IPA_SETADP_SET_DIAG_ASSIST)) {
5204                 rc = qeth_query_setdiagass(card);
5205                 if (rc < 0) {
5206                         QETH_DBF_TEXT_(SETUP, 2, "8err%d", rc);
5207                         goto out;
5208                 }
5209         }
5210         return 0;
5211 out:
5212         dev_warn(&card->gdev->dev, "The qeth device driver failed to recover "
5213                 "an error on the device\n");
5214         QETH_DBF_MESSAGE(2, "%s Initialization in hardsetup failed! rc=%d\n",
5215                 dev_name(&card->gdev->dev), rc);
5216         return rc;
5217 }
5218 EXPORT_SYMBOL_GPL(qeth_core_hardsetup_card);
5219
5220 static int qeth_create_skb_frag(struct qeth_qdio_buffer *qethbuffer,
5221                                 struct qdio_buffer_element *element,
5222                                 struct sk_buff **pskb, int offset, int *pfrag,
5223                                 int data_len)
5224 {
5225         struct page *page = virt_to_page(element->addr);
5226         if (*pskb == NULL) {
5227                 if (qethbuffer->rx_skb) {
5228                         /* only if qeth_card.options.cq == QETH_CQ_ENABLED */
5229                         *pskb = qethbuffer->rx_skb;
5230                         qethbuffer->rx_skb = NULL;
5231                 } else {
5232                         *pskb = dev_alloc_skb(QETH_RX_PULL_LEN + ETH_HLEN);
5233                         if (!(*pskb))
5234                                 return -ENOMEM;
5235                 }
5236
5237                 skb_reserve(*pskb, ETH_HLEN);
5238                 if (data_len <= QETH_RX_PULL_LEN) {
5239                         skb_put_data(*pskb, element->addr + offset, data_len);
5240                 } else {
5241                         get_page(page);
5242                         skb_put_data(*pskb, element->addr + offset,
5243                                      QETH_RX_PULL_LEN);
5244                         skb_fill_page_desc(*pskb, *pfrag, page,
5245                                 offset + QETH_RX_PULL_LEN,
5246                                 data_len - QETH_RX_PULL_LEN);
5247                         (*pskb)->data_len += data_len - QETH_RX_PULL_LEN;
5248                         (*pskb)->len      += data_len - QETH_RX_PULL_LEN;
5249                         (*pskb)->truesize += data_len - QETH_RX_PULL_LEN;
5250                         (*pfrag)++;
5251                 }
5252         } else {
5253                 get_page(page);
5254                 skb_fill_page_desc(*pskb, *pfrag, page, offset, data_len);
5255                 (*pskb)->data_len += data_len;
5256                 (*pskb)->len      += data_len;
5257                 (*pskb)->truesize += data_len;
5258                 (*pfrag)++;
5259         }
5260
5261
5262         return 0;
5263 }
5264
5265 static inline int qeth_is_last_sbale(struct qdio_buffer_element *sbale)
5266 {
5267         return (sbale->eflags & SBAL_EFLAGS_LAST_ENTRY);
5268 }
5269
5270 struct sk_buff *qeth_core_get_next_skb(struct qeth_card *card,
5271                 struct qeth_qdio_buffer *qethbuffer,
5272                 struct qdio_buffer_element **__element, int *__offset,
5273                 struct qeth_hdr **hdr)
5274 {
5275         struct qdio_buffer_element *element = *__element;
5276         struct qdio_buffer *buffer = qethbuffer->buffer;
5277         int offset = *__offset;
5278         struct sk_buff *skb = NULL;
5279         int skb_len = 0;
5280         void *data_ptr;
5281         int data_len;
5282         int headroom = 0;
5283         int use_rx_sg = 0;
5284         int frag = 0;
5285
5286         /* qeth_hdr must not cross element boundaries */
5287         if (element->length < offset + sizeof(struct qeth_hdr)) {
5288                 if (qeth_is_last_sbale(element))
5289                         return NULL;
5290                 element++;
5291                 offset = 0;
5292                 if (element->length < sizeof(struct qeth_hdr))
5293                         return NULL;
5294         }
5295         *hdr = element->addr + offset;
5296
5297         offset += sizeof(struct qeth_hdr);
5298         switch ((*hdr)->hdr.l2.id) {
5299         case QETH_HEADER_TYPE_LAYER2:
5300                 skb_len = (*hdr)->hdr.l2.pkt_length;
5301                 break;
5302         case QETH_HEADER_TYPE_LAYER3:
5303                 skb_len = (*hdr)->hdr.l3.length;
5304                 headroom = ETH_HLEN;
5305                 break;
5306         case QETH_HEADER_TYPE_OSN:
5307                 skb_len = (*hdr)->hdr.osn.pdu_length;
5308                 headroom = sizeof(struct qeth_hdr);
5309                 break;
5310         default:
5311                 break;
5312         }
5313
5314         if (!skb_len)
5315                 return NULL;
5316
5317         if (((skb_len >= card->options.rx_sg_cb) &&
5318              (!(card->info.type == QETH_CARD_TYPE_OSN)) &&
5319              (!atomic_read(&card->force_alloc_skb))) ||
5320             (card->options.cq == QETH_CQ_ENABLED)) {
5321                 use_rx_sg = 1;
5322         } else {
5323                 skb = dev_alloc_skb(skb_len + headroom);
5324                 if (!skb)
5325                         goto no_mem;
5326                 if (headroom)
5327                         skb_reserve(skb, headroom);
5328         }
5329
5330         data_ptr = element->addr + offset;
5331         while (skb_len) {
5332                 data_len = min(skb_len, (int)(element->length - offset));
5333                 if (data_len) {
5334                         if (use_rx_sg) {
5335                                 if (qeth_create_skb_frag(qethbuffer, element,
5336                                     &skb, offset, &frag, data_len))
5337                                         goto no_mem;
5338                         } else {
5339                                 skb_put_data(skb, data_ptr, data_len);
5340                         }
5341                 }
5342                 skb_len -= data_len;
5343                 if (skb_len) {
5344                         if (qeth_is_last_sbale(element)) {
5345                                 QETH_CARD_TEXT(card, 4, "unexeob");
5346                                 QETH_CARD_HEX(card, 2, buffer, sizeof(void *));
5347                                 dev_kfree_skb_any(skb);
5348                                 card->stats.rx_errors++;
5349                                 return NULL;
5350                         }
5351                         element++;
5352                         offset = 0;
5353                         data_ptr = element->addr;
5354                 } else {
5355                         offset += data_len;
5356                 }
5357         }
5358         *__element = element;
5359         *__offset = offset;
5360         if (use_rx_sg && card->options.performance_stats) {
5361                 card->perf_stats.sg_skbs_rx++;
5362                 card->perf_stats.sg_frags_rx += skb_shinfo(skb)->nr_frags;
5363         }
5364         return skb;
5365 no_mem:
5366         if (net_ratelimit()) {
5367                 QETH_CARD_TEXT(card, 2, "noskbmem");
5368         }
5369         card->stats.rx_dropped++;
5370         return NULL;
5371 }
5372 EXPORT_SYMBOL_GPL(qeth_core_get_next_skb);
5373
5374 int qeth_poll(struct napi_struct *napi, int budget)
5375 {
5376         struct qeth_card *card = container_of(napi, struct qeth_card, napi);
5377         int work_done = 0;
5378         struct qeth_qdio_buffer *buffer;
5379         int done;
5380         int new_budget = budget;
5381
5382         if (card->options.performance_stats) {
5383                 card->perf_stats.inbound_cnt++;
5384                 card->perf_stats.inbound_start_time = qeth_get_micros();
5385         }
5386
5387         while (1) {
5388                 if (!card->rx.b_count) {
5389                         card->rx.qdio_err = 0;
5390                         card->rx.b_count = qdio_get_next_buffers(
5391                                 card->data.ccwdev, 0, &card->rx.b_index,
5392                                 &card->rx.qdio_err);
5393                         if (card->rx.b_count <= 0) {
5394                                 card->rx.b_count = 0;
5395                                 break;
5396                         }
5397                         card->rx.b_element =
5398                                 &card->qdio.in_q->bufs[card->rx.b_index]
5399                                 .buffer->element[0];
5400                         card->rx.e_offset = 0;
5401                 }
5402
5403                 while (card->rx.b_count) {
5404                         buffer = &card->qdio.in_q->bufs[card->rx.b_index];
5405                         if (!(card->rx.qdio_err &&
5406                             qeth_check_qdio_errors(card, buffer->buffer,
5407                             card->rx.qdio_err, "qinerr")))
5408                                 work_done +=
5409                                         card->discipline->process_rx_buffer(
5410                                                 card, new_budget, &done);
5411                         else
5412                                 done = 1;
5413
5414                         if (done) {
5415                                 if (card->options.performance_stats)
5416                                         card->perf_stats.bufs_rec++;
5417                                 qeth_put_buffer_pool_entry(card,
5418                                         buffer->pool_entry);
5419                                 qeth_queue_input_buffer(card, card->rx.b_index);
5420                                 card->rx.b_count--;
5421                                 if (card->rx.b_count) {
5422                                         card->rx.b_index =
5423                                                 (card->rx.b_index + 1) %
5424                                                 QDIO_MAX_BUFFERS_PER_Q;
5425                                         card->rx.b_element =
5426                                                 &card->qdio.in_q
5427                                                 ->bufs[card->rx.b_index]
5428                                                 .buffer->element[0];
5429                                         card->rx.e_offset = 0;
5430                                 }
5431                         }
5432
5433                         if (work_done >= budget)
5434                                 goto out;
5435                         else
5436                                 new_budget = budget - work_done;
5437                 }
5438         }
5439
5440         napi_complete(napi);
5441         if (qdio_start_irq(card->data.ccwdev, 0))
5442                 napi_schedule(&card->napi);
5443 out:
5444         if (card->options.performance_stats)
5445                 card->perf_stats.inbound_time += qeth_get_micros() -
5446                         card->perf_stats.inbound_start_time;
5447         return work_done;
5448 }
5449 EXPORT_SYMBOL_GPL(qeth_poll);
5450
5451 static int qeth_setassparms_inspect_rc(struct qeth_ipa_cmd *cmd)
5452 {
5453         if (!cmd->hdr.return_code)
5454                 cmd->hdr.return_code = cmd->data.setassparms.hdr.return_code;
5455         return cmd->hdr.return_code;
5456 }
5457
5458 int qeth_setassparms_cb(struct qeth_card *card,
5459                         struct qeth_reply *reply, unsigned long data)
5460 {
5461         struct qeth_ipa_cmd *cmd;
5462
5463         QETH_CARD_TEXT(card, 4, "defadpcb");
5464
5465         cmd = (struct qeth_ipa_cmd *) data;
5466         if (cmd->hdr.return_code == 0) {
5467                 cmd->hdr.return_code = cmd->data.setassparms.hdr.return_code;
5468                 if (cmd->hdr.prot_version == QETH_PROT_IPV4)
5469                         card->options.ipa4.enabled_funcs = cmd->hdr.ipa_enabled;
5470                 if (cmd->hdr.prot_version == QETH_PROT_IPV6)
5471                         card->options.ipa6.enabled_funcs = cmd->hdr.ipa_enabled;
5472         }
5473         return 0;
5474 }
5475 EXPORT_SYMBOL_GPL(qeth_setassparms_cb);
5476
5477 struct qeth_cmd_buffer *qeth_get_setassparms_cmd(struct qeth_card *card,
5478                                                  enum qeth_ipa_funcs ipa_func,
5479                                                  __u16 cmd_code, __u16 len,
5480                                                  enum qeth_prot_versions prot)
5481 {
5482         struct qeth_cmd_buffer *iob;
5483         struct qeth_ipa_cmd *cmd;
5484
5485         QETH_CARD_TEXT(card, 4, "getasscm");
5486         iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SETASSPARMS, prot);
5487
5488         if (iob) {
5489                 cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
5490                 cmd->data.setassparms.hdr.assist_no = ipa_func;
5491                 cmd->data.setassparms.hdr.length = 8 + len;
5492                 cmd->data.setassparms.hdr.command_code = cmd_code;
5493                 cmd->data.setassparms.hdr.return_code = 0;
5494                 cmd->data.setassparms.hdr.seq_no = 0;
5495         }
5496
5497         return iob;
5498 }
5499 EXPORT_SYMBOL_GPL(qeth_get_setassparms_cmd);
5500
5501 int qeth_send_setassparms(struct qeth_card *card,
5502                           struct qeth_cmd_buffer *iob, __u16 len, long data,
5503                           int (*reply_cb)(struct qeth_card *,
5504                                           struct qeth_reply *, unsigned long),
5505                           void *reply_param)
5506 {
5507         int rc;
5508         struct qeth_ipa_cmd *cmd;
5509
5510         QETH_CARD_TEXT(card, 4, "sendassp");
5511
5512         cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
5513         if (len <= sizeof(__u32))
5514                 cmd->data.setassparms.data.flags_32bit = (__u32) data;
5515         else   /* (len > sizeof(__u32)) */
5516                 memcpy(&cmd->data.setassparms.data, (void *) data, len);
5517
5518         rc = qeth_send_ipa_cmd(card, iob, reply_cb, reply_param);
5519         return rc;
5520 }
5521 EXPORT_SYMBOL_GPL(qeth_send_setassparms);
5522
5523 int qeth_send_simple_setassparms(struct qeth_card *card,
5524                                  enum qeth_ipa_funcs ipa_func,
5525                                  __u16 cmd_code, long data)
5526 {
5527         int rc;
5528         int length = 0;
5529         struct qeth_cmd_buffer *iob;
5530
5531         QETH_CARD_TEXT(card, 4, "simassp4");
5532         if (data)
5533                 length = sizeof(__u32);
5534         iob = qeth_get_setassparms_cmd(card, ipa_func, cmd_code,
5535                                        length, QETH_PROT_IPV4);
5536         if (!iob)
5537                 return -ENOMEM;
5538         rc = qeth_send_setassparms(card, iob, length, data,
5539                                    qeth_setassparms_cb, NULL);
5540         return rc;
5541 }
5542 EXPORT_SYMBOL_GPL(qeth_send_simple_setassparms);
5543
5544 static void qeth_unregister_dbf_views(void)
5545 {
5546         int x;
5547         for (x = 0; x < QETH_DBF_INFOS; x++) {
5548                 debug_unregister(qeth_dbf[x].id);
5549                 qeth_dbf[x].id = NULL;
5550         }
5551 }
5552
5553 void qeth_dbf_longtext(debug_info_t *id, int level, char *fmt, ...)
5554 {
5555         char dbf_txt_buf[32];
5556         va_list args;
5557
5558         if (!debug_level_enabled(id, level))
5559                 return;
5560         va_start(args, fmt);
5561         vsnprintf(dbf_txt_buf, sizeof(dbf_txt_buf), fmt, args);
5562         va_end(args);
5563         debug_text_event(id, level, dbf_txt_buf);
5564 }
5565 EXPORT_SYMBOL_GPL(qeth_dbf_longtext);
5566
5567 static int qeth_register_dbf_views(void)
5568 {
5569         int ret;
5570         int x;
5571
5572         for (x = 0; x < QETH_DBF_INFOS; x++) {
5573                 /* register the areas */
5574                 qeth_dbf[x].id = debug_register(qeth_dbf[x].name,
5575                                                 qeth_dbf[x].pages,
5576                                                 qeth_dbf[x].areas,
5577                                                 qeth_dbf[x].len);
5578                 if (qeth_dbf[x].id == NULL) {
5579                         qeth_unregister_dbf_views();
5580                         return -ENOMEM;
5581                 }
5582
5583                 /* register a view */
5584                 ret = debug_register_view(qeth_dbf[x].id, qeth_dbf[x].view);
5585                 if (ret) {
5586                         qeth_unregister_dbf_views();
5587                         return ret;
5588                 }
5589
5590                 /* set a passing level */
5591                 debug_set_level(qeth_dbf[x].id, qeth_dbf[x].level);
5592         }
5593
5594         return 0;
5595 }
5596
5597 int qeth_core_load_discipline(struct qeth_card *card,
5598                 enum qeth_discipline_id discipline)
5599 {
5600         int rc = 0;
5601
5602         mutex_lock(&qeth_mod_mutex);
5603         switch (discipline) {
5604         case QETH_DISCIPLINE_LAYER3:
5605                 card->discipline = try_then_request_module(
5606                         symbol_get(qeth_l3_discipline), "qeth_l3");
5607                 break;
5608         case QETH_DISCIPLINE_LAYER2:
5609                 card->discipline = try_then_request_module(
5610                         symbol_get(qeth_l2_discipline), "qeth_l2");
5611                 break;
5612         default:
5613                 break;
5614         }
5615
5616         if (!card->discipline) {
5617                 dev_err(&card->gdev->dev, "There is no kernel module to "
5618                         "support discipline %d\n", discipline);
5619                 rc = -EINVAL;
5620         }
5621         mutex_unlock(&qeth_mod_mutex);
5622         return rc;
5623 }
5624
5625 void qeth_core_free_discipline(struct qeth_card *card)
5626 {
5627         if (card->options.layer2)
5628                 symbol_put(qeth_l2_discipline);
5629         else
5630                 symbol_put(qeth_l3_discipline);
5631         card->discipline = NULL;
5632 }
5633
5634 const struct device_type qeth_generic_devtype = {
5635         .name = "qeth_generic",
5636         .groups = qeth_generic_attr_groups,
5637 };
5638 EXPORT_SYMBOL_GPL(qeth_generic_devtype);
5639
5640 static const struct device_type qeth_osn_devtype = {
5641         .name = "qeth_osn",
5642         .groups = qeth_osn_attr_groups,
5643 };
5644
5645 #define DBF_NAME_LEN    20
5646
5647 struct qeth_dbf_entry {
5648         char dbf_name[DBF_NAME_LEN];
5649         debug_info_t *dbf_info;
5650         struct list_head dbf_list;
5651 };
5652
5653 static LIST_HEAD(qeth_dbf_list);
5654 static DEFINE_MUTEX(qeth_dbf_list_mutex);
5655
5656 static debug_info_t *qeth_get_dbf_entry(char *name)
5657 {
5658         struct qeth_dbf_entry *entry;
5659         debug_info_t *rc = NULL;
5660
5661         mutex_lock(&qeth_dbf_list_mutex);
5662         list_for_each_entry(entry, &qeth_dbf_list, dbf_list) {
5663                 if (strcmp(entry->dbf_name, name) == 0) {
5664                         rc = entry->dbf_info;
5665                         break;
5666                 }
5667         }
5668         mutex_unlock(&qeth_dbf_list_mutex);
5669         return rc;
5670 }
5671
5672 static int qeth_add_dbf_entry(struct qeth_card *card, char *name)
5673 {
5674         struct qeth_dbf_entry *new_entry;
5675
5676         card->debug = debug_register(name, 2, 1, 8);
5677         if (!card->debug) {
5678                 QETH_DBF_TEXT_(SETUP, 2, "%s", "qcdbf");
5679                 goto err;
5680         }
5681         if (debug_register_view(card->debug, &debug_hex_ascii_view))
5682                 goto err_dbg;
5683         new_entry = kzalloc(sizeof(struct qeth_dbf_entry), GFP_KERNEL);
5684         if (!new_entry)
5685                 goto err_dbg;
5686         strncpy(new_entry->dbf_name, name, DBF_NAME_LEN);
5687         new_entry->dbf_info = card->debug;
5688         mutex_lock(&qeth_dbf_list_mutex);
5689         list_add(&new_entry->dbf_list, &qeth_dbf_list);
5690         mutex_unlock(&qeth_dbf_list_mutex);
5691
5692         return 0;
5693
5694 err_dbg:
5695         debug_unregister(card->debug);
5696 err:
5697         return -ENOMEM;
5698 }
5699
5700 static void qeth_clear_dbf_list(void)
5701 {
5702         struct qeth_dbf_entry *entry, *tmp;
5703
5704         mutex_lock(&qeth_dbf_list_mutex);
5705         list_for_each_entry_safe(entry, tmp, &qeth_dbf_list, dbf_list) {
5706                 list_del(&entry->dbf_list);
5707                 debug_unregister(entry->dbf_info);
5708                 kfree(entry);
5709         }
5710         mutex_unlock(&qeth_dbf_list_mutex);
5711 }
5712
5713 static int qeth_core_probe_device(struct ccwgroup_device *gdev)
5714 {
5715         struct qeth_card *card;
5716         struct device *dev;
5717         int rc;
5718         enum qeth_discipline_id enforced_disc;
5719         unsigned long flags;
5720         char dbf_name[DBF_NAME_LEN];
5721
5722         QETH_DBF_TEXT(SETUP, 2, "probedev");
5723
5724         dev = &gdev->dev;
5725         if (!get_device(dev))
5726                 return -ENODEV;
5727
5728         QETH_DBF_TEXT_(SETUP, 2, "%s", dev_name(&gdev->dev));
5729
5730         card = qeth_alloc_card();
5731         if (!card) {
5732                 QETH_DBF_TEXT_(SETUP, 2, "1err%d", -ENOMEM);
5733                 rc = -ENOMEM;
5734                 goto err_dev;
5735         }
5736
5737         snprintf(dbf_name, sizeof(dbf_name), "qeth_card_%s",
5738                 dev_name(&gdev->dev));
5739         card->debug = qeth_get_dbf_entry(dbf_name);
5740         if (!card->debug) {
5741                 rc = qeth_add_dbf_entry(card, dbf_name);
5742                 if (rc)
5743                         goto err_card;
5744         }
5745
5746         card->read.ccwdev  = gdev->cdev[0];
5747         card->write.ccwdev = gdev->cdev[1];
5748         card->data.ccwdev  = gdev->cdev[2];
5749         dev_set_drvdata(&gdev->dev, card);
5750         card->gdev = gdev;
5751         gdev->cdev[0]->handler = qeth_irq;
5752         gdev->cdev[1]->handler = qeth_irq;
5753         gdev->cdev[2]->handler = qeth_irq;
5754
5755         rc = qeth_determine_card_type(card);
5756         if (rc) {
5757                 QETH_DBF_TEXT_(SETUP, 2, "3err%d", rc);
5758                 goto err_card;
5759         }
5760         rc = qeth_setup_card(card);
5761         if (rc) {
5762                 QETH_DBF_TEXT_(SETUP, 2, "2err%d", rc);
5763                 goto err_card;
5764         }
5765
5766         qeth_determine_capabilities(card);
5767         enforced_disc = qeth_enforce_discipline(card);
5768         switch (enforced_disc) {
5769         case QETH_DISCIPLINE_UNDETERMINED:
5770                 gdev->dev.type = &qeth_generic_devtype;
5771                 break;
5772         default:
5773                 card->info.layer_enforced = true;
5774                 rc = qeth_core_load_discipline(card, enforced_disc);
5775                 if (rc)
5776                         goto err_card;
5777
5778                 gdev->dev.type = (card->info.type != QETH_CARD_TYPE_OSN)
5779                                         ? card->discipline->devtype
5780                                         : &qeth_osn_devtype;
5781                 rc = card->discipline->setup(card->gdev);
5782                 if (rc)
5783                         goto err_disc;
5784                 break;
5785         }
5786
5787         write_lock_irqsave(&qeth_core_card_list.rwlock, flags);
5788         list_add_tail(&card->list, &qeth_core_card_list.list);
5789         write_unlock_irqrestore(&qeth_core_card_list.rwlock, flags);
5790         return 0;
5791
5792 err_disc:
5793         qeth_core_free_discipline(card);
5794 err_card:
5795         qeth_core_free_card(card);
5796 err_dev:
5797         put_device(dev);
5798         return rc;
5799 }
5800
5801 static void qeth_core_remove_device(struct ccwgroup_device *gdev)
5802 {
5803         unsigned long flags;
5804         struct qeth_card *card = dev_get_drvdata(&gdev->dev);
5805
5806         QETH_DBF_TEXT(SETUP, 2, "removedv");
5807
5808         if (card->discipline) {
5809                 card->discipline->remove(gdev);
5810                 qeth_core_free_discipline(card);
5811         }
5812
5813         write_lock_irqsave(&qeth_core_card_list.rwlock, flags);
5814         list_del(&card->list);
5815         write_unlock_irqrestore(&qeth_core_card_list.rwlock, flags);
5816         qeth_core_free_card(card);
5817         dev_set_drvdata(&gdev->dev, NULL);
5818         put_device(&gdev->dev);
5819         return;
5820 }
5821
5822 static int qeth_core_set_online(struct ccwgroup_device *gdev)
5823 {
5824         struct qeth_card *card = dev_get_drvdata(&gdev->dev);
5825         int rc = 0;
5826         enum qeth_discipline_id def_discipline;
5827
5828         if (!card->discipline) {
5829                 if (card->info.type == QETH_CARD_TYPE_IQD)
5830                         def_discipline = QETH_DISCIPLINE_LAYER3;
5831                 else
5832                         def_discipline = QETH_DISCIPLINE_LAYER2;
5833                 rc = qeth_core_load_discipline(card, def_discipline);
5834                 if (rc)
5835                         goto err;
5836                 rc = card->discipline->setup(card->gdev);
5837                 if (rc) {
5838                         qeth_core_free_discipline(card);
5839                         goto err;
5840                 }
5841         }
5842         rc = card->discipline->set_online(gdev);
5843 err:
5844         return rc;
5845 }
5846
5847 static int qeth_core_set_offline(struct ccwgroup_device *gdev)
5848 {
5849         struct qeth_card *card = dev_get_drvdata(&gdev->dev);
5850         return card->discipline->set_offline(gdev);
5851 }
5852
5853 static void qeth_core_shutdown(struct ccwgroup_device *gdev)
5854 {
5855         struct qeth_card *card = dev_get_drvdata(&gdev->dev);
5856         qeth_set_allowed_threads(card, 0, 1);
5857         if ((gdev->state == CCWGROUP_ONLINE) && card->info.hwtrap)
5858                 qeth_hw_trap(card, QETH_DIAGS_TRAP_DISARM);
5859         qeth_qdio_clear_card(card, 0);
5860         qeth_clear_qdio_buffers(card);
5861         qdio_free(CARD_DDEV(card));
5862 }
5863
5864 static int qeth_core_freeze(struct ccwgroup_device *gdev)
5865 {
5866         struct qeth_card *card = dev_get_drvdata(&gdev->dev);
5867         if (card->discipline && card->discipline->freeze)
5868                 return card->discipline->freeze(gdev);
5869         return 0;
5870 }
5871
5872 static int qeth_core_thaw(struct ccwgroup_device *gdev)
5873 {
5874         struct qeth_card *card = dev_get_drvdata(&gdev->dev);
5875         if (card->discipline && card->discipline->thaw)
5876                 return card->discipline->thaw(gdev);
5877         return 0;
5878 }
5879
5880 static int qeth_core_restore(struct ccwgroup_device *gdev)
5881 {
5882         struct qeth_card *card = dev_get_drvdata(&gdev->dev);
5883         if (card->discipline && card->discipline->restore)
5884                 return card->discipline->restore(gdev);
5885         return 0;
5886 }
5887
5888 static struct ccwgroup_driver qeth_core_ccwgroup_driver = {
5889         .driver = {
5890                 .owner = THIS_MODULE,
5891                 .name = "qeth",
5892         },
5893         .setup = qeth_core_probe_device,
5894         .remove = qeth_core_remove_device,
5895         .set_online = qeth_core_set_online,
5896         .set_offline = qeth_core_set_offline,
5897         .shutdown = qeth_core_shutdown,
5898         .prepare = NULL,
5899         .complete = NULL,
5900         .freeze = qeth_core_freeze,
5901         .thaw = qeth_core_thaw,
5902         .restore = qeth_core_restore,
5903 };
5904
5905 static ssize_t group_store(struct device_driver *ddrv, const char *buf,
5906                            size_t count)
5907 {
5908         int err;
5909
5910         err = ccwgroup_create_dev(qeth_core_root_dev,
5911                                   &qeth_core_ccwgroup_driver, 3, buf);
5912
5913         return err ? err : count;
5914 }
5915 static DRIVER_ATTR_WO(group);
5916
5917 static struct attribute *qeth_drv_attrs[] = {
5918         &driver_attr_group.attr,
5919         NULL,
5920 };
5921 static struct attribute_group qeth_drv_attr_group = {
5922         .attrs = qeth_drv_attrs,
5923 };
5924 static const struct attribute_group *qeth_drv_attr_groups[] = {
5925         &qeth_drv_attr_group,
5926         NULL,
5927 };
5928
5929 int qeth_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
5930 {
5931         struct qeth_card *card = dev->ml_priv;
5932         struct mii_ioctl_data *mii_data;
5933         int rc = 0;
5934
5935         if (!card)
5936                 return -ENODEV;
5937
5938         if (!qeth_card_hw_is_reachable(card))
5939                 return -ENODEV;
5940
5941         if (card->info.type == QETH_CARD_TYPE_OSN)
5942                 return -EPERM;
5943
5944         switch (cmd) {
5945         case SIOC_QETH_ADP_SET_SNMP_CONTROL:
5946                 rc = qeth_snmp_command(card, rq->ifr_ifru.ifru_data);
5947                 break;
5948         case SIOC_QETH_GET_CARD_TYPE:
5949                 if ((card->info.type == QETH_CARD_TYPE_OSD ||
5950                      card->info.type == QETH_CARD_TYPE_OSM ||
5951                      card->info.type == QETH_CARD_TYPE_OSX) &&
5952                     !card->info.guestlan)
5953                         return 1;
5954                 else
5955                         return 0;
5956         case SIOCGMIIPHY:
5957                 mii_data = if_mii(rq);
5958                 mii_data->phy_id = 0;
5959                 break;
5960         case SIOCGMIIREG:
5961                 mii_data = if_mii(rq);
5962                 if (mii_data->phy_id != 0)
5963                         rc = -EINVAL;
5964                 else
5965                         mii_data->val_out = qeth_mdio_read(dev,
5966                                 mii_data->phy_id, mii_data->reg_num);
5967                 break;
5968         case SIOC_QETH_QUERY_OAT:
5969                 rc = qeth_query_oat_command(card, rq->ifr_ifru.ifru_data);
5970                 break;
5971         default:
5972                 if (card->discipline->do_ioctl)
5973                         rc = card->discipline->do_ioctl(dev, rq, cmd);
5974                 else
5975                         rc = -EOPNOTSUPP;
5976         }
5977         if (rc)
5978                 QETH_CARD_TEXT_(card, 2, "ioce%x", rc);
5979         return rc;
5980 }
5981 EXPORT_SYMBOL_GPL(qeth_do_ioctl);
5982
5983 static struct {
5984         const char str[ETH_GSTRING_LEN];
5985 } qeth_ethtool_stats_keys[] = {
5986 /*  0 */{"rx skbs"},
5987         {"rx buffers"},
5988         {"tx skbs"},
5989         {"tx buffers"},
5990         {"tx skbs no packing"},
5991         {"tx buffers no packing"},
5992         {"tx skbs packing"},
5993         {"tx buffers packing"},
5994         {"tx sg skbs"},
5995         {"tx sg frags"},
5996 /* 10 */{"rx sg skbs"},
5997         {"rx sg frags"},
5998         {"rx sg page allocs"},
5999         {"tx large kbytes"},
6000         {"tx large count"},
6001         {"tx pk state ch n->p"},
6002         {"tx pk state ch p->n"},
6003         {"tx pk watermark low"},
6004         {"tx pk watermark high"},
6005         {"queue 0 buffer usage"},
6006 /* 20 */{"queue 1 buffer usage"},
6007         {"queue 2 buffer usage"},
6008         {"queue 3 buffer usage"},
6009         {"rx poll time"},
6010         {"rx poll count"},
6011         {"rx do_QDIO time"},
6012         {"rx do_QDIO count"},
6013         {"tx handler time"},
6014         {"tx handler count"},
6015         {"tx time"},
6016 /* 30 */{"tx count"},
6017         {"tx do_QDIO time"},
6018         {"tx do_QDIO count"},
6019         {"tx csum"},
6020         {"tx lin"},
6021         {"tx linfail"},
6022         {"cq handler count"},
6023         {"cq handler time"}
6024 };
6025
6026 int qeth_core_get_sset_count(struct net_device *dev, int stringset)
6027 {
6028         switch (stringset) {
6029         case ETH_SS_STATS:
6030                 return (sizeof(qeth_ethtool_stats_keys) / ETH_GSTRING_LEN);
6031         default:
6032                 return -EINVAL;
6033         }
6034 }
6035 EXPORT_SYMBOL_GPL(qeth_core_get_sset_count);
6036
6037 void qeth_core_get_ethtool_stats(struct net_device *dev,
6038                 struct ethtool_stats *stats, u64 *data)
6039 {
6040         struct qeth_card *card = dev->ml_priv;
6041         data[0] = card->stats.rx_packets -
6042                                 card->perf_stats.initial_rx_packets;
6043         data[1] = card->perf_stats.bufs_rec;
6044         data[2] = card->stats.tx_packets -
6045                                 card->perf_stats.initial_tx_packets;
6046         data[3] = card->perf_stats.bufs_sent;
6047         data[4] = card->stats.tx_packets - card->perf_stats.initial_tx_packets
6048                         - card->perf_stats.skbs_sent_pack;
6049         data[5] = card->perf_stats.bufs_sent - card->perf_stats.bufs_sent_pack;
6050         data[6] = card->perf_stats.skbs_sent_pack;
6051         data[7] = card->perf_stats.bufs_sent_pack;
6052         data[8] = card->perf_stats.sg_skbs_sent;
6053         data[9] = card->perf_stats.sg_frags_sent;
6054         data[10] = card->perf_stats.sg_skbs_rx;
6055         data[11] = card->perf_stats.sg_frags_rx;
6056         data[12] = card->perf_stats.sg_alloc_page_rx;
6057         data[13] = (card->perf_stats.large_send_bytes >> 10);
6058         data[14] = card->perf_stats.large_send_cnt;
6059         data[15] = card->perf_stats.sc_dp_p;
6060         data[16] = card->perf_stats.sc_p_dp;
6061         data[17] = QETH_LOW_WATERMARK_PACK;
6062         data[18] = QETH_HIGH_WATERMARK_PACK;
6063         data[19] = atomic_read(&card->qdio.out_qs[0]->used_buffers);
6064         data[20] = (card->qdio.no_out_queues > 1) ?
6065                         atomic_read(&card->qdio.out_qs[1]->used_buffers) : 0;
6066         data[21] = (card->qdio.no_out_queues > 2) ?
6067                         atomic_read(&card->qdio.out_qs[2]->used_buffers) : 0;
6068         data[22] = (card->qdio.no_out_queues > 3) ?
6069                         atomic_read(&card->qdio.out_qs[3]->used_buffers) : 0;
6070         data[23] = card->perf_stats.inbound_time;
6071         data[24] = card->perf_stats.inbound_cnt;
6072         data[25] = card->perf_stats.inbound_do_qdio_time;
6073         data[26] = card->perf_stats.inbound_do_qdio_cnt;
6074         data[27] = card->perf_stats.outbound_handler_time;
6075         data[28] = card->perf_stats.outbound_handler_cnt;
6076         data[29] = card->perf_stats.outbound_time;
6077         data[30] = card->perf_stats.outbound_cnt;
6078         data[31] = card->perf_stats.outbound_do_qdio_time;
6079         data[32] = card->perf_stats.outbound_do_qdio_cnt;
6080         data[33] = card->perf_stats.tx_csum;
6081         data[34] = card->perf_stats.tx_lin;
6082         data[35] = card->perf_stats.tx_linfail;
6083         data[36] = card->perf_stats.cq_cnt;
6084         data[37] = card->perf_stats.cq_time;
6085 }
6086 EXPORT_SYMBOL_GPL(qeth_core_get_ethtool_stats);
6087
6088 void qeth_core_get_strings(struct net_device *dev, u32 stringset, u8 *data)
6089 {
6090         switch (stringset) {
6091         case ETH_SS_STATS:
6092                 memcpy(data, &qeth_ethtool_stats_keys,
6093                         sizeof(qeth_ethtool_stats_keys));
6094                 break;
6095         default:
6096                 WARN_ON(1);
6097                 break;
6098         }
6099 }
6100 EXPORT_SYMBOL_GPL(qeth_core_get_strings);
6101
6102 void qeth_core_get_drvinfo(struct net_device *dev,
6103                 struct ethtool_drvinfo *info)
6104 {
6105         struct qeth_card *card = dev->ml_priv;
6106
6107         strlcpy(info->driver, card->options.layer2 ? "qeth_l2" : "qeth_l3",
6108                 sizeof(info->driver));
6109         strlcpy(info->version, "1.0", sizeof(info->version));
6110         strlcpy(info->fw_version, card->info.mcl_level,
6111                 sizeof(info->fw_version));
6112         snprintf(info->bus_info, sizeof(info->bus_info), "%s/%s/%s",
6113                  CARD_RDEV_ID(card), CARD_WDEV_ID(card), CARD_DDEV_ID(card));
6114 }
6115 EXPORT_SYMBOL_GPL(qeth_core_get_drvinfo);
6116
6117 /* Helper function to fill 'advertising' and 'supported' which are the same. */
6118 /* Autoneg and full-duplex are supported and advertised unconditionally.     */
6119 /* Always advertise and support all speeds up to specified, and only one     */
6120 /* specified port type.                                                      */
6121 static void qeth_set_cmd_adv_sup(struct ethtool_link_ksettings *cmd,
6122                                 int maxspeed, int porttype)
6123 {
6124         ethtool_link_ksettings_zero_link_mode(cmd, supported);
6125         ethtool_link_ksettings_zero_link_mode(cmd, advertising);
6126         ethtool_link_ksettings_zero_link_mode(cmd, lp_advertising);
6127
6128         ethtool_link_ksettings_add_link_mode(cmd, supported, Autoneg);
6129         ethtool_link_ksettings_add_link_mode(cmd, advertising, Autoneg);
6130
6131         switch (porttype) {
6132         case PORT_TP:
6133                 ethtool_link_ksettings_add_link_mode(cmd, supported, TP);
6134                 ethtool_link_ksettings_add_link_mode(cmd, advertising, TP);
6135                 break;
6136         case PORT_FIBRE:
6137                 ethtool_link_ksettings_add_link_mode(cmd, supported, FIBRE);
6138                 ethtool_link_ksettings_add_link_mode(cmd, advertising, FIBRE);
6139                 break;
6140         default:
6141                 ethtool_link_ksettings_add_link_mode(cmd, supported, TP);
6142                 ethtool_link_ksettings_add_link_mode(cmd, advertising, TP);
6143                 WARN_ON_ONCE(1);
6144         }
6145
6146         /* fallthrough from high to low, to select all legal speeds: */
6147         switch (maxspeed) {
6148         case SPEED_10000:
6149                 ethtool_link_ksettings_add_link_mode(cmd, supported,
6150                                                      10000baseT_Full);
6151                 ethtool_link_ksettings_add_link_mode(cmd, advertising,
6152                                                      10000baseT_Full);
6153         case SPEED_1000:
6154                 ethtool_link_ksettings_add_link_mode(cmd, supported,
6155                                                      1000baseT_Full);
6156                 ethtool_link_ksettings_add_link_mode(cmd, advertising,
6157                                                      1000baseT_Full);
6158                 ethtool_link_ksettings_add_link_mode(cmd, supported,
6159                                                      1000baseT_Half);
6160                 ethtool_link_ksettings_add_link_mode(cmd, advertising,
6161                                                      1000baseT_Half);
6162         case SPEED_100:
6163                 ethtool_link_ksettings_add_link_mode(cmd, supported,
6164                                                      100baseT_Full);
6165                 ethtool_link_ksettings_add_link_mode(cmd, advertising,
6166                                                      100baseT_Full);
6167                 ethtool_link_ksettings_add_link_mode(cmd, supported,
6168                                                      100baseT_Half);
6169                 ethtool_link_ksettings_add_link_mode(cmd, advertising,
6170                                                      100baseT_Half);
6171         case SPEED_10:
6172                 ethtool_link_ksettings_add_link_mode(cmd, supported,
6173                                                      10baseT_Full);
6174                 ethtool_link_ksettings_add_link_mode(cmd, advertising,
6175                                                      10baseT_Full);
6176                 ethtool_link_ksettings_add_link_mode(cmd, supported,
6177                                                      10baseT_Half);
6178                 ethtool_link_ksettings_add_link_mode(cmd, advertising,
6179                                                      10baseT_Half);
6180                 /* end fallthrough */
6181                 break;
6182         default:
6183                 ethtool_link_ksettings_add_link_mode(cmd, supported,
6184                                                      10baseT_Full);
6185                 ethtool_link_ksettings_add_link_mode(cmd, advertising,
6186                                                      10baseT_Full);
6187                 ethtool_link_ksettings_add_link_mode(cmd, supported,
6188                                                      10baseT_Half);
6189                 ethtool_link_ksettings_add_link_mode(cmd, advertising,
6190                                                      10baseT_Half);
6191                 WARN_ON_ONCE(1);
6192         }
6193 }
6194
6195 int qeth_core_ethtool_get_link_ksettings(struct net_device *netdev,
6196                 struct ethtool_link_ksettings *cmd)
6197 {
6198         struct qeth_card *card = netdev->ml_priv;
6199         enum qeth_link_types link_type;
6200         struct carrier_info carrier_info;
6201         int rc;
6202
6203         if ((card->info.type == QETH_CARD_TYPE_IQD) || (card->info.guestlan))
6204                 link_type = QETH_LINK_TYPE_10GBIT_ETH;
6205         else
6206                 link_type = card->info.link_type;
6207
6208         cmd->base.duplex = DUPLEX_FULL;
6209         cmd->base.autoneg = AUTONEG_ENABLE;
6210         cmd->base.phy_address = 0;
6211         cmd->base.mdio_support = 0;
6212         cmd->base.eth_tp_mdix = ETH_TP_MDI_INVALID;
6213         cmd->base.eth_tp_mdix_ctrl = ETH_TP_MDI_INVALID;
6214
6215         switch (link_type) {
6216         case QETH_LINK_TYPE_FAST_ETH:
6217         case QETH_LINK_TYPE_LANE_ETH100:
6218                 cmd->base.speed = SPEED_100;
6219                 cmd->base.port = PORT_TP;
6220                 break;
6221         case QETH_LINK_TYPE_GBIT_ETH:
6222         case QETH_LINK_TYPE_LANE_ETH1000:
6223                 cmd->base.speed = SPEED_1000;
6224                 cmd->base.port = PORT_FIBRE;
6225                 break;
6226         case QETH_LINK_TYPE_10GBIT_ETH:
6227                 cmd->base.speed = SPEED_10000;
6228                 cmd->base.port = PORT_FIBRE;
6229                 break;
6230         default:
6231                 cmd->base.speed = SPEED_10;
6232                 cmd->base.port = PORT_TP;
6233         }
6234         qeth_set_cmd_adv_sup(cmd, cmd->base.speed, cmd->base.port);
6235
6236         /* Check if we can obtain more accurate information.     */
6237         /* If QUERY_CARD_INFO command is not supported or fails, */
6238         /* just return the heuristics that was filled above.     */
6239         if (!qeth_card_hw_is_reachable(card))
6240                 return -ENODEV;
6241         rc = qeth_query_card_info(card, &carrier_info);
6242         if (rc == -EOPNOTSUPP) /* for old hardware, return heuristic */
6243                 return 0;
6244         if (rc) /* report error from the hardware operation */
6245                 return rc;
6246         /* on success, fill in the information got from the hardware */
6247
6248         netdev_dbg(netdev,
6249         "card info: card_type=0x%02x, port_mode=0x%04x, port_speed=0x%08x\n",
6250                         carrier_info.card_type,
6251                         carrier_info.port_mode,
6252                         carrier_info.port_speed);
6253
6254         /* Update attributes for which we've obtained more authoritative */
6255         /* information, leave the rest the way they where filled above.  */
6256         switch (carrier_info.card_type) {
6257         case CARD_INFO_TYPE_1G_COPPER_A:
6258         case CARD_INFO_TYPE_1G_COPPER_B:
6259                 cmd->base.port = PORT_TP;
6260                 qeth_set_cmd_adv_sup(cmd, SPEED_1000, cmd->base.port);
6261                 break;
6262         case CARD_INFO_TYPE_1G_FIBRE_A:
6263         case CARD_INFO_TYPE_1G_FIBRE_B:
6264                 cmd->base.port = PORT_FIBRE;
6265                 qeth_set_cmd_adv_sup(cmd, SPEED_1000, cmd->base.port);
6266                 break;
6267         case CARD_INFO_TYPE_10G_FIBRE_A:
6268         case CARD_INFO_TYPE_10G_FIBRE_B:
6269                 cmd->base.port = PORT_FIBRE;
6270                 qeth_set_cmd_adv_sup(cmd, SPEED_10000, cmd->base.port);
6271                 break;
6272         }
6273
6274         switch (carrier_info.port_mode) {
6275         case CARD_INFO_PORTM_FULLDUPLEX:
6276                 cmd->base.duplex = DUPLEX_FULL;
6277                 break;
6278         case CARD_INFO_PORTM_HALFDUPLEX:
6279                 cmd->base.duplex = DUPLEX_HALF;
6280                 break;
6281         }
6282
6283         switch (carrier_info.port_speed) {
6284         case CARD_INFO_PORTS_10M:
6285                 cmd->base.speed = SPEED_10;
6286                 break;
6287         case CARD_INFO_PORTS_100M:
6288                 cmd->base.speed = SPEED_100;
6289                 break;
6290         case CARD_INFO_PORTS_1G:
6291                 cmd->base.speed = SPEED_1000;
6292                 break;
6293         case CARD_INFO_PORTS_10G:
6294                 cmd->base.speed = SPEED_10000;
6295                 break;
6296         }
6297
6298         return 0;
6299 }
6300 EXPORT_SYMBOL_GPL(qeth_core_ethtool_get_link_ksettings);
6301
6302 /* Callback to handle checksum offload command reply from OSA card.
6303  * Verify that required features have been enabled on the card.
6304  * Return error in hdr->return_code as this value is checked by caller.
6305  *
6306  * Always returns zero to indicate no further messages from the OSA card.
6307  */
6308 static int qeth_ipa_checksum_run_cmd_cb(struct qeth_card *card,
6309                                         struct qeth_reply *reply,
6310                                         unsigned long data)
6311 {
6312         struct qeth_ipa_cmd *cmd = (struct qeth_ipa_cmd *) data;
6313         struct qeth_checksum_cmd *chksum_cb =
6314                                 (struct qeth_checksum_cmd *)reply->param;
6315
6316         QETH_CARD_TEXT(card, 4, "chkdoccb");
6317         if (qeth_setassparms_inspect_rc(cmd))
6318                 return 0;
6319
6320         memset(chksum_cb, 0, sizeof(*chksum_cb));
6321         if (cmd->data.setassparms.hdr.command_code == IPA_CMD_ASS_START) {
6322                 chksum_cb->supported =
6323                                 cmd->data.setassparms.data.chksum.supported;
6324                 QETH_CARD_TEXT_(card, 3, "strt:%x", chksum_cb->supported);
6325         }
6326         if (cmd->data.setassparms.hdr.command_code == IPA_CMD_ASS_ENABLE) {
6327                 chksum_cb->supported =
6328                                 cmd->data.setassparms.data.chksum.supported;
6329                 chksum_cb->enabled =
6330                                 cmd->data.setassparms.data.chksum.enabled;
6331                 QETH_CARD_TEXT_(card, 3, "supp:%x", chksum_cb->supported);
6332                 QETH_CARD_TEXT_(card, 3, "enab:%x", chksum_cb->enabled);
6333         }
6334         return 0;
6335 }
6336
6337 /* Send command to OSA card and check results. */
6338 static int qeth_ipa_checksum_run_cmd(struct qeth_card *card,
6339                                      enum qeth_ipa_funcs ipa_func,
6340                                      __u16 cmd_code, long data,
6341                                      struct qeth_checksum_cmd *chksum_cb)
6342 {
6343         struct qeth_cmd_buffer *iob;
6344         int rc = -ENOMEM;
6345
6346         QETH_CARD_TEXT(card, 4, "chkdocmd");
6347         iob = qeth_get_setassparms_cmd(card, ipa_func, cmd_code,
6348                                        sizeof(__u32), QETH_PROT_IPV4);
6349         if (iob)
6350                 rc = qeth_send_setassparms(card, iob, sizeof(__u32), data,
6351                                            qeth_ipa_checksum_run_cmd_cb,
6352                                            chksum_cb);
6353         return rc;
6354 }
6355
6356 static int qeth_send_checksum_on(struct qeth_card *card, int cstype)
6357 {
6358         const __u32 required_features = QETH_IPA_CHECKSUM_IP_HDR |
6359                                         QETH_IPA_CHECKSUM_UDP |
6360                                         QETH_IPA_CHECKSUM_TCP;
6361         struct qeth_checksum_cmd chksum_cb;
6362         int rc;
6363
6364         rc = qeth_ipa_checksum_run_cmd(card, cstype, IPA_CMD_ASS_START, 0,
6365                                        &chksum_cb);
6366         if (!rc) {
6367                 if ((required_features & chksum_cb.supported) !=
6368                     required_features)
6369                         rc = -EIO;
6370                 else if (!(QETH_IPA_CHECKSUM_LP2LP & chksum_cb.supported) &&
6371                          cstype == IPA_INBOUND_CHECKSUM)
6372                         dev_warn(&card->gdev->dev,
6373                                  "Hardware checksumming is performed only if %s and its peer use different OSA Express 3 ports\n",
6374                                  QETH_CARD_IFNAME(card));
6375         }
6376         if (rc) {
6377                 qeth_send_simple_setassparms(card, cstype, IPA_CMD_ASS_STOP, 0);
6378                 dev_warn(&card->gdev->dev,
6379                          "Starting HW checksumming for %s failed, using SW checksumming\n",
6380                          QETH_CARD_IFNAME(card));
6381                 return rc;
6382         }
6383         rc = qeth_ipa_checksum_run_cmd(card, cstype, IPA_CMD_ASS_ENABLE,
6384                                        chksum_cb.supported, &chksum_cb);
6385         if (!rc) {
6386                 if ((required_features & chksum_cb.enabled) !=
6387                     required_features)
6388                         rc = -EIO;
6389         }
6390         if (rc) {
6391                 qeth_send_simple_setassparms(card, cstype, IPA_CMD_ASS_STOP, 0);
6392                 dev_warn(&card->gdev->dev,
6393                          "Enabling HW checksumming for %s failed, using SW checksumming\n",
6394                          QETH_CARD_IFNAME(card));
6395                 return rc;
6396         }
6397
6398         dev_info(&card->gdev->dev, "HW Checksumming (%sbound) enabled\n",
6399                  cstype == IPA_INBOUND_CHECKSUM ? "in" : "out");
6400         return 0;
6401 }
6402
6403 static int qeth_set_ipa_csum(struct qeth_card *card, int on, int cstype)
6404 {
6405         int rc = (on) ? qeth_send_checksum_on(card, cstype)
6406                       : qeth_send_simple_setassparms(card, cstype,
6407                                                      IPA_CMD_ASS_STOP, 0);
6408         return rc ? -EIO : 0;
6409 }
6410
6411 static int qeth_set_ipa_tso(struct qeth_card *card, int on)
6412 {
6413         int rc;
6414
6415         QETH_CARD_TEXT(card, 3, "sttso");
6416
6417         if (on) {
6418                 rc = qeth_send_simple_setassparms(card, IPA_OUTBOUND_TSO,
6419                                                   IPA_CMD_ASS_START, 0);
6420                 if (rc) {
6421                         dev_warn(&card->gdev->dev,
6422                                  "Starting outbound TCP segmentation offload for %s failed\n",
6423                                  QETH_CARD_IFNAME(card));
6424                         return -EIO;
6425                 }
6426                 dev_info(&card->gdev->dev, "Outbound TSO enabled\n");
6427         } else {
6428                 rc = qeth_send_simple_setassparms(card, IPA_OUTBOUND_TSO,
6429                                                   IPA_CMD_ASS_STOP, 0);
6430         }
6431         return rc;
6432 }
6433
6434 /* try to restore device features on a device after recovery */
6435 int qeth_recover_features(struct net_device *dev)
6436 {
6437         struct qeth_card *card = dev->ml_priv;
6438         netdev_features_t recover = dev->features;
6439
6440         if (recover & NETIF_F_IP_CSUM) {
6441                 if (qeth_set_ipa_csum(card, 1, IPA_OUTBOUND_CHECKSUM))
6442                         recover ^= NETIF_F_IP_CSUM;
6443         }
6444         if (recover & NETIF_F_RXCSUM) {
6445                 if (qeth_set_ipa_csum(card, 1, IPA_INBOUND_CHECKSUM))
6446                         recover ^= NETIF_F_RXCSUM;
6447         }
6448         if (recover & NETIF_F_TSO) {
6449                 if (qeth_set_ipa_tso(card, 1))
6450                         recover ^= NETIF_F_TSO;
6451         }
6452
6453         if (recover == dev->features)
6454                 return 0;
6455
6456         dev_warn(&card->gdev->dev,
6457                  "Device recovery failed to restore all offload features\n");
6458         dev->features = recover;
6459         return -EIO;
6460 }
6461 EXPORT_SYMBOL_GPL(qeth_recover_features);
6462
6463 int qeth_set_features(struct net_device *dev, netdev_features_t features)
6464 {
6465         struct qeth_card *card = dev->ml_priv;
6466         netdev_features_t changed = dev->features ^ features;
6467         int rc = 0;
6468
6469         QETH_DBF_TEXT(SETUP, 2, "setfeat");
6470         QETH_DBF_HEX(SETUP, 2, &features, sizeof(features));
6471
6472         if ((changed & NETIF_F_IP_CSUM)) {
6473                 rc = qeth_set_ipa_csum(card,
6474                                        features & NETIF_F_IP_CSUM ? 1 : 0,
6475                                        IPA_OUTBOUND_CHECKSUM);
6476                 if (rc)
6477                         changed ^= NETIF_F_IP_CSUM;
6478         }
6479         if ((changed & NETIF_F_RXCSUM)) {
6480                 rc = qeth_set_ipa_csum(card,
6481                                         features & NETIF_F_RXCSUM ? 1 : 0,
6482                                         IPA_INBOUND_CHECKSUM);
6483                 if (rc)
6484                         changed ^= NETIF_F_RXCSUM;
6485         }
6486         if ((changed & NETIF_F_TSO)) {
6487                 rc = qeth_set_ipa_tso(card, features & NETIF_F_TSO ? 1 : 0);
6488                 if (rc)
6489                         changed ^= NETIF_F_TSO;
6490         }
6491
6492         /* everything changed successfully? */
6493         if ((dev->features ^ features) == changed)
6494                 return 0;
6495         /* something went wrong. save changed features and return error */
6496         dev->features ^= changed;
6497         return -EIO;
6498 }
6499 EXPORT_SYMBOL_GPL(qeth_set_features);
6500
6501 netdev_features_t qeth_fix_features(struct net_device *dev,
6502                                     netdev_features_t features)
6503 {
6504         struct qeth_card *card = dev->ml_priv;
6505
6506         QETH_DBF_TEXT(SETUP, 2, "fixfeat");
6507         if (!qeth_is_supported(card, IPA_OUTBOUND_CHECKSUM))
6508                 features &= ~NETIF_F_IP_CSUM;
6509         if (!qeth_is_supported(card, IPA_INBOUND_CHECKSUM))
6510                 features &= ~NETIF_F_RXCSUM;
6511         if (!qeth_is_supported(card, IPA_OUTBOUND_TSO))
6512                 features &= ~NETIF_F_TSO;
6513         /* if the card isn't up, remove features that require hw changes */
6514         if (card->state == CARD_STATE_DOWN ||
6515             card->state == CARD_STATE_RECOVER)
6516                 features = features & ~(NETIF_F_IP_CSUM | NETIF_F_RXCSUM |
6517                                         NETIF_F_TSO);
6518         QETH_DBF_HEX(SETUP, 2, &features, sizeof(features));
6519         return features;
6520 }
6521 EXPORT_SYMBOL_GPL(qeth_fix_features);
6522
6523 netdev_features_t qeth_features_check(struct sk_buff *skb,
6524                                       struct net_device *dev,
6525                                       netdev_features_t features)
6526 {
6527         /* GSO segmentation builds skbs with
6528          *      a (small) linear part for the headers, and
6529          *      page frags for the data.
6530          * Compared to a linear skb, the header-only part consumes an
6531          * additional buffer element. This reduces buffer utilization, and
6532          * hurts throughput. So compress small segments into one element.
6533          */
6534         if (netif_needs_gso(skb, features)) {
6535                 /* match skb_segment(): */
6536                 unsigned int doffset = skb->data - skb_mac_header(skb);
6537                 unsigned int hsize = skb_shinfo(skb)->gso_size;
6538                 unsigned int hroom = skb_headroom(skb);
6539
6540                 /* linearize only if resulting skb allocations are order-0: */
6541                 if (SKB_DATA_ALIGN(hroom + doffset + hsize) <= SKB_MAX_HEAD(0))
6542                         features &= ~NETIF_F_SG;
6543         }
6544
6545         return vlan_features_check(skb, features);
6546 }
6547 EXPORT_SYMBOL_GPL(qeth_features_check);
6548
6549 static int __init qeth_core_init(void)
6550 {
6551         int rc;
6552
6553         pr_info("loading core functions\n");
6554         INIT_LIST_HEAD(&qeth_core_card_list.list);
6555         INIT_LIST_HEAD(&qeth_dbf_list);
6556         rwlock_init(&qeth_core_card_list.rwlock);
6557         mutex_init(&qeth_mod_mutex);
6558
6559         qeth_wq = create_singlethread_workqueue("qeth_wq");
6560
6561         rc = qeth_register_dbf_views();
6562         if (rc)
6563                 goto out_err;
6564         qeth_core_root_dev = root_device_register("qeth");
6565         rc = PTR_ERR_OR_ZERO(qeth_core_root_dev);
6566         if (rc)
6567                 goto register_err;
6568         qeth_core_header_cache = kmem_cache_create("qeth_hdr",
6569                         sizeof(struct qeth_hdr) + ETH_HLEN, 64, 0, NULL);
6570         if (!qeth_core_header_cache) {
6571                 rc = -ENOMEM;
6572                 goto slab_err;
6573         }
6574         qeth_qdio_outbuf_cache = kmem_cache_create("qeth_buf",
6575                         sizeof(struct qeth_qdio_out_buffer), 0, 0, NULL);
6576         if (!qeth_qdio_outbuf_cache) {
6577                 rc = -ENOMEM;
6578                 goto cqslab_err;
6579         }
6580         rc = ccw_driver_register(&qeth_ccw_driver);
6581         if (rc)
6582                 goto ccw_err;
6583         qeth_core_ccwgroup_driver.driver.groups = qeth_drv_attr_groups;
6584         rc = ccwgroup_driver_register(&qeth_core_ccwgroup_driver);
6585         if (rc)
6586                 goto ccwgroup_err;
6587
6588         return 0;
6589
6590 ccwgroup_err:
6591         ccw_driver_unregister(&qeth_ccw_driver);
6592 ccw_err:
6593         kmem_cache_destroy(qeth_qdio_outbuf_cache);
6594 cqslab_err:
6595         kmem_cache_destroy(qeth_core_header_cache);
6596 slab_err:
6597         root_device_unregister(qeth_core_root_dev);
6598 register_err:
6599         qeth_unregister_dbf_views();
6600 out_err:
6601         pr_err("Initializing the qeth device driver failed\n");
6602         return rc;
6603 }
6604
6605 static void __exit qeth_core_exit(void)
6606 {
6607         qeth_clear_dbf_list();
6608         destroy_workqueue(qeth_wq);
6609         ccwgroup_driver_unregister(&qeth_core_ccwgroup_driver);
6610         ccw_driver_unregister(&qeth_ccw_driver);
6611         kmem_cache_destroy(qeth_qdio_outbuf_cache);
6612         kmem_cache_destroy(qeth_core_header_cache);
6613         root_device_unregister(qeth_core_root_dev);
6614         qeth_unregister_dbf_views();
6615         pr_info("core functions removed\n");
6616 }
6617
6618 module_init(qeth_core_init);
6619 module_exit(qeth_core_exit);
6620 MODULE_AUTHOR("Frank Blaschka <frank.blaschka@de.ibm.com>");
6621 MODULE_DESCRIPTION("qeth core functions");
6622 MODULE_LICENSE("GPL");