ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.6.tar.bz2
[linux-2.6.git] / drivers / s390 / net / qeth_main.c
1 /*
2  *
3  * linux/drivers/s390/net/qeth_main.c ($Revision: 1.89 $)
4  *
5  * Linux on zSeries OSA Express and HiperSockets support
6  *
7  * Copyright 2000,2003 IBM Corporation
8  *
9  *    Author(s): Original Code written by
10  *                        Utz Bacher (utz.bacher@de.ibm.com)
11  *               Rewritten by
12  *                        Frank Pavlic (pavlic@de.ibm.com) and
13  *                        Thomas Spatzier <tspat@de.ibm.com>
14  *
15  *    $Revision: 1.89 $  $Date: 2004/04/27 16:27:26 $
16  *
17  * This program is free software; you can redistribute it and/or modify
18  * it under the terms of the GNU General Public License as published by
19  * the Free Software Foundation; either version 2, or (at your option)
20  * any later version.
21  *
22  * This program is distributed in the hope that it will be useful,
23  * but WITHOUT ANY WARRANTY; without even the implied warranty of
24  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
25  * GNU General Public License for more details.
26  *
27  * You should have received a copy of the GNU General Public License
28  * along with this program; if not, write to the Free Software
29  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
30  */
31
32
33 /***
34  * eye catcher; just for debugging purposes
35  */
36 void volatile
37 qeth_eyecatcher(void)
38 {
39         return;
40 }
41
42 #include <linux/config.h>
43 #include <linux/module.h>
44 #include <linux/moduleparam.h>
45
46 #include <linux/string.h>
47 #include <linux/errno.h>
48 #include <linux/mm.h>
49
50 #include <asm/io.h>
51 #include <asm/ebcdic.h>
52 #include <linux/ctype.h>
53 #include <asm/semaphore.h>
54 #include <asm/timex.h>
55 #include <linux/ip.h>
56 #include <linux/inetdevice.h>
57 #include <linux/netdevice.h>
58 #include <linux/sched.h>
59 #include <linux/workqueue.h>
60 #include <linux/kernel.h>
61 #include <linux/slab.h>
62 #include <linux/interrupt.h>
63 #include <linux/tcp.h>
64 #include <linux/icmp.h>
65 #include <linux/skbuff.h>
66 #include <net/route.h>
67 #include <net/arp.h>
68 #include <linux/in.h>
69 #include <linux/igmp.h>
70 #include <net/ip.h>
71 #include <asm/uaccess.h>
72 #include <linux/init.h>
73 #include <linux/reboot.h>
74 #include <asm/qeth.h>
75 #include <linux/mii.h>
76
77 #include "qeth.h"
78 #include "qeth_mpc.h"
79 #include "qeth_fs.h"
80
81 #define VERSION_QETH_C "$Revision: 1.89 $"
82 static const char *version = "qeth S/390 OSA-Express driver ("
83         VERSION_QETH_C "/" VERSION_QETH_H "/" VERSION_QETH_MPC_H
84         QETH_VERSION_IPV6 QETH_VERSION_VLAN ")";
85 /**
86  * Debug Facility Stuff
87  */
88 static debug_info_t *qeth_dbf_setup = NULL;
89 static debug_info_t *qeth_dbf_data = NULL;
90 static debug_info_t *qeth_dbf_misc = NULL;
91 static debug_info_t *qeth_dbf_control = NULL;
92 static debug_info_t *qeth_dbf_trace = NULL;
93 static debug_info_t *qeth_dbf_sense = NULL;
94 static debug_info_t *qeth_dbf_qerr = NULL;
95 static char qeth_dbf_text_buf[255];
96
97 /**
98  * some more definitions and declarations
99  */
100 static unsigned int known_devices[][10] = QETH_MODELLIST_ARRAY;
101
102 /* list of our cards */
103 struct qeth_card_list_struct qeth_card_list;
104
105 static void qeth_send_control_data_cb(struct qeth_channel *,
106                                       struct qeth_cmd_buffer *);
107
108 static atomic_t qeth_hsi_count;
109
110 /**
111  * here we go with function implementation
112  */
113 static void
114 qeth_init_qdio_info(struct qeth_card *card);
115
116 static int
117 qeth_init_qdio_queues(struct qeth_card *card);
118
119 static int
120 qeth_alloc_qdio_buffers(struct qeth_card *card);
121
122 static void
123 qeth_free_qdio_buffers(struct qeth_card *);
124
125 static void
126 qeth_clear_qdio_buffers(struct qeth_card *);
127
128 static void
129 qeth_clear_ip_list(struct qeth_card *, int, int);
130
131 static void
132 qeth_clear_ipacmd_list(struct qeth_card *);
133
134 static int
135 qeth_qdio_clear_card(struct qeth_card *, int);
136
137 static void
138 qeth_clear_working_pool_list(struct qeth_card *);
139
140 static void
141 qeth_clear_cmd_buffers(struct qeth_channel *);
142
143 static int
144 qeth_stop(struct net_device *);
145
146 static void
147 qeth_clear_ipato_list(struct qeth_card *);
148
149 static int
150 qeth_is_addr_covered_by_ipato(struct qeth_card *, struct qeth_ipaddr *);
151
152 static void
153 qeth_irq_tasklet(unsigned long);
154
155 static int
156 qeth_set_online(struct ccwgroup_device *);
157 /**
158  * free channel command buffers
159  */
160 static void
161 qeth_clean_channel(struct qeth_channel *channel)
162 {
163         int cnt;
164
165         QETH_DBF_TEXT(setup, 2, "freech");
166         for (cnt = 0; cnt < QETH_CMD_BUFFER_NO; cnt++)
167                 kfree(channel->iob[cnt].data);
168 }
169
170 /**
171  * free card
172  */
173 static void
174 qeth_free_card(struct qeth_card *card)
175 {
176
177         QETH_DBF_TEXT(setup, 2, "freecrd");
178         QETH_DBF_HEX(setup, 2, &card, sizeof(void *));
179         qeth_clean_channel(&card->read);
180         qeth_clean_channel(&card->write);
181         if (card->dev)
182                 free_netdev(card->dev);
183         qeth_clear_ip_list(card, 0, 0);
184         qeth_clear_ipato_list(card);
185         qeth_free_qdio_buffers(card);
186         kfree(card);
187 }
188
189 /**
190  * alloc memory for command buffer per channel
191  */
192 static int
193 qeth_setup_channel(struct qeth_channel *channel)
194 {
195         int cnt;
196
197         QETH_DBF_TEXT(setup, 2, "setupch");
198         for (cnt=0; cnt < QETH_CMD_BUFFER_NO; cnt++) {
199                 channel->iob[cnt].data = (char *)
200                         kmalloc(QETH_BUFSIZE, GFP_DMA|GFP_KERNEL);
201                 if (channel->iob[cnt].data == NULL)
202                         break;
203                 channel->iob[cnt].state = BUF_STATE_FREE;
204                 channel->iob[cnt].channel = channel;
205                 channel->iob[cnt].callback = qeth_send_control_data_cb;
206                 channel->iob[cnt].rc = 0;
207         }
208         if (cnt < QETH_CMD_BUFFER_NO) {
209                 while (cnt-- > 0)
210                         kfree(channel->iob[cnt].data);
211                 return -ENOMEM;
212         }
213         channel->buf_no = 0;
214         channel->io_buf_no = 0;
215         atomic_set(&channel->irq_pending, 0);
216         spin_lock_init(&channel->iob_lock);
217
218         init_waitqueue_head(&channel->wait_q);
219         channel->irq_tasklet.data = (unsigned long) channel;
220         channel->irq_tasklet.func = qeth_irq_tasklet;
221         return 0;
222 }
223
224 /**
225  * alloc memory for card structure
226  */
227 static struct qeth_card *
228 qeth_alloc_card(void)
229 {
230         struct qeth_card *card;
231
232         QETH_DBF_TEXT(setup, 2, "alloccrd");
233         card = (struct qeth_card *) kmalloc(sizeof(struct qeth_card),
234                                             GFP_DMA|GFP_KERNEL);
235         if (!card)
236                 return NULL;
237         QETH_DBF_HEX(setup, 2, &card, sizeof(void *));
238         memset(card, 0, sizeof(struct qeth_card));
239         if (qeth_setup_channel(&card->read)) {
240                 kfree(card);
241                 return NULL;
242         }
243         if (qeth_setup_channel(&card->write)) {
244                 qeth_clean_channel(&card->read);
245                 kfree(card);
246                 return NULL;
247         }
248         return card;
249 }
250
251 static long
252 __qeth_check_irb_error(struct ccw_device *cdev, struct irb *irb)
253 {
254         if (!IS_ERR(irb))
255                 return 0;
256
257         switch (PTR_ERR(irb)) {
258         case -EIO:
259                 PRINT_WARN("i/o-error on device %s\n", cdev->dev.bus_id);
260                 QETH_DBF_TEXT(trace, 2, "ckirberr");
261                 QETH_DBF_TEXT_(trace, 2, "  rc%d", -EIO);
262                 break;
263         case -ETIMEDOUT:
264                 PRINT_WARN("timeout on device %s\n", cdev->dev.bus_id);
265                 QETH_DBF_TEXT(trace, 2, "ckirberr");
266                 QETH_DBF_TEXT_(trace, 2, "  rc%d", -ETIMEDOUT);
267                 break;
268         default:
269                 PRINT_WARN("unknown error %ld on device %s\n", PTR_ERR(irb),
270                            cdev->dev.bus_id);
271                 QETH_DBF_TEXT(trace, 2, "ckirberr");
272                 QETH_DBF_TEXT(trace, 2, "  rc???");
273         }
274         return PTR_ERR(irb);
275 }
276
277 static int
278 qeth_get_problem(struct ccw_device *cdev, struct irb *irb)
279 {
280         int dstat,cstat;
281         char *sense;
282
283         sense = (char *) irb->ecw;
284         cstat = irb->scsw.cstat;
285         dstat = irb->scsw.dstat;
286
287         if (cstat & (SCHN_STAT_CHN_CTRL_CHK | SCHN_STAT_INTF_CTRL_CHK |
288                      SCHN_STAT_CHN_DATA_CHK | SCHN_STAT_CHAIN_CHECK |
289                      SCHN_STAT_PROT_CHECK | SCHN_STAT_PROG_CHECK)) {
290                 QETH_DBF_TEXT(trace,2, "CGENCHK");
291                 PRINT_WARN("check on device %s, dstat=x%x, cstat=x%x ",
292                            cdev->dev.bus_id, dstat, cstat);
293                 HEXDUMP16(WARN, "irb: ", irb);
294                 HEXDUMP16(WARN, "irb: ", ((char *) irb) + 32);
295                 return 1;
296         }
297
298         if (dstat & DEV_STAT_UNIT_CHECK) {
299                 if (sense[SENSE_RESETTING_EVENT_BYTE] &
300                     SENSE_RESETTING_EVENT_FLAG) {
301                         QETH_DBF_TEXT(trace,2,"REVIND");
302                         return 1;
303                 }
304                 if (sense[SENSE_COMMAND_REJECT_BYTE] &
305                     SENSE_COMMAND_REJECT_FLAG) {
306                         QETH_DBF_TEXT(trace,2,"CMDREJi");
307                         return 0;
308                 }
309                 if ((sense[2] == 0xaf) && (sense[3] == 0xfe)) {
310                         QETH_DBF_TEXT(trace,2,"AFFE");
311                         return 1;
312                 }
313                 if ((!sense[0]) && (!sense[1]) && (!sense[2]) && (!sense[3])) {
314                         QETH_DBF_TEXT(trace,2,"ZEROSEN");
315                         return 0;
316                 }
317                 QETH_DBF_TEXT(trace,2,"DGENCHK");
318                         return 1;
319         }
320         return 0;
321 }
322 static int qeth_issue_next_read(struct qeth_card *);
323
324 /**
325  * interrupt handler
326  */
327 static void
328 qeth_irq(struct ccw_device *cdev, unsigned long intparm, struct irb *irb)
329 {
330         int rc;
331         int cstat,dstat;
332         struct qeth_cmd_buffer *buffer;
333         struct qeth_channel *channel;
334         struct qeth_card *card;
335
336         QETH_DBF_TEXT(trace,5,"irq");
337
338         if (__qeth_check_irb_error(cdev, irb))
339                 return;
340         cstat = irb->scsw.cstat;
341         dstat = irb->scsw.dstat;
342
343         card = CARD_FROM_CDEV(cdev);
344         if (!card)
345                 return;
346
347         if (card->read.ccwdev == cdev){
348                 channel = &card->read;
349                 QETH_DBF_TEXT(trace,5,"read");
350         } else if (card->write.ccwdev == cdev) {
351                 channel = &card->write;
352                 QETH_DBF_TEXT(trace,5,"write");
353         } else {
354                 channel = &card->data;
355                 QETH_DBF_TEXT(trace,5,"data");
356         }
357         atomic_set(&channel->irq_pending, 0);
358
359         if (irb->scsw.fctl & (SCSW_FCTL_CLEAR_FUNC))
360                 channel->state = CH_STATE_STOPPED;
361
362         if (irb->scsw.fctl & (SCSW_FCTL_HALT_FUNC))
363                 channel->state = CH_STATE_HALTED;
364
365         /*let's wake up immediately on data channel*/
366         if ((channel == &card->data) && (intparm != 0))
367                 goto out;
368
369         if (intparm == QETH_CLEAR_CHANNEL_PARM) {
370                 QETH_DBF_TEXT(trace, 6, "clrchpar");
371                 /* we don't have to handle this further */
372                 intparm = 0;
373         }
374         if (intparm == QETH_HALT_CHANNEL_PARM) {
375                 QETH_DBF_TEXT(trace, 6, "hltchpar");
376                 /* we don't have to handle this further */
377                 intparm = 0;
378         }
379         if ((dstat & DEV_STAT_UNIT_EXCEP) ||
380             (dstat & DEV_STAT_UNIT_CHECK) ||
381             (cstat)) {
382                 if (irb->esw.esw0.erw.cons) {
383                         /* TODO: we should make this s390dbf */
384                         PRINT_WARN("sense data available on channel %s.\n",
385                                    CHANNEL_ID(channel));
386                         PRINT_WARN(" cstat 0x%X\n dstat 0x%X\n", cstat, dstat);
387                         HEXDUMP16(WARN,"irb: ",irb);
388                         HEXDUMP16(WARN,"sense data: ",irb->ecw);
389                 }
390                 rc = qeth_get_problem(cdev,irb);
391                 if (rc) {
392                         qeth_schedule_recovery(card);
393                         goto out;
394                 }
395         }
396
397         if (intparm) {
398                 buffer = (struct qeth_cmd_buffer *) __va((addr_t)intparm);
399                 buffer->state = BUF_STATE_PROCESSED;
400         }
401         if (channel == &card->data)
402                 return;
403
404         if (channel == &card->read &&
405             channel->state == CH_STATE_UP)
406                 qeth_issue_next_read(card);
407
408         tasklet_schedule(&channel->irq_tasklet);
409         return;
410 out:
411         wake_up(&card->wait_q);
412 }
413
414 /**
415  * tasklet function scheduled from irq handler
416  */
417 static void
418 qeth_irq_tasklet(unsigned long data)
419 {
420         struct qeth_card *card;
421         struct qeth_channel *channel;
422         struct qeth_cmd_buffer *iob;
423         __u8 index;
424
425         QETH_DBF_TEXT(trace,5,"irqtlet");
426         channel = (struct qeth_channel *) data;
427         iob = channel->iob;
428         index = channel->buf_no;
429         card = CARD_FROM_CDEV(channel->ccwdev);
430         while (iob[index].state == BUF_STATE_PROCESSED) {
431                 if (iob[index].callback !=NULL) {
432                         iob[index].callback(channel,iob + index);
433                 }
434                 index = (index + 1) % QETH_CMD_BUFFER_NO;
435         }
436         channel->buf_no = index;
437         wake_up(&card->wait_q);
438 }
439
440 static int qeth_stop_card(struct qeth_card *);
441
442 static int
443 qeth_set_offline(struct ccwgroup_device *cgdev)
444 {
445         struct qeth_card *card = (struct qeth_card *) cgdev->dev.driver_data;
446         enum qeth_card_states recover_flag;
447
448         QETH_DBF_TEXT(setup, 3, "setoffl");
449         QETH_DBF_HEX(setup, 3, &card, sizeof(void *));
450
451         recover_flag = card->state;
452         if (qeth_stop_card(card) == -ERESTARTSYS){
453                 PRINT_WARN("Stopping card %s interrupted by user!\n",
454                            CARD_BUS_ID(card));
455                 return -ERESTARTSYS;
456         }
457         ccw_device_set_offline(CARD_DDEV(card));
458         ccw_device_set_offline(CARD_WDEV(card));
459         ccw_device_set_offline(CARD_RDEV(card));
460         if (recover_flag == CARD_STATE_UP)
461                 card->state = CARD_STATE_RECOVER;
462         return 0;
463 }
464
465 static void
466 qeth_remove_device(struct ccwgroup_device *cgdev)
467 {
468         struct qeth_card *card = (struct qeth_card *) cgdev->dev.driver_data;
469         unsigned long flags;
470
471         QETH_DBF_TEXT(setup, 3, "rmdev");
472         QETH_DBF_HEX(setup, 3, &card, sizeof(void *));
473
474         if (!card)
475                 return;
476
477         if (cgdev->state == CCWGROUP_ONLINE){
478                 card->use_hard_stop = 1;
479                 qeth_set_offline(cgdev);
480         }
481         if (card->info.type == QETH_CARD_TYPE_IQD)
482                 atomic_dec(&qeth_hsi_count);
483         /* remove form our internal list */
484         write_lock_irqsave(&qeth_card_list.rwlock, flags);
485         list_del(&card->list);
486         write_unlock_irqrestore(&qeth_card_list.rwlock, flags);
487         if (card->dev)
488                 unregister_netdev(card->dev);
489         qeth_remove_device_attributes(&cgdev->dev);
490         qeth_free_card(card);
491         cgdev->dev.driver_data = NULL;
492         put_device(&cgdev->dev);
493 }
494
495 static int
496 qeth_register_addr_entry(struct qeth_card *, struct qeth_ipaddr *);
497 static int
498 qeth_deregister_addr_entry(struct qeth_card *, struct qeth_ipaddr *);
499
500 /**
501  * Add/remove address to/from card's ip list, i.e. try to add or remove
502  * reference to/from an IP address that is already registered on the card.
503  * Returns:
504  *      0  address was on card and its reference count has been adjusted,
505  *         but is still > 0, so nothing has to be done
506  *         also returns 0 if card was not on card and the todo was to delete
507  *         the address -> there is also nothing to be done
508  *      1  address was not on card and the todo is to add it to the card's ip
509  *         list
510  *      -1 address was on card and its reference count has been decremented
511  *         to <= 0 by the todo -> address must be removed from card
512  */
513 static int
514 __qeth_ref_ip_on_card(struct qeth_card *card, struct qeth_ipaddr *todo,
515                       struct qeth_ipaddr **__addr)
516 {
517         struct qeth_ipaddr *addr;
518         int found = 0;
519
520         list_for_each_entry(addr, &card->ip_list, entry) {
521                 if ((addr->proto     == QETH_PROT_IPV4)  &&
522                     (todo->proto     == QETH_PROT_IPV4)  &&
523                     (addr->type      == todo->type)      &&
524                     (addr->u.a4.addr == todo->u.a4.addr) &&
525                     (addr->u.a4.mask == todo->u.a4.mask)   ){
526                         found = 1;
527                         break;
528                 }
529                 if ((addr->proto       == QETH_PROT_IPV6)     &&
530                     (todo->proto       == QETH_PROT_IPV6)     &&
531                     (addr->type        == todo->type)         &&
532                     (addr->u.a6.pfxlen == todo->u.a6.pfxlen)  &&
533                     (memcmp(&addr->u.a6.addr, &todo->u.a6.addr,
534                             sizeof(struct in6_addr)) == 0))     {
535                         found = 1;
536                         break;
537                 }
538         }
539         if (found){
540                 addr->users += todo->users;
541                 if (addr->users <= 0){
542                         *__addr = addr;
543                         return -1;
544                 } else {
545                         /* for VIPA and RXIP limit refcount to 1 */
546                         if (addr->type != QETH_IP_TYPE_NORMAL)
547                                 addr->users = 1;
548                         return 0;
549                 }
550         }
551         if (todo->users > 0){
552                 /* for VIPA and RXIP limit refcount to 1 */
553                 if (todo->type != QETH_IP_TYPE_NORMAL)
554                         addr->users = 1;
555                 return 1;
556         } else
557                 return 0;
558 }
559
560 static inline int
561 __qeth_address_exists_in_list(struct list_head *list, struct qeth_ipaddr *addr,
562                               int same_type)
563 {
564         struct qeth_ipaddr *tmp;
565
566         list_for_each_entry(tmp, list, entry) {
567                 if ((tmp->proto     == QETH_PROT_IPV4)            &&
568                     (addr->proto    == QETH_PROT_IPV4)            &&
569                     ((same_type && (tmp->type == addr->type)) ||
570                      (!same_type && (tmp->type != addr->type))  ) &&
571                     (tmp->u.a4.addr == addr->u.a4.addr)             ){
572                         return 1;
573                 }
574                 if ((tmp->proto  == QETH_PROT_IPV6)               &&
575                     (addr->proto == QETH_PROT_IPV6)               &&
576                     ((same_type && (tmp->type == addr->type)) ||
577                      (!same_type && (tmp->type != addr->type))  ) &&
578                     (memcmp(&tmp->u.a6.addr, &addr->u.a6.addr,
579                             sizeof(struct in6_addr)) == 0)          ) {
580                         return 1;
581                 }
582         }
583         return 0;
584 }
585
586 /*
587  * Add IP to be added to todo list. If there is already an "add todo"
588  * in this list we just incremenent the reference count.
589  * Returns 0 if we  just incremented reference count.
590  */
591 static int
592 __qeth_insert_ip_todo(struct qeth_card *card, struct qeth_ipaddr *addr, int add)
593 {
594         struct qeth_ipaddr *tmp, *t;
595         int found = 0;
596
597         list_for_each_entry_safe(tmp, t, &card->ip_tbd_list, entry) {
598                 if ((tmp->proto        == QETH_PROT_IPV4)     &&
599                     (addr->proto       == QETH_PROT_IPV4)     &&
600                     (tmp->type         == addr->type)         &&
601                     (tmp->is_multicast == addr->is_multicast) &&
602                     (tmp->u.a4.addr    == addr->u.a4.addr)    &&
603                     (tmp->u.a4.mask    == addr->u.a4.mask)      ){
604                         found = 1;
605                         break;
606                 }
607                 if ((tmp->proto        == QETH_PROT_IPV6)      &&
608                     (addr->proto       == QETH_PROT_IPV6)      &&
609                     (tmp->type         == addr->type)          &&
610                     (tmp->is_multicast == addr->is_multicast)  &&
611                     (tmp->u.a6.pfxlen  == addr->u.a6.pfxlen)   &&
612                     (memcmp(&tmp->u.a6.addr, &addr->u.a6.addr,
613                             sizeof(struct in6_addr)) == 0)        ){
614                         found = 1;
615                         break;
616                 }
617         }
618         if (found){
619                 if (addr->users != 0)
620                         tmp->users += addr->users;
621                 else
622                         tmp->users += add? 1:-1;
623                 if (tmp->users == 0){
624                         list_del(&tmp->entry);
625                         kfree(tmp);
626                 }
627                 return 0;
628         } else {
629                 if (addr->users == 0)
630                         addr->users += add? 1:-1;
631                 if (add && (addr->type == QETH_IP_TYPE_NORMAL) &&
632                     qeth_is_addr_covered_by_ipato(card, addr)){
633                         QETH_DBF_TEXT(trace, 2, "tkovaddr");
634                         addr->set_flags |= QETH_IPA_SETIP_TAKEOVER_FLAG;
635                 }
636                 list_add_tail(&addr->entry, &card->ip_tbd_list);
637                 return 1;
638         }
639 }
640
641 /**
642  * Remove IP address from list
643  */
644 static int
645 qeth_delete_ip(struct qeth_card *card, struct qeth_ipaddr *addr)
646 {
647         unsigned long flags;
648         int rc = 0;
649
650         QETH_DBF_TEXT(trace,4,"delip");
651         if (addr->proto == QETH_PROT_IPV4)
652                 QETH_DBF_HEX(trace,4,&addr->u.a4.addr,4);
653         else {
654                 QETH_DBF_HEX(trace,4,&addr->u.a6.addr,4);
655                 QETH_DBF_HEX(trace,4,((char *)&addr->u.a6.addr)+4,4);
656         }
657         spin_lock_irqsave(&card->ip_lock, flags);
658         rc = __qeth_insert_ip_todo(card, addr, 0);
659         spin_unlock_irqrestore(&card->ip_lock, flags);
660         return rc;
661 }
662
663 static int
664 qeth_add_ip(struct qeth_card *card, struct qeth_ipaddr *addr)
665 {
666         unsigned long flags;
667         int rc = 0;
668
669         QETH_DBF_TEXT(trace,4,"addip");
670         if (addr->proto == QETH_PROT_IPV4)
671                 QETH_DBF_HEX(trace,4,&addr->u.a4.addr,4);
672         else {
673                 QETH_DBF_HEX(trace,4,&addr->u.a6.addr,4);
674                 QETH_DBF_HEX(trace,4,((char *)&addr->u.a6.addr)+4,4);
675         }
676         spin_lock_irqsave(&card->ip_lock, flags);
677         rc = __qeth_insert_ip_todo(card, addr, 1);
678         spin_unlock_irqrestore(&card->ip_lock, flags);
679         return rc;
680 }
681
682 static void
683 qeth_reinsert_todos(struct qeth_card *card, struct list_head *todos)
684 {
685         struct qeth_ipaddr *todo, *tmp;
686
687         list_for_each_entry_safe(todo, tmp, todos, entry){
688                 list_del_init(&todo->entry);
689                 if (todo->users < 0) {
690                         if (!qeth_delete_ip(card, todo))
691                                 kfree(todo);
692                 } else {
693                         if (!qeth_add_ip(card, todo))
694                                 kfree(todo);
695                 }
696         }
697 }
698
699 static void
700 qeth_set_ip_addr_list(struct qeth_card *card)
701 {
702         struct list_head failed_todos;
703         struct qeth_ipaddr *todo, *addr, *tmp;
704         unsigned long flags;
705         int rc;
706
707         QETH_DBF_TEXT(trace, 2, "sdiplist");
708         QETH_DBF_HEX(trace, 2, &card, sizeof(void *));
709
710         INIT_LIST_HEAD(&failed_todos);
711
712 process_todos:
713         spin_lock_irqsave(&card->ip_lock, flags);
714         list_for_each_entry_safe(todo, tmp, &card->ip_tbd_list, entry) {
715                 list_del_init(&todo->entry);
716                 rc = __qeth_ref_ip_on_card(card, todo, &addr);
717                 if (rc == 0) {
718                         /* nothing to be done; only adjusted refcount */
719                         kfree(todo);
720                 } else if (rc == 1) {
721                         /* new entry to be added to on-card list */
722                         spin_unlock_irqrestore(&card->ip_lock, flags);
723                         rc = qeth_register_addr_entry(card, todo);
724                         if (!rc){
725                                 spin_lock_irqsave(&card->ip_lock, flags);
726                                 list_add_tail(&todo->entry, &card->ip_list);
727                                 spin_unlock_irqrestore(&card->ip_lock, flags);
728                         } else
729                                 list_add_tail(&todo->entry, &failed_todos);
730                         goto process_todos;
731                 } else if (rc == -1) {
732                         /* on-card entry to be removed */
733                         list_del_init(&addr->entry);
734                         spin_unlock_irqrestore(&card->ip_lock, flags);
735                         rc = qeth_deregister_addr_entry(card, addr);
736                         if (!rc) {
737                                 kfree(addr);
738                                 kfree(todo);
739                         } else {
740                                 spin_lock_irqsave(&card->ip_lock, flags);
741                                 list_add_tail(&addr->entry, &card->ip_list);
742                                 list_add_tail(&todo->entry, &failed_todos);
743                                 spin_unlock_irqrestore(&card->ip_lock, flags);
744                         }
745                         goto process_todos;
746                 }
747         }
748         spin_unlock_irqrestore(&card->ip_lock, flags);
749         qeth_reinsert_todos(card, &failed_todos);
750 }
751
752 static void qeth_delete_mc_addresses(struct qeth_card *);
753 static void qeth_add_multicast_ipv4(struct qeth_card *);
754 #ifdef CONFIG_QETH_IPV6
755 static void qeth_add_multicast_ipv6(struct qeth_card *);
756 #endif
757
758 static void
759 qeth_set_thread_start_bit(struct qeth_card *card, unsigned long thread)
760 {
761         unsigned long flags;
762
763         spin_lock_irqsave(&card->thread_mask_lock, flags);
764         card->thread_start_mask |= thread;
765         spin_unlock_irqrestore(&card->thread_mask_lock, flags);
766 }
767
768 static void
769 qeth_clear_thread_start_bit(struct qeth_card *card, unsigned long thread)
770 {
771         unsigned long flags;
772
773         spin_lock_irqsave(&card->thread_mask_lock, flags);
774         card->thread_start_mask &= ~thread;
775         spin_unlock_irqrestore(&card->thread_mask_lock, flags);
776         wake_up(&card->wait_q);
777 }
778
779 static void
780 qeth_clear_thread_running_bit(struct qeth_card *card, unsigned long thread)
781 {
782         unsigned long flags;
783
784         spin_lock_irqsave(&card->thread_mask_lock, flags);
785         card->thread_running_mask &= ~thread;
786         spin_unlock_irqrestore(&card->thread_mask_lock, flags);
787         wake_up(&card->wait_q);
788 }
789
790 static inline int
791 __qeth_do_run_thread(struct qeth_card *card, unsigned long thread)
792 {
793         unsigned long flags;
794         int rc = 0;
795
796         spin_lock_irqsave(&card->thread_mask_lock, flags);
797         if (card->thread_start_mask & thread){
798                 if ((card->thread_allowed_mask & thread) &&
799                     !(card->thread_running_mask & thread)){
800                         rc = 1;
801                         card->thread_start_mask &= ~thread;
802                         card->thread_running_mask |= thread;
803                 } else
804                         rc = -EPERM;
805         }
806         spin_unlock_irqrestore(&card->thread_mask_lock, flags);
807         return rc;
808 }
809
810 static int
811 qeth_do_run_thread(struct qeth_card *card, unsigned long thread)
812 {
813         int rc = 0;
814
815         wait_event(card->wait_q,
816                    (rc = __qeth_do_run_thread(card, thread)) >= 0);
817         return rc;
818 }
819
820 static int
821 qeth_register_mc_addresses(void *ptr)
822 {
823         struct qeth_card *card;
824
825         card = (struct qeth_card *) ptr;
826         daemonize("qeth_reg_mcaddrs");
827         QETH_DBF_TEXT(trace,4,"regmcth1");
828         if (!qeth_do_run_thread(card, QETH_SET_MC_THREAD))
829                 return 0;
830         QETH_DBF_TEXT(trace,4,"regmcth2");
831         qeth_delete_mc_addresses(card);
832         qeth_add_multicast_ipv4(card);
833 #ifdef CONFIG_QETH_IPV6
834         qeth_add_multicast_ipv6(card);
835 #endif
836         qeth_set_ip_addr_list(card);
837         qeth_clear_thread_running_bit(card, QETH_SET_MC_THREAD);
838         return 0;
839 }
840
841 static int
842 qeth_register_ip_address(void *ptr)
843 {
844         struct qeth_card *card;
845
846         card = (struct qeth_card *) ptr;
847         daemonize("qeth_reg_ip");
848         QETH_DBF_TEXT(trace,4,"regipth1");
849         if (!qeth_do_run_thread(card, QETH_SET_IP_THREAD))
850                 return 0;
851         QETH_DBF_TEXT(trace,4,"regipth2");
852         qeth_set_ip_addr_list(card);
853         qeth_clear_thread_running_bit(card, QETH_SET_IP_THREAD);
854         return 0;
855 }
856
857 static int
858 qeth_recover(void *ptr)
859 {
860         struct qeth_card *card;
861         int rc = 0;
862
863         card = (struct qeth_card *) ptr;
864         daemonize("qeth_recover");
865         QETH_DBF_TEXT(trace,2,"recover1");
866         QETH_DBF_HEX(trace, 2, &card, sizeof(void *));
867         if (!qeth_do_run_thread(card, QETH_RECOVER_THREAD))
868                 return 0;
869         QETH_DBF_TEXT(trace,2,"recover2");
870         PRINT_WARN("Recovery of device %s started ...\n",
871                    CARD_BUS_ID(card));
872         card->use_hard_stop = 1;
873         qeth_set_offline(card->gdev);
874         rc = qeth_set_online(card->gdev);
875         if (!rc)
876                 PRINT_INFO("Device %s successfully recovered!\n",
877                            CARD_BUS_ID(card));
878         else
879                 PRINT_INFO("Device %s could not be recovered!\n",
880                            CARD_BUS_ID(card));
881         /* don't run another scheduled recovery */
882         qeth_clear_thread_start_bit(card, QETH_RECOVER_THREAD);
883         qeth_clear_thread_running_bit(card, QETH_RECOVER_THREAD);
884         return 0;
885 }
886
887 void
888 qeth_schedule_recovery(struct qeth_card *card)
889 {
890         QETH_DBF_TEXT(trace,2,"startrec");
891
892         qeth_set_thread_start_bit(card, QETH_RECOVER_THREAD);
893         schedule_work(&card->kernel_thread_starter);
894 }
895
896 static int
897 qeth_do_start_thread(struct qeth_card *card, unsigned long thread)
898 {
899         unsigned long flags;
900         int rc = 0;
901
902         spin_lock_irqsave(&card->thread_mask_lock, flags);
903         QETH_DBF_TEXT_(trace, 4, "  %02x%02x%02x",
904                         (u8) card->thread_start_mask,
905                         (u8) card->thread_allowed_mask,
906                         (u8) card->thread_running_mask);
907         rc = (card->thread_start_mask & thread);
908         spin_unlock_irqrestore(&card->thread_mask_lock, flags);
909         return rc;
910 }
911
912 static void
913 qeth_start_kernel_thread(struct qeth_card *card)
914 {
915         QETH_DBF_TEXT(trace , 2, "strthrd");
916
917         if (card->read.state != CH_STATE_UP &&
918             card->write.state != CH_STATE_UP)
919                 return;
920
921         if (qeth_do_start_thread(card, QETH_SET_IP_THREAD))
922                 kernel_thread(qeth_register_ip_address, (void *) card, SIGCHLD);
923         if (qeth_do_start_thread(card, QETH_SET_MC_THREAD))
924                 kernel_thread(qeth_register_mc_addresses, (void *)card,SIGCHLD);
925         if (qeth_do_start_thread(card, QETH_RECOVER_THREAD))
926                 kernel_thread(qeth_recover, (void *) card, SIGCHLD);
927 }
928
929
930 static void
931 qeth_set_intial_options(struct qeth_card *card)
932 {
933         card->options.route4.type = NO_ROUTER;
934 #ifdef CONFIG_QETH_IPV6
935         card->options.route6.type = NO_ROUTER;
936 #endif /* QETH_IPV6 */
937         card->options.checksum_type = QETH_CHECKSUM_DEFAULT;
938         card->options.broadcast_mode = QETH_TR_BROADCAST_ALLRINGS;
939         card->options.macaddr_mode = QETH_TR_MACADDR_NONCANONICAL;
940         card->options.enable_takeover = 1;
941         card->options.fake_broadcast = 0;
942         card->options.add_hhlen = DEFAULT_ADD_HHLEN;
943         card->options.fake_ll = 0;
944 }
945
946 /**
947  * initialize channels ,card and all state machines
948  */
949 static int
950 qeth_setup_card(struct qeth_card *card)
951 {
952
953         QETH_DBF_TEXT(setup, 2, "setupcrd");
954         QETH_DBF_HEX(setup, 2, &card, sizeof(void *));
955
956         card->read.state  = CH_STATE_DOWN;
957         card->write.state = CH_STATE_DOWN;
958         card->data.state  = CH_STATE_DOWN;
959         card->state = CARD_STATE_DOWN;
960         card->lan_online = 0;
961         card->use_hard_stop = 0;
962         card->dev = NULL;
963 #ifdef CONFIG_QETH_VLAN
964         spin_lock_init(&card->vlanlock);
965         card->vlangrp = NULL;
966 #endif
967         spin_lock_init(&card->ip_lock);
968         spin_lock_init(&card->thread_mask_lock);
969         card->thread_start_mask = 0;
970         card->thread_allowed_mask = 0;
971         card->thread_running_mask = 0;
972         INIT_WORK(&card->kernel_thread_starter,
973                   (void *)qeth_start_kernel_thread,card);
974         INIT_LIST_HEAD(&card->ip_list);
975         INIT_LIST_HEAD(&card->ip_tbd_list);
976         INIT_LIST_HEAD(&card->cmd_waiter_list);
977         init_waitqueue_head(&card->wait_q);
978         /* intial options */
979         qeth_set_intial_options(card);
980         /* IP address takeover */
981         INIT_LIST_HEAD(&card->ipato.entries);
982         card->ipato.enabled = 0;
983         card->ipato.invert4 = 0;
984         card->ipato.invert6 = 0;
985         /* init QDIO stuff */
986         qeth_init_qdio_info(card);
987         return 0;
988 }
989
990 static int
991 qeth_determine_card_type(struct qeth_card *card)
992 {
993         int i = 0;
994
995         QETH_DBF_TEXT(setup, 2, "detcdtyp");
996
997         while (known_devices[i][4]) {
998                 if ((CARD_RDEV(card)->id.dev_type == known_devices[i][2]) &&
999                     (CARD_RDEV(card)->id.dev_model == known_devices[i][3])) {
1000                         card->info.type = known_devices[i][4];
1001                         if (card->options.enable_takeover)
1002                                 card->info.func_level = known_devices[i][6];
1003                         else
1004                                 card->info.func_level = known_devices[i][7];
1005                         card->qdio.no_out_queues = known_devices[i][8];
1006                         card->info.is_multicast_different = known_devices[i][9];
1007                         return 0;
1008                 }
1009                 i++;
1010         }
1011         card->info.type = QETH_CARD_TYPE_UNKNOWN;
1012         PRINT_ERR("unknown card type on device %s\n", CARD_BUS_ID(card));
1013         return -ENOENT;
1014 }
1015
1016 static int
1017 qeth_probe_device(struct ccwgroup_device *gdev)
1018 {
1019         struct qeth_card *card;
1020         struct device *dev;
1021         unsigned long flags;
1022         int rc;
1023
1024         QETH_DBF_TEXT(setup, 2, "probedev");
1025
1026         dev = &gdev->dev;
1027         if (!get_device(dev))
1028                 return -ENODEV;
1029
1030         card = qeth_alloc_card();
1031         if (!card) {
1032                 put_device(dev);
1033                 QETH_DBF_TEXT_(setup, 2, "1err%d", -ENOMEM);
1034                 return -ENOMEM;
1035         }
1036         if ((rc = qeth_setup_card(card))){
1037                 QETH_DBF_TEXT_(setup, 2, "2err%d", rc);
1038                 put_device(dev);
1039                 qeth_free_card(card);
1040                 return rc;
1041         }
1042         gdev->dev.driver_data = card;
1043         card->gdev = gdev;
1044         gdev->cdev[0]->handler = qeth_irq;
1045         gdev->cdev[1]->handler = qeth_irq;
1046         gdev->cdev[2]->handler = qeth_irq;
1047
1048         rc = qeth_create_device_attributes(dev);
1049         if (rc) {
1050                 put_device(dev);
1051                 qeth_free_card(card);
1052                 return rc;
1053         }
1054         card->read.ccwdev  = gdev->cdev[0];
1055         card->write.ccwdev = gdev->cdev[1];
1056         card->data.ccwdev  = gdev->cdev[2];
1057         if ((rc = qeth_determine_card_type(card))){
1058                 PRINT_WARN("%s: not a valid card type\n", __func__);
1059                 QETH_DBF_TEXT_(setup, 2, "3err%d", rc);
1060                 put_device(dev);
1061                 qeth_free_card(card);
1062                 return rc;
1063         }
1064         /* insert into our internal list */
1065         write_lock_irqsave(&qeth_card_list.rwlock, flags);
1066         list_add_tail(&card->list, &qeth_card_list.list);
1067         write_unlock_irqrestore(&qeth_card_list.rwlock, flags);
1068         return rc;
1069 }
1070
1071
1072 static int
1073 qeth_get_unitaddr(struct qeth_card *card)
1074 {
1075         int length;
1076         char *prcd;
1077         int rc;
1078
1079         QETH_DBF_TEXT(setup, 2, "getunit");
1080         rc = read_conf_data(CARD_DDEV(card), (void **) &prcd, &length);
1081         if (rc) {
1082                 PRINT_ERR("read_conf_data for device %s returned %i\n",
1083                           CARD_DDEV_ID(card), rc);
1084                 return rc;
1085         }
1086         card->info.chpid = prcd[30];
1087         card->info.unit_addr2 = prcd[31];
1088         card->info.cula = prcd[63];
1089         card->info.guestlan = ((prcd[0x10] == _ascebc['V']) &&
1090                                (prcd[0x11] == _ascebc['M']));
1091         return 0;
1092 }
1093
1094 static void
1095 qeth_init_tokens(struct qeth_card *card)
1096 {
1097         card->token.issuer_rm_w = 0x00010103UL;
1098         card->token.cm_filter_w = 0x00010108UL;
1099         card->token.cm_connection_w = 0x0001010aUL;
1100         card->token.ulp_filter_w = 0x0001010bUL;
1101         card->token.ulp_connection_w = 0x0001010dUL;
1102 }
1103
1104 static inline __u16
1105 raw_devno_from_bus_id(char *id)
1106 {
1107         id += (strlen(id) - 4);
1108         return (__u16) simple_strtoul(id, &id, 16);
1109 }
1110 /**
1111  * setup channel
1112  */
1113 static void
1114 qeth_setup_ccw(struct qeth_channel *channel,unsigned char *iob, __u32 len)
1115 {
1116         struct qeth_card *card;
1117
1118         QETH_DBF_TEXT(trace, 4, "setupccw");
1119         card = CARD_FROM_CDEV(channel->ccwdev);
1120         if (channel == &card->read)
1121                 memcpy(&channel->ccw, READ_CCW, sizeof(struct ccw1));
1122         else
1123                 memcpy(&channel->ccw, WRITE_CCW, sizeof(struct ccw1));
1124         channel->ccw.count = len;
1125         channel->ccw.cda = (__u32) __pa(iob);
1126 }
1127
1128 /**
1129  * get free buffer for ccws (IDX activation, lancmds,ipassists...)
1130  */
1131 static struct qeth_cmd_buffer *
1132 __qeth_get_buffer(struct qeth_channel *channel)
1133 {
1134         __u8 index;
1135
1136         QETH_DBF_TEXT(trace, 6, "getbuff");
1137         index = channel->io_buf_no;
1138         do {
1139                 if (channel->iob[index].state == BUF_STATE_FREE) {
1140                         channel->iob[index].state = BUF_STATE_LOCKED;
1141                         channel->io_buf_no = (channel->io_buf_no + 1) %
1142                                 QETH_CMD_BUFFER_NO;
1143                         memset(channel->iob[index].data, 0, QETH_BUFSIZE);
1144                         return channel->iob + index;
1145                 }
1146                 index = (index + 1) % QETH_CMD_BUFFER_NO;
1147         } while(index != channel->io_buf_no);
1148
1149         return NULL;
1150 }
1151
1152 /**
1153  * release command buffer
1154  */
1155 static void
1156 qeth_release_buffer(struct qeth_channel *channel, struct qeth_cmd_buffer *iob)
1157 {
1158         unsigned long flags;
1159
1160         QETH_DBF_TEXT(trace, 6, "relbuff");
1161         spin_lock_irqsave(&channel->iob_lock, flags);
1162         memset(iob->data, 0, QETH_BUFSIZE);
1163         iob->state = BUF_STATE_FREE;
1164         iob->callback = qeth_send_control_data_cb;
1165         iob->rc = 0;
1166         spin_unlock_irqrestore(&channel->iob_lock, flags);
1167 }
1168
1169 static struct qeth_cmd_buffer *
1170 qeth_get_buffer(struct qeth_channel *channel)
1171 {
1172         struct qeth_cmd_buffer *buffer = NULL;
1173         unsigned long flags;
1174
1175         spin_lock_irqsave(&channel->iob_lock, flags);
1176         buffer = __qeth_get_buffer(channel);
1177         spin_unlock_irqrestore(&channel->iob_lock, flags);
1178         return buffer;
1179 }
1180
1181 static struct qeth_cmd_buffer *
1182 qeth_wait_for_buffer(struct qeth_channel *channel)
1183 {
1184         struct qeth_cmd_buffer *buffer;
1185         wait_event(channel->wait_q,
1186                    ((buffer = qeth_get_buffer(channel)) != NULL));
1187         return buffer;
1188 }
1189
1190 static void
1191 qeth_clear_cmd_buffers(struct qeth_channel *channel)
1192 {
1193         int cnt = 0;
1194
1195         for (cnt=0; cnt < QETH_CMD_BUFFER_NO; cnt++)
1196                 qeth_release_buffer(channel,&channel->iob[cnt]);
1197         channel->buf_no = 0;
1198         channel->io_buf_no = 0;
1199 }
1200
1201 /**
1202  * start IDX for read and write channel
1203  */
1204 static int
1205 qeth_idx_activate_get_answer(struct qeth_channel *channel,
1206                               void (*idx_reply_cb)(struct qeth_channel *,
1207                                                    struct qeth_cmd_buffer *))
1208 {
1209         struct qeth_cmd_buffer *iob;
1210         unsigned long flags;
1211         int rc;
1212         struct qeth_card *card;
1213
1214         QETH_DBF_TEXT(setup, 2, "idxanswr");
1215         card = CARD_FROM_CDEV(channel->ccwdev);
1216         iob = qeth_get_buffer(channel);
1217         iob->callback = idx_reply_cb;
1218         memcpy(&channel->ccw, READ_CCW, sizeof(struct ccw1));
1219         channel->ccw.count = QETH_BUFSIZE;
1220         channel->ccw.cda = (__u32) __pa(iob->data);
1221
1222         wait_event(card->wait_q,
1223                    atomic_compare_and_swap(0,1,&channel->irq_pending) == 0);
1224         QETH_DBF_TEXT(setup, 6, "noirqpnd");
1225         spin_lock_irqsave(get_ccwdev_lock(channel->ccwdev), flags);
1226         rc = ccw_device_start(channel->ccwdev,
1227                               &channel->ccw,(addr_t) iob, 0, 0);
1228         spin_unlock_irqrestore(get_ccwdev_lock(channel->ccwdev), flags);
1229
1230         if (rc) {
1231                 PRINT_ERR("qeth: Error2 in activating channel rc=%d\n",rc);
1232                 QETH_DBF_TEXT_(setup, 2, "2err%d", rc);
1233                 atomic_set(&channel->irq_pending, 0);
1234                 wake_up(&card->wait_q);
1235                 return rc;
1236         }
1237         rc = wait_event_interruptible_timeout(card->wait_q,
1238                          channel->state == CH_STATE_UP, QETH_TIMEOUT);
1239         if (rc == -ERESTARTSYS)
1240                 return rc;
1241         if (channel->state != CH_STATE_UP){
1242                 rc = -ETIME;
1243                 QETH_DBF_TEXT_(setup, 2, "3err%d", rc);
1244         } else
1245                 rc = 0;
1246         return rc;
1247 }
1248
1249 static int
1250 qeth_idx_activate_channel(struct qeth_channel *channel,
1251                            void (*idx_reply_cb)(struct qeth_channel *,
1252                                                 struct qeth_cmd_buffer *))
1253 {
1254         struct qeth_card *card;
1255         struct qeth_cmd_buffer *iob;
1256         unsigned long flags;
1257         __u16 temp;
1258         int rc;
1259
1260         card = CARD_FROM_CDEV(channel->ccwdev);
1261
1262         QETH_DBF_TEXT(setup, 2, "idxactch");
1263
1264         iob = qeth_get_buffer(channel);
1265         iob->callback = idx_reply_cb;
1266         memcpy(&channel->ccw, WRITE_CCW, sizeof(struct ccw1));
1267         channel->ccw.count = IDX_ACTIVATE_SIZE;
1268         channel->ccw.cda = (__u32) __pa(iob->data);
1269         if (channel == &card->write) {
1270                 memcpy(iob->data, IDX_ACTIVATE_WRITE, IDX_ACTIVATE_SIZE);
1271                 memcpy(QETH_TRANSPORT_HEADER_SEQ_NO(iob->data),
1272                        &card->seqno.trans_hdr, QETH_SEQ_NO_LENGTH);
1273                 card->seqno.trans_hdr++;
1274         } else {
1275                 memcpy(iob->data, IDX_ACTIVATE_READ, IDX_ACTIVATE_SIZE);
1276                 memcpy(QETH_TRANSPORT_HEADER_SEQ_NO(iob->data),
1277                        &card->seqno.trans_hdr, QETH_SEQ_NO_LENGTH);
1278         }
1279         memcpy(QETH_IDX_ACT_ISSUER_RM_TOKEN(iob->data),
1280                &card->token.issuer_rm_w,QETH_MPC_TOKEN_LENGTH);
1281         memcpy(QETH_IDX_ACT_FUNC_LEVEL(iob->data),
1282                &card->info.func_level,sizeof(__u16));
1283         temp = raw_devno_from_bus_id(CARD_DDEV_ID(card));
1284         memcpy(QETH_IDX_ACT_QDIO_DEV_CUA(iob->data), &temp, 2);
1285         temp = (card->info.cula << 8) + card->info.unit_addr2;
1286         memcpy(QETH_IDX_ACT_QDIO_DEV_REALADDR(iob->data), &temp, 2);
1287
1288         wait_event(card->wait_q,
1289                    atomic_compare_and_swap(0,1,&channel->irq_pending) == 0);
1290         QETH_DBF_TEXT(setup, 6, "noirqpnd");
1291         spin_lock_irqsave(get_ccwdev_lock(channel->ccwdev), flags);
1292         rc = ccw_device_start(channel->ccwdev,
1293                               &channel->ccw,(addr_t) iob, 0, 0);
1294         spin_unlock_irqrestore(get_ccwdev_lock(channel->ccwdev), flags);
1295
1296         if (rc) {
1297                 PRINT_ERR("qeth: Error1 in activating channel. rc=%d\n",rc);
1298                 QETH_DBF_TEXT_(setup, 2, "1err%d", rc);
1299                 atomic_set(&channel->irq_pending, 0);
1300                 wake_up(&card->wait_q);
1301                 return rc;
1302         }
1303         rc = wait_event_interruptible_timeout(card->wait_q,
1304                         channel->state == CH_STATE_ACTIVATING, QETH_TIMEOUT);
1305         if (rc == -ERESTARTSYS)
1306                 return rc;
1307         if (channel->state != CH_STATE_ACTIVATING) {
1308                 PRINT_WARN("qeth: IDX activate timed out!\n");
1309                 QETH_DBF_TEXT_(setup, 2, "2err%d", -ETIME);
1310                 return -ETIME;
1311         }
1312         return qeth_idx_activate_get_answer(channel,idx_reply_cb);
1313 }
1314
1315 static int
1316 qeth_peer_func_level(int level)
1317 {
1318         if ((level & 0xff) == 8)
1319                 return (level & 0xff) + 0x400;
1320         if (((level >> 8) & 3) == 1)
1321                 return (level & 0xff) + 0x200;
1322         return level;
1323 }
1324
1325 static void
1326 qeth_idx_write_cb(struct qeth_channel *channel, struct qeth_cmd_buffer *iob)
1327 {
1328         struct qeth_card *card;
1329         __u16 temp;
1330
1331         QETH_DBF_TEXT(setup ,2, "idxwrcb");
1332
1333         if (channel->state == CH_STATE_DOWN) {
1334                 channel->state = CH_STATE_ACTIVATING;
1335                 goto out;
1336         }
1337         card = CARD_FROM_CDEV(channel->ccwdev);
1338
1339         if (!(QETH_IS_IDX_ACT_POS_REPLY(iob->data))) {
1340                 PRINT_ERR("IDX_ACTIVATE on write channel device %s: negative "
1341                           "reply\n", CARD_WDEV_ID(card));
1342                 goto out;
1343         }
1344         memcpy(&temp, QETH_IDX_ACT_FUNC_LEVEL(iob->data), 2);
1345         if ((temp & ~0x0100) != qeth_peer_func_level(card->info.func_level)) {
1346                 PRINT_WARN("IDX_ACTIVATE on write channel device %s: "
1347                            "function level mismatch "
1348                            "(sent: 0x%x, received: 0x%x)\n",
1349                            CARD_WDEV_ID(card), card->info.func_level, temp);
1350                 goto out;
1351         }
1352         channel->state = CH_STATE_UP;
1353 out:
1354         qeth_release_buffer(channel, iob);
1355 }
1356
1357 static int
1358 qeth_check_idx_response(unsigned char *buffer)
1359 {
1360         if (!buffer)
1361                 return 0;
1362
1363         QETH_DBF_HEX(control, 2, buffer, QETH_DBF_CONTROL_LEN);
1364         if ((buffer[2] & 0xc0) == 0xc0) {
1365                 PRINT_WARN("received an IDX TERMINATE "
1366                            "with cause code 0x%02x%s\n",
1367                            buffer[4],
1368                            ((buffer[4] == 0x22) ?
1369                             " -- try another portname" : ""));
1370                 QETH_DBF_TEXT(trace, 2, "ckidxres");
1371                 QETH_DBF_TEXT(trace, 2, " idxterm");
1372                 QETH_DBF_TEXT_(trace, 2, "  rc%d", -EIO);
1373                 return -EIO;
1374         }
1375         return 0;
1376 }
1377
1378 static void
1379 qeth_idx_read_cb(struct qeth_channel *channel, struct qeth_cmd_buffer *iob)
1380 {
1381         struct qeth_card *card;
1382         __u16 temp;
1383
1384         QETH_DBF_TEXT(setup , 2, "idxrdcb");
1385         if (channel->state == CH_STATE_DOWN) {
1386                 channel->state = CH_STATE_ACTIVATING;
1387                 goto out;
1388         }
1389
1390         card = CARD_FROM_CDEV(channel->ccwdev);
1391         if (qeth_check_idx_response(iob->data)) {
1392                         goto out;
1393         }
1394         if (!(QETH_IS_IDX_ACT_POS_REPLY(iob->data))) {
1395                 PRINT_ERR("IDX_ACTIVATE on read channel device %s: negative "
1396                           "reply\n", CARD_RDEV_ID(card));
1397                 goto out;
1398         }
1399
1400 /**
1401  * temporary fix for microcode bug
1402  * to revert it,replace OR by AND
1403  */
1404         if ( (!QETH_IDX_NO_PORTNAME_REQUIRED(iob->data)) ||
1405              (card->info.type == QETH_CARD_TYPE_OSAE) )
1406                 card->info.portname_required = 1;
1407
1408         memcpy(&temp, QETH_IDX_ACT_FUNC_LEVEL(iob->data), 2);
1409         if (temp != qeth_peer_func_level(card->info.func_level)) {
1410                 PRINT_WARN("IDX_ACTIVATE on read channel device %s: function "
1411                            "level mismatch (sent: 0x%x, received: 0x%x)\n",
1412                            CARD_RDEV_ID(card), card->info.func_level, temp);
1413                 goto out;
1414         }
1415         memcpy(&card->token.issuer_rm_r,
1416                QETH_IDX_ACT_ISSUER_RM_TOKEN(iob->data),
1417                QETH_MPC_TOKEN_LENGTH);
1418         memcpy(&card->info.mcl_level[0],
1419                QETH_IDX_REPLY_LEVEL(iob->data), QETH_MCL_LENGTH);
1420         channel->state = CH_STATE_UP;
1421 out:
1422         qeth_release_buffer(channel,iob);
1423 }
1424
1425 static int
1426 qeth_issue_next_read(struct qeth_card *card)
1427 {
1428         int rc;
1429         struct qeth_cmd_buffer *iob;
1430
1431         QETH_DBF_TEXT(trace,5,"issnxrd");
1432         if (card->read.state != CH_STATE_UP)
1433                 return -EIO;
1434         iob = qeth_get_buffer(&card->read);
1435         if (!iob) {
1436                 PRINT_WARN("issue_next_read failed: no iob available!\n");
1437                 return -ENOMEM;
1438         }
1439         qeth_setup_ccw(&card->read, iob->data, QETH_BUFSIZE);
1440         wait_event(card->wait_q,
1441                    atomic_compare_and_swap(0,1,&card->read.irq_pending) == 0);
1442         QETH_DBF_TEXT(trace, 6, "noirqpnd");
1443         rc = ccw_device_start(card->read.ccwdev, &card->read.ccw,
1444                               (addr_t) iob, 0, 0);
1445         if (rc) {
1446                 PRINT_ERR("Error in starting next read ccw! rc=%i\n", rc);
1447                 atomic_set(&card->read.irq_pending, 0);
1448                 qeth_schedule_recovery(card);
1449                 wake_up(&card->wait_q);
1450         }
1451         return rc;
1452 }
1453
1454 static struct qeth_reply *
1455 qeth_alloc_reply(struct qeth_card *card)
1456 {
1457         struct qeth_reply *reply;
1458
1459         reply = kmalloc(sizeof(struct qeth_reply), GFP_KERNEL|GFP_ATOMIC);
1460         if (reply){
1461                 memset(reply, 0, sizeof(struct qeth_reply));
1462                 atomic_set(&reply->refcnt, 1);
1463                 reply->card = card;
1464         };
1465         return reply;
1466 }
1467
1468 static void
1469 qeth_get_reply(struct qeth_reply *reply)
1470 {
1471         WARN_ON(atomic_read(&reply->refcnt) <= 0);
1472         atomic_inc(&reply->refcnt);
1473 }
1474
1475 static void
1476 qeth_put_reply(struct qeth_reply *reply)
1477 {
1478         WARN_ON(atomic_read(&reply->refcnt) <= 0);
1479         if (atomic_dec_and_test(&reply->refcnt))
1480                 kfree(reply);
1481 }
1482
1483 static void
1484 qeth_cmd_timeout(unsigned long data)
1485 {
1486         struct qeth_reply *reply, *list_reply, *r;
1487         unsigned long flags;
1488
1489         reply = (struct qeth_reply *) data;
1490         spin_lock_irqsave(&reply->card->lock, flags);
1491         list_for_each_entry_safe(list_reply, r,
1492                                  &reply->card->cmd_waiter_list, list) {
1493                 if (reply == list_reply){
1494                         qeth_get_reply(reply);
1495                         list_del_init(&reply->list);
1496                         spin_unlock_irqrestore(&reply->card->lock, flags);
1497                         reply->rc = -ETIME;
1498                         reply->received = 1;
1499                         wake_up(&reply->wait_q);
1500                         qeth_put_reply(reply);
1501                         return;
1502                 }
1503         }
1504         spin_unlock_irqrestore(&reply->card->lock, flags);
1505 }
1506
1507 static void
1508 qeth_reset_ip_addresses(struct qeth_card *card)
1509 {
1510         QETH_DBF_TEXT(trace, 2, "rstipadd");
1511
1512         qeth_clear_ip_list(card, 0, 1);
1513         qeth_set_thread_start_bit(card, QETH_SET_IP_THREAD);
1514         qeth_set_thread_start_bit(card, QETH_SET_MC_THREAD);
1515         schedule_work(&card->kernel_thread_starter);
1516 }
1517
1518 static struct qeth_ipa_cmd *
1519 qeth_check_ipa_data(struct qeth_card *card, struct qeth_cmd_buffer *iob)
1520 {
1521         struct qeth_ipa_cmd *cmd = NULL;
1522
1523         QETH_DBF_TEXT(trace,5,"chkipad");
1524         if (IS_IPA(iob->data)){
1525                 cmd = (struct qeth_ipa_cmd *) PDU_ENCAPSULATION(iob->data);
1526                 if (IS_IPA_REPLY(cmd))
1527                         return cmd;
1528                 else {
1529                         switch (cmd->hdr.command) {
1530                         case IPA_CMD_STOPLAN:
1531                                 PRINT_WARN("Link failure on %s (CHPID 0x%X) - "
1532                                            "there is a network problem or "
1533                                            "someone pulled the cable or "
1534                                            "disabled the port.\n",
1535                                            card->info.if_name,
1536                                            card->info.chpid);
1537                                 card->lan_online = 0;
1538                                 if (netif_carrier_ok(card->dev)) {
1539                                         netif_carrier_off(card->dev);
1540                                         netif_stop_queue(card->dev);
1541                                 }
1542                                 return NULL;
1543                         case IPA_CMD_STARTLAN:
1544                                 PRINT_INFO("Link reestablished on %s "
1545                                            "(CHPID 0x%X). Scheduling "
1546                                            "IP address reset.\n",
1547                                            card->info.if_name,
1548                                            card->info.chpid);
1549                                 card->lan_online = 1;
1550                                 if (!netif_carrier_ok(card->dev)) {
1551                                         netif_carrier_on(card->dev);
1552                                         netif_wake_queue(card->dev);
1553                                 }
1554                                 qeth_reset_ip_addresses(card);
1555                                 return NULL;
1556                         case IPA_CMD_REGISTER_LOCAL_ADDR:
1557                                 QETH_DBF_TEXT(trace,3, "irla");
1558                                 break;
1559                         case IPA_CMD_UNREGISTER_LOCAL_ADDR:
1560                                 PRINT_WARN("probably problem on %s: "
1561                                            "received IPA command 0x%X\n",
1562                                            card->info.if_name,
1563                                            cmd->hdr.command);
1564                                 break;
1565                         default:
1566                                 PRINT_WARN("Received data is IPA "
1567                                            "but not a reply!\n");
1568                                 break;
1569                         }
1570                 }
1571         }
1572         return cmd;
1573 }
1574
1575 /**
1576  * wake all waiting ipa commands
1577  */
1578 static void
1579 qeth_clear_ipacmd_list(struct qeth_card *card)
1580 {
1581         struct qeth_reply *reply, *r;
1582         unsigned long flags;
1583
1584         QETH_DBF_TEXT(trace, 4, "clipalst");
1585
1586         spin_lock_irqsave(&card->lock, flags);
1587         list_for_each_entry_safe(reply, r, &card->cmd_waiter_list, list) {
1588                 qeth_get_reply(reply);
1589                 reply->rc = -EIO;
1590                 reply->received = 1;
1591                 list_del_init(&reply->list);
1592                 wake_up(&reply->wait_q);
1593                 qeth_put_reply(reply);
1594         }
1595         spin_unlock_irqrestore(&card->lock, flags);
1596 }
1597
1598 static void
1599 qeth_send_control_data_cb(struct qeth_channel *channel,
1600                           struct qeth_cmd_buffer *iob)
1601 {
1602         struct qeth_card *card;
1603         struct qeth_reply *reply, *r;
1604         struct qeth_ipa_cmd *cmd;
1605         unsigned long flags;
1606         int keep_reply;
1607
1608         QETH_DBF_TEXT(trace,4,"sndctlcb");
1609
1610         card = CARD_FROM_CDEV(channel->ccwdev);
1611         if (qeth_check_idx_response(iob->data)) {
1612                 qeth_clear_ipacmd_list(card);
1613                 qeth_schedule_recovery(card);
1614                 goto out;
1615         }
1616
1617         cmd = qeth_check_ipa_data(card, iob);
1618         if ((cmd == NULL) && (card->state != CARD_STATE_DOWN))
1619                 goto out;
1620
1621         spin_lock_irqsave(&card->lock, flags);
1622         list_for_each_entry_safe(reply, r, &card->cmd_waiter_list, list) {
1623                 if ((reply->seqno == QETH_IDX_COMMAND_SEQNO) ||
1624                     ((cmd) && (reply->seqno == cmd->hdr.seqno))) {
1625                         qeth_get_reply(reply);
1626                         list_del_init(&reply->list);
1627                         spin_unlock_irqrestore(&card->lock, flags);
1628                         keep_reply = 0;
1629                         if (reply->callback != NULL) {
1630                                 if (cmd)
1631                                         keep_reply = reply->callback(card,
1632                                                         reply,
1633                                                         (unsigned long)cmd);
1634                                 else
1635                                         keep_reply = reply->callback(card,
1636                                                         reply,
1637                                                         (unsigned long)iob);
1638                         }
1639                         if (cmd)
1640                                 reply->rc = cmd->hdr.return_code;
1641                         else if (iob->rc)
1642                                 reply->rc = iob->rc;
1643                         if (keep_reply) {
1644                                 spin_lock_irqsave(&card->lock, flags);
1645                                 list_add_tail(&reply->list,
1646                                               &card->cmd_waiter_list);
1647                                 spin_unlock_irqrestore(&card->lock, flags);
1648                         } else {
1649                                 reply->received = 1;
1650                                 wake_up(&reply->wait_q);
1651                         }
1652                         qeth_put_reply(reply);
1653                         goto out;
1654                 }
1655         }
1656         spin_unlock_irqrestore(&card->lock, flags);
1657 out:
1658         memcpy(&card->seqno.pdu_hdr_ack,
1659                 QETH_PDU_HEADER_SEQ_NO(iob->data),
1660                 QETH_SEQ_NO_LENGTH);
1661         qeth_release_buffer(channel,iob);
1662 }
1663
1664 static int
1665 qeth_send_control_data(struct qeth_card *card, int len,
1666                        struct qeth_cmd_buffer *iob,
1667                        int (*reply_cb)
1668                        (struct qeth_card *, struct qeth_reply*, unsigned long),
1669                        void *reply_param)
1670
1671 {
1672         int rc;
1673         unsigned long flags;
1674         struct qeth_reply *reply;
1675         struct timer_list timer;
1676
1677         QETH_DBF_TEXT(trace, 2, "sendctl");
1678
1679         qeth_setup_ccw(&card->write,iob->data,len);
1680
1681         memcpy(QETH_TRANSPORT_HEADER_SEQ_NO(iob->data),
1682                &card->seqno.trans_hdr, QETH_SEQ_NO_LENGTH);
1683         card->seqno.trans_hdr++;
1684
1685         memcpy(QETH_PDU_HEADER_SEQ_NO(iob->data),
1686                &card->seqno.pdu_hdr, QETH_SEQ_NO_LENGTH);
1687         card->seqno.pdu_hdr++;
1688         memcpy(QETH_PDU_HEADER_ACK_SEQ_NO(iob->data),
1689                &card->seqno.pdu_hdr_ack, QETH_SEQ_NO_LENGTH);
1690         iob->callback = qeth_release_buffer;
1691
1692         reply = qeth_alloc_reply(card);
1693         if (!reply) {
1694                 PRINT_WARN("Could no alloc qeth_reply!\n");
1695                 return -ENOMEM;
1696         }
1697         reply->callback = reply_cb;
1698         reply->param = reply_param;
1699         if (card->state == CARD_STATE_DOWN)
1700                 reply->seqno = QETH_IDX_COMMAND_SEQNO;
1701         else
1702                 reply->seqno = card->seqno.ipa++;
1703         init_timer(&timer);
1704         timer.function = qeth_cmd_timeout;
1705         timer.data = (unsigned long) reply;
1706         timer.expires = jiffies + QETH_TIMEOUT;
1707         init_waitqueue_head(&reply->wait_q);
1708         spin_lock_irqsave(&card->lock, flags);
1709         list_add_tail(&reply->list, &card->cmd_waiter_list);
1710         spin_unlock_irqrestore(&card->lock, flags);
1711         QETH_DBF_HEX(control, 2, iob->data, QETH_DBF_CONTROL_LEN);
1712         wait_event(card->wait_q,
1713                    atomic_compare_and_swap(0,1,&card->write.irq_pending) == 0);
1714         QETH_DBF_TEXT(trace, 6, "noirqpnd");
1715         spin_lock_irqsave(get_ccwdev_lock(card->write.ccwdev), flags);
1716         rc = ccw_device_start(card->write.ccwdev, &card->write.ccw,
1717                               (addr_t) iob, 0, 0);
1718         spin_unlock_irqrestore(get_ccwdev_lock(card->write.ccwdev), flags);
1719         if (rc){
1720                 PRINT_WARN("qeth_send_control_data: "
1721                            "ccw_device_start rc = %i\n", rc);
1722                 QETH_DBF_TEXT_(trace, 2, " err%d", rc);
1723                 spin_lock_irqsave(&card->lock, flags);
1724                 list_del_init(&reply->list);
1725                 qeth_put_reply(reply);
1726                 spin_unlock_irqrestore(&card->lock, flags);
1727                 qeth_release_buffer(iob->channel, iob);
1728                 atomic_set(&card->write.irq_pending, 0);
1729                 wake_up(&card->wait_q);
1730                 return rc;
1731         }
1732         add_timer(&timer);
1733         wait_event(reply->wait_q, reply->received);
1734         del_timer(&timer);
1735         rc = reply->rc;
1736         qeth_put_reply(reply);
1737         return rc;
1738 }
1739
1740 static int
1741 qeth_send_ipa_cmd(struct qeth_card *card, struct qeth_cmd_buffer *iob,
1742                   int (*reply_cb)
1743                   (struct qeth_card *,struct qeth_reply*, unsigned long),
1744                   void *reply_param)
1745 {
1746         struct qeth_ipa_cmd *cmd;
1747         int rc;
1748
1749         QETH_DBF_TEXT(trace,4,"sendipa");
1750
1751         cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
1752         memcpy(iob->data, IPA_PDU_HEADER, IPA_PDU_HEADER_SIZE);
1753         memcpy(QETH_IPA_CMD_DEST_ADDR(iob->data),
1754                &card->token.ulp_connection_r, QETH_MPC_TOKEN_LENGTH);
1755
1756         rc = qeth_send_control_data(card, IPA_CMD_LENGTH, iob,
1757                                     reply_cb, reply_param);
1758         return rc;
1759 }
1760
1761
1762 static int
1763 qeth_cm_enable_cb(struct qeth_card *card, struct qeth_reply *reply,
1764                   unsigned long data)
1765 {
1766         struct qeth_cmd_buffer *iob;
1767
1768         QETH_DBF_TEXT(setup, 2, "cmenblcb");
1769
1770         iob = (struct qeth_cmd_buffer *) data;
1771         memcpy(&card->token.cm_filter_r,
1772                QETH_CM_ENABLE_RESP_FILTER_TOKEN(iob->data),
1773                QETH_MPC_TOKEN_LENGTH);
1774         QETH_DBF_TEXT_(setup, 2, "  rc%d", iob->rc);
1775         return 0;
1776 }
1777
1778 static int
1779 qeth_cm_enable(struct qeth_card *card)
1780 {
1781         int rc;
1782         struct qeth_cmd_buffer *iob;
1783
1784         QETH_DBF_TEXT(setup,2,"cmenable");
1785
1786         iob = qeth_wait_for_buffer(&card->write);
1787         memcpy(iob->data, CM_ENABLE, CM_ENABLE_SIZE);
1788         memcpy(QETH_CM_ENABLE_ISSUER_RM_TOKEN(iob->data),
1789                &card->token.issuer_rm_r, QETH_MPC_TOKEN_LENGTH);
1790         memcpy(QETH_CM_ENABLE_FILTER_TOKEN(iob->data),
1791                &card->token.cm_filter_w, QETH_MPC_TOKEN_LENGTH);
1792
1793         rc = qeth_send_control_data(card, CM_ENABLE_SIZE, iob,
1794                                     qeth_cm_enable_cb, NULL);
1795         return rc;
1796 }
1797
1798 static int
1799 qeth_cm_setup_cb(struct qeth_card *card, struct qeth_reply *reply,
1800                  unsigned long data)
1801 {
1802
1803         struct qeth_cmd_buffer *iob;
1804
1805         QETH_DBF_TEXT(setup, 2, "cmsetpcb");
1806
1807         iob = (struct qeth_cmd_buffer *) data;
1808         memcpy(&card->token.cm_connection_r,
1809                QETH_CM_SETUP_RESP_DEST_ADDR(iob->data),
1810                QETH_MPC_TOKEN_LENGTH);
1811         QETH_DBF_TEXT_(setup, 2, "  rc%d", iob->rc);
1812         return 0;
1813 }
1814
1815 static int
1816 qeth_cm_setup(struct qeth_card *card)
1817 {
1818         int rc;
1819         struct qeth_cmd_buffer *iob;
1820
1821         QETH_DBF_TEXT(setup,2,"cmsetup");
1822
1823         iob = qeth_wait_for_buffer(&card->write);
1824         memcpy(iob->data, CM_SETUP, CM_SETUP_SIZE);
1825         memcpy(QETH_CM_SETUP_DEST_ADDR(iob->data),
1826                &card->token.issuer_rm_r, QETH_MPC_TOKEN_LENGTH);
1827         memcpy(QETH_CM_SETUP_CONNECTION_TOKEN(iob->data),
1828                &card->token.cm_connection_w, QETH_MPC_TOKEN_LENGTH);
1829         memcpy(QETH_CM_SETUP_FILTER_TOKEN(iob->data),
1830                &card->token.cm_filter_r, QETH_MPC_TOKEN_LENGTH);
1831         rc = qeth_send_control_data(card, CM_SETUP_SIZE, iob,
1832                                     qeth_cm_setup_cb, NULL);
1833         return rc;
1834
1835 }
1836
1837 static int
1838 qeth_ulp_enable_cb(struct qeth_card *card, struct qeth_reply *reply,
1839                    unsigned long data)
1840 {
1841
1842         __u16 mtu, framesize;
1843         __u16 len;
1844         __u8 link_type;
1845         struct qeth_cmd_buffer *iob;
1846
1847         QETH_DBF_TEXT(setup, 2, "ulpenacb");
1848
1849         iob = (struct qeth_cmd_buffer *) data;
1850         memcpy(&card->token.ulp_filter_r,
1851                QETH_ULP_ENABLE_RESP_FILTER_TOKEN(iob->data),
1852                QETH_MPC_TOKEN_LENGTH);
1853         if (qeth_get_mtu_out_of_mpc(card->info.type)) {
1854                 memcpy(&framesize, QETH_ULP_ENABLE_RESP_MAX_MTU(iob->data), 2);
1855                 mtu = qeth_get_mtu_outof_framesize(framesize);
1856                 if (!mtu) {
1857                         iob->rc = -EINVAL;
1858                         QETH_DBF_TEXT_(setup, 2, "  rc%d", iob->rc);
1859                         return 0;
1860                 }
1861                 card->info.max_mtu = mtu;
1862                 card->info.initial_mtu = mtu;
1863                 card->qdio.in_buf_size = mtu + 2 * PAGE_SIZE;
1864         } else {
1865                 card->info.initial_mtu = qeth_get_initial_mtu_for_card(card);
1866                 card->info.max_mtu = qeth_get_max_mtu_for_card(card->info.type);
1867                 card->qdio.in_buf_size = QETH_IN_BUF_SIZE_DEFAULT;
1868         }
1869
1870         memcpy(&len, QETH_ULP_ENABLE_RESP_DIFINFO_LEN(iob->data), 2);
1871         if (len >= QETH_MPC_DIFINFO_LEN_INDICATES_LINK_TYPE) {
1872                 memcpy(&link_type,
1873                        QETH_ULP_ENABLE_RESP_LINK_TYPE(iob->data), 1);
1874                 card->info.link_type = link_type;
1875         } else
1876                 card->info.link_type = 0;
1877         QETH_DBF_TEXT_(setup, 2, "  rc%d", iob->rc);
1878         return 0;
1879 }
1880
1881 static int
1882 qeth_ulp_enable(struct qeth_card *card)
1883 {
1884         int rc;
1885         struct qeth_cmd_buffer *iob;
1886
1887         /*FIXME: trace view callbacks*/
1888         QETH_DBF_TEXT(setup,2,"ulpenabl");
1889
1890         iob = qeth_wait_for_buffer(&card->write);
1891         memcpy(iob->data, ULP_ENABLE, ULP_ENABLE_SIZE);
1892
1893         *(QETH_ULP_ENABLE_LINKNUM(iob->data)) =
1894                 (__u8) card->info.portno;
1895
1896         memcpy(QETH_ULP_ENABLE_DEST_ADDR(iob->data),
1897                &card->token.cm_connection_r, QETH_MPC_TOKEN_LENGTH);
1898         memcpy(QETH_ULP_ENABLE_FILTER_TOKEN(iob->data),
1899                &card->token.ulp_filter_w, QETH_MPC_TOKEN_LENGTH);
1900         memcpy(QETH_ULP_ENABLE_PORTNAME_AND_LL(iob->data),
1901                card->info.portname, 9);
1902         rc = qeth_send_control_data(card, ULP_ENABLE_SIZE, iob,
1903                                     qeth_ulp_enable_cb, NULL);
1904         return rc;
1905
1906 }
1907
1908 static inline __u16
1909 __raw_devno_from_bus_id(char *id)
1910 {
1911         id += (strlen(id) - 4);
1912         return (__u16) simple_strtoul(id, &id, 16);
1913 }
1914
1915 static int
1916 qeth_ulp_setup_cb(struct qeth_card *card, struct qeth_reply *reply,
1917                   unsigned long data)
1918 {
1919         struct qeth_cmd_buffer *iob;
1920
1921         QETH_DBF_TEXT(setup, 2, "ulpstpcb");
1922
1923         iob = (struct qeth_cmd_buffer *) data;
1924         memcpy(&card->token.ulp_connection_r,
1925                QETH_ULP_SETUP_RESP_CONNECTION_TOKEN(iob->data),
1926                QETH_MPC_TOKEN_LENGTH);
1927         QETH_DBF_TEXT_(setup, 2, "  rc%d", iob->rc);
1928         return 0;
1929 }
1930
1931 static int
1932 qeth_ulp_setup(struct qeth_card *card)
1933 {
1934         int rc;
1935         __u16 temp;
1936         struct qeth_cmd_buffer *iob;
1937
1938         QETH_DBF_TEXT(setup,2,"ulpsetup");
1939
1940         iob = qeth_wait_for_buffer(&card->write);
1941         memcpy(iob->data, ULP_SETUP, ULP_SETUP_SIZE);
1942
1943         memcpy(QETH_ULP_SETUP_DEST_ADDR(iob->data),
1944                &card->token.cm_connection_r, QETH_MPC_TOKEN_LENGTH);
1945         memcpy(QETH_ULP_SETUP_CONNECTION_TOKEN(iob->data),
1946                &card->token.ulp_connection_w, QETH_MPC_TOKEN_LENGTH);
1947         memcpy(QETH_ULP_SETUP_FILTER_TOKEN(iob->data),
1948                &card->token.ulp_filter_r, QETH_MPC_TOKEN_LENGTH);
1949
1950         temp = __raw_devno_from_bus_id(CARD_DDEV_ID(card));
1951         memcpy(QETH_ULP_SETUP_CUA(iob->data), &temp, 2);
1952         temp = (card->info.cula << 8) + card->info.unit_addr2;
1953         memcpy(QETH_ULP_SETUP_REAL_DEVADDR(iob->data), &temp, 2);
1954         rc = qeth_send_control_data(card, ULP_SETUP_SIZE, iob,
1955                                     qeth_ulp_setup_cb, NULL);
1956         return rc;
1957 }
1958
1959 static inline int
1960 qeth_check_for_inbound_error(struct qeth_qdio_buffer *buf,
1961                              unsigned int qdio_error,
1962                              unsigned int siga_error)
1963 {
1964         int rc = 0;
1965
1966         if (qdio_error || siga_error) {
1967                 QETH_DBF_TEXT(trace, 2, "qdinerr");
1968                 QETH_DBF_TEXT(qerr, 2, "qdinerr");
1969                 QETH_DBF_TEXT_(qerr, 2, " F15=%02X",
1970                                buf->buffer->element[15].flags & 0xff);
1971                 QETH_DBF_TEXT_(qerr, 2, " F14=%02X",
1972                                buf->buffer->element[14].flags & 0xff);
1973                 QETH_DBF_TEXT_(qerr, 2, " qerr=%X", qdio_error);
1974                 QETH_DBF_TEXT_(qerr, 2, " serr=%X", siga_error);
1975                 rc = 1;
1976         }
1977         return rc;
1978 }
1979
1980 static inline struct sk_buff *
1981 qeth_get_skb(unsigned int length)
1982 {
1983         struct sk_buff* skb;
1984 #ifdef CONFIG_QETH_VLAN
1985         if ((skb = dev_alloc_skb(length + VLAN_HLEN)))
1986                 skb_reserve(skb, VLAN_HLEN);
1987 #else
1988         skb = dev_alloc_skb(length);
1989 #endif
1990         return skb;
1991 }
1992
1993 static inline struct sk_buff *
1994 qeth_get_next_skb(struct qeth_card *card, struct qdio_buffer *buffer,
1995                   struct qdio_buffer_element **__element, int *__offset,
1996                   struct qeth_hdr **hdr)
1997 {
1998         struct qdio_buffer_element *element = *__element;
1999         int offset = *__offset;
2000         struct sk_buff *skb = NULL;
2001         int skb_len;
2002         void *data_ptr;
2003         int data_len;
2004
2005         QETH_DBF_TEXT(trace,6,"nextskb");
2006         /* qeth_hdr must not cross element boundaries */
2007         if (element->length < offset + sizeof(struct qeth_hdr)){
2008                 if (qeth_is_last_sbale(element))
2009                         return NULL;
2010                 element++;
2011                 offset = 0;
2012                 if (element->length < sizeof(struct qeth_hdr))
2013                         return NULL;
2014         }
2015         *hdr = element->addr + offset;
2016
2017         offset += sizeof(struct qeth_hdr);
2018         skb_len = (*hdr)->length;
2019         if (!skb_len)
2020                 return NULL;
2021         if (card->options.fake_ll){
2022                 if (!(skb = qeth_get_skb(skb_len + QETH_FAKE_LL_LEN)))
2023                         goto no_mem;
2024                 skb_pull(skb, QETH_FAKE_LL_LEN);
2025         } else if (!(skb = qeth_get_skb(skb_len)))
2026                 goto no_mem;
2027         data_ptr = element->addr + offset;
2028         while (skb_len) {
2029                 data_len = min(skb_len, (int)(element->length - offset));
2030                 if (data_len)
2031                         memcpy(skb_put(skb, data_len), data_ptr, data_len);
2032                 skb_len -= data_len;
2033                 if (skb_len){
2034                         if (qeth_is_last_sbale(element)){
2035                                 QETH_DBF_TEXT(trace,4,"unexeob");
2036                                 QETH_DBF_TEXT_(trace,4,"%s",CARD_BUS_ID(card));
2037                                 QETH_DBF_TEXT(qerr,2,"unexeob");
2038                                 QETH_DBF_TEXT_(qerr,2,"%s",CARD_BUS_ID(card));
2039                                 QETH_DBF_HEX(misc,4,buffer,sizeof(*buffer));
2040                                 dev_kfree_skb_irq(skb);
2041                                 card->stats.rx_errors++;
2042                                 return NULL;
2043                         }
2044                         element++;
2045                         offset = 0;
2046                         data_ptr = element->addr;
2047                 } else {
2048                         offset += data_len;
2049                 }
2050         }
2051         *__element = element;
2052         *__offset = offset;
2053         return skb;
2054 no_mem:
2055         if (net_ratelimit()){
2056                 PRINT_WARN("No memory for packet received on %s.\n",
2057                            card->info.if_name);
2058                 QETH_DBF_TEXT(trace,2,"noskbmem");
2059                 QETH_DBF_TEXT_(trace,2,"%s",CARD_BUS_ID(card));
2060         }
2061         card->stats.rx_dropped++;
2062         return NULL;
2063 }
2064
2065 static inline unsigned short
2066 qeth_type_trans(struct sk_buff *skb, struct net_device *dev)
2067 {
2068         struct ethhdr *eth;
2069         struct qeth_card *card;
2070
2071         QETH_DBF_TEXT(trace,5,"typtrans");
2072
2073         card = (struct qeth_card *)dev->priv;
2074 #ifdef CONFIG_TR
2075         if ((card->info.link_type == QETH_LINK_TYPE_HSTR) ||
2076             (card->info.link_type == QETH_LINK_TYPE_LANE_TR))
2077                 return tr_type_trans(skb,dev);
2078 #endif /* CONFIG_TR */
2079
2080         skb->mac.raw = skb->data;
2081         skb_pull(skb, ETH_ALEN * 2 + sizeof (short));
2082         eth = skb->mac.ethernet;
2083
2084         if (*eth->h_dest & 1) {
2085                 if (memcmp(eth->h_dest, dev->broadcast, ETH_ALEN) == 0)
2086                         skb->pkt_type = PACKET_BROADCAST;
2087                 else
2088                         skb->pkt_type = PACKET_MULTICAST;
2089         } else {
2090                 skb->pkt_type = PACKET_OTHERHOST;
2091         }
2092         if (ntohs(eth->h_proto) >= 1536)
2093                 return eth->h_proto;
2094         if (*(unsigned short *) (skb->data) == 0xFFFF)
2095                 return htons(ETH_P_802_3);
2096         return htons(ETH_P_802_2);
2097 }
2098
2099 static inline void
2100 qeth_rebuild_skb_fake_ll(struct qeth_card *card, struct sk_buff *skb,
2101                          struct qeth_hdr *hdr)
2102 {
2103         struct ethhdr *fake_hdr;
2104         struct iphdr *ip_hdr;
2105
2106         QETH_DBF_TEXT(trace,5,"skbfake");
2107         skb->mac.raw = skb->data - QETH_FAKE_LL_LEN;
2108         /* this is a fake ethernet header */
2109         fake_hdr = (struct ethhdr *) skb->mac.raw;
2110
2111         /* the destination MAC address */
2112         switch (skb->pkt_type){
2113         case PACKET_MULTICAST:
2114                 switch (skb->protocol){
2115 #ifdef CONFIG_QETH_IPV6
2116                 case __constant_htons(ETH_P_IPV6):
2117                         ndisc_mc_map((struct in6_addr *)
2118                                      skb->data + QETH_FAKE_LL_V6_ADDR_POS,
2119                                      fake_hdr->h_dest, card->dev, 0);
2120                         break;
2121 #endif /* CONFIG_QETH_IPV6 */
2122                 case __constant_htons(ETH_P_IP):
2123                         ip_hdr = (struct iphdr *)skb->data;
2124                         if (card->dev->type == ARPHRD_IEEE802_TR)
2125                                 ip_tr_mc_map(ip_hdr->daddr, fake_hdr->h_dest);
2126                         else
2127                                 ip_eth_mc_map(ip_hdr->daddr, fake_hdr->h_dest);
2128                         break;
2129                 default:
2130                         memcpy(fake_hdr->h_dest, card->dev->dev_addr, ETH_ALEN);
2131                 }
2132                 break;
2133         case PACKET_BROADCAST:
2134                 memset(fake_hdr->h_dest, 0xff, ETH_ALEN);
2135                 break;
2136         default:
2137                 memcpy(fake_hdr->h_dest, card->dev->dev_addr, ETH_ALEN);
2138         }
2139         /* the source MAC address */
2140         if (hdr->ext_flags & QETH_HDR_EXT_SRC_MAC_ADDR)
2141                 memcpy(fake_hdr->h_source, &hdr->dest_addr[2], ETH_ALEN);
2142         else
2143                 memset(fake_hdr->h_source, 0, ETH_ALEN);
2144         /* the protocol */
2145         fake_hdr->h_proto = skb->protocol;
2146 }
2147
2148 static inline void
2149 qeth_rebuild_skb_vlan(struct qeth_card *card, struct sk_buff *skb,
2150                       struct qeth_hdr *hdr)
2151 {
2152 #ifdef CONFIG_QETH_VLAN
2153         u16 *vlan_tag;
2154
2155         if (hdr->ext_flags & QETH_HDR_EXT_VLAN_FRAME) {
2156                 vlan_tag = (u16 *) skb_push(skb, VLAN_HLEN);
2157                 *vlan_tag = hdr->vlan_id;
2158                 *(vlan_tag + 1) = skb->protocol;
2159                 skb->protocol = __constant_htons(ETH_P_8021Q);
2160         }
2161 #endif /* CONFIG_QETH_VLAN */
2162 }
2163
2164 static inline void
2165 qeth_rebuild_skb(struct qeth_card *card, struct sk_buff *skb,
2166                  struct qeth_hdr *hdr)
2167 {
2168 #ifdef CONFIG_QETH_IPV6
2169         if (hdr->flags & QETH_HDR_PASSTHRU){
2170                 skb->protocol = qeth_type_trans(skb, card->dev);
2171                 return;
2172         }
2173 #endif /* CONFIG_QETH_IPV6 */
2174         skb->protocol = htons((hdr->flags & QETH_HDR_IPV6)? ETH_P_IPV6 :
2175                               ETH_P_IP);
2176         switch (hdr->flags & QETH_HDR_CAST_MASK){
2177         case QETH_CAST_UNICAST:
2178                 skb->pkt_type = PACKET_HOST;
2179                 break;
2180         case QETH_CAST_MULTICAST:
2181                 skb->pkt_type = PACKET_MULTICAST;
2182                 card->stats.multicast++;
2183                 break;
2184         case QETH_CAST_BROADCAST:
2185                 skb->pkt_type = PACKET_BROADCAST;
2186                 card->stats.multicast++;
2187                 break;
2188         case QETH_CAST_ANYCAST:
2189         case QETH_CAST_NOCAST:
2190         default:
2191                 skb->pkt_type = PACKET_HOST;
2192         }
2193         if (card->options.fake_ll)
2194                 qeth_rebuild_skb_fake_ll(card, skb, hdr);
2195         else
2196                 skb->mac.raw = skb->data;
2197         skb->ip_summed = card->options.checksum_type;
2198         if (card->options.checksum_type == HW_CHECKSUMMING){
2199                 if ( (hdr->ext_flags &
2200                       (QETH_HDR_EXT_CSUM_HDR_REQ |
2201                        QETH_HDR_EXT_CSUM_TRANSP_REQ)) ==
2202                      (QETH_HDR_EXT_CSUM_HDR_REQ |
2203                       QETH_HDR_EXT_CSUM_TRANSP_REQ) )
2204                         skb->ip_summed = CHECKSUM_UNNECESSARY;
2205                 else
2206                         skb->ip_summed = SW_CHECKSUMMING;
2207         }
2208         qeth_rebuild_skb_vlan(card, skb, hdr);
2209 }
2210
2211 static inline void
2212 qeth_process_inbound_buffer(struct qeth_card *card,
2213                             struct qeth_qdio_buffer *buf, int index)
2214 {
2215         struct qdio_buffer_element *element;
2216         int offset;
2217         struct sk_buff *skb;
2218         struct qeth_hdr *hdr;
2219         int rxrc;
2220
2221         /* get first element of current buffer */
2222         element = (struct qdio_buffer_element *)&buf->buffer->element[0];
2223         offset = 0;
2224 #ifdef CONFIG_QETH_PERF_STATS
2225         card->perf_stats.bufs_rec++;
2226 #endif
2227         while((skb = qeth_get_next_skb(card, buf->buffer, &element,
2228                                        &offset, &hdr))){
2229                 qeth_rebuild_skb(card, skb, hdr);
2230
2231 #ifdef CONFIG_QETH_PERF_STATS
2232                 card->perf_stats.inbound_time += qeth_get_micros() -
2233                         card->perf_stats.inbound_start_time;
2234                 card->perf_stats.inbound_cnt++;
2235 #endif
2236                 skb->dev = card->dev;
2237                 rxrc = netif_rx(skb);
2238                 card->dev->last_rx = jiffies;
2239                 card->stats.rx_packets++;
2240                 card->stats.rx_bytes += skb->len;
2241         }
2242 }
2243
2244 static inline struct qeth_buffer_pool_entry *
2245 qeth_get_buffer_pool_entry(struct qeth_card *card)
2246 {
2247         struct qeth_buffer_pool_entry *entry, *tmp;
2248
2249         QETH_DBF_TEXT(trace, 6, "gtbfplen");
2250         entry = NULL;
2251         list_for_each_entry_safe(entry, tmp,
2252                                  &card->qdio.in_buf_pool.entry_list, list){
2253                 list_del_init(&entry->list);
2254                 break;
2255         }
2256         return entry;
2257 }
2258
2259 static inline void
2260 qeth_init_input_buffer(struct qeth_card *card, struct qeth_qdio_buffer *buf)
2261 {
2262         struct qeth_buffer_pool_entry *pool_entry;
2263         int i;
2264
2265         pool_entry = qeth_get_buffer_pool_entry(card);
2266         /*
2267          * since the buffer is accessed only from the input_tasklet
2268          * there shouldn't be a need to synchronize; also, since we use
2269          * the QETH_IN_BUF_REQUEUE_THRESHOLD we should never run  out off
2270          * buffers
2271          */
2272         BUG_ON(!pool_entry);
2273
2274         buf->pool_entry = pool_entry;
2275         for(i = 0; i < QETH_MAX_BUFFER_ELEMENTS(card); ++i){
2276                 buf->buffer->element[i].length = PAGE_SIZE;
2277                 buf->buffer->element[i].addr =  pool_entry->elements[i];
2278                 if (i == QETH_MAX_BUFFER_ELEMENTS(card) - 1)
2279                         buf->buffer->element[i].flags = SBAL_FLAGS_LAST_ENTRY;
2280                 else
2281                         buf->buffer->element[i].flags = 0;
2282         }
2283         buf->state = QETH_QDIO_BUF_EMPTY;
2284 }
2285
2286 static inline void
2287 qeth_clear_output_buffer(struct qeth_card *card,
2288                          struct qeth_qdio_out_buffer *buf)
2289 {
2290         int i;
2291         struct sk_buff *skb;
2292
2293         for(i = 0; i < QETH_MAX_BUFFER_ELEMENTS(card); ++i){
2294                 buf->buffer->element[i].length = 0;
2295                 buf->buffer->element[i].addr = NULL;
2296                 buf->buffer->element[i].flags = 0;
2297                 while ((skb = skb_dequeue(&buf->skb_list))){
2298                         atomic_dec(&skb->users);
2299                         dev_kfree_skb_irq(skb);
2300                 }
2301         }
2302         buf->next_element_to_fill = 0;
2303         buf->state = QETH_QDIO_BUF_EMPTY;
2304 }
2305
2306 static inline void
2307 qeth_queue_input_buffer(struct qeth_card *card, int index)
2308 {
2309         struct qeth_qdio_q *queue = card->qdio.in_q;
2310         int count;
2311         int i;
2312         int rc;
2313
2314         QETH_DBF_TEXT(trace,6,"queinbuf");
2315         count = (index < queue->next_buf_to_init)?
2316                 card->qdio.in_buf_pool.buf_count -
2317                 (queue->next_buf_to_init - index) :
2318                 card->qdio.in_buf_pool.buf_count -
2319                 (queue->next_buf_to_init + QDIO_MAX_BUFFERS_PER_Q - index);
2320         /* only requeue at a certain threshold to avoid SIGAs */
2321         if (count >= QETH_IN_BUF_REQUEUE_THRESHOLD(card)){
2322                 for (i = queue->next_buf_to_init;
2323                      i < queue->next_buf_to_init + count; ++i)
2324                         qeth_init_input_buffer(card,
2325                                 &queue->bufs[i % QDIO_MAX_BUFFERS_PER_Q]);
2326                 /*
2327                  * according to old code it should be avoided to requeue all
2328                  * 128 buffers in order to benefit from PCI avoidance.
2329                  * this function keeps at least one buffer (the buffer at
2330                  * 'index') un-requeued -> this buffer is the first buffer that
2331                  * will be requeued the next time
2332                  */
2333                 rc = do_QDIO(CARD_DDEV(card),
2334                              QDIO_FLAG_SYNC_INPUT,
2335                              0, queue->next_buf_to_init, count, NULL);
2336                 if (rc){
2337                         PRINT_WARN("qeth_queue_input_buffer's do_QDIO "
2338                                    "return %i (device %s).\n",
2339                                    rc, CARD_DDEV_ID(card));
2340                         QETH_DBF_TEXT(trace,2,"qinberr");
2341                         QETH_DBF_TEXT_(trace,2,"%s",CARD_BUS_ID(card));
2342                 }
2343                 queue->next_buf_to_init = (queue->next_buf_to_init + count) %
2344                                           QDIO_MAX_BUFFERS_PER_Q;
2345         }
2346 }
2347
2348 static inline void
2349 qeth_put_buffer_pool_entry(struct qeth_card *card,
2350                            struct qeth_buffer_pool_entry *entry)
2351 {
2352         QETH_DBF_TEXT(trace, 6, "ptbfplen");
2353         list_add_tail(&entry->list, &card->qdio.in_buf_pool.entry_list);
2354 }
2355
2356 static void
2357 qeth_qdio_input_handler(struct ccw_device * ccwdev, unsigned int status,
2358                         unsigned int qdio_err, unsigned int siga_err,
2359                         unsigned int queue, int first_element, int count,
2360                         unsigned long card_ptr)
2361 {
2362         struct net_device *net_dev;
2363         struct qeth_card *card;
2364         struct qeth_qdio_buffer *buffer;
2365         int index;
2366         int i;
2367
2368         QETH_DBF_TEXT(trace, 6, "qdinput");
2369         card = (struct qeth_card *) card_ptr;
2370         net_dev = card->dev;
2371 #ifdef CONFIG_QETH_PERF_STATS
2372         card->perf_stats.inbound_start_time = qeth_get_micros();
2373 #endif
2374         if (status & QDIO_STATUS_LOOK_FOR_ERROR) {
2375                 if (status & QDIO_STATUS_ACTIVATE_CHECK_CONDITION){
2376                         QETH_DBF_TEXT(trace, 1,"qdinchk");
2377                         QETH_DBF_TEXT_(trace,1,"%s",CARD_BUS_ID(card));
2378                         QETH_DBF_TEXT_(trace,1,"%04X%04X",first_element,count);
2379                         QETH_DBF_TEXT_(trace,1,"%04X%04X", queue, status);
2380                         qeth_schedule_recovery(card);
2381                         return;
2382                 }
2383         }
2384         for (i = first_element; i < (first_element + count); ++i) {
2385                 index = i % QDIO_MAX_BUFFERS_PER_Q;
2386                 buffer = &card->qdio.in_q->bufs[index];
2387                 if (!((status == QDIO_STATUS_LOOK_FOR_ERROR) &&
2388                       qeth_check_for_inbound_error(buffer, qdio_err, siga_err)))
2389                         qeth_process_inbound_buffer(card, buffer, index);
2390                 /* clear buffer and give back to hardware */
2391                 qeth_put_buffer_pool_entry(card, buffer->pool_entry);
2392                 qeth_queue_input_buffer(card, index);
2393         }
2394 }
2395
2396 static inline int
2397 qeth_handle_send_error(struct qeth_card *card,
2398                        struct qeth_qdio_out_buffer *buffer,
2399                        int qdio_err, int siga_err)
2400 {
2401         int sbalf15 = buffer->buffer->element[15].flags & 0xff;
2402         int cc = siga_err & 3;
2403
2404         QETH_DBF_TEXT(trace, 6, "hdsnderr");
2405         switch (cc) {
2406         case 0:
2407                 if (qdio_err){
2408                         QETH_DBF_TEXT(trace, 1,"lnkfail");
2409                         QETH_DBF_TEXT_(trace,1,"%s",CARD_BUS_ID(card));
2410                         QETH_DBF_TEXT_(trace,1,"%04x %02x",
2411                                        (u16)qdio_err, (u8)sbalf15);
2412                         return QETH_SEND_ERROR_LINK_FAILURE;
2413                 }
2414                 return QETH_SEND_ERROR_NONE;
2415         case 2:
2416                 if (siga_err & QDIO_SIGA_ERROR_B_BIT_SET) {
2417                         QETH_DBF_TEXT(trace, 1, "SIGAcc2B");
2418                         QETH_DBF_TEXT_(trace,1,"%s",CARD_BUS_ID(card));
2419                         return QETH_SEND_ERROR_KICK_IT;
2420                 }
2421                 if ((sbalf15 >= 15) && (sbalf15 <= 31))
2422                         return QETH_SEND_ERROR_RETRY;
2423                 return QETH_SEND_ERROR_LINK_FAILURE;
2424                 /* look at qdio_error and sbalf 15 */
2425         case 1:
2426                 QETH_DBF_TEXT(trace, 1, "SIGAcc1");
2427                 QETH_DBF_TEXT_(trace,1,"%s",CARD_BUS_ID(card));
2428                 return QETH_SEND_ERROR_LINK_FAILURE;
2429         case 3:
2430                 QETH_DBF_TEXT(trace, 1, "SIGAcc3");
2431                 QETH_DBF_TEXT_(trace,1,"%s",CARD_BUS_ID(card));
2432                 return QETH_SEND_ERROR_KICK_IT;
2433         }
2434         return QETH_SEND_ERROR_LINK_FAILURE;
2435 }
2436
2437 static inline void
2438 qeth_flush_buffers(struct qeth_qdio_out_q *queue, int under_int,
2439                    int index, int count)
2440 {
2441         struct qeth_qdio_out_buffer *buf;
2442         int rc;
2443         int i;
2444
2445         QETH_DBF_TEXT(trace, 6, "flushbuf");
2446
2447         for (i = index; i < index + count; ++i) {
2448                 buf = &queue->bufs[i % QDIO_MAX_BUFFERS_PER_Q];
2449                 buf->buffer->element[buf->next_element_to_fill - 1].flags |=
2450                                 SBAL_FLAGS_LAST_ENTRY;
2451
2452                 if (!queue->do_pack){
2453                         if ((atomic_read(&queue->used_buffers) >=
2454                                 (QETH_HIGH_WATERMARK_PACK -
2455                                  QETH_WATERMARK_PACK_FUZZ)) &&
2456                             !atomic_read(&queue->set_pci_flags_count)){
2457                                 /* it's likely that we'll go to packing
2458                                  * mode soon */
2459                                 atomic_inc(&queue->set_pci_flags_count);
2460                                 buf->buffer->element[0].flags |= 0x40;
2461                         }
2462                 } else {
2463                         if (!atomic_read(&queue->set_pci_flags_count)){
2464                                 /*
2465                                  * there's no outstanding PCI any more, so we
2466                                  * have to request a PCI to be sure the the PCI
2467                                  * will wake at some time in the future then we
2468                                  * can flush packed buffers that might still be
2469                                  * hanging around, which can happen if no
2470                                  * further send was requested by the stack
2471                                  */
2472                                 atomic_inc(&queue->set_pci_flags_count);
2473                                 buf->buffer->element[0].flags |= 0x40;
2474                         }
2475 #ifdef CONFIG_QETH_PERF_STATS
2476                         queue->card->perf_stats.bufs_sent_pack++;
2477 #endif
2478                 }
2479         }
2480
2481         queue->card->dev->trans_start = jiffies;
2482         if (under_int)
2483                 rc = do_QDIO(CARD_DDEV(queue->card),
2484                              QDIO_FLAG_SYNC_OUTPUT | QDIO_FLAG_UNDER_INTERRUPT,
2485                              queue->queue_no, index, count, NULL);
2486         else
2487                 rc = do_QDIO(CARD_DDEV(queue->card), QDIO_FLAG_SYNC_OUTPUT,
2488                              queue->queue_no, index, count, NULL);
2489         if (rc){
2490                 QETH_DBF_SPRINTF(trace, 0, "qeth_flush_buffers: do_QDIO "
2491                                  "returned error (%i) on device %s.",
2492                                  rc, CARD_DDEV_ID(queue->card));
2493                 QETH_DBF_TEXT(trace, 2, "flushbuf");
2494                 QETH_DBF_TEXT_(trace, 2, " err%d", rc);
2495                 queue->card->stats.tx_errors += count;
2496                 return;
2497         }
2498 #ifdef CONFIG_QETH_PERF_STATS
2499         queue->card->perf_stats.bufs_sent += count;
2500         queue->card->perf_stats.outbound_cnt++;
2501 #endif
2502 }
2503
2504 /*
2505  * switches between PACKING and non-PACKING state if needed.
2506  * has to be called holding queue->lock
2507  */
2508 static inline int
2509 qeth_switch_packing_state(struct qeth_qdio_out_q *queue)
2510 {
2511         struct qeth_qdio_out_buffer *buffer;
2512         int flush_count = 0;
2513
2514         QETH_DBF_TEXT(trace, 6, "swipack");
2515         if (!queue->do_pack) {
2516                 if (atomic_read(&queue->used_buffers)
2517                     >= QETH_HIGH_WATERMARK_PACK){
2518                         /* switch non-PACKING -> PACKING */
2519                         QETH_DBF_TEXT(trace, 6, "np->pack");
2520 #ifdef CONFIG_QETH_PERF_STATS
2521                         queue->card->perf_stats.sc_dp_p++;
2522 #endif
2523                         queue->do_pack = 1;
2524                 }
2525         } else {
2526                 if (atomic_read(&queue->used_buffers)
2527                     <= QETH_LOW_WATERMARK_PACK) {
2528                         /* switch PACKING -> non-PACKING */
2529                         QETH_DBF_TEXT(trace, 6, "pack->np");
2530 #ifdef CONFIG_QETH_PERF_STATS
2531                         queue->card->perf_stats.sc_p_dp++;
2532 #endif
2533                         queue->do_pack = 0;
2534                         /* flush packing buffers */
2535                         buffer = &queue->bufs[queue->next_buf_to_fill];
2536                         BUG_ON(buffer->state == QETH_QDIO_BUF_PRIMED);
2537                         if (buffer->next_element_to_fill > 0) {
2538                                 buffer->state = QETH_QDIO_BUF_PRIMED;
2539                                 flush_count++;
2540                                 atomic_inc(&queue->used_buffers);
2541                                 queue->next_buf_to_fill =
2542                                         (queue->next_buf_to_fill + 1) %
2543                                         QDIO_MAX_BUFFERS_PER_Q;
2544                         }
2545                 }
2546         }
2547         return flush_count;
2548 }
2549
2550 static inline void
2551 qeth_flush_buffers_on_no_pci(struct qeth_qdio_out_q *queue, int under_int)
2552 {
2553         struct qeth_qdio_out_buffer *buffer;
2554
2555         buffer = &queue->bufs[queue->next_buf_to_fill];
2556         BUG_ON(buffer->state == QETH_QDIO_BUF_PRIMED);
2557         if (buffer->next_element_to_fill > 0){
2558                 /* it's a packing buffer */
2559                 buffer->state = QETH_QDIO_BUF_PRIMED;
2560                 atomic_inc(&queue->used_buffers);
2561                 qeth_flush_buffers(queue, under_int, queue->next_buf_to_fill,
2562                                    1);
2563                 queue->next_buf_to_fill =
2564                         (queue->next_buf_to_fill + 1) % QDIO_MAX_BUFFERS_PER_Q;
2565         }
2566 }
2567
2568 static void
2569 qeth_qdio_output_handler(struct ccw_device * ccwdev, unsigned int status,
2570                         unsigned int qdio_error, unsigned int siga_error,
2571                         unsigned int __queue, int first_element, int count,
2572                         unsigned long card_ptr)
2573 {
2574         struct qeth_card *card        = (struct qeth_card *) card_ptr;
2575         struct qeth_qdio_out_q *queue = card->qdio.out_qs[__queue];
2576         struct qeth_qdio_out_buffer *buffer;
2577         int i;
2578
2579         QETH_DBF_TEXT(trace, 6, "qdouhdl");
2580         if (status & QDIO_STATUS_LOOK_FOR_ERROR) {
2581                 if (status & QDIO_STATUS_ACTIVATE_CHECK_CONDITION){
2582                         QETH_DBF_SPRINTF(trace, 2, "On device %s: "
2583                                          "received active check "
2584                                          "condition (0x%08x).",
2585                                          CARD_BUS_ID(card), status);
2586                         QETH_DBF_TEXT(trace, 2, "chkcond");
2587                         QETH_DBF_TEXT_(trace, 2, "%08x", status);
2588                         netif_stop_queue(card->dev);
2589                         qeth_schedule_recovery(card);
2590                         return;
2591                 }
2592         }
2593
2594         for(i = first_element; i < (first_element + count); ++i){
2595                 buffer = &queue->bufs[i % QDIO_MAX_BUFFERS_PER_Q];
2596                 /*we only handle the KICK_IT error by doing a recovery */
2597                 if (qeth_handle_send_error(card, buffer, qdio_error, siga_error)
2598                                 == QETH_SEND_ERROR_KICK_IT){
2599                         netif_stop_queue(card->dev);
2600                         qeth_schedule_recovery(card);
2601                         return;
2602                 }
2603                 /* is PCI flag set on buffer? */
2604                 if (buffer->buffer->element[0].flags & 0x40)
2605                         atomic_dec(&queue->set_pci_flags_count);
2606
2607                 qeth_clear_output_buffer(card, buffer);
2608                 atomic_dec(&queue->used_buffers);
2609         }
2610
2611         netif_wake_queue(card->dev);
2612 }
2613
2614 static char*
2615 qeth_create_qib_param_field(struct qeth_card *card)
2616 {
2617         char *param_field;
2618
2619         param_field = kmalloc(QDIO_MAX_BUFFERS_PER_Q * sizeof(char),
2620                               GFP_KERNEL);
2621         if (!param_field)
2622                 return NULL;
2623
2624         memset(param_field, 0, QDIO_MAX_BUFFERS_PER_Q * sizeof(char));
2625
2626         param_field[0] = _ascebc['P'];
2627         param_field[1] = _ascebc['C'];
2628         param_field[2] = _ascebc['I'];
2629         param_field[3] = _ascebc['T'];
2630         *((unsigned int *) (&param_field[4])) = QETH_PCI_THRESHOLD_A(card);
2631         *((unsigned int *) (&param_field[8])) = QETH_PCI_THRESHOLD_B(card);
2632         *((unsigned int *) (&param_field[12])) = QETH_PCI_TIMER_VALUE(card);
2633
2634         return param_field;
2635 }
2636
2637 static void
2638 qeth_initialize_working_pool_list(struct qeth_card *card)
2639 {
2640         struct qeth_buffer_pool_entry *entry;
2641
2642         QETH_DBF_TEXT(trace,5,"inwrklst");
2643
2644         list_for_each_entry(entry,
2645                             &card->qdio.init_pool.entry_list, init_list) {
2646                 qeth_put_buffer_pool_entry(card,entry);
2647         }
2648 }
2649
2650 static void
2651 qeth_clear_working_pool_list(struct qeth_card *card)
2652 {
2653         struct qeth_buffer_pool_entry *pool_entry, *tmp;
2654
2655         QETH_DBF_TEXT(trace,5,"clwrklst");
2656         list_for_each_entry_safe(pool_entry, tmp,
2657                             &card->qdio.in_buf_pool.entry_list, list){
2658                         list_del(&pool_entry->list);
2659         }
2660 }
2661
2662 static void
2663 qeth_free_buffer_pool(struct qeth_card *card)
2664 {
2665         struct qeth_buffer_pool_entry *pool_entry, *tmp;
2666         int i=0;
2667         QETH_DBF_TEXT(trace,5,"freepool");
2668         list_for_each_entry_safe(pool_entry, tmp,
2669                                  &card->qdio.init_pool.entry_list, init_list){
2670                 for (i = 0; i < QETH_MAX_BUFFER_ELEMENTS(card); ++i)
2671                         free_page((unsigned long)pool_entry->elements[i]);
2672                 list_del(&pool_entry->init_list);
2673                 kfree(pool_entry);
2674         }
2675 }
2676
2677 static int
2678 qeth_alloc_buffer_pool(struct qeth_card *card)
2679 {
2680         struct qeth_buffer_pool_entry *pool_entry;
2681         void *ptr;
2682         int i, j;
2683
2684         QETH_DBF_TEXT(trace,5,"clwkpool");
2685         for (i = 0; i < card->qdio.init_pool.buf_count; ++i){
2686                 pool_entry = kmalloc(sizeof(*pool_entry), GFP_KERNEL);
2687                 if (!pool_entry){
2688                         qeth_free_buffer_pool(card);
2689                         return -ENOMEM;
2690                 }
2691                 for(j = 0; j < QETH_MAX_BUFFER_ELEMENTS(card); ++j){
2692                         ptr = (void *) __get_free_page(GFP_KERNEL);
2693                         if (!ptr) {
2694                                 while (j > 0)
2695                                         free_page((unsigned long)
2696                                                   pool_entry->elements[--j]);
2697                                 kfree(pool_entry);
2698                                 qeth_free_buffer_pool(card);
2699                                 return -ENOMEM;
2700                         }
2701                         pool_entry->elements[j] = ptr;
2702                 }
2703                 list_add(&pool_entry->init_list,
2704                          &card->qdio.init_pool.entry_list);
2705         }
2706         return 0;
2707 }
2708
2709 int
2710 qeth_realloc_buffer_pool(struct qeth_card *card, int bufcnt)
2711 {
2712         QETH_DBF_TEXT(trace, 2, "realcbp");
2713
2714         if ((card->state != CARD_STATE_DOWN) &&
2715             (card->state != CARD_STATE_RECOVER))
2716                 return -EPERM;
2717
2718         /* TODO: steel/add buffers from/to a running card's buffer pool (?) */
2719         qeth_clear_working_pool_list(card);
2720         qeth_free_buffer_pool(card);
2721         card->qdio.in_buf_pool.buf_count = bufcnt;
2722         card->qdio.init_pool.buf_count = bufcnt;
2723         return qeth_alloc_buffer_pool(card);
2724 }
2725
2726 static int
2727 qeth_alloc_qdio_buffers(struct qeth_card *card)
2728 {
2729         int i, j;
2730
2731         QETH_DBF_TEXT(setup, 2, "allcqdbf");
2732
2733         if (card->qdio.state == QETH_QDIO_ALLOCATED)
2734                 return 0;
2735
2736         card->qdio.in_q = kmalloc(sizeof(struct qeth_qdio_q), GFP_KERNEL);
2737         if (!card->qdio.in_q)
2738                 return - ENOMEM;
2739         QETH_DBF_TEXT(setup, 2, "inq");
2740         QETH_DBF_HEX(setup, 2, &card->qdio.in_q, sizeof(void *));
2741         memset(card->qdio.in_q, 0, sizeof(struct qeth_qdio_q));
2742         /* give inbound qeth_qdio_buffers their qdio_buffers */
2743         for (i = 0; i < QDIO_MAX_BUFFERS_PER_Q; ++i)
2744                 card->qdio.in_q->bufs[i].buffer =
2745                         &card->qdio.in_q->qdio_bufs[i];
2746         /* inbound buffer pool */
2747         if (qeth_alloc_buffer_pool(card)){
2748                 kfree(card->qdio.in_q);
2749                 return -ENOMEM;
2750         }
2751         /* outbound */
2752         card->qdio.out_qs =
2753                 kmalloc(card->qdio.no_out_queues *
2754                         sizeof(struct qeth_qdio_out_q *), GFP_KERNEL);
2755         if (!card->qdio.out_qs){
2756                 qeth_free_buffer_pool(card);
2757                 return -ENOMEM;
2758         }
2759         for (i = 0; i < card->qdio.no_out_queues; ++i){
2760                 card->qdio.out_qs[i] = kmalloc(sizeof(struct qeth_qdio_out_q),
2761                                                GFP_KERNEL);
2762                 if (!card->qdio.out_qs[i]){
2763                         while (i > 0)
2764                                 kfree(card->qdio.out_qs[--i]);
2765                         kfree(card->qdio.out_qs);
2766                         return -ENOMEM;
2767                 }
2768                 QETH_DBF_TEXT_(setup, 2, "outq %i", i);
2769                 QETH_DBF_HEX(setup, 2, &card->qdio.out_qs[i], sizeof(void *));
2770                 memset(card->qdio.out_qs[i], 0, sizeof(struct qeth_qdio_out_q));
2771                 card->qdio.out_qs[i]->queue_no = i;
2772                 /* give inbound qeth_qdio_buffers their qdio_buffers */
2773                 for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; ++j){
2774                         card->qdio.out_qs[i]->bufs[j].buffer =
2775                                 &card->qdio.out_qs[i]->qdio_bufs[j];
2776                         skb_queue_head_init(&card->qdio.out_qs[i]->bufs[j].
2777                                             skb_list);
2778                 }
2779         }
2780         card->qdio.state = QETH_QDIO_ALLOCATED;
2781         return 0;
2782 }
2783
2784 static void
2785 qeth_free_qdio_buffers(struct qeth_card *card)
2786 {
2787         int i, j;
2788
2789         QETH_DBF_TEXT(trace, 2, "freeqdbf");
2790         if (card->qdio.state == QETH_QDIO_UNINITIALIZED)
2791                 return;
2792         kfree(card->qdio.in_q);
2793         /* inbound buffer pool */
2794         qeth_free_buffer_pool(card);
2795         /* free outbound qdio_qs */
2796         for (i = 0; i < card->qdio.no_out_queues; ++i){
2797                 for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; ++j)
2798                         qeth_clear_output_buffer(card, &card->qdio.
2799                                                 out_qs[i]->bufs[j]);
2800                 kfree(card->qdio.out_qs[i]);
2801         }
2802         kfree(card->qdio.out_qs);
2803         card->qdio.state = QETH_QDIO_UNINITIALIZED;
2804 }
2805
2806 static void
2807 qeth_clear_qdio_buffers(struct qeth_card *card)
2808 {
2809         int i, j;
2810
2811         QETH_DBF_TEXT(trace, 2, "clearqdbf");
2812         /* clear outbound buffers to free skbs */
2813         for (i = 0; i < card->qdio.no_out_queues; ++i)
2814                 if (card->qdio.out_qs[i]){
2815                         for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; ++j)
2816                                 qeth_clear_output_buffer(card, &card->qdio.
2817                                                 out_qs[i]->bufs[j]);
2818                 }
2819 }
2820
2821 static void
2822 qeth_init_qdio_info(struct qeth_card *card)
2823 {
2824         QETH_DBF_TEXT(setup, 4, "intqdinf");
2825         card->qdio.state = QETH_QDIO_UNINITIALIZED;
2826         /* inbound */
2827         card->qdio.in_buf_size = QETH_IN_BUF_SIZE_DEFAULT;
2828         card->qdio.init_pool.buf_count = QETH_IN_BUF_COUNT_DEFAULT;
2829         card->qdio.in_buf_pool.buf_count = card->qdio.init_pool.buf_count;
2830         INIT_LIST_HEAD(&card->qdio.in_buf_pool.entry_list);
2831         INIT_LIST_HEAD(&card->qdio.init_pool.entry_list);
2832         /* outbound */
2833         card->qdio.do_prio_queueing = QETH_PRIOQ_DEFAULT;
2834         card->qdio.default_out_queue = QETH_DEFAULT_QUEUE;
2835 }
2836
2837 static int
2838 qeth_init_qdio_queues(struct qeth_card *card)
2839 {
2840         int i, j;
2841         int rc;
2842
2843         QETH_DBF_TEXT(setup, 2, "initqdqs");
2844
2845         /* inbound queue */
2846         memset(card->qdio.in_q->qdio_bufs, 0,
2847                QDIO_MAX_BUFFERS_PER_Q * sizeof(struct qdio_buffer));
2848         qeth_initialize_working_pool_list(card);
2849         /*give only as many buffers to hardware as we have buffer pool entries*/
2850         for (i = 0; i < card->qdio.in_buf_pool.buf_count - 1; ++i)
2851                 qeth_init_input_buffer(card, &card->qdio.in_q->bufs[i]);
2852         card->qdio.in_q->next_buf_to_init = card->qdio.in_buf_pool.buf_count - 1;
2853         rc = do_QDIO(CARD_DDEV(card), QDIO_FLAG_SYNC_INPUT, 0, 0,
2854                      card->qdio.in_buf_pool.buf_count - 1, NULL);
2855         if (rc) {
2856                 QETH_DBF_TEXT_(setup, 2, "1err%d", rc);
2857                 return rc;
2858         }
2859         rc = qdio_synchronize(CARD_DDEV(card), QDIO_FLAG_SYNC_INPUT, 0);
2860         if (rc) {
2861                 QETH_DBF_TEXT_(setup, 2, "2err%d", rc);
2862                 return rc;
2863         }
2864         /* outbound queue */
2865         for (i = 0; i < card->qdio.no_out_queues; ++i){
2866                 memset(card->qdio.out_qs[i]->qdio_bufs, 0,
2867                        QDIO_MAX_BUFFERS_PER_Q * sizeof(struct qdio_buffer));
2868                 for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; ++j){
2869                         qeth_clear_output_buffer(card, &card->qdio.
2870                                                  out_qs[i]->bufs[j]);
2871                 }
2872                 card->qdio.out_qs[i]->card = card;
2873                 card->qdio.out_qs[i]->next_buf_to_fill = 0;
2874                 card->qdio.out_qs[i]->do_pack = 0;
2875                 atomic_set(&card->qdio.out_qs[i]->used_buffers,0);
2876                 atomic_set(&card->qdio.out_qs[i]->set_pci_flags_count, 0);
2877                 spin_lock_init(&card->qdio.out_qs[i]->lock);
2878         }
2879         return 0;
2880 }
2881
2882 static int
2883 qeth_qdio_establish(struct qeth_card *card)
2884 {
2885         struct qdio_initialize init_data;
2886         char *qib_param_field;
2887         struct qdio_buffer **in_sbal_ptrs;
2888         struct qdio_buffer **out_sbal_ptrs;
2889         int i, j, k;
2890         int rc;
2891
2892         QETH_DBF_TEXT(setup, 2, "qdioest");
2893         qib_param_field = qeth_create_qib_param_field(card);
2894         if (!qib_param_field)
2895                 return -ENOMEM;
2896
2897         in_sbal_ptrs = kmalloc(QDIO_MAX_BUFFERS_PER_Q * sizeof(void *),
2898                                GFP_KERNEL);
2899         if (!in_sbal_ptrs) {
2900                 kfree(qib_param_field);
2901                 return -ENOMEM;
2902         }
2903         for(i = 0; i < QDIO_MAX_BUFFERS_PER_Q; ++i)
2904                 in_sbal_ptrs[i] = (struct qdio_buffer *)
2905                         virt_to_phys(card->qdio.in_q->bufs[i].buffer);
2906
2907         out_sbal_ptrs =
2908                 kmalloc(card->qdio.no_out_queues * QDIO_MAX_BUFFERS_PER_Q *
2909                         sizeof(void *), GFP_KERNEL);
2910         if (!out_sbal_ptrs) {
2911                 kfree(in_sbal_ptrs);
2912                 kfree(qib_param_field);
2913                 return -ENOMEM;
2914         }
2915         for(i = 0, k = 0; i < card->qdio.no_out_queues; ++i)
2916                 for(j = 0; j < QDIO_MAX_BUFFERS_PER_Q; ++j, ++k){
2917                         out_sbal_ptrs[k] = (struct qdio_buffer *)
2918                                 virt_to_phys(card->qdio.out_qs[i]->
2919                                              bufs[j].buffer);
2920                 }
2921
2922         memset(&init_data, 0, sizeof(struct qdio_initialize));
2923         init_data.cdev                   = CARD_DDEV(card);
2924         init_data.q_format               = qeth_get_qdio_q_format(card);
2925         init_data.qib_param_field_format = 0;
2926         init_data.qib_param_field        = qib_param_field;
2927         init_data.min_input_threshold    = QETH_MIN_INPUT_THRESHOLD;
2928         init_data.max_input_threshold    = QETH_MAX_INPUT_THRESHOLD;
2929         init_data.min_output_threshold   = QETH_MIN_OUTPUT_THRESHOLD;
2930         init_data.max_output_threshold   = QETH_MAX_OUTPUT_THRESHOLD;
2931         init_data.no_input_qs            = 1;
2932         init_data.no_output_qs           = card->qdio.no_out_queues;
2933         init_data.input_handler          = (qdio_handler_t *)
2934                                            qeth_qdio_input_handler;
2935         init_data.output_handler         = (qdio_handler_t *)
2936                                            qeth_qdio_output_handler;
2937         init_data.int_parm               = (unsigned long) card;
2938         init_data.flags                  = QDIO_INBOUND_0COPY_SBALS |
2939                                            QDIO_OUTBOUND_0COPY_SBALS |
2940                                            QDIO_USE_OUTBOUND_PCIS;
2941         init_data.input_sbal_addr_array  = (void **) in_sbal_ptrs;
2942         init_data.output_sbal_addr_array = (void **) out_sbal_ptrs;
2943
2944         if (!(rc = qdio_initialize(&init_data)))
2945                 card->qdio.state = QETH_QDIO_ESTABLISHED;
2946
2947         kfree(out_sbal_ptrs);
2948         kfree(in_sbal_ptrs);
2949         kfree(qib_param_field);
2950         return rc;
2951 }
2952
2953 static int
2954 qeth_qdio_activate(struct qeth_card *card)
2955 {
2956         QETH_DBF_TEXT(setup,3,"qdioact");
2957         return qdio_activate(CARD_DDEV(card), 0);
2958 }
2959
2960 static int
2961 qeth_clear_channel(struct qeth_channel *channel)
2962 {
2963         unsigned long flags;
2964         struct qeth_card *card;
2965         int rc;
2966
2967         QETH_DBF_TEXT(trace,3,"clearch");
2968         card = CARD_FROM_CDEV(channel->ccwdev);
2969         spin_lock_irqsave(get_ccwdev_lock(channel->ccwdev), flags);
2970         rc = ccw_device_clear(channel->ccwdev, QETH_CLEAR_CHANNEL_PARM);
2971         spin_unlock_irqrestore(get_ccwdev_lock(channel->ccwdev), flags);
2972
2973         if (rc)
2974                 return rc;
2975         rc = wait_event_interruptible_timeout(card->wait_q,
2976                         channel->state==CH_STATE_STOPPED, QETH_TIMEOUT);
2977         if (rc == -ERESTARTSYS)
2978                 return rc;
2979         if (channel->state != CH_STATE_STOPPED)
2980                 return -ETIME;
2981         channel->state = CH_STATE_DOWN;
2982         return 0;
2983 }
2984
2985 static int
2986 qeth_halt_channel(struct qeth_channel *channel)
2987 {
2988         unsigned long flags;
2989         struct qeth_card *card;
2990         int rc;
2991
2992         QETH_DBF_TEXT(trace,3,"haltch");
2993         card = CARD_FROM_CDEV(channel->ccwdev);
2994         spin_lock_irqsave(get_ccwdev_lock(channel->ccwdev), flags);
2995         rc = ccw_device_halt(channel->ccwdev, QETH_HALT_CHANNEL_PARM);
2996         spin_unlock_irqrestore(get_ccwdev_lock(channel->ccwdev), flags);
2997
2998         if (rc)
2999                 return rc;
3000         rc = wait_event_interruptible_timeout(card->wait_q,
3001                         channel->state==CH_STATE_HALTED, QETH_TIMEOUT);
3002         if (rc == -ERESTARTSYS)
3003                 return rc;
3004         if (channel->state != CH_STATE_HALTED)
3005                 return -ETIME;
3006         return 0;
3007 }
3008
3009 static int
3010 qeth_halt_channels(struct qeth_card *card)
3011 {
3012         int rc = 0;
3013
3014         QETH_DBF_TEXT(trace,3,"haltchs");
3015         if ((rc = qeth_halt_channel(&card->read)))
3016                 return rc;
3017         if ((rc = qeth_halt_channel(&card->write)))
3018                 return rc;
3019         return  qeth_halt_channel(&card->data);
3020 }
3021 static int
3022 qeth_clear_channels(struct qeth_card *card)
3023 {
3024         int rc = 0;
3025
3026         QETH_DBF_TEXT(trace,3,"clearchs");
3027         if ((rc = qeth_clear_channel(&card->read)))
3028                 return rc;
3029         if ((rc = qeth_clear_channel(&card->write)))
3030                 return rc;
3031         return  qeth_clear_channel(&card->data);
3032 }
3033
3034 static int
3035 qeth_clear_halt_card(struct qeth_card *card, int halt)
3036 {
3037         int rc = 0;
3038
3039         QETH_DBF_TEXT(trace,3,"clhacrd");
3040         QETH_DBF_HEX(trace, 3, &card, sizeof(void *));
3041
3042         if (halt)
3043                 rc = qeth_halt_channels(card);
3044         if (rc)
3045                 return rc;
3046         return qeth_clear_channels(card);
3047 }
3048
3049 static int
3050 qeth_qdio_clear_card(struct qeth_card *card, int use_halt)
3051 {
3052         int rc = 0;
3053
3054         QETH_DBF_TEXT(trace,3,"qdioclr");
3055         if (card->qdio.state == QETH_QDIO_ESTABLISHED){
3056                 qdio_cleanup(CARD_DDEV(card),
3057                              (card->info.type == QETH_CARD_TYPE_IQD) ?
3058                              QDIO_FLAG_CLEANUP_USING_HALT :
3059                              QDIO_FLAG_CLEANUP_USING_CLEAR);
3060                 card->qdio.state = QETH_QDIO_ALLOCATED;
3061         }
3062         rc = qeth_clear_halt_card(card, use_halt);
3063         card->state = CARD_STATE_DOWN;
3064         return rc;
3065 }
3066
3067 static int
3068 qeth_dm_act(struct qeth_card *card)
3069 {
3070         int rc;
3071         struct qeth_cmd_buffer *iob;
3072
3073         QETH_DBF_TEXT(setup,2,"dmact");
3074
3075         iob = qeth_wait_for_buffer(&card->write);
3076         memcpy(iob->data, DM_ACT, DM_ACT_SIZE);
3077
3078         memcpy(QETH_DM_ACT_DEST_ADDR(iob->data),
3079                &card->token.cm_connection_r, QETH_MPC_TOKEN_LENGTH);
3080         memcpy(QETH_DM_ACT_CONNECTION_TOKEN(iob->data),
3081                &card->token.ulp_connection_r, QETH_MPC_TOKEN_LENGTH);
3082         rc = qeth_send_control_data(card, DM_ACT_SIZE, iob, NULL, NULL);
3083         return rc;
3084 }
3085
3086 static int
3087 qeth_mpc_initialize(struct qeth_card *card)
3088 {
3089         int rc;
3090
3091         QETH_DBF_TEXT(setup,2,"mpcinit");
3092
3093         if ((rc = qeth_issue_next_read(card))){
3094                 QETH_DBF_TEXT_(setup, 2, "1err%d", rc);
3095                 return rc;
3096         }
3097         if ((rc = qeth_cm_enable(card))){
3098                 QETH_DBF_TEXT_(setup, 2, "2err%d", rc);
3099                 return rc;
3100         }
3101         if ((rc = qeth_cm_setup(card))){
3102                 QETH_DBF_TEXT_(setup, 2, "3err%d", rc);
3103                 return rc;
3104         }
3105         if ((rc = qeth_ulp_enable(card))){
3106                 QETH_DBF_TEXT_(setup, 2, "4err%d", rc);
3107                 return rc;
3108         }
3109         if ((rc = qeth_ulp_setup(card))){
3110                 QETH_DBF_TEXT_(setup, 2, "5err%d", rc);
3111                 return rc;
3112         }
3113         if ((rc = qeth_alloc_qdio_buffers(card))){
3114                 QETH_DBF_TEXT_(setup, 2, "5err%d", rc);
3115                 return rc;
3116         }
3117         if ((rc = qeth_qdio_establish(card))){
3118                 QETH_DBF_TEXT_(setup, 2, "6err%d", rc);
3119                 qeth_free_qdio_buffers(card);
3120                 goto out_qdio;
3121         }
3122         if ((rc = qeth_qdio_activate(card))){
3123                 QETH_DBF_TEXT_(setup, 2, "7err%d", rc);
3124                 goto out_qdio;
3125         }
3126         if ((rc = qeth_dm_act(card))){
3127                 QETH_DBF_TEXT_(setup, 2, "8err%d", rc);
3128                 goto out_qdio;
3129         }
3130
3131         return 0;
3132 out_qdio:
3133         qeth_qdio_clear_card(card, card->info.type==QETH_CARD_TYPE_OSAE);
3134         return rc;
3135 }
3136
3137 static void
3138 qeth_set_device_name(struct qeth_card *card)
3139 {
3140         char buf[IF_NAME_LEN];
3141
3142         memset(buf, 0, IF_NAME_LEN);
3143         if (card->info.type == QETH_CARD_TYPE_IQD) {
3144                 sprintf(buf,"hsi%d", atomic_read(&qeth_hsi_count));
3145                 atomic_inc(&qeth_hsi_count);
3146                 memcpy(card->dev->name,buf,IF_NAME_LEN);
3147         }
3148
3149 }
3150
3151 static struct net_device *
3152 qeth_get_netdevice(enum qeth_card_types type, enum qeth_link_types linktype)
3153 {
3154         struct net_device *dev = NULL;
3155
3156         switch (type) {
3157         case QETH_CARD_TYPE_OSAE:
3158                 switch (linktype) {
3159                 case QETH_LINK_TYPE_LANE_TR:
3160                 case QETH_LINK_TYPE_HSTR:
3161 #ifdef CONFIG_TR
3162                         dev = alloc_trdev(0);
3163 #endif /* CONFIG_TR */
3164                         break;
3165                 default:
3166                         dev = alloc_etherdev(0);
3167                 }
3168                 break;
3169         case QETH_CARD_TYPE_IQD:
3170         default:
3171                 dev = alloc_etherdev(0);
3172         }
3173         return dev;
3174 }
3175
3176 static inline int
3177 qeth_send_packet(struct qeth_card *, struct sk_buff *);
3178
3179 static int
3180 qeth_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
3181 {
3182         int rc;
3183         struct qeth_card *card;
3184
3185         QETH_DBF_TEXT(trace, 6, "hrdstxmi");
3186         card = (struct qeth_card *)dev->priv;
3187         if (skb==NULL) {
3188                 card->stats.tx_dropped++;
3189                 card->stats.tx_errors++;
3190                 return -EIO;
3191         }
3192         if ((card->state != CARD_STATE_UP) || !netif_carrier_ok(dev)) {
3193                 card->stats.tx_dropped++;
3194                 card->stats.tx_errors++;
3195                 card->stats.tx_carrier_errors++;
3196                 return -EIO;
3197         }
3198         if (netif_queue_stopped(dev) ) {
3199                 card->stats.tx_dropped++;
3200                 return -EBUSY;
3201         }
3202 #ifdef CONFIG_QETH_PERF_STATS
3203         card->perf_stats.outbound_start_time = qeth_get_micros();
3204 #endif
3205         /*
3206          * dev_queue_xmit should ensure that we are called packet
3207          * after packet
3208          */
3209         netif_stop_queue(dev);
3210         if (!(rc = qeth_send_packet(card, skb)))
3211                 netif_wake_queue(dev);
3212
3213         return rc;
3214 }
3215
3216 static int
3217 qeth_verify_vlan_dev(struct net_device *dev, struct qeth_card *card)
3218 {
3219         int rc = 0;
3220 #ifdef CONFIG_QETH_VLAN
3221         struct vlan_group *vg;
3222         int i;
3223
3224         if (!(vg = card->vlangrp))
3225                 return rc;
3226
3227         for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++){
3228                 if (vg->vlan_devices[i] == dev){
3229                         rc = QETH_VLAN_CARD;
3230                         break;
3231                 }
3232         }
3233 #endif
3234         return rc;
3235 }
3236
3237 static int
3238 qeth_verify_dev(struct net_device *dev)
3239 {
3240         struct qeth_card *card;
3241         unsigned long flags;
3242         int rc = 0;
3243
3244         read_lock_irqsave(&qeth_card_list.rwlock, flags);
3245         list_for_each_entry(card, &qeth_card_list.list, list){
3246                 if (card->dev == dev){
3247                         rc = QETH_REAL_CARD;
3248                         break;
3249                 }
3250                 rc = qeth_verify_vlan_dev(dev, card);
3251                 if (rc)
3252                         break;
3253         }
3254         read_unlock_irqrestore(&qeth_card_list.rwlock, flags);
3255
3256         return rc;
3257 }
3258
3259 static struct qeth_card *
3260 qeth_get_card_from_dev(struct net_device *dev)
3261 {
3262         struct qeth_card *card = NULL;
3263         int rc;
3264
3265         rc = qeth_verify_dev(dev);
3266         if (rc == QETH_REAL_CARD)
3267                 card = (struct qeth_card *)dev->priv;
3268         else if (rc == QETH_VLAN_CARD)
3269                 card = (struct qeth_card *)
3270                         VLAN_DEV_INFO(dev)->real_dev->priv;
3271
3272         QETH_DBF_TEXT_(trace, 4, "%d", rc);
3273         return card ;
3274 }
3275
3276 static void
3277 qeth_tx_timeout(struct net_device *dev)
3278 {
3279         struct qeth_card *card;
3280
3281         card = (struct qeth_card *) dev->priv;
3282         card->stats.tx_errors++;
3283         qeth_schedule_recovery(card);
3284 }
3285
3286 static int
3287 qeth_open(struct net_device *dev)
3288 {
3289         struct qeth_card *card;
3290
3291         QETH_DBF_TEXT(trace, 4, "qethopen");
3292
3293         card = (struct qeth_card *) dev->priv;
3294
3295         if (card->state != CARD_STATE_SOFTSETUP)
3296                 return -ENODEV;
3297
3298         card->dev->flags |= IFF_UP;
3299         netif_start_queue(dev);
3300         card->data.state = CH_STATE_UP;
3301         card->state = CARD_STATE_UP;
3302
3303         if (!card->lan_online){
3304                 if (netif_carrier_ok(dev))
3305                         netif_carrier_off(dev);
3306                 netif_stop_queue(dev);
3307         }
3308         return 0;
3309 }
3310
3311 static int
3312 qeth_stop(struct net_device *dev)
3313 {
3314         struct qeth_card *card;
3315
3316         QETH_DBF_TEXT(trace, 4, "qethstop");
3317
3318         card = (struct qeth_card *) dev->priv;
3319
3320         netif_stop_queue(dev);
3321         card->dev->flags &= ~IFF_UP;
3322         if (card->state == CARD_STATE_UP)
3323                 card->state = CARD_STATE_SOFTSETUP;
3324         return 0;
3325 }
3326
3327 static inline int
3328 qeth_get_cast_type(struct qeth_card *card, struct sk_buff *skb)
3329 {
3330         int cast_type = RTN_UNSPEC;
3331
3332         if (skb->dst && skb->dst->neighbour){
3333                 cast_type = skb->dst->neighbour->type;
3334                 if ((cast_type == RTN_BROADCAST) ||
3335                     (cast_type == RTN_MULTICAST) ||
3336                     (cast_type == RTN_ANYCAST))
3337                         return cast_type;
3338                 else
3339                         return RTN_UNSPEC;
3340         }
3341         /* try something else */
3342         if (skb->protocol == ETH_P_IPV6)
3343                 return (skb->nh.raw[24] == 0xff) ? RTN_MULTICAST : 0;
3344         else if (skb->protocol == ETH_P_IP)
3345                 return ((skb->nh.raw[16] & 0xf0) == 0xe0) ? RTN_MULTICAST : 0;
3346         /* ... */
3347         if (!memcmp(skb->nh.raw, skb->dev->broadcast, 6))
3348                 return RTN_BROADCAST;
3349         else {
3350                 u16 hdr_mac;
3351
3352                 hdr_mac = *((u16 *)skb->nh.raw);
3353                 /* tr multicast? */
3354                 switch (card->info.link_type) {
3355                 case QETH_LINK_TYPE_HSTR:
3356                 case QETH_LINK_TYPE_LANE_TR:
3357                         if ((hdr_mac == QETH_TR_MAC_NC) ||
3358                             (hdr_mac == QETH_TR_MAC_C))
3359                                 return RTN_MULTICAST;
3360                 /* eth or so multicast? */
3361                 default:
3362                         if ((hdr_mac == QETH_ETH_MAC_V4) ||
3363                             (hdr_mac == QETH_ETH_MAC_V6))
3364                                 return RTN_MULTICAST;
3365                 }
3366         }
3367         return cast_type;
3368 }
3369
3370 static inline int
3371 qeth_get_priority_queue(struct qeth_card *card, struct sk_buff *skb,
3372                         int ipv, int cast_type)
3373 {
3374         if (!ipv && (card->info.type == QETH_CARD_TYPE_OSAE))
3375                 return card->qdio.default_out_queue;
3376         switch (card->qdio.no_out_queues) {
3377         case 4:
3378                 if (cast_type && card->info.is_multicast_different)
3379                         return card->info.is_multicast_different &
3380                                 (card->qdio.no_out_queues - 1);
3381                 if (card->qdio.do_prio_queueing && (ipv == 4)) {
3382                         if (card->qdio.do_prio_queueing==QETH_PRIO_Q_ING_TOS){
3383                                 if (skb->nh.iph->tos & IP_TOS_NOTIMPORTANT)
3384                                         return 3;
3385                                 if (skb->nh.iph->tos & IP_TOS_HIGHRELIABILITY)
3386                                         return 2;
3387                                 if (skb->nh.iph->tos & IP_TOS_HIGHTHROUGHPUT)
3388                                         return 1;
3389                                 if (skb->nh.iph->tos & IP_TOS_LOWDELAY)
3390                                         return 0;
3391                         }
3392                         if (card->qdio.do_prio_queueing==QETH_PRIO_Q_ING_PREC)
3393                                 return 3 - (skb->nh.iph->tos >> 6);
3394                 } else if (card->qdio.do_prio_queueing && (ipv == 6)) {
3395                         /* TODO: IPv6!!! */
3396                 }
3397                 return card->qdio.default_out_queue;
3398         default:
3399                 return 0;
3400         }
3401 }
3402
3403 static inline int
3404 qeth_get_ip_version(struct sk_buff *skb)
3405 {
3406         switch (skb->protocol) {
3407         case ETH_P_IPV6:
3408                 return 6;
3409         case ETH_P_IP:
3410                 return 4;
3411         default:
3412                 return 0;
3413         }
3414 }
3415
3416 static inline int
3417 qeth_prepare_skb(struct qeth_card *card, struct sk_buff **skb,
3418                  struct qeth_hdr **hdr, int ipv)
3419 {
3420         struct sk_buff *new_skb;
3421 #ifdef CONFIG_QETH_VLAN
3422         u16 *tag;
3423 #endif
3424
3425         QETH_DBF_TEXT(trace, 6, "prepskb");
3426         if (skb_headroom(*skb) < sizeof(struct qeth_hdr)){
3427                 new_skb = skb_realloc_headroom(*skb, sizeof(struct qeth_hdr));
3428                 if (!new_skb) {
3429                         PRINT_ERR("qeth_prepare_skb: could "
3430                                   "not realloc headroom for qeth_hdr "
3431                                   "on interface %s", card->info.if_name);
3432                         return -ENOMEM;
3433                 }
3434                 *skb = new_skb;
3435         }
3436 #ifdef CONFIG_QETH_VLAN
3437         if (card->vlangrp && vlan_tx_tag_present(*skb) && (ipv == 6)){
3438                 /*
3439                  * Move the mac addresses (6 bytes src, 6 bytes dest)
3440                  * to the beginning of the new header.  We are using three
3441                  * memcpys instead of one memmove to save cycles.
3442                  */
3443                 skb_push(*skb, VLAN_HLEN);
3444                 memcpy((*skb)->data, (*skb)->data + 4, 4);
3445                 memcpy((*skb)->data + 4, (*skb)->data + 8, 4);
3446                 memcpy((*skb)->data + 8, (*skb)->data + 12, 4);
3447                 tag = (u16 *) (*skb)->data + 12;
3448                 /*
3449                  * first two bytes  = ETH_P_8021Q (0x8100)
3450                  * second two bytes = VLANID
3451                  */
3452                 *tag = __constant_htons(ETH_P_8021Q);
3453                 *(tag + 1) = vlan_tx_tag_get(*skb);
3454                 *(tag + 1) = htons(*(tag + 1));
3455         }
3456 #endif
3457         *hdr = (struct qeth_hdr *) skb_push(*skb, sizeof(struct qeth_hdr));
3458         /*
3459          * sanity check, the Linux memory allocation scheme should
3460          * never present us cases like this one (the 32bytes header plus
3461          * the first 40 bytes of the paket cross a 4k boundary)
3462          */
3463         if ((((unsigned long) *hdr) & (~(PAGE_SIZE - 1))) !=
3464             (((unsigned long) *hdr + sizeof(struct qeth_hdr) +
3465               QETH_IP_HEADER_SIZE) & (~(PAGE_SIZE - 1)))) {
3466                 PRINT_ERR("qeth_prepare_skb: misaligned "
3467                           "packet on interface %s. Discarded.",
3468                           card->info.if_name);
3469                 return -EINVAL;
3470         }
3471         return 0;
3472 }
3473
3474 static inline u8
3475 qeth_get_qeth_hdr_flags4(int cast_type)
3476 {
3477         if (cast_type == RTN_MULTICAST)
3478                 return QETH_CAST_MULTICAST;
3479         if (cast_type == RTN_BROADCAST)
3480                 return QETH_CAST_BROADCAST;
3481         return QETH_CAST_UNICAST;
3482 }
3483
3484 static inline u8
3485 qeth_get_qeth_hdr_flags6(int cast_type)
3486 {
3487         u8 ct = QETH_HDR_PASSTHRU | QETH_HDR_IPV6;
3488         if (cast_type == RTN_MULTICAST)
3489                 return ct | QETH_CAST_MULTICAST;
3490         if (cast_type == RTN_ANYCAST)
3491                 return ct | QETH_CAST_ANYCAST;
3492         if (cast_type == RTN_BROADCAST)
3493                 return ct | QETH_CAST_BROADCAST;
3494         return ct | QETH_CAST_UNICAST;
3495 }
3496
3497 static inline void
3498 qeth_fill_header(struct qeth_card *card, struct qeth_hdr *hdr,
3499                 struct sk_buff *skb, int ipv, int cast_type)
3500 {
3501         hdr->id = 1;
3502         hdr->ext_flags = 0;
3503
3504         QETH_DBF_TEXT(trace, 6, "fillhdr");
3505 #ifdef CONFIG_QETH_VLAN
3506         /*
3507          * before we're going to overwrite this location with next hop ip.
3508          * v6 uses passthrough, v4 sets the tag in the QDIO header.
3509          */
3510         if (card->vlangrp && vlan_tx_tag_present(skb)) {
3511                 hdr->ext_flags = (ipv == 4)? QETH_EXT_HDR_VLAN_FRAME :
3512                                              QETH_EXT_HDR_INCLUDE_VLAN_TAG;
3513                 hdr->vlan_id = vlan_tx_tag_get(skb);
3514         }
3515 #endif /* CONFIG_QETH_VLAN */
3516         hdr->length = skb->len - sizeof(struct qeth_hdr);
3517         if (ipv == 4) {  /* IPv4 */
3518                 hdr->flags = qeth_get_qeth_hdr_flags4(cast_type);
3519                 memset(hdr->dest_addr, 0, 12);
3520                 if ((skb->dst) && (skb->dst->neighbour)) {
3521                         *((u32 *) (&hdr->dest_addr[12])) =
3522                             *((u32 *) skb->dst->neighbour->primary_key);
3523                 } else {
3524                         /* fill in destination address used in ip header */
3525                         *((u32 *) (&hdr->dest_addr[12])) = skb->nh.iph->daddr;
3526                 }
3527         } else if (ipv == 6) { /* IPv6 or passthru */
3528                 hdr->flags = qeth_get_qeth_hdr_flags6(cast_type);
3529                 if ((skb->dst) && (skb->dst->neighbour)) {
3530                         memcpy(hdr->dest_addr,
3531                                skb->dst->neighbour->primary_key, 16);
3532                 } else {
3533                         /* fill in destination address used in ip header */
3534                         memcpy(hdr->dest_addr, &skb->nh.ipv6h->daddr, 16);
3535                 }
3536         } else { /* passthrough */
3537                 if (!memcmp(skb->data + sizeof(struct qeth_hdr),
3538                             skb->dev->broadcast, 6)) {   /* broadcast? */
3539                         hdr->flags = QETH_CAST_BROADCAST | QETH_HDR_PASSTHRU;
3540                 } else {
3541                         hdr->flags = (cast_type == RTN_MULTICAST) ?
3542                                 QETH_CAST_MULTICAST | QETH_HDR_PASSTHRU :
3543                                 QETH_CAST_UNICAST | QETH_HDR_PASSTHRU;
3544                 }
3545         }
3546 }
3547
3548 static inline int
3549 qeth_fill_buffer(struct qeth_qdio_out_q *queue, struct qeth_qdio_out_buffer *buf,
3550                  char *data, struct sk_buff *skb)
3551 {
3552         struct qdio_buffer *buffer;
3553         int length = skb->len;
3554         int length_here;
3555         int element;
3556         int first_lap = 1;
3557
3558         QETH_DBF_TEXT(trace, 6, "qdfillbf");
3559
3560         buffer = buf->buffer;
3561         atomic_inc(&skb->users);
3562         skb_queue_tail(&buf->skb_list, skb);
3563         element = buf->next_element_to_fill;
3564         while (length > 0) {
3565                 /* length_here is the remaining amount of data in this page */
3566                 length_here = PAGE_SIZE - ((unsigned long) data % PAGE_SIZE);
3567                 if (length < length_here)
3568                         length_here = length;
3569                 buffer->element[element].addr = data;
3570                 buffer->element[element].length = length_here;
3571                 length -= length_here;
3572                 if (!length){
3573                         if (first_lap)
3574                                 buffer->element[element].flags = 0;
3575                         else
3576                                 buffer->element[element].flags =
3577                                     SBAL_FLAGS_LAST_FRAG;
3578                 } else {
3579                         if (first_lap)
3580                                 buffer->element[element].flags =
3581                                     SBAL_FLAGS_FIRST_FRAG;
3582                         else
3583                                 buffer->element[element].flags =
3584                                     SBAL_FLAGS_MIDDLE_FRAG;
3585                 }
3586                 data += length_here;
3587                 element++;
3588                 first_lap = 0;
3589         }
3590         buf->next_element_to_fill = element;
3591         if (!queue->do_pack) {
3592                 QETH_DBF_TEXT(trace, 6, "fillbfnp");
3593                 /* set state to PRIMED -> will be flushed */
3594                 buf->state = QETH_QDIO_BUF_PRIMED;
3595         } else {
3596                 QETH_DBF_TEXT(trace, 6, "fillbfpa");
3597 #ifdef CONFIG_QETH_PERF_STATS
3598                 queue->card->perf_stats.skbs_sent_pack++;
3599 #endif
3600                 if (buf->next_element_to_fill >=
3601                                 QETH_MAX_BUFFER_ELEMENTS(queue->card)) {
3602                         /*
3603                          * packed buffer if full -> set state PRIMED
3604                          * -> will be flushed
3605                          */
3606                         buf->state = QETH_QDIO_BUF_PRIMED;
3607                 }
3608         }
3609         return 0;
3610 }
3611
3612 static inline int
3613 qeth_do_send_packet(struct qeth_card *card, struct sk_buff *skb,
3614                     struct qeth_qdio_out_q *queue, int ipv,
3615                     int cast_type)
3616 {
3617         struct qeth_hdr *hdr;
3618         struct qeth_qdio_out_buffer *buffer;
3619         int elements_needed;
3620         int start_index;
3621         int flush_count = 0;
3622         int rc;
3623
3624         QETH_DBF_TEXT(trace, 6, "dosndpkt");
3625
3626         if ((rc = qeth_prepare_skb(card, &skb, &hdr, ipv))){
3627                 QETH_DBF_TEXT_(trace, 4, "1err%d", rc);
3628                 return rc;
3629         }
3630         qeth_fill_header(card, hdr, skb, ipv, cast_type);
3631         elements_needed = 1 + (((((unsigned long) hdr) % PAGE_SIZE) + skb->len)
3632                                 >> PAGE_SHIFT);
3633         if (elements_needed > QETH_MAX_BUFFER_ELEMENTS(card)){
3634                 PRINT_ERR("qeth_do_send_packet: invalid size of "
3635                                  "IP packet. Discarded.");
3636                 return -EINVAL;
3637         }
3638
3639         spin_lock(&queue->lock);
3640         start_index = queue->next_buf_to_fill;
3641         buffer = &queue->bufs[queue->next_buf_to_fill];
3642         BUG_ON(buffer->state == QETH_QDIO_BUF_PRIMED);
3643         if (queue->do_pack){
3644                 /* does packet fit in current buffer? */
3645                 if((QETH_MAX_BUFFER_ELEMENTS(card) - buffer->next_element_to_fill)
3646                                 < elements_needed){
3647                         /* ... no -> set state PRIMED */
3648                         buffer->state = QETH_QDIO_BUF_PRIMED;
3649                         flush_count++;
3650                         atomic_inc(&queue->used_buffers);
3651                         queue->next_buf_to_fill =
3652                                 (queue->next_buf_to_fill + 1) %
3653                                 QDIO_MAX_BUFFERS_PER_Q;
3654                         buffer = &queue->bufs[queue->next_buf_to_fill];
3655                 }
3656         }
3657
3658         rc = qeth_fill_buffer(queue, buffer, (char *)hdr, skb);
3659         if (rc) {
3660                 PRINT_WARN("qeth_do_send_packet: error during "
3661                               "qeth_fill_buffer.");
3662                 card->stats.tx_dropped++;
3663         } else if (buffer->state == QETH_QDIO_BUF_PRIMED){
3664                 /* next time fill the next buffer */
3665                 flush_count++;
3666                 atomic_inc(&queue->used_buffers);
3667                 queue->next_buf_to_fill = (queue->next_buf_to_fill + 1) %
3668                         QDIO_MAX_BUFFERS_PER_Q;
3669         }
3670         /* check if we need to switch packing state of this queue */
3671         if (card->info.type != QETH_CARD_TYPE_IQD)
3672                 flush_count += qeth_switch_packing_state(queue);
3673
3674         if (flush_count)
3675                 qeth_flush_buffers(queue, 0, start_index, flush_count);
3676
3677         if (!atomic_read(&queue->set_pci_flags_count))
3678                 qeth_flush_buffers_on_no_pci(queue, 0);
3679
3680         spin_unlock(&queue->lock);
3681
3682         return rc;
3683 }
3684
3685 static inline int
3686 qeth_send_packet(struct qeth_card *card, struct sk_buff *skb)
3687 {
3688         int ipv;
3689         int cast_type;
3690         struct qeth_qdio_out_q *queue;
3691         int rc;
3692
3693         QETH_DBF_TEXT(trace, 6, "sendpkt");
3694
3695         ipv = qeth_get_ip_version(skb);
3696         cast_type = qeth_get_cast_type(card, skb);
3697         queue = card->qdio.out_qs
3698                 [qeth_get_priority_queue(card, skb, ipv, cast_type)];
3699         /* do we have empty buffers? */
3700         rc = (atomic_read(&queue->used_buffers) >=
3701               QDIO_MAX_BUFFERS_PER_Q - 1) ? -EBUSY : 0;
3702         if (rc) {
3703                 card->stats.tx_dropped++;
3704                 QETH_DBF_TEXT_(trace, 4, "1err%d", rc);
3705                 return rc;
3706         }
3707
3708         rc = qeth_do_send_packet(card, skb, queue, ipv, cast_type);
3709
3710         if (!rc){
3711                 card->stats.tx_packets++;
3712                 card->stats.tx_bytes += skb->len;
3713 #ifdef CONFIG_QETH_PERF_STATS
3714                 card->perf_stats.outbound_time += qeth_get_micros() -
3715                         card->perf_stats.outbound_start_time;
3716 #endif
3717         }
3718         return rc;
3719 }
3720
3721 static int
3722 qeth_mdio_read(struct net_device *dev, int phy_id, int regnum)
3723 {
3724         struct qeth_card *card = (struct qeth_card *) dev->priv;
3725         int rc = 0;
3726
3727         switch(regnum){
3728         case MII_BMCR: /* Basic mode control register */
3729                 rc = BMCR_FULLDPLX;
3730                 if(card->info.link_type != QETH_LINK_TYPE_GBIT_ETH)
3731                         rc |= BMCR_SPEED100;
3732                 break;
3733         case MII_BMSR: /* Basic mode status register */
3734                 rc = BMSR_ERCAP | BMSR_ANEGCOMPLETE | BMSR_LSTATUS |
3735                      BMSR_10HALF | BMSR_10FULL | BMSR_100HALF | BMSR_100FULL |
3736                      BMSR_100BASE4;
3737                 break;
3738         case MII_PHYSID1: /* PHYS ID 1 */
3739                 rc = (dev->dev_addr[0] << 16) | (dev->dev_addr[1] << 8) |
3740                      dev->dev_addr[2];
3741                 rc = (rc >> 5) & 0xFFFF;
3742                 break;
3743         case MII_PHYSID2: /* PHYS ID 2 */
3744                 rc = (dev->dev_addr[2] << 10) & 0xFFFF;
3745                 break;
3746         case MII_ADVERTISE: /* Advertisement control reg */
3747                 rc = ADVERTISE_ALL;
3748                 break;
3749         case MII_LPA: /* Link partner ability reg */
3750                 rc = LPA_10HALF | LPA_10FULL | LPA_100HALF | LPA_100FULL |
3751                      LPA_100BASE4 | LPA_LPACK;
3752                 break;
3753         case MII_EXPANSION: /* Expansion register */
3754                 break;
3755         case MII_DCOUNTER: /* disconnect counter */
3756                 break;
3757         case MII_FCSCOUNTER: /* false carrier counter */
3758                 break;
3759         case MII_NWAYTEST: /* N-way auto-neg test register */
3760                 break;
3761         case MII_RERRCOUNTER: /* rx error counter */
3762                 rc = card->stats.rx_errors;
3763                 break;
3764         case MII_SREVISION: /* silicon revision */
3765                 break;
3766         case MII_RESV1: /* reserved 1 */
3767                 break;
3768         case MII_LBRERROR: /* loopback, rx, bypass error */
3769                 break;
3770         case MII_PHYADDR: /* physical address */
3771                 break;
3772         case MII_RESV2: /* reserved 2 */
3773                 break;
3774         case MII_TPISTATUS: /* TPI status for 10mbps */
3775                 break;
3776         case MII_NCONFIG: /* network interface config */
3777                 break;
3778         default:
3779                 rc = 0;
3780                 break;
3781         }
3782         return rc;
3783 }
3784
3785 static void
3786 qeth_mdio_write(struct net_device *dev, int phy_id, int regnum, int value)
3787 {
3788         switch(regnum){
3789         case MII_BMCR: /* Basic mode control register */
3790         case MII_BMSR: /* Basic mode status register */
3791         case MII_PHYSID1: /* PHYS ID 1 */
3792         case MII_PHYSID2: /* PHYS ID 2 */
3793         case MII_ADVERTISE: /* Advertisement control reg */
3794         case MII_LPA: /* Link partner ability reg */
3795         case MII_EXPANSION: /* Expansion register */
3796         case MII_DCOUNTER: /* disconnect counter */
3797         case MII_FCSCOUNTER: /* false carrier counter */
3798         case MII_NWAYTEST: /* N-way auto-neg test register */
3799         case MII_RERRCOUNTER: /* rx error counter */
3800         case MII_SREVISION: /* silicon revision */
3801         case MII_RESV1: /* reserved 1 */
3802         case MII_LBRERROR: /* loopback, rx, bypass error */
3803         case MII_PHYADDR: /* physical address */
3804         case MII_RESV2: /* reserved 2 */
3805         case MII_TPISTATUS: /* TPI status for 10mbps */
3806         case MII_NCONFIG: /* network interface config */
3807         default:
3808                 break;
3809         }
3810 }
3811
3812 static inline const char *
3813 qeth_arp_get_error_cause(int *rc)
3814 {
3815         switch (*rc) {
3816         case QETH_IPA_ARP_RC_FAILED:
3817                 *rc = -EIO;
3818                 return "operation failed";
3819         case QETH_IPA_ARP_RC_NOTSUPP:
3820                 *rc = -EOPNOTSUPP;
3821                 return "operation not supported";
3822         case QETH_IPA_ARP_RC_OUT_OF_RANGE:
3823                 *rc = -EINVAL;
3824                 return "argument out of range";
3825         case QETH_IPA_ARP_RC_Q_NOTSUPP:
3826                 *rc = -EOPNOTSUPP;
3827                 return "query operation not supported";
3828         case QETH_IPA_ARP_RC_Q_NO_DATA:
3829                 *rc = -ENOENT;
3830                 return "no query data available";
3831         default:
3832                 return "unknown error";
3833         }
3834 }
3835
3836 static int
3837 qeth_send_simple_setassparms(struct qeth_card *, enum qeth_ipa_funcs,
3838                              __u16, long);
3839
3840 static int
3841 qeth_arp_set_no_entries(struct qeth_card *card, int no_entries)
3842 {
3843         int tmp;
3844         int rc;
3845
3846         QETH_DBF_TEXT(trace,3,"arpstnoe");
3847
3848         /* TODO: really not supported by GuestLAN? */
3849         if (card->info.guestlan)
3850                 return -EOPNOTSUPP;
3851         if (!qeth_is_supported(card,IPA_ARP_PROCESSING)) {
3852                 PRINT_WARN("ARP processing not supported "
3853                            "on %s!\n", card->info.if_name);
3854                 return -EOPNOTSUPP;
3855         }
3856         rc = qeth_send_simple_setassparms(card, IPA_ARP_PROCESSING,
3857                                           IPA_CMD_ASS_ARP_SET_NO_ENTRIES,
3858                                           no_entries);
3859         if (rc) {
3860                 tmp = rc;
3861                 PRINT_WARN("Could not set number of ARP entries on %s: "
3862                            "%s (0x%x)\n",
3863                            card->info.if_name, qeth_arp_get_error_cause(&rc),
3864                            tmp);
3865         }
3866         return rc;
3867 }
3868
3869 static int
3870 qeth_arp_query_cb(struct qeth_card *card, struct qeth_reply *reply,
3871                   unsigned long data)
3872 {
3873         struct qeth_ipa_arp_cmd *cmd;
3874         struct qeth_arp_query_data *qdata;
3875         struct qeth_arp_query_info *qinfo;
3876         int entry_size;
3877         int i;
3878
3879         QETH_DBF_TEXT(trace,4,"arpquecb");
3880
3881         qinfo = (struct qeth_arp_query_info *) reply->param;
3882         cmd = (struct qeth_ipa_arp_cmd *) data;
3883         if (cmd->ihdr.return_code) {
3884                 QETH_DBF_TEXT_(trace,4,"qaer1%i", cmd->ihdr.return_code);
3885                 return 0;
3886         }
3887         if (cmd->shdr.return_code) {
3888                 cmd->ihdr.return_code = cmd->shdr.return_code;
3889                 QETH_DBF_TEXT_(trace,4,"qaer2%i", cmd->ihdr.return_code);
3890                 return 0;
3891         }
3892         qdata = &cmd->data.query_arp;
3893         switch(qdata->reply_bits){
3894         case 5:
3895                 entry_size = sizeof(struct qeth_arp_qi_entry5);
3896                 break;
3897         case 7:
3898                 entry_size = sizeof(struct qeth_arp_qi_entry7);
3899                 break;
3900         default:
3901                 /* tr is the same as eth -> entry7 */
3902                 entry_size = sizeof(struct qeth_arp_qi_entry7);
3903                 break;
3904         }
3905         /* check if there is enough room in userspace */
3906         if ((qinfo->udata_len - qinfo->udata_offset) <
3907                         qdata->no_entries * entry_size){
3908                 QETH_DBF_TEXT_(trace, 4, "qaer3%i", -ENOMEM);
3909                 cmd->ihdr.return_code = -ENOMEM;
3910                 goto out_error;
3911         }
3912         QETH_DBF_TEXT_(trace, 4, "anore%i", cmd->shdr.number_of_replies);
3913         QETH_DBF_TEXT_(trace, 4, "aseqn%i", cmd->shdr.seq_no);
3914         QETH_DBF_TEXT_(trace, 4, "anoen%i", qdata->no_entries);
3915         for (i = 0; i < qdata->no_entries; ++i){
3916                 memcpy(qinfo->udata + qinfo->udata_offset,
3917                        qdata->data + i*entry_size, entry_size);
3918                 qinfo->no_entries++;
3919                 qinfo->udata_offset += entry_size;
3920         }
3921         /* check if all replies received ... */
3922         if (cmd->shdr.seq_no < cmd->shdr.number_of_replies)
3923                 return 1;
3924         memcpy(qinfo->udata, &qinfo->no_entries, 4);
3925         memcpy(qinfo->udata + QETH_QARP_MASK_OFFSET,&qdata->reply_bits,2);
3926         return 0;
3927 out_error:
3928         i = 0;
3929         memcpy(qinfo->udata, &i, 4);
3930         return 0;
3931 }
3932
3933 static struct qeth_cmd_buffer *
3934 qeth_get_ipacmd_buffer(struct qeth_card *, enum qeth_ipa_cmds,
3935                        enum qeth_prot_versions);
3936
3937 struct qeth_cmd_buffer *
3938 qeth_get_ipa_arp_cmd_buffer(struct qeth_card *card, u16 cmd_code,
3939                             u32 data_len, enum qeth_prot_versions proto)
3940 {
3941         struct qeth_cmd_buffer *iob;
3942         struct qeth_ipa_arp_cmd *cmd;
3943         u16 s1, s2;
3944
3945         QETH_DBF_TEXT(trace,4,"getarpcm");
3946         iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SETASSPARMS, proto);
3947
3948         memcpy(iob->data, IPA_PDU_HEADER, IPA_PDU_HEADER_SIZE);
3949
3950         if ((IPA_PDU_HEADER_SIZE + QETH_ARP_CMD_BASE_LEN + data_len) > 256) {
3951                 /* adjust sizes in IPA_PDU_HEADER */
3952                 s1 = (u32) IPA_PDU_HEADER_SIZE + QETH_ARP_CMD_BASE_LEN +
3953                            data_len;
3954                 s2 = (u32) QETH_ARP_CMD_BASE_LEN + data_len;
3955                 memcpy(QETH_IPA_PDU_LEN_TOTAL(iob->data), &s1, 2);
3956                 memcpy(QETH_IPA_PDU_LEN_PDU1(iob->data), &s2, 2);
3957                 memcpy(QETH_IPA_PDU_LEN_PDU2(iob->data), &s2, 2);
3958                 memcpy(QETH_IPA_PDU_LEN_PDU3(iob->data), &s2, 2);
3959         }
3960
3961         cmd = (struct qeth_ipa_arp_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
3962         cmd->shdr.assist_no = IPA_ARP_PROCESSING;
3963         cmd->shdr.length = 8 + data_len;
3964         cmd->shdr.command_code = cmd_code;
3965         cmd->shdr.return_code = 0;
3966         cmd->shdr.seq_no = 0;
3967
3968         return iob;
3969 }
3970
3971 static int
3972 qeth_send_ipa_arp_cmd(struct qeth_card *card, struct qeth_cmd_buffer *iob,
3973                       char *data, int data_len,
3974                       int (*reply_cb)
3975                       (struct qeth_card *,struct qeth_reply*, unsigned long),
3976                       void *reply_param)
3977 {
3978         int rc;
3979
3980         QETH_DBF_TEXT(trace,4,"sendarp");
3981
3982         memcpy(QETH_IPA_ARP_DATA_POS(iob->data), data, data_len);
3983         memcpy(QETH_IPA_CMD_DEST_ADDR(iob->data),
3984                &card->token.ulp_connection_r, QETH_MPC_TOKEN_LENGTH);
3985
3986         rc = qeth_send_control_data(card, IPA_PDU_HEADER_SIZE +
3987                                     QETH_ARP_CMD_BASE_LEN + data_len, iob,
3988                                     reply_cb, reply_param);
3989         return rc;
3990 }
3991
3992 static int
3993 qeth_arp_query(struct qeth_card *card, char *udata)
3994 {
3995         struct qeth_cmd_buffer *iob;
3996         struct qeth_arp_query_data *qdata;
3997         struct qeth_arp_query_info qinfo = {0, };
3998         int tmp;
3999         int rc;
4000
4001         QETH_DBF_TEXT(trace,3,"arpquery");
4002
4003         /*
4004          * currently GuestLAN  does only deliver all zeros on query arp,
4005          * even though arp processing is supported (according to IPA supp.
4006          * funcs flags); since all zeros is no valueable information,
4007          * we say EOPNOTSUPP for all ARP functions
4008          */
4009         if (card->info.guestlan)
4010                 return -EOPNOTSUPP;
4011         if (!qeth_is_supported(card,IPA_ARP_PROCESSING)) {
4012                 PRINT_WARN("ARP processing not supported "
4013                            "on %s!\n", card->info.if_name);
4014                 return -EOPNOTSUPP;
4015         }
4016         /* get size of userspace mem area */
4017         if (copy_from_user(&qinfo.udata_len, udata, 4))
4018                 return -EFAULT;
4019         if (!(qinfo.udata = kmalloc(qinfo.udata_len, GFP_KERNEL)))
4020                 return -ENOMEM;
4021         memset(qinfo.udata, 0, qinfo.udata_len);
4022         qinfo.udata_offset = QETH_QARP_ENTRIES_OFFSET;
4023         /* alloc mem area for the actual query */
4024         if (!(qdata = kmalloc(sizeof(struct qeth_arp_query_data),
4025                               GFP_KERNEL))){
4026                 kfree(qinfo.udata);
4027                 return -ENOMEM;
4028         }
4029         memset(qdata, 0, sizeof(struct qeth_arp_query_data));
4030         /* do not give sizeof(struct qeth_arp_query_data) to next command;
4031          * this would cause the IPA PDU size to be set to a value of > 256
4032          * and this is to much for HiperSockets */
4033         iob = qeth_get_ipa_arp_cmd_buffer(card, IPA_CMD_ASS_ARP_QUERY_INFO,
4034                                           0, QETH_PROT_IPV4);
4035         rc = qeth_send_ipa_arp_cmd(card, iob,
4036                                    (char *) qdata,
4037                                    sizeof(struct qeth_arp_query_data),
4038                                    qeth_arp_query_cb,
4039                                    (void *)&qinfo);
4040         if (rc) {
4041                 tmp = rc;
4042                 PRINT_WARN("Error while querying ARP cache on %s: %s (0x%x)\n",
4043                            card->info.if_name, qeth_arp_get_error_cause(&rc),
4044                            tmp);
4045                 copy_to_user(udata, qinfo.udata, 4);
4046         } else {
4047                 copy_to_user(udata, qinfo.udata, qinfo.udata_len);
4048         }
4049         kfree(qinfo.udata);
4050         return rc;
4051 }
4052
4053 static int
4054 qeth_default_setassparms_cb(struct qeth_card *, struct qeth_reply *,
4055                             unsigned long);
4056
4057 static struct qeth_cmd_buffer *
4058 qeth_get_setassparms_cmd(struct qeth_card *, enum qeth_ipa_funcs,
4059                          __u16, __u16, enum qeth_prot_versions);
4060
4061 static int
4062 qeth_send_setassparms(struct qeth_card *, struct qeth_cmd_buffer *,
4063                       __u16, long,
4064                       int (*reply_cb)
4065                       (struct qeth_card *, struct qeth_reply *, unsigned long),
4066                       void *reply_param);
4067
4068 static int
4069 qeth_arp_add_entry(struct qeth_card *card, struct qeth_arp_cache_entry *entry)
4070 {
4071         struct qeth_cmd_buffer *iob;
4072         char buf[16];
4073         int tmp;
4074         int rc;
4075
4076         QETH_DBF_TEXT(trace,3,"arpadent");
4077
4078         /*
4079          * currently GuestLAN  does only deliver all zeros on query arp,
4080          * even though arp processing is supported (according to IPA supp.
4081          * funcs flags); since all zeros is no valueable information,
4082          * we say EOPNOTSUPP for all ARP functions
4083          */
4084         if (card->info.guestlan)
4085                 return -EOPNOTSUPP;
4086         if (!qeth_is_supported(card,IPA_ARP_PROCESSING)) {
4087                 PRINT_WARN("ARP processing not supported "
4088                            "on %s!\n", card->info.if_name);
4089                 return -EOPNOTSUPP;
4090         }
4091
4092         iob = qeth_get_setassparms_cmd(card, IPA_ARP_PROCESSING,
4093                                        IPA_CMD_ASS_ARP_ADD_ENTRY,
4094                                        sizeof(struct qeth_arp_cache_entry),
4095                                        QETH_PROT_IPV4);
4096         rc = qeth_send_setassparms(card, iob,
4097                                    sizeof(struct qeth_arp_cache_entry),
4098                                    (unsigned long) entry,
4099                                    qeth_default_setassparms_cb, NULL);
4100         if (rc) {
4101                 tmp = rc;
4102                 qeth_ipaddr4_to_string((u8 *)entry->ipaddr, buf);
4103                 PRINT_WARN("Could not add ARP entry for address %s on %s: "
4104                            "%s (0x%x)\n",
4105                            buf, card->info.if_name,
4106                            qeth_arp_get_error_cause(&rc), tmp);
4107         }
4108         return rc;
4109 }
4110
4111 static int
4112 qeth_arp_remove_entry(struct qeth_card *card, struct qeth_arp_cache_entry *entry)
4113 {
4114         struct qeth_cmd_buffer *iob;
4115         char buf[16] = {0, };
4116         int tmp;
4117         int rc;
4118
4119         QETH_DBF_TEXT(trace,3,"arprment");
4120
4121         /*
4122          * currently GuestLAN  does only deliver all zeros on query arp,
4123          * even though arp processing is supported (according to IPA supp.
4124          * funcs flags); since all zeros is no valueable information,
4125          * we say EOPNOTSUPP for all ARP functions
4126          */
4127         if (card->info.guestlan)
4128                 return -EOPNOTSUPP;
4129         if (!qeth_is_supported(card,IPA_ARP_PROCESSING)) {
4130                 PRINT_WARN("ARP processing not supported "
4131                            "on %s!\n", card->info.if_name);
4132                 return -EOPNOTSUPP;
4133         }
4134         memcpy(buf, entry, 12);
4135         iob = qeth_get_setassparms_cmd(card, IPA_ARP_PROCESSING,
4136                                        IPA_CMD_ASS_ARP_REMOVE_ENTRY,
4137                                        12,
4138                                        QETH_PROT_IPV4);
4139         rc = qeth_send_setassparms(card, iob,
4140                                    12, (unsigned long)buf,
4141                                    qeth_default_setassparms_cb, NULL);
4142         if (rc) {
4143                 tmp = rc;
4144                 memset(buf, 0, 16);
4145                 qeth_ipaddr4_to_string((u8 *)entry->ipaddr, buf);
4146                 PRINT_WARN("Could not delete ARP entry for address %s on %s: "
4147                            "%s (0x%x)\n",
4148                            buf, card->info.if_name,
4149                            qeth_arp_get_error_cause(&rc), tmp);
4150         }
4151         return rc;
4152 }
4153
4154 static int
4155 qeth_arp_flush_cache(struct qeth_card *card)
4156 {
4157         int rc;
4158         int tmp;
4159
4160         QETH_DBF_TEXT(trace,3,"arpflush");
4161
4162         /*
4163          * currently GuestLAN  does only deliver all zeros on query arp,
4164          * even though arp processing is supported (according to IPA supp.
4165          * funcs flags); since all zeros is no valueable information,
4166          * we say EOPNOTSUPP for all ARP functions
4167          */
4168         if (card->info.guestlan)
4169                 return -EOPNOTSUPP;
4170         if (!qeth_is_supported(card,IPA_ARP_PROCESSING)) {
4171                 PRINT_WARN("ARP processing not supported "
4172                            "on %s!\n", card->info.if_name);
4173                 return -EOPNOTSUPP;
4174         }
4175         rc = qeth_send_simple_setassparms(card, IPA_ARP_PROCESSING,
4176                                           IPA_CMD_ASS_ARP_FLUSH_CACHE, 0);
4177         if (rc){
4178                 tmp = rc;
4179                 PRINT_WARN("Could not flush ARP cache on %s: %s (0x%x)\n",
4180                            card->info.if_name, qeth_arp_get_error_cause(&rc),
4181                            tmp);
4182         }
4183         return rc;
4184 }
4185
4186 static int
4187 qeth_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
4188 {
4189         struct qeth_card *card = (struct qeth_card *)dev->priv;
4190         struct qeth_arp_cache_entry arp_entry;
4191         struct mii_ioctl_data *mii_data;
4192         int rc = 0;
4193
4194         if (!card)
4195                 return -ENODEV;
4196
4197         if (card->state != CARD_STATE_UP)
4198                 return -ENODEV;
4199
4200         switch (cmd){
4201         case SIOCDEVPRIVATE:
4202         case SIOC_QETH_ARP_SET_NO_ENTRIES:
4203                 if (!capable(CAP_NET_ADMIN)){
4204                         rc = -EPERM;
4205                         break;
4206                 }
4207                 rc = qeth_arp_set_no_entries(card, rq->ifr_ifru.ifru_ivalue);
4208                 break;
4209         case SIOCDEVPRIVATE+1:
4210         case SIOC_QETH_ARP_QUERY_INFO:
4211                 if (!capable(CAP_NET_ADMIN)){
4212                         rc = -EPERM;
4213                         break;
4214                 }
4215                 rc = qeth_arp_query(card, rq->ifr_ifru.ifru_data);
4216                 break;
4217         case SIOCDEVPRIVATE+2:
4218         case SIOC_QETH_ARP_ADD_ENTRY:
4219                 if (!capable(CAP_NET_ADMIN)){
4220                         rc = -EPERM;
4221                         break;
4222                 }
4223                 if (copy_from_user(&arp_entry, rq->ifr_ifru.ifru_data,
4224                                    sizeof(struct qeth_arp_cache_entry)))
4225                         rc = -EFAULT;
4226                 else
4227                         rc = qeth_arp_add_entry(card, &arp_entry);
4228                 break;
4229         case SIOCDEVPRIVATE+3:
4230         case SIOC_QETH_ARP_REMOVE_ENTRY:
4231                 if (!capable(CAP_NET_ADMIN)){
4232                         rc = -EPERM;
4233                         break;
4234                 }
4235                 if (copy_from_user(&arp_entry, rq->ifr_ifru.ifru_data,
4236                                    sizeof(struct qeth_arp_cache_entry)))
4237                         rc = -EFAULT;
4238                 else
4239                         rc = qeth_arp_remove_entry(card, &arp_entry);
4240                 break;
4241         case SIOCDEVPRIVATE+4:
4242         case SIOC_QETH_ARP_FLUSH_CACHE:
4243                 if (!capable(CAP_NET_ADMIN)){
4244                         rc = -EPERM;
4245                         break;
4246                 }
4247                 rc = qeth_arp_flush_cache(card);
4248                 break;
4249         case SIOCDEVPRIVATE+5:
4250         case SIOC_QETH_ADP_SET_SNMP_CONTROL:
4251                 break;
4252         case SIOCDEVPRIVATE+6:
4253         case SIOC_QETH_GET_CARD_TYPE:
4254                 break;
4255         case SIOCGMIIPHY:
4256                 mii_data = (struct mii_ioctl_data *) &rq->ifr_ifru.ifru_data;
4257                 mii_data->phy_id = 0;
4258                 break;
4259         case SIOCGMIIREG:
4260                 mii_data = (struct mii_ioctl_data *) &rq->ifr_ifru.ifru_data;
4261                 if (mii_data->phy_id != 0)
4262                         rc = -EINVAL;
4263                 else
4264                         mii_data->val_out = qeth_mdio_read(dev,mii_data->phy_id,
4265                                                            mii_data->reg_num);
4266                 break;
4267         case SIOCSMIIREG:
4268                 rc = -EOPNOTSUPP;
4269                 break;
4270                 /* TODO: remove return if qeth_mdio_write does something */
4271                 if (!capable(CAP_NET_ADMIN)){
4272                         rc = -EPERM;
4273                         break;
4274                 }
4275                 mii_data = (struct mii_ioctl_data *) &rq->ifr_ifru.ifru_data;
4276                 if (mii_data->phy_id != 0)
4277                         rc = -EINVAL;
4278                 else
4279                         qeth_mdio_write(dev, mii_data->phy_id, mii_data->reg_num,
4280                                         mii_data->val_in);
4281                 break;
4282         default:
4283                 rc = -EOPNOTSUPP;
4284         }
4285         return rc;
4286 }
4287
4288 static struct net_device_stats *
4289 qeth_get_stats(struct net_device *dev)
4290 {
4291         struct qeth_card *card;
4292
4293         card = (struct qeth_card *) (dev->priv);
4294
4295         QETH_DBF_TEXT(trace,5,"getstat");
4296
4297         return &card->stats;
4298 }
4299
4300 static int
4301 qeth_change_mtu(struct net_device *dev, int new_mtu)
4302 {
4303         struct qeth_card *card;
4304         char dbf_text[15];
4305
4306         card = (struct qeth_card *) (dev->priv);
4307
4308         QETH_DBF_TEXT(trace,4,"chgmtu");
4309         sprintf(dbf_text, "%8x", new_mtu);
4310         QETH_DBF_TEXT(trace,4,dbf_text);
4311
4312         if (new_mtu < 64)
4313                 return -EINVAL;
4314         if (new_mtu > 65535)
4315                 return -EINVAL;
4316         if ((!qeth_is_supported(card,IPA_IP_FRAGMENTATION)) &&
4317             (!qeth_mtu_is_valid(card, new_mtu)))
4318                 return -EINVAL;
4319         dev->mtu = new_mtu;
4320         return 0;
4321 }
4322
4323 #ifdef CONFIG_QETH_VLAN
4324 static void
4325 qeth_vlan_rx_register(struct net_device *dev, struct vlan_group *grp)
4326 {
4327         struct qeth_card *card;
4328
4329         QETH_DBF_TEXT(trace,4,"vlanreg");
4330
4331         card = (struct qeth_card *) dev->priv;
4332         spin_lock_irq(&card->vlanlock);
4333         card->vlangrp = grp;
4334         spin_unlock_irq(&card->vlanlock);
4335 }
4336
4337 static void
4338 qeth_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
4339 {
4340         struct qeth_card *card;
4341
4342         QETH_DBF_TEXT(trace,4,"vlkilvid");
4343
4344         card = (struct qeth_card *) dev->priv;
4345         spin_lock_irq(&card->vlanlock);
4346         if (card->vlangrp)
4347                 card->vlangrp->vlan_devices[vid] = NULL;
4348         spin_unlock_irq(&card->vlanlock);
4349         /* delete mc addresses for this vlan dev */
4350         qeth_set_thread_start_bit(card, QETH_SET_MC_THREAD);
4351         schedule_work(&card->kernel_thread_starter);
4352 }
4353 #endif
4354
4355 static int
4356 qeth_neigh_setup(struct net_device *dev, struct neigh_parms *np)
4357 {
4358         return 0;
4359 }
4360
4361 #ifdef CONFIG_QETH_IPV6
4362 int
4363 qeth_ipv6_generate_eui64(u8 * eui, struct net_device *dev)
4364 {
4365         switch (dev->type) {
4366         case ARPHRD_ETHER:
4367         case ARPHRD_FDDI:
4368         case ARPHRD_IEEE802_TR:
4369                 if (dev->addr_len != ETH_ALEN)
4370                         return -1;
4371                 memcpy(eui, dev->dev_addr, 3);
4372                 memcpy(eui + 5, dev->dev_addr + 3, 3);
4373                 eui[3] = (dev->dev_id >> 8) & 0xff;
4374                 eui[4] = dev->dev_id & 0xff;
4375                 return 0;
4376         }
4377         return -1;
4378
4379 }
4380 #endif
4381
4382 static void
4383 qeth_get_mac_for_ipm(__u32 ipm, char *mac, struct net_device *dev)
4384 {
4385         if (dev->type == ARPHRD_IEEE802_TR)
4386                 ip_tr_mc_map(ipm, mac);
4387         else
4388                 ip_eth_mc_map(ipm, mac);
4389 }
4390
4391 static struct qeth_ipaddr *
4392 qeth_get_addr_buffer(enum qeth_prot_versions prot)
4393 {
4394         struct qeth_ipaddr *addr;
4395
4396         addr = kmalloc(sizeof(struct qeth_ipaddr), GFP_ATOMIC);
4397         if (addr == NULL) {
4398                 PRINT_WARN("Not enough memory to add address\n");
4399                 return NULL;
4400         }
4401         memset(addr,0,sizeof(struct qeth_ipaddr));
4402         addr->type = QETH_IP_TYPE_NORMAL;
4403         addr->proto = prot;
4404         addr->is_multicast = 0;
4405         addr->users = 0;
4406         addr->set_flags = 0;
4407         addr->del_flags = 0;
4408         return addr;
4409 }
4410
4411 static void
4412 qeth_delete_mc_addresses(struct qeth_card *card)
4413 {
4414         struct qeth_ipaddr *ipm, *iptodo;
4415         unsigned long flags;
4416
4417         QETH_DBF_TEXT(trace,4,"delmc");
4418         spin_lock_irqsave(&card->ip_lock, flags);
4419         list_for_each_entry(ipm, &card->ip_list, entry){
4420                 if (!ipm->is_multicast)
4421                         continue;
4422                 iptodo = qeth_get_addr_buffer(ipm->proto);
4423                 if (!iptodo) {
4424                         QETH_DBF_TEXT(trace, 2, "dmcnomem");
4425                         continue;
4426                 }
4427                 memcpy(iptodo, ipm, sizeof(struct qeth_ipaddr));
4428                 iptodo->users = iptodo->users * -1;
4429                 if (!__qeth_insert_ip_todo(card, iptodo, 0))
4430                         kfree(iptodo);
4431         }
4432         spin_unlock_irqrestore(&card->ip_lock, flags);
4433 }
4434
4435 static inline void
4436 qeth_add_mc(struct qeth_card *card, struct in_device *in4_dev)
4437 {
4438         struct qeth_ipaddr *ipm;
4439         struct ip_mc_list *im4;
4440         char buf[MAX_ADDR_LEN];
4441
4442         QETH_DBF_TEXT(trace,4,"addmc");
4443         for (im4 = in4_dev->mc_list; im4; im4 = im4->next) {
4444                 qeth_get_mac_for_ipm(im4->multiaddr, buf, in4_dev->dev);
4445                 ipm = qeth_get_addr_buffer(QETH_PROT_IPV4);
4446                 if (!ipm)
4447                         continue;
4448                 ipm->u.a4.addr = im4->multiaddr;
4449                 memcpy(ipm->mac,buf,OSA_ADDR_LEN);
4450                 ipm->is_multicast = 1;
4451                 if (!qeth_add_ip(card,ipm))
4452                         kfree(ipm);
4453         }
4454 }
4455
4456 static inline void
4457 qeth_add_vlan_mc(struct qeth_card *card)
4458 {
4459 #ifdef CONFIG_QETH_VLAN
4460         struct in_device *in_dev;
4461         struct vlan_group *vg;
4462         int i;
4463
4464         QETH_DBF_TEXT(trace,4,"addmcvl");
4465         if (!qeth_is_supported(card,IPA_FULL_VLAN) ||
4466             (card->vlangrp == NULL))
4467                 return ;
4468
4469         vg = card->vlangrp;
4470         for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++) {
4471                 if (vg->vlan_devices[i] == NULL ||
4472                     !(vg->vlan_devices[i]->flags & IFF_UP))
4473                         continue;
4474                 in_dev = in_dev_get(vg->vlan_devices[i]);
4475                 if (!in_dev)
4476                         continue;
4477                 read_lock(&in_dev->lock);
4478                 qeth_add_mc(card,in_dev);
4479                 read_unlock(&in_dev->lock);
4480                 in_dev_put(in_dev);
4481         }
4482 #endif
4483 }
4484
4485 static void
4486 qeth_add_multicast_ipv4(struct qeth_card *card)
4487 {
4488         struct in_device *in4_dev;
4489
4490         QETH_DBF_TEXT(trace,4,"chkmcv4");
4491         in4_dev = in_dev_get(card->dev);
4492         if (in4_dev == NULL)
4493                 return;
4494         read_lock(&in4_dev->lock);
4495         qeth_add_mc(card, in4_dev);
4496         qeth_add_vlan_mc(card);
4497         read_unlock(&in4_dev->lock);
4498         in_dev_put(in4_dev);
4499 }
4500
4501 #ifdef CONFIG_QETH_IPV6
4502 static inline void
4503 qeth_add_mc6(struct qeth_card *card, struct inet6_dev *in6_dev)
4504 {
4505         struct qeth_ipaddr *ipm;
4506         struct ifmcaddr6 *im6;
4507         char buf[MAX_ADDR_LEN];
4508
4509         QETH_DBF_TEXT(trace,4,"addmc6");
4510         for (im6 = in6_dev->mc_list; im6 != NULL; im6 = im6->next) {
4511                 ndisc_mc_map(&im6->mca_addr, buf, in6_dev->dev, 0);
4512                 ipm = qeth_get_addr_buffer(QETH_PROT_IPV6);
4513                 if (!ipm)
4514                         continue;
4515                 ipm->is_multicast = 1;
4516                 memcpy(ipm->mac,buf,OSA_ADDR_LEN);
4517                 memcpy(&ipm->u.a6.addr,&im6->mca_addr.s6_addr,
4518                        sizeof(struct in6_addr));
4519                 if (!qeth_add_ip(card,ipm))
4520                         kfree(ipm);
4521         }
4522 }
4523
4524 static inline void
4525 qeth_add_vlan_mc6(struct qeth_card *card)
4526 {
4527 #ifdef CONFIG_QETH_VLAN
4528         struct inet6_dev *in_dev;
4529         struct vlan_group *vg;
4530         int i;
4531
4532         QETH_DBF_TEXT(trace,4,"admc6vl");
4533         if (!qeth_is_supported(card,IPA_FULL_VLAN) ||
4534             (card->vlangrp == NULL))
4535                 return ;
4536
4537         vg = card->vlangrp;
4538         for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++) {
4539                 if (vg->vlan_devices[i] == NULL ||
4540                     !(vg->vlan_devices[i]->flags & IFF_UP))
4541                         continue;
4542                 in_dev = in6_dev_get(vg->vlan_devices[i]);
4543                 if (!in_dev)
4544                         continue;
4545                 read_lock(&in_dev->lock);
4546                 qeth_add_mc6(card,in_dev);
4547                 read_unlock(&in_dev->lock);
4548                 in6_dev_put(in_dev);
4549         }
4550 #endif /* CONFIG_QETH_VLAN */
4551 }
4552
4553 static void
4554 qeth_add_multicast_ipv6(struct qeth_card *card)
4555 {
4556         struct inet6_dev *in6_dev;
4557
4558         QETH_DBF_TEXT(trace,4,"chkmcv6");
4559         if (!qeth_is_supported(card, IPA_IPV6))
4560                 return ;
4561
4562         in6_dev = in6_dev_get(card->dev);
4563         if (in6_dev == NULL)
4564                 return;
4565         read_lock(&in6_dev->lock);
4566         qeth_add_mc6(card, in6_dev);
4567         qeth_add_vlan_mc6(card);
4568         read_unlock(&in6_dev->lock);
4569         in6_dev_put(in6_dev);
4570 }
4571 #endif /* CONFIG_QETH_IPV6 */
4572
4573 /**
4574  * set multicast address on card
4575  */
4576 static void
4577 qeth_set_multicast_list(struct net_device *dev)
4578 {
4579         struct qeth_card *card;
4580
4581         QETH_DBF_TEXT(trace,3,"setmulti");
4582         card = (struct qeth_card *) dev->priv;
4583
4584         qeth_set_thread_start_bit(card, QETH_SET_MC_THREAD);
4585         schedule_work(&card->kernel_thread_starter);
4586 }
4587
4588 static void
4589 qeth_fill_ipacmd_header(struct qeth_card *card, struct qeth_ipa_cmd *cmd,
4590                         __u8 command, enum qeth_prot_versions prot)
4591 {
4592         memset(cmd, 0, sizeof (struct qeth_ipa_cmd));
4593         cmd->hdr.command = command;
4594         cmd->hdr.initiator = IPA_CMD_INITIATOR_HOST;
4595         cmd->hdr.seqno = card->seqno.ipa;
4596         cmd->hdr.adapter_type = qeth_get_ipa_adp_type(card->info.link_type);
4597         cmd->hdr.rel_adapter_no = (__u8) card->info.portno;
4598         cmd->hdr.prim_version_no = 1;
4599         cmd->hdr.param_count = 1;
4600         cmd->hdr.prot_version = prot;
4601         cmd->hdr.ipa_supported = 0;
4602         cmd->hdr.ipa_enabled = 0;
4603 }
4604
4605 static struct qeth_cmd_buffer *
4606 qeth_get_ipacmd_buffer(struct qeth_card *card, enum qeth_ipa_cmds ipacmd,
4607                        enum qeth_prot_versions prot)
4608 {
4609         struct qeth_cmd_buffer *iob;
4610         struct qeth_ipa_cmd *cmd;
4611
4612         iob = qeth_wait_for_buffer(&card->write);
4613         cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
4614         qeth_fill_ipacmd_header(card, cmd, ipacmd, prot);
4615
4616         return iob;
4617 }
4618
4619 static int
4620 qeth_send_setdelmc(struct qeth_card *card, struct qeth_ipaddr *addr, int ipacmd)
4621 {
4622         int rc;
4623         struct qeth_cmd_buffer *iob;
4624         struct qeth_ipa_cmd *cmd;
4625
4626         QETH_DBF_TEXT(trace,4,"setdelmc");
4627
4628         iob = qeth_get_ipacmd_buffer(card, ipacmd, addr->proto);
4629         cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
4630         memcpy(&cmd->data.setdelipm.mac,addr->mac, OSA_ADDR_LEN);
4631         if (addr->proto == QETH_PROT_IPV6)
4632                 memcpy(cmd->data.setdelipm.ip6, &addr->u.a6.addr,
4633                        sizeof(struct in6_addr));
4634         else
4635                 memcpy(&cmd->data.setdelipm.ip4, &addr->u.a4.addr,4);
4636
4637         rc = qeth_send_ipa_cmd(card, iob, NULL, NULL);
4638
4639         return rc;
4640 }
4641 static inline void
4642 qeth_fill_netmask(u8 *netmask, unsigned int len)
4643 {
4644         int i,j;
4645         for (i=0;i<16;i++) {
4646                 j=(len)-(i*8);
4647                 if (j >= 8)
4648                         netmask[i] = 0xff;
4649                 else if (j > 0)
4650                         netmask[i] = (u8)(0xFF00>>j);
4651                 else
4652                         netmask[i] = 0;
4653         }
4654 }
4655
4656 static int
4657 qeth_send_setdelip(struct qeth_card *card, struct qeth_ipaddr *addr,
4658                    int ipacmd, unsigned int flags)
4659 {
4660         int rc;
4661         struct qeth_cmd_buffer *iob;
4662         struct qeth_ipa_cmd *cmd;
4663         __u8 netmask[16];
4664
4665         QETH_DBF_TEXT(trace,4,"setdelip");
4666         QETH_DBF_TEXT_(trace,4,"flags%02X", flags);
4667
4668         iob = qeth_get_ipacmd_buffer(card, ipacmd, addr->proto);
4669         cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
4670         if (addr->proto == QETH_PROT_IPV6) {
4671                 memcpy(cmd->data.setdelip6.ip_addr, &addr->u.a6.addr,
4672                        sizeof(struct in6_addr));
4673                 qeth_fill_netmask(netmask,addr->u.a6.pfxlen);
4674                 memcpy(cmd->data.setdelip6.mask, netmask,
4675                        sizeof(struct in6_addr));
4676                 cmd->data.setdelip6.flags = flags;
4677         } else {
4678                 memcpy(cmd->data.setdelip4.ip_addr, &addr->u.a4.addr, 4);
4679                 memcpy(cmd->data.setdelip4.mask, &addr->u.a4.mask, 4);
4680                 cmd->data.setdelip4.flags = flags;
4681         }
4682
4683         rc = qeth_send_ipa_cmd(card, iob, NULL, NULL);
4684
4685         return rc;
4686 }
4687
4688 static int
4689 qeth_register_addr_entry(struct qeth_card *card, struct qeth_ipaddr *addr)
4690 {
4691         //char buf[50];
4692         int rc;
4693         int cnt = 3;
4694
4695         if (addr->proto == QETH_PROT_IPV4) {
4696                 QETH_DBF_TEXT(trace, 2,"setaddr4");
4697                 QETH_DBF_HEX(trace, 3, &addr->u.a4.addr, sizeof(int));
4698         } else if (addr->proto == QETH_PROT_IPV6) {
4699                 QETH_DBF_TEXT(trace, 2, "setaddr6");
4700                 QETH_DBF_HEX(trace,3,&addr->u.a6.addr,8);
4701                 QETH_DBF_HEX(trace,3,((char *)&addr->u.a6.addr)+8,8);
4702         } else {
4703                 QETH_DBF_TEXT(trace, 2, "setaddr?");
4704                 QETH_DBF_HEX(trace, 3, addr, sizeof(struct qeth_ipaddr));
4705         }
4706         do {
4707                 if (addr->is_multicast)
4708                         rc =  qeth_send_setdelmc(card, addr, IPA_CMD_SETIPM);
4709                 else
4710                         rc = qeth_send_setdelip(card, addr, IPA_CMD_SETIP,
4711                                         addr->set_flags);
4712                 if (rc)
4713                         QETH_DBF_TEXT(trace, 2, "failed");
4714         } while ((--cnt > 0) && rc);
4715         if (rc){
4716                 QETH_DBF_TEXT(trace, 2, "FAILED");
4717                 /* TODO: re-activate this warning as soon as we have a
4718                  * clean mirco code
4719                 qeth_ipaddr_to_string(addr->proto, (u8 *)&addr->u, buf);
4720                 PRINT_WARN("Could not register IP address %s (rc=%x)\n",
4721                            buf, rc);
4722                 */
4723         }
4724         return rc;
4725 }
4726
4727 static int
4728 qeth_deregister_addr_entry(struct qeth_card *card, struct qeth_ipaddr *addr)
4729 {
4730         //char buf[50];
4731         int rc;
4732
4733         if (addr->proto == QETH_PROT_IPV4) {
4734                 QETH_DBF_TEXT(trace, 2,"deladdr4");
4735                 QETH_DBF_HEX(trace, 3, &addr->u.a4.addr, sizeof(int));
4736         } else if (addr->proto == QETH_PROT_IPV6) {
4737                 QETH_DBF_TEXT(trace, 2, "deladdr6");
4738                 QETH_DBF_HEX(trace,3,&addr->u.a6.addr,8);
4739                 QETH_DBF_HEX(trace,3,((char *)&addr->u.a6.addr)+8,8);
4740         } else {
4741                 QETH_DBF_TEXT(trace, 2, "deladdr?");
4742                 QETH_DBF_HEX(trace, 3, addr, sizeof(struct qeth_ipaddr));
4743         }
4744         if (addr->is_multicast)
4745                 rc = qeth_send_setdelmc(card, addr, IPA_CMD_DELIPM);
4746         else
4747                 rc = qeth_send_setdelip(card, addr, IPA_CMD_DELIP,
4748                                         addr->del_flags);
4749         if (rc) {
4750                 QETH_DBF_TEXT(trace, 2, "failed");
4751                 /* TODO: re-activate this warning as soon as we have a
4752                  * clean mirco code
4753                 qeth_ipaddr_to_string(addr->proto, (u8 *)&addr->u, buf);
4754                 PRINT_WARN("Could not deregister IP address %s (rc=%x)\n",
4755                            buf, rc);
4756                 */
4757         }
4758         return rc;
4759 }
4760
4761 static int
4762 qeth_netdev_init(struct net_device *dev)
4763 {
4764         struct qeth_card *card;
4765
4766         card = (struct qeth_card *) dev->priv;
4767
4768         QETH_DBF_TEXT(trace,3,"initdev");
4769
4770         dev->tx_timeout = &qeth_tx_timeout;
4771         dev->watchdog_timeo = QETH_TX_TIMEOUT;
4772         dev->open = qeth_open;
4773         dev->stop = qeth_stop;
4774         dev->hard_start_xmit = qeth_hard_start_xmit;
4775         dev->do_ioctl = qeth_do_ioctl;
4776         dev->get_stats = qeth_get_stats;
4777         dev->change_mtu = qeth_change_mtu;
4778         dev->neigh_setup = qeth_neigh_setup;
4779         dev->set_multicast_list = qeth_set_multicast_list;
4780 #ifdef CONFIG_QETH_VLAN
4781         dev->vlan_rx_register = qeth_vlan_rx_register;
4782         dev->vlan_rx_kill_vid = qeth_vlan_rx_kill_vid;
4783 #endif
4784         if (qeth_get_netdev_flags(card->info.type) & IFF_NOARP) {
4785                 dev->rebuild_header = NULL;
4786                 dev->hard_header = NULL;
4787                 dev->header_cache_update = NULL;
4788                 dev->hard_header_cache = NULL;
4789         }
4790 #ifdef CONFIG_QETH_IPV6
4791         /*IPv6 address autoconfiguration stuff*/
4792         card->dev->dev_id = card->info.unique_id & 0xffff;
4793         if (!(card->info.unique_id & UNIQUE_ID_NOT_BY_CARD))
4794                 card->dev->generate_eui64 = qeth_ipv6_generate_eui64;
4795
4796
4797 #endif
4798         dev->hard_header_parse = NULL;
4799         dev->set_mac_address = NULL;
4800         dev->flags |= qeth_get_netdev_flags(card->info.type);
4801         if ((card->options.fake_broadcast) ||
4802             (card->info.broadcast_capable))
4803                 dev->flags |= IFF_BROADCAST;
4804
4805         dev->hard_header_len =
4806                 qeth_get_hlen(card->info.link_type) + card->options.add_hhlen;
4807         dev->addr_len = OSA_ADDR_LEN;
4808         dev->mtu = card->info.initial_mtu;
4809
4810         SET_MODULE_OWNER(dev);
4811         return 0;
4812 }
4813
4814 /**
4815  * hardsetup card, initialize MPC and QDIO stuff
4816  */
4817 static int
4818 qeth_hardsetup_card(struct qeth_card *card)
4819 {
4820         int retries = 3;
4821         int rc;
4822
4823         QETH_DBF_TEXT(setup, 2, "hrdsetup");
4824
4825 retry:
4826         if (retries < 3){
4827                 PRINT_WARN("Retrying to do IDX activates.\n");
4828                 ccw_device_set_offline(CARD_DDEV(card));
4829                 ccw_device_set_offline(CARD_WDEV(card));
4830                 ccw_device_set_offline(CARD_RDEV(card));
4831                 ccw_device_set_online(CARD_RDEV(card));
4832                 ccw_device_set_online(CARD_WDEV(card));
4833                 ccw_device_set_online(CARD_DDEV(card));
4834         }
4835         rc = qeth_qdio_clear_card(card,card->info.type==QETH_CARD_TYPE_OSAE);
4836         if (rc == -ERESTARTSYS) {
4837                 QETH_DBF_TEXT(setup, 2, "break1");
4838                 return rc;
4839         } else if (rc) {
4840                 QETH_DBF_TEXT_(setup, 2, "1err%d", rc);
4841                 if (--retries < 0)
4842                         goto out;
4843                 else
4844                         goto retry;
4845         }
4846         if ((rc = qeth_get_unitaddr(card))){
4847                 QETH_DBF_TEXT_(setup, 2, "2err%d", rc);
4848                 return rc;
4849         }
4850         qeth_init_tokens(card);
4851         rc = qeth_idx_activate_channel(&card->read, qeth_idx_read_cb);
4852         if (rc == -ERESTARTSYS) {
4853                 QETH_DBF_TEXT(setup, 2, "break2");
4854                 return rc;
4855         } else if (rc) {
4856                 QETH_DBF_TEXT_(setup, 2, "3err%d", rc);
4857                 if (--retries < 0)
4858                         goto out;
4859                 else
4860                         goto retry;
4861         }
4862         rc = qeth_idx_activate_channel(&card->write, qeth_idx_write_cb);
4863         if (rc == -ERESTARTSYS) {
4864                 QETH_DBF_TEXT(setup, 2, "break3");
4865                 return rc;
4866         } else if (rc) {
4867                 QETH_DBF_TEXT_(setup, 2, "4err%d", rc);
4868                 if (--retries < 0)
4869                         goto out;
4870                 else
4871                         goto retry;
4872         }
4873         if ((rc = qeth_mpc_initialize(card))){
4874                 QETH_DBF_TEXT_(setup, 2, "5err%d", rc);
4875                 goto out;
4876         }
4877         /* at first set_online allocate netdev */
4878         if (!card->dev){
4879                 card->dev = qeth_get_netdevice(card->info.type,
4880                                                card->info.link_type);
4881                 if (!card->dev){
4882                         qeth_qdio_clear_card(card, card->info.type ==
4883                                              QETH_CARD_TYPE_OSAE);
4884                         rc = -ENODEV;
4885                         QETH_DBF_TEXT_(setup, 2, "6err%d", rc);
4886                         goto out;
4887                 }
4888                 qeth_set_device_name(card);
4889                 card->dev->priv = card;
4890                 card->dev->type = qeth_get_arphdr_type(card->info.type,
4891                                                        card->info.link_type);
4892                 card->dev->init = qeth_netdev_init;
4893         }
4894         return 0;
4895 out:
4896         PRINT_ERR("Initialization in hardsetup failed! rc=%d\n", rc);
4897         return rc;
4898 }
4899
4900 static struct qeth_cmd_buffer *
4901 qeth_get_adapter_cmd(struct qeth_card *card, __u32 command)
4902 {
4903         struct qeth_cmd_buffer *iob;
4904         struct qeth_ipa_cmd *cmd;
4905
4906         iob = qeth_get_ipacmd_buffer(card,IPA_CMD_SETADAPTERPARMS,
4907                                      QETH_PROT_IPV4);
4908         cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
4909         cmd->data.setadapterparms.cmdlength =
4910                                 sizeof(struct qeth_ipacmd_setadpparms);
4911         cmd->data.setadapterparms.command_code = command;
4912         cmd->data.setadapterparms.frames_used_total = 1;
4913         cmd->data.setadapterparms.frame_seq_no = 1;
4914
4915         return iob;
4916 }
4917
4918 static int
4919 qeth_default_setassparms_cb(struct qeth_card *card, struct qeth_reply *reply,
4920                             unsigned long data)
4921 {
4922         struct qeth_ipa_cmd *cmd;
4923
4924         QETH_DBF_TEXT(trace,4,"defadpcb");
4925
4926         cmd = (struct qeth_ipa_cmd *) data;
4927         if (cmd->hdr.return_code == 0){
4928                 cmd->hdr.return_code = cmd->data.setassparms.hdr.return_code;
4929                 if (cmd->hdr.prot_version == QETH_PROT_IPV4)
4930                         card->options.ipa4.enabled_funcs = cmd->hdr.ipa_enabled;
4931 #ifdef CONFIG_QETH_IPV6
4932                 if (cmd->hdr.prot_version == QETH_PROT_IPV6)
4933                         card->options.ipa6.enabled_funcs = cmd->hdr.ipa_enabled;
4934 #endif
4935         }
4936         if (cmd->data.setassparms.hdr.assist_no == IPA_INBOUND_CHECKSUM &&
4937             cmd->data.setassparms.hdr.command_code == IPA_CMD_ASS_START) {
4938                 card->info.csum_mask = cmd->data.setassparms.data.flags_32bit;
4939                 QETH_DBF_TEXT_(trace, 3, "csum:%d", card->info.csum_mask);
4940         }
4941         return 0;
4942 }
4943
4944 static int
4945 qeth_default_setadapterparms_cb(struct qeth_card *card,
4946                                 struct qeth_reply *reply,
4947                                 unsigned long data)
4948 {
4949         struct qeth_ipa_cmd *cmd;
4950
4951         QETH_DBF_TEXT(trace,4,"defadpcb");
4952
4953         cmd = (struct qeth_ipa_cmd *) data;
4954         if (cmd->hdr.return_code == 0)
4955                 cmd->hdr.return_code = cmd->data.setadapterparms.return_code;
4956         return 0;
4957 }
4958
4959 static int
4960 qeth_query_setadapterparms_cb(struct qeth_card *card, struct qeth_reply *reply,
4961                               unsigned long data)
4962 {
4963         struct qeth_ipa_cmd *cmd;
4964
4965         QETH_DBF_TEXT(trace,3,"quyadpcb");
4966
4967         cmd = (struct qeth_ipa_cmd *) data;
4968         if (cmd->data.setadapterparms.data.query_cmds_supp.lan_type & 0x7f)
4969                 card->info.link_type =
4970                       cmd->data.setadapterparms.data.query_cmds_supp.lan_type;
4971         card->options.adp.supported_funcs =
4972                 cmd->data.setadapterparms.data.query_cmds_supp.supported_cmds;
4973         return qeth_default_setadapterparms_cb(card, reply, (unsigned long)cmd);
4974 }
4975
4976 static int
4977 qeth_query_setadapterparms(struct qeth_card *card)
4978 {
4979         int rc;
4980         struct qeth_cmd_buffer *iob;
4981
4982         QETH_DBF_TEXT(trace,3,"queryadp");
4983         iob = qeth_get_adapter_cmd(card,IPA_SETADP_QUERY_COMMANDS_SUPPORTED);
4984         rc = qeth_send_ipa_cmd(card, iob, qeth_query_setadapterparms_cb, NULL);
4985         return rc;
4986 }
4987
4988 static int
4989 qeth_setadpparms_change_macaddr_cb(struct qeth_card *card,
4990                                    struct qeth_reply *reply,
4991                                    unsigned long data)
4992 {
4993         struct qeth_ipa_cmd *cmd;
4994
4995         QETH_DBF_TEXT(trace,4,"chgmaccb");
4996
4997         cmd = (struct qeth_ipa_cmd *) data;
4998         memcpy(card->dev->dev_addr,
4999                &cmd->data.setadapterparms.data.change_addr.addr,OSA_ADDR_LEN);
5000         qeth_default_setadapterparms_cb(card, reply, (unsigned long) cmd);
5001         return 0;
5002 }
5003
5004 static int
5005 qeth_setadpparms_change_macaddr(struct qeth_card *card)
5006 {
5007         int rc;
5008         struct qeth_cmd_buffer *iob;
5009         struct qeth_ipa_cmd *cmd;
5010
5011         QETH_DBF_TEXT(trace,4,"chgmac");
5012
5013         iob = qeth_get_adapter_cmd(card,IPA_SETADP_ALTER_MAC_ADDRESS);
5014         cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
5015         cmd->data.setadapterparms.data.change_addr.cmd = CHANGE_ADDR_READ_MAC;
5016         cmd->data.setadapterparms.data.change_addr.addr_size = OSA_ADDR_LEN;
5017         memcpy(&cmd->data.setadapterparms.data.change_addr.addr,
5018                card->dev->dev_addr, OSA_ADDR_LEN);
5019         rc = qeth_send_ipa_cmd(card, iob, qeth_setadpparms_change_macaddr_cb,
5020                                NULL);
5021         return rc;
5022 }
5023
5024 static int
5025 qeth_send_setadp_mode(struct qeth_card *card, __u32 command, __u32 mode)
5026 {
5027         int rc;
5028         struct qeth_cmd_buffer *iob;
5029         struct qeth_ipa_cmd *cmd;
5030
5031         QETH_DBF_TEXT(trace,4,"adpmode");
5032
5033         iob = qeth_get_adapter_cmd(card, command);
5034         cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
5035         cmd->data.setadapterparms.data.mode = mode;
5036         rc = qeth_send_ipa_cmd(card, iob, qeth_default_setadapterparms_cb,
5037                                NULL);
5038         return rc;
5039 }
5040
5041 static inline int
5042 qeth_setadapter_hstr(struct qeth_card *card)
5043 {
5044         int rc;
5045
5046         QETH_DBF_TEXT(trace,4,"adphstr");
5047
5048         if (qeth_adp_supported(card,IPA_SETADP_SET_BROADCAST_MODE)) {
5049                 rc = qeth_send_setadp_mode(card, IPA_SETADP_SET_BROADCAST_MODE,
5050                                            card->options.broadcast_mode);
5051                 if (rc)
5052                         PRINT_WARN("couldn't set broadcast mode on "
5053                                    "device %s: x%x\n",
5054                                    CARD_BUS_ID(card), rc);
5055                 rc = qeth_send_setadp_mode(card, IPA_SETADP_ALTER_MAC_ADDRESS,
5056                                            card->options.macaddr_mode);
5057                 if (rc)
5058                         PRINT_WARN("couldn't set macaddr mode on "
5059                                    "device %s: x%x\n", CARD_BUS_ID(card), rc);
5060                 return rc;
5061         }
5062         if (card->options.broadcast_mode == QETH_TR_BROADCAST_LOCAL)
5063                 PRINT_WARN("set adapter parameters not available "
5064                            "to set broadcast mode, using ALLRINGS "
5065                            "on device %s:\n", CARD_BUS_ID(card));
5066         if (card->options.macaddr_mode == QETH_TR_MACADDR_CANONICAL)
5067                 PRINT_WARN("set adapter parameters not available "
5068                            "to set macaddr mode, using NONCANONICAL "
5069                            "on device %s:\n", CARD_BUS_ID(card));
5070         return 0;
5071 }
5072
5073 static int
5074 qeth_setadapter_parms(struct qeth_card *card)
5075 {
5076         int rc;
5077
5078         QETH_DBF_TEXT(setup, 2, "setadprm");
5079
5080         if (!qeth_is_supported(card, IPA_SETADAPTERPARMS)){
5081                 PRINT_WARN("set adapter parameters not supported "
5082                            "on device %s.\n",
5083                            CARD_BUS_ID(card));
5084                 QETH_DBF_TEXT(setup, 2, " notsupp");
5085                 return 0;
5086         }
5087         rc = qeth_query_setadapterparms(card);
5088         if (rc) {
5089                 PRINT_WARN("couldn't set adapter parameters on device %s: "
5090                            "x%x\n", CARD_BUS_ID(card), rc);
5091                 return rc;
5092         }
5093         if (qeth_adp_supported(card,IPA_SETADP_ALTER_MAC_ADDRESS)) {
5094                 rc = qeth_setadpparms_change_macaddr(card);
5095                 if (rc)
5096                         PRINT_WARN("couldn't get MAC address on "
5097                                    "device %s: x%x\n",
5098                                    CARD_BUS_ID(card), rc);
5099         }
5100
5101         if ((card->info.link_type == QETH_LINK_TYPE_HSTR) ||
5102             (card->info.link_type == QETH_LINK_TYPE_LANE_TR))
5103                 rc = qeth_setadapter_hstr(card);
5104
5105         return rc;
5106 }
5107
5108
5109 static int
5110 qeth_send_startstoplan(struct qeth_card *card, enum qeth_ipa_cmds ipacmd,
5111                        enum qeth_prot_versions prot)
5112 {
5113         int rc;
5114         struct qeth_cmd_buffer *iob;
5115
5116         iob = qeth_get_ipacmd_buffer(card,ipacmd,prot);
5117         rc = qeth_send_ipa_cmd(card, iob, NULL, NULL);
5118
5119         return rc;
5120 }
5121
5122 static int
5123 qeth_send_startlan(struct qeth_card *card, enum qeth_prot_versions prot)
5124 {
5125         int rc;
5126
5127         QETH_DBF_TEXT_(setup, 2, "strtlan%i", prot);
5128
5129         rc = qeth_send_startstoplan(card, IPA_CMD_STARTLAN, prot);
5130         return rc;
5131 }
5132
5133 static int
5134 qeth_send_stoplan(struct qeth_card *card)
5135 {
5136         int rc = 0;
5137
5138         /*
5139          * TODO: according to the IPA format document page 14,
5140          * TCP/IP (we!) never issue a STOPLAN
5141          * is this right ?!?
5142          */
5143         QETH_DBF_TEXT(trace, 2, "stoplan");
5144
5145         rc = qeth_send_startstoplan(card, IPA_CMD_STOPLAN, QETH_PROT_IPV4);
5146         return rc;
5147 }
5148
5149 static int
5150 qeth_query_ipassists_cb(struct qeth_card *card, struct qeth_reply *reply,
5151                         unsigned long data)
5152 {
5153         struct qeth_ipa_cmd *cmd;
5154
5155         QETH_DBF_TEXT(setup, 2, "qipasscb");
5156
5157         cmd = (struct qeth_ipa_cmd *) data;
5158         if (cmd->hdr.prot_version == QETH_PROT_IPV4) {
5159                 card->options.ipa4.supported_funcs = cmd->hdr.ipa_supported;
5160                 card->options.ipa4.enabled_funcs = cmd->hdr.ipa_enabled;
5161         } else {
5162 #ifdef CONFIG_QETH_IPV6
5163                 card->options.ipa6.supported_funcs = cmd->hdr.ipa_supported;
5164                 card->options.ipa6.enabled_funcs = cmd->hdr.ipa_enabled;
5165 #endif
5166         }
5167         return 0;
5168 }
5169
5170 static int
5171 qeth_query_ipassists(struct qeth_card *card, enum qeth_prot_versions prot)
5172 {
5173         int rc;
5174         struct qeth_cmd_buffer *iob;
5175
5176         QETH_DBF_TEXT_(setup, 2, "qipassi%i", prot);
5177
5178         iob = qeth_get_ipacmd_buffer(card,IPA_CMD_QIPASSIST,prot);
5179         rc = qeth_send_ipa_cmd(card, iob, qeth_query_ipassists_cb, NULL);
5180         return rc;
5181 }
5182
5183 static struct qeth_cmd_buffer *
5184 qeth_get_setassparms_cmd(struct qeth_card *card, enum qeth_ipa_funcs ipa_func,
5185                          __u16 cmd_code, __u16 len,
5186                          enum qeth_prot_versions prot)
5187 {
5188         struct qeth_cmd_buffer *iob;
5189         struct qeth_ipa_cmd *cmd;
5190
5191         QETH_DBF_TEXT(trace,4,"getasscm");
5192         iob = qeth_get_ipacmd_buffer(card,IPA_CMD_SETASSPARMS,prot);
5193
5194         cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
5195         cmd->data.setassparms.hdr.assist_no = ipa_func;
5196         cmd->data.setassparms.hdr.length = 8 + len;
5197         cmd->data.setassparms.hdr.command_code = cmd_code;
5198         cmd->data.setassparms.hdr.return_code = 0;
5199         cmd->data.setassparms.hdr.seq_no = 0;
5200
5201         return iob;
5202 }
5203
5204 static int
5205 qeth_send_setassparms(struct qeth_card *card, struct qeth_cmd_buffer *iob,
5206                       __u16 len, long data,
5207                       int (*reply_cb)
5208                       (struct qeth_card *,struct qeth_reply *,unsigned long),
5209                       void *reply_param)
5210 {
5211         int rc;
5212         struct qeth_ipa_cmd *cmd;
5213
5214         QETH_DBF_TEXT(trace,4,"sendassp");
5215
5216         cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
5217         if (len <= sizeof(__u32))
5218                 cmd->data.setassparms.data.flags_32bit = (__u32) data;
5219         else if (len > sizeof(__u32))
5220                 memcpy(&cmd->data.setassparms.data, (void *) data, len);
5221
5222         rc = qeth_send_ipa_cmd(card, iob, reply_cb, reply_param);
5223         return rc;
5224 }
5225
5226 #ifdef CONFIG_QETH_IPV6
5227 static int
5228 qeth_send_simple_setassparms_ipv6(struct qeth_card *card,
5229                                   enum qeth_ipa_funcs ipa_func, __u16 cmd_code)
5230
5231 {
5232         int rc;
5233         struct qeth_cmd_buffer *iob;
5234
5235         QETH_DBF_TEXT(trace,4,"simassp6");
5236         iob = qeth_get_setassparms_cmd(card, ipa_func, cmd_code,
5237                                        0, QETH_PROT_IPV6);
5238         rc = qeth_send_setassparms(card, iob, 0, 0,
5239                                    qeth_default_setassparms_cb, NULL);
5240         return rc;
5241 }
5242 #endif
5243
5244 static int
5245 qeth_send_simple_setassparms(struct qeth_card *card,
5246                              enum qeth_ipa_funcs ipa_func,
5247                              __u16 cmd_code, long data)
5248 {
5249         int rc;
5250         int length = 0;
5251         struct qeth_cmd_buffer *iob;
5252
5253         QETH_DBF_TEXT(trace,4,"simassp4");
5254         if (data)
5255                 length = sizeof(__u32);
5256         iob = qeth_get_setassparms_cmd(card, ipa_func, cmd_code,
5257                                        length, QETH_PROT_IPV4);
5258         rc = qeth_send_setassparms(card, iob, length, data,
5259                                    qeth_default_setassparms_cb, NULL);
5260         return rc;
5261 }
5262
5263 static inline int
5264 qeth_start_ipa_arp_processing(struct qeth_card *card)
5265 {
5266         int rc;
5267
5268         QETH_DBF_TEXT(trace,3,"ipaarp");
5269
5270         if (!qeth_is_supported(card,IPA_ARP_PROCESSING)) {
5271                 PRINT_WARN("ARP processing not supported "
5272                            "on %s!\n", card->info.if_name);
5273                 return 0;
5274         }
5275         rc = qeth_send_simple_setassparms(card,IPA_ARP_PROCESSING,
5276                                           IPA_CMD_ASS_START, 0);
5277         if (rc) {
5278                 PRINT_WARN("Could not start ARP processing "
5279                            "assist on %s: 0x%x\n",
5280                            card->info.if_name, rc);
5281         }
5282         return rc;
5283 }
5284
5285 static int
5286 qeth_start_ipa_ip_fragmentation(struct qeth_card *card)
5287 {
5288         int rc;
5289
5290         QETH_DBF_TEXT(trace,3,"ipaipfrg");
5291
5292         if (!qeth_is_supported(card, IPA_IP_FRAGMENTATION)) {
5293                 PRINT_INFO("IP fragmentation not supported on %s\n",
5294                            card->info.if_name);
5295                 return  -EOPNOTSUPP;
5296         }
5297
5298         rc = qeth_send_simple_setassparms(card, IPA_IP_FRAGMENTATION,
5299                                           IPA_CMD_ASS_START, 0);
5300         if (rc) {
5301                 PRINT_WARN("Could not start IP fragmentation "
5302                            "assist on %s: 0x%x\n",
5303                            card->info.if_name, rc);
5304         } else
5305                 PRINT_INFO("IP fragmentation enabled \n");
5306         return rc;
5307 }
5308
5309 static int
5310 qeth_start_ipa_source_mac(struct qeth_card *card)
5311 {
5312         int rc;
5313
5314         QETH_DBF_TEXT(trace,3,"stsrcmac");
5315
5316         if (!card->options.fake_ll)
5317                 return -EOPNOTSUPP;
5318
5319         if (!qeth_is_supported(card, IPA_SOURCE_MAC)) {
5320                 PRINT_INFO("Inbound source address not "
5321                            "supported on %s\n", card->info.if_name);
5322                 return -EOPNOTSUPP;
5323         }
5324
5325         rc = qeth_send_simple_setassparms(card, IPA_SOURCE_MAC,
5326                                           IPA_CMD_ASS_START, 0);
5327         if (rc)
5328                 PRINT_WARN("Could not start inbound source "
5329                            "assist on %s: 0x%x\n",
5330                            card->info.if_name, rc);
5331         return rc;
5332 }
5333
5334 static int
5335 qeth_start_ipa_vlan(struct qeth_card *card)
5336 {
5337         int rc = 0;
5338
5339         QETH_DBF_TEXT(trace,3,"strtvlan");
5340
5341 #ifdef CONFIG_QETH_VLAN
5342         if (!qeth_is_supported(card, IPA_FULL_VLAN)) {
5343                 PRINT_WARN("VLAN not supported on %s\n", card->info.if_name);
5344                 return -EOPNOTSUPP;
5345         }
5346
5347         rc = qeth_send_simple_setassparms(card, IPA_VLAN_PRIO,
5348                                           IPA_CMD_ASS_START,0);
5349         if (rc) {
5350                 PRINT_WARN("Could not start vlan "
5351                            "assist on %s: 0x%x\n",
5352                            card->info.if_name, rc);
5353         } else {
5354                 PRINT_INFO("VLAN enabled \n");
5355                 card->dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
5356         }
5357 #endif /* QETH_VLAN */
5358         return rc;
5359 }
5360
5361 static int
5362 qeth_start_ipa_multicast(struct qeth_card *card)
5363 {
5364         int rc;
5365
5366         QETH_DBF_TEXT(trace,3,"stmcast");
5367
5368         if (!qeth_is_supported(card, IPA_MULTICASTING)) {
5369                 PRINT_WARN("Multicast not supported on %s\n",
5370                            card->info.if_name);
5371                 return -EOPNOTSUPP;
5372         }
5373
5374         rc = qeth_send_simple_setassparms(card, IPA_MULTICASTING,
5375                                           IPA_CMD_ASS_START,0);
5376         if (rc) {
5377                 PRINT_WARN("Could not start multicast "
5378                            "assist on %s: rc=%i\n",
5379                            card->info.if_name, rc);
5380         } else {
5381                 PRINT_INFO("Multicast enabled\n");
5382                 card->dev->flags |= IFF_MULTICAST;
5383         }
5384         return rc;
5385 }
5386
5387 #ifdef CONFIG_QETH_IPV6
5388 static int
5389 qeth_softsetup_ipv6(struct qeth_card *card)
5390 {
5391         int rc;
5392
5393         QETH_DBF_TEXT(trace,3,"softipv6");
5394
5395         netif_stop_queue(card->dev);
5396         rc = qeth_send_startlan(card, QETH_PROT_IPV6);
5397         if (rc) {
5398                 PRINT_ERR("IPv6 startlan failed on %s\n",
5399                           card->info.if_name);
5400                 return rc;
5401         }
5402         netif_wake_queue(card->dev);
5403         rc = qeth_query_ipassists(card,QETH_PROT_IPV6);
5404         if (rc) {
5405                 PRINT_ERR("IPv6 query ipassist failed on %s\n",
5406                           card->info.if_name);
5407                 return rc;
5408         }
5409         rc = qeth_send_simple_setassparms(card, IPA_IPV6,
5410                                           IPA_CMD_ASS_START, 3);
5411         if (rc) {
5412                 PRINT_WARN("IPv6 start assist (version 4) failed "
5413                            "on %s: 0x%x\n",
5414                            card->info.if_name, rc);
5415                 return rc;
5416         }
5417         rc = qeth_send_simple_setassparms_ipv6(card, IPA_IPV6,
5418                                                IPA_CMD_ASS_START);
5419         if (rc) {
5420                 PRINT_WARN("IPV6 start assist (version 6) failed  "
5421                            "on %s: 0x%x\n",
5422                            card->info.if_name, rc);
5423                 return rc;
5424         }
5425         rc = qeth_send_simple_setassparms_ipv6(card, IPA_PASSTHRU,
5426                                                IPA_CMD_ASS_START);
5427         if (rc) {
5428                 PRINT_WARN("Could not enable passthrough "
5429                            "on %s: 0x%x\n",
5430                            card->info.if_name, rc);
5431                 return rc;
5432         }
5433         PRINT_INFO("IPV6 enabled \n");
5434         return 0;
5435 }
5436
5437 #endif
5438
5439 static int
5440 qeth_start_ipa_ipv6(struct qeth_card *card)
5441 {
5442         int rc = 0;
5443 #ifdef CONFIG_QETH_IPV6
5444         QETH_DBF_TEXT(trace,3,"strtipv6");
5445
5446         if (!qeth_is_supported(card, IPA_IPV6)) {
5447                 PRINT_WARN("IPv6 not supported on %s\n",
5448                            card->info.if_name);
5449                 return 0;
5450         }
5451         rc = qeth_softsetup_ipv6(card);
5452 #endif
5453         return rc ;
5454 }
5455
5456 static int
5457 qeth_start_ipa_broadcast(struct qeth_card *card)
5458 {
5459         int rc;
5460
5461         QETH_DBF_TEXT(trace,3,"stbrdcst");
5462         if (!qeth_is_supported(card, IPA_FILTERING)) {
5463                 PRINT_WARN("Broadcast not supported on %s\n",
5464                            card->info.if_name);
5465                 return -EOPNOTSUPP;
5466         }
5467         rc = qeth_send_simple_setassparms(card, IPA_FILTERING,
5468                                           IPA_CMD_ASS_START, 0);
5469         if (rc) {
5470                 PRINT_WARN("Could not enable broadcasting "
5471                            "on %s: 0x%x\n",
5472                            card->info.if_name, rc);
5473                 return rc;
5474         }
5475
5476         rc = qeth_send_simple_setassparms(card, IPA_FILTERING,
5477                                           IPA_CMD_ASS_CONFIGURE, 1);
5478         if (rc) {
5479                 PRINT_WARN("Could not set up broadcast filtering on %s: 0x%x\n",
5480                            card->info.if_name, rc);
5481                 return rc;
5482         }
5483         PRINT_INFO("Broadcast enabled \n");
5484         card->dev->flags |= IFF_BROADCAST;
5485         card->info.broadcast_capable = 1;
5486         return 0;
5487 }
5488
5489 static int
5490 qeth_send_checksum_command(struct qeth_card *card)
5491 {
5492         int rc;
5493
5494         rc = qeth_send_simple_setassparms(card, IPA_INBOUND_CHECKSUM,
5495                                           IPA_CMD_ASS_START, 0);
5496         if (rc) {
5497                 PRINT_WARN("Starting Inbound HW Checksumming failed on %s: "
5498                            "0x%x,\ncontinuing using Inbound SW Checksumming\n",
5499                            card->info.if_name, rc);
5500                 return rc;
5501         }
5502         rc = qeth_send_simple_setassparms(card, IPA_INBOUND_CHECKSUM,
5503                                           IPA_CMD_ASS_ENABLE,
5504                                           card->info.csum_mask);
5505         if (rc) {
5506                 PRINT_WARN("Enabling Inbound HW Checksumming failed on %s: "
5507                            "0x%x,\ncontinuing using Inbound SW Checksumming\n",
5508                            card->info.if_name, rc);
5509                 return rc;
5510         }
5511         return 0;
5512 }
5513
5514 static int
5515 qeth_start_ipa_checksum(struct qeth_card *card)
5516 {
5517         int rc = 0;
5518
5519         QETH_DBF_TEXT(trace,3,"strtcsum");
5520
5521         if (card->options.checksum_type == NO_CHECKSUMMING) {
5522                 PRINT_WARN("Using no checksumming on %s.\n",
5523                            card->info.if_name);
5524                 return 0;
5525         }
5526         if (card->options.checksum_type == SW_CHECKSUMMING) {
5527                 PRINT_WARN("Using SW checksumming on %s.\n",
5528                            card->info.if_name);
5529                 return 0;
5530         }
5531         if (!qeth_is_supported(card, IPA_INBOUND_CHECKSUM)) {
5532                 PRINT_WARN("Inbound HW Checksumming not "
5533                            "supported on %s,\ncontinuing "
5534                            "using Inbound SW Checksumming\n",
5535                            card->info.if_name);
5536                 card->options.checksum_type = SW_CHECKSUMMING;
5537                 return 0;
5538         }
5539         rc = qeth_send_checksum_command(card);
5540         if (!rc) {
5541                 PRINT_INFO("HW Checksumming (inbound) enabled \n");
5542         }
5543         return rc;
5544 }
5545
5546 /*
5547 static inline void
5548 qeth_print_ipassist_status(struct qeth_card *card)
5549 {
5550         char buf[255];
5551         int offset = 0;
5552
5553         offset += sprintf(buf, "IPAssist options of %s: ", card->info.if_name);
5554         if (qeth_is_enabled(card, IPA_ARP_PROCESSING))
5555                 offset += sprintf(buf+offset, "ARP ");
5556         if (qeth_is_enabled(card, IPA_IP_FRAGMENTATION))
5557                 offset += sprintf(buf+offset, "IP_FRAG");
5558         if (qeth_is_enabled(card, IPA_SOURCE_MAC))
5559                 offset += sprintf(buf+offset, "SRC_MAC");
5560         if (qeth_is_enabled(card, IPA_FULL_VLAN))
5561                 offset += sprintf(buf+offset, "VLAN");
5562         if (qeth_is_enabled(card, IPA_VLAN_PRIO))
5563                 offset += sprintf(buf+offset, "VLAN_PRIO");
5564 }
5565 */
5566
5567 static int
5568 qeth_start_ipassists(struct qeth_card *card)
5569 {
5570         QETH_DBF_TEXT(trace,3,"strtipas");
5571         qeth_start_ipa_arp_processing(card);    /* go on*/
5572         qeth_start_ipa_ip_fragmentation(card);  /* go on*/
5573         qeth_start_ipa_source_mac(card);        /* go on*/
5574         qeth_start_ipa_vlan(card);              /* go on*/
5575         qeth_start_ipa_multicast(card);         /* go on*/
5576         qeth_start_ipa_ipv6(card);              /* go on*/
5577         qeth_start_ipa_broadcast(card);         /* go on*/
5578         qeth_start_ipa_checksum(card);          /* go on*/
5579         return 0;
5580 }
5581
5582 static int
5583 qeth_send_setrouting(struct qeth_card *card, enum qeth_routing_types type,
5584                      enum qeth_prot_versions prot)
5585 {
5586         int rc;
5587         struct qeth_ipa_cmd *cmd;
5588         struct qeth_cmd_buffer *iob;
5589
5590         QETH_DBF_TEXT(trace,4,"setroutg");
5591         iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SETRTG, prot);
5592         cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
5593         cmd->data.setrtg.type = (type);
5594         rc = qeth_send_ipa_cmd(card, iob, NULL, NULL);
5595
5596         return rc;
5597
5598 }
5599
5600 static void
5601 qeth_correct_routing_type(struct qeth_card *card, enum qeth_routing_types *type,
5602                         enum qeth_prot_versions prot)
5603 {
5604         if (card->info.type == QETH_CARD_TYPE_IQD) {
5605                 switch (*type) {
5606                 case NO_ROUTER:
5607                 case PRIMARY_CONNECTOR:
5608                 case SECONDARY_CONNECTOR:
5609                 case MULTICAST_ROUTER:
5610                         return;
5611                 default:
5612                         goto out_inval;
5613                 }
5614         } else {
5615                 switch (*type) {
5616                 case NO_ROUTER:
5617                 case PRIMARY_ROUTER:
5618                 case SECONDARY_ROUTER:
5619                         return;
5620                 case MULTICAST_ROUTER:
5621                         if (qeth_is_ipafunc_supported(card, prot,
5622                                                       IPA_OSA_MC_ROUTER))
5623                                 return;
5624                 default:
5625                         goto out_inval;
5626                 }
5627         }
5628 out_inval:
5629         PRINT_WARN("Routing type '%s' not supported for interface %s.\n"
5630                    "Router status set to 'no router'.\n",
5631                    ((*type == PRIMARY_ROUTER)? "primary router" :
5632                     (*type == SECONDARY_ROUTER)? "secondary router" :
5633                     (*type == PRIMARY_CONNECTOR)? "primary connector" :
5634                     (*type == SECONDARY_CONNECTOR)? "secondary connector" :
5635                     (*type == MULTICAST_ROUTER)? "multicast router" :
5636                     "unknown"),
5637                    card->dev->name);
5638         *type = NO_ROUTER;
5639 }
5640
5641 int
5642 qeth_setrouting_v4(struct qeth_card *card)
5643 {
5644         int rc;
5645
5646         QETH_DBF_TEXT(trace,3,"setrtg4");
5647
5648         qeth_correct_routing_type(card, &card->options.route4.type,
5649                                   QETH_PROT_IPV4);
5650
5651         rc = qeth_send_setrouting(card, card->options.route4.type,
5652                                   QETH_PROT_IPV4);
5653         if (rc) {
5654                 card->options.route4.type = NO_ROUTER;
5655                 PRINT_WARN("Error (0x%04x) while setting routing type on %s. "
5656                            "Type set to 'no router'.\n",
5657                            rc, card->info.if_name);
5658         }
5659         return rc;
5660 }
5661
5662 int
5663 qeth_setrouting_v6(struct qeth_card *card)
5664 {
5665         int rc = 0;
5666
5667         QETH_DBF_TEXT(trace,3,"setrtg6");
5668 #ifdef CONFIG_QETH_IPV6
5669
5670         qeth_correct_routing_type(card, &card->options.route6.type,
5671                                   QETH_PROT_IPV6);
5672
5673         if ((card->options.route6.type == NO_ROUTER) ||
5674             ((card->info.type == QETH_CARD_TYPE_OSAE) &&
5675              (card->options.route6.type == MULTICAST_ROUTER) &&
5676              !qeth_is_supported6(card,IPA_OSA_MC_ROUTER)))
5677                 return 0;
5678         rc = qeth_send_setrouting(card, card->options.route6.type,
5679                                   QETH_PROT_IPV6);
5680         if (rc) {
5681                 card->options.route6.type = NO_ROUTER;
5682                 PRINT_WARN("Error (0x%04x) while setting routing type on %s. "
5683                            "Type set to 'no router'.\n",
5684                            rc, card->info.if_name);
5685         }
5686 #endif
5687         return rc;
5688 }
5689
5690 /*
5691  * softsetup card: init IPA stuff
5692  */
5693 static int
5694 qeth_softsetup_card(struct qeth_card *card)
5695 {
5696         int rc;
5697
5698         QETH_DBF_TEXT(setup, 2, "softsetp");
5699
5700         if ((rc = qeth_send_startlan(card, QETH_PROT_IPV4))){
5701                 QETH_DBF_TEXT_(setup, 2, "1err%d", rc);
5702                 if (rc == 0xe080){
5703                         PRINT_WARN("LAN on card %s if offline! "
5704                                    "Continuing softsetup.\n",
5705                                    CARD_BUS_ID(card));
5706                         card->lan_online = 0;
5707                 } else
5708                         return rc;
5709         } else
5710                 card->lan_online = 1;
5711         if ((rc = qeth_setadapter_parms(card)))
5712                 QETH_DBF_TEXT_(setup, 2, "2err%d", rc);
5713         if ((rc = qeth_start_ipassists(card)))
5714                 QETH_DBF_TEXT_(setup, 2, "3err%d", rc);
5715         if ((rc = qeth_setrouting_v4(card)))
5716                 QETH_DBF_TEXT_(setup, 2, "4err%d", rc);
5717         if ((rc = qeth_setrouting_v6(card)))
5718                 QETH_DBF_TEXT_(setup, 2, "5err%d", rc);
5719         netif_stop_queue(card->dev);
5720         return 0;
5721 }
5722
5723 #ifdef CONFIG_QETH_IPV6
5724 static int
5725 qeth_get_unique_id_cb(struct qeth_card *card, struct qeth_reply *reply,
5726                       unsigned long data)
5727 {
5728         struct qeth_ipa_cmd *cmd;
5729
5730         cmd = (struct qeth_ipa_cmd *) data;
5731         if (cmd->hdr.return_code == 0)
5732                 card->info.unique_id = *((__u16 *)
5733                                 &cmd->data.create_destroy_addr.unique_id[6]);
5734         else {
5735                 card->info.unique_id =  UNIQUE_ID_IF_CREATE_ADDR_FAILED |
5736                                         UNIQUE_ID_NOT_BY_CARD;
5737                 PRINT_WARN("couldn't get a unique id from the card on device "
5738                            "%s (result=x%x), using default id. ipv6 "
5739                            "autoconfig on other lpars may lead to duplicate "
5740                            "ip addresses. please use manually "
5741                            "configured ones.\n",
5742                            CARD_BUS_ID(card), cmd->hdr.return_code);
5743         }
5744         return 0;
5745 }
5746 #endif
5747
5748 static int
5749 qeth_put_unique_id(struct qeth_card *card)
5750 {
5751
5752         int rc = 0;
5753 #ifdef CONFIG_QETH_IPV6
5754         struct qeth_cmd_buffer *iob;
5755         struct qeth_ipa_cmd *cmd;
5756
5757         QETH_DBF_TEXT(trace,2,"puniqeid");
5758
5759         if ((card->info.unique_id & UNIQUE_ID_NOT_BY_CARD) ==
5760                 UNIQUE_ID_NOT_BY_CARD)
5761                 return -1;
5762         iob = qeth_get_ipacmd_buffer(card, IPA_CMD_DESTROY_ADDR,
5763                                      QETH_PROT_IPV6);
5764         cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
5765         *((__u16 *) &cmd->data.create_destroy_addr.unique_id[6]) =
5766                             card->info.unique_id;
5767         memcpy(&cmd->data.create_destroy_addr.unique_id[0],
5768                card->dev->dev_addr, OSA_ADDR_LEN);
5769         rc = qeth_send_ipa_cmd(card, iob, NULL, NULL);
5770 #else
5771         card->info.unique_id =  UNIQUE_ID_IF_CREATE_ADDR_FAILED |
5772                                 UNIQUE_ID_NOT_BY_CARD;
5773 #endif
5774         return rc;
5775 }
5776
5777 /**
5778  * Clear IP List
5779  */
5780 static void
5781 qeth_clear_ip_list(struct qeth_card *card, int clean, int recover)
5782 {
5783         struct qeth_ipaddr *addr, *tmp;
5784         int first_run = 1;
5785         unsigned long flags;
5786
5787         QETH_DBF_TEXT(trace,4,"clearip");
5788         spin_lock_irqsave(&card->ip_lock, flags);
5789         /* clear todo list */
5790         list_for_each_entry_safe(addr, tmp, &card->ip_tbd_list, entry){
5791                 list_del(&addr->entry);
5792                 kfree(addr);
5793         }
5794 again:
5795         if (first_run)
5796                 first_run = 0;
5797         else
5798                 spin_lock_irqsave(&card->ip_lock, flags);
5799
5800         list_for_each_entry_safe(addr, tmp, &card->ip_list, entry) {
5801                 list_del_init(&addr->entry);
5802                 if (clean){
5803                         spin_unlock_irqrestore(&card->ip_lock, flags);
5804                         qeth_deregister_addr_entry(card, addr);
5805                 }
5806                 if (!recover || addr->is_multicast)
5807                         kfree(addr);
5808                 else {
5809                         if (clean)
5810                                 spin_lock_irqsave(&card->ip_lock, flags);
5811                         list_add_tail(&addr->entry, &card->ip_tbd_list);
5812                         if (clean) {
5813                                 spin_unlock_irqrestore(&card->ip_lock, flags);
5814                                 goto again;
5815                         }
5816                 }
5817         }
5818         spin_unlock_irqrestore(&card->ip_lock, flags);
5819 }
5820
5821 static void
5822 qeth_set_allowed_threads(struct qeth_card *card, unsigned long threads,
5823                          int clear_start_mask)
5824 {
5825         unsigned long flags;
5826
5827         spin_lock_irqsave(&card->thread_mask_lock, flags);
5828         card->thread_allowed_mask = threads;
5829         if (clear_start_mask)
5830                 card->thread_start_mask &= threads;
5831         spin_unlock_irqrestore(&card->thread_mask_lock, flags);
5832         wake_up(&card->wait_q);
5833 }
5834
5835 static inline int
5836 qeth_threads_running(struct qeth_card *card, unsigned long threads)
5837 {
5838         unsigned long flags;
5839         int rc = 0;
5840
5841         spin_lock_irqsave(&card->thread_mask_lock, flags);
5842         rc = (card->thread_running_mask & threads);
5843         spin_unlock_irqrestore(&card->thread_mask_lock, flags);
5844         return rc;
5845 }
5846
5847 static int
5848 qeth_wait_for_threads(struct qeth_card *card, unsigned long threads)
5849 {
5850         return wait_event_interruptible(card->wait_q,
5851                         qeth_threads_running(card, threads) == 0);
5852 }
5853
5854 static int
5855 qeth_stop_card(struct qeth_card *card)
5856 {
5857         int recover_flag = 0;
5858         int rc = 0;
5859
5860         QETH_DBF_TEXT(setup ,2,"stopcard");
5861         QETH_DBF_HEX(setup, 2, &card, sizeof(void *));
5862
5863         qeth_set_allowed_threads(card, 0, 1);
5864         if (qeth_wait_for_threads(card, ~QETH_RECOVER_THREAD))
5865                 return -ERESTARTSYS;
5866         if (card->read.state == CH_STATE_UP &&
5867             card->write.state == CH_STATE_UP &&
5868             (card->state == CARD_STATE_UP)) {
5869                 recover_flag = 1;
5870                 rtnl_lock();
5871                 dev_close(card->dev);
5872                 rtnl_unlock();
5873                 if (!card->use_hard_stop)
5874                         if ((rc = qeth_send_stoplan(card)))
5875                                 QETH_DBF_TEXT_(setup, 2, "1err%d", rc);
5876                 card->state = CARD_STATE_SOFTSETUP;
5877         }
5878         if (card->state == CARD_STATE_SOFTSETUP) {
5879                 qeth_clear_ip_list(card, !card->use_hard_stop, recover_flag);
5880                 qeth_clear_ipacmd_list(card);
5881                 card->state = CARD_STATE_HARDSETUP;
5882         }
5883         if (card->state == CARD_STATE_HARDSETUP) {
5884                 if (!card->use_hard_stop)
5885                         if ((rc = qeth_put_unique_id(card)))
5886                                 QETH_DBF_TEXT_(setup, 2, "2err%d", rc);
5887                 qeth_qdio_clear_card(card, 0);
5888                 qeth_clear_qdio_buffers(card);
5889                 qeth_clear_working_pool_list(card);
5890                 card->state = CARD_STATE_DOWN;
5891         }
5892         if (card->state == CARD_STATE_DOWN) {
5893                 qeth_clear_cmd_buffers(&card->read);
5894                 qeth_clear_cmd_buffers(&card->write);
5895         }
5896         card->use_hard_stop = 0;
5897         return rc;
5898 }
5899
5900
5901 static int
5902 qeth_get_unique_id(struct qeth_card *card)
5903 {
5904         int rc = 0;
5905 #ifdef CONFIG_QETH_IPV6
5906         struct qeth_cmd_buffer *iob;
5907         struct qeth_ipa_cmd *cmd;
5908
5909         QETH_DBF_TEXT(setup, 2, "guniqeid");
5910
5911         if (!qeth_is_supported(card,IPA_IPV6)) {
5912                 card->info.unique_id =  UNIQUE_ID_IF_CREATE_ADDR_FAILED |
5913                                         UNIQUE_ID_NOT_BY_CARD;
5914                 return 0;
5915         }
5916
5917         iob = qeth_get_ipacmd_buffer(card, IPA_CMD_CREATE_ADDR,
5918                                      QETH_PROT_IPV6);
5919         cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
5920         *((__u16 *) &cmd->data.create_destroy_addr.unique_id[6]) =
5921                             card->info.unique_id;
5922
5923         rc = qeth_send_ipa_cmd(card, iob, qeth_get_unique_id_cb, NULL);
5924 #else
5925         card->info.unique_id =  UNIQUE_ID_IF_CREATE_ADDR_FAILED |
5926                                 UNIQUE_ID_NOT_BY_CARD;
5927 #endif
5928         return rc;
5929 }
5930 static void
5931 qeth_print_status_with_portname(struct qeth_card *card)
5932 {
5933         char dbf_text[15];
5934         int i;
5935
5936         sprintf(dbf_text, "%s", card->info.portname + 1);
5937         for (i = 0; i < 8; i++)
5938                 dbf_text[i] =
5939                         (char) _ebcasc[(__u8) dbf_text[i]];
5940         dbf_text[8] = 0;
5941         printk("qeth: Device %s/%s/%s is a%s card%s%s%s\n"
5942                "with link type %s (portname: %s)\n",
5943                CARD_RDEV_ID(card),
5944                CARD_WDEV_ID(card),
5945                CARD_DDEV_ID(card),
5946                qeth_get_cardname(card),
5947                (card->info.mcl_level[0]) ? " (level: " : "",
5948                (card->info.mcl_level[0]) ? card->info.mcl_level : "",
5949                (card->info.mcl_level[0]) ? ")" : "",
5950                qeth_get_cardname_short(card),
5951                dbf_text);
5952
5953 }
5954
5955 static void
5956 qeth_print_status_no_portname(struct qeth_card *card)
5957 {
5958         if (card->info.portname[0])
5959                 printk("qeth: Device %s/%s/%s is a%s "
5960                        "card%s%s%s\nwith link type %s "
5961                        "(no portname needed by interface).\n",
5962                        CARD_RDEV_ID(card),
5963                        CARD_WDEV_ID(card),
5964                        CARD_DDEV_ID(card),
5965                        qeth_get_cardname(card),
5966                        (card->info.mcl_level[0]) ? " (level: " : "",
5967                        (card->info.mcl_level[0]) ? card->info.mcl_level : "",
5968                        (card->info.mcl_level[0]) ? ")" : "",
5969                        qeth_get_cardname_short(card));
5970         else
5971                 printk("qeth: Device %s/%s/%s is a%s "
5972                        "card%s%s%s\nwith link type %s.\n",
5973                        CARD_RDEV_ID(card),
5974                        CARD_WDEV_ID(card),
5975                        CARD_DDEV_ID(card),
5976                        qeth_get_cardname(card),
5977                        (card->info.mcl_level[0]) ? " (level: " : "",
5978                        (card->info.mcl_level[0]) ? card->info.mcl_level : "",
5979                        (card->info.mcl_level[0]) ? ")" : "",
5980                        qeth_get_cardname_short(card));
5981 }
5982
5983 static void
5984 qeth_print_status_message(struct qeth_card *card)
5985 {
5986         switch (card->info.type) {
5987         case QETH_CARD_TYPE_OSAE:
5988                 /* VM will use a non-zero first character
5989                  * to indicate a HiperSockets like reporting
5990                  * of the level OSA sets the first character to zero
5991                  * */
5992                 if (!card->info.mcl_level[0]) {
5993                         sprintf(card->info.mcl_level,"%02x%02x",
5994                                 card->info.mcl_level[2],
5995                                 card->info.mcl_level[3]);
5996
5997                         card->info.mcl_level[QETH_MCL_LENGTH] = 0;
5998                         break;
5999                 }
6000                 /* fallthrough */
6001         case QETH_CARD_TYPE_IQD:
6002                 card->info.mcl_level[0] = (char) _ebcasc[(__u8)
6003                         card->info.mcl_level[0]];
6004                 card->info.mcl_level[1] = (char) _ebcasc[(__u8)
6005                         card->info.mcl_level[1]];
6006                 card->info.mcl_level[2] = (char) _ebcasc[(__u8)
6007                         card->info.mcl_level[2]];
6008                 card->info.mcl_level[3] = (char) _ebcasc[(__u8)
6009                         card->info.mcl_level[3]];
6010                 card->info.mcl_level[QETH_MCL_LENGTH] = 0;
6011                 break;
6012         default:
6013                 memset(&card->info.mcl_level[0], 0, QETH_MCL_LENGTH + 1);
6014         }
6015         if (card->info.portname_required)
6016                 qeth_print_status_with_portname(card);
6017         else
6018                 qeth_print_status_no_portname(card);
6019 }
6020
6021 static int
6022 qeth_register_netdev(struct qeth_card *card)
6023 {
6024         int rc;
6025
6026         QETH_DBF_TEXT(setup, 3, "regnetd");
6027         if (card->dev->reg_state != NETREG_UNINITIALIZED)
6028                 return 0;
6029         /* sysfs magic */
6030         SET_NETDEV_DEV(card->dev, &card->gdev->dev);
6031         rc = register_netdev(card->dev);
6032         if (!rc)
6033                 strcpy(card->info.if_name, card->dev->name);
6034
6035         return rc;
6036 }
6037
6038 static void
6039 qeth_start_again(struct qeth_card *card)
6040 {
6041         QETH_DBF_TEXT(setup ,2, "startag");
6042
6043         rtnl_lock();
6044         dev_open(card->dev);
6045         rtnl_unlock();
6046         qeth_set_thread_start_bit(card, QETH_SET_MC_THREAD);
6047         schedule_work(&card->kernel_thread_starter);
6048 }
6049
6050 static int
6051 qeth_set_online(struct ccwgroup_device *gdev)
6052 {
6053         struct qeth_card *card = gdev->dev.driver_data;
6054         int rc = 0;
6055         enum qeth_card_states recover_flag;
6056
6057         BUG_ON(!card);
6058         QETH_DBF_TEXT(setup ,2, "setonlin");
6059         QETH_DBF_HEX(setup, 2, &card, sizeof(void *));
6060
6061         qeth_set_allowed_threads(card, QETH_RECOVER_THREAD, 1);
6062         if (qeth_wait_for_threads(card, ~QETH_RECOVER_THREAD)){
6063                 PRINT_WARN("set_online of card %s interrupted by user!\n",
6064                            CARD_BUS_ID(card));
6065                 return -ERESTARTSYS;
6066         }
6067
6068         recover_flag = card->state;
6069         if (ccw_device_set_online(CARD_RDEV(card)) ||
6070             ccw_device_set_online(CARD_WDEV(card)) ||
6071             ccw_device_set_online(CARD_DDEV(card))){
6072                 QETH_DBF_TEXT_(setup, 2, "1err%d", rc);
6073                 return -EIO;
6074         }
6075
6076         if ((rc = qeth_hardsetup_card(card))){
6077                 QETH_DBF_TEXT_(setup, 2, "2err%d", rc);
6078                 goto out_remove;
6079         }
6080         card->state = CARD_STATE_HARDSETUP;
6081
6082         if ((rc = qeth_query_ipassists(card,QETH_PROT_IPV4))){
6083                 QETH_DBF_TEXT_(setup, 2, "3err%d", rc);
6084                 /*TODO: rc !=0*/
6085         } else
6086                 rc = qeth_get_unique_id(card);
6087
6088         if (rc) {
6089                 QETH_DBF_TEXT_(setup, 2, "4err%d", rc);
6090                 goto out_remove;
6091         }
6092         qeth_print_status_message(card);
6093         if ((rc = qeth_register_netdev(card))){
6094                 QETH_DBF_TEXT_(setup, 2, "5err%d", rc);
6095                 goto out_remove;
6096         }
6097         if ((rc = qeth_softsetup_card(card))){
6098                 QETH_DBF_TEXT_(setup, 2, "6err%d", rc);
6099                 goto out_remove;
6100         }
6101         card->state = CARD_STATE_SOFTSETUP;
6102
6103         if ((rc = qeth_init_qdio_queues(card))){
6104                 QETH_DBF_TEXT_(setup, 2, "7err%d", rc);
6105                 goto out_remove;
6106         }
6107 /*maybe it was set offline without ifconfig down
6108  * we can also use this state for recovery purposes*/
6109         qeth_set_allowed_threads(card, 0xffffffff, 0);
6110         if (recover_flag == CARD_STATE_RECOVER)
6111                 qeth_start_again(card);
6112
6113         return 0;
6114 out_remove:
6115         card->use_hard_stop = 1;
6116         qeth_stop_card(card);
6117         ccw_device_set_offline(CARD_DDEV(card));
6118         ccw_device_set_offline(CARD_WDEV(card));
6119         ccw_device_set_offline(CARD_RDEV(card));
6120         if (recover_flag == CARD_STATE_RECOVER)
6121                 card->state = CARD_STATE_RECOVER;
6122         else
6123                 card->state = CARD_STATE_DOWN;
6124         return -ENODEV;
6125 }
6126
6127 static struct ccw_device_id qeth_ids[] = {
6128         {CCW_DEVICE(0x1731, 0x01), driver_info:QETH_CARD_TYPE_OSAE},
6129         {CCW_DEVICE(0x1731, 0x05), driver_info:QETH_CARD_TYPE_IQD},
6130         {},
6131 };
6132 MODULE_DEVICE_TABLE(ccw, qeth_ids);
6133
6134 struct device *qeth_root_dev = NULL;
6135
6136 struct ccwgroup_driver qeth_ccwgroup_driver = {
6137         .owner = THIS_MODULE,
6138         .name = "qeth",
6139         .driver_id = 0xD8C5E3C8,
6140         .probe = qeth_probe_device,
6141         .remove = qeth_remove_device,
6142         .set_online = qeth_set_online,
6143         .set_offline = qeth_set_offline,
6144 };
6145
6146 struct ccw_driver qeth_ccw_driver = {
6147         .name = "qeth",
6148         .ids = qeth_ids,
6149         .probe = ccwgroup_probe_ccwdev,
6150         .remove = ccwgroup_remove_ccwdev,
6151 };
6152
6153
6154 static void
6155 qeth_unregister_dbf_views(void)
6156 {
6157         if (qeth_dbf_setup)
6158                 debug_unregister(qeth_dbf_setup);
6159         if (qeth_dbf_qerr)
6160                 debug_unregister(qeth_dbf_qerr);
6161         if (qeth_dbf_sense)
6162                 debug_unregister(qeth_dbf_sense);
6163         if (qeth_dbf_misc)
6164                 debug_unregister(qeth_dbf_misc);
6165         if (qeth_dbf_data)
6166                 debug_unregister(qeth_dbf_data);
6167         if (qeth_dbf_control)
6168                 debug_unregister(qeth_dbf_control);
6169         if (qeth_dbf_trace)
6170                 debug_unregister(qeth_dbf_trace);
6171 }
6172 static int
6173 qeth_register_dbf_views(void)
6174 {
6175         qeth_dbf_setup = debug_register(QETH_DBF_SETUP_NAME,
6176                                         QETH_DBF_SETUP_INDEX,
6177                                         QETH_DBF_SETUP_NR_AREAS,
6178                                         QETH_DBF_SETUP_LEN);
6179         qeth_dbf_misc = debug_register(QETH_DBF_MISC_NAME,
6180                                        QETH_DBF_MISC_INDEX,
6181                                        QETH_DBF_MISC_NR_AREAS,
6182                                        QETH_DBF_MISC_LEN);
6183         qeth_dbf_data = debug_register(QETH_DBF_DATA_NAME,
6184                                        QETH_DBF_DATA_INDEX,
6185                                        QETH_DBF_DATA_NR_AREAS,
6186                                        QETH_DBF_DATA_LEN);
6187         qeth_dbf_control = debug_register(QETH_DBF_CONTROL_NAME,
6188                                           QETH_DBF_CONTROL_INDEX,
6189                                           QETH_DBF_CONTROL_NR_AREAS,
6190                                           QETH_DBF_CONTROL_LEN);
6191         qeth_dbf_sense = debug_register(QETH_DBF_SENSE_NAME,
6192                                         QETH_DBF_SENSE_INDEX,
6193                                         QETH_DBF_SENSE_NR_AREAS,
6194                                         QETH_DBF_SENSE_LEN);
6195         qeth_dbf_qerr = debug_register(QETH_DBF_QERR_NAME,
6196                                        QETH_DBF_QERR_INDEX,
6197                                        QETH_DBF_QERR_NR_AREAS,
6198                                        QETH_DBF_QERR_LEN);
6199         qeth_dbf_trace = debug_register(QETH_DBF_TRACE_NAME,
6200                                         QETH_DBF_TRACE_INDEX,
6201                                         QETH_DBF_TRACE_NR_AREAS,
6202                                         QETH_DBF_TRACE_LEN);
6203
6204         if ((qeth_dbf_setup == NULL) || (qeth_dbf_misc == NULL)    ||
6205             (qeth_dbf_data == NULL)  || (qeth_dbf_control == NULL) ||
6206             (qeth_dbf_sense == NULL) || (qeth_dbf_qerr == NULL)    ||
6207             (qeth_dbf_trace == NULL)) {
6208                 qeth_unregister_dbf_views();
6209                 return -ENOMEM;
6210         }
6211         debug_register_view(qeth_dbf_setup, &debug_hex_ascii_view);
6212         debug_set_level(qeth_dbf_setup, QETH_DBF_SETUP_LEVEL);
6213
6214         debug_register_view(qeth_dbf_misc, &debug_hex_ascii_view);
6215         debug_set_level(qeth_dbf_misc, QETH_DBF_MISC_LEVEL);
6216
6217         debug_register_view(qeth_dbf_data, &debug_hex_ascii_view);
6218         debug_set_level(qeth_dbf_data, QETH_DBF_DATA_LEVEL);
6219
6220         debug_register_view(qeth_dbf_control, &debug_hex_ascii_view);
6221         debug_set_level(qeth_dbf_control, QETH_DBF_CONTROL_LEVEL);
6222
6223         debug_register_view(qeth_dbf_sense, &debug_hex_ascii_view);
6224         debug_set_level(qeth_dbf_sense, QETH_DBF_SENSE_LEVEL);
6225
6226         debug_register_view(qeth_dbf_qerr, &debug_hex_ascii_view);
6227         debug_set_level(qeth_dbf_qerr, QETH_DBF_QERR_LEVEL);
6228
6229         debug_register_view(qeth_dbf_trace, &debug_hex_ascii_view);
6230         debug_set_level(qeth_dbf_trace, QETH_DBF_TRACE_LEVEL);
6231
6232         return 0;
6233 }
6234
6235 #ifdef CONFIG_QETH_IPV6
6236 extern struct neigh_table arp_tbl;
6237 static struct neigh_ops *arp_direct_ops;
6238 static int (*qeth_old_arp_constructor) (struct neighbour *);
6239
6240 static struct neigh_ops arp_direct_ops_template = {
6241         .family = AF_INET,
6242         .destructor = NULL,
6243         .solicit = NULL,
6244         .error_report = NULL,
6245         .output = dev_queue_xmit,
6246         .connected_output = dev_queue_xmit,
6247         .hh_output = dev_queue_xmit,
6248         .queue_xmit = dev_queue_xmit
6249 };
6250
6251 static int
6252 qeth_arp_constructor(struct neighbour *neigh)
6253 {
6254         struct net_device *dev = neigh->dev;
6255         struct in_device *in_dev = in_dev_get(dev);
6256
6257         if (in_dev == NULL)
6258                 return -EINVAL;
6259         if (!qeth_verify_dev(dev)) {
6260                 in_dev_put(in_dev);
6261                 return qeth_old_arp_constructor(neigh);
6262         }
6263
6264         neigh->type = inet_addr_type(*(u32 *) neigh->primary_key);
6265         if (in_dev->arp_parms)
6266                 neigh->parms = in_dev->arp_parms;
6267         in_dev_put(in_dev);
6268         neigh->nud_state = NUD_NOARP;
6269         neigh->ops = arp_direct_ops;
6270         neigh->output = neigh->ops->queue_xmit;
6271         return 0;
6272 }
6273 #endif  /*CONFIG_QETH_IPV6*/
6274
6275 /*
6276  * IP address takeover related functions
6277  */
6278 static void
6279 qeth_clear_ipato_list(struct qeth_card *card)
6280 {
6281         struct qeth_ipato_entry *ipatoe, *tmp;
6282         unsigned long flags;
6283
6284         spin_lock_irqsave(&card->ip_lock, flags);
6285         list_for_each_entry_safe(ipatoe, tmp, &card->ipato.entries, entry) {
6286                 list_del(&ipatoe->entry);
6287                 kfree(ipatoe);
6288         }
6289         spin_unlock_irqrestore(&card->ip_lock, flags);
6290 }
6291
6292 int
6293 qeth_add_ipato_entry(struct qeth_card *card, struct qeth_ipato_entry *new)
6294 {
6295         struct qeth_ipato_entry *ipatoe;
6296         unsigned long flags;
6297         int rc = 0;
6298
6299         QETH_DBF_TEXT(trace, 2, "addipato");
6300         spin_lock_irqsave(&card->ip_lock, flags);
6301         list_for_each_entry(ipatoe, &card->ipato.entries, entry){
6302                 if (ipatoe->proto != new->proto)
6303                         continue;
6304                 if (!memcmp(ipatoe->addr, new->addr,
6305                             (ipatoe->proto == QETH_PROT_IPV4)? 4:16) &&
6306                     (ipatoe->mask_bits == new->mask_bits)){
6307                         PRINT_WARN("ipato entry already exists!\n");
6308                         rc = -EEXIST;
6309                         break;
6310                 }
6311         }
6312         if (!rc) {
6313                 list_add_tail(&new->entry, &card->ipato.entries);
6314         }
6315         spin_unlock_irqrestore(&card->ip_lock, flags);
6316         return rc;
6317 }
6318
6319 void
6320 qeth_del_ipato_entry(struct qeth_card *card, enum qeth_prot_versions proto,
6321                      u8 *addr, int mask_bits)
6322 {
6323         struct qeth_ipato_entry *ipatoe, *tmp;
6324         unsigned long flags;
6325
6326         QETH_DBF_TEXT(trace, 2, "delipato");
6327         spin_lock_irqsave(&card->ip_lock, flags);
6328         list_for_each_entry_safe(ipatoe, tmp, &card->ipato.entries, entry){
6329                 if (ipatoe->proto != proto)
6330                         continue;
6331                 if (!memcmp(ipatoe->addr, addr,
6332                             (proto == QETH_PROT_IPV4)? 4:16) &&
6333                     (ipatoe->mask_bits == mask_bits)){
6334                         list_del(&ipatoe->entry);
6335                         kfree(ipatoe);
6336                 }
6337         }
6338         spin_unlock_irqrestore(&card->ip_lock, flags);
6339 }
6340
6341 static inline void
6342 qeth_convert_addr_to_bits(u8 *addr, u8 *bits, int len)
6343 {
6344         int i, j;
6345         u8 octet;
6346
6347         for (i = 0; i < len; ++i){
6348                 octet = addr[i];
6349                 for (j = 7; j >= 0; --j){
6350                         bits[i*8 + j] = octet & 1;
6351                         octet >>= 1;
6352                 }
6353         }
6354 }
6355
6356 static int
6357 qeth_is_addr_covered_by_ipato(struct qeth_card *card, struct qeth_ipaddr *addr)
6358 {
6359         struct qeth_ipato_entry *ipatoe;
6360         u8 addr_bits[128] = {0, };
6361         u8 ipatoe_bits[128] = {0, };
6362         int rc = 0;
6363
6364         if (!card->ipato.enabled)
6365                 return 0;
6366
6367         qeth_convert_addr_to_bits((u8 *) &addr->u, addr_bits,
6368                                   (addr->proto == QETH_PROT_IPV4)? 4:16);
6369         list_for_each_entry(ipatoe, &card->ipato.entries, entry){
6370                 if (addr->proto != ipatoe->proto)
6371                         continue;
6372                 qeth_convert_addr_to_bits(ipatoe->addr, ipatoe_bits,
6373                                           (ipatoe->proto==QETH_PROT_IPV4) ?
6374                                           4:16);
6375                 if (addr->proto == QETH_PROT_IPV4)
6376                         rc = !memcmp(addr_bits, ipatoe_bits,
6377                                      min(32, ipatoe->mask_bits));
6378                 else
6379                         rc = !memcmp(addr_bits, ipatoe_bits,
6380                                      min(128, ipatoe->mask_bits));
6381                 if (rc)
6382                         break;
6383         }
6384         /* invert? */
6385         if ((addr->proto == QETH_PROT_IPV4) && card->ipato.invert4)
6386                 rc = !rc;
6387         else if ((addr->proto == QETH_PROT_IPV6) && card->ipato.invert6)
6388                 rc = !rc;
6389
6390         return rc;
6391 }
6392
6393 /*
6394  * VIPA related functions
6395  */
6396 int
6397 qeth_add_vipa(struct qeth_card *card, enum qeth_prot_versions proto,
6398               const u8 *addr)
6399 {
6400         struct qeth_ipaddr *ipaddr;
6401         unsigned long flags;
6402         int rc = 0;
6403
6404         ipaddr = qeth_get_addr_buffer(proto);
6405         if (ipaddr){
6406                 if (proto == QETH_PROT_IPV4){
6407                         QETH_DBF_TEXT(trace, 2, "addvipa4");
6408                         memcpy(&ipaddr->u.a4.addr, addr, 4);
6409                         ipaddr->u.a4.mask = 0;
6410 #ifdef CONFIG_QETH_IPV6
6411                 } else if (proto == QETH_PROT_IPV6){
6412                         QETH_DBF_TEXT(trace, 2, "addvipa6");
6413                         memcpy(&ipaddr->u.a6.addr, addr, 16);
6414                         ipaddr->u.a6.pfxlen = 0;
6415 #endif
6416                 }
6417                 ipaddr->type = QETH_IP_TYPE_VIPA;
6418                 ipaddr->set_flags = QETH_IPA_SETIP_VIPA_FLAG;
6419                 ipaddr->del_flags = QETH_IPA_DELIP_VIPA_FLAG;
6420         } else
6421                 return -ENOMEM;
6422         spin_lock_irqsave(&card->ip_lock, flags);
6423         if (__qeth_address_exists_in_list(&card->ip_list, ipaddr, 0) ||
6424             __qeth_address_exists_in_list(&card->ip_tbd_list, ipaddr, 0))
6425                 rc = -EEXIST;
6426         spin_unlock_irqrestore(&card->ip_lock, flags);
6427         if (rc){
6428                 PRINT_WARN("Cannot add VIPA. Address already exists!\n");
6429                 return rc;
6430         }
6431         if (!qeth_add_ip(card, ipaddr))
6432                 kfree(ipaddr);
6433         qeth_set_thread_start_bit(card, QETH_SET_IP_THREAD);
6434         schedule_work(&card->kernel_thread_starter);
6435         return rc;
6436 }
6437
6438 void
6439 qeth_del_vipa(struct qeth_card *card, enum qeth_prot_versions proto,
6440               const u8 *addr)
6441 {
6442         struct qeth_ipaddr *ipaddr;
6443
6444         ipaddr = qeth_get_addr_buffer(proto);
6445         if (ipaddr){
6446                 if (proto == QETH_PROT_IPV4){
6447                         QETH_DBF_TEXT(trace, 2, "delvipa4");
6448                         memcpy(&ipaddr->u.a4.addr, addr, 4);
6449                         ipaddr->u.a4.mask = 0;
6450 #ifdef CONFIG_QETH_IPV6
6451                 } else if (proto == QETH_PROT_IPV6){
6452                         QETH_DBF_TEXT(trace, 2, "delvipa6");
6453                         memcpy(&ipaddr->u.a6.addr, addr, 16);
6454                         ipaddr->u.a6.pfxlen = 0;
6455 #endif
6456                 }
6457                 ipaddr->type = QETH_IP_TYPE_VIPA;
6458         } else
6459                 return;
6460         if (!qeth_delete_ip(card, ipaddr))
6461                 kfree(ipaddr);
6462         qeth_set_thread_start_bit(card, QETH_SET_IP_THREAD);
6463         schedule_work(&card->kernel_thread_starter);
6464 }
6465
6466 /*
6467  * proxy ARP related functions
6468  */
6469 int
6470 qeth_add_rxip(struct qeth_card *card, enum qeth_prot_versions proto,
6471               const u8 *addr)
6472 {
6473         struct qeth_ipaddr *ipaddr;
6474         unsigned long flags;
6475         int rc = 0;
6476
6477         ipaddr = qeth_get_addr_buffer(proto);
6478         if (ipaddr){
6479                 if (proto == QETH_PROT_IPV4){
6480                         QETH_DBF_TEXT(trace, 2, "addrxip4");
6481                         memcpy(&ipaddr->u.a4.addr, addr, 4);
6482                         ipaddr->u.a4.mask = 0;
6483 #ifdef CONFIG_QETH_IPV6
6484                 } else if (proto == QETH_PROT_IPV6){
6485                         QETH_DBF_TEXT(trace, 2, "addrxip6");
6486                         memcpy(&ipaddr->u.a6.addr, addr, 16);
6487                         ipaddr->u.a6.pfxlen = 0;
6488 #endif
6489                 }
6490                 ipaddr->type = QETH_IP_TYPE_RXIP;
6491                 ipaddr->set_flags = QETH_IPA_SETIP_TAKEOVER_FLAG;
6492                 ipaddr->del_flags = 0;
6493         } else
6494                 return -ENOMEM;
6495         spin_lock_irqsave(&card->ip_lock, flags);
6496         if (__qeth_address_exists_in_list(&card->ip_list, ipaddr, 0) ||
6497             __qeth_address_exists_in_list(&card->ip_tbd_list, ipaddr, 0))
6498                 rc = -EEXIST;
6499         spin_unlock_irqrestore(&card->ip_lock, flags);
6500         if (rc){
6501                 PRINT_WARN("Cannot add RXIP. Address already exists!\n");
6502                 return rc;
6503         }
6504         if (!qeth_add_ip(card, ipaddr))
6505                 kfree(ipaddr);
6506         qeth_set_thread_start_bit(card, QETH_SET_IP_THREAD);
6507         schedule_work(&card->kernel_thread_starter);
6508         return 0;
6509 }
6510
6511 void
6512 qeth_del_rxip(struct qeth_card *card, enum qeth_prot_versions proto,
6513               const u8 *addr)
6514 {
6515         struct qeth_ipaddr *ipaddr;
6516
6517         ipaddr = qeth_get_addr_buffer(proto);
6518         if (ipaddr){
6519                 if (proto == QETH_PROT_IPV4){
6520                         QETH_DBF_TEXT(trace, 2, "addrxip4");
6521                         memcpy(&ipaddr->u.a4.addr, addr, 4);
6522                         ipaddr->u.a4.mask = 0;
6523 #ifdef CONFIG_QETH_IPV6
6524                 } else if (proto == QETH_PROT_IPV6){
6525                         QETH_DBF_TEXT(trace, 2, "addrxip6");
6526                         memcpy(&ipaddr->u.a6.addr, addr, 16);
6527                         ipaddr->u.a6.pfxlen = 0;
6528 #endif
6529                 }
6530                 ipaddr->type = QETH_IP_TYPE_RXIP;
6531         } else
6532                 return;
6533         if (!qeth_delete_ip(card, ipaddr))
6534                 kfree(ipaddr);
6535         qeth_set_thread_start_bit(card, QETH_SET_IP_THREAD);
6536         schedule_work(&card->kernel_thread_starter);
6537 }
6538
6539 /**
6540  * IP event handler
6541  */
6542 static int
6543 qeth_ip_event(struct notifier_block *this,
6544               unsigned long event,void *ptr)
6545 {
6546         struct in_ifaddr *ifa = (struct in_ifaddr *)ptr;
6547         struct net_device *dev =(struct net_device *) ifa->ifa_dev->dev;
6548         struct qeth_ipaddr *addr;
6549         struct qeth_card *card;
6550
6551         QETH_DBF_TEXT(trace,3,"ipevent");
6552         card = qeth_get_card_from_dev(dev);
6553         if (!card)
6554                 return NOTIFY_DONE;
6555
6556         addr = qeth_get_addr_buffer(QETH_PROT_IPV4);
6557         if (addr != NULL) {
6558                 addr->u.a4.addr = ifa->ifa_address;
6559                 addr->u.a4.mask = ifa->ifa_mask;
6560                 addr->type = QETH_IP_TYPE_NORMAL;
6561         } else
6562                 goto out;
6563
6564         switch(event) {
6565         case NETDEV_UP:
6566                 if (!qeth_add_ip(card, addr))
6567                         kfree(addr);
6568                 break;
6569         case NETDEV_DOWN:
6570                 if (!qeth_delete_ip(card, addr))
6571                         kfree(addr);
6572                 break;
6573         default:
6574                 break;
6575         }
6576         qeth_set_thread_start_bit(card, QETH_SET_IP_THREAD);
6577         schedule_work(&card->kernel_thread_starter);
6578 out:
6579         return NOTIFY_DONE;
6580 }
6581
6582 static struct notifier_block qeth_ip_notifier = {
6583         qeth_ip_event,
6584         0
6585 };
6586
6587 #ifdef CONFIG_QETH_IPV6
6588 /**
6589  * IPv6 event handler
6590  */
6591 static int
6592 qeth_ip6_event(struct notifier_block *this,
6593               unsigned long event,void *ptr)
6594 {
6595
6596         struct inet6_ifaddr *ifa = (struct inet6_ifaddr *)ptr;
6597         struct net_device *dev = (struct net_device *)ifa->idev->dev;
6598         struct qeth_ipaddr *addr;
6599         struct qeth_card *card;
6600
6601         QETH_DBF_TEXT(trace,3,"ip6event");
6602
6603         card = qeth_get_card_from_dev(dev);
6604         if (!card)
6605                 return NOTIFY_DONE;
6606         if (!qeth_is_supported(card, IPA_IPV6))
6607                 return NOTIFY_DONE;
6608
6609         addr = qeth_get_addr_buffer(QETH_PROT_IPV6);
6610         if (addr != NULL) {
6611                 memcpy(&addr->u.a6.addr, &ifa->addr, sizeof(struct in6_addr));
6612                 addr->u.a6.pfxlen = ifa->prefix_len;
6613                 addr->type = QETH_IP_TYPE_NORMAL;
6614         } else
6615                 goto out;
6616
6617         switch(event) {
6618         case NETDEV_UP:
6619                 if (!qeth_add_ip(card, addr))
6620                         kfree(addr);
6621                 break;
6622         case NETDEV_DOWN:
6623                 if (!qeth_delete_ip(card, addr))
6624                         kfree(addr);
6625                 break;
6626         default:
6627                 break;
6628         }
6629         qeth_set_thread_start_bit(card, QETH_SET_IP_THREAD);
6630         schedule_work(&card->kernel_thread_starter);
6631 out:
6632         return NOTIFY_DONE;
6633 }
6634
6635 static struct notifier_block qeth_ip6_notifier = {
6636         qeth_ip6_event,
6637         0
6638 };
6639 #endif
6640
6641 static int
6642 qeth_reboot_event(struct notifier_block *this, unsigned long event, void *ptr)
6643 {
6644
6645         struct device *entry;
6646         struct qeth_card *card;
6647
6648         down_read(&qeth_ccwgroup_driver.driver.bus->subsys.rwsem);
6649                list_for_each_entry(entry, &qeth_ccwgroup_driver.driver.devices,
6650                                    driver_list) {
6651                        card = (struct qeth_card *) entry->driver_data;
6652                        qeth_clear_ip_list(card, 0, 0);
6653                        qeth_qdio_clear_card(card, 0);
6654                }
6655         up_read(&qeth_ccwgroup_driver.driver.bus->subsys.rwsem);
6656         return NOTIFY_DONE;
6657 }
6658
6659
6660 static struct notifier_block qeth_reboot_notifier = {
6661         qeth_reboot_event,
6662         0
6663 };
6664
6665 static int
6666 qeth_register_notifiers(void)
6667 {
6668         int r;
6669
6670         QETH_DBF_TEXT(trace,5,"regnotif");
6671         if ((r = register_reboot_notifier(&qeth_reboot_notifier)))
6672                 return r;
6673         if ((r = register_inetaddr_notifier(&qeth_ip_notifier)))
6674                 goto out_reboot;
6675 #ifdef CONFIG_QETH_IPV6
6676         if ((r = register_inet6addr_notifier(&qeth_ip6_notifier)))
6677                 goto out_ipv4;
6678 #endif
6679         return 0;
6680
6681 #ifdef CONFIG_QETH_IPV6
6682 out_ipv4:
6683         unregister_inetaddr_notifier(&qeth_ip_notifier);
6684 #endif
6685 out_reboot:
6686         unregister_reboot_notifier(&qeth_reboot_notifier);
6687         return r;
6688 }
6689
6690 /**
6691  * unregister all event notifiers
6692  */
6693 static void
6694 qeth_unregister_notifiers(void)
6695 {
6696
6697         QETH_DBF_TEXT(trace,5,"unregnot");
6698         BUG_ON(unregister_reboot_notifier(&qeth_reboot_notifier));
6699         BUG_ON(unregister_inetaddr_notifier(&qeth_ip_notifier));
6700 #ifdef CONFIG_QETH_IPV6
6701         BUG_ON(unregister_inet6addr_notifier(&qeth_ip6_notifier));
6702 #endif /* QETH_IPV6 */
6703
6704 }
6705
6706 #ifdef CONFIG_QETH_IPV6
6707 static int
6708 qeth_ipv6_init(void)
6709 {
6710         qeth_old_arp_constructor = arp_tbl.constructor;
6711         write_lock(&arp_tbl.lock);
6712         arp_tbl.constructor = qeth_arp_constructor;
6713         write_unlock(&arp_tbl.lock);
6714
6715         arp_direct_ops = (struct neigh_ops*)
6716                 kmalloc(sizeof(struct neigh_ops), GFP_KERNEL);
6717         if (!arp_direct_ops)
6718                 return -ENOMEM;
6719
6720         memcpy(arp_direct_ops, &arp_direct_ops_template,
6721                sizeof(struct neigh_ops));
6722
6723         return 0;
6724 }
6725
6726 static void
6727 qeth_ipv6_uninit(void)
6728 {
6729         write_lock(&arp_tbl.lock);
6730         arp_tbl.constructor = qeth_old_arp_constructor;
6731         write_unlock(&arp_tbl.lock);
6732         kfree(arp_direct_ops);
6733 }
6734 #endif /* CONFIG_QETH_IPV6 */
6735
6736 static void
6737 qeth_sysfs_unregister(void)
6738 {
6739         qeth_remove_driver_attributes();
6740         ccw_driver_unregister(&qeth_ccw_driver);
6741         ccwgroup_driver_unregister(&qeth_ccwgroup_driver);
6742         s390_root_dev_unregister(qeth_root_dev);
6743 }
6744 /**
6745  * register qeth at sysfs
6746  */
6747 static int
6748 qeth_sysfs_register(void)
6749 {
6750         int rc=0;
6751
6752         rc = ccwgroup_driver_register(&qeth_ccwgroup_driver);
6753         if (rc)
6754                 return rc;
6755         rc = ccw_driver_register(&qeth_ccw_driver);
6756         if (rc)
6757                 return rc;
6758         rc = qeth_create_driver_attributes();
6759         if (rc)
6760                 return rc;
6761         qeth_root_dev = s390_root_dev_register("qeth");
6762         if (IS_ERR(qeth_root_dev)) {
6763                 rc = PTR_ERR(qeth_root_dev);
6764                 return rc;
6765         }
6766         return 0;
6767 }
6768
6769 /***
6770  * init function
6771  */
6772 static int __init
6773 qeth_init(void)
6774 {
6775         int rc=0;
6776
6777         qeth_eyecatcher();
6778         printk(KERN_INFO "qeth: loading %s\n",version);
6779
6780         INIT_LIST_HEAD(&qeth_card_list.list);
6781         rwlock_init(&qeth_card_list.rwlock);
6782
6783         atomic_set(&qeth_hsi_count, 0);
6784         if (qeth_register_dbf_views())
6785                 goto out_err;
6786         if (qeth_sysfs_register())
6787                 goto out_sysfs;
6788
6789 #ifdef CONFIG_QETH_IPV6
6790         if (qeth_ipv6_init()) {
6791                 PRINT_ERR("Out of memory during ipv6 init.\n");
6792                 goto out_sysfs;
6793         }
6794 #endif /* QETH_IPV6 */
6795         if (qeth_register_notifiers())
6796                 goto out_ipv6;
6797         if (qeth_create_procfs_entries())
6798                 goto out_notifiers;
6799
6800         return rc;
6801
6802 out_notifiers:
6803         qeth_unregister_notifiers();
6804 out_ipv6:
6805 #ifdef CONFIG_QETH_IPV6
6806         qeth_ipv6_uninit();
6807 #endif /* QETH_IPV6 */
6808 out_sysfs:
6809         qeth_sysfs_unregister();
6810         qeth_unregister_dbf_views();
6811 out_err:
6812         PRINT_ERR("Initialization failed");
6813         return rc;
6814 }
6815
6816 static void
6817 __exit qeth_exit(void)
6818 {
6819         struct qeth_card *card, *tmp;
6820         unsigned long flags;
6821
6822         QETH_DBF_TEXT(trace,1, "cleanup.");
6823
6824         /*
6825          * Weed would not need to clean up our devices here, because the
6826          * common device layer calls qeth_remove_device for each device
6827          * as soon as we unregister our driver (done in qeth_sysfs_unregister).
6828          * But we do cleanup here so we can do a "soft" shutdown of our cards.
6829          * qeth_remove_device called by the common device layer would otherwise
6830          * do a "hard" shutdown (card->use_hard_stop is set to one in
6831          * qeth_remove_device).
6832          */
6833 again:
6834         read_lock_irqsave(&qeth_card_list.rwlock, flags);
6835         list_for_each_entry_safe(card, tmp, &qeth_card_list.list, list){
6836                 read_unlock_irqrestore(&qeth_card_list.rwlock, flags);
6837                 qeth_set_offline(card->gdev);
6838                 qeth_remove_device(card->gdev);
6839                 goto again;
6840         }
6841         read_unlock_irqrestore(&qeth_card_list.rwlock, flags);
6842 #ifdef CONFIG_QETH_IPV6
6843         qeth_ipv6_uninit();
6844 #endif
6845         qeth_unregister_notifiers();
6846         qeth_remove_procfs_entries();
6847         qeth_sysfs_unregister();
6848         qeth_unregister_dbf_views();
6849         printk("qeth: removed\n");
6850 }
6851
6852 EXPORT_SYMBOL(qeth_eyecatcher);
6853 module_init(qeth_init);
6854 module_exit(qeth_exit);
6855 MODULE_AUTHOR("Frank Pavlic <pavlic@de.ibm.com>");
6856 MODULE_DESCRIPTION("Linux on zSeries OSA Express and HiperSockets support\n" \
6857                                       "Copyright 2000,2003 IBM Corporation\n");
6858
6859 MODULE_LICENSE("GPL");